def runFits(data, options): axis = ROOT.TAxis(5, array('d', [600, 700, 800, 900, 1000, 2000])) #first pass graphs = [] for i in range(0, 12): graphs.append(ROOT.TGraphErrors()) for i in range(1, axis.GetNbins() + 1): center = axis.GetBinCenter(i) h = data.drawTH1( options.varx, options.cut + "&&({vary}>{mini}&&{vary}<{maxi})".format( vary=options.vary, mini=axis.GetBinLowEdge(i), maxi=axis.GetBinUpEdge(i)), str(options.lumi), options.binsx, options.minx, options.maxx) histo = copy.deepcopy(h) fitter = Fitter(['M']) fitter.w.var("M").setVal((options.maxx - options.minx) / 2.0) fitter.w.var("M").setMax(options.maxx) fitter.w.var("M").setMin(options.minx) fitter.signalMJJCBBoth('model', 'M') fitter.importBinnedData(histo, ['M'], 'data') fitter.fit('model', 'data', [ROOT.RooFit.SumW2Error(0)]) chi = fitter.projection( "model", "data", "M", "debugfitMJJTop_" + options.output + "_" + str(i) + ".png") for j, g in enumerate(graphs): c, cerr = fitter.fetch("c_" + str(j)) g.SetPoint(i - 1, center, c) g.SetPointError(i - 1, 0.0, cerr) data = {} pol4 = ROOT.TF1("pol4", "pol4", options.minx, options.maxx) pol3 = ROOT.TF1("pol3", "pol3", options.minx, options.maxx) pol2 = ROOT.TF1("pol2", "pol2", options.minx, options.maxx) pol1 = ROOT.TF1("pol1", "pol1", options.minx, options.maxx) pol0 = ROOT.TF1("pol0", "pol0", options.minx, options.maxx) graphs[0].Fit(pol1) data['mean'] = returnString(pol1, options) graphs[1].Fit(pol1) data['sigma'] = returnString(pol1, options) graphs[2].Fit(pol0) data['alpha1'] = returnString(pol0, options) graphs[3].Fit(pol0) data['n1'] = returnString(pol0, options) graphs[4].Fit(pol1) data['alpha2'] = returnString(pol1, options) graphs[5].Fit(pol0) data['n2'] = returnString(pol0, options) #create json f = open(options.output + "_W.json", "w") json.dump(data, f) f.close() data = {} graphs[6].Fit(pol1) data['mean'] = returnString(pol1, options) graphs[7].Fit(pol1) data['sigma'] = returnString(pol1, options) graphs[8].Fit(pol0) data['alpha1'] = returnString(pol0, options) graphs[9].Fit(pol0) data['n1'] = returnString(pol0, options) graphs[10].Fit(pol1) data['alpha2'] = returnString(pol1, options) graphs[11].Fit(pol0) data['n2'] = returnString(pol0, options) f = open(options.output + "_top.json", "w") json.dump(data, f) f.close() return graphs
events=histoYield.Integral()*options.BR*analysisIntegral/fitRangeIntegral graphs['yield'].SetPoint(N,mass,events) fitter.projection("model","data","m","fitjj_"+str(mass)+".root") fitter.projection("model","data","M","fitVV_"+str(mass)+".root") for var,graph in graphs.iteritems(): if var=='yield': continue value,error=fitter.fetch(var) graph.SetPoint(N,mass,value) graph.SetPointError(N,0.0,error) N=N+1 #now the fits pol5 = ROOT.TF1("pol5","pol5",0,13000) pol3 = ROOT.TF1("pol3","pol3",0,13000) pol0 = ROOT.TF1("pol0","pol0",0,13000) pol1 = ROOT.TF1("pol1","pol1",0,13000)
fitter=Fitter(['MVV']) fitter.signalResonance('model','MVV') #fitter.w.var("MH").setVal(mass) fitter.importBinnedData(histo,['MVV'],'data') ## fit fitter.fit('model','data',[ROOT.RooFit.SumW2Error(0)]) #fitter.fit('model','data',[ROOT.RooFit.SumW2Error(1)]) fitter.fit('model','data',[ROOT.RooFit.SumW2Error(0)]) ## control plot fitter.projection("model","data","MVV",options.debugFile+"_"+str(int(mass)).zfill(4)+".root",options.varx,[],[ROOT.RooFit.LineColor(color)]) fitter.projection("model","data","MVV",options.debugFile+"_"+str(int(mass)).zfill(4)+".png",options.varx,[],[ROOT.RooFit.LineColor(color)]) ## Save parameters vs MX for var,graph in graphs.iteritems(): value,error=fitter.fetch(var) graph.SetPoint(N,mass,value) graph.SetPointError(N,0.0,error) N=N+1 ## Store all graphs F=ROOT.TFile(options.output,"RECREATE") F.cd() for name,graph in graphs.iteritems(): graph.Write(name) F.Close()
#dataset = data.makeDataSet(options.genvar,options.genCut,-1) for i in range(1, axis.GetNbins() + 1): cBinLo = axis.GetBinLowEdge(i) cBinHi = axis.GetBinUpEdge(i) cBinCenter = axis.GetBinCenter(i) dataset = data.makeDataSet( options.genvar, options.genCut + '*({cvar}>{lo}&&{cvar}<={hi})'.format( cvar=options.condVar, lo=cBinLo - 100, hi=cBinHi + 100), -1) histo = data.drawTH1( options.var, options.cut + '*({cvar}>{lo}&&{cvar}<={hi})'.format( cvar=options.condVar, lo=cBinLo, hi=cBinHi), "1", options.bins, options.mini, options.maxi) fitter = Fitter([options.var]) fitter.importBinnedData(histo, [options.var], 'data') fitter.gaussianSum('model', options.var, dataset, options.genvar) fitter.fit('model', 'data', [ROOT.RooFit.SumW2Error(1)]) chi = fitter.projection("model", "data", options.var, "debugPlot_" + str(i) + "_" + options.output, 'x') print i, 'Chi2', chi for nuis in ['scale', 'sigma']: v, vErr = fitter.fetch(nuis) graph[nuis].SetPoint(i, cBinCenter, v) graph[nuis].SetPointError(i, 0, vErr) f2 = ROOT.TFile(options.output, "RECREATE") f2.cd() for g in graph.keys(): graph[g].Write(g) f2.Close()
def interpolate(histos, axis, options): #create 2D histogram histo2D = ROOT.TH2D("histo2D", "histo2D", options.binsx, options.minx, options.maxx, options.binsy, options.miny, options.maxy) if options.fitFunc == "bernstein3": order = 3 if options.fitFunc == "bernstein4": order = 4 if options.fitFunc == "bernstein5": order = 5 if options.fitFunc == "bifur": order = 3 graphs = [] for i in range(0, order): graphs.append(ROOT.TGraphErrors()) #run the fits for N, h in enumerate(histos): center = axis.GetBinCenter(N + 1) fitter = Fitter(['mjj']) fitter.w.var("mjj").setVal(40) fitter.w.var("mjj").setMax(options.maxy) fitter.w.var("mjj").setMin(options.miny) if options.fitFunc == "bernstein3": fitter.bernstein('model', 'mjj', 3) if options.fitFunc == "bernstein4": fitter.bernstein('model', 'mjj', 4) if options.fitFunc == "bernstein5": fitter.bernstein('model', 'mjj', 5) if options.fitFunc == "bifur": fitter.bifur('model', 'mjj') fitter.importBinnedData(h, ['mjj'], 'data') fitter.fit('model', 'data') fitter.fit('model', 'data') fitter.projection("model", "data", "mjj", "debugProjectionFit_" + str(N) + ".png") for j, g in enumerate(graphs): c, cerr = fitter.fetch("c_" + str(j)) g.SetPoint(N, center, c) g.SetPointError(N, 0.0, cerr) ##OK now interpolate and make histograms! #first make the function fitter = Fitter(['mjj']) if options.fitFunc == "bernstein3": fitter.bernstein('model', 'mjj', 3) order = 3 if options.fitFunc == "bernstein4": fitter.bernstein('model', 'mjj', 4) order = 4 if options.fitFunc == "bernstein5": fitter.bernstein('model', 'mjj', 5) order = 5 if options.fitFunc == "bifur": fitter.bifur('model', 'mjj') order = 3 fitter.w.var("mjj").setVal(80) fitter.w.var("mjj").setMax(options.maxy) fitter.w.var("mjj").setMin(options.miny) for i in range(1, histo2D.GetNbinsX() + 1): x = histo2D.GetXaxis().GetBinCenter(i) print 'Bin:', i, 'Evaluating function at x=', x for j, g in enumerate(graphs): print "c_" + str(j), "=", g.Eval(x) fitter.w.var("c_" + str(j)).setVal(g.Eval(x, 0, "S")) histogram = fitter.w.pdf("model").createHistogram("mjj", options.binsy) for k in range(1, histo2D.GetNbinsY() + 1): bin = histo2D.GetBin(i, k) histo2D.SetBinContent(bin, histogram.GetBinContent(k)) return graphs, histo2D
fitter.bernstein('model', 'x', order) parameterization['type'] = 'bernstein' parameterization['order'] = order fitter.fit('model', 'data', [ROOT.RooFit.SumW2Error(1)]) fitter.fit('model', 'data', [ROOT.RooFit.SumW2Error(1)]) fitter.projection("model", "data", "x", "debug" + options.output + ".root", options.title) chi = fitter.projection("model", "data", "x", "debug" + options.output + ".png", options.title) print 'Chi2', chi if parameterization['type'] == 'expo': val, err = fitter.fetch('c_0') parameterization['c_0'] = val parameterization['c_0Err'] = err if parameterization['type'] == 'expoTail': for i in range(0, 2): var = 'c_' + str(i) val, err = fitter.fetch(var) parameterization[var] = val parameterization[var + 'Err'] = err if parameterization['type'] == 'erfexp': for i in range(0, 3): var = 'c_' + str(i) val, err = fitter.fetch(var) parameterization[var] = val
f = ROOT.TFile(args[0]) histo = f.Get(options.histo) fitter = Fitter(['x', 'y']) fitter.importBinnedData(histo, ['x', 'y'], 'data') if options.function == 'erfexpW2D': fitter.mjjParamErfExp('model', options.json) fitter.fit('model', 'data', [ ROOT.RooFit.SumW2Error(1), ROOT.RooFit.ConditionalObservables(ROOT.RooArgSet(fitter.w.var("x"))) ]) fitter.fit('model', 'data', [ ROOT.RooFit.SumW2Error(1), ROOT.RooFit.ConditionalObservables(ROOT.RooArgSet(fitter.w.var("x"))) ]) fitter.projectionCond("model", "data", "y", "x", "debug" + options.output + ".png") for i in range(0, 4): var = 'c_' + str(i) val, err = fitter.fetch(var) parameterization[var] = val parameterization[var + 'Err'] = err f = open(options.output + ".json", "w") json.dump(parameterization, f) f.close()