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 { MaxTargetsCriteria } from '../criterias/MaxTargetsCriteria';
|
||||
import { MeasurementsLengthCriteria } from '../criterias/MeasurementsLengthCriteria';
|
||||
import { ModalityCriteria } from '../criterias/ModalityCriteria';
|
||||
|
||||
export class RecistChecker extends BaseChecker {
|
||||
|
||||
@ -11,6 +12,7 @@ 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()));
|
||||
}
|
||||
|
||||
check(data) {
|
||||
@ -24,4 +26,11 @@ export class RecistChecker extends BaseChecker {
|
||||
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