Source code for macapype.pipelines.correct_bias

import nipype.interfaces.utility as niu
import nipype.pipeline.engine as pe

import nipype.interfaces.fsl as fsl

from ..utils.utils_nodes import NodeParams, parse_key


[docs]def create_correct_bias_pipe(params={}, name="correct_bias_pipe"): """ Description: Correct bias using T1 and T2 images Same as bash_regis.T1xT2BiasFieldCorrection Params: - smooth (see `MathsCommand <https://nipype.readthedocs.io/en/0.12.1/\ interfaces/generated/nipype.interfaces.fsl.maths.html#mathscommand>`_) - norm_smooth (see `MultiMathsCommand <https://nipype.readthedocs.io/\ en/0.12.1/interfaces/generated/nipype.interfaces.fsl.maths.html\ #multiimagemaths>`_) - smooth_bias (see `IsotropicSmooth <https://nipype.readthedocs.io/en/\ 0.12.1/interfaces/generated/nipype.interfaces.fsl.maths.html#\ isotropicsmooth>`_) Inputs: inputnode: preproc_T1: preprocessed T1 file name preproc_T2: preprocessed T2 file name arguments: params: dictionary of node sub-parameters (from a json file) name: pipeline name (default = "correct_bias_pipe") Outputs: outputnode.debiased_T1: T1 after bias correction outputnode.debiased_T2: T2 after bias correction """ # creating pipeline correct_bias_pipe = pe.Workflow(name=name) # creating inputnode inputnode = pe.Node( niu.IdentityInterface(fields=['preproc_T1', 'preproc_T2']), name='inputnode') # BinaryMaths mult_T1_T2 = pe.Node(fsl.BinaryMaths(), name='mult_T1_T2') mult_T1_T2.inputs.operation = "mul" mult_T1_T2.inputs.args = "-abs -sqrt" mult_T1_T2.inputs.output_datatype = "float" correct_bias_pipe.connect(inputnode, 'preproc_T1', mult_T1_T2, 'in_file') correct_bias_pipe.connect(inputnode, 'preproc_T2', mult_T1_T2, 'operand_file') # Mean Brain Val meanbrainval = pe.Node(fsl.ImageStats(), name='meanbrainval') meanbrainval.inputs.op_string = "-M" correct_bias_pipe.connect(mult_T1_T2, 'out_file', meanbrainval, 'in_file') # norm_mult norm_mult = pe.Node(fsl.BinaryMaths(), name='norm_mult') norm_mult.inputs.operation = "div" correct_bias_pipe.connect(mult_T1_T2, 'out_file', norm_mult, 'in_file') correct_bias_pipe.connect(meanbrainval, 'out_stat', norm_mult, 'operand_value') # smooth smooth = NodeParams(fsl.maths.MathsCommand(), params=parse_key(params, "smooth"), name='smooth') correct_bias_pipe.connect(norm_mult, 'out_file', smooth, 'in_file') # norm_smooth norm_smooth = NodeParams(fsl.MultiImageMaths(), params=parse_key(params, "norm_smooth"), name='norm_smooth') correct_bias_pipe.connect(norm_mult, 'out_file', norm_smooth, 'in_file') correct_bias_pipe.connect(smooth, 'out_file', norm_smooth, 'operand_files') # modulate modulate = pe.Node(fsl.BinaryMaths(), name='modulate') modulate.inputs.operation = "div" correct_bias_pipe.connect(norm_mult, 'out_file', modulate, 'in_file') correct_bias_pipe.connect(norm_smooth, 'out_file', modulate, 'operand_file') # std_modulate std_modulate = pe.Node(fsl.ImageStats(), name='std_modulate') std_modulate.inputs.op_string = "-S" correct_bias_pipe.connect(modulate, 'out_file', std_modulate, 'in_file') # mean_modulate mean_modulate = pe.Node(fsl.ImageStats(), name='mean_modulate') mean_modulate.inputs.op_string = "-M" correct_bias_pipe.connect(modulate, 'out_file', mean_modulate, 'in_file') # compute_lower_val def compute_lower_val(mean_val, std_val): return mean_val - (std_val*0.5) # compute_lower lower = pe.Node(niu.Function(input_names=['mean_val', 'std_val'], output_names=['lower_val'], function=compute_lower_val), name='lower') correct_bias_pipe.connect(mean_modulate, 'out_stat', lower, 'mean_val') correct_bias_pipe.connect(std_modulate, 'out_stat', lower, 'std_val') # thresh_lower thresh_lower = pe.Node(fsl.Threshold(), name='thresh_lower') correct_bias_pipe.connect(lower, 'lower_val', thresh_lower, 'thresh') correct_bias_pipe.connect(modulate, 'out_file', thresh_lower, 'in_file') # mod_mask mod_mask = pe.Node(fsl.UnaryMaths(), name='mod_mask') mod_mask.inputs.operation = "bin" mod_mask.inputs.args = "-ero -mul 255" correct_bias_pipe.connect(thresh_lower, 'out_file', mod_mask, 'in_file') # bias bias = pe.Node(fsl.MultiImageMaths(), name='bias') bias.inputs.op_string = "-mas %s -dilall" bias.inputs.output_datatype = "float" correct_bias_pipe.connect(norm_mult, 'out_file', bias, 'in_file') correct_bias_pipe.connect(mod_mask, 'out_file', bias, 'operand_files') # smooth_bias smooth_bias = NodeParams(fsl.IsotropicSmooth(), params=parse_key(params, "smooth_bias"), name='smooth_bias') correct_bias_pipe.connect(bias, 'out_file', smooth_bias, 'in_file') # debiased_T1 debiased_T1 = pe.Node(fsl.BinaryMaths(), name='debiased_T1') debiased_T1.inputs.operation = "div" debiased_T1.inputs.output_datatype = "float" correct_bias_pipe.connect(inputnode, 'preproc_T1', debiased_T1, 'in_file') correct_bias_pipe.connect(smooth_bias, 'out_file', debiased_T1, 'operand_file') # debiased_T2 debiased_T2 = pe.Node(fsl.BinaryMaths(), name='debiased_T2') debiased_T2.inputs.operation = "div" debiased_T2.inputs.output_datatype = "float" correct_bias_pipe.connect(inputnode, 'preproc_T2', debiased_T2, 'in_file') correct_bias_pipe.connect(smooth_bias, 'out_file', debiased_T2, 'operand_file') # outputnode outputnode = pe.Node( niu.IdentityInterface( fields=["debiased_T1", "debiased_T2"]), name='outputnode') correct_bias_pipe.connect(debiased_T1, 'out_file', outputnode, 'debiased_T1') correct_bias_pipe.connect(debiased_T2, 'out_file', outputnode, 'debiased_T2') return correct_bias_pipe
[docs]def create_masked_correct_bias_pipe(params={}, name="masked_correct_bias_pipe"): """ Description: Correct bias using T1 and T2 images in a mask Same as bash_regis.T1xT2BiasFieldCorrection Params: - smooth (see `MathsCommand <https://nipype.readthedocs.io/en/0.12.1/\ interfaces/generated/nipype.interfaces.fsl.maths.html#mathscommand>`_) - norm_smooth (see `MultiMathsCommand <https://nipype.readthedocs.io/\ en/0.12.1/interfaces/generated/nipype.interfaces.fsl.maths.html\ #multiimagemaths>`_) - smooth_bias (see `IsotropicSmooth <https://nipype.readthedocs.io/en/\ 0.12.1/interfaces/generated/nipype.interfaces.fsl.maths.html#\ isotropicsmooth>`_) Inputs: inputnode: preproc_T1: preprocessed T1 file name preproc_T2: preprocessed T2 file name brain_mask: brain mask where operation will be applied arguments: params: dictionary of node sub-parameters (from a json file) name: pipeline name (default = "masked_correct_bias_pipe") Outputs: outputnode.debiased_T1: T1 after bias correction outputnode.debiased_T2: T2 after bias correction outputnode.mask_debiased_T1: Masked T1 after bias correction outputnode.mask_debiased_T2: Masked T2 after bias correction """ # creating pipeline masked_correct_bias_pipe = pe.Workflow(name=name) # creating inputnode inputnode = pe.Node( niu.IdentityInterface(fields=['preproc_T1', 'preproc_T2', 'brain_mask']), name='inputnode') # BinaryMaths mult_T1_T2 = pe.Node(fsl.BinaryMaths(), name='mult_T1_T2') mult_T1_T2.inputs.operation = "mul" mult_T1_T2.inputs.args = "-abs -sqrt" mult_T1_T2.inputs.output_datatype = "float" masked_correct_bias_pipe.connect(inputnode, 'preproc_T1', mult_T1_T2, 'in_file') masked_correct_bias_pipe.connect(inputnode, 'preproc_T2', mult_T1_T2, 'operand_file') # mask mult mask_mult = pe.Node(fsl.ApplyMask(), name='mask_mult') masked_correct_bias_pipe.connect(mult_T1_T2, 'out_file', mask_mult, 'in_file') masked_correct_bias_pipe.connect(inputnode, 'brain_mask', mask_mult, 'mask_file') # Mean Brain Val meanbrainval = pe.Node(fsl.ImageStats(), name='meanbrainval') meanbrainval.inputs.op_string = "-M" masked_correct_bias_pipe.connect(mult_T1_T2, 'out_file', meanbrainval, 'in_file') # norm_mult norm_mult = pe.Node(fsl.BinaryMaths(), name='norm_mult') norm_mult.inputs.operation = "div" masked_correct_bias_pipe.connect(mask_mult, 'out_file', norm_mult, 'in_file') masked_correct_bias_pipe.connect(meanbrainval, 'out_stat', norm_mult, 'operand_value') # smooth smooth = NodeParams(fsl.maths.MathsCommand(), params=parse_key(params, "smooth"), name='smooth') masked_correct_bias_pipe.connect(norm_mult, 'out_file', smooth, 'in_file') # norm_smooth norm_smooth = NodeParams(fsl.MultiImageMaths(), params=parse_key(params, "norm_smooth"), name='norm_smooth') masked_correct_bias_pipe.connect(norm_mult, 'out_file', norm_smooth, 'in_file') masked_correct_bias_pipe.connect(smooth, 'out_file', norm_smooth, 'operand_files') # modulate modulate = pe.Node(fsl.BinaryMaths(), name='modulate') modulate.inputs.operation = "div" masked_correct_bias_pipe.connect(norm_mult, 'out_file', modulate, 'in_file') masked_correct_bias_pipe.connect(norm_smooth, 'out_file', modulate, 'operand_file') # std_modulate std_modulate = pe.Node(fsl.ImageStats(), name='std_modulate') std_modulate.inputs.op_string = "-S" masked_correct_bias_pipe.connect(modulate, 'out_file', std_modulate, 'in_file') # mean_modulate mean_modulate = pe.Node(fsl.ImageStats(), name='mean_modulate') mean_modulate.inputs.op_string = "-M" masked_correct_bias_pipe.connect(modulate, 'out_file', mean_modulate, 'in_file') # function lower val def compute_lower_val(mean_val, std_val): return mean_val - (std_val*0.5) # compute_lower lower = pe.Node(niu.Function(input_names=['mean_val', 'std_val'], output_names=['lower_val'], function=compute_lower_val), name='lower') masked_correct_bias_pipe.connect(mean_modulate, 'out_stat', lower, 'mean_val') masked_correct_bias_pipe.connect(std_modulate, 'out_stat', lower, 'std_val') # thresh_lower thresh_lower = pe.Node(fsl.Threshold(), name='thresh_lower') masked_correct_bias_pipe.connect(lower, 'lower_val', thresh_lower, 'thresh') masked_correct_bias_pipe.connect(modulate, 'out_file', thresh_lower, 'in_file') # mod_mask mod_mask = pe.Node(fsl.UnaryMaths(), name='mod_mask') mod_mask.inputs.operation = "bin" mod_mask.inputs.args = "-ero -mul 255" masked_correct_bias_pipe.connect(thresh_lower, 'out_file', mod_mask, 'in_file') """ ##tmp_bias tmp_bias = pe.Node(fsl.MultiImageMaths(),name='tmp_bias') tmp_bias.inputs.op_string = "-mas %s" tmp_bias.inputs.output_datatype = "float" masked_correct_bias_pipe.connect(norm_mult, 'out_file', tmp_bias, 'in_file') masked_correct_bias_pipe.connect(mod_mask, 'out_file', tmp_bias, 'operand_files') """ # bias bias = pe.Node(fsl.MultiImageMaths(), name='bias') bias.inputs.op_string = "-mas %s -dilall" bias.inputs.output_datatype = "float" masked_correct_bias_pipe.connect(norm_mult, 'out_file', bias, 'in_file') masked_correct_bias_pipe.connect(mod_mask, 'out_file', bias, 'operand_files') # smooth_bias smooth_bias = NodeParams(fsl.IsotropicSmooth(), params=parse_key(params, "smooth_bias"), name='smooth_bias') masked_correct_bias_pipe.connect(bias, 'out_file', smooth_bias, 'in_file') # debiased_T1 debiased_T1 = pe.Node(fsl.BinaryMaths(), name='debiased_T1') debiased_T1.inputs.operation = "div" debiased_T1.inputs.output_datatype = "float" masked_correct_bias_pipe.connect(inputnode, 'preproc_T1', debiased_T1, 'in_file') masked_correct_bias_pipe.connect(smooth_bias, 'out_file', debiased_T1, 'operand_file') # debiased_T2 debiased_T2 = pe.Node(fsl.BinaryMaths(), name='debiased_T2') debiased_T2.inputs.operation = "div" debiased_T2.inputs.output_datatype = "float" masked_correct_bias_pipe.connect(inputnode, 'preproc_T2', debiased_T2, 'in_file') masked_correct_bias_pipe.connect(smooth_bias, 'out_file', debiased_T2, 'operand_file') # mask_debiased_T1 mask_debiased_T1 = pe.Node(fsl.ApplyMask(), name='mask_debiased_T1') masked_correct_bias_pipe.connect(debiased_T1, 'out_file', mask_debiased_T1, 'in_file') masked_correct_bias_pipe.connect(inputnode, 'brain_mask', mask_debiased_T1, 'mask_file') # mask_debiased_T2 mask_debiased_T2 = pe.Node(fsl.ApplyMask(), name='mask_debiased_T2') masked_correct_bias_pipe.connect(debiased_T2, 'out_file', mask_debiased_T2, 'in_file') masked_correct_bias_pipe.connect(inputnode, 'brain_mask', mask_debiased_T2, 'mask_file') # outputnode outputnode = pe.Node( niu.IdentityInterface( fields=["debiased_T1", "debiased_T2", "mask_debiased_T1", "mask_debiased_T2"]), name='outputnode') masked_correct_bias_pipe.connect(debiased_T1, 'out_file', outputnode, 'debiased_T1') masked_correct_bias_pipe.connect(debiased_T2, 'out_file', outputnode, 'debiased_T2') masked_correct_bias_pipe.connect(mask_debiased_T1, 'out_file', outputnode, 'mask_debiased_T1') masked_correct_bias_pipe.connect(mask_debiased_T2, 'out_file', outputnode, 'mask_debiased_T2') return masked_correct_bias_pipe