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