Skip to content

Instantly share code, notes, and snippets.

@M-Mueller
Last active September 13, 2017 10:42
Show Gist options
  • Save M-Mueller/8cecda21fdc25b56271980a026441db1 to your computer and use it in GitHub Desktop.
Save M-Mueller/8cecda21fdc25b56271980a026441db1 to your computer and use it in GitHub Desktop.
import sys
import subprocess
# http://dicom.nema.org/medical/dicom/current/output/chtml/part15/chapter_E.html
confidential_tags = [
((0x0008, 0x0050), 'Z'),
((0x0018, 0x4000), 'X'),
((0x0040, 0x0555), 'X'),
((0x0008, 0x0022), 'X/Z'),
((0x0008, 0x002A), 'X/D'),
((0x0018, 0x1400), 'X/D'),
((0x0018, 0x9424), 'X'),
((0x0008, 0x0032), 'X/Z'),
((0x0040, 0x4035), 'X'),
((0x0010, 0x21B0), 'X'),
((0x0040, 0xA353), 'X'),
((0x0038, 0x0010), 'X'),
((0x0038, 0x0020), 'X'),
((0x0008, 0x1084), 'X'),
((0x0008, 0x1080), 'X'),
((0x0038, 0x0021), 'X'),
((0x0000, 0x1000), 'X'),
((0x0010, 0x2110), 'X'),
((0x4000, 0x0010), 'X'),
((0x0040, 0xA078), 'X'),
((0x0010, 0x1081), 'X'),
((0x0018, 0x1007), 'X'),
((0x0040, 0x0280), 'X'),
((0x0020, 0x9161), 'U'),
((0x0040, 0x3001), 'X'),
((0x0008, 0x009D), 'X'),
((0x0008, 0x009C), 'Z'),
((0x0070, 0x0084), 'Z'),
((0x0070, 0x0086), 'X'),
((0x0008, 0x0023), 'Z/D'),
((0x0040, 0xA730), 'X'),
((0x0008, 0x0033), 'Z/D'),
((0x0008, 0x010D), 'U'),
((0x0018, 0x0010), 'Z/D'),
((0x0018, 0xA003), 'X'),
((0x0010, 0x2150), 'X'),
((0x0008, 0x9123), 'U'),
((0x0040, 0xA307), 'X'),
((0x0038, 0x0300), 'X'),
((0x0008, 0x0025), 'X'),
((0x0008, 0x0035), 'X'),
((0x0040, 0xA07C), 'X'),
((0xFFFC, 0xFFFC), 'X'),
((0x0008, 0x2111), 'X'),
((0x0018, 0x700A), 'X/D'),
((0x0018, 0x1000), 'X/Z/D'),
((0x0018, 0x1002), 'U'),
((0x0400, 0x0100), 'X'),
((0xFFFA, 0xFFFA), 'X'),
((0x0020, 0x9164), 'U'),
((0x0038, 0x0040), 'X'),
((0x4008, 0x011A), 'X'),
((0x4008, 0x0119), 'X'),
((0x300A, 0x0013), 'U'),
((0x0018, 0x9517), 'X/D'),
((0x0010, 0x2160), 'X'),
((0x0040, 0x4011), 'X'),
((0x0008, 0x0058), 'U'),
((0x0070, 0x031A), 'U'),
((0x0040, 0x2017), 'Z'),
((0x0020, 0x9158), 'X'),
((0x0020, 0x0052), 'U'),
((0x0018, 0x1008), 'X'),
((0x0018, 0x1005), 'X'),
((0x0070, 0x0001), 'D'),
((0x0040, 0x4037), 'X'),
((0x0040, 0x4036), 'X'),
((0x0088, 0x0200), 'X'),
((0x0008, 0x4000), 'X'),
((0x0020, 0x4000), 'X'),
((0x0028, 0x4000), 'X'),
((0x0040, 0x2400), 'X'),
((0x4008, 0x0300), 'X'),
((0x0008, 0x0015), 'X'),
((0x0008, 0x0014), 'U'),
((0x0008, 0x0081), 'X'),
((0x0008, 0x0082), 'X/Z/D'),
((0x0008, 0x0080), 'X/Z/D'),
((0x0008, 0x1040), 'X'),
((0x0010, 0x1050), 'X'),
((0x0040, 0x1011), 'X'),
((0x4008, 0x0111), 'X'),
((0x4008, 0x010C), 'X'),
((0x4008, 0x0115), 'X'),
((0x4008, 0x0202), 'X'),
((0x4008, 0x0102), 'X'),
((0x4008, 0x010B), 'X'),
((0x4008, 0x010A), 'X'),
((0x0008, 0x3010), 'U'),
((0x0038, 0x0011), 'X'),
((0x0010, 0x0021), 'X'),
((0x0038, 0x0061), 'X'),
((0x0028, 0x1214), 'U'),
((0x0010, 0x21D0), 'X'),
((0x0400, 0x0404), 'X'),
((0x0002, 0x0003), 'U'),
((0x0010, 0x2000), 'X'),
((0x0010, 0x1090), 'X'),
((0x0010, 0x1080), 'X'),
((0x0400, 0x0550), 'X'),
((0x0020, 0x3406), 'X'),
((0x0020, 0x3401), 'X'),
((0x0020, 0x3404), 'X'),
((0x0008, 0x1060), 'X'),
((0x0040, 0x1010), 'X'),
((0x0040, 0xA192), 'X'),
((0x0040, 0xA402), 'U'),
((0x0040, 0xA193), 'X'),
((0x0040, 0xA171), 'U'),
((0x0010, 0x2180), 'X'),
((0x0008, 0x1072), 'X/D'),
((0x0008, 0x1070), 'X/Z/D'),
((0x0400, 0x0561), 'X'),
((0x0040, 0x2010), 'X'),
((0x0040, 0x2011), 'X'),
((0x0040, 0x2008), 'X'),
((0x0040, 0x2009), 'X'),
((0x0010, 0x1000), 'X'),
((0x0010, 0x1002), 'X'),
((0x0010, 0x1001), 'X'),
((0x0008, 0x0024), 'X'),
((0x0008, 0x0034), 'X'),
((0x0028, 0x1199), 'U'),
((0x0040, 0xA07A), 'X'),
((0x0010, 0x1040), 'X'),
((0x0010, 0x4000), 'X'),
((0x0010, 0x0020), 'Z'),
((0x0010, 0x2203), 'X/Z'),
((0x0038, 0x0500), 'X'),
((0x0040, 0x1004), 'X'),
((0x0010, 0x1010), 'X'),
((0x0010, 0x0030), 'Z'),
((0x0010, 0x1005), 'X'),
((0x0010, 0x0032), 'X'),
((0x0038, 0x0400), 'X'),
((0x0010, 0x0050), 'X'),
((0x0010, 0x1060), 'X'),
((0x0010, 0x0010), 'Z'),
((0x0010, 0x0101), 'X'),
((0x0010, 0x0102), 'X'),
((0x0010, 0x21F0), 'X'),
((0x0010, 0x0040), 'Z'),
((0x0010, 0x1020), 'X'),
((0x0010, 0x2155), 'X'),
((0x0010, 0x2154), 'X'),
((0x0010, 0x1030), 'X'),
((0x0040, 0x0243), 'X'),
((0x0040, 0x0254), 'X'),
((0x0040, 0x0250), 'X'),
((0x0040, 0x4051), 'X'),
((0x0040, 0x0251), 'X'),
((0x0040, 0x0253), 'X'),
((0x0040, 0x0244), 'X'),
((0x0040, 0x4050), 'X'),
((0x0040, 0x0245), 'X'),
((0x0040, 0x0241), 'X'),
((0x0040, 0x4030), 'X'),
((0x0040, 0x0242), 'X'),
((0x0040, 0x4028), 'X'),
((0x0008, 0x1052), 'X'),
((0x0008, 0x1050), 'X'),
((0x0040, 0x1102), 'X'),
((0x0040, 0x1101), 'D'),
((0x0040, 0xA123), 'D'),
((0x0040, 0x1104), 'X'),
((0x0040, 0x1103), 'X'),
((0x4008, 0x0114), 'X'),
((0x0008, 0x1062), 'X'),
((0x0008, 0x1048), 'X'),
((0x0008, 0x1049), 'X'),
((0x0040, 0x2016), 'Z'),
((0x0018, 0x1004), 'X'),
((0x0040, 0x0012), 'X'),
((0x0010, 0x21C0), 'X'),
((0x0070, 0x1101), 'U'),
((0x0070, 0x1102), 'U'),
((0x0040, 0x4052), 'X'),
((0x0018, 0x1030), 'X/D'),
((0x300C, 0x0113), 'X'),
((0x0040, 0x2001), 'X'),
((0x0032, 0x1030), 'X'),
((0x0400, 0x0402), 'X'),
((0x3006, 0x0024), 'U'),
((0x0040, 0x4023), 'U'),
((0x0008, 0x1140), 'X/Z/U*'),
((0x0040, 0xA172), 'U'),
((0x0038, 0x0004), 'X'),
((0x0010, 0x1100), 'X'),
((0x0008, 0x1120), 'X'),
((0x0008, 0x1111), 'X/Z/D'),
((0x0400, 0x0403), 'X'),
((0x0008, 0x1155), 'U'),
((0x0004, 0x1511), 'U'),
((0x0008, 0x1110), 'X/Z'),
((0x0008, 0x0092), 'X'),
((0x0008, 0x0096), 'X'),
((0x0008, 0x0090), 'Z'),
((0x0008, 0x0094), 'X'),
((0x0010, 0x2152), 'X'),
((0x3006, 0x00C2), 'U'),
((0x0040, 0x0275), 'X'),
((0x0032, 0x1070), 'X'),
((0x0040, 0x1400), 'X'),
((0x0032, 0x1060), 'X/Z'),
((0x0040, 0x1001), 'X'),
((0x0040, 0x1005), 'X'),
((0x0000, 0x1001), 'U'),
((0x0032, 0x1032), 'X'),
((0x0032, 0x1033), 'X'),
((0x0010, 0x2299), 'X'),
((0x0010, 0x2297), 'X'),
((0x4008, 0x4000), 'X'),
((0x4008, 0x0118), 'X'),
((0x4008, 0x0042), 'X'),
((0x300E, 0x0008), 'X/Z'),
((0x0040, 0x4034), 'X'),
((0x0038, 0x001E), 'X'),
((0x0040, 0x000B), 'X'),
((0x0040, 0x0006), 'X'),
((0x0040, 0x0004), 'X'),
((0x0040, 0x0005), 'X'),
((0x0040, 0x0007), 'X'),
((0x0040, 0x0011), 'X'),
((0x0040, 0x4010), 'X'),
((0x0040, 0x0002), 'X'),
((0x0040, 0x4005), 'X'),
((0x0040, 0x0003), 'X'),
((0x0040, 0x0001), 'X'),
((0x0040, 0x4027), 'X'),
((0x0040, 0x0010), 'X'),
((0x0040, 0x4025), 'X'),
((0x0032, 0x1020), 'X'),
((0x0032, 0x1021), 'X'),
((0x0008, 0x0021), 'X/D'),
((0x0008, 0x103E), 'X'),
((0x0020, 0x000E), 'U'),
((0x0008, 0x0031), 'X/D'),
((0x0038, 0x0062), 'X'),
((0x0038, 0x0060), 'X'),
((0x0010, 0x21A0), 'X'),
((0x0008, 0x0018), 'U'),
((0x0008, 0x2112), 'X/Z/U*'),
((0x3008, 0x0105), 'X'),
((0x0038, 0x0050), 'X'),
((0x0018, 0x9516), 'X/D'),
((0x0008, 0x1010), 'X/Z/D'),
((0x0088, 0x0140), 'U'),
((0x0032, 0x4000), 'X'),
((0x0008, 0x0020), 'Z'),
((0x0008, 0x1030), 'X'),
((0x0020, 0x0010), 'Z'),
((0x0032, 0x0012), 'X'),
((0x0020, 0x000D), 'U'),
((0x0008, 0x0030), 'Z'),
((0x0020, 0x0200), 'U'),
((0x0018, 0x2042), 'U'),
((0x0040, 0xA354), 'X'),
((0x0040, 0xDB0D), 'U'),
((0x0040, 0xDB0C), 'U'),
((0x4000, 0x4000), 'X'),
((0x2030, 0x0020), 'X'),
((0x0008, 0x0201), 'X'),
((0x0088, 0x0910), 'X'),
((0x0088, 0x0912), 'X'),
((0x0088, 0x0906), 'X'),
((0x0088, 0x0904), 'X'),
((0x0062, 0x0021), 'U'),
((0x0008, 0x1195), 'U'),
((0x0040, 0xA124), 'U'),
((0x0040, 0xA352), 'X'),
((0x0040, 0xA358), 'X'),
((0x0040, 0xA088), 'Z'),
((0x0040, 0xA075), 'D'),
((0x0040, 0xA073), 'D'),
((0x0040, 0xA027), 'X'),
((0x0038, 0x4000), 'X'),
]
for file in sys.argv[1:]:
command = ['dcmodify']
# generate new UIDs
command += ['-gst', '-gse', '-gin']
# ignore errors
command += ['-ie', '-imt', '-iun']
for tag in confidential_tags:
action = tag[1]
tagkey = '({:04x},{:04x})'.format(tag[0][0], tag[0][1])
if action.startswith('X'):
# tags to remove
command += ['-ea', '{}'.format(tagkey)]
if action == 'D' or action.startswith('Z'):
# tags to clear
replacement = 'REMOVED'
if tag[0][0] == 0x0010 and tag[0][1] == 0x0040: # PatientSex
replacement = 'O'
command += ['-ma', '{}={}'.format(tagkey, replacement)]
command += [file]
subprocess.check_call(command)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment