//put very small data entries in a binned dataset to avoid unphysical pdfs, specifically for H->ZZ->4l RooDataSet* makeData(RooDataSet* orig, RooSimultaneous* simPdf, const RooArgSet* observables, RooRealVar* firstPOI, double mass, double& mu_min) { double max_soverb = 0; mu_min = -10e9; map<string, RooDataSet*> data_map; firstPOI->setVal(0); RooCategory* cat = (RooCategory*)&simPdf->indexCat(); TList* datalist = orig->split(*(RooAbsCategory*)cat, true); TIterator* dataItr = datalist->MakeIterator(); RooAbsData* ds; RooRealVar* weightVar = new RooRealVar("weightVar","weightVar",1); while ((ds = (RooAbsData*)dataItr->Next())) { string typeName(ds->GetName()); cat->setLabel(typeName.c_str()); RooAbsPdf* pdf = simPdf->getPdf(typeName.c_str()); cout << "pdf: " << pdf << endl; RooArgSet* obs = pdf->getObservables(observables); cout << "obs: " << obs << endl; RooArgSet obsAndWeight(*obs, *weightVar); obsAndWeight.add(*cat); stringstream datasetName; datasetName << "newData_" << typeName; RooDataSet* thisData = new RooDataSet(datasetName.str().c_str(),datasetName.str().c_str(), obsAndWeight, WeightVar(*weightVar)); RooRealVar* firstObs = (RooRealVar*)obs->first(); //int ibin = 0; int nrEntries = ds->numEntries(); for (int ib=0;ib<nrEntries;ib++) { const RooArgSet* event = ds->get(ib); const RooRealVar* thisObs = (RooRealVar*)event->find(firstObs->GetName()); firstObs->setVal(thisObs->getVal()); firstPOI->setVal(0); double b = pdf->expectedEvents(*firstObs)*pdf->getVal(obs); firstPOI->setVal(1); double s = pdf->expectedEvents(*firstObs)*pdf->getVal(obs) - b; if (s > 0) { mu_min = max(mu_min, -b/s); double soverb = s/b; if (soverb > max_soverb) { max_soverb = soverb; cout << "Found new max s/b: " << soverb << " in pdf " << pdf->GetName() << " at m = " << thisObs->getVal() << endl; } } if (b == 0 && s != 0) { cout << "Expecting non-zero signal and zero bg at m=" << firstObs->getVal() << " in pdf " << pdf->GetName() << endl; } if (s+b <= 0) { cout << "expecting zero" << endl; continue; } double weight = ds->weight(); if ((typeName.find("ATLAS_H_4mu") != string::npos || typeName.find("ATLAS_H_4e") != string::npos || typeName.find("ATLAS_H_2mu2e") != string::npos || typeName.find("ATLAS_H_2e2mu") != string::npos) && fabs(firstObs->getVal() - mass) < 10 && weight == 0) { cout << "adding event: " << firstObs->getVal() << endl; thisData->add(*event, pow(10., -9.)); } else { //weight = max(pow(10.0, -9), weight); thisData->add(*event, weight); } } data_map[string(ds->GetName())] = (RooDataSet*)thisData; } RooDataSet* newData = new RooDataSet("newData","newData",RooArgSet(*observables, *weightVar), Index(*cat), Import(data_map), WeightVar(*weightVar)); orig->Print(); newData->Print(); //newData->tree()->Scan("*"); return newData; }
void setup(ModelConfig* mcInWs) { RooAbsPdf* combPdf = mcInWs->GetPdf(); RooArgSet mc_obs = *mcInWs->GetObservables(); RooArgSet mc_globs = *mcInWs->GetGlobalObservables(); RooArgSet mc_nuis = *mcInWs->GetNuisanceParameters(); // pair the nuisance parameter to the global observable RooArgSet mc_nuis_tmp = mc_nuis; RooArgList nui_list; RooArgList glob_list; RooArgSet constraint_set_tmp(*combPdf->getAllConstraints(mc_obs, mc_nuis_tmp, false)); RooArgSet constraint_set; int counter_tmp = 0; unfoldConstraints(constraint_set_tmp, constraint_set, mc_obs, mc_nuis_tmp, counter_tmp); TIterator* cIter = constraint_set.createIterator(); RooAbsArg* arg; while ((arg = (RooAbsArg*)cIter->Next())) { RooAbsPdf* pdf = (RooAbsPdf*)arg; if (!pdf) continue; // pdf->Print(); TIterator* nIter = mc_nuis.createIterator(); RooRealVar* thisNui = NULL; RooAbsArg* nui_arg; while ((nui_arg = (RooAbsArg*)nIter->Next())) { if (pdf->dependsOn(*nui_arg)) { thisNui = (RooRealVar*)nui_arg; break; } } delete nIter; // need this incase the observable isn't fundamental. // in this case, see which variable is dependent on the nuisance parameter and use that. RooArgSet* components = pdf->getComponents(); // components->Print(); components->remove(*pdf); if (components->getSize()) { TIterator* itr1 = components->createIterator(); RooAbsArg* arg1; while ((arg1 = (RooAbsArg*)itr1->Next())) { TIterator* itr2 = components->createIterator(); RooAbsArg* arg2; while ((arg2 = (RooAbsArg*)itr2->Next())) { if (arg1 == arg2) continue; if (arg2->dependsOn(*arg1)) { components->remove(*arg1); } } delete itr2; } delete itr1; } if (components->getSize() > 1) { cout << "ERROR::Couldn't isolate proper nuisance parameter" << endl; return; } else if (components->getSize() == 1) { thisNui = (RooRealVar*)components->first(); } TIterator* gIter = mc_globs.createIterator(); RooRealVar* thisGlob = NULL; RooAbsArg* glob_arg; while ((glob_arg = (RooAbsArg*)gIter->Next())) { if (pdf->dependsOn(*glob_arg)) { thisGlob = (RooRealVar*)glob_arg; break; } } delete gIter; if (!thisNui || !thisGlob) { cout << "WARNING::Couldn't find nui or glob for constraint: " << pdf->GetName() << endl; //return; continue; } // cout << "Pairing nui: " << thisNui->GetName() << ", with glob: " << thisGlob->GetName() << ", from constraint: " << pdf->GetName() << endl; nui_list.add(*thisNui); glob_list.add(*thisGlob); if (string(pdf->ClassName()) == "RooPoisson") { double minVal = max(0.0, thisGlob->getVal() - 8*sqrt(thisGlob->getVal())); double maxVal = max(10.0, thisGlob->getVal() + 8*sqrt(thisGlob->getVal())); thisNui->setRange(minVal, maxVal); thisGlob->setRange(minVal, maxVal); } else if (string(pdf->ClassName()) == "RooGaussian") { thisNui->setRange(-7, 7); thisGlob->setRange(-10, 10); } // thisNui->Print(); // thisGlob->Print(); } delete cIter; }
void statTest(double mu_pe, double mu_hyp, ModelConfig *mc , RooDataSet *data ){ int nToyMC = 5; // set roofit seed RooRandom::randomGenerator()->SetSeed(); cout << endl; cout << endl; cout << "Will generate " << nToyMC << " pseudo-experiments for : " << endl; cout << " - mu[pseudo-data] = " << mu_pe << endl; cout << " - mu[stat-test] = " << mu_hyp << endl; cout << endl; // Check number of POI (for Wald approx) RooArgSet *ParamOfInterest = (RooArgSet*) mc->GetParametersOfInterest(); int nPOI = ParamOfInterest->getSize(); if(nPOI>1){ cout <<"not sure what to do with other parameters of interest, but here are their values"<<endl; mc->GetParametersOfInterest()->Print("v"); } RooRealVar* firstPOI = (RooRealVar*) ParamOfInterest->first(); RooAbsPdf *simPdf = (mc->GetPdf()); //PrintAllParametersAndValues( *mc->GetGlobalObservables() ); //PrintAllParametersAndValues( *mc->GetObservables() ); firstPOI->setVal(0.0); // FIXME //simPdf->fitTo( *data, Hesse(kTRUE), Minos(kTRUE), PrintLevel(1) ); simPdf->fitTo( *data ); // set up the sampler ToyMCSampler sampler; sampler.SetPdf(*mc->GetPdf()); sampler.SetObservables(*mc->GetObservables()); sampler.SetNToys(nToyMC); sampler.SetGlobalObservables(*mc->GetGlobalObservables()); sampler.SetParametersForTestStat(*mc->GetParametersOfInterest()); RooArgSet* poiset = dynamic_cast<RooArgSet*>(ParamOfInterest->Clone()); // only unconditional fit MinNLLTestStat *minNll = new MinNLLTestStat(*mc->GetPdf()); minNll->EnableDetailedOutput(true); sampler.AddTestStatistic(minNll); // enable PROOF if desired //ProofConfig pc(*w, 8, "workers=8", kFALSE); //sampler.SetProofConfig(&pc); // evaluate the test statistics - this is where most of our time will be spent cout << "Generating " << nToyMC << " toys...this will take a few minutes" << endl; TStopwatch *mn_t = new TStopwatch; mn_t->Start(); RooDataSet* sd = sampler.GetSamplingDistributions(*poiset); cout << "Toy generation complete :" << endl; // stop timing mn_t->Stop(); cout << " total CPU time: " << mn_t->CpuTime() << endl; cout << " total real time: " << mn_t->RealTime() << endl; // now sd contains all information about our test statistics, including detailed output // we might eg. want to explore the results either directly, or first converting to a TTree // do the conversion TFile f("mytoys.root", "RECREATE"); TTree *toyTree = RooStats::GetAsTTree("toyTree", "TTree created from test statistics", *sd); // save result to file, but in general do whatever you like f.cd(); toyTree->Write(); f.Close(); /* TFile* tmpFile = new TFile("mytoys.root","READ"); TTree* myTree = (TTree*)tmpFile->Get("toyTree"); // get boundaries for histograms TIter nextLeaf( (myTree->GetListOfLeaves())->MakeIterator() ); TObject* leafObj(0); map<TString, float> xMaxs; map<TString, float> xMins; for(int i(0); i<myTree->GetEntries(); i++) { myTree->GetEntry(i); nextLeaf = ( (myTree->GetListOfLeaves())->MakeIterator() ); while( (leafObj = nextLeaf.Next()) ) { TString name(leafObj->GetName()); float value(myTree->GetLeaf( leafObj->GetName() )->GetValue()); if(value > xMaxs[name]) { xMaxs[name] = value; } if(value < xMins[name]) { xMins[name] = value; } } // loop over leaves } // loop over tree entries // plot everything in the tree myTree->GetEntry(0); nextLeaf = ( (myTree->GetListOfLeaves())->MakeIterator() ); leafObj = 0; // make a histogram per leaf map<TString, TH1F*> hists; myTree->GetEntry(0); while( (leafObj = nextLeaf.Next()) ) { if(!leafObj) { continue; } //cout << leafObj->GetName() << endl; TString name(leafObj->GetName()); // special ones : fit related things if(name.Contains("covQual")) { hists[name] = new TH1F(name,name,5,0,5); continue; } if(name.Contains("fitStatus")) { hists[name] = new TH1F(name,name,5,0,5); continue; } int nbin(500); float histMin( xMins[name] - 0.1*fabs(xMins[name]) ); float histMax( xMaxs[name] + 0.1*fabs(xMaxs[name]) ); if(name.Contains("ATLAS_norm")) { // floating normalization factors histMin = 0; histMax = 10; } else if(name.Contains("gamma_stat")) { // statistical nus param if(name.Contains("globObs")) { // get custom range for sampling histMin = int( xMins[name] - 0.1*fabs(xMins[name]) ); histMax = int( xMaxs[name] + 0.1*fabs(xMaxs[name]) ); } // use small range for pull and error else { nbin = 100; histMin = 0.0; histMax = 2.0; } } else if(name.Contains("_err")) { // errors on nus param nbin = 100; histMin = 0.0; histMax = 2.0; } else if(name.Contains("fitCond") || name.Contains("fitUncond") || name.Contains("globObs")) { // fit pulls nbin = 500; histMin = -5; histMax = 5; } hists[name] = new TH1F(name,name,nbin,histMin,histMax); } // loop over leaves to declare histos // loop over entries and fill histograms for(int i(0); i<myTree->GetEntries(); i++) { myTree->GetEntry(i); nextLeaf = ( (myTree->GetListOfLeaves())->MakeIterator() ); while( (leafObj = nextLeaf.Next()) ) { TString name(leafObj->GetName()); if(hists.find(name) == hists.end()) { continue; } hists[name]->Fill( myTree->GetLeaf( leafObj->GetName() )->GetValue() ); } // loop over leaves } // loop over tree entries // overflow and underflow for(map<TString,TH1F*>::iterator ihist(hists.begin()); ihist!=hists.end(); ihist++) { if(ihist->second->GetBinContent(0)>0) { ihist->second->SetBinContent(1, ihist->second->GetBinContent(0) + ihist->second->GetBinContent(1) ); // fix err } int nBinx = ihist->second->GetNbinsX(); if(ihist->second->GetBinContent(nBinx)>0) { ihist->second->SetBinContent(nBinx-1, ihist->second->GetBinContent(nBinx) + ihist->second->GetBinContent(nBinx-1) ); // fix err } } // save the results TString dirName(OutputDir+"/PlotsStatisticalTest/GlobalFit"); if(drawPlots) { system(TString("mkdir -vp "+dirName)); } TCanvas* canvas = new TCanvas("pulls"); TLegend *leg = new TLegend(0.67, 0.64, 0.87, 0.86); LegendStyle(leg); for(map<TString,TH1F*>::iterator ihist(hists.begin()); ihist!=hists.end(); ihist++) { if( (ihist->first).Contains("fitCond_") ) { continue; } // skip unconditional fit - get it explicitly canvas->Clear(); leg->Clear(); TString niceName(ihist->first); niceName.ReplaceAll("fitUncond_",""); //niceName.ReplaceAll("SD_TS0_",""); // not good if have multiple test statistics // conditional fit information ihist->second->SetLineColor(kGray+2); ihist->second->SetTitle(niceName); ihist->second->SetLineStyle(kSolid); ihist->second->SetLineWidth(2); if((ihist->first).Contains("fit") && !(ihist->first).Contains("_err") && !(ihist->first).Contains("Qual") && !(ihist->first).Contains("Status")) { ihist->second->Rebin(4); } // ihist->second->GetXaxis()->SetTitle(""); // ihist->second->GetYaxis()->SetTitle(""); if(niceName.Contains("globObs")) { leg->AddEntry( ihist->second, "Sampling", "l" ); // add value of mu } else { leg->AddEntry( ihist->second, "Unconditional Fit", "l" ); // add value of mu } TString condName(ihist->first); condName.ReplaceAll("fitUncond","fitCond"); // uncomditional fit information if(hists.find(condName) != hists.end() && condName != ihist->first) { hists[condName]->SetLineColor(kGray+2); hists[condName]->SetLineStyle(kDashed); hists[condName]->SetLineWidth(2); if(!(ihist->first).Contains("_err")) { hists[condName]->Rebin(4); } leg->AddEntry( hists[condName], "Conditional Fit", "l" ); if( hists[condName]->GetMaximum() > ihist->second->GetMaximum() ) { ihist->second->SetMaximum( hists[condName]->GetMaximum() ); } } ihist->second->SetMaximum( 1.2 * ihist->second->GetMaximum() ); canvas->cd(); ihist->second->Draw(); leg->Draw(); if(hists[condName] && condName != ihist->first) { hists[condName]->Draw("same"); } if(drawPlots) { canvas->Print(dirName+"/"+niceName+".eps"); canvas->Print(dirName+"/"+niceName+".png"); } MainDirStatTest->cd(); canvas->Write(); gROOT->cd(); } */ return; }
void Plot_BG(TString wsname) { //get the stuff from the workspace: TFile* file=TFile::Open(wsname); RooWorkspace* ws = (RooWorkspace*)file->Get("combined"); mc = (ModelConfig*)ws->obj("ModelConfig"); data = ws->data("obsData"); RooSimultaneous* simPdf=(RooSimultaneous*)(mc->GetPdf()); RooAbsReal* nll=simPdf->createNLL(*data); //run on channels RooCategory* chanCat = (RooCategory*) (&simPdf->indexCat()); TIterator* iterat = chanCat->typeIterator() ; RooCatType* ttype; bool stop = kFALSE; while ((ttype = (RooCatType*) iterat->Next())&&!stop) { // bool toggle to run on one channel or all stop = kTRUE; RooAbsPdf *pdf_state = simPdf->getPdf(ttype->GetName()) ; RooArgSet *obstmp = pdf_state->getObservables( *mc->GetObservables() ) ; RooAbsData *datatmp = data->reduce(Form("%s==%s::%s",chanCat->GetName(),chanCat->GetName(),ttype->GetName())); RooRealVar *obs = ((RooRealVar*) obstmp->first()); TString chanName(ttype->GetName()); // get data TH1* hdata = datatmp->createHistogram("Data "+chanName,*obs); // set errors to gaussian for (int ib=0 ; ib<hdata->GetNbinsX()+1 ; ib++) hdata->SetBinError(ib, sqrt(hdata->GetBinContent(ib))); // get initial BG TH1* h_initial_BG = pdf_state->createHistogram("initial_BG_"+chanName,*obs); // get initial gammas int nbins = h_initial_BG->GetNbinsX(); double InitGamma[nbins]; for (int i=0; i<nbins; i++) { TString varname = "gamma_B0_0j_l1pt0_bin_"+NumberToString(i); InitGamma[i] = ws->var(varname)->getVal(); cout << "initial gamma"+NumberToString(i)+" = " << InitGamma[i] << endl; } double InitFpt = ws->var("fl1pt_l1pt0")->getVal(); cout << "initial fpt_l1pt0 = " << InitFpt << endl; TCanvas* c1 = new TCanvas("BG and Data "+chanName,"BG and Data "+chanName,600,600); h_initial_BG->Draw(); //hdata->DrawNormalized("sames E1"); // DO THE GLOBAL FIT RooMinimizer minim(*nll); //set some options: minim.setPrintLevel(0); minim.optimizeConst(1); minim.setOffsetting(true); minim.setMinimizerType("Minuit2"); minim.minimize("Minuit2"); minim.setStrategy(3); //0-3 where 0 is the fastest minim.migrad(); // get gammas after fit double FinalGamma[nbins]; TH1* h_initBG_times_gamma = (TH1*)h_initial_BG->Clone("initBG_times_gamma"); for (int i=0; i<nbins; i++) { TString varname = "gamma_B0_0j_l1pt0_bin_"+NumberToString(i); FinalGamma[i] = ws->var(varname)->getVal(); cout << "Final gamma in bin "+NumberToString(i)+" = " << FinalGamma[i] << endl; h_initBG_times_gamma->SetBinContent(i+1,h_initial_BG->GetBinContent(i+1)*FinalGamma[i]); } double FinalFpt = ws->var("fl1pt_l1pt0")->getVal(); cout << "initial fpt_l1pt0 = " << InitFpt << endl; cout << "final fpt_l1pt0 = " << FinalFpt << endl; TH1* h_final_BG = pdf_state->createHistogram("final_BG_"+chanName,*obs); //TCanvas* cf = new TCanvas("final BG","final BG",600,600); h_final_BG->Draw("sames"); h_initBG_times_gamma->Draw("sames"); TH1* h_ratio = (TH1*)h_initial_BG->Clone("h_ratio"); h_ratio->Divide(h_final_BG); //h_ratio->Draw(); cout << "channel name = " << chanName << endl; for ( int j=1; j<=nbins; j++) { double init = h_initial_BG->GetBinContent(j); double fina = h_final_BG->GetBinContent(j); double r = (fina)/init; cout << "in bin " << j << ", initial B = " << init << ", final B = " << fina << ", ratio = " << r << ", Gamma = " << FinalGamma[j-1] << endl; } } }
void PlotAll(TString wsname) { char* binLabels[19] = {"60","70","80","90","100","110","120","130","140","150","160","170","180","190","200","250","300","400","1000"}; //get the stuff from the workspace: TFile* file=TFile::Open(wsname); RooWorkspace* ws = (RooWorkspace*)file->Get("combined"); ModelConfig *mc = (ModelConfig*)ws->obj("ModelConfig"); RooAbsData *data = ws->data("obsData"); RooSimultaneous* simPdf=(RooSimultaneous*)(mc->GetPdf()); RooAbsReal* nll=simPdf->createNLL(*data); // FPT 0 ************************************** // EM channel RooCategory* chanCat = (RooCategory*) (&simPdf->indexCat()); TIterator* iterat = chanCat->typeIterator() ; RooCatType* ttype = (RooCatType*)iterat->Next(); RooAbsPdf *pdf_stateEM = simPdf->getPdf(ttype->GetName()) ; RooArgSet *obstmpEM = pdf_stateEM->getObservables( *mc->GetObservables() ) ; // get EM data RooAbsData *dataEM = data->reduce(Form("%s==%s::%s",chanCat->GetName(),chanCat->GetName(),ttype->GetName())); RooRealVar *obsEM = ((RooRealVar*) obstmpEM->first()); TString chanName1(ttype->GetName()); // create data histogram TH1* hdataEM = dataEM->createHistogram("Data "+chanName1,*obsEM); // set errors to gaussian for (int ib=0 ; ib<hdataEM->GetNbinsX()+1 ; ib++) hdataEM->SetBinError(ib, sqrt(hdataEM->GetBinContent(ib))); double EMnorm = pdf_stateEM->expectedEvents(*obsEM); //**************************** // ME channel ttype = (RooCatType*)iterat->Next(); RooAbsPdf* pdf_stateME = simPdf->getPdf(ttype->GetName()) ; RooArgSet* obstmpME = pdf_stateME->getObservables( *mc->GetObservables() ) ; // get ME data RooAbsData *dataME = data->reduce(Form("%s==%s::%s",chanCat->GetName(),chanCat->GetName(),ttype->GetName())); RooRealVar* obsME = ((RooRealVar*) obstmpME->first()); TString chanName2(ttype->GetName()); // create data histogram TH1* hdataME = dataME->createHistogram("Data "+chanName2,*obsME); // set errors to gaussian for (int ib=0 ; ib<hdataME->GetNbinsX()+1 ; ib++) hdataME->SetBinError(ib, sqrt(hdataME->GetBinContent(ib))); // get initial BG histogram //TH1* h_initial_BG_EM = pdf_stateEM->createHistogram("initial_BG_EM",*obsEM); //TH1* h_initial_BG_ME = pdf_stateME->createHistogram("initial_BG_ME",*obsME); double MEnorm = pdf_stateME->expectedEvents(*obsME); cout << "EM expected events = " << EMnorm << ", ME expected events = " << MEnorm << "." << endl; //h_initial_BG_EM->Scale(EMnorm); //h_initial_BG_ME->Scale(MEnorm); // get initial gammas int nbins = hdataEM->GetNbinsX(); double InitGamma[nbins]; for (int i=0; i<nbins; i++) { TString varname = "gamma_B0_l1pt0_bin_"+NumberToString(i); InitGamma[i] = ws->var(varname)->getVal(); cout << "initial gamma"+NumberToString(i)+" = " << InitGamma[i] << endl; } double InitFpt = ws->var("fl1pt_l1pt0")->getVal(); cout << "initial fpt_l1pt0 = " << InitFpt << endl; // DO THE GLOBAL FIT minimize(nll); // get final BG histograms TH1* h_final_BG_EM = pdf_stateEM->createHistogram("final_BG_EM",*obsEM); TH1* h_final_BG_ME = pdf_stateME->createHistogram("final_BG_ME",*obsME); h_final_BG_EM->Scale(EMnorm); h_final_BG_ME->Scale(MEnorm); // uncertainty bands TH1D* BuncertaintyEM = new TH1D("BuncertaintyEM","BuncertaintyEM",nbins,0,nbins); TH1D* BuncertaintyME = new TH1D("BuncertaintyME","BuncertaintyME",nbins,0,nbins); for (int i=1; i<=nbins; i++){ double sigbEM = h_final_BG_EM->GetBinError(i); double bEM = h_final_BG_EM->GetBinContent(i); BuncertaintyEM->SetBinError(i,sigbEM); BuncertaintyEM->SetBinContent(i,bEM); double sigbME = h_final_BG_ME->GetBinError(i); double bME = h_final_BG_ME->GetBinContent(i); BuncertaintyME->SetBinError(i,sigbME); BuncertaintyME->SetBinContent(i,bME); } //BuncertaintyEM->SetFillStyle(3004); BuncertaintyEM->SetFillColor(kGreen-9); BuncertaintyEM->SetLineColor(kBlack); BuncertaintyEM->SetLineStyle(2); //BuncertaintyME->SetFillStyle(3004); BuncertaintyME->SetFillColor(kBlue-9); BuncertaintyME->SetLineColor(kBlack); BuncertaintyME->SetLineStyle(2); // get gammas after fit double FinalGamma[nbins]; //TH1* h_initBG_times_gamma = (TH1*)h_initial_BG_EM->Clone("initBGEM_times_gamma"); for (int i=0; i<nbins; i++) { TString varname = "gamma_B0_l1pt0_bin_"+NumberToString(i); FinalGamma[i] = ws->var(varname)->getVal(); cout << "Final gamma in bin "+NumberToString(i)+" = " << FinalGamma[i] << endl; // h_initBG_times_gamma->SetBinContent(i+1,h_initial_BG_EM->GetBinContent(i+1)*FinalGamma[i]); } //double FinalFpt = ws->var("fl1pt_l1pt0")->getVal(); // get final alpha (pull) RooRealVar* alphaVar = ws->var("alpha_l1ptsys_l1pt0"); double alpha, alphaErr; if (alphaVar != NULL) { alpha = ws->var("alpha_l1ptsys_l1pt0")->getVal(); alphaErr = ws->var("alpha_l1ptsys_l1pt0")->getError(); } //FOR UNCONSTRAINED FPT - get final fpts double FinalFpt[5]; double FinalFptErr[5]; for (int k=0; k<5; k++){ TString varname = "fl1pt_l1pt"+NumberToString(k); FinalFpt[k] = ws->var(varname)->getVal(); FinalFptErr[k] = ws->var(varname)->getError(); cout << varname << " = " << FinalFpt[k] << " +- " << FinalFptErr[k] << endl; } // get POI value double mu = ws->var("mu_BR_htm")->getVal(); double muErr = ws->var("mu_BR_htm")->getError(); // Draw TCanvas* c1 = new TCanvas("BG and Data "+chanName1+" "+chanName2,"BG and Data "+chanName1+" "+chanName2,600,600); BuncertaintyEM->Draw("E3 sames"); BuncertaintyME->Draw("E3 sames"); //h_initial_BG_EM->SetLineColor(kGreen+2); h_initial_BG_EM->SetLineStyle(2); h_initial_BG_EM->Draw("sames"); hdataEM->SetLineColor(kGreen+2); hdataEM->SetMarkerStyle(20); hdataEM->SetMarkerColor(kGreen+2); hdataEM->Draw("e1 sames"); //h_initial_BG_ME->SetLineColor(kBlue); h_initial_BG_ME->SetLineStyle(2); h_initial_BG_ME->Draw("sames"); hdataME->SetLineColor(kBlue); hdataME->SetMarkerStyle(20); hdataME->SetMarkerColor(kBlue); hdataME->Draw("e1 sames"); h_final_BG_EM->SetLineColor(kGreen+2); h_final_BG_EM->SetLineWidth(2); h_final_BG_EM->Draw("sames"); h_final_BG_ME->SetLineColor(kBlue); h_final_BG_ME->SetLineWidth(2); h_final_BG_ME->Draw("sames"); TLegend* leg = new TLegend(0.5,0.45,0.85,0.65); leg->SetFillColor(kWhite); leg->SetBorderSize(1); leg->SetLineColor(0); //leg->SetTextFont(14); leg->SetTextSize(.03); leg->AddEntry(hdataME,"DATA #mue","lep"); leg->AddEntry(hdataEM,"DATA e#mu","lep"); //leg->AddEntry(h_initial_BG_ME,"Initial #mue PDF","l"); //leg->AddEntry(h_initial_BG_EM,"Initial e#mu PDF","l"); leg->AddEntry(h_final_BG_ME,"#mue PDF = #gamma_{i}B_{i} + #muS_{i}","l"); leg->AddEntry(h_final_BG_EM,"e#mu PDF = f(1+#alpha#sigma)(#gamma_{i}B_{i}+#muW_{i})","l"); leg->Draw(); cout << " ********************* Fit Values **************************** " << endl; if (alphaVar != NULL){cout << "alpha = " << alpha << " +- " << alphaErr << endl;} cout << "mu = " << mu << " +- " << muErr << endl; TString WriteDownAlphaValue; TString WriteDownMuValue; WriteDownAlphaValue = "Fpt0 = "; WriteDownMuValue = "#mu = "; WriteDownAlphaValue += Form("%4.4f",FinalFpt[0]); WriteDownAlphaValue += "#pm"; WriteDownAlphaValue += Form("%4.4f",FinalFptErr[0]); WriteDownMuValue += Form("%4.4f",mu); WriteDownMuValue += "#pm"; WriteDownMuValue += Form("%4.4f",muErr); TLatex *texl = new TLatex(12,25,WriteDownAlphaValue); texl->SetTextAlign(22); texl->SetTextSize(0.03); TLatex *texl2 = new TLatex(12,23,WriteDownMuValue); texl2->SetTextAlign(22); texl2->SetTextSize(0.03); texl->Draw(); texl2->Draw(); //FPT 1 *********************************** ttype = (RooCatType*)iterat->Next(); RooAbsPdf *pdf_stateEM1 = simPdf->getPdf(ttype->GetName()) ; RooArgSet *obstmpEM1 = pdf_stateEM1->getObservables( *mc->GetObservables() ) ; RooAbsData *dataEM1 = data->reduce(Form("%s==%s::%s",chanCat->GetName(),chanCat->GetName(),ttype->GetName())); RooRealVar *obsEM1 = ((RooRealVar*) obstmpEM1->first()); TString chanName11(ttype->GetName()); TH1* hdataEM1 = dataEM1->createHistogram("Data "+chanName11,*obsEM1); for (int ib=0 ; ib<hdataEM1->GetNbinsX()+1 ; ib++) hdataEM1->SetBinError(ib, sqrt(hdataEM1->GetBinContent(ib))); double EMnorm1 = pdf_stateEM1->expectedEvents(*obsEM1); ttype = (RooCatType*)iterat->Next(); RooAbsPdf* pdf_stateME1 = simPdf->getPdf(ttype->GetName()) ; RooArgSet* obstmpME1 = pdf_stateME1->getObservables( *mc->GetObservables() ) ; RooAbsData *dataME1 = data->reduce(Form("%s==%s::%s",chanCat->GetName(),chanCat->GetName(),ttype->GetName())); RooRealVar* obsME1 = ((RooRealVar*) obstmpME1->first()); TString chanName21(ttype->GetName()); TH1* hdataME1 = dataME1->createHistogram("Data "+chanName21,*obsME1); for (int ib=0 ; ib<hdataME1->GetNbinsX()+1 ; ib++) hdataME1->SetBinError(ib, sqrt(hdataME1->GetBinContent(ib))); double MEnorm1 = pdf_stateME1->expectedEvents(*obsME1); TH1* h_final_BG_EM1 = pdf_stateEM1->createHistogram("final_BG_EM1",*obsEM1); TH1* h_final_BG_ME1 = pdf_stateME1->createHistogram("final_BG_ME1",*obsME1); h_final_BG_EM1->Scale(EMnorm1); h_final_BG_ME1->Scale(MEnorm1); TH1D* BuncertaintyEM1 = new TH1D("BuncertaintyEM1","BuncertaintyEM1",nbins,0,nbins); TH1D* BuncertaintyME1 = new TH1D("BuncertaintyME1","BuncertaintyME1",nbins,0,nbins); for (int i=1; i<=nbins; i++){ double sigbEM = h_final_BG_EM1->GetBinError(i); double bEM = h_final_BG_EM1->GetBinContent(i); BuncertaintyEM1->SetBinError(i,sigbEM); BuncertaintyEM1->SetBinContent(i,bEM); double sigbME = h_final_BG_ME1->GetBinError(i); double bME = h_final_BG_ME1->GetBinContent(i); BuncertaintyME1->SetBinError(i,sigbME); BuncertaintyME1->SetBinContent(i,bME); } BuncertaintyEM1->SetFillColor(kGreen-9); BuncertaintyEM1->SetLineColor(kBlack); BuncertaintyEM1->SetLineStyle(2); BuncertaintyME1->SetFillColor(kBlue-9); BuncertaintyME1->SetLineColor(kBlack); BuncertaintyME1->SetLineStyle(2); double FinalGamma1[nbins]; for (int i=0; i<nbins; i++) { TString varname = "gamma_B0_l1pt1_bin_"+NumberToString(i); FinalGamma1[i] = ws->var(varname)->getVal(); cout << "Final gamma in bin "+NumberToString(i)+" = " << FinalGamma1[i] << endl; } TCanvas* c2 = new TCanvas("BG and Data "+chanName11+" "+chanName21,"BG and Data "+chanName11+" "+chanName21,600,600); BuncertaintyEM1->Draw("E3 sames"); BuncertaintyME1->Draw("E3 sames"); hdataEM1->SetLineColor(kGreen+2); hdataEM1->SetMarkerStyle(20); hdataEM1->SetMarkerColor(kGreen+2); hdataEM1->Draw("e1 sames"); hdataME1->SetLineColor(kBlue); hdataME1->SetMarkerStyle(20); hdataME1->SetMarkerColor(kBlue); hdataME1->Draw("e1 sames"); h_final_BG_EM1->SetLineColor(kGreen+2); h_final_BG_EM1->SetLineWidth(2); h_final_BG_EM1->Draw("sames"); h_final_BG_ME1->SetLineColor(kBlue); h_final_BG_ME1->SetLineWidth(2); h_final_BG_ME1->Draw("sames"); leg->Draw(); cout << " ********************* Fit Values **************************** " << endl; cout << "mu = " << mu << " +- " << muErr << endl; TString WriteDownAlphaValue1; WriteDownAlphaValue1 = "Fpt1 = "; WriteDownAlphaValue1 += Form("%4.4f",FinalFpt[1]); WriteDownAlphaValue1 += "#pm"; WriteDownAlphaValue1 += Form("%4.4f",FinalFptErr[1]); TLatex *texl11 = new TLatex(12,25,WriteDownAlphaValue1); texl11->SetTextAlign(22); texl11->SetTextSize(0.03); texl11->Draw(); texl2->Draw(); }
void StandardHistFactoryPlotsWithCategories(const char* infile = "", const char* workspaceName = "combined", const char* modelConfigName = "ModelConfig", const char* dataName = "obsData"){ double nSigmaToVary=5.; double muVal=0; bool doFit=false; // ------------------------------------------------------- // First part is just to access a user-defined file // or create the standard example file if it doesn't exist const char* filename = ""; if (!strcmp(infile,"")) { filename = "results/example_combined_GaussExample_model.root"; bool fileExist = !gSystem->AccessPathName(filename); // note opposite return code // if file does not exists generate with histfactory if (!fileExist) { #ifdef _WIN32 cout << "HistFactory file cannot be generated on Windows - exit" << endl; return; #endif // Normally this would be run on the command line cout <<"will run standard hist2workspace example"<<endl; gROOT->ProcessLine(".! prepareHistFactory ."); gROOT->ProcessLine(".! hist2workspace config/example.xml"); cout <<"\n\n---------------------"<<endl; cout <<"Done creating example input"<<endl; cout <<"---------------------\n\n"<<endl; } } else filename = infile; // Try to open the file TFile *file = TFile::Open(filename); // if input file was specified byt not found, quit if(!file ){ cout <<"StandardRooStatsDemoMacro: Input file " << filename << " is not found" << endl; return; } // ------------------------------------------------------- // Tutorial starts here // ------------------------------------------------------- // get the workspace out of the file RooWorkspace* w = (RooWorkspace*) file->Get(workspaceName); if(!w){ cout <<"workspace not found" << endl; return; } // get the modelConfig out of the file ModelConfig* mc = (ModelConfig*) w->obj(modelConfigName); // get the modelConfig out of the file RooAbsData* data = w->data(dataName); // make sure ingredients are found if(!data || !mc){ w->Print(); cout << "data or ModelConfig was not found" <<endl; return; } // ------------------------------------------------------- // now use the profile inspector RooRealVar* obs = (RooRealVar*)mc->GetObservables()->first(); TList* list = new TList(); RooRealVar * firstPOI = dynamic_cast<RooRealVar*>(mc->GetParametersOfInterest()->first()); firstPOI->setVal(muVal); // firstPOI->setConstant(); if(doFit){ mc->GetPdf()->fitTo(*data); } // ------------------------------------------------------- mc->GetNuisanceParameters()->Print("v"); int nPlotsMax = 1000; cout <<" check expectedData by category"<<endl; RooDataSet* simData=NULL; RooSimultaneous* simPdf = NULL; if(strcmp(mc->GetPdf()->ClassName(),"RooSimultaneous")==0){ cout <<"Is a simultaneous PDF"<<endl; simPdf = (RooSimultaneous *)(mc->GetPdf()); } else { cout <<"Is not a simultaneous PDF"<<endl; } if(doFit) { RooCategory* channelCat = (RooCategory*) (&simPdf->indexCat()); TIterator* iter = channelCat->typeIterator() ; RooCatType* tt = NULL; tt=(RooCatType*) iter->Next(); RooAbsPdf* pdftmp = ((RooSimultaneous*)mc->GetPdf())->getPdf(tt->GetName()) ; RooArgSet* obstmp = pdftmp->getObservables(*mc->GetObservables()) ; obs = ((RooRealVar*)obstmp->first()); RooPlot* frame = obs->frame(); cout <<Form("%s==%s::%s",channelCat->GetName(),channelCat->GetName(),tt->GetName())<<endl; cout << tt->GetName() << " " << channelCat->getLabel() <<endl; data->plotOn(frame,MarkerSize(1),Cut(Form("%s==%s::%s",channelCat->GetName(),channelCat->GetName(),tt->GetName())),DataError(RooAbsData::None)); Double_t normCount = data->sumEntries(Form("%s==%s::%s",channelCat->GetName(),channelCat->GetName(),tt->GetName())) ; pdftmp->plotOn(frame,LineWidth(2.),Normalization(normCount,RooAbsReal::NumEvent)) ; frame->Draw(); cout <<"expected events = " << mc->GetPdf()->expectedEvents(*data->get()) <<endl; return; } int nPlots=0; if(!simPdf){ TIterator* it = mc->GetNuisanceParameters()->createIterator(); RooRealVar* var = NULL; while( (var = (RooRealVar*) it->Next()) != NULL){ RooPlot* frame = obs->frame(); frame->SetYTitle(var->GetName()); data->plotOn(frame,MarkerSize(1)); var->setVal(0); mc->GetPdf()->plotOn(frame,LineWidth(1.)); var->setVal(1); mc->GetPdf()->plotOn(frame,LineColor(kRed),LineStyle(kDashed),LineWidth(1)); var->setVal(-1); mc->GetPdf()->plotOn(frame,LineColor(kGreen),LineStyle(kDashed),LineWidth(1)); list->Add(frame); var->setVal(0); } } else { RooCategory* channelCat = (RooCategory*) (&simPdf->indexCat()); // TIterator* iter = simPdf->indexCat().typeIterator() ; TIterator* iter = channelCat->typeIterator() ; RooCatType* tt = NULL; while(nPlots<nPlotsMax && (tt=(RooCatType*) iter->Next())) { cout << "on type " << tt->GetName() << " " << endl; // Get pdf associated with state from simpdf RooAbsPdf* pdftmp = simPdf->getPdf(tt->GetName()) ; // Generate observables defined by the pdf associated with this state RooArgSet* obstmp = pdftmp->getObservables(*mc->GetObservables()) ; // obstmp->Print(); obs = ((RooRealVar*)obstmp->first()); TIterator* it = mc->GetNuisanceParameters()->createIterator(); RooRealVar* var = NULL; while(nPlots<nPlotsMax && (var = (RooRealVar*) it->Next())){ TCanvas* c2 = new TCanvas("c2"); RooPlot* frame = obs->frame(); frame->SetName(Form("frame%d",nPlots)); frame->SetYTitle(var->GetName()); cout <<Form("%s==%s::%s",channelCat->GetName(),channelCat->GetName(),tt->GetName())<<endl; cout << tt->GetName() << " " << channelCat->getLabel() <<endl; data->plotOn(frame,MarkerSize(1),Cut(Form("%s==%s::%s",channelCat->GetName(),channelCat->GetName(),tt->GetName())),DataError(RooAbsData::None)); Double_t normCount = data->sumEntries(Form("%s==%s::%s",channelCat->GetName(),channelCat->GetName(),tt->GetName())) ; if(strcmp(var->GetName(),"Lumi")==0){ cout <<"working on lumi"<<endl; var->setVal(w->var("nominalLumi")->getVal()); var->Print(); } else{ var->setVal(0); } // w->allVars().Print("v"); // mc->GetNuisanceParameters()->Print("v"); // pdftmp->plotOn(frame,LineWidth(2.)); // mc->GetPdf()->plotOn(frame,LineWidth(2.),Slice(*channelCat,tt->GetName()),ProjWData(*data)); //pdftmp->plotOn(frame,LineWidth(2.),Slice(*channelCat,tt->GetName()),ProjWData(*data)); normCount = pdftmp->expectedEvents(*obs); pdftmp->plotOn(frame,LineWidth(2.),Normalization(normCount,RooAbsReal::NumEvent)) ; if(strcmp(var->GetName(),"Lumi")==0){ cout <<"working on lumi"<<endl; var->setVal(w->var("nominalLumi")->getVal()+0.05); var->Print(); } else{ var->setVal(nSigmaToVary); } // pdftmp->plotOn(frame,LineColor(kRed),LineStyle(kDashed),LineWidth(2)); // mc->GetPdf()->plotOn(frame,LineColor(kRed),LineStyle(kDashed),LineWidth(2.),Slice(*channelCat,tt->GetName()),ProjWData(*data)); //pdftmp->plotOn(frame,LineColor(kRed),LineStyle(kDashed),LineWidth(2.),Slice(*channelCat,tt->GetName()),ProjWData(*data)); normCount = pdftmp->expectedEvents(*obs); pdftmp->plotOn(frame,LineWidth(2.),LineColor(kRed),LineStyle(kDashed),Normalization(normCount,RooAbsReal::NumEvent)) ; if(strcmp(var->GetName(),"Lumi")==0){ cout <<"working on lumi"<<endl; var->setVal(w->var("nominalLumi")->getVal()-0.05); var->Print(); } else{ var->setVal(-nSigmaToVary); } // pdftmp->plotOn(frame,LineColor(kGreen),LineStyle(kDashed),LineWidth(2)); // mc->GetPdf()->plotOn(frame,LineColor(kGreen),LineStyle(kDashed),LineWidth(2),Slice(*channelCat,tt->GetName()),ProjWData(*data)); //pdftmp->plotOn(frame,LineColor(kGreen),LineStyle(kDashed),LineWidth(2),Slice(*channelCat,tt->GetName()),ProjWData(*data)); normCount = pdftmp->expectedEvents(*obs); pdftmp->plotOn(frame,LineWidth(2.),LineColor(kGreen),LineStyle(kDashed),Normalization(normCount,RooAbsReal::NumEvent)) ; // set them back to normal if(strcmp(var->GetName(),"Lumi")==0){ cout <<"working on lumi"<<endl; var->setVal(w->var("nominalLumi")->getVal()); var->Print(); } else{ var->setVal(0); } list->Add(frame); // quit making plots ++nPlots; frame->Draw(); c2->SaveAs(Form("%s_%s_%s.pdf",tt->GetName(),obs->GetName(),var->GetName())); delete c2; } } } // ------------------------------------------------------- // now make plots TCanvas* c1 = new TCanvas("c1","ProfileInspectorDemo",800,200); if(list->GetSize()>4){ double n = list->GetSize(); int nx = (int)sqrt(n) ; int ny = TMath::CeilNint(n/nx); nx = TMath::CeilNint( sqrt(n) ); c1->Divide(ny,nx); } else c1->Divide(list->GetSize()); for(int i=0; i<list->GetSize(); ++i){ c1->cd(i+1); list->At(i)->Draw(); } }
void ptBestFit(float BIN_SIZE=5.0,bool BLIND=false,TString MASS,TString NAME) { gROOT->ProcessLine(".x ../../common/styleCMSTDR.C"); gSystem->Load("libHiggsAnalysisCombinedLimit.so"); gROOT->ForceStyle(); gStyle->SetOptStat(0); gStyle->SetOptTitle(0); gROOT->SetBatch(1); gStyle->SetPadRightMargin(0.04); gStyle->SetPadLeftMargin(0.16); gStyle->SetPadTopMargin(0.06); gStyle->SetPadBottomMargin(0.10); gStyle->SetTitleFont(42,"XY"); gStyle->SetTitleSize(0.0475,"XY"); gStyle->SetTitleOffset(0.9,"X"); gStyle->SetTitleOffset(1.5,"Y"); gStyle->SetLabelSize(0.0375,"XY"); RooMsgService::instance().setSilentMode(kTRUE); for(int i=0;i<2;i++) { RooMsgService::instance().setStreamStatus(i,kFALSE); } float XMIN = 80; float XMAX = 200; TFile *f1 = TFile::Open("datacards/datacard_m"+MASS+"_"+NAME+".root"); TFile *f2 = TFile::Open("combine/mlfit.vbfHbb_"+NAME+"_mH"+MASS+".root"); TFile *f3 = TFile::Open("root/sig_shapes_workspace_B80-200.root"); TFile *f4 = TFile::Open("root/data_shapes_workspace_"+NAME+".root"); RooWorkspace *w = (RooWorkspace*)f1->Get("w"); //w->Print(); RooAbsPdf *bkg_model = (RooAbsPdf*)w->pdf("model_s"); RooFitResult *res_s = (RooFitResult*)f2->Get("fit_s"); RooFitResult *res_b = (RooFitResult*)f2->Get("fit_b"); RooRealVar *rFit = dynamic_cast<RooRealVar *>(res_s->floatParsFinal()).find("r"); RooDataSet *data = (RooDataSet*)w->data("data_obs"); int nparS=0,nparB=0; cout << res_s->floatParsFinal().getSize() << endl; cout << res_b->floatParsFinal().getSize() << endl; nparS = res_s->floatParsFinal().getSize(); nparB = res_b->floatParsFinal().getSize(); float chi2sumS = 0.; float chi2sumB = 0.; int nparsum = 0; // if (BLIND) { // res_b->Print(); // } // else { // res_s->Print(); // } w->allVars().assignValueOnly(res_s->floatParsFinal()); // w->Print(); // w->allVars()->Print(); RooWorkspace *wSig = (RooWorkspace*)f3->Get("w"); RooWorkspace *wDat = (RooWorkspace*)f4->Get("w"); const RooSimultaneous *sim = dynamic_cast<const RooSimultaneous *> (bkg_model); const RooAbsCategoryLValue &cat = (RooAbsCategoryLValue &) sim->indexCat(); TList *datasets = data->split(cat,true); TIter next(datasets); //int count = 0; for(RooAbsData *ds = (RooAbsData*)next();ds != 0; ds = (RooAbsData*)next()) { //if (count > 0) return 0; //count++; RooAbsPdf *pdfi = sim->getPdf(ds->GetName()); RooArgSet *obs = (RooArgSet*)pdfi->getObservables(ds); RooRealVar *x = dynamic_cast<RooRealVar *>(obs->first()); RooRealVar *yield_vbf = (RooRealVar*)wSig->var("yield_signalVBF_mass"+MASS+"_"+TString(ds->GetName())); RooRealVar *yield_gf = (RooRealVar*)wSig->var("yield_signalGF_mass"+MASS+"_"+TString(ds->GetName())); TString ds_name(ds->GetName()); //----- get the QCD normalization ----------- RooRealVar *qcd_norm_final = dynamic_cast<RooRealVar *>(res_s->floatParsFinal()).find("CMS_vbfbb_qcd_norm_"+ds_name); RooRealVar *qcd_yield = (RooRealVar*)wDat->var("yield_data_"+ds_name); float Nqcd = exp(log(1.5)*qcd_norm_final->getVal())*qcd_yield->getVal(); float eNqcd = log(1.5)*qcd_norm_final->getError()*Nqcd; cout<<"QCD normalization = "<<Nqcd<<" +/- "<<eNqcd<<endl; TH1 *hCoarse = (TH1*)ds->createHistogram("coarseHisto_"+ds_name,*x); float norm = hCoarse->Integral(); int rebin = BIN_SIZE/hCoarse->GetBinWidth(1); hCoarse->Rebin(rebin); float MIN_VAL = TMath::Max(0.9*hCoarse->GetBinContent(hCoarse->GetMinimumBin()),1.0); float MAX_VAL = 1.3*hCoarse->GetBinContent(hCoarse->GetMaximumBin()); RooDataHist ds_coarse("ds_coarse_"+ds_name,"ds_coarse_"+ds_name,*x,hCoarse); TH1F *hBlind = (TH1F*)hCoarse->Clone("blindHisto_"+ds_name); for(int i=0;i<hBlind->GetNbinsX();i++) { double x0 = hBlind->GetBinCenter(i+1); if (x0 > 100 && x0 < 150) { hBlind->SetBinContent(i+1,0); hBlind->SetBinError(i+1,0); } } RooDataHist ds_blind("ds_blind_"+ds_name,"ds_blind_"+ds_name,*x,hBlind); RooHist *hresid,*hresid0; RooPlot *frame1 = x->frame(); RooPlot *frame2 = x->frame(); if (BLIND) { //cout << "Blind case: " << ds_coarse.GetName() << endl; ds_coarse.plotOn(frame1,LineColor(0),MarkerColor(0)); pdfi->plotOn(frame1,Components("shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name),VisualizeError(*res_s,1,kTRUE),FillColor(0),MoveToBack()); pdfi->plotOn(frame1,Components("shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name),LineWidth(2),LineStyle(3)); ds_blind.plotOn(frame1); hresid = frame1->residHist(); frame2->addPlotable(hresid,"pE1"); } else { //cout << "Non-blind case: " << ds_coarse.GetName() << endl; ds_coarse.plotOn(frame1); pdfi->plotOn(frame1); //cout << pdfi->getParameters(ds_coarse)->selectByAttrib("Constant",kFALSE)->getSize() << endl; cout<<"chi2/ndof (bkg+sig) = "<<frame1->chiSquare()<<endl; cout << ds_coarse.numEntries() << endl; chi2sumS += frame1->chiSquare()*ds_coarse.numEntries(); nparsum += ds_coarse.numEntries(); //hresid0 = frame1->residHist(); //pdfi->plotOn(frame1,VisualizeError(*res_s,1,kTRUE),FillColor(0),MoveToBack()); pdfi->plotOn(frame1,Components("shapeBkg_qcd_"+ds_name),LineWidth(2),LineStyle(5),LineColor(kGreen+2)); pdfi->plotOn(frame1,Components("shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name),LineWidth(2),LineStyle(2),LineColor(kBlack)); cout<<"chi2/ndof (bkg) = "<<frame1->chiSquare()<<endl; chi2sumB += frame1->chiSquare()*ds_coarse.numEntries(); pdfi->plotOn(frame1,Components("shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name),LineWidth(2),LineStyle(2),LineColor(kBlack),VisualizeError(*res_s,1,kTRUE),FillColor(0),MoveToBack()); hresid = frame1->residHist(); frame2->addPlotable(hresid,"pE1"); float yield_sig = rFit->getValV()*(yield_vbf->getValV()+yield_gf->getValV()); RooAbsPdf *signal_pdf = (RooAbsPdf*)w->pdf("shapeSig_qqH_"+ds_name); signal_pdf->plotOn(frame2,LineWidth(2),LineColor(kRed),Normalization(yield_sig,RooAbsReal::NumEvent),MoveToBack()); } // hresid0->Print(); // hresid->Print(); // double x2,y2; // for (int i=0; i<3; ++i) { // hresid0->GetPoint(i,x2,y2); // cout << "BKG+SIG\t" << x2 << "\t" << y2 << endl; // hresid->GetPoint(i,x2,y2); // cout << "BKG\t" << x2 << "\t" << y2 << endl; // ds_coarse.get(i); // cout << ds_coarse.weightError(RooAbsData::SumW2) << endl; // cout << endl; // } TCanvas* canFit = new TCanvas("Higgs_fit_"+ds_name,"Higgs_fit_"+ds_name,900,750); canFit->cd(1)->SetBottomMargin(0.4); frame1->SetMinimum(MIN_VAL); frame1->SetMaximum(MAX_VAL); frame1->GetYaxis()->SetNdivisions(510); frame1->GetXaxis()->SetTitleSize(0); frame1->GetXaxis()->SetLabelSize(0); frame1->GetYaxis()->SetTitle(TString::Format("Events / %1.1f GeV",BIN_SIZE)); frame1->Draw(); gPad->Update(); TList *list = (TList*)gPad->GetListOfPrimitives(); //list->Print(); TH1F *hUncH = new TH1F("hUncH"+ds_name,"hUncH"+ds_name,(XMAX-XMIN)/BIN_SIZE,XMIN,XMAX); TH1F *hUncL = new TH1F("hUncL"+ds_name,"hUncL"+ds_name,(XMAX-XMIN)/BIN_SIZE,XMIN,XMAX); TH1F *hUnc2H = new TH1F("hUnc2H"+ds_name,"hUnc2H"+ds_name,(XMAX-XMIN)/BIN_SIZE,XMIN,XMAX); TH1F *hUnc2L = new TH1F("hUnc2L"+ds_name,"hUnc2L"+ds_name,(XMAX-XMIN)/BIN_SIZE,XMIN,XMAX); TH1F *hUncC = new TH1F("hUncC"+ds_name,"hUncC"+ds_name,(XMAX-XMIN)/BIN_SIZE,XMIN,XMAX); RooCurve *errorBand,*gFit,*gQCDFit,*gBkgFit; //list->Print(); if (BLIND) { errorBand = (RooCurve*)list->FindObject("pdf_bin"+ds_name+"_Norm[mbbReg_"+ds_name+"]_errorband_Comp[shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name+"]"); gFit = (RooCurve*)list->FindObject("pdf_bin"+ds_name+"_Norm[mbbReg_"+ds_name+"]"+"_Comp[shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name+"]"); } else { //errorBand = (RooCurve*)list->FindObject("pdf_bin"+ds_name+"_Norm[mbbReg_"+ds_name+"]_errorband"); errorBand = (RooCurve*)list->FindObject("pdf_bin"+ds_name+"_Norm[mbbReg_"+ds_name+"]_errorband_Comp[shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name+"]"); gFit = (RooCurve*)list->FindObject("pdf_bin"+ds_name+"_Norm[mbbReg_"+ds_name+"]"); } gQCDFit = (RooCurve*)list->FindObject("pdf_bin"+ds_name+"_Norm[mbbReg_"+ds_name+"]"+"_Comp[shapeBkg_qcd_"+ds_name+"]"); gBkgFit = (RooCurve*)list->FindObject("pdf_bin"+ds_name+"_Norm[mbbReg_"+ds_name+"]"+"_Comp[shapeBkg_qcd_"+ds_name+",shapeBkg_top_"+ds_name+",shapeBkg_zjets_"+ds_name+"]"); for(int i=0;i<hUncH->GetNbinsX();i++) { double x0 = hUncH->GetBinCenter(i+1); double e1 = fabs(errorBand->Eval(x0)-gBkgFit->Eval(x0)); //double e1 = fabs(errorBand->Eval(x0)-gFit->Eval(x0)); double e2 = eNqcd/hUncH->GetNbinsX(); hUncH->SetBinContent(i+1,sqrt(pow(e2,2)+pow(e1,2))); hUnc2H->SetBinContent(i+1,2*sqrt(pow(e2,2)+pow(e1,2))); hUncL->SetBinContent(i+1,-sqrt(pow(e2,2)+pow(e1,2))); hUnc2L->SetBinContent(i+1,-2*sqrt(pow(e2,2)+pow(e1,2))); hUncC->SetBinContent(i+1,0.); } TPad* pad = new TPad("pad", "pad", 0., 0., 1., 1.); pad->SetTopMargin(0.63); pad->SetFillColor(0); pad->SetFillStyle(0); pad->Draw(); pad->cd(0); hUnc2H->GetXaxis()->SetTitle("m_{bb} (GeV)"); hUnc2H->GetYaxis()->SetTitle("Data - Bkg"); //hUnc2H->GetYaxis()->SetTitle("Data - Fit"); double YMAX = 1.1*frame2->GetMaximum(); double YMIN = -1.1*frame2->GetMaximum(); hUnc2H->GetYaxis()->SetRangeUser(YMIN,YMAX); hUnc2H->GetYaxis()->SetNdivisions(507); // hUnc2H->GetXaxis()->SetTitleOffset(0.9); // hUnc2H->GetYaxis()->SetTitleOffset(1.0); hUnc2H->GetYaxis()->SetTickLength(0.0); // hUnc2H->GetYaxis()->SetTitleSize(0.05); // hUnc2H->GetYaxis()->SetLabelSize(0.04); hUnc2H->GetYaxis()->CenterTitle(kTRUE); hUnc2H->SetFillColor(kGreen); hUnc2L->SetFillColor(kGreen); hUncH->SetFillColor(kYellow); hUncL->SetFillColor(kYellow); hUncC->SetLineColor(kBlack); hUncC->SetLineStyle(7); hUnc2H->Draw("HIST"); hUnc2L->Draw("same HIST"); hUncH->Draw("same HIST"); hUncL->Draw("same HIST"); hUncC->Draw("same HIST"); frame2->GetYaxis()->SetTickLength(0.03/0.4); frame2->Draw("same"); TList *list1 = (TList*)gPad->GetListOfPrimitives(); //list1->Print(); RooCurve *gSigFit = (RooCurve*)list1->FindObject("shapeSig_qqH_"+ds_name+"_Norm[mbbReg_"+ds_name+"]"); TLegend *leg = new TLegend(0.70,0.61,0.94,1.-gStyle->GetPadTopMargin()-0.01); leg->SetTextFont(42); leg->SetFillStyle(-1); //leg->SetHeader(ds_name+" (m_{H}="+MASS+")"); leg->SetHeader(TString::Format("Category %d",atoi(ds_name(3,1).Data())+1)); leg->AddEntry(hBlind,"Data","P"); if (!BLIND) { leg->AddEntry(gSigFit,"Fitted signal","L"); } TLine *gEmpty = new TLine(0.0,0.0,0.0,0.0); gEmpty->SetLineWidth(0); TLegendEntry *l1 = leg->AddEntry(gEmpty,"(m_{H} = "+MASS+" GeV)",""); l1->SetTextSize(0.038*0.97*0.85); leg->AddEntry(gFit,"Bkg. + signal","L"); leg->AddEntry(gBkgFit,"Bkg.","L"); leg->AddEntry(gQCDFit,"QCD","L"); leg->AddEntry(hUnc2H,"2#sigma bkg. unc.","F"); leg->AddEntry(hUncH,"1#sigma bkg. unc.","F"); leg->SetFillColor(0); leg->SetBorderSize(0); leg->SetTextFont(42); leg->SetTextSize(0.038*0.98); leg->Draw(); leg->SetY1(leg->GetY2()-leg->GetNRows()*0.045*0.96); TPaveText *paveCMS = new TPaveText(gStyle->GetPadLeftMargin()+0.02,0.7,gStyle->GetPadLeftMargin()+0.15,1.-gStyle->GetPadTopMargin()-0.01,"NDC"); paveCMS->SetTextFont(62); paveCMS->SetTextSize(gStyle->GetPadTopMargin()*3./4.); paveCMS->SetBorderSize(0); paveCMS->SetFillStyle(-1); paveCMS->SetTextAlign(12); paveCMS->AddText("CMS"); paveCMS->Draw(); gPad->Update(); paveCMS->SetY1NDC(paveCMS->GetY2NDC()-paveCMS->GetListOfLines()->GetSize()*gStyle->GetPadTopMargin()); TPaveText *paveLumi = new TPaveText(0.5,1.-gStyle->GetPadTopMargin(),0.98,1.00,"NDC"); paveLumi->SetTextFont(42); paveLumi->SetTextSize(gStyle->GetPadTopMargin()*3./4.); paveLumi->SetBorderSize(0); paveLumi->SetFillStyle(-1); paveLumi->SetTextAlign(32); paveLumi->AddText(TString::Format("%.1f fb^{-1} (8TeV)",(atoi(ds_name(3,1).Data())<4 ? 19.8 : 18.3)).Data());//+ 18.2 ; paveLumi->Draw(); TString path="."; //TString path="BiasV10_limit_BRN5p4_dX0p1_B80-200_CAT0-6/output/"; system(TString::Format("[ ! -d %s/plot ] && mkdir %s/plot",path.Data(),path.Data()).Data()); system(TString::Format("[ ! -d %s/plot/fits ] && mkdir %s/plot/fits",path.Data(),path.Data()).Data()); canFit->SaveAs(TString::Format("%s/plot/fits/Fit_mH%s_%s.pdf",path.Data(),MASS.Data(),ds_name.Data()).Data()); canFit->SaveAs(TString::Format("%s/plot/fits/Fit_mH%s_%s.png",path.Data(),MASS.Data(),ds_name.Data()).Data()); canFit->SaveAs(TString::Format("%s/plot/fits/Fit_mH%s_%s.eps",path.Data(),MASS.Data(),ds_name.Data()).Data()); TText *l = (TText*)paveCMS->AddText("Preliminary"); l->SetTextFont(52); paveCMS->Draw(); gPad->Update(); paveCMS->SetY1NDC(paveCMS->GetY2NDC()-paveCMS->GetListOfLines()->GetSize()*gStyle->GetPadTopMargin()); canFit->SaveAs(TString::Format("%s/plot/fits/Fit_mH%s_%s_prelim.pdf",path.Data(),MASS.Data(),ds_name.Data()).Data()); canFit->SaveAs(TString::Format("%s/plot/fits/Fit_mH%s_%s_prelim.png",path.Data(),MASS.Data(),ds_name.Data()).Data()); canFit->SaveAs(TString::Format("%s/plot/fits/Fit_mH%s_%s_prelim.eps",path.Data(),MASS.Data(),ds_name.Data()).Data()); delete ds; } cout << "chi2sumS: " << chi2sumS << endl; cout << "chi2sumB: " << chi2sumB << endl; cout << "nparS: " << nparS << endl; cout << "nparB: " << nparB << endl; cout << "nbinsum: " << nparsum << endl; cout << "chi2sumS/(nbinsum - nparS): " << chi2sumS / (float)(nparsum - nparS) << endl; cout << "chi2sumB/(nbinsum - nparB): " << chi2sumB / (float)(nparsum - nparB) << endl; delete datasets; }