From 2f734036822c549895641ce488a8aed71240de94 Mon Sep 17 00:00:00 2001 From: Leonardo Campos Date: Thu, 12 Jan 2017 23:22:59 -0200 Subject: [PATCH] LT-92: NonTarget response criteria --- .../client/components/viewer/viewer.js | 3 +- .../measurementTableView.js | 1 - .../client/conformance/ConformanceCriteria.js | 13 +++++--- .../conformance/checkers/RecistChecker.js | 6 ++-- .../conformance/criterias/ModalityCriteria.js | 6 ++-- .../criterias/NonTargetResponseCriteria.js | 32 +++++++++++++++++++ 6 files changed, 49 insertions(+), 12 deletions(-) create mode 100644 Packages/ohif-measurements/client/conformance/criterias/NonTargetResponseCriteria.js diff --git a/LesionTracker/client/components/viewer/viewer.js b/LesionTracker/client/components/viewer/viewer.js index 7533f9276..acd2fa94a 100644 --- a/LesionTracker/client/components/viewer/viewer.js +++ b/LesionTracker/client/components/viewer/viewer.js @@ -103,7 +103,8 @@ Template.viewer.onCreated(() => { instance.data.measurementApi = new OHIF.measurements.MeasurementApi(instance.data.timepointApi); console.warn('>>>>REMOVE THE LINES BELOW'); window.measurementApi = instance.data.measurementApi; - window.conformanceCriteria = new OHIF.measurements.ConformanceCriteria(window.measurementApi); + window.timepointApi = instance.data.timepointApi; + window.conformanceCriteria = new OHIF.measurements.ConformanceCriteria(window.measurementApi, instance.data.timepointApi); const measurementsPromise = instance.data.measurementApi.retrieveMeasurements(patientId, timepointIds); measurementsPromise.then(() => { Session.set('MeasurementsReady', true); diff --git a/Packages/ohif-measurements/client/components/measurementTable/measurementTableView/measurementTableView.js b/Packages/ohif-measurements/client/components/measurementTable/measurementTableView/measurementTableView.js index aeeadec46..51c883ec7 100644 --- a/Packages/ohif-measurements/client/components/measurementTable/measurementTableView/measurementTableView.js +++ b/Packages/ohif-measurements/client/components/measurementTable/measurementTableView/measurementTableView.js @@ -95,7 +95,6 @@ Template.measurementTableView.helpers({ }, newMeasurements(measurementType) { - console.warn('>>>>measurementType', measurementType); const instance = Template.instance(); const measurementApi = instance.data.measurementApi; const timepointApi = instance.data.timepointApi; diff --git a/Packages/ohif-measurements/client/conformance/ConformanceCriteria.js b/Packages/ohif-measurements/client/conformance/ConformanceCriteria.js index c3285f94b..9d655982a 100644 --- a/Packages/ohif-measurements/client/conformance/ConformanceCriteria.js +++ b/Packages/ohif-measurements/client/conformance/ConformanceCriteria.js @@ -4,10 +4,9 @@ import { RecistChecker } from './checkers/RecistChecker'; class ConformanceCriteria { - constructor(measurementApi) { - if (measurementApi) { - this.measurementApi = measurementApi; - } + constructor(measurementApi, timepointApi) { + this.measurementApi = measurementApi; + this.timepointApi = timepointApi; this.warnings = {}; } @@ -36,9 +35,13 @@ class ConformanceCriteria { measurements.forEach(measurement => { const { studyInstanceUid, imageId } = measurement; const metadata = this.getImageMetadata(studyInstanceUid, imageId); + const timepointId = measurement.timepointId; + const timepoint = this.timepointApi.timepoints.findOne({ timepointId }); + data[measurementType].push({ measurement, - metadata + metadata, + timepoint }); }); }; diff --git a/Packages/ohif-measurements/client/conformance/checkers/RecistChecker.js b/Packages/ohif-measurements/client/conformance/checkers/RecistChecker.js index c15802011..95ed5903c 100644 --- a/Packages/ohif-measurements/client/conformance/checkers/RecistChecker.js +++ b/Packages/ohif-measurements/client/conformance/checkers/RecistChecker.js @@ -3,6 +3,7 @@ import { MaxTargetPerOrganCriteria } from '../criterias/MaxTargetPerOrganCriteri import { MaxTargetsCriteria } from '../criterias/MaxTargetsCriteria'; import { MeasurementsLengthCriteria } from '../criterias/MeasurementsLengthCriteria'; import { ModalityCriteria } from '../criterias/ModalityCriteria'; +import { NonTargetResponseCriteria } from '../criterias/NonTargetResponseCriteria'; export class RecistChecker extends BaseChecker { @@ -12,7 +13,8 @@ export class RecistChecker extends BaseChecker { this.criterias.push(new MaxTargetsCriteria(5)); this.criterias.push(new MaxTargetPerOrganCriteria(2)); this.criterias.push(new MeasurementsLengthCriteria({})); - this.criterias.push(new ModalityCriteria(this.getModalityCheckerOptions())); + this.criterias.push(new ModalityCriteria(this.getModalityCriteriaOptions())); + this.criterias.push(new NonTargetResponseCriteria()); } check(data) { @@ -26,7 +28,7 @@ export class RecistChecker extends BaseChecker { return nonconformity; } - getModalityCheckerOptions() { + getModalityCriteriaOptions() { return { method: 'restrict', modalities: ['US'] diff --git a/Packages/ohif-measurements/client/conformance/criterias/ModalityCriteria.js b/Packages/ohif-measurements/client/conformance/criterias/ModalityCriteria.js index b953a2f67..f897acc50 100644 --- a/Packages/ohif-measurements/client/conformance/criterias/ModalityCriteria.js +++ b/Packages/ohif-measurements/client/conformance/criterias/ModalityCriteria.js @@ -16,15 +16,15 @@ export class ModalityCriteria extends BaseCriteria { } check(data) { - const measurementTypesIds = this.options.measurementTypesIds || ['targets']; + const measurementTypes = this.options.measurementTypes || ['targets']; const modalitiesSet = new Set(this.options.modalities); const validationMethod = this.options.method; const measurements = []; const invalidModalities = []; let message; - measurementTypesIds.forEach(measurementTypesId => { - const items = data[measurementTypesId]; + measurementTypes.forEach(measurementType => { + const items = data[measurementType]; items.forEach(item => { const measurement = item.measurement; diff --git a/Packages/ohif-measurements/client/conformance/criterias/NonTargetResponseCriteria.js b/Packages/ohif-measurements/client/conformance/criterias/NonTargetResponseCriteria.js new file mode 100644 index 000000000..ff87ecc7e --- /dev/null +++ b/Packages/ohif-measurements/client/conformance/criterias/NonTargetResponseCriteria.js @@ -0,0 +1,32 @@ +import { BaseCriteria } from './BaseCriteria'; + +export class NonTargetResponseCriteria extends BaseCriteria { + + constructor() { + super(); + } + + check(data) { + const items = data.nonTargets; + const measurements = []; + let message; + + items.forEach(item => { + const measurement = item.measurement; + const response = measurement.response.toLowerCase(); + const timepoint = item.timepoint; + const timepointType = timepoint.timepointType.toLowerCase(); + + if ((timepointType === 'baseline') && (response !== 'present')) { + measurements.push(measurement); + } + }); + + if (measurements.length) { + message = 'Non-targets can only be assessed as "present"'; + } + + return this.respond(message, measurements); + } + +}