Skip to main content

Module: SOP Class Handler

An extension can register a SOP Class Handler Module by defining a getSopClassHandlerModule method. The SOP Class Handler 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 {
plugin: 'html',
Modality: 'SR',
displaySetInstanceUID: 0,
wadoRoot: study.getData().wadoRoot,
wadoUri: instance.getData().wadouri,
SOPInstanceUID: instance.getSOPInstanceUID(),
SeriesInstanceUID: series.getSeriesInstanceUID(),
StudyInstanceUID: study.getStudyInstanceUID(),
authorizationHeaders,
};

Where the plugin key is used to influence the default ViewportComponent for rendering the displaySet. Additional properties are passed to the ViewportComponent and used by the default StudyBrowser to render "thumbnails" for each displaySet

Example SOP Class Handler Module

const SOP_CLASS_UIDS = {
BASIC_TEXT_SR: '1.2.840.10008.5.1.4.1.1.88.11',
ENHANCED_SR: '1.2.840.10008.5.1.4.1.1.88.22',
};

export default {
id: 'example-sop-class-handler-module',

/**
* @param {object} params
* @param {ServicesManager} params.servicesManager
* @param {CommandsManager} params.commandsManager
*/
getSopClassHandlerModule({ servicesManager, commandsManager }) {
return {
id: 'OHIFDicomHtmlSopClassHandler',
sopClassUIDs: Object.values(SOP_CLASS_UIDS),

/**
* @param {object} series -
* @param {object} study -
* @param {object} dicomWebClient -
* @param {object} authorizationHeaders -
*/
getDisplaySetFromSeries(series, study, dicomWebClient, authorizationHeaders) {
const instance = series.getFirstInstance();

return {
plugin: 'html',
displaySetInstanceUID: 0,
wadoRoot: study.getData().wadoRoot,
wadoUri: instance.getData().wadouri,
SOPInstanceUID: instance.getSOPInstanceUID(),
SeriesInstanceUID: series.getSeriesInstanceUID(),
StudyInstanceUID: study.getStudyInstanceUID(),
authorizationHeaders,
};
},
}
};

More examples :

@ohif/viewer usage

We use the sopClassHandlerModules in three different places:

  • ViewerLocalFileData.js
  • ViewerRetrieveStudyData.js
  • StandaloneRouting.js

Each time, it is used to map study and series data to displaySets. It does this by working alongside the StudyMetadataManager in @ohif/core. That manager has the method createDisplaySets that takes an array of sopClassHandlerModules.