Skip to content

Commit 065f840

Browse files
committed
fix: add mean back for fsl 5.0.7 after highpass - test for shape in generating dof volumes
1 parent b30f5ae commit 065f840

File tree

3 files changed

+45
-30
lines changed

3 files changed

+45
-30
lines changed

examples/fmri_ants_openfmri.py

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -471,23 +471,7 @@ def get_contrasts(contrast_file, task_id, conds):
471471
name="modelspec")
472472
modelspec.inputs.input_units = 'secs'
473473

474-
'''
475-
def check_behav_list(behav):
476-
from nipype.external import six
477-
out_behav = []
478-
if isinstance(behav, six.string_types):
479-
behav = [behav]
480-
for val in behav:
481-
if not isinstance(val, list):
482-
out_behav.append([val])
483-
else:
484-
out_behav.append(val)
485-
return out_behav
486-
487-
wf.connect(subjinfo, 'TR', modelspec, 'time_repetition')
488-
wf.connect(datasource, ('behav', check_behav_list), modelspec, 'event_files')
489-
'''
490-
def check_behav_list(behav, conds):
474+
def check_behav_list(behav, run_id, conds):
491475
from nipype.external import six
492476
import numpy as np
493477
num_conds = len(conds)
@@ -497,13 +481,14 @@ def check_behav_list(behav, conds):
497481
num_elements = behav_array.shape[0]
498482
return behav_array.reshape(num_elements/num_conds, num_conds).tolist()
499483

500-
reshape_behav = pe.Node(niu.Function(input_names=['behav', 'conds'],
484+
reshape_behav = pe.Node(niu.Function(input_names=['behav', 'run_id', 'conds'],
501485
output_names=['behav'],
502486
function=check_behav_list),
503487
name='reshape_behav')
504488

505489
wf.connect(subjinfo, 'TR', modelspec, 'time_repetition')
506490
wf.connect(datasource, 'behav', reshape_behav, 'behav')
491+
wf.connect(subjinfo, 'run_id', reshape_behav, 'run_id')
507492
wf.connect(subjinfo, 'conds', reshape_behav, 'conds')
508493
wf.connect(reshape_behav, 'behav', modelspec, 'event_files')
509494

nipype/workflows/fmri/fsl/estimate.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,10 @@ def get_dofvolumes(dof_files, cope_files):
250250
import nibabel as nb
251251
import numpy as np
252252
img = nb.load(cope_files[0])
253-
out_data = np.zeros(img.get_shape())
253+
if len(img.get_shape()) > 3:
254+
out_data = np.zeros(img.get_shape())
255+
else:
256+
out_data = np.zeros(list(img.get_shape()) + [1])
254257
for i in range(out_data.shape[-1]):
255258
dof = np.loadtxt(dof_files[i])
256259
out_data[:, :, :, i] = dof

nipype/workflows/fmri/fsl/preprocess.py

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import nipype.interfaces.freesurfer as fs # freesurfer
99
import nipype.interfaces.spm as spm
1010

11+
from nipype import LooseVersion
12+
1113
from ...smri.freesurfer.utils import create_getmask_flow
1214

1315
def getthreshop(thresh):
@@ -415,6 +417,11 @@ def create_featreg_preproc(name='featpreproc', highpass=True, whichvol='middle')
415417
>>> preproc.run() # doctest: +SKIP
416418
"""
417419

420+
version = 0
421+
if fsl.Info.version() and \
422+
LooseVersion(fsl.Info.version()) > LooseVersion('5.0.6'):
423+
version = 507
424+
418425
featpreproc = pe.Workflow(name=name)
419426

420427
"""
@@ -658,17 +665,6 @@ def create_featreg_preproc(name='featpreproc', highpass=True, whichvol='middle')
658665

659666
featpreproc.connect(medianval, ('out_stat', getmeanscale), meanscale, 'op_string')
660667

661-
"""
662-
Perform temporal highpass filtering on the data
663-
"""
664-
665-
if highpass:
666-
highpass = pe.MapNode(interface=fsl.ImageMaths(suffix='_tempfilt'),
667-
iterfield=['in_file'],
668-
name='highpass')
669-
featpreproc.connect(inputnode, ('highpass', highpass_operand), highpass, 'op_string')
670-
featpreproc.connect(meanscale, 'out_file', highpass, 'in_file')
671-
featpreproc.connect(highpass, 'out_file', outputnode, 'highpassed_files')
672668

673669
"""
674670
Generate a mean functional image from the first run
@@ -681,6 +677,37 @@ def create_featreg_preproc(name='featpreproc', highpass=True, whichvol='middle')
681677

682678
featpreproc.connect(meanscale, ('out_file', pickfirst), meanfunc3, 'in_file')
683679
featpreproc.connect(meanfunc3, 'out_file', outputnode, 'mean')
680+
681+
"""
682+
Perform temporal highpass filtering on the data
683+
"""
684+
685+
if highpass:
686+
highpass = pe.MapNode(interface=fsl.ImageMaths(suffix='_tempfilt'),
687+
iterfield=['in_file'],
688+
name='highpass')
689+
featpreproc.connect(inputnode, ('highpass', highpass_operand), highpass, 'op_string')
690+
featpreproc.connect(meanscale, 'out_file', highpass, 'in_file')
691+
692+
if version < 507:
693+
featpreproc.connect(highpass, 'out_file', outputnode, 'highpassed_files')
694+
else:
695+
"""
696+
Add back the mean removed by the highpass filter operation as of FSL 5.0.7
697+
"""
698+
meanfunc4 = pe.MapNode(interface=fsl.ImageMaths(op_string='-Tmean',
699+
suffix='_mean'),
700+
iterfield=['in_file'],
701+
name='meanfunc4')
702+
703+
featpreproc.connect(meanscale, 'out_file', meanfunc4, 'in_file')
704+
addmean = pe.MapNode(interface=fsl.BinaryMaths(operation='add'),
705+
iterfield=['in_file', 'operand_file'],
706+
name='addmean')
707+
featpreproc.connect(highpass, 'out_file', addmean, 'in_file')
708+
featpreproc.connect(meanfunc4, 'out_file', addmean, 'operand_file')
709+
featpreproc.connect(addmean, 'out_file', outputnode, 'highpassed_files')
710+
684711
return featpreproc
685712

686713

0 commit comments

Comments
 (0)