From 1750e146b7be393439be408053f5ecab91f004d4 Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Mon, 14 Jul 2014 22:28:38 -0400 Subject: [PATCH 1/9] fix: test stripped brain image for FLIRT --- examples/fmri_openfmri.py | 1 + nipype/workflows/fmri/fsl/preprocess.py | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/examples/fmri_openfmri.py b/examples/fmri_openfmri.py index b812feedb1..84f8fe296b 100755 --- a/examples/fmri_openfmri.py +++ b/examples/fmri_openfmri.py @@ -305,6 +305,7 @@ 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') def merge_files(copes, varcopes): out_files = [] diff --git a/nipype/workflows/fmri/fsl/preprocess.py b/nipype/workflows/fmri/fsl/preprocess.py index 7c5902472a..36b41ba564 100644 --- a/nipype/workflows/fmri/fsl/preprocess.py +++ b/nipype/workflows/fmri/fsl/preprocess.py @@ -1104,7 +1104,8 @@ 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']), name='inputspec') outputnode = pe.Node(interface=util.IdentityInterface(fields=['func2anat_transform', 'anat2target_transform', @@ -1161,8 +1162,11 @@ def create_reg_workflow(name='registration'): """ 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.inputs.searchr_x = [-180, 180] + anat2target.inputs.searchr_y = [-180, 180] + anat2target.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 From 9c4e9adc32124f9ee32cee13a570ae95b23d6376 Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Mon, 14 Jul 2014 22:31:34 -0400 Subject: [PATCH 2/9] fix: node variable name --- nipype/workflows/fmri/fsl/preprocess.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/nipype/workflows/fmri/fsl/preprocess.py b/nipype/workflows/fmri/fsl/preprocess.py index 36b41ba564..96d44d6c98 100644 --- a/nipype/workflows/fmri/fsl/preprocess.py +++ b/nipype/workflows/fmri/fsl/preprocess.py @@ -1162,9 +1162,9 @@ def create_reg_workflow(name='registration'): """ anat2target_affine = pe.Node(fsl.FLIRT(), name='anat2target_linear') - anat2target.inputs.searchr_x = [-180, 180] - anat2target.inputs.searchr_y = [-180, 180] - anat2target.inputs.searchr_z = [-180, 180] + 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') From 0d72d3e5caf1948371610245b4c6de1e897a0406 Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Tue, 15 Jul 2014 08:06:54 -0400 Subject: [PATCH 3/9] fix: fnirt doesn't require two stages and added config file option --- examples/fmri_openfmri.py | 1 + nipype/workflows/fmri/fsl/preprocess.py | 38 ++++++++++++------------- 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/examples/fmri_openfmri.py b/examples/fmri_openfmri.py index 84f8fe296b..b65be635cb 100755 --- a/examples/fmri_openfmri.py +++ b/examples/fmri_openfmri.py @@ -306,6 +306,7 @@ def num_copes(files): 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): out_files = [] diff --git a/nipype/workflows/fmri/fsl/preprocess.py b/nipype/workflows/fmri/fsl/preprocess.py index 96d44d6c98..30d707f3be 100644 --- a/nipype/workflows/fmri/fsl/preprocess.py +++ b/nipype/workflows/fmri/fsl/preprocess.py @@ -1105,7 +1105,8 @@ def create_reg_workflow(name='registration'): 'mean_image', 'anatomical_image', 'target_image', - 'target_image_brain']), + 'target_image_brain', + 'config_file']), name='inputspec') outputnode = pe.Node(interface=util.IdentityInterface(fields=['func2anat_transform', 'anat2target_transform', @@ -1155,7 +1156,8 @@ 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 @@ -1166,7 +1168,8 @@ def create_reg_workflow(name='registration'): 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') + register.connect(inputnode, 'target_image_brain', + anat2target_affine, 'reference') """ Calculate nonlinear transform from anatomical to target @@ -1177,7 +1180,10 @@ def create_reg_workflow(name='registration'): 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') @@ -1185,13 +1191,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') @@ -1200,15 +1202,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') From 272c74ed1759c3f4b71cba68d43f82be60b67e03 Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Tue, 15 Jul 2014 08:12:13 -0400 Subject: [PATCH 4/9] fix: warp zstat files to MNI --- examples/fmri_openfmri.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/examples/fmri_openfmri.py b/examples/fmri_openfmri.py index b65be635cb..d7c7c03061 100755 --- a/examples/fmri_openfmri.py +++ b/examples/fmri_openfmri.py @@ -308,32 +308,38 @@ def num_copes(files): 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 + varcopes = in_files[splits[1]:splits[2]] + zstats = in_files[splits[2]:] + 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') @@ -390,6 +396,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') From 553a47d5ef41900a9b5386462b8674648d764cc9 Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Tue, 15 Jul 2014 08:56:07 -0400 Subject: [PATCH 5/9] fix: use splits properly --- examples/fmri_openfmri.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/fmri_openfmri.py b/examples/fmri_openfmri.py index d7c7c03061..10ae8f051c 100755 --- a/examples/fmri_openfmri.py +++ b/examples/fmri_openfmri.py @@ -332,9 +332,9 @@ def merge_files(copes, varcopes, 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]:splits[2]] - zstats = in_files[splits[2]:] + 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'], From bc8358a65a749149f17d83cda89c251c73510dc2 Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Tue, 15 Jul 2014 10:56:32 -0400 Subject: [PATCH 6/9] fix: remove warpres --- nipype/workflows/fmri/fsl/preprocess.py | 1 - 1 file changed, 1 deletion(-) diff --git a/nipype/workflows/fmri/fsl/preprocess.py b/nipype/workflows/fmri/fsl/preprocess.py index 30d707f3be..b70c89b994 100644 --- a/nipype/workflows/fmri/fsl/preprocess.py +++ b/nipype/workflows/fmri/fsl/preprocess.py @@ -1179,7 +1179,6 @@ 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, 'config_file', From 351bb3b191628b4d47b35d7d30a0cd3efe1fbb25 Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Tue, 15 Jul 2014 10:58:49 -0400 Subject: [PATCH 7/9] fix: change datasink subs --- examples/fmri_openfmri.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/examples/fmri_openfmri.py b/examples/fmri_openfmri.py index 10ae8f051c..abc86b65bb 100755 --- a/examples/fmri_openfmri.py +++ b/examples/fmri_openfmri.py @@ -355,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')) @@ -366,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.' % i, + 'zstat%02d.' % (i + 1))) return subs subsgen = pe.Node(niu.Function(input_names=['subject_id', 'conds', From bfdb6158a6e1e6436f23ad93aaa78511525d5ea1 Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Tue, 15 Jul 2014 12:55:53 -0400 Subject: [PATCH 8/9] fix: index of zstats --- examples/fmri_openfmri.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/fmri_openfmri.py b/examples/fmri_openfmri.py index abc86b65bb..3f7ee4e424 100755 --- a/examples/fmri_openfmri.py +++ b/examples/fmri_openfmri.py @@ -370,7 +370,7 @@ def get_subs(subject_id, conds, model_id, task_id): 'cope%02d.' % (i + 1))) subs.append(('_warpall%d/varcope1_warp.' % (len(conds) + i), 'varcope%02d.' % (i + 1))) - subs.append(('_warpall%d/zstat1_warp.' % i, + subs.append(('_warpall%d/zstat1_warp.' % (2 * len(conds) + i), 'zstat%02d.' % (i + 1))) return subs From c2ef8077031a0893353646f22591c00a77446333 Mon Sep 17 00:00:00 2001 From: Satrajit Ghosh Date: Wed, 16 Jul 2014 21:49:43 -0400 Subject: [PATCH 9/9] updated CHANGES --- CHANGES | 1 + 1 file changed, 1 insertion(+) 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) ============