Пример #1
0
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))
Пример #2
0
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)
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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