diff --git a/fsl/data/dicom.py b/fsl/data/dicom.py index 0d85a4e998139bc7e98103a48757b7d0311b5376..d38d2081d744a27c9edd71902fc3f1909dafa6d9 100644 --- a/fsl/data/dicom.py +++ b/fsl/data/dicom.py @@ -51,7 +51,7 @@ MIN_DCM2NIIX_VERSION = (1, 0, 2017, 12, 15) """ -CRC_DCM2NIIX_VERSION = (1, 0, 2019, 09, 02) +CRC_DCM2NIIX_VERSION = (1, 0, 2019, 9, 2) """For versions of ``dcm2niix`` orf this version or newer, the ``-n`` flag, used to convert a single DICOM series, requires that a CRC checksum identifying the series be passed (see the :func:`seriesCRC` @@ -92,7 +92,7 @@ class DicomImage(fslimage.Image): @memoize.memoize -def installedVersion(version): +def installedVersion(): """Return a tuple describing the version of ``dcm2niix`` that is installed, or ``None`` if dcm2niix cannot be found, or its version not parsed. @@ -121,21 +121,16 @@ def installedVersion(version): match = re.match(versionPattern, word) - if match is None: - continue - - installedVersion = ( - int(match.group('major')), - int(match.group('minor')), - int(match.group('year')), - int(match.group('month')), - int(match.group('day'))) - - return installedVersion + if match is not None: + return (int(match.group('major')), + int(match.group('minor')), + int(match.group('year')), + int(match.group('month')), + int(match.group('day'))) except Exception as e: log.debug('Error parsing dcm2niix version string: {}'.format(e)) - return None + return None def compareVersions(v1, v2): @@ -153,14 +148,14 @@ def compareVersions(v1, v2): return 0 -@memoize.memoize def enabled(): """Returns ``True`` if ``dcm2niix`` is present, and recent enough, ``False`` otherwise. """ installed = installedVersion() required = MIN_DCM2NIIX_VERSION - return installed is None or compareVersions(installed, required) < 0 + return ((installed is not None) and + (compareVersions(installed, required) >= 0)) def scanDir(dcmdir): @@ -256,10 +251,23 @@ def loadSeries(series): if not enabled(): raise RuntimeError('dcm2niix is not available or is too old') - dcmdir = series['DicomDir'] - snum = series['SeriesNumber'] - desc = series['SeriesDescription'] - cmd = 'dcm2niix -b n -f %s -z n -o . -n "{}" "{}"'.format(snum, dcmdir) + dcmdir = series['DicomDir'] + snum = series['SeriesNumber'] + desc = series['SeriesDescription'] + version = installedVersion() + + # Newer versions of dcm2niix + # require a CRC to identify + # series + if compareVersions(version, CRC_DCM2NIIX_VERSION) >= 0: + ident = seriesCRC(series) + + # Older versions require + # the series number + else: + ident = snum + + cmd = 'dcm2niix -b n -f %s -z n -o . -n "{}" "{}"'.format(ident, dcmdir) with tempdir.tempdir() as td: