Skip to content

Commit 60142ae

Browse files
authored
Merge pull request #1958 from effigies/enh/freesurfer_version
Centralize FreeSurfer version parsing
2 parents 378e295 + a6b5b7d commit 60142ae

File tree

3 files changed

+47
-18
lines changed

3 files changed

+47
-18
lines changed

nipype/interfaces/freesurfer/base.py

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,17 @@
1717
from __future__ import print_function, division, unicode_literals, absolute_import
1818
from builtins import open, object, str
1919

20-
2120
import os
2221

22+
from ... import LooseVersion
2323
from ...utils.filemanip import fname_presuffix
2424
from ..base import (CommandLine, Directory,
2525
CommandLineInputSpec, isdefined,
2626
traits, TraitedSpec, File)
2727

2828
__docformat__ = 'restructuredtext'
2929

30+
3031
class Info(object):
3132
""" Freesurfer subject directory and version information.
3233
@@ -65,6 +66,41 @@ def version():
6566
fid.close()
6667
return version
6768

69+
@classmethod
70+
def looseversion(cls):
71+
""" Return a comparable version object
72+
73+
If no version found, use LooseVersion('0.0.0')
74+
"""
75+
ver = cls.version()
76+
if ver is None:
77+
return LooseVersion('0.0.0')
78+
79+
vinfo = ver.rstrip().split('-')
80+
try:
81+
int(vinfo[-1], 16)
82+
except ValueError:
83+
githash = ''
84+
else:
85+
githash = '.' + vinfo[-1]
86+
87+
# As of FreeSurfer v6.0.0, the final component is a githash
88+
if githash:
89+
if vinfo[3] == 'dev':
90+
# This will need updating when v6.0.1 comes out
91+
vstr = '6.0.0-dev' + githash
92+
elif vinfo[5][0] == 'v':
93+
vstr = vinfo[5][1:]
94+
else:
95+
raise RuntimeError('Unknown version string: ' + ver)
96+
# Retain pre-6.0.0 heuristics
97+
elif 'dev' in ver:
98+
vstr = vinfo[-1] + '-dev'
99+
else:
100+
vstr = ver.rstrip().split('-v')[-1]
101+
102+
return LooseVersion(vstr)
103+
68104
@classmethod
69105
def subjectsdir(cls):
70106
"""Check the global SUBJECTS_DIR
@@ -154,12 +190,9 @@ def _gen_fname(self, basename, fname=None, cwd=None, suffix='_fs',
154190

155191
@property
156192
def version(self):
157-
ver = Info.version()
158-
if ver:
159-
if 'dev' in ver:
160-
return ver.rstrip().split('-')[-1] + '.dev'
161-
else:
162-
return ver.rstrip().split('-v')[-1]
193+
ver = Info.looseversion()
194+
if ver > LooseVersion("0.0.0"):
195+
return ver.vstring
163196

164197

165198
class FSSurfaceCommand(FSCommand):

nipype/interfaces/freesurfer/preprocess.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,9 @@
3636
__docformat__ = 'restructuredtext'
3737
iflogger = logging.getLogger('interface')
3838

39-
FSVersion = "0"
40-
_ver = Info.version()
41-
if _ver:
42-
if 'dev' in _ver:
43-
FSVersion = _ver.rstrip().split('-')[-1] + '.dev'
44-
else:
45-
FSVersion = _ver.rstrip().split('-v')[-1]
39+
# Keeping this to avoid breaking external programs that depend on it, but
40+
# this should not be used internally
41+
FSVersion = Info.looseversion()
4642

4743

4844
class ParseDICOMDirInputSpec(FSTraitedSpec):
@@ -724,7 +720,7 @@ class ReconAll(CommandLine):
724720
'mri/brainmask.auto.mgz',
725721
'mri/brainmask.mgz'], []),
726722
]
727-
if LooseVersion(FSVersion) < LooseVersion("6.0.0"):
723+
if Info.looseversion() < LooseVersion("6.0.0"):
728724
_autorecon2_steps = [
729725
('gcareg', ['mri/transforms/talairach.lta'], []),
730726
('canorm', ['mri/norm.mgz'], []),
@@ -1072,7 +1068,7 @@ class BBRegister(FSCommand):
10721068
"""
10731069

10741070
_cmd = 'bbregister'
1075-
if FSVersion and LooseVersion(FSVersion) < LooseVersion("6.0.0"):
1071+
if LooseVersion('0.0.0') < Info.looseversion() < LooseVersion("6.0.0"):
10761072
input_spec = BBRegisterInputSpec
10771073
else:
10781074
input_spec = BBRegisterInputSpec6

nipype/interfaces/freesurfer/tests/test_preprocess.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from nipype.testing.fixtures import create_files_in_directory
88

99
from nipype.interfaces import freesurfer
10-
from nipype.interfaces.freesurfer.preprocess import FSVersion
10+
from nipype.interfaces.freesurfer import Info
1111
from nipype import LooseVersion
1212

1313

@@ -138,7 +138,7 @@ def test_bbregister(create_files_in_directory):
138138
bbr.inputs.contrast_type = 't2'
139139

140140
# Check that 'init' is mandatory in FS < 6, but not in 6+
141-
if LooseVersion(FSVersion) < LooseVersion("6.0.0"):
141+
if Info.looseversion() < LooseVersion("6.0.0"):
142142
with pytest.raises(ValueError):
143143
bbr.cmdline
144144
else:

0 commit comments

Comments
 (0)