Skip to main content
Version: Version 3.0 ๐Ÿšง

Module: SOP Class Handler

Overview#

This module defines how a specific DICOM SOP class should be processed to make a displaySet, something that can be hung in a viewport. An extension can register a SOP Class Handler Module by defining a getSopClassHandlerModule method. The SOP Class.

The mode chooses what SOPClassHandlers to use, so you could process a series in a different way depending on mode within the same application.

SOPClassHandler is a bit different from the other modules, as it doesn't provide a 1:1 schema for UI or provide it's own components. It instead defines:

  • sopClassUIDs: an array of string SOP Class UIDs that the getDisplaySetFromSeries method should be applied to.
  • getDisplaySetFromSeries: a method that maps series and study metadata to a display set

A displaySet has the following shape:

return {  Modality: 'MR',  displaySetInstanceUIDD  SeriesDate,  SeriesTime,  SeriesInstanceUID,  StudyInstanceUID,  SeriesNumber,  FrameRate,  SeriesDescription,  isMultiFrame,  numImageFrames,  SOPClassHandlerId,}

Example SOP Class Handler Module#

import ImageSet from '@ohif/core/src/classes/ImageSet';

const sopClassDictionary = {  CTImageStorage: "1.2.840.10008.5.1.4.1.1.2",  MRImageStorage: "1.2.840.10008.5.1.4.1.1.4",};

// It is important to note that the used SOPClassUIDs in the modes are in the order that is specified in the array.const sopClassUids = [  sopClassDictionary.CTImageStorage,  sopClassDictionary.MRImageStorage,;
const makeDisplaySet = (instances) => {  const instance = instances[0];  const imageSet = new ImageSet(instances);
  imageSet.setAttributes({    displaySetInstanceUID: imageSet.uid,    SeriesDate: instance.SeriesDate,    SeriesTime: instance.SeriesTime,    SeriesInstanceUID: instance.SeriesInstanceUID,    StudyInstanceUID: instance.StudyInstanceUID,    SeriesNumber: instance.SeriesNumber,    FrameRate: instance.FrameTime,    SeriesDescription: instance.SeriesDescription,    Modality: instance.Modality,    isMultiFrame: isMultiFrame(instance),    numImageFrames: instances.length,    SOPClassHandlerId: `${id}.sopClassHandlerModule.${sopClassHandlerName}`,  });
  return imageSet;};
getSopClassHandlerModule = () => {  return [    {      name: 'stack,      sopClassUids,      getDisplaySetsFromSeries: makeDisplaySet,    },  ];};

More examples :#

You can find another example for this mapping between raw metadata and displaySet for DICOM-SR extension.

@ohif/viewer usage#

We use the sopClassHandlerModules in DisplaySetService where we transform instances from the raw metadata format to a OHIF displaySet format. You can read more about DisplaySetService here.