Skip to content

Commit 5fccc6f

Browse files
committed
enh: added transformation of individual copes and varcopes to standard space via anatomical image
1 parent 0b231ca commit 5fccc6f

File tree

2 files changed

+168
-2
lines changed

2 files changed

+168
-2
lines changed

nipype/workflows/fmri/fsl/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
from .preprocess import (create_susan_smooth, create_fsl_fs_preproc,
2-
create_parallelfeat_preproc, create_featreg_preproc)
2+
create_parallelfeat_preproc, create_featreg_preproc,
3+
create_reg_workflow)
34
from .estimate import create_modelfit_workflow, create_fixed_effects_flow

nipype/workflows/fmri/fsl/preprocess.py

Lines changed: 166 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import nipype.interfaces.fsl as fsl # fsl
55
import nipype.interfaces.utility as util # utility
66
import nipype.pipeline.engine as pe # pypeline engine
7+
import nipype.interfaces.freesurfer as fs # freesurfer
8+
import nipype.interfaces.spm as spm
79

810
from ...smri.freesurfer.utils import create_getmask_flow
911

@@ -483,7 +485,7 @@ def create_featreg_preproc(name='featpreproc', highpass=True, whichvol='middle')
483485

484486
motion_correct = pe.MapNode(interface=fsl.MCFLIRT(save_mats = True,
485487
save_plots = True,
486-
interpolation = 'sinc'),
488+
interpolation = 'spline'),
487489
name='realign',
488490
iterfield = ['in_file'])
489491
featpreproc.connect(img2float, 'out_file', motion_correct, 'in_file')
@@ -1067,3 +1069,166 @@ def create_fsl_fs_preproc(name='preproc', highpass=True, whichvol='middle'):
10671069

10681070
return featpreproc
10691071

1072+
def create_reg_workflow(name='registration'):
1073+
"""Create a FEAT preprocessing workflow together with freesurfer
1074+
1075+
Parameters
1076+
----------
1077+
1078+
::
1079+
1080+
name : name of workflow (default: 'registration')
1081+
1082+
Inputs::
1083+
1084+
inputspec.source_files : files (filename or list of filenames to register)
1085+
inputspec.mean_image : reference image to use
1086+
inputspec.anatomical_image : anatomical image to coregister to
1087+
inputspec.target_image : registration target
1088+
1089+
Outputs::
1090+
1091+
outputspec.func2anat_transform : FLIRT transform
1092+
outputspec.anat2target_transform : FLIRT+FNIRT transform
1093+
outputspec.transformed_files : transformed files in target space
1094+
outputspec.transformed_mean : mean image in target space
1095+
1096+
Example
1097+
-------
1098+
1099+
"""
1100+
1101+
register = pe.Workflow(name=name)
1102+
1103+
inputnode = pe.Node(interface=util.IdentityInterface(fields=['source_files',
1104+
'mean_image',
1105+
'anatomical_image',
1106+
'target_image']),
1107+
name='inputspec')
1108+
outputnode = pe.Node(interface=util.IdentityInterface(fields=['func2anat_transform',
1109+
'anat2target_transform',
1110+
'transformed_files',
1111+
'transformed_mean',
1112+
]),
1113+
name='outputspec')
1114+
1115+
"""
1116+
Estimate the tissue classes from the anatomical image. But use spm's segment
1117+
as FSL appears to be breaking.
1118+
"""
1119+
1120+
#fast = pe.Node(fsl.FAST(), name='fast')
1121+
#fast.config = {'execution': {'keep_unncessary_outputs': True}}
1122+
#register.connect(inputnode, 'anatomical_image', fast, 'in_files')
1123+
1124+
convert = pe.Node(fs.MRIConvert(out_type='nii'), name='convert')
1125+
register.connect(inputnode, 'anatomical_image', convert, 'in_file')
1126+
1127+
segment = pe.Node(spm.Segment(), name='segment')
1128+
segment.inputs.wm_output_type = [False, False, True]
1129+
segment.config = {'execution': {'keep_unnecessary_outputs': 'true'}}
1130+
register.connect(convert, 'out_file', segment, 'data')
1131+
1132+
"""
1133+
Binarize the segmentation
1134+
"""
1135+
1136+
binarize = pe.Node(fsl.ImageMaths(op_string='-nan -thr 0.5 -bin'),
1137+
name='binarize')
1138+
#pickindex = lambda x, i: x[i]
1139+
#register.connect(fast, ('partial_volume_files', pickindex, 1),
1140+
# binarize, 'in_file')
1141+
register.connect(segment, 'native_wm_image', binarize, 'in_file')
1142+
1143+
"""
1144+
Calculate rigid transform from mean image to anatomical image
1145+
"""
1146+
1147+
mean2anat = pe.Node(fsl.FLIRT(), name='mean2anat')
1148+
mean2anat.inputs.dof = 6
1149+
register.connect(inputnode, 'mean_image', mean2anat, 'in_file')
1150+
register.connect(inputnode, 'anatomical_image', mean2anat, 'reference')
1151+
1152+
"""
1153+
Now use bbr cost function to improve the transform
1154+
"""
1155+
1156+
mean2anatbbr = pe.Node(fsl.FLIRT(), name='mean2anatbbr')
1157+
mean2anatbbr.inputs.dof = 6
1158+
mean2anatbbr.inputs.cost = 'bbr'
1159+
mean2anatbbr.inputs.schedule = '/usr/local/fsl/etc/flirtsch/bbr.sch'
1160+
register.connect(inputnode, 'mean_image', mean2anatbbr, 'in_file')
1161+
register.connect(binarize, 'out_file', mean2anatbbr, 'wm_seg')
1162+
register.connect(inputnode, 'anatomical_image', mean2anatbbr, 'reference')
1163+
register.connect(mean2anat, 'out_matrix_file', mean2anatbbr, 'in_matrix_file')
1164+
1165+
"""
1166+
Calculate affine transform from anatomical to target
1167+
"""
1168+
1169+
anat2target_affine = pe.Node(fsl.FLIRT(), name='anat2target_linear')
1170+
register.connect(inputnode, 'anatomical_image', anat2target_affine, 'in_file')
1171+
register.connect(inputnode, 'target_image', anat2target_affine, 'reference')
1172+
1173+
"""
1174+
Calculate nonlinear transform from anatomical to target
1175+
"""
1176+
1177+
anat2target_nonlinear = pe.Node(fsl.FNIRT(), name='anat2target_nonlinear')
1178+
register.connect(anat2target_affine, 'out_matrix_file',
1179+
anat2target_nonlinear, 'affine_file')
1180+
#anat2target_nonlinear.inputs.in_fwhm = [8, 4, 2, 2]
1181+
#anat2target_nonlinear.inputs.subsampling_scheme = [4, 2, 1, 1]
1182+
anat2target_nonlinear.inputs.warp_resolution = (8, 8, 8)
1183+
register.connect(inputnode, 'anatomical_image', anat2target_nonlinear, 'in_file')
1184+
register.connect(inputnode, 'target_image',
1185+
anat2target_nonlinear, 'ref_file')
1186+
1187+
"""
1188+
Transform the mean image. First to anatomical and then to target
1189+
"""
1190+
1191+
warp2anat = pe.Node(fsl.ApplyWarp(interp='spline'), name='warp2anat')
1192+
register.connect(inputnode, 'mean_image', warp2anat, 'in_file')
1193+
register.connect(inputnode, 'anatomical_image', warp2anat, 'ref_file')
1194+
register.connect(mean2anatbbr, 'out_matrix_file', warp2anat, 'premat')
1195+
1196+
warpmean = pe.Node(fsl.ApplyWarp(interp='spline'), name='warpmean')
1197+
register.connect(warp2anat, 'out_file', warpmean, 'in_file')
1198+
register.connect(inputnode, 'target_image', warpmean, 'ref_file')
1199+
register.connect(anat2target_affine, 'out_matrix_file', warpmean, 'premat')
1200+
register.connect(anat2target_nonlinear, 'field_file',
1201+
warpmean, 'field_file')
1202+
1203+
"""
1204+
Transform the remaining images. First to anatomical and then to target
1205+
"""
1206+
1207+
warpall2anat = pe.MapNode(fsl.ApplyWarp(interp='spline'),
1208+
iterfield=['in_file'],
1209+
name='warpall2anat')
1210+
register.connect(inputnode, 'source_files', warpall2anat, 'in_file')
1211+
register.connect(inputnode, 'anatomical_image', warpall2anat, 'ref_file')
1212+
register.connect(mean2anatbbr, 'out_matrix_file', warpall2anat, 'premat')
1213+
1214+
warpall = pe.MapNode(fsl.ApplyWarp(interp='spline'), name='warpall',
1215+
iterfield=['in_file'])
1216+
register.connect(warpall2anat, 'out_file', warpall, 'in_file')
1217+
register.connect(inputnode, 'target_image', warpall, 'ref_file')
1218+
register.connect(anat2target_affine, 'out_matrix_file', warpall, 'premat')
1219+
register.connect(anat2target_nonlinear, 'field_file',
1220+
warpall, 'field_file')
1221+
1222+
"""
1223+
Assign all the output files
1224+
"""
1225+
1226+
register.connect(warpmean, 'out_file', outputnode, 'transformed_mean')
1227+
register.connect(warpall, 'out_file', outputnode, 'transformed_files')
1228+
register.connect(mean2anatbbr, 'out_matrix_file',
1229+
outputnode, 'func2anat_transform')
1230+
register.connect(anat2target_nonlinear, 'field_file',
1231+
outputnode, 'anat2target_transform')
1232+
1233+
return register
1234+

0 commit comments

Comments
 (0)