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)
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)
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
"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)
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)
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)
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)
"-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])
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)