Registering private or retired SOP Classes#
In order to correctly match a DICOM service class to an abstract syntax, the SOP Class UID used in a presentation context must be known or be included in pynetdicom .
>>> from pynetdicom.sop_class import CTImageStorage
>>> CTImageStorage.service_class # Included SOP Class UID
<class 'pynetdicom.service_class.StorageServiceClass'>
>>> from pydicom.uid import CTImageStorage
>>> from pynetdicom.sop_class import uid_to_service_class
>>> uid_to_service_class(CTImageStorage) # Known SOP Class UID
<class 'pynetdicom.service_class.StorageServiceClass'>
However some SOP Class UIDs are not included in pynetdicom, either because they’re
privately defined, have been retired from the DICOM Standard or are too new to have been
included in the most recent release. If you need to support one of these SOP classes
you should use the register_uid()
function to match the
UID to an appropriate service_class
object.
from pynetdicom import register_uid
from pynetdicom.service_class import StorageServiceClass
# Register 1.2.246.352.70.1.70 to the Storage service
register_uid(
"1.2.246.352.70.1.70",
"PrivateRTPlanStorage",
StorageServiceClass,
)
The UID itself can then be used directly or imported from the
sop_class
module and used like other SOP Class UIDs.
from pynetdicom import AE, evt
from pynetdicom.sop_class import PrivateRTPlanStorage
def handle_store(evt):
ds = event.dataset
ds.file_meta = event.file_meta
ds.save_as(ds.SOPInstanceUID)
return 0x0000
ae = AE()
ae.add_supported_context(PrivateRTPlanStorage)
# or ae.add_supported_context("1.2.246.352.70.1.70")
ae.start_server(("localhost", 11112), evt_handlers=[(evt.EVT_C_STORE, handle_store)])
When registering a new UID with the
QueryRetrieveServiceClass
, you must also
specify which of the three DIMSE-C message types the UID is to be used with.
from pynetdicom import register_uid
from pynetdicom.service_class import QueryRetrieveServiceClass
register_uid(
"1.2.246.352.70.1.70",
"PrivateQueryFind",
QueryRetrieveServiceClass,
dimse_msg_type="C-FIND" # or "C-GET" or "C-MOVE"
)