LT-92: Modality criteria
This commit is contained in:
parent
774de08646
commit
c822f71baa
@ -2,6 +2,7 @@ import { BaseChecker } from './BaseChecker';
|
|||||||
import { MaxTargetPerOrganCriteria } from '../criterias/MaxTargetPerOrganCriteria';
|
import { MaxTargetPerOrganCriteria } from '../criterias/MaxTargetPerOrganCriteria';
|
||||||
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';
|
||||||
|
|
||||||
export class RecistChecker extends BaseChecker {
|
export class RecistChecker extends BaseChecker {
|
||||||
|
|
||||||
@ -11,6 +12,7 @@ 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()));
|
||||||
}
|
}
|
||||||
|
|
||||||
check(data) {
|
check(data) {
|
||||||
@ -24,4 +26,11 @@ export class RecistChecker extends BaseChecker {
|
|||||||
return nonconformity;
|
return nonconformity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getModalityCheckerOptions() {
|
||||||
|
return {
|
||||||
|
method: 'restrict',
|
||||||
|
modalities: ['US']
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,53 @@
|
|||||||
|
import { BaseCriteria } from './BaseCriteria';
|
||||||
|
import { _ } from 'meteor/underscore';
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ModalityCriteria
|
||||||
|
* Check if a modality is allowed or restricted
|
||||||
|
* Options:
|
||||||
|
* method (string): allow, restrict
|
||||||
|
* modalities (string[]): list of allowed/restricted modalities
|
||||||
|
*/
|
||||||
|
export class ModalityCriteria extends BaseCriteria {
|
||||||
|
|
||||||
|
constructor(options) {
|
||||||
|
super();
|
||||||
|
this.options = options;
|
||||||
|
}
|
||||||
|
|
||||||
|
check(data) {
|
||||||
|
const measurementTypesIds = this.options.measurementTypesIds || ['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];
|
||||||
|
|
||||||
|
items.forEach(item => {
|
||||||
|
const measurement = item.measurement;
|
||||||
|
const metadata = item.metadata;
|
||||||
|
const modality = metadata.modality.toUpperCase();
|
||||||
|
|
||||||
|
if (((validationMethod === 'allow') && !modalitiesSet.has(modality)) ||
|
||||||
|
((validationMethod === 'restrict') && modalitiesSet.has(modality))) {
|
||||||
|
measurements.push(measurement);
|
||||||
|
invalidModalities.push(modality);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
if (measurements.length) {
|
||||||
|
const uniqueModalities = _.uniq(invalidModalities);
|
||||||
|
const uniqueModalitiesText = uniqueModalities.join(', ');
|
||||||
|
const modalityText = uniqueModalities.length > 1 ? 'modalities' : 'modality';
|
||||||
|
|
||||||
|
message = `The ${modalityText} ${uniqueModalitiesText} should not be used as a method of measurement`;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.respond(message, measurements);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
Loading…
Reference in New Issue
Block a user