from ROOT import * from RecursiveSearch import RecursiveSearch, makeDirectories import os from Ganga.GPIDev.Base import GangaObject from Ganga.GPIDev.Base.Proxy import GPIProxyObjectFactory from Ganga.GPIDev.Schema import * import operator class TbBinning2D : name = "" title = "" minY = 0 widthY = 0 nBinsY = 0 minX = 0 widthX = 0 nBinsX = 0 maxX = 0 maxY = 0 path = "" def __init__(self,name,title,path,minX,widthX,nBinsX,minY,widthY,nBinsY) : self.name = name self.title = title self.path = path self.minX = minX self.widthX = widthX self.nBinsX = nBinsX self.minY = minY self.widthY = widthY self.nBinsY = nBinsY self.maxX = self.minX + self.nBinsX*self.widthX self.maxY = self.minY + self.nBinsY*self.widthY class TbProfile : path = "" title = "" name = "" def __init__(self,name,title,path): self.title = title self.path = path self.name = name class TbMetaAnalysisMerger(GangaObject): _category = 'postprocessor' _exportmethods = ['merge'] _name = 'TbMetaAnalysisMerger' f2L = {} _schema = Schema(Version(1,0), { 'Mode' : SimpleItem(defvalue="Profile"), 'Output' : SimpleItem(defvalue="Kepler-Meta-Histos.root"), 'Top' : SimpleItem(defvalue=[]), 'Labels' : SimpleItem(defvalue={}) }) def write2D( self, files, hists ): prev_path = "" for h in hists: if h.path != prev_path : print "Making histogram for: %s" %h.path prev_path = h.path out_file = TFile.Open(self.Output,'UPDATE') hist = TH2D( h.name, h.title, h.nBinsX, h.minX, h.maxX, h.nBinsY, h.minY, h.maxY ) for f in files: in_file = TFile(f ,'READ') obj = in_file.Get(h.path +"/"+ h.name ) if obj : if obj.GetEntries() != 0: obj.Scale(1/obj.GetEntries()); for l in range(0, obj.GetNbinsX() ): hist.SetBinContent( self.f2L[f] - h.minX, l, obj.GetBinContent(l) ) del obj else : print "ERROR: %s not found in %s" %(h.path + "/" + h.name,f) in_file.Close("R") del in_file out_file.cd(h.path) hist.Write() out_file.Close("R") del out_file def write1D( self, files, graphs) : means = [] sigmas = [] sorted_f2L = sorted(self.f2L.items(), key=operator.itemgetter(1)) p = 0 n = {} for f in sorted_f2L: print f n[f[0]] = p p = p + 1 print n for g in graphs: mean = TGraphErrors() mean.SetNameTitle( g.name + "_m", g.title) sigma = TGraphErrors() sigma.SetNameTitle( g.name + "_s", g.title) means.append( mean) sigmas.append( sigma ) for f in files: in_file = TFile(f,'READ') for x in range(0,len(graphs)): print "Making histogram for: %s" %(g.path + "/" + g.name) g = graphs[x] obj = in_file.Get( g.path + "/" + g.name ) if obj : if( obj.GetEntries() != 0 ): means[x].SetPoint( n[f] , self.f2L[f] , obj.GetMean() ) sigmas[x].SetPoint( n[f], self.f2L[f] , obj.GetRMS() ) means[x].SetPointError( n[f] , 0 , obj.GetRMS()/sqrt(obj.GetEntries()) ) sigmas[x].SetPointError( n[f], 0 , obj.GetRMS()/sqrt(obj.GetEntries()) ) in_file.Close("R") del in_file out_file = TFile.Open(self.Output,'UPDATE') for g in range(0,len(graphs)): out_file.cd(graphs[g].path) means[g].Write() sigmas[g].Write() out_file.Close() def merge(self, list ): file0 = TFile() found = False files = [] for j in list: if j.status == 'completed': fname = j.outputdir + "/Kepler-histos.root" if os.path.isfile(fname) : if found == False : file0 = TFile(fname ,'READ') found = True files.append(fname) if j.inputdata.run in self.Labels : self.f2L[fname] = self.Labels[j.inputdata.run] else : self.f2L[fname] = j.inputdata.run all_histograms = [] print "Searching for histograms..." RecursiveSearch( file0, all_histograms , 7 ) histograms = [] for x in all_histograms: for t in self.Top: if x.find(t) != -1 : if x not in histograms : histograms.append(x) hists = [] graphs = [] print "Building histogram objects..." for x in histograms: obj = file0.Get( x ) k = x.rfind('/') if self.Mode == "Profile": profile = TbProfile(x[k+1:], obj.GetTitle(), x[:k] ) graphs.append( profile ) if self.Mode == "2D": Runs = job.inputdata.Runs hists.append( TbBinning2D( x[k+1:],obj.GetTitle(),x[:k],Runs[0],1,Runs[len(Runs)-1] - Runs[0] +1, obj.GetBinLowEdge(0), obj.GetBinWidth(0), obj.GetNbinsX() ) ) file0.Close() del file0 output = TFile.Open(self.Output,'RECREATE') output.Close("R") del output makeDirectories( self.Output, histograms ) print "Filling %d histograms / graphs" %(len( hists ) + len(graphs ) ) if self.Mode == "2D": self.write2D( files, hists ) if self.Mode == "Profile": self.write1D( files, graphs )