void plot_toys() { TFile* f = new TFile("/project/atlas/users/tlenz/HWWStatisticsCode_v31/CPmix_kHWW2dot65m_0j_trainv31_v31_allsys_topLumi_toys.root"); RooWorkspace* w = (RooWorkspace*)f->Get("combined"); RooDataSet* data = (RooDataSet*)w->data("obsData"); RooDataSet* toydata = (RooDataSet*)w->data("toyData"); RooDataSet* toydata2 = (RooDataSet*)w->data("toyData4"); RooDataSet* thisAsimovData = (RooDataSet*)w->data("asimivData_profiled_for_epsilon_0"); //asimivData_profiled_for_epsilon_0 RooPlot* frame1 = w->var("obs_x_em_signalLike_0j_2012")->frame(); // RooPlot* frame2 = w->var("obs_x_em_mainControl_0j_2012")->frame(); // RooPlot* frame3 = w->var("obs_x_em_zbox_0j_2012")->frame(); data->plotOn(frame1, Name("data"), DataError(RooAbsData::Poisson), Cut("merged_cat==merged_cat::em_signalLike_0j_2012")); //data->plotOn(frame2, Name("data"), DataError(RooAbsData::Poisson), Cut("merged_cat==merged_cat::em_mainControl_0j_2012")); //data->plotOn(frame3, Name("data"), DataError(RooAbsData::Poisson), Cut("merged_cat==merged_cat::em_zbox_0j_2012")); toydata->plotOn(frame1, Name("toy1"), LineColor(kRed), MarkerStyle(21), MarkerColor(kRed), DataError(RooAbsData::Poisson), Cut("merged_cat==merged_cat::em_signalLike_0j_2012")); //toydata->plotOn(frame2, Name("toy1"), LineColor(kRed), MarkerStyle(21), MarkerColor(kRed), DataError(RooAbsData::Poisson), Cut("merged_cat==merged_cat::em_mainControl_0j_2012")); //toydata->plotOn(frame3, Name("toy1"), LineColor(kRed), MarkerStyle(21), MarkerColor(kRed), DataError(RooAbsData::Poisson), Cut("merged_cat==merged_cat::em_zbox_0j_2012")); toydata2->plotOn(frame1, Name("toy4"), LineColor(kGreen), MarkerStyle(21), MarkerColor(kGreen), DataError(RooAbsData::Poisson), Cut("merged_cat==merged_cat::em_signalLike_0j_2012")); //toydata2->plotOn(frame2, Name("toy4"), LineColor(kGreen), MarkerStyle(21), MarkerColor(kGreen), DataError(RooAbsData::Poisson), Cut("merged_cat==merged_cat::em_mainControl_0j_2012")); //toydata2->plotOn(frame3, Name("toy4"), LineColor(kGreen), MarkerStyle(21), MarkerColor(kGreen), DataError(RooAbsData::Poisson), Cut("merged_cat==merged_cat::em_zbox_0j_2012")); thisAsimovData->plotOn(frame1, Name("asimov"), LineColor(kBlue), MarkerStyle(22), MarkerColor(kBlue), DataError(RooAbsData::Poisson), Cut("merged_cat==merged_cat::em_signalLike_0j_2012")); //thisAsimovData->plotOn(frame2, Name("asimov"), LineColor(kBlue), MarkerStyle(22), MarkerColor(kBlue), DataError(RooAbsData::Poisson), Cut("merged_cat==merged_cat::em_mainControl_0j_2012")); //thisAsimovData->plotOn(frame3, Name("asimov"), LineColor(kBlue), MarkerStyle(22), MarkerColor(kBlue), DataError(RooAbsData::Poisson), Cut("merged_cat==merged_cat::em_zbox_0j_2012")); TCanvas* c = new TCanvas("c","c",1800,600); //c->Divide(3,1); /*c->cd(1);*/ /*gPad->SetLogy();*/ frame1->Draw(); //c->cd(2); frame2->Draw(); //draw legend TLegend *leg = new TLegend(0.48, 0.60, 0.84, 0.80, NULL,"brNDC"); leg->SetBorderSize(0); leg->SetTextFont(62); leg->SetTextSize(0.04); leg->SetLineColor(1); leg->SetLineStyle(1); leg->SetLineWidth(1); leg->SetFillColor(0); leg->SetFillStyle(1001); leg->SetNColumns(1); leg->AddEntry(frame1->findObject("data"),"data","pl"); leg->AddEntry(frame1->findObject("toy1"),"toy1","pl"); leg->AddEntry(frame1->findObject("toy4"),"toy4","pl"); leg->AddEntry(frame1->findObject("asimov"),"asimov","pl"); leg->Draw(); //c->cd(3); frame3->Draw(); c->Print("toys_linear.pdf"); }
int main(){ RooMsgService::instance().setGlobalKillBelow(ERROR); TFile *bkgFile = TFile::Open("comb_svn/hgg.inputbkgdata_8TeV_MVA.root"); RooWorkspace *bkgWS = (RooWorkspace*)bkgFile->Get("cms_hgg_workspace"); RooRealVar *mass = (RooRealVar*)bkgWS->var("CMS_hgg_mass"); RooDataSet *data = (RooDataSet*)bkgWS->data("data_mass_cat0"); RooRealVar *p1 = new RooRealVar("p1","p1",-2.,-10.,0.); RooRealVar *p2 = new RooRealVar("p2","p2",-0.001,-0.01,0.01); RooRealVar *p3 = new RooRealVar("p3","p3",-0.0001,-0.01,0.01); //RooPowerLawSum *pow1 = new RooPowerLawSum("pow","pow",*mass,RooArgList(*p1)); //RooPowerLawSum *pow2 = new RooPowerLawSum("pow","pow",*mass,RooArgList(*p1,*p2)); //RooPowerLawSum *pow3 = new RooPowerLawSum("pow","pow",*mass,RooArgList(*p1,*p2,*p3)); RooExponentialSum *pow1 = new RooExponentialSum("pow1","pow1",*mass,RooArgList(*p1)); RooExponentialSum *pow2 = new RooExponentialSum("pow2","pow2",*mass,RooArgList(*p1,*p2)); RooExponentialSum *pow3 = new RooExponentialSum("pow3","pow3",*mass,RooArgList(*p1,*p2,*p3)); TCanvas *canv = new TCanvas(); RooPlot *frame = mass->frame(); data->plotOn(frame); cout << "bus" << endl; pow1->fitTo(*data,PrintEvalErrors(-1),PrintLevel(-1),Warnings(-1),Verbose(-1)); cout << "bus" << endl; pow1->plotOn(frame); pow2->fitTo(*data); pow2->plotOn(frame,LineColor(kRed),LineStyle(kDashed)); pow3->fitTo(*data); pow3->plotOn(frame,LineColor(kGreen),LineStyle(7)); frame->Draw(); canv->Print("test.pdf"); TFile *outFile = new TFile("test.root","RECREATE"); TTree *tree = new TTree("tree","tree"); vector<double> mu; mu.push_back(1.); mu.push_back(2.); mu.push_back(3.); mu.push_back(4.); vector<string> label; label.push_back("pol"); label.push_back("pow"); label.push_back("lau"); label.push_back("exp"); tree->Branch("mu",&mu); tree->Branch("label",&label); tree->Fill(); outFile->cd(); tree->Write(); outFile->Close(); return 0; }
void setRange(RooWorkspace& myws, RooPlot* frame, string dsName, bool setLogScale, double dMuonYmin) { // Find maximum and minimum points of Plot to rescale Y axis TH1* h = myws.data(dsName.c_str())->createHistogram("hist", *myws.var("ctau"), Binning(frame->GetNbinsX(),frame->GetXaxis()->GetXmin(),frame->GetXaxis()->GetXmax())); Double_t YMax = h->GetBinContent(h->GetMaximumBin()); cout << YMax << endl; // Double_t YMin = min( h->GetBinContent(h->FindFirstBinAbove(0.0)), h->GetBinContent(h->FindLastBinAbove(0.0)) ); Double_t YMin = 1e99; for (int i=1; i<=h->GetNbinsX(); i++) if (h->GetBinContent(i)>0) YMin = min(YMin, h->GetBinContent(i)); bool isMC = false; if (dsName.find("MC")!=std::string::npos) isMC = true; Double_t Yup(0.),Ydown(0.); if(setLogScale) { if (isMC) Ydown = YMin*0.3; else Ydown = YMin/(TMath::Power((YMax/YMin), (0.1/(1.0-0.1-0.4)))); Yup = YMax*TMath::Power((YMax/YMin), (0.4/(1.0-0.1-0.4))); } else { Ydown = max(YMin-(YMax-YMin)*(0.1/(1.0-0.1-0.4)),0.0); Yup = YMax+(YMax-YMin)*(0.4/(1.0-0.1-0.4)); } cout << Ydown << " " << Yup << endl; frame->GetYaxis()->SetRangeUser(Ydown,Yup); delete h; // Create line to indicate upper fitting range for MC if (isMC) { if (dsName.find("JPSIP")!=std::string::npos) { TLine* line(0x0); if (dMuonYmin >= 1.6) line = new TLine(3.32,Ydown,3.32,Yup); else line = new TLine(3.26,Ydown,3.26,Yup); line->SetLineStyle(2); line->SetLineColor(1); line->SetLineWidth(3); frame->addObject(line); } else if (dsName.find("PSI2S")!=std::string::npos) { TLine* line(0x0); if (dMuonYmin >= 1.6) line = new TLine(3.95,Ydown,3.95,Yup); else line = new TLine(3.85,Ydown,3.85,Yup); line->SetLineStyle(2); line->SetLineColor(1); line->SetLineWidth(3); frame->addObject(line); } } }
void makeFit( TString inf, TString outf ) { TFile *tf = TFile::Open( inf ); RooWorkspace *w = (RooWorkspace*)tf->Get("w"); //w->factory( "Gaussian::dst_mass1( Dst_M, dst_mean[2005,2015], dst_sigma1[1,20] )" ); //w->factory( "Gaussian::dst_mass2( Dst_M, dst_mean, dst_sigma2[3,50] )" ); //w->factory( "Gaussian::dst_mass3( Dst_M, dst_mean, dst_sigma3[5,200] )" ); //w->factory( "SUM::dst_mass( dst_f[0.1,1.]*dst_mass1, dst_f2[0.1,1.]*dst_mass2, dst_mass3 )" ); //w->factory( "SUM::dst_mass_sig( dst_f[0.1,1.]*dst_mass1, dst_f2[0.1,1.]*dst_mass2, dst_mass3 )" ); w->factory( "Gaussian::dst_mass1( Dst_M, dst_mean[2005,2015], dst_sigma1[1,20] )" ); w->factory( "CBShape::dst_mass2( Dst_M, dst_mean, dst_sigma2[1,20], dst_alpha[0.1,10.], dst_n1[0.1,10.] )" ); w->factory( "SUM::dst_mass_sig( dst_f[0.1,1.]*dst_mass1, dst_mass2 )" ); w->factory( "Bernstein::dst_mass_bkg( Dst_M, {1.,dst_p0[0.,1.]} )" ); w->factory( "SUM::dst_mass( dst_mass_sy[0,10e8]*dst_mass_sig, dst_mass_by[0,10e2]*dst_mass_bkg )" ); //w->factory( "Gaussian::d0_mass1( D0_M, d0_mean[1862,1868], d0_sigma1[1,20] )" ); //w->factory( "Gaussian::d0_mass2( D0_M, d0_mean, d0_sigma2[3,50] )" ); //w->factory( "Gaussian::d0_mass3( D0_M, d0_mean, d0_sigma3[5,200] )" ); //w->factory( "SUM::d0_mass( d0_f[0.1,1.]*d0_mass1, d0_f2[0.1,1.]*d0_mass2, d0_mass3 )" ); //w->factory( "SUM::d0_mass( d0_f[0.1,1.]*d0_mass1, d0_f2[0.1,1.]*d0_mass2, d0_mass3 )" ); w->factory( "Gaussian::d0_mass1( D0_M, d0_mean[1862,1868], d0_sigma1[1,20] )" ); w->factory( "CBShape::d0_mass2( D0_M, d0_mean, d0_sigma2[1,20], d0_alpha[0.1,10.], d0_n1[0.1,10.] )" ); w->factory( "SUM::d0_mass_sig( d0_f[0.1,1.]*d0_mass1, d0_mass2 )" ); w->factory( "Bernstein::d0_mass_bkg( D0_M, {1.,d0_p0[0.,1.]} )" ); w->factory( "SUM::d0_mass( d0_mass_sy[0,10e8]*d0_mass_sig, d0_mass_by[0,10e1]*d0_mass_bkg )" ); w->factory( "d0_tau[0,1000.]" ); w->factory( "expr::d0_e( '-1/@0', d0_tau)" ); w->factory( "Exponential::d0_t( D0_LTIME_ps, d0_e )" ); w->pdf("dst_mass")->fitTo( *w->data("Data") , Range(1960,2060) ); w->pdf("d0_mass") ->fitTo( *w->data("Data") , Range(1820,1910) ); w->pdf("d0_t") ->fitTo( *w->data("Data") , Range(0.25,5.) ); tf->Close(); w->writeToFile(outf); }
RooAbsData * Tprime::GetWorkspaceData( std::string datasetName ) { // // Return a pointer to a dataset from workspace. // Class member pointer data set to point to the dataset. // Caller does not take ownership. // //RooArgSet * pPoiSet = pMc delete data; data = (RooAbsData *)pWs->data(datasetName.c_str())->Clone(); return data; }
vector<double> sigEvents(RooWorkspace *work, int m_hyp, int cat, string altSigFileName, int spin=false){ RooWorkspace *tempWork; if (altSigFileName!=""){ TFile *temp = TFile::Open(altSigFileName.c_str()); tempWork = (RooWorkspace*)temp->Get("cms_hgg_workspace"); } else { tempWork = work; } vector<double> result; RooDataSet *ggh = (RooDataSet*)tempWork->data(Form("sig_ggh_mass_m%d_cat%d",m_hyp,cat)); RooDataSet *vbf = (RooDataSet*)tempWork->data(Form("sig_vbf_mass_m%d_cat%d",m_hyp,cat)); RooDataSet *wzh = (RooDataSet*)tempWork->data(Form("sig_wzh_mass_m%d_cat%d",m_hyp,cat)); RooDataSet *tth = (RooDataSet*)tempWork->data(Form("sig_tth_mass_m%d_cat%d",m_hyp,cat)); double total; if (!spin) { total = ggh->sumEntries()+vbf->sumEntries()+wzh->sumEntries()+tth->sumEntries(); result.push_back(total); result.push_back(100*ggh->sumEntries()/total); result.push_back(100*vbf->sumEntries()/total); result.push_back(100*wzh->sumEntries()/total); result.push_back(100*tth->sumEntries()/total); } else { ggh = (RooDataSet*)tempWork->data(Form("sig_mass_m%d_cat%d",m_hyp,cat)); total = ggh->sumEntries(); result.push_back(total); result.push_back(100.); result.push_back(0.); result.push_back(0.); result.push_back(0.); } return result; }
void plotFromWorkspace() { TFile* file = new TFile("card_m125_1JetIncl_XX_workspace.root"); RooWorkspace* w = (RooWorkspace*)file->Get("w"); RooRealVar* m = (RooRealVar*)w->var("CMS_hmumu_mass"); RooRealVar* e = (RooRealVar*)w->var("CMS_hmumu_merr"); RooDataSet* d = (RooDataSet*)w->data("data_pseudo"); RooAbsPdf * b = w->pdf("bkg_mass_merr_1JetIncl_XX_pdf"); RooAbsPdf * s = w->pdf("sig_mass_merr_ggH_1JetIncl_XX_pdf"); RooPlot* frame = m->frame(); d->plotOn(frame); b->plotOn(frame); //s->plotOn(frame, RooFit::ProjWData(*e, *d), RooFit::LineColor(kOrange+1)); //s->plotOn(frame, RooFit::LineColor(kOrange+1)); frame->Draw(); }
void workspaceMerger::combineWorkspaces(){ // Get names of objects inside RooContainer std::vector<std::string> histogramNames = rooContainer->GetTH1FNames(); std::vector<std::string> datasetNames = rooContainer->GetDataSetNames(); // Loop Over the files and get the relevant pieces to Merge: for (std::vector<std::string>::iterator it_comb=combineFileNames.begin() ;it_comb!=combineFileNames.end() ;it_comb++){ TFile *tmpFile = TFile::Open((*it_comb).c_str()); tmpFile->cd(); std::cout << "Combining Current File - " << (*it_comb) << std::endl; for (std::vector<std::string>::iterator it_hist=histogramNames.begin() ;it_hist!=histogramNames.end() ;it_hist++) { TH1F *histExtra = (TH1F*) tmpFile->Get(Form("th1f_%s",it_hist->c_str())); rooContainer->AppendTH1F(*it_hist,histExtra); } RooWorkspace *work = (RooWorkspace*) tmpFile->Get("cms_hgg_workspace"); for (std::vector<std::string>::iterator it_data=datasetNames.begin() ;it_data!=datasetNames.end() ;it_data++) { RooDataSet *dataExtra = (RooDataSet*) work->data(Form("%s",it_data->c_str())); rooContainer->AppendDataSet(*it_data,dataExtra); } std::cout << "Finished Combining File - " << (*it_comb) << std::endl; tmpFile->Close(); //delete tmpFile; } outPutFile->cd(); saveContainer(); }
void setMassFrom2DRange(RooWorkspace& myws, RooPlot* frame, string dsName, bool setLogScale) { // Find maximum and minimum points of Plot to rescale Y axis TH1* h = myws.data(dsName.c_str())->createHistogram("hist", *myws.var("invMass"), Binning(frame->GetNbinsX(),frame->GetXaxis()->GetXmin(),frame->GetXaxis()->GetXmax())); Double_t YMax = h->GetBinContent(h->GetMaximumBin()); // Double_t YMin = min( h->GetBinContent(h->FindFirstBinAbove(0.0)), h->GetBinContent(h->FindLastBinAbove(0.0)) ); Double_t YMin = 1e99; for (int i=1; i<=h->GetNbinsX(); i++) if (h->GetBinContent(i)>0) YMin = min(YMin, h->GetBinContent(i)); Double_t Yup(0.),Ydown(0.); if(setLogScale) { Ydown = YMin/(TMath::Power((YMax/YMin), (0.1/(1.0-0.1-0.4)))); Yup = YMax*TMath::Power((YMax/YMin), (0.4/(1.0-0.1-0.4))); } else { Ydown = max(YMin-(YMax-YMin)*(0.1/(1.0-0.1-0.4)),0.0); Yup = YMax+(YMax-YMin)*(0.4/(1.0-0.1-0.4)); } frame->GetYaxis()->SetRangeUser(Ydown,Yup); delete h; };
void setCtauFrom2DRange(RooWorkspace& myws, RooPlot* frame, string dsName, bool setLogScale, vector<double> rangeErr, double excEvts) { // Find maximum and minimum points of Plot to rescale Y axis TH1* h = myws.data(dsName.c_str())->createHistogram("hist", *myws.var("ctau"), Binning(frame->GetNbinsX(),frame->GetXaxis()->GetXmin(),frame->GetXaxis()->GetXmax())); Double_t YMax = h->GetBinContent(h->GetMaximumBin()); Double_t YMin = 1e99; for (int i=1; i<=h->GetNbinsX(); i++) if (h->GetBinContent(i)>0) YMin = min(YMin, h->GetBinContent(i)); Double_t Yup(0.),Ydown(0.); if(setLogScale) { Yup = YMax*TMath::Power((YMax/0.1), 0.5); Ydown = 0.1; } else { Yup = YMax+(YMax-0.0)*0.5; Ydown = 0.0; } frame->GetYaxis()->SetRangeUser(Ydown,Yup); delete h; if (excEvts>0.0) { TLine *minline = new TLine(rangeErr[0], 0.0, rangeErr[0], (setLogScale?(Ydown*TMath::Power((Yup/Ydown),0.4)):(Ydown + (Yup-Ydown)*0.4))); minline->SetLineStyle(2); minline->SetLineColor(1); minline->SetLineWidth(3); frame->addObject(minline); TLine *maxline = new TLine(rangeErr[1], 0.0, rangeErr[1], (setLogScale?(Ydown*TMath::Power((Yup/Ydown),0.4)):(Ydown + (Yup-Ydown)*0.4))); maxline->SetLineStyle(2); maxline->SetLineColor(1); maxline->SetLineWidth(3); frame->addObject(maxline); } };
int main(int argc, char* argv[]){ string fileName; string fileNameZee; string fileNameout; string outDir; int ncats; int jcats; int bins; string outfilename; string logfile; bool verbose=false; int mhLow; int mhHigh; po::options_description desc("Allowed options"); desc.add_options() ("help,h", "Show help") ("infilename,i", po::value<string>(&fileName)->default_value("CMS-HGG.root"), "In file name") ("infilenameZee,I", po::value<string>(&fileNameZee)->default_value("CMS-HGG_DY_fit.root"), "In file name Zee") ("Outfilename,o", po::value<string>(&fileNameout)->default_value("CMS-HGG_finalBkg.root"), "Out file name") ("outDir,D", po::value<string>(&outDir)->default_value("plots/FinalBackground"), "Out directory for plots") ("logfile,l", po::value<string>(&logfile)->default_value("BackgroundFit.log"), "log file of fit results") ("ncats,c", po::value<int>(&ncats)->default_value(4), "Number of categories") ("jcats,j", po::value<int>(&jcats)->default_value(0), "Start number of categories") ("mhLow,L", po::value<int>(&mhLow)->default_value(75), "Starting point for scan") ("mhHigh,H", po::value<int>(&mhHigh)->default_value(120), "End point for scan") ("bins,B", po::value<int>(&bins)->default_value(45), "Bins for the dataset") ("verbose,v", "Run with more output") ; po::variables_map vm; po::store(po::parse_command_line(argc,argv,desc),vm); po::notify(vm); if (vm.count("help")) { cout << desc << endl; exit(1); } if (vm.count("verbose")) verbose=true; if (!verbose) { RooMsgService::instance().setGlobalKillBelow(RooFit::ERROR); RooMsgService::instance().setSilentMode(true); } TFile *outputfile; outputfile = new TFile(fileNameout.c_str(),"RECREATE"); RooWorkspace *outputws; ofstream logfile_stream(logfile.c_str()); TFile *inFile = TFile::Open(fileName.c_str()); RooWorkspace *inWS = (RooWorkspace*)inFile->Get("cms_hgg_workspace"); outputws = (RooWorkspace*)inWS->Clone("cms_hgg_workspace"); std::string ext = "8TeV"; vector<pair<string,int> > funChoice; // <functionType,order> funChoice.push_back(pair<string,int>("Bernstein",4)); //cat0 funChoice.push_back(pair<string,int>("Bernstein",5)); //cat1 funChoice.push_back(pair<string,int>("Bernstein",5)); //cat2 funChoice.push_back(pair<string,int>("Bernstein",5)); //cat3 PdfModelBuilder pdfsModel; RooRealVar *mass = (RooRealVar*)inWS->var("CMS_hgg_mass"); pdfsModel.setObsVar(mass); //mass->setBins(bins); //mass->setRange(85,110); for (int cat=jcats; cat<ncats; cat++){ RooDataSet *data = (RooDataSet*)inWS->data(Form("data_mass_cat%d",cat)); //RooDataHist thisdataBinned(Form("roohist_data_mass_cat%d",cat),"data",*mass,*dataFull); //FAN Procedure (from an official script) //RooDataSet *data = (RooDataSet*)&thisdataBinned; RooAbsPdf *pdfZee; TFile *inFileZee = TFile::Open(fileNameZee.c_str()); RooWorkspace *inWS_Zee = (RooWorkspace*)inFileZee->Get("Zpeak"); cout<<endl<<"///////////////////////////////////"<<endl; inWS_Zee->Print(); cout<<"///////////////////////////////////"<<endl<<endl; pdfZee = inWS_Zee->pdf(Form("hgg_bkg_%s_cat%d_DCB",ext.c_str(),cat)); cout<<endl<<"///////////////////////////////////"<<endl; pdfZee->Print(); cout<<"///////////////////////////////////"<<endl<<endl; //RooAbsPdf *pdfZeeFixed=pdfsModel.floatDoubleCB(pdfZee,data,Form("hgg_bkg_%s_cat%d_DCB",ext.c_str(),cat)); RooAbsPdf *pdfZeeFixed=pdfsModel.fixDoubleCB(pdfZee,data,Form("hgg_bkg_%s_cat%d_DCB",ext.c_str(),cat)); RooAbsPdf *bkgPdf; RooAbsPdf *berComponent; RooAbsPdf *dcbComponent; string funcType = funChoice[cat].first; int orderOff = funChoice[cat].second; bkgPdf = pdfsModel.getFixedDoubleCBplusContinuum(funcType,Form("hgg_bkg_%s_cat%d",ext.c_str(),cat),orderOff,pdfZeeFixed,false).first; berComponent = pdfsModel.getFixedDoubleCBplusContinuum(funcType,Form("hgg_bkg_%s_cat%d",ext.c_str(),cat),orderOff,pdfZeeFixed,false).second.first; dcbComponent = pdfsModel.getFixedDoubleCBplusContinuum(funcType,Form("hgg_bkg_%s_cat%d",ext.c_str(),cat),orderOff,pdfZeeFixed,false).second.second; cout<<endl<<"///////////////////////////////////"<<endl; bkgPdf->Print(); cout<<"///////////////////////////////////"<<endl<<endl; cout<<endl<<"///////////////////////////////////"<<endl; bkgPdf->getParameters(data)->Print(); cout<<"///////////////////////////////////"<<endl<<endl; int fitStatus = 0; double thisNll=0.; runFit(bkgPdf,data,&thisNll,&fitStatus,3,mhLow,mhHigh); //RooFitResult *fitRes = bkgPdf->fitTo(*data,Save(true),Range(mhLow,mhHigh)); //plot(mass,bkgPdf,data,Form("%s/hgg_bkg_%s_cat%d",outDir.c_str(),ext.c_str(),cat),bins,mhLow,mhHigh); //print results in log file RooArgSet *params = bkgPdf->getParameters(*data); float Mean = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_mean",ext.c_str(),cat)))->getValV(); float MeanErrorL = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_mean",ext.c_str(),cat)))->getErrorLo(); float MeanErrorH = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_mean",ext.c_str(),cat)))->getErrorHi(); float Sigma = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_sigma",ext.c_str(),cat)))->getValV(); float SigmaErrorL = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_sigma",ext.c_str(),cat)))->getErrorLo(); float SigmaErrorH = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_sigma",ext.c_str(),cat)))->getErrorHi(); float nCB1 = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_nCB1",ext.c_str(),cat)))->getValV(); float nCB1ErrorL = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_nCB1",ext.c_str(),cat)))->getErrorLo(); float nCB1ErrorH = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_nCB1",ext.c_str(),cat)))->getErrorHi(); float nCB2 = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_nCB2",ext.c_str(),cat)))->getValV(); float nCB2ErrorL = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_nCB2",ext.c_str(),cat)))->getErrorLo(); float nCB2ErrorH = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_nCB2",ext.c_str(),cat)))->getErrorHi(); float alphaCB1 = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_alphaCB1",ext.c_str(),cat)))->getValV(); float alphaCB2 = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_alphaCB2",ext.c_str(),cat)))->getValV(); logfile_stream << Form("**************** cat: %d ***************",cat) <<endl<<" nEntries "<<data->sumEntries() << endl << " Mean: " << Mean << " MeanErrorL: " << MeanErrorL << " MeanErrorH: "<< MeanErrorH << " Sigma: " << Sigma << " SigmaErrorL: " << SigmaErrorL << " SigmaErrorH: " << SigmaErrorH << " nCB1: " << nCB1 << " nCB1ErrorL: " << nCB1ErrorL << " nCB1ErrorH: " << nCB1ErrorH << " nCB2: " << nCB2 << " nCB2ErrorL: " << nCB2ErrorL << " nCB2ErrorH: " << nCB2ErrorH << " alphaCB1: " << alphaCB1 << " alphaCB2: " << alphaCB2 << endl; float frac = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_frac_sum1",ext.c_str(),cat)))->getValV(); float fracErrorL = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_frac_sum1",ext.c_str(),cat)))->getErrorLo(); float fracErrorH = ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_frac_sum1",ext.c_str(),cat)))->getErrorHi(); logfile_stream <<" Frac "<<frac<<" FracErrorL "<<fracErrorL<<" FracErrorH "<<fracErrorH<<endl; for(int i=0;i<orderOff;i++){ RooRealVar *coeff=(RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_%s_p%i",ext.c_str(),cat,abbr(funcType).c_str(),i)); logfile_stream <<Form(" %s_%i: ",funcType.c_str(),i)<<coeff->getValV()<<Form(" %s_%i ErrorL: ",funcType.c_str(),i)<<coeff->getErrorLo()<<Form(" %s_%i ErrorH: ",funcType.c_str(),i)<<coeff->getErrorHi(); } logfile_stream<<endl; plot2(mass,bkgPdf,berComponent,dcbComponent,frac,data,Form("%s/hgg_bkg_%s_cat%d",outDir.c_str(),ext.c_str(),cat),bins,mhLow,mhHigh); //Let the DCB parameter float within their uncertaincy range in combine ? ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_mean",ext.c_str(),cat)))->setConstant(false); ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_sigma",ext.c_str(),cat)))->setConstant(false); ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_nCB1",ext.c_str(),cat)))->setConstant(false); ((RooRealVar*)params->find(Form("hgg_bkg_%s_cat%d_DCB_nCB2",ext.c_str(),cat)))->setConstant(false); outputws->var(Form("pdf_data_pol_model_8TeV_cat%d_norm",cat))->SetName(Form("hgg_bkg_8TeV_cat%d_DCBplusBernstein_norm",cat)); outputws->import(*bkgPdf); } outputfile->cd(); outputws->Write(); cout<<endl<<"///////////////////////////////////"<<endl; //outputws->Print(); cout<<"///////////////////////////////////"<<endl<<endl; outputfile->Close(); }
int GetBayesianInterval( std::string filename = "workspace.root", std::string wsname = "myWS" ){ // // this function loads a workspace and computes // a Bayesian upper limit // // open file with workspace for reading TFile * pInFile = new TFile(filename.c_str(), "read"); // load workspace RooWorkspace * pWs = (RooWorkspace *)pInFile->Get(wsname.c_str()); if (!pWs){ std::cout << "workspace " << wsname << " not found" << std::endl; return -1; } // printout workspace content pWs->Print(); // load and print data from workspace RooAbsData * data = pWs->data("data"); data->Print(); // load and print S+B Model Config RooStats::ModelConfig * pSbHypo = (RooStats::ModelConfig *)pWs->obj("SbHypo"); pSbHypo->Print(); // create RooStats Bayesian MCMC calculator and set parameters // Metropolis-Hastings algorithm needs a proposal function RooStats::SequentialProposal sp(10.0); RooStats::MCMCCalculator mcmc( *data, *pSbHypo ); mcmc.SetConfidenceLevel(0.95); mcmc.SetNumIters(100000); // Metropolis-Hastings algorithm iterations mcmc.SetProposalFunction(sp); mcmc.SetNumBurnInSteps(500); // first N steps to be ignored as burn-in mcmc.SetLeftSideTailFraction(0.0); mcmc.SetNumBins(40); // for plotting only - does not affect limit calculation // estimate credible interval // NOTE: unfortunate notation: the UpperLimit() name refers // to the upper boundary of an interval, // NOT to the upper limit on the parameter of interest // (it just happens to be the same for the one-sided // interval starting at 0) RooStats::MCMCInterval * pMcmcInt = mcmc.GetInterval(); double upper_bound = pMcmcInt->UpperLimit( *pWs->var("xsec") ); double lower_bound = pMcmcInt->LowerLimit( *pWs->var("xsec") ); std::cout << "one-sided 95%.C.L. bayesian credible interval for xsec: " << "[" << lower_bound << ", " << upper_bound << "]" << std::endl; // make posterior PDF plot for POI TCanvas c1("posterior"); RooStats::MCMCIntervalPlot plot(*pMcmcInt); plot.Draw(); c1.SaveAs("bayesian_mcmc_posterior.pdf"); // make scatter plots to visualise the Markov chain TCanvas c2("xsec_vs_alpha_lumi"); plot.DrawChainScatter( *pWs->var("xsec"), *pWs->var("alpha_lumi")); c2.SaveAs("scatter_mcmc_xsec_vs_alpha_lumi.pdf"); TCanvas c3("xsec_vs_alpha_efficiency"); plot.DrawChainScatter( *pWs->var("xsec"), *pWs->var("alpha_efficiency")); c3.SaveAs("scatter_mcmc_xsec_vs_alpha_efficiency.pdf"); TCanvas c4("xsec_vs_alpha_nbkg"); plot.DrawChainScatter( *pWs->var("xsec"), *pWs->var("alpha_nbkg")); c4.SaveAs("scatter_mcmc_xsec_vs_alpha_nbkg.pdf"); // clean up a little delete pMcmcInt; return 0; }
//void RunToyScan5(TString fileName, double startVal, double stopVal, TString outFile) { void frequentist(TString fileName) { cout << "Starting frequentist " << time(NULL) << endl; double startVal = 0; double stopVal = 200; TString outFile = ""; int nToys = 1 ; int nscanpoints = 2 ; /* gROOT->LoadMacro("RooBetaPdf.cxx+") ; gROOT->LoadMacro("RooRatio.cxx+") ; gROOT->LoadMacro("RooPosDefCorrGauss.cxx+") ; */ // get relevant objects out of the "ws" file TFile *file = TFile::Open(fileName); if(!file){ cout <<"file not found" << endl; return; } RooWorkspace* w = (RooWorkspace*) file->Get("workspace"); if(!w){ cout <<"workspace not found" << endl; return; } ModelConfig* mc = (ModelConfig*) w->obj("S+B_model"); RooAbsData* data = w->data("data"); if( !data || !mc ){ w->Print(); cout << "data or ModelConfig was not found" <<endl; return; } RooRealVar* myPOI = (RooRealVar*) mc->GetParametersOfInterest()->first(); myPOI->setRange(0, 1000.); ModelConfig* bModel = (ModelConfig*) w->obj("B_model"); ModelConfig* sbModel = (ModelConfig*) w->obj("S+B_model"); ProfileLikelihoodTestStat profll(*sbModel->GetPdf()); profll.SetPrintLevel(2); profll.SetOneSided(1); TestStatistic * testStat = &profll; HypoTestCalculatorGeneric * hc = 0; hc = new FrequentistCalculator(*data, *bModel, *sbModel); ToyMCSampler *toymcs = (ToyMCSampler*)hc->GetTestStatSampler(); toymcs->SetMaxToys(10000); toymcs->SetNEventsPerToy(1); toymcs->SetTestStatistic(testStat); ((FrequentistCalculator *)hc)->SetToys(nToys,nToys); HypoTestInverter calc(*hc); calc.SetConfidenceLevel(0.95); calc.UseCLs(true); //calc.SetVerbose(true); calc.SetVerbose(2); cout << "About to set fixed scan " << time(NULL) << endl; calc.SetFixedScan(nscanpoints,startVal,stopVal); cout << "About to do inverter " << time(NULL) << endl; HypoTestInverterResult * res_toysCLs_calculator = calc.GetInterval(); cout << "CLs = " << res_toysCLs_calculator->UpperLimit() << " CLs_exp = " << res_toysCLs_calculator->GetExpectedUpperLimit(0) << " CLs_exp(-1s) = " << res_toysCLs_calculator->GetExpectedUpperLimit(-1) << " CLs_exp(+1s) = " << res_toysCLs_calculator->GetExpectedUpperLimit(1) << endl ; /* // dump results string to output file ofstream outStream ; outStream.open(outFile,ios::app) ; outStream << "CLs = " << res_toysCLs_calculator->UpperLimit() << " CLs_exp = " << res_toysCLs_calculator->GetExpectedUpperLimit(0) << " CLs_exp(-1s) = " << res_toysCLs_calculator->GetExpectedUpperLimit(-1) << " CLs_exp(+1s) = " << res_toysCLs_calculator->GetExpectedUpperLimit(1) << endl ; outStream.close() ; */ cout << "End of frequentist " << time(NULL) << endl; return ; }
void draw_data_mgg(TString folderName,bool blind=true,float min=103,float max=160) { TFile inputFile(folderName+"/data.root"); const int nCat = 5; TString cats[5] = {"HighPt","Hbb","Zbb","HighRes","LowRes"}; TCanvas cv; for(int iCat=0; iCat < nCat; iCat++) { RooWorkspace *ws = (RooWorkspace*)inputFile.Get(cats[iCat]+"_mgg_workspace"); RooFitResult* res = (RooFitResult*)ws->obj("fitresult_pdf_data"); RooRealVar * mass = ws->var("mgg"); mass->setRange("all",min,max); mass->setRange("blind",121,130); mass->setRange("low",106,121); mass->setRange("high",130,160); mass->setUnit("GeV"); mass->SetTitle("m_{#gamma#gamma}"); RooAbsPdf * pdf = ws->pdf("pdf"); RooPlot *plot = mass->frame(min,max,max-min); plot->SetTitle(""); RooAbsData* data = ws->data("data")->reduce(Form("mgg > %f && mgg < %f",min,max)); double nTot = data->sumEntries(); if(blind) data = data->reduce("mgg < 121 || mgg>130"); double nBlind = data->sumEntries(); double norm = nTot/nBlind; //normalization for the plot data->plotOn(plot); pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::Range("Full"),RooFit::LineWidth(0.1) ); plot->Print(); //add the fix error band RooCurve* c = plot->getCurve("pdf_Norm[mgg]_Range[Full]_NormRange[Full]"); const int Nc = c->GetN(); //TGraphErrors errfix(Nc); //TGraphErrors errfix2(Nc); TGraphAsymmErrors errfix(Nc); TGraphAsymmErrors errfix2(Nc); Double_t *x = c->GetX(); Double_t *y = c->GetY(); double NtotalFit = ws->var("Nbkg1")->getVal()*ws->var("Nbkg1")->getVal() + ws->var("Nbkg2")->getVal()*ws->var("Nbkg2")->getVal(); for( int i = 0; i < Nc; i++ ) { errfix.SetPoint(i,x[i],y[i]); errfix2.SetPoint(i,x[i],y[i]); mass->setVal(x[i]); double shapeErr = pdf->getPropagatedError(*res)*NtotalFit; //double totalErr = TMath::Sqrt( shapeErr*shapeErr + y[i] ); //total normalization error double totalErr = TMath::Sqrt( shapeErr*shapeErr + y[i]*y[i]/NtotalFit ); if ( y[i] - totalErr > .0 ) { errfix.SetPointError(i, 0, 0, totalErr, totalErr ); } else { errfix.SetPointError(i, 0, 0, y[i] - 0.01, totalErr ); } //2sigma if ( y[i] - 2.*totalErr > .0 ) { errfix2.SetPointError(i, 0, 0, 2.*totalErr, 2.*totalErr ); } else { errfix2.SetPointError(i, 0, 0, y[i] - 0.01, 2.*totalErr ); } /* std::cout << x[i] << " " << y[i] << " " << " ,pdf get Val: " << pdf->getVal() << " ,pdf get Prop Err: " << pdf->getPropagatedError(*res)*NtotalFit << " stat uncertainty: " << TMath::Sqrt(y[i]) << " Ntot: " << NtotalFit << std::endl; */ } errfix.SetFillColor(kYellow); errfix2.SetFillColor(kGreen); //pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kGreen),RooFit::Range("Full"), RooFit::VisualizeError(*res,2.0,kFALSE)); //pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kYellow),RooFit::Range("Full"), RooFit::VisualizeError(*res,1.0,kFALSE)); //pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kGreen),RooFit::Range("Full"), RooFit::VisualizeError(*res,2.0,kTRUE)); //pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kYellow),RooFit::Range("Full"), RooFit::VisualizeError(*res,1.0,kTRUE)); plot->addObject(&errfix,"4"); plot->addObject(&errfix2,"4"); plot->addObject(&errfix,"4"); data->plotOn(plot); TBox blindBox(121,plot->GetMinimum()-(plot->GetMaximum()-plot->GetMinimum())*0.015,130,plot->GetMaximum()); blindBox.SetFillColor(kGray); if(blind) { plot->addObject(&blindBox); pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kGreen),RooFit::Range("Full"), RooFit::VisualizeError(*res,2.0,kTRUE)); pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::FillColor(kYellow),RooFit::Range("Full"), RooFit::VisualizeError(*res,1.0,kTRUE)); } //plot->addObject(&errfix,"4"); //data->plotOn(plot); //pdf->plotOn(plot,RooFit::Normalization( norm ) ); //pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::Range("Full"),RooFit::LineWidth(1.5) ); pdf->plotOn(plot,RooFit::NormRange( "low,high" ),RooFit::Range("Full"), RooFit::LineWidth(1)); data->plotOn(plot); /* pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::Range("all"),RooFit::LineWidth(0.8) ); //pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::FillColor(kGreen),RooFit::Range("all"), RooFit::VisualizeError(*res,2.0,kFALSE)); //pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::FillColor(kYellow),RooFit::Range("all"), RooFit::VisualizeError(*res,1.0,kFALSE)); pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::FillColor(kGreen),RooFit::Range("all"), RooFit::VisualizeError(*res,2.0,kTRUE)); pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::FillColor(kYellow),RooFit::Range("all"), RooFit::VisualizeError(*res,1.0,kTRUE)); data->plotOn(plot); pdf->plotOn(plot,RooFit::Normalization(norm),RooFit::Range("all"),RooFit::LineWidth(0.8) ); */ TLatex lbl0(0.1,0.96,"CMS Preliminary"); lbl0.SetNDC(); lbl0.SetTextSize(0.042); plot->addObject(&lbl0); TLatex lbl(0.4,0.96,Form("%s Box",cats[iCat].Data())); lbl.SetNDC(); lbl.SetTextSize(0.042); plot->addObject(&lbl); TLatex lbl2(0.6,0.96,"#sqrt{s}=8 TeV L = 19.78 fb^{-1}"); lbl2.SetNDC(); lbl2.SetTextSize(0.042); plot->addObject(&lbl2); int iObj=-1; TNamed *obj; while( (obj = (TNamed*)plot->getObject(++iObj)) ) { obj->SetName(Form("Object_%d",iObj)); } plot->Draw(); TString tag = (blind ? "_BLIND" : ""); cv.SaveAs(folderName+"/figs/mgg_data_"+cats[iCat]+tag+TString(Form("_%0.0f_%0.0f",min,max))+".png"); cv.SaveAs(folderName+"/figs/mgg_data_"+cats[iCat]+tag+TString(Form("_%0.0f_%0.0f",min,max))+".pdf"); cv.SaveAs(folderName+"/figs/mgg_data_"+cats[iCat]+tag+TString(Form("_%0.0f_%0.0f",min,max))+".C"); } }
void plot( TString var, TString data, TString pdf, double low=-1, double high=-1 ) { TFile *tf = TFile::Open( "root/FitOut.root" ); RooWorkspace *w = (RooWorkspace*)tf->Get("w"); TCanvas *canv = new TCanvas("c","c",800,800); TPad *upperPad = new TPad(Form("%s_upper",canv->GetName()),"",0.,0.33,1.,1.); TPad *lowerPad = new TPad(Form("%s_lower",canv->GetName()),"",0.,0.,1.,0.33); canv->cd(); upperPad->Draw(); lowerPad->Draw(); if ( low < 0 ) low = w->var(var)->getMin(); if ( high < 0 ) high = w->var(var)->getMax(); RooPlot *plot = w->var(var)->frame(Range(low,high)); w->data(data)->plotOn(plot); w->pdf(pdf)->plotOn(plot); RooHist *underHist = plot->pullHist(); underHist->GetXaxis()->SetRangeUser(plot->GetXaxis()->GetXmin(), plot->GetXaxis()->GetXmax()); underHist->GetXaxis()->SetTitle(plot->GetXaxis()->GetTitle()); underHist->GetYaxis()->SetTitle("Pull"); underHist->GetXaxis()->SetLabelSize(0.12); underHist->GetYaxis()->SetLabelSize(0.12); underHist->GetXaxis()->SetTitleSize(0.2); underHist->GetXaxis()->SetTitleOffset(0.7); underHist->GetYaxis()->SetTitleSize(0.18); underHist->GetYaxis()->SetTitleOffset(0.38); plot->GetXaxis()->SetTitle(""); upperPad->SetBottomMargin(0.1); upperPad->cd(); plot->Draw(); canv->cd(); lowerPad->SetTopMargin(0.05); lowerPad->SetBottomMargin(0.35); lowerPad->cd(); underHist->Draw("AP"); double ymin = underHist->GetYaxis()->GetXmin(); double ymax = underHist->GetYaxis()->GetXmax(); double yrange = Max( Abs( ymin ), Abs( ymax ) ); underHist->GetYaxis()->SetRangeUser( -1.*yrange, 1.*yrange ); double xmin = plot->GetXaxis()->GetXmin(); double xmax = plot->GetXaxis()->GetXmax(); TColor *mycol3sig = gROOT->GetColor( kGray ); mycol3sig->SetAlpha(0.5); TColor *mycol2sig = gROOT->GetColor( kGray+1 ); mycol2sig->SetAlpha(0.5); TColor *mycol1sig = gROOT->GetColor( kGray+2 ); mycol1sig->SetAlpha(0.5); TBox box3sig; box3sig.SetFillColor( mycol3sig->GetNumber() ); //box3sig.SetFillColorAlpha( kGray, 0.5 ); box3sig.SetFillStyle(1001); box3sig.DrawBox( xmin, -3., xmax, 3.); TBox box2sig; box2sig.SetFillColor( mycol2sig->GetNumber() ); //box2sig.SetFillColorAlpha( kGray+1, 0.5 ); box2sig.SetFillStyle(1001); box2sig.DrawBox( xmin, -2., xmax, 2.); TBox box1sig; box1sig.SetFillColor( mycol1sig->GetNumber() ); //box1sig.SetFillColorAlpha( kGray+2, 0.5 ); box1sig.SetFillStyle(1001); box1sig.DrawBox( xmin, -1., xmax, 1.); TLine lineErr; lineErr.SetLineWidth(1); lineErr.SetLineColor(kBlue-9); lineErr.SetLineStyle(2); lineErr.DrawLine(plot->GetXaxis()->GetXmin(),1.,plot->GetXaxis()->GetXmax(),1.); lineErr.DrawLine(plot->GetXaxis()->GetXmin(),-1.,plot->GetXaxis()->GetXmax(),-1.); lineErr.DrawLine(plot->GetXaxis()->GetXmin(),2.,plot->GetXaxis()->GetXmax(),2.); lineErr.DrawLine(plot->GetXaxis()->GetXmin(),-2.,plot->GetXaxis()->GetXmax(),-2.); lineErr.DrawLine(plot->GetXaxis()->GetXmin(),3.,plot->GetXaxis()->GetXmax(),3.); lineErr.DrawLine(plot->GetXaxis()->GetXmin(),-3.,plot->GetXaxis()->GetXmax(),-3.); TLine line; line.SetLineWidth(3); line.SetLineColor(kBlue); line.DrawLine(plot->GetXaxis()->GetXmin(),0.,plot->GetXaxis()->GetXmax(),0.); underHist->Draw("Psame"); RooHist *redPull = new RooHist(); int newp=0; for (int p=0; p<underHist->GetN(); p++) { double x,y; underHist->GetPoint(p,x,y); if ( TMath::Abs(y)>3 ) { redPull->SetPoint(newp,x,y); redPull->SetPointError(newp,0.,0.,underHist->GetErrorYlow(p),underHist->GetErrorYhigh(p)); newp++; } } redPull->SetLineWidth(underHist->GetLineWidth()); redPull->SetMarkerStyle(underHist->GetMarkerStyle()); redPull->SetMarkerSize(underHist->GetMarkerSize()); redPull->SetLineColor(kRed); redPull->SetMarkerColor(kRed); redPull->Draw("Psame"); canv->Print(Form("tmp/%s.pdf",var.Data())); tf->Close(); }
void StandardBayesianNumericalDemo(const char* infile = "", const char* workspaceName = "combined", const char* modelConfigName = "ModelConfig", const char* dataName = "obsData") { // option definitions double confLevel = optBayes.confLevel; TString integrationType = optBayes.integrationType; int nToys = optBayes.nToys; bool scanPosterior = optBayes.scanPosterior; int nScanPoints = optBayes.nScanPoints; int intervalType = optBayes.intervalType; int maxPOI = optBayes.maxPOI; double nSigmaNuisance = optBayes.nSigmaNuisance; ///////////////////////////////////////////////////////////// // 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; } ///////////////////////////////////////////// // create and use the BayesianCalculator // to find and plot the 95% credible interval // on the parameter of interest as specified // in the model config // before we do that, we must specify our prior // it belongs in the model config, but it may not have // been specified RooUniform prior("prior","",*mc->GetParametersOfInterest()); w->import(prior); mc->SetPriorPdf(*w->pdf("prior")); // do without systematics //mc->SetNuisanceParameters(RooArgSet() ); if (nSigmaNuisance > 0) { RooAbsPdf * pdf = mc->GetPdf(); assert(pdf); RooFitResult * res = pdf->fitTo(*data, Save(true), Minimizer(ROOT::Math::MinimizerOptions::DefaultMinimizerType().c_str()), Hesse(true), PrintLevel(ROOT::Math::MinimizerOptions::DefaultPrintLevel()-1) ); res->Print(); RooArgList nuisPar(*mc->GetNuisanceParameters()); for (int i = 0; i < nuisPar.getSize(); ++i) { RooRealVar * v = dynamic_cast<RooRealVar*> (&nuisPar[i] ); assert( v); v->setMin( TMath::Max( v->getMin(), v->getVal() - nSigmaNuisance * v->getError() ) ); v->setMax( TMath::Min( v->getMax(), v->getVal() + nSigmaNuisance * v->getError() ) ); std::cout << "setting interval for nuisance " << v->GetName() << " : [ " << v->getMin() << " , " << v->getMax() << " ]" << std::endl; } } BayesianCalculator bayesianCalc(*data,*mc); bayesianCalc.SetConfidenceLevel(confLevel); // 95% interval // default of the calculator is central interval. here use shortest , central or upper limit depending on input // doing a shortest interval might require a longer time since it requires a scan of the posterior function if (intervalType == 0) bayesianCalc.SetShortestInterval(); // for shortest interval if (intervalType == 1) bayesianCalc.SetLeftSideTailFraction(0.5); // for central interval if (intervalType == 2) bayesianCalc.SetLeftSideTailFraction(0.); // for upper limit if (!integrationType.IsNull() ) { bayesianCalc.SetIntegrationType(integrationType); // set integrationType bayesianCalc.SetNumIters(nToys); // set number of ietrations (i.e. number of toys for MC integrations) } // in case of toyMC make a nnuisance pdf if (integrationType.Contains("TOYMC") ) { RooAbsPdf * nuisPdf = RooStats::MakeNuisancePdf(*mc, "nuisance_pdf"); cout << "using TOYMC integration: make nuisance pdf from the model " << std::endl; nuisPdf->Print(); bayesianCalc.ForceNuisancePdf(*nuisPdf); scanPosterior = true; // for ToyMC the posterior is scanned anyway so used given points } // compute interval by scanning the posterior function if (scanPosterior) bayesianCalc.SetScanOfPosterior(nScanPoints); RooRealVar* poi = (RooRealVar*) mc->GetParametersOfInterest()->first(); if (maxPOI != -999 && maxPOI > poi->getMin()) poi->setMax(maxPOI); SimpleInterval* interval = bayesianCalc.GetInterval(); // print out the iterval on the first Parameter of Interest cout << "\n>>>> RESULT : " << confLevel*100 << "% interval on " << poi->GetName()<<" is : ["<< interval->LowerLimit() << ", "<< interval->UpperLimit() <<"] "<<endl; // make a plot // since plotting may take a long time (it requires evaluating // the posterior in many points) this command will speed up // by reducing the number of points to plot - do 50 // ignore errors of PDF if is zero RooAbsReal::setEvalErrorLoggingMode(RooAbsReal::Ignore) ; cout << "\nDrawing plot of posterior function....." << endl; // always plot using numer of scan points bayesianCalc.SetScanOfPosterior(nScanPoints); RooPlot * plot = bayesianCalc.GetPosteriorPlot(); plot->Draw(); }
void StandardProfileLikelihoodDemo(const char* infile = "", const char* workspaceName = "combined", const char* modelConfigName = "ModelConfig", const char* dataName = "obsData"){ double confLevel = optPL.confLevel; double nScanPoints = optPL.nScanPoints; bool plotAsTF1 = optPL.plotAsTF1; double poiXMin = optPL.poiMinPlot; double poiXMax = optPL.poiMaxPlot; bool doHypoTest = optPL.doHypoTest; double nullParamValue = optPL.nullValue; // ------------------------------------------------------- // 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; } // --------------------------------------------- // create and use the ProfileLikelihoodCalculator // to find and plot the 95% confidence interval // on the parameter of interest as specified // in the model config ProfileLikelihoodCalculator pl(*data,*mc); pl.SetConfidenceLevel(confLevel); // 95% interval LikelihoodInterval* interval = pl.GetInterval(); // print out the interval on the first Parameter of Interest RooRealVar* firstPOI = (RooRealVar*) mc->GetParametersOfInterest()->first(); cout << "\n>>>> RESULT : " << confLevel*100 << "% interval on " <<firstPOI->GetName()<<" is : ["<< interval->LowerLimit(*firstPOI) << ", "<< interval->UpperLimit(*firstPOI) <<"]\n "<<endl; // make a plot cout << "making a plot of the profile likelihood function ....(if it is taking a lot of time use less points or the TF1 drawing option)\n"; LikelihoodIntervalPlot plot(interval); plot.SetNPoints(nScanPoints); // do not use too many points, it could become very slow for some models if (poiXMin < poiXMax) plot.SetRange(poiXMin, poiXMax); TString opt; if (plotAsTF1) opt += TString("tf1"); plot.Draw(opt); // use option TF1 if too slow (plot.Draw("tf1") // if requested perform also an hypothesis test for the significance if (doHypoTest) { RooArgSet nullparams("nullparams"); nullparams.addClone(*firstPOI); nullparams.setRealValue(firstPOI->GetName(), nullParamValue); pl.SetNullParameters(nullparams); std::cout << "Perform Test of Hypothesis : null Hypothesis is " << firstPOI->GetName() << nullParamValue << std::endl; auto result = pl.GetHypoTest(); std::cout << "\n>>>> Hypotheis Test Result \n"; result->Print(); } }
void FitterUtilsSimultaneousExpOfPolyTimesX::fit(bool wantplot, bool constPartReco, double fracPartReco_const, ofstream& out, TTree* t, bool update, string plotsfile) { //***************Get the PDFs from the workspace TFile fw(workspacename.c_str()); RooWorkspace* workspace = (RooWorkspace*)fw.Get("workspace"); RooRealVar *B_plus_M = workspace->var("B_plus_M"); RooRealVar *misPT = workspace->var("misPT"); RooRealVar *l1Kee = workspace->var("l1Kee"); RooRealVar *l2Kee = workspace->var("l2Kee"); RooRealVar *l3Kee = workspace->var("l3Kee"); RooRealVar *l4Kee = workspace->var("l4Kee"); RooRealVar *l5Kee = workspace->var("l5Kee"); RooRealVar *l1KeeGen = workspace->var("l1KeeGen"); RooRealVar *l2KeeGen = workspace->var("l2KeeGen"); RooRealVar *l3KeeGen = workspace->var("l3KeeGen"); RooRealVar *l4KeeGen = workspace->var("l4KeeGen"); RooRealVar *l5KeeGen = workspace->var("l5KeeGen"); RooRealVar *fractionalErrorJpsiLeak = workspace->var("fractionalErrorJpsiLeak"); RooRealVar l1Kemu(*l1Kee); l1Kemu.SetName("l1Kemu"); l1Kemu.SetTitle("l1Kemu"); RooRealVar l2Kemu(*l2Kee); l2Kemu.SetName("l2Kemu"); l2Kemu.SetTitle("l2Kemu"); RooRealVar l3Kemu(*l3Kee); l3Kemu.SetName("l3Kemu"); l3Kemu.SetTitle("l3Kemu"); RooRealVar l4Kemu(*l4Kee); l4Kemu.SetName("l4Kemu"); l4Kemu.SetTitle("l4Kemu"); RooRealVar l5Kemu(*l5Kee); l5Kemu.SetName("l5Kemu"); l5Kemu.SetTitle("l5Kemu"); RooHistPdf *histPdfSignalZeroGamma = (RooHistPdf *) workspace->pdf("histPdfSignalZeroGamma"); RooHistPdf *histPdfSignalOneGamma = (RooHistPdf *) workspace->pdf("histPdfSignalOneGamma"); RooHistPdf *histPdfSignalTwoGamma = (RooHistPdf *) workspace->pdf("histPdfSignalTwoGamma"); RooHistPdf *histPdfPartReco = (RooHistPdf *) workspace->pdf("histPdfPartReco"); RooHistPdf *histPdfJpsiLeak(0); if(nGenJpsiLeak>0) histPdfJpsiLeak = (RooHistPdf *) workspace->pdf("histPdfJpsiLeak"); //Here set in the Kemu PDF the parameters that have to be shared RooExpOfPolyTimesX* combPDF = new RooExpOfPolyTimesX("combPDF", "combPDF", *B_plus_M, *misPT, *l1Kee, *l2Kee, *l3Kee, *l4Kee, *l5Kee); RooExpOfPolyTimesX* KemuPDF = new RooExpOfPolyTimesX("kemuPDF", "kemuPDF", *B_plus_M, *misPT, l1Kemu, *l2Kee, *l3Kee, *l4Kee, *l5Kee); RooWorkspace* workspaceGen = (RooWorkspace*)fw.Get("workspaceGen"); RooDataSet* dataGenSignalZeroGamma = (RooDataSet*)workspaceGen->data("dataGenSignalZeroGamma"); RooDataSet* dataGenSignalOneGamma = (RooDataSet*)workspaceGen->data("dataGenSignalOneGamma"); RooDataSet* dataGenSignalTwoGamma = (RooDataSet*)workspaceGen->data("dataGenSignalTwoGamma"); RooDataSet* dataGenPartReco = (RooDataSet*)workspaceGen->data("dataGenPartReco"); RooDataSet* dataGenComb = (RooDataSet*)workspaceGen->data("dataGenComb"); RooDataSet* dataGenKemu = (RooDataSet*)workspaceGen->data("dataGenKemu"); RooDataSet* dataGenJpsiLeak(0); if(nGenJpsiLeak>0) dataGenJpsiLeak = (RooDataSet*)workspaceGen->data("dataGenJpsiLeak"); if(wantplot) { //**************Must get the datasets RooDataSet* dataSetSignalZeroGamma = (RooDataSet*)workspace->data("dataSetSignalZeroGamma"); RooDataSet* dataSetSignalOneGamma = (RooDataSet*)workspace->data("dataSetSignalOneGamma"); RooDataSet* dataSetSignalTwoGamma = (RooDataSet*)workspace->data("dataSetSignalTwoGamma"); RooDataSet* dataSetPartReco = (RooDataSet*)workspace->data("dataSetPartReco"); RooDataSet* dataSetComb = (RooDataSet*)workspace->data("dataSetComb"); RooDataSet* dataSetJpsiLeak = (RooDataSet*)workspace->data("dataSetJpsiLeak"); //**************Plot all the different components cout<<"dataGenSignalZeroGamma: "<<dataGenSignalZeroGamma<<endl; PlotShape(*dataSetSignalZeroGamma, *dataGenSignalZeroGamma, *histPdfSignalZeroGamma, plotsfile, "cSignalZeroGamma", *B_plus_M, *misPT); PlotShape(*dataSetSignalOneGamma, *dataGenSignalOneGamma, *histPdfSignalOneGamma, plotsfile, "cSignalOneGamma", *B_plus_M, *misPT); PlotShape(*dataSetSignalTwoGamma, *dataGenSignalTwoGamma, *histPdfSignalTwoGamma, plotsfile, "cSignalTwoGamma", *B_plus_M, *misPT); PlotShape(*dataSetPartReco, *dataGenPartReco, *histPdfPartReco, plotsfile, "cPartReco", *B_plus_M, *misPT); PlotShape(*dataSetComb, *dataGenComb, *combPDF, plotsfile, "cComb", *B_plus_M, *misPT); if(nGenJpsiLeak>1) PlotShape(*dataSetJpsiLeak, *dataGenJpsiLeak, *histPdfJpsiLeak, plotsfile, "cJpsiLeak", *B_plus_M, *misPT); } //***************Merge datasets RooDataSet* dataGenTot(dataGenPartReco); dataGenTot->append(*dataGenSignalZeroGamma); dataGenTot->append(*dataGenSignalOneGamma); dataGenTot->append(*dataGenSignalTwoGamma); dataGenTot->append(*dataGenComb); if(nGenJpsiLeak>0) dataGenTot->append(*dataGenJpsiLeak); //**************Create index category and join samples RooCategory category("category", "category"); category.defineType("Kee"); category.defineType("Kemu"); RooDataSet dataGenSimultaneous("dataGenSimultaneous", "dataGenSimultaneous", RooArgSet(*B_plus_M, *misPT), Index(category), Import("Kee", *dataGenTot), Import("Kemu", *dataGenKemu)); //**************Prepare fitting function RooRealVar nSignal("nSignal", "#signal events", 1.*nGenSignal, nGenSignal-7*sqrt(nGenSignal), nGenSignal+7*sqrt(nGenSignal)); RooRealVar nPartReco("nPartReco", "#nPartReco", 1.*nGenPartReco, nGenPartReco-7*sqrt(nGenPartReco), nGenPartReco+7*sqrt(nGenPartReco)); RooRealVar nComb("nComb", "#nComb", 1.*nGenComb, nGenComb-7*sqrt(nGenComb), nGenComb+7*sqrt(nGenComb)); RooRealVar nKemu("nKemu", "#nKemu", 1.*nGenKemu, nGenKemu-7*sqrt(nGenKemu), nGenKemu+7*sqrt(nGenKemu)); RooRealVar nJpsiLeak("nJpsiLeak", "#nJpsiLeak", 1.*nGenJpsiLeak, nGenJpsiLeak-7*sqrt(nGenJpsiLeak), nGenJpsiLeak+7*sqrt(nGenJpsiLeak)); RooRealVar fracZero("fracZero", "fracZero",0.5,0,1); RooRealVar fracOne("fracOne", "fracOne",0.5, 0,1); RooFormulaVar fracPartReco("fracPartReco", "nPartReco/nSignal", RooArgList(nPartReco,nSignal)); RooFormulaVar fracOneRec("fracOneRec", "(1-fracZero)*fracOne", RooArgList(fracZero, fracOne)); RooAddPdf histPdfSignal("histPdfSignal", "histPdfSignal", RooArgList(*histPdfSignalZeroGamma, *histPdfSignalOneGamma, *histPdfSignalTwoGamma), RooArgList(fracZero, fracOneRec)); RooArgList pdfList(histPdfSignal, *histPdfPartReco, *combPDF); RooArgList yieldList(nSignal, nPartReco, nComb); if(nGenJpsiLeak>0) { pdfList.add(*histPdfJpsiLeak); yieldList.add(nJpsiLeak); } RooAddPdf totPdf("totPdf", "totPdf", pdfList, yieldList); RooExtendPdf totKemuPdf("totKemuPdf", "totKemuPdf", *KemuPDF, nKemu); //**************** Prepare simultaneous PDF RooSimultaneous simPdf("simPdf", "simPdf", category); simPdf.addPdf(totPdf, "Kee"); simPdf.addPdf(totKemuPdf, "Kemu"); //**************** Constrain the fraction of zero and one photon int nGenSignalZeroGamma(floor(nGenFracZeroGamma*nGenSignal)); int nGenSignalOneGamma(floor(nGenFracOneGamma*nGenSignal)); int nGenSignalTwoGamma(floor(nGenSignal-nGenSignalZeroGamma-nGenSignalOneGamma)); RooRealVar fracZeroConstMean("fracZeroConstMean", "fracZeroConstMean", nGenSignalZeroGamma*1./nGenSignal); RooRealVar fracZeroConstSigma("fracZeroConstSigma", "fracZeroConstSigma", sqrt(nGenSignalZeroGamma)/nGenSignal); RooGaussian fracZeroConst("fracZeroConst", "fracZeroConst", fracZero, fracZeroConstMean, fracZeroConstSigma); RooRealVar fracOneConstMean("fracOneConstMean", "fracOneConstMean", nGenSignalOneGamma*1./nGenSignal/(1-fracZeroConstMean.getVal())); RooRealVar fracOneConstSigma("fracOneConstSigma", "fracOneConstSigma", sqrt(nGenSignalOneGamma)/nGenSignal/(1-fracZeroConstMean.getVal())); RooGaussian fracOneConst("fracOneConst", "fracOneConst", fracOne, fracOneConstMean, fracOneConstSigma); RooRealVar fracPartRecoMean("fracPartRecoMean", "fracPartRecoMean", nGenPartReco/(1.*nGenSignal)); RooRealVar fracPartRecoSigma("fracPartRecoSigma", "fracPartRecoSigma", fracPartReco_const*fracPartRecoMean.getVal()); RooGaussian fracPartRecoConst("fracPartRecoConst", "fracPartRecoConst", fracPartReco, fracPartRecoMean, fracPartRecoSigma); RooRealVar JpsiLeakMean("JpsiLeakMean", "JpsiLeakMean", nGenJpsiLeak); RooRealVar JpsiLeakSigma("JpsiLeakSigma", "JpsiLeakSigma", nGenJpsiLeak*fractionalErrorJpsiLeak->getVal()); RooGaussian JpsiLeakConst("JpsiLeakConst", "JpsiLeakConst", nJpsiLeak, JpsiLeakMean, JpsiLeakSigma); //**************** fit RooAbsReal::defaultIntegratorConfig()->setEpsAbs(1e-8) ; RooAbsReal::defaultIntegratorConfig()->setEpsRel(1e-8) ; initiateParams(nGenSignalZeroGamma, nGenSignalOneGamma, nGenSignalTwoGamma, nKemu, nSignal, nPartReco, nComb, fracZero, fracOne, nJpsiLeak, constPartReco, fracPartRecoSigma, *l1Kee, *l2Kee, *l3Kee, *l4Kee, *l5Kee, l1Kemu, l2Kemu, l3Kemu, l4Kemu, l5Kemu, *l1KeeGen, *l2KeeGen, *l3KeeGen, *l4KeeGen, *l5KeeGen); RooArgSet constraints(fracZeroConst, fracOneConst); if (constPartReco) constraints.add(fracPartRecoConst); if(nGenJpsiLeak>0) constraints.add(JpsiLeakConst); RooAbsReal* nll = simPdf.createNLL(dataGenSimultaneous, Extended(), ExternalConstraints(constraints)); RooMinuit minuit(*nll); minuit.setStrategy(2); int migradRes(1); int hesseRes(4); vector<int> migradResVec; vector<int> hesseResVec; double edm(10); int nrefit(0); RooFitResult* fitRes(0); vector<RooFitResult*> fitResVec; bool hasConverged(false); for(int i(0); (i<15) && !hasConverged ; ++i) { initiateParams(nGenSignalZeroGamma, nGenSignalOneGamma, nGenSignalTwoGamma, nKemu, nSignal, nPartReco, nComb, fracZero, fracOne, nJpsiLeak, constPartReco, fracPartRecoSigma, *l1Kee, *l2Kee, *l3Kee, *l4Kee, *l5Kee, l1Kemu, l2Kemu, l3Kemu, l4Kemu, l5Kemu, *l1KeeGen, *l2KeeGen, *l3KeeGen, *l4KeeGen, *l5KeeGen); cout<<"FITTING: starting with nsignal = "<<nSignal.getValV()<<" refit nbr. "<<i<<endl; //if(fitRes != NULL && fitRes != 0) delete fitRes; migradRes = minuit.migrad(); hesseRes = minuit.hesse(); fitRes = minuit.save(); edm = fitRes->edm(); fitResVec.push_back(fitRes); migradResVec.push_back(migradRes); hesseResVec.push_back(hesseRes); if( migradRes == 0 && hesseRes == 0 && edm < 1e-3 ) hasConverged = true; ++nrefit; cout<<"Fitting nbr "<<i<<" done. Hesse: "<<hesseRes<<" migrad: "<<migradRes<<" edm: "<<edm<<" minNll: "<<fitRes->minNll()<<endl; } if(!hasConverged) { double minNll(1e20); int minIndex(-1); for(unsigned int i(0); i<fitResVec.size(); ++i) { if( fitResVec.at(i)->minNll() < minNll) { minIndex = i; minNll = fitResVec[i]->minNll(); } } migradRes = migradResVec.at(minIndex); hesseRes = hesseResVec.at(minIndex); cout<<"Fit not converged, choose fit "<<minIndex<<". Hesse: "<<hesseRes<<" migrad: "<<migradRes<<" edm: "<<edm<<" minNll: "<<fitRes->minNll()<<endl; } fillTreeResult(t, fitRes, update, migradRes, hesseRes, hasConverged); for(unsigned int i(0); i<fitResVec.size(); ++i) delete fitResVec.at(i); //totPdf.fitTo(*dataGenTot, Extended(), Save(), Warnings(false)); //*************** output fit status int w(12); out<<setw(w)<<migradRes<<setw(w)<<hesseRes<<setw(w)<<edm<<setw(w)<<nrefit<<endl; if(wantplot) plot_fit_result(plotsfile, totPdf, *dataGenTot); if(wantplot) plot_kemu_fit_result(plotsfile, totKemuPdf, *dataGenKemu); fw.Close(); //delete and return delete nll; delete workspace; delete workspaceGen; delete combPDF; delete KemuPDF; }
void drawCtauMass2DPlot(RooWorkspace& myws, // Local workspace string outputDir, // Output directory struct KinCuts cut, // Variable with current kinematic cuts string plotLabel, // The label used to define the output file name // Select the type of datasets to fit string DSTAG, // Specifies the type of datasets: i.e, DATA, MCJPSINP, ... bool isPbPb, // Define if it is PbPb (True) or PP (False)\ // Select the drawing options map<string, double> binWidth={} // User-defined Location of the fit results ) { gStyle->SetOptStat(0); if (DSTAG.find("_")!=std::string::npos) DSTAG.erase(DSTAG.find("_")); double minRangeCtau = -0.5; double maxRangeCtau = 2.0; int nBinsCtau = min(int( round((maxRangeCtau - minRangeCtau)/binWidth["CTAU"]*2) ), 1000); // myws.var("ctau")->setBin(nBinsCtau, Binning(nBinsCtau, minRangeCtau, maxRangeCtau)); double minRangeMass = cut.dMuon.M.Min; double maxRangeMass = cut.dMuon.M.Max; int nBinsMass = min(int( round((maxRangeMass - minRangeMass)/binWidth["MASS"]) ), 1000); // myws.var("invMass")->setBin(nBinsCtau, Binning(nBinsCtau, minRangeCtau, maxRangeCtau)); string pdfTotName = Form("pdfCTAUMASS_Tot_%s", (isPbPb?"PbPb":"PP")); TH1* hPDF = ((RooAbsReal*)myws.pdf(pdfTotName.c_str()))->createHistogram("PDF 2D",*myws.var("ctau"), Extended(kTRUE), Binning(nBinsCtau, minRangeCtau, maxRangeCtau), YVar(*myws.var("invMass"), Binning(nBinsMass, minRangeMass, maxRangeMass))); string dsOSName = Form("dOS_%s_%s", DSTAG.c_str(), (isPbPb?"PbPb":"PP")); TH1* hDATA = ((RooDataSet*)myws.data(dsOSName.c_str()))->createHistogram("DATA 2D",*myws.var("ctau"), Binning(nBinsCtau, minRangeCtau, maxRangeCtau), YVar(*myws.var("invMass"), Binning(nBinsMass, minRangeMass, maxRangeMass))); // Create the main canvas TCanvas *cFigPDF = new TCanvas(Form("cCtauMassPDF_%s", (isPbPb?"PbPb":"PP")), "cCtauMassPDF",2000,2000); cFigPDF->cd(); hPDF->GetYaxis()->CenterTitle(kTRUE); hPDF->GetYaxis()->SetTitleOffset(2.1); hPDF->GetYaxis()->SetTitleSize(0.035); hPDF->GetYaxis()->SetLabelSize(0.025); hPDF->GetYaxis()->SetTitle("Mass [GeV/c]"); hPDF->GetXaxis()->CenterTitle(kTRUE); hPDF->GetXaxis()->SetTitleOffset(2.1); hPDF->GetXaxis()->SetTitleSize(0.035); hPDF->GetXaxis()->SetLabelSize(0.025); hPDF->GetXaxis()->SetTitle("#font[12]{l}_{J/#psi} (mm)"); hPDF->GetZaxis()->SetTitleOffset(2.0); hPDF->GetZaxis()->SetTitleSize(0.035); hPDF->GetZaxis()->SetLabelSize(0.025); hPDF->GetYaxis()->SetRangeUser(minRangeMass, maxRangeMass); hPDF->GetXaxis()->SetRangeUser(minRangeCtau, maxRangeCtau); cFigPDF->SetLogz(kTRUE); hPDF->Draw("LEGO2"); gSystem->mkdir(Form("%sctauMass/%s/plot/pdf2D/", outputDir.c_str(), DSTAG.c_str()), kTRUE); cFigPDF->SaveAs(Form("%sctauMass/%s/plot/pdf2D/PLOT_%s_%s_%s%s_pt%.0f%.0f_rap%.0f%.0f_cent%d%d.pdf", outputDir.c_str(), DSTAG.c_str(), "CTAUMASSPDF", DSTAG.c_str(), (isPbPb?"PbPb":"PP"), plotLabel.c_str(), (cut.dMuon.Pt.Min*10.0), (cut.dMuon.Pt.Max*10.0), (cut.dMuon.AbsRap.Min*10.0), (cut.dMuon.AbsRap.Max*10.0), cut.Centrality.Start, cut.Centrality.End)); cFigPDF->Clear(); cFigPDF->Close(); // Create the main canvas TCanvas *cFigDATA = new TCanvas(Form("cCtauMassPDF_%s", (isPbPb?"PbPb":"PP")), "cCtauMassPDF",2000,2000); cFigDATA->cd(); hDATA->GetYaxis()->CenterTitle(kTRUE); hDATA->GetYaxis()->SetTitleOffset(2.1); hDATA->GetYaxis()->SetTitleSize(0.035); hDATA->GetYaxis()->SetLabelSize(0.025); hDATA->GetYaxis()->SetTitle("Mass [GeV/c]"); hDATA->GetXaxis()->CenterTitle(kTRUE); hDATA->GetXaxis()->SetTitleOffset(2.1); hDATA->GetXaxis()->SetTitleSize(0.035); hDATA->GetXaxis()->SetLabelSize(0.025); hDATA->GetXaxis()->SetTitle("#font[12]{l}_{J/#psi} (mm)"); hDATA->GetZaxis()->SetTitleOffset(2.0); hDATA->GetZaxis()->SetTitleSize(0.035); hDATA->GetZaxis()->SetLabelSize(0.025); hDATA->GetYaxis()->SetRangeUser(minRangeMass, maxRangeMass); hDATA->GetXaxis()->SetRangeUser(minRangeCtau, maxRangeCtau); cFigDATA->SetLogz(kTRUE); hDATA->Draw("LEGO2"); gSystem->mkdir(Form("%sctauMass/%s/plot/pdf2D/", outputDir.c_str(), DSTAG.c_str()), kTRUE); cFigDATA->SaveAs(Form("%sctauMass/%s/plot/pdf2D/PLOT_%s_%s_%s%s_pt%.0f%.0f_rap%.0f%.0f_cent%d%d.pdf", outputDir.c_str(), DSTAG.c_str(), "CTAUMASSDATA", DSTAG.c_str(), (isPbPb?"PbPb":"PP"), plotLabel.c_str(), (cut.dMuon.Pt.Min*10.0), (cut.dMuon.Pt.Max*10.0), (cut.dMuon.AbsRap.Min*10.0), (cut.dMuon.AbsRap.Max*10.0), cut.Centrality.Start, cut.Centrality.End)); cFigDATA->Clear(); cFigDATA->Close(); delete hPDF; delete hDATA; };
void drawMassFrom2DPlot(RooWorkspace& myws, // Local workspace string outputDir, // Output directory struct InputOpt opt, // Variable with run information (kept for legacy purpose) struct KinCuts cut, // Variable with current kinematic cuts map<string, string> parIni, // Variable containing all initial parameters string plotLabel, // The label used to define the output file name // Select the type of datasets to fit string DSTAG, // Specifies the type of datasets: i.e, DATA, MCJPSINP, ... bool isPbPb, // Define if it is PbPb (True) or PP (False) // Select the type of object to fit bool incJpsi, // Includes Jpsi model bool incPsi2S, // Includes Psi(2S) model bool incBkg, // Includes Background model // Select the fitting options // Select the drawing options bool setLogScale, // Draw plot with log scale bool incSS, // Include Same Sign data double binWidth, // Bin width bool paperStyle=false // if true, print less info ) { RooMsgService::instance().getStream(0).removeTopic(Caching); RooMsgService::instance().getStream(1).removeTopic(Caching); RooMsgService::instance().getStream(0).removeTopic(Plotting); RooMsgService::instance().getStream(1).removeTopic(Plotting); RooMsgService::instance().getStream(0).removeTopic(Integration); RooMsgService::instance().getStream(1).removeTopic(Integration); RooMsgService::instance().setGlobalKillBelow(RooFit::WARNING) ; if (DSTAG.find("_")!=std::string::npos) DSTAG.erase(DSTAG.find("_")); int nBins = min(int( round((cut.dMuon.M.Max - cut.dMuon.M.Min)/binWidth) ), 1000); string pdfTotName = Form("pdfCTAUMASS_Tot_%s", (isPbPb?"PbPb":"PP")); string pdfJpsiPRName = Form("pdfCTAUMASS_JpsiPR_%s", (isPbPb?"PbPb":"PP")); string pdfJpsiNoPRName = Form("pdfCTAUMASS_JpsiNoPR_%s", (isPbPb?"PbPb":"PP")); string pdfPsi2SPRName = Form("pdfCTAUMASS_Psi2SPR_%s", (isPbPb?"PbPb":"PP")); string pdfPsi2SNoPRName = Form("pdfCTAUMASS_Psi2SNoPR_%s", (isPbPb?"PbPb":"PP")); string dsOSName = Form("dOS_%s_%s", DSTAG.c_str(), (isPbPb?"PbPb":"PP")); string dsOSNameCut = dsOSName+"_CTAUCUT"; string dsSSName = Form("dSS_%s_%s", DSTAG.c_str(), (isPbPb?"PbPb":"PP")); bool isWeighted = myws.data(dsOSName.c_str())->isWeighted(); bool isMC = (DSTAG.find("MC")!=std::string::npos); double normDSTot = 1.0; if (myws.data(dsOSNameCut.c_str())) { normDSTot = myws.data(dsOSName.c_str())->sumEntries()/myws.data(dsOSNameCut.c_str())->sumEntries(); } // Create the main plot of the fit RooPlot* frame = myws.var("invMass")->frame(Bins(nBins), Range(cut.dMuon.M.Min, cut.dMuon.M.Max)); myws.data(dsOSName.c_str())->plotOn(frame, Name("dOS"), DataError(RooAbsData::SumW2), XErrorSize(0), MarkerColor(kBlack), LineColor(kBlack), MarkerSize(1.2)); if (paperStyle) TGaxis::SetMaxDigits(3); // to display powers of 10 myws.pdf(pdfTotName.c_str())->plotOn(frame,Name("BKG"),Components(RooArgSet(*myws.pdf(Form("pdfMASS_Bkg_%s", (isPbPb?"PbPb":"PP"))))), FillStyle(paperStyle ? 0 : 1001), FillColor(kAzure-9), VLines(), DrawOption("LCF"), LineColor(kBlue), LineStyle(kDashed) ); if (!paperStyle) { if (incJpsi) { if ( myws.pdf(Form("pdfCTAUMASS_JpsiPR_%s", (isPbPb?"PbPb":"PP"))) ) { myws.pdf(pdfTotName.c_str())->plotOn(frame,Name("JPSIPR"),Components(RooArgSet(*myws.pdf(Form("pdfCTAUMASS_JpsiPR_%s", (isPbPb?"PbPb":"PP"))), *myws.pdf(Form("pdfCTAUMASS_Bkg_%s", (isPbPb?"PbPb":"PP"))))), ProjWData(RooArgSet(*myws.var("ctauErr")), *myws.data(dsOSName.c_str()), kTRUE), Normalization(normDSTot, RooAbsReal::NumEvent), LineColor(kRed+3), LineStyle(1), Precision(1e-4), NumCPU(32) ); } if ( myws.pdf(Form("pdfCTAUMASS_JpsiNoPR_%s", (isPbPb?"PbPb":"PP"))) ) { myws.pdf(pdfTotName.c_str())->plotOn(frame,Name("JPSINOPR"),Components(RooArgSet(*myws.pdf(Form("pdfCTAUMASS_JpsiNoPR_%s", (isPbPb?"PbPb":"PP"))), *myws.pdf(Form("pdfCTAUMASS_Bkg_%s", (isPbPb?"PbPb":"PP"))))), ProjWData(RooArgSet(*myws.var("ctauErr")), *myws.data(dsOSName.c_str()), kTRUE), Normalization(normDSTot, RooAbsReal::NumEvent), LineColor(kGreen+3), LineStyle(1), Precision(1e-4), NumCPU(32) ); } } if (incPsi2S) { if ( myws.pdf(Form("pdfCTAUMASS_Psi2SPR_%s", (isPbPb?"PbPb":"PP"))) ) { myws.pdf(pdfTotName.c_str())->plotOn(frame,Name("PSI2SPR"),Components(RooArgSet(*myws.pdf(Form("pdfCTAUMASS_Psi2SPR_%s", (isPbPb?"PbPb":"PP"))))), ProjWData(RooArgSet(*myws.var("ctauErr")), *myws.data(dsOSName.c_str()), kTRUE), Normalization(normDSTot, RooAbsReal::NumEvent), LineColor(kRed+3), LineStyle(1), Precision(1e-4), NumCPU(32) ); } if ( myws.pdf(Form("pdfCTAUMASS_Psi2SNoPR_%s", (isPbPb?"PbPb":"PP"))) ) { myws.pdf(pdfTotName.c_str())->plotOn(frame,Name("PSI2SNOPR"),Components(RooArgSet(*myws.pdf(Form("pdfCTAUMASS_Psi2SNoPR_%s", (isPbPb?"PbPb":"PP"))))), ProjWData(RooArgSet(*myws.var("ctauErr")), *myws.data(dsOSName.c_str()), kTRUE), Normalization(normDSTot, RooAbsReal::NumEvent), LineColor(kGreen+3), LineStyle(1), Precision(1e-4), NumCPU(32) ); } } } if (incSS) { myws.data(dsSSName.c_str())->plotOn(frame, Name("dSS"), MarkerColor(kRed), LineColor(kRed), MarkerSize(1.2)); } myws.data(dsOSName.c_str())->plotOn(frame, Name("dOS"), DataError(RooAbsData::SumW2), XErrorSize(0), MarkerColor(kBlack), LineColor(kBlack), MarkerSize(1.2)); myws.pdf(pdfTotName.c_str())->plotOn(frame,Name("PDF"), ProjWData(RooArgSet(*myws.var("ctauErr")), *myws.data(dsOSName.c_str()), kTRUE), Normalization(normDSTot, RooAbsReal::NumEvent), LineColor(kBlack), NumCPU(32) ); // Create the pull distribution of the fit RooPlot* frameTMP = (RooPlot*)frame->Clone("TMP"); int nBinsTMP = nBins; RooHist *hpull = frameTMP->pullHist(0, 0, true); hpull->SetName("hpull"); RooPlot* frame2 = myws.var("invMass")->frame(Title("Pull Distribution"), Bins(nBins), Range(cut.dMuon.M.Min, cut.dMuon.M.Max)); frame2->addPlotable(hpull, "PX"); // set the CMS style setTDRStyle(); // Create the main canvas TCanvas *cFig = new TCanvas(Form("cMassFig_%s", (isPbPb?"PbPb":"PP")), "cMassFig",800,800); TPad *pad1 = new TPad(Form("pad1_%s", (isPbPb?"PbPb":"PP")),"",0,paperStyle ? 0 : 0.23,1,1); TPad *pad2 = new TPad(Form("pad2_%s", (isPbPb?"PbPb":"PP")),"",0,0,1,.228); TLine *pline = new TLine(cut.dMuon.M.Min, 0.0, cut.dMuon.M.Max, 0.0); // TPad *pad4 = new TPad("pad4","This is pad4",0.55,0.46,0.97,0.87); TPad *pad4 = new TPad("pad4","This is pad4",0.55,paperStyle ? 0.29 : 0.36,0.97,paperStyle ? 0.70 : 0.77); pad4->SetFillStyle(0); pad4->SetLeftMargin(0.28); pad4->SetRightMargin(0.10); pad4->SetBottomMargin(0.21); pad4->SetTopMargin(0.072); frame->SetTitle(""); frame->GetXaxis()->CenterTitle(kTRUE); if (!paperStyle) { frame->GetXaxis()->SetTitle(""); frame->GetXaxis()->SetTitleSize(0.045); frame->GetXaxis()->SetTitleFont(42); frame->GetXaxis()->SetTitleOffset(3); frame->GetXaxis()->SetLabelOffset(3); frame->GetYaxis()->SetLabelSize(0.04); frame->GetYaxis()->SetTitleSize(0.04); frame->GetYaxis()->SetTitleOffset(1.7); frame->GetYaxis()->SetTitleFont(42); } else { frame->GetXaxis()->SetTitle("m_{#mu^{+}#mu^{-}} (GeV/c^{2})"); frame->GetXaxis()->SetTitleOffset(1.1); frame->GetYaxis()->SetTitleOffset(1.45); frame->GetXaxis()->SetTitleSize(0.05); frame->GetYaxis()->SetTitleSize(0.05); } setMassFrom2DRange(myws, frame, dsOSName, setLogScale); if (paperStyle) { double Ydown = 0.;//frame->GetMinimum(); double Yup = 0.9*frame->GetMaximum(); frame->GetYaxis()->SetRangeUser(Ydown,Yup); } cFig->cd(); pad2->SetTopMargin(0.02); pad2->SetBottomMargin(0.4); pad2->SetFillStyle(4000); pad2->SetFrameFillStyle(4000); if (!paperStyle) pad1->SetBottomMargin(0.015); //plot fit pad1->Draw(); pad1->cd(); frame->Draw(); printMassFrom2DParameters(myws, pad1, isPbPb, pdfTotName, isWeighted); pad1->SetLogy(setLogScale); // Drawing the text in the plot TLatex *t = new TLatex(); t->SetNDC(); t->SetTextSize(0.032); float dy = 0; t->SetTextSize(0.03); if (!paperStyle) { // do not print selection details for paper style t->DrawLatex(0.20, 0.86-dy, "2015 HI Soft Muon ID"); dy+=0.045; if (isPbPb) { t->DrawLatex(0.20, 0.86-dy, "HLT_HIL1DoubleMu0_v1"); dy+=2.0*0.045; } else { t->DrawLatex(0.20, 0.86-dy, "HLT_HIL1DoubleMu0_v1"); dy+=2.0*0.045; } } if (cut.dMuon.AbsRap.Min>0.1) {t->DrawLatex(0.5175, 0.86-dy, Form("%.1f < |y^{#mu#mu}| < %.1f",cut.dMuon.AbsRap.Min,cut.dMuon.AbsRap.Max)); dy+=0.045;} else {t->DrawLatex(0.5175, 0.86-dy, Form("|y^{#mu#mu}| < %.1f",cut.dMuon.AbsRap.Max)); dy+=0.045;} t->DrawLatex(0.5175, 0.86-dy, Form("%g < p_{T}^{#mu#mu} < %g GeV/c",cut.dMuon.Pt.Min,cut.dMuon.Pt.Max)); dy+=0.045; if (isPbPb) {t->DrawLatex(0.5175, 0.86-dy, Form("Cent. %d-%d%%", (int)(cut.Centrality.Start/2), (int)(cut.Centrality.End/2))); dy+=0.045;} // Drawing the Legend double ymin = 0.7602; if (incPsi2S && incJpsi && incSS) { ymin = 0.7202; } if (incPsi2S && incJpsi && !incSS) { ymin = 0.7452; } if (paperStyle) { ymin = 0.72; } TLegend* leg = new TLegend(0.5175, ymin, 0.7180, 0.8809); leg->SetTextSize(0.03); if (frame->findObject("dOS")) { leg->AddEntry(frame->findObject("dOS"), (incSS?"Opposite Charge":"Data"),"pe"); } if (incSS) { leg->AddEntry(frame->findObject("dSS"),"Same Charge","pe"); } if (frame->findObject("PDF")) { leg->AddEntry(frame->findObject("PDF"),"Total fit","l"); } if (frame->findObject("JPSIPR")) { leg->AddEntry(frame->findObject("JPSIPR"),"Prompt J/#psi","l"); } if (frame->findObject("JPSINOPR")) { leg->AddEntry(frame->findObject("JPSINOPR"),"Non-Prompt J/#psi","l"); } if (incBkg && frame->findObject("BKG")) { leg->AddEntry(frame->findObject("BKG"),"Background",paperStyle ? "l" : "fl"); } leg->Draw("same"); //Drawing the title TString label; if (isPbPb) { if (opt.PbPb.RunNb.Start==opt.PbPb.RunNb.End){ label = Form("PbPb Run %d", opt.PbPb.RunNb.Start); } else { label = Form("%s [%s %d-%d]", "PbPb", "HIOniaL1DoubleMu0", opt.PbPb.RunNb.Start, opt.PbPb.RunNb.End); } } else { if (opt.pp.RunNb.Start==opt.pp.RunNb.End){ label = Form("PP Run %d", opt.pp.RunNb.Start); } else { label = Form("%s [%s %d-%d]", "PP", "DoubleMu0", opt.pp.RunNb.Start, opt.pp.RunNb.End); } } // CMS_lumi(pad1, isPbPb ? 105 : 104, 33, label); CMS_lumi(pad1, isPbPb ? 108 : 107, 33, ""); if (!paperStyle) gStyle->SetTitleFontSize(0.05); pad1->Update(); cFig->cd(); if (!paperStyle) { //---plot pull pad2->Draw(); pad2->cd(); frame2->SetTitle(""); frame2->GetYaxis()->CenterTitle(kTRUE); frame2->GetYaxis()->SetTitleOffset(0.4); frame2->GetYaxis()->SetTitleSize(0.1); frame2->GetYaxis()->SetLabelSize(0.1); frame2->GetYaxis()->SetTitle("Pull"); frame2->GetXaxis()->CenterTitle(kTRUE); frame2->GetXaxis()->SetTitleOffset(1); frame2->GetXaxis()->SetTitleSize(0.12); frame2->GetXaxis()->SetLabelSize(0.1); frame2->GetXaxis()->SetTitle("m_{#mu^{+}#mu^{-}} (GeV/c^{2})"); frame2->GetYaxis()->SetRangeUser(-7.0, 7.0); frame2->Draw(); // *** Print chi2/ndof printChi2(myws, pad2, frameTMP, "invMass", dsOSName.c_str(), pdfTotName.c_str(), nBinsTMP, false); pline->Draw("same"); pad2->Update(); } // Save the plot in different formats gSystem->mkdir(Form("%sctauMass/%s/plot/root/", outputDir.c_str(), DSTAG.c_str()), kTRUE); cFig->SaveAs(Form("%sctauMass/%s/plot/root/PLOT_%s_%s_%s%s_pt%.0f%.0f_rap%.0f%.0f_cent%d%d.root", outputDir.c_str(), DSTAG.c_str(), "MASS", DSTAG.c_str(), (isPbPb?"PbPb":"PP"), plotLabel.c_str(), (cut.dMuon.Pt.Min*10.0), (cut.dMuon.Pt.Max*10.0), (cut.dMuon.AbsRap.Min*10.0), (cut.dMuon.AbsRap.Max*10.0), cut.Centrality.Start, cut.Centrality.End)); gSystem->mkdir(Form("%sctauMass/%s/plot/png/", outputDir.c_str(), DSTAG.c_str()), kTRUE); cFig->SaveAs(Form("%sctauMass/%s/plot/png/PLOT_%s_%s_%s%s_pt%.0f%.0f_rap%.0f%.0f_cent%d%d.png", outputDir.c_str(), DSTAG.c_str(), "MASS", DSTAG.c_str(), (isPbPb?"PbPb":"PP"), plotLabel.c_str(), (cut.dMuon.Pt.Min*10.0), (cut.dMuon.Pt.Max*10.0), (cut.dMuon.AbsRap.Min*10.0), (cut.dMuon.AbsRap.Max*10.0), cut.Centrality.Start, cut.Centrality.End)); gSystem->mkdir(Form("%sctauMass/%s/plot/pdf/", outputDir.c_str(), DSTAG.c_str()), kTRUE); cFig->SaveAs(Form("%sctauMass/%s/plot/pdf/PLOT_%s_%s_%s%s_pt%.0f%.0f_rap%.0f%.0f_cent%d%d.pdf", outputDir.c_str(), DSTAG.c_str(), "MASS", DSTAG.c_str(), (isPbPb?"PbPb":"PP"), plotLabel.c_str(), (cut.dMuon.Pt.Min*10.0), (cut.dMuon.Pt.Max*10.0), (cut.dMuon.AbsRap.Min*10.0), (cut.dMuon.AbsRap.Max*10.0), cut.Centrality.Start, cut.Centrality.End)); cFig->Clear(); cFig->Close(); };
void StandardFeldmanCousinsDemo(const char* infile = "", const char* workspaceName = "combined", const char* modelConfigName = "ModelConfig", const char* dataName = "obsData"){ // ------------------------------------------------------- // 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; } // ------------------------------------------------------- // create and use the FeldmanCousins tool // to find and plot the 95% confidence interval // on the parameter of interest as specified // in the model config FeldmanCousins fc(*data,*mc); fc.SetConfidenceLevel(0.95); // 95% interval //fc.AdditionalNToysFactor(0.1); // to speed up the result fc.UseAdaptiveSampling(true); // speed it up a bit fc.SetNBins(10); // set how many points per parameter of interest to scan fc.CreateConfBelt(true); // save the information in the belt for plotting // Since this tool needs to throw toy MC the PDF needs to be // extended or the tool needs to know how many entries in a dataset // per pseudo experiment. // In the 'number counting form' where the entries in the dataset // are counts, and not values of discriminating variables, the // datasets typically only have one entry and the PDF is not // extended. if(!mc->GetPdf()->canBeExtended()){ if(data->numEntries()==1) fc.FluctuateNumDataEntries(false); else cout <<"Not sure what to do about this model" <<endl; } // We can use PROOF to speed things along in parallel // ProofConfig pc(*w, 1, "workers=4", kFALSE); // ToyMCSampler* toymcsampler = (ToyMCSampler*) fc.GetTestStatSampler(); // toymcsampler->SetProofConfig(&pc); // enable proof // Now get the interval PointSetInterval* interval = fc.GetInterval(); ConfidenceBelt* belt = fc.GetConfidenceBelt(); // print out the iterval on the first Parameter of Interest RooRealVar* firstPOI = (RooRealVar*) mc->GetParametersOfInterest()->first(); cout << "\n95% interval on " <<firstPOI->GetName()<<" is : ["<< interval->LowerLimit(*firstPOI) << ", "<< interval->UpperLimit(*firstPOI) <<"] "<<endl; // --------------------------------------------- // No nice plots yet, so plot the belt by hand // Ask the calculator which points were scanned RooDataSet* parameterScan = (RooDataSet*) fc.GetPointsToScan(); RooArgSet* tmpPoint; // make a histogram of parameter vs. threshold TH1F* histOfThresholds = new TH1F("histOfThresholds","", parameterScan->numEntries(), firstPOI->getMin(), firstPOI->getMax()); // loop through the points that were tested and ask confidence belt // what the upper/lower thresholds were. // For FeldmanCousins, the lower cut off is always 0 for(Int_t i=0; i<parameterScan->numEntries(); ++i){ tmpPoint = (RooArgSet*) parameterScan->get(i)->clone("temp"); double arMax = belt->GetAcceptanceRegionMax(*tmpPoint); double arMin = belt->GetAcceptanceRegionMax(*tmpPoint); double poiVal = tmpPoint->getRealValue(firstPOI->GetName()) ; histOfThresholds->Fill(poiVal,arMax); } histOfThresholds->SetMinimum(0); histOfThresholds->Draw(); }
void OneSidedFrequentistUpperLimitWithBands(const char* infile = "", const char* workspaceName = "combined", const char* modelConfigName = "ModelConfig", const char* dataName = "obsData") { double confidenceLevel=0.95; int nPointsToScan = 20; int nToyMC = 200; // ------------------------------------------------------- // 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; } // ------------------------------------------------------- // Now get the data and workspace // 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 get the POI for convenience // you may want to adjust the range of your POI RooRealVar* firstPOI = (RooRealVar*) mc->GetParametersOfInterest()->first(); /* firstPOI->setMin(0);*/ /* firstPOI->setMax(10);*/ // -------------------------------------------- // Create and use the FeldmanCousins tool // to find and plot the 95% confidence interval // on the parameter of interest as specified // in the model config // REMEMBER, we will change the test statistic // so this is NOT a Feldman-Cousins interval FeldmanCousins fc(*data,*mc); fc.SetConfidenceLevel(confidenceLevel); /* fc.AdditionalNToysFactor(0.25); // degrade/improve sampling that defines confidence belt*/ /* fc.UseAdaptiveSampling(true); // speed it up a bit, don't use for expected limits*/ fc.SetNBins(nPointsToScan); // set how many points per parameter of interest to scan fc.CreateConfBelt(true); // save the information in the belt for plotting // ------------------------------------------------------- // Feldman-Cousins is a unified limit by definition // but the tool takes care of a few things for us like which values // of the nuisance parameters should be used to generate toys. // so let's just change the test statistic and realize this is // no longer "Feldman-Cousins" but is a fully frequentist Neyman-Construction. /* ProfileLikelihoodTestStatModified onesided(*mc->GetPdf());*/ /* fc.GetTestStatSampler()->SetTestStatistic(&onesided);*/ /* ((ToyMCSampler*) fc.GetTestStatSampler())->SetGenerateBinned(true); */ ToyMCSampler* toymcsampler = (ToyMCSampler*) fc.GetTestStatSampler(); ProfileLikelihoodTestStat* testStat = dynamic_cast<ProfileLikelihoodTestStat*>(toymcsampler->GetTestStatistic()); testStat->SetOneSided(true); // Since this tool needs to throw toy MC the PDF needs to be // extended or the tool needs to know how many entries in a dataset // per pseudo experiment. // In the 'number counting form' where the entries in the dataset // are counts, and not values of discriminating variables, the // datasets typically only have one entry and the PDF is not // extended. if(!mc->GetPdf()->canBeExtended()){ if(data->numEntries()==1) fc.FluctuateNumDataEntries(false); else cout <<"Not sure what to do about this model" <<endl; } // We can use PROOF to speed things along in parallel // However, the test statistic has to be installed on the workers // so either turn off PROOF or include the modified test statistic // in your `$ROOTSYS/roofit/roostats/inc` directory, // add the additional line to the LinkDef.h file, // and recompile root. if (useProof) { ProofConfig pc(*w, nworkers, "", false); toymcsampler->SetProofConfig(&pc); // enable proof } if(mc->GetGlobalObservables()){ cout << "will use global observables for unconditional ensemble"<<endl; mc->GetGlobalObservables()->Print(); toymcsampler->SetGlobalObservables(*mc->GetGlobalObservables()); } // Now get the interval PointSetInterval* interval = fc.GetInterval(); ConfidenceBelt* belt = fc.GetConfidenceBelt(); // print out the interval on the first Parameter of Interest cout << "\n95% interval on " <<firstPOI->GetName()<<" is : ["<< interval->LowerLimit(*firstPOI) << ", "<< interval->UpperLimit(*firstPOI) <<"] "<<endl; // get observed UL and value of test statistic evaluated there RooArgSet tmpPOI(*firstPOI); double observedUL = interval->UpperLimit(*firstPOI); firstPOI->setVal(observedUL); double obsTSatObsUL = fc.GetTestStatSampler()->EvaluateTestStatistic(*data,tmpPOI); // Ask the calculator which points were scanned RooDataSet* parameterScan = (RooDataSet*) fc.GetPointsToScan(); RooArgSet* tmpPoint; // make a histogram of parameter vs. threshold TH1F* histOfThresholds = new TH1F("histOfThresholds","", parameterScan->numEntries(), firstPOI->getMin(), firstPOI->getMax()); histOfThresholds->GetXaxis()->SetTitle(firstPOI->GetName()); histOfThresholds->GetYaxis()->SetTitle("Threshold"); // loop through the points that were tested and ask confidence belt // what the upper/lower thresholds were. // For FeldmanCousins, the lower cut off is always 0 for(Int_t i=0; i<parameterScan->numEntries(); ++i){ tmpPoint = (RooArgSet*) parameterScan->get(i)->clone("temp"); //cout <<"get threshold"<<endl; double arMax = belt->GetAcceptanceRegionMax(*tmpPoint); double poiVal = tmpPoint->getRealValue(firstPOI->GetName()) ; histOfThresholds->Fill(poiVal,arMax); } TCanvas* c1 = new TCanvas(); c1->Divide(2); c1->cd(1); histOfThresholds->SetMinimum(0); histOfThresholds->Draw(); c1->cd(2); // ------------------------------------------------------- // Now we generate the expected bands and power-constraint // First: find parameter point for mu=0, with conditional MLEs for nuisance parameters RooAbsReal* nll = mc->GetPdf()->createNLL(*data); RooAbsReal* profile = nll->createProfile(*mc->GetParametersOfInterest()); firstPOI->setVal(0.); profile->getVal(); // this will do fit and set nuisance parameters to profiled values RooArgSet* poiAndNuisance = new RooArgSet(); if(mc->GetNuisanceParameters()) poiAndNuisance->add(*mc->GetNuisanceParameters()); poiAndNuisance->add(*mc->GetParametersOfInterest()); w->saveSnapshot("paramsToGenerateData",*poiAndNuisance); RooArgSet* paramsToGenerateData = (RooArgSet*) poiAndNuisance->snapshot(); cout << "\nWill use these parameter points to generate pseudo data for bkg only" << endl; paramsToGenerateData->Print("v"); RooArgSet unconditionalObs; unconditionalObs.add(*mc->GetObservables()); unconditionalObs.add(*mc->GetGlobalObservables()); // comment this out for the original conditional ensemble double CLb=0; double CLbinclusive=0; // Now we generate background only and find distribution of upper limits TH1F* histOfUL = new TH1F("histOfUL","",100,0,firstPOI->getMax()); histOfUL->GetXaxis()->SetTitle("Upper Limit (background only)"); histOfUL->GetYaxis()->SetTitle("Entries"); for(int imc=0; imc<nToyMC; ++imc){ // set parameters back to values for generating pseudo data // cout << "\n get current nuis, set vals, print again" << endl; w->loadSnapshot("paramsToGenerateData"); // poiAndNuisance->Print("v"); RooDataSet* toyData = 0; // now generate a toy dataset if(!mc->GetPdf()->canBeExtended()){ if(data->numEntries()==1) toyData = mc->GetPdf()->generate(*mc->GetObservables(),1); else cout <<"Not sure what to do about this model" <<endl; } else{ // cout << "generating extended dataset"<<endl; toyData = mc->GetPdf()->generate(*mc->GetObservables(),Extended()); } // generate global observables // need to be careful for simpdf // RooDataSet* globalData = mc->GetPdf()->generate(*mc->GetGlobalObservables(),1); RooSimultaneous* simPdf = dynamic_cast<RooSimultaneous*>(mc->GetPdf()); if(!simPdf){ RooDataSet *one = mc->GetPdf()->generate(*mc->GetGlobalObservables(), 1); const RooArgSet *values = one->get(); RooArgSet *allVars = mc->GetPdf()->getVariables(); *allVars = *values; delete allVars; delete values; delete one; } else { //try fix for sim pdf TIterator* iter = simPdf->indexCat().typeIterator() ; RooCatType* tt = NULL; while((tt=(RooCatType*) iter->Next())) { // Get pdf associated with state from simpdf RooAbsPdf* pdftmp = simPdf->getPdf(tt->GetName()) ; // Generate only global variables defined by the pdf associated with this state RooArgSet* globtmp = pdftmp->getObservables(*mc->GetGlobalObservables()) ; RooDataSet* tmp = pdftmp->generate(*globtmp,1) ; // Transfer values to output placeholder *globtmp = *tmp->get(0) ; // Cleanup delete globtmp ; delete tmp ; } } // globalData->Print("v"); // unconditionalObs = *globalData->get(); // mc->GetGlobalObservables()->Print("v"); // delete globalData; // cout << "toy data = " << endl; // toyData->get()->Print("v"); // get test stat at observed UL in observed data firstPOI->setVal(observedUL); double toyTSatObsUL = fc.GetTestStatSampler()->EvaluateTestStatistic(*toyData,tmpPOI); // toyData->get()->Print("v"); // cout <<"obsTSatObsUL " <<obsTSatObsUL << "toyTS " << toyTSatObsUL << endl; if(obsTSatObsUL < toyTSatObsUL) // not sure about <= part yet CLb+= (1.)/nToyMC; if(obsTSatObsUL <= toyTSatObsUL) // not sure about <= part yet CLbinclusive+= (1.)/nToyMC; // loop over points in belt to find upper limit for this toy data double thisUL = 0; for(Int_t i=0; i<parameterScan->numEntries(); ++i){ tmpPoint = (RooArgSet*) parameterScan->get(i)->clone("temp"); double arMax = belt->GetAcceptanceRegionMax(*tmpPoint); firstPOI->setVal( tmpPoint->getRealValue(firstPOI->GetName()) ); // double thisTS = profile->getVal(); double thisTS = fc.GetTestStatSampler()->EvaluateTestStatistic(*toyData,tmpPOI); // cout << "poi = " << firstPOI->getVal() // << " max is " << arMax << " this profile = " << thisTS << endl; // cout << "thisTS = " << thisTS<<endl; if(thisTS<=arMax){ thisUL = firstPOI->getVal(); } else{ break; } } /* // loop over points in belt to find upper limit for this toy data double thisUL = 0; for(Int_t i=0; i<histOfThresholds->GetNbinsX(); ++i){ tmpPoint = (RooArgSet*) parameterScan->get(i)->clone("temp"); cout <<"---------------- "<<i<<endl; tmpPoint->Print("v"); cout << "from hist " << histOfThresholds->GetBinCenter(i+1) <<endl; double arMax = histOfThresholds->GetBinContent(i+1); // cout << " threhold from Hist = aMax " << arMax<<endl; // double arMax2 = belt->GetAcceptanceRegionMax(*tmpPoint); // cout << "from scan arMax2 = "<< arMax2 << endl; // not the same due to TH1F not TH1D // cout << "scan - hist" << arMax2-arMax << endl; firstPOI->setVal( histOfThresholds->GetBinCenter(i+1)); // double thisTS = profile->getVal(); double thisTS = fc.GetTestStatSampler()->EvaluateTestStatistic(*toyData,tmpPOI); // cout << "poi = " << firstPOI->getVal() // << " max is " << arMax << " this profile = " << thisTS << endl; // cout << "thisTS = " << thisTS<<endl; // NOTE: need to add a small epsilon term for single precision vs. double precision if(thisTS<=arMax + 1e-7){ thisUL = firstPOI->getVal(); } else{ break; } } */ histOfUL->Fill(thisUL); // for few events, data is often the same, and UL is often the same // cout << "thisUL = " << thisUL<<endl; delete toyData; } histOfUL->Draw(); c1->SaveAs("one-sided_upper_limit_output.pdf"); // if you want to see a plot of the sampling distribution for a particular scan point: /* SamplingDistPlot sampPlot; int indexInScan = 0; tmpPoint = (RooArgSet*) parameterScan->get(indexInScan)->clone("temp"); firstPOI->setVal( tmpPoint->getRealValue(firstPOI->GetName()) ); toymcsampler->SetParametersForTestStat(tmpPOI); SamplingDistribution* samp = toymcsampler->GetSamplingDistribution(*tmpPoint); sampPlot.AddSamplingDistribution(samp); sampPlot.Draw(); */ // Now find bands and power constraint Double_t* bins = histOfUL->GetIntegral(); TH1F* cumulative = (TH1F*) histOfUL->Clone("cumulative"); cumulative->SetContent(bins); double band2sigDown, band1sigDown, bandMedian, band1sigUp,band2sigUp; for(int i=1; i<=cumulative->GetNbinsX(); ++i){ if(bins[i]<RooStats::SignificanceToPValue(2)) band2sigDown=cumulative->GetBinCenter(i); if(bins[i]<RooStats::SignificanceToPValue(1)) band1sigDown=cumulative->GetBinCenter(i); if(bins[i]<0.5) bandMedian=cumulative->GetBinCenter(i); if(bins[i]<RooStats::SignificanceToPValue(-1)) band1sigUp=cumulative->GetBinCenter(i); if(bins[i]<RooStats::SignificanceToPValue(-2)) band2sigUp=cumulative->GetBinCenter(i); } cout << "-2 sigma band " << band2sigDown << endl; cout << "-1 sigma band " << band1sigDown << " [Power Constraint)]" << endl; cout << "median of band " << bandMedian << endl; cout << "+1 sigma band " << band1sigUp << endl; cout << "+2 sigma band " << band2sigUp << endl; // print out the interval on the first Parameter of Interest cout << "\nobserved 95% upper-limit "<< interval->UpperLimit(*firstPOI) <<endl; cout << "CLb strict [P(toy>obs|0)] for observed 95% upper-limit "<< CLb <<endl; cout << "CLb inclusive [P(toy>=obs|0)] for observed 95% upper-limit "<< CLbinclusive <<endl; delete profile; delete nll; }
void FitterUtils::fit(bool wantplot, bool constPartReco, double fracPartReco_const, ofstream& out, TTree* t, bool update, string plotsfile) { //***************Get the PDFs from the workspace TFile fw(workspacename.c_str()); RooWorkspace* workspace = (RooWorkspace*)fw.Get("workspace"); RooRealVar *B_plus_M = workspace->var("B_plus_M"); RooRealVar *misPT = workspace->var("misPT"); RooRealVar *T = workspace->var("T"); RooRealVar *n = workspace->var("n"); RooRealVar *expoConst = workspace->var("expoConst"); RooRealVar *trueExp = workspace->var("trueExp"); RooRealVar *fractionalErrorJpsiLeak = workspace->var("fractionalErrorJpsiLeak"); cout<<"VALUE OF T IN FIT: "<<T->getVal()<<" +- "<<T->getError()<<endl; cout<<"VALUE OF n IN FIT: "<<n->getVal()<<" +- "<<n->getError()<<endl; RooHistPdf *histPdfSignalZeroGamma = (RooHistPdf *) workspace->pdf("histPdfSignalZeroGamma"); RooHistPdf *histPdfSignalOneGamma = (RooHistPdf *) workspace->pdf("histPdfSignalOneGamma"); RooHistPdf *histPdfSignalTwoGamma = (RooHistPdf *) workspace->pdf("histPdfSignalTwoGamma"); RooHistPdf *histPdfPartReco = (RooHistPdf *) workspace->pdf("histPdfPartReco"); RooHistPdf *histPdfJpsiLeak(0); if(nGenJpsiLeak>0) histPdfJpsiLeak = (RooHistPdf *) workspace->pdf("histPdfJpsiLeak"); RooAbsPdf *combPDF; if (fit2D) { combPDF = new RooPTMVis("combPDF", "combPDF", *misPT, *B_plus_M, *T, *n, *expoConst); } else { combPDF = new RooExponential("combPDF", "combPDF", *B_plus_M, *expoConst); } expoConst->setVal(trueExp->getVal()); RooWorkspace* workspaceGen = (RooWorkspace*)fw.Get("workspaceGen"); RooDataSet* dataGenSignalZeroGamma = (RooDataSet*)workspaceGen->data("dataGenSignalZeroGamma"); RooDataSet* dataGenSignalOneGamma = (RooDataSet*)workspaceGen->data("dataGenSignalOneGamma"); RooDataSet* dataGenSignalTwoGamma = (RooDataSet*)workspaceGen->data("dataGenSignalTwoGamma"); RooDataSet* dataGenPartReco = (RooDataSet*)workspaceGen->data("dataGenPartReco"); RooDataSet* dataGenComb = (RooDataSet*)workspaceGen->data("dataGenComb"); RooDataSet* dataGenJpsiLeak(0); if(nGenJpsiLeak>0) dataGenJpsiLeak = (RooDataSet*)workspaceGen->data("dataGenJpsiLeak"); if(wantplot) { //**************Must get the datasets RooDataSet* dataSetSignalZeroGamma = (RooDataSet*)workspace->data("dataSetSignalZeroGamma"); RooDataSet* dataSetSignalOneGamma = (RooDataSet*)workspace->data("dataSetSignalOneGamma"); RooDataSet* dataSetSignalTwoGamma = (RooDataSet*)workspace->data("dataSetSignalTwoGamma"); RooDataSet* dataSetPartReco = (RooDataSet*)workspace->data("dataSetPartReco"); RooDataSet* dataSetComb = (RooDataSet*)workspace->data("dataSetComb"); RooDataSet* dataSetJpsiLeak = (RooDataSet*)workspace->data("dataSetJpsiLeak"); //**************Plot all the different components cout<<"dataGenSignalZeroGamma: "<<dataGenSignalZeroGamma<<endl; PlotShape(*dataSetSignalZeroGamma, *dataGenSignalZeroGamma, *histPdfSignalZeroGamma, plotsfile, "cSignalZeroGamma", *B_plus_M, *misPT); PlotShape(*dataSetSignalOneGamma, *dataGenSignalOneGamma, *histPdfSignalOneGamma, plotsfile, "cSignalOneGamma", *B_plus_M, *misPT); PlotShape(*dataSetSignalTwoGamma, *dataGenSignalTwoGamma, *histPdfSignalTwoGamma, plotsfile, "cSignalTwoGamma", *B_plus_M, *misPT); PlotShape(*dataSetPartReco, *dataGenPartReco, *histPdfPartReco, plotsfile, "cPartReco", *B_plus_M, *misPT); PlotShape(*dataSetComb, *dataGenComb, *combPDF, plotsfile, "cComb", *B_plus_M, *misPT); if(nGenJpsiLeak>1) PlotShape(*dataSetJpsiLeak, *dataGenJpsiLeak, *histPdfJpsiLeak, plotsfile, "cJpsiLeak", *B_plus_M, *misPT); } //***************Merge datasets RooDataSet* dataGenTot(dataGenPartReco); dataGenTot->append(*dataGenSignalZeroGamma); dataGenTot->append(*dataGenSignalOneGamma); dataGenTot->append(*dataGenSignalTwoGamma); dataGenTot->append(*dataGenComb); if(nGenJpsiLeak>0) dataGenTot->append(*dataGenJpsiLeak); //**************Prepare fitting function RooRealVar nSignal("nSignal", "#signal events", 1.*nGenSignal, nGenSignal-7*sqrt(nGenSignal), nGenSignal+7*sqrt(nGenSignal)); RooRealVar nPartReco("nPartReco", "#nPartReco", 1.*nGenPartReco, nGenPartReco-7*sqrt(nGenPartReco), nGenPartReco+7*sqrt(nGenPartReco)); RooRealVar nComb("nComb", "#nComb", 1.*nGenComb, nGenComb-7*sqrt(nGenComb), nGenComb+7*sqrt(nGenComb)); RooRealVar nJpsiLeak("nJpsiLeak", "#nJpsiLeak", 1.*nGenJpsiLeak, nGenJpsiLeak-7*sqrt(nGenJpsiLeak), nGenJpsiLeak+7*sqrt(nGenJpsiLeak)); RooRealVar fracZero("fracZero", "fracZero",0.5,0,1); RooRealVar fracOne("fracOne", "fracOne",0.5, 0,1); RooFormulaVar fracPartReco("fracPartReco", "nPartReco/nSignal", RooArgList(nPartReco,nSignal)); RooFormulaVar fracOneRec("fracOneRec", "(1-fracZero)*fracOne", RooArgList(fracZero, fracOne)); RooAddPdf histPdfSignal("histPdfSignal", "histPdfSignal", RooArgList(*histPdfSignalZeroGamma, *histPdfSignalOneGamma, *histPdfSignalTwoGamma), RooArgList(fracZero, fracOneRec)); RooArgList pdfList(histPdfSignal, *histPdfPartReco, *combPDF); RooArgList yieldList(nSignal, nPartReco, nComb); if(nGenJpsiLeak>0) { pdfList.add(*histPdfJpsiLeak); yieldList.add(nJpsiLeak); } RooAddPdf totPdf("totPdf", "totPdf", pdfList, yieldList); //**************** Constrain the fraction of zero and one photon int nGenSignalZeroGamma(floor(nGenFracZeroGamma*nGenSignal)); int nGenSignalOneGamma(floor(nGenFracOneGamma*nGenSignal)); int nGenSignalTwoGamma(floor(nGenSignal-nGenSignalZeroGamma-nGenSignalOneGamma)); RooRealVar fracZeroConstMean("fracZeroConstMean", "fracZeroConstMean", nGenSignalZeroGamma*1./nGenSignal); RooRealVar fracZeroConstSigma("fracZeroConstSigma", "fracZeroConstSigma", sqrt(nGenSignalZeroGamma)/nGenSignal); RooGaussian fracZeroConst("fracZeroConst", "fracZeroConst", fracZero, fracZeroConstMean, fracZeroConstSigma); RooRealVar fracOneConstMean("fracOneConstMean", "fracOneConstMean", nGenSignalOneGamma*1./nGenSignal/(1-fracZeroConstMean.getVal())); RooRealVar fracOneConstSigma("fracOneConstSigma", "fracOneConstSigma", sqrt(nGenSignalOneGamma)/nGenSignal/(1-fracZeroConstMean.getVal())); RooGaussian fracOneConst("fracOneConst", "fracOneConst", fracOne, fracOneConstMean, fracOneConstSigma); RooRealVar fracPartRecoMean("fracPartRecoMean", "fracPartRecoMean", nGenPartReco/(1.*nGenSignal)); RooRealVar fracPartRecoSigma("fracPartRecoSigma", "fracPartRecoSigma", fracPartReco_const*fracPartRecoMean.getVal()); RooGaussian fracPartRecoConst("fracPartRecoConst", "fracPartRecoConst", fracPartReco, fracPartRecoMean, fracPartRecoSigma); RooRealVar JpsiLeakMean("JpsiLeakMean", "JpsiLeakMean", nGenJpsiLeak); RooRealVar JpsiLeakSigma("JpsiLeakSigma", "JpsiLeakSigma", nGenJpsiLeak*fractionalErrorJpsiLeak->getVal()); RooGaussian JpsiLeakConst("JpsiLeakConst", "JpsiLeakConst", nJpsiLeak, JpsiLeakMean, JpsiLeakSigma); //Extra TEST CONSTRAINT //RooRealVar combConstMean("combConstMean", "combConstMean", nGenComb); //RooRealVar combConstSigma("combConstSigma", "combConstSigma", 7.7); //RooGaussian combConst("combConst", "combConst", nComb, combConstMean, combConstSigma); //**************** fit RooAbsReal::defaultIntegratorConfig()->setEpsAbs(1e-8) ; RooAbsReal::defaultIntegratorConfig()->setEpsRel(1e-8) ; RooArgSet *par_set = totPdf.getParameters(dataGenTot); initiateParams(nGenSignalZeroGamma, nGenSignalOneGamma, nGenSignalTwoGamma, *trueExp, nSignal, nPartReco, nComb, fracZero, fracOne, *expoConst, nJpsiLeak, constPartReco, fracPartRecoSigma); RooArgSet constraints(fracZeroConst, fracOneConst); if (constPartReco) constraints.add(fracPartRecoConst); if(nGenJpsiLeak>0) constraints.add(JpsiLeakConst); RooAbsReal* nll = totPdf.createNLL(*dataGenTot, Extended(), ExternalConstraints(constraints)); RooMinuit minuit(*nll); minuit.setStrategy(2); int migradRes(1); int hesseRes(4); vector<int> migradResVec; vector<int> hesseResVec; double edm(10); int nrefit(0); RooFitResult* fitRes(0); vector<RooFitResult*> fitResVec; bool hasConverged(false); for(int i(0); (i<10) && !hasConverged ; ++i) { initiateParams(nGenSignalZeroGamma, nGenSignalOneGamma, nGenSignalTwoGamma, *trueExp, nSignal, nPartReco, nComb, fracZero, fracOne, *expoConst, nJpsiLeak, constPartReco, fracPartRecoSigma); cout<<"FITTING: starting with nsignal = "<<nSignal.getValV()<<" refit nbr. "<<i<<endl; //if(fitRes != NULL && fitRes != 0) delete fitRes; migradRes = minuit.migrad(); hesseRes = minuit.hesse(); fitRes = minuit.save(); edm = fitRes->edm(); fitResVec.push_back(fitRes); migradResVec.push_back(migradRes); hesseResVec.push_back(hesseRes); if( migradRes == 0 && hesseRes == 0 && edm < 1e-4 ) hasConverged = true; ++nrefit; cout<<"Fitting nbr "<<i<<" done. Hesse: "<<hesseRes<<" migrad: "<<migradRes<<" edm: "<<edm<<" minNll: "<<fitRes->minNll()<<endl; } if(!hasConverged) { double minNll(1e20); int minIndex(-1); for(unsigned int i(0); i<fitResVec.size(); ++i) { if( fitResVec.at(i)->minNll() < minNll) { minIndex = i; minNll = fitResVec[i]->minNll(); } } migradRes = migradResVec.at(minIndex); hesseRes = hesseResVec.at(minIndex); cout<<"Fit not converged, choose fit "<<minIndex<<". Hesse: "<<hesseRes<<" migrad: "<<migradRes<<" edm: "<<edm<<" minNll: "<<fitRes->minNll()<<endl; } fillTreeResult(t, fitRes, update, migradRes, hesseRes, hasConverged); for(unsigned int i(0); i<fitResVec.size(); ++i) delete fitResVec.at(i); //totPdf.fitTo(*dataGenTot, Extended(), Save(), Warnings(false)); //*************** output fit status int w(12); out<<setw(w)<<migradRes<<setw(w)<<hesseRes<<setw(w)<<edm<<setw(w)<<nrefit<<endl; if(wantplot) plot_fit_result(plotsfile, totPdf, *dataGenTot); fw.Close(); //delete and return delete nll; delete par_set; delete workspace; delete workspaceGen; delete combPDF; }
int main (int argc, char **argv) { const char* chInFile = "ws.root"; const char* chOutFile = "ws_gen.root"; int numSignal = 10000; int numBkg = 100000; char option_char; while ( (option_char = getopt(argc,argv, "i:o:s:b:")) != EOF ) switch (option_char) { case 'i': chInFile = optarg; break; case 'o': chOutFile = optarg; break; case 's': numSignal = atoi(optarg); break; case 'b': numBkg = atoi(optarg); break; case '?': fprintf (stderr, "usage: %s [i<input file> o<output file>]\n", argv[0]); } cout << "In File = " << chInFile << endl; cout << "Out File = " << chOutFile << endl; cout << "Signal Events = " << numSignal << endl; cout << "Bkg Events = " << numBkg << endl; TFile inFile(chInFile,"READ"); RooWorkspace* ws = (RooWorkspace*) inFile.Get("rws"); TFile outFile(chOutFile,"RECREATE"); /* ws->var("tau")->setVal(1.417); ws->var("DG")->setVal(0.151); ws->var("beta")->setVal(0.25); ws->var("A02")->setVal(0.553); ws->var("A1")->setVal(0.487); ws->var("delta_l")->setVal(3.15); ws->var("fs")->setVal(0.147); */ // ws->var("delta_l")->setConstant(kTRUE); // ws->var("delta_p")->setConstant(kTRUE); // ws->var("Dm")->setConstant(kTRUE); //*ws->var("xs") = numSignal/(numSignal+numBkg); // int numSignal = numEvents * ws->var("xs")->getVal(); // int numBkg = numEvents - numSignal; ws->factory("Gaussian::dilutionGauss(d,0,0.276)"); //ws->factory("SUM::dSignalPDF(xds[0.109]*dilutionGauss,TruthModel(d))"); //ws->factory("SUM::dBkgPDF(xdb[0.109]*dilutionGauss,TruthModel(d))"); ws->factory("SUM::dSignalPDF(xds[1]*dilutionGauss,TruthModel(d))"); ws->factory("SUM::dBkgPDF(xdb[1]*dilutionGauss,TruthModel(d))"); /* ws->factory("GaussModel::xetGaussianS(et,meanGaussEtS,sigmaGaussEtS)"); ws->factory("Decay::xerrorSignal(et,tauEtS,xetGaussianS,SingleSided]"); ws->factory("PROD::xsignalTimeAngle(timeAngle|et,xerrorSignal"); ws->factory("PROD::xsignal(massSignal,xsignalTimeAngle,DmConstraint)"); */ RooDataSet* dSignalData = ws->pdf("dSignalPDF")->generate(RooArgSet(*ws->var("d")),numSignal); RooDataSet *dataSignal = ws->pdf("signal")->generate(RooArgSet(*ws->var("m"),*ws->var("t"),*ws->var("et"),*ws->var("cpsi"),*ws->var("ctheta"),*ws->var("phi")), RooFit::ProtoData(*dSignalData)); ws->factory("GaussModel::xetGaussianPR(et,meanGaussEtPR,sigmaGaussEtPR)"); ws->factory("Decay::xerrBkgPR(et,tauEtPR,xetGaussianPR,SingleSided]"); ws->factory("GaussModel::xetGaussianNP(et,meanGaussEtNP,sigmaGaussEtNP)"); ws->factory("Decay::xerrBkgNP(et,tauEtNP,xetGaussianNP,SingleSided]"); /* Time */ ws->factory("GaussModel::xresolution(t,0,scale,et)"); ws->factory("Decay::xnegativeDecay(t,tauNeg,xresolution,Flipped)"); ws->factory("Decay::xpositiveDecay(t,tauPos,xresolution,SingleSided)"); ws->factory("Decay::xpositiveLongDecay(t,tauLngPos,xresolution,SingleSided)"); ws->factory("RSUM::xtBkgNP(xn*xnegativeDecay,xp*xpositiveDecay,xpositiveLongDecay"); /* Promt and Non-Prompt */ ws->factory("PROD::xtimeBkgNP(xtBkgNP|et,xerrBkgNP)"); ws->factory("PROD::xtimeBkgPR(xresolution|et,xerrBkgPR)"); ws->factory("PROD::xPrompt(massBkgPR,xtimeBkgPR,anglePR)"); ws->factory("PROD::xNonPrompt(massBkgNP,xtimeBkgNP,angleNP)"); ws->factory("SUM::xbackground(xprompt*xPrompt,xNonPrompt)"); RooDataSet* dBkgData = ws->pdf("dBkgPDF")->generate(RooArgSet(*ws->var("d")),numBkg); RooDataSet* dataBkg = ws->pdf("xbackground")->generate(RooArgSet(*ws->var("m"),*ws->var("t"),*ws->var("et"),*ws->var("cpsi"),*ws->var("ctheta"),*ws->var("phi")), numBkg); dataBkg->merge(dBkgData); dataSignal->SetName("dataGenSignal"); dataBkg->SetName("dataGenBkg"); ws->import(*dataSignal); ws->import(*dataBkg); ////ws->import(*dataBkg,RooFit::Rename("dataGenBkg")); dataSignal->append(*dataBkg); dataSignal->SetName("dataGen"); ws->import(*dataSignal); //RooFitResult *fit_result = ws->pdf("model")->fitTo(*ws->data("data"), RooFit::Save(kTRUE), RooFit::ConditionalObservables(*ws->var("d")), RooFit::NumCPU(2), RooFit::PrintLevel(3)); /* gROOT->SetStyle("Plain"); TCanvas canvas("canvas", "canvas", 400,400); RooPlot *m_frame = ws->var("t")->frame(); dataSignal->plotOn(m_frame, RooFit::MarkerSize(0.3)); m_frame->Draw(); canvas.SaveAs("m_toy_plot.png"); */ /* gROOT->SetStyle("Plain"); TCanvas canvas("canvas", "canvas", 800,400); canvas.Divide(2); canvas.cd(1); RooPlot *t_frame = ws->var("t")->frame(); ws->data("data")->plotOn(t_frame, RooFit::MarkerSize(0.3)); gPad->SetLogy(1); t_frame->Draw(); canvas.cd(2); RooPlot *et_frame = ws->var("et")->frame(); ws->data("data")->plotOn(et_frame,RooFit::MarkerSize(0.2)); ws->pdf("errorSignal")->plotOn(et_frame); gPad->SetLogy(1); et_frame->Draw(); canvas.SaveAs("t.png"); canvas.cd(2); gPad->SetLogy(0); RooPlot *cpsi_frame = ws.var("cpsi")->frame(); data->plotOn(cpsi_frame,RooFit::MarkerSize(0.2), RooFit::Rescale(1)); data2->plotOn(cpsi_frame, RooFit::LineColor(kBlue), RooFit::DrawOption("L")); cpsi_frame->Draw(); canvas.cd(3); RooPlot *ctheta_frame = ws.var("ctheta")->frame(); data->plotOn(ctheta_frame,RooFit::MarkerSize(0.2), RooFit::Rescale(1)); data2->plotOn(ctheta_frame, RooFit::LineColor(kBlue), RooFit::DrawOption("L")); ctheta_frame->Draw(); canvas.cd(4); RooPlot *phi_frame = ws.var("phi")->frame(); data->plotOn(phi_frame,RooFit::MarkerSize(0.2), RooFit::Rescale(1)); data2->plotOn(phi_frame, RooFit::LineColor(kBlue), RooFit::DrawOption("L")); phi_frame->Draw(); canvas.SaveAs("t.png"); */ ws->data("dataGen")->Print(); ws->data("dataGenSignal")->Print(); ws->data("dataGenBkg")->Print(); ws->Write("rws"); outFile.Close(); inFile.Close(); }
void StandardProfileInspectorDemo(const char* infile = "", const char* workspaceName = "combined", const char* modelConfigName = "ModelConfig", const char* dataName = "obsData"){ ///////////////////////////////////////////////////////////// // 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"; else filename = infile; // Check if example input file exists TFile *file = TFile::Open(filename); // if input file was specified byt not found, quit if(!file && strcmp(infile,"")){ cout <<"file not found" << endl; return; } // if default file not found, try to create it if(!file ){ // 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; } // now try to access the file again file = TFile::Open(filename); if(!file){ // if it is still not there, then we can't continue cout << "Not able to run hist2workspace to create example input" <<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 ProfileInspector p; TList* list = p.GetListOfProfilePlots(*data,mc); // now make plots TCanvas* c1 = new TCanvas("c1","ProfileInspectorDemo"); //,800,200); c1->Divide(4,4); // const RooArgSet* nuis_params = mc->GetNuisanceParameters(); for(int i=0; i<list->GetSize(); ++i){ c1->cd(i+1); //RooRealVar* nuis = (RooRealVar*) nuis_params->At(i); TGraph* graph = (TGraph*) list->At(i); std::string y_title = graph->GetYaxis()->GetTitle(); y_title = "Profiled value of: " + y_title; graph->GetYaxis()->SetTitle(y_title.c_str()); graph->GetYaxis()->SetTitleSize(0.05); graph->GetYaxis()->SetTitleOffset(0.8); //std::string poi_name = graph->GetXaxis()->GetTitle(); //graph->GetYaxis()->SetTitle(var->GetName()); graph->GetXaxis()->SetTitleSize(0.05); graph->GetXaxis()->SetTitleOffset(0.8); graph->Draw("al"); //list->At(i)->Draw("al"); } c1->Print("ProfileInspector.eps"); c1->Print("ProfileInspector.pdf"); cout << endl; }
void FitterUtilsSimultaneousExpOfPolyTimesX::generate(bool wantPlots, string plotsfile) { FitterUtilsExpOfPolyTimesX::generate(wantPlots, plotsfile); TFile fw(workspacename.c_str(), "UPDATE"); RooWorkspace* workspace = (RooWorkspace*)fw.Get("workspace"); RooRealVar *B_plus_M = workspace->var("B_plus_M"); RooRealVar *misPT = workspace->var("misPT"); RooDataSet* dataSetCombExt = (RooDataSet*)workspace->data("dataSetCombExt"); RooDataSet* dataSetComb = (RooDataSet*)workspace->data("dataSetComb"); // RooRealVar *l1KeeGen = workspace->var("l1KeeGen"); // RooRealVar *l2KeeGen = workspace->var("l2KeeGen"); // RooRealVar *l3KeeGen = workspace->var("l3KeeGen"); // RooRealVar *l4KeeGen = workspace->var("l4KeeGen"); // RooRealVar *l5KeeGen = workspace->var("l5KeeGen"); // // // RooExpOfPolyTimesX kemuPDF("kemuPDF", "kemuPDF", *B_plus_M, *misPT, *l1KeeGen, *l2KeeGen, *l3KeeGen, *l4KeeGen, *l5KeeGen); // // RooAbsPdf::GenSpec* GenSpecKemu = kemuPDF.prepareMultiGen(RooArgSet(*B_plus_M, *misPT), RooFit::Extended(1), NumEvents(nGenKemu)); // // cout<<"Generating Kemu"<<endl; // RooDataSet* dataGenKemu = kemuPDF.generate(*GenSpecKemu);//(argset, 100, false, true, "", false, true); // dataGenKemu->SetName("dataGenKemu"); dataGenKemu->SetTitle("dataGenKemu"); // // // RooWorkspace* workspaceGen = (RooWorkspace*)fw.Get("workspaceGen"); // workspaceGen->import(*dataGenKemu); // // workspaceGen->Write("", TObject::kOverwrite); // fw.Close(); // delete dataGenKemu; // delete GenSpecKemu; TVectorD rho(2); rho[0] = 2.5; rho[1] = 1.5; misPT->setRange(-2000, 5000); RooNDKeysPdf kemuPDF("kemuPDF", "kemuPDF", RooArgList(*B_plus_M, *misPT), *dataSetCombExt, rho, "ma",3, true); misPT->setRange(0, 5000); RooAbsPdf::GenSpec* GenSpecKemu = kemuPDF.prepareMultiGen(RooArgSet(*B_plus_M, *misPT), RooFit::Extended(1), NumEvents(nGenKemu)); cout<<"Generating Kemu"<<endl; RooDataSet* dataGenKemu = kemuPDF.generate(*GenSpecKemu);//(argset, 100, false, true, "", false, true); dataGenKemu->SetName("dataGenKemu"); dataGenKemu->SetTitle("dataGenKemu"); RooWorkspace* workspaceGen = (RooWorkspace*)fw.Get("workspaceGen"); workspaceGen->import(*dataGenKemu); if(wantPlots) PlotShape(*dataSetComb, *dataGenKemu, kemuPDF, plotsfile, "cKemuKeys", *B_plus_M, *misPT); fw.cd(); workspaceGen->Write("", TObject::kOverwrite); fw.Close(); delete dataGenKemu; delete GenSpecKemu; }
void splitws(string inFolderName, double mass, string channel) { cout << "Splitting workspace in " << channel << endl; int flatInterpCode = 4; int shapeInterpCode = 4; bool do2011 = 0; if (inFolderName.find("2011") != string::npos) do2011 = 1; bool conditionalAsimov = 0; bool doData = 1; //if (inFolderName.find("_blind_") != string::npos) { //conditionalAsimov = 0; //} //else { //conditionalAsimov = 1; //} set<string> channelNames; if (channel == "01j") { channelNames.insert("em_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); } else if (channel == "0j") { channelNames.insert("em_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); } else if (channel == "1j") { channelNames.insert("em_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); } else if (channel == "OF01j") { channelNames.insert("em_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_sscr_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_sscr_1j"+string(!do2011?"_2012":"")); } else if (channel == "OF0j") { channelNames.insert("em_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_sscr_0j"+string(!do2011?"_2012":"")); } else if (channel == "OF1j") { channelNames.insert("em_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_sscr_1j"+string(!do2011?"_2012":"")); } else if (channel == "SF01j") { channelNames.insert("SF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); } else if (channel == "SF0j") { channelNames.insert("SF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); } else if (channel == "SF1j") { channelNames.insert("SF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); } else if (channel == "2j") { channelNames.insert("em_signalLike1_2j"+string(!do2011?"_2012":"")); channelNames.insert("ee_signalLike1_2j"+string(!do2011?"_2012":"")); channelNames.insert("SF_topbox_2j"+string(!do2011?"_2012":"")); } else if (channel == "OF2j") { channelNames.insert("em_signalLike1_2j"+string(!do2011?"_2012":"")); channelNames.insert("SF_topbox_2j"+string(!do2011?"_2012":"")); } else if (channel == "SF2j") { channelNames.insert("ee_signalLike1_2j"+string(!do2011?"_2012":"")); channelNames.insert("SF_topbox_2j"+string(!do2011?"_2012":"")); } else if (channel == "OF") { channelNames.insert("em_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_0j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike1_1j"+string(!do2011?"_2012":"")); channelNames.insert("me_signalLike2_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); channelNames.insert("em_signalLike1_2j"+string(!do2011?"_2012":"")); channelNames.insert("SF_topbox_2j"+string(!do2011?"_2012":"")); } else if (channel == "SF") { channelNames.insert("SF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_0j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_0j"+string(!do2011?"_2012":"")); channelNames.insert("SF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_AfrecSR_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_ASR_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("SF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CfrecZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_CZpeak_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_mainControl_1j"+string(!do2011?"_2012":"")); channelNames.insert("OF_topbox_1j"+string(!do2011?"_2012":"")); channelNames.insert("ee_signalLike1_2j"+string(!do2011?"_2012":"")); channelNames.insert("SF_topbox_2j"+string(!do2011?"_2012":"")); } else { cout << "Channel " << channel << " not defined. Please check!" << endl; exit(1); } // bool fix = 1; stringstream inFileName; inFileName << "workspaces/" << inFolderName << "/" << mass << ".root"; TFile f(inFileName.str().c_str()); RooWorkspace* w = (RooWorkspace*)f.Get("combWS"); if (!w) w = (RooWorkspace*)f.Get("combined"); RooDataSet* data = (RooDataSet*)w->data("combData"); if (!data) data = (RooDataSet*)w->data("obsData"); ModelConfig* mc = (ModelConfig*)w->obj("ModelConfig"); RooRealVar* weightVar = w->var("weightVar"); RooRealVar* mu = (RooRealVar*)mc->GetParametersOfInterest()->first(); if (!mu) mu = w->var("SigXsecOverSM"); const RooArgSet* mc_obs = mc->GetObservables(); const RooArgSet* mc_nuis = mc->GetNuisanceParameters(); const RooArgSet* mc_globs = mc->GetGlobalObservables(); const RooArgSet* mc_poi = mc->GetParametersOfInterest(); RooArgSet nuis = *mc_nuis; RooArgSet antiNuis = *mc_nuis; RooArgSet globs = *mc_globs; RooArgSet antiGlobs = *mc_globs; RooArgSet allParams; RooSimultaneous* simPdf = (RooSimultaneous*)mc->GetPdf(); RooCategory* cat = (RooCategory*)&simPdf->indexCat(); RooArgSet nuis_tmp = nuis; RooArgSet fullConstraints = *simPdf->getAllConstraints(*mc_obs,nuis_tmp,false); vector<string> foundChannels; vector<string> skippedChannels; cout << "Getting constraints" << endl; map<string, RooDataSet*> data_map; map<string, RooAbsPdf*> pdf_map; RooCategory* decCat = new RooCategory("dec_channel","dec_channel"); // int i = 0; TIterator* catItr = cat->typeIterator(); RooCatType* type; RooArgSet allConstraints; while ((type = (RooCatType*)catItr->Next())) { RooAbsPdf* pdf = simPdf->getPdf(type->GetName()); string typeName(type->GetName()); if (channelNames.size() && channelNames.find(typeName) == channelNames.end()) { skippedChannels.push_back(typeName); continue; } cout << "On channel " << type->GetName() << endl; foundChannels.push_back(typeName); decCat->defineType(type->GetName()); // pdf->getParameters(*data)->Print("v"); RooArgSet nuis_tmp1 = nuis; RooArgSet nuis_tmp2 = nuis; RooArgSet* constraints = pdf->getAllConstraints(*mc_obs, nuis_tmp1, true); constraints->Print(); allConstraints.add(*constraints); } catItr->Reset(); while ((type = (RooCatType*)catItr->Next())) { RooAbsPdf* pdf = simPdf->getPdf(type->GetName()); string typeName(type->GetName()); cout << "Considering type " << typeName << endl; if (channelNames.size() && channelNames.find(typeName) == channelNames.end()) continue; cout << "On channel " << type->GetName() << endl; RooArgSet nuis_tmp1 = nuis; RooArgSet nuis_tmp2 = nuis; RooArgSet* constraints = pdf->getAllConstraints(*mc_obs, nuis_tmp1, true); cout << "Adding pdf to map: " << typeName << " = " << pdf->GetName() << endl; pdf_map[typeName] = pdf; RooProdPdf prod("prod","prod",*constraints); RooArgSet* params = pdf->getParameters(*data); antiNuis.remove(*params); antiGlobs.remove(*params); allParams.add(*params); // cout << type->GetName() << endl; } // return; RooArgSet decNuis; TIterator* nuiItr = mc_nuis->createIterator(); TIterator* parItr = allParams.createIterator(); RooAbsArg* nui, *par; while ((par = (RooAbsArg*)parItr->Next())) { nuiItr->Reset(); while ((nui = (RooAbsArg*)nuiItr->Next())) { if (par == nui) decNuis.add(*nui); } } RooArgSet decGlobs; TIterator* globItr = mc_globs->createIterator(); parItr->Reset(); RooAbsArg* glob; while ((par = (RooAbsArg*)parItr->Next())) { globItr->Reset(); while ((glob = (RooAbsArg*)globItr->Next())) { if (par == glob) decGlobs.add(*glob); } } // antiNuis.Print(); // nuis.Print(); // globs.Print(); // i = 0; TList* datalist = data->split(*cat, true); TIterator* dataItr = datalist->MakeIterator(); RooAbsData* ds; while ((ds = (RooAbsData*)dataItr->Next())) { string typeName(ds->GetName()); if (channelNames.size() && channelNames.find(typeName) == channelNames.end()) continue; cout << "Adding dataset to map: " << ds->GetName() << endl; data_map[string(ds->GetName())] = (RooDataSet*)ds; cout << ds->GetName() << endl; } RooSimultaneous* decPdf = new RooSimultaneous("decPdf","decPdf",pdf_map,*decCat); RooArgSet decObs = *decPdf->getObservables(data); // decObs.add(*(RooAbsArg*)weightVar); decObs.add(*(RooAbsArg*)decCat); decObs.Print(); nuis.remove(antiNuis); globs.remove(antiGlobs); // nuis.Print("v"); RooDataSet* decData = new RooDataSet("obsData","obsData",RooArgSet(decObs,*(RooAbsArg*)weightVar),Index(*decCat),Import(data_map),WeightVar(*weightVar)); decData->Print(); RooArgSet poi(*(RooAbsArg*)mu); RooWorkspace decWS("combined"); ModelConfig decMC("ModelConfig",&decWS); decMC.SetPdf(*decPdf); decMC.SetObservables(decObs); decMC.SetNuisanceParameters(decNuis); decMC.SetGlobalObservables(decGlobs); decMC.SetParametersOfInterest(poi); decMC.Print(); decWS.import(*decPdf); decWS.import(decMC); decWS.import(*decData); // decWS.Print(); ModelConfig* mcInWs = (ModelConfig*)decWS.obj("ModelConfig"); decPdf = (RooSimultaneous*)mcInWs->GetPdf(); // setup(mcInWs); // return; mcInWs->GetNuisanceParameters()->Print("v"); mcInWs->GetGlobalObservables()->Print("v"); // decData->tree()->Scan("*"); // Make asimov data RooArgSet funcs = decWS.allFunctions(); TIterator* it = funcs.createIterator(); TObject* tempObj = 0; while((tempObj=it->Next())) { FlexibleInterpVar* flex = dynamic_cast<FlexibleInterpVar*>(tempObj); if(flex) { flex->setAllInterpCodes(flatInterpCode); } PiecewiseInterpolation* piece = dynamic_cast<PiecewiseInterpolation*>(tempObj); if(piece) { piece->setAllInterpCodes(shapeInterpCode); } } RooDataSet* dataInWs = (RooDataSet*)decWS.data("obsData"); makeAsimovData(mcInWs, conditionalAsimov && doData, &decWS, mcInWs->GetPdf(), dataInWs, 0); makeAsimovData(mcInWs, conditionalAsimov && doData, &decWS, mcInWs->GetPdf(), dataInWs, 1); makeAsimovData(mcInWs, conditionalAsimov && doData, &decWS, mcInWs->GetPdf(), dataInWs, 2); system(("mkdir -vp workspaces/"+inFolderName+"_"+channel).c_str()); stringstream outFileName; outFileName << "workspaces/" << inFolderName << "_" << channel << "/" << mass << ".root"; cout << "Exporting" << endl; decWS.writeToFile(outFileName.str().c_str()); cout << "\nIncluded the following channels: " << endl; for (int i=0;i<(int)foundChannels.size();i++) { cout << "-> " << foundChannels[i] << endl; } cout << "\nSkipping the following channels: " << endl; for (int i=0;i<(int)skippedChannels.size();i++) { cout << "-> " << skippedChannels[i] << endl; } cout << "Done" << endl; // decPdf->fitTo(*decData, Hesse(0), Minos(0), PrintLevel(0)); }
void compute_p0(const char* inFileName, const char* wsName = "combined", const char* modelConfigName = "ModelConfig", const char* dataName = "obsData", const char* asimov1DataName = "asimovData_1", const char* conditional1Snapshot = "conditionalGlobs_1", const char* nominalSnapshot = "nominalGlobs", string smass = "130", string folder = "test") { double mass; stringstream massStr; massStr << smass; massStr >> mass; double mu_profile_value = 1; // mu value to profile the obs data at wbefore generating the expected bool doConditional = 1; // do conditional expected data bool remakeData = 0; // handle unphysical pdf cases in H->ZZ->4l bool doUncap = 1; // uncap p0 bool doInj = 0; // setup the poi for injection study (zero is faster if you're not) bool doObs = 1; // compute median significance bool doMedian = 1; // compute observed significance TStopwatch timer; timer.Start(); TFile f(inFileName); RooWorkspace* ws = (RooWorkspace*)f.Get(wsName); if (!ws) { cout << "ERROR::Workspace: " << wsName << " doesn't exist!" << endl; return; } ModelConfig* mc = (ModelConfig*)ws->obj(modelConfigName); if (!mc) { cout << "ERROR::ModelConfig: " << modelConfigName << " doesn't exist!" << endl; return; } RooDataSet* data = (RooDataSet*)ws->data(dataName); if (!data) { cout << "ERROR::Dataset: " << dataName << " doesn't exist!" << endl; return; } mc->GetNuisanceParameters()->Print("v"); ROOT::Math::MinimizerOptions::SetDefaultMinimizer("Minuit2"); ROOT::Math::MinimizerOptions::SetDefaultStrategy(0); ROOT::Math::MinimizerOptions::SetDefaultPrintLevel(1); cout << "Setting max function calls" << endl; ws->loadSnapshot("conditionalNuis_0"); RooArgSet nuis(*mc->GetNuisanceParameters()); RooRealVar* mu = (RooRealVar*)mc->GetParametersOfInterest()->first(); RooAbsPdf* pdf = mc->GetPdf(); string condSnapshot(conditional1Snapshot); RooArgSet nuis_tmp2 = *mc->GetNuisanceParameters(); RooNLLVar* obs_nll = doObs ? (RooNLLVar*)pdf->createNLL(*data, Constrain(nuis_tmp2)) : NULL; RooDataSet* asimovData1 = (RooDataSet*)ws->data(asimov1DataName); RooRealVar* emb = (RooRealVar*)mc->GetNuisanceParameters()->find("ATLAS_EMB"); if (!asimovData1 || (string(inFileName).find("ic10") != string::npos && emb)) { if (emb) emb->setVal(0.7); cout << "Asimov data doesn't exist! Please, allow me to build one for you..." << endl; string mu_str, mu_prof_str; asimovData1 = makeAsimovData(mc, doConditional, ws, obs_nll, 1, &mu_str, &mu_prof_str, mu_profile_value, true); condSnapshot="conditionalGlobs"+mu_prof_str; } if (!doUncap) mu->setRange(0, 40); else mu->setRange(-40, 40); RooAbsPdf* pdf = mc->GetPdf(); RooArgSet nuis_tmp1 = *mc->GetNuisanceParameters(); RooNLLVar* asimov_nll = (RooNLLVar*)pdf->createNLL(*asimovData1, Constrain(nuis_tmp1)); //do asimov mu->setVal(1); mu->setConstant(0); if (!doInj) mu->setConstant(1); int status,sign; double med_sig=0,obs_sig=0,asimov_q0=0,obs_q0=0; if (doMedian) { ws->loadSnapshot(condSnapshot.c_str()); if (doInj) ws->loadSnapshot("conditionalNuis_inj"); else ws->loadSnapshot("conditionalNuis_1"); mc->GetGlobalObservables()->Print("v"); mu->setVal(0); mu->setConstant(1); status = minimize(asimov_nll, ws); if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(asimov_nll, ws); if (status >= 0) cout << "Success!" << endl; } double asimov_nll_cond = asimov_nll->getVal(); mu->setVal(1); if (doInj) ws->loadSnapshot("conditionalNuis_inj"); else ws->loadSnapshot("conditionalNuis_1"); if (doInj) mu->setConstant(0); status = minimize(asimov_nll, ws); if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(asimov_nll, ws); if (status >= 0) cout << "Success!" << endl; } double asimov_nll_min = asimov_nll->getVal(); asimov_q0 = 2*(asimov_nll_cond - asimov_nll_min); if (doUncap && mu->getVal() < 0) asimov_q0 = -asimov_q0; sign = int(asimov_q0 != 0 ? asimov_q0/fabs(asimov_q0) : 0); med_sig = sign*sqrt(fabs(asimov_q0)); ws->loadSnapshot(nominalSnapshot); } if (doObs) { ws->loadSnapshot("conditionalNuis_0"); mu->setVal(0); mu->setConstant(1); status = minimize(obs_nll, ws); if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(obs_nll, ws); if (status >= 0) cout << "Success!" << endl; } double obs_nll_cond = obs_nll->getVal(); mu->setConstant(0); status = minimize(obs_nll, ws); if (status < 0) { cout << "Retrying with conditional snapshot at mu=1" << endl; ws->loadSnapshot("conditionalNuis_0"); status = minimize(obs_nll, ws); if (status >= 0) cout << "Success!" << endl; } double obs_nll_min = obs_nll->getVal(); obs_q0 = 2*(obs_nll_cond - obs_nll_min); if (doUncap && mu->getVal() < 0) obs_q0 = -obs_q0; sign = int(obs_q0 == 0 ? 0 : obs_q0 / fabs(obs_q0)); if (!doUncap && (obs_q0 < 0 && obs_q0 > -0.1 || mu->getVal() < 0.001)) obs_sig = 0; else obs_sig = sign*sqrt(fabs(obs_q0)); } // Report results cout << "obs: " << obs_sig << endl; cout << "Observed significance: " << obs_sig << endl; cout << "Corresponding to a p-value of " << (1-ROOT::Math::gaussian_cdf( obs_sig )) << endl; if (med_sig) { cout << "Median test stat val: " << asimov_q0 << endl; cout << "Median significance: " << med_sig << endl; } f.Close(); stringstream fileName; fileName << "root-files/" << folder << "/" << mass << ".root"; system(("mkdir -vp root-files/" + folder).c_str()); TFile f2(fileName.str().c_str(),"recreate"); TH1D* h_hypo = new TH1D("hypo","hypo",2,0,2); h_hypo->SetBinContent(1, obs_sig); h_hypo->SetBinContent(2, med_sig); f2.Write(); f2.Close(); timer.Stop(); timer.Print(); }
int DiagnosisMacro(int Nbins = 10, int Nsigma = 10, int CPUused = 1, TString Filename = "FIT_DATA_Psi2SJpsi_PPPrompt_Bkg_SecondOrderChebychev_pt65300_rap016_cent0200_262620_263757.root", TString Outputdir = "./") //Nbins: Number of points for which to calculate profile likelihood. Time required is about (1/CPU) minutes per point per parameter. 0 means do plain likelihood only //Nsigma: The range in which the scan is performed (value-Nsigma*sigma, value+Nsigma*sigma) //CPUused: anything larger than 1 causes weird fit results on my laptop, runs fine on lxplus with more (16) { // R e a d w o r k s p a c e f r o m f i l e // ----------------------------------------------- // Open input file with workspace //Filename = "FIT_DATA_Psi2SJpsi_PP_Jpsi_DoubleCrystalBall_Psi2S_DoubleCrystalBall_Bkg_Chebychev2_pt6590_rap016_cent0200.root"; //Filename = "FIT_DATA_Psi2SJpsi_PbPb_Jpsi_DoubleCrystalBall_Psi2S_DoubleCrystalBall_Bkg_Chebychev1_pt6590_rap016_cent0200.root"; TFile *f = new TFile(Filename); // Retrieve workspace from file RooWorkspace* w = (RooWorkspace*)f->Get("workspace"); // Retrieve x,model and data from workspace RooRealVar* x = w->var("invMass"); RooAbsPdf* model = w->pdf("simPdf_syst"); if (model == 0) { model = w->pdf("simPdf"); } if (model == 0) { model = w->pdf("pdfMASS_Tot_PP"); } if (model == 0) { model = w->pdf("pdfMASS_Tot_PbPb"); } if (model == 0) { cout << "[ERROR] pdf failed to load from the workspace" << endl; return false; } RooAbsData* data = w->data("dOS_DATA"); if (data == 0) { data = w->data("dOS_DATA_PP"); } if (data == 0) { data = w->data("dOS_DATA_PbPb"); } if (data == 0) { cout << "[ERROR] data failed to load from the workspace" << endl; return false; } // Print structure of composite p.d.f. model->Print("t"); /* // P l o t m o d e l // --------------------------------------------------------- // Plot data and PDF overlaid RooPlot* xframe = x->frame(Title("J/psi Model and Data")); data->plotOn(xframe); model->plotOn(xframe); // Draw the frame on the canvas TCanvas* c2 = new TCanvas("PlotModel", "PlotModel", 1000, 1000); gPad->SetLeftMargin(0.15); xframe->GetYaxis()->SetTitleOffset(2.0); xframe->Draw();//*/ ///// Check parameters RooArgSet* paramSet1 = model->getDependents(data); paramSet1->Print("v"); // Just check RooArgSet* paramSet2 = model->getParameters(data); paramSet2->Print("v"); int Nparams = paramSet2->getSize(); cout << "Number of parameters: " << Nparams<<endl<<endl; // C o n s t r u c t p l a i n l i k e l i h o o d // --------------------------------------------------- // Construct unbinned likelihood RooAbsReal* nll = model->createNLL(*data, NumCPU(CPUused)); // Minimize likelihood w.r.t all parameters before making plots RooMinuit(*nll).migrad(); ////////////////////////////////////////////////////// /////////////////// L O O P O V E R P A R A M E T E R S ///////////////////////////////////////////////////// /// Set up loop over parameters TString ParamName; double ParamValue; double ParamError; double ParamLimitLow; double ParamLimitHigh; double FitRangeLow; double FitRangeHigh; RooRealVar* vParam; int counter = 0; // Loop start TIterator* iter = paramSet2->createIterator(); TObject* var = iter->Next(); while (var != 0) { counter++; ParamName = var->GetName(); vParam = w->var(ParamName); ParamValue = vParam->getVal(); ParamError = vParam->getError(); ParamLimitLow = vParam->getMin(); ParamLimitHigh = vParam->getMax(); cout << ParamName << " has value " << ParamValue << " with error: " << ParamError << " and limits: " << ParamLimitLow << " to " << ParamLimitHigh << endl << endl; if (ParamError == 0) { //Skipping fixed parameters cout << "Parameter was fixed, skipping its fitting" << endl; cout << endl << "DONE WITH " << counter << " PARAMETER OUT OF " << Nparams << endl << endl; var = iter->Next(); continue; } // determining fit range: Nsigma sigma on each side unless it would be outside of parameter limits if ((ParamValue - Nsigma * ParamError) > ParamLimitLow) { FitRangeLow = (ParamValue - Nsigma * ParamError); } else { FitRangeLow = ParamLimitLow; } if ((ParamValue + Nsigma * ParamError) < ParamLimitHigh) { FitRangeHigh = (ParamValue + Nsigma * ParamError); } else { FitRangeHigh = ParamLimitHigh; } // P l o t p l a i n l i k e l i h o o d a n d C o n s t r u c t p r o f i l e l i k e l i h o o d // --------------------------------------------------- RooPlot* frame1; RooAbsReal* pll=NULL; if (Nbins != 0) { frame1 = vParam->frame(Bins(Nbins), Range(FitRangeLow, FitRangeHigh), Title(TString::Format("LL and profileLL in %s", ParamName.Data()))); nll->plotOn(frame1, ShiftToZero()); pll = nll->createProfile(*vParam); // Plot the profile likelihood pll->plotOn(frame1, LineColor(kRed), RooFit::Precision(-1)); } else { //Skip profile likelihood frame1 = vParam->frame(Bins(10), Range(FitRangeLow, FitRangeHigh), Title(TString::Format("LL and profileLL in %s", ParamName.Data()))); nll->plotOn(frame1, ShiftToZero()); } // D r a w a n d s a v e p l o t s // ----------------------------------------------------------------------- // Adjust frame maximum for visual clarity frame1->SetMinimum(0); frame1->SetMaximum(20); TCanvas* c = new TCanvas("CLikelihoodResult", "CLikelihoodResult", 800, 600); c->cd(1); gPad->SetLeftMargin(0.15); frame1->GetYaxis()->SetTitleOffset(1.4); frame1->Draw(); TLegend* leg = new TLegend(0.70, 0.70, 0.95, 0.88, ""); leg->SetFillColor(kWhite); leg->SetBorderSize(0); leg->SetTextSize(0.035); TLegendEntry *le1 = leg->AddEntry(nll, "Plain likelihood", "l"); le1->SetLineColor(kBlue); le1->SetLineWidth(3); TLegendEntry *le2 = leg->AddEntry(pll, "Profile likelihood", "l"); le2->SetLineColor(kRed); le2->SetLineWidth(3); leg->Draw("same"); //Save plot TString StrippedName = TString(Filename(Filename.Last('/')+1,Filename.Length())); StrippedName = StrippedName.ReplaceAll(".root",""); cout << StrippedName << endl; gSystem->mkdir(Form("%s/root/%s", Outputdir.Data(), StrippedName.Data()), kTRUE); c->SaveAs(Form("%s/root/%s/Likelihood_scan_%s.root", Outputdir.Data(), StrippedName.Data(), ParamName.Data())); gSystem->mkdir(Form("%s/pdf/%s", Outputdir.Data(), StrippedName.Data()), kTRUE); c->SaveAs(Form("%s/pdf/%s/Likelihood_scan_%s.pdf", Outputdir.Data(), StrippedName.Data(), ParamName.Data())); gSystem->mkdir(Form("%s/png/%s", Outputdir.Data(), StrippedName.Data()), kTRUE); c->SaveAs(Form("%s/png/%s/Likelihood_scan_%s.png", Outputdir.Data(), StrippedName.Data(), ParamName.Data())); delete c; delete frame1; if (pll) delete pll; cout << endl << "DONE WITH " << counter << " PARAMETER OUT OF " << Nparams << endl << endl; //if (counter == 2){ break; } //Exit - for testing var = iter->Next(); } // End of the loop return true; }
int main() { TFile *tf = TFile::Open("root/MassFitResult.root"); RooWorkspace *w = (RooWorkspace*)tf->Get("w"); RooDataSet *data = (RooDataSet*)w->data("Data2012HadronTOS"); //w->loadSnapshot("bs2kstkst_mc_pdf_fit"); //RooRealVar *bs2kstkst_l = new RooRealVar("bs2kstkst_l" , "", -5., -20., 0.); //RooConstVar *bs2kstkst_zeta = new RooConstVar("bs2kstkst_zeta" , "", 0.); //RooConstVar *bs2kstkst_fb = new RooConstVar("bs2kstkst_fb" , "", 0.); //RooRealVar *bs2kstkst_sigma = new RooRealVar("bs2kstkst_sigma" , "", 15, 10, 100); //RooRealVar *bs2kstkst_mu = new RooRealVar("bs2kstkst_mu" , "", 5350, 5400 ); //RooRealVar *bs2kstkst_a = new RooRealVar("bs2kstkst_a" , "", 2.5,0,10); //RooRealVar *bs2kstkst_n = new RooRealVar("bs2kstkst_n" , "", 2.5,0,10); //RooRealVar *bs2kstkst_a2 = new RooRealVar("bs2kstkst_a2" , "", 2.5,0,10); //RooRealVar *bs2kstkst_n2 = new RooRealVar("bs2kstkst_n2" , "", 2.5,0,10); //RooIpatia2 *sig = new RooIpatia2("sig","",*w->var("B_s0_DTF_B_s0_M"), *bs2kstkst_l, *bs2kstkst_zeta, *bs2kstkst_fb, *bs2kstkst_sigma, *bs2kstkst_mu, *bs2kstkst_a, *bs2kstkst_n, *bs2kstkst_a2, *bs2kstkst_n2); //RooAbsPdf *sig = (RooAbsPdf*)w->pdf("bs2kstkst_mc_pdf"); RooIpatia2 *sig = new RooIpatia2("bs2kstkst_mc_pdf","bs2kstkst_mc_pdf",*w->var("B_s0_DTF_B_s0_M"),*w->var("bs2kstkst_l"),*w->var("bs2kstkst_zeta"),*w->var("bs2kstkst_fb"),*w->var("bs2kstkst_sigma"),*w->var("bs2kstkst_mu"),*w->var("bs2kstkst_a"),*w->var("bs2kstkst_n"),*w->var("bs2kstkst_a2"),*w->var("bs2kstkst_n2")); RooAbsPdf *bkg = (RooAbsPdf*)w->pdf("bkg_pdf_HadronTOS2012"); RooRealVar *sY = (RooRealVar*)w->var("bs2kstkst_y_HadronTOS2012"); RooRealVar *bY = (RooRealVar*)w->var("bkg_y_HadronTOS2012"); cout << sig << bkg << sY << bY << endl; RooAddPdf *pdf = new RooAddPdf("test","test", RooArgList(*sig,*bkg), RooArgList(*sY,*bY) ); pdf->fitTo(*data, Extended() ); // my sw double syVal = sY->getVal(); double byVal = bY->getVal(); // loop events int numevents = data->numEntries(); sY->setVal(0.); bY->setVal(0.); RooArgSet *pdfvars = pdf->getVariables(); vector<double> fsvals; vector<double> fbvals; for ( int ievt=0; ievt<numevents; ievt++ ) { RooStats::SetParameters(data->get(ievt), pdfvars); sY->setVal(1.); double f_s = pdf->getVal( RooArgSet(*w->var("B_s0_DTF_B_s0_M")) ); fsvals.push_back(f_s); sY->setVal(0.); bY->setVal(1.); double f_b = pdf->getVal( RooArgSet(*w->var("B_s0_DTF_B_s0_M")) ); fbvals.push_back(f_b); bY->setVal(0.); //cout << f_s << " " << f_b << endl; } TMatrixD covInv(2,2); covInv[0][0] = 0; covInv[0][1] = 0; covInv[1][0] = 0; covInv[1][1] = 0; for ( int ievt=0; ievt<numevents; ievt++ ) { data->get(ievt); double dsum=0; dsum += fsvals[ievt] * syVal; dsum += fbvals[ievt] * byVal; covInv[0][0] += fsvals[ievt]*fsvals[ievt] / (dsum*dsum); covInv[0][1] += fsvals[ievt]*fbvals[ievt] / (dsum*dsum); covInv[1][0] += fbvals[ievt]*fsvals[ievt] / (dsum*dsum); covInv[1][1] += fbvals[ievt]*fbvals[ievt] / (dsum*dsum); } covInv.Print(); cout << covInv.Determinant() << endl; TMatrixD covMatrix(TMatrixD::kInverted,covInv); covMatrix.Print(); RooStats::SPlot *sD = new RooStats::SPlot("sD","sD",*data,pdf,RooArgSet(*sY,*bY),RooArgSet(*w->var("eventNumber"))); }