Skip to content

Commit

Permalink
Merge pull request #85 from howardpchen/fix/jitter_timestamp
Browse files Browse the repository at this point in the history
jitter_timestamp with variable name change
  • Loading branch information
vsoch authored Dec 28, 2018
2 parents 80c2885 + f8b3f58 commit d7fb3e2
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 2 deletions.
34 changes: 32 additions & 2 deletions deid/dicom/actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
import os
import re
import sys
import datetime


# Actions
Expand Down Expand Up @@ -118,7 +119,7 @@ def _perform_action(dicom, field, action, value=None, item=None):
if value is not None:

# Jitter the field by the supplied value
dicom = jitter_timestamp(item=dicom,
dicom = jitter_timestamp(dicom=dicom,
field=field,
value=value)
else:
Expand Down Expand Up @@ -156,6 +157,35 @@ def jitter_timestamp(dicom, field, value):
value = int(value)

original = dicom.get(field,None)

if original is not None:
dicom[field] = original + value
dcmvr = dicom.data_element(field).VR
'''
DICOM Value Representation can be either DA (Date) DT (Timestamp),
or something else, which is not supported.
'''
if (dcmvr == 'DA'):
'''
NEMA-compliant format for DICOM date is YYYYMMDD
'''
new_value = get_timestamp(original, jitter_days=value,
format='%Y%m%d')

elif (dcmvr == 'DT'):
'''
NEMA-compliant format for DICOM timestamp is
YYYYMMDDHHMMSS.FFFFFF&ZZXX
'''
new_value = get_timestamp(original, jitter_days=value,
format='%Y%m%d%H%M%S.%f%z')
else:
# Do nothing and issue a warning.
new_value = None
bot.warning("JITTER not supported for %s with VR=%s" % (field,
dcmvr))
if (new_value is not None and new_value != original):
# Only update if there's something to update AND there's been change
dicom = update_tag(dicom,
field=field,
value=new_value)
return dicom
55 changes: 55 additions & 0 deletions deid/tests/test_dicom_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,61 @@ def generate_uid(item, value, field):
updated = perform_action(dicom=dicom, action=ACTION, item=item)
self.assertEqual(updated.PatientID, "pancakes")

def test_jitter_timestamp(self):

from deid.dicom.actions import jitter_timestamp
dicom = get_dicom(self.dataset)

print("Testing test_jitter_timestamp")

print("Case 1: Testing jitter_timestamp with DICOM Date (DA)")
dicom.StudyDate = '20131210'
dicom.data_element("StudyDate").VR = 'DA'
jitter_timestamp(dicom, "StudyDate", 10)
expected = '20131220'
self.assertEqual(dicom.StudyDate, expected)

print("Case 2: Testing with DICOM timestamp (DT)")
dicom.AcquisitionDateTime = '20131210081530'
dicom.data_element("AcquisitionDateTime").VR = 'DT'
jitter_timestamp(dicom, "AcquisitionDateTime", 10)
expected = '20131220081530.000000'
self.assertEqual(dicom.AcquisitionDateTime, expected)

print("Case 3: Testing with non-standard DICOM date (DA)")
dicom.StudyDate = '2013/12/10'
dicom.data_element("StudyDate").VR = 'DA'
jitter_timestamp(dicom, "StudyDate", 10)
expected = '20131220'
self.assertEqual(dicom.StudyDate, expected)

print("Case 4: Testing negative jitter value")
dicom.StudyDate = '20131210'
jitter_timestamp(dicom, "StudyDate", -5)
expected = '20131205'
self.assertEqual(dicom.StudyDate, expected)

print("Case 5: Testing with empty field")
dicom.StudyDate = expected = ''
jitter_timestamp(dicom, "StudyDate", 10)
self.assertEqual(dicom.StudyDate, expected)

print('Case 6: Testing with nonexistent field')
del dicom.StudyDate
jitter_timestamp(dicom, "StudyDate", 10)
self.assertTrue("StudyDate" not in dicom)

print("Case 7: Testing JITTER recipe action")
from deid.dicom.actions import perform_action
dicom.StudyDate = '20131210'
dicom.data_element("StudyDate").VR = 'DA'
JITTER = { "action":"JITTER",
"field":"StudyDate",
"value":"-5" }
expected = '20131205'
dicom = perform_action(dicom=dicom,action=JITTER)
self.assertTrue(dicom.StudyDate, expected)


def get_dicom(dataset):
'''helper function to load a dicom
Expand Down

0 comments on commit d7fb3e2

Please sign in to comment.