コード例 #1
0
def gen_parc_masks(rois, roiNums, parcVol, outDir,
                   doVolStats=True, redo=False, logFN=None):
    import os
    import numpy as np
    from scipy.io import savemat as savemat
    from scai_utils import check_bin_path, check_file, \
                           cmd_stdout, saydo, info_log, error_log

    check_bin_path("fslstats", logFN=logFN)

    volStats = {"roiName": [], "nVoxels": [], "mm3": []}
    for (i0, roi) in enumerate(rois):
        roiNum = roiNums[i0]
            
        maskFN = os.path.join(outDir, "%s.diff.nii.gz" % roi)
        binCmd = "mri_binarize --i %s --match %d --o %s" % \
                 (parcVol, roiNum, maskFN)
            
        if not os.path.isfile(maskFN) or redo:
            saydo(binCmd, logFN=logFN)
        check_file(maskFN, logFN=logFN)

        #= Volume stats =#
        (so, se) = cmd_stdout("fslstats %s -V" % maskFN)
        assert(len(se) == 0)
            
        so = so.split(" ")
        assert(len(so) >= 2)
        
        volStats["nVoxels"].append(int(so[0]))
        volStats["mm3"].append(float(so[1]))
        volStats["roiName"].append(roi)
            
    if doVolStats:
        volStats["roiName"] = np.array(volStats["roiName"])
        volStats["nVoxels"] = np.array(volStats["nVoxels"])
        volStats["mm3"] = np.array(volStats["mm3"])
    
        volStatsFN = os.path.join(outDir, "vol_stats.mat")
        savemat(volStatsFN, volStats)
        check_file(volStatsFN, logFN=logFN)

        info_log("INFO: %s: Saved volume stats of the mask files at\n\t%s" \
                 % (gen_parc_masks.__name__, volStatsFN), logFN=logFN)
コード例 #2
0
def generate_design_matrix(isAWS, matFN, bReverse=False):
# Input arguments:
#     isAWS: vector of 0's and 1's
#     matFN: output design matrix .mat file name 
#     bReverse: if AWS should be set to -1 and ANS to +1 (default: no)

    if len(isAWS) < 2:
        error_log("The design matrix cannot be generated because there are fewer than two subjects")

    if not matFN.endswith(".mat"):
        error_log("The input .mat file name %s has a wrong extension name" % matFN)

    X_line = 'X = ['
    for (i0, t_isAWS) in enumerate(isAWS):
        t_x = (float(t_isAWS) * 2.0 - 1.0)
        if bReverse:
            X_line += "%.1f; " % -t_x
        else:
            X_line += "%.1f; " % t_x

    X_line = X_line[:-2] + "];\n"
    X_line += "X = [ones(%d , 1), X];\n" % len(isAWS)
    X_line += "save('%s', 'X', '-v4');\n" % os.path.abspath(matFN)
    print(X_line) # DEBUG
    
    (t_path, t_fn) = os.path.split(os.path.abspath(matFN))
    mScriptGenX = os.path.join(t_path, 'gen_%s' % t_fn.replace(".mat", ".m"))

    mScriptGenX_f = open(mScriptGenX, "wt")
    mScriptGenX_f.write(X_line)
    mScriptGenX_f.close()
    check_file(mScriptGenX)


    matlabCmd = "%s -nosplash -nodesktop -r 'run %s; exit; '" % \
                (MATLAB_BIN, mScriptGenX)
    saydo(matlabCmd)
    check_file(matFN)
コード例 #3
0
def get_parc_stats(fsDir, subjID, parcName, bVerbose=False):
    import sys, os
    import tempfile
    from scai_utils import (
        check_dir,
        check_file,
        check_bin_path,
        info_log,
        cmd_stdout,
        saydo,
        read_text_file,
        remove_empty_strings,
    )

    # === Constants ===#
    hemis = ["lh", "rh"]
    segStatsBin = "mri_segstats"

    # === Implementation ===#
    check_bin_path(segStatsBin)

    sDir = os.path.join(fsDir, subjID)
    check_dir(sDir)

    lblDir = os.path.join(sDir, "label")
    check_dir(sDir)

    if bVerbose:
        info_log("Label directory = %s" % lblDir)

    morphInfo = {}

    rois = []
    area_mm2 = []

    for (i0, hemi) in enumerate(hemis):
        if bVerbose:
            info_log("Working on hemisphere: %s" % hemi)

        annot = os.path.join(lblDir, "%s.%s.annot" % (hemi, parcName))
        check_file(annot)

        tmpSum = tempfile.mktemp()
        cmd = "%s --annot %s %s %s --sum %s" % (segStatsBin, subjID, hemi, parcName, tmpSum)
        saydo(cmd)

        check_file(tmpSum)
        if bVerbose:
            print("Intermediate results saved at: %s" % tmpSum)

        t = read_text_file(tmpSum)

        for (i0, tline) in enumerate(t):
            tline = tline.strip()
            if len(tline) == 0:
                continue
            elif tline.startswith("#"):
                continue

            t_items = remove_empty_strings(tline.split())
            if len(t_items) != 5:
                continue

            t_roi = t_items[4]
            if t_roi.lower() == "none":
                continue

            rois.append("%s_%s" % (hemi, t_roi))
            area_mm2.append(float(t_items[3]))

        saydo("rm -rf %s" % tmpSum)
    morphInfo["rois"] = rois
    morphInfo["area_mm2"] = area_mm2

    return morphInfo
コード例 #4
0
                                  "nii", "func2struct.bbr.mat")
            check_file(bbrMat)

            cvConFN = os.path.join(L1Dir, "con_%.4d.commVol.nii.gz" % \
                                          args.contrastNum)
            #=== Locate the warp files ===#
            fnirtWarp = os.path.join(args.batchBase, sID, 
                                     "fnirt", 
                                     "fnirt_to_%s_warp.nii.gz" % templateSuffix)
            check_file(fnirtWarp)

            if args.bRedo or not os.path.isfile(cvConFN):
                warpCmd = "applywarp --ref=%s --in=%s --warp=%s --premat=%s --out=%s" % \
                          (VOL_TEMPLATE, conFN, fnirtWarp, bbrMat, cvConFN) \
                          + " --interp=trilinear"
                saydo(warpCmd)
                check_file(cvConFN)
            cvConFNs.append(cvConFN)
        else:
            #== Use vol2surf command to project the contrast values to the subject's own surface ===#
            #== Then use mris_preproc to project the data from the subject's own surface to the common space (fsaverage) ==#
            for hemi in HEMIS:
                surfConFN = os.path.join(L1Dir, "con_%.4d.%s.mgz" % \
                                             (args.contrastNum, hemi))
                if args.bRedo or not os.path.isfile(surfConFN):
                    projCmd = "mri_vol2surf --mov %s --reg %s --o %s --hemi %s --trgsubject %s --noreshape --interp trilin" % \
                              (conFN, bbrDat, surfConFN, hemi, sID)
                
                    saydo(projCmd)
                    check_file(surfConFN)
                
コード例 #5
0
    parser.add_argument("trg_sID", type=str, help="Target subject ID")
    parser.add_argument("trg_dir", type=str, help="Destination path for writing the new label files");
    
    if len(sys.argv) == 1:
        parser.print_help()
        sys.exit(0)

    args = parser.parse_args()
    src_sID = args.src_sID
    src_dir = args.src_dir
    hemi = args.hemi
    trg_sID = args.trg_sID
    trg_dir = args.trg_dir

    if not os.path.isdir(trg_dir):
        saydo("mkdir %s"%trg_dir)

    # Determine the set of ROIs
    cwd0 = os.getcwd()
    srcdir = os.path.join(FSDATA_DIR, src_sID, "label", src_dir)
    if not os.path.isdir(srcdir):
        raise Exception, "Cannot find source directory at location: %s"%(srcdir)

    d0 = glob.glob(os.path.join(srcdir, "%s.*.label"%(hemi)))
    if len(d0) == 0:
        raise Exception, "Found no files in source directory: %s"%(srcdir)

    d0.sort()
    rois = []
    for fn in d0:
        [fpath, fnn] = os.path.split(fn)
コード例 #6
0
    check_dir(fsDataDir)

    boldDir = os.path.join(sDataDir, "bold")
    check_dir(boldDir)

    #=== Look for the fmri_model.mat and fmri_contrasts.mat files ===#
    modelMat = os.path.join(sDataDir, "fmri_model.mat")
    check_file(modelMat)
    info_log("modelMat = %s" % modelMat)

    contrMat = os.path.join(sDataDir, "fmri_contrasts.mat")
    check_file(contrMat)
    info_log("contrMat = %s" % contrMat)

    #=== Copy over the .mat files ===#
    saydo("cp %s %s/" % (modelMat, sBatchDataDir))
    saydo("cp %s %s/" % (contrMat, sBatchDataDir))

    #=== Load model mat and determine how many runs were collected ===#
    from scipy.io import loadmat
    
    mdl = loadmat(modelMat)
    nRuns = len(mdl["sess"][0])

    info_log("model file %s contains %d runs." % (modelMat, nRuns))

    #=== Look for raw bold volumes ===#
    info_log("Raw BOLD image dir = %s" % boldDir)        

    boldWC = machineSettings[hostName]["boldVolWC"].replace("{subjID}", sID)
    boldWC = os.path.join(boldDir, boldWC)
コード例 #7
0
def run_probtrackx(seedMask,
                   targMask,
                   bedpBase,
                   brainMask,
                   outDir,
                   doSeedNorm=True,
                   doSize=True,
                   doTargMaskedFDT=True,
                   ccStop=False,
                   bRedo=False,
                   logFN=None):
    #=========================================================#
    # Mode 1: from seed to targ
    #         Specify both seedMask and targMask
    #
    # Mode 2: from seed to all
    #         Specify only seedMask; set targMask=None
    #
    # Options:
    #         ccStop: Use corpus callosum stop mask
    #
    #=========================================================#
    import os
    from scai_utils import check_file, check_dir, check_bin_path, \
                           saydo, cmd_stdout, info_log, error_log
    from mri_utils import nz_voxels

    #== Get seed and targ nvox ==#
    check_file(seedMask, logFN=logFN)

    (seed_nVoxels, seed_mm3) = nz_voxels(seedMask)
    seed_nVoxels = float(seed_nVoxels)
    #assert(seed_nVoxels > 0)

    if targMask != None:
        check_file(targMask, logFN=logFN)

        (targ_nVoxels, targ_mm3) = nz_voxels(targMask)
        targ_nVoxels = float(targ_nVoxels)
        assert (targ_nVoxels > 0)

    check_bin_path("probtrackx", logFN=logFN)

    check_dir(outDir, logFN=logFN)

    if targMask != None:
        #= Prepare waypoint file =#
        wpfn = os.path.join(outDir, "waypoints.txt")
        wptext = os.path.abspath(targMask) + "\n"

        wpf = open(wpfn, "w")
        wpf.write(wptext)
        wpf.close()
        check_file(wpfn, logFN=logFN)

    cmd = 'probtrackx --mode=seedmask -x %s ' % seedMask + \
          '-s %s ' % bedpBase + \
          '-m %s ' % brainMask + \
          '-l -c 0.2 -S 2000 --steplength=0.5 ' + \
          '-P 5000 ' + \
          '--forcedir --opd --pd --dir=%s ' % outDir

    if targMask != None:
        cmd += "--stop=%s --waypoints=%s " % (targMask, wpfn)

    fdt_paths_fn = os.path.join(outDir, "fdt_paths.nii.gz")

    #== Get the size of fdt_paths.nii.gz. If the size is zero, start over. ==#

    if not os.path.isfile(fdt_paths_fn) \
            or os.path.getsize(fdt_paths_fn) <= 1 \
            or bRedo:
        saydo(cmd, logFN=logFN)

    #== Check for probtrackx completion ==#
    check_file(fdt_paths_fn, logFN=logFN)

    #== Save probtrackx command ==#
    cmd_fn = os.path.join(outDir, "command.txt")
    cmd_f = open(cmd_fn, "wt")
    cmd_f.write("%s\n" % cmd)
    cmd_f.close()
    check_file(cmd_fn, logFN=logFN)

    #== Generate seed size-normalized fdt_paths ==#
    fdt_paths_norm_fn = os.path.join(outDir, "fdt_paths_norm.nii.gz")
    check_bin_path("fslmaths", logFN=logFN)

    norm_cmd = "fslmaths -dt float %s -div %d %s -odt float" % \
               (fdt_paths_fn, seed_nVoxels, fdt_paths_norm_fn)
    if not os.path.isfile(fdt_paths_norm_fn) or bRedo:
        saydo(norm_cmd, logFN=logFN)

    check_file(fdt_paths_norm_fn, logFN=logFN)

    if doSize:
        #== Write to seed size file ==#
        seed_size_fn = os.path.join(outDir, 'seed_size.txt')
        seed_size_f = open(seed_size_fn, 'w')
        seed_size_f.write("%d %f" % (int(seed_nVoxels), seed_mm3))
        seed_size_f.close()
        check_file(seed_size_fn, logFN=logFN)

        info_log("INFO: Saved seed size data to file: %s" % seed_size_fn,
                 logFN=logFN)

        if targMask != None:
            #== Write to targ size file ==#
            targ_size_fn = os.path.join(outDir, 'targ_size.txt')
            targ_size_f = open(targ_size_fn, 'w')
            targ_size_f.write("%d %f" % (int(targ_nVoxels), targ_mm3))
            targ_size_f.close()
            check_file(targ_size_fn, logFN=logFN)

            info_log("INFO: Saved targ size data to file: %s" % targ_size_fn,
                     logFN=logFN)

    if (targMask != None) and doTargMaskedFDT:
        #== Get target masked tract density ==#
        check_bin_path("fslstats", logFN=logFN)
        (so, se) = cmd_stdout("fslstats %s -k %s -m" \
                              % (fdt_paths_norm_fn, targMask))
        assert (len(se) == 0)
        so = so.split()
        assert (len(so) >= 1)
        targ_masked_norm_fdt = float(so[0])

        targ_masked_norm_fdt_fn = \
            os.path.join(outDir, "targ_masked_norm_fdt.txt")
        tmnff = open(targ_masked_norm_fdt_fn, "wt")
        tmnff.write("%f" % targ_masked_norm_fdt)
        tmnff.close()

        check_file(targ_masked_norm_fdt_fn, logFN=logFN)

        info_log("INFO: Saved target-masked normalized FDT value tofile: %s" \
                 % targ_masked_norm_fdt_fn,
                 logFN=logFN)
コード例 #8
0
                                      "-overlay %s -fthresh %f -fmid %f " % \
                                      (sigImg, args.fThresh, args.fMid) + \
                                      "-colscalebarflag 1 "

                    # Prepare the tcl script
                    tclScript = tempfile.mktemp() + ".tcl"
                    t_imgFNs = []
                    t_imgFNs.append(imgFNs["lat"][-1])
                    t_imgFNs.append(imgFNs["med"][-1])
                    prep_tcl_script_surf(tclScript, t_imgFNs)

                    # Put in tcl script information 
                    tksurferCommand += "-tcl %s " % tclScript

                    # Execute tksurfer 
                    saydo(tksurferCommand)
                    saydo("rm -rf %s" % tclScript)
                    for imgFN in t_imgFNs:
                        check_file(imgFN)

                # Stitch images together
                # Horizontal stitches
                horizStitch = [""] * len(imgFNs.keys())
                for (j0, side) in enumerate(imgFNs.keys()):
                    horizStitch[j0] = tempfile.mktemp() + ".tiff"
                    stitchCmd = "%s %s %s +append %s" % (CONVERT_BIN, 
                                                         imgFNs[side][0], 
                                                         imgFNs[side][1], 
                                                         horizStitch[j0])
                    saydo(stitchCmd)
                    check_file(horizStitch[j0])
コード例 #9
0
def run_probtrackx(seedMask, targMask, bedpBase, brainMask, outDir, 
                   doSeedNorm=True, doSize=True, 
                   doTargMaskedFDT=True, 
                   ccStop=False, 
                   bRedo=False,
                   logFN=None):
#=========================================================#
# Mode 1: from seed to targ
#         Specify both seedMask and targMask
#
# Mode 2: from seed to all
#         Specify only seedMask; set targMask=None
#
# Options:
#         ccStop: Use corpus callosum stop mask
#
#=========================================================#
    import os
    from scai_utils import check_file, check_dir, check_bin_path, \
                           saydo, cmd_stdout, info_log, error_log
    from mri_utils import nz_voxels

    #== Get seed and targ nvox ==#
    check_file(seedMask, logFN=logFN)

    (seed_nVoxels, seed_mm3) = nz_voxels(seedMask)
    seed_nVoxels = float(seed_nVoxels)
    #assert(seed_nVoxels > 0)
    
    if targMask != None:
        check_file(targMask, logFN=logFN)
        
        (targ_nVoxels, targ_mm3) = nz_voxels(targMask)
        targ_nVoxels = float(targ_nVoxels)
        assert(targ_nVoxels > 0)
        
    check_bin_path("probtrackx", logFN=logFN)
        
    check_dir(outDir, logFN=logFN)

    if targMask != None:
        #= Prepare waypoint file =#
        wpfn = os.path.join(outDir, "waypoints.txt")
        wptext = os.path.abspath(targMask) + "\n"

        wpf = open(wpfn, "w")
        wpf.write(wptext)
        wpf.close()
        check_file(wpfn, logFN=logFN)
        
    cmd = 'probtrackx --mode=seedmask -x %s ' % seedMask + \
          '-s %s ' % bedpBase + \
          '-m %s ' % brainMask + \
          '-l -c 0.2 -S 2000 --steplength=0.5 ' + \
          '-P 5000 ' + \
          '--forcedir --opd --pd --dir=%s ' % outDir

    if targMask != None:
        cmd += "--stop=%s --waypoints=%s " % (targMask, wpfn)
        
    fdt_paths_fn = os.path.join(outDir, "fdt_paths.nii.gz")
    
    #== Get the size of fdt_paths.nii.gz. If the size is zero, start over. ==#

    if not os.path.isfile(fdt_paths_fn) \
            or os.path.getsize(fdt_paths_fn) <= 1 \
            or bRedo:
        saydo(cmd, logFN=logFN)

    #== Check for probtrackx completion ==#
    check_file(fdt_paths_fn, logFN=logFN)

    #== Save probtrackx command ==#
    cmd_fn = os.path.join(outDir, "command.txt")
    cmd_f = open(cmd_fn, "wt")
    cmd_f.write("%s\n" % cmd)
    cmd_f.close()
    check_file(cmd_fn, logFN=logFN)

    #== Generate seed size-normalized fdt_paths ==#
    fdt_paths_norm_fn = os.path.join(outDir, "fdt_paths_norm.nii.gz")
    check_bin_path("fslmaths", logFN=logFN)

    norm_cmd = "fslmaths -dt float %s -div %d %s -odt float" % \
               (fdt_paths_fn, seed_nVoxels, fdt_paths_norm_fn)
    if not os.path.isfile(fdt_paths_norm_fn) or bRedo:
        saydo(norm_cmd, logFN=logFN)
        
    check_file(fdt_paths_norm_fn, logFN=logFN)

    if doSize:
        #== Write to seed size file ==#
        seed_size_fn = os.path.join(outDir, 'seed_size.txt')
        seed_size_f = open(seed_size_fn, 'w')
        seed_size_f.write("%d %f" % (int(seed_nVoxels), seed_mm3))
        seed_size_f.close()
        check_file(seed_size_fn, logFN=logFN)

        info_log("INFO: Saved seed size data to file: %s" % seed_size_fn, 
                 logFN=logFN)

        if targMask != None:
            #== Write to targ size file ==#
            targ_size_fn = os.path.join(outDir, 'targ_size.txt')
            targ_size_f = open(targ_size_fn, 'w')
            targ_size_f.write("%d %f" % (int(targ_nVoxels), targ_mm3))
            targ_size_f.close()
            check_file(targ_size_fn, logFN=logFN)

            info_log("INFO: Saved targ size data to file: %s" % targ_size_fn,
                     logFN=logFN)

    if (targMask != None) and doTargMaskedFDT:
        #== Get target masked tract density ==#
        check_bin_path("fslstats", logFN=logFN)
        (so, se) = cmd_stdout("fslstats %s -k %s -m" \
                              % (fdt_paths_norm_fn, targMask))
        assert(len(se) == 0)
        so = so.split()
        assert(len(so) >= 1)
        targ_masked_norm_fdt = float(so[0])

        targ_masked_norm_fdt_fn = \
            os.path.join(outDir, "targ_masked_norm_fdt.txt")
        tmnff = open(targ_masked_norm_fdt_fn, "wt")
        tmnff.write("%f" % targ_masked_norm_fdt)
        tmnff.close()

        check_file(targ_masked_norm_fdt_fn, logFN=logFN)

        info_log("INFO: Saved target-masked normalized FDT value tofile: %s" \
                 % targ_masked_norm_fdt_fn,
                 logFN=logFN)