Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions ismrmrd/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,16 @@ def __setitem__(self, key, value):
def __repr__(self):
return type(self).__name__ + " containing " + self.data.__repr__()

def append(self,item):
self.extend([item])

def extend(self,iterable):
new_data = [self.to_numpy(v) for v in iterable]
old_size = self.data.shape[0]
new_size = old_size + len(new_data)
self.data.resize(new_size,axis=0)
self.data[old_size:] = new_data

@classmethod
def from_numpy(cls, raw):
raise NotImplemented()
Expand Down Expand Up @@ -248,7 +258,7 @@ def __set_acquisitions(self, acquisitions):
buffer = numpy.array([Acquisitions.to_numpy(a) for a in acquisitions], dtype=acquisition_dtype)

self.__del_acquisitions()
self._contents['data'] = buffer
self._contents.create_dataset('data',data=buffer,maxshape=(None,),chunks=True)

def __del_acquisitions(self):
if 'data' in self._contents:
Expand All @@ -271,7 +281,7 @@ def __set_waveforms(self, waveforms):
buffer = numpy.array([converter.to_numpy(w) for w in waveforms], dtype=waveform_dtype)

self.__del_waveforms()
self._contents['waveforms'] = buffer
self._contents.create_dataset('waveforms', data=buffer, maxshape=(None,),chunks=True)

def __del_waveforms(self):
if 'waveforms' in self._contents:
Expand Down
10 changes: 9 additions & 1 deletion schema/ismrmrd.xsd
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
<xs:element minOccurs="0" name="seriesDate" type="xs:date" />
<xs:element minOccurs="0" name="seriesTime" type="xs:time" />
<xs:element minOccurs="1" name="patientPosition" type="patientPositionType" />
<xs:element minOccurs="0" name="relativeTablePosition" type="threeDimensionalFloat" />
<xs:element minOccurs="0" name="relativeTablePosition" type="threeDimensionalFloatType" />
<xs:element minOccurs="0" name="initialSeriesNumber" type="xs:long" />
<xs:element minOccurs="0" name="protocolName" type="xs:string" />
<xs:element minOccurs="0" name="sequenceName" type="xs:string" />
Expand Down Expand Up @@ -174,6 +174,14 @@
</xs:all>
</xs:complexType>

<xs:complexType name="threeDimensionalFloatType">
<xs:sequence>
<xs:element maxOccurs="1" minOccurs="1" name="x" type="xs:float" />
<xs:element maxOccurs="1" minOccurs="1" name="y" type="xs:float" />
<xs:element maxOccurs="1" minOccurs="1" name="z" type="xs:float" />
</xs:sequence>
</xs:complexType>

<xs:complexType name="encodingLimitsType">
<xs:all>
<xs:element maxOccurs="1" minOccurs="0" name="kspace_encoding_step_0" type="limitType" />
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ def to_uri(filename):

setup(
name='ismrmrd',
version='1.12.5',
version='1.13.0',
author='ISMRMRD Developers',
description='Python implementation of the ISMRMRD',
license='Public Domain',
Expand Down
2 changes: 1 addition & 1 deletion tests/test_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ def create_random_image(seed=42):
header = create_random_image_properties()

image = ismrmrd.Image.from_array(data, **header)
image.attribute_string = "<?xml version='1.0' encoding='UTF-8'?>\n<ismrmrdMeta><meta><name>rando</name><value>{}</value></meta></ismrmrdMeta>".format(random.randint(0, 1000))
image.meta = {"Random attribute": random.randint(0,1000)}

return image

Expand Down
45 changes: 43 additions & 2 deletions tests/test_file.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def test_file_returns_none_when_no_acquisitions_present():
dataset = file['dataset']

assert dataset.has_acquisitions()
assert dataset.acquisitions is not None
assert not (dataset.acquisitions is None)


@nose.tools.with_setup(create_temp_dir, delete_temp_dir)
Expand Down Expand Up @@ -85,7 +85,7 @@ def test_file_can_delete_acquisitions():

dataset.acquisitions = random_acquisitions(10)

assert dataset.acquisitions is not None
assert not (dataset.acquisitions is None)
del dataset.acquisitions
assert dataset.acquisitions is None

Expand Down Expand Up @@ -138,6 +138,26 @@ def test_file_can_write_random_acquisition():
dataset = file['dataset']
assert acquisition == dataset.acquisitions[200]

@nose.tools.with_setup(create_temp_dir, delete_temp_dir)
def test_file_can_append_acquisitions():

filename = os.path.join(temp_dir, "acquisitions.h5")
acquisitions = list(random_acquisitions(10))
acquisitions2 = list(random_acquisitions(10))
acquisition3 = next(random_acquisitions(1))

combined = acquisitions + acquisitions2 + [acquisition3]

with ismrmrd.File(filename) as file:
dataset = file['dataset']
dataset.acquisitions = acquisitions
dataset.acquisitions.extend(acquisitions2)
dataset.acquisitions.append(acquisition3)

with ismrmrd.File(filename) as file:
dataset = file['dataset']
for a, b in zip(combined, dataset.acquisitions):
assert a == b

@nose.tools.with_setup(create_temp_dir, delete_temp_dir)
def test_file_can_write_random_acquisition_slice():
Expand Down Expand Up @@ -187,6 +207,27 @@ def test_file_can_read_and_write_waveforms():
for a, b in zip(waveforms, dataset.waveforms):
assert a == b

@nose.tools.with_setup(create_temp_dir, delete_temp_dir)
def test_file_can_append_waveforms():

filename = os.path.join(temp_dir, "waveforms.h5")
waveforms = list(random_waveforms(10))
waveforms2 = list(random_waveforms(10))
waveform3 = next(random_waveforms(1))

combined = waveforms + waveforms2 + [waveform3]

with ismrmrd.File(filename) as file:
dataset = file['dataset']
dataset.waveforms = waveforms
dataset.waveforms.extend(waveforms2)
dataset.waveforms.append(waveform3)

with ismrmrd.File(filename) as file:
dataset = file['dataset']
for a, b in zip(combined, dataset.waveforms):
assert a == b


@nose.tools.with_setup(create_temp_dir, delete_temp_dir)
def test_file_can_read_and_write_images():
Expand Down
1 change: 0 additions & 1 deletion tests/test_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ def test_new_instance():
img = ismrmrd.Image(head, attribute_string=attr)
eq_(img.attribute_string, attr)


def test_read_only_fields():
img = ismrmrd.Image()
for field in ['data_type', 'matrix_size', 'channels', 'attribute_string_len']:
Expand Down