Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | import OHIF, { DicomMetadataStore } from '@ohif/core'; import loadSR from './utils/loadSR'; import toArray from './utils/toArray'; import DCM_CODE_VALUES from './utils/dcmCodeValues'; import getSourceDisplaySet from './utils/getSourceDisplaySet'; const { utils } = OHIF; const SOP_CLASS_UIDS = { COMPREHENSIVE_3D_SR: '1.2.840.10008.5.1.4.1.1.88.34', }; const SOPClassHandlerId = '@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySRSopClassHandler'; function _getReferencedFrameOfReferenceUID(naturalizedDataset) { const { ContentSequence } = naturalizedDataset; const imagingMeasurementsContentItem = ContentSequence.find( ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.IMAGING_MEASUREMENTS ); const firstMeasurementGroupContentItem = toArray( imagingMeasurementsContentItem.ContentSequence ).find(ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.MEASUREMENT_GROUP); const imageRegionContentItem = toArray(firstMeasurementGroupContentItem.ContentSequence).find( ci => ci.ConceptNameCodeSequence.CodeValue === DCM_CODE_VALUES.IMAGE_REGION ); return imageRegionContentItem.ReferencedFrameOfReferenceUID; } function _getDisplaySetsFromSeries(instances, servicesManager, extensionManager) { // If the series has no instances, stop here if (!instances || !instances.length) { throw new Error('No instances were provided'); } const { displaySetService, microscopyService } = servicesManager.services; const instance = instances[0]; // TODO ! Consumption of DICOMMicroscopySRSOPClassHandler to a derived dataset or normal dataset? // TODO -> Easy to swap this to a "non-derived" displaySet, but unfortunately need to put it in a different extension. const naturalizedDataset = DicomMetadataStore.getSeries( instance.StudyInstanceUID, instance.SeriesInstanceUID ).instances[0]; const ReferencedFrameOfReferenceUID = _getReferencedFrameOfReferenceUID(naturalizedDataset); const { FrameOfReferenceUID, SeriesDescription, ContentDate, ContentTime, SeriesNumber, StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID, SOPClassUID, } = instance; const displaySet = { plugin: 'microscopy', Modality: 'SR', altImageText: 'Microscopy SR', displaySetInstanceUID: utils.guid(), SOPInstanceUID, SeriesInstanceUID, StudyInstanceUID, ReferencedFrameOfReferenceUID, SOPClassHandlerId, SOPClassUID, SeriesDescription, // Map the content date/time to the series date/time, these are only used for filtering. SeriesDate: ContentDate, SeriesTime: ContentTime, SeriesNumber, instance, metadata: naturalizedDataset, isDerived: true, isLoading: false, isLoaded: false, loadError: false, }; displaySet.load = function (referencedDisplaySet) { return loadSR(microscopyService, displaySet, referencedDisplaySet).catch(error => { displaySet.isLoaded = false; displaySet.loadError = true; throw new Error(error); }); }; displaySet.getSourceDisplaySet = function () { let allDisplaySets = []; const studyMetadata = DicomMetadataStore.getStudy(StudyInstanceUID); studyMetadata.series.forEach(series => { const displaySets = displaySetService.getDisplaySetsForSeries(series.SeriesInstanceUID); allDisplaySets = allDisplaySets.concat(displaySets); }); return getSourceDisplaySet(allDisplaySets, displaySet); }; return [displaySet]; } export default function getDicomMicroscopySRSopClassHandler({ servicesManager, extensionManager }) { const getDisplaySetsFromSeries = instances => { return _getDisplaySetsFromSeries(instances, servicesManager, extensionManager); }; return { name: 'DicomMicroscopySRSopClassHandler', sopClassUids: [SOP_CLASS_UIDS.COMPREHENSIVE_3D_SR], getDisplaySetsFromSeries, }; } |