LT-92: NonTarget response criteria
This commit is contained in:
parent
c822f71baa
commit
2f73403682
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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']
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user