diff --git a/Packages/viewerbase/lib/createStacks.js b/Packages/viewerbase/lib/createStacks.js index d3f9f43b7..f50fa7e47 100644 --- a/Packages/viewerbase/lib/createStacks.js +++ b/Packages/viewerbase/lib/createStacks.js @@ -22,9 +22,9 @@ createStacks = function(study) { } // Don't display thumbnails for non-image modalities - // All imaging modalities must have a valid value for rows (or columns) + // All imaging modalities must have a valid value for sopClassUid or rows var anInstance = series.instances[0]; - if (!anInstance || !anInstance.rows) { + if (!anInstance || (!isImage(anInstance.sopClassUid) && !anInstance.rows)) { return; } diff --git a/Packages/viewerbase/lib/isImage.js b/Packages/viewerbase/lib/isImage.js new file mode 100644 index 000000000..55238e272 --- /dev/null +++ b/Packages/viewerbase/lib/isImage.js @@ -0,0 +1,59 @@ +/** + * Checks whether dicom files with specified SOP Class UID have image data + * @param {string} sopClassUid - SOP Class UID to be checked + * @returns {boolean} - true if it has image data + */ +isImage = function(sopClassUid) { + if (sopClassUid == sopClassDictionary.ComputedRadiographyImageStorage + || sopClassUid == sopClassDictionary.DigitalXRayImageStorageForPresentation + || sopClassUid == sopClassDictionary.DigitalXRayImageStorageForProcessing + || sopClassUid == sopClassDictionary.DigitalMammographyXRayImageStorageForPresentation + || sopClassUid == sopClassDictionary.DigitalMammographyXRayImageStorageForProcessing + || sopClassUid == sopClassDictionary.DigitalIntraOralXRayImageStorageForPresentation + || sopClassUid == sopClassDictionary.DigitalIntraOralXRayImageStorageForProcessing + || sopClassUid == sopClassDictionary.CTImageStorage + || sopClassUid == sopClassDictionary.EnhancedCTImageStorage + || sopClassUid == sopClassDictionary.LegacyConvertedEnhancedCTImageStorage + || sopClassUid == sopClassDictionary.UltrasoundMultiframeImageStorage + || sopClassUid == sopClassDictionary.MRImageStorage + || sopClassUid == sopClassDictionary.EnhancedMRImageStorage + || sopClassUid == sopClassDictionary.EnhancedMRColorImageStorage + || sopClassUid == sopClassDictionary.LegacyConvertedEnhancedMRImageStorage + || sopClassUid == sopClassDictionary.UltrasoundImageStorage + || sopClassUid == sopClassDictionary.SecondaryCaptureImageStorage + || sopClassUid == sopClassDictionary.MultiframeSingleBitSecondaryCaptureImageStorage + || sopClassUid == sopClassDictionary.MultiframeGrayscaleByteSecondaryCaptureImageStorage + || sopClassUid == sopClassDictionary.MultiframeGrayscaleWordSecondaryCaptureImageStorage + || sopClassUid == sopClassDictionary.MultiframeTrueColorSecondaryCaptureImageStorage + || sopClassUid == sopClassDictionary.XRayAngiographicImageStorage + || sopClassUid == sopClassDictionary.EnhancedXAImageStorage + || sopClassUid == sopClassDictionary.XRayRadiofluoroscopicImageStorage + || sopClassUid == sopClassDictionary.EnhancedXRFImageStorage + || sopClassUid == sopClassDictionary.XRay3DAngiographicImageStorage + || sopClassUid == sopClassDictionary.XRay3DCraniofacialImageStorage + || sopClassUid == sopClassDictionary.BreastTomosynthesisImageStorage + || sopClassUid == sopClassDictionary.BreastProjectionXRayImageStorageForPresentation + || sopClassUid == sopClassDictionary.BreastProjectionXRayImageStorageForProcessing + || sopClassUid == sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForPresentation + || sopClassUid == sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForProcessing + || sopClassUid == sopClassDictionary.NuclearMedicineImageStorage + || sopClassUid == sopClassDictionary.VLEndoscopicImageStorage + || sopClassUid == sopClassDictionary.VideoEndoscopicImageStorage + || sopClassUid == sopClassDictionary.VLMicroscopicImageStorage + || sopClassUid == sopClassDictionary.VideoMicroscopicImageStorage + || sopClassUid == sopClassDictionary.VLSlideCoordinatesMicroscopicImageStorage + || sopClassUid == sopClassDictionary.VLPhotographicImageStorage + || sopClassUid == sopClassDictionary.VideoPhotographicImageStorage + || sopClassUid == sopClassDictionary.OphthalmicPhotography8BitImageStorage + || sopClassUid == sopClassDictionary.OphthalmicPhotography16BitImageStorage + || sopClassUid == sopClassDictionary.OphthalmicTomographyImageStorage + || sopClassUid == sopClassDictionary.VLWholeSlideMicroscopyImageStorage + || sopClassUid == sopClassDictionary.PositronEmissionTomographyImageStorage + || sopClassUid == sopClassDictionary.EnhancedPETImageStorage + || sopClassUid == sopClassDictionary.LegacyConvertedEnhancedPETImageStorage + || sopClassUid == sopClassDictionary.RTImageStorage) { + return true; + } + + return false; +}; \ No newline at end of file diff --git a/Packages/viewerbase/lib/sopClassDictionary.js b/Packages/viewerbase/lib/sopClassDictionary.js new file mode 100644 index 000000000..3d0ab24c0 --- /dev/null +++ b/Packages/viewerbase/lib/sopClassDictionary.js @@ -0,0 +1,115 @@ +sopClassDictionary = { + ComputedRadiographyImageStorage: "1.2.840.10008.5.1.4.1.1.1", + DigitalXRayImageStorageForPresentation: "1.2.840.10008.5.1.4.1.1.1.1", + DigitalXRayImageStorageForProcessing: "1.2.840.10008.5.1.4.1.1.1.1.1", + DigitalMammographyXRayImageStorageForPresentation: "1.2.840.10008.5.1.4.1.1.1.2", + DigitalMammographyXRayImageStorageForProcessing: "1.2.840.10008.5.1.4.1.1.1.2.1", + DigitalIntraOralXRayImageStorageForPresentation: "1.2.840.10008.5.1.4.1.1.1.3", + DigitalIntraOralXRayImageStorageForProcessing: "1.2.840.10008.5.1.4.1.1.1.3.1", + CTImageStorage: "1.2.840.10008.5.1.4.1.1.2", + EnhancedCTImageStorage: "1.2.840.10008.5.1.4.1.1.2.1", + LegacyConvertedEnhancedCTImageStorage: "1.2.840.10008.5.1.4.1.1.2.2", + UltrasoundMultiframeImageStorage: "1.2.840.10008.5.1.4.1.1.3.1", + MRImageStorage: "1.2.840.10008.5.1.4.1.1.4", + EnhancedMRImageStorage: "1.2.840.10008.5.1.4.1.1.4.1", + MRSpectroscopyStorage: "1.2.840.10008.5.1.4.1.1.4.2", + EnhancedMRColorImageStorage: "1.2.840.10008.5.1.4.1.1.4.3", + LegacyConvertedEnhancedMRImageStorage: "1.2.840.10008.5.1.4.1.1.4.4", + UltrasoundImageStorage: "1.2.840.10008.5.1.4.1.1.6.1", + EnhancedUSVolumeStorage: "1.2.840.10008.5.1.4.1.1.6.2", + SecondaryCaptureImageStorage: "1.2.840.10008.5.1.4.1.1.7", + MultiframeSingleBitSecondaryCaptureImageStorage: "1.2.840.10008.5.1.4.1.1.7.1", + MultiframeGrayscaleByteSecondaryCaptureImageStorage: "1.2.840.10008.5.1.4.1.1.7.2", + MultiframeGrayscaleWordSecondaryCaptureImageStorage: "1.2.840.10008.5.1.4.1.1.7.3", + MultiframeTrueColorSecondaryCaptureImageStorage: "1.2.840.10008.5.1.4.1.1.7.4", + Sop12LeadECGWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.1.1", + GeneralECGWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.1.2", + AmbulatoryECGWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.1.3", + HemodynamicWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.2.1", + CardiacElectrophysiologyWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.3.1", + BasicVoiceAudioWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.4.1", + GeneralAudioWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.4.2", + ArterialPulseWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.5.1", + RespiratoryWaveformStorage: "1.2.840.10008.5.1.4.1.1.9.6.1", + GrayscaleSoftcopyPresentationStateStorage: "1.2.840.10008.5.1.4.1.1.11.1", + ColorSoftcopyPresentationStateStorage: "1.2.840.10008.5.1.4.1.1.11.2", + PseudoColorSoftcopyPresentationStateStorage: "1.2.840.10008.5.1.4.1.1.11.3", + BlendingSoftcopyPresentationStateStorage: "1.2.840.10008.5.1.4.1.1.11.4", + XAXRFGrayscaleSoftcopyPresentationStateStorage: "1.2.840.10008.5.1.4.1.1.11.5", + XRayAngiographicImageStorage: "1.2.840.10008.5.1.4.1.1.12.1", + EnhancedXAImageStorage: "1.2.840.10008.5.1.4.1.1.12.1.1", + XRayRadiofluoroscopicImageStorage: "1.2.840.10008.5.1.4.1.1.12.2", + EnhancedXRFImageStorage: "1.2.840.10008.5.1.4.1.1.12.2.1", + XRay3DAngiographicImageStorage: "1.2.840.10008.5.1.4.1.1.13.1.1", + XRay3DCraniofacialImageStorage: "1.2.840.10008.5.1.4.1.1.13.1.2", + BreastTomosynthesisImageStorage: "1.2.840.10008.5.1.4.1.1.13.1.3", + BreastProjectionXRayImageStorageForPresentation: "1.2.840.10008.5.1.4.1.1.13.1.4", + BreastProjectionXRayImageStorageForProcessing: "1.2.840.10008.5.1.4.1.1.13.1.5", + IntravascularOpticalCoherenceTomographyImageStorageForPresentation: "1.2.840.10008.5.1.4.1.1.14.1", + IntravascularOpticalCoherenceTomographyImageStorageForProcessing: "1.2.840.10008.5.1.4.1.1.14.2", + NuclearMedicineImageStorage: "1.2.840.10008.5.1.4.1.1.20", + RawDataStorage: "1.2.840.10008.5.1.4.1.1.66", + SpatialRegistrationStorage: "1.2.840.10008.5.1.4.1.1.66.1", + SpatialFiducialsStorage: "1.2.840.10008.5.1.4.1.1.66.2", + DeformableSpatialRegistrationStorage: "1.2.840.10008.5.1.4.1.1.66.3", + SegmentationStorage: "1.2.840.10008.5.1.4.1.1.66.4", + SurfaceSegmentationStorage: "1.2.840.10008.5.1.4.1.1.66.5", + RealWorldValueMappingStorage: "1.2.840.10008.5.1.4.1.1.67", + SurfaceScanMeshStorage: "1.2.840.10008.5.1.4.1.1.68.1", + SurfaceScanPointCloudStorage: "1.2.840.10008.5.1.4.1.1.68.2", + VLEndoscopicImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.1", + VideoEndoscopicImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.1.1", + VLMicroscopicImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.2", + VideoMicroscopicImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.2.1", + VLSlideCoordinatesMicroscopicImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.3", + VLPhotographicImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.4", + VideoPhotographicImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.4.1", + OphthalmicPhotography8BitImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.5.1", + OphthalmicPhotography16BitImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.5.2", + StereometricRelationshipStorage: "1.2.840.10008.5.1.4.1.1.77.1.5.3", + OphthalmicTomographyImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.5.4", + VLWholeSlideMicroscopyImageStorage: "1.2.840.10008.5.1.4.1.1.77.1.6", + LensometryMeasurementsStorage: "1.2.840.10008.5.1.4.1.1.78.1", + AutorefractionMeasurementsStorage: "1.2.840.10008.5.1.4.1.1.78.2", + KeratometryMeasurementsStorage: "1.2.840.10008.5.1.4.1.1.78.3", + SubjectiveRefractionMeasurementsStorage: "1.2.840.10008.5.1.4.1.1.78.4", + VisualAcuityMeasurementsStorage: "1.2.840.10008.5.1.4.1.1.78.5", + SpectaclePrescriptionReportStorage: "1.2.840.10008.5.1.4.1.1.78.6", + OphthalmicAxialMeasurementsStorage: "1.2.840.10008.5.1.4.1.1.78.7", + IntraocularLensCalculationsStorage: "1.2.840.10008.5.1.4.1.1.78.8", + MacularGridThicknessandVolumeReport: "1.2.840.10008.5.1.4.1.1.79.1", + OphthalmicVisualFieldStaticPerimetryMeasurementsStorage: "1.2.840.10008.5.1.4.1.1.80.1", + OphthalmicThicknessMapStorage: "1.2.840.10008.5.1.4.1.1.81.1", + CornealTopographyMapStorage: "1.2.840.10008.5.1.4.1.1.82.1", + BasicTextSR: "1.2.840.10008.5.1.4.1.1.88.11", + EnhancedSR: "1.2.840.10008.5.1.4.1.1.88.22", + ComprehensiveSR: "1.2.840.10008.5.1.4.1.1.88.33", + Comprehensive3DSR: "1.2.840.10008.5.1.4.1.1.88.34", + ProcedureLog: "1.2.840.10008.5.1.4.1.1.88.40", + MammographyCADSR: "1.2.840.10008.5.1.4.1.1.88.50", + KeyObjectSelection: "1.2.840.10008.5.1.4.1.1.88.59", + ChestCADSR: "1.2.840.10008.5.1.4.1.1.88.65", + XRayRadiationDoseSR: "1.2.840.10008.5.1.4.1.1.88.67", + RadiopharmaceuticalRadiationDoseSR: "1.2.840.10008.5.1.4.1.1.88.68", + ColonCADSR: "1.2.840.10008.5.1.4.1.1.88.69", + ImplantationPlanSRDocumentStorage: "1.2.840.10008.5.1.4.1.1.88.70", + EncapsulatedPDFStorage: "1.2.840.10008.5.1.4.1.1.104.1", + EncapsulatedCDAStorage: "1.2.840.10008.5.1.4.1.1.104.2", + PositronEmissionTomographyImageStorage: "1.2.840.10008.5.1.4.1.1.128", + EnhancedPETImageStorage: "1.2.840.10008.5.1.4.1.1.130", + LegacyConvertedEnhancedPETImageStorage: "1.2.840.10008.5.1.4.1.1.128.1", + BasicStructuredDisplayStorage: "1.2.840.10008.5.1.4.1.1.131", + RTImageStorage: "1.2.840.10008.5.1.4.1.1.481.1", + RTDoseStorage: "1.2.840.10008.5.1.4.1.1.481.2", + RTStructureSetStorage: "1.2.840.10008.5.1.4.1.1.481.3", + RTBeamsTreatmentRecordStorage: "1.2.840.10008.5.1.4.1.1.481.4", + RTPlanStorage: "1.2.840.10008.5.1.4.1.1.481.5", + RTBrachyTreatmentRecordStorage: "1.2.840.10008.5.1.4.1.1.481.6", + RTTreatmentSummaryRecordStorage: "1.2.840.10008.5.1.4.1.1.481.7", + RTIonPlanStorage: "1.2.840.10008.5.1.4.1.1.481.8", + RTIonBeamsTreatmentRecordStorage: "1.2.840.10008.5.1.4.1.1.481.9", + RTBeamsDeliveryInstructionStorage: "1.2.840.10008.5.1.4.34.7", + GenericImplantTemplateStorage: "1.2.840.10008.5.1.4.43.1", + ImplantAssemblyTemplateStorage: "1.2.840.10008.5.1.4.44.1", + ImplantTemplateGroupStorage: "1.2.840.10008.5.1.4.45.1" +}; \ No newline at end of file diff --git a/Packages/viewerbase/package.js b/Packages/viewerbase/package.js index 4a22f122b..b850fe827 100644 --- a/Packages/viewerbase/package.js +++ b/Packages/viewerbase/package.js @@ -131,6 +131,8 @@ Package.onUse(function(api) { api.addFiles('lib/validators.js', 'client'); api.addFiles('lib/instanceClassSpecificViewport.js', 'client'); api.addFiles('lib/setMammogramViewportAlignment.js', 'client'); + api.addFiles('lib/isImage.js', 'client'); + api.addFiles('lib/sopClassDictionary.js', 'client'); api.export('resizeViewportElements', 'client'); api.export('handleResize', 'client'); @@ -154,6 +156,8 @@ Package.onUse(function(api) { api.export('getInstanceClassDefaultViewport', 'client'); api.export('showConfirmDialog', 'client'); api.export('applyWLPreset', 'client'); + api.export('isImage', 'client'); + api.export('sopClassDictionary', 'client'); // Export the ValidateJS Library with our added validators //api.export('validate', 'client');