示例#1
0
def test_DTIRecon_outputs():
    output_map = dict(ADC=dict(),
    B0=dict(),
    FA=dict(),
    FA_color=dict(),
    L1=dict(),
    L2=dict(),
    L3=dict(),
    V1=dict(),
    V2=dict(),
    V3=dict(),
    exp=dict(),
    tensor=dict(),
    )
    outputs = DTIRecon.output_spec()

    for key, metadata in output_map.items():
        for metakey, value in metadata.items():
            yield assert_equal, getattr(outputs.traits()[key], metakey), value
示例#2
0
def test_DTIRecon_inputs():
    input_map = dict(DWI=dict(argstr='%s',
    mandatory=True,
    position=1,
    ),
    args=dict(argstr='%s',
    ),
    b0_threshold=dict(argstr='-b0_th',
    ),
    bvals=dict(mandatory=True,
    ),
    bvecs=dict(argstr='-gm %s',
    mandatory=True,
    ),
    environ=dict(nohash=True,
    usedefault=True,
    ),
    ignore_exception=dict(nohash=True,
    usedefault=True,
    ),
    image_orientation_vectors=dict(argstr='-iop %f',
    ),
    n_averages=dict(argstr='-nex %s',
    ),
    oblique_correction=dict(argstr='-oc',
    ),
    out_prefix=dict(argstr='%s',
    position=2,
    usedefault=True,
    ),
    output_type=dict(argstr='-ot %s',
    usedefault=True,
    ),
    terminal_output=dict(mandatory=True,
    nohash=True,
    ),
    )
    inputs = DTIRecon.input_spec()

    for key, metadata in input_map.items():
        for metakey, value in metadata.items():
            yield assert_equal, getattr(inputs.traits()[key], metakey), value
    def _run_interface(self, runtime):

        # Loading required packages
        from BrainTypes_additional_interfaces import DipyDenoise
        from nipype.interfaces.diffusion_toolkit.dti import DTIRecon
        import nipype.interfaces.fsl as fsl
        import nipype.pipeline.engine as pe
        import nipype.interfaces.io as nio
        import nipype.interfaces.utility as util
        from nipype.algorithms.misc import Gunzip
        from nipype.interfaces.fsl.maths import ApplyMask
        import os

        # ==============================================================
        # Processing of diffusion-weighted data
        # Extract b0 image
        fslroi = pe.Node(interface=fsl.ExtractROI(), name='extract_b0')
        fslroi.inputs.in_file = self.inputs.dwi
        fslroi.inputs.t_min = 0
        fslroi.inputs.t_size = 1

        # Create a brain mask
        bet = pe.Node(interface=fsl.BET(frac=0.3,
                                        robust=False,
                                        mask=True,
                                        no_output=False),
                      name='bet')

        # Eddy-current and motion correction
        eddy = pe.Node(interface=fsl.epi.Eddy(args='-v'), name='eddy')
        eddy.inputs.in_acqp = self.inputs.acqparams
        eddy.inputs.in_bvec = self.inputs.bvecs
        eddy.inputs.in_bval = self.inputs.bvals
        eddy.inputs.in_file = self.inputs.dwi
        eddy.inputs.in_index = self.inputs.index_file

        # Denoising
        dwi_denoise = pe.Node(interface=DipyDenoise(), name='dwi_denoise')
        dwi_denoise.inputs.in_file = self.inputs.dwi

        # Fitting the diffusion tensor model
        dtifit = pe.Node(interface=DTIRecon(), name='dtifit')
        dtifit.inputs.out_prefix = self.inputs.subject_id
        dtifit.inputs.bvals = self.inputs.bvals
        dtifit.inputs.bvecs = self.inputs.bvecs

        # Applying the mask
        FA_applymask = pe.Node(interface=ApplyMask(), name='FA_applymask')

        # Renaming the outputs
        b0_rename = pe.Node(interface=util.Rename(keep_ext=True),
                            name='b0_rename')
        b0_rename.inputs.format_string = self.inputs.subject_id + '_b0'

        colourFA_rename = pe.Node(interface=util.Rename(keep_ext=True),
                                  name='colourFA_rename')
        colourFA_rename.inputs.format_string = self.inputs.subject_id + '_colourFA'

        FA_rename = pe.Node(interface=util.Rename(keep_ext=True),
                            name='FA_rename')
        FA_rename.inputs.format_string = self.inputs.subject_id + '_FA'

        dwi_rename = pe.Node(interface=util.Rename(keep_ext=True),
                             name='dwi_rename')
        dwi_rename.inputs.format_string = self.inputs.subject_id + '_dwi'

        mask_rename = pe.Node(interface=util.Rename(keep_ext=True),
                              name='mask_rename')
        mask_rename.inputs.format_string = self.inputs.subject_id + '_mask'

        # Collect everything
        datasink = pe.Node(nio.DataSink(), name='sinker')
        datasink.inputs.parameterization = False
        datasink.inputs.base_directory = self.inputs.out_directory + '/_subject_id_' + self.inputs.subject_id

        # ==============================================================
        # Setting up the workflow
        dwi_preproc = pe.Workflow(name='dwi_preproc')

        # Diffusion data
        # Preprocessing
        dwi_preproc.connect(fslroi, 'roi_file', bet, 'in_file')
        dwi_preproc.connect(bet, 'mask_file', eddy, 'in_mask')
        dwi_preproc.connect(eddy, 'out_corrected', dwi_denoise, 'in_file')

        # Calculate diffusion measures
        dwi_preproc.connect(dwi_denoise, 'out_file', dtifit, 'DWI')

        # Applying the mask to the scalar images
        dwi_preproc.connect(dtifit, 'FA', FA_applymask, 'in_file')
        dwi_preproc.connect(bet, 'mask_file', FA_applymask, 'mask_file')

        # Renaming
        dwi_preproc.connect(fslroi, 'roi_file', b0_rename, 'in_file')
        dwi_preproc.connect(dwi_denoise, 'out_file', dwi_rename, 'in_file')
        dwi_preproc.connect(FA_applymask, 'out_file', FA_rename, 'in_file')
        dwi_preproc.connect(dtifit, 'FA_color', colourFA_rename, 'in_file')
        dwi_preproc.connect(bet, 'mask_file', mask_rename, 'in_file')

        # Moving the results to the datasink
        dwi_preproc.connect(b0_rename, 'out_file', datasink,
                            'preprocessed.@b0')
        dwi_preproc.connect(colourFA_rename, 'out_file', datasink,
                            'preprocessed.@colourFA')
        dwi_preproc.connect(dwi_rename, 'out_file', datasink,
                            'preprocessed.@dwi')
        dwi_preproc.connect(FA_rename, 'out_file', datasink,
                            'preprocessed.@FA')
        dwi_preproc.connect(mask_rename, 'out_file', datasink,
                            'preprocessed.@mask')

        # ==============================================================
        # Running the workflow
        dwi_preproc.base_dir = os.path.abspath(self.inputs.out_directory +
                                               '_subject_id_' +
                                               self.inputs.subject_id)
        dwi_preproc.write_graph()
        dwi_preproc.run()

        return runtime