LT-92: NonTarget response criteria

This commit is contained in:
Leonardo Campos 2017-01-12 23:22:59 -02:00 committed by Bruno Alves de Faria
parent c822f71baa
commit 2f73403682
6 changed files with 49 additions and 12 deletions

View File

@ -103,7 +103,8 @@ Template.viewer.onCreated(() => {
instance.data.measurementApi = new OHIF.measurements.MeasurementApi(instance.data.timepointApi); instance.data.measurementApi = new OHIF.measurements.MeasurementApi(instance.data.timepointApi);
console.warn('>>>>REMOVE THE LINES BELOW'); console.warn('>>>>REMOVE THE LINES BELOW');
window.measurementApi = instance.data.measurementApi; 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); const measurementsPromise = instance.data.measurementApi.retrieveMeasurements(patientId, timepointIds);
measurementsPromise.then(() => { measurementsPromise.then(() => {
Session.set('MeasurementsReady', true); Session.set('MeasurementsReady', true);

View File

@ -95,7 +95,6 @@ Template.measurementTableView.helpers({
}, },
newMeasurements(measurementType) { newMeasurements(measurementType) {
console.warn('>>>>measurementType', measurementType);
const instance = Template.instance(); const instance = Template.instance();
const measurementApi = instance.data.measurementApi; const measurementApi = instance.data.measurementApi;
const timepointApi = instance.data.timepointApi; const timepointApi = instance.data.timepointApi;

View File

@ -4,10 +4,9 @@ import { RecistChecker } from './checkers/RecistChecker';
class ConformanceCriteria { class ConformanceCriteria {
constructor(measurementApi) { constructor(measurementApi, timepointApi) {
if (measurementApi) { this.measurementApi = measurementApi;
this.measurementApi = measurementApi; this.timepointApi = timepointApi;
}
this.warnings = {}; this.warnings = {};
} }
@ -36,9 +35,13 @@ class ConformanceCriteria {
measurements.forEach(measurement => { measurements.forEach(measurement => {
const { studyInstanceUid, imageId } = measurement; const { studyInstanceUid, imageId } = measurement;
const metadata = this.getImageMetadata(studyInstanceUid, imageId); const metadata = this.getImageMetadata(studyInstanceUid, imageId);
const timepointId = measurement.timepointId;
const timepoint = this.timepointApi.timepoints.findOne({ timepointId });
data[measurementType].push({ data[measurementType].push({
measurement, measurement,
metadata metadata,
timepoint
}); });
}); });
}; };

View File

@ -3,6 +3,7 @@ import { MaxTargetPerOrganCriteria } from '../criterias/MaxTargetPerOrganCriteri
import { MaxTargetsCriteria } from '../criterias/MaxTargetsCriteria'; import { MaxTargetsCriteria } from '../criterias/MaxTargetsCriteria';
import { MeasurementsLengthCriteria } from '../criterias/MeasurementsLengthCriteria'; import { MeasurementsLengthCriteria } from '../criterias/MeasurementsLengthCriteria';
import { ModalityCriteria } from '../criterias/ModalityCriteria'; import { ModalityCriteria } from '../criterias/ModalityCriteria';
import { NonTargetResponseCriteria } from '../criterias/NonTargetResponseCriteria';
export class RecistChecker extends BaseChecker { export class RecistChecker extends BaseChecker {
@ -12,7 +13,8 @@ export class RecistChecker extends BaseChecker {
this.criterias.push(new MaxTargetsCriteria(5)); this.criterias.push(new MaxTargetsCriteria(5));
this.criterias.push(new MaxTargetPerOrganCriteria(2)); this.criterias.push(new MaxTargetPerOrganCriteria(2));
this.criterias.push(new MeasurementsLengthCriteria({})); 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) { check(data) {
@ -26,7 +28,7 @@ export class RecistChecker extends BaseChecker {
return nonconformity; return nonconformity;
} }
getModalityCheckerOptions() { getModalityCriteriaOptions() {
return { return {
method: 'restrict', method: 'restrict',
modalities: ['US'] modalities: ['US']

View File

@ -16,15 +16,15 @@ export class ModalityCriteria extends BaseCriteria {
} }
check(data) { check(data) {
const measurementTypesIds = this.options.measurementTypesIds || ['targets']; const measurementTypes = this.options.measurementTypes || ['targets'];
const modalitiesSet = new Set(this.options.modalities); const modalitiesSet = new Set(this.options.modalities);
const validationMethod = this.options.method; const validationMethod = this.options.method;
const measurements = []; const measurements = [];
const invalidModalities = []; const invalidModalities = [];
let message; let message;
measurementTypesIds.forEach(measurementTypesId => { measurementTypes.forEach(measurementType => {
const items = data[measurementTypesId]; const items = data[measurementType];
items.forEach(item => { items.forEach(item => {
const measurement = item.measurement; const measurement = item.measurement;

View File

@ -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);
}
}