import ROOT, argparse, math, sys, os, copy pandapath=os.environ.get('PANDAPATH') sys.path.append(pandapath+'/macro/tpc/FOPI/mberger') class Fline: def __init__(self,radius,col=1): self.radius=float(radius) self.zpos=[] self.Er=[] self.Ez=[] self.hEr=ROOT.TH1D("hEr"+radius,"Er R="+radius,320,-0,0) #self.hEr.SetLineColor(col) self.hEz=ROOT.TH1D("hEz"+radius,"Ez R="+radius,41000,0,0) #self.hEz.SetLineColor(col) self.gEr=ROOT.TGraph() self.gEr.SetName("gEr"+radius) self.gEr.SetTitle("Er R="+radius) #self.gEr.SetMarkerColor(col) self.gEz=ROOT.TGraph() self.gEz.SetName("gEz"+radius) self.gEz.SetTitle("Ez R="+radius) #self.gEz.SetMarkerColor(col) self.sumEr=0 self.sumEz=0 self.relDiffEz=[] def add(self,z,Er,Ez): self.zpos.append(z) self.Er.append(Er/100) self.Ez.append(Ez/100) self.hEr.Fill(Er/100) self.hEz.Fill(Ez/100) self.gEr.SetPoint(self.gEr.GetN(),z,Er/100) self.gEz.SetPoint(self.gEz.GetN(),z,Ez/100) self.sumEr+=Er/100 self.sumEz+=Ez/100 def getRMSH(self): val=[] val.append(self.hEr.GetRMS()) val.append(self.hEz.GetRMS()) return val def getRMS(self,_mean=-1): val=[] if _mean==-1: mean=self.getMean() else: mean=_mean rmsR=0 rmsZ=0 for i in range(len(self.Er)): rmsR+=(self.Er[i]-mean[0])**2 rmsZ+=(self.Ez[i]-mean[1])**2 rmsR/=len(self.Er) rmsZ/=len(self.Ez) rmsR=math.sqrt(rmsR) rmsZ=math.sqrt(rmsZ) val.append(rmsR) val.append(rmsZ) return val def getMean(self): val=[] val.append(self.sumEr/len(self.Er)) val.append(self.sumEz/len(self.Ez)) return val def getR(self): return self.radius def getRelDiff(self,nominal): self.relDiffEz=[] mean=0 for i in range(len(self.Ez)): self.relDiffEz.append((self.Ez[i]-nominal)/nominal) mean+=self.relDiffEz[-1] mean/=len(self.Ez) var=0 for i in range(len(self.relDiffEz)): var+=(self.relDiffEz[i]-mean)**2 var/=len(self.relDiffEz) var=math.sqrt(var) retval=[] retval.append(mean) retval.append(var) return retval parser=argparse.ArgumentParser(description='plot the field homogenity along lines as function of R') parser.add_argument('infiles',help='the file with the field', type=str,nargs='+') parser.add_argument('--zcut',help='only z-coordinates inside window',type=float,nargs=2,default=[-1,9999]) parser.add_argument('--routfile',help='root outfile to save the histos to',type=str,default='./tmp.root') parser.add_argument('--r',help='do only for one r',type=float,default=-1) args=parser.parse_args() ROOT.gROOT.ProcessLine(".x rootlogon.C") ROOT.gROOT.ProcessLine("gStyle->SetPalette(1)") ROOT.gROOT.LoadMacro("stlPYROOT.h+") hcanv=ROOT.TCanvas("Histos","Histos",1000,500) hcanv.Divide(2,1) gcanv=ROOT.TCanvas("Graphs","Graphs",1000,500) gcanv.Divide(2,1) grmscanv=ROOT.TCanvas("grmscanv","RMS",1000,750) grmscanv.Divide(1,2) gmeancanv=ROOT.TCanvas("gmeancanv","MEAN",1000,750) gmeancanv.Divide(1,2) grelDiffcanv=ROOT.TCanvas("greldiffcanv","Relative Difference",1000,500) theLines={} counter=0 minrad=1000 maxrad=0 for infile in args.infiles: for line in open(infile,'r'): if line[0]=='%': continue words=line.split() rad='{0:.03f}'.format(round(float(words[0]),3)) if theLines.get(rad,None)==None: counter+=1 theLines[rad]=Fline(rad,counter) print 'creating line at rad:', rad minrad=min(minrad,float(rad)) maxrad=max(maxrad,float(rad)) if (float(words[1])args.zcut[1]): continue theLines[rad].add(float(words[1]),float(words[2]),float(words[3])) opt='' gopt='AP' grmsEr=ROOT.TGraph() grmsEr.SetTitle("RMS Er") grmsEr.SetName("RMS_Er") grmsEz=ROOT.TGraph() grmsEz.SetTitle("RMS Ez") grmsEz.SetName("RMS_Ez") gmeanEr=ROOT.TGraph() gmeanEr.SetTitle("MEAN Er") gmeanEr.SetName("MEAN_Er") gmeanEz=ROOT.TGraph() gmeanEz.SetTitle("MEAN Ez") gmeanEz.SetName("MEAN_Ez") grelDiffEr=ROOT.TGraphErrors() #grelDiffEr.SetTitle("RELDIFF Er") grelDiffEr.SetName("RELDIFF_Er") grelDiffEz=ROOT.TGraphErrors() #grelDiffEz.SetTitle("RELDIFF Ez") grelDiffEz.SetName("RELDIFF_Ez") #grelDiffEz.SetMarkerStyle(20) rfile=ROOT.TFile(args.routfile,'recreate') rads=[] for r in theLines.keys(): rads.append(float(r)) rads.sort() counter=-1 dr=0.05 rad=minrad #print theLines #for r in theLines: #print minrad, maxrad #exit() for rad in rads: #while rad