def flirt_anatomical_linear_registration(workflow, resource_pool, config): # resource pool should have: # anatomical_brain import os import sys import nipype.interfaces.io as nio import nipype.pipeline.engine as pe import nipype.interfaces.utility as util import nipype.interfaces.fsl as fsl from workflow_utils import check_input_resources, \ check_config_settings check_config_settings(config, "template_brain_for_anat") if "anatomical_brain" not in resource_pool.keys(): from anatomical_preproc import anatomical_skullstrip_workflow workflow, resource_pool = \ anatomical_skullstrip_workflow(workflow, resource_pool, config) #check_input_resources(resource_pool, "anatomical_brain") calc_flirt_warp = pe.Node(interface=fsl.FLIRT(), name='calc_flirt_warp') calc_flirt_warp.inputs.cost = 'corratio' if len(resource_pool["anatomical_brain"]) == 2: node, out_file = resource_pool["anatomical_brain"] workflow.connect(node, out_file, calc_flirt_warp, 'in_file') else: calc_flirt_warp.inputs.in_file = resource_pool["anatomical_brain"] calc_flirt_warp.inputs.reference = config["template_brain_for_anat"] resource_pool["flirt_affine_xfm"] = (calc_flirt_warp, 'out_matrix_file') resource_pool["flirt_linear_warped_image"] = (calc_flirt_warp, 'out_file') return workflow, resource_pool
def flirt_anatomical_linear_registration(workflow, resource_pool, config): # resource pool should have: # anatomical_brain import os import sys import nipype.interfaces.io as nio import nipype.pipeline.engine as pe import nipype.interfaces.utility as util import nipype.interfaces.fsl as fsl from workflow_utils import check_input_resources, \ check_config_settings from nipype.interfaces.fsl.base import Info if "template_brain_for_anat" not in config: config["template_brain_for_anat"] = Info.standard_image( "MNI152_T1_2mm_brain.nii.gz") check_config_settings(config, "template_brain_for_anat") if "anatomical_brain" not in resource_pool.keys(): from anatomical_preproc import anatomical_skullstrip_workflow workflow, resource_pool = \ anatomical_skullstrip_workflow(workflow, resource_pool, config) #check_input_resources(resource_pool, "anatomical_brain") calc_flirt_warp = pe.Node(interface=fsl.FLIRT(), name='calc_flirt_warp') calc_flirt_warp.inputs.cost = 'corratio' if len(resource_pool["anatomical_brain"]) == 2: node, out_file = resource_pool["anatomical_brain"] workflow.connect(node, out_file, calc_flirt_warp, 'in_file') else: calc_flirt_warp.inputs.in_file = resource_pool["anatomical_brain"] calc_flirt_warp.inputs.reference = config["template_brain_for_anat"] resource_pool["flirt_affine_xfm"] = (calc_flirt_warp, 'out_matrix_file') resource_pool["flirt_linear_warped_image"] = (calc_flirt_warp, 'out_file') return workflow, resource_pool
def func_motion_correct_workflow(workflow, resource_pool, config): # resource pool should have: # functional_scan import os import sys import nipype.interfaces.io as nio import nipype.pipeline.engine as pe import nipype.interfaces.utility as util import nipype.interfaces.fsl.maths as fsl from nipype.interfaces.afni import preprocess from workflow_utils import check_input_resources, \ check_config_settings check_input_resources(resource_pool, "functional_scan") check_config_settings(config, "start_idx") check_config_settings(config, "stop_idx") check_config_settings(config, "slice_timing_correction") func_get_idx = pe.Node(util.Function( input_names=['in_files', 'stop_idx', 'start_idx'], output_names=['stopidx', 'startidx'], function=get_idx), name='func_get_idx') func_get_idx.inputs.in_files = resource_pool["functional_scan"] func_get_idx.inputs.start_idx = config["start_idx"] func_get_idx.inputs.stop_idx = config["stop_idx"] func_drop_trs = pe.Node(interface=preprocess.Calc(), name='func_drop_trs') func_drop_trs.inputs.in_file_a = resource_pool["functional_scan"] func_drop_trs.inputs.expr = 'a' func_drop_trs.inputs.outputtype = 'NIFTI_GZ' workflow.connect(func_get_idx, 'startidx', func_drop_trs, 'start_idx') workflow.connect(func_get_idx, 'stopidx', func_drop_trs, 'stop_idx') #workflow.connect(func_drop_trs, 'out_file', # outputNode, 'drop_tr') func_slice_timing_correction = pe.Node(interface=preprocess.TShift(), name='func_slice_time_correction') func_slice_timing_correction.inputs.outputtype = 'NIFTI_GZ' func_deoblique = pe.Node(interface=preprocess.Refit(), name='func_deoblique') func_deoblique.inputs.deoblique = True if config["slice_timing_correction"] == True: workflow.connect(func_drop_trs, 'out_file', func_slice_timing_correction, 'in_file') workflow.connect(func_slice_timing_correction, 'out_file', func_deoblique, 'in_file') else: workflow.connect(func_drop_trs, 'out_file', func_deoblique, 'in_file') func_reorient = pe.Node(interface=preprocess.Resample(), name='func_reorient') func_reorient.inputs.orientation = 'RPI' func_reorient.inputs.outputtype = 'NIFTI_GZ' workflow.connect(func_deoblique, 'out_file', func_reorient, 'in_file') func_get_mean_RPI = pe.Node(interface=preprocess.TStat(), name='func_get_mean_RPI') func_get_mean_RPI.inputs.options = '-mean' func_get_mean_RPI.inputs.outputtype = 'NIFTI_GZ' workflow.connect(func_reorient, 'out_file', func_get_mean_RPI, 'in_file') # calculate motion parameters func_motion_correct = pe.Node(interface=preprocess.Volreg(), name='func_motion_correct') func_motion_correct.inputs.args = '-Fourier -twopass' func_motion_correct.inputs.zpad = 4 func_motion_correct.inputs.outputtype = 'NIFTI_GZ' workflow.connect(func_reorient, 'out_file', func_motion_correct, 'in_file') workflow.connect(func_get_mean_RPI, 'out_file', func_motion_correct, 'basefile') func_get_mean_motion = func_get_mean_RPI.clone('func_get_mean_motion') workflow.connect(func_motion_correct, 'out_file', func_get_mean_motion, 'in_file') func_motion_correct_A = func_motion_correct.clone('func_motion_correct_A') func_motion_correct_A.inputs.md1d_file = 'max_displacement.1D' workflow.connect(func_reorient, 'out_file', func_motion_correct_A, 'in_file') workflow.connect(func_get_mean_motion, 'out_file', func_motion_correct_A, 'basefile') resource_pool["func_motion_correct"] = (func_motion_correct_A, 'out_file') resource_pool["coordinate_transformation"] = \ (func_motion_correct_A, 'oned_matrix_save') return workflow, resource_pool
def qap_mask_workflow(workflow, resource_pool, config): import os import sys import nipype.interfaces.io as nio import nipype.pipeline.engine as pe import nipype.interfaces.utility as util import nipype.interfaces.fsl.maths as fsl from qap_workflows_utils import select_thresh, slice_head_mask from workflow_utils import check_input_resources, check_config_settings # check_input_resources(resource_pool, "anatomical_reorient") # check_input_resources(resource_pool, "ants_affine_xfm") check_config_settings(config, "template_skull_for_anat") if "flirt_affine_xfm" not in resource_pool.keys(): from anatomical_preproc import flirt_anatomical_linear_registration workflow, resource_pool = flirt_anatomical_linear_registration(workflow, resource_pool, config) if "anatomical_reorient" not in resource_pool.keys(): from anatomical_preproc import anatomical_reorient_workflow workflow, resource_pool = anatomical_reorient_workflow(workflow, resource_pool, config) select_thresh = pe.Node( util.Function(input_names=["input_skull"], output_names=["thresh_out"], function=select_thresh), name="qap_headmask_select_thresh", iterfield=["input_skull"], ) mask_skull = pe.Node(interface=fsl.Threshold(), name="qap_headmask_thresh") mask_skull.inputs.args = "-bin" dilate_node = pe.Node(interface=fsl.MathsCommand(), name="qap_headmask_dilate") dilate_node.inputs.args = "-dilM -dilM -dilM -dilM -dilM -dilM" erode_node = pe.Node(interface=fsl.MathsCommand(), name="qap_headmask_erode") erode_node.inputs.args = "-eroF -eroF -eroF -eroF -eroF -eroF" slice_head_mask = pe.Node( util.Function( input_names=["infile", "transform", "standard"], output_names=["outfile_path"], function=slice_head_mask ), name="qap_headmask_slice_head_mask", ) combine_masks = pe.Node(interface=fsl.BinaryMaths(), name="qap_headmask_combine_masks") combine_masks.inputs.operation = "add" combine_masks.inputs.args = "-bin" if len(resource_pool["anatomical_reorient"]) == 2: node, out_file = resource_pool["anatomical_reorient"] workflow.connect(node, out_file, select_thresh, "input_skull") workflow.connect(node, out_file, mask_skull, "in_file") # workflow.connect(node, out_file, convert_fsl_xfm, 'infile') workflow.connect(node, out_file, slice_head_mask, "infile") else: select_thresh.inputs.input_skull = resource_pool["anatomical_reorient"] mask_skull.inputs.in_file = resource_pool["anatomical_reorient"] # convert_fsl_xfm.inputs.infile = \ # resource_pool["anatomical_reorient"] slice_head_mask.inputs.infile = resource_pool["anatomical_reorient"] if len(resource_pool["flirt_affine_xfm"]) == 2: node, out_file = resource_pool["flirt_affine_xfm"] workflow.connect(node, out_file, slice_head_mask, "transform") else: slice_head_mask.inputs.transform = resource_pool["flirt_affine_xfm"] # convert_fsl_xfm.inputs.standard = config["template_skull_for_anat"] slice_head_mask.inputs.standard = config["template_skull_for_anat"] workflow.connect(select_thresh, "thresh_out", mask_skull, "thresh") # workflow.connect(convert_fsl_xfm, 'converted_xfm', \ # slice_head_mask, 'transform') workflow.connect(mask_skull, "out_file", dilate_node, "in_file") workflow.connect(dilate_node, "out_file", erode_node, "in_file") workflow.connect(erode_node, "out_file", combine_masks, "in_file") workflow.connect(slice_head_mask, "outfile_path", combine_masks, "operand_file") resource_pool["qap_head_mask"] = (combine_masks, "out_file") return workflow, resource_pool
def qap_mask_workflow(workflow, resource_pool, config): import os import sys import nipype.interfaces.io as nio import nipype.pipeline.engine as pe import nipype.interfaces.utility as niu import nipype.interfaces.fsl.maths as fsl from nipype.interfaces.fsl.base import Info from qap_workflows_utils import select_thresh, slice_head_mask from workflow_utils import check_input_resources, check_config_settings # check_input_resources(resource_pool, 'anatomical_reorient') # check_input_resources(resource_pool, 'ants_affine_xfm') if "template_skull_for_anat" not in config: config["template_skull_for_anat"] = Info.standard_image("MNI152_T1_2mm.nii.gz") check_config_settings(config, "template_skull_for_anat") if "flirt_affine_xfm" not in resource_pool.keys(): from anatomical_preproc import flirt_anatomical_linear_registration workflow, resource_pool = flirt_anatomical_linear_registration(workflow, resource_pool, config) if "anatomical_reorient" not in resource_pool.keys(): from anatomical_preproc import anatomical_reorient_workflow workflow, resource_pool = anatomical_reorient_workflow(workflow, resource_pool, config) select_thresh = pe.Node( niu.Function(input_names=["input_skull"], output_names=["thresh_out"], function=select_thresh), name="qap_headmask_select_thresh", iterfield=["input_skull"], ) mask_skull = pe.Node(fsl.Threshold(args="-bin"), name="qap_headmask_thresh") dilate_node = pe.Node(fsl.MathsCommand(args="-dilM -dilM -dilM -dilM -dilM -dilM"), name="qap_headmask_dilate") erode_node = pe.Node(fsl.MathsCommand(args="-eroF -eroF -eroF -eroF -eroF -eroF"), name="qap_headmask_erode") slice_head_mask = pe.Node( niu.Function( input_names=["infile", "transform", "standard"], output_names=["outfile_path"], function=slice_head_mask ), name="qap_headmask_slice_head_mask", ) combine_masks = pe.Node(fsl.BinaryMaths(operation="add", args="-bin"), name="qap_headmask_combine_masks") if len(resource_pool["anatomical_reorient"]) == 2: node, out_file = resource_pool["anatomical_reorient"] workflow.connect( [ (node, select_thresh, [(out_file, "input_skull")]), (node, mask_skull, [(out_file, "in_file")]), (node, slice_head_mask, [(out_file, "infile")]), ] ) else: select_thresh.inputs.input_skull = resource_pool["anatomical_reorient"] mask_skull.inputs.in_file = resource_pool["anatomical_reorient"] # convert_fsl_xfm.inputs.infile = # resource_pool['anatomical_reorient'] slice_head_mask.inputs.infile = resource_pool["anatomical_reorient"] if len(resource_pool["flirt_affine_xfm"]) == 2: node, out_file = resource_pool["flirt_affine_xfm"] workflow.connect(node, out_file, slice_head_mask, "transform") else: slice_head_mask.inputs.transform = resource_pool["flirt_affine_xfm"] # convert_fsl_xfm.inputs.standard = config['template_skull_for_anat'] slice_head_mask.inputs.standard = config["template_skull_for_anat"] workflow.connect( [ (select_thresh, mask_skull, [("thresh_out", "thresh")]), # (convert_fsl_xfm, slice_head_mask, [('converted_xfm', 'transform')]) (mask_skull, dilate_node, [("out_file", "in_file")]), (dilate_node, erode_node, [("out_file", "in_file")]), (erode_node, combine_masks, [("out_file", "in_file")]), (slice_head_mask, combine_masks, [("outfile_path", "operand_file")]), ] ) resource_pool["qap_head_mask"] = (combine_masks, "out_file") return workflow, resource_pool
def ants_anatomical_linear_registration(workflow, resource_pool, config): # resource pool should have: # anatomical_brain # linear ANTS registration takes roughly 2.5 minutes per subject running # on one core of an Intel Core i7-4800MQ CPU @ 2.70GHz import os import sys import nipype.interfaces.io as nio import nipype.pipeline.engine as pe import nipype.interfaces.utility as util from anatomical_preproc_utils import ants_lin_reg, \ separate_warps_list from workflow_utils import check_input_resources, \ check_config_settings from nipype.interfaces.fsl.base import Info if "template_brain_for_anat" not in config: config["template_brain_for_anat"] = Info.standard_image( "MNI152_T1_2mm_brain.nii.gz") check_config_settings(config, "template_brain_for_anat") if "anatomical_brain" not in resource_pool.keys(): from anatomical_preproc import anatomical_skullstrip_workflow workflow, resource_pool = \ anatomical_skullstrip_workflow(workflow, resource_pool, config) #check_input_resources(resource_pool, "anatomical_brain") calc_ants_warp = pe.Node(interface=util.Function( input_names=['anatomical_brain', 'reference_brain'], output_names=['warp_list', 'warped_image'], function=ants_lin_reg), name='calc_ants_linear_warp') select_forward_initial = pe.Node(util.Function( input_names=['warp_list', 'selection'], output_names=['selected_warp'], function=separate_warps_list), name='select_forward_initial') select_forward_initial.inputs.selection = "Initial" select_forward_rigid = pe.Node(util.Function( input_names=['warp_list', 'selection'], output_names=['selected_warp'], function=separate_warps_list), name='select_forward_rigid') select_forward_rigid.inputs.selection = "Rigid" select_forward_affine = pe.Node(util.Function( input_names=['warp_list', 'selection'], output_names=['selected_warp'], function=separate_warps_list), name='select_forward_affine') select_forward_affine.inputs.selection = "Affine" if len(resource_pool["anatomical_brain"]) == 2: node, out_file = resource_pool["anatomical_brain"] workflow.connect(node, out_file, calc_ants_warp, 'anatomical_brain') else: calc_ants_warp.inputs.anatomical_brain = \ resource_pool["anatomical_brain"] calc_ants_warp.inputs.reference_brain = config["template_brain_for_anat"] workflow.connect(calc_ants_warp, 'warp_list', select_forward_initial, 'warp_list') workflow.connect(calc_ants_warp, 'warp_list', select_forward_rigid, 'warp_list') workflow.connect(calc_ants_warp, 'warp_list', select_forward_affine, 'warp_list') resource_pool["ants_initial_xfm"] = \ (select_forward_initial, 'selected_warp') resource_pool["ants_rigid_xfm"] = (select_forward_rigid, 'selected_warp') resource_pool["ants_affine_xfm"] = \ (select_forward_affine, 'selected_warp') resource_pool["ants_linear_warped_image"] = \ (calc_ants_warp, 'warped_image') return workflow, resource_pool
def ants_anatomical_linear_registration(workflow, resource_pool, config): # resource pool should have: # anatomical_brain # linear ANTS registration takes roughly 2.5 minutes per subject running # on one core of an Intel Core i7-4800MQ CPU @ 2.70GHz import os import sys import nipype.interfaces.io as nio import nipype.pipeline.engine as pe import nipype.interfaces.utility as util from anatomical_preproc_utils import ants_lin_reg, \ separate_warps_list from workflow_utils import check_input_resources, \ check_config_settings check_config_settings(config, "template_brain_for_anat") if "anatomical_brain" not in resource_pool.keys(): from anatomical_preproc import anatomical_skullstrip_workflow workflow, resource_pool = \ anatomical_skullstrip_workflow(workflow, resource_pool, config) #check_input_resources(resource_pool, "anatomical_brain") calc_ants_warp = pe.Node(interface=util.Function( input_names=['anatomical_brain', 'reference_brain'], output_names=['warp_list', 'warped_image'], function=ants_lin_reg), name='calc_ants_linear_warp') select_forward_initial = pe.Node(util.Function(input_names=['warp_list', 'selection'], output_names=['selected_warp'], function=separate_warps_list), name='select_forward_initial') select_forward_initial.inputs.selection = "Initial" select_forward_rigid = pe.Node(util.Function(input_names=['warp_list', 'selection'], output_names=['selected_warp'], function=separate_warps_list), name='select_forward_rigid') select_forward_rigid.inputs.selection = "Rigid" select_forward_affine = pe.Node(util.Function(input_names=['warp_list', 'selection'], output_names=['selected_warp'], function=separate_warps_list), name='select_forward_affine') select_forward_affine.inputs.selection = "Affine" if len(resource_pool["anatomical_brain"]) == 2: node, out_file = resource_pool["anatomical_brain"] workflow.connect(node, out_file, calc_ants_warp, 'anatomical_brain') else: calc_ants_warp.inputs.anatomical_brain = \ resource_pool["anatomical_brain"] calc_ants_warp.inputs.reference_brain = config["template_brain_for_anat"] workflow.connect(calc_ants_warp, 'warp_list', select_forward_initial, 'warp_list') workflow.connect(calc_ants_warp, 'warp_list', select_forward_rigid, 'warp_list') workflow.connect(calc_ants_warp, 'warp_list', select_forward_affine, 'warp_list') resource_pool["ants_initial_xfm"] = \ (select_forward_initial, 'selected_warp') resource_pool["ants_rigid_xfm"] = (select_forward_rigid, 'selected_warp') resource_pool["ants_affine_xfm"] = \ (select_forward_affine, 'selected_warp') resource_pool["ants_linear_warped_image"] = \ (calc_ants_warp, 'warped_image') return workflow, resource_pool
def qap_mask_workflow(workflow, resource_pool, config): import os import sys import nipype.interfaces.io as nio import nipype.pipeline.engine as pe import nipype.interfaces.utility as niu import nipype.interfaces.fsl.maths as fsl from nipype.interfaces.fsl.base import Info from qap_workflows_utils import select_thresh, \ slice_head_mask from workflow_utils import check_input_resources, \ check_config_settings # check_input_resources(resource_pool, 'anatomical_reorient') # check_input_resources(resource_pool, 'ants_affine_xfm') if 'template_skull_for_anat' not in config: config['template_skull_for_anat'] = Info.standard_image( 'MNI152_T1_2mm.nii.gz') check_config_settings(config, 'template_skull_for_anat') if 'flirt_affine_xfm' not in resource_pool.keys(): from anatomical_preproc import flirt_anatomical_linear_registration workflow, resource_pool = \ flirt_anatomical_linear_registration(workflow, resource_pool, config) if 'anatomical_reorient' not in resource_pool.keys(): from anatomical_preproc import anatomical_reorient_workflow workflow, resource_pool = \ anatomical_reorient_workflow(workflow, resource_pool, config) select_thresh = pe.Node(niu.Function(input_names=['input_skull'], output_names=['thresh_out'], function=select_thresh), name='qap_headmask_select_thresh', iterfield=['input_skull']) mask_skull = pe.Node(fsl.Threshold(args='-bin'), name='qap_headmask_thresh') dilate_node = pe.Node( fsl.MathsCommand(args='-dilM -dilM -dilM -dilM -dilM -dilM'), name='qap_headmask_dilate') erode_node = pe.Node( fsl.MathsCommand(args='-eroF -eroF -eroF -eroF -eroF -eroF'), name='qap_headmask_erode') slice_head_mask = pe.Node(niu.Function( input_names=['infile', 'transform', 'standard'], output_names=['outfile_path'], function=slice_head_mask), name='qap_headmask_slice_head_mask') combine_masks = pe.Node(fsl.BinaryMaths(operation='add', args='-bin'), name='qap_headmask_combine_masks') if len(resource_pool['anatomical_reorient']) == 2: node, out_file = resource_pool['anatomical_reorient'] workflow.connect([(node, select_thresh, [(out_file, 'input_skull')]), (node, mask_skull, [(out_file, 'in_file')]), (node, slice_head_mask, [(out_file, 'infile')])]) else: select_thresh.inputs.input_skull = resource_pool['anatomical_reorient'] mask_skull.inputs.in_file = resource_pool['anatomical_reorient'] # convert_fsl_xfm.inputs.infile = # resource_pool['anatomical_reorient'] slice_head_mask.inputs.infile = resource_pool['anatomical_reorient'] if len(resource_pool['flirt_affine_xfm']) == 2: node, out_file = resource_pool['flirt_affine_xfm'] workflow.connect(node, out_file, slice_head_mask, 'transform') else: slice_head_mask.inputs.transform = resource_pool['flirt_affine_xfm'] # convert_fsl_xfm.inputs.standard = config['template_skull_for_anat'] slice_head_mask.inputs.standard = config['template_skull_for_anat'] workflow.connect([ (select_thresh, mask_skull, [('thresh_out', 'thresh')]), # (convert_fsl_xfm, slice_head_mask, [('converted_xfm', 'transform')]) (mask_skull, dilate_node, [('out_file', 'in_file')]), (dilate_node, erode_node, [('out_file', 'in_file')]), (erode_node, combine_masks, [('out_file', 'in_file')]), (slice_head_mask, combine_masks, [('outfile_path', 'operand_file')]) ]) resource_pool['qap_head_mask'] = (combine_masks, 'out_file') return workflow, resource_pool
def func_motion_correct_workflow(workflow, resource_pool, config): # resource pool should have: # functional_scan import os import sys import nipype.interfaces.io as nio import nipype.pipeline.engine as pe import nipype.interfaces.utility as util import nipype.interfaces.fsl.maths as fsl from nipype.interfaces.afni import preprocess from workflow_utils import check_input_resources, \ check_config_settings check_input_resources(resource_pool, "functional_scan") check_config_settings(config, "start_idx") check_config_settings(config, "stop_idx") check_config_settings(config, "slice_timing_correction") func_get_idx = pe.Node(util.Function(input_names=['in_files', 'stop_idx', 'start_idx'], output_names=['stopidx', 'startidx'], function=get_idx), name='func_get_idx') func_get_idx.inputs.in_files = resource_pool["functional_scan"] func_get_idx.inputs.start_idx = config["start_idx"] func_get_idx.inputs.stop_idx = config["stop_idx"] func_drop_trs = pe.Node(interface=preprocess.Calc(), name='func_drop_trs') func_drop_trs.inputs.in_file_a = resource_pool["functional_scan"] func_drop_trs.inputs.expr = 'a' func_drop_trs.inputs.outputtype = 'NIFTI_GZ' workflow.connect(func_get_idx, 'startidx', func_drop_trs, 'start_idx') workflow.connect(func_get_idx, 'stopidx', func_drop_trs, 'stop_idx') #workflow.connect(func_drop_trs, 'out_file', # outputNode, 'drop_tr') func_slice_timing_correction = pe.Node(interface=preprocess.TShift(), name='func_slice_time_correction') func_slice_timing_correction.inputs.outputtype = 'NIFTI_GZ' func_deoblique = pe.Node(interface=preprocess.Refit(), name='func_deoblique') func_deoblique.inputs.deoblique = True if config["slice_timing_correction"] == True: workflow.connect(func_drop_trs, 'out_file', func_slice_timing_correction,'in_file') workflow.connect(func_slice_timing_correction, 'out_file', func_deoblique, 'in_file') else: workflow.connect(func_drop_trs, 'out_file', func_deoblique, 'in_file') func_reorient = pe.Node(interface=preprocess.Resample(), name='func_reorient') func_reorient.inputs.orientation = 'RPI' func_reorient.inputs.outputtype = 'NIFTI_GZ' workflow.connect(func_deoblique, 'out_file', func_reorient, 'in_file') func_get_mean_RPI = pe.Node(interface=preprocess.TStat(), name='func_get_mean_RPI') func_get_mean_RPI.inputs.options = '-mean' func_get_mean_RPI.inputs.outputtype = 'NIFTI_GZ' workflow.connect(func_reorient, 'out_file', func_get_mean_RPI, 'in_file') # calculate motion parameters func_motion_correct = pe.Node(interface=preprocess.Volreg(), name='func_motion_correct') func_motion_correct.inputs.args = '-Fourier -twopass' func_motion_correct.inputs.zpad = 4 func_motion_correct.inputs.outputtype = 'NIFTI_GZ' workflow.connect(func_reorient, 'out_file', func_motion_correct, 'in_file') workflow.connect(func_get_mean_RPI, 'out_file', func_motion_correct, 'basefile') func_get_mean_motion = func_get_mean_RPI.clone('func_get_mean_motion') workflow.connect(func_motion_correct, 'out_file', func_get_mean_motion, 'in_file') func_motion_correct_A = func_motion_correct.clone('func_motion_correct_A') func_motion_correct_A.inputs.md1d_file = 'max_displacement.1D' workflow.connect(func_reorient, 'out_file', func_motion_correct_A, 'in_file') workflow.connect(func_get_mean_motion, 'out_file', func_motion_correct_A, 'basefile') resource_pool["func_motion_correct"] = (func_motion_correct_A, 'out_file') resource_pool["coordinate_transformation"] = \ (func_motion_correct_A, 'oned_matrix_save') return workflow, resource_pool
def ants_anatomical_linear_registration(workflow, resource_pool, config): # resource pool should have: # anatomical_brain # linear ANTS registration takes roughly 2.5 minutes per subject running # on one core of an Intel Core i7-4800MQ CPU @ 2.70GHz import os import sys import nipype.interfaces.io as nio import nipype.pipeline.engine as pe import nipype.interfaces.utility as util from anatomical_preproc_utils import ants_lin_reg, separate_warps_list from workflow_utils import check_input_resources, check_config_settings from nipype.interfaces.fsl.base import Info if "template_brain_for_anat" not in config: config["template_brain_for_anat"] = Info.standard_image("MNI152_T1_2mm_brain.nii.gz") check_config_settings(config, "template_brain_for_anat") if "anatomical_brain" not in resource_pool.keys(): from anatomical_preproc import anatomical_skullstrip_workflow workflow, resource_pool = anatomical_skullstrip_workflow(workflow, resource_pool, config) # check_input_resources(resource_pool, "anatomical_brain") calc_ants_warp = pe.Node( interface=util.Function( input_names=["anatomical_brain", "reference_brain"], output_names=["warp_list", "warped_image"], function=ants_lin_reg, ), name="calc_ants_linear_warp", ) select_forward_initial = pe.Node( util.Function( input_names=["warp_list", "selection"], output_names=["selected_warp"], function=separate_warps_list ), name="select_forward_initial", ) select_forward_initial.inputs.selection = "Initial" select_forward_rigid = pe.Node( util.Function( input_names=["warp_list", "selection"], output_names=["selected_warp"], function=separate_warps_list ), name="select_forward_rigid", ) select_forward_rigid.inputs.selection = "Rigid" select_forward_affine = pe.Node( util.Function( input_names=["warp_list", "selection"], output_names=["selected_warp"], function=separate_warps_list ), name="select_forward_affine", ) select_forward_affine.inputs.selection = "Affine" if len(resource_pool["anatomical_brain"]) == 2: node, out_file = resource_pool["anatomical_brain"] workflow.connect(node, out_file, calc_ants_warp, "anatomical_brain") else: calc_ants_warp.inputs.anatomical_brain = resource_pool["anatomical_brain"] calc_ants_warp.inputs.reference_brain = config["template_brain_for_anat"] workflow.connect(calc_ants_warp, "warp_list", select_forward_initial, "warp_list") workflow.connect(calc_ants_warp, "warp_list", select_forward_rigid, "warp_list") workflow.connect(calc_ants_warp, "warp_list", select_forward_affine, "warp_list") resource_pool["ants_initial_xfm"] = (select_forward_initial, "selected_warp") resource_pool["ants_rigid_xfm"] = (select_forward_rigid, "selected_warp") resource_pool["ants_affine_xfm"] = (select_forward_affine, "selected_warp") resource_pool["ants_linear_warped_image"] = (calc_ants_warp, "warped_image") return workflow, resource_pool