diff --git a/Packages/ohif-measurements/client/conformance/checkers/RecistChecker.js b/Packages/ohif-measurements/client/conformance/checkers/RecistChecker.js index ef54e6045..c15802011 100644 --- a/Packages/ohif-measurements/client/conformance/checkers/RecistChecker.js +++ b/Packages/ohif-measurements/client/conformance/checkers/RecistChecker.js @@ -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'] + }; + } + } diff --git a/Packages/ohif-measurements/client/conformance/criterias/ModalityCriteria.js b/Packages/ohif-measurements/client/conformance/criterias/ModalityCriteria.js new file mode 100644 index 000000000..b953a2f67 --- /dev/null +++ b/Packages/ohif-measurements/client/conformance/criterias/ModalityCriteria.js @@ -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); + } + +};