void fitTF1(TCanvas *canvas, TH1F h, double XMIN_, double XMAX_, double dX_, double params[], Color_t LC_=kBlack) { //double& FWHM_, double& x0_, double& x1_, double& x2_, double& y0_, double& y1_, double& INT_, double& YIELD_) { //TCanvas* fitTF1(TH1F h, double HSCALE_, double XMIN_, double XMAX_) { //TF1* fitTF1(TH1F h, double HSCALE_, double XMIN_, double XMAX_) { gROOT->ForceStyle(); RooMsgService::instance().setSilentMode(kTRUE); for(int i=0;i<2;i++) RooMsgService::instance().setStreamStatus(i,kFALSE); //TCanvas *canvas = new TCanvas(TString::Format("canvas_%s",h.GetName()),TString::Format("canvas_%s",h.GetName()),1800,1200); RooDataHist *RooHistFit = 0; RooAddPdf *model = 0; RooWorkspace w = RooWorkspace("w","workspace"); RooRealVar x("mbbReg","mbbReg",XMIN_,XMAX_); RooRealVar kJES("CMS_scale_j","CMS_scale_j",1,0.9,1.1); RooRealVar kJER("CMS_res_j","CMS_res_j",1,0.8,1.2); kJES.setConstant(kTRUE); kJER.setConstant(kTRUE); TString hname = h.GetName(); RooHistFit = new RooDataHist("fit_"+hname,"fit_"+hname,x,&h); RooRealVar YieldVBF = RooRealVar("yield_"+hname,"yield_"+hname,h.Integral()); RooRealVar m("mean_"+hname,"mean_"+hname,125,100,150); RooRealVar s("sigma_"+hname,"sigma_"+hname,12,3,30); RooFormulaVar mShift("mShift_"+hname,"@0*@1",RooArgList(m,kJES)); RooFormulaVar sShift("sShift_"+hname,"@0*@1",RooArgList(m,kJER)); RooRealVar a("alpha_"+hname,"alpha_"+hname,1,-10,10); RooRealVar n("exp_"+hname,"exp_"+hname,1,0,100); RooRealVar b0("b0_"+hname,"b0_"+hname,0.5,0.,1.); RooRealVar b1("b1_"+hname,"b1_"+hname,0.5,0.,1.); RooRealVar b2("b2_"+hname,"b2_"+hname,0.5,0.,1.); RooRealVar b3("b3_"+hname,"b3_"+hname,0.5,0.,1.); RooBernstein bkg("signal_bkg_"+hname,"signal_bkg_"+hname,x,RooArgSet(b0,b1,b2)); RooRealVar fsig("fsig_"+hname,"fsig_"+hname,0.7,0.0,1.0); RooCBShape sig("signal_gauss_"+hname,"signal_gauss_"+hname,x,mShift,sShift,a,n); model = new RooAddPdf("signal_model_"+hname,"signal_model_"+hname,RooArgList(sig,bkg),fsig); //RooFitResult *res = model->fitTo(*RooHistFit,RooFit::Save(),RooFit::SumW2Error(kFALSE),"q"); model->fitTo(*RooHistFit,RooFit::Save(),RooFit::SumW2Error(kFALSE),"q"); //res->Print(); //model->Print(); canvas->cd(); canvas->SetTopMargin(0.1); RooPlot *frame = x.frame(); // no scale RooHistFit->plotOn(frame); model->plotOn(frame,RooFit::LineColor(LC_),RooFit::LineWidth(2));//,RooFit::LineStyle(kDotted)); model->plotOn(frame,RooFit::Components(bkg),RooFit::LineColor(LC_),RooFit::LineWidth(2),RooFit::LineStyle(kDashed)); // with scale // RooHistFit->plotOn(frame,RooFit::Normalization(HSCALE_,RooAbsReal::NumEvent)); // model->plotOn(frame,RooFit::Normalization(HSCALE_,RooAbsReal::NumEvent),RooFit::LineWidth(1)); // model->plotOn(frame,RooFit::Components(bkg),RooFit::LineColor(kBlue),RooFit::LineWidth(1),RooFit::LineStyle(kDashed),RooFit::Normalization(HSCALE_,RooAbsReal::NumEvent)); frame->GetXaxis()->SetLimits(50,200); frame->GetXaxis()->SetNdivisions(505); frame->GetXaxis()->SetTitle("M_{b#bar{b}} (GeV)"); frame->GetYaxis()->SetTitle("Events"); frame->Draw(); h.SetFillColor(kGray); h.Draw("hist,same"); frame->Draw("same"); gPad->RedrawAxis(); TF1 *tmp = model->asTF(x,fsig,x); //tmp->Print(); double y0_ = tmp->GetMaximum(); double x0_ = tmp->GetMaximumX(); double x1_ = tmp->GetX(y0_/2.,XMIN_,x0_); double x2_ = tmp->GetX(y0_/2.,x0_,XMAX_); double FWHM_ = x2_-x1_; double INT_ = tmp->Integral(XMIN_,XMAX_); double YIELD_= YieldVBF.getVal(); double y1_ = dX_*0.5*y0_*(YieldVBF.getVal()/tmp->Integral(XMIN_,XMAX_)); params[0] = x0_; params[1] = x1_; params[2] = x2_; params[3] = y0_; params[4] = y1_; params[5] = FWHM_; params[6] = INT_; params[7] = YIELD_; //cout<<"Int = "<<tmp->Integral(XMIN_,XMAX_)<<", Yield = "<<YieldVBF.getVal()<<", y0 = "<<y0_<<", y1 = "<<y1_ <<", x0 = "<< x0_ << ", x1 = "<<x1_<<", x2 = "<<x2_<<", FWHM = "<<FWHM_<<endl; TLine ln = TLine(x1_,y1_,x2_,y1_); ln.SetLineColor(kMagenta+3); ln.SetLineStyle(7); ln.SetLineWidth(2); ln.Draw(); canvas->Update(); canvas->SaveAs("testC.png"); // tmp->Delete(); // frame->Delete(); // res->Delete(); // TF1 *f1 = model->asTF(x,fsig,x); // return f1; ////tmp->Delete(); ////ln->Delete(); ////model->Delete(); ////RooHistFit->Delete(); ////w->Delete(); ////YieldVBF->Delete(); ////frame->Delete(); ////res->Delete(); //delete tmp; //delete ln; //delete model; //delete RooHistFit; //delete w; //delete YieldVBF; //delete frame; //delete res; // return canvas; }
main() { int i, j, k, pos; scanf("%d", &bLength); for(i = 0; i < bLength; i++) { scanf("%d %d", &b[i], &bWt[i]); } // Initialize low- and high-valued sentinels mLength = 2; m[0] = (-999999999); mWt[0] = 0; mLink[0] = (-1); m[1] = 999999999; mWt[1] = 999999999; mLink[1] = (-1); for(i = 0; i < bLength; i++) { // Binary search to find supported element pos = findSupported(b[i]); // printf("findSupported returned: %i\n", pos); // m[pos-1] is supporting element if(m[pos] > b[i]) { // Shift items, then use entry pos mShift(pos, mWt[pos - 1] + bWt[i]); m[pos] = b[i]; mWt[pos] = mWt[pos - 1] + bWt[i]; bPred[i] = mLink[pos - 1]; mLink[pos] = i; // printf("1: b[%d]=%d has been inserted in m, mLength %d\n", // i, b[i], mLength); } else { // m[pos]==b[i] if(mWt[pos - 1] + bWt[i] > mWt[pos]) { // printf("%s(%i) - In here\n", __FILE__, __LINE__); // Can improve entry pos mWt[pos] = mWt[pos - 1] + bWt[i]; bPred[i] = mLink[pos - 1]; mLink[pos] = i; // Find unneeded entries j = findUnneeded(pos + 1, mWt[pos]) + 1; if(j > pos + 1) { // Shift left over unneeded entries for(k = pos + 1; j < mLength; j++, k++) { m[k] = m[j]; mWt[k] = mWt[j]; mLink[k] = mLink[j]; } mLength = k; } // printf("2: b[%d]=%d has improved an entry of m, mLength %d\n", // i, b[i], mLength); } else { bPred[i] = (-2); // printf("3: b[%d]=%d has been ignored due to strictness\n", i, b[i]); } } } // printf(" i b bWt bPred\n"); // for(i = 0; i < bLength; i++) { // printf("%5d %5d %5d %5d\n", i, b[i], bWt[i], bPred[i]); // } // printf(" i m mWt mLink\n"); // for(i = 0; i < mLength; i++) { // printf("%5d %5d %5d %5d\n", i, m[i], mWt[i], mLink[i]); // } // Get result sequence i = mLink[mLength - 2]; // Ignore high-valued sentinel seqLength = 0; while(i != (-1)) { seqLength++; i = bPred[i]; } i = mLink[mLength - 2]; // Ignore high-valued sentinel for(j = seqLength - 1; j >= 0; j--) { seq[j] = b[i]; seqWt[j] = bWt[i]; i = bPred[i]; } printf("HSIS (total weight %d):\n", mWt[mLength - 2]); for(i = 0; i < seqLength; i++) { printf("%4d %4d %4d\n", i, seq[i], seqWt[i]); } }
void templatesSig(double XMIN,double XMAX,double dX,TString cutstring) { gROOT->ForceStyle(); RooMsgService::instance().setSilentMode(kTRUE); for(int i=0;i<2;i++) RooMsgService::instance().setStreamStatus(i,kFALSE); const int NMASS(1); char name[1000]; TFile *fVBF[NMASS];//,*fGF[NMASS]; TH1F *hVBF[NMASS][5],*hPassVBF; int H_MASS[1] = {125}; TString SELECTION[1] = {"jetPt[0]>80 && jetPt[1]>70"}; int NCAT[1] = {4}; int LUMI[1] = {19281}; int XSEC_VBF[1] = {0.911}; // TH1F *hGF[NMASS][5],*hVBF[NMASS][5],*hTOT[NMASS][5],*hPassGF,*hPassVBF; RooDataHist *RooHistFit[NMASS][5],*RooHistScaled[NMASS][5]; RooAddPdf *model[NMASS][5]; TCanvas *can[NMASS]; TString PATH("rootfiles/"); RooWorkspace *w = new RooWorkspace("w","workspace"); int NBINS = (XMAX-XMIN)/dX; RooRealVar x("mbbReg","mbbReg",XMIN,XMAX); RooRealVar kJES("CMS_scale_j","CMS_scale_j",1,0.9,1.1); RooRealVar kJER("CMS_res_j","CMS_res_j",1,0.8,1.2); kJES.setConstant(kTRUE); kJER.setConstant(kTRUE); TString TRIG_WT[2] = {"trigWtNOM[1]","trigWtVBF"}; for(int iMass=0;iMass<NMASS;iMass++) { cout<<"Mass = "<<H_MASS[iMass]<<" GeV"<<endl; int counter(0); for(int iSEL=0;iSEL<2;iSEL++) { // sprintf(name,"Fit_VBFPowheg%d_sel%s.root",H_MASS[iMass],SELECTION[iSEL].Data()); sprintf(name,"vbfHbb_uncertainties_JEx.root"); cout << name << endl; fVBF[iMass] = TFile::Open(PATH+TString(name)); // hPassVBF = (TH1F*)fVBF[iMass]->Get("TriggerPass"); // sprintf(name,"Fit_GFPowheg%d_sel%s.root",H_MASS[iMass],SELECTION[iSEL].Data()); // fGF[iMass] = TFile::Open(PATH+TString(name)); // hPassGF = (TH1F*)fGF[iMass]->Get("TriggerPass"); sprintf(name,"HMassTemplate_%d_sel%s",H_MASS[iMass],SELECTION[iSEL].Data()); can[iMass] = new TCanvas(name,name,1200,800); can[iMass]->Divide(2,2); for(int icat=0;icat<NCAT[iSEL];icat++) { sprintf(name,"Hbb%d/events",icat); // trVBF = (TTree*)fVBF[iMass]->Get(name); // trGF = (TTree*)fGF[iMass]->Get(name); can[iMass]->cd(icat+1); sprintf(name,"mass_VBF%d_sel%s_CAT%d",H_MASS[iMass],SELECTION[iSEL].Data(),icat); hVBF[iMass][icat] = (TH1F*)fVBF[iMass]->Get("histos/VBF125/h_NOM_VBF125_Hbb_mbbReg1;1");//new TH1F(name,name,NBINS,XMIN,XMAX); // hVBF[iMass][icat]->Sumw2(); // TCut cut("puWt[0]*"+TRIG_WT[iSEL]+"*(mva"+SELECTION[iSEL]+">-1)"); // TCut cut(cutstring.Data()); // trVBF->Draw(MASS_VAR[iSEL]+">>"+TString(name),cut); // sprintf(name,"mass_GF%d_sel%s_CAT%d",H_MASS[iMass],SELECTION[iSEL].Data(),icat); // hGF[iMass][icat] = new TH1F(name,name,NBINS,XMIN,XMAX); // hGF[iMass][icat]->Sumw2(); // trGF->Draw(MASS_VAR[iSEL]+">>"+TString(name),cut); // // delete trVBF; // delete trGF; sprintf(name,"roohist_fit_mass%d_sel%s_CAT%d",H_MASS[iMass],SELECTION[iSEL].Data(),icat); RooHistFit[iMass][icat] = new RooDataHist(name,name,x,hVBF[iMass][icat]); // hGF[iMass][icat]->Scale(LUMI[iSEL]*XSEC_GF[iMass]/hPassGF->GetBinContent(1)); hVBF[iMass][icat]->Scale(LUMI[iSEL]*XSEC_VBF[iMass]/4794398.);//hPassVBF->GetBinContent(1)); // sprintf(name,"mass_Total%d_sel%s_CAT%d",H_MASS[iMass],SELECTION[iSEL].Data(),icat); hTOT[iMass][icat] = (TH1F*)hVBF[iMass][icat]->Clone(name); // hTOT[iMass][icat]->Add(hGF[iMass][icat]); sprintf(name,"yield_signalVBF_mass%d_CAT%d",H_MASS[iMass],counter); RooRealVar *YieldVBF = new RooRealVar(name,name,hVBF[iMass][icat]->Integral()); sprintf(name,"roohist_demo_mass%d_sel%s_CAT%d",H_MASS[iMass],SELECTION[iSEL].Data(),icat); RooHistScaled[iMass][icat] = new RooDataHist(name,name,x,hTOT[iMass][icat]); sprintf(name,"mean_m%d_CAT%d",H_MASS[iMass],counter); RooRealVar m(name,name,125,100,150); sprintf(name,"sigma_m%d_CAT%d",H_MASS[iMass],counter); RooRealVar s(name,name,12,3,30); sprintf(name,"mean_shifted_m%d_CAT%d",H_MASS[iMass],counter); RooFormulaVar mShift(name,"@0*@1",RooArgList(m,kJES)); sprintf(name,"sigma_shifted_m%d_CAT%d",H_MASS[iMass],counter); RooFormulaVar sShift(name,"@0*@1",RooArgList(s,kJER)); sprintf(name,"alpha_m%d_CAT%d",H_MASS[iMass],counter); RooRealVar a(name,name,1,-10,10); sprintf(name,"exp_m%d_CAT%d",H_MASS[iMass],counter); RooRealVar n(name,name,1,0,100); sprintf(name,"b0_m%d_CAT%d",H_MASS[iMass],counter); RooRealVar b0(name,name,0.5,0.,1.); sprintf(name,"b1_m%d_CAT%d",H_MASS[iMass],counter); RooRealVar b1(name,name,0.5,0.,1.); sprintf(name,"b2_m%d_CAT%d",H_MASS[iMass],counter); RooRealVar b2(name,name,0.5,0.,1.); sprintf(name,"b3_m%d_CAT%d",H_MASS[iMass],counter); RooRealVar b3(name,name,0.5,0.,1.); sprintf(name,"signal_bkg_m%d_CAT%d",H_MASS[iMass],counter); RooBernstein bkg(name,name,x,RooArgSet(b0,b1,b2)); sprintf(name,"fsig_m%d_CAT%d",H_MASS[iMass],counter); RooRealVar fsig(name,name,0.7,0.,1.); sprintf(name,"signal_gauss_m%d_CAT%d",H_MASS[iMass],counter); RooCBShape sig(name,name,x,mShift,sShift,a,n); // model(x) = fsig*sig(x) + (1-fsig)*bkg(x) sprintf(name,"signal_model_m%d_CAT%d",H_MASS[iMass],counter); model[iMass][icat] = new RooAddPdf(name,name,RooArgList(sig,bkg),fsig); RooFitResult *res = model[iMass][icat]->fitTo(*RooHistFit[iMass][icat],RooFit::Save(),RooFit::SumW2Error(kFALSE),"q"); //res->Print(); RooPlot* frame = x.frame(); RooHistScaled[iMass][icat]->plotOn(frame); //model[iMass][icat]->plotOn(frame,RooFit::VisualizeError(*res,1,kFALSE),RooFit::FillColor(kGray)); //RooHist[iMass][icat]->plotOn(frame); model[iMass][icat]->plotOn(frame); double chi2 = frame->chiSquare(); //model[iMass][icat]->plotOn(frame,RooFit::LineWidth(2)); model[iMass][icat]->plotOn(frame,RooFit::Components(bkg),RooFit::LineColor(kBlue),RooFit::LineWidth(2),RooFit::LineStyle(kDashed)); frame->GetXaxis()->SetNdivisions(505); frame->GetXaxis()->SetTitle("M_{bb} (GeV)"); frame->GetYaxis()->SetTitle("Events"); frame->Draw(); // hGF[iMass][icat]->SetFillColor(kGreen-8); hVBF[iMass][icat]->SetFillColor(kRed-10); THStack *hs = new THStack("hs","hs"); // hs->Add(hGF[iMass][icat]); hs->Add(hVBF[iMass][icat]); hs->Draw("same hist"); frame->Draw("same"); gPad->RedrawAxis(); TF1 *tmp_func = model[iMass][icat]->asTF(x,fsig,x); double y0 = tmp_func->GetMaximum(); double x0 = tmp_func->GetMaximumX(); double x1 = tmp_func->GetX(y0/2,XMIN,x0); double x2 = tmp_func->GetX(y0/2,x0,XMAX); double FWHM = x2-x1; //cout<<"Int = "<<tmp_func->Integral(XMIN,XMAX)<<", Yield = "<<Yield->getVal()<<", y0 = "<<y0<<", x0 = "<<x0<<", x1 = "<<x1<<", x2 = "<<x2<<", FWHM = "<<FWHM<<endl; //delete tmp_func; double y1 = dX*0.5*y0*(YieldVBF->getVal()+YieldGF->getVal())/tmp_func->Integral(XMIN,XMAX); TLine *ln = new TLine(x1,y1,x2,y1); ln->SetLineColor(kMagenta+3); ln->SetLineStyle(7); ln->SetLineWidth(2); ln->Draw(); TLegend *leg = new TLegend(0.65,0.35,0.9,0.45); leg->AddEntry(hVBF[iMass][icat],"VBF","F"); // leg->AddEntry(hGF[iMass][icat],"GF","F"); leg->SetFillColor(0); leg->SetBorderSize(0); leg->SetTextFont(42); leg->SetTextSize(0.05); leg->Draw("same"); TPaveText *pave = new TPaveText(0.65,0.55,0.9,0.92,"NDC"); sprintf(name,"M_{H} = %d GeV",H_MASS[iMass]); TLegend *leg = new TLegend(0.65,0.35,0.9,0.45); leg->AddEntry(hVBF[iMass][icat],"VBF","F"); // leg->AddEntry(hGF[iMass][icat],"GF","F"); leg->SetFillColor(0); leg->SetBorderSize(0); leg->SetTextFont(42); leg->SetTextSize(0.05); leg->Draw("same"); TPaveText *pave = new TPaveText(0.65,0.55,0.9,0.92,"NDC"); sprintf(name,"M_{H} = %d GeV",H_MASS[iMass]); pave->AddText(name); sprintf(name,"%s selection",SELECTION[iSEL].Data()); pave->AddText(name); sprintf(name,"CAT%d",icat); pave->AddText(name); sprintf(name,"m = %1.1f #pm %1.1f",m.getVal(),m.getError()); pave->AddText(name); sprintf(name,"#sigma = %1.1f #pm %1.1f",s.getVal(),s.getError()); pave->AddText(name); sprintf(name,"FWHM = %1.2f",FWHM); pave->AddText(name); /* sprintf(name,"a = %1.2f #pm %1.2f",a.getVal(),a.getError()); pave->AddText(name); sprintf(name,"n = %1.2f #pm %1.2f",n.getVal(),n.getError()); pave->AddText(name); sprintf(name,"f = %1.2f #pm %1.2f",fsig.getVal(),fsig.getError()); pave->AddText(name); */ pave->SetFillColor(0); pave->SetBorderSize(0); pave->SetTextFont(42); pave->SetTextSize(0.05); pave->SetTextColor(kBlue); pave->Draw(); b0.setConstant(kTRUE); b1.setConstant(kTRUE); b2.setConstant(kTRUE); b3.setConstant(kTRUE); //m2.setConstant(kTRUE); //s2.setConstant(kTRUE); m.setConstant(kTRUE); s.setConstant(kTRUE); a.setConstant(kTRUE); n.setConstant(kTRUE); fsig.setConstant(kTRUE); w->import(*model[iMass][icat]); w->import(*RooHistScaled[iMass][icat]); w->import(*res); w->import(*YieldVBF); w->import(*YieldGF); counter++; }// categories loop }// selection loop }// mass loop w->Print(); //x.Print(); TString selName = "_"; selName += XMIN; selName += "-"; selName += XMAX; w->writeToFile("signal_shapes_workspace"+selName+".root"); }