ohif-viewer/Packages/ohif-measurements/client/conformance/ConformanceCriteria.js
2017-01-18 11:01:52 -02:00

135 lines
4.1 KiB
JavaScript

import { OHIF } from 'meteor/ohif:core';
import { _ } from 'meteor/underscore';
import { CriteriaEvaluator } from './CriteriaEvaluator';
import * as evaluations from './evaluations';
class ConformanceCriteria {
constructor(measurementApi, timepointApi) {
this.measurementApi = measurementApi;
this.timepointApi = timepointApi;
this.results = [];
const validate = _.debounce(trialCriteriaType => {
this.validate(trialCriteriaType);
}, 300);
Tracker.autorun(() => {
const trialCriteriaType = TrialCriteriaTypes.findOne({ selected: true });
this.measurementApi.changeObserver.depend();
validate(trialCriteriaType);
});
}
validate(trialCriteriaType) {
const baselineData = this.getData('baseline');
const followupData = this.getData('followup');
const mergedData = baselineData;
mergedData.targets = mergedData.targets.concat(followupData.targets);
mergedData.nonTargets = mergedData.nonTargets.concat(followupData.nonTargets);
const resultBoth = this.validateTimepoint('both', trialCriteriaType, mergedData);
const resultBaseline = this.validateTimepoint('baseline', trialCriteriaType, baselineData);
const resultFollowup = this.validateTimepoint('followup', trialCriteriaType, followupData);
const results = resultBaseline.concat(resultFollowup).concat(resultBoth);
console.warn('>>>> validate', results);
return results;
}
validateTimepoint(timepointId, trialCriteriaType, data) {
const evaluators = this.getEvaluators(timepointId, trialCriteriaType);
let results = [];
evaluators.forEach(evaluator => {
const result = evaluator.evaluate(data);
results = results.concat(result);
});
return results;
}
getEvaluators(timepointId, trialCriteriaType) {
const evaluators = [];
const trialCriteriaTypeId = trialCriteriaType.id.toLowerCase();
const evaluation = evaluations[trialCriteriaTypeId]
if(evaluation) {
const evaluationTimepoint = evaluation[timepointId];
if(evaluationTimepoint) {
evaluators.push(new CriteriaEvaluator(evaluationTimepoint));
}
}
return evaluators;
}
/*
* Build the data that will be used to do the conformance criteria checks
*/
getData(timepointType) {
const data = {
targets: [],
nonTargets: []
};
const fillData = measurementType => {
const measurements = this.measurementApi.fetch(measurementType);
measurements.forEach(measurement => {
const { studyInstanceUid, imageId } = measurement;
const metadata = this.getImageMetadata(studyInstanceUid, imageId);
const timepointId = measurement.timepointId;
const timepoint = this.timepointApi.timepoints.findOne({ timepointId });
if((timepointType !== 'both') && (timepoint.timepointType !== timepointType)) {
return;
}
data[measurementType].push({
measurement,
metadata,
timepoint
});
});
};
fillData('targets');
fillData('nonTargets');
return data;
}
getImageMetadata(studyInstanceUid, imageId) {
const study = ViewerStudies.findOne({ studyInstanceUid });
// Stop here if the study was not found
if (!study) {
return;
}
let foundImage;
_.each(study.displaySets, displaySet => {
if (foundImage) {
return;
}
_.each(displaySet.images, image => {
if (foundImage) {
return;
} else if (getImageId(image) === imageId) {
foundImage = image;
}
});
});
return foundImage;
}
}
OHIF.measurements.ConformanceCriteria = ConformanceCriteria;