Search code examples
pythontagsdicompydicom

Trying to edit private dicom tag


I'm currently trying to edit a private dicom tag which is causing problems with a radiotherapy treatment, using pydicom in python. Bit of a python newbie here so bear with me.

The dicom file imports correctly into python; I've attached some of the output in the first image from the commands

ds = dicomio.read_file("xy.dcm")
print(ds)

This returns the following data: pydicom output

The highlighted tag is the one I need to edit.

When trying something like

ds[0x10,0x10].value

This gives the correct output:

'SABR Spine'

However, trying something along the lines of

ds[3249,1000]

or

ds[3249,1000].value

returns the following output:

> Traceback (most recent call last):
  File "<pyshell#64>", line 1, in <module>
    ds[3249,1000].value
  File "C:\Users\...\dataset.py", line 317, in __getitem__
    data_elem = dict.__getitem__(self, tag)
KeyError: (0cb1, 03e8)

If I try accessing [3249,1010] via the same method, it returns a KeyError of (0cb1, 03f2).

I have tried adding the tag to the _dicom_dict.py file, as highlighted in the second image:

end of _dicom_dict.py

Have I done this right? I'm not even sure if I'm accessing the tags correctly - using

ds[300a,0070]

gives me 'SyntaxError: invalid syntax' as the output, for example, even though this is present in the file as fraction group sequence. I have also been made aware that [3249,1000] is connected to [3249,1010] somehow, and apparently since they are proprietary tags, they cannot be edited in Matlab, however it was suggested they could be edited in python for some reason.

Thanks a lot


Solution

  • It looks like your dicomio lookup is converting all inputs to hexadecimal.

    You could try:

    ds[0x3249,0x1000]
    

    This should prevent any forced conversion to hexadecimal.

    You can apparently access them directly as strings:

    ds['3249', '1000']
    

    However, your issue is that you are trying to access a data element that is nested several layers deep. Based on your output at the top, I would suggest trying:

    first_list_item = ds['300a', '0070'][0]
    
    for item in first_list_item['300c', '0004']:
        print(item['3249','1000'])
    

    Essentially, a data element from the top level Dataset object can be either a list or another Dataset object. Makes parsing the data a little harder, but probably unavoidable.

    Have a look at this for more info.