UNPKG

dicom-microscopy-viewer

Version:
118 lines (109 loc) 4.44 kB
import dcmjs from 'dcmjs' /** * Retrieves the extended region of interest (ROI) based on the provided feature, ROI, and metadata. * @param {Object} options - The options object. * @param {Object} options.feature - The feature object. * @param {Object} options.roi - The ROI object. * @param {Object} options.metadata - The metadata object. * @param {Object} options.annotationGroup - The annotation group object. * @returns {Object} The extended ROI. */ const getExtendedROI = ({ feature, roi, metadata, annotationGroup }) => { const annotationGroupUID = feature.get('annotationGroupUID') const annotationGroupMetadata = metadata.AnnotationGroupSequence.find( (item) => item.AnnotationGroupUID === annotationGroupUID, ) || annotationGroup if (annotationGroupUID == null || annotationGroupMetadata == null) { throw new Error( 'Could not obtain information of annotation from ' + `annotation group "${annotationGroupUID}".`, ) } if (annotationGroupMetadata.AnnotationPropertyCategoryCodeSequence != null) { const findingCategory = annotationGroupMetadata.AnnotationPropertyCategoryCodeSequence[0] roi.addEvaluation( new dcmjs.sr.valueTypes.CodeContentItem({ name: new dcmjs.sr.coding.CodedConcept({ value: '276214006', meaning: 'Finding category', schemeDesignator: 'SCT', }), value: new dcmjs.sr.coding.CodedConcept({ value: findingCategory.CodeValue, meaning: findingCategory.CodeMeaning, schemeDesignator: findingCategory.CodingSchemeDesignator, }), relationshipType: dcmjs.sr.valueTypes.RelationshipTypes.HAS_CONCEPT_MOD, }), ) } if (annotationGroupMetadata.AnnotationPropertyTypeCodeSequence != null) { const findingType = annotationGroupMetadata.AnnotationPropertyTypeCodeSequence[0] roi.addEvaluation( new dcmjs.sr.valueTypes.CodeContentItem({ name: new dcmjs.sr.coding.CodedConcept({ value: '121071', meaning: 'Finding', schemeDesignator: 'DCM', }), value: new dcmjs.sr.coding.CodedConcept({ value: findingType.CodeValue, meaning: findingType.CodeMeaning, schemeDesignator: findingType.CodingSchemeDesignator, }), relationshipType: dcmjs.sr.valueTypes.RelationshipTypes.HAS_CONCEPT_MOD, }), ) } /** * Measurements for some or all annotations in the annotation group. * Each item describes one type of measurement. */ if (annotationGroupMetadata.MeasurementsSequence != null) { annotationGroupMetadata.MeasurementsSequence.forEach( (measurementItem, measurementIndex) => { const key = `measurementValue${measurementIndex.toString()}` const value = feature.get(key) const name = measurementItem.ConceptNameCodeSequence[0] const unit = measurementItem.MeasurementUnitsCodeSequence[0] const measurement = new dcmjs.sr.valueTypes.NumContentItem({ value: Number(value), name: new dcmjs.sr.coding.CodedConcept({ value: name.CodeValue, meaning: name.CodeMeaning, schemeDesignator: name.CodingSchemeDesignator, }), unit: new dcmjs.sr.coding.CodedConcept({ value: unit.CodeValue, meaning: unit.CodeMeaning, schemeDesignator: unit.CodingSchemeDesignator, }), relationshipType: dcmjs.sr.valueTypes.RelationshipTypes.CONTAINS, }) if (measurementItem.ReferencedImageSequence != null) { const ref = measurementItem.ReferencedImageSequence[0] const image = new dcmjs.sr.valueTypes.ImageContentItem({ name: new dcmjs.sr.coding.CodedConcept({ value: '121112', meaning: 'Source of Measurement', schemeDesignator: 'DCM', }), referencedSOPClassUID: ref.ReferencedSOPClassUID, referencedSOPInstanceUID: ref.ReferencedSOPInstanceUID, }) if (ref.ReferencedOpticalPathIdentifier != null) { image.ReferencedSOPSequence[0].ReferencedOpticalPathIdentifier = ref.ReferencedOpticalPathIdentifier } measurement.ContentSequence = [image] } roi.addMeasurement(measurement) }, ) } return roi } export default getExtendedROI