def main(InputNii,con,Regressor,meth,TR,itl,Fs,WrkDir=''): txt=np.loadtxt(Regressor) if not all([i==0 for i in txt]): RootDir,FileName=os.path.split(InputNii) trash='.exe' FileBase=FileName while trash: FileBase,trash=os.path.splitext(FileBase) OutputPath=os.path.join(RootDir,'tPython',meth,con) if not WrkDir: WrkDir=os.path.join(RootDir,'{}_Work'.format(FileBase)) GLMFiles=os.path.join(WrkDir,'WorkFiles','GLM',meth,con) ClusterJobDir=os.path.join(WrkDir,'ShFiles','GLM',meth,con) ErrorOutput=os.path.join(WrkDir,'ClusterError','GLM',meth,con) ClusterOutput=os.path.join(WrkDir,'ClusterOutput','GLM',meth,con) ReportFile=os.path.join(GLMFiles,'Report.txt') if os.path.exists(ReportFile): cmd='rm {}'.format(ReportFile) print cmd os.system(cmd) BaseDir,fname=os.path.split(InputNii) while not fname.find('.')==-1: fname,trash=os.path.splitext(fname) if not os.path.exists(WrkDir): os.makedirs(WrkDir) if not os.path.exists(ClusterJobDir): os.makedirs(ClusterJobDir) else: cmd='rm {}/*.sh'.format(ClusterJobDir) Report(ReportFile,cmd) os.system(cmd) if not os.path.exists(GLMFiles): os.makedirs(GLMFiles) else: cmd='rm {}/*'.format(GLMFiles) Report(ReportFile,cmd) os.system(cmd) if not os.path.exists(ErrorOutput): os.makedirs(ErrorOutput) else: cmd='rm {}/*'.format(ErrorOutput) Report(ReportFile,cmd) os.system(cmd) if not os.path.exists(ClusterOutput): os.makedirs(ClusterOutput) else: cmd='rm {}/*'.format(ClusterOutput) Report(ReportFile,cmd) os.system(cmd) if not os.path.exists(OutputPath): os.makedirs(OutputPath) print InputNii img=nb.load(InputNii) nslice=img.get_shape()[2] nb.loadsave.save(img,'{}/FullNii.nii.gz'.format(GLMFiles)) # cmd='cp {} {}/FullNii.nii'.format(InputNii,GLMFiles) # print cmd # process=sp.Popen(cmd,shell=True) # process.wait() cmd='fslsplit {0}/FullNii.nii {0}/RefVol -t'.format(GLMFiles) Report(ReportFile,cmd) process=sp.Popen(cmd,shell=True) process.wait() RVs=glob.glob(os.path.join(GLMFiles,'RefVol*')) for r in RVs[1:]: cmd='rm {}'.format(r) Report(ReportFile,cmd) process=sp.Popen(cmd,shell=True) process.wait() RV=RVs[0] cmd='fslsplit {} {}/RefZ -z'.format(RV,GLMFiles) Report(ReportFile,cmd) process=sp.Popen(cmd,shell=True) process.wait() RefVol=RV RVs=glob.glob(os.path.join(GLMFiles,'RefZ*')) for r in RVs[1:]: cmd='rm {}'.format(r) Report(ReportFile,cmd) process=sp.Popen(cmd,shell=True) process.wait() RV=RVs[0] cmd='fslsplit {0}/FullNii.nii {0}/vol -z'.format(GLMFiles) Report(ReportFile,cmd) process=sp.Popen(cmd,shell=True) process.wait() vols=sorted(glob.glob(os.path.join(GLMFiles,'vol*.nii.gz'))) nVols=len(vols) SlicesOrder,SliceTiming=MakeT(itl,0,nslice,TR) Regressor=np.loadtxt(Regressor) if not len(Regressor) >= img.shape[-1]*np.round(Fs*TR): print 'Interpolating' t1=np.array(range(len(Regressor)))*2 t20=np.arange(t1[0],t1[-1],1./Fs) f=tpl.interp1d(t1,Regressor,kind='cubic') Regressor=f(t20) for k in xrange(img.shape[2]): RegressorDownsampled=np.zeros((img.shape[-1])) if len(Regressor[np.round(SliceTiming[k]*Fs)::(np.round(Fs*TR))])<img.shape[3]: RegressorDownsampled = list(Regressor[np.round(SliceTiming[k]*Fs)::np.round(Fs*TR)]).append(0) else: RegressorDownsampled = Regressor[np.round((SliceTiming[k])*Fs)::np.round(Fs*TR)] print 'slice {} starting at {}*{}={}::{}'.format(k,SliceTiming[k],Fs,np.round(SliceTiming[k]*Fs),np.round(Fs*TR)) print len(RegressorDownsampled) np.savetxt(os.path.join(GLMFiles,'SliceReg{0:04d}.txt'.format(int(k))),RegressorDownsampled,fmt='%1.16f') regs=sorted(glob.glob(os.path.join(GLMFiles,'SliceReg*.txt'))) nRegs=len(regs) if not nRegs==nVols: print ('Number of slices does not equal number of regs') return Report(ReportFile,'Number of Vols: {}'.format(nVols)) for v,r in zip(vols,regs): trash,volID=os.path.split(v) volID,trash=os.path.splitext(volID) while trash: volID,trash=os.path.splitext(volID) rpt='Making SH for Volume {}'.format(volID) Report(ReportFile,rpt) shPath=os.path.join(ClusterJobDir,volID+'.sh') GLMsh.main(v,r,RV,shPath,ErrorOutput,ClusterOutput) SubmitCmd='for Dir in `/bin/ls '+ClusterJobDir+'/*.sh`; do echo "Running GLM on ${Dir}.";qsub -cwd $Dir;sleep 2; done' Report(ReportFile,cmd) os.system(SubmitCmd) Min=0 Nvols=len(glob.glob(os.path.join(GLMFiles,'vol*'))) NBetas=len(glob.glob(os.path.join(GLMFiles,'Beta*'))) while not Nvols==NBetas and Min<120: time.sleep(60) Min=Min+1 Nvols=len(glob.glob(os.path.join(GLMFiles,'vol*'))) NBetas=len(glob.glob(os.path.join(GLMFiles,'Beta*'))) if Min==120: print ('Timeout Error For {}'.format(InputNii)) Report(ReportFile,'Timeout Error For {}'.format(InputNii)) print 'waiting' Betas=sorted(glob.glob(os.path.join(GLMFiles,'Beta*'))) #Report(ReportFile,cmd) files='' for b in Betas: files=files+b+' ' cmd='fslmerge -z {} {}'.format(os.path.join(OutputPath,'Beta'),files) Report(ReportFile,cmd) process=sp.Popen(cmd,shell=True) process.wait() cmd='fslcpgeom {} {}'.format(RefVol,os.path.join(OutputPath,'Beta')) Report(ReportFile,cmd) process=sp.Popen(cmd,shell=True) process.wait() Betas=sorted(glob.glob(os.path.join(GLMFiles,'tStat*'))) #print Betas files='' for b in Betas: files=files+b+' ' cmd='fslmerge -z {} {}'.format(os.path.join(OutputPath,'tStat'),files) Report(ReportFile,cmd) process=sp.Popen(cmd,shell=True) process.wait() cmd='fslcpgeom {} {}'.format(RefVol,os.path.join(OutputPath,'tStat')) Report(ReportFile,cmd) process=sp.Popen(cmd,shell=True) process.wait() Betas=sorted(glob.glob(os.path.join(GLMFiles,'pVal*'))) #print Betas files='' for b in Betas: files=files+b+' ' cmd='fslmerge -z {} {}'.format(os.path.join(OutputPath,'pVal'),files) Report(ReportFile,cmd) process=sp.Popen(cmd,shell=True) process.wait() cmd='fslcpgeom {} {}'.format(RefVol,os.path.join(OutputPath,'pVal')) Report(ReportFile,cmd) process=sp.Popen(cmd,shell=True) process.wait() else: print ('All Zero Regressor. Skipping.')
def main(InputNii, con, Regressor, meth, WrkDir="", OutputDir=""): txt = np.loadtxt(Regressor) if not all([i == 0 for i in txt]): RootDir, FileName = os.path.split(InputNii) trash = ".exe" FileBase = FileName while trash: FileBase, trash = os.path.splitext(FileBase) OutputPath = os.path.join(RootDir, "tPython", meth, con) if not WrkDir: WrkDir = os.path.join(RootDir, "{}_Work".format(FileBase)) GLMFiles = os.path.join(WrkDir, "WorkFiles", "GLM", meth, con) ClusterJobDir = os.path.join(WrkDir, "ShFiles", "GLM", meth, con) ErrorOutput = os.path.join(WrkDir, "ClusterError", "GLM", meth, con) ClusterOutput = os.path.join(WrkDir, "ClusterOutput", "GLM", meth, con) ReportFile = os.path.join(GLMFiles, "Report.txt") if os.path.exists(ReportFile): cmd = "rm {}".format(ReportFile) print cmd os.system(cmd) BaseDir, fname = os.path.split(InputNii) while not fname.find(".") == -1: fname, trash = os.path.splitext(fname) if not os.path.exists(WrkDir): os.makedirs(WrkDir) if not os.path.exists(ClusterJobDir): os.makedirs(ClusterJobDir) else: cmd = "rm {}/*.sh".format(ClusterJobDir) Report(ReportFile, cmd) os.system(cmd) if not os.path.exists(GLMFiles): os.makedirs(GLMFiles) else: cmd = "rm {}/*".format(GLMFiles) Report(ReportFile, cmd) os.system(cmd) if not os.path.exists(ErrorOutput): os.makedirs(ErrorOutput) else: cmd = "rm {}/*".format(ErrorOutput) Report(ReportFile, cmd) os.system(cmd) if not os.path.exists(ClusterOutput): os.makedirs(ClusterOutput) else: cmd = "rm {}/*".format(ClusterOutput) Report(ReportFile, cmd) os.system(cmd) if not os.path.exists(OutputPath): os.makedirs(OutputPath) print InputNii img = nb.load(InputNii) nb.loadsave.save(img, "{}/FullNii.nii.gz".format(GLMFiles)) # cmd='cp {} {}/FullNii.nii'.format(InputNii,GLMFiles) # print cmd # process=sp.Popen(cmd,shell=True) # process.wait() cmd = "fslsplit {0}/FullNii.nii {0}/RefVol -t".format(GLMFiles) Report(ReportFile, cmd) process = sp.Popen(cmd, shell=True) process.wait() RVs = glob.glob(os.path.join(GLMFiles, "RefVol*")) for r in RVs[1:]: cmd = "rm {}".format(r) Report(ReportFile, cmd) process = sp.Popen(cmd, shell=True) process.wait() RV = RVs[0] cmd = "fslsplit {} {}/RefZ -z".format(RV, GLMFiles) Report(ReportFile, cmd) process = sp.Popen(cmd, shell=True) process.wait() RefVol = RV RVs = glob.glob(os.path.join(GLMFiles, "RefZ*")) for r in RVs[1:]: cmd = "rm {}".format(r) Report(ReportFile, cmd) process = sp.Popen(cmd, shell=True) process.wait() RV = RVs[0] cmd = "fslsplit {0}/FullNii.nii {0}/vol -z".format(GLMFiles) Report(ReportFile, cmd) process = sp.Popen(cmd, shell=True) process.wait() vols = glob.glob(os.path.join(GLMFiles, "vol*.nii.gz")) nVols = len(vols) Report(ReportFile, "Number of Vols: {}".format(nVols)) for v in vols: trash, volID = os.path.split(v) volID, trash = os.path.splitext(volID) while trash: volID, trash = os.path.splitext(volID) rpt = "Making SH for Volume {}".format(volID) Report(ReportFile, rpt) shPath = os.path.join(ClusterJobDir, volID + ".sh") GLMsh.main(v, Regressor, RV, shPath, ErrorOutput, ClusterOutput) SubmitCmd = ( "for Dir in `/bin/ls " + ClusterJobDir + '/*.sh`; do echo "Running GLM on ${Dir}.";qsub -cwd $Dir;sleep 2; done' ) Report(ReportFile, cmd) os.system(SubmitCmd) Min = 0 Nvols = len(glob.glob(os.path.join(GLMFiles, "vol*"))) NBetas = len(glob.glob(os.path.join(GLMFiles, "Beta*"))) while not Nvols == NBetas and Min < 120 * 2: time.sleep(60) Min = Min + 1 Nvols = len(glob.glob(os.path.join(GLMFiles, "vol*"))) NBetas = len(glob.glob(os.path.join(GLMFiles, "Beta*"))) if Min == 120 * 2: print ("Timeout Error For {}".format(InputNii)) Report(ReportFile, "Timeout Error For {}".format(InputNii)) print "waiting" if Min < 120 * 2: Betas = sorted(glob.glob(os.path.join(GLMFiles, "Beta*"))) # Report(ReportFile,cmd) files = "" for b in Betas: files = files + b + " " cmd = "fslmerge -z {} {}".format(os.path.join(OutputPath, "Beta"), files) Report(ReportFile, cmd) process = sp.Popen(cmd, shell=True) process.wait() cmd = "fslcpgeom {} {}".format(RefVol, os.path.join(OutputPath, "Beta")) Report(ReportFile, cmd) process = sp.Popen(cmd, shell=True) process.wait() Betas = sorted(glob.glob(os.path.join(GLMFiles, "tStat*"))) # print Betas files = "" for b in Betas: files = files + b + " " cmd = "fslmerge -z {} {}".format(os.path.join(OutputPath, "tStat"), files) Report(ReportFile, cmd) process = sp.Popen(cmd, shell=True) process.wait() cmd = "fslcpgeom {} {}".format(RefVol, os.path.join(OutputPath, "tStat")) Report(ReportFile, cmd) process = sp.Popen(cmd, shell=True) process.wait() Betas = sorted(glob.glob(os.path.join(GLMFiles, "pVal*"))) # print Betas files = "" for b in Betas: files = files + b + " " cmd = "fslmerge -z {} {}".format(os.path.join(OutputPath, "pVal"), files) Report(ReportFile, cmd) process = sp.Popen(cmd, shell=True) process.wait() cmd = "fslcpgeom {} {}".format(RefVol, os.path.join(OutputPath, "pVal")) Report(ReportFile, cmd) process = sp.Popen(cmd, shell=True) process.wait() else: print ("All Zero Regressor. Skipping.")