diff --git a/CHANGELOG.rst b/CHANGELOG.rst index f47a711bc6f641f6aebcebbeda39ecb597f551f1..425afb89e50fc5895fe49e0e66a92d9a5d733dc2 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -74,7 +74,8 @@ Fixed functions. * Fixed the :func:`.DeformationField.transform` method so it works with a single set of coordinates. - +* :class:`.Image` creation does not fail if ``loadMeta`` is set, and a + sidecar file containing invalid JSON is present. Removed ^^^^^^^ diff --git a/fsl/data/image.py b/fsl/data/image.py index 8cc5c62087b25ebe9f463dcc7e95b1f57f3fe484..1dc0aaf93bd1def53bb793d27c0033269eba82e2 100644 --- a/fsl/data/image.py +++ b/fsl/data/image.py @@ -1162,11 +1162,19 @@ class Image(Nifti): self.register(self.name, self.__headerChanged, topic='transform') self.register(self.name, self.__headerChanged, topic='header') + # calculate min/max + # of image data if calcRange: self.calcRange() + # try and load metadata + # from JSON sidecar files if self.dataSource is not None and loadMeta: - self.updateMeta(loadMetadata(self)) + try: + self.updateMeta(loadMetadata(self)) + except Exception as e: + log.warning('Failed to load metadata for %s: %s', + self.dataSource, e) self.__imageWrapper.register(self.__lName, self.__dataRangeChanged) diff --git a/tests/test_image.py b/tests/test_image.py index 06801c11fae442edcb1e68ab1c3eeda2e440f3a6..75ec686a9cdfba1d682d7b992fdd9820e1573512 100644 --- a/tests/test_image.py +++ b/tests/test_image.py @@ -1414,11 +1414,23 @@ def test_loadMeta_nonBids(): with open(op.join('data', 'dataset_description.json'), 'wt') as f: pass - img = fslimage.Image(imgfile, loadMeta=True) assert list(img.metaKeys()) == [] +def test_loadMeta_badJSON(): + with tempdir(): + make_image('image.nii.gz') + + # spurious comma after b:2 + with open('image.json', 'wt') as f: + f.write('{"a" : 1, "b" : 2,}') + + # bad json should not cause failure + img = fslimage.Image('image.nii.gz', loadMeta=True) + + assert list(img.metaKeys()) == [] + def test_loadMetadata(): with tempdir():