diff --git a/CHANGES b/CHANGES index 9bd135d707..437c6d71af 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,7 @@ Next Release * ENH: New data grabbing interface that works over SSH connections, SSHDataGrabber * ENH: New color mode for write_graph * FIX: MRTrix tracking algorithms were ignoring mask parameters. +* FIX: FNIRT registration pathway and associated OpenFMRI example script Release 0.9.2 (January 31, 2014) ============ diff --git a/examples/fmri_openfmri.py b/examples/fmri_openfmri.py index b812feedb1..3f7ee4e424 100755 --- a/examples/fmri_openfmri.py +++ b/examples/fmri_openfmri.py @@ -305,33 +305,41 @@ def num_copes(files): wf.connect(preproc, 'outputspec.mean', registration, 'inputspec.mean_image') wf.connect(datasource, 'anat', registration, 'inputspec.anatomical_image') registration.inputs.inputspec.target_image = fsl.Info.standard_image('MNI152_T1_2mm.nii.gz') + registration.inputs.inputspec.target_image_brain = fsl.Info.standard_image('MNI152_T1_2mm_brain.nii.gz') + registration.inputs.inputspec.config_file = 'T1_2_MNI152_2mm' - def merge_files(copes, varcopes): + def merge_files(copes, varcopes, zstats): out_files = [] splits = [] out_files.extend(copes) splits.append(len(copes)) out_files.extend(varcopes) splits.append(len(varcopes)) + out_files.extend(zstats) + splits.append(len(zstats)) return out_files, splits - mergefunc = pe.Node(niu.Function(input_names=['copes', 'varcopes'], + mergefunc = pe.Node(niu.Function(input_names=['copes', 'varcopes', + 'zstats'], output_names=['out_files', 'splits'], function=merge_files), name='merge_files') wf.connect([(fixed_fx.get_node('outputspec'), mergefunc, [('copes', 'copes'), ('varcopes', 'varcopes'), + ('zstats', 'zstats'), ])]) wf.connect(mergefunc, 'out_files', registration, 'inputspec.source_files') def split_files(in_files, splits): - copes = in_files[:splits[1]] - varcopes = in_files[splits[1]:] - return copes, varcopes + copes = in_files[:splits[0]] + varcopes = in_files[splits[0]:(splits[0] + splits[1])] + zstats = in_files[(splits[0] + splits[1]):] + return copes, varcopes, zstats splitfunc = pe.Node(niu.Function(input_names=['in_files', 'splits'], - output_names=['copes', 'varcopes'], + output_names=['copes', 'varcopes', + 'zstats'], function=split_files), name='split_files') wf.connect(mergefunc, 'splits', splitfunc, 'splits') @@ -347,7 +355,7 @@ def get_subs(subject_id, conds, model_id, task_id): subs = [('_subject_id_%s_' % subject_id, '')] subs.append(('_model_id_%d' % model_id, 'model%03d' %model_id)) subs.append(('task_id_%d/' % task_id, '/task%03d_' % task_id)) - subs.append(('bold_dtype_mcf_mask_smooth_mask_gms_tempfilt_mean_warp_warp', + subs.append(('bold_dtype_mcf_mask_smooth_mask_gms_tempfilt_mean_warp', 'mean')) subs.append(('bold_dtype_mcf_mask_smooth_mask_gms_tempfilt_mean_flirt', 'affine')) @@ -358,10 +366,12 @@ def get_subs(subject_id, conds, model_id, task_id): subs.append(('_flameo%d/zstat1.' % i, 'zstat%02d.' % (i + 1))) subs.append(('_flameo%d/tstat1.' % i, 'tstat%02d.' % (i + 1))) subs.append(('_flameo%d/res4d.' % i, 'res4d%02d.' % (i + 1))) - subs.append(('_warpall%d/cope1_warp_warp.' % i, + subs.append(('_warpall%d/cope1_warp.' % i, 'cope%02d.' % (i + 1))) - subs.append(('_warpall%d/varcope1_warp_warp.' % (len(conds) + i), + subs.append(('_warpall%d/varcope1_warp.' % (len(conds) + i), 'varcope%02d.' % (i + 1))) + subs.append(('_warpall%d/zstat1_warp.' % (2 * len(conds) + i), + 'zstat%02d.' % (i + 1))) return subs subsgen = pe.Node(niu.Function(input_names=['subject_id', 'conds', @@ -388,6 +398,7 @@ def get_subs(subject_id, conds, model_id, task_id): wf.connect([(splitfunc, datasink, [('copes', 'copes.mni'), ('varcopes', 'varcopes.mni'), + ('zstats', 'zstats.mni'), ])]) wf.connect(registration, 'outputspec.transformed_mean', datasink, 'mean.mni') wf.connect(registration, 'outputspec.func2anat_transform', datasink, 'xfm.mean2anat') diff --git a/nipype/workflows/fmri/fsl/preprocess.py b/nipype/workflows/fmri/fsl/preprocess.py index 7c5902472a..b70c89b994 100644 --- a/nipype/workflows/fmri/fsl/preprocess.py +++ b/nipype/workflows/fmri/fsl/preprocess.py @@ -1104,7 +1104,9 @@ def create_reg_workflow(name='registration'): inputnode = pe.Node(interface=util.IdentityInterface(fields=['source_files', 'mean_image', 'anatomical_image', - 'target_image']), + 'target_image', + 'target_image_brain', + 'config_file']), name='inputspec') outputnode = pe.Node(interface=util.IdentityInterface(fields=['func2anat_transform', 'anat2target_transform', @@ -1154,15 +1156,20 @@ def create_reg_workflow(name='registration'): register.connect(inputnode, 'mean_image', mean2anatbbr, 'in_file') register.connect(binarize, 'out_file', mean2anatbbr, 'wm_seg') register.connect(inputnode, 'anatomical_image', mean2anatbbr, 'reference') - register.connect(mean2anat, 'out_matrix_file', mean2anatbbr, 'in_matrix_file') + register.connect(mean2anat, 'out_matrix_file', + mean2anatbbr, 'in_matrix_file') """ Calculate affine transform from anatomical to target """ anat2target_affine = pe.Node(fsl.FLIRT(), name='anat2target_linear') - register.connect(inputnode, 'anatomical_image', anat2target_affine, 'in_file') - register.connect(inputnode, 'target_image', anat2target_affine, 'reference') + anat2target_affine.inputs.searchr_x = [-180, 180] + anat2target_affine.inputs.searchr_y = [-180, 180] + anat2target_affine.inputs.searchr_z = [-180, 180] + register.connect(stripper, 'out_file', anat2target_affine, 'in_file') + register.connect(inputnode, 'target_image_brain', + anat2target_affine, 'reference') """ Calculate nonlinear transform from anatomical to target @@ -1172,8 +1179,10 @@ def create_reg_workflow(name='registration'): anat2target_nonlinear.inputs.fieldcoeff_file=True register.connect(anat2target_affine, 'out_matrix_file', anat2target_nonlinear, 'affine_file') - anat2target_nonlinear.inputs.warp_resolution = (8, 8, 8) - register.connect(inputnode, 'anatomical_image', anat2target_nonlinear, 'in_file') + register.connect(inputnode, 'anatomical_image', + anat2target_nonlinear, 'in_file') + register.connect(inputnode, 'config_file', + anat2target_nonlinear, 'config_file') register.connect(inputnode, 'target_image', anat2target_nonlinear, 'ref_file') @@ -1181,13 +1190,9 @@ def create_reg_workflow(name='registration'): Transform the mean image. First to anatomical and then to target """ - warp2anat = pe.Node(fsl.ApplyWarp(interp='spline'), name='warp2anat') - register.connect(inputnode, 'mean_image', warp2anat, 'in_file') - register.connect(inputnode, 'anatomical_image', warp2anat, 'ref_file') - register.connect(mean2anatbbr, 'out_matrix_file', warp2anat, 'premat') - - warpmean = warp2anat.clone(name='warpmean') - register.connect(warp2anat, 'out_file', warpmean, 'in_file') + warpmean = pe.Node(fsl.ApplyWarp(interp='spline'), name='warpmean') + register.connect(inputnode, 'mean_image', warpmean, 'in_file') + register.connect(mean2anatbbr, 'out_matrix_file', warpmean, 'premat') register.connect(inputnode, 'target_image', warpmean, 'ref_file') register.connect(anat2target_nonlinear, 'fieldcoeff_file', warpmean, 'field_file') @@ -1196,15 +1201,11 @@ def create_reg_workflow(name='registration'): Transform the remaining images. First to anatomical and then to target """ - warpall2anat = pe.MapNode(fsl.ApplyWarp(interp='spline'), - iterfield=['in_file'], - name='warpall2anat') - register.connect(inputnode, 'source_files', warpall2anat, 'in_file') - register.connect(inputnode, 'anatomical_image', warpall2anat, 'ref_file') - register.connect(mean2anatbbr, 'out_matrix_file', warpall2anat, 'premat') - - warpall = warpall2anat.clone(name='warpall') - register.connect(warpall2anat, 'out_file', warpall, 'in_file') + warpall = pe.MapNode(fsl.ApplyWarp(interp='spline'), + iterfield=['in_file'], + name='warpall') + register.connect(inputnode, 'source_files', warpall, 'in_file') + register.connect(mean2anatbbr, 'out_matrix_file', warpall, 'premat') register.connect(inputnode, 'target_image', warpall, 'ref_file') register.connect(anat2target_nonlinear, 'fieldcoeff_file', warpall, 'field_file')