├── Errors.py ├── LightClass.py ├── LightParse.py ├── LightRead.py ├── LightTag.py ├── README.md ├── README_KOR.md ├── Tags.py ├── UID.py ├── setup.py └── test.py /Errors.py: -------------------------------------------------------------------------------- 1 | class LightError(Exception): 2 | def __init__(self, msg): 3 | self.msg = msg 4 | super().__init__() 5 | def __str__(self): 6 | return self.msg -------------------------------------------------------------------------------- /LightClass.py: -------------------------------------------------------------------------------- 1 | from Errors import LightError 2 | from UID import UID_dictionary 3 | 4 | import numpy as np 5 | import os 6 | 7 | class LightDCMClass(): 8 | def __init__(self, **kwargs): 9 | self.path = None 10 | self.Little_Endian=True 11 | self.print_warning=True 12 | self.force=False 13 | self.endian='Implicit VR Little Endian' 14 | self.file = None 15 | self.dtype = [b'CS', b'SH', b'LO', b'ST', b'LT', b'UT', b'AE', b'PN', b'UI', b'UID', b'DA', \ 16 | b'TM', b'DT', b'AS', b'IS', b'DS', b'SS', b'US', b'SL', b'UL', b'AT', \ 17 | b'FL', b'FD', b'OB', b'OW', b'OF', b'SQ', b'UN'] 18 | for k, v in kwargs.items(): 19 | exec(f'self.{k}=v') 20 | 21 | def lightRead(self, path=None): 22 | assert self.path is not None or path is not None, \ 23 | "Input path argument should exist in either 'LightDCMClass.path' or 'LightDCMClass.lightRead(path)'" 24 | if self.path is not None: 25 | if path is not None and self.print_warning is True: 26 | print("'LightDCMClass.path' precedes 'LightDCMClass.lightRead(path)'. Using LightDCMClass.path") 27 | file = open(self.path, 'rb').read() 28 | self._exam_file(file[:132], self.force) 29 | else: 30 | self.path = path 31 | file = open(self.path, 'rb').read() 32 | self._exam_file(file[:132], self.force) 33 | 34 | self.file = file 35 | 36 | def __len__(self): 37 | return len(self.file) 38 | 39 | def _exam_file(self, file, force): 40 | preamble = bytes([0])*128 41 | if file[:128] != preamble: 42 | if self.print_warning == True: 43 | print(f"For {self.path}, first 128 bytes are not zeros. This is not usual DICOM type. Handle this file carefully.") 44 | else: 45 | pass 46 | if file[128:132] != b'DICM': 47 | if force is False: 48 | raise LightError(f"For {self.path}, 129-th~133-th bytes should be 'DICM'. This is not valid DICOM file.\n"\ 49 | +"If you want to read this file anyway, try 'LightDCMClass(force=True)'") 50 | else: 51 | if self.print_warning is True: 52 | print(f"For {self.path}, 129-th~133-th bytes are not 'DICM'. This is not usual DICOM type. Handle this file carefully.") 53 | else: 54 | pass 55 | def _maketag(self, binary, idx): 56 | ret = [] 57 | converted = list(binary) 58 | for l in converted: 59 | l = str(hex(l))[2:] 60 | if len(str(l))==1: 61 | ret.append('0'+str(l)) 62 | elif len(str(l))==2: 63 | ret.append(str(l)) 64 | else: 65 | ret.append() 66 | if 'Little' in self.endian: 67 | return f'{ret[1]}{ret[0]},{ret[3]}{ret[2]}' 68 | elif 'Big' in self.endian: 69 | return f'{ret[0]}{ret[1]},{ret[2]}{ret[3]}' 70 | else: 71 | return f'{ret[1]}{ret[0]},{ret[3]}{ret[2]}' 72 | 73 | def _check_endian(self): 74 | if self.file == None: 75 | self.lightRead() 76 | if b'1.2.840.10008.1.2.1' in self.file: 77 | self.endian = UID_dictionary['1.2.840.10008.1.2.1'][0] 78 | elif b'1.2.840.10008.1.2.2' in self.file: 79 | self.endian = UID_dictionary['1.2.840.10008.1.2.2'][0] 80 | elif b'1.2.840.10008.1.2' in self.file: 81 | self.endian = UID_dictionary['1.2.840.10008.1.2'][0] 82 | elif b'1.2.840.10008.1.2.1.99' in self.file: 83 | self.endian = UID_dictionary['1.2.840.10008.1.2.1.99'][0] 84 | else: 85 | self.endian = 'Explicit VR Little Endian' 86 | 87 | 88 | def _get_vr_length(self, binary): 89 | li = list(binary) 90 | s = 0 91 | for l in li: 92 | s = s + l 93 | return s 94 | 95 | def _integer(self, string): 96 | try: 97 | return int(string) 98 | except: 99 | alphabet = {'a':10, 'b':11, 'c':12, 'd':13, 'e':14, 'f':15} 100 | return alphabet[string] 101 | 102 | def _OBOW_vr(self, bytestring, tag): 103 | slices = [] 104 | bytestring = bytes(bytestring) 105 | for i in range(len(bytestring)//2): 106 | if tag=='7fe0,0010': 107 | converted = (bytes(reversed(bytestring)).hex()) 108 | return int(converted, 16) 109 | else: 110 | slices.append(np.frombuffer(bytes((bytestring[2*i:2*(i+1)])), np.uint16)) 111 | return np.sum(slices) 112 | 113 | 114 | def get_data(self, tag, path=None): 115 | if not os.path.isfile(self.path): 116 | raise LightError(f"{self.path} does not exist. Check your file path") 117 | if self.file == None: 118 | self.lightRead(path) 119 | tag = tag.replace(' ', '') 120 | idx = 132 121 | self._check_endian() 122 | while True: 123 | find_tag = self._maketag(self.file[idx:idx+4], idx) 124 | if 'Explicit' in self.endian: 125 | dtype = self.file[idx+4:idx+6] 126 | if find_tag == '0008,1140': 127 | if tag == '0008,1140': 128 | vl = self.file[idx+8:idx+12] 129 | return {'tag': tag, 'dtype': dtype, 'length': vl, 'value': self.file[idx+12:idx+12+8]} 130 | else: 131 | idx = idx+20 132 | else: 133 | if dtype in [b'OB', b'OW', b'SQ', b'UN']: 134 | reserved = self.file[idx+6:idx+8] 135 | vl = self.file[idx+8:idx+12] 136 | 137 | if dtype in [b'OB', b'OW']: 138 | vl = self._OBOW_vr(vl, find_tag) 139 | else: 140 | vl = self._get_vr_length(vl) 141 | if find_tag==tag: 142 | return {'tag': tag, 'dtype': dtype, 'reserved': reserved, 'length': vl, 'value': self.file[idx+12:idx+12+vl]} 143 | else: 144 | idx = idx+12+vl 145 | else: 146 | vl = self.file[idx+6:idx+8] 147 | vl = self._get_vr_length(vl) 148 | if find_tag==tag: 149 | return {'tag': tag, 'dtype': dtype, 'length': vl, 'value': self.file[idx+8 :idx+8+vl]} 150 | else: 151 | idx = idx+8+vl 152 | 153 | if 'Implicit' in self.endian: 154 | if find_tag == '0008,1140': 155 | if tag == '0008,1140': 156 | vl = self.file[idx+8:idx+12] 157 | return {'tag': tag, 'dtype': dtype, 'length': vl, 'value': self.file[idx+12:idx+12+8]} 158 | else: 159 | idx = idx+20 160 | else: 161 | try: 162 | if int(find_tag[:4])<8: 163 | dummy = 0 164 | vl = self.file[idx+6:idx+8+dummy] 165 | else: 166 | dummy = 2 167 | vl = self.file[idx+4:idx+6+dummy] 168 | except: 169 | dummy = 2 170 | vl = self.file[idx+4:idx+6+dummy] 171 | 172 | if find_tag=='7fe0,0010': 173 | vl = self._OBOW_vr(vl, find_tag) 174 | value = self.file[idx+8: idx+8+vl] 175 | return {'tag': tag, 'length': vl, 'value': np.frombuffer(value, np.int16)} 176 | else: 177 | vl = self._get_vr_length(vl) 178 | if find_tag==tag: 179 | return {'tag': tag, 'length': vl, 'value': self.file[idx+8: idx+8+vl]} 180 | else: 181 | try: 182 | if int(find_tag[:4])<8: 183 | idx = idx+8+vl+dummy 184 | else: 185 | idx = idx+6+vl+dummy 186 | except: 187 | idx = idx+6+dummy+vl 188 | 189 | if idx>=len(self.file)-4: 190 | raise LightError(f"No matching tag was founded for tag ({tag}) in file {self.path}.") 191 | 192 | 193 | def _convert_to_int(self, binary): 194 | binary = binary.hex() 195 | return self._integer(binary) 196 | 197 | 198 | def read_pixel(self): 199 | d = self.get_data('7fe0,0010') 200 | try: 201 | intercept = float(self.get_data('0028,1052')['value']) 202 | slope = float(self.get_data('0028,1053')['value']) 203 | except: 204 | intercept = 0 205 | slope = 1 206 | width = np.frombuffer(self.get_data('0028,0010')['value'], np.uint16)[0] 207 | height= np.frombuffer(self.get_data('0028,0011')['value'], np.uint16)[0] 208 | npy = np.frombuffer(d['value'], np.int16) 209 | return npy.reshape(width, height, -1).squeeze() * slope + intercept 210 | 211 | 212 | def read_all(self, with_pixel=True, resize_pixel=True): 213 | if not os.path.isfile(self.path): 214 | raise LightError(f"{self.path} does not exist. Check your file path") 215 | if self.file == None: 216 | self.lightRead(self.path) 217 | idx = 132 218 | self._check_endian() 219 | all_dict = {} 220 | while idx int: 8 | ret = [] 9 | converted = list(binary) 10 | for l in converted: 11 | l = str(hex(l))[2:] 12 | if len(str(l))==1: 13 | ret.append('0'+str(l)) 14 | else: 15 | ret.append(str(l)) 16 | if isLittle: 17 | return int(f'{ret[1]}{ret[0]}{ret[3]}{ret[2]}', 16) 18 | else: 19 | return int(f'{ret[0]}{ret[1]},{ret[2]}{ret[3]}', 16) 20 | 21 | 22 | dtypeString = ["CS", "SH", "LO", "ST", "LT", "UT", "AE', 'PN", "UI", "DA", "TM", "DT", "AS", "IS", "DS"] 23 | dtypeInt = ["SL", "SS", "US", "UL"] 24 | dtypeFloat = ["AT", "FL", "FD", "OF"] 25 | dtypeOB = ["OB"] 26 | dtypeOW = ["OW"] 27 | dtypeSQ = ["SQ"] 28 | dtypeUN = ["UN"] 29 | 30 | def ifContainsString(vr:str) -> bool: 31 | if vr in dtypeString: 32 | return True 33 | else: 34 | return False 35 | 36 | def ifContainsInt(vr:str) -> bool: 37 | if vr in dtypeInt: 38 | return True 39 | else: 40 | return False 41 | 42 | def ifContainsOB(vr:str) -> bool: 43 | if vr in dtypeOB: 44 | return True 45 | else: 46 | return False 47 | 48 | def ifContainsOW(vr:str) -> bool: 49 | if vr in dtypeOW: 50 | return True 51 | else: 52 | return False 53 | 54 | def ifContainsSQ(vr:str) -> bool: 55 | if vr in dtypeSQ: 56 | return True 57 | else: 58 | return False 59 | def ifContainsUN(vr:str) -> bool: 60 | if vr in dtypeUN: 61 | return True 62 | else: 63 | return False 64 | 65 | def ifGroupLengthTag(tag:str) -> bool: 66 | if tag % (16**4) == 0: 67 | return True 68 | else: 69 | return False 70 | 71 | def parseUL(value:bin, isLittle:bool) -> int: 72 | toInt = list(value) 73 | retInt = sum(toInt) 74 | 75 | return retInt 76 | 77 | def _OBOW_vr(bytestring:bytes, tag:int, isLittle) -> int: 78 | slices = [] 79 | bytestring = bytes(bytestring) 80 | for i in range(len(bytestring)//2): 81 | if tag==0x7fe00010: 82 | if isLittle: 83 | converted = int.from_bytes(bytestring, byteorder='little', signed = False) 84 | else: 85 | converted = int.from_bytes(bytestring, byteorder='big', signed = False) 86 | return converted 87 | else: 88 | slices.append(np.frombuffer(bytes((bytestring[2*i:2*(i+1)])), np.uint16)) 89 | return np.sum(slices) 90 | 91 | def _get_vr_length(binary:bin, isLittle:bool) -> int: 92 | li = list(binary) 93 | s = 0 94 | if isLittle: 95 | for idx, l in enumerate(li): 96 | s = s + l * 16**idx 97 | else: 98 | for idx, ldx in enuerate(range(len(li))): 99 | s = s + li[2*((ldx)//2) + ((ldx+1)%2)] * \ 100 | 16**idx 101 | return s 102 | 103 | def parseUntilUID(tagClass:Tag, \ 104 | file:bin, \ 105 | idx=132) -> Tag: 106 | UID = None 107 | while True: 108 | idx = int(idx) 109 | _tag = getTag(file[idx:idx+4], isLittle=True) 110 | 111 | isGroupLengthTag = ifGroupLengthTag(_tag) 112 | idx = idx + 4 113 | vr = file[idx:idx+2] 114 | 115 | # Refer "https://dicom.nema.org/dicom/2013/output/chtml/part05/chapter_7.html" for more details. 116 | if vr in [b'OB', b'OW', b'OF', b'SQ', b'UT', b'UN']: 117 | idx = idx + 2 + 2 # Last 2 is for reserved 2 bytes. 118 | vl = file[idx:idx+4] 119 | idx = idx + 4 120 | vl = _OBOW_vr(vl, _tag, isLittle=True) 121 | else: 122 | idx = idx + 2 # There are no reseved bytes. 123 | vl = file[idx:idx+2] 124 | vl = _get_vr_length(vl, isLittle=True) 125 | idx = idx + 2 126 | value = file[idx:idx + vl] 127 | 128 | if isGroupLengthTag: 129 | assert vr == b'UL', "Value Representation (VR) should be type of UL (Unsigned Long) for Group Length Tag."+\ 130 | f"Current VR : {vr}. Check your DICOM sanity." 131 | value = parseUL(value, isLittle=True) 132 | 133 | idx = idx + vl 134 | tagClass[_tag] = [vr, vl, value] 135 | if _tag == 131088: 136 | UID = hex(_tag) 137 | 138 | print(hex(_tag), vr, vl, value) 139 | if UID is not None: 140 | return tagClass, idx, UID 141 | 142 | if idx > len(file): 143 | raise LightError("This file does not follow DICOM standard protocol. Check your DICOM sanity.") 144 | 145 | def parseExplicitVRLittleEndian(tagClass:Tag, \ 146 | file:bin, \ 147 | isLittle:bool,\ 148 | idx=132) -> Tag: 149 | while True: 150 | idx = int(idx) 151 | _tag = getTag(file[idx:idx+4], isLittle=isLittle) 152 | 153 | isGroupLengthTag = ifGroupLengthTag(_tag) 154 | idx = idx + 4 155 | vr = file[idx:idx+2] 156 | 157 | # Refer "https://dicom.nema.org/dicom/2013/output/chtml/part05/chapter_7.html" for more details. 158 | if vr in [b'OB', b'OW', b'OF', b'SQ', b'UT', b'UN']: 159 | idx = idx + 2 + 2 # Last 2 is for reserved 2 bytes. 160 | vl = file[idx:idx+4] 161 | idx = idx + 4 162 | vl = _OBOW_vr(vl, _tag, isLittle=isLittle) 163 | else: 164 | idx = idx + 2 # There are no reseved bytes. 165 | vl = file[idx:idx+2] 166 | vl = _get_vr_length(vl, isLittle=isLittle) 167 | idx = idx + 2 168 | value = file[idx:idx + vl] 169 | 170 | if isGroupLengthTag: 171 | assert vr == b'UL', "Value Representation (VR) should be type of UL (Unsigned Long) for Group Length Tag."+\ 172 | f"Current VR : {vr}. Check your DICOM sanity." 173 | value = parseUL(value, isLittle=isLittle) 174 | 175 | idx = idx + vl 176 | tagClass[_tag] = [vr, vl, value] 177 | 178 | print(hex(_tag), vr, vl, value) 179 | if idx == len(file): 180 | return tagClass 181 | if idx > len(file): 182 | raise LightError("This file does not follow DICOM standard protocol. Check your DICOM sanity.") 183 | # return tagClass 184 | 185 | def parseImplicitVRLittleEndian(tagClass:Tag, \ 186 | file:bin, \ 187 | isLittle:bool,\ 188 | idx=132) -> Tag: 189 | while True: 190 | idx = int(idx) 191 | _tag = getTag(file[idx:idx+4], isLittle=isLittle) 192 | 193 | isGroupLengthTag = ifGroupLengthTag(_tag) 194 | idx = idx + 4 195 | 196 | # Refer "https://dicom.nema.org/dicom/2013/output/chtml/part05/chapter_7.html" for more details. 197 | print(hex(_tag)) 198 | vr = DicomDictionary[_tag][0] 199 | 200 | vl = file[idx:idx+4] 201 | idx = idx + 4 202 | vl = _get_vr_length(vl, isLittle=isLittle) 203 | 204 | value = file[idx:idx + vl] 205 | 206 | if isGroupLengthTag: 207 | assert vr == b'UL', "Value Representation (VR) should be type of UL (Unsigned Long) for Group Length Tag."+\ 208 | f"Current VR : {vr}. Check your DICOM sanity." 209 | value = parseUL(value, isLittle=isLittle) 210 | 211 | idx = idx + vl 212 | tagClass[_tag] = [vr, vl, value] 213 | 214 | print(hex(_tag), vr, vl, value) 215 | if idx == len(file): 216 | return tagClass 217 | if idx > len(file): 218 | raise LightError("This file does not follow DICOM standard protocol. Check your DICOM sanity.") 219 | # return tagClass 220 | -------------------------------------------------------------------------------- /LightRead.py: -------------------------------------------------------------------------------- 1 | from LightTag import Tag 2 | from LightParse import * 3 | 4 | class LightRead(Tag): 5 | def __init__(self, path, print_warning=True): 6 | super().__init__() 7 | self.path = path 8 | self.print_warning = print_warning 9 | self.dtype = [b'CS', b'SH', b'LO', b'ST', b'LT', b'UT', b'AE', \ 10 | b'PN', b'UI', b'UID', b'DA', b'TM', b'DT', b'AS', \ 11 | b'IS', b'DS', b'SS', b'US', b'SL', b'UL', b'AT', \ 12 | b'FL', b'FD', b'OB', b'OW', b'OF', b'SQ', b'UN'] 13 | self.isLittle = True 14 | self.isExplicit = True 15 | 16 | def __len__(self): 17 | return len(self.file) 18 | 19 | 20 | def lightRead(self, path:str = None) -> None: 21 | assert self.path is not None or path is not None, \ 22 | "Input path argument should exist in either "+\ 23 | "'LightDCMClass.path' or 'LightDCMClass.lightRead(path)'" 24 | if self.path is not None: 25 | if path is not None and self.print_warning is True: 26 | print("'LightDCMClass.path' precedes "+\ 27 | "'LightDCMClass.lightRead(path)'. Using "\ 28 | "LightDCMClass.path") 29 | file = open(self.path, 'rb').read() 30 | self._exam_file(file[:132], self.force) 31 | else: 32 | self.path = path 33 | file = open(self.path, 'rb').read() 34 | self._exam_file(file[:132], self.force) 35 | 36 | self.file = file 37 | 38 | def _exam_file(self, file, force): 39 | preamble = bytes([0])*128 40 | if file[:128] != preamble: 41 | if self.print_warning == True: 42 | print(f"For {self.path}, first 128 bytes are not zeros. "\ 43 | "This is not usual DICOM type. Handle this file "\ 44 | "carefully.") 45 | else: 46 | pass 47 | if file[128:132] != b'DICM': 48 | if force is False: 49 | raise LightError(f"For {self.path}, 129-th~133-th bytes "\ 50 | "should be 'DICM'. This is not valid DICOM file.\n"\ 51 | "If you want to read this file anyway, try "\ 52 | "'LightDCMClass(force=True)'") 53 | else: 54 | if self.print_warning is True: 55 | print(f"For {self.path}, 129-th~133-th bytes are not "\ 56 | "'DICM'. This is not usual DICOM type. Handle this "\ 57 | "file carefully.") 58 | else: 59 | pass 60 | 61 | def readDCM(self): 62 | if -------------------------------------------------------------------------------- /LightTag.py: -------------------------------------------------------------------------------- 1 | from Tags import DicomDictionary 2 | from Errors import LightError 3 | 4 | from typing import Union, Any 5 | 6 | class Tag: 7 | def __init__(self): 8 | super().__init__() 9 | self._dict = DicomDictionary 10 | for k in DicomDictionary.keys(): 11 | setattr(self, DicomDictionary[k][4], None) 12 | 13 | def __getitem__(self, tag:Union[str, int, tuple]) -> Any: 14 | if isinstance(tag, str): 15 | return getattr(self, tag) 16 | elif isinstance(tag, int): 17 | field = self._dict[tag][4] 18 | return getattr(self, field) 19 | elif isinstance(tag, tuple): 20 | tag1, tag2 = tag 21 | field = self._dict[tag1 * (16**4) + tag2][4] 22 | return getattr(self, field) 23 | else: 24 | raise LightError("This is not valid indexing. Try one of:\n"+\ 25 | " 1. dcm[0x10,0x10]\n"+\ 26 | " 2. dcm[0x100010]\n"+\ 27 | " 3. dcm.PatientName") 28 | 29 | 30 | def __setitem__(self, key, value): 31 | if isinstance(key, int): 32 | setattr(self, self._dict[key][4], value) 33 | elif isinstance(key, str): 34 | setattr(self, key, value) 35 | elif isinstance(key, tuple): 36 | tag1, tag2 = key 37 | setattr((self, self._dict[tag1 * (16**4) + tag2][4], value)) 38 | else: 39 | raise LightError("This is not valid indexing. Try one of:\n" + \ 40 | " 1. dcm[0x10,0x10]\n" + \ 41 | " 2. dcm[0x100010]\n" + \ 42 | " 3. dcm.PatientName") -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LightDICOM 2 | 3 | _**LightDICOM**_ is a _**fast as light, light as feather**_ Python3 package for managing [DICOM](https://www.dicomstandard.org/) files. 4 | The only 3rd party dependency is `numpy`, thus **fast** and **light**. 5 | 6 | - **Source Code**: [Github](https://github.com/jryoungw/lightdicom) 7 | - **Korean version**: [한국어 README](https://github.com/jryoungw/lightdicom/blob/main/README_KOR.md) 8 | - **Bug report/Feature request**: Open a Github [Issue](https://github.com/jryoungw/lightdicom/issues/new/choose) or contact me at `ryoungwoo.jang@vuno.co` 9 | - Benchmarks: WIP 10 | - DEMO: WIP 11 | - Documentation: WIP 12 | 13 | ## Basic Usage 14 | 15 | ``` 16 | from LightClass import LightDCMClass 17 | 18 | lc = LightDCMClass() 19 | lc.path = path_to_dicom 20 | d = lc.get_data('0010,0010') # Read tag (0010, 0010), which is "Patient's Name" 21 | npy = lc.read_pixel() # Read pixel values 22 | ``` 23 | 24 | Or 25 | 26 | ``` 27 | from LightClass import LightDCMClass 28 | 29 | lc = LightDCMClass(path=path_to_dicom) 30 | d = lc.get_data('0010,0010') # Read tag (0010, 0010), which is "Patient's Name" 31 | npy = lc.read_pixel() # Read pixel values 32 | ``` 33 | 34 | ## How to read all headers and their values? 35 | 36 | ``` 37 | lc = LightDCMClass() 38 | lc.path = path_to_dicom 39 | # Equivalent code : lc = LightDCMClass(path=path_to_dicom) 40 | all_headers = lc.read_all(with_pixel=True) 41 | ``` 42 | 43 | In **.read_all** method, there are two arguments: 44 | - with_pixel : If **True**, read header information with pixel values. Else, **.read_all** will not read pixel values. There will be no significant time difference, yet memory efficiency will be different. **False** uses less memory. That's the difference. 45 | - resize_pixel : If **True**, pixel value will be reshaped according to width (0028,0010) and height (0028,0011) information. I guess that in most situations, setting **.resize_pixel** to **False** will not be required. 46 | 47 | ## Dependencies 48 | ``` 49 | - Python 3.x 50 | - Numpy 51 | ``` 52 | ## Installation 53 | 54 | If `numpy` is not installed, first install it by `pip`, `conda` or other method of your choice. 55 | - install from source 56 | `git clone https://github.com/jryoungw/lightdicom` 57 | - pypi, conda, etc. are not yet supported. (WIP) 58 | ## Notes 59 | 60 | This is a prototype version, so do remember that bugs or unexpected behaviors may exist. 61 | Whenever bugs are found, please contact via the aforementioned methods. PRs are welcome! 62 | -------------------------------------------------------------------------------- /README_KOR.md: -------------------------------------------------------------------------------- 1 | # LightDICOM 2 | 3 | LightDICOM은 빠르고(like light), 가벼운(light) Python DICOM 패키지입니다. Python3 문법으로 작성되었으며 기본 내장 패키지 이외에는 numpy에만 의존하는 독립성이 높은 DICOM 패키지입니다. 4 | 5 | 사용에 대한 피드백과 문의는 jryounw2035@gmail.com 으로 주세요. 6 | 7 | ## 기본 사용법 8 | 9 | ```python 10 | from LightClass import LightDCMClass 11 | 12 | lc = LightDCMClass() 13 | lc.path = path_to_dicom 14 | d = lc.get_data('0010,0010') # Read tag (0010, 0010), which is "Patient's Name" 15 | npy = lc.read_pixel() # Read pixel values 16 | ``` 17 | 18 | 혹은 19 | 20 | ```python 21 | from LightClass import LightDCMClass 22 | 23 | lc = LightDCMClass(path=path_to_dicom) 24 | d = lc.get_data('0010,0010') # Read tag (0010, 0010), which is "Patient's Name" 25 | npy = lc.read_pixel() # Read pixel values 26 | ``` 27 | 28 | ## 한 번에 모든 DICOM header를 읽는 방법은? 29 | 30 | ```python 31 | lc = LightDCMClass() 32 | lc.path = path_to_dicom 33 | # Equivalent code : lc = LightDCMClass(path=path_to_dicom) 34 | all_headers = lc.read_all(with_pixel=True) 35 | ``` 36 | 37 | **.read_all** 메서드에는 두 가지 인자가 있습니다. 38 | - with_pixel : **True**로 설정하면, 픽셀 정보를 함께 리턴합니다(7fe0,0010). **False**로 설정하는 것과 속도면에서는 큰 차이가 없습니다. **True**로 두냐 **False**로 두냐의 차이는 메모리를 더 사용하냐 덜 사용하냐입니다. 39 | - resize_pixel : **True**로 두면, width (0028,0010)와 height (0028,0011) 정보에 따라 이미지를 resize해줍니다. 대부분의 상황에서 이 값을 **True**로 놓으면 마음이 편안해질 것입니다. 40 | 41 | 42 | ## Notes 43 | 44 | 이 repository는 프로토타입 버전입니다. 더 발전된 버전은 향후 릴리즈 예정입니다 ... (아마도?) 45 | -------------------------------------------------------------------------------- /UID.py: -------------------------------------------------------------------------------- 1 | """ 2 | DICOM UID dictionary 3 | 4 | Forked from 5 | 6 | https://github.com/pydicom/pydicom/blob/0949488c8912b13e6ad6078afa93f2a86cd53538/pydicom/_uid_dict.py 7 | """ 8 | 9 | 10 | UID_dictionary = { 11 | '1.2.840.10008.1.1': ('Verification SOP Class', 'SOP Class', '', '', 'Verification'), # noqa 12 | '1.2.840.10008.1.2': ('Implicit VR Little Endian', 'Transfer Syntax', 'Default Transfer Syntax for DICOM', '', 'ImplicitVRLittleEndian'), # noqa 13 | '1.2.840.10008.1.2.1': ('Explicit VR Little Endian', 'Transfer Syntax', '', '', 'ExplicitVRLittleEndian'), # noqa 14 | '1.2.840.10008.1.2.1.99': ('Deflated Explicit VR Little Endian', 'Transfer Syntax', '', '', 'DeflatedExplicitVRLittleEndian'), # noqa 15 | '1.2.840.10008.1.2.2': ('Explicit VR Big Endian', 'Transfer Syntax', '', 'Retired', 'ExplicitVRBigEndian'), # noqa 16 | '1.2.840.10008.1.2.4.50': ('JPEG Baseline (Process 1)', 'Transfer Syntax', 'Default Transfer Syntax for Lossy JPEG 8 Bit Image Compression', '', 'JPEGBaseline8Bit'), # noqa 17 | '1.2.840.10008.1.2.4.51': ('JPEG Extended (Process 2 and 4)', 'Transfer Syntax', 'Default Transfer Syntax for Lossy JPEG 12 Bit Image Compression (Process 4 only)', '', 'JPEGExtended12Bit'), # noqa 18 | '1.2.840.10008.1.2.4.52': ('JPEG Extended (Process 3 and 5)', 'Transfer Syntax', '', 'Retired', 'JPEGExtended35'), # noqa 19 | '1.2.840.10008.1.2.4.53': ('JPEG Spectral Selection, Non-Hierarchical (Process 6 and 8)', 'Transfer Syntax', '', 'Retired', 'JPEGSpectralSelectionNonHierarchical68'), # noqa 20 | '1.2.840.10008.1.2.4.54': ('JPEG Spectral Selection, Non-Hierarchical (Process 7 and 9)', 'Transfer Syntax', '', 'Retired', 'JPEGSpectralSelectionNonHierarchical79'), # noqa 21 | '1.2.840.10008.1.2.4.55': ('JPEG Full Progression, Non-Hierarchical (Process 10 and 12)', 'Transfer Syntax', '', 'Retired', 'JPEGFullProgressionNonHierarchical1012'), # noqa 22 | '1.2.840.10008.1.2.4.56': ('JPEG Full Progression, Non-Hierarchical (Process 11 and 13)', 'Transfer Syntax', '', 'Retired', 'JPEGFullProgressionNonHierarchical1113'), # noqa 23 | '1.2.840.10008.1.2.4.57': ('JPEG Lossless, Non-Hierarchical (Process 14)', 'Transfer Syntax', '', '', 'JPEGLossless'), # noqa 24 | '1.2.840.10008.1.2.4.58': ('JPEG Lossless, Non-Hierarchical (Process 15)', 'Transfer Syntax', '', 'Retired', 'JPEGLosslessNonHierarchical15'), # noqa 25 | '1.2.840.10008.1.2.4.59': ('JPEG Extended, Hierarchical (Process 16 and 18)', 'Transfer Syntax', '', 'Retired', 'JPEGExtendedHierarchical1618'), # noqa 26 | '1.2.840.10008.1.2.4.60': ('JPEG Extended, Hierarchical (Process 17 and 19)', 'Transfer Syntax', '', 'Retired', 'JPEGExtendedHierarchical1719'), # noqa 27 | '1.2.840.10008.1.2.4.61': ('JPEG Spectral Selection, Hierarchical (Process 20 and 22)', 'Transfer Syntax', '', 'Retired', 'JPEGSpectralSelectionHierarchical2022'), # noqa 28 | '1.2.840.10008.1.2.4.62': ('JPEG Spectral Selection, Hierarchical (Process 21 and 23)', 'Transfer Syntax', '', 'Retired', 'JPEGSpectralSelectionHierarchical2123'), # noqa 29 | '1.2.840.10008.1.2.4.63': ('JPEG Full Progression, Hierarchical (Process 24 and 26)', 'Transfer Syntax', '', 'Retired', 'JPEGFullProgressionHierarchical2426'), # noqa 30 | '1.2.840.10008.1.2.4.64': ('JPEG Full Progression, Hierarchical (Process 25 and 27)', 'Transfer Syntax', '', 'Retired', 'JPEGFullProgressionHierarchical2527'), # noqa 31 | '1.2.840.10008.1.2.4.65': ('JPEG Lossless, Hierarchical (Process 28)', 'Transfer Syntax', '', 'Retired', 'JPEGLosslessHierarchical28'), # noqa 32 | '1.2.840.10008.1.2.4.66': ('JPEG Lossless, Hierarchical (Process 29)', 'Transfer Syntax', '', 'Retired', 'JPEGLosslessHierarchical29'), # noqa 33 | '1.2.840.10008.1.2.4.70': ('JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14 [Selection Value 1])', 'Transfer Syntax', 'Default Transfer Syntax for Lossless JPEG Image Compression', '', 'JPEGLosslessSV1'), # noqa 34 | '1.2.840.10008.1.2.4.80': ('JPEG-LS Lossless Image Compression', 'Transfer Syntax', '', '', 'JPEGLSLossless'), # noqa 35 | '1.2.840.10008.1.2.4.81': ('JPEG-LS Lossy (Near-Lossless) Image Compression', 'Transfer Syntax', '', '', 'JPEGLSNearLossless'), # noqa 36 | '1.2.840.10008.1.2.4.90': ('JPEG 2000 Image Compression (Lossless Only)', 'Transfer Syntax', '', '', 'JPEG2000Lossless'), # noqa 37 | '1.2.840.10008.1.2.4.91': ('JPEG 2000 Image Compression', 'Transfer Syntax', '', '', 'JPEG2000'), # noqa 38 | '1.2.840.10008.1.2.4.92': ('JPEG 2000 Part 2 Multi-component Image Compression (Lossless Only)', 'Transfer Syntax', '', '', 'JPEG2000MCLossless'), # noqa 39 | '1.2.840.10008.1.2.4.93': ('JPEG 2000 Part 2 Multi-component Image Compression', 'Transfer Syntax', '', '', 'JPEG2000MC'), # noqa 40 | '1.2.840.10008.1.2.4.94': ('JPIP Referenced', 'Transfer Syntax', '', '', 'JPIPReferenced'), # noqa 41 | '1.2.840.10008.1.2.4.95': ('JPIP Referenced Deflate', 'Transfer Syntax', '', '', 'JPIPReferencedDeflate'), # noqa 42 | '1.2.840.10008.1.2.4.100': ('MPEG2 Main Profile / Main Level', 'Transfer Syntax', '', '', 'MPEG2MPML'), # noqa 43 | '1.2.840.10008.1.2.4.101': ('MPEG2 Main Profile / High Level', 'Transfer Syntax', '', '', 'MPEG2MPHL'), # noqa 44 | '1.2.840.10008.1.2.4.102': ('MPEG-4 AVC/H.264 High Profile / Level 4.1', 'Transfer Syntax', '', '', 'MPEG4HP41'), # noqa 45 | '1.2.840.10008.1.2.4.103': ('MPEG-4 AVC/H.264 BD-compatible High Profile / Level 4.1', 'Transfer Syntax', '', '', 'MPEG4HP41BD'), # noqa 46 | '1.2.840.10008.1.2.4.104': ('MPEG-4 AVC/H.264 High Profile / Level 4.2 For 2D Video', 'Transfer Syntax', '', '', 'MPEG4HP422D'), # noqa 47 | '1.2.840.10008.1.2.4.105': ('MPEG-4 AVC/H.264 High Profile / Level 4.2 For 3D Video', 'Transfer Syntax', '', '', 'MPEG4HP423D'), # noqa 48 | '1.2.840.10008.1.2.4.106': ('MPEG-4 AVC/H.264 Stereo High Profile / Level 4.2', 'Transfer Syntax', '', '', 'MPEG4HP42STEREO'), # noqa 49 | '1.2.840.10008.1.2.4.107': ('HEVC/H.265 Main Profile / Level 5.1', 'Transfer Syntax', '', '', 'HEVCMP51'), # noqa 50 | '1.2.840.10008.1.2.4.108': ('HEVC/H.265 Main 10 Profile / Level 5.1', 'Transfer Syntax', '', '', 'HEVCM10P51'), # noqa 51 | '1.2.840.10008.1.2.5': ('RLE Lossless', 'Transfer Syntax', '', '', 'RLELossless'), # noqa 52 | '1.2.840.10008.1.2.6.1': ('RFC 2557 MIME encapsulation', 'Transfer Syntax', '', 'Retired', 'RFC2557MIMEEncapsulation'), # noqa 53 | '1.2.840.10008.1.2.6.2': ('XML Encoding', 'Transfer Syntax', '', 'Retired', 'XMLEncoding'), # noqa 54 | '1.2.840.10008.1.2.7.1': ('SMPTE ST 2110-20 Uncompressed Progressive Active Video', 'Transfer Syntax', '', '', 'SMPTEST211020UncompressedProgressiveActiveVideo'), # noqa 55 | '1.2.840.10008.1.2.7.2': ('SMPTE ST 2110-20 Uncompressed Interlaced Active Video', 'Transfer Syntax', '', '', 'SMPTEST211020UncompressedInterlacedActiveVideo'), # noqa 56 | '1.2.840.10008.1.2.7.3': ('SMPTE ST 2110-30 PCM Digital Audio', 'Transfer Syntax', '', '', 'SMPTEST211030PCMDigitalAudio'), # noqa 57 | '1.2.840.10008.1.3.10': ('Media Storage Directory Storage', 'SOP Class', '', '', 'MediaStorageDirectoryStorage'), # noqa 58 | '1.2.840.10008.1.4.1.1': ('Talairach Brain Atlas Frame of Reference', 'Well-known frame of reference', '', '', 'TalairachBrainAtlas'), # noqa 59 | '1.2.840.10008.1.4.1.2': ('SPM2 T1 Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2T1'), # noqa 60 | '1.2.840.10008.1.4.1.3': ('SPM2 T2 Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2T2'), # noqa 61 | '1.2.840.10008.1.4.1.4': ('SPM2 PD Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2PD'), # noqa 62 | '1.2.840.10008.1.4.1.5': ('SPM2 EPI Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2EPI'), # noqa 63 | '1.2.840.10008.1.4.1.6': ('SPM2 FIL T1 Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2FILT1'), # noqa 64 | '1.2.840.10008.1.4.1.7': ('SPM2 PET Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2PET'), # noqa 65 | '1.2.840.10008.1.4.1.8': ('SPM2 TRANSM Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2TRANSM'), # noqa 66 | '1.2.840.10008.1.4.1.9': ('SPM2 SPECT Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2SPECT'), # noqa 67 | '1.2.840.10008.1.4.1.10': ('SPM2 GRAY Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2GRAY'), # noqa 68 | '1.2.840.10008.1.4.1.11': ('SPM2 WHITE Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2WHITE'), # noqa 69 | '1.2.840.10008.1.4.1.12': ('SPM2 CSF Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2CSF'), # noqa 70 | '1.2.840.10008.1.4.1.13': ('SPM2 BRAINMASK Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2BRAINMASK'), # noqa 71 | '1.2.840.10008.1.4.1.14': ('SPM2 AVG305T1 Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2AVG305T1'), # noqa 72 | '1.2.840.10008.1.4.1.15': ('SPM2 AVG152T1 Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2AVG152T1'), # noqa 73 | '1.2.840.10008.1.4.1.16': ('SPM2 AVG152T2 Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2AVG152T2'), # noqa 74 | '1.2.840.10008.1.4.1.17': ('SPM2 AVG152PD Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2AVG152PD'), # noqa 75 | '1.2.840.10008.1.4.1.18': ('SPM2 SINGLESUBJT1 Frame of Reference', 'Well-known frame of reference', '', '', 'SPM2SINGLESUBJT1'), # noqa 76 | '1.2.840.10008.1.4.2.1': ('ICBM 452 T1 Frame of Reference', 'Well-known frame of reference', '', '', 'ICBM452T1'), # noqa 77 | '1.2.840.10008.1.4.2.2': ('ICBM Single Subject MRI Frame of Reference', 'Well-known frame of reference', '', '', 'ICBMSingleSubjectMRI'), # noqa 78 | '1.2.840.10008.1.4.3.1': ('IEC 61217 Fixed Coordinate System Frame of Reference', 'Well-known frame of reference', '', '', 'IEC61217FixedCoordinateSystem'), # noqa 79 | '1.2.840.10008.1.4.3.2': ('Standard Robotic-Arm Coordinate System Frame of Reference', 'Well-known frame of reference', '', '', 'StandardRoboticArmCoordinateSystem'), # noqa 80 | '1.2.840.10008.1.4.4.1': ('SRI24 Frame of Reference', 'Well-known frame of reference', '', '', 'SRI24'), # noqa 81 | '1.2.840.10008.1.4.5.1': ('Colin27 Frame of Reference', 'Well-known frame of reference', '', '', 'Colin27'), # noqa 82 | '1.2.840.10008.1.4.6.1': ('LPBA40/AIR Frame of Reference', 'Well-known frame of reference', '', '', 'LPBA40AIR'), # noqa 83 | '1.2.840.10008.1.4.6.2': ('LPBA40/FLIRT Frame of Reference', 'Well-known frame of reference', '', '', 'LPBA40FLIRT'), # noqa 84 | '1.2.840.10008.1.4.6.3': ('LPBA40/SPM5 Frame of Reference', 'Well-known frame of reference', '', '', 'LPBA40SPM5'), # noqa 85 | '1.2.840.10008.1.5.1': ('Hot Iron Color Palette SOP Instance', 'Well-known SOP Instance', '', '', 'HotIronPalette'), # noqa 86 | '1.2.840.10008.1.5.2': ('PET Color Palette SOP Instance', 'Well-known SOP Instance', '', '', 'PETPalette'), # noqa 87 | '1.2.840.10008.1.5.3': ('Hot Metal Blue Color Palette SOP Instance', 'Well-known SOP Instance', '', '', 'HotMetalBluePalette'), # noqa 88 | '1.2.840.10008.1.5.4': ('PET 20 Step Color Palette SOP Instance', 'Well-known SOP Instance', '', '', 'PET20StepPalette'), # noqa 89 | '1.2.840.10008.1.5.5': ('Spring Color Palette SOP Instance', 'Well-known SOP Instance', '', '', 'SpringPalette'), # noqa 90 | '1.2.840.10008.1.5.6': ('Summer Color Palette SOP Instance', 'Well-known SOP Instance', '', '', 'SummerPalette'), # noqa 91 | '1.2.840.10008.1.5.7': ('Fall Color Palette SOP Instance', 'Well-known SOP Instance', '', '', 'FallPalette'), # noqa 92 | '1.2.840.10008.1.5.8': ('Winter Color Palette SOP Instance', 'Well-known SOP Instance', '', '', 'WinterPalette'), # noqa 93 | '1.2.840.10008.1.9': ('Basic Study Content Notification SOP Class', 'SOP Class', '', 'Retired', 'BasicStudyContentNotification'), # noqa 94 | '1.2.840.10008.1.20': ('Papyrus 3 Implicit VR Little Endian', 'Transfer Syntax', '(2015c)', 'Retired', 'Papyrus3ImplicitVRLittleEndian'), # noqa 95 | '1.2.840.10008.1.20.1': ('Storage Commitment Push Model SOP Class', 'SOP Class', '', '', 'StorageCommitmentPushModel'), # noqa 96 | '1.2.840.10008.1.20.1.1': ('Storage Commitment Push Model SOP Instance', 'Well-known SOP Instance', '', '', 'StorageCommitmentPushModelInstance'), # noqa 97 | '1.2.840.10008.1.20.2': ('Storage Commitment Pull Model SOP Class', 'SOP Class', '', 'Retired', 'StorageCommitmentPullModel'), # noqa 98 | '1.2.840.10008.1.20.2.1': ('Storage Commitment Pull Model SOP Instance', 'Well-known SOP Instance', '', 'Retired', 'StorageCommitmentPullModelInstance'), # noqa 99 | '1.2.840.10008.1.40': ('Procedural Event Logging SOP Class', 'SOP Class', '', '', 'ProceduralEventLogging'), # noqa 100 | '1.2.840.10008.1.40.1': ('Procedural Event Logging SOP Instance', 'Well-known SOP Instance', '', '', 'ProceduralEventLoggingInstance'), # noqa 101 | '1.2.840.10008.1.42': ('Substance Administration Logging SOP Class', 'SOP Class', '', '', 'SubstanceAdministrationLogging'), # noqa 102 | '1.2.840.10008.1.42.1': ('Substance Administration Logging SOP Instance', 'Well-known SOP Instance', '', '', 'SubstanceAdministrationLoggingInstance'), # noqa 103 | '1.2.840.10008.2.6.1': ('DICOM UID Registry', 'DICOM UIDs as a Coding Scheme', '', '', 'DCMUID'), # noqa 104 | '1.2.840.10008.2.16.4': ('DICOM Controlled Terminology', 'Coding Scheme', '', '', 'DCM'), # noqa 105 | '1.2.840.10008.2.16.5': ('Adult Mouse Anatomy Ontology', 'Coding Scheme', '', '', 'MA'), # noqa 106 | '1.2.840.10008.2.16.6': ('Uberon Ontology', 'Coding Scheme', '', '', 'UBERON'), # noqa 107 | '1.2.840.10008.2.16.7': ('Integrated Taxonomic Information System (ITIS) Taxonomic Serial Number (TSN)', 'Coding Scheme', '', '', 'ITIS_TSN'), # noqa 108 | '1.2.840.10008.2.16.8': ('Mouse Genome Initiative (MGI)', 'Coding Scheme', '', '', 'MGI'), # noqa 109 | '1.2.840.10008.2.16.9': ('PubChem Compound CID', 'Coding Scheme', '', '', 'PUBCHEM_CID'), # noqa 110 | '1.2.840.10008.2.16.10': ('Dublin Core', 'Coding Scheme', '', '', 'DC'), # noqa 111 | '1.2.840.10008.2.16.11': ('New York University Melanoma Clinical Cooperative Group', 'Coding Scheme', '', '', 'NYUMCCG'), # noqa 112 | '1.2.840.10008.2.16.12': ('Mayo Clinic Non-radiological Images Specific Body Structure Anatomical Surface Region Guide', 'Coding Scheme', '', '', 'MAYONRISBSASRG'), # noqa 113 | '1.2.840.10008.2.16.13': ('Image Biomarker Standardisation Initiative', 'Coding Scheme', '', '', 'IBSI'), # noqa 114 | '1.2.840.10008.2.16.14': ('Radiomics Ontology', 'Coding Scheme', '', '', 'RO'), # noqa 115 | '1.2.840.10008.2.16.15': ('RadElement', 'Coding Scheme', '', '', 'RADELEMENT'), # noqa 116 | '1.2.840.10008.2.16.16': ('ICD-11', 'Coding Scheme', '', '', 'I11'), # noqa 117 | '1.2.840.10008.3.1.1.1': ('DICOM Application Context Name', 'Application Context Name', '', '', 'DICOMApplicationContext'), # noqa 118 | '1.2.840.10008.3.1.2.1.1': ('Detached Patient Management SOP Class', 'SOP Class', '', 'Retired', 'DetachedPatientManagement'), # noqa 119 | '1.2.840.10008.3.1.2.1.4': ('Detached Patient Management Meta SOP Class', 'Meta SOP Class', '', 'Retired', 'DetachedPatientManagementMeta'), # noqa 120 | '1.2.840.10008.3.1.2.2.1': ('Detached Visit Management SOP Class', 'SOP Class', '', 'Retired', 'DetachedVisitManagement'), # noqa 121 | '1.2.840.10008.3.1.2.3.1': ('Detached Study Management SOP Class', 'SOP Class', '', 'Retired', 'DetachedStudyManagement'), # noqa 122 | '1.2.840.10008.3.1.2.3.2': ('Study Component Management SOP Class', 'SOP Class', '', 'Retired', 'StudyComponentManagement'), # noqa 123 | '1.2.840.10008.3.1.2.3.3': ('Modality Performed Procedure Step SOP Class', 'SOP Class', '', '', 'ModalityPerformedProcedureStep'), # noqa 124 | '1.2.840.10008.3.1.2.3.4': ('Modality Performed Procedure Step Retrieve SOP Class', 'SOP Class', '', '', 'ModalityPerformedProcedureStepRetrieve'), # noqa 125 | '1.2.840.10008.3.1.2.3.5': ('Modality Performed Procedure Step Notification SOP Class', 'SOP Class', '', '', 'ModalityPerformedProcedureStepNotification'), # noqa 126 | '1.2.840.10008.3.1.2.5.1': ('Detached Results Management SOP Class', 'SOP Class', '', 'Retired', 'DetachedResultsManagement'), # noqa 127 | '1.2.840.10008.3.1.2.5.4': ('Detached Results Management Meta SOP Class', 'Meta SOP Class', '', 'Retired', 'DetachedResultsManagementMeta'), # noqa 128 | '1.2.840.10008.3.1.2.5.5': ('Detached Study Management Meta SOP Class', 'Meta SOP Class', '', 'Retired', 'DetachedStudyManagementMeta'), # noqa 129 | '1.2.840.10008.3.1.2.6.1': ('Detached Interpretation Management SOP Class', 'SOP Class', '', 'Retired', 'DetachedInterpretationManagement'), # noqa 130 | '1.2.840.10008.4.2': ('Storage Service Class', 'Service Class', '', '', 'Storage'), # noqa 131 | '1.2.840.10008.5.1.1.1': ('Basic Film Session SOP Class', 'SOP Class', '', '', 'BasicFilmSession'), # noqa 132 | '1.2.840.10008.5.1.1.2': ('Basic Film Box SOP Class', 'SOP Class', '', '', 'BasicFilmBox'), # noqa 133 | '1.2.840.10008.5.1.1.4': ('Basic Grayscale Image Box SOP Class', 'SOP Class', '', '', 'BasicGrayscaleImageBox'), # noqa 134 | '1.2.840.10008.5.1.1.4.1': ('Basic Color Image Box SOP Class', 'SOP Class', '', '', 'BasicColorImageBox'), # noqa 135 | '1.2.840.10008.5.1.1.4.2': ('Referenced Image Box SOP Class', 'SOP Class', '', 'Retired', 'ReferencedImageBox'), # noqa 136 | '1.2.840.10008.5.1.1.9': ('Basic Grayscale Print Management Meta SOP Class', 'Meta SOP Class', '', '', 'BasicGrayscalePrintManagementMeta'), # noqa 137 | '1.2.840.10008.5.1.1.9.1': ('Referenced Grayscale Print Management Meta SOP Class', 'Meta SOP Class', '', 'Retired', 'ReferencedGrayscalePrintManagementMeta'), # noqa 138 | '1.2.840.10008.5.1.1.14': ('Print Job SOP Class', 'SOP Class', '', '', 'PrintJob'), # noqa 139 | '1.2.840.10008.5.1.1.15': ('Basic Annotation Box SOP Class', 'SOP Class', '', '', 'BasicAnnotationBox'), # noqa 140 | '1.2.840.10008.5.1.1.16': ('Printer SOP Class', 'SOP Class', '', '', 'Printer'), # noqa 141 | '1.2.840.10008.5.1.1.16.376': ('Printer Configuration Retrieval SOP Class', 'SOP Class', '', '', 'PrinterConfigurationRetrieval'), # noqa 142 | '1.2.840.10008.5.1.1.17': ('Printer SOP Instance', 'Well-known Printer SOP Instance', '', '', 'PrinterInstance'), # noqa 143 | '1.2.840.10008.5.1.1.17.376': ('Printer Configuration Retrieval SOP Instance', 'Well-known Printer SOP Instance', '', '', 'PrinterConfigurationRetrievalInstance'), # noqa 144 | '1.2.840.10008.5.1.1.18': ('Basic Color Print Management Meta SOP Class', 'Meta SOP Class', '', '', 'BasicColorPrintManagementMeta'), # noqa 145 | '1.2.840.10008.5.1.1.18.1': ('Referenced Color Print Management Meta SOP Class', 'Meta SOP Class', '', 'Retired', 'ReferencedColorPrintManagementMeta'), # noqa 146 | '1.2.840.10008.5.1.1.22': ('VOI LUT Box SOP Class', 'SOP Class', '', '', 'VOILUTBox'), # noqa 147 | '1.2.840.10008.5.1.1.23': ('Presentation LUT SOP Class', 'SOP Class', '', '', 'PresentationLUT'), # noqa 148 | '1.2.840.10008.5.1.1.24': ('Image Overlay Box SOP Class', 'SOP Class', '', 'Retired', 'ImageOverlayBox'), # noqa 149 | '1.2.840.10008.5.1.1.24.1': ('Basic Print Image Overlay Box SOP Class', 'SOP Class', '', 'Retired', 'BasicPrintImageOverlayBox'), # noqa 150 | '1.2.840.10008.5.1.1.25': ('Print Queue SOP Instance', 'Well-known Print Queue SOP Instance', '', 'Retired', 'PrintQueue'), # noqa 151 | '1.2.840.10008.5.1.1.26': ('Print Queue Management SOP Class', 'SOP Class', '', 'Retired', 'PrintQueueManagement'), # noqa 152 | '1.2.840.10008.5.1.1.27': ('Stored Print Storage SOP Class', 'SOP Class', '', 'Retired', 'StoredPrintStorage'), # noqa 153 | '1.2.840.10008.5.1.1.29': ('Hardcopy Grayscale Image Storage SOP Class', 'SOP Class', '', 'Retired', 'HardcopyGrayscaleImageStorage'), # noqa 154 | '1.2.840.10008.5.1.1.30': ('Hardcopy Color Image Storage SOP Class', 'SOP Class', '', 'Retired', 'HardcopyColorImageStorage'), # noqa 155 | '1.2.840.10008.5.1.1.31': ('Pull Print Request SOP Class', 'SOP Class', '', 'Retired', 'PullPrintRequest'), # noqa 156 | '1.2.840.10008.5.1.1.32': ('Pull Stored Print Management Meta SOP Class', 'Meta SOP Class', '', 'Retired', 'PullStoredPrintManagementMeta'), # noqa 157 | '1.2.840.10008.5.1.1.33': ('Media Creation Management SOP Class UID', 'SOP Class', '', '', 'MediaCreationManagement'), # noqa 158 | '1.2.840.10008.5.1.1.40': ('Display System SOP Class', 'SOP Class', '', '', 'DisplaySystem'), # noqa 159 | '1.2.840.10008.5.1.1.40.1': ('Display System SOP Instance', 'Well-known SOP Instance', '', '', 'DisplaySystemInstance'), # noqa 160 | '1.2.840.10008.5.1.4.1.1.1': ('Computed Radiography Image Storage', 'SOP Class', '', '', 'ComputedRadiographyImageStorage'), # noqa 161 | '1.2.840.10008.5.1.4.1.1.1.1': ('Digital X-Ray Image Storage - For Presentation', 'SOP Class', '', '', 'DigitalXRayImageStorageForPresentation'), # noqa 162 | '1.2.840.10008.5.1.4.1.1.1.1.1': ('Digital X-Ray Image Storage - For Processing', 'SOP Class', '', '', 'DigitalXRayImageStorageForProcessing'), # noqa 163 | '1.2.840.10008.5.1.4.1.1.1.2': ('Digital Mammography X-Ray Image Storage - For Presentation', 'SOP Class', '', '', 'DigitalMammographyXRayImageStorageForPresentation'), # noqa 164 | '1.2.840.10008.5.1.4.1.1.1.2.1': ('Digital Mammography X-Ray Image Storage - For Processing', 'SOP Class', '', '', 'DigitalMammographyXRayImageStorageForProcessing'), # noqa 165 | '1.2.840.10008.5.1.4.1.1.1.3': ('Digital Intra-Oral X-Ray Image Storage - For Presentation', 'SOP Class', '', '', 'DigitalIntraOralXRayImageStorageForPresentation'), # noqa 166 | '1.2.840.10008.5.1.4.1.1.1.3.1': ('Digital Intra-Oral X-Ray Image Storage - For Processing', 'SOP Class', '', '', 'DigitalIntraOralXRayImageStorageForProcessing'), # noqa 167 | '1.2.840.10008.5.1.4.1.1.2': ('CT Image Storage', 'SOP Class', '', '', 'CTImageStorage'), # noqa 168 | '1.2.840.10008.5.1.4.1.1.2.1': ('Enhanced CT Image Storage', 'SOP Class', '', '', 'EnhancedCTImageStorage'), # noqa 169 | '1.2.840.10008.5.1.4.1.1.2.2': ('Legacy Converted Enhanced CT Image Storage', 'SOP Class', '', '', 'LegacyConvertedEnhancedCTImageStorage'), # noqa 170 | '1.2.840.10008.5.1.4.1.1.3': ('Ultrasound Multi-frame Image Storage', 'SOP Class', '', 'Retired', 'UltrasoundMultiFrameImageStorageRetired'), # noqa 171 | '1.2.840.10008.5.1.4.1.1.3.1': ('Ultrasound Multi-frame Image Storage', 'SOP Class', '', '', 'UltrasoundMultiFrameImageStorage'), # noqa 172 | '1.2.840.10008.5.1.4.1.1.4': ('MR Image Storage', 'SOP Class', '', '', 'MRImageStorage'), # noqa 173 | '1.2.840.10008.5.1.4.1.1.4.1': ('Enhanced MR Image Storage', 'SOP Class', '', '', 'EnhancedMRImageStorage'), # noqa 174 | '1.2.840.10008.5.1.4.1.1.4.2': ('MR Spectroscopy Storage', 'SOP Class', '', '', 'MRSpectroscopyStorage'), # noqa 175 | '1.2.840.10008.5.1.4.1.1.4.3': ('Enhanced MR Color Image Storage', 'SOP Class', '', '', 'EnhancedMRColorImageStorage'), # noqa 176 | '1.2.840.10008.5.1.4.1.1.4.4': ('Legacy Converted Enhanced MR Image Storage', 'SOP Class', '', '', 'LegacyConvertedEnhancedMRImageStorage'), # noqa 177 | '1.2.840.10008.5.1.4.1.1.5': ('Nuclear Medicine Image Storage', 'SOP Class', '', 'Retired', 'NuclearMedicineImageStorageRetired'), # noqa 178 | '1.2.840.10008.5.1.4.1.1.6': ('Ultrasound Image Storage', 'SOP Class', '', 'Retired', 'UltrasoundImageStorageRetired'), # noqa 179 | '1.2.840.10008.5.1.4.1.1.6.1': ('Ultrasound Image Storage', 'SOP Class', '', '', 'UltrasoundImageStorage'), # noqa 180 | '1.2.840.10008.5.1.4.1.1.6.2': ('Enhanced US Volume Storage', 'SOP Class', '', '', 'EnhancedUSVolumeStorage'), # noqa 181 | '1.2.840.10008.5.1.4.1.1.7': ('Secondary Capture Image Storage', 'SOP Class', '', '', 'SecondaryCaptureImageStorage'), # noqa 182 | '1.2.840.10008.5.1.4.1.1.7.1': ('Multi-frame Single Bit Secondary Capture Image Storage', 'SOP Class', '', '', 'MultiFrameSingleBitSecondaryCaptureImageStorage'), # noqa 183 | '1.2.840.10008.5.1.4.1.1.7.2': ('Multi-frame Grayscale Byte Secondary Capture Image Storage', 'SOP Class', '', '', 'MultiFrameGrayscaleByteSecondaryCaptureImageStorage'), # noqa 184 | '1.2.840.10008.5.1.4.1.1.7.3': ('Multi-frame Grayscale Word Secondary Capture Image Storage', 'SOP Class', '', '', 'MultiFrameGrayscaleWordSecondaryCaptureImageStorage'), # noqa 185 | '1.2.840.10008.5.1.4.1.1.7.4': ('Multi-frame True Color Secondary Capture Image Storage', 'SOP Class', '', '', 'MultiFrameTrueColorSecondaryCaptureImageStorage'), # noqa 186 | '1.2.840.10008.5.1.4.1.1.8': ('Standalone Overlay Storage', 'SOP Class', '', 'Retired', 'StandaloneOverlayStorage'), # noqa 187 | '1.2.840.10008.5.1.4.1.1.9': ('Standalone Curve Storage', 'SOP Class', '', 'Retired', 'StandaloneCurveStorage'), # noqa 188 | '1.2.840.10008.5.1.4.1.1.9.1': ('Waveform Storage - Trial', 'SOP Class', '', 'Retired', 'WaveformStorageTrial'), # noqa 189 | '1.2.840.10008.5.1.4.1.1.9.1.1': ('12-lead ECG Waveform Storage', 'SOP Class', '', '', 'TwelveLeadECGWaveformStorage'), # noqa 190 | '1.2.840.10008.5.1.4.1.1.9.1.2': ('General ECG Waveform Storage', 'SOP Class', '', '', 'GeneralECGWaveformStorage'), # noqa 191 | '1.2.840.10008.5.1.4.1.1.9.1.3': ('Ambulatory ECG Waveform Storage', 'SOP Class', '', '', 'AmbulatoryECGWaveformStorage'), # noqa 192 | '1.2.840.10008.5.1.4.1.1.9.2.1': ('Hemodynamic Waveform Storage', 'SOP Class', '', '', 'HemodynamicWaveformStorage'), # noqa 193 | '1.2.840.10008.5.1.4.1.1.9.3.1': ('Cardiac Electrophysiology Waveform Storage', 'SOP Class', '', '', 'CardiacElectrophysiologyWaveformStorage'), # noqa 194 | '1.2.840.10008.5.1.4.1.1.9.4.1': ('Basic Voice Audio Waveform Storage', 'SOP Class', '', '', 'BasicVoiceAudioWaveformStorage'), # noqa 195 | '1.2.840.10008.5.1.4.1.1.9.4.2': ('General Audio Waveform Storage', 'SOP Class', '', '', 'GeneralAudioWaveformStorage'), # noqa 196 | '1.2.840.10008.5.1.4.1.1.9.5.1': ('Arterial Pulse Waveform Storage', 'SOP Class', '', '', 'ArterialPulseWaveformStorage'), # noqa 197 | '1.2.840.10008.5.1.4.1.1.9.6.1': ('Respiratory Waveform Storage', 'SOP Class', '', '', 'RespiratoryWaveformStorage'), # noqa 198 | '1.2.840.10008.5.1.4.1.1.9.6.2': ('Multi-channel Respiratory Waveform Storage', 'SOP Class', '', '', 'MultichannelRespiratoryWaveformStorage'), # noqa 199 | '1.2.840.10008.5.1.4.1.1.9.7.1': ('Routine Scalp Electroencephalogram Waveform Storage', 'SOP Class', '', '', 'RoutineScalpElectroencephalogramWaveformStorage'), # noqa 200 | '1.2.840.10008.5.1.4.1.1.9.7.2': ('Electromyogram Waveform Storage', 'SOP Class', '', '', 'ElectromyogramWaveformStorage'), # noqa 201 | '1.2.840.10008.5.1.4.1.1.9.7.3': ('Electrooculogram Waveform Storage', 'SOP Class', '', '', 'ElectrooculogramWaveformStorage'), # noqa 202 | '1.2.840.10008.5.1.4.1.1.9.7.4': ('Sleep Electroencephalogram Waveform Storage', 'SOP Class', '', '', 'SleepElectroencephalogramWaveformStorage'), # noqa 203 | '1.2.840.10008.5.1.4.1.1.9.8.1': ('Body Position Waveform Storage', 'SOP Class', '', '', 'BodyPositionWaveformStorage'), # noqa 204 | '1.2.840.10008.5.1.4.1.1.10': ('Standalone Modality LUT Storage', 'SOP Class', '', 'Retired', 'StandaloneModalityLUTStorage'), # noqa 205 | '1.2.840.10008.5.1.4.1.1.11': ('Standalone VOI LUT Storage', 'SOP Class', '', 'Retired', 'StandaloneVOILUTStorage'), # noqa 206 | '1.2.840.10008.5.1.4.1.1.11.1': ('Grayscale Softcopy Presentation State Storage', 'SOP Class', '', '', 'GrayscaleSoftcopyPresentationStateStorage'), # noqa 207 | '1.2.840.10008.5.1.4.1.1.11.2': ('Color Softcopy Presentation State Storage', 'SOP Class', '', '', 'ColorSoftcopyPresentationStateStorage'), # noqa 208 | '1.2.840.10008.5.1.4.1.1.11.3': ('Pseudo-Color Softcopy Presentation State Storage', 'SOP Class', '', '', 'PseudoColorSoftcopyPresentationStateStorage'), # noqa 209 | '1.2.840.10008.5.1.4.1.1.11.4': ('Blending Softcopy Presentation State Storage', 'SOP Class', '', '', 'BlendingSoftcopyPresentationStateStorage'), # noqa 210 | '1.2.840.10008.5.1.4.1.1.11.5': ('XA/XRF Grayscale Softcopy Presentation State Storage', 'SOP Class', '', '', 'XAXRFGrayscaleSoftcopyPresentationStateStorage'), # noqa 211 | '1.2.840.10008.5.1.4.1.1.11.6': ('Grayscale Planar MPR Volumetric Presentation State Storage', 'SOP Class', '', '', 'GrayscalePlanarMPRVolumetricPresentationStateStorage'), # noqa 212 | '1.2.840.10008.5.1.4.1.1.11.7': ('Compositing Planar MPR Volumetric Presentation State Storage', 'SOP Class', '', '', 'CompositingPlanarMPRVolumetricPresentationStateStorage'), # noqa 213 | '1.2.840.10008.5.1.4.1.1.11.8': ('Advanced Blending Presentation State Storage', 'SOP Class', '', '', 'AdvancedBlendingPresentationStateStorage'), # noqa 214 | '1.2.840.10008.5.1.4.1.1.11.9': ('Volume Rendering Volumetric Presentation State Storage', 'SOP Class', '', '', 'VolumeRenderingVolumetricPresentationStateStorage'), # noqa 215 | '1.2.840.10008.5.1.4.1.1.11.10': ('Segmented Volume Rendering Volumetric Presentation State Storage', 'SOP Class', '', '', 'SegmentedVolumeRenderingVolumetricPresentationStateStorage'), # noqa 216 | '1.2.840.10008.5.1.4.1.1.11.11': ('Multiple Volume Rendering Volumetric Presentation State Storage', 'SOP Class', '', '', 'MultipleVolumeRenderingVolumetricPresentationStateStorage'), # noqa 217 | '1.2.840.10008.5.1.4.1.1.12.1': ('X-Ray Angiographic Image Storage', 'SOP Class', '', '', 'XRayAngiographicImageStorage'), # noqa 218 | '1.2.840.10008.5.1.4.1.1.12.1.1': ('Enhanced XA Image Storage', 'SOP Class', '', '', 'EnhancedXAImageStorage'), # noqa 219 | '1.2.840.10008.5.1.4.1.1.12.2': ('X-Ray Radiofluoroscopic Image Storage', 'SOP Class', '', '', 'XRayRadiofluoroscopicImageStorage'), # noqa 220 | '1.2.840.10008.5.1.4.1.1.12.2.1': ('Enhanced XRF Image Storage', 'SOP Class', '', '', 'EnhancedXRFImageStorage'), # noqa 221 | '1.2.840.10008.5.1.4.1.1.12.3': ('X-Ray Angiographic Bi-Plane Image Storage', 'SOP Class', '', 'Retired', 'XRayAngiographicBiPlaneImageStorage'), # noqa 222 | '1.2.840.10008.5.1.4.1.1.12.77': ('', 'SOP Class', '(2015c)', 'Retired', ''), # noqa 223 | '1.2.840.10008.5.1.4.1.1.13.1.1': ('X-Ray 3D Angiographic Image Storage', 'SOP Class', '', '', 'XRay3DAngiographicImageStorage'), # noqa 224 | '1.2.840.10008.5.1.4.1.1.13.1.2': ('X-Ray 3D Craniofacial Image Storage', 'SOP Class', '', '', 'XRay3DCraniofacialImageStorage'), # noqa 225 | '1.2.840.10008.5.1.4.1.1.13.1.3': ('Breast Tomosynthesis Image Storage', 'SOP Class', '', '', 'BreastTomosynthesisImageStorage'), # noqa 226 | '1.2.840.10008.5.1.4.1.1.13.1.4': ('Breast Projection X-Ray Image Storage - For Presentation', 'SOP Class', '', '', 'BreastProjectionXRayImageStorageForPresentation'), # noqa 227 | '1.2.840.10008.5.1.4.1.1.13.1.5': ('Breast Projection X-Ray Image Storage - For Processing', 'SOP Class', '', '', 'BreastProjectionXRayImageStorageForProcessing'), # noqa 228 | '1.2.840.10008.5.1.4.1.1.14.1': ('Intravascular Optical Coherence Tomography Image Storage - For Presentation', 'SOP Class', '', '', 'IntravascularOpticalCoherenceTomographyImageStorageForPresentation'), # noqa 229 | '1.2.840.10008.5.1.4.1.1.14.2': ('Intravascular Optical Coherence Tomography Image Storage - For Processing', 'SOP Class', '', '', 'IntravascularOpticalCoherenceTomographyImageStorageForProcessing'), # noqa 230 | '1.2.840.10008.5.1.4.1.1.20': ('Nuclear Medicine Image Storage', 'SOP Class', '', '', 'NuclearMedicineImageStorage'), # noqa 231 | '1.2.840.10008.5.1.4.1.1.30': ('Parametric Map Storage', 'SOP Class', '', '', 'ParametricMapStorage'), # noqa 232 | '1.2.840.10008.5.1.4.1.1.40': ('', 'SOP Class', '(2015c)', 'Retired', ''), # noqa 233 | '1.2.840.10008.5.1.4.1.1.66': ('Raw Data Storage', 'SOP Class', '', '', 'RawDataStorage'), # noqa 234 | '1.2.840.10008.5.1.4.1.1.66.1': ('Spatial Registration Storage', 'SOP Class', '', '', 'SpatialRegistrationStorage'), # noqa 235 | '1.2.840.10008.5.1.4.1.1.66.2': ('Spatial Fiducials Storage', 'SOP Class', '', '', 'SpatialFiducialsStorage'), # noqa 236 | '1.2.840.10008.5.1.4.1.1.66.3': ('Deformable Spatial Registration Storage', 'SOP Class', '', '', 'DeformableSpatialRegistrationStorage'), # noqa 237 | '1.2.840.10008.5.1.4.1.1.66.4': ('Segmentation Storage', 'SOP Class', '', '', 'SegmentationStorage'), # noqa 238 | '1.2.840.10008.5.1.4.1.1.66.5': ('Surface Segmentation Storage', 'SOP Class', '', '', 'SurfaceSegmentationStorage'), # noqa 239 | '1.2.840.10008.5.1.4.1.1.66.6': ('Tractography Results Storage', 'SOP Class', '', '', 'TractographyResultsStorage'), # noqa 240 | '1.2.840.10008.5.1.4.1.1.67': ('Real World Value Mapping Storage', 'SOP Class', '', '', 'RealWorldValueMappingStorage'), # noqa 241 | '1.2.840.10008.5.1.4.1.1.68.1': ('Surface Scan Mesh Storage', 'SOP Class', '', '', 'SurfaceScanMeshStorage'), # noqa 242 | '1.2.840.10008.5.1.4.1.1.68.2': ('Surface Scan Point Cloud Storage', 'SOP Class', '', '', 'SurfaceScanPointCloudStorage'), # noqa 243 | '1.2.840.10008.5.1.4.1.1.77.1': ('VL Image Storage - Trial', 'SOP Class', '', 'Retired', 'VLImageStorageTrial'), # noqa 244 | '1.2.840.10008.5.1.4.1.1.77.2': ('VL Multi-frame Image Storage - Trial', 'SOP Class', '', 'Retired', 'VLMultiFrameImageStorageTrial'), # noqa 245 | '1.2.840.10008.5.1.4.1.1.77.1.1': ('VL Endoscopic Image Storage', 'SOP Class', '', '', 'VLEndoscopicImageStorage'), # noqa 246 | '1.2.840.10008.5.1.4.1.1.77.1.1.1': ('Video Endoscopic Image Storage', 'SOP Class', '', '', 'VideoEndoscopicImageStorage'), # noqa 247 | '1.2.840.10008.5.1.4.1.1.77.1.2': ('VL Microscopic Image Storage', 'SOP Class', '', '', 'VLMicroscopicImageStorage'), # noqa 248 | '1.2.840.10008.5.1.4.1.1.77.1.2.1': ('Video Microscopic Image Storage', 'SOP Class', '', '', 'VideoMicroscopicImageStorage'), # noqa 249 | '1.2.840.10008.5.1.4.1.1.77.1.3': ('VL Slide-Coordinates Microscopic Image Storage', 'SOP Class', '', '', 'VLSlideCoordinatesMicroscopicImageStorage'), # noqa 250 | '1.2.840.10008.5.1.4.1.1.77.1.4': ('VL Photographic Image Storage', 'SOP Class', '', '', 'VLPhotographicImageStorage'), # noqa 251 | '1.2.840.10008.5.1.4.1.1.77.1.4.1': ('Video Photographic Image Storage', 'SOP Class', '', '', 'VideoPhotographicImageStorage'), # noqa 252 | '1.2.840.10008.5.1.4.1.1.77.1.5.1': ('Ophthalmic Photography 8 Bit Image Storage', 'SOP Class', '', '', 'OphthalmicPhotography8BitImageStorage'), # noqa 253 | '1.2.840.10008.5.1.4.1.1.77.1.5.2': ('Ophthalmic Photography 16 Bit Image Storage', 'SOP Class', '', '', 'OphthalmicPhotography16BitImageStorage'), # noqa 254 | '1.2.840.10008.5.1.4.1.1.77.1.5.3': ('Stereometric Relationship Storage', 'SOP Class', '', '', 'StereometricRelationshipStorage'), # noqa 255 | '1.2.840.10008.5.1.4.1.1.77.1.5.4': ('Ophthalmic Tomography Image Storage', 'SOP Class', '', '', 'OphthalmicTomographyImageStorage'), # noqa 256 | '1.2.840.10008.5.1.4.1.1.77.1.5.5': ('Wide Field Ophthalmic Photography Stereographic Projection Image Storage', 'SOP Class', '', '', 'WideFieldOphthalmicPhotographyStereographicProjectionImageStorage'), # noqa 257 | '1.2.840.10008.5.1.4.1.1.77.1.5.6': ('Wide Field Ophthalmic Photography 3D Coordinates Image Storage', 'SOP Class', '', '', 'WideFieldOphthalmicPhotography3DCoordinatesImageStorage'), # noqa 258 | '1.2.840.10008.5.1.4.1.1.77.1.5.7': ('Ophthalmic Optical Coherence Tomography En Face Image Storage', 'SOP Class', '', '', 'OphthalmicOpticalCoherenceTomographyEnFaceImageStorage'), # noqa 259 | '1.2.840.10008.5.1.4.1.1.77.1.5.8': ('Ophthalmic Optical Coherence Tomography B-scan Volume Analysis Storage', 'SOP Class', '', '', 'OphthalmicOpticalCoherenceTomographyBscanVolumeAnalysisStorage'), # noqa 260 | '1.2.840.10008.5.1.4.1.1.77.1.6': ('VL Whole Slide Microscopy Image Storage', 'SOP Class', '', '', 'VLWholeSlideMicroscopyImageStorage'), # noqa 261 | '1.2.840.10008.5.1.4.1.1.78.1': ('Lensometry Measurements Storage', 'SOP Class', '', '', 'LensometryMeasurementsStorage'), # noqa 262 | '1.2.840.10008.5.1.4.1.1.78.2': ('Autorefraction Measurements Storage', 'SOP Class', '', '', 'AutorefractionMeasurementsStorage'), # noqa 263 | '1.2.840.10008.5.1.4.1.1.78.3': ('Keratometry Measurements Storage', 'SOP Class', '', '', 'KeratometryMeasurementsStorage'), # noqa 264 | '1.2.840.10008.5.1.4.1.1.78.4': ('Subjective Refraction Measurements Storage', 'SOP Class', '', '', 'SubjectiveRefractionMeasurementsStorage'), # noqa 265 | '1.2.840.10008.5.1.4.1.1.78.5': ('Visual Acuity Measurements Storage', 'SOP Class', '', '', 'VisualAcuityMeasurementsStorage'), # noqa 266 | '1.2.840.10008.5.1.4.1.1.78.6': ('Spectacle Prescription Report Storage', 'SOP Class', '', '', 'SpectaclePrescriptionReportStorage'), # noqa 267 | '1.2.840.10008.5.1.4.1.1.78.7': ('Ophthalmic Axial Measurements Storage', 'SOP Class', '', '', 'OphthalmicAxialMeasurementsStorage'), # noqa 268 | '1.2.840.10008.5.1.4.1.1.78.8': ('Intraocular Lens Calculations Storage', 'SOP Class', '', '', 'IntraocularLensCalculationsStorage'), # noqa 269 | '1.2.840.10008.5.1.4.1.1.79.1': ('Macular Grid Thickness and Volume Report Storage', 'SOP Class', '', '', 'MacularGridThicknessAndVolumeReportStorage'), # noqa 270 | '1.2.840.10008.5.1.4.1.1.80.1': ('Ophthalmic Visual Field Static Perimetry Measurements Storage', 'SOP Class', '', '', 'OphthalmicVisualFieldStaticPerimetryMeasurementsStorage'), # noqa 271 | '1.2.840.10008.5.1.4.1.1.81.1': ('Ophthalmic Thickness Map Storage', 'SOP Class', '', '', 'OphthalmicThicknessMapStorage'), # noqa 272 | '1.2.840.10008.5.1.4.1.1.82.1': ('Corneal Topography Map Storage', 'SOP Class', '', '', 'CornealTopographyMapStorage'), # noqa 273 | '1.2.840.10008.5.1.4.1.1.88.1': ('Text SR Storage - Trial', 'SOP Class', '', 'Retired', 'TextSRStorageTrial'), # noqa 274 | '1.2.840.10008.5.1.4.1.1.88.2': ('Audio SR Storage - Trial', 'SOP Class', '', 'Retired', 'AudioSRStorageTrial'), # noqa 275 | '1.2.840.10008.5.1.4.1.1.88.3': ('Detail SR Storage - Trial', 'SOP Class', '', 'Retired', 'DetailSRStorageTrial'), # noqa 276 | '1.2.840.10008.5.1.4.1.1.88.4': ('Comprehensive SR Storage - Trial', 'SOP Class', '', 'Retired', 'ComprehensiveSRStorageTrial'), # noqa 277 | '1.2.840.10008.5.1.4.1.1.88.11': ('Basic Text SR Storage', 'SOP Class', '', '', 'BasicTextSRStorage'), # noqa 278 | '1.2.840.10008.5.1.4.1.1.88.22': ('Enhanced SR Storage', 'SOP Class', '', '', 'EnhancedSRStorage'), # noqa 279 | '1.2.840.10008.5.1.4.1.1.88.33': ('Comprehensive SR Storage', 'SOP Class', '', '', 'ComprehensiveSRStorage'), # noqa 280 | '1.2.840.10008.5.1.4.1.1.88.34': ('Comprehensive 3D SR Storage', 'SOP Class', '', '', 'Comprehensive3DSRStorage'), # noqa 281 | '1.2.840.10008.5.1.4.1.1.88.35': ('Extensible SR Storage', 'SOP Class', '', '', 'ExtensibleSRStorage'), # noqa 282 | '1.2.840.10008.5.1.4.1.1.88.40': ('Procedure Log Storage', 'SOP Class', '', '', 'ProcedureLogStorage'), # noqa 283 | '1.2.840.10008.5.1.4.1.1.88.50': ('Mammography CAD SR Storage', 'SOP Class', '', '', 'MammographyCADSRStorage'), # noqa 284 | '1.2.840.10008.5.1.4.1.1.88.59': ('Key Object Selection Document Storage', 'SOP Class', '', '', 'KeyObjectSelectionDocumentStorage'), # noqa 285 | '1.2.840.10008.5.1.4.1.1.88.65': ('Chest CAD SR Storage', 'SOP Class', '', '', 'ChestCADSRStorage'), # noqa 286 | '1.2.840.10008.5.1.4.1.1.88.67': ('X-Ray Radiation Dose SR Storage', 'SOP Class', '', '', 'XRayRadiationDoseSRStorage'), # noqa 287 | '1.2.840.10008.5.1.4.1.1.88.68': ('Radiopharmaceutical Radiation Dose SR Storage', 'SOP Class', '', '', 'RadiopharmaceuticalRadiationDoseSRStorage'), # noqa 288 | '1.2.840.10008.5.1.4.1.1.88.69': ('Colon CAD SR Storage', 'SOP Class', '', '', 'ColonCADSRStorage'), # noqa 289 | '1.2.840.10008.5.1.4.1.1.88.70': ('Implantation Plan SR Storage', 'SOP Class', '', '', 'ImplantationPlanSRStorage'), # noqa 290 | '1.2.840.10008.5.1.4.1.1.88.71': ('Acquisition Context SR Storage', 'SOP Class', '', '', 'AcquisitionContextSRStorage'), # noqa 291 | '1.2.840.10008.5.1.4.1.1.88.72': ('Simplified Adult Echo SR Storage', 'SOP Class', '', '', 'SimplifiedAdultEchoSRStorage'), # noqa 292 | '1.2.840.10008.5.1.4.1.1.88.73': ('Patient Radiation Dose SR Storage', 'SOP Class', '', '', 'PatientRadiationDoseSRStorage'), # noqa 293 | '1.2.840.10008.5.1.4.1.1.88.74': ('Planned Imaging Agent Administration SR Storage', 'SOP Class', '', '', 'PlannedImagingAgentAdministrationSRStorage'), # noqa 294 | '1.2.840.10008.5.1.4.1.1.88.75': ('Performed Imaging Agent Administration SR Storage', 'SOP Class', '', '', 'PerformedImagingAgentAdministrationSRStorage'), # noqa 295 | '1.2.840.10008.5.1.4.1.1.90.1': ('Content Assessment Results Storage', 'SOP Class', '', '', 'ContentAssessmentResultsStorage'), # noqa 296 | '1.2.840.10008.5.1.4.1.1.104.1': ('Encapsulated PDF Storage', 'SOP Class', '', '', 'EncapsulatedPDFStorage'), # noqa 297 | '1.2.840.10008.5.1.4.1.1.104.2': ('Encapsulated CDA Storage', 'SOP Class', '', '', 'EncapsulatedCDAStorage'), # noqa 298 | '1.2.840.10008.5.1.4.1.1.104.3': ('Encapsulated STL Storage', 'SOP Class', '', '', 'EncapsulatedSTLStorage'), # noqa 299 | '1.2.840.10008.5.1.4.1.1.104.4': ('Encapsulated OBJ Storage', 'SOP Class', '', '', 'EncapsulatedOBJStorage'), # noqa 300 | '1.2.840.10008.5.1.4.1.1.104.5': ('Encapsulated MTL Storage', 'SOP Class', '', '', 'EncapsulatedMTLStorage'), # noqa 301 | '1.2.840.10008.5.1.4.1.1.128': ('Positron Emission Tomography Image Storage', 'SOP Class', '', '', 'PositronEmissionTomographyImageStorage'), # noqa 302 | '1.2.840.10008.5.1.4.1.1.128.1': ('Legacy Converted Enhanced PET Image Storage', 'SOP Class', '', '', 'LegacyConvertedEnhancedPETImageStorage'), # noqa 303 | '1.2.840.10008.5.1.4.1.1.129': ('Standalone PET Curve Storage', 'SOP Class', '', 'Retired', 'StandalonePETCurveStorage'), # noqa 304 | '1.2.840.10008.5.1.4.1.1.130': ('Enhanced PET Image Storage', 'SOP Class', '', '', 'EnhancedPETImageStorage'), # noqa 305 | '1.2.840.10008.5.1.4.1.1.131': ('Basic Structured Display Storage', 'SOP Class', '', '', 'BasicStructuredDisplayStorage'), # noqa 306 | '1.2.840.10008.5.1.4.1.1.200.1': ('CT Defined Procedure Protocol Storage', 'SOP Class', '', '', 'CTDefinedProcedureProtocolStorage'), # noqa 307 | '1.2.840.10008.5.1.4.1.1.200.2': ('CT Performed Procedure Protocol Storage', 'SOP Class', '', '', 'CTPerformedProcedureProtocolStorage'), # noqa 308 | '1.2.840.10008.5.1.4.1.1.200.3': ('Protocol Approval Storage', 'SOP Class', '', '', 'ProtocolApprovalStorage'), # noqa 309 | '1.2.840.10008.5.1.4.1.1.200.4': ('Protocol Approval Information Model - FIND', 'SOP Class', '', '', 'ProtocolApprovalInformationModelFind'), # noqa 310 | '1.2.840.10008.5.1.4.1.1.200.5': ('Protocol Approval Information Model - MOVE', 'SOP Class', '', '', 'ProtocolApprovalInformationModelMove'), # noqa 311 | '1.2.840.10008.5.1.4.1.1.200.6': ('Protocol Approval Information Model - GET', 'SOP Class', '', '', 'ProtocolApprovalInformationModelGet'), # noqa 312 | '1.2.840.10008.5.1.4.1.1.481.1': ('RT Image Storage', 'SOP Class', '', '', 'RTImageStorage'), # noqa 313 | '1.2.840.10008.5.1.4.1.1.481.2': ('RT Dose Storage', 'SOP Class', '', '', 'RTDoseStorage'), # noqa 314 | '1.2.840.10008.5.1.4.1.1.481.3': ('RT Structure Set Storage', 'SOP Class', '', '', 'RTStructureSetStorage'), # noqa 315 | '1.2.840.10008.5.1.4.1.1.481.4': ('RT Beams Treatment Record Storage', 'SOP Class', '', '', 'RTBeamsTreatmentRecordStorage'), # noqa 316 | '1.2.840.10008.5.1.4.1.1.481.5': ('RT Plan Storage', 'SOP Class', '', '', 'RTPlanStorage'), # noqa 317 | '1.2.840.10008.5.1.4.1.1.481.6': ('RT Brachy Treatment Record Storage', 'SOP Class', '', '', 'RTBrachyTreatmentRecordStorage'), # noqa 318 | '1.2.840.10008.5.1.4.1.1.481.7': ('RT Treatment Summary Record Storage', 'SOP Class', '', '', 'RTTreatmentSummaryRecordStorage'), # noqa 319 | '1.2.840.10008.5.1.4.1.1.481.8': ('RT Ion Plan Storage', 'SOP Class', '', '', 'RTIonPlanStorage'), # noqa 320 | '1.2.840.10008.5.1.4.1.1.481.9': ('RT Ion Beams Treatment Record Storage', 'SOP Class', '', '', 'RTIonBeamsTreatmentRecordStorage'), # noqa 321 | '1.2.840.10008.5.1.4.1.1.481.10': ('RT Physician Intent Storage', 'SOP Class', '', '', 'RTPhysicianIntentStorage'), # noqa 322 | '1.2.840.10008.5.1.4.1.1.481.11': ('RT Segment Annotation Storage', 'SOP Class', '', '', 'RTSegmentAnnotationStorage'), # noqa 323 | '1.2.840.10008.5.1.4.1.1.481.12': ('RT Radiation Set Storage', 'SOP Class', '', '', 'RTRadiationSetStorage'), # noqa 324 | '1.2.840.10008.5.1.4.1.1.481.13': ('C-Arm Photon-Electron Radiation Storage', 'SOP Class', '', '', 'CArmPhotonElectronRadiationStorage'), # noqa 325 | '1.2.840.10008.5.1.4.1.1.481.14': ('Tomotherapeutic Radiation Storage', 'SOP Class', '', '', 'TomotherapeuticRadiationStorage'), # noqa 326 | '1.2.840.10008.5.1.4.1.1.481.15': ('Robotic-Arm Radiation Storage', 'SOP Class', '', '', 'RoboticArmRadiationStorage'), # noqa 327 | '1.2.840.10008.5.1.4.1.1.481.16': ('RT Radiation Record Set Storage', 'SOP Class', '', '', 'RTRadiationRecordSetStorage'), # noqa 328 | '1.2.840.10008.5.1.4.1.1.481.17': ('RT Radiation Salvage Record Storage', 'SOP Class', '', '', 'RTRadiationSalvageRecordStorage'), # noqa 329 | '1.2.840.10008.5.1.4.1.1.481.18': ('Tomotherapeutic Radiation Record Storage', 'SOP Class', '', '', 'TomotherapeuticRadiationRecordStorage'), # noqa 330 | '1.2.840.10008.5.1.4.1.1.481.19': ('C-Arm Photon-Electron Radiation Record Storage', 'SOP Class', '', '', 'CArmPhotonElectronRadiationRecordStorage'), # noqa 331 | '1.2.840.10008.5.1.4.1.1.481.20': ('Robotic Radiation Record Storage', 'SOP Class', '', '', 'RoboticRadiationRecordStorage'), # noqa 332 | '1.2.840.10008.5.1.4.1.1.501.1': ('DICOS CT Image Storage', 'SOP Class', 'DICOS', '', 'DICOSCTImageStorage'), # noqa 333 | '1.2.840.10008.5.1.4.1.1.501.2.1': ('DICOS Digital X-Ray Image Storage - For Presentation', 'SOP Class', 'DICOS', '', 'DICOSDigitalXRayImageStorageForPresentation'), # noqa 334 | '1.2.840.10008.5.1.4.1.1.501.2.2': ('DICOS Digital X-Ray Image Storage - For Processing', 'SOP Class', 'DICOS', '', 'DICOSDigitalXRayImageStorageForProcessing'), # noqa 335 | '1.2.840.10008.5.1.4.1.1.501.3': ('DICOS Threat Detection Report Storage', 'SOP Class', 'DICOS', '', 'DICOSThreatDetectionReportStorage'), # noqa 336 | '1.2.840.10008.5.1.4.1.1.501.4': ('DICOS 2D AIT Storage', 'SOP Class', 'DICOS', '', 'DICOS2DAITStorage'), # noqa 337 | '1.2.840.10008.5.1.4.1.1.501.5': ('DICOS 3D AIT Storage', 'SOP Class', 'DICOS', '', 'DICOS3DAITStorage'), # noqa 338 | '1.2.840.10008.5.1.4.1.1.501.6': ('DICOS Quadrupole Resonance (QR) Storage', 'SOP Class', 'DICOS', '', 'DICOSQuadrupoleResonanceStorage'), # noqa 339 | '1.2.840.10008.5.1.4.1.1.601.1': ('Eddy Current Image Storage', 'SOP Class', 'DICONDE ASTM E2934', '', 'EddyCurrentImageStorage'), # noqa 340 | '1.2.840.10008.5.1.4.1.1.601.2': ('Eddy Current Multi-frame Image Storage', 'SOP Class', 'DICONDE ASTM E2934', '', 'EddyCurrentMultiFrameImageStorage'), # noqa 341 | '1.2.840.10008.5.1.4.1.2.1.1': ('Patient Root Query/Retrieve Information Model - FIND', 'SOP Class', '', '', 'PatientRootQueryRetrieveInformationModelFind'), # noqa 342 | '1.2.840.10008.5.1.4.1.2.1.2': ('Patient Root Query/Retrieve Information Model - MOVE', 'SOP Class', '', '', 'PatientRootQueryRetrieveInformationModelMove'), # noqa 343 | '1.2.840.10008.5.1.4.1.2.1.3': ('Patient Root Query/Retrieve Information Model - GET', 'SOP Class', '', '', 'PatientRootQueryRetrieveInformationModelGet'), # noqa 344 | '1.2.840.10008.5.1.4.1.2.2.1': ('Study Root Query/Retrieve Information Model - FIND', 'SOP Class', '', '', 'StudyRootQueryRetrieveInformationModelFind'), # noqa 345 | '1.2.840.10008.5.1.4.1.2.2.2': ('Study Root Query/Retrieve Information Model - MOVE', 'SOP Class', '', '', 'StudyRootQueryRetrieveInformationModelMove'), # noqa 346 | '1.2.840.10008.5.1.4.1.2.2.3': ('Study Root Query/Retrieve Information Model - GET', 'SOP Class', '', '', 'StudyRootQueryRetrieveInformationModelGet'), # noqa 347 | '1.2.840.10008.5.1.4.1.2.3.1': ('Patient/Study Only Query/Retrieve Information Model - FIND', 'SOP Class', '', 'Retired', 'PatientStudyOnlyQueryRetrieveInformationModelFind'), # noqa 348 | '1.2.840.10008.5.1.4.1.2.3.2': ('Patient/Study Only Query/Retrieve Information Model - MOVE', 'SOP Class', '', 'Retired', 'PatientStudyOnlyQueryRetrieveInformationModelMove'), # noqa 349 | '1.2.840.10008.5.1.4.1.2.3.3': ('Patient/Study Only Query/Retrieve Information Model - GET', 'SOP Class', '', 'Retired', 'PatientStudyOnlyQueryRetrieveInformationModelGet'), # noqa 350 | '1.2.840.10008.5.1.4.1.2.4.2': ('Composite Instance Root Retrieve - MOVE', 'SOP Class', '', '', 'CompositeInstanceRootRetrieveMove'), # noqa 351 | '1.2.840.10008.5.1.4.1.2.4.3': ('Composite Instance Root Retrieve - GET', 'SOP Class', '', '', 'CompositeInstanceRootRetrieveGet'), # noqa 352 | '1.2.840.10008.5.1.4.1.2.5.3': ('Composite Instance Retrieve Without Bulk Data - GET', 'SOP Class', '', '', 'CompositeInstanceRetrieveWithoutBulkDataGet'), # noqa 353 | '1.2.840.10008.5.1.4.20.1': ('Defined Procedure Protocol Information Model - FIND', 'SOP Class', '', '', 'DefinedProcedureProtocolInformationModelFind'), # noqa 354 | '1.2.840.10008.5.1.4.20.2': ('Defined Procedure Protocol Information Model - MOVE', 'SOP Class', '', '', 'DefinedProcedureProtocolInformationModelMove'), # noqa 355 | '1.2.840.10008.5.1.4.20.3': ('Defined Procedure Protocol Information Model - GET', 'SOP Class', '', '', 'DefinedProcedureProtocolInformationModelGet'), # noqa 356 | '1.2.840.10008.5.1.4.31': ('Modality Worklist Information Model - FIND', 'SOP Class', '', '', 'ModalityWorklistInformationModelFind'), # noqa 357 | '1.2.840.10008.5.1.4.32': ('General Purpose Worklist Management Meta SOP Class', 'Meta SOP Class', '', 'Retired', 'GeneralPurposeWorklistManagementMeta'), # noqa 358 | '1.2.840.10008.5.1.4.32.1': ('General Purpose Worklist Information Model - FIND', 'SOP Class', '', 'Retired', 'GeneralPurposeWorklistInformationModelFIND'), # noqa 359 | '1.2.840.10008.5.1.4.32.2': ('General Purpose Scheduled Procedure Step SOP Class', 'SOP Class', '', 'Retired', 'GeneralPurposeScheduledProcedureStep'), # noqa 360 | '1.2.840.10008.5.1.4.32.3': ('General Purpose Performed Procedure Step SOP Class', 'SOP Class', '', 'Retired', 'GeneralPurposePerformedProcedureStep'), # noqa 361 | '1.2.840.10008.5.1.4.33': ('Instance Availability Notification SOP Class', 'SOP Class', '', '', 'InstanceAvailabilityNotification'), # noqa 362 | '1.2.840.10008.5.1.4.34.1': ('RT Beams Delivery Instruction Storage - Trial', 'SOP Class', '', 'Retired', 'RTBeamsDeliveryInstructionStorageTrial'), # noqa 363 | '1.2.840.10008.5.1.4.34.2': ('RT Conventional Machine Verification - Trial', 'SOP Class', '', 'Retired', 'RTConventionalMachineVerificationTrial'), # noqa 364 | '1.2.840.10008.5.1.4.34.3': ('RT Ion Machine Verification - Trial', 'SOP Class', '', 'Retired', 'RTIonMachineVerificationTrial'), # noqa 365 | '1.2.840.10008.5.1.4.34.4': ('Unified Worklist and Procedure Step Service Class - Trial', 'Service Class', '', 'Retired', 'UnifiedWorklistAndProcedureStepTrial'), # noqa 366 | '1.2.840.10008.5.1.4.34.4.1': ('Unified Procedure Step - Push SOP Class - Trial', 'SOP Class', '', 'Retired', 'UnifiedProcedureStepPushTrial'), # noqa 367 | '1.2.840.10008.5.1.4.34.4.2': ('Unified Procedure Step - Watch SOP Class - Trial', 'SOP Class', '', 'Retired', 'UnifiedProcedureStepWatchTrial'), # noqa 368 | '1.2.840.10008.5.1.4.34.4.3': ('Unified Procedure Step - Pull SOP Class - Trial', 'SOP Class', '', 'Retired', 'UnifiedProcedureStepPullTrial'), # noqa 369 | '1.2.840.10008.5.1.4.34.4.4': ('Unified Procedure Step - Event SOP Class - Trial', 'SOP Class', '', 'Retired', 'UnifiedProcedureStepEventTrial'), # noqa 370 | '1.2.840.10008.5.1.4.34.5': ('UPS Global Subscription SOP Instance', 'Well-known SOP Instance', '', '', 'UPSGlobalSubscriptionInstance'), # noqa 371 | '1.2.840.10008.5.1.4.34.5.1': ('UPS Filtered Global Subscription SOP Instance', 'Well-known SOP Instance', '', '', 'UPSFilteredGlobalSubscriptionInstance'), # noqa 372 | '1.2.840.10008.5.1.4.34.6': ('Unified Worklist and Procedure Step Service Class', 'Service Class', '', '', 'UnifiedWorklistAndProcedureStep'), # noqa 373 | '1.2.840.10008.5.1.4.34.6.1': ('Unified Procedure Step - Push SOP Class', 'SOP Class', '', '', 'UnifiedProcedureStepPush'), # noqa 374 | '1.2.840.10008.5.1.4.34.6.2': ('Unified Procedure Step - Watch SOP Class', 'SOP Class', '', '', 'UnifiedProcedureStepWatch'), # noqa 375 | '1.2.840.10008.5.1.4.34.6.3': ('Unified Procedure Step - Pull SOP Class', 'SOP Class', '', '', 'UnifiedProcedureStepPull'), # noqa 376 | '1.2.840.10008.5.1.4.34.6.4': ('Unified Procedure Step - Event SOP Class', 'SOP Class', '', '', 'UnifiedProcedureStepEvent'), # noqa 377 | '1.2.840.10008.5.1.4.34.6.5': ('Unified Procedure Step - Query SOP Class', 'SOP Class', '', '', 'UnifiedProcedureStepQuery'), # noqa 378 | '1.2.840.10008.5.1.4.34.7': ('RT Beams Delivery Instruction Storage', 'SOP Class', '', '', 'RTBeamsDeliveryInstructionStorage'), # noqa 379 | '1.2.840.10008.5.1.4.34.8': ('RT Conventional Machine Verification', 'SOP Class', '', '', 'RTConventionalMachineVerification'), # noqa 380 | '1.2.840.10008.5.1.4.34.9': ('RT Ion Machine Verification', 'SOP Class', '', '', 'RTIonMachineVerification'), # noqa 381 | '1.2.840.10008.5.1.4.34.10': ('RT Brachy Application Setup Delivery Instruction Storage', 'SOP Class', '', '', 'RTBrachyApplicationSetupDeliveryInstructionStorage'), # noqa 382 | '1.2.840.10008.5.1.4.37.1': ('General Relevant Patient Information Query', 'SOP Class', '', '', 'GeneralRelevantPatientInformationQuery'), # noqa 383 | '1.2.840.10008.5.1.4.37.2': ('Breast Imaging Relevant Patient Information Query', 'SOP Class', '', '', 'BreastImagingRelevantPatientInformationQuery'), # noqa 384 | '1.2.840.10008.5.1.4.37.3': ('Cardiac Relevant Patient Information Query', 'SOP Class', '', '', 'CardiacRelevantPatientInformationQuery'), # noqa 385 | '1.2.840.10008.5.1.4.38.1': ('Hanging Protocol Storage', 'SOP Class', '', '', 'HangingProtocolStorage'), # noqa 386 | '1.2.840.10008.5.1.4.38.2': ('Hanging Protocol Information Model - FIND', 'SOP Class', '', '', 'HangingProtocolInformationModelFind'), # noqa 387 | '1.2.840.10008.5.1.4.38.3': ('Hanging Protocol Information Model - MOVE', 'SOP Class', '', '', 'HangingProtocolInformationModelMove'), # noqa 388 | '1.2.840.10008.5.1.4.38.4': ('Hanging Protocol Information Model - GET', 'SOP Class', '', '', 'HangingProtocolInformationModelGet'), # noqa 389 | '1.2.840.10008.5.1.4.39.1': ('Color Palette Storage', 'SOP Class', '', '', 'ColorPaletteStorage'), # noqa 390 | '1.2.840.10008.5.1.4.39.2': ('Color Palette Query/Retrieve Information Model - FIND', 'SOP Class', '', '', 'ColorPaletteQueryRetrieveInformationModelFind'), # noqa 391 | '1.2.840.10008.5.1.4.39.3': ('Color Palette Query/Retrieve Information Model - MOVE', 'SOP Class', '', '', 'ColorPaletteQueryRetrieveInformationModelMove'), # noqa 392 | '1.2.840.10008.5.1.4.39.4': ('Color Palette Query/Retrieve Information Model - GET', 'SOP Class', '', '', 'ColorPaletteQueryRetrieveInformationModelGet'), # noqa 393 | '1.2.840.10008.5.1.4.41': ('Product Characteristics Query SOP Class', 'SOP Class', '', '', 'ProductCharacteristicsQuery'), # noqa 394 | '1.2.840.10008.5.1.4.42': ('Substance Approval Query SOP Class', 'SOP Class', '', '', 'SubstanceApprovalQuery'), # noqa 395 | '1.2.840.10008.5.1.4.43.1': ('Generic Implant Template Storage', 'SOP Class', '', '', 'GenericImplantTemplateStorage'), # noqa 396 | '1.2.840.10008.5.1.4.43.2': ('Generic Implant Template Information Model - FIND', 'SOP Class', '', '', 'GenericImplantTemplateInformationModelFind'), # noqa 397 | '1.2.840.10008.5.1.4.43.3': ('Generic Implant Template Information Model - MOVE', 'SOP Class', '', '', 'GenericImplantTemplateInformationModelMove'), # noqa 398 | '1.2.840.10008.5.1.4.43.4': ('Generic Implant Template Information Model - GET', 'SOP Class', '', '', 'GenericImplantTemplateInformationModelGet'), # noqa 399 | '1.2.840.10008.5.1.4.44.1': ('Implant Assembly Template Storage', 'SOP Class', '', '', 'ImplantAssemblyTemplateStorage'), # noqa 400 | '1.2.840.10008.5.1.4.44.2': ('Implant Assembly Template Information Model - FIND', 'SOP Class', '', '', 'ImplantAssemblyTemplateInformationModelFind'), # noqa 401 | '1.2.840.10008.5.1.4.44.3': ('Implant Assembly Template Information Model - MOVE', 'SOP Class', '', '', 'ImplantAssemblyTemplateInformationModelMove'), # noqa 402 | '1.2.840.10008.5.1.4.44.4': ('Implant Assembly Template Information Model - GET', 'SOP Class', '', '', 'ImplantAssemblyTemplateInformationModelGet'), # noqa 403 | '1.2.840.10008.5.1.4.45.1': ('Implant Template Group Storage', 'SOP Class', '', '', 'ImplantTemplateGroupStorage'), # noqa 404 | '1.2.840.10008.5.1.4.45.2': ('Implant Template Group Information Model - FIND', 'SOP Class', '', '', 'ImplantTemplateGroupInformationModelFind'), # noqa 405 | '1.2.840.10008.5.1.4.45.3': ('Implant Template Group Information Model - MOVE', 'SOP Class', '', '', 'ImplantTemplateGroupInformationModelMove'), # noqa 406 | '1.2.840.10008.5.1.4.45.4': ('Implant Template Group Information Model - GET', 'SOP Class', '', '', 'ImplantTemplateGroupInformationModelGet'), # noqa 407 | '1.2.840.10008.7.1.1': ('Native DICOM Model', 'Application Hosting Model', '', '', 'NativeDICOMModel'), # noqa 408 | '1.2.840.10008.7.1.2': ('Abstract Multi-Dimensional Image Model', 'Application Hosting Model', '', '', 'AbstractMultiDimensionalImageModel'), # noqa 409 | '1.2.840.10008.8.1.1': ('DICOM Content Mapping Resource', 'Mapping Resource', '', '', 'DICOMContentMappingResource'), # noqa 410 | '1.2.840.10008.10.1': ('Video Endoscopic Image Real-Time Communication', 'SOP Class', '', '', 'VideoEndoscopicImageRealTimeCommunication'), # noqa 411 | '1.2.840.10008.10.2': ('Video Photographic Image Real-Time Communication', 'SOP Class', '', '', 'VideoPhotographicImageRealTimeCommunication'), # noqa 412 | '1.2.840.10008.10.3': ('Audio Waveform Real-Time Communication', 'SOP Class', '', '', 'AudioWaveformRealTimeCommunication'), # noqa 413 | '1.2.840.10008.10.4': ('Rendition Selection Document Real-Time Communication', 'SOP Class', '', '', 'RenditionSelectionDocumentRealTimeCommunication'), # noqa 414 | '1.2.840.10008.15.0.3.1': ('dicomDeviceName', 'LDAP OID', '', '', 'dicomDeviceName'), # noqa 415 | '1.2.840.10008.15.0.3.2': ('dicomDescription', 'LDAP OID', '', '', 'dicomDescription'), # noqa 416 | '1.2.840.10008.15.0.3.3': ('dicomManufacturer', 'LDAP OID', '', '', 'dicomManufacturer'), # noqa 417 | '1.2.840.10008.15.0.3.4': ('dicomManufacturerModelName', 'LDAP OID', '', '', 'dicomManufacturerModelName'), # noqa 418 | '1.2.840.10008.15.0.3.5': ('dicomSoftwareVersion', 'LDAP OID', '', '', 'dicomSoftwareVersion'), # noqa 419 | '1.2.840.10008.15.0.3.6': ('dicomVendorData', 'LDAP OID', '', '', 'dicomVendorData'), # noqa 420 | '1.2.840.10008.15.0.3.7': ('dicomAETitle', 'LDAP OID', '', '', 'dicomAETitle'), # noqa 421 | '1.2.840.10008.15.0.3.8': ('dicomNetworkConnectionReference', 'LDAP OID', '', '', 'dicomNetworkConnectionReference'), # noqa 422 | '1.2.840.10008.15.0.3.9': ('dicomApplicationCluster', 'LDAP OID', '', '', 'dicomApplicationCluster'), # noqa 423 | '1.2.840.10008.15.0.3.10': ('dicomAssociationInitiator', 'LDAP OID', '', '', 'dicomAssociationInitiator'), # noqa 424 | '1.2.840.10008.15.0.3.11': ('dicomAssociationAcceptor', 'LDAP OID', '', '', 'dicomAssociationAcceptor'), # noqa 425 | '1.2.840.10008.15.0.3.12': ('dicomHostname', 'LDAP OID', '', '', 'dicomHostname'), # noqa 426 | '1.2.840.10008.15.0.3.13': ('dicomPort', 'LDAP OID', '', '', 'dicomPort'), # noqa 427 | '1.2.840.10008.15.0.3.14': ('dicomSOPClass', 'LDAP OID', '', '', 'dicomSOPClass'), # noqa 428 | '1.2.840.10008.15.0.3.15': ('dicomTransferRole', 'LDAP OID', '', '', 'dicomTransferRole'), # noqa 429 | '1.2.840.10008.15.0.3.16': ('dicomTransferSyntax', 'LDAP OID', '', '', 'dicomTransferSyntax'), # noqa 430 | '1.2.840.10008.15.0.3.17': ('dicomPrimaryDeviceType', 'LDAP OID', '', '', 'dicomPrimaryDeviceType'), # noqa 431 | '1.2.840.10008.15.0.3.18': ('dicomRelatedDeviceReference', 'LDAP OID', '', '', 'dicomRelatedDeviceReference'), # noqa 432 | '1.2.840.10008.15.0.3.19': ('dicomPreferredCalledAETitle', 'LDAP OID', '', '', 'dicomPreferredCalledAETitle'), # noqa 433 | '1.2.840.10008.15.0.3.20': ('dicomTLSCyphersuite', 'LDAP OID', '', '', 'dicomTLSCyphersuite'), # noqa 434 | '1.2.840.10008.15.0.3.21': ('dicomAuthorizedNodeCertificateReference', 'LDAP OID', '', '', 'dicomAuthorizedNodeCertificateReference'), # noqa 435 | '1.2.840.10008.15.0.3.22': ('dicomThisNodeCertificateReference', 'LDAP OID', '', '', 'dicomThisNodeCertificateReference'), # noqa 436 | '1.2.840.10008.15.0.3.23': ('dicomInstalled', 'LDAP OID', '', '', 'dicomInstalled'), # noqa 437 | '1.2.840.10008.15.0.3.24': ('dicomStationName', 'LDAP OID', '', '', 'dicomStationName'), # noqa 438 | '1.2.840.10008.15.0.3.25': ('dicomDeviceSerialNumber', 'LDAP OID', '', '', 'dicomDeviceSerialNumber'), # noqa 439 | '1.2.840.10008.15.0.3.26': ('dicomInstitutionName', 'LDAP OID', '', '', 'dicomInstitutionName'), # noqa 440 | '1.2.840.10008.15.0.3.27': ('dicomInstitutionAddress', 'LDAP OID', '', '', 'dicomInstitutionAddress'), # noqa 441 | '1.2.840.10008.15.0.3.28': ('dicomInstitutionDepartmentName', 'LDAP OID', '', '', 'dicomInstitutionDepartmentName'), # noqa 442 | '1.2.840.10008.15.0.3.29': ('dicomIssuerOfPatientID', 'LDAP OID', '', '', 'dicomIssuerOfPatientID'), # noqa 443 | '1.2.840.10008.15.0.3.30': ('dicomPreferredCallingAETitle', 'LDAP OID', '', '', 'dicomPreferredCallingAETitle'), # noqa 444 | '1.2.840.10008.15.0.3.31': ('dicomSupportedCharacterSet', 'LDAP OID', '', '', 'dicomSupportedCharacterSet'), # noqa 445 | '1.2.840.10008.15.0.4.1': ('dicomConfigurationRoot', 'LDAP OID', '', '', 'dicomConfigurationRoot'), # noqa 446 | '1.2.840.10008.15.0.4.2': ('dicomDevicesRoot', 'LDAP OID', '', '', 'dicomDevicesRoot'), # noqa 447 | '1.2.840.10008.15.0.4.3': ('dicomUniqueAETitlesRegistryRoot', 'LDAP OID', '', '', 'dicomUniqueAETitlesRegistryRoot'), # noqa 448 | '1.2.840.10008.15.0.4.4': ('dicomDevice', 'LDAP OID', '', '', 'dicomDevice'), # noqa 449 | '1.2.840.10008.15.0.4.5': ('dicomNetworkAE', 'LDAP OID', '', '', 'dicomNetworkAE'), # noqa 450 | '1.2.840.10008.15.0.4.6': ('dicomNetworkConnection', 'LDAP OID', '', '', 'dicomNetworkConnection'), # noqa 451 | '1.2.840.10008.15.0.4.7': ('dicomUniqueAETitle', 'LDAP OID', '', '', 'dicomUniqueAETitle'), # noqa 452 | '1.2.840.10008.15.0.4.8': ('dicomTransferCapability', 'LDAP OID', '', '', 'dicomTransferCapability'), # noqa 453 | '1.2.840.10008.15.1.1': ('Universal Coordinated Time', 'Synchronization Frame of Reference', '', '', 'UTC') # noqa 454 | } -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | setup(name='lightdicom', 4 | version='2', 5 | url='https://github.com/jryoungw/lightdicom', 6 | license='MIT', 7 | author='Ryoungwoo Jang', 8 | author_email='jryoungw2035@gmail.com', 9 | description='LightDICOM package', 10 | long_description=open('README.md').read(), 11 | zip_safe=False) 12 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jryoungw/lightdicom_python/d43002bee4721df82776b63e2c8dc0e9d2c761cf/test.py --------------------------------------------------------------------------------