import ROOT, glob, math, sys, os 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 set_palette import ROOT,argparse,math # {{{ hist2D class hist2D: def __init__(self,name,title,nx,xmin,xmax,ny,ymin,ymax): self.hist=ROOT.TH2D(name,title,nx,xmin,xmax,ny,ymin,ymax) self.hist.SetStats(0) self.canv=ROOT.TCanvas("c"+name,title,20,20,1000,400) self.size=0.07 def setAxis(self,xtit,ytit,ztit): self.hist.GetXaxis().SetTitle(xtit) self.hist.GetXaxis().SetTitleSize(self.size) self.hist.GetXaxis().SetLabelSize(self.size) self.hist.GetYaxis().SetTitle(ytit) self.hist.GetYaxis().SetTitleSize(self.size) self.hist.GetYaxis().SetLabelSize(self.size) self.hist.GetYaxis().SetTitleOffset(0.6) self.hist.GetZaxis().SetTitle(ztit) self.hist.GetZaxis().SetTitleSize(self.size) self.hist.GetZaxis().SetLabelSize(self.size) self.hist.GetZaxis().SetTitleOffset(0.6) self.canv.SetLeftMargin(1.) self.canv.SetRightMargin(.15) self.canv.SetBottomMargin(0.15) def drawPrelim(self) : self.canv.cd() prelim=ROOT.TLatex() prelim.SetTextColor(ROOT.kGray) prelim.SetTextSize(0.1) prelim.SetTextAngle(20) prelim.SetNDC() prelim.DrawLatex(0.38,0.45,"preliminary") def setRange(self,mini,maxi): bins=(self.hist.GetNbinsX()+1)*(self.hist.GetNbinsY()+1)*(self.hist.GetNbinsZ()+1) for i in range(bins): if self.hist.GetBinContent(i)maxi: self.hist.SetBinContent(i,maxi) def Draw(self,opt): self.canv.cd() self.hist.Draw("colz") def save(self,prefix): self.canv.SaveAs(prefix+self.canv.GetName()+".pdf") # }}} # {{{ functions # {{{ field arrows def getFieldArrow(r,z,field): point=ROOT.TVector3(r,0,z) fieldp=field.value2(point) arrow=ROOT.TArrow() print "stepZ:",mstepZ*stepZ,'stepR:',mstepR*stepR # flen=math.sqrt((mstepR*stepR)**2+(mstepZ*stepZ)**2) flen=min(mstepR*stepR,mstepZ*stepZ) arrow.SetX1(z+stepZ/2.) arrow.SetY1(r+stepR/2.) arrow.SetX2(z+stepZ/2.-(fieldp.Z()/fieldp.Mag())*flen) arrow.SetY2(r+stepR/2.-(fieldp.X()/fieldp.Mag())*flen) print fieldp.Z()/fieldp.Mag(), fieldp.X()/fieldp.Mag(), flen arrow.SetOption("|>") arrow.SetArrowSize(0.008) arrow.SetAngle(30) arrow.SetFillColor(1) return arrow # }}} # {{{ field line def getFieldlineRZ(r0,z0,field): fieldline=ROOT.TPolyLine() r=r0 z=z0 pcount=0 fieldline.SetPoint(pcount,z,r) # print "new fieldline" # while (rminR and z>minZ): while pcount<10*nstepZ: oldr=r oldz=z fieldline.SetPoint(pcount,z,r) point=ROOT.TVector3(r,0,z) fieldp=field.value2(point) if fieldp[0]==0 and fieldp[2]==0: break r-=fieldp[0] z-=fieldp[2] fr=fieldp[0] fz=fieldp[2] while abs(oldr-r)>stepR or abs(oldz-z)>stepZ: # print '%(1)1.10f %(2)1.10f ' % {"1":abs(oldr-r) ,"2": abs(oldz-z)} fr/=2 r+=fr fz/=2 z+=fz pcount+=1 # print "or:",oldr,"oz:",oldz,"r:",r,"z:",z if (r>maxR or z>maxZ or rmaxZ: continue pos=ROOT.TVector3(float(minR+(nr+0.5)*stepR),0.,float(minZ+(nz+0.5)*stepZ)) value=ROOT.TVector3() value=field.value2(pos) hFieldR.hist.SetBinContent(nz+1,nr+1,value.X()) hFieldZ.hist.SetBinContent(nz+1,nr+1,value.Z()) hFieldAbs.hist.SetBinContent(nz+1,nr+1,value.Mag()) maxfieldR=max(value.X(),maxfieldR) minfieldR=min(value.X(),minfieldR) maxfieldZ=max(value.Z(),maxfieldZ) minfieldZ=min(value.Z(),minfieldZ) hFieldR.setAxis("z (cm)","r (cm)","Er (V/cm)") hFieldR.setRange(-30,30) hFieldR.Draw("colz") hFieldZ.setAxis("z (cm)","r (cm)","Ez (V/cm)") #hFieldZ.setRange(340,380) if not args.norange: hFieldZ.setRange(args.zfieldRange[0],args.zfieldRange[1]) hFieldZ.Draw("colz") hFieldAbs.setAxis("z (cm)","r (cm)","E (V/cm)") #hFieldAbs.setRange(340,380) if not args.norange: hFieldAbs.setRange(args.zfieldRange[0],args.zfieldRange[1]) hFieldAbs.Draw("colz") hFieldAbs.canv.cd() lines=[] if args.fl: for i in my_range(minR,maxR+stepR,stepR): lines.append(getFieldlineRZ(i,maxZ,field)) # lines[-1].Print() lines[-1].Draw() print "plotting fieldline ",i,"to go:",(maxR+stepR-i)/stepR hFieldAbs.canv.Update() arrows=[] mstepR=5 mstepZ=20 if args.arr: for i in my_range(minR,maxR,mstepR*stepR): for j in my_range(minZ,maxZ,mstepZ*stepZ): arrows.append(getFieldArrow(i,j,field)) arrows[-1].Draw() hFieldAbs.canv.Update() if args.out: for h in hists: h.save(args.filename.replace('.txt','')) if args.rout!='': rfile=ROOT.TFile(args.rout,'RECREATE') for h in hists: h.hist.Write() u=raw_input("done?")