Skip to content

Commit 336f6bb

Browse files
committed
Create empty dataset or use one if provided
Useful when trying to write a new pydicom dataset instead of changing an old one.
1 parent e690148 commit 336f6bb

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

nibabel/nifti1.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -390,9 +390,20 @@ class Nifti1DicomExtension(Nifti1Extension):
390390
"""
391391
def __init__(self, code, content):
392392
self._code = code
393-
self._raw_content = content
394-
self._is_implicit_VR = self._guess_implicit_VR()
395-
self._content = self._unmangle(content)
393+
if content.__class__ == Dataset:
394+
self._is_implicit_VR = False
395+
self._is_little_endian = True
396+
self._raw_content = self._mangle(content)
397+
self._content = content
398+
elif len(content): # Got a byte string - unmangle it
399+
self._raw_content = content
400+
self._is_implicit_VR = self._guess_implicit_VR()
401+
self._is_little_endian = self._guess_little_endian()
402+
self._content = self._unmangle(content)
403+
else:
404+
self._is_implicit_VR = False
405+
self._is_little_endian = True
406+
self._content = Dataset()
396407

397408
def _guess_implicit_VR(self):
398409
"""Without a DICOM Transfer Syntax, it's difficult to tell if Value
@@ -406,20 +417,20 @@ def _guess_implicit_VR(self):
406417
implicit_VR=True
407418
return implicit_VR
408419

409-
def _is_little_endian(self):
420+
def _guess_little_endian(self):
410421
return True
411422

412423
def _unmangle(self,value):
413424
bio=BytesIO(value)
414425
ds=read_dataset(bio,self._is_implicit_VR,self._is_little_endian)
415426
return ds
416427

417-
def _mangle(self, value):
428+
def _mangle(self, dataset):
418429
bio=BytesIO()
419430
dio=DicomFileLike(bio)
420431
dio.is_implicit_VR = self._is_implicit_VR
421432
dio.is_little_endian = self._is_little_endian
422-
ds_len=write_dataset(dio,value)
433+
ds_len=write_dataset(dio,dataset)
423434
dio.seek(0)
424435
return dio.read(ds_len)
425436

@@ -428,6 +439,7 @@ def _mangle(self, value):
428439
from dicom.filereader import read_dataset
429440
from dicom.filewriter import write_dataset
430441
from dicom.filebase import DicomFileLike
442+
from dicom.dataset import Dataset
431443
from dicom.values import converters as dicom_converters
432444
from io import BytesIO
433445
except ImportError:

nibabel/tests/test_nifti1.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,6 +1087,19 @@ def test_nifti_dicom_extension():
10871087
hdr = nim.header
10881088
exts_container = hdr.extensions
10891089

1090+
# create an empty dataset if no content provided (to write a new header)
1091+
dcmext = Nifti1DicomExtension(2,b'')
1092+
assert_equal(dcmext.get_content().__class__, dicom.dataset.Dataset)
1093+
assert_equal(len(dcmext.get_content().values()), 0)
1094+
1095+
# use a dataset if provided
1096+
ds = dicom.dataset.Dataset()
1097+
ds.add_new((0x10,0x20),'LO','NiPy')
1098+
dcmext = Nifti1DicomExtension(2,ds)
1099+
assert_equal(dcmext.get_content().__class__, dicom.dataset.Dataset)
1100+
assert_equal(len(dcmext.get_content().values()), 1)
1101+
assert_equal(dcmext.get_content().PatientID, 'NiPy')
1102+
10901103
# create a single dicom tag (Patient ID, [0010,0020]) with Explicit VR
10911104
dcmbytes_explicit = struct.pack('<HH2sH4s',0x10,0x20,
10921105
'LO'.encode('utf-8'),4,'NiPy'.encode('utf-8'))

0 commit comments

Comments
 (0)