Source code for dmriprep.workflows.fieldmap.pepolar

#!/usr/bin/env python

from nipype.pipeline import engine as pe
from nipype.interfaces import fsl, utility as niu


[docs]def init_pepolar_wf(subject_id, dwi_meta, epi_fmaps, output_resolution): dwi_file_pe = dwi_meta['PhaseEncodingDirection'] file2dir = dict() usable_fieldmaps_matching_pe = [] usable_fieldmaps_opposite_pe = [] for fmap, pe_dir in epi_fmaps: if pe_dir == dwi_file_pe: usable_fieldmaps_matching_pe.append(fmap) file2dir[fmap] = pe_dir elif pe_dir[0] == dwi_file_pe[0]: usable_fieldmaps_opposite_pe.append(fmap) file2dir[fmap] = pe_dir if not usable_fieldmaps_opposite_pe: raise Exception( 'None of the discovered fieldmaps for ' 'participant {} has the right phase ' 'encoding direction'.format(subject_id) ) wf = pe.Workflow(name='pepolar_wf') inputnode = pe.Node( niu.IdentityInterface(fields=['b0_stripped']), name='inputnode' ) outputnode = pe.Node( niu.IdentityInterface( fields=['out_topup', 'out_movpar', 'out_fmap', 'out_enc_file'] ), name='outputnode', ) topup_wf = init_topup_wf(output_resolution) topup_wf.inputs.inputnode.altepi_file = usable_fieldmaps_opposite_pe[0] wf.add_nodes([inputnode]) if not usable_fieldmaps_matching_pe: wf.connect( [(inputnode, topup_wf, [('b0_stripped', 'inputnode.epi_file')])] ) else: topup_wf.inputs.inputnode.epi_file = usable_fieldmaps_matching_pe[0] epi_list = [ topup_wf.inputs.inputnode.epi_file, topup_wf.inputs.inputnode.altepi_file, ] dir_map = { 'i': 'x', 'i-': 'x-', 'j': 'y', 'j-': 'y-', 'k': 'z', 'k-': 'z-', } topup_wf.inputs.inputnode.encoding_directions = [ dir_map[file2dir[file]] for file in epi_list ] wf.connect( [ ( topup_wf, outputnode, [ ('outputnode.out_fmap', 'out_fmap'), ('outputnode.out_movpar', 'out_movpar'), ('outputnode.out_base', 'out_topup'), ('outputnode.out_enc_file', 'out_enc_file'), ], ) ] ) return wf
[docs]def init_synb0_wf(subject_id, dwi_meta, synb0, output_resolution): dwi_file_pe = dwi_meta['PhaseEncodingDirection'] file2dir = dict() usable_fieldmaps_matching_pe = [] usable_fieldmaps_opposite_pe = [] wf = pe.Workflow(name='synb0_wf') inputnode = pe.Node( niu.IdentityInterface(fields=['b0_stripped']), name='inputnode' ) outputnode = pe.Node( niu.IdentityInterface( fields=['out_topup', 'out_movpar', 'out_fmap', 'out_enc_file'] ), name='outputnode', ) topup_wf = init_topup_wf(output_resolution) topup_wf.inputs.inputnode.altepi_file = synb0 wf.add_nodes([inputnode]) wf.connect( [(inputnode, topup_wf, [('b0_stripped', 'inputnode.epi_file')])] ) topup_wf.inputs.inputnode.acqp = '/scratch/smansour/synb0_acqp.txt' wf.connect( [ ( topup_wf, outputnode, [ ('outputnode.out_fmap', 'out_fmap'), ('outputnode.out_movpar', 'out_movpar'), ('outputnode.out_base', 'out_topup'), ], ) ] ) return wf
[docs]def init_topup_wf(output_resolution, use_acqp=False): from ...interfaces import mrtrix3 wf = pe.Workflow(name='topup_wf') inputnode = pe.Node( niu.IdentityInterface( fields=[ 'epi_file', 'altepi_file', 'encoding_directions', 'topup_name', 'acqp', ] ), name='inputnode', ) inputnode.inputs.topup_name = 'topup_base' epi_flirt = pe.Node(fsl.FLIRT(), name='epi_flirt') outputnode = pe.Node( niu.IdentityInterface( fields=['out_fmap', 'out_movpar', 'out_base', 'out_enc_file'] ), name='outputnode', ) list_merge = pe.Node(niu.Merge(numinputs=2), name='list_merge') merge = pe.Node(fsl.Merge(dimension='t'), name='mergeAPPA') # Resize (make optional) resize = pe.Node(mrtrix3.MRResize(), name='epi_resize') if output_resolution: resize.inputs.voxel_size = output_resolution topup = pe.Node(fsl.TOPUP(), name='topup') get_base_movpar = lambda x: x.split('_movpar.txt')[0] if use_acqp: wf.connect([(inputnode, topup, [('acqp', 'encoding_file')])]) else: topup.inputs.readout_times = [0.05, 0.05] wf.connect( [ ( inputnode, topup, [('encoding_directions', 'encoding_direction')], ) ] ) wf.connect( [ (inputnode, list_merge, [('epi_file', 'in1')]), ( inputnode, epi_flirt, [('altepi_file', 'in_file'), ('epi_file', 'reference')], ), (epi_flirt, list_merge, [('out_file', 'in2')]), (list_merge, merge, [('out', 'in_files')]), # (merge, resize, [('merged_file', 'in_file')]), # (resize, topup, [('out_file', 'in_file')]), (merge, topup, [('merged_file', 'in_file')]), ( topup, outputnode, [ ('out_field', 'out_fmap'), ('out_movpar', 'out_movpar'), ('out_enc_file', 'out_enc_file'), (('out_movpar', get_base_movpar), 'out_base'), ], ), ] ) return wf