diff --git a/fsl/data/freesurfer.py b/fsl/data/freesurfer.py index 9c4f234ee228f57b535ad456a30378ff60537308..b8980b89bb43d38c4cf47ed6c0f2144aad28cf88 100644 --- a/fsl/data/freesurfer.py +++ b/fsl/data/freesurfer.py @@ -92,14 +92,19 @@ EXTRA_GEOMETRY_FILES = ['?h.orig.nofix', VERTEX_DATA_FILES = ['?h.thickness', '?h.curv', '?h.area', - '?h.sulc', - '.mgh', - '.mgz'] + '?h.sulc'] """File patterns which are interpreted as Freesurfer vertex data files, containing a scalar value for every vertex in the mesh. """ +VERTEX_MGH_FILES = ['?h.*.mgh', + '?h.*.mgz'] +"""File patterns which are interpreted as MGH files containing a +scalar value for every vertex in the mesh. +""" + + VERTEX_LABEL_FILES = ['?h.*.label'] """File patterns which are interpreted as Freesurfer vertex label files, containing a scalar value for a sub-set of vertices in the mesh. @@ -196,10 +201,11 @@ class FreesurferMesh(fslmesh.Mesh): """ isvdata = isVertexDataFile( infile) + isvmgh = isVertexMGHFile( infile) isvlabel = isVertexLabelFile(infile) isvannot = isVertexAnnotFile(infile) - if not any((isvdata, isvlabel, isvannot)): + if not any((isvdata, isvmgh, isvlabel, isvannot)): return fslmesh.Mesh.loadVertexData(self, infile) infile = op.abspath(infile) @@ -211,9 +217,11 @@ class FreesurferMesh(fslmesh.Mesh): vdata = loadVertexDataFile(infile) if isvlabel: - idxs, vdata = np.asarray(vdata, np.int) + # Currently ignoring scalar + # values stored in label files + idxs = np.asarray(vdata[0]) expanded = np.zeros(nvertices) - expanded[idxs] = vdata + expanded[idxs] = 1 vdata = expanded elif isvannot: @@ -222,7 +230,7 @@ class FreesurferMesh(fslmesh.Mesh): vdata = self.addVertexData(key, vdata) if isvannot: - self.__luts[key] = lut, names, lut + self.__luts[key] = lut, names return vdata @@ -275,10 +283,16 @@ def loadVertexDataFile(infile): return nibfs.read_label(infile, read_scalars=True) elif isVertexAnnotFile(infile): - return nibfs.read_annot(infile, orig_ids=False) - elif fslpath.hasExt(infile, fslmgh.ALLOWED_EXTENSIONS): + # nibabel 2.2.1 is broken w.r.t. .annot files. + # raise ValueError('.annot files are not yet supported') + + labels, lut, names = nibfs.read_annot(infile, orig_ids=False) + return labels, lut, names + + elif isVertexMGHFile(infile): return fslmgh.MGHImage(infile)[:].squeeze() + else: raise ValueError('Unrecognised freesurfer ' 'file type: {}'.format(infile)) @@ -312,6 +326,15 @@ def isVertexDataFile(infile): return any([fnmatch.fnmatch(infile, gf) for gf in VERTEX_DATA_FILES]) +@memoize.memoize +def isVertexMGHFile(infile): + """Returns ``True`` if ``infile`` looks like a Freesurfer MGH file + containing vertex data, ``False`` otherwise. + """ + infile = op.basename(infile) + return any([fnmatch.fnmatch(infile, gf) for gf in VERTEX_MGH_FILES]) + + @memoize.memoize def isVertexLabelFile(infile): """Returns ``True`` if ``infile`` looks like a Freesurfer vertex @@ -361,7 +384,10 @@ def relatedVertexDataFiles(fname): dirname = op.dirname(fname) hemi = op.basename(fname)[0] - fpats = VERTEX_DATA_FILES + VERTEX_LABEL_FILES + VERTEX_ANNOT_FILES + fpats = (VERTEX_DATA_FILES + + VERTEX_LABEL_FILES + + VERTEX_ANNOT_FILES + + VERTEX_MGH_FILES) fpats = [hemi + p[1:] if p.startswith('?h') else p for p in fpats] basedir = op.dirname(dirname)