dicom-microscopy-viewer
Version:
Interactive web-based viewer for DICOM Microscopy Images
118 lines (109 loc) • 4.44 kB
JavaScript
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