Source code for macapype.nodes.extract_brain



from nipype.interfaces.base import (CommandLine, CommandLineInputSpec,
                                    TraitedSpec)
from nipype.interfaces.base import traits, File


import os
from nipype.interfaces.fsl.base import (FSLCommand, FSLCommandInputSpec)


class T1xT2BETInputSpec(FSLCommandInputSpec):

    t1_file = File(
        exists=True,
        desc='Whole-head T1w image',
        mandatory=True, position=0, argstr="-t1 %s")

    t2_file = File(
        exists=True,
        desc='Whole-head T2w image',
        mandatory=True, position=1, argstr="-t2 %s")

    opt_os = traits.String(
        "_BET", usedefault=True,
        desc="Suffix for the brain masked images (default is _BET)",
        argstr="-os %s", mandatory=False)

    aT2 = traits.Bool(
        False, usedefault=True, argstr="-aT2",
        desc="Will coregrister T2w to T1w using flirt. Output will have the\
            suffix provided. Will only work for spatially close images.",
        mandatory=False)

    # as -> opt_as, as is already a part of python keywords...
    opt_as = traits.String(
        "-in-T1w", usedefault=True, argstr="-as %s",
        desc="Suffix for T2w to T1w registration \
            (\"-in-T1w\" if not specified)",
        mandatory=False)

    n = traits.Int(
        1, usedefault=True,
        desc='n = the number of iterations BET will be run to find center of \
            gravity (n=1 if option -n is absent)',
        argstr="-n %d", mandatory=False)

    m = traits.Bool(
        False, usedefault=True, argstr="-m",
        desc="Will output the BET mask at the format \
              output_prefixT1_mask.nii.gz)",
        mandatory=False)

    ms = traits.String(
        "_mask", usedefault=True,
        desc="Suffix for the mask (default is _mask)",
        argstr="-ms %s", mandatory=False)

    c = traits.Int(
        desc='Will crop the inputs & outputs after brain extraction. c is the \
            space between the brain and the limits of the crop box expressed \
            in percentage of the brain size (eg. if the brain size is 200\
            voxels in one dimension and c=10: the sides of the brain in this \
            dimension will be 20 voxels away from the borders of the resulting\
            crop box in this dimension).',
        argstr="-c %d", mandatory=False)

    cs = traits.String(
        "_cropped", usedefault=True,
        desc="Suffix for the cropped images (default is _cropped)",
        argstr="-cs %s", mandatory=False)

    f = traits.Float(
        0.5, usedefault=True,
        desc='-f options of BET: fractional intensity threshold (0->1); \
            default=0.5; smaller values give larger brain outline estimates',
        argstr="-f %f", mandatory=False)

    g = traits.Float(
        0.0, usedefault=True, desc='-g options of BET:\
            vertical gradient in fractional intensity threshold (-1->1);\
            default=0; positive values give larger brain outline at\
            bottom, smaller at top',
        argstr="-g %f", mandatory=False)

    cog = traits.ListInt(
        desc='For difficult cases, you can directly provide a center of \
            gravity. Only one iteration will be performed.',
        argstr="-cog %d %d %d", mandatory=False)

    k = traits.Bool(
        False, usedefault=True, argstr="-k",
        desc="Will keep temporary files",
        mandatory=False)

    p = traits.String(
        desc="Prefix for running FSL functions\
              (can be a path or just a prefix)",
        argstr="-p %s", mandatory=False)


class T1xT2BETOutputSpec(TraitedSpec):
    t1_brain_file = File(
        exists=True, desc="extracted brain from T1")

    t2_brain_file = File(
        exists=True, desc="extracted brain from T2")

    t2_coreg_file = File(
        desc="coreg T2 from T1")

    mask_file = File(
        desc="extracted mask from T1")

    t1_cropped_file = File(
        desc="extracted cropped brain from T1")

    t2_cropped_file = File(
        desc="extracted cropped brain from T2")


[docs]class T1xT2BET(FSLCommand): """ Description: Brain extraction using T1 and T2 images Inputs: Mandatory: t1_file Whole-head T1w image t2_file Whole-head T2w image Optional: opt_os Suffix for the brain masked images (default is _BET) aT2 Will coregrister T2w to T1w using flirt. Output will have the suffix provided. Will only work for spatially close images. opt_as Suffix for T2w to T1w registration (\"-in-T1w\" if not specified) n the number of iterations BET will be run to find center of gravity (n=1 if option -n is absent) m Will output the BET mask at the format output_prefixT1_mask.nii.gz) ms Suffix for the mask (default is _mask) c Will crop the inputs & outputs after brain extraction. c is the space between the brain and the limits of the crop box expressed in percentage of the brain size (eg. if the brain size is 200 voxels in one dimension and c=10: the sides of the brain in this dimension will be 20 voxels away from the borders of the resulting crop box in this dimension) cs Suffix for the cropped images (default is _cropped) f -f options of BET: fractional intensity threshold (0->1); \ default=0.5; smaller values give larger brain outline estimates g '-g options of BET: \ vertical gradient in fractional intensity threshold (-1->1);\ default=0; positive values give larger brain outline at\ bottom, smaller at top cog For difficult cases, you can directly provide a center of \ gravity. Only one iteration will be performed. k Will keep temporary files p Prefix for running FSL functions (can be a path or just a prefix) Outputs: t1_brain_file extracted brain from T1 t2_brain_file extracted brain from T2 t2_coreg_file coreg T2 from T1 mask_file extracted mask from T1 t1_cropped_file extracted cropped brain from T1 t2_cropped_file extracted cropped brain from T2 """ input_spec = T1xT2BETInputSpec output_spec = T1xT2BETOutputSpec package_directory = os.path.dirname(os.path.abspath(__file__)) _cmd = 'bash {}/../bash/T1xT2BET.sh'.format(package_directory) def _list_outputs(self): import os from nipype.utils.filemanip import split_filename as split_f outputs = self._outputs().get() t1_path, t1_fname, ext = split_f(self.inputs.t1_file) t2_path, t2_fname, ext = split_f(self.inputs.t2_file) if self.inputs.c: # !!!!warning, in Regis bash, only .nii.gz are handled outputs["t1_cropped_file"] = os.path.abspath( t1_fname + self.inputs.cs + ".nii.gz") if self.inputs.aT2: outputs["t2_cropped_file"] = os.path.abspath( t2_fname + self.inputs.opt_as + self.inputs.cs + ".nii.gz") else: outputs["t2_cropped_file"] = os.path.abspath( t2_fname + self.inputs.cs + ".nii.gz") outputs["t1_brain_file"] = os.path.abspath( t1_fname + self.inputs.opt_os + self.inputs.cs + ".nii.gz") outputs["t2_brain_file"] = os.path.abspath( t2_fname + self.inputs.opt_os + self.inputs.cs + ".nii.gz") if self.inputs.m: # !!!!warning, in Regis bash, only .nii.gz are handled outputs["mask_file"] = os.path.abspath( t1_fname + self.inputs.opt_os + self.inputs.ms + self.inputs.cs + ".nii.gz") else: outputs["t1_brain_file"] = os.path.abspath( t1_fname + self.inputs.opt_os + ".nii.gz") outputs["t2_brain_file"] = os.path.abspath( t2_fname + self.inputs.opt_os + ".nii.gz") if self.inputs.m: # !!!!warning, in Regis bash, only .nii.gz are handled outputs["mask_file"] = os.path.abspath( t1_fname + self.inputs.opt_os + self.inputs.ms + ".nii.gz") if self.inputs.aT2: outputs["t2_coreg_file"] = os.path.abspath( t2_fname + self.inputs.opt_as + ".nii.gz") return outputs
# AtlasBREX class AtlasBREXInputSpec(CommandLineInputSpec): import os package_directory = os.path.dirname(os.path.abspath(__file__)) script_atlas_BREX = File('{}/../bash/atlasBREX.sh'.format( package_directory), usedefault=True, exists=True, desc='atlasBREX script', mandatory=False, position=0, argstr="%s") NMT_SS_file = File( exists=True, desc='Skullstriped version of the template', mandatory=True, position=1, argstr="-b %s") NMT_file = File( exists=True, desc='template img', mandatory=True, position=2, argstr="-nb %s") t1_restored_file = File( exists=True, desc='T1 image to map', mandatory=True, position=3, argstr="-h %s") f = traits.Float( 0.5, usedefault=True, desc='f', position=4, argstr="-f %f", mandatory=True) wrp = traits.String( "10,10,10", usedefault=True, desc="wrp", position=5, argstr="-wrp %s", mandatory=True) reg = traits.Enum( 1, 0, 2, 3, usedefault=True, desc="Method: 0 = FNIRT w/ bending, \ 1 (default) = FNIRT membrane-energy regularization, \ 2 = ANTs/SyN w/, \ 3 = w/o N4Bias", position=6, argstr="-reg %d", mandatory=True) msk = traits.String( "a,0,0", usedefault=True, desc="msk", position=7, argstr="-msk %s", mandatory=True) dil = traits.Int(desc="dil", argstr="-dil %d") nrm = traits.Enum(1, 2, desc="nrm", argstr="-nrm %d") vox = traits.Int(desc="vox", argstr="-vox %d") args = traits.String(desc="args", position=-1, argstr=" %s", mandatory=False) class AtlasBREXOutputSpec(TraitedSpec): brain_file = File( exists=True, desc="extracted brain from atlas_brex")
[docs]class AtlasBREX(CommandLine): """ Description: Atlas based BrainExtraction Inputs: Mandatory: script_atlas_BREX: File, 'atlasBREX script' NMT_SS_file: File, 'Skullstriped version of the template', NMT_file: File, 'template img' t1_restored_file: File, 'T1 image to map' f: Float, default = 0.5, f reg : Enum, default = 1,0,2,3, "Method: 0 = FNIRT w/ bending, \ 1 (default) = FNIRT membrane-energy regularization, \ 2 = ANTs/SyN w/, \ 3 = w/o N4Bias" w: String, default = "10,10,10", "w" msk: String, default = "a,0,0", "msk", Outputs: brain_file: File, "extracted brain from atlas_brex" """ input_spec = AtlasBREXInputSpec output_spec = AtlasBREXOutputSpec _cmd = 'bash' def _format_arg(self, name, spec, value): import os import shutil cur_dir = os.getcwd() if name == 'script_atlas_BREX': shutil.copy(value, cur_dir) value = os.path.split(value)[1] if name == 'NMT_SS_file': shutil.copy(value, cur_dir) value = os.path.split(value)[1] if name == 'NMT_file': shutil.copy(value, cur_dir) value = os.path.split(value)[1] if name == 't1_restored_file': shutil.copy(value, cur_dir) value = os.path.split(value)[1] return super(AtlasBREX, self)._format_arg(name, spec, value) def _list_outputs(self): import os from nipype.utils.filemanip import split_filename as split_f outputs = self._outputs().get() path, fname, ext = split_f(self.inputs.t1_restored_file) outputs["brain_file"] = os.path.abspath(fname + '_brain' + ext) return outputs