def test_binarymaths(create_files_in_directory): files, testdir, out_ext = create_files_in_directory # Get the command maths = fsl.BinaryMaths(in_file="a.nii", out_file="c.nii") # Test the underlying command assert maths.cmd == "fslmaths" # Test that it fails without an operation an with pytest.raises(ValueError): maths.run() # Test the different operations ops = ["add", "sub", "mul", "div", "rem", "min", "max"] operands = ["b.nii", -2, -0.5, 0, .123456, np.pi, 500] for op in ops: for ent in operands: maths = fsl.BinaryMaths(in_file="a.nii", out_file="c.nii", operation=op) if ent == "b.nii": maths.inputs.operand_file = ent assert maths.cmdline == "fslmaths a.nii -%s b.nii c.nii" % op else: maths.inputs.operand_value = ent assert maths.cmdline == "fslmaths a.nii -%s %.8f c.nii" % (op, ent) # Test that we don't need to ask for an out file for op in ops: maths = fsl.BinaryMaths(in_file="a.nii", operation=op, operand_file="b.nii") assert maths.cmdline == "fslmaths a.nii -%s b.nii %s" % (op, os.path.join(testdir, "a_maths%s" % out_ext))
def test_binarymaths(fsl_output_type=None): prev_type = set_output_type(fsl_output_type) files, testdir, origdir, out_ext = create_files_in_directory() # Get the command maths = fsl.BinaryMaths(in_file="a.nii", out_file="c.nii") # Test the underlying command yield assert_equal, maths.cmd, "fslmaths" # Test that it fails without an operation an yield assert_raises, ValueError, maths.run # Test the different operations ops = ["add", "sub", "mul", "div", "rem", "min", "max"] operands = ["b.nii", -2, -0.5, 0, .123456, np.pi, 500] for op in ops: for ent in operands: maths = fsl.BinaryMaths(in_file="a.nii", out_file="c.nii", operation=op) if ent == "b.nii": maths.inputs.operand_file = ent yield assert_equal, maths.cmdline, "fslmaths a.nii -%s b.nii c.nii" % op else: maths.inputs.operand_value = ent yield assert_equal, maths.cmdline, "fslmaths a.nii -%s %.8f c.nii" % (op, ent) # Test that we don't need to ask for an out file for op in ops: maths = fsl.BinaryMaths(in_file="a.nii", operation=op, operand_file="b.nii") yield assert_equal, maths.cmdline, "fslmaths a.nii -%s b.nii %s" % (op, os.path.join(testdir, "a_maths%s" % out_ext)) # Clean up our mess clean_directory(testdir, origdir) set_output_type(prev_type)
def convert_2_cbf(savgfl, denom): jnk, flnm = os.path.split(savgfl) subn, jnk = flnm.split('_sur') cbf = os.path.join(output_dir, '%s_cbf' % (subn)) l = 0.9 #blood/tissue water partition coefficient, in g/ml num = os.path.join(output_dir, 'd_num') mul = math.BinaryMaths() mul.inputs.in_file = savgfl mul.inputs.operand_value = l mul.inputs.operation = 'mul' mul.inputs.out_file = num mul.inputs.output_type = 'NIFTI_GZ' mul.inputs.ignore_exception = True mul.run() num = num + '.nii.gz' immth = math.BinaryMaths() immth.inputs.in_file = num immth.inputs.operand_file = denom immth.inputs.operation = 'div' immth.inputs.out_file = cbf immth.inputs.output_type = 'NIFTI_GZ' immth.inputs.ignore_exception = True immth.run() cbf = cbf + '.nii.gz' os.system('rm %s' % (os.path.join(output_dir, 'd_*.nii.gz'))) return cbf
def surround_avg(scan1, scan2): jnk, flnm = os.path.split(scan1) subn, jnk = flnm.split('_sess') savgfl = os.path.join(output_dir, '%s_surroundavg' % (subn)) divisor = nib.load(scan1).get_data().shape[3] immth = math.BinaryMaths() immth.inputs.in_file = scan1 immth.inputs.operand_file = scan2 immth.inputs.operation = 'sub' immth.inputs.out_file = savgfl immth.inputs.output_type = 'NIFTI_GZ' immth.inputs.ignore_exception = True immth.run() savgfl = savgfl + '.nii.gz' return savgfl
def define_denominator(ctrl_mean): alpha = 0.85 # assumed inversion efficiency of pCASL T1b = 1.664 #T1 of blood, in s w = 0.900 # post labeling delay in s tau = 1.5 # labeling duration in s e = 2.71828 # euler's number term3 = e**((-w) / T1b) - e**((-(tau + w)) / T1b) factor = (2 * alpha) * T1b * term3 denom = os.path.join(output_dir, 'denom') mul = math.BinaryMaths() mul.inputs.in_file = ctrl_mean mul.inputs.operand_value = factor mul.inputs.operation = 'mul' mul.inputs.out_file = denom mul.inputs.output_type = 'NIFTI_GZ' mul.inputs.ignore_exception = True mul.run() denom = denom + '.nii.gz' return denom
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