Beispiel #1
0
def resample_niftyreg(fref,
                      fflo,
                      faff,
                      outpath='',
                      fimout='',
                      fcomment='',
                      pickname='ref',
                      intrp=1,
                      executable='',
                      verbose=True):

    # check if the executable exists:
    # if executable=='' and 'RESPATH' in Cnt and os.path.isfile(Cnt['RESPATH']):
    #     executable = Cnt['RESPATH']

    if not os.path.isfile(executable):
        raise IOError('Incorrect path to executable file for registration.')

    #> output path
    if outpath == '' and fimout != '':
        opth = os.path.dirname(fimout)
        if opth == '':
            opth = os.path.dirname(fflo)

    elif outpath == '':
        opth = os.path.dirname(fflo)

    else:
        opth = outpath

    imio.create_dir(opth)

    #> the output naming
    if '/' in fimout:
        fout = fimout
    elif fimout != '' and not os.path.isfile(fimout):
        fout = os.path.join(opth, fimout)
    elif pickname == 'ref':
        fout = os.path.join(opth, 'affine_ref-' \
                + os.path.basename(fref).split('.nii')[0]+fcomment+'.nii.gz')
    elif pickname == 'flo':
        fout = os.path.join(opth, 'affine_flo-' \
                + os.path.basename(fflo).split('.nii')[0]+fcomment+'.nii.gz')

    if isinstance(intrp, (int, long)): intrp = str(intrp)

    cmd = [
        executable, '-ref', fref, '-flo', fflo, '-trans', faff, '-res', fout,
        '-inter', intrp
    ]
    if not verbose:
        cmd.append('-voff')
    call(cmd)

    return fout
Beispiel #2
0
def resample_vinci(
    fref,
    fflo,
    faff,
    intrp=0,
    fimout='',
    fcomment='',
    outpath='',
    pickname='ref',
    vc='',
    con='',
    vincipy_path='',
    atlas_resample=False,
    atlas_ref_make=False,
    atlas_ref_del=False,
    close_vinci=False,
    close_buff=True,
):
    ''' Resample the floating image <fflo> into the geometry of <fref>,
        using the Vinci transformation output <faff> (an *.xml file).
        Output the NIfTI file path of the resampled/resliced image.
    '''

    #---------------------------------------------------------------------------
    #> output path
    if outpath == '' and fimout != '' and '/' in fimout:
        opth = os.path.dirname(fimout)
        if opth == '':
            opth = os.path.dirname(fflo)
        fimout = os.path.basename(fimout)

    elif outpath == '':
        opth = os.path.dirname(fflo)
    else:
        opth = outpath
    imio.create_dir(opth)

    #> output floating and affine file names
    if fimout == '':
        if pickname == 'ref':
            fout = os.path.join(
                    opth,
                    'affine-ref-' \
                    +os.path.basename(fref).split('.nii')[0]+fcomment+'.nii.gz')
        else:
            fout = os.path.join(
                    opth,
                    'affine-flo-' \
                    +os.path.basename(fflo).split('.nii')[0]+fcomment+'.nii.gz')
    else:
        fout = os.path.join(opth, fimout.split('.nii')[0] + '.nii.gz')
    #---------------------------------------------------------------------------

    if vincipy_path == '':
        try:
            import resources
            vincipy_path = resources.VINCIPATH
        except:
            raise NameError('e> could not import resources \
                    or find variable VINCIPATH in resources.py')

    sys.path.append(vincipy_path)

    try:
        from VinciPy import Vinci_Bin, Vinci_Connect, Vinci_Core, Vinci_XML, Vinci_ImageT
    except ImportError:
        raise ImportError('e> could not import Vinci:\n \
                check the variable VINCIPATH (path to Vinci) in resources.py')

    #---------------------------------------------------------------------------
    #> start Vinci core engine if it is not running/given
    if vc == '' or con == '':
        #> adopted from the Vinci's example RunMMMJob.py
        bin = Vinci_Bin.Vinci_Bin()
        con = Vinci_Connect.Vinci_Connect(bin)
        vinci_binpath = con.StartMyVinci()

        vc = Vinci_Core.Vinci_CoreCalc(con)
        vc.StdProject()
    #---------------------------------------------------------------------------

    if int(intrp) == 0:
        interp_nn = True
    else:
        interp_nn = False

    #---------------------------------------------------------------------------
    #> change the reference image to be loaded as atlas
    if atlas_resample and atlas_ref_make:

        #> output file name for the extra reference image
        fextref = os.path.join(opth, 'reference-as-atlas.nii.gz')

        prc.nii_modify(fref, fimout=fextref, voxel_range=[0., 255.])

        ref = Vinci_ImageT.newTemporary(vc,
                                        szFileName=fextref,
                                        bLoadAsAtlas=atlas_resample)

        if atlas_ref_del:
            os.remove(fextref)

    else:
        ref = Vinci_ImageT.newTemporary(vc,
                                        szFileName=fref,
                                        bLoadAsAtlas=atlas_resample)
    #---------------------------------------------------------------------------

    #---------------------------------------------------------------------------
    #> reapply rigid transformation to new image

    flo = Vinci_ImageT.newTemporary(vc,
                                    szFileName=fflo,
                                    bLoadAsAtlas=atlas_resample)

    rsl = flo.reapplyMMMTransform(faff, refImage=ref, IsComputed=True)

    rsl.saveYourselfAs(bUseOffsetRotation=True,
                       bUseNextNeighbourInterp=interp_nn,
                       szFullFileName=fout)
    #---------------------------------------------------------------------------

    #> close image buffers for reference and floating
    if close_buff:
        ref.killYourself()
        flo.killYourself()
        rsl.killYourself()

    if close_vinci: con.CloseVinci(True)

    return fout
Beispiel #3
0
def coreg_vinci(
    fref,
    fflo,
    vc='',
    con='',
    vincipy_path='',
    scheme_xml='',
    outpath='',
    fname_aff='',
    pickname='ref',
    fcomment='',
    flo_colourmap='Green',
    close_vinci=False,
    close_buff=True,
    cleanup=True,
    save_res=False,
):

    if scheme_xml == '':
        raise IOError('e> the Vinci schema *.xml file is not provided. \n \
                i> please add the schema file in the call: scheme_xml=...')

    #---------------------------------------------------------------------------
    #> output path
    if outpath == '' and fname_aff != '' and '/' in fname_aff:
        opth = os.path.dirname(fname_aff)
        if opth == '':
            opth = os.path.dirname(fflo)
        fname_aff = os.path.basename(fname_aff)

    elif outpath == '':
        opth = os.path.dirname(fflo)
    else:
        opth = outpath
    imio.create_dir(opth)

    imio.create_dir(os.path.join(opth, 'affine-vinci'))

    #> output floating and affine file names
    if fname_aff == '':
        if pickname == 'ref':

            faff = os.path.join(
                    opth,
                    'affine-vinci',
                    'affine-ref-' \
                    +os.path.basename(fref).split('.nii')[0]+fcomment+'.xml')

            fout = os.path.join(
                    opth,
                    'affine-vinci',
                    'affine-ref-' \
                    +os.path.basename(fref).split('.nii')[0]+fcomment+'.nii.gz')

        else:
            faff = os.path.join(
                    opth,
                    'affine-vinci',
                    'affine-flo-' \
                    +os.path.basename(fflo).split('.nii')[0]+fcomment+'.xml')

            fout = os.path.join(
                    opth,
                    'affine-vinci',
                    'affine-flo-' \
                    +os.path.basename(fflo).split('.nii')[0]+fcomment+'.nii.gz')

    else:

        #> add '.xml' extension if not in the affine output file name
        if not fname_aff.endswith('.xml'):
            fname_aff += '.xml'

        faff = os.path.join(opth, 'affine-vinci', fname_aff)

        fout = os.path.join(opth, fname_aff.split('.')[0] + '.nii.gz')
    #---------------------------------------------------------------------------

    if vincipy_path == '':
        try:
            import resources
            vincipy_path = resources.VINCIPATH
        except:
            raise NameError('e> could not import resources \
                    or find variable VINCIPATH in resources.py')

    sys.path.append(vincipy_path)

    try:
        from VinciPy import Vinci_Bin, Vinci_Connect, Vinci_Core, Vinci_XML, Vinci_ImageT
    except ImportError:
        raise ImportError('e> could not import Vinci:\n \
                check the variable VINCIPATH (path to Vinci) in resources.py')

    #> start Vinci core engine if it is not running/given
    if vc == '' or con == '':
        #> adopted from the Vinci's example RunMMMJob.py
        bin = Vinci_Bin.Vinci_Bin()
        con = Vinci_Connect.Vinci_Connect(bin)
        vinci_binpath = con.StartMyVinci()

        vc = Vinci_Core.Vinci_CoreCalc(con)
        vc.StdProject()

    #> read the registration schema file
    f = open(scheme_xml, 'rb')
    reg_scheme = f.read()
    f.close()

    #> check scheme data file and remove possible XML comments at its beginning
    root = Vinci_XML.ElementTree.fromstring(reg_scheme)
    if root.tag != "MMM":
        sys.exit("scheme data file %s does not contain tag MMM\n" % scheme_xml)
    reg_scheme = Vinci_XML.ElementTree.tostring(root)
    # bytes -> str
    reg_scheme = reg_scheme.decode("utf-8")

    #> pick reference and floating images
    ref = Vinci_ImageT.newTemporary(vc, szFileName=fref)
    rsl = Vinci_ImageT.newTemporary(vc, szFileName=fflo)

    #> set the colour map for the floating image
    rsl.setColorSettings(CTable=flo_colourmap)

    #---------------------------------------------------------------------------
    #> perform the registration
    rsl.alignToRef(ref, reg_scheme, szRegistrationSummaryFile=faff)
    #---------------------------------------------------------------------------

    #> find the weird folder name created and to be disposed of.
    if cleanup:
        #> get the folder name (going to rubbish)
        del_dir = os.path.normpath(faff).split(os.sep)[1]
        fflo_dir = os.path.split(fflo)[0]
        del_dir = os.path.join(
            os.path.split(fflo)[0],
            os.path.normpath(faff).split(os.sep)[1])
        if os.path.isdir(del_dir):
            shutil.rmtree(del_dir)

    #> save the registered image
    if save_res:
        rsl.saveYourselfAs(bUseOffsetRotation=True, szFullFileName=fout)

    #> close image buffers for reference and floating
    if close_buff:
        rsl.killYourself()
        ref.killYourself()

    if close_vinci: con.CloseVinci(True)
    #else:          con.CloseSockets()

    return {'faff': faff, 'fim': fout, 'vinci_con': con, 'vinci_vc': vc}
Beispiel #4
0
def resample_mltp_spm(fims,
                      ftr,
                      interp=1.,
                      which=1,
                      mask=0,
                      mean=0,
                      graph=0,
                      niisort=False,
                      prefix='r_',
                      outpath='',
                      fcomment='',
                      pickname='ref',
                      copy_input=False,
                      del_in_uncmpr=False,
                      del_out_uncmpr=False):
    '''
        fims:   has to be a list of at least two files with the first one acting
                as a reference.
    '''

    if not isinstance(fims, list) and not isinstance(fims[0], basestring):
        raise ValueError('e> unrecognised list of input images')

    if not os.path.isfile(ftr):
        raise IOError(
            'e> cannot open the file with translations and rotations')

    #> output path
    if outpath == '':
        opth = os.path.dirname(fims[0])
    else:
        opth = outpath

    imio.create_dir(opth)

    #> working file names (not touching the original ones)
    _fims = []

    #> decompress if necessary
    for f in fims:
        if not os.path.isfile(f) and not (f.endswith('nii')
                                          or f.endswith('nii.gz')):
            raise IOError('e> could not open file:', f)

        if f[-3:] == '.gz':
            fugz = imio.nii_ugzip(f, outpath=os.path.join(opth, 'copy'))
        elif copy_input:
            fnm = os.path.basename(f).split('.nii')[0] + '_copy.nii'
            fugz = os.path.join(opth, 'copy', fnm)
            shutil.copyfile(f, fugz)
        else:
            fugz = f

        _fims.append(fugz)

    if niisort:
        niisrt = imio.niisort(_fims)
        _fims = niisrt['files']

    #> maximal number of characters per line (for Matlab array)
    Pinmx = max([len(f) for f in _fims])

    #> equalise the input char array
    Pineq = [f.ljust(Pinmx) for f in _fims]

    #---------------------------------------------------------------------------
    #> SPM reslicing (resampling) flags
    flgs = []

    flgs.append('flgs.mask = ' + str(mask))
    flgs.append('flgs.mean = ' + str(mean))

    flgs.append('flgs.which = ' + str(which))
    flgs.append('flgs.interp = ' + str(interp))
    flgs.append('flgs.graphics = ' + str(graph))
    flgs.append('flgs.wrap = [0 0 0]')
    flgs.append('flgs.prefix = ' + "'" + prefix + "'")

    flgs.append('disp(flgs)')
    #---------------------------------------------------------------------------

    fsrpt = os.path.join(opth, 'pyauto_script_resampling.m')
    with open(fsrpt, 'w') as f:
        f.write(
            '% AUTOMATICALLY GENERATED MATLAB SCRIPT FOR SPM RESAMPLING PET IMAGES\n\n'
        )

        f.write('%> the following flags for image reslicing are used:\n')
        f.write("disp('m> SPM reslicing flags:');\n")
        for item in flgs:
            f.write("%s;\n" % item)

        f.write('\n%> the following PET images will be aligned:\n')
        f.write("disp('m> PET images for SPM reslicing:');\n")

        f.write('P{1,1} = [...\n')
        for item in Pineq:
            f.write("'%s'\n" % item)
        f.write('];\n\n')
        f.write('disp(P{1,1});\n')

        # f.write('\n%> the following PET images will be aligned using the translations and rotations in X:\n')
        # f.write("X = dlmread('"+ftr+"');\n")
        # f.write('for fi = 2:'+str(len(fims))+'\n')
        # f.write("    VF = strcat(P{1,1}(fi,:),',1');\n")
        # f.write('    M_ = zeros(4,4);\n')
        # f.write('    M_(:,:) = spm_get_space(VF);\n')
        # f.write('    M = spm_matrix(X(fi,:));\n')
        # f.write('    spm_get_space(VF, M\M_(:,:));\n')
        # f.write('end\n\n')

        f.write('spm_reslice(P, flgs);\n')

    cmd = [
        'matlab', '-nodisplay', '-nodesktop', '-r',
        'run(' + '\'' + fsrpt + '\'' + '); exit'
    ]
    call(cmd)

    if del_in_uncmpr:
        for fpth in _fims:
            os.remove(fpth)
Beispiel #5
0
def realign_mltp_spm(fims,
                     quality=1.0,
                     fwhm=6,
                     sep=4,
                     rtm=1,
                     interp=2,
                     graph=0,
                     outpath='',
                     fcomment='',
                     niicopy=False,
                     niisort=False):
    '''
        fims:   has to be a list of at least two files with the first one acting
                as a reference.
    '''

    #> input folder
    inpath = os.path.dirname(fims[0])

    #> output folder
    if outpath == '':
        outpath = os.path.join(inpath, 'align')
    else:
        outpath = os.path.join(outpath, 'align')

    if fims[0][-3:] == '.gz' or niicopy:
        tmpth = outpath  #os.path.join(outpath, 'tmp')
        rpth = tmpth
    else:
        tmpth = outpath
        rpth = inpath

    imio.create_dir(tmpth)

    #> uncompress for SPM
    fungz = []
    for f in fims:
        if f[-3:] == '.gz':
            fun = imio.nii_ugzip(f, outpath=tmpth)
        elif os.path.isfile(f) and f.endswith('nii'):
            if niicopy:
                fun = os.path.join(
                    tmpth,
                    os.path.basename(f).split('.nii')[0] + '_copy.nii')
                shutil.copyfile(f, fun)
            else:
                fun = f
        else:
            print 'w> omitting file/folder:', f
        fungz.append(fun)

    if niisort:
        niisrt = imio.niisort([os.path.join(tmpth,f) for f in os.listdir(tmpth) \
                if os.path.isfile(os.path.join(tmpth,f))])
        fsrt = niisrt['files']
    else:
        fsrt = fungz

    P_input = [f+',1' for f in fsrt\
        if f.endswith('nii') and f[0]!='r' and 'mean' not in f]

    #> maximal number of characters per line (for Matlab array)
    Pinmx = max([len(f) for f in P_input])

    #> equalise the input char array
    Pineq = [f.ljust(Pinmx) for f in P_input]

    #---------------------------------------------------------------------------
    #> MATLAB realign flags for SPM
    flgs = []
    pw = '\'\''

    flgs.append('flgs.quality = ' + str(quality))
    flgs.append('flgs.fwhm = ' + str(fwhm))
    flgs.append('flgs.sep = ' + str(sep))
    flgs.append('flgs.rtm = ' + str(rtm))
    flgs.append('flgs.pw  = ' + str(pw))
    flgs.append('flgs.interp = ' + str(interp))
    flgs.append('flgs.graphics = ' + str(graph))
    flgs.append('flgs.wrap = [0 0 0]')

    flgs.append('disp(flgs)')
    #---------------------------------------------------------------------------

    fscript = os.path.join(outpath, 'pyauto_script_realign.m')

    with open(fscript, 'w') as f:
        f.write(
            '% AUTOMATICALLY GENERATED MATLAB SCRIPT FOR SPM PET REALIGNMENT\n\n'
        )

        f.write('%> the following flags for PET image alignment are used:\n')
        f.write("disp('m> SPM realign flags:');\n")
        for item in flgs:
            f.write("%s;\n" % item)

        f.write('\n%> the following PET images will be aligned:\n')
        f.write("disp('m> PET images for SPM realignment:');\n")

        f.write('P{1,1} = [...\n')
        for item in Pineq:
            f.write("'%s'\n" % item)
        f.write('];\n\n')
        f.write('disp(P{1,1});\n')

        f.write('spm_realign(P, flgs);')

    cmd = [
        'matlab', '-nodisplay', '-nodesktop', '-r',
        'run(' + '\'' + fscript + '\'' + '); exit'
    ]
    call(cmd)

    fres = glob.glob(os.path.join(rpth, 'rp*.txt'))[0]
    res = np.loadtxt(fres)

    return {'fout': fres, 'outarray': res, 'P': Pineq, 'fims': fsrt}
Beispiel #6
0
def resample_spm(imref,
                 imflo,
                 M,
                 matlab_eng='',
                 intrp=1.,
                 which=1,
                 mask=0,
                 mean=0,
                 outpath='',
                 fimout='',
                 fcomment='',
                 prefix='r_',
                 pickname='ref',
                 del_ref_uncmpr=False,
                 del_flo_uncmpr=False,
                 del_out_uncmpr=False):

    print '====================================================================='
    print ' S P M  inputs:'
    print '> ref:', imref
    print '> flo:', imflo
    print '====================================================================='

    import matlab
    from pkg_resources import resource_filename

    #-start Matlab engine if not given
    if matlab_eng == '':
        import matlab.engine
        eng = matlab.engine.start_matlab()
    else:
        eng = matlab_eng

    # add path to SPM matlab file
    spmpth = resource_filename(__name__, 'spm')
    eng.addpath(spmpth, nargout=0)

    #> output path
    if outpath == '' and fimout != '':
        opth = os.path.dirname(fimout)
        if opth == '':
            opth = os.path.dirname(imflo)

    elif outpath == '':
        opth = os.path.dirname(imflo)

    else:
        opth = outpath

    imio.create_dir(opth)

    #> decompress if necessary
    if imref[-3:] == '.gz':
        imrefu = imio.nii_ugzip(imref, outpath=opth)
    else:
        fnm = os.path.basename(imref).split('.nii')[0] + '_copy.nii'
        imrefu = os.path.join(opth, fnm)
        shutil.copyfile(imref, imrefu)

    #> floating
    if imflo[-3:] == '.gz':
        imflou = imio.nii_ugzip(imflo, outpath=opth)
    else:
        fnm = os.path.basename(imflo).split('.nii')[0] + '_copy.nii'
        imflou = os.path.join(opth, fnm)
        shutil.copyfile(imflo, imflou)

    if isinstance(M, basestring):
        if os.path.basename(M).endswith('.txt'):
            M = np.loadtxt(M)
            print 'i> matrix M given in the form of text file'
        elif os.path.basename(M).endswith('.npy'):
            M = np.load(M)
            print 'i> matrix M given in the form of NumPy file'
        else:
            raise IOError('e> unrecognised file extension for the affine.')

    elif isinstance(M, (np.ndarray, np.generic)):
        print 'i> matrix M given in the form of Numpy array'
    else:
        raise IOError('The form of affine matrix not recognised.')

    # run the Matlab SPM resampling
    r = eng.resample_spm_m(imrefu, imflou, matlab.double(M.tolist()), mask,
                           mean, intrp, which, prefix)

    #-compress the output
    split = os.path.split(imflou)
    fim = os.path.join(split[0], prefix + split[1])
    imio.nii_gzip(fim, outpath=opth)

    # delete the uncompressed
    if del_ref_uncmpr: os.remove(imrefu)
    if del_flo_uncmpr and os.path.isfile(imflou): os.remove(imflou)
    if del_out_uncmpr: os.remove(fim)

    #> the compressed output naming
    if fimout != '':
        fout = os.path.join(opth, fimout)
    elif pickname == 'ref':
        fout = os.path.join(opth, 'affine_ref-' \
                + os.path.basename(imrefu).split('.nii')[0]+fcomment+'.nii.gz')
    elif pickname == 'flo':
        fout = os.path.join(opth, 'affine_flo-' \
                + os.path.basename(imflo).split('.nii')[0]+fcomment+'.nii.gz')
    # change the file name
    os.rename(fim + '.gz', fout)

    return fout
Beispiel #7
0
def coreg_spm(
    imref,
    imflo,
    matlab_eng='',
    outpath='',
    fname_aff='',
    fcomment='',
    pickname='ref',
    costfun='nmi',
    sep=[4, 2],
    tol=[
        0.0200, 0.0200, 0.0200, 0.0010, 0.0010, 0.0010, 0.0100, 0.0100, 0.0100,
        0.0010, 0.0010, 0.0010
    ],
    fwhm=[7, 7],
    params=[0, 0, 0, 0, 0, 0],
    graphics=1,
    visual=0,
    del_uncmpr=True,
    save_arr=True,
    save_txt=True,
):

    import matlab
    from pkg_resources import resource_filename

    #-start Matlab engine if not given
    if matlab_eng == '':
        import matlab.engine
        eng = matlab.engine.start_matlab()
    else:
        eng = matlab_eng

    # add path to SPM matlab file
    spmpth = resource_filename(__name__, 'spm')
    print 'PATH: ' + spmpth
    eng.addpath(spmpth, nargout=0)

    #> output path
    if outpath == '' and fname_aff != '' and '/' in fname_aff:
        opth = os.path.dirname(fname_aff)
        if opth == '':
            opth = os.path.dirname(imflo)
        fname_aff = os.path.basename(fname_aff)
    elif outpath == '':
        opth = os.path.dirname(imflo)
    else:
        opth = outpath
    imio.create_dir(opth)

    #> decompress ref image as necessary
    if imref[-3:] == '.gz':
        imrefu = imio.nii_ugzip(imref, outpath=opth)
    else:
        fnm = os.path.basename(imref).split('.nii')[0] + '_copy.nii'
        imrefu = os.path.join(opth, fnm)
        shutil.copyfile(imref, imrefu)

    #> floating
    if imflo[-3:] == '.gz':
        imflou = imio.nii_ugzip(imflo, outpath=opth)
    else:
        fnm = os.path.basename(imflo).split('.nii')[0] + '_copy.nii'
        imflou = os.path.join(opth, fnm)
        shutil.copyfile(imflo, imflou)

    # run the matlab SPM coregistration
    Mm, xm = eng.coreg_spm_m(imrefu,
                             imflou,
                             costfun,
                             matlab.double(sep),
                             matlab.double(tol),
                             matlab.double(fwhm),
                             matlab.double(params),
                             graphics,
                             visual,
                             nargout=2)

    # get the affine matrix
    M = np.array(Mm._data.tolist())
    M = M.reshape(4, 4).T

    # get the translation and rotation parameters in a vector
    x = np.array(xm._data.tolist())

    # delete the uncompressed files
    if del_uncmpr:
        if imref[-3:] == '.gz': os.remove(imrefu)
        if imflo[-3:] == '.gz': os.remove(imflou)

    imio.create_dir(os.path.join(opth, 'affine-spm'))

    #---------------------------------------------------------------------------
    if fname_aff == '':
        if pickname == 'ref':
            faff = os.path.join(
                opth, 'affine-spm', 'affine-ref-' +
                os.path.basename(imref).split('.nii')[0] + fcomment + '.npy')
        else:
            faff = os.path.join(
                opth, 'affine-spm', 'affine-flo-' +
                os.path.basename(imflo).split('.nii')[0] + fcomment + '.npy')

    else:

        #> add '.npy' extension if not in the affine output file name
        if not fname_aff.endswith('.npy'):
            fname_aff += '.npy'

        faff = os.path.join(opth, 'affine-spm', fname_aff)
    #---------------------------------------------------------------------------

    #> safe the affine transformation
    if save_arr:
        np.save(faff, M)
    if save_txt:
        np.savetxt(faff.split('.npy')[0] + '.txt', M)

    return {
        'affine': M,
        'faff': faff,
        'rotations': x[3:],
        'translations': x[:3],
        'matlab_eng': eng
    }
Beispiel #8
0
def resample_fsl(imref,
                 imflo,
                 faff,
                 outpath='',
                 fimout='',
                 pickname='ref',
                 fcomment='',
                 intrp=1,
                 executable=''):

    if executable == '':
        if 'FSLDIR' not in os.environ:
            raise IOError('e> no FSL executable provided!')
        else:
            executable = os.path.join(os.environ['FSLDIR'], 'bin', 'flirt')

    if not os.path.isfile(executable) or not call([executable, '-version'
                                                   ]) == 0:
        raise IOError('e> no valid FSL executable provided!')

    print '==================================================================='
    print ' F S L  resampling'

    #> output path
    if outpath == '' and fimout != '':
        opth = os.path.dirname(fimout)
        if opth == '':
            opth = os.path.dirname(imflo)

    elif outpath == '':
        opth = os.path.dirname(imflo)
    elif outpath != '':
        opth = outpath

    imio.create_dir(opth)

    #> the output naming
    if '/' in fimout:
        fout = fimout
    elif fimout != '' and not os.path.isfile(fimout):
        fout = os.path.join(opth, fimout)
    elif pickname == 'ref':
        fout = os.path.join(opth, 'affine_ref-' \
                + os.path.basename(imref).split('.nii')[0]+fcomment+'.nii.gz')
    elif pickname == 'flo':
        fout = os.path.join(opth, 'affine_flo-' \
                + os.path.basename(imflo).split('.nii')[0]+fcomment+'.nii.gz')

    intrp = int(intrp)
    if isinstance(intrp, (int, long)): intrp = str(intrp)
    if intrp == '1':
        interpolation = 'trilinear'
    elif intrp == '0':
        interpolation = 'nearestneighbour'

    cmd = [
        executable, '-in', imflo, '-ref', imref, '-out', fout, '-init', faff,
        '-applyxfm', '-interp', interpolation
    ]
    call(cmd)

    print 'D O N E'
    print '==================================================================='

    return fout
Beispiel #9
0
def affine_niftyreg(fref,
                    fflo,
                    outpath='',
                    fname_aff='',
                    pickname='ref',
                    fcomment='',
                    executable='',
                    omp=1,
                    rigOnly=False,
                    affDirect=False,
                    maxit=5,
                    speed=True,
                    pi=50,
                    pv=50,
                    smof=0,
                    smor=0,
                    rmsk=True,
                    fmsk=True,
                    rfwhm=15.,
                    rthrsh=0.05,
                    ffwhm=15.,
                    fthrsh=0.05,
                    verbose=True):

    # check if the executable exists:
    if not os.path.isfile(executable):
        raise IOError('Incorrect path to executable file for registration.')

    #create a folder for images registered to ref
    if outpath != '':
        odir = os.path.join(outpath, 'affine-niftyreg')
        fimdir = os.path.join(outpath, os.path.join('affine-niftyreg', 'mask'))
    else:
        odir = os.path.join(os.path.dirname(fflo), 'affine-niftyreg')
        fimdir = os.path.join(os.path.dirname(fflo), 'affine-niftyreg', 'mask')
    imio.create_dir(odir)
    imio.create_dir(fimdir)

    if rmsk:
        f_rmsk = os.path.join(
            fimdir,
            'rmask_' + os.path.basename(fref).split('.nii')[0] + '.nii.gz')
        create_mask(fref, fimout=f_rmsk, thrsh=rthrsh, fwhm=rfwhm)

    if fmsk:
        f_fmsk = os.path.join(
            fimdir,
            'fmask_' + os.path.basename(fflo).split('.nii')[0] + '.nii.gz')
        create_mask(fflo, fimout=f_fmsk, thrsh=fthrsh, fwhm=ffwhm)

    # output in register with ref and text file for the affine transform
    if fname_aff != '':
        fout = os.path.join(odir, fname_aff.split('.')[0] + '.nii.gz')
        faff = os.path.join(odir, fname_aff)
    else:
        if pickname == 'ref':
            fout = os.path.join(odir, 'affine_ref-' \
                +os.path.basename(fref).split('.nii')[0]+fcomment+'.nii.gz')
            faff = os.path.join(odir, 'affine_ref-' \
                +os.path.basename(fref).split('.nii')[0]+fcomment+'.txt')
        elif pickname == 'flo':
            fout = os.path.join(odir, 'affine_flo-' \
                +os.path.basename(fflo).split('.nii')[0]+fcomment+'.nii.gz')
            faff = os.path.join(odir, 'affine_flo-' \
                +os.path.basename(fflo).split('.nii')[0]+fcomment+'.txt')

    # call the registration routine
    cmd = [
        executable, '-ref', fref, '-flo', fflo, '-aff', faff, '-pi',
        str(pi), '-pv',
        str(pv), '-smooF',
        str(smof), '-smooR',
        str(smor), '-maxit', '10', '-omp',
        str(omp), '-res', fout
    ]
    if speed:
        cmd.append('-speeeeed')
    if rigOnly:
        cmd.append('-rigOnly')
    if affDirect:
        cmd.append('affDirect')
    if rmsk:
        cmd.append('-rmask')
        cmd.append(f_rmsk)
    if fmsk:
        cmd.append('-fmask')
        cmd.append(f_fmsk)
    if not verbose:
        cmd.append('-voff')

    call(cmd)

    #> affine to Numpy array
    aff = np.loadtxt(faff)

    return {'affine': aff, 'faff': faff, 'fim': fout}  #faff, fout
Beispiel #10
0
def affine_fsl(fref,
               fflo,
               outpath='',
               fname_aff='',
               pickname='ref',
               fcomment='',
               executable='',
               costfun='normmi',
               dof=6,
               hstbins=256,
               verbose=True):

    if executable == '':
        if 'FSLDIR' not in os.environ:
            raise IOError('e> no FSL executable provided!')
        else:
            executable = os.path.join(os.environ['FSLDIR'], 'bin', 'flirt')

    if not os.path.isfile(executable) or not call([executable, '-version'
                                                   ]) == 0:
        raise IOError('e> no valid FSL executable provided!')

    #---------------------------------------------------------------------------
    #> output path
    if outpath == '' and fname_aff != '' and os.path.isfile(fname_aff):
        opth = os.path.dirname(fname_aff)
        if opth == '':
            opth = os.path.dirname(fflo)
        fname_aff = os.path.basename(fname_aff)

    elif outpath == '':
        opth = os.path.dirname(fflo)
    else:
        opth = outpath
    imio.create_dir(opth)

    imio.create_dir(os.path.join(opth, 'affine-fsl'))

    #> output floating and affine file names
    if fname_aff == '':

        if pickname == 'ref':
            faff = os.path.join(
                    opth,
                    'affine-fsl',
                    'affine-ref-' \
                    +os.path.basename(fref).split('.nii')[0]+fcomment+'.txt')

        else:
            faff = os.path.join(
                    opth,
                    'affine-fsl',
                    'affine-flo-' \
                    +os.path.basename(fflo).split('.nii')[0]+fcomment+'.txt')

    else:

        #> add '.xml' extension if not in the affine output file name
        if not fname_aff.endswith('.txt'):
            fname_aff += '.txt'

        faff = os.path.join(opth, 'affine-vinci', fname_aff)
    #---------------------------------------------------------------------------

    #> command with options for FSL-FLIRT registration
    cmd = [
        executable, '-cost', costfun, '-dof',
        str(dof), '-omat', faff, '-in', fflo, '-ref', fref, '-bins',
        str(hstbins)
    ]

    #> add verbose mode if requested
    if isinstance(verbose, bool): verbose = int(verbose)
    if verbose > 0: cmd.extend(['-verbose', str(verbose)])

    #> execute FSL-FLIRT command with the above options
    call(cmd)

    # convert to Numpy float
    aff = np.loadtxt(faff)

    return {'affine': aff, 'faff': faff}