def rooFit207(): print ">>> setup model signal components: gaussians..." x = RooRealVar("x","x",0,10) mean = RooRealVar("mean","mean of gaussians",5) sigma = RooRealVar("sigma","width of gaussians",0.5) sig = RooGaussian("sig","Signal",x,mean,sigma) print ">>> setup model background components: Chebychev polynomial plus exponential..." a0 = RooRealVar("a0","a0",0.5,0.,1.) a1 = RooRealVar("a1","a1",-0.2,0.,1.) bkg1 = RooChebychev("bkg1","Background 1",x,RooArgList(a0,a1)) alpha = RooRealVar("alpha","alpha",-1) bkg2 = RooExponential("bkg2","Background 2",x,alpha) bkg1frac = RooRealVar("bkg1frac","fraction of component 1 in background",0.2,0.,1.) bkg = RooAddPdf("bkg","Signal",RooArgList(bkg1,bkg2),RooArgList(bkg1frac)) print ">>> sum signal and background component..." bkgfrac = RooRealVar("bkgfrac","fraction of background",0.5,0.,1.) model = RooAddPdf("model","g1+g2+a",RooArgList(bkg,sig),RooArgList(bkgfrac)) # Create dummy dataset that has more observables than the above pdf y = RooRealVar("y","y",-10,10) data = RooDataSet("data","data",RooArgSet(x,y)) # Basic information requests:" print ">>> get list of observables of pdf in context of a dataset..." # Observables are define each context as the variables # shared between a model and a dataset. In this case # that is the variable 'x' model_obs = model.getObservables(data) # RooArgSet model_obs.Print('v') print "\n>>> get list of parameters..." # Get list of parameters, given list of observables model_params = model.getParameters(RooArgSet(x)) # RooArgSet print ">>> model_params.getStringValue(\"a0\") = %s" % (model_params.getStringValue("a0")) print ">>> model_params.getRealValue(\"a0\") = %s" % (model_params.getRealValue("a0")) print ">>> model_params.find(\"a0\").GetName() = %s" % (model_params.find("a0").GetName()) print ">>> model_params.find(\"a0\").getVal() = %s" % (model_params.find("a0").getVal()) # print ">>> for param in model_params:" # for param in model_params.(): # print ">>> %s"%(model_params.first()) # print ">>> %s"%(model_params.first()) # model_params.selectByName("a*").Print('v') model_params.Print('v') print "\n>>> get list of parameters of a dataset..." # Gives identical results to operation above model_params2 = model.getParameters(data) # RooArgSet model_params2.Print() print "\n>>> get list of components..." # Get list of component objects, including top-level node model_comps = model.getComponents() # RooArgSet model_comps.Print('v') print "\n>>> modifications to structure of composites..." sigma2 = RooRealVar("sigma2","width of gaussians",1) sig2 = RooGaussian("sig2","Signal component 1",x,mean,sigma2) sig1frac = RooRealVar("sig1frac","fraction of component 1 in signal",0.8,0.,1.) sigsum = RooAddPdf("sigsum","sig+sig2",RooArgList(sig,sig2),RooArgList(sig1frac)) print ">>> construct a customizer utility to customize model..." cust = RooCustomizer(model,"cust") print ">>> instruct the customizer to replace node 'sig' with node 'sigsum'..." cust.replaceArg(sig,sigsum) # Build a clone of the input pdf according to the above customization # instructions. Each node that requires modified is clone so that the # original pdf remained untouched. The name of each cloned node is that # of the original node suffixed by the name of the customizer object # # The returned head node own all nodes that were cloned as part of # the build process so when cust_clone is deleted so will all other # nodes that were created in the process. cust_clone = cust.build(kTRUE) # RooAbsPdf # Print structure of clone of model with sig->sigsum replacement. cust_clone.Print("t") # delete clone del cust_clone
canS = TCanvas('Template_TT','Template_TT',900,600) #gPad.SetLogy() res = signal.fitTo(roohisto[0],RooFit.Save()) res.Print() frame = x.frame() roohisto[0].plotOn(frame) signal.plotOn(frame) signal.plotOn(frame,RooFit.Components('ttbar_gaus1'),RooFit.LineColor(ROOT.kRed),RooFit.LineWidth(2),RooFit.LineStyle(ROOT.kDashed)) signal.plotOn(frame,RooFit.Components('ttbar_gaus2'),RooFit.LineColor(ROOT.kGreen+1),RooFit.LineWidth(2),RooFit.LineStyle(ROOT.kDashed)) #signal.plotOn(frame,RooFit.Components('sig3'),RooFit.LineColor(ROOT.kMagenta),RooFit.LineWidth(2),RooFit.LineStyle(ROOT.kDashed)) frame.GetXaxis().SetTitle('m_{t} (GeV)') frame.Draw() gPad.Update() canS.Print(canS.GetName()+".pdf") parsSig = signal.getParameters(roohisto[0]) parsSig.setAttribAll('Constant', True) # ----------------------------------------- # fit qcd m1QCD = RooRealVar('qcd_mean1' ,'qcd_mean1',200,130,350) s1QCD = RooRealVar('qcd_sigma1','qcd_sigma1',50,20,200) qcd1 = RooGaussian('qcd_gaus1','qcd_gaus1',x,m1QCD,s1QCD) m2QCD = RooRealVar('qcd_mean2' ,'qcd_mean2',140,130,300) s2QCD = RooRealVar('qcd_sigma2','qcd_sigma2',50,10,200) qcd2 = RooGaussian('qcd_gaus2' ,'qcd_gaus2',x,m2QCD,s2QCD) fqcd = RooRealVar('qcd_f1','qcd_f1',0.5,0,1)
def rooFit601(): print ">>> setup pdf and likelihood..." x = RooRealVar("x", "x", -20, 20) mean = RooRealVar("mean", "mean of g1 and g2", 0) sigma1 = RooRealVar("sigma1", "width of g1", 3) sigma2 = RooRealVar("sigma2", "width of g2", 4, 3.0, 6.0) # intentional strong correlations gauss1 = RooGaussian("gauss1", "gauss1", x, mean, sigma1) gauss2 = RooGaussian("gauss2", "gauss2", x, mean, sigma2) frac = RooRealVar("frac", "frac", 0.5, 0.0, 1.0) model = RooAddPdf("model", "model", RooArgList(gauss1, gauss2), RooArgList(frac)) print ">>> generate to data..." data = model.generate(RooArgSet(x), 1000) # RooDataSet print ">>> construct unbinned likelihood of model wrt data..." nll = model.createNLL(data) # RooAbsReal print ">>> interactive minimization and error analysis with MINUIT interface object..." minuit = RooMinuit(nll) print ">>> set avtive verbosity for logging of MINUIT parameter space stepping..." minuit.setVerbose(kTRUE) print ">>> call MIGRAD to minimize the likelihood..." minuit.migrad() print "\n>>> parameter values and error estimates that are back propagated from MINUIT:" model.getParameters(RooArgSet(x)).Print("s") print "\n>>> disable verbose logging..." minuit.setVerbose(kFALSE) print ">>> run HESSE to calculate errors from d2L/dp2..." minuit.hesse() print ">>> value of and error on sigma2 (back propagated from MINUIT):" sigma2.Print() print "\n>>> run MINOS on sigma2 parameter only..." minuit.minos(RooArgSet(sigma2)) print "\n>>> value of and error on sigma2 (back propagated from MINUIT after running MINOS):" sigma2.Print() print "\n>>> saving results, contour plots..." # Save a snapshot of the fit result. This object contains the initial # fit parameters, the final fit parameters, the complete correlation # matrix, the EDM, the minimized FCN , the last MINUIT status code and # the number of times the RooFit function object has indicated evaluation # problems (e.g. zero probabilities during likelihood evaluation) result = minuit.save() # RooFitResult # Make contour plot of mx vs sx at 1,2,3 sigma frame1 = minuit.contour(frac, sigma2, 1, 2, 3) # RooPlot frame1.SetTitle("RooMinuit contour plot") # Print the fit result snapshot result.Print("v") print "\n>>> change value of \"mean\" parameter..." mean.setVal(0.3) # Rerun MIGRAD,HESSE print ">>> rerun MIGRAD, HESSE..." minuit.migrad() minuit.hesse() print ">>> value on and error of frac:" frac.Print() print "\n>>> fix value of \"sigma\" parameter (setConstant)..." sigma2.setConstant(kTRUE) print ">>> rerun MIGRAD, HESSE..." minuit.migrad() minuit.hesse() frac.Print()
roohistSig = RooDataHist('roohist', 'roohist', RooArgList(x), hSig) roohistSig.Print() res_sig = signal.fitTo(roohistSig, RooFit.Save(ROOT.kTRUE)) res_sig.Print() frame = x.frame() roohistSig.plotOn(frame, RooFit.Binning(166)) signal.plotOn(frame) signal.plotOn(frame, RooFit.Components('bkg'), RooFit.LineColor(ROOT.kRed), RooFit.LineWidth(2), RooFit.LineStyle(ROOT.kDashed)) #frame.GetXaxis().SetRangeUser(1118,6099) frame.GetXaxis().SetRangeUser(minX_mass, maxX_mass) frame.GetXaxis().SetTitle('m_{jj} (GeV)') frame.Draw() parsSig = signal.getParameters(roohistSig) parsSig.setAttribAll('Constant', True) if histpdfSig: # ----------------------------------------- # hist pdf signal canSname = 'can_Mjj' + str(mass) canS = TCanvas(canSname, canSname, 900, 600) gPad.SetLogy() roohistSig = RooDataHist('roohist', 'roohist', RooArgList(x), hSig) roohistSig.Print() signal = RooHistPdf('signal', 'signal', RooArgSet(x), roohistSig) signal.Print() frame = x.frame()
l1=RooRealVar("l1","l1",1.,0.,1000.) l2=RooRealVar("l2","l2",1.,0.,1000.) #sigbkg=RooPolynomial("sigbkg"+str(cut),"bkg",mass,RooArgList(l0,l1,l2)) #sigbkg=RooChebychev("sigbkg"+str(cut),"bkg",mass,RooArgList(l0,l1)) sigbkg=RooLogistics("sigbkg"+str(cut),"bkg",mass,l0,l1) #sigbkg=RooExponential("sigbkg"+str(cut),"sigbkg",mass,l0) nsigref=RooRealVar("nsigref","number of signal events",100,0,1e10) sigmodel=RooAddPdf("sigmodel"+str(cut),"sig+bkg",RooArgList(sigbkg,sig),RooArgList(nbkg,nsigref)) s0.setConstant(False) s1.setConstant(False) sigmodel.fitTo(signal,RooFit.SumW2Error(True)) #,RooFit.Range("signal") sigmodel.fitTo(signal,RooFit.SumW2Error(True)) #,RooFit.Range("signal") sigmodel.fitTo(signal,RooFit.SumW2Error(True)) #,RooFit.Range("signal") chi2=RooChi2Var("chi2","chi2",sigmodel,signal,RooFit.DataError(RooAbsData.SumW2)) nbins=data.numEntries() nfree=sigmodel.getParameters(data).selectByAttrib("Constant",False).getSize() s0.setConstant(True) s1.setConstant(True) if cut>=1: fullintegral=sumsighist.Integral() else: fullintegral=sighist.Integral() print "SIGNAL FRACTION",nsigref.getValV()/(nsigref.getValV()+nbkg.getValV()) if nsigref.getValV()==0: continue if fit=="data": xframe=mass.frame(RooFit.Title("signal fraction in peak ="+str(int(nsigref.getValV()/(nsigref.getValV()+nbkg.getValV())*1000.)/1000.)+"+-"+str(int(nsigref.getError()/(nsigref.getValV()+nbkg.getValV())*1000.)/1000.)+", #chi^{2}/DOF = "+str(int((chi2.getVal()/(nbins-nfree))*10.)/10.))) signal.plotOn(xframe,RooFit.DataError(RooAbsData.SumW2)) sigmodel.plotOn(xframe,RooFit.Normalization(1.0,RooAbsReal.RelativeExpected)) sigmodel.plotOn(xframe,RooFit.Components("sigbkg"+str(cut)),RooFit.LineStyle(kDashed),RooFit.Normalization(1.0,RooAbsReal.RelativeExpected))
canSname = 'can_Sub_Mjj'+str(mass) canS = TCanvas(canSname,canSname,900,600) #gPad.SetLogy() roohistSig = RooDataHist('roohist','roohist',RooArgList(x),hSig) signal.fitTo(roohistSig) frame = x.frame() roohistSig.plotOn(frame) signal.plotOn(frame) signal.plotOn(frame,RooFit.Components('bkg'),RooFit.LineColor(ROOT.kRed),RooFit.LineWidth(2),RooFit.LineStyle(ROOT.kDashed)) frame.GetXaxis().SetRangeUser(900,4500) frame.GetXaxis().SetTitle('m_{jj} (GeV)') frame.Draw() parsSig = signal.getParameters(roohistSig) parsSig.setAttribAll('Constant', True) if fitDat: # ----------------------------------------- # define parameters for background NBINS = 180 p1 = RooRealVar('p1','p1',7,1,10) p2 = RooRealVar('p2','p2',5,1,10) p3 = RooRealVar('p3','p3',0.03,0.01,0.07) background = RooGenericPdf('background','(pow(1-@0/8000,@1)/pow(@0/8000,@2+@3*log(@0/8000)))',RooArgList(x,p1,p2,p3)) roohistBkg = RooDataHist('roohist','roohist',RooArgList(x),hDat) res = background.fitTo(roohistBkg)
def fitMC(fulldata, correctTag, ibin): print 'now fitting: ', ibin, ' for ', correctTag * 'correctTag ', ( 1 - correctTag) * 'wrongTag' cut = cut_base + '&& (mumuMass*mumuMass > %s && mumuMass*mumuMass < %s)' % ( q2binning[ibin], q2binning[ibin + 1]) data = fulldata.reduce(RooArgSet(thevarsMC), cut) pol_c1 = RooRealVar("p1", "coeff x^0 term", -0.5, -10, 10) bkg_pol = RooChebychev("bkg_pol", "bkg_pol", tagged_mass, RooArgList(pol_c1)) signalFunction = bkg_pol ### just a placeholder nsig = RooRealVar("Yield", "nsig", 10000, 0, 1000000) nbkg = RooRealVar("nbkg", "nbkg", 10, 0, 100000) doextended = False fitrange = "mcrange" nbins = 70 if correctTag: doubleG(B0Mass_, initial_sigma1, initial_sigma2, 0.8, tagged_mass, w, "RT%s" % ibin) ## (mean_ , sigma1_, sigma2_, f1_) signalFunction = w.pdf("doublegaus_RT%s" % ibin) fitFunction = RooAddPdf("fitfunction", "fit function", RooArgList(signalFunction, bkg_pol), RooArgList(nsig, nbkg)) doextended = True fitrange = "full" nbins = 60 else: mean = RooRealVar("mean^{WT%s}" % ibin, "massWT", B0Mass_, 5, 6, "GeV") sigmaCB = RooRealVar("#sigma_{CB}^{WT%s}" % ibin, "sigmaCB", 0.03, 0, 1) alpha1 = RooRealVar("#alpha_{1}^{WT%s}" % ibin, "#alpha_{1}", 0.5, 0, 10) alpha2 = RooRealVar("#alpha_{2}^{WT%s}" % ibin, "#alpha_{2}", 0.5, 0, 10) n1 = RooRealVar("n_{1}^{WT%s}" % ibin, "n_1", 2, 0, 90) n2 = RooRealVar("n_{2}^{WT%s}" % ibin, "n_2", 1, 0, 90) doublecb = ROOT.RooDoubleCBFast("doublecb_%s" % ibin, "doublecb", tagged_mass, mean, sigmaCB, alpha1, n1, alpha2, n2) # getattr(w, 'import')(doublecb) signalFunction = doublecb fitFunction = doublecb getattr(w, "import")(signalFunction) r = fitFunction.fitTo(data, RooFit.Extended(doextended), RooFit.Save(), RooFit.Range(fitrange)) print 'fit status: ', r.status(), r.covQual() if not _goodFit(r): r = fitFunction.fitTo(data, RooFit.Extended(doextended), RooFit.Save(), RooFit.Range(fitrange)) print 'fit status (redo): ', r.status(), r.covQual() if not _goodFit(r) and correctTag: r = fitFunction.fitTo(data, RooFit.Extended(doextended), RooFit.Save(), RooFit.Range(fitrange)) print 'fit status (redo2): ', r.status(), r.covQual() params = signalFunction.getParameters(RooArgSet(tagged_mass)) w.saveSnapshot( "reference_fit_%s_%s" % ('RT' * correctTag + 'WT' * (1 - correctTag), ibin), params, ROOT.kTRUE) frame = tagged_mass.frame(RooFit.Range(fitrange)) data.plotOn(frame, RooFit.Binning(nbins), RooFit.MarkerSize(.7)) drawPdfComponents(fitFunction, frame, ROOT.kGreen if correctTag else ROOT.kViolet, RooFit.NormRange(fitrange), RooFit.Range(fitrange), isData=False) fitFunction.plotOn(frame, RooFit.NormRange(fitrange), RooFit.Range(fitrange)) fitFunction.paramOn(frame, RooFit.Layout(0.62, 0.86, 0.88)) frame.Draw() niceFrame(frame, '') frame.addObject(_writeFitStatus(r)) ## evaluate sort of chi2 and save number of RT/WT events observables = RooArgSet(tagged_mass) flparams = fitFunction.getParameters(observables) nparam = int(flparams.selectByAttrib("Constant", ROOT.kFALSE).getSize()) if correctTag: frame.addObject( _writeChi2( frame.chiSquare( "fitfunction_Norm[tagged_mass]_Range[full]_NormRange[full]", "h_fullmc", nparam))) dict_s_rt[ibin] = _getFittedVar(nsig) nRT = RooRealVar("nRT_%s" % ibin, "yield of RT signal", 0, 1.E6) nRT.setVal(dict_s_rt[ibin].n) nRT.setError(dict_s_rt[ibin].s) getattr(w, "import")(nRT) else: frame.addObject( _writeChi2( frame.chiSquare( "doublecb_%s_Norm[tagged_mass]_Comp[doublecb_%s]_Range[mcrange]_NormRange[mcrange]" % (ibin, ibin), "h_fullmc", nparam))) dict_s_wt[ibin] = ufloat(data.sumEntries(), math.sqrt(data.sumEntries())) nWT = RooRealVar("nWT_%s" % ibin, "yield of WT signal", 0, 1.E6) nWT.setVal(dict_s_wt[ibin].n) nWT.setError(dict_s_wt[ibin].s) getattr(w, "import")(nWT) # chi2 = frame.chiSquare("doublecb_%s_Norm[tagged_mass]_Comp[doublecb_%s]_Range[mcrange]_NormRange[mcrange]"%(ibin,ibin), "h_fullmc", nparam) # if chi2 == -1: # chi2 = frame.chiSquare("gauscb_%s_Norm[tagged_mass]_Comp[gauscb_%s]_Range[mcrange]_NormRange[mcrange]"%(ibin,ibin), "h_fullmc", nparam) # frame. addObject(_writeChi2( chi2 ) ) frame.Draw() frame.SetTitle('correctly' * correctTag + 'wrongly' * (1 - correctTag) + ' tagged events') # c1.SetLogy() c1.SaveAs('fit_results_mass/save_fit_mc_%s_%s_%sT_newCB.pdf' % (ibin, args.year, "R" * correctTag + "W" * (1 - correctTag))) out_f.cd() r.Write('results_%s_%s' % (correctTag * 'RT' + (1 - correctTag) * 'WT', ibin))
def fitData(fulldata, ibin, n_bkg, w): cut = cut_base + '&& (mumuMass*mumuMass > %s && mumuMass*mumuMass < %s)' % ( q2binning[ibin], q2binning[ibin + 1]) fulldata_v2 = fulldata.reduce( RooArgSet(tagged_mass, mumuMass, mumuMassE, randVar), cut) ## reduce to data-like statistics nDataEntries = fulldata_v2.sumEntries() nDesired = n_bin[ibin] / nDataEntries cut = 'rand < %f' % nDesired signaldata = fulldata_v2.reduce( RooArgSet(tagged_mass, mumuMass, mumuMassE), cut) n_realsignal = signaldata.sumEntries() nrt_mc = _getFittedVar("nRT_%s" % ibin, w) nwt_mc = _getFittedVar("nWT_%s" % ibin, w) fraction = nrt_mc / (nrt_mc + nwt_mc) ### creating RT component w.loadSnapshot("reference_fit_RT_%s" % ibin) meanrt = w.var("mean^{RT%s}" % ibin) sigmart = RooRealVar() sigmart1 = RooRealVar() sigmart2 = RooRealVar() alphart1 = RooRealVar() alphart2 = RooRealVar() nrt1 = RooRealVar() nrt2 = RooRealVar() ## double cb fast if ibin < 5: sigmart = w.var("#sigma_{CB}^{RT%s}" % ibin) alphart1 = w.var("#alpha_{1}^{RT%s}" % ibin) alphart2 = w.var("#alpha_{2}^{RT%s}" % ibin) nrt1 = w.var("n_{1}^{RT%s}" % ibin) nrt2 = w.var("n_{2}^{RT%s}" % ibin) ## double cb old else: sigmart1 = w.var("#sigma_{CBRT0}^{%s}" % ibin) sigmart2 = w.var("#sigma_{CBRT1}^{%s}" % ibin) alphart1 = w.var("#alpha_{RT0}^{%s}" % ibin) alphart2 = w.var("#alpha_{RT1}^{%s}" % ibin) nrt1 = w.var("n_{RT0}^{%s}" % ibin) nrt2 = w.var("n_{RT1}^{%s}" % ibin) pars_init_vals = {} theRTgauss = w.pdf("doublecb_RT%s" % ibin) if ibin < 5: c_sigma_rt = _constrainVar(sigmart, 1, pars_init_vals) else: c_sigma_rt1 = _constrainVar(sigmart1, 1, pars_init_vals) c_sigma_rt2 = _constrainVar(sigmart2, 1, pars_init_vals) c_alpha_rt1 = _constrainVar(alphart1, 1, pars_init_vals) c_alpha_rt2 = _constrainVar(alphart2, 1, pars_init_vals) c_n_rt1 = _constrainVar(nrt1, 1, pars_init_vals) c_n_rt2 = _constrainVar(nrt2, 1, pars_init_vals) ### creating WT component w.loadSnapshot("reference_fit_WT_%s" % ibin) meanwt = w.var("mean^{WT%s}" % ibin) sigmawt = w.var("#sigma_{CB}^{WT%s}" % ibin) alphawt1 = w.var("#alpha_{1}^{WT%s}" % ibin) alphawt2 = w.var("#alpha_{2}^{WT%s}" % ibin) nwt1 = w.var("n_{1}^{WT%s}" % ibin) nwt2 = w.var("n_{2}^{WT%s}" % ibin) theWTgauss = w.pdf("doublecb_%s" % ibin) c_sigma_wt = _constrainVar(sigmawt, 1, pars_init_vals) c_alpha_wt1 = _constrainVar(alphawt1, 1, pars_init_vals) c_alpha_wt2 = _constrainVar(alphawt2, 1, pars_init_vals) c_n_wt1 = _constrainVar(nwt1, 1, pars_init_vals) c_n_wt2 = _constrainVar(nwt2, 1, pars_init_vals) ### creating constraints for the RT component c_vars = RooArgSet() if ibin < 5: c_RTgauss = RooProdPdf( "c_RTgauss", "c_RTgauss", RooArgList(theRTgauss, c_alpha_rt1, c_n_rt1, c_sigma_rt, c_alpha_rt2, c_n_rt2)) c_vars = RooArgSet(c_sigma_rt, c_alpha_rt1, c_alpha_rt2, c_n_rt1, c_n_rt2) else: c_RTgauss = RooProdPdf( "c_RTgauss", "c_RTgauss", RooArgList(theRTgauss, c_alpha_rt1, c_n_rt1, c_sigma_rt1, c_sigma_rt2, c_alpha_rt2, c_n_rt2)) c_vars = RooArgSet(c_sigma_rt1, c_sigma_rt2, c_alpha_rt1, c_alpha_rt2, c_n_rt1, c_n_rt2) ### creating constraints for the WT component c_WTgauss = RooProdPdf( "c_WTgauss", "c_WTgauss", RooArgList(theWTgauss, c_alpha_wt1, c_n_wt1, c_sigma_wt, c_alpha_wt2, c_n_wt2)) c_vars.add(c_sigma_wt) c_vars.add(c_alpha_wt1) c_vars.add(c_alpha_wt2) c_vars.add(c_n_wt1) c_vars.add(c_n_wt2) frt = RooRealVar("F_{RT}", "frt", fraction.n, 0, 1) signalFunction = RooAddPdf("sumgaus", "rt+wt", RooArgList(c_RTgauss, c_WTgauss), RooArgList(frt)) c_frt = RooGaussian("c_frt", "c_frt", frt, ROOT.RooFit.RooConst(fraction.n), ROOT.RooFit.RooConst(fraction.s)) ### creating constraints for the difference between the two peaks deltaPeaks = RooFormulaVar("deltaPeaks", "@0 - @1", RooArgList(meanrt, meanwt)) c_deltaPeaks = RooGaussian( "c_deltaPeaks", "c_deltaPeaks", deltaPeaks, ROOT.RooFit.RooConst(deltaPeaks.getVal()), ROOT.RooFit.RooConst(0.0005) ## value to be checked ) c_signalFunction = RooProdPdf( "c_signalFunction", "c_signalFunction", RooArgList(signalFunction, c_frt, c_deltaPeaks)) c_vars.add(frt) c_vars.add(deltaPeaks) ### now create background parametrization slope = RooRealVar("slope", "slope", 0.5, -10, 10) bkg_exp = RooExponential("bkg_exp", "exponential", slope, tagged_mass) pol_c1 = RooRealVar("p1", "coeff x^0 term", 0.5, -10, 10) pol_c2 = RooRealVar("p2", "coeff x^1 term", 0.5, -10, 10) bkg_pol = RooChebychev("bkg_pol", "2nd order pol", tagged_mass, RooArgList(pol_c1, pol_c2)) nsig = RooRealVar("Yield", "signal frac", nrt_mc.n + nwt_mc.n, 0, 1000000) nbkg = RooRealVar("nbkg", "bkg fraction", 1000, 0, 550000) print nsig.getVal() fitFunction = RooAddPdf("fitfunction", "fit function", RooArgList(c_signalFunction, bkg_pol), RooArgList(nsig, nbkg)) pars_to_tune = [ sigmawt, alphawt1, alphawt2, nwt1, nwt2, alphart1, alphart2, nrt1, nrt2 ] if ibin < 5: pars_to_tune.append(sigmart) else: pars_to_tune.append(sigmart1) pars_to_tune.append(sigmart2) ## add toy bkg for itoy in range(args.ntoys): data = deepcopy(signaldata) toy_bkg = generateBkg(tagged_mass, ibin, n_bkg) data.append(toy_bkg) print 'toy number', itoy for ipar in pars_to_tune: ipar.setVal(pars_init_vals[ipar.GetName()]) # r = fitFunction.fitTo(data, # RooFit.Extended(True), # RooFit.Range("full"), # ROOT.RooFit.Constrain(c_vars), # # ROOT.RooFit.Minimizer("Minuit2","migrad"), # ROOT.RooFit.Hesse(True), # ROOT.RooFit.Strategy(2), # ROOT.RooFit.Minos(False), # ) # # print 'fit with Hesse strategy 2 done, now Minos' r = fitFunction.fitTo( data, RooFit.Extended(True), RooFit.Save(), RooFit.Range("full"), RooFit.Verbose(False), ROOT.RooFit.Constrain(c_vars), # ROOT.RooFit.Minimizer("Minuit2","migrad"), # ROOT.RooFit.Hesse(True), ROOT.RooFit.Strategy(2), ROOT.RooFit.Minos(True), ) # # r.Print() # # r.correlationMatrix().Print() fitStats['data%s_itoy%s' % (ibin, itoy)] = r.status() covStats['data%s_itoy%s' % (ibin, itoy)] = r.covQual() frame = tagged_mass.frame(RooFit.Range("full")) data.plotOn(frame, RooFit.Binning(nbins), RooFit.MarkerSize(.7)) fitFunction.plotOn(frame, RooFit.NormRange("full"), RooFit.Range("full")) ## evaluate sort of chi2 and save number of RT/WT events observables = RooArgSet(tagged_mass) flparams = fitFunction.getParameters(observables) nparam = int( flparams.selectByAttrib("Constant", ROOT.kFALSE).getSize()) pdfstring = "fitfunction_Norm[tagged_mass]_Range[full]_NormRange[full]" chi2s['data%s_itoy%s' % (ibin, itoy)] = frame.chiSquare( pdfstring, "h_fulldata", nparam) frame.addObject(_writeChi2(chi2s['data%s_itoy%s' % (ibin, itoy)])) ## save plot only if 1 toy is run if args.ntoys == 1: drawPdfComponents(fitFunction, frame, ROOT.kAzure, RooFit.NormRange("full"), RooFit.Range("full"), isData=True) fitFunction.paramOn(frame, RooFit.Layout(0.62, 0.86, 0.89)) # parList = RooArgSet (nsig, nbkg, meanrt, meanwt, alphart1, alphart2, meanwt, sigmawt) # if ibin < 5 : # parList.add(sigmart) # else: # parList.add(sigmart1) # parList.add(sigmart2) # parList.add(alphawt1) # parList.add(alphawt2) # parList.add(nwt1) # parList.add(nwt2) # parList.add(frt) # fitFunction.paramOn(frame, RooFit.Parameters(parList), RooFit.Layout(0.62,0.86,0.89)) frame.Draw() niceFrame(frame, '') frame.addObject(_writeFitStatus(r)) c1 = ROOT.TCanvas() upperPad = ROOT.TPad('upperPad', 'upperPad', 0., 0.35, 1., 1.) lowerPad = ROOT.TPad('lowerPad', 'lowerPad', 0., 0.0, 1., 0.345) upperPad.SetBottomMargin(0.012) lowerPad.SetTopMargin(0) lowerPad.SetBottomMargin(0.2) upperPad.Draw() lowerPad.Draw() upperPad.cd() frame.Draw() if not args.year == 'test': writeCMS(frame, args.year, [q2binning[ibin], q2binning[ibin + 1]], 1) frame.Draw() ## add plot of pulls lowerPad.cd() hpull = frame.pullHist("h_fulldata", pdfstring) frame2 = tagged_mass.frame(RooFit.Range("full"), RooFit.Title('')) frame2.addPlotable(hpull, "P") niceFrameLowerPad(frame2, 'pull') frame2.Draw() line = ROOT.TLine(5.0, 1, 5.6, 1) line.SetLineColor(ROOT.kGreen + 3) line.Draw() for ilog in [True, False]: upperPad.SetLogy(ilog) c1.SaveAs( 'fit_results_mass_checkOnMC/toybkg/save_fit_data_%s_%s_nbkg%s_LMNR_Final%s_%s_update_pol2bkg.pdf' % (ibin, args.year, n_bkg, '_logScale' * ilog, itoy)) out_f.cd() # r.Write('results_data_%s_ntoy%s'%(ibin,itoy)) ## compare nkbg fitted w/ original value nbkgs['data%s_itoy%s' % (ibin, itoy)] = (toy_bkg.sumEntries() - nbkg.getVal()) / toy_bkg.sumEntries() nsigs['data%s_itoy%s' % (ibin, itoy)] = (n_realsignal - nsig.getVal()) / n_realsignal
def fitData(fulldata, ibin, w): cut = cut_base + '&& (mumuMass*mumuMass > %s && mumuMass*mumuMass < %s)'%(q2binning[ibin], q2binning[ibin+1]) data = fulldata.reduce(RooArgSet(tagged_mass,mumuMass,mumuMassE), cut) nrt_mc = _getFittedVar("nRT_%s"%ibin, w) nwt_mc = _getFittedVar("nWT_%s"%ibin, w) fraction = nrt_mc / (nrt_mc + nwt_mc) print 'mistag fraction on MC for bin ', ibin , ' : ' , fraction.n , '+/-', fraction.s ### creating RT component w.loadSnapshot("reference_fit_RT_%s"%ibin) mean_rt = w.var("mean^{RT%s}"%ibin) sigma_rt1 = w.var("#sigma_{RT1}^{%s}"%ibin) sigma_rt2 = RooRealVar() alpha_rt1 = RooRealVar() alpha_rt2 = RooRealVar() n_rt1 = RooRealVar() n_rt2 = RooRealVar() f1rt = RooRealVar() ## double cb fast if ibin < 4: alpha_rt1 = w.var("#alpha_{RT1}^{%s}"%ibin) alpha_rt2 = w.var("#alpha_{RT2}^{%s}"%ibin) n_rt1 = w.var("n_{RT1}^{%s}"%ibin) n_rt2 = w.var("n_{RT2}^{%s}"%ibin) ## double cb old else: sigma_rt2 = w.var("#sigma_{RT2}^{%s}"%ibin) alpha_rt1 = w.var("#alpha_{RT1}^{%s}"%ibin) alpha_rt2 = w.var("#alpha_{RT2}^{%s}"%ibin) n_rt1 = w.var("n_{RT1}^{%s}"%ibin) n_rt2 = w.var("n_{RT2}^{%s}"%ibin) f1rt = w.var("f^{RT%s}"%ibin) theRTgauss = w.pdf("doublecb_RT%s"%ibin) ### creating WT component w.loadSnapshot("reference_fit_WT_%s"%ibin) mean_wt = w.var("mean_{WT}^{%s}"%ibin) sigma_wt = w.var("#sigma_{WT1}^{%s}"%ibin) alpha_wt1 = w.var("#alpha_{WT1}^{%s}"%ibin) alpha_wt2 = w.var("#alpha_{WT2}^{%s}"%ibin) n_wt1 = w.var("n_{WT1}^{%s}"%ibin) n_wt2 = w.var("n_{WT2}^{%s}"%ibin) theWTgauss = w.pdf("doublecb_%s"%ibin) ### creating variable for the difference between the two peaks deltaPeaks = RooFormulaVar("deltaPeaks%s"%ibin, "@0 - @1", RooArgList(mean_rt, mean_wt)) frt = RooRealVar ("F_{RT}%s"%ibin , "frt" , fraction.n , 0, 1) signalFunction = RooAddPdf ("sumgaus%s"%ibin , "rt+wt" , RooArgList(theRTgauss,theWTgauss), RooArgList(frt)) ### now create background parametrization slope = RooRealVar ("slope_%s"%ibin , "slope" , 0.5, -10, 10); bkg_exp = RooExponential("bkg_exp%s"%ibin , "exponential" , slope, tagged_mass ); pol_c1 = RooRealVar ("p1_%s"%ibin , "coeff x^0 term" , 0.5, -10, 10); pol_c2 = RooRealVar ("p2_%s"%ibin , "coeff x^1 term" , 0.5, -10, 10); bkg_pol = RooPolynomial ("bkg_pol%s"%ibin , "2nd order pol" , tagged_mass, RooArgList(pol_c1, pol_c2)); fsig = RooRealVar("fsig%s"%ibin , "fsig" , 0.9, 0, 1); # nsig = RooRealVar("Yield%s"%ibin , "signal frac" , 1000, 0, 10000); # nbkg = RooRealVar("nbkg%s"%ibin , "bkg fraction" , 1000, 0, 500000); nsig = RooRealVar("Yield" , "signal frac" , 600000, 0, 5000000); nbkg = RooRealVar("nbkg" , "bkg fraction" , 100000, 0, 2000000); # if ibin==4: # nsig.setRange(500000,1500000) # nsig.setVal(900000) # nbkg.setRange(80000,1000000) # nbkg.setVal(100000) ### creating constraints c_vars = RooArgSet() c_pdfs = RooArgSet() c_sigma_rt1 = _constrainVar(sigma_rt1, 1) c_alpha_rt1 = _constrainVar(alpha_rt1, 1) c_alpha_rt2 = _constrainVar(alpha_rt2, 1) c_n_rt1 = _constrainVar(n_rt1, 1) c_n_rt2 = _constrainVar(n_rt2, 1) c_sigma_wt = _constrainVar(sigma_wt, 1) c_alpha_wt1 = _constrainVar(alpha_wt1, 1) c_alpha_wt2 = _constrainVar(alpha_wt2, 1) c_n_wt1 = _constrainVar(n_wt1, 1) c_n_wt2 = _constrainVar(n_wt2, 1) if ibin < 4: c_pdfs = RooArgSet(c_sigma_rt1, c_alpha_rt1, c_alpha_rt2, c_n_rt1, c_n_rt2) c_vars = RooArgSet(sigma_rt1, alpha_rt1, alpha_rt2, n_rt1, n_rt2) else: c_sigma_rt2 = _constrainVar(sigma_rt2, 1) c_pdfs = RooArgSet(c_sigma_rt1, c_sigma_rt2, c_alpha_rt1, c_alpha_rt2, c_n_rt1, c_n_rt2) c_vars = RooArgSet( sigma_rt1, sigma_rt2, alpha_rt1, alpha_rt2, n_rt1, n_rt2) c_pdfs.add(c_sigma_wt); c_vars.add(sigma_wt) c_pdfs.add(c_alpha_wt1); c_vars.add(alpha_wt1) c_pdfs.add(c_alpha_wt2); c_vars.add(alpha_wt2) c_pdfs.add(c_n_wt1); c_vars.add(n_wt1) c_pdfs.add(c_n_wt2); c_vars.add(n_wt2) c_deltaPeaks = RooGaussian("c_deltaPeaks%s"%ibin , "c_deltaPeaks", deltaPeaks, ROOT.RooFit.RooConst( deltaPeaks.getVal() ), ROOT.RooFit.RooConst( 0.0005 ) ## value to be checked ) c_pdfs.add(c_deltaPeaks) c_vars.add(deltaPeaks) c_frt = RooGaussian("c_frt%s"%ibin , "c_frt" , frt, ROOT.RooFit.RooConst(fraction.n) , ROOT.RooFit.RooConst(frt_sigma[ibin]) ) c_pdfs.add(c_frt) c_vars.add(frt) constr_list = RooArgList(c_pdfs) constr_list.add(signalFunction) c_signalFunction = RooProdPdf ("c_signalFunction", "c_signalFunction", constr_list) # mean = RooRealVar ("mass" , "mean" , B0Mass_, 3, 7, "GeV") # sigma = RooRealVar ("#sigma_{1}" , "sigma" , 0.028, 0, 10, "GeV") # signalGauss = RooGaussian("signalGauss" , "signal gauss" , tagged_mass, mean,sigma) # # sigma2 = RooRealVar ("#sigma_{2}" , "sigma2" , 0.048, 0, 0.07, "GeV") # signalGauss2 = RooGaussian("signalGauss2" , "signal gauss2" , tagged_mass, mean,sigma2) # f1 = RooRealVar ("f1" , "f1" , 0.8 , 0., 1.) # gaus = RooAddPdf ("gaus" , "gaus1+gaus2" , RooArgList(signalGauss,signalGauss2), RooArgList(f1)) # pol_c1 = RooRealVar ("p1" , "coeff x^0 term", 0.5, -10, 10); # pol_c2 = RooRealVar ("p2" , "coeff x^1 term", 0.5, -10, 10); # pol_c3 = RooRealVar ("p3" , "coeff x^2 term", 0.5, -10, 10); # slope = RooRealVar ("slope" , "slope" , 0.5, -10, 10); # bkg_exp = RooExponential("bkg_exp" , "exponential" , slope, tagged_mass ); # bkg_pol = RooChebychev("bkg_pol" , "2nd order pol" , tagged_mass, RooArgList(pol_c1,pol_c2)); fitFunction = RooAddPdf ("fitfunction%s"%ibin , "fit function" , RooArgList(c_signalFunction, bkg_exp), RooArgList(nsig, nbkg)) # r = fitFunction.fitTo(data, # # RooFit.Extended(True), # RooFit.Range("full"), # ROOT.RooFit.Constrain(c_vars), # ROOT.RooFit.Minimizer("Minuit2","migrad"), # ROOT.RooFit.Hesse(True), # ROOT.RooFit.Strategy(2), # ROOT.RooFit.Minos(False), # ) print 'fit with Hesse strategy 2 done, now Minos' r = fitFunction.fitTo(data, RooFit.Extended(True), RooFit.Save(), RooFit.Range("full"), RooFit.Verbose(False), ROOT.RooFit.Constrain(c_vars), # ROOT.RooFit.Minimizer("Minuit2","migrad"), # ROOT.RooFit.Hesse(True), # ROOT.RooFit.Strategy(2), # ROOT.RooFit.Minos(False), ) r.Print() r.correlationMatrix().Print() fitStats['data%s'%(ibin)] = r.status() covStats['data%s'%(ibin)] = r.covQual() frame = tagged_mass.frame( RooFit.Range("full") ) data.plotOn(frame, RooFit.Binning(nbins), RooFit.MarkerSize(.7)) fitFunction.plotOn(frame, RooFit.NormRange("full"), RooFit.Range("full")) ## evaluate sort of chi2 and save number of RT/WT events observables = RooArgSet(tagged_mass) flparams = fitFunction.getParameters(observables) nparam = int(flparams.selectByAttrib("Constant",ROOT.kFALSE).getSize()) pdfstring = "fitfunction%s_Norm[tagged_mass]_Range[full]_NormRange[full]"%ibin chi2s['data%s'%ibin] = frame.chiSquare(pdfstring, "h_fulldata", nparam) frame. addObject(_writeChi2( chi2s['data%s'%ibin] )) drawPdfComponents(fitFunction, frame, ROOT.kAzure, RooFit.NormRange("full"), RooFit.Range("full"), isData = True) # fitFunction.paramOn(frame, RooFit.Layout(0.62,0.86,0.89)) parList = RooArgSet (nsig, mean_rt, sigma_rt, alpha_rt1, alpha_rt2, n_rt1, n_rt2, mean_wt, sigma_wt) # parList.add(alphawt1) # parList.add(alphawt2) # parList.add(nwt1) # parList.add(nwt2) parList.add(frt) fitFunction.paramOn(frame, RooFit.Parameters(parList), RooFit.Layout(0.62,0.86,0.89)) frame.Draw() niceFrame(frame, '') frame. addObject(_writeFitStatus(r)) c1 = ROOT.TCanvas() upperPad = ROOT.TPad('upperPad' , 'upperPad' , 0., 0.35 , 1., 1. ) lowerPad = ROOT.TPad('lowerPad' , 'lowerPad' , 0., 0.0 , 1., 0.345 ) upperPad.SetBottomMargin(0.012) lowerPad.SetTopMargin(0) lowerPad.SetBottomMargin(0.2) upperPad.Draw(); lowerPad.Draw() upperPad.cd() frame.Draw() if not args.year=='test': writeCMS(frame, args.year, [ q2binning[ibin], q2binning[ibin+1] ], 0) frame.Draw() ## add plot of pulls lowerPad.cd() hpull = frame.pullHist("h_fulldata", pdfstring) frame2 = tagged_mass.frame(RooFit.Range("full"), RooFit.Title('')) frame2.addPlotable(hpull,"P") niceFrameLowerPad(frame2, 'pull') frame2.Draw() line = ROOT.TLine(5.0,1,5.6,1) line.SetLineColor(ROOT.kGreen+3) line.Draw() for ilog in [True,False]: upperPad.SetLogy(ilog) c1.SaveAs('fit_results_mass/save_fit_data_%s_%s_LMNR_Update%s_newSigmaFRT_pars_Jpsi.pdf'%(ibin, args.year, '_logScale'*ilog)) out_f.cd() r.Write('results_data_%s'%(ibin)) params = fitFunction.getParameters(RooArgSet(tagged_mass)) out_w.saveSnapshot("reference_fit_data_%s"%(ibin),params,ROOT.kTRUE) getattr(out_w, 'import')(fitFunction)
0, 1e10) sigmodel = RooAddPdf("sigmodel" + str(cut), "sig+bkg", RooArgList(sigbkg, sig), RooArgList(nbkg, nsigref)) s0.setConstant(False) s1.setConstant(False) sigmodel.fitTo( signal, RooFit.SumW2Error(True)) #,RooFit.Range("signal") sigmodel.fitTo( signal, RooFit.SumW2Error(True)) #,RooFit.Range("signal") sigmodel.fitTo( signal, RooFit.SumW2Error(True)) #,RooFit.Range("signal") chi2 = RooChi2Var("chi2", "chi2", sigmodel, signal, RooFit.DataError(RooAbsData.SumW2)) nbins = data.numEntries() nfree = sigmodel.getParameters(data).selectByAttrib( "Constant", False).getSize() s0.setConstant(True) s1.setConstant(True) if cut >= 1: fullintegral = sumsighist.Integral() else: fullintegral = sighist.Integral() print "SIGNAL FRACTION", nsigref.getValV() / ( nsigref.getValV() + nbkg.getValV()) if nsigref.getValV() == 0: continue if fit == "data": xframe = mass.frame( RooFit.Title("signal fraction in peak =" + str( int(nsigref.getValV() /
def fillWorkspace(workspace): print ">>> setup model components..." x = RooRealVar("x", "x", 0, 10) mean = RooRealVar("mean", "mean of gaussians", 5, 0, 10) sigma1 = RooRealVar("sigma1", "width of gaussians", 0.5) sigma2 = RooRealVar("sigma2", "width of gaussians", 1) sig1 = RooGaussian("sig1", "Signal component 1", x, mean, sigma1) sig2 = RooGaussian("sig2", "Signal component 2", x, mean, sigma2) a0 = RooRealVar("a0", "a0", 0.5, 0., 1.) a1 = RooRealVar("a1", "a1", -0.2, 0., 1.) bkg = RooChebychev("bkg", "Background", x, RooArgList(a0, a1)) print ">>> sum model components..." sig1frac = RooRealVar("sig1frac", "fraction of component 1 in signal", 0.8, 0., 1.) sig = RooAddPdf("sig", "Signal", RooArgList(sig1, sig2), RooArgList(sig1frac)) bkgfrac = RooRealVar("bkgfrac", "fraction of background", 0.5, 0., 1.) model = RooAddPdf("model", "g1+g2+a", RooArgList(bkg, sig), RooArgList(bkgfrac)) print ">>> import model into workspace..." getattr(workspace, 'import')(model) # import model and all its components #workspace.import(model) # causes synthax error in python print "\n>>> encode definition of parameters and observables in workspace..." # Define named sets "parameters" and "observables", which list which variables should # be considered parameters and observables by the users convention # # Variables appearing in sets _must_ live in the workspace already, or the autoImport # flag of defineSet must be set to import them on the fly. Named sets contain only # references to the original variables, therefore the value of observables in named # sets already reflect their 'current' value params = model.getParameters(RooArgSet(x)) # RooArgSet workspace.defineSet("parameters", RooArgSet(params)) workspace.defineSet("observables", RooArgSet(x)) # Encode reference value for parameters in workspace: # Define a parameter 'snapshot' in the pdf # Unlike a named set, a parameter snapshot stores an independent set of values for # a given set of variables in the workspace. The values can be stored and reloaded # into the workspace variable objects using the loadSnapshot() and saveSnapshot() # methods. A snapshot saves the value of each variable, any errors that are stored # with it as well as the 'Constant' flag that is used in fits to determine if a # parameter is kept fixed or not. print ">>> generate and fit data..." # Do a dummy fit to a (supposedly) reference dataset here and store the results # of that fit into a snapshot refData = model.generate(RooArgSet(x), 10000) # RooDataSet model.fitTo(refData, PrintLevel(-1)) print "\n>>> save fit results into a snapshot in the workspace..." # The kTRUE flag imports the values of the objects in (*params) into the workspace # If not set, the present values of the workspace parameters objects are stored workspace.saveSnapshot("reference_fit", params, kTRUE) print ">>> make another fit with the signal component forced to zero..." bkgfrac.setVal(1) bkgfrac.setConstant(kTRUE) bkgfrac.removeError() model.fitTo(refData, PrintLevel(-1)) print "\n>>> save new fit parameters in different snapshot..." workspace.saveSnapshot("reference_fit_bkgonly", params, kTRUE)