import ROOT,glob,math,argparse,sys sys.path.append('$PANDAPATH/macro/tpc/FOPI/mberger') from anaFile import anaFile from functions import * parser=argparse.ArgumentParser(description="plot the residual vs z graph") parser.add_argument('anafiles',help='the list of ana files to process',type=str,nargs='+') parser.add_argument('--hlp',help='print help',action='store_true') parser.add_argument('--pdir',help='the picture print directory',type=str,default="not") parser.add_argument('--MC',help='calculate with McResX',action='store_true') parser.add_argument('--titles',help='the titles to plot in legend and canvas for the files', type=str,nargs='+',default=None) parser.add_argument('--both',help='if you want to plot Mc and fit - first gives the fit',action='store_true') args=parser.parse_args() ROOT.gROOT.ProcessLine(".x rootlogon.C") ROOT.gROOT.ProcessLine('gStyle->SetPalette(1)') ROOT.gROOT.ProcessLine('gROOT->SetStyle("Plain")') if args.hlp: parser.print_help() exit(0) if args.titles==None: args.titles=[] for i in range(len(args.anafiles)): args.titles.append("no title given") slices=[] dslices=[] rfiles=[] xreshist=[] resdata=[] narrows=[] broads=[] means=[] maxX=0 minX=999999 maxY=0 minY=999999 maxXs=[] minXs=[] maxYs=[] minYs=[] for i in range(3): maxXs.append(0) minXs.append(999999) maxYs.append(0) minYs.append(999999) both=0 for ifile in range(len(args.anafiles)): both+=1 rfiles.append(anaFile(args.anafiles[ifile])) slices.append(rfiles[-1].getZSlices()) dslices.append(rfiles[-1].getDriftSlices()) #if args.MC!="not": if args.MC: xreshist.append(rfiles[-1].getMcHXres()) #elif args.both!="not": elif args.both: print "both:", both print "Modulo:", both%2 modulo=(both%2) if modulo==0: print "Wird mit MC gefuellt" xreshist.append(rfiles[-1].getMcHXres()) else: print "Wird mit fit gefuellt" xreshist.append(rfiles[-1].getHXres()) else: xreshist.append(rfiles[-1].getHXres()) if xreshist[-1]==None: print "no residual histo available" exit(0) narrows.append(ROOT.TGraph()) broads.append(ROOT.TGraph()) means.append(ROOT.TGraph()) pcounter=0 resdata.append([]) for h in xreshist[ifile]: resdata[-1].append(fitres(h,0)) print slices[-1][pcounter],resdata[-1][-1]['nsig'] narrows[-1].SetPoint(pcounter,dslices[-1][pcounter],resdata[-1][-1]['nsig']) broads[-1].SetPoint(pcounter,dslices[-1][pcounter],resdata[-1][-1]['bsig']) means[-1].SetPoint(pcounter,dslices[-1][pcounter],resdata[-1][-1]['csig']) maxXs[0]=max(maxXs[0],resdata[-1][-1]['nsig']) maxXs[1]=max(maxXs[1],resdata[-1][-1]['bsig']) maxXs[2]=max(maxXs[2],resdata[-1][-1]['csig']) minXs[0]=min(minXs[0],resdata[-1][-1]['nsig']) minXs[1]=min(minXs[1],resdata[-1][-1]['bsig']) minXs[2]=min(minXs[2],resdata[-1][-1]['csig']) maxYs[0]=max(maxYs[0],resdata[-1][-1]['nsig']) maxYs[1]=max(maxYs[1],resdata[-1][-1]['bsig']) maxYs[2]=max(maxYs[2],resdata[-1][-1]['csig']) minYs[0]=min(minYs[0],resdata[-1][-1]['nsig']) minYs[1]=min(minYs[1],resdata[-1][-1]['bsig']) minYs[2]=min(minYs[2],resdata[-1][-1]['csig']) minX=min(minX,resdata[-1][-1]['nsig'],resdata[-1][-1]['bsig'],resdata[-1][-1]['csig']) maxX=max(maxX,resdata[-1][-1]['nsig'],resdata[-1][-1]['bsig'],resdata[-1][-1]['csig']) minY=min(minY,resdata[-1][-1]['nsig'],resdata[-1][-1]['bsig'],resdata[-1][-1]['csig']) maxY=max(maxY,resdata[-1][-1]['nsig'],resdata[-1][-1]['bsig'],resdata[-1][-1]['csig']) pcounter+=1 narrows[-1].SetMarkerStyle(20) broads[-1].SetMarkerStyle(21) means[-1].SetMarkerStyle(22) resgraphs=[narrows,broads,means] maxX*=1.05 minX*=0.95 maxY*=1.05 minY*=0.95 for j in range(3): maxXs[j]*=1.05 maxYs[j]*=1.05 minXs[j]*=0.95 minYs[j]*=0.95 if len(args.anafiles)==1: narrows[0].GetXaxis().SetRangeUser(minX,maxX) broads[0].GetXaxis().SetRangeUser(minX,maxX) means[0].GetXaxis().SetRangeUser(minX,maxX) narrows[0].GetYaxis().SetRangeUser(minY,maxY) broads[0].GetYaxis().SetRangeUser(minY,maxY) means[0].GetYaxis().SetRangeUser(minY,maxY) else: for i in range(len(args.anafiles)): narrows[i].GetXaxis().SetRangeUser(minXs[0],maxXs[0]) broads[i].GetXaxis().SetRangeUser(minXs[1],maxXs[1]) means[i].GetXaxis().SetRangeUser(minXs[2],maxXs[2]) narrows[i].GetYaxis().SetRangeUser(minYs[0],maxYs[0]) broads[i].GetYaxis().SetRangeUser(minYs[1],maxYs[1]) means[i].GetYaxis().SetRangeUser(minYs[2],maxYs[2]) broads[0].GetYaxis().SetTitle("Resolution (#mum)") broads[0].GetYaxis().SetTitleOffset(1.2) broads[0].GetXaxis().SetTitle("Drift Length Z (cm)") narrows[0].GetYaxis().SetTitle("Resolution (#mum)") narrows[0].GetYaxis().SetTitleOffset(1.2) narrows[0].GetXaxis().SetTitle("Drift Length Z (cm)") means[0].GetYaxis().SetTitle("Resolution (#mum)") means[0].GetYaxis().SetTitleOffset(1.2) means[0].GetXaxis().SetTitle("Drift Length Z (cm)") if len(args.anafiles)==1: c1=ROOT.TCanvas() narrows[0].SetMarkerColor(1) broads[0].SetMarkerColor(2) means[0].SetMarkerColor(3) legend=ROOT.TLegend(0.1,0.75,0.35,0.9) legend.SetFillColor(0) legend.AddEntry(narrows[0],"Narrow Gaussian","P") legend.AddEntry(broads[0],"Broad Gaussian","P") legend.AddEntry(means[0],"Mean","P") broads[0].GetYaxis().SetTitle("Resolution (#mum)") broads[0].GetYaxis().SetTitleOffset(1.2) broads[0].GetXaxis().SetTitle("Drift Length Z (cm)") c1.cd() t=drawDiff(0,1,0) t.Draw() broads[0].Draw("AP") narrows[0].Draw("P") means[0].Draw("P") t.Draw("same") legend.Draw() c1.Update() c2=ROOT.TCanvas() c2.Divide(3,2) counter=0 for h in xreshist[0]: c2.cd(counter+1) h.SetStats(ROOT.kFALSE) h.GetXaxis().SetRangeUser(-3.5*h.GetRMS(),3.5*h.GetRMS()) h.Draw() drawresdata(resdata[0][counter]) drawGaussians(resdata[0][counter]) counter+=1 c2.Update() if args.pdir!="not": c1.SaveAs(args.pdir+"resVsZ.eps") c2.SaveAs(args.pdir+"residualSlices.eps") else: canvases=[] canvases2=[] legends=[] for i in range(3): canvases.append(ROOT.TCanvas()) legends.append(ROOT.TLegend(0.1,0.75,0.35,0.9)) legends[-1].SetFillColor(0) plrange=0 for i in range(len(args.anafiles)): for h in xreshist[i]: plrange=max(plrange,h.GetRMS()) for i in range(len(args.anafiles)): if i==4: narrows[i].SetMarkerColor(i+10) broads[i].SetMarkerColor(i+10) means[i].SetMarkerColor(i+10) else: narrows[i].SetMarkerColor(i+1) broads[i].SetMarkerColor(i+1) means[i].SetMarkerColor(i+1) if i==0: opt="AP" narrows[i].SetTitle("Narrow Gaussian") broads[i].SetTitle("Broad Gaussian") means[i].SetTitle("Mean") else: opt="P" canvases[0].SetTitle("Narrow") canvases[0].cd() legends[0].AddEntry(narrows[i],args.titles[i],"P") narrows[i].Draw(opt) canvases[1].SetTitle("Broad") canvases[1].cd() legends[1].AddEntry(broads[i],args.titles[i],"P") broads[i].Draw(opt) canvases[2].SetTitle("Mean") canvases[2].cd() legends[2].AddEntry(means[i],args.titles[i],"P") means[i].Draw(opt) canvases2.append(ROOT.TCanvas()) canvases2[-1].cd() canvases2[-1].Divide(3,2) canvases2[-1].SetTitle("Slicefits_"+args.titles[i]) counter=0 for h in xreshist[i]: canvases2[i].cd(counter+1) h.SetStats(ROOT.kFALSE) h.GetXaxis().SetRangeUser(-2.5*plrange,2.5*plrange) h.Draw() drawresdata(resdata[i][counter]) drawGaussians(resdata[i][counter]) counter+=1 canvases2[i].Update() if args.pdir!='not': path=ROOT.TString(args.pdir+canvases2[i].GetTitle()) path.ReplaceAll(" ","_") path+=".eps" canvases2[i].SaveAs(path.Data()) for i in range(3): canvases[i].cd() legends[i].Draw() canvases[i].Update() if args.pdir!="not": path=ROOT.TString(args.pdir+canvases[i].GetTitle()) path.ReplaceAll(" ","_") path+=".eps" canvases[i].SaveAs(path.Data()) u=raw_input("quit?") if u=='q': exit()