vector<Double_t*> simFit(bool makeSoupFit_ = false, const string tnp_ = "etoTauMargLooseNoCracks70", const string category_ = "tauAntiEMVA", const string bin_ = "abseta<1.5", const float binCenter_ = 0.75, const float binWidth_ = 0.75, const float xLow_=60, const float xHigh_=120, bool SumW2_ = false, bool verbose_ = true){ vector<Double_t*> out; //return out; //TFile *test = new TFile( outFile->GetName(),"UPDATE"); // output file TFile *test = new TFile( Form("EtoTauPlotsFit_%s_%s_%f.root",tnp_.c_str(),category_.c_str(),binCenter_),"RECREATE"); test->mkdir(Form("bin%f",binCenter_)); TCanvas *c = new TCanvas("fitCanvas",Form("fitCanvas_%s_%s",tnp_.c_str(),bin_.c_str()),10,30,650,600); c->SetGrid(0,0); c->SetFillStyle(4000); c->SetFillColor(10); c->SetTicky(); c->SetObjectStat(0); TCanvas *c2 = new TCanvas("fitCanvasTemplate",Form("fitCanvasTemplate_%s_%s",tnp_.c_str(),bin_.c_str()),10,30,650,600); c2->SetGrid(0,0); c2->SetFillStyle(4000); c2->SetFillColor(10); c2->SetTicky(); c2->SetObjectStat(0); // input files TFile fsup("/data_CMS/cms/lbianchini/tagAndProbe/trees/38XWcut/testNewWriteFromPAT_soup.root"); TFile fbkg("/data_CMS/cms/lbianchini/tagAndProbe/trees/38XWcut/testNewWriteFromPAT_soup_bkg.root"); TFile fsgn("/data_CMS/cms/lbianchini/tagAndProbe/trees/38XWcut/testNewWriteFromPAT_soup_sgn.root"); TFile fdat("/data_CMS/cms/lbianchini/tagAndProbe/trees/38XWcut/testNewWriteFromPAT_Data.root"); // data from 2iter: //TFile fdat("/data_CMS/cms/lbianchini/35pb/testNewWriteFromPAT_Data.root"); //********************** signal only tree *************************/ TTree *fullTreeSgn = (TTree*)fsgn.Get((tnp_+"/fitter_tree").c_str()); TH1F* hSall = new TH1F("hSall","",1,0,150); TH1F* hSPall = new TH1F("hSPall","",1,0,150); TH1F* hS = new TH1F("hS","",1,0,150); TH1F* hSP = new TH1F("hSP","",1,0,150); fullTreeSgn->Draw("mass>>hS",Form("weight*(%s && mass>%f && mass<%f && mcTrue && signalPFChargedHadrCands<1.5)",bin_.c_str(),xLow_,xHigh_)); fullTreeSgn->Draw("mass>>hSall",Form("weight*(%s && mass>%f && mass<%f)",bin_.c_str(),xLow_,xHigh_)); float SGNtrue = hS->Integral(); float SGNall = hSall->Integral(); fullTreeSgn->Draw("mass>>hSP",Form("weight*(%s && %s>0 && mass>%f && mass<%f && mcTrue && signalPFChargedHadrCands<1.5 )",bin_.c_str(),category_.c_str(),xLow_,xHigh_)); fullTreeSgn->Draw("mass>>hSPall",Form("weight*(%s && %s>0 && mass>%f && mass<%f && signalPFChargedHadrCands<1.5 )",bin_.c_str(),category_.c_str(),xLow_,xHigh_)); float SGNtruePass = hSP->Integral(); float SGNallPass = hSPall->Integral(); //********************** background only tree *************************// TTree *fullTreeBkg = (TTree*)fbkg.Get((tnp_+"/fitter_tree").c_str()); TH1F* hB = new TH1F("hB","",1,0,150); TH1F* hBP = new TH1F("hBP","",1,0,150); fullTreeBkg->Draw("mass>>hB",Form("weight*(%s && mass>%f && mass<%f && signalPFChargedHadrCands<1.5 )",bin_.c_str(),xLow_,xHigh_)); float BKG = hB->Integral(); float BKGUnWeighted = hB->GetEntries(); fullTreeBkg->Draw("mass>>hBP",Form("weight*(%s && %s>0 && mass>%f && mass<%f && signalPFChargedHadrCands<1.5 )",bin_.c_str(),category_.c_str(),xLow_,xHigh_)); float BKGPass = hBP->Integral(); float BKGUnWeightedPass = hBP->GetEntries(); float BKGFail = BKG-BKGPass; cout << "*********** BKGFail " << BKGFail << endl; //********************** soup tree *************************// TTree *fullTreeSoup = (TTree*)fsup.Get((tnp_+"/fitter_tree").c_str()); //********************** data tree *************************// TTree *fullTreeData = (TTree*)fdat.Get((tnp_+"/fitter_tree").c_str()); //********************** workspace ***********************// RooWorkspace *w = new RooWorkspace("w","w"); // tree variables to be imported w->factory("mass[30,120]"); w->factory("weight[0,10000]"); w->factory("abseta[0,2.5]"); w->factory("pt[0,200]"); w->factory("mcTrue[0,1]"); w->factory("signalPFChargedHadrCands[0,10]"); w->factory((category_+"[0,1]").c_str()); // background pass pdf for MC w->factory("RooExponential::McBackgroundPdfP(mass,McCP[0,-10,10])"); // background fail pdf for MC w->factory("RooExponential::McBackgroundPdfF(mass,McCF[0,-10,10])"); // background pass pdf for Data w->factory("RooExponential::DataBackgroundPdfP(mass,DataCP[0,-10,10])"); // background fail pdf for Data w->factory("RooExponential::DataBackgroundPdfF(mass,DataCF[0,-10,10])"); // fit parameters for background w->factory("McEfficiency[0.04,0,1]"); w->factory("McNumSgn[0,1000000]"); w->factory("McNumBkgP[0,100000]"); w->factory("McNumBkgF[0,100000]"); w->factory("expr::McNumSgnP('McEfficiency*McNumSgn',McEfficiency,McNumSgn)"); w->factory("expr::McNumSgnF('(1-McEfficiency)*McNumSgn',McEfficiency,McNumSgn)"); w->factory("McPassing[pass=1,fail=0]"); // fit parameters for data w->factory("DataEfficiency[0.1,0,1]"); w->factory("DataNumSgn[0,1000000]"); w->factory("DataNumBkgP[0,1000000]"); w->factory("DataNumBkgF[0,10000]"); w->factory("expr::DataNumSgnP('DataEfficiency*DataNumSgn',DataEfficiency,DataNumSgn)"); w->factory("expr::DataNumSgnF('(1-DataEfficiency)*DataNumSgn',DataEfficiency,DataNumSgn)"); w->factory("DataPassing[pass=1,fail=0]"); RooRealVar *weight = w->var("weight"); RooRealVar *abseta = w->var("abseta"); RooRealVar *pt = w->var("pt"); RooRealVar *mass = w->var("mass"); mass->setRange(xLow_,xHigh_); RooRealVar *mcTrue = w->var("mcTrue"); RooRealVar *cut = w->var( category_.c_str() ); RooRealVar *signalPFChargedHadrCands = w->var("signalPFChargedHadrCands"); // build the template for the signal pass sample: RooDataSet templateP("templateP","dataset for signal-pass template", RooArgSet(*mass,*weight,*abseta,*pt,*cut,*mcTrue,*signalPFChargedHadrCands), Import( *fullTreeSgn ), /*WeightVar( *weight ),*/ Cut( Form("(mcTrue && %s>0.5 && %s && signalPFChargedHadrCands<1.5)",category_.c_str(),bin_.c_str()) ) ); // build the template for the signal fail sample: RooDataSet templateF("templateF","dataset for signal-fail template", RooArgSet(*mass,*weight,*abseta,*pt,*cut,*mcTrue,*signalPFChargedHadrCands), Import( *fullTreeSgn ), /*WeightVar( *weight ),*/ Cut( Form("(mcTrue && %s<0.5 && %s && signalPFChargedHadrCands<1.5)",category_.c_str(),bin_.c_str()) ) ); mass->setBins(24); RooDataHist templateHistP("templateHistP","",RooArgSet(*mass), templateP, 1.0); RooHistPdf TemplateSignalPdfP("TemplateSignalPdfP","",RooArgSet(*mass),templateHistP); w->import(TemplateSignalPdfP); mass->setBins(24); RooDataHist templateHistF("templateHistF","",RooArgSet(*mass),templateF,1.0); RooHistPdf TemplateSignalPdfF("TemplateSignalPdfF","",RooArgSet(*mass),templateHistF); w->import(TemplateSignalPdfF); mass->setBins(10000,"fft"); RooPlot* TemplateFrameP = mass->frame(Bins(24),Title("Template passing")); templateP.plotOn(TemplateFrameP); w->pdf("TemplateSignalPdfP")->plotOn(TemplateFrameP); RooPlot* TemplateFrameF = mass->frame(Bins(24),Title("Template failing")); templateF.plotOn(TemplateFrameF); w->pdf("TemplateSignalPdfF")->plotOn(TemplateFrameF); //w->factory("RooFFTConvPdf::McSignalPdfP(mass,TemplateSignalPdfP,RooTruthModel::McResolModP(mass))"); //w->factory("RooFFTConvPdf::McSignalPdfF(mass,TemplateSignalPdfF,RooTruthModel::McResolModF(mass))"); // FOR GREGORY: PROBLEM WHEN TRY TO USE THE PURE TEMPLATE => RooHistPdf McSignalPdfP("McSignalPdfP","McSignalPdfP",RooArgSet(*mass),templateHistP); RooHistPdf McSignalPdfF("McSignalPdfF","McSignalPdfF",RooArgSet(*mass),templateHistF); w->import(McSignalPdfP); w->import(McSignalPdfF); // FOR GREGORY: FOR DATA, CONVOLUTION IS OK => w->factory("RooFFTConvPdf::DataSignalPdfP(mass,TemplateSignalPdfP,RooGaussian::DataResolModP(mass,DataMeanResP[0.0,-5.,5.],DataSigmaResP[0.5,0.,10]))"); w->factory("RooFFTConvPdf::DataSignalPdfF(mass,TemplateSignalPdfF,RooGaussian::DataResolModF(mass,DataMeanResF[-5.,-10.,10.],DataSigmaResF[0.5,0.,10]))"); //w->factory("RooCBShape::DataSignalPdfF(mass,DataMeanF[91.2,88,95.],DataSigmaF[3,0.5,8],DataAlfaF[1.8,0.,10],DataNF[1.0,1e-06,10])"); //w->factory("RooFFTConvPdf::DataSignalPdfF(mass,RooVoigtian::DataVoigF(mass,DataMeanF[85,80,95],DataWidthF[2.49],DataSigmaF[3,0.5,10]),RooCBShape::DataResolModF(mass,DataMeanResF[0.5,0.,10.],DataSigmaResF[0.5,0.,10],DataAlphaResF[0.5,0.,10],DataNResF[1.0,1e-06,10]))"); //w->factory("SUM::DataSignalPdfF(fVBP[0.5,0,1]*RooBifurGauss::bifF(mass,DataMeanResF[91.2,80,95],sigmaLF[10,0.5,40],sigmaRF[0.]), RooVoigtian::voigF(mass, DataMeanResF, widthF[2.49], sigmaVoigF[5,0.1,10]) )" ); // composite model pass for MC w->factory("SUM::McModelP(McNumSgnP*McSignalPdfP,McNumBkgP*McBackgroundPdfP)"); w->factory("SUM::McModelF(McNumSgnF*McSignalPdfF,McNumBkgF*McBackgroundPdfF)"); // composite model pass for data w->factory("SUM::DataModelP(DataNumSgnP*DataSignalPdfP,DataNumBkgP*DataBackgroundPdfP)"); w->factory("SUM::DataModelF(DataNumSgnF*DataSignalPdfF,DataNumBkgF*DataBackgroundPdfF)"); // simultaneous fir for MC w->factory("SIMUL::McModel(McPassing,pass=McModelP,fail=McModelF)"); // simultaneous fir for data w->factory("SIMUL::DataModel(DataPassing,pass=DataModelP,fail=DataModelF)"); w->Print("V"); w->saveSnapshot("clean", w->allVars()); w->loadSnapshot("clean"); /****************** sim fit to soup **************************/ /////////////////////////////////////////////////////////////// TFile *f = new TFile("dummySoup.root","RECREATE"); TTree* cutTreeSoupP = fullTreeSoup->CopyTree(Form("(%s>0.5 && %s && signalPFChargedHadrCands<1.5)",category_.c_str(),bin_.c_str())); TTree* cutTreeSoupF = fullTreeSoup->CopyTree(Form("(%s<0.5 && %s && signalPFChargedHadrCands<1.5)",category_.c_str(),bin_.c_str())); RooDataSet McDataP("McDataP","dataset pass for the soup", RooArgSet(*mass), Import( *cutTreeSoupP ) ); RooDataSet McDataF("McDataF","dataset fail for the soup", RooArgSet(*mass), Import( *cutTreeSoupF ) ); RooDataHist McCombData("McCombData","combined data for the soup", RooArgSet(*mass), Index(*(w->cat("McPassing"))), Import("pass", *(McDataP.createHistogram("histoP",*mass)) ), Import("fail",*(McDataF.createHistogram("histoF",*mass)) ) ) ; RooPlot* McFrameP = 0; RooPlot* McFrameF = 0; RooRealVar* McEffFit = 0; if(makeSoupFit_){ cout << "**************** N bins in mass " << w->var("mass")->getBins() << endl; RooFitResult* ResMcCombinedFit = w->pdf("McModel")->fitTo(McCombData, Extended(1), Minos(1), Save(1), SumW2Error( SumW2_ ), Range(xLow_,xHigh_), NumCPU(4) /*, ExternalConstraints( *(w->pdf("ConstrainMcNumBkgF")) )*/ ); test->cd(Form("bin%f",binCenter_)); ResMcCombinedFit->Write("McFitResults_Combined"); RooArgSet McFitParam(ResMcCombinedFit->floatParsFinal()); McEffFit = (RooRealVar*)(&McFitParam["McEfficiency"]); RooRealVar* McNumSigFit = (RooRealVar*)(&McFitParam["McNumSgn"]); RooRealVar* McNumBkgPFit = (RooRealVar*)(&McFitParam["McNumBkgP"]); RooRealVar* McNumBkgFFit = (RooRealVar*)(&McFitParam["McNumBkgF"]); McFrameP = mass->frame(Bins(24),Title("MC: passing sample")); McCombData.plotOn(McFrameP,Cut("McPassing==McPassing::pass")); w->pdf("McModel")->plotOn(McFrameP,Slice(*(w->cat("McPassing")),"pass"), ProjWData(*(w->cat("McPassing")),McCombData), LineColor(kBlue),Range(xLow_,xHigh_)); w->pdf("McModel")->plotOn(McFrameP,Slice(*(w->cat("McPassing")),"pass"), ProjWData(*(w->cat("McPassing")),McCombData), Components("McSignalPdfP"), LineColor(kRed),Range(xLow_,xHigh_)); w->pdf("McModel")->plotOn(McFrameP,Slice(*(w->cat("McPassing")),"pass"), ProjWData(*(w->cat("McPassing")),McCombData), Components("McBackgroundPdfP"), LineColor(kGreen),Range(xLow_,xHigh_)); McFrameF = mass->frame(Bins(24),Title("MC: failing sample")); McCombData.plotOn(McFrameF,Cut("McPassing==McPassing::fail")); w->pdf("McModel")->plotOn(McFrameF,Slice(*(w->cat("McPassing")),"fail"), ProjWData(*(w->cat("McPassing")),McCombData), LineColor(kBlue),Range(xLow_,xHigh_)); w->pdf("McModel")->plotOn(McFrameF,Slice(*(w->cat("McPassing")),"fail"), ProjWData(*(w->cat("McPassing")),McCombData), Components("McSignalPdfF"), LineColor(kRed),Range(xLow_,xHigh_)); w->pdf("McModel")->plotOn(McFrameF,Slice(*(w->cat("McPassing")),"fail"), ProjWData(*(w->cat("McPassing")),McCombData), Components("McBackgroundPdfF"), LineColor(kGreen),Range(xLow_,xHigh_)); } /////////////////////////////////////////////////////////////// /****************** sim fit to data **************************/ /////////////////////////////////////////////////////////////// TFile *f2 = new TFile("dummyData.root","RECREATE"); TTree* cutTreeDataP = fullTreeData->CopyTree(Form("(%s>0.5 && %s && signalPFChargedHadrCands<1.5)",category_.c_str(),bin_.c_str())); TTree* cutTreeDataF = fullTreeData->CopyTree(Form("(%s<0.5 && %s && signalPFChargedHadrCands<1.5)",category_.c_str(),bin_.c_str())); RooDataSet DataDataP("DataDataP","dataset pass for the soup", RooArgSet(*mass), Import( *cutTreeDataP ) ); RooDataSet DataDataF("DataDataF","dataset fail for the soup", RooArgSet(*mass), Import( *cutTreeDataF ) ); RooDataHist DataCombData("DataCombData","combined data for the soup", RooArgSet(*mass), Index(*(w->cat("DataPassing"))), Import("pass",*(DataDataP.createHistogram("histoDataP",*mass))),Import("fail",*(DataDataF.createHistogram("histoDataF",*mass)))) ; RooFitResult* ResDataCombinedFit = w->pdf("DataModel")->fitTo(DataCombData, Extended(1), Minos(1), Save(1), SumW2Error( SumW2_ ), Range(xLow_,xHigh_), NumCPU(4)); test->cd(Form("bin%f",binCenter_)); ResDataCombinedFit->Write("DataFitResults_Combined"); RooArgSet DataFitParam(ResDataCombinedFit->floatParsFinal()); RooRealVar* DataEffFit = (RooRealVar*)(&DataFitParam["DataEfficiency"]); RooRealVar* DataNumSigFit = (RooRealVar*)(&DataFitParam["DataNumSgn"]); RooRealVar* DataNumBkgPFit = (RooRealVar*)(&DataFitParam["DataNumBkgP"]); RooRealVar* DataNumBkgFFit = (RooRealVar*)(&DataFitParam["DataNumBkgF"]); RooPlot* DataFrameP = mass->frame(Bins(24),Title("Data: passing sample")); DataCombData.plotOn(DataFrameP,Cut("DataPassing==DataPassing::pass")); w->pdf("DataModel")->plotOn(DataFrameP,Slice(*(w->cat("DataPassing")),"pass"), ProjWData(*(w->cat("DataPassing")),DataCombData), LineColor(kBlue),Range(xLow_,xHigh_)); w->pdf("DataModel")->plotOn(DataFrameP,Slice(*(w->cat("DataPassing")),"pass"), ProjWData(*(w->cat("DataPassing")),DataCombData), Components("DataSignalPdfP"), LineColor(kRed),Range(xLow_,xHigh_)); w->pdf("DataModel")->plotOn(DataFrameP,Slice(*(w->cat("DataPassing")),"pass"), ProjWData(*(w->cat("DataPassing")),DataCombData), Components("DataBackgroundPdfP"), LineColor(kGreen),LineStyle(kDashed),Range(xLow_,xHigh_)); RooPlot* DataFrameF = mass->frame(Bins(24),Title("Data: failing sample")); DataCombData.plotOn(DataFrameF,Cut("DataPassing==DataPassing::fail")); w->pdf("DataModel")->plotOn(DataFrameF,Slice(*(w->cat("DataPassing")),"fail"), ProjWData(*(w->cat("DataPassing")),DataCombData), LineColor(kBlue),Range(xLow_,xHigh_)); w->pdf("DataModel")->plotOn(DataFrameF,Slice(*(w->cat("DataPassing")),"fail"), ProjWData(*(w->cat("DataPassing")),DataCombData), Components("DataSignalPdfF"), LineColor(kRed),Range(xLow_,xHigh_)); w->pdf("DataModel")->plotOn(DataFrameF,Slice(*(w->cat("DataPassing")),"fail"), ProjWData(*(w->cat("DataPassing")),DataCombData), Components("DataBackgroundPdfF"), LineColor(kGreen),LineStyle(kDashed),Range(xLow_,xHigh_)); /////////////////////////////////////////////////////////////// if(makeSoupFit_) c->Divide(2,2); else c->Divide(2,1); c->cd(1); DataFrameP->Draw(); c->cd(2); DataFrameF->Draw(); if(makeSoupFit_){ c->cd(3); McFrameP->Draw(); c->cd(4); McFrameF->Draw(); } c->Draw(); test->cd(Form("bin%f",binCenter_)); c->Write(); c2->Divide(2,1); c2->cd(1); TemplateFrameP->Draw(); c2->cd(2); TemplateFrameF->Draw(); c2->Draw(); test->cd(Form("bin%f",binCenter_)); c2->Write(); // MINOS errors, otherwise HESSE quadratic errors float McErrorLo = 0; float McErrorHi = 0; if(makeSoupFit_){ McErrorLo = McEffFit->getErrorLo()<0 ? McEffFit->getErrorLo() : (-1)*McEffFit->getError(); McErrorHi = McEffFit->getErrorHi()>0 ? McEffFit->getErrorHi() : McEffFit->getError(); } float DataErrorLo = DataEffFit->getErrorLo()<0 ? DataEffFit->getErrorLo() : (-1)*DataEffFit->getError(); float DataErrorHi = DataEffFit->getErrorHi()>0 ? DataEffFit->getErrorHi() : DataEffFit->getError(); float BinomialError = TMath::Sqrt(SGNtruePass/SGNtrue*(1-SGNtruePass/SGNtrue)/SGNtrue); Double_t* truthMC = new Double_t[6]; Double_t* tnpMC = new Double_t[6]; Double_t* tnpData = new Double_t[6]; truthMC[0] = binCenter_; truthMC[1] = binWidth_; truthMC[2] = binWidth_; truthMC[3] = SGNtruePass/SGNtrue; truthMC[4] = BinomialError; truthMC[5] = BinomialError; if(makeSoupFit_){ tnpMC[0] = binCenter_; tnpMC[1] = binWidth_; tnpMC[2] = binWidth_; tnpMC[3] = McEffFit->getVal(); tnpMC[4] = (-1)*McErrorLo; tnpMC[5] = McErrorHi; } tnpData[0] = binCenter_; tnpData[1] = binWidth_; tnpData[2] = binWidth_; tnpData[3] = DataEffFit->getVal(); tnpData[4] = (-1)*DataErrorLo; tnpData[5] = DataErrorHi; out.push_back(truthMC); out.push_back(tnpData); if(makeSoupFit_) out.push_back(tnpMC); test->Close(); //delete c; delete c2; if(verbose_) cout << "returning from bin " << bin_ << endl; return out; }
void FitScenariosTwoD_RequiredPerformance_card(const string inputfilePho = "/afs/cern.ch/work/d/daan/public/releases/CMSSW_5_3_9_patch3/src/CMSAna/HHToBBGG/data/HHToBBGG_SignalBkgd_AfterCuts_diphotonMass.root", const string inputfileBjet = "/afs/cern.ch/work/d/daan/public/releases/CMSSW_5_3_9_patch3/src/CMSAna/HHToBBGG/data/HHToBBGG_SignalBkgd_AfterCuts_dibjetMass.root", const string inputfileTwoD = "/afs/cern.ch/work/d/daan/public/releases/CMSSW_5_3_9_patch3/src/CMSAna/HHToBBGG/data/HHToBBGG_SignalBkgd_AfterCuts_twoDMass.root", const string scanOption = "lum", Int_t NToys = 500, Int_t s = 5) { TRandom3 *randomNumber = new TRandom3(1200); TFile *file = new TFile(Form("HHToBBGGWorkspace_%s_%d.root",scanOption.c_str(),s),"RECREATE"); RooWorkspace* ws = new RooWorkspace("CMSAna/HHToBBGG/fits/Workspace"); AddModels(ws, inputfilePho, inputfileBjet, inputfileTwoD, scanOption, s); //Import variables from workspace RooAbsPdf *model2Dpdf = ws->pdf("model2Dpdf"); RooAbsPdf *model2Dpdf_cat0 = ws->pdf("model2Dpdf_cat0"); RooAbsPdf *model2Dpdf_cat1 = ws->pdf("model2Dpdf_cat1"); RooRealVar *massBjet = ws->var("massBjet"); RooRealVar *massPho = ws->var("massPho"); RooCategory *sampleCategory = ws->cat("sampleCategory"); RooRealVar *nsig = ws->var("nsig"); RooRealVar constNsig(*nsig); RooRealVar *nres_cat0 = ws->var("nres_cat0"); RooRealVar constNres_cat0(*nres_cat0); RooRealVar *nnonres_cat0 = ws->var("nnonres_cat0"); RooRealVar constNnonres_cat0(*nnonres_cat0); RooRealVar *nres_cat1 = ws->var("nres_cat1"); RooRealVar constNres_cat1(*nres_cat1); RooRealVar *nnonres_cat1 = ws->var("nnonres_cat1"); RooRealVar constNnonres_cat1(*nnonres_cat1); //Create TTree to store the resulting yield data TFile *f = new TFile(Form(("CMSAna/HHToBBGG/data/MassFitResults/ResolutionAnalysis/OptionB_Categories/tmp/"+scanOption+"FitScenario%d.root").c_str(), s), "RECREATE"); TTree *resultTree = new TTree("resultTree", "Parameter results from fitting"); Float_t nsigOut, nresOut, nnonresOut; Float_t nsigStd, nresStd, nnonresStd; resultTree->Branch("nsigOut",&nsigOut, "nsigOut/F"); resultTree->Branch("nresOut",&nresOut, "nresOut/F"); resultTree->Branch("nnonresOut",&nnonresOut, "nnonresOut/F"); resultTree->Branch("nsigStd",&nsigStd, "nsigStd/F"); resultTree->Branch("nresStd",&nresStd, "nresStd/F"); resultTree->Branch("nnonresStd",&nnonresStd, "nnonresStd/F"); //------------------------------------------------------------- //Yield Information //============================================================= double myPhoEffRatio = 1.00; double myBtagEffRatio = 1.00; double myEndcapPhotonFakerateRatio = 1.0; if (scanOption == "phoEff") { myPhoEffRatio = phoEffRatio[s]; myBtagEffRatio = 1.25; } if (scanOption == "btagEff") { myBtagEffRatio = btagEffRatio[s]; myPhoEffRatio = 1.25; } if (scanOption == "endcapPhotonFakerate") myEndcapPhotonFakerateRatio = endcapPhotonFakerate[s]; double totalYield = 6.11*myPhoEffRatio*myPhoEffRatio*myBtagEffRatio*myBtagEffRatio + 7.88*myPhoEffRatio*myPhoEffRatio*myBtagEffRatio*myBtagEffRatio + 31.1*myPhoEffRatio*myPhoEffRatio*myBtagEffRatio*myBtagEffRatio + 26.4*myPhoEffRatio*myPhoEffRatio*myBtagEffRatio*myBtagEffRatio + 48.7*myBtagEffRatio*myBtagEffRatio*myPhoEffRatio + 1.8*myBtagEffRatio*myBtagEffRatio + 2.41*myPhoEffRatio*myPhoEffRatio*myBtagEffRatio*myBtagEffRatio + 17.4*myPhoEffRatio*myPhoEffRatio*myBtagEffRatio*myBtagEffRatio + 17.2*myPhoEffRatio*myPhoEffRatio*myBtagEffRatio*myBtagEffRatio + 206.0*myBtagEffRatio*myBtagEffRatio*myPhoEffRatio*myEndcapPhotonFakerateRatio + 1.7*myBtagEffRatio*myBtagEffRatio ; double cat0Yield = 6.11*myPhoEffRatio*myPhoEffRatio*myBtagEffRatio*myBtagEffRatio + 7.88*myPhoEffRatio*myPhoEffRatio*myBtagEffRatio*myBtagEffRatio + 31.1*myPhoEffRatio*myPhoEffRatio*myBtagEffRatio*myBtagEffRatio + 26.4*myPhoEffRatio*myPhoEffRatio*myBtagEffRatio*myBtagEffRatio + 48.7*myBtagEffRatio*myBtagEffRatio*myPhoEffRatio + 1.8*myBtagEffRatio*myBtagEffRatio; double cat1Yield = 2.41*myPhoEffRatio*myPhoEffRatio*myBtagEffRatio*myBtagEffRatio + 17.4*myPhoEffRatio*myPhoEffRatio*myBtagEffRatio*myBtagEffRatio + 17.2*myPhoEffRatio*myPhoEffRatio*myBtagEffRatio*myBtagEffRatio + 206.0*myBtagEffRatio*myBtagEffRatio*myPhoEffRatio*myEndcapPhotonFakerateRatio + 1.7*myBtagEffRatio*myBtagEffRatio; double cat0Fraction = cat0Yield / totalYield; double cat1Fraction = cat1Yield / totalYield; //------------------------------------------------------------- //Generate Toy MC experiment data and fit //============================================================= for(UInt_t t=0; t < NToys; ++t) { cout << t << "|" << s << endl; nsig->setVal(constNsig.getVal()); nres_cat0->setVal(constNres_cat0.getVal()); nnonres_cat0->setVal(constNnonres_cat0.getVal()); nres_cat1->setVal(constNres_cat1.getVal()); nnonres_cat1->setVal(constNnonres_cat1.getVal()); Float_t ran; //if (scanOption == "lum") ran = randomNumber->Poisson(totalYield*luminosity[s]); //else ran = randomNumber->Poisson(totalYield); if (scanOption == "lum") ran = totalYield*luminosity[s]; else ran = totalYield; RooDataSet *pseudoData2D = model2Dpdf->generate(RooArgList(*massBjet,*massPho, *sampleCategory), ran); RooFitResult *fitResult2D = model2Dpdf->fitTo(*pseudoData2D, RooFit::Save(), RooFit::Extended(kTRUE), RooFit::Strategy(2)); ws->import(*pseudoData2D, kTRUE); ws->import(*pseudoData2D, Rename("pseudoData2D")); RooDataSet *pseudoData2D_cat0 = model2Dpdf_cat0->generate(RooArgList(*massBjet,*massPho), ran*cat0Fraction); RooDataSet *pseudoData2D_cat1 = model2Dpdf_cat1->generate(RooArgList(*massBjet,*massPho), ran*cat1Fraction); ws->import(*pseudoData2D_cat0, kTRUE); ws->import(*pseudoData2D_cat0, Rename("pseudoData2D_cat0")); ws->import(*pseudoData2D_cat1, kTRUE); ws->import(*pseudoData2D_cat1, Rename("pseudoData2D_cat1")); //Save variables into separate branches of root tree nsigOut = nsig->getVal(); nresOut = nres_cat0->getVal(); nnonresOut = nnonres_cat0->getVal(); nsigStd = nsig->getPropagatedError(*fitResult2D); nresStd = nres_cat0->getPropagatedError(*fitResult2D); nnonresStd = nnonres_cat0->getPropagatedError(*fitResult2D); resultTree->Fill(); } //Write to the TTree and close it resultTree->Write(); file->WriteTObject(ws, Form("HHToBBGGWorkspace",scanOption.c_str(),s), "WriteDelete"); file->Close(); delete file; }
std::pair<float,float> GenerateOneToyAndComputeLimit(float m0, REGION region, REGION NonRegion, int& type, char *workspace, const char* tag) { TFile *f = new TFile(workspace,"READ"); if(!f || f->IsZombie()) { cout << "There is a problem with the file you provided. Aborting ... " << endl; std::pair<float,float> empty; return empty; } RooWorkspace *ws = (RooWorkspace*)f->Get("w"); //ws->Print(); int Ctoys=0; int Ftoys=0; if(region==CENTRAL) Ctoys=1; if(region==FORWARD) Ftoys=1; vector<float> MyLimits; float tempCentral = ws->var("nSigCentral")->getVal(); float tempForward = ws->var("nSigForward")->getVal(); ws->var("nSigForward")->setVal(0.); ws->var("nSigForward")->setConstant(true); ws->var("nSigCentral")->setVal(0.); ws->var("nSigCentral")->setConstant(true); // RooFitResult *fit = ws->pdf("combModel")->fitTo(*ws->data("mc_obs"),RooFit::Save(), RooFit::SumW2Error(true), RooFit::Minos(true),RooFit::Extended(true),RooFit::Strategy(1),RooFit::NumCPU(6)); int nEECentral = int(ws->var("nBCentral")->getVal() * ws->var("rSFOFMeasuredCentral")->getVal() * ws->var("feeCentral")->getVal() + ws->var("nZCentral")->getVal() * ws->var("feeCentral")->getVal()); int nMMCentral = int(ws->var("nBCentral")->getVal() * ws->var("rSFOFMeasuredCentral")->getVal() * (1 - ws->var("feeCentral")->getVal()) + ws->var("nZCentral")->getVal() * (1 - ws->var("feeCentral")->getVal())); int nOFOSCentral = int(ws->var("nBCentral")->getVal()); int nEEForward = int(ws->var("nBForward")->getVal() * ws->var("rSFOFMeasuredForward")->getVal() * ws->var("feeForward")->getVal() + ws->var("nZForward")->getVal() * ws->var("feeForward")->getVal()); int nMMForward = int(ws->var("nBForward")->getVal() * ws->var("rSFOFMeasuredForward")->getVal() * (1 - ws->var("feeForward")->getVal()) + ws->var("nZForward")->getVal() * (1 - ws->var("feeForward")->getVal())); int nOFOSForward = int(ws->var("nBForward")->getVal()); RooMCStudy *mcEECentral=0, *mcMMCentral=0, *mcOFOSCentral=0, *mcEEForward=0, *mcMMForward=0, *mcOFOSForward=0; // Name of the model to load TString modelName("constraint"); if ( region==CENTRAL ) modelName += "Central"; else modelName += "Forward"; modelName += "Model"; if ( type ) if ( type == 1 ) modelName += "Concave"; else if (type == 2 ) modelName += "Convex"; std::cout << "Generating for model " << modelName << std::endl; if(region==CENTRAL) { mcEECentral = new RooMCStudy(*ws->pdf(modelName), RooArgSet(*ws->var("inv")), RooFit::Slice(*ws->cat("catCentral"), "EECentral")); mcEECentral->generate(Ctoys, nEECentral, true); mcMMCentral = new RooMCStudy(*ws->pdf(modelName), RooArgSet(*ws->var("inv")), RooFit::Slice(*ws->cat("catCentral"), "MMCentral")); mcMMCentral->generate(Ctoys, nMMCentral, true); mcOFOSCentral = new RooMCStudy(*ws->pdf(modelName), RooArgSet(*ws->var("inv")), RooFit::Slice(*ws->cat("catCentral"), "OFOSCentral")); mcOFOSCentral->generate(Ctoys, nOFOSCentral, true); mcEEForward=0; mcMMForward=0; mcOFOSForward=0; } else { mcEEForward = new RooMCStudy(*ws->pdf(modelName), RooArgSet(*ws->var("inv")), RooFit::Slice(*ws->cat("catForward"), "EEForward")); mcEEForward->generate(Ftoys, nEEForward, true); mcMMForward = new RooMCStudy(*ws->pdf(modelName), RooArgSet(*ws->var("inv")), RooFit::Slice(*ws->cat("catForward"), "MMForward")); mcMMForward->generate(Ftoys, nMMForward, true); mcOFOSForward = new RooMCStudy(*ws->pdf(modelName), RooArgSet(*ws->var("inv")), RooFit::Slice(*ws->cat("catForward"), "OFOSForward")); mcOFOSForward->generate(Ftoys, nOFOSForward, true); mcEECentral=0; mcMMCentral=0; mcOFOSCentral=0; } std::vector<RooDataSet*> theToys; ws->var("nSigForward")->setVal(0.); ws->var("nSigForward")->setConstant(true); ws->var("nSigCentral")->setVal(0.); ws->var("nSigCentral")->setConstant(true); RooDataSet *toyEECentral=0,*toyMMCentral=0,*toyOFOSCentral=0,*toyEEForward=0,*toyMMForward=0,*toyOFOSForward=0; if(region==CENTRAL) { toyEECentral = (RooDataSet*) mcEECentral->genData(0); toyMMCentral = (RooDataSet*) mcMMCentral->genData(0); toyOFOSCentral = (RooDataSet*) mcOFOSCentral->genData(0); } else { toyEEForward = (RooDataSet*) mcEEForward->genData(0); toyMMForward = (RooDataSet*) mcMMForward->genData(0); toyOFOSForward = (RooDataSet*) mcOFOSForward->genData(0); } RooDataSet *toyData; if(region==CENTRAL) { toyData = new RooDataSet(Concatenate("theToy_",0), Concatenate("toy_",0), RooArgSet(*ws->var("inv"),*ws->var("weight")), RooFit::Index(*ws->cat("catCentral")), RooFit::WeightVar("weight"), RooFit::Import("OFOSCentral", *toyOFOSCentral), RooFit::Import("EECentral", *toyEECentral), RooFit::Import("MMCentral", *toyMMCentral)); } else { toyData = new RooDataSet(Concatenate("theToy_",0), Concatenate("toy_",0), RooArgSet(*ws->var("inv"),*ws->var("weight")), RooFit::Index(*ws->cat("catForward")), RooFit::WeightVar("weight"), RooFit::Import("OFOSForward", *toyOFOSForward), RooFit::Import("EEForward", *toyEEForward), RooFit::Import("MMForward", *toyMMForward)); } ws->var("nSigCentral")->setVal(tempCentral); ws->var("nSigCentral")->setConstant(false); ws->var("nSigForward")->setVal(tempForward); ws->var("nSigForward")->setConstant(false); std::pair<float,float> Limit = ComputeLimitForADataset(m0,toyData,region,NonRegion,modelName,ws,tag); cout << "LIMIT: " << m0 << " " << Limit.first << endl; delete toyData; delete mcEECentral; delete mcMMCentral; delete mcOFOSCentral; delete mcEEForward; delete mcMMForward; delete mcOFOSForward; f->Close(); delete f; f=0; return Limit; }
int main (int argc, char **argv) { const char* chInFile = "ws.root"; const char* chOutFile = "ws_data.root"; const char* chRootFile = "BDT20.root"; const char* chCut = ""; char option_char; while ( (option_char = getopt(argc,argv, "i:o:r:c:")) != EOF ) switch (option_char) { case 'i': chInFile = optarg; break; case 'o': chOutFile = optarg; break; case 'r': chRootFile = optarg; break; case 'c': chCut = optarg; break; case '?': fprintf (stderr, "usage: %s [i<input file> o<output file>]\n", argv[0]); } cout << "In Ws = " << chInFile << endl; cout << "Out Ws = " << chOutFile << endl; cout << "Data From = " << chRootFile << endl; cout << "Extra Cut = " << chCut << endl; TFile* in_file = new TFile(chInFile); RooWorkspace *rws = (RooWorkspace*) in_file->Get("rws"); TFile* tree_file = new TFile(chRootFile); TTree* tree = (TTree*) tree_file->Get("tree"); TFile* out_file = new TFile(chOutFile, "RECREATE"); RooArgSet allVars(*rws->var("m"),*rws->var("t"),*rws->var("et"),*rws->var("cpsi"),*rws->var("ctheta"),*rws->var("phi"),*rws->var("d"),*rws->cat("dilution")); RooDataSet* data = new RooDataSet("data","data",allVars); RooDataSet* dataBkg = new RooDataSet("dataBkg","dataBkg",allVars); //TCut* cut = new TCut("5.17<bs_mass && bs_mass<5.57 && bs_pdl>-0.044 && bs_pdl<0.3 "); TCut* cut = new TCut("5.17<bs_mass && bs_mass<5.57 && bs_epdl<0.025 && bs_pdl<0.4 && bs_pdl>-0.44"); *cut += chCut; tree->Draw(">>entry_list", *cut, "entrylist"); TEntryList* event_list = (TEntryList*) out_file->Get("entry_list"); Double_t dM, dT, dEt, dCpsi, dCtheta, dPhi, dd; Int_t ddDefined; tree->SetBranchAddress("bs_mass", &dM); tree->SetBranchAddress("bs_pdl", &dT); tree->SetBranchAddress("bs_epdl", &dEt); tree->SetBranchAddress("bs_angle_cpsi", &dCpsi); tree->SetBranchAddress("bs_angle_ctheta", &dCtheta); tree->SetBranchAddress("bs_angle_phi", &dPhi); tree->SetBranchAddress("newtag_ost", &dd); tree->SetBranchAddress("newtag_ost_defined", &ddDefined); for (Long_t i=0; i<event_list->GetN(); i++){ tree->GetEntry(event_list->GetEntry(i)); *rws->var("m")=dM; *rws->var("t")=dT/0.0299792458; *rws->var("et")=dEt/0.0299792458; *rws->var("cpsi")=dCpsi; *rws->var("ctheta")=dCtheta; *rws->var("phi")=dPhi; *rws->var("d")=0; rws->cat("dilution")->setIndex(0); if ( ddDefined==1 ){ rws->cat("dilution")->setIndex(1); *rws->var("d")=dd; } data->add(allVars); if (dM<5.29 || dM>5.44) dataBkg->add(allVars); } rws->import(*data); rws->import(*dataBkg); rws->Write("rws"); out_file->Close(); in_file->Close(); tree_file->Close(); cout << endl << "Done." << endl; }
void combinedWorkspace_4WS(const char* name_pbpb_pass="******", const char* name_pbpb_fail="fitresult_pbpb_fail.root", const char* name_pp_pass="******", const char* name_pp_fail="fitresult_pp_fail.root", const char* name_out="fitresult_combo.root", const float systval = 0., const char* subDirName ="wsTest", int nCPU=2){ // subdir: Directory to save workspaces under currentPATH/CombinedWorkspaces/subDir/ // set things silent gErrorIgnoreLevel=kError; RooMsgService::instance().setGlobalKillBelow(RooFit::ERROR); bool dosyst = (systval > 0.); TString nameOut(name_out); RooWorkspace * ws = test_combine_4WS(name_pbpb_pass, name_pp_pass, name_pbpb_fail, name_pp_fail, false, nCPU); RooAbsData * data = ws->data("dOS_DATA"); RooRealVar* RFrac2Svs1S_PbPbvsPP_P = ws->var("RFrac2Svs1S_PbPbvsPP_P"); RooRealVar* leftEdge = new RooRealVar("leftEdge","leftEdge",-10); RooRealVar* rightEdge = new RooRealVar("rightEdge","rightEdge",10); RooGenericPdf step("step", "step", "(@0 >= @1) && (@0 < @2)", RooArgList(*RFrac2Svs1S_PbPbvsPP_P, *leftEdge, *rightEdge)); ws->import(step); ws->factory( "Uniform::flat(RFrac2Svs1S_PbPbvsPP_P)" ); // systematics if (dosyst) { ws->factory( Form("kappa_syst[%f]",systval) ); ws->factory( "expr::alpha_syst('kappa_syst*beta_syst',kappa_syst,beta_syst[0,-5,5])" ); ws->factory( "Gaussian::constr_syst(beta_syst,glob_syst[0,-5,5],1)" ); // add systematics into the double ratio ws->factory( "expr::RFrac2Svs1S_PbPbvsPP_P_syst('@0+@1',RFrac2Svs1S_PbPbvsPP_P,alpha_syst)" ); // build the pbpb pdf RooRealVar* effjpsi_pp_P = (RooRealVar*)ws->var("effjpsi_pp_P"); RooRealVar* effpsip_pp_P = (RooRealVar*)ws->var("effpsip_pp_P"); RooRealVar* effjpsi_pp_NP = (RooRealVar*)ws->var("effjpsi_pp_NP"); Double_t Npsi2SPbPbPass = npsip_pbpb_pass_from_doubleratio_prompt(ws, RooArgList(*effjpsi_pp_P,*effpsip_pp_P,*effjpsi_pp_NP),true); // Create and import N_Psi2S_PbPb_pass_syst ws->factory( "SUM::pdfMASS_Tot_PbPb_pass_syst(N_Jpsi_PbPb_pass * pdfMASS_Jpsi_PbPb_pass, N_Psi2S_PbPb_pass_syst * pdfMASS_Psi2S_PbPb_pass, N_Bkg_PbPb_pass * pdfMASS_Bkg_PbPb_pass)" ); ws->factory( "PROD::pdfMASS_Tot_PbPb_pass_constr(pdfMASS_Tot_PbPb_pass_syst,constr_syst)" ); // build the combined pdf ws->factory("SIMUL::simPdf_syst_noconstr(sample,PbPb_pass=pdfMASS_Tot_PbPb_pass_syst,PbPb_fail=pdfMASS_Tot_PbPb_fail,PP_pass=pdfMASS_Tot_PP_pass,PP_fail=pdfMASS_Tot_PP_fail)"); RooSimultaneous *simPdf = (RooSimultaneous*) ws->pdf("simPdf_syst_noconstr"); RooGaussian *constr_syst = (RooGaussian*) ws->pdf("constr_syst"); RooProdPdf *simPdf_constr = new RooProdPdf("simPdf_syst","simPdf_syst",RooArgSet(*simPdf,*constr_syst)); ws->import(*simPdf_constr); } else { ws->factory("SIMUL::simPdf_syst(sample,PbPb_pass=pdfMASS_Tot_PbPb_pass,PbPb_fail=pdfMASS_Tot_PbPb_fail,PP_pass=pdfMASS_Tot_PP_pass,PP_fail=pdfMASS_Tot_PP_fail)"); } ws->Print(); if (dosyst) ws->var("beta_syst")->setConstant(kFALSE); ///////////////////////////////////////////////////////////////////// RooRealVar * pObs = ws->var("invMass"); // get the pointer to the observable RooArgSet obs("observables"); obs.add(*pObs); obs.add( *ws->cat("sample")); // ///////////////////////////////////////////////////////////////////// if (dosyst) ws->var("glob_syst")->setConstant(true); RooArgSet globalObs("global_obs"); if (dosyst) globalObs.add( *ws->var("glob_syst") ); // ws->Print(); RooArgSet poi("poi"); poi.add( *ws->var("RFrac2Svs1S_PbPbvsPP_P") ); // create set of nuisance parameters RooArgSet nuis("nuis"); if (dosyst) nuis.add( *ws->var("beta_syst") ); // set parameters constant RooArgSet allVars = ws->allVars(); TIterator* it = allVars.createIterator(); RooRealVar *theVar = (RooRealVar*) it->Next(); while (theVar) { TString varname(theVar->GetName()); // if (varname != "RFrac2Svs1S_PbPbvsPP" // && varname != "invMass" // && varname != "sample" // ) // theVar->setConstant(); if ( varname.Contains("f_Jpsi_PP") || varname.Contains("f_Jpsi_PbPb") || varname.Contains("rSigma21_Jpsi_PP") || varname.Contains("m_Jpsi_PP") || varname.Contains("m_Jpsi_PbPb") || varname.Contains("sigma1_Jpsi_PP") || varname.Contains("sigma1_Jpsi_PbPb") || (varname.Contains("lambda")) || (varname.Contains("_fail") && !varname.Contains("RFrac2Svs1S"))) { theVar->setConstant(); } if (varname=="glob_syst" || varname=="beta_syst" ) { cout << varname << endl; theVar->setConstant(!dosyst); } theVar = (RooRealVar*) it->Next(); } // create signal+background Model Config RooStats::ModelConfig sbHypo("SbHypo"); sbHypo.SetWorkspace( *ws ); sbHypo.SetPdf( *ws->pdf("simPdf_syst") ); sbHypo.SetObservables( obs ); sbHypo.SetGlobalObservables( globalObs ); sbHypo.SetParametersOfInterest( poi ); sbHypo.SetNuisanceParameters( nuis ); sbHypo.SetPriorPdf( *ws->pdf("step") ); // this is optional ///////////////////////////////////////////////////////////////////// RooAbsReal * pNll = sbHypo.GetPdf()->createNLL( *data,NumCPU(nCPU) ); RooMinuit(*pNll).migrad(); // minimize likelihood wrt all parameters before making plots if (controlPlots) { RooPlot *framepoi = ((RooRealVar *)poi.first())->frame(Bins(10),Range(0.,1),Title("LL and profileLL in RFrac2Svs1S_PbPbvsPP_P")); pNll->plotOn(framepoi,ShiftToZero()); framepoi->SetMinimum(0); framepoi->SetMaximum(10); TCanvas *cpoi = new TCanvas(); cpoi->cd(); framepoi->Draw(); cpoi->SaveAs("cpoi.pdf"); } ((RooRealVar *)poi.first())->setMin(0.); RooArgSet * pPoiAndNuisance = new RooArgSet("poiAndNuisance"); pPoiAndNuisance->add( nuis ); pPoiAndNuisance->add( poi ); sbHypo.SetSnapshot(*pPoiAndNuisance); if (controlPlots) { RooPlot* xframeSB_PP_pass = pObs->frame(Title("SBhypo_PP_pass")); data->plotOn(xframeSB_PP_pass,Cut("sample==sample::PP_pass")); RooAbsPdf *pdfSB_PP_pass = sbHypo.GetPdf(); RooCategory *sample = ws->cat("sample"); pdfSB_PP_pass->plotOn(xframeSB_PP_pass,Slice(*sample,"PP_pass"),ProjWData(*sample,*data)); TCanvas *c1 = new TCanvas(); c1->cd(); xframeSB_PP_pass->Draw(); c1->SaveAs("c1.pdf"); RooPlot* xframeSB_PP_fail = pObs->frame(Title("SBhypo_PP_fail")); data->plotOn(xframeSB_PP_fail,Cut("sample==sample::PP_fail")); RooAbsPdf *pdfSB_PP_fail = sbHypo.GetPdf(); pdfSB_PP_fail->plotOn(xframeSB_PP_fail,Slice(*sample,"PP_fail"),ProjWData(*sample,*data)); TCanvas *c2 = new TCanvas(); c2->cd(); xframeSB_PP_fail->Draw(); c2->SaveAs("c1.pdf"); RooPlot* xframeB_PbPb_pass = pObs->frame(Title("SBhypo_PbPb_pass")); data->plotOn(xframeB_PbPb_pass,Cut("sample==sample::PbPb_pass")); RooAbsPdf *pdfB_PbPb_pass = sbHypo.GetPdf(); pdfB_PbPb_pass->plotOn(xframeB_PbPb_pass,Slice(*sample,"PbPb_pass"),ProjWData(*sample,*data)); TCanvas *c3 = new TCanvas(); c3->cd(); xframeB_PbPb_pass->Draw(); c3->SetLogy(); c3->SaveAs("c2.pdf"); RooPlot* xframeB_PbPb_fail = pObs->frame(Title("SBhypo_PbPb_fail")); data->plotOn(xframeB_PbPb_fail,Cut("sample==sample::PbPb_fail")); RooAbsPdf *pdfB_PbPb_fail = sbHypo.GetPdf(); pdfB_PbPb_fail->plotOn(xframeB_PbPb_fail,Slice(*sample,"PbPb_fail"),ProjWData(*sample,*data)); TCanvas *c4 = new TCanvas(); c4->cd(); xframeB_PbPb_fail->Draw(); c4->SetLogy(); c4->SaveAs("c2.pdf"); } delete pNll; delete pPoiAndNuisance; ws->import( sbHypo ); ///////////////////////////////////////////////////////////////////// RooStats::ModelConfig bHypo = sbHypo; bHypo.SetName("BHypo"); bHypo.SetWorkspace(*ws); pNll = bHypo.GetPdf()->createNLL( *data,NumCPU(nCPU) ); // RooMinuit(*pNll).migrad(); // minimize likelihood wrt all parameters before making plots RooArgSet poiAndGlobalObs("poiAndGlobalObs"); poiAndGlobalObs.add( poi ); poiAndGlobalObs.add( globalObs ); RooAbsReal * pProfile = pNll->createProfile( poiAndGlobalObs ); // do not profile POI and global observables ((RooRealVar *)poi.first())->setVal( 0 ); // set RFrac2Svs1S_PbPbvsPP=0 here pProfile->getVal(); // this will do fit and set nuisance parameters to profiled values pPoiAndNuisance = new RooArgSet( "poiAndNuisance" ); pPoiAndNuisance->add( nuis ); pPoiAndNuisance->add( poi ); bHypo.SetSnapshot(*pPoiAndNuisance); delete pNll; delete pPoiAndNuisance; // import model config into workspace bHypo.SetWorkspace(*ws); ws->import( bHypo ); ///////////////////////////////////////////////////////////////////// ws->Print(); bHypo.Print(); sbHypo.Print(); // save workspace to file string mainDIR = gSystem->ExpandPathName(gSystem->pwd()); string wsDIR = mainDIR + "/CombinedWorkspaces/"; string ssubDirName=""; if (subDirName) ssubDirName.append(subDirName); string subDIR = wsDIR + ssubDirName; void * dirp = gSystem->OpenDirectory(wsDIR.c_str()); if (dirp) gSystem->FreeDirectory(dirp); else gSystem->mkdir(wsDIR.c_str(), kTRUE); void * dirq = gSystem->OpenDirectory(subDIR.c_str()); if (dirq) gSystem->FreeDirectory(dirq); else gSystem->mkdir(subDIR.c_str(), kTRUE); const char* saveName = Form("%s/%s",subDIR.c_str(),nameOut.Data()); ws->writeToFile(saveName); }
void fillDatasets( TString fname, TString tname, TString outfname ) { TFile *inFile = TFile::Open( fname ); TTree *tree = (TTree*)inFile->Get( tname ); ULong64_t eventNumber; TString *year = 0; double B_s0_DTF_B_s0_M; int itype; bool pass_bdt; bool pass_pid; bool pass_rhokst; bool pass_massveto; bool pass_multcand; bool B_s0_L0HadronDecision_TOS; bool B_s0_L0Global_TIS; double B_s0_DTF_KST1_M; double B_s0_DTF_KST2_M; tree->SetBranchAddress( "eventNumber" , &eventNumber ); tree->SetBranchAddress( "year" , &year ); tree->SetBranchAddress( "B_s0_DTF_B_s0_M" , &B_s0_DTF_B_s0_M ); tree->SetBranchAddress( "itype" , &itype ); tree->SetBranchAddress( "pass_bdt" , &pass_bdt ); tree->SetBranchAddress( "pass_pid" , &pass_pid ); tree->SetBranchAddress( "pass_rhokst" , &pass_rhokst ); tree->SetBranchAddress( "pass_massveto" , &pass_massveto ); tree->SetBranchAddress( "pass_multcand" , &pass_multcand ); tree->SetBranchAddress( "B_s0_L0HadronDecision_TOS" , &B_s0_L0HadronDecision_TOS ); tree->SetBranchAddress( "B_s0_L0Global_TIS" , &B_s0_L0Global_TIS ); tree->SetBranchAddress( "B_s0_DTF_KST1_M" , &B_s0_DTF_KST1_M ); tree->SetBranchAddress( "B_s0_DTF_KST2_M" , &B_s0_DTF_KST2_M ); RooWorkspace *w = new RooWorkspace("w","w"); defineDatasets( w ); for (int ev=0; ev<tree->GetEntries(); ev++) { tree->GetEntry(ev); if ( ev%10000==0 ) cout << ev << " / " << tree->GetEntries() << endl; // cut events outside the mass window if ( B_s0_DTF_B_s0_M < 5000 || B_s0_DTF_B_s0_M > 5800 ) continue; if ( B_s0_DTF_KST1_M < 750 || B_s0_DTF_KST1_M > 1600 ) continue; if ( B_s0_DTF_KST2_M < 750 || B_s0_DTF_KST2_M > 1600 ) continue; // set workspace values w->var("B_s0_DTF_B_s0_M")->setVal( B_s0_DTF_B_s0_M ); w->var("eventNumber")->setVal( eventNumber ); if ( *year==TString("2011") ) { if ( B_s0_L0HadronDecision_TOS ) w->cat("DataCat")->setLabel("HadronTOS2011"); else if ( B_s0_L0Global_TIS && !B_s0_L0HadronDecision_TOS ) w->cat("DataCat")->setLabel("GlobalTIS2011"); else continue; } else if ( *year==TString("2012") ) { if ( B_s0_L0HadronDecision_TOS ) w->cat("DataCat")->setLabel("HadronTOS2012"); else if ( B_s0_L0Global_TIS && !B_s0_L0HadronDecision_TOS ) w->cat("DataCat")->setLabel("GlobalTIS2012"); else continue; } else continue; // for the most case we put the bdt and pid requirement in // for low stats MC samples we don't use it // // NO REQUIREMENT: // Lb2pKpipi MC if ( itype == -78 || itype == -88 ) { w->data("Lb2pKpipi")->add( *w->set("observables") ); } // Lb2ppipipi MC else if ( itype == -79 || itype == -89 ) { w->data("Lb2ppipipi")->add( *w->set("observables") ); } // Bd2PhiKst MC else if ( itype == -75 || itype == -85 ) { w->data("Bd2PhiKst")->add( *w->set("observables") ); } // Bs2PhiKst MC else if ( itype == -76 || itype == -86 ) { w->data("Bs2PhiKst")->add( *w->set("observables") ); } // Bd2RhoKst MC else if ( itype == -77 || itype == -87 ) { w->data("Bd2RhoKst")->add( *w->set("observables") ); } // FROM HERE BDT, PID AND MASS VETO REQUIREMENTS //if ( pass_bdt && pass_pid && pass_multcand && !pass_rhokst && !pass_massveto) { if ( pass_bdt && pass_pid && pass_multcand && !pass_massveto) { // Data 2011 if ( itype == 71 ) { w->data("Data")->add( *w->set("observables") ); w->data("Data2011")->add( *w->set("observables") ); if ( B_s0_L0HadronDecision_TOS ) { w->data("Data2011HadronTOS")->add( *w->set("observables") ); } if ( B_s0_L0Global_TIS && !B_s0_L0HadronDecision_TOS ) { w->data("Data2011GlobalTIS")->add( *w->set("observables") ); } } // Data 2012 else if ( itype == 81 ) { w->data("Data")->add( *w->set("observables") ); w->data("Data2012")->add( *w->set("observables") ); if ( B_s0_L0HadronDecision_TOS ) { w->data("Data2012HadronTOS")->add( *w->set("observables") ); } if ( B_s0_L0Global_TIS && !B_s0_L0HadronDecision_TOS ) { w->data("Data2012GlobalTIS")->add( *w->set("observables") ); } } // Bs2KstKst MC else if ( itype == -70 || itype == -80 ) { w->data("Bs2KstKst")->add( *w->set("observables") ); } // Bs2KstKst1430 MC else if ( itype == -71 || itype == -81 ) { w->data("Bs2KstKst1430")->add( *w->set("observables") ); } // Bs2Kst1430Kst1430 MC else if ( itype == -72 || itype == -82 ) { w->data("Bs2Kst1430Kst1430")->add( *w->set("observables") ); } // Bs2KPiKPi PhaseSpace else if ( itype == -73 || itype == -83 ) { w->data("Bs2KpiKpiPhaseSpace")->add( *w->set("observables") ); } // Bd2KstKst MC else if ( itype == -74 || itype == -84 ) { w->data("Bd2KstKst")->add( *w->set("observables") ); } } } // combined data map<string,RooDataSet*> dsetMap; dsetMap[ "HadronTOS2011" ] = (RooDataSet*)w->data("Data2011HadronTOS") ; dsetMap[ "GlobalTIS2011" ] = (RooDataSet*)w->data("Data2011GlobalTIS") ; dsetMap[ "HadronTOS2012" ] = (RooDataSet*)w->data("Data2012HadronTOS") ; dsetMap[ "GlobalTIS2012" ] = (RooDataSet*)w->data("Data2012GlobalTIS") ; RooDataSet *DataComb = new RooDataSet( "DataCombined", "DataCombined", *w->set("observables"), Index(*w->cat("DataCat")), Import(dsetMap) ); w->import(*DataComb); delete DataComb; inFile->Close(); delete inFile; delete year; w->writeToFile( outfname ); }
void check_fit_bias_sim(const int N=1, string infname="20140409_SimFits_M1850_DblMu0_AllCent/fracLogCBG_PbPbpol3_HI020_pol2_HI2040_pol2_HI40100_pppol2_rap16-24_pT3-30_centMult_Workspace.root") { RooMsgService::instance().setGlobalKillBelow(RooFit::WARNING); TFile *inf = new TFile(infname.c_str(),"READ"); RooWorkspace *ws = (RooWorkspace*) inf->Get("workspace"); // ws->var("doubleRatio_HI020")->setConstant(true); // ws->var("doubleRatio_HI2040")->setConstant(true); // ws->var("doubleRatio_HI40100")->setConstant(true); RooRealVar *Jpsi_Mass = ws->var("Jpsi_Mass"); RooCategory *sample = ws->cat("sample"); // TIter types(ws->cat("sample")->typeIterator()); // RooCatType * type; // types.Reset(); RooDataSet * protoData = (RooDataSet*) ws->data("redDataSim"); RooDataSet * protoData_pp = (RooDataSet*) ws->data("data4"); RooDataSet * protoData_HI020 = (RooDataSet*) ws->data("data1"); RooDataSet * protoData_HI2040 = (RooDataSet*) ws->data("data2"); RooDataSet * protoData_HI40100 = (RooDataSet*) ws->data("data3"); // RooSimultaneous *model = (RooSimultaneous*) ws->pdf("sigMassPDFSim"); RooAbsPdf *model_pp = (RooAbsPdf*) ws->pdf("sigMassPDF_pp"); RooAbsPdf *model_HI020 = (RooAbsPdf*) ws->pdf("pdf_HI020"); RooAbsPdf *model_HI2040 = (RooAbsPdf*) ws->pdf("pdf_HI2040"); RooAbsPdf *model_HI40100 = (RooAbsPdf*) ws->pdf("pdf_HI40100"); // ws->var("sigma_pol")->setVal(0.0); // ws->var("sigma_b")->setVal(0.0); // ws->var("sigma_pol")->setConstant(true); // ws->var("sigma_b")->setConstant(true); // ws->var("sigma_fit_HI020")->setVal(0.0); // ws->var("sigma_eff_HI020")->setVal(0.0); // ws->var("sigma_fit_HI020")->setConstant(true); // ws->var("sigma_eff_HI020")->setConstant(true); // ws->var("sigma_fit_HI2040")->setVal(0.0); // ws->var("sigma_eff_HI2040")->setVal(0.0); // ws->var("sigma_fit_HI2040")->setConstant(true); // ws->var("sigma_eff_HI2040")->setConstant(true); // ws->var("sigma_fit_HI40100")->setVal(0.0); // ws->var("sigma_eff_HI40100")->setVal(0.0); // ws->var("sigma_fit_HI40100")->setConstant(true); // ws->var("sigma_eff_HI40100")->setConstant(true); RooPlot *frame = Jpsi_Mass->frame(Range("M2242")); protoData->plotOn(frame, Cut("sample==sample::pp")); protoData->plotOn(frame, Cut("sample==sample::HI020"), MarkerColor(kRed)); protoData->plotOn(frame, Cut("sample==sample::HI2040"), MarkerStyle(25), MarkerColor(kBlue)); protoData->plotOn(frame, Cut("sample==sample::HI40100"), MarkerStyle(24), MarkerColor(kGreen+2)); // model->plotOn(frame, Slice(*sample,"pp"), ProjWData(*sample,*protoData)); TCanvas *c0 = new TCanvas("c0","c0"); c0->cd(); frame->Draw(); // return; // ws->pdf("sigMassPDF_M2242")->plotOn(frame,Range("M2242")); // redData->plotOn(frame,MarkerStyle(24),MarkerColor(kRed),Range("M2242")); // while ((type=(RooCatType*)types.Next())) { // protoData = // (RooDataSet*)ws->data(TString::Format("data_%s", type->GetName())); // bkg = ws.pdf(TString::Format("expFunct_%s", type->GetName())); // if ((*type) == "HI") // N = Nhi; // else // N = Npp; // RooDataSet * tmpData = bkg->generate(RooArgSet(*Jpsi_mass), N, // RooFit::ProtoData(*protoData)); // osBkgData->append(*tmpData); // delete tmpData; // } // double Nevents = ws->var("NJpsi_pp")->getVal()+ws->function("NPsiP_pp")->getVal()+ws->var("NBkg_pp")->getVal(); TH1F *h0_pp = new TH1F("h0_pp","h0_pp;R_{#psi}^{pp};Events",1200,-0.3,0.3); TH1F *h1_pp = new TH1F("h1_pp","h1_pp;R_{#psi}^{pp};Events",1200,-0.3,0.3); TH2F *h2_pp = new TH2F("h2_pp","h2_pp;R_{#psi}^{pp} (M1850);R_{#psi}^{pp} (M2242)",600,-0.3,0.3,600,-0.3,0.3); h0_pp->Sumw2(); h1_pp->Sumw2(); h2_pp->Sumw2(); h1_pp->SetMarkerColor(2); h1_pp->SetLineColor(2); h0_pp->GetXaxis()->CenterTitle(true); h1_pp->GetXaxis()->CenterTitle(true); h2_pp->GetXaxis()->CenterTitle(true); TH1F *h0_HI020 = new TH1F("h0_HI020","h0_HI020;#chi_{#psi}^{HI020};Events",5000,-1.0,4.0); TH1F *h1_HI020 = new TH1F("h1_HI020","h1_HI020;#chi_{#psi}^{HI020};Events",5000,-1.0,4.0); TH2F *h2_HI020 = new TH2F("h2_HI020","h2_HI020;#chi_{#psi}^{HI020} (M1850);#chi_{#psi}^{HI020} (M2242)",500,-1,4,500,-1,4); h0_HI020->Sumw2(); h1_HI020->Sumw2(); h2_HI020->Sumw2(); h1_HI020->SetMarkerColor(2); h1_HI020->SetLineColor(2); h0_HI020->GetXaxis()->CenterTitle(true); h1_HI020->GetXaxis()->CenterTitle(true); h2_HI020->GetXaxis()->CenterTitle(true); TH1F *h0_HI2040 = new TH1F("h0_HI2040","h0_HI2040;#chi_{#psi}^{HI2040};Events",5000,-1.0,4.0); TH1F *h1_HI2040 = new TH1F("h1_HI2040","h1_HI2040;#chi_{#psi}^{HI2040};Events",5000,-1.0,4.0); TH2F *h2_HI2040 = new TH2F("h2_HI2040","h2_HI2040;#chi_{#psi}^{HI2040} (M1850);#chi_{#psi}^{HI2040} (M2242)",500,-1,4,500,-1,4); h0_HI2040->Sumw2(); h1_HI2040->Sumw2(); h2_HI2040->Sumw2(); h1_HI2040->SetMarkerColor(2); h1_HI2040->SetLineColor(2); h0_HI2040->GetXaxis()->CenterTitle(true); h1_HI2040->GetXaxis()->CenterTitle(true); h2_HI2040->GetXaxis()->CenterTitle(true); TH1F *h0_HI40100 = new TH1F("h0_HI40100","h0_HI40100;#chi_{#psi}^{HI40100};Events",5000,-1.0,4.0); TH1F *h1_HI40100 = new TH1F("h1_HI40100","h1_HI40100;#chi_{#psi}^{HI40100};Events",5000,-1.0,4.0); TH2F *h2_HI40100 = new TH2F("h2_HI40100","h2_HI40100;#chi_{#psi}^{HI40100} (M1850);#chi_{#psi}^{HI40100} (M2242)",500,-1,4,500,-1,4); h0_HI40100->Sumw2(); h1_HI40100->Sumw2(); h2_HI40100->Sumw2(); h1_HI40100->SetMarkerColor(2); h1_HI40100->SetLineColor(2); h0_HI40100->GetXaxis()->CenterTitle(true); h1_HI40100->GetXaxis()->CenterTitle(true); h2_HI40100->GetXaxis()->CenterTitle(true); TH1F *h0_HI0100 = new TH1F("h0_HI0100","h0_HI0100;#chi_{#psi}^{HI0100};Events",5000,-1.0,4.0); TH1F *h1_HI0100 = new TH1F("h1_HI0100","h1_HI0100;#chi_{#psi}^{HI0100};Events",5000,-1.0,4.0); TH2F *h2_HI0100 = new TH2F("h2_HI0100","h2_HI0100;#chi_{#psi}^{HI0100} (M1850);#chi_{#psi}^{HI0100} (M2242)",500,-1,4,500,-1,4); h0_HI0100->Sumw2(); h1_HI0100->Sumw2(); h2_HI0100->Sumw2(); h1_HI0100->SetMarkerColor(2); h1_HI0100->SetLineColor(2); h0_HI0100->GetXaxis()->CenterTitle(true); h1_HI0100->GetXaxis()->CenterTitle(true); h2_HI0100->GetXaxis()->CenterTitle(true); Jpsi_Mass->setRange("signal",3.6,3.76); Jpsi_Mass->setRange("M2045",2.0,4.5); Jpsi_Mass->setRange("M2242",2.2,4.2); RooFitResult *fitMall; RooFitResult *fitM; // RooFit cannot normalize Chebychev polynomials to a subrange (no analytic integral?) // using normal polynomials instead RooRealVar a("a","a",0.0);a.setConstant(false); RooRealVar b("b","b",0.01);b.setConstant(false); RooRealVar c("c","c",-0.005);c.setConstant(false); // mid // RooPolynomial bkg_pp("bkg_pp","bkg_pp",*Jpsi_Mass,RooArgSet(a,b,c)); // fwd RooPolynomial bkg_pp("bkg_pp","bkg_pp",*Jpsi_Mass,RooArgSet(a));//,b,c)); RooRealVar a_HI020("a_HI020","a_HI020",0.0);a_HI020.setConstant(false); RooRealVar b_HI020("b_HI020","b_HI020",0.01);b_HI020.setConstant(false); RooRealVar c_HI020("c_HI020","c_HI020",-0.005);c_HI020.setConstant(false); // mid // RooPolynomial bkg_HI020("bkg_HI020","bkg_HI020",*Jpsi_Mass,RooArgSet(a_HI020));//,b_HI020,c_HI020)); // fwd RooPolynomial bkg_HI020("bkg_HI020","bkg_HI020",*Jpsi_Mass,RooArgSet(a_HI020,b_HI020,c_HI020)); RooRealVar a_HI2040("a_HI2040","a_HI2040",0.0);a_HI2040.setConstant(false); RooRealVar b_HI2040("b_HI2040","b_HI2040",0.01);b_HI2040.setConstant(false); RooRealVar c_HI2040("c_HI2040","c_HI2040",-0.005);c_HI2040.setConstant(false); // mid // RooPolynomial bkg_HI2040("bkg_HI2040","bkg_HI2040",*Jpsi_Mass,RooArgSet(a_HI2040));//,b_HI2040,c_HI2040)); // fwd RooPolynomial bkg_HI2040("bkg_HI2040","bkg_HI2040",*Jpsi_Mass,RooArgSet(a_HI2040,b_HI2040));//,c_HI2040)); RooRealVar a_HI40100("a_HI40100","a_HI40100",0.0);a_HI40100.setConstant(false); RooRealVar b_HI40100("b_HI40100","b_HI40100",0.01);b_HI40100.setConstant(false); RooRealVar c_HI40100("c_HI40100","c_HI40100",-0.005);c_HI40100.setConstant(false); // mid // a_HI40100.setConstant(true); // RooPolynomial bkg_HI40100("bkg_HI40100","bkg_HI40100",*Jpsi_Mass,RooArgSet(a_HI40100));//,b_HI40100,c_HI40100)); // fwd RooPolynomial bkg_HI40100("bkg_HI40100","bkg_HI40100",*Jpsi_Mass,RooArgSet(a_HI40100));//,b_HI40100,c_HI40100)); ws->import(bkg_pp); ws->import(bkg_HI020); ws->import(bkg_HI2040); ws->import(bkg_HI40100); ws->factory("SUM::sigMassPDF_pp_M2242(NJpsi_pp*sigCB1G2_HI,NPsiP_pp*sigCB1G2P_HI,NBkg_pp*bkg_pp)"); ws->factory("SUM::sigMassPDF_HI020_M2242(NJpsi_HI020*sigCB1G2_HI,NPsiP_HI020*sigCB1G2P_HI,NBkg_HI020*bkg_HI020)"); ws->factory("SUM::sigMassPDF_HI2040_M2242(NJpsi_HI2040*sigCB1G2_HI,NPsiP_HI2040*sigCB1G2P_HI,NBkg_HI2040*bkg_HI2040)"); ws->factory("SUM::sigMassPDF_HI40100_M2242(NJpsi_HI40100*sigCB1G2_HI,NPsiP_HI40100*sigCB1G2P_HI,NBkg_HI40100*bkg_HI40100)"); ws->factory("SIMUL::sigMassPDFSim_M2242(sample,HI020=sigMassPDF_HI020_M2242,HI2040=sigMassPDF_HI2040_M2242,HI40100=sigMassPDF_HI40100_M2242,pp=sigMassPDF_pp_M2242)"); RooDataSet *data[N]; RooDataSet *data_pp[N]; RooDataSet *data_HI020[N]; RooDataSet *data_HI2040[N]; RooDataSet *data_HI40100[N]; RooDataSet *redData; for (int i=0;i<N;++i) { cout << "Generating event " << i << "/" << N << endl; // cout << "Generate N = " << Nevents << " events with R_{psi} = " << ws->var("fracP_pp")->getVal() << endl; // data[i] = model->generateSimGlobal(*Jpsi_Mass,ProtoData(*protoData), Verbose(1)); data_pp[i] = model_pp->generate(*Jpsi_Mass, ProtoData(*protoData_pp),Verbose(0)); data_HI020[i] = model_HI020->generate(*Jpsi_Mass, ProtoData(*protoData_HI020),Verbose(0)); data_HI2040[i] = model_HI2040->generate(*Jpsi_Mass, ProtoData(*protoData_HI2040),Verbose(0)); data_HI40100[i] = model_HI40100->generate(*Jpsi_Mass, ProtoData(*protoData_HI40100),Verbose(0)); data[i] = new RooDataSet("data","data",RooArgSet(*Jpsi_Mass),Index(*sample),Import("HI020",*data_HI020[i]),Import("HI2040",*data_HI2040[i]),Import("HI40100",*data_HI40100[i]),Import("pp",*data_pp[i])); } RooPlot *frame2 = Jpsi_Mass->frame(); data_pp[0]->plotOn(frame2); data[N-1]->plotOn(frame2, Cut("sample==sample::pp"),MarkerColor(kRed), MarkerStyle(24)); data[N-1]->plotOn(frame2, Cut("sample==sample::HI020"), MarkerColor(kRed)); data[N-1]->plotOn(frame2, Cut("sample==sample::HI2040"), MarkerStyle(25), MarkerColor(kBlue)); data[N-1]->plotOn(frame2, Cut("sample==sample::HI40100"), MarkerStyle(24), MarkerColor(kGreen+2)); // data[N-1]->plotOn(frame2, Cut("sample!=sample::pp"), MarkerColor(kRed)); // model->plotOn(frame, Slice(*sample,"pp"), ProjWData(*sample,*protoData)); TCanvas *c0a = new TCanvas("c0a","c0a"); c0a->cd(); frame2->Draw(); // return; // cout << data->sumEntries() << endl; for (int i=0;i<N;++i) { cout << "Fitting event " << i << "/" << N << endl; fitMall = ws->pdf("sigMassPDFSim")->fitTo(*data[i],Extended(1),Hesse(1),Save(1),NumCPU(8),PrintEvalErrors(-1),Verbose(0),PrintLevel(-1)); if (fitMall->statusCodeHistory(fitMall->numStatusHistory()-1) != 0) {i--; continue;} // fitMall->Print("v"); // cout << "Fitted R_{psi} = " << ws->var("fracP_pp")->getVal() << " +/- " << ws->var("fracP_pp")->getPropagatedError(*fitMall) << endl; double R1850_pp = ws->var("fracP_pp")->getVal(); double R1850_HI020 = ws->var("doubleRatio_HI020")->getVal(); double R1850_HI2040 = ws->var("doubleRatio_HI2040")->getVal(); double R1850_HI40100 = ws->var("doubleRatio_HI40100")->getVal(); double R1850_HI0100 = ws->function("doubleRatio_HI0100")->getVal(); h0_pp->Fill(R1850_pp); h0_HI020->Fill(R1850_HI020); h0_HI2040->Fill(R1850_HI2040); h0_HI40100->Fill(R1850_HI40100); h0_HI0100->Fill(R1850_HI0100); redData = (RooDataSet*)data[i]->reduce("Jpsi_Mass>2.2&&Jpsi_Mass<4.2"); // cout << redData->sumEntries() << endl; fitM = ws->pdf("sigMassPDFSim_M2242")->fitTo(*redData,Extended(1),Hesse(1),Save(1),NumCPU(8),PrintEvalErrors(-1),Verbose(0),PrintLevel(-1),Range("M2242")); if (fitM->statusCodeHistory(fitM->numStatusHistory()-1) != 0) {i--; continue;} // fitM->Print("v"); // cout << "Fit over M2242: R_{psi} = " << ws->var("fracP_pp")->getVal() << " +/- " << ws->var("fracP_pp")->getPropagatedError(*fitM) << endl; // RooPlot *frame = Jpsi_Mass->frame(Range("M2242")); // redData->plotOn(frame); // ws->pdf("sigMassPDF_M2242")->plotOn(frame,Range("M2242")); // redData->plotOn(frame,MarkerStyle(24),MarkerColor(kRed),Range("M2242")); double R2242_pp = ws->var("fracP_pp")->getVal(); double R2242_HI020 = ws->var("doubleRatio_HI020")->getVal(); double R2242_HI2040 = ws->var("doubleRatio_HI2040")->getVal(); double R2242_HI40100 = ws->var("doubleRatio_HI40100")->getVal(); double R2242_HI0100 = ws->function("doubleRatio_HI0100")->getVal(); h1_pp->Fill(R2242_pp); h1_HI020->Fill(R2242_HI020); h1_HI2040->Fill(R2242_HI2040); h1_HI40100->Fill(R2242_HI40100); h1_HI0100->Fill(R2242_HI0100); h2_pp->Fill(R1850_pp,R2242_pp); h2_HI020->Fill(R1850_HI020,R2242_HI020); h2_HI2040->Fill(R1850_HI2040,R2242_HI2040); h2_HI40100->Fill(R1850_HI40100,R2242_HI40100); h2_HI0100->Fill(R1850_HI0100,R2242_HI0100); } TCanvas *c1 = new TCanvas("c1","c1"); c1->Divide(2,2); c1->cd(1); h0_pp->Draw(); h1_pp->Draw("same"); c1->cd(2); h0_HI020->Draw(); h1_HI020->Draw("same"); c1->cd(3); h0_HI2040->Draw(); h1_HI2040->Draw("same"); c1->cd(4); h0_HI40100->Draw(); h1_HI40100->Draw("same"); // frame->Draw(); cout << "pp" << endl; cout << h0_pp->GetMean() << "\t" << h0_pp->GetRMS() << endl; cout << h1_pp->GetMean() << "\t" << h1_pp->GetRMS() << endl; cout << 1-(h0_pp->GetMean()/h1_pp->GetMean()) << endl; cout << "HI020" << endl; cout << h0_HI020->GetMean() << "\t" << h0_HI020->GetRMS() << endl; cout << h1_HI020->GetMean() << "\t" << h1_HI020->GetRMS() << endl; cout << 1-(h0_HI020->GetMean()/h1_HI020->GetMean()) << endl; cout << "HI2040" << endl; cout << h0_HI2040->GetMean() << "\t" << h0_HI2040->GetRMS() << endl; cout << h1_HI2040->GetMean() << "\t" << h1_HI2040->GetRMS() << endl; cout << 1-(h0_HI2040->GetMean()/h1_HI2040->GetMean()) << endl; cout << "HI40100" << endl; cout << h0_HI40100->GetMean() << "\t" << h0_HI40100->GetRMS() << endl; cout << h1_HI40100->GetMean() << "\t" << h1_HI40100->GetRMS() << endl; cout << 1-(h0_HI40100->GetMean()/h1_HI40100->GetMean()) << endl; cout << "HI0100" << endl; cout << h0_HI0100->GetMean() << "\t" << h0_HI0100->GetRMS() << endl; cout << h1_HI0100->GetMean() << "\t" << h1_HI0100->GetRMS() << endl; cout << 1-(h0_HI0100->GetMean()/h1_HI0100->GetMean()) << endl; c1->SaveAs(Form("toy_fits_dblRatio_fwd_M1850_N%i.pdf",N)); TF1 *f3 = new TF1("f3","x",-0.5,3.0); f3->SetLineWidth(1); TCanvas *c2 = new TCanvas("c2","c2"); c2->Divide(2,2); c2->cd(1); h2_pp->Draw("colz"); f3->Draw("same"); c2->cd(2); h2_HI020->Draw("colz"); f3->Draw("same"); c2->cd(3); h2_HI2040->Draw("colz"); f3->Draw("same"); c2->cd(4); h2_HI40100->Draw("colz"); f3->Draw("same"); TCanvas *c3 = new TCanvas("c3","c3"); c3->Divide(2,1); c3->cd(1); h0_HI0100->Draw(); h1_HI0100->Draw("same"); c3->cd(2); h2_HI0100->Draw("colz"); f3->Draw("same"); TFile *outf = new TFile(Form("toy_fits_dblRatio_fwd_M1850_N%i.root",N),"RECREATE"); h0_pp->Write(); h1_pp->Write(); h2_pp->Write(); h0_HI020->Write(); h1_HI020->Write(); h2_HI020->Write(); h0_HI2040->Write(); h1_HI2040->Write(); h2_HI2040->Write(); h0_HI40100->Write(); h1_HI40100->Write(); h2_HI40100->Write(); h0_HI0100->Write(); h1_HI0100->Write(); h2_HI0100->Write(); outf->Close(); return; }
void Raa3S_Workspace(const char* filename="fitresult_combo_nofixed.root"){ TFile File(filename); RooWorkspace * ws; File.GetObject("wcombo", ws); // ws->Print(); RooAbsData * data = ws->data("data"); // RooDataSet * US_data = (RooDataSet*) data->reduce( "QQsign == QQsign::PlusMinus"); // US_data->SetName("US_data"); // ws->import(* US_data); // RooDataSet * hi_data = (RooDataSet*) US_data->reduce("dataCat == dataCat::hi"); // hi_data->SetName("hi_data"); // ws->import(* hi_data); // hi_data->Print(); RooRealVar* raa3 = new RooRealVar("raa3","R_{AA}(#Upsilon (3S))",0.5,0,1); RooRealVar* leftEdge = new RooRealVar("leftEdge","leftEdge",0); RooRealVar* rightEdge = new RooRealVar("rightEdge","rightEdge",1); RooGenericPdf step("step", "step", "(@0 >= @1) && (@0 < @2)", RooArgList(*raa3, *leftEdge, *rightEdge)); ws->import(step); ws->factory( "Uniform::flat(raa3)" ); //pp Luminosities, Taa and efficiency ratios Systematics ws->factory( "Taa_hi[5.662e-9]" ); ws->factory( "Taa_kappa[1.057]" ); ws->factory( "expr::alpha_Taa('pow(Taa_kappa,beta_Taa)',Taa_kappa,beta_Taa[0,-5,5])" ); ws->factory( "prod::Taa_nom(Taa_hi,alpha_Taa)" ); ws->factory( "Gaussian::constr_Taa(beta_Taa,glob_Taa[0,-5,5],1)" ); ws->factory( "lumipp_hi[5.4]" ); ws->factory( "lumipp_kappa[1.06]" ); ws->factory( "expr::alpha_lumipp('pow(lumipp_kappa,beta_lumipp)',lumipp_kappa,beta_lumipp[0,-5,5])" ); ws->factory( "prod::lumipp_nom(lumipp_hi,alpha_lumipp)" ); ws->factory( "Gaussian::constr_lumipp(beta_lumipp,glob_lumipp[0,-5,5],1)" ); // ws->factory( "effRat1[1]" ); // ws->factory( "effRat2[1]" ); ws->factory( "effRat3_hi[0.95]" ); ws->factory( "effRat_kappa[1.054]" ); ws->factory( "expr::alpha_effRat('pow(effRat_kappa,beta_effRat)',effRat_kappa,beta_effRat[0,-5,5])" ); // ws->factory( "prod::effRat1_nom(effRat1_hi,alpha_effRat)" ); ws->factory( "Gaussian::constr_effRat(beta_effRat,glob_effRat[0,-5,5],1)" ); // ws->factory( "prod::effRat2_nom(effRat2_hi,alpha_effRat)" ); ws->factory( "prod::effRat3_nom(effRat3_hi,alpha_effRat)" ); // ws->factory("Nmb_hi[1.161e9]"); ws->factory("prod::denominator(Taa_nom,Nmb_hi)"); ws->factory( "expr::lumiOverTaaNmbmodified('lumipp_nom/denominator',lumipp_nom,denominator)"); RooFormulaVar *lumiOverTaaNmbmodified = ws->function("lumiOverTaaNmbmodified"); // // RooRealVar *raa1 = ws->var("raa1"); // RooRealVar* nsig1_pp = ws->var("nsig1_pp"); // RooRealVar* effRat1 = ws->function("effRat1_nom"); // RooRealVar *raa2 = ws->var("raa2"); // RooRealVar* nsig2_pp = ws->var("nsig2_pp"); // RooRealVar* effRat2 = ws->function("effRat2_nom"); RooRealVar* nsig3_pp = ws->var("N_{#Upsilon(3S)}_pp"); cout << nsig3_pp << endl; RooRealVar* effRat3 = ws->function("effRat3_nom"); // // RooFormulaVar nsig1_hi_modified("nsig1_hi_modified", "@0*@1*@3/@2", RooArgList(*raa1, *nsig1_pp, *lumiOverTaaNmbmodified, *effRat1)); // ws->import(nsig1_hi_modified); // RooFormulaVar nsig2_hi_modified("nsig2_hi_modified", "@0*@1*@3/@2", RooArgList(*raa2, *nsig2_pp, *lumiOverTaaNmbmodified, *effRat2)); // ws->import(nsig2_hi_modified); RooFormulaVar nsig3_hi_modified("nsig3_hi_modified", "@0*@1*@3/@2", RooArgList(*raa3, *nsig3_pp, *lumiOverTaaNmbmodified, *effRat3)); ws->import(nsig3_hi_modified); // // background yield with systematics ws->factory( "nbkg_hi_kappa[1.10]" ); ws->factory( "expr::alpha_nbkg_hi('pow(nbkg_hi_kappa,beta_nbkg_hi)',nbkg_hi_kappa,beta_nbkg_hi[0,-5,5])" ); ws->factory( "SUM::nbkg_hi_nom(alpha_nbkg_hi*bkgPdf_hi)" ); ws->factory( "Gaussian::constr_nbkg_hi(beta_nbkg_hi,glob_nbkg_hi[0,-5,5],1)" ); RooAbsPdf* sig1S_hi = ws->pdf("cbcb_hi"); RooAbsPdf* sig2S_hi = ws->pdf("sig2S_hi"); RooAbsPdf* sig3S_hi = ws->pdf("sig3S_hi"); RooAbsPdf* LSBackground_hi = ws->pdf("nbkg_hi_nom"); RooRealVar* nsig1_hi = ws->var("N_{#Upsilon(1S)}_hi"); RooRealVar* nsig2_hi = ws->var("N_{#Upsilon(2S)}_hi"); cout << nsig1_hi << " " << nsig2_hi << " " << nsig3_pp << endl; RooFormulaVar* nsig3_hi = ws->function("nsig3_hi_modified"); RooRealVar* norm_nbkg_hi = ws->var("n_{Bkgd}_hi"); RooArgList pdfs_hi( *sig1S_hi,*sig2S_hi,*sig3S_hi, *LSBackground_hi); RooArgList norms_hi(*nsig1_hi,*nsig2_hi,*nsig3_hi, *norm_nbkg_hi); //////////////////////////////////////////////////////////////////////////////// ws->factory( "nbkg_pp_kappa[1.03]" ); ws->factory( "expr::alpha_nbkg_pp('pow(nbkg_pp_kappa,beta_nbkg_pp)',nbkg_pp_kappa,beta_nbkg_pp[0,-5,5])" ); ws->factory( "SUM::nbkg_pp_nom(alpha_nbkg_pp*bkgPdf_pp)" ); ws->factory( "Gaussian::constr_nbkg_pp(beta_nbkg_pp,glob_nbkg_pp[0,-5,5],1)" ); RooAbsPdf* sig1S_pp = ws->pdf("cbcb_pp"); RooAbsPdf* sig2S_pp = ws->pdf("sig2S_pp"); RooAbsPdf* sig3S_pp = ws->pdf("sig3S_pp"); RooAbsPdf* LSBackground_pp = ws->pdf("nbkg_pp_nom"); RooRealVar* nsig1_pp = ws->var("N_{#Upsilon(1S)}_pp"); RooRealVar* nsig2_pp = ws->var("N_{#Upsilon(2S)}_pp"); RooRealVar* nsig3_pp = ws->var("N_{#Upsilon(3S)}_pp"); RooRealVar* norm_nbkg_pp = ws->var("n_{Bkgd}_pp"); RooArgList pdfs_pp( *sig1S_pp,*sig2S_pp,*sig3S_pp, *LSBackground_pp); RooArgList norms_pp( *nsig1_pp,*nsig2_pp,*nsig3_pp,*norm_nbkg_pp); RooAddPdf model_num("model_num", "model_num", pdfs_hi,norms_hi); ws->import(model_num); ws->factory("PROD::model_hi(model_num, constr_nbkg_hi,constr_lumipp,constr_Taa,constr_effRat)"); RooAddPdf model_den("model_den", "model_den", pdfs_pp,norms_pp); ws->import(model_den); ws->factory("PROD::model_pp(model_den, constr_nbkg_pp)"); ws->factory("SIMUL::joint(dataCat,hi=model_hi,pp=model_pp)"); ///////////////////////////////////////////////////////////////////// RooRealVar * pObs = ws->var("invariantMass"); // get the pointer to the observable RooArgSet obs("observables"); obs.add(*pObs); obs.add( *ws->cat("dataCat")); // ///////////////////////////////////////////////////////////////////// ws->var("glob_lumipp")->setConstant(true); ws->var("glob_Taa")->setConstant(true); ws->var("glob_effRat")->setConstant(true); ws->var("glob_nbkg_pp")->setConstant(true); ws->var("glob_nbkg_hi")->setConstant(true); RooArgSet globalObs("global_obs"); globalObs.add( *ws->var("glob_lumipp") ); globalObs.add( *ws->var("glob_Taa") ); globalObs.add( *ws->var("glob_effRat") ); globalObs.add( *ws->var("glob_nbkg_hi") ); globalObs.add( *ws->var("glob_nbkg_pp") ); // ws->Print(); RooArgSet poi("poi"); poi.add( *ws->var("raa3") ); // create set of nuisance parameters RooArgSet nuis("nuis"); nuis.add( *ws->var("beta_lumipp") ); nuis.add( *ws->var("beta_nbkg_hi") ); nuis.add( *ws->var("beta_nbkg_pp") ); nuis.add( *ws->var("beta_Taa") ); nuis.add( *ws->var("beta_effRat") ); ws->var("#alpha_{CB}_hi")->setConstant(true); ws->var("#alpha_{CB}_pp")->setConstant(true); ws->var("#sigma_{CB1}_hi")->setConstant(true); ws->var("#sigma_{CB1}_pp")->setConstant(true); ws->var("#sigma_{CB2}/#sigma_{CB1}_hi")->setConstant(true); ws->var("#sigma_{CB2}/#sigma_{CB1}_pp")->setConstant(true); ws->var("Centrality")->setConstant(true); ws->var("N_{#Upsilon(1S)}_hi")->setConstant(true); ws->var("N_{#Upsilon(1S)}_pp")->setConstant(true); ws->var("N_{#Upsilon(2S)}_hi")->setConstant(true); ws->var("N_{#Upsilon(2S)}_pp")->setConstant(true); ws->var("N_{#Upsilon(3S)}_pp")->setConstant(true); ws->var("Nmb_hi")->setConstant(true); // ws->var("QQsign")->setConstant(true); ws->var("Taa_hi")->setConstant(true); ws->var("Taa_kappa")->setConstant(true); // ws->var("beta_Taa")->setConstant(true); // ws->var("beta_effRat")->setConstant(true); // ws->var("beta_lumipp")->setConstant(true); // ws->var("beta_nbkg_hi")->setConstant(true); // ws->var("beta_nbkg_pp")->setConstant(true); // ws->var("dataCat")->setConstant(true); ws->var("decay_hi")->setConstant(true); ws->var("decay_pp")->setConstant(true); ws->var("effRat3_hi")->setConstant(true); ws->var("effRat_kappa")->setConstant(true); // ws->var("glob_Taa")->setConstant(true); // ws->var("glob_effRat")->setConstant(true); // ws->var("glob_lumipp")->setConstant(true); // ws->var("glob_nbkg_hi")->setConstant(true); // ws->var("glob_nbkg_pp")->setConstant(true); // ws->var("invariantMass")->setConstant(true); ws->var("leftEdge")->setConstant(true); ws->var("lumipp_hi")->setConstant(true); ws->var("lumipp_kappa")->setConstant(true); ws->var("mass1S_hi")->setConstant(true); ws->var("mass1S_pp")->setConstant(true); ws->var("muMinusPt")->setConstant(true); ws->var("muPlusPt")->setConstant(true); ws->var("n_{Bkgd}_hi")->setConstant(true); ws->var("n_{Bkgd}_pp")->setConstant(true); ws->var("nbkg_hi_kappa")->setConstant(true); ws->var("nbkg_pp_kappa")->setConstant(true); ws->var("npow")->setConstant(true); ws->var("N_{#Upsilon(3S)}_pp")->setConstant(true); // ws->var("raa3")->setConstant(true); ws->var("rightEdge")->setConstant(true); ws->var("sigmaFraction_hi")->setConstant(true); ws->var("sigmaFraction_pp")->setConstant(true); ws->var("turnOn_hi")->setConstant(true); ws->var("turnOn_pp")->setConstant(true); ws->var("upsPt")->setConstant(true); ws->var("upsRapidity")->setConstant(true); ws->var("vProb")->setConstant(true); ws->var("width_hi")->setConstant(true); ws->var("width_pp")->setConstant(true); ws->var("x3raw")->setConstant(true); // RooArgSet fixed_again("fixed_again"); // fixed_again.add( *ws->var("leftEdge") ); // fixed_again.add( *ws->var("rightEdge") ); // fixed_again.add( *ws->var("Taa_hi") ); // fixed_again.add( *ws->var("Nmb_hi") ); // fixed_again.add( *ws->var("lumipp_hi") ); // fixed_again.add( *ws->var("effRat1_hi") ); // fixed_again.add( *ws->var("effRat2_hi") ); // fixed_again.add( *ws->var("effRat3_hi") ); // fixed_again.add( *ws->var("nsig3_pp") ); // fixed_again.add( *ws->var("nsig1_pp") ); // fixed_again.add( *ws->var("nbkg_hi") ); // fixed_again.add( *ws->var("alpha") ); // fixed_again.add( *ws->var("nbkg_kappa") ); // fixed_again.add( *ws->var("Taa_kappa") ); // fixed_again.add( *ws->var("lumipp_kappa") ); // fixed_again.add( *ws->var("mean_hi") ); // fixed_again.add( *ws->var("mean_pp") ); // fixed_again.add( *ws->var("width_hi") ); // fixed_again.add( *ws->var("turnOn_hi") ); // fixed_again.add( *ws->var("bkg_a1_pp") ); // fixed_again.add( *ws->var("bkg_a2_pp") ); // fixed_again.add( *ws->var("decay_hi") ); // fixed_again.add( *ws->var("raa1") ); // fixed_again.add( *ws->var("raa2") ); // fixed_again.add( *ws->var("nsig2_pp") ); // fixed_again.add( *ws->var("sigma1") ); // fixed_again.add( *ws->var("nbkg_pp") ); // fixed_again.add( *ws->var("npow") ); // fixed_again.add( *ws->var("muPlusPt") ); // fixed_again.add( *ws->var("muMinusPt") ); // fixed_again.add( *ws->var("mscale_hi") ); // fixed_again.add( *ws->var("mscale_pp") ); // // ws->Print(); // create signal+background Model Config RooStats::ModelConfig sbHypo("SbHypo"); sbHypo.SetWorkspace( *ws ); sbHypo.SetPdf( *ws->pdf("joint") ); sbHypo.SetObservables( obs ); sbHypo.SetGlobalObservables( globalObs ); sbHypo.SetParametersOfInterest( poi ); sbHypo.SetNuisanceParameters( nuis ); sbHypo.SetPriorPdf( *ws->pdf("step") ); // this is optional // ws->Print(); ///////////////////////////////////////////////////////////////////// RooAbsReal * pNll = sbHypo.GetPdf()->createNLL( *data,NumCPU(2) ); RooMinuit(*pNll).migrad(); // minimize likelihood wrt all parameters before making plots RooPlot *framepoi = ((RooRealVar *)poi.first())->frame(Bins(10),Range(0.,0.2),Title("LL and profileLL in raa3")); pNll->plotOn(framepoi,ShiftToZero()); RooAbsReal * pProfile = pNll->createProfile( globalObs ); // do not profile global observables pProfile->getVal(); // this will do fit and set POI and nuisance parameters to fitted values pProfile->plotOn(framepoi,LineColor(kRed)); framepoi->SetMinimum(0); framepoi->SetMaximum(3); TCanvas *cpoi = new TCanvas(); cpoi->cd(); framepoi->Draw(); cpoi->SaveAs("cpoi.pdf"); RooArgSet * pPoiAndNuisance = new RooArgSet("poiAndNuisance"); // pPoiAndNuisance->add(*sbHypo.GetNuisanceParameters()); // pPoiAndNuisance->add(*sbHypo.GetParametersOfInterest()); pPoiAndNuisance->add( nuis ); pPoiAndNuisance->add( poi ); sbHypo.SetSnapshot(*pPoiAndNuisance); RooPlot* xframeSB = pObs->frame(Title("SBhypo")); data->plotOn(xframeSB,Cut("dataCat==dataCat::hi")); RooAbsPdf *pdfSB = sbHypo.GetPdf(); RooCategory *dataCat = ws->cat("dataCat"); pdfSB->plotOn(xframeSB,Slice(*dataCat,"hi"),ProjWData(*dataCat,*data)); TCanvas *c1 = new TCanvas(); c1->cd(); xframeSB->Draw(); c1->SaveAs("c1.pdf"); delete pProfile; delete pNll; delete pPoiAndNuisance; ws->import( sbHypo ); ///////////////////////////////////////////////////////////////////// RooStats::ModelConfig bHypo = sbHypo; bHypo.SetName("BHypo"); bHypo.SetWorkspace(*ws); pNll = bHypo.GetPdf()->createNLL( *data,NumCPU(2) ); RooArgSet poiAndGlobalObs("poiAndGlobalObs"); poiAndGlobalObs.add( poi ); poiAndGlobalObs.add( globalObs ); pProfile = pNll->createProfile( poiAndGlobalObs ); // do not profile POI and global observables double oldval = ((RooRealVar *)poi.first())->getVal( ); ((RooRealVar *)poi.first())->setVal( 0 ); // set raa3=0 here pProfile->getVal(); // this will do fit and set nuisance parameters to profiled values pPoiAndNuisance = new RooArgSet( "poiAndNuisance" ); pPoiAndNuisance->add( nuis ); pPoiAndNuisance->add( poi ); bHypo.SetSnapshot(*pPoiAndNuisance); RooPlot* xframeB = pObs->frame(Title("Bhypo")); data->plotOn(xframeB,Cut("dataCat==dataCat::hi")); RooAbsPdf *pdfB = bHypo.GetPdf(); pdfB->plotOn(xframeB,Slice(*dataCat,"hi"),ProjWData(*dataCat,*data)); TCanvas *c2 = new TCanvas(); c2->cd(); xframeB->Draw(); c2->SaveAs("c2.pdf"); delete pProfile; delete pNll; delete pPoiAndNuisance; // import model config into workspace bHypo.SetWorkspace(*ws); ws->import( bHypo ); ///////////////////////////////////////////////////////////////////// ws->Print(); bHypo.Print(); sbHypo.Print(); ((RooRealVar *)poi.first())->setVal( oldval ); // set raa3=oldval here // save workspace to file ws -> SaveAs("TRIAL.root"); return; }