|
4 | 4 | import nipype.interfaces.fsl as fsl # fsl
|
5 | 5 | import nipype.interfaces.utility as util # utility
|
6 | 6 | import nipype.pipeline.engine as pe # pypeline engine
|
| 7 | +import nipype.interfaces.freesurfer as fs # freesurfer |
| 8 | +import nipype.interfaces.spm as spm |
7 | 9 |
|
8 | 10 | from ...smri.freesurfer.utils import create_getmask_flow
|
9 | 11 |
|
@@ -483,7 +485,7 @@ def create_featreg_preproc(name='featpreproc', highpass=True, whichvol='middle')
|
483 | 485 |
|
484 | 486 | motion_correct = pe.MapNode(interface=fsl.MCFLIRT(save_mats = True,
|
485 | 487 | save_plots = True,
|
486 |
| - interpolation = 'sinc'), |
| 488 | + interpolation = 'spline'), |
487 | 489 | name='realign',
|
488 | 490 | iterfield = ['in_file'])
|
489 | 491 | featpreproc.connect(img2float, 'out_file', motion_correct, 'in_file')
|
@@ -1067,3 +1069,166 @@ def create_fsl_fs_preproc(name='preproc', highpass=True, whichvol='middle'):
|
1067 | 1069 |
|
1068 | 1070 | return featpreproc
|
1069 | 1071 |
|
| 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