Instructions
-
Associate the selected studies with timepoints in the clinical trial.
+
Associate the selected studies with timepoints in the clinical trial. Only 1 follow-up time point can be associated at the same time.
We have automatically retrieved all studies within 14 days ({{formatDA earliestDate}} to {{formatDA latestDate}}) of your selected studies, in case you forgot to
select a study.
diff --git a/Packages/lesiontracker/lib/LesionManager.js b/Packages/lesiontracker/lib/LesionManager.js
index bb2a0f08b..0d5263e91 100644
--- a/Packages/lesiontracker/lib/LesionManager.js
+++ b/Packages/lesiontracker/lib/LesionManager.js
@@ -4,12 +4,16 @@ measurementValuesByType = {
'longestDiameter'
],
nonTarget: ['response'],
+ crTool: ['response'],
+ exTool: ['response'],
+ unTool: ['response'],
length: ['length'],
ellipticalRoi: [
'area',
'mean',
'stdev'
]
+
};
/**
@@ -60,14 +64,14 @@ function updateLesionData(lesionData) {
imageId: lesionData.imageId
};
- if (!lesionData.measurementType) {
+ if (!lesionData.toolType) {
// For debugging, might want to switch to measurement types later
- lesionData.measurementType = lesionData.isTarget ? 'bidirectional' : 'nonTarget';
+ lesionData.toolType = lesionData.isTarget ? 'bidirectional' : 'nonTarget';
}
// Populate this timepoint's data with whichever values
// are stored for this Measurement type
- var values = measurementValuesByType[lesionData.measurementType];
+ var values = measurementValuesByType[lesionData.toolType];
values.forEach(function(valueName) {
timepointData[valueName] = lesionData[valueName];
});
@@ -80,8 +84,12 @@ function updateLesionData(lesionData) {
lesionNumber: lesionData.lesionNumber,
isTarget: lesionData.isTarget,
patientId: lesionData.patientId,
- id: lesionData.id
+ id: lesionData.id,
+ toolType: lesionData.toolType
};
+ if (lesionData.toolType) {
+ measurement.toolType = lesionData.toolType;
+ }
// Retrieve the location name given the locationUID
if (lesionData.locationUID !== undefined) {
diff --git a/Packages/lesiontracker/lib/activateLesion.js b/Packages/lesiontracker/lib/activateLesion.js
index 0eb08436e..ae9e00399 100644
--- a/Packages/lesiontracker/lib/activateLesion.js
+++ b/Packages/lesiontracker/lib/activateLesion.js
@@ -25,7 +25,7 @@ activateLesion = function(measurementId, templateData) {
sort: {
latestDate: 1
}
- })
+ });
// Loop through each timepoint and populate the orderTimepointEntries array with
// The measurement data at each timepoint. The most recent measurements will be first in
@@ -58,9 +58,11 @@ activateLesion = function(measurementId, templateData) {
// Stop if we run out of timepoints before viewports
if (viewportIndex >= orderedTimepointEntries.length) {
// Update the element anyway, to remove any other highlights that are present
- deactivateAllToolData(element, 'lesion');
+ deactivateAllToolData(element, 'bidirectional');
deactivateAllToolData(element, 'nonTarget');
- cornerstone.updateImage(element);
+ deactivateAllToolData(element, 'crTool');
+ deactivateAllToolData(element, 'unTool');
+ deactivateAllToolData(element, 'exTool');
return false;
}
@@ -79,8 +81,11 @@ activateLesion = function(measurementId, templateData) {
// If there is no measurement data to display, stop here
if (!measurementAtTimepoint) {
// Update the element anyway, to remove any other highlights that are present
- deactivateAllToolData(element, 'lesion');
+ deactivateAllToolData(element, 'bidirectional');
deactivateAllToolData(element, 'nonTarget');
+ deactivateAllToolData(element, 'crTool');
+ deactivateAllToolData(element, 'unTool');
+ deactivateAllToolData(element, 'exTool');
cornerstone.updateImage(element);
return;
}
diff --git a/Packages/lesiontracker/lib/activateMeasurements.js b/Packages/lesiontracker/lib/activateMeasurements.js
index 72d917a87..eb0f204a4 100644
--- a/Packages/lesiontracker/lib/activateMeasurements.js
+++ b/Packages/lesiontracker/lib/activateMeasurements.js
@@ -57,10 +57,15 @@ activateMeasurements = function(element, measurementId, templateData, viewportIn
* @param timepointId
*/
function activateTool(element, measurementData, timepointId) {
- deactivateAllToolData(element, 'lesion');
+ deactivateAllToolData(element, 'bidirectional');
deactivateAllToolData(element, 'nonTarget');
- var toolType = measurementData.isTarget ? 'lesion' : 'nonTarget';
+ // Deactivate CRUNEX Tools
+ deactivateAllToolData(element, 'crTool');
+ deactivateAllToolData(element, 'unTool');
+ deactivateAllToolData(element, 'exTool');
+
+ var toolType = measurementData.toolType;
var toolData = cornerstoneTools.getToolState(element, toolType);
if (!toolData) {
return;
diff --git a/Packages/lesiontracker/lib/clearMeasurementTimepointData.js b/Packages/lesiontracker/lib/clearMeasurementTimepointData.js
index e71c64b00..aa34adc01 100644
--- a/Packages/lesiontracker/lib/clearMeasurementTimepointData.js
+++ b/Packages/lesiontracker/lib/clearMeasurementTimepointData.js
@@ -8,7 +8,7 @@ clearMeasurementTimepointData = function(measurementId, timepointId) {
// Clear the Measurement data for this timepoint
var imageId = data.timepoints[timepointId].imageId;
- var toolType = data.isTarget ? 'lesion' : 'nonTarget';
+ var toolType = data.toolType;
removeToolDataWithMeasurementId(imageId, toolType, measurementId);
// Update any viewports that are currently displaying this imageId
diff --git a/Packages/lesiontracker/lib/clearTools.js b/Packages/lesiontracker/lib/clearTools.js
index 2c7e6818e..31268f8ba 100644
--- a/Packages/lesiontracker/lib/clearTools.js
+++ b/Packages/lesiontracker/lib/clearTools.js
@@ -1,6 +1,6 @@
clearTools = function() {
var patientId = Session.get('patientId');
- var toolTypes = [ 'lesion', 'nonTarget', 'length', 'ellipticalRoi'];
+ var toolTypes = [ 'bidirectional', 'nonTarget', 'length', 'ellipticalRoi', 'crTool', 'unTool', 'exTool' ];
var toolState = cornerstoneTools.globalImageIdSpecificToolStateManager.toolState;
var toolStateKeys = Object.keys(toolState).slice(0);
diff --git a/Packages/lesiontracker/lib/convertToNonTarget.js b/Packages/lesiontracker/lib/convertToNonTarget.js
index 316414500..6dede677b 100644
--- a/Packages/lesiontracker/lib/convertToNonTarget.js
+++ b/Packages/lesiontracker/lib/convertToNonTarget.js
@@ -21,7 +21,7 @@ convertToNonTarget = function(measurementData) {
studyInstanceUid: measurementData.studyInstanceUid,
patientId: measurementData.patientId,
isTarget: false,
- measurementType: toolType
+ toolType: toolType
};
if (timepoint && timepoint.timepointType === 'baseline') {
diff --git a/Packages/lesiontracker/lib/handleMeasurementAdded.js b/Packages/lesiontracker/lib/handleMeasurementAdded.js
index a94fdb019..f99f599cb 100644
--- a/Packages/lesiontracker/lib/handleMeasurementAdded.js
+++ b/Packages/lesiontracker/lib/handleMeasurementAdded.js
@@ -1,9 +1,12 @@
handleMeasurementAdded = function(e, eventData) {
var measurementData = eventData.measurementData;
- switch (eventData.toolType) {
+ switch (measurementData.toolType) {
case 'nonTarget':
- case 'lesion':
+ case 'bidirectional':
+ case 'crTool':
+ case 'unTool':
+ case 'exTool':
log.info('CornerstoneToolsMeasurementAdded');
LesionManager.updateLesionData(measurementData);
TrialResponseCriteria.validateDelayed(measurementData);
@@ -20,7 +23,7 @@ handleMeasurementAdded = function(e, eventData) {
// Add the relevant metaData to this ImageMeasurement's toolData
measurementData.clientId = ClientId;
measurementData.imageId = imageId;
- measurementData.measurementType = eventData.toolType;
+ measurementData.toolType = eventData.toolType;
measurementData.patientId = study.patientId;
measurementData.studyInstanceUid = study.studyInstanceUid;
measurementData.seriesInstanceUid = series.seriesInstanceUid;
diff --git a/Packages/lesiontracker/lib/handleMeasurementModified.js b/Packages/lesiontracker/lib/handleMeasurementModified.js
index 6d5844696..8a1b84c18 100644
--- a/Packages/lesiontracker/lib/handleMeasurementModified.js
+++ b/Packages/lesiontracker/lib/handleMeasurementModified.js
@@ -1,9 +1,11 @@
handleMeasurementModified = function(e, eventData) {
var measurementData = eventData.measurementData;
-
- switch (eventData.toolType) {
+ switch (measurementData.toolType) {
case 'nonTarget':
- case 'lesion':
+ case 'bidirectional':
+ case 'crTool':
+ case 'unTool':
+ case 'exTool':
log.info('CornerstoneToolsMeasurementModified');
LesionManager.updateLesionData(measurementData);
TrialResponseCriteria.validateDelayed(measurementData);
@@ -20,7 +22,7 @@ handleMeasurementModified = function(e, eventData) {
// Add the relevant metaData to this ImageMeasurement's toolData
measurementData.clientId = ClientId;
measurementData.imageId = imageId;
- measurementData.measurementType = eventData.toolType;
+ measurementData.toolType = eventData.toolType;
measurementData.patientId = study.patientId;
measurementData.studyInstanceUid = study.studyInstanceUid;
measurementData.seriesInstanceUid = series.seriesInstanceUid;
diff --git a/Packages/lesiontracker/lib/handleMeasurementRemoved.js b/Packages/lesiontracker/lib/handleMeasurementRemoved.js
index 425f727b0..340087b9e 100644
--- a/Packages/lesiontracker/lib/handleMeasurementRemoved.js
+++ b/Packages/lesiontracker/lib/handleMeasurementRemoved.js
@@ -3,7 +3,10 @@ handleMeasurementRemoved = function(e, eventData) {
switch (eventData.toolType) {
case 'nonTarget':
- case 'lesion':
+ case 'bidirectional':
+ case 'crTool':
+ case 'unTool':
+ case 'exTool':
log.info('CornerstoneToolsMeasurementRemoved');
var measurement = Measurements.findOne(measurementData.id, {
diff --git a/Packages/lesiontracker/lib/pixelSpacingAutorunCheck.js b/Packages/lesiontracker/lib/pixelSpacingAutorunCheck.js
index e4d41086b..bb1811750 100644
--- a/Packages/lesiontracker/lib/pixelSpacingAutorunCheck.js
+++ b/Packages/lesiontracker/lib/pixelSpacingAutorunCheck.js
@@ -32,4 +32,16 @@ pixelSpacingAutorunCheck = function() {
// Enable Lesion Buttons
oncologyTools.prop('disabled', false);
}
+
+ // Set disabled/enabled timepoint buttons
+ var imageId = enabledElement.image.imageId;
+ var study = cornerstoneTools.metaData.get('study', imageId);
+
+ // Find the relevant timepoint given the current study
+ var timepoint = Timepoints.findOne({
+ studyInstanceUids: {
+ $in: [study.studyInstanceUid]
+ }
+ });
+ setTimepointTools(timepoint);
};
\ No newline at end of file
diff --git a/Packages/lesiontracker/lib/setTimepointActiveTool.js b/Packages/lesiontracker/lib/setTimepointActiveTool.js
deleted file mode 100644
index 43cd7a8ee..000000000
--- a/Packages/lesiontracker/lib/setTimepointActiveTool.js
+++ /dev/null
@@ -1,10 +0,0 @@
-// If timepoint is baseline, sets lesion tool as active tool
-// Else sets default tool
-setTimepointActiveTool = function(timepoint) {
- if ((timepoint.timepointType).toLowerCase() === "baseline") {
- // Set active tool as lesion tool
- toolManager.setActiveTool('lesion');
- } else {
- toolManager.setActiveTool(toolManager.getDefaultTool());
- }
-};
\ No newline at end of file
diff --git a/Packages/lesiontracker/lib/syncImageMeasurementAndToolData.js b/Packages/lesiontracker/lib/syncImageMeasurementAndToolData.js
index 88a1be6d0..c2b21ed9a 100644
--- a/Packages/lesiontracker/lib/syncImageMeasurementAndToolData.js
+++ b/Packages/lesiontracker/lib/syncImageMeasurementAndToolData.js
@@ -5,7 +5,7 @@ syncImageMeasurementAndToolData = function(measurement) {
var toolState = cornerstoneTools.globalImageIdSpecificToolStateManager.toolState;
var imageId = measurement.imageId;
- var toolType = measurement.measurementType;
+ var toolType = measurement.toolType;
// If no tool state exists for this imageId, create an empty object to store it
if (!toolState[imageId]) {
diff --git a/Packages/lesiontracker/lib/syncMeasurementAndToolData.js b/Packages/lesiontracker/lib/syncMeasurementAndToolData.js
index 8386dbc76..f1b5686a9 100644
--- a/Packages/lesiontracker/lib/syncMeasurementAndToolData.js
+++ b/Packages/lesiontracker/lib/syncMeasurementAndToolData.js
@@ -3,7 +3,7 @@ syncMeasurementAndToolData = function(measurement) {
// Check what toolType we should be adding this to, based on the isTarget value
// of the stored Measurement
- var toolType = measurement.isTarget ? 'lesion' : 'nonTarget';
+ var toolType = measurement.toolType;
// Loop through the timepoint data for this measurement
Object.keys(measurement.timepoints).forEach(function(key) {
@@ -56,6 +56,7 @@ function syncTimepointDataWithToolData(measurement, timepointData, imageId, tool
tool.visible = timepointData.visible;
tool.isDeleted = timepointData.isDeleted;
tool.handles = timepointData.handles;
+ tool.toolType = measurement.toolType;
return false;
});
@@ -82,6 +83,7 @@ function syncTimepointDataWithToolData(measurement, timepointData, imageId, tool
tool.locationUID = measurement.locationUID;
tool.patientId = measurement.patientId;
tool.id = measurement._id;
+ tool.toolType = measurement.toolType;
// Add the measurementData into the toolData for this imageId
toolState[imageId][toolType].data.push(tool);
diff --git a/Packages/lesiontracker/lib/timepointAutoCheck.js b/Packages/lesiontracker/lib/timepointAutoCheck.js
new file mode 100644
index 000000000..67d2ab6d4
--- /dev/null
+++ b/Packages/lesiontracker/lib/timepointAutoCheck.js
@@ -0,0 +1,28 @@
+// If timepoint is baseline, sets lesion tool as active tool
+setTimepointTools = function(timepoint) {
+
+ // Enabled tools for only follow-up tools
+ var fuTools = ["button#crunexTools"];
+ var fuToolsJQ = $("button#crunexTools");
+ var isDisabled = false;
+ if ((timepoint.timepointType).toLowerCase() === "baseline") {
+ // Set active tool as lesion tool
+ toolManager.setActiveTool('bidirectional');
+ isDisabled = true;
+ } else {
+ toolManager.setActiveTool(toolManager.getDefaultTool());
+ isDisabled = false;
+ }
+
+ toolManager.addDisabledTool({tools: fuTools, status: isDisabled});
+ fuToolsJQ.prop('disabled', isDisabled);
+};
+
+timepointAutoCheck = function(templateData) {
+ if (templateData && templateData.timepointIds) {
+ templateData.timepointIds.forEach(function(timepointId) {
+ var timepoint = Timepoints.findOne({timepointId: timepointId});
+ setTimepointTools(timepoint);
+ });
+ }
+};
\ No newline at end of file
diff --git a/Packages/lesiontracker/lib/toggleLesionTrackerTools.js b/Packages/lesiontracker/lib/toggleLesionTrackerTools.js
index 119df2124..859a42978 100644
--- a/Packages/lesiontracker/lib/toggleLesionTrackerTools.js
+++ b/Packages/lesiontracker/lib/toggleLesionTrackerTools.js
@@ -18,7 +18,7 @@ toggleLesionTrackerTools = function() {
activate: [ 'deleteLesionKeyboardTool' ],
deactivate: [],
enable: [],
- disable: [ 'lesion', 'nonTarget', 'scaleOverlayTool', 'length' ]
+ disable: [ 'bidirectional', 'nonTarget', 'scaleOverlayTool', 'length', 'crTool', 'unTool', 'exTool' ]
};
toolManager.setToolDefaultStates(toolDefaultStates);
diff --git a/Packages/lesiontracker/lib/worklist/worklistModification.js b/Packages/lesiontracker/lib/worklist/worklistModification.js
index aad8fd258..487a73eef 100644
--- a/Packages/lesiontracker/lib/worklist/worklistModification.js
+++ b/Packages/lesiontracker/lib/worklist/worklistModification.js
@@ -33,9 +33,6 @@ function dblClickOnStudy(data) {
return;
}
- // Set active tool for timepoint
- setTimepointActiveTool(timepoint);
-
// Add the Timepoint name to the Patient name to create the tab title
title += ' ' + getTimepointName(timepoint);
diff --git a/Packages/lesiontracker/package.js b/Packages/lesiontracker/package.js
index 3b4112fcc..1394eaf2d 100644
--- a/Packages/lesiontracker/package.js
+++ b/Packages/lesiontracker/package.js
@@ -31,7 +31,7 @@ Package.onUse(function(api) {
api.addFiles('client/collections/LocationResponses.js', 'client');
// Additional Custom Cornerstone Tools for Lesion Tracker
- api.addFiles('client/compatibility/lesionTool.js', 'client', {
+ api.addFiles('client/compatibility/bidirectionalTool.js', 'client', {
bare: true
});
api.addFiles('client/compatibility/nonTargetTool.js', 'client', {
@@ -43,6 +43,19 @@ Package.onUse(function(api) {
api.addFiles('client/compatibility/deleteLesionKeyboardTool.js', 'client', {
bare: true
});
+ api.addFiles('client/compatibility/crunexTool.js', 'client', {
+ bare: true
+ });
+ api.addFiles('client/compatibility/crTool.js', 'client', {
+ bare: true
+ });
+ api.addFiles('client/compatibility/unTool.js', 'client', {
+ bare: true
+ });
+ api.addFiles('client/compatibility/exTool.js', 'client', {
+ bare: true
+ });
+
// Trial Criteria data validation (the Meteor package is currently out-of-date)
api.addFiles('client/compatibility/validate.js', 'client', {
@@ -159,8 +172,7 @@ Package.onUse(function(api) {
api.addFiles('lib/clearTools.js', 'client');
api.addFiles('lib/calculateTotalLesionBurden.js', 'client');
api.addFiles('lib/convertToNonTarget.js', 'client');
- api.addFiles('lib/setTimepointActiveTool.js', 'client');
-
+ api.addFiles('lib/timepointAutoCheck.js', 'client');
api.addFiles('lib/syncMeasurementAndToolData.js', 'client');
api.addFiles('lib/syncImageMeasurementAndToolData.js', 'client');
@@ -192,7 +204,7 @@ Package.onUse(function(api) {
api.export('getTrialCriteriaConstraints', 'client');
api.export('calculateTotalLesionBurden', 'client');
api.export('convertToNonTarget', 'client');
- api.export('setTimepointActiveTool', 'client');
+ api.export('timepointAutoCheck', 'client');
// Export global objects
diff --git a/Packages/viewerbase/client/components/viewer/toolbar/toolbar.html b/Packages/viewerbase/client/components/viewer/toolbar/toolbar.html
index e9f084cbf..279e36c80 100644
--- a/Packages/viewerbase/client/components/viewer/toolbar/toolbar.html
+++ b/Packages/viewerbase/client/components/viewer/toolbar/toolbar.html
@@ -16,6 +16,10 @@
{{ #if includeHangingProtocolButtons }}
{{ >hangingProtocolButtons }}
{{ /if }}
+
+ {{ #each btnGroup }}
+ {{ >toolbarGroupButton}}
+ {{ /each }}