import glob,sys,subprocess,time,os,ROOT,commands,random pandapath=os.environ.get('PANDAPATH') print pandapath sys.path.append(pandapath+'/macro/tpc/FOPI/python/argparse-1.2.1') import argparse def checkRECO(recfolder): recofile=recfolder+'/Cosmics_FopiMC_'+str(args.field)+args.gas+str(args.gain)+'_1_recl.reco.root ' if not os.path.isfile(recofile): print 'checking: file doesnt exist' return False rfile=ROOT.TFile(recofile) tree=rfile.Get('cbmsim') if tree==None: print 'checking: tree not found' return False trentr=tree.GetEntriesFast() if trentr=176): nobfield=True #hombfield=True proxZ=15 command='' command+='root -l FOPI/runRecoFOPI_MC_mb_recl_clcorr.C\(' if args.digiFolder!="": command+='\\\"'+mcfolder+'/'+args.digiFolder+'\\\"' else: command+='\\\"'+mcfolder+'/Cosmics_FopiMC_{0:2.0f}'.format(field)+args.gas+str(args.gain)+'_1.raw.root\\\"' command+=','+'{0:2.0f}'.format(field) command+=',\\\"'+args.gas+'\\\",' command+=str(args.gain) + ',' command+='1,' command+=str(stop)+',' if args.corrs.count(0)args.events: stop=args.events if args.data: loopfile.write(genRECOdata(l1,l2)) else: if args.checkev and not checkRECO(recofolder) and not args.merge: print 'Checking enabled but events dont match -> Starting' loopfile.write(genRECO(mcfolder[str(phi)],recofolder+addon,l1,l2,start,stop,phi)) elif not args.checkev and not args.merge: loopfile.write(genRECO(mcfolder[str(phi)],recofolder+addon,l1,l2,start,stop,phi)) elif not args.merge: print 'Checking enabled and file is ok -> skipping ('+str(l1)+','+str(l2)+')' start=stop if args.split!=-1: print 'writing merge' loopfile.write(genMerge(recofolder,l1,l2,phi)) #generate the line in file to do ana. if args.ana and not lock[str(phi)]: loopfile.write(genANA(recofolder,l1,l2,phi)) #loopfile.write('rm '+loopfname) loopfile.close() # loopfile=open(loopfname,'w') # loopfile.close() title='' if args.const: title+='const'+str(args.mode)+'_' if args.cyl: title+='cyl_' if args.sphere: title+='sphere_' if args.gibuu: title+='gibuu_' if args.cosmics: title+='cosmics_' if args.target: title+='target_' if lock[str(phi)] or args.multiMC: if args.mc: title+='MC_' if args.digi: title+='DIGI_' if not lock[str(phi)] and not args.multiMC: if args.reco: title+='RECO_' if args.ana: title+='ANA_' if args.errors.count(0)0: if jobs_depend[-1]==':': jobs_depend=jobs_depend[0:len(jobs_depend)-1] if dependency!="": jobs_depend+=':'+dependency if jobs_depend[0]==':': jobs_depend=jobs_depend[1:len(jobs_depend)] qsub='sbatch -J '+newtitle qsub+=' --time=30 --mem-per-cpu=1000 -p farmq ' qsub+=' -o ~/sgeout/'+newtitle qsub+=' -e ~/sgeout/'+newtitle if jobs_depend!='': qsub+=' -d afterok:'+jobs_depend qsub+=' '+loopfname+'_S'+str(splitcounter) print qsub status, jobid = commands.getstatusoutput(qsub) print status,jobid jobid=jobid[jobid.find('job')+4:len(jobid)] print 'job:',jobid jobfile.write(jobid+'\n') if line.find('mergerecofiles')!=-1: jobs_depend=jobid newtitle='S2_'+newtitle else: runCommand=['sbatch','-J '+title,'-o ~/sgeout/'+title,'-e ~/sgeout/'+title,'--time=120 -mem-per-cpu=4000 -p farmq'] depcounter+=1 if args.depar: dependency=depar[depcounter] if dependency!="": runCommand.append('-d afterok:'+dependency) runCommand.append(' '+loopfname) else: runCommand=['gnome-terminal','--title='+title,'--disable-factory','-e','./'+loopfname] #logging not working. to debug later if args.log: runCommand.append('> run_stuff.log') print 'starting: l1=',l1,'('+str(l1num)+') l2=',l2,'('+str(l2num)+')'+ 'phi=',phi,'('+str(phi)+')' print loopfname if args.batch and args.split==-1: newcomm='' for c in runCommand: newcomm+=c+' ' status, jobid = commands.getstatusoutput(newcomm) jobid=jobid[jobid.find('job')+4:len(jobid)] #print newcomm print 'job:',jobid jobfile.write(jobid+'\n') #os.system(newcomm) elif not args.batch: running[loopfname]=subprocess.Popen(runCommand) procinfo[loopfname]={} procinfo[loopfname]['start_time']=time.time() procinfo[loopfname]['mem_usage']=[] if os.path.exists(recofolder): procinfo[loopfname]['recFolder']=recofolder elif os.path.exists(mcfolder[str(phi)]): procinfo[loopfname]['recFolder']=mcfolder[str(phi)] else: procinfo[loopfname]['recFolder']='./' procinfo[loopfname]['phi']=phi print 'checking lock:',lock[str(phi)] if not lock[str(phi)]: print 'no lock' l1+=loop1var[2] l1num+=1 if args.batch: time.sleep(.01) else: time.sleep(2) #check how many processes are already finished and write them down to del list. for p in running: running[p].poll() if running[p].returncode==0: to_del.append(p) procinfo[p]['stop_time']=time.time() procinfo[p]['runtime']=procinfo[p]['stop_time']-procinfo[p]['start_time'] print 'job',p,'has finished' # lock[str(procinfo[p]['phi'])]=False else: if not args.screen: procinfo[p]['mem_usage'].append(getMemUsage(running[p])) print 'job',p,'is still running' if lock[str(phi)] and (p.find('MC')!=-1 or p.find('Digi')!=-1 ): print 'lock is enabled, waiting now for:',p running[p].wait() procinfo[p]['stop_time']=time.time() procinfo[p]['runtime']=procinfo[p]['stop_time']-procinfo[p]['start_time'] to_del.append(p) print 'lock is enabled, job',p,'finished' lock[str(phi)]=False print 'lock for',phi,'disabled' #delete finished jobs for p in to_del: if running.get(p,None)!=None: running.pop(p) if len(procinfo[p]['mem_usage'])!=0: usedMem=max(procinfo[p]['mem_usage'])/1024 timestep=procinfo[p]['runtime']/len(procinfo[p]['mem_usage']) else: usedMem=0 timestep=0 if not args.keepRunFile: os.system('rm '+p) usagefile=ROOT.TFile(procinfo[p]['recFolder']+'/procinfo.root','recreate') memgraph=ROOT.TGraph() for i in range(len(procinfo[p]['mem_usage'])): memgraph.SetPoint(i,i*timestep,procinfo[p]['mem_usage'][i]/1024) memgraph.Write() usagefile.Close() del to_del[:] print 'there are',len(running),'running jobs' l2+=loop2var[2] l2num+=1 l1=loop1var[0] l1num=0 l2num=0 l2=loop2var[0] phi+=philoop[2] phinum+=1 while len(running)>0: for p in running: running[p].poll() if running[p].returncode==0: to_del.append(p) procinfo[p]['stop_time']=time.time() procinfo[p]['runtime']=procinfo[p]['stop_time']-procinfo[p]['start_time'] else: if not args.screen: procinfo[p]['mem_usage'].append(getMemUsage(running[p])) #delete finished jobs for p in to_del: if running.get(p,None)!=None: running.pop(p) print 'job:',p,'finished' if len(procinfo[p]['mem_usage'])>0: print 'Memory used:',sum(procinfo[p]['mem_usage'])/len(procinfo[p]['mem_usage'])/1024,'MB' print 'Runtime:',procinfo[p]['runtime'],'seconds' if os.path.isfile(p)and not args.keepRunFile: os.system('rm '+p) time.sleep(2) jobfile.close() #if not args.batch: # u=raw_input('wait to finish')