import ROOT,sys,math,os,time,glob pandapath=os.environ.get('PANDAPATH') sys.path.append(pandapath+'/macro/tpc/FOPI/python/argparse-1.2.1') sys.path.append(pandapath+'/macro/tpc/FOPI/mberger') import argparse from functions import * from pion_histos import * parser=argparse.ArgumentParser(description='analyze cosmics from ana file') #parser.add_argument("--branch",help="which branch to use",default="TrackFitStat_0") parser.add_argument("filename",help="the file to analyze") parser.add_argument("--slicef",help='a root file with the slices histo',default="") parser.add_argument("--nEvts",help='number of events to analyze',default=-1,type=int) parser.add_argument("--outfname",help="name of the output file",default="",type=str) parser.add_argument('--runs', help='if data, the runs to use (%(default)s)', type=str, default='3888') parser.add_argument('--pattern', help='if data, the file name patters ('')', type=str, default='') parser.add_argument("--drawSingle",help="draw a single histo or dict",default="",type=str) parser.add_argument("--covErr",help="use errors derived from shapematrix",action="store_true") parser.add_argument("--axErr",help='use errors from cov matrix along axis',action="store_true") parser.add_argument("--cuts",help='enable cosmics cuts (normally not used)',action='store_true') parser.add_argument("--hlp",help="display help",action='store_true') parser.add_argument('--batch',help="batchmode",action='store_true') parser.add_argument('--rangefile',help='file with the ranges for the histograms',type=str,default='defaultRanges.txt') parser.add_argument('--nopostprocess',help='do not post process histograms',action='store_true') parser.add_argument('--parfile',help='the param file',type=str,default='') parser.add_argument('--info',help='additional information. a string: name=val,name2=val2,...',type=str,default='') parser.add_argument('--detonly',help='use oly detector with ID',type=int,default=-1) parser.add_argument('--tpcID',help='the tpc detector if (default=%(default)s)',type=int,default=22) parser.add_argument('--tpconly',help='also analyze tpconly branch',action='store_true') args=parser.parse_args() if args.hlp: parser.print_help() exit(0) if args.batch: ROOT.gROOT.SetBatch(True) print 'the pandapath=',pandapath ROOT.gROOT.ProcessLine(".x rootlogon.C") ROOT.gROOT.ProcessLine('gStyle->SetPalette(1)') ROOT.gROOT.ProcessLine('gROOT->SetStyle("Plain")') if args.outfname=="": args.outfname=args.filename.replace('.reco.root','.hist.root') print 'histos will be written into:', args.outfname histsdict=pion_histos(args.rangefile) zSlices = [] if args.slicef!="": print "slicename", args.slicef infiles=ROOT.TFile(args.slicef) zSlices = [] histsdict['hslices'] = infiles.Get("hslices") for k in range(1,7): print histsdict['hslices'].GetBinContent(k) zSlices.append(histsdict['hslices']).GetBinContent(k) else: zSlices = ( 12.0, 24.0, 36.0, 48.0, 60.0, 73.0 ) # cosmic ne #zSlices = ( 20, 30, 40, 49, 57, 70 ) # beam for i in range(len(zSlices)): histsdict['hslices'].SetBinContent(i+1,zSlices[i]) phiSlices = (30,60,90,120,150,180) thetaSlices=[i*20 for i in range(9)] hslices=cosmic_hslices(zSlices,args.rangefile) tree=openTree(args.filename,args.runs,args.pattern) if tree == None : print "No cbmsim in file", file if type(Rfile)==ROOT.TFile: Rfile.Close() exit() haspar=False if args.parfile!='': parfilename=args.parfile else: parfilename=args.filename.replace('reco','param') if os.path.isfile(parfilename): parfile=ROOT.TFile.Open(parfilename) digiPar=parfile.Get('TpcDigiPar') haspar=True if not haspar: paths=parfilename.split('/') path_idx=[i for i,p in enumerate(paths) if 'parts' in p] for idx in path_idx: paths.pop(idx) paths.pop(-1) paths.pop(-1) parfilepath="/".join(paths) parfilename=glob.glob(parfilepath+'/*.param.root') if len(parfilename)!=0: parfilename=parfilename[0] else: parfilename='' print parfilename if os.path.isfile(parfilename): parfile=ROOT.TFile.Open(parfilename) digiPar=parfile.Get('TpcDigiPar') haspar=True tree.SetBranchStatus("*", 0) #tree.SetBranchStatus(args.branch+".*",1) tree.SetBranchStatus("Particles.*",1) if args.tpconly: tree.SetBranchStatus("TpcOnlyParticles.*",1) trackbranch=ROOT.TBranch() if args.nEvts==-1 or tree.GetEntries()13 and detID==args.tpcID): pass else: if (abs(abs(phi)-90)<20): histsdict['res vs Z']['cluster track X Cut20'].Fill(trackPosXYZ.Z(),trackResXYZ.X()*10000) if (abs(phi)<20): histsdict['res vs Z']['cluster track Y Cut20'].Fill(trackPosXYZ.Z(),trackResXYZ.Y()*10000) if (abs(abs(theta)-90)<20): histsdict['res vs Z']['cluster track Z Cut20'].Fill(trackPosXYZ.Z(),trackResXYZ.Z()*10000) if (abs(abs(phi)-90)<10): histsdict['res vs Z']['cluster track X Cut10'].Fill(trackPosXYZ.Z(),trackResXYZ.X()*10000) if (abs(phi)<10): histsdict['res vs Z']['cluster track Y Cut10'].Fill(trackPosXYZ.Z(),trackResXYZ.Y()*10000) if (abs(abs(theta)-90)<10): histsdict['res vs Z']['cluster track Z Cut10'].Fill(trackPosXYZ.Z(),trackResXYZ.Z()*10000) histsdict['res vs Z']['cluster track U Cut'].Fill(trackPosXYZ.Z(),trackResUV.X()*10000) histsdict['res vs Z']['cluster track V Cut'].Fill(trackPosXYZ.Z(),trackResUV.Y()*10000) if args.tpcID==detID: histsdict['hxyzTpc'].Fill(trackPosXYZ.X(),trackPosXYZ.Y(),trackPosXYZ.Z()) histsdict['residuals Tpc']['hxyz res' ].Fill(trackPosXYZ.X(),trackPosXYZ.Y(),trackPosXYZ.Z(),trackResXYZ.X()) histsdict['residuals Tpc']['hxyz resY'].Fill(trackPosXYZ.X(),trackPosXYZ.Y(),trackPosXYZ.Z(),trackResXYZ.Y()) histsdict['residuals Tpc']['hxyz resZ'].Fill(trackPosXYZ.X(),trackPosXYZ.Y(),trackPosXYZ.Z(),trackResXYZ.Z()) #histsdict['residuals']['hxyz resU'].Fill(trackPosXYZ.X(),trackPosXYZ.Y(),trackPosXYZ.Z(),trackResXYZ.X()) #histsdict['residuals']['hxyz resV'].Fill(trackPosXYZ.X(),trackPosXYZ.Y(),trackPosXYZ.Z(),trackResXYZ.Y()) outfile = ROOT.TFile(args.outfname,"recreate") outfile.cd() outfile.mkdir('info') outfile.cd('info') infos=args.info.split(',') rinfos={} rinfos['generator'] =ROOT.TNamed('generator','undefined') rinfos['angle'] =ROOT.TNamed('angle','undefined') rinfos['error'] =ROOT.TNamed('error','undefined') rinfos['correction']=ROOT.TNamed('correction','undefined') rinfos['field'] =ROOT.TNamed('field','undefined') rinfos['gas'] =ROOT.TNamed('gas','undefined') rinfos['gain'] =ROOT.TNamed('gain','undefined') rinfos['name'] =ROOT.TNamed('name','undefined') if haspar: rinfos['Dl'] =ROOT.TNamed('Dl',str(digiPar.getGas().Dl())) rinfos['Dt'] =ROOT.TNamed('Dt',str(digiPar.getGas().Dt())) rinfos['vd'] =ROOT.TNamed('vd',str(digiPar.getGas().VDrift())) rinfos['gain'] =ROOT.TNamed('gain',str(digiPar.getGain())) rinfos['field'] =ROOT.TNamed('field',str(digiPar.getEField())) if len(infos)>2: for inf in infos: inf=inf.split('=') rinfos[inf[0]]=ROOT.TNamed(inf[0],inf[1]) for rinf in rinfos: rinfos[rinf].Write() outfile.cd() histcounter = 0 outfile.mkdir('single') for hists in histsdict: histcounter+=1 hist=histsdict[hists] outfile.cd() if type(hist)==dict: outfile.mkdir(hists) outfile.cd(hists) for h in hist: hist[h].Write() else: outfile.cd('single') hist.Write() outfile.cd() outfile.mkdir('Z-slices') for d in hslices: sdict=hslices[d] outfile.cd() outfile.mkdir('Z-slices/'+d) outfile.cd('Z-slices/'+d) for i in range(len(zSlices)): h=sdict[i] h.Write() outfile.cd() outfile.Close() print 'Histos are written into file:', args.outfname print 'total runtime: {0} '.format(float((time.time()-main_start)))