void Plot(RooAbsPdf *iGen,RooAbsPdf *iFit,int iN,int iNEvents,RooRealVar &iVar,RooRealVar &iSig,RooRealVar &iMean, RooRealVar &iScale,RooRealVar &iRes,RooDataSet *iData=0) { TRandom1 *lRand = new TRandom1(0xDEADBEEF); RooDataSet * lSignal = iGen->generate(iVar,iNEvents); if(iData == 0) { iFit->fitTo(*lSignal,Strategy(1)); if(iMean.getError() < 0.05) iFit->fitTo(*lSignal,Strategy(2)); } else { iFit->fitTo(*iData,Strategy(1)); if(iMean.getError() < 0.05) iFit->fitTo(*iData,Strategy(2)); } iVar.setBins(30); RooPlot *lFrame1 = iVar.frame(RooFit::Title("XXX")) ; if(iData == 0) lSignal->plotOn(lFrame1); if(iData != 0) iData->plotOn(lFrame1); iFit->plotOn(lFrame1); TCanvas *iC =new TCanvas("A","A",800,600); iC->cd(); lFrame1->Draw(); iC->SaveAs("Crap.png"); if(iData != 0) { RooPlot *lFrame2 = iVar.frame(RooFit::Title("XXX")) ; iData->plotOn(lFrame2); iGen->plotOn(lFrame2); TCanvas *iC1 =new TCanvas("B","B",800,600); iC1->cd(); lFrame2->Draw(); iC1->SaveAs("Crap.png"); } }
void ComputeUpperLimit(RooAbsData *data, RooStats::ModelConfig *model, float &UpperLimit, float &signif, RooRealVar *mu, RooArgSet *nullParams,RooWorkspace *ws,REGION region,const char* tag) { bool StoreEverything=false; // activate if you want to store frames and all RooStats::ProfileLikelihoodCalculator *plc = new RooStats::ProfileLikelihoodCalculator(*data, *model); plc->SetParameters(*mu); plc->SetNullParameters(*nullParams); plc->SetTestSize(0.05); RooStats::LikelihoodInterval *interval = plc->GetInterval(); bool ComputationSuccessful=false; UpperLimit = interval->UpperLimit(*mu,ComputationSuccessful); signif = 0.0; // plc->GetHypoTest()->Significance(); // deactivated significance (to make algorithm faster) if(!ComputationSuccessful) { cout << "There seems to have been a problem. Returned upper limit is " << UpperLimit << " but it will be set to -999" << endl; UpperLimit=-999; signif=-999; } if(StoreEverything) { // Store it all RooRealVar* minv = (RooRealVar*)model->GetObservables()->first(); minv->setBins(static_cast<int>((minv->getMax()-minv->getMin())/5.)); RooPlot* frameEE = minv->frame(RooFit::Title("ee sample")); frameEE->GetXaxis()->CenterTitle(1); frameEE->GetYaxis()->CenterTitle(1); RooPlot* frameMM = minv->frame(RooFit::Title("mm sample")); frameMM->GetXaxis()->CenterTitle(1); frameMM->GetYaxis()->CenterTitle(1); RooPlot* frameOF = minv->frame(RooFit::Title("OF sample")); frameOF->GetXaxis()->CenterTitle(1); frameOF->GetYaxis()->CenterTitle(1); data->plotOn(frameMM,RooFit::Cut("catCentral==catCentral::MMCentral")); model->GetPdf()->plotOn(frameMM,RooFit::Slice(*ws->cat("catCentral"), "MMCentral"),RooFit::ProjWData(*data)); data->plotOn(frameEE,RooFit::Cut("catCentral==catCentral::EECentral")); model->GetPdf()->plotOn(frameEE,RooFit::Slice(*ws->cat("catCentral"), "EECentral"),RooFit::ProjWData(*data)); data->plotOn(frameOF,RooFit::Cut("catCentral==catCentral::OFOSCentral")); model->GetPdf()->plotOn(frameOF,RooFit::Slice(*ws->cat("catCentral"), "OFOSCentral"),RooFit::ProjWData(*data)); TFile *fout = new TFile("fout.root","UPDATE"); frameMM->Write(Concatenate(Concatenate(data->GetName(),"_MM"),tag),TObject::kOverwrite); frameEE->Write(Concatenate(Concatenate(data->GetName(),"_EE"),tag),TObject::kOverwrite); frameOF->Write(Concatenate(Concatenate(data->GetName(),"_OF"),tag),TObject::kOverwrite); fout->Close(); } delete plc; plc=0; }
int main(int argc, char* argv[]){ string fileName; string fileNameZee; string functionName; string fileNameout; int ncats; int jcats; int bins; string outfilename; bool is2011=false; bool useDoubleCB=false; 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), "In file name") ("infilenameZee,I", po::value<string>(&fileNameZee), "In file name Zee") ("function,f", po::value<string>(&functionName), "Function to use") ("Outfilename,o", po::value<string>(&fileNameout), "Out file name") ("ncats,c", po::value<int>(&ncats)->default_value(5), "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(180), "Bins for the dataset") ("is2011", "Run 2011 config") ("useDoubleCB", "use double crystal ball function") ("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("is2011")) is2011=true; if (vm.count("useDoubleCB")) useDoubleCB=true; if (vm.count("verbose")) verbose=true; if (!verbose) { RooMsgService::instance().setGlobalKillBelow(RooFit::ERROR); RooMsgService::instance().setSilentMode(true); } TFile *outputfile; //RooWorkspace *outputws = new RooWorkspace("cms_hgg_workspace"); RooWorkspace *outputws; outputfile = new TFile(fileNameout.c_str(),"RECREATE"); TFile *inFile = TFile::Open(fileName.c_str()); RooWorkspace *inWS = (RooWorkspace*)inFile->Get("cms_hgg_workspace"); outputws = (RooWorkspace*)inWS->Clone("cms_hgg_workspace"); vector<string> functionClasses; functionClasses.push_back("Chebychev"); functionClasses.push_back("Bernstein"); functionClasses.push_back("Exponential"); functionClasses.push_back("PowerLaw"); functionClasses.push_back("Laurent"); map<string,string> namingMap; namingMap.insert(pair<string,string>("Bernstein","pol")); namingMap.insert(pair<string,string>("Exponential","exp")); namingMap.insert(pair<string,string>("PowerLaw","pow")); namingMap.insert(pair<string,string>("Laurent","lau")); vector<pair<pair<string,int> ,pair<pair<int,int>, pair<float,float> > > > fabChoice; int sqrts; string ext; if (is2011) { sqrts = 7; ext = "7TeV"; } else { sqrts = 8; ext = "8TeV"; fabChoice.push_back(pair<pair<string,int>, pair<pair<int,int>, pair<float,float> > >(make_pair("Bernstein",-3),make_pair(make_pair(5,1), make_pair(-11.0,11.0)))); //0 fabChoice.push_back(pair<pair<string,int>, pair<pair<int,int>, pair<float,float> > >(make_pair("Bernstein",-3),make_pair(make_pair(5,1), make_pair(-11.0,11.0)))); //1 fabChoice.push_back(pair<pair<string,int>, pair<pair<int,int>, pair<float,float> > >(make_pair("Chebychev",-3),make_pair(make_pair(5,1), make_pair(-11.0,11.0)))); //2 fabChoice.push_back(pair<pair<string,int>, pair<pair<int,int>, pair<float,float> > >(make_pair("Bernstein",-3),make_pair(make_pair(5,1), make_pair(-11.0,11.0)))); //3 } // store results here PdfModelBuilderFAN pdfsModel; RooRealVar *mass = (RooRealVar*)inWS->var("CMS_hgg_mass"); mass->setRange(mhLow,mhHigh); pdfsModel.setObsVar(mass); mass->setBins(bins); ofstream outfile("Zee_Yield.log"); cout<<"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Initialization Done +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl; for (int cat=jcats; cat<ncats; cat++){ RooDataSet *dataFull = (RooDataSet*)inWS->data(Form("data_mass_cat%d",cat)); RooDataHist thisdataBinned(Form("roohist_data_mass_cat%d",cat),"data",*mass,*dataFull); RooDataSet *data = (RooDataSet*)&thisdataBinned; string funcType = fabChoice[cat].first.first; float LaurentConstant = fabChoice[cat].first.second; int orderOff = fabChoice[cat].second.first.first; int orderBre = fabChoice[cat].second.first.second; float bernDownBound = fabChoice[cat].second.second.first; float bernUpBound = fabChoice[cat].second.second.second; RooAbsPdf *pdfVoiFix; float voiMean=0.; float voiMeanErrorL=0.; float voiMeanErrorH=0.; float voiSigma=0.; float voiSigmaErrorL=0.; float voiSigmaErrorH=0.; float voiWidth=0; float voiWidthErrorL=0.; float voiWidthErrorH=0.; float voinCB1=0.; float voinCB1ErrorL=0.; float voinCB1ErrorH=0.; float voinCB2=0.; float voinCB2ErrorL=0.; float voinCB2ErrorH=0.; float voialphaCB1=0.; float voialphaCB2=0.; float ErrorRange=1.0; if(orderBre != 0){ TFile *inFileZee = TFile::Open(fileNameZee.c_str()); RooWorkspace *inWS_Zee = (RooWorkspace*)inFileZee->Get("fTestVoi_Zee"); if(!useDoubleCB) pdfVoiFix = inWS_Zee->pdf(Form("ftest_Zee_Voi_%s_cat%d",ext.c_str(),cat)); else pdfVoiFix = inWS_Zee->pdf(Form("ftest_Zee_DCB_%s_cat%d",ext.c_str(),cat)); cout<<"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Get Zee Done +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl; if(pdfVoiFix!=NULL){ if(!useDoubleCB){ ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_Voi_%s_cat%d_mean_p0",ext.c_str(),cat)))->setConstant(true); voiMean = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_Voi_%s_cat%d_mean_p0",ext.c_str(),cat)))->getValV(); voiMeanErrorL = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_Voi_%s_cat%d_mean_p0",ext.c_str(),cat)))->getErrorLo(); voiMeanErrorH = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_Voi_%s_cat%d_mean_p0",ext.c_str(),cat)))->getErrorHi(); ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_Voi_%s_cat%d_sigma_p0",ext.c_str(),cat)))->setConstant(true); voiSigma = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_Voi_%s_cat%d_sigma_p0",ext.c_str(),cat)))->getValV(); voiSigmaErrorL = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_Voi_%s_cat%d_sigma_p0",ext.c_str(),cat)))->getErrorLo(); voiSigmaErrorH = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_Voi_%s_cat%d_sigma_p0",ext.c_str(),cat)))->getErrorHi(); ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_Voi_%s_cat%d_width_p0",ext.c_str(),cat)))->setConstant(true); voiWidth = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_Voi_%s_cat%d_width_p0",ext.c_str(),cat)))->getValV(); voiWidthErrorL = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_Voi_%s_cat%d_width_p0",ext.c_str(),cat)))->getErrorLo(); voiWidthErrorH = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_Voi_%s_cat%d_width_p0",ext.c_str(),cat)))->getErrorHi(); }else{ ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_mean_p0",ext.c_str(),cat)))->setConstant(true); voiMean = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_mean_p0",ext.c_str(),cat)))->getValV(); voiMeanErrorL = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_mean_p0",ext.c_str(),cat)))->getErrorLo(); voiMeanErrorH = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_mean_p0",ext.c_str(),cat)))->getErrorHi(); ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_sigma_p0",ext.c_str(),cat)))->setConstant(true); voiSigma = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_sigma_p0",ext.c_str(),cat)))->getValV(); voiSigmaErrorL = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_sigma_p0",ext.c_str(),cat)))->getErrorLo(); voiSigmaErrorH = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_sigma_p0",ext.c_str(),cat)))->getErrorHi(); ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_nCB1_p0",ext.c_str(),cat)))->setConstant(true); voinCB1 = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_nCB1_p0",ext.c_str(),cat)))->getValV(); voinCB1ErrorL = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_nCB1_p0",ext.c_str(),cat)))->getErrorLo(); voinCB1ErrorH = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_nCB1_p0",ext.c_str(),cat)))->getErrorHi(); ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_nCB2_p0",ext.c_str(),cat)))->setConstant(true); voinCB2 = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_nCB2_p0",ext.c_str(),cat)))->getValV(); voinCB2ErrorL = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_nCB2_p0",ext.c_str(),cat)))->getErrorLo(); voinCB2ErrorH = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_nCB2_p0",ext.c_str(),cat)))->getErrorHi(); ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_alphaCB1_p0",ext.c_str(),cat)))->setConstant(true); voialphaCB1 = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_alphaCB1_p0",ext.c_str(),cat)))->getValV(); ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_alphaCB2_p0",ext.c_str(),cat)))->setConstant(true); voialphaCB2 = ((RooRealVar*)inWS_Zee->allVars().find(Form("ftest_Zee_DCB_%s_cat%d_alphaCB2_p0",ext.c_str(),cat)))->getValV(); } } } else{ pdfVoiFix = 0; } cout<<"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Get Zee Params Done +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl; RooAbsPdf *bkgPdf; if(orderBre == 0){ bkgPdf = getPdf(pdfsModel, funcType, orderOff, Form("pdf_data_pol_model_%dTeV_cat%d",sqrts,cat), LaurentConstant); bkgPdf->SetName(Form("pdf_data_pol_model_%dTeV_cat%d",sqrts,cat)); } else{ if(functionName == "Voi"){ if(!useDoubleCB){ bkgPdf = getPdfSumVoigtianFixNew(pdfsModel, funcType, orderOff, voiMean, voiMeanErrorL, voiMeanErrorH, voiSigma, voiSigmaErrorL, voiSigmaErrorH, voiWidth, voiWidthErrorL, voiWidthErrorH, ErrorRange, Form("pdf_data_pol_model_%dTeV_cat%d",sqrts,cat), LaurentConstant, bernDownBound, bernUpBound).first; }else{ bkgPdf = getPdfSumVoigtianFixNewDouleCB(pdfsModel, funcType, orderOff, voiMean, voiMeanErrorL, voiMeanErrorH, voiSigma, voiSigmaErrorL, voiSigmaErrorH, voinCB1, voinCB1ErrorL, voinCB1ErrorH, voinCB2, voinCB2ErrorL, voinCB2ErrorH, voialphaCB1, voialphaCB2, ErrorRange, Form("pdf_data_pol_model_%dTeV_cat%d",sqrts,cat), LaurentConstant, bernDownBound, bernUpBound).first; } } bkgPdf->SetName(Form("pdf_data_pol_model_%dTeV_cat%d",sqrts,cat)); } RooArgSet *params = bkgPdf->getParameters(*data); params->Print("v"); cout<<"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Prepare Final Pdf Done +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl; RooFitResult *fitRes = bkgPdf->fitTo(*data,Save(true),Range(mhLow,mhHigh)); fitRes->floatParsInit().Print("v"); fitRes->floatParsFinal().Print("v"); if(voiMean != 0){ if(!useDoubleCB){ ((RooRealVar*)params->find(Form("pdf_data_pol_model_8TeV_cat%d_Fvoimean",cat)))->setConstant(false); ((RooRealVar*)params->find(Form("pdf_data_pol_model_8TeV_cat%d_Fvoisigma",cat)))->setConstant(false); ((RooRealVar*)params->find(Form("pdf_data_pol_model_8TeV_cat%d_Fvoiwidth",cat)))->setConstant(false); }else{ ((RooRealVar*)params->find(Form("pdf_data_pol_model_8TeV_cat%d_Fdcbmean",cat)))->setConstant(false); ((RooRealVar*)params->find(Form("pdf_data_pol_model_8TeV_cat%d_Fdcbsigma",cat)))->setConstant(false); ((RooRealVar*)params->find(Form("pdf_data_pol_model_8TeV_cat%d_FdcbnCB1",cat)))->setConstant(false); ((RooRealVar*)params->find(Form("pdf_data_pol_model_8TeV_cat%d_FdcbnCB2",cat)))->setConstant(false); } params->Print("v"); float BernFrac = ((RooRealVar*)fitRes->floatParsFinal().find(Form("pdf_data_pol_model_8TeV_cat%d_frac_sum1",cat)))->getValV(); if(!useDoubleCB){ outfile << Form("cat %d ",cat) << data->sumEntries()*(1.0-BernFrac) << " Mean " << voiMean << " voiMeanErrorL " << voiMeanErrorL << " voiMeanErrorH "<< voiMeanErrorH << " voiSigma " << voiSigma << " voiSigmaErrorL " << voiSigmaErrorL << " voiSigmaErrorH " << voiSigmaErrorH << " voiWidth " << voiWidth << " voiWidthErrorL " << voiWidthErrorL << " voiWidthErrorH " << voiWidthErrorH << endl; outfile << endl; }else{ outfile << Form("cat %d ",cat) << data->sumEntries()*(1.0-BernFrac) << " Mean " << voiMean << " voiMeanErrorL " << voiMeanErrorL << " voiMeanErrorH "<< voiMeanErrorH << " voiSigma " << voiSigma << " voiSigmaErrorL " << voiSigmaErrorL << " voiSigmaErrorH " << voiSigmaErrorH << " nCB1 " << voinCB1 << " nCB1ErrorL " << voinCB1ErrorL << " nCB1ErrorH " << voinCB1ErrorH << " nCB2 " << voinCB2 << " nCB2ErrorL " << voinCB2ErrorL << " nCB2ErrorH " << voinCB2ErrorH << "bernfrac "<<BernFrac<< endl; } } outputws->pdf(Form("pdf_data_pol_model_%dTeV_cat%d",sqrts,cat))->SetName(Form("pdf_data_pol_model_%dTeV_cat%d_OLD",sqrts,cat)); outputws->import(*bkgPdf); //outputws->import(*data); outputws->pdf(Form("pdf_data_pol_model_%dTeV_cat%d",sqrts,cat))->Print(); outputws->data(Form("data_mass_cat%d",cat))->Print("v"); outputws->data(Form("roohist_data_mass_cat%d",cat))->Print("v"); } outputfile->cd(); outputws->Write(); outputfile->Close(); }
void FitBias(TString CAT,TString CUT,float SIG,float BKG,int NTOYS) { gROOT->ForceStyle(); RooMsgService::instance().setSilentMode(kTRUE); RooMsgService::instance().setStreamStatus(0,kFALSE); RooMsgService::instance().setStreamStatus(1,kFALSE); // ----------------------------------------- TFile *fTemplates = TFile::Open("templates_"+CUT+"_"+CAT+"_workspace.root"); RooWorkspace *wTemplates = (RooWorkspace*)fTemplates->Get("w"); RooRealVar *x = (RooRealVar*)wTemplates->var("mTop"); RooAbsPdf *pdf_signal = (RooAbsPdf*)wTemplates->pdf("ttbar_pdf_Nominal"); RooAbsPdf *pdf_bkg = (RooAbsPdf*)wTemplates->pdf("qcdCor_pdf"); TRandom *rnd = new TRandom(); rnd->SetSeed(0); x->setBins(250); RooPlot *frame; TFile *outf; if (NTOYS > 1) { outf = TFile::Open("FitBiasToys_"+CUT+"_"+CAT+".root","RECREATE"); } float nSigInj,nBkgInj,nSigFit,nBkgFit,eSigFit,eBkgFit,nll; TTree *tr = new TTree("toys","toys"); tr->Branch("nSigInj",&nSigInj,"nSigInj/F"); tr->Branch("nSigFit",&nSigFit,"nSigFit/F"); tr->Branch("nBkgInj",&nBkgInj,"nBkgInj/F"); tr->Branch("nBkgFit",&nBkgFit,"nBkgFit/F"); tr->Branch("eSigFit",&eSigFit,"eSigFit/F"); tr->Branch("eBkgFit",&eBkgFit,"eBkgFit/F"); tr->Branch("nll" ,&nll ,"nll/F"); for(int itoy=0;itoy<NTOYS;itoy++) { // generate pseudodataset nSigInj = rnd->Poisson(SIG); nBkgInj = rnd->Poisson(BKG); RooRealVar *nSig = new RooRealVar("nSig","nSig",nSigInj); RooRealVar *nBkg = new RooRealVar("nBkg","nBkg",nBkgInj); RooAddPdf *model = new RooAddPdf("model","model",RooArgList(*pdf_signal,*pdf_bkg),RooArgList(*nSig,*nBkg)); RooDataSet *data = model->generate(*x,nSigInj+nBkgInj); RooDataHist *roohist = new RooDataHist("roohist","roohist",RooArgList(*x),*data); // build fit model RooRealVar *nFitSig = new RooRealVar("nFitSig","nFitSig",SIG,0,10*SIG); RooRealVar *nFitBkg = new RooRealVar("nFitBkg","nFitBkg",BKG,0,10*BKG); RooAddPdf *modelFit = new RooAddPdf("modelFit","modelFit",RooArgList(*pdf_signal,*pdf_bkg),RooArgList(*nFitSig,*nFitBkg)); // fit the pseudo dataset RooFitResult *res = modelFit->fitTo(*roohist,RooFit::Save(),RooFit::Extended(kTRUE)); //res->Print(); nSigFit = nFitSig->getVal(); nBkgFit = nFitBkg->getVal(); eSigFit = nFitSig->getError(); eBkgFit = nFitBkg->getError(); nll = res->minNll(); tr->Fill(); if (itoy % 100 == 0) { cout<<"Toy #"<<itoy<<": injected = "<<nSigInj<<", fitted = "<<nSigFit<<", error = "<<eSigFit<<endl; } if (NTOYS == 1) { frame = x->frame(); roohist->plotOn(frame); model->plotOn(frame); } } if (NTOYS == 1) { TCanvas *can = new TCanvas("Toy","Toy",900,600); frame->Draw(); } else { outf->cd(); tr->Write(); outf->Close(); fTemplates->Close(); } }
void plotPdf_7D_XWW(double mH = 125, bool draw=true) { gROOT->ProcessLine(".L tdrstyle.C"); setTDRStyle(); TGaxis::SetMaxDigits(3); gROOT->ForceStyle(); // Declaration of the PDFs to use gROOT->ProcessLine(".L PDFs/RooSpinTwo_7D.cxx+"); // W/Z mass and decay width constants double mV = 80.399; double gamV = 2.085; bool offshell = false; if ( mH < 2 * mV ) offshell = true; // for the pole mass and decay width of W RooRealVar* mX = new RooRealVar("mX","mX", mH); RooRealVar* mW = new RooRealVar("mW","mW", mV); RooRealVar* gamW = new RooRealVar("gamW","gamW",gamV); // // Observables (7D) // RooRealVar* wplusmass = new RooRealVar("wplusmass","m(W+)",mV,1e-09,120); wplusmass->setBins(50); RooRealVar* wminusmass = new RooRealVar("wminusmass","m(W-)",mV,1e-09,120); wminusmass->setBins(50); RooRealVar* hs = new RooRealVar("costhetastar","cos#theta*",-1,1); hs->setBins(20); RooRealVar* Phi1 = new RooRealVar("phistar1","#Phi_{1}",-TMath::Pi(),TMath::Pi()); Phi1->setBins(20); RooRealVar* h1 = new RooRealVar("costheta1","cos#theta_{1}",-1,1); h1->setBins(20); RooRealVar* h2 = new RooRealVar("costheta2","cos#theta_{2}",-1,1); h2->setBins(20); RooRealVar* Phi = new RooRealVar("phi","#Phi",-TMath::Pi(),TMath::Pi()); Phi->setBins(20); // // coupling constants for 2m+ // See equation 5,6,7 in PRD 91, 075022 // double s = (mH*mH-2*mV*mV)/2.; double c1 = 2*(1+mV*mV/s); c1 = c1 * 2.0; // scale up to be consistent with the generator // std::cout << "c1 = " << c1 << "\n"; RooRealVar* c1Val = new RooRealVar("c1Val", "c1Val", c1); RooRealVar* c2Val = new RooRealVar("c2Val", "c2Val", -0.5); RooRealVar* c3Val = new RooRealVar("c3Val", "c3Val", 0.); RooRealVar* c4Val = new RooRealVar("c4Val", "c4Val", -1.); RooRealVar* c5Val = new RooRealVar("c5Val", "c5Val", 0.); RooRealVar* c6Val = new RooRealVar("c6Val", "c6Val", 0.); RooRealVar* c7Val = new RooRealVar("c7Val", "c7Val", 0.); // // Alternative definition in terms of g1->g10 // RooRealVar* useGTerm = new RooRealVar("useGTerm", "useGTerm",1.); // set to 1 if using g couplings RooRealVar* g1Val = new RooRealVar("g1Val", "g1Val", 1); RooRealVar* g2Val = new RooRealVar("g2Val", "g2Val", 0.); RooRealVar* g3Val = new RooRealVar("g3Val", "g3Val", 0.); RooRealVar* g4Val = new RooRealVar("g4Val", "g4Val", 0.); RooRealVar* g5Val = new RooRealVar("g5Val", "g5Val", 1.); RooRealVar* g6Val = new RooRealVar("g6Val", "g6Val", 0.); RooRealVar* g7Val = new RooRealVar("g7Val", "g7Val", 0.); RooRealVar* g8Val = new RooRealVar("g8Val", "g8Val", 0.); RooRealVar* g9Val = new RooRealVar("g9Val", "g9Val", 0.); RooRealVar* g10Val = new RooRealVar("g10Val", "g10Val", 0.); // related to the gg/qq productions RooRealVar* fz1Val = new RooRealVar("fz1Val", "fz1Val", 0); RooRealVar* fz2Val = new RooRealVar("fz2Val", "fz2Val", 1.0); // Even more parameters, do not have to touch, based on Z couplings RooRealVar* R1Val = new RooRealVar("R1Val","R1Val",1); RooRealVar* R2Val = new RooRealVar("R2Val","R2Val",1); // PDF definition SM Higgs (JP = 2+) RooSpinTwo_7D *myPDF; if ( offshell ) myPDF = new RooSpinTwo_7D("myPDF","myPDF", *mX, *wplusmass, *wminusmass, *hs, *h1,*h2, *Phi, *Phi1, *c1Val, *c2Val, *c3Val, *c4Val, *c5Val, *c6Val, *c7Val, *useGTerm, *g1Val, *g2Val, *g3Val, *g4Val, *g5Val, *g6Val, *g7Val, *g8Val, *g9Val, *g10Val, *fz1Val, *fz2Val, *R1Val, *R2Val, *mW, *gamW); else myPDF = new RooSpinTwo_7D("myPDF","myPDF", *mX, *mW, *mW, *hs, *h1,*h2, *Phi, *Phi1, *c1Val, *c2Val, *c3Val, *c4Val, *c5Val, *c6Val, *c7Val, *useGTerm, *g1Val, *g2Val, *g3Val, *g4Val, *g5Val, *g6Val, *g7Val, *g8Val, *g9Val, *g10Val, *fz1Val, *fz2Val, *R1Val, *R2Val, *mW, *gamW); // dataset for (JP = 2+) TString fileName; if ( useGTerm->getVal() > 0.) { fileName = Form("TWW_2mplus_%.0f_JHU.root", mH); } else { fileName = Form("TWW_%.0f_JHU_GenFromC.root", mH); } std::cout << "Opening " << fileName << "\n"; TFile* fin = new TFile(fileName); TTree* tin = (TTree*) fin->Get("angles"); if ( offshell) RooDataSet data("data","data",tin,RooArgSet(*wplusmass, *wminusmass, *hs, *h1, *h2, *Phi, *Phi1)); else RooDataSet data("data","data",tin,RooArgSet(*hs, *h1, *h2, *Phi, *Phi1)); // // 2h- // RooRealVar* g1ValMinus = new RooRealVar("g1ValMinus", "g1ValMinus", 0); RooRealVar* g2ValMinus = new RooRealVar("g2ValMinus", "g2ValMinus", 0.); RooRealVar* g3ValMinus = new RooRealVar("g3ValMinus", "g3ValMinus", 0.); RooRealVar* g4ValMinus = new RooRealVar("g4ValMinus", "g4ValMinus", 0.); RooRealVar* g5ValMinus = new RooRealVar("g5ValMinus", "g5ValMinus", 0.); RooRealVar* g6ValMinus = new RooRealVar("g6ValMinus", "g6ValMinus", 0.); RooRealVar* g7ValMinus = new RooRealVar("g7ValMinus", "g7ValMinus", 0.); RooRealVar* g8ValMinus = new RooRealVar("g8ValMinus", "g8ValMinus", 1.); RooRealVar* g9ValMinus = new RooRealVar("g9ValMinus", "g9ValMinus", 0.); RooRealVar* g10ValMinus = new RooRealVar("g10ValMinus", "g10ValMinus", 0.); RooRealVar* fz1ValMinus = new RooRealVar("fz1ValMinus", "fz1ValMinus", 0.0); RooRealVar* fz2ValMinus = new RooRealVar("fz2ValMinus", "fz2ValMinus", 0.0); RooSpinTwo_7D *myPDFMinus; if ( offshell ) myPDFMinus = new RooSpinTwo_7D("myPDFMinus","myPDFMinus", *mX, *wplusmass, *wminusmass, *hs, *h1,*h2, *Phi, *Phi1, *c1Val, *c2Val, *c3Val, *c4Val, *c5Val, *c6Val, *c7Val, *useGTerm, *g1ValMinus, *g2ValMinus, *g3ValMinus, *g4ValMinus, *g5ValMinus, *g6ValMinus, *g7ValMinus, *g8ValMinus, *g9ValMinus, *g10ValMinus, *fz1ValMinus, *fz2ValMinus, *R1Val, *R2Val, *mW, *gamW); else myPDFMinus = new RooSpinTwo_7D("myPDFMinus","myPDFMinus", *mX, *mW, *mW, *hs, *h1,*h2, *Phi, *Phi1, *c1Val, *c2Val, *c3Val, *c4Val, *c5Val, *c6Val, *c7Val, *useGTerm, *g1ValMinus, *g2ValMinus, *g3ValMinus, *g4ValMinus, *g5ValMinus, *g6ValMinus, *g7ValMinus, *g8ValMinus, *g9ValMinus, *g10ValMinus, *fz1ValMinus, *fz2ValMinus, *R1Val, *R2Val, *mW, *gamW); // dataset for (JP = 2-) TString fileNameMinus; if ( useGTerm->getVal() > 0.) { fileNameMinus = Form("TWW_2hminus_%.0f_JHU.root", mH); } std::cout << "Opening " << fileNameMinus << "\n"; TFile* finMinus = new TFile(fileNameMinus); TTree* tinMinus = (TTree*) finMinus->Get("angles"); if ( offshell) RooDataSet dataMinus("dataMinus","dataMinus",tinMinus,RooArgSet(*wplusmass, *wminusmass, *hs, *h1, *h2, *Phi, *Phi1)); else RooDataSet dataMinus("dataMinus","dataMinus",tinMinus,RooArgSet(*hs, *h1, *h2, *Phi, *Phi1)); // // 2h+ // RooRealVar* g1ValHPlus = new RooRealVar("g1ValHPlus", "g1ValHPlus", 0); RooRealVar* g2ValHPlus = new RooRealVar("g2ValHPlus", "g2ValHPlus", 0.); RooRealVar* g3ValHPlus = new RooRealVar("g3ValHPlus", "g3ValHPlus", 0.); RooRealVar* g4ValHPlus = new RooRealVar("g4ValHPlus", "g4ValHPlus", 1.); RooRealVar* g5ValHPlus = new RooRealVar("g5ValHPlus", "g5ValHPlus", 0.); RooRealVar* g6ValHPlus = new RooRealVar("g6ValHPlus", "g6ValHPlus", 0.); RooRealVar* g7ValHPlus = new RooRealVar("g7ValHPlus", "g7ValHPlus", 0.); RooRealVar* g8ValHPlus = new RooRealVar("g8ValHPlus", "g8ValHPlus", 0.); RooRealVar* g9ValHPlus = new RooRealVar("g9ValHPlus", "g9ValHPlus", 0.); RooRealVar* g10ValHPlus = new RooRealVar("g10ValHPlus", "g10ValHPlus", 0.); RooRealVar* fz1ValHPlus = new RooRealVar("fz1ValHPlus", "fz1ValHPlus", 0.0); RooRealVar* fz2ValHPlus = new RooRealVar("fz2ValHPlus", "fz2ValHPlus", 0.0); RooSpinTwo_7D *myPDFHPlus; if ( offshell ) myPDFHPlus = new RooSpinTwo_7D("myPDFHPlus","myPDFHPlus", *mX, *wplusmass, *wminusmass, *hs, *h1,*h2, *Phi, *Phi1, *c1Val, *c2Val, *c3Val, *c4Val, *c5Val, *c6Val, *c7Val, *useGTerm, *g1ValHPlus, *g2ValHPlus, *g3ValHPlus, *g4ValHPlus, *g5ValHPlus, *g6ValHPlus, *g7ValHPlus, *g8ValHPlus, *g9ValHPlus, *g10ValHPlus, *fz1ValHPlus, *fz2ValHPlus, *R1Val, *R2Val, *mW, *gamW); else myPDFHPlus = new RooSpinTwo_7D("myPDFHPlus","myPDFHPlus", *mX, *mW, *mW, *hs, *h1,*h2, *Phi, *Phi1, *c1Val, *c2Val, *c3Val, *c4Val, *c5Val, *c6Val, *c7Val, *useGTerm, *g1ValHPlus, *g2ValHPlus, *g3ValHPlus, *g4ValHPlus, *g5ValHPlus, *g6ValHPlus, *g7ValHPlus, *g8ValHPlus, *g9ValHPlus, *g10ValHPlus, *fz1ValHPlus, *fz2ValHPlus, *R1Val, *R2Val, *mW, *gamW); TString fileNameHPlus; if ( useGTerm->getVal() > 0.) { fileNameHPlus = Form("TWW_2hplus_%.0f_JHU.root", mH); } std::cout << "Opening " << fileNameHPlus << "\n"; TFile* finHPlus = new TFile(fileNameHPlus); TTree* tinHPlus = (TTree*) finHPlus->Get("angles"); if ( offshell) RooDataSet dataHPlus("dataHPlus","dataHPlus",tinHPlus,RooArgSet(*wplusmass, *wminusmass, *hs, *h1, *h2, *Phi, *Phi1)); else RooDataSet dataHPlus("dataHPlus","dataHPlus",tinHPlus,RooArgSet(*hs, *h1, *h2, *Phi, *Phi1)); // P L O T . . . // (All parameters fixed, no fitting, just looking at the shape of the PDFs w.r.t. the data) if ( draw ) { bool drawmplus = true; bool drawhminus = true; bool drawhplus = true; bool drawpaper = true; double rescale = 1.0; if ( drawpaper ) rescale = .001; TH1F* dum0 = new TH1F("dum0","dum0",1,0,1); dum0->SetLineColor(kRed); dum0->SetMarkerColor(kBlack); dum0->SetLineWidth(3); TH1F* dum1 = new TH1F("dum1","dum1",1,0,1); dum1->SetLineColor(kBlue); dum1->SetMarkerColor(kBlack); dum1->SetMarkerStyle(24), dum1->SetLineWidth(3); TH1F* dum2 = new TH1F("dum2","dum2",1,0,1); dum2->SetLineColor(kGreen); dum2->SetMarkerColor(kBlack); dum2->SetMarkerStyle(21), dum2->SetLineWidth(3); // 2L+ TLegend * box3 = new TLegend(0.1,0.1,0.9,0.92); box3->SetFillColor(0); box3->SetBorderSize(0); if ( drawmplus ) box3->AddEntry(dum0,Form("X(%.0f)#rightarrow WW JP = 2m+", mH),"lp"); if ( drawhminus ) box3->AddEntry(dum1,Form("X(%.0f)#rightarrow WW JP = 2h-", mH),"lp"); if ( drawhplus ) box3->AddEntry(dum2,Form("X(%.0f)#rightarrow WW JP = 2h+,", mH),"lp"); // // h1 // RooPlot* h1frame = h1->frame(20); h1frame->GetXaxis()->CenterTitle(); h1frame->GetYaxis()->CenterTitle(); h1frame->GetYaxis()->SetTitle(" "); double ymax_h1; TH1F *h1_mplus = new TH1F("h1_mplus", "h1_mplus", 20, -1, 1); tin->Project("h1_mplus", "costheta1"); ymax_h1 = h1_mplus->GetMaximum(); TH1F *h1_hminus = new TH1F("h1_hminus", "h1_hminus", 20, -1, 1); tinMinus->Project("h1_hminus", "costheta1"); ymax_h1 = h1_hminus->GetMaximum() > ymax_h1 ? h1_hminus->GetMaximum() : ymax_h1; TH1F *h1_hplus = new TH1F("h1_hplus", "h1_hplus", 20, -1, 1); tinHPlus->Project("h1_hplus", "costheta1"); ymax_h1 = h1_hplus->GetMaximum() > ymax_h1 ? h1_hplus->GetMaximum() : ymax_h1; if ( drawmplus ) { data.plotOn(h1frame, MarkerColor(kRed),MarkerStyle(4),MarkerSize(1.5),LineWidth(0),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDF->plotOn(h1frame, LineColor(kRed),LineWidth(2), Normalization(rescale)); } if ( drawhminus ) { dataMinus.plotOn(h1frame, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFMinus->plotOn(h1frame, LineColor(kBlue),LineWidth(2), Normalization(rescale)); } if ( drawhplus ) { dataHPlus.plotOn(h1frame, MarkerColor(kGreen+3),MarkerStyle(25),MarkerSize(1.5),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFHPlus->plotOn(h1frame, LineColor(kGreen+3),LineWidth(2), Normalization(rescale)); } if ( rescale != 1. ) h1frame->GetYaxis()->SetRangeUser(0, ymax_h1 * rescale * 1.3); // // h2 // RooPlot* h2frame = h2->frame(20); h2frame->GetXaxis()->CenterTitle(); h2frame->GetYaxis()->CenterTitle(); h2frame->GetYaxis()->SetTitle(" "); double ymax_h2; TH1F *h2_mplus = new TH1F("h2_mplus", "h2_mplus", 20, -1, 1); tin->Project("h2_mplus", "costheta2"); ymax_h2 = h2_mplus->GetMaximum(); TH1F *h2_hminus = new TH1F("h2_hminus", "h2_hminus", 20, -1, 1); tinMinus->Project("h2_hminus", "costheta2"); ymax_h2 = h2_hminus->GetMaximum() > ymax_h2 ? h2_hminus->GetMaximum() : ymax_h2; TH1F *h2_hplus = new TH1F("h2_hplus", "h2_hplus", 20, -1, 1); tinHPlus->Project("h2_hplus", "costheta2"); ymax_h2 = h2_hplus->GetMaximum() > ymax_h2 ? h2_hplus->GetMaximum() : ymax_h2; if ( drawmplus ) { data.plotOn(h2frame, MarkerColor(kRed),MarkerStyle(4),MarkerSize(1.5),LineWidth(0),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDF->plotOn(h2frame, LineColor(kRed),LineWidth(2), Normalization(rescale)); } if ( drawhminus ) { dataMinus.plotOn(h2frame, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFMinus->plotOn(h2frame, LineColor(kBlue),LineWidth(2), Normalization(rescale)); } if ( drawhplus ) { dataHPlus.plotOn(h2frame, MarkerColor(kGreen+3),MarkerStyle(25),MarkerSize(1.5),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFHPlus->plotOn(h1frame, LineColor(kGreen+3),LineWidth(2), Normalization(rescale)); } if ( rescale != 1. ) h2frame->GetYaxis()->SetRangeUser(0, ymax_h2 * rescale * 1.3); // // Phi // RooPlot* Phiframe = Phi->frame(20); Phiframe->GetXaxis()->CenterTitle(); Phiframe->GetYaxis()->CenterTitle(); Phiframe->GetYaxis()->SetTitle(" "); double ymax_Phi; TH1F *Phi_mplus = new TH1F("Phi_mplus", "Phi_mplus", 20, -TMath::Pi(), TMath::Pi()); tin->Project("Phi_mplus", "phi"); ymax_Phi = Phi_mplus->GetMaximum(); TH1F *Phi_hminus = new TH1F("Phi_hminus", "Phi_hminus", 20, -TMath::Pi(), TMath::Pi()); tinMinus->Project("Phi_hminus", "phi"); ymax_Phi = Phi_hminus->GetMaximum() > ymax_Phi ? Phi_hminus->GetMaximum() : ymax_Phi; TH1F *Phi_hplus = new TH1F("Phi_hplus", "Phi_hplus", 20, -TMath::Pi(), TMath::Pi()); tinHPlus->Project("Phi_hplus", "phi"); ymax_Phi = Phi_hplus->GetMaximum() > ymax_Phi ? Phi_hplus->GetMaximum() : ymax_Phi; if ( drawmplus ) { data.plotOn(Phiframe, MarkerColor(kRed),MarkerStyle(4),MarkerSize(1.5),LineWidth(0),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDF->plotOn(Phiframe, LineColor(kRed),LineWidth(2), Normalization(rescale)); } if ( drawhminus ) { dataMinus.plotOn(Phiframe, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFMinus->plotOn(Phiframe, LineColor(kBlue),LineWidth(2), Normalization(rescale)); } if ( drawhplus ) { dataHPlus.plotOn(Phiframe, MarkerColor(kGreen+3),MarkerStyle(25),MarkerSize(1.5),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFHPlus->plotOn(Phiframe, LineColor(kGreen+3),LineWidth(2), Normalization(rescale)); } if ( rescale != 1. ) Phiframe->GetYaxis()->SetRangeUser(0, ymax_Phi * rescale * 1.3); // // hs // RooPlot* hsframe = hs->frame(20); hsframe->GetXaxis()->CenterTitle(); hsframe->GetYaxis()->CenterTitle(); hsframe->GetYaxis()->SetTitle(" "); double ymax_hs; TH1F *hs_mplus = new TH1F("hs_mplus", "hs_mplus", 20, -1, 1); tin->Project("hs_mplus", "costhetastar"); ymax_hs = hs_mplus->GetMaximum(); TH1F *hs_hminus = new TH1F("hs_hminus", "hs_hminus", 20, -1, 1); tinMinus->Project("hs_hminus", "costhetastar"); ymax_hs = hs_hminus->GetMaximum() > ymax_hs ? hs_hminus->GetMaximum() : ymax_hs; TH1F *hs_hplus = new TH1F("hs_hplus", "hs_hplus", 20, -1, 1); tinHPlus->Project("hs_hplus", "costhetastar"); ymax_hs = hs_hplus->GetMaximum() > ymax_hs ? hs_hplus->GetMaximum() : ymax_hs; if ( drawmplus ) { data.plotOn(hsframe, MarkerColor(kRed),MarkerStyle(4),MarkerSize(1.5),LineWidth(0),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDF->plotOn(hsframe, LineColor(kRed),LineWidth(2), Normalization(rescale)); } if ( drawhminus ) { dataMinus.plotOn(hsframe, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFMinus->plotOn(hsframe, LineColor(kBlue),LineWidth(2), Normalization(rescale)); } if ( drawhplus ) { dataHPlus.plotOn(hsframe, MarkerColor(kGreen+3),MarkerStyle(25),MarkerSize(1.5),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFHPlus->plotOn(hsframe, LineColor(kGreen+3),LineWidth(2), Normalization(rescale)); } if ( rescale != 1. ) hsframe->GetYaxis()->SetRangeUser(0, ymax_hs * rescale * 1.3); // // Phi1 // RooPlot* Phi1frame = Phi1->frame(20); Phi1frame->GetXaxis()->CenterTitle(); Phi1frame->GetYaxis()->CenterTitle(); Phi1frame->GetYaxis()->SetTitle(" "); double ymax_Phi1; TH1F *Phi1_mplus = new TH1F("Phi1_mplus", "Phi1_mplus", 20, -TMath::Pi(), TMath::Pi()); tin->Project("Phi1_mplus", "phistar1"); ymax_Phi1 = Phi1_mplus->GetMaximum(); TH1F *Phi1_hminus = new TH1F("Phi1_hminus", "Phi1_hminus", 20, -TMath::Pi(), TMath::Pi()); tinMinus->Project("Phi1_hminus", "phistar1"); ymax_Phi1 = Phi1_hminus->GetMaximum() > ymax_Phi1 ? Phi1_hminus->GetMaximum() : ymax_Phi1; TH1F *Phi1_hplus = new TH1F("Phi1_hplus", "Phi1_hplus", 20, -TMath::Pi(), TMath::Pi()); tinHPlus->Project("Phi1_hplus", "phistar1"); ymax_Phi1 = Phi1_hplus->GetMaximum() > ymax_Phi1 ? Phi1_hplus->GetMaximum() : ymax_Phi1; if ( drawmplus ) { data.plotOn(Phi1frame, MarkerColor(kRed),MarkerStyle(4),MarkerSize(1.5),LineWidth(0),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDF->plotOn(Phi1frame, LineColor(kRed),LineWidth(2), Normalization(rescale)); } if ( drawhminus ) { dataMinus.plotOn(Phi1frame, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFMinus->plotOn(Phi1frame, LineColor(kBlue),LineWidth(2), Normalization(rescale)); } if ( drawhplus ) { dataHPlus.plotOn(Phi1frame, MarkerColor(kGreen+3),MarkerStyle(25),MarkerSize(1.5),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFHPlus->plotOn(Phi1frame, LineColor(kGreen+3),LineWidth(2), Normalization(rescale)); } if ( rescale != 1. ) Phi1frame->GetYaxis()->SetRangeUser(0, ymax_Phi1 * rescale * 1.3); if ( offshell ) { RooPlot* w1frame = wplusmass->frame(50); w1frame->GetXaxis()->CenterTitle(); w1frame->GetYaxis()->CenterTitle(); w1frame->GetYaxis()->SetTitle(" "); double ymax_w1; TH1F *w1_mplus = new TH1F("w1_mplus", "w1_mplus", 50, 1e-09, 120); tin->Project("w1_mplus", "wplusmass"); ymax_w1 = w1_mplus->GetMaximum(); TH1F *w1_hminus = new TH1F("w1_hminus", "w1_hminus", 50, 1e-09, 120); tinMinus->Project("w1_hminus", "wplusmass"); ymax_w1 = w1_hminus->GetMaximum() > ymax_w1 ? w1_hminus->GetMaximum() : ymax_w1; TH1F *w1_hplus = new TH1F("w1_hplus", "w1_hplus", 50, 1e-09, 120); tinHPlus->Project("w1_hplus", "wplusmass"); ymax_w1 = w1_hplus->GetMaximum() > ymax_w1 ? w1_hplus->GetMaximum() : ymax_w1; if ( drawmplus ) { data.plotOn(w1frame, MarkerColor(kRed),MarkerStyle(4),MarkerSize(1.5),LineWidth(0),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDF->plotOn(w1frame, LineColor(kRed),LineWidth(2), Normalization(rescale)); } if ( drawhminus ) { dataMinus.plotOn(w1frame, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFMinus->plotOn(w1frame, LineColor(kBlue),LineWidth(2), Normalization(rescale)); } if ( drawhplus ) { dataHPlus.plotOn(w1frame, MarkerColor(kGreen+3),MarkerStyle(25),MarkerSize(1.5),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFHPlus->plotOn(w1frame, LineColor(kGreen+3),LineWidth(2), Normalization(rescale)); } if ( rescale != 1. ) w1frame->GetYaxis()->SetRangeUser(0, ymax_w1 * rescale * 1.5); // // wminus // RooPlot* w2frame = wminusmass->frame(50); w2frame->GetXaxis()->CenterTitle(); w2frame->GetYaxis()->CenterTitle(); w2frame->GetYaxis()->SetTitle(" "); double ymax_w2; TH1F *w2_mplus = new TH1F("w2_mplus", "w2_mplus", 50, 1e-09, 120); tin->Project("w2_mplus", "wminusmass"); ymax_w2 = w2_mplus->GetMaximum(); TH1F *w2_hminus = new TH1F("w2_hminus", "w2_hminus", 50, 1e-09, 120); tinMinus->Project("w2_hminus", "wminusmass"); ymax_w2 = w2_hminus->GetMaximum() > ymax_w2 ? w2_hminus->GetMaximum() : ymax_w2; TH1F *w2_hplus = new TH1F("w2_hplus", "w2_hplus", 50, 1e-09, 120); tinHPlus->Project("w2_hplus", "wminusmass"); ymax_w2 = w2_hplus->GetMaximum() > ymax_w2 ? w2_hplus->GetMaximum() : ymax_w2; if ( drawmplus ) { data.plotOn(w2frame, MarkerColor(kRed),MarkerStyle(4),MarkerSize(1.5),LineWidth(0),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDF->plotOn(w2frame, LineColor(kRed),LineWidth(2), Normalization(rescale)); } if ( drawhminus ) { dataMinus.plotOn(w2frame, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFMinus->plotOn(w2frame, LineColor(kBlue),LineWidth(2), Normalization(rescale)); } if ( drawhplus ) { dataHPlus.plotOn(w2frame, MarkerColor(kGreen+3),MarkerStyle(25),MarkerSize(1.5),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFHPlus->plotOn(w2frame, LineColor(kGreen+3),LineWidth(2), Normalization(rescale)); } if ( rescale != 1. ) w2frame->GetYaxis()->SetRangeUser(0, ymax_w2 * rescale * 1.5); } } if ( drawpaper ) { TCanvas* can =new TCanvas("can","can",600,600); if ( offshell ) { w1frame->GetXaxis()->SetTitle("m_{l#nu} [GeV]"); w1frame->Draw(); can->Print(Form("paperplots/wplusmass_%.0fGeV_spin2_3in1_ww.eps", mH)); can->SaveAs(Form("paperplots/wplusmass_%.0fGeV_spin2_3in1_ww.C", mH)); } can->Clear(); hsframe->Draw(); can->Print(Form("paperplots/costhetastar_%.0fGeV_spin2_3in1_ww.eps", mH)); can->SaveAs(Form("paperplots/costhetastar_%.0fGeV_spin2_3in1_ww.C", mH)); can->Clear(); Phi1frame->Draw(); can->Print(Form("paperplots/phistar1_%.0fGeV_spin2_3in1_ww.eps", mH)); can->SaveAs(Form("paperplots/phistar1_%.0fGeV_spin2_3in1_ww.C", mH)); can->Clear(); h1frame->GetXaxis()->SetTitle("cos#theta_{1} or cos#theta_{2}"); h1frame->Draw(); can->Print(Form("paperplots/costheta1_%.0fGeV_spin2_3in1_ww.eps", mH)); can->SaveAs(Form("paperplots/costheta1_%.0fGeV_spin2_3in1_ww.C", mH)); can->Clear(); Phiframe->Draw(); can->Print(Form("paperplots/phi_%.0fGeV_spin2_3in1_ww.eps", mH)); can->SaveAs(Form("paperplots/phi_%.0fGeV_spin2_3in1_ww.C", mH)); } else { TCanvas* czz = new TCanvas( "czz", "czz", 1000, 600 ); czz->Divide(4,2); if ( offshell ) { czz->cd(1); w1frame->Draw(); czz->cd(2); w2frame->Draw(); } czz->cd(3); hsframe->Draw(); czz->cd(4); box3->Draw(); czz->cd(5); Phi1frame->Draw(); czz->cd(6); h1frame->Draw(); czz->cd(7); h2frame->Draw(); czz->cd(8); Phiframe->Draw(); if ( useGTerm->getVal() > 0.) { czz->SaveAs(Form("epsfiles/angles_TWW%.0f_JHU_7D.eps", mH)); czz->SaveAs(Form("pngfiles/angles_TWW%.0f_JHU_7D.png", mH)); } else { czz->SaveAs(Form("epsfiles/angles_TWW%.0f_JHU_7D_GenFromC.eps", mH)); czz->SaveAs(Form("pngfiles/angles_TWW%.0f_JHU_7D_GenFromC.png", mH)); } } }
void eregtesting_13TeV_Eta(bool dobarrel=true, bool doele=false,int gammaID=0) { //output dir TString EEorEB = "EE"; if(dobarrel) { EEorEB = "EB"; } TString gammaDir = "bothGammas"; if(gammaID==1) { gammaDir = "gamma1"; } else if(gammaID==2) { gammaDir = "gamma2"; } TString dirname = TString::Format("ereg_test_plots_Eta/%s_%s",gammaDir.Data(),EEorEB.Data()); gSystem->mkdir(dirname,true); gSystem->cd(dirname); //read workspace from training TString fname; if (doele && dobarrel) fname = "wereg_ele_eb.root"; else if (doele && !dobarrel) fname = "wereg_ele_ee.root"; else if (!doele && dobarrel) fname = "wereg_ph_eb.root"; else if (!doele && !dobarrel) fname = "wereg_ph_ee.root"; TString infile = TString::Format("../../ereg_ws_Eta/%s/%s",gammaDir.Data(),fname.Data()); TFile *fws = TFile::Open(infile); RooWorkspace *ws = (RooWorkspace*)fws->Get("wereg"); //read variables from workspace RooGBRTargetFlex *meantgt = static_cast<RooGBRTargetFlex*>(ws->arg("sigmeant")); RooRealVar *tgtvar = ws->var("tgtvar"); RooArgList vars; vars.add(meantgt->FuncVars()); vars.add(*tgtvar); //read testing dataset from TTree RooRealVar weightvar("weightvar","",1.); TTree *dtree; if (doele) { //TFile *fdin = TFile::Open("root://eoscms.cern.ch//eos/cms/store/cmst3/user/bendavid/regTreesAug1/hgg-2013Final8TeV_reg_s12-zllm50-v7n_noskim.root"); TFile *fdin = TFile::Open("/data/bendavid/regTreesAug1/hgg-2013Final8TeV_reg_s12-zllm50-v7n_noskim.root"); TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterSingleInvert"); dtree = (TTree*)ddir->Get("hPhotonTreeSingle"); } else { //TFile *fdin = TFile::Open("/eos/cms/store/group/dpg_ecal/alca_ecalcalib/piZero2017/zhicaiz/Gun_MultiPion_FlatPt-1To15/Gun_FlatPt1to15_MultiPion_withPhotonPtFilter_pythia8/photons_0_half2.root"); //TFile *fdin = TFile::Open("/eos/cms/store/group/dpg_ecal/alca_ecalcalib/piZero2017/zhicaiz/Gun_MultiEta_FlatPt-1To15/Gun_FlatPt1to15_MultiEta_withPhotonPtFilter_pythia8/photons_22Aug2017_V3_half2.root"); TFile *fdin = TFile::Open("/eos/cms/store/group/dpg_ecal/alca_ecalcalib/piZero2017/zhicaiz/Gun_MultiEta_FlatPt-1To15/Gun_FlatPt1to15_MultiEtaToGG_withPhotonPtFilter_pythia8/photons_20171008_half2.root"); if(gammaID==0) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma"); } else if(gammaID==1) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma1"); } else if(gammaID==2) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma2"); } } //selection cuts for testing //TCut selcut = "(STr2_enG1_true/cosh(STr2_Eta_1)>1.0) && (STr2_S4S9_1>0.75)"; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (STr2_enG_true/STr2_enG_rec)<3.0 && STr2_EOverEOther < 10.0 && STr2_EOverEOther > 0.1"; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (STr2_mPi0_nocor>0.1)"; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_Nxtal > 6) && (STr2_mPi0_nocor>0.1) && (STr2_mPi0_nocor < 0.2)"; TCut selcut = ""; if(dobarrel) selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_Nxtal > 6) && (STr2_mPi0_nocor>0.2) && (STr2_mPi0_nocor < 1.0) && (STr2_ptPi0_nocor > 2.0) && abs(STr2_Eta)<1.479 && (!STr2_fromPi0)"; //if(dobarrel) selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_Nxtal > 6) && (STr2_mPi0_nocor>0.1) && (STr2_mPi0_nocor < 0.2) && (STr2_ptPi0_nocor > 2.0) && abs(STr2_Eta)<1.479"; else selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_Nxtal > 6) && (STr2_mPi0_nocor>0.2) && (STr2_mPi0_nocor < 1.0) && (STr2_ptPi0_nocor > 2.0) && abs(STr2_Eta)>1.479 && (!STr2_fromPi0)"; //else selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_Nxtal > 6) && (STr2_mPi0_nocor>0.1) && (STr2_mPi0_nocor < 0.2) && (STr2_ptPi0_nocor > 2.0) && abs(STr2_Eta)>1.479"; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (STr2_iEta_on2520==0 || STr2_iPhi_on20==0) "; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (abs(STr2_iEtaiX)<60)"; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (abs(STr2_iEtaiX)>60)"; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.9) && (STr2_S2S9>0.85)&& (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (abs(STr2_iEtaiX)<60)"; //TCut selcut = "(STr2_enG_rec/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.9) && (STr2_S2S9>0.85)&& (STr2_isMerging < 2) && (STr2_DeltaR < 0.03)"; /* TCut selcut; if (dobarrel) selcut = "ph.genpt>25. && ph.isbarrel && ph.ispromptgen"; else selcut = "ph.genpt>25. && !ph.isbarrel && ph.ispromptgen"; */ TCut selweight = "xsecweight(procidx)*puweight(numPU,procidx)"; TCut prescale10 = "(Entry$%10==0)"; TCut prescale10alt = "(Entry$%10==1)"; TCut prescale25 = "(Entry$%25==0)"; TCut prescale100 = "(Entry$%100==0)"; TCut prescale1000 = "(Entry$%1000==0)"; TCut evenevents = "(Entry$%2==0)"; TCut oddevents = "(Entry$%2==1)"; TCut prescale100alt = "(Entry$%100==1)"; TCut prescale1000alt = "(Entry$%1000==1)"; TCut prescale50alt = "(Entry$%50==1)"; TCut Events3_4 = "(Entry$%4==3)"; TCut Events1_4 = "(Entry$%4==1)"; TCut Events2_4 = "(Entry$%4==2)"; TCut Events0_4 = "(Entry$%4==0)"; TCut Events01_4 = "(Entry$%4<2)"; TCut Events23_4 = "(Entry$%4>1)"; TCut EventsTest = "(Entry$%2==1)"; //weightvar.SetTitle(EventsTest*selcut); weightvar.SetTitle(selcut); /* if (doele) weightvar.SetTitle(prescale100alt*selcut); else weightvar.SetTitle(selcut); */ //make testing dataset RooDataSet *hdata = RooTreeConvert::CreateDataSet("hdata",dtree,vars,weightvar); if (doele) weightvar.SetTitle(prescale1000alt*selcut); else weightvar.SetTitle(prescale10alt*selcut); //make reduced testing dataset for integration over conditional variables RooDataSet *hdatasmall = RooTreeConvert::CreateDataSet("hdatasmall",dtree,vars,weightvar); //retrieve full pdf from workspace RooAbsPdf *sigpdf = ws->pdf("sigpdf"); //input variable corresponding to sceta RooRealVar *scEraw = ws->var("var_0"); scEraw->setRange(1.,2.); scEraw->setBins(100); // RooRealVar *scetavar = ws->var("var_1"); // RooRealVar *scphivar = ws->var("var_2"); //regressed output functions RooAbsReal *sigmeanlim = ws->function("sigmeanlim"); RooAbsReal *sigwidthlim = ws->function("sigwidthlim"); RooAbsReal *signlim = ws->function("signlim"); RooAbsReal *sign2lim = ws->function("sign2lim"); // RooAbsReal *sigalphalim = ws->function("sigalphalim"); //RooAbsReal *sigalpha2lim = ws->function("sigalpha2lim"); //formula for corrected energy/true energy ( 1.0/(etrue/eraw) * regression mean) RooFormulaVar ecor("ecor","","1./(@0)*@1",RooArgList(*tgtvar,*sigmeanlim)); RooRealVar *ecorvar = (RooRealVar*)hdata->addColumn(ecor); ecorvar->setRange(0.,2.); ecorvar->setBins(800); //formula for raw energy/true energy (1.0/(etrue/eraw)) RooFormulaVar raw("raw","","1./@0",RooArgList(*tgtvar)); RooRealVar *rawvar = (RooRealVar*)hdata->addColumn(raw); rawvar->setRange(0.,2.); rawvar->setBins(800); //clone data and add regression outputs for plotting RooDataSet *hdataclone = new RooDataSet(*hdata,"hdataclone"); RooRealVar *meanvar = (RooRealVar*)hdataclone->addColumn(*sigmeanlim); RooRealVar *widthvar = (RooRealVar*)hdataclone->addColumn(*sigwidthlim); RooRealVar *nvar = (RooRealVar*)hdataclone->addColumn(*signlim); RooRealVar *n2var = (RooRealVar*)hdataclone->addColumn(*sign2lim); // RooRealVar *alphavar = (RooRealVar*)hdataclone->addColumn(*sigalphalim); // RooRealVar *alpha2var = (RooRealVar*)hdataclone->addColumn(*sigalpha2lim); //plot target variable and weighted regression prediction (using numerical integration over reduced testing dataset) TCanvas *craw = new TCanvas; //RooPlot *plot = tgtvar->frame(0.6,1.2,100); RooPlot *plot = tgtvar->frame(0.6,2.0,100); hdata->plotOn(plot); sigpdf->plotOn(plot,ProjWData(*hdatasmall)); plot->Draw(); craw->SaveAs("RawE.pdf"); craw->SaveAs("RawE.png"); craw->SetLogy(); plot->SetMinimum(0.1); craw->SaveAs("RawElog.pdf"); craw->SaveAs("RawElog.png"); //plot distribution of regressed functions over testing dataset TCanvas *cmean = new TCanvas; RooPlot *plotmean = meanvar->frame(0.8,2.0,100); hdataclone->plotOn(plotmean); plotmean->Draw(); cmean->SaveAs("mean.pdf"); cmean->SaveAs("mean.png"); TCanvas *cwidth = new TCanvas; RooPlot *plotwidth = widthvar->frame(0.,0.05,100); hdataclone->plotOn(plotwidth); plotwidth->Draw(); cwidth->SaveAs("width.pdf"); cwidth->SaveAs("width.png"); TCanvas *cn = new TCanvas; RooPlot *plotn = nvar->frame(0.,111.,200); hdataclone->plotOn(plotn); plotn->Draw(); cn->SaveAs("n.pdf"); cn->SaveAs("n.png"); TCanvas *cn2 = new TCanvas; RooPlot *plotn2 = n2var->frame(0.,111.,100); hdataclone->plotOn(plotn2); plotn2->Draw(); cn2->SaveAs("n2.pdf"); cn2->SaveAs("n2.png"); /* TCanvas *calpha = new TCanvas; RooPlot *plotalpha = alphavar->frame(0.,5.,200); hdataclone->plotOn(plotalpha); plotalpha->Draw(); calpha->SaveAs("alpha.pdf"); calpha->SaveAs("alpha.png"); TCanvas *calpha2 = new TCanvas; RooPlot *plotalpha2 = alpha2var->frame(0.,5.,200); hdataclone->plotOn(plotalpha2); plotalpha2->Draw(); calpha2->SaveAs("alpha2.pdf"); calpha2->SaveAs("alpha2.png"); */ /* TCanvas *ceta = new TCanvas; RooPlot *ploteta = scetavar->frame(-2.6,2.6,200); hdataclone->plotOn(ploteta); ploteta->Draw(); ceta->SaveAs("eta.pdf"); ceta->SaveAs("eta.png"); */ //create histograms for eraw/etrue and ecor/etrue to quantify regression performance TH1 *heraw;// = hdata->createHistogram("hraw",*rawvar,Binning(800,0.,2.)); TH1 *hecor;// = hdata->createHistogram("hecor",*ecorvar); if (EEorEB == "EB") { heraw = hdata->createHistogram("hraw",*rawvar,Binning(800,0.,2.0)); hecor = hdata->createHistogram("hecor",*ecorvar, Binning(800,0.,2.0)); } else { heraw = hdata->createHistogram("hraw",*rawvar,Binning(200,0.,2.)); hecor = hdata->createHistogram("hecor",*ecorvar, Binning(200,0.,2.)); } //heold->SetLineColor(kRed); hecor->SetLineColor(kBlue); heraw->SetLineColor(kMagenta); hecor->GetYaxis()->SetRangeUser(1.0,1.3*hecor->GetMaximum()); heraw->GetYaxis()->SetRangeUser(1.0,1.3*hecor->GetMaximum()); hecor->GetXaxis()->SetRangeUser(0.0,1.5); heraw->GetXaxis()->SetRangeUser(0.0,1.5); /*if(EEorEB == "EE") { heraw->GetYaxis()->SetRangeUser(10.0,200.0); hecor->GetYaxis()->SetRangeUser(10.0,200.0); } */ //heold->GetXaxis()->SetRangeUser(0.6,1.2); double effsigma_cor, effsigma_raw, fwhm_cor, fwhm_raw; if(EEorEB == "EB") { TH1 *hecorfine = hdata->createHistogram("hecorfine",*ecorvar,Binning(800,0.,2.)); effsigma_cor = effSigma(hecorfine); fwhm_cor = FWHM(hecorfine); TH1 *herawfine = hdata->createHistogram("herawfine",*rawvar,Binning(800,0.,2.)); effsigma_raw = effSigma(herawfine); fwhm_raw = FWHM(herawfine); } else { TH1 *hecorfine = hdata->createHistogram("hecorfine",*ecorvar,Binning(200,0.,2.)); effsigma_cor = effSigma(hecorfine); fwhm_cor = FWHM(hecorfine); TH1 *herawfine = hdata->createHistogram("herawfine",*rawvar,Binning(200,0.,2.)); effsigma_raw = effSigma(herawfine); fwhm_raw = FWHM(herawfine); } TCanvas *cresponse = new TCanvas; gStyle->SetOptStat(0); gStyle->SetPalette(107); hecor->SetTitle(""); heraw->SetTitle(""); hecor->Draw("HIST"); //heold->Draw("HISTSAME"); heraw->Draw("HISTSAME"); //show errSigma in the plot TLegend *leg = new TLegend(0.1, 0.75, 0.7, 0.9); leg->AddEntry(hecor,Form("E_{cor}/E_{true}, #sigma_{eff}=%4.3f, FWHM=%4.3f", effsigma_cor, fwhm_cor),"l"); leg->AddEntry(heraw,Form("E_{raw}/E_{true}, #sigma_{eff}=%4.3f, FWHM=%4.3f", effsigma_raw, fwhm_raw),"l"); leg->SetFillStyle(0); leg->SetBorderSize(0); // leg->SetTextColor(kRed); leg->Draw(); cresponse->SaveAs("response.pdf"); cresponse->SaveAs("response.png"); cresponse->SetLogy(); cresponse->SaveAs("responselog.pdf"); cresponse->SaveAs("responselog.png"); // draw CCs vs eta and phi /* TCanvas *c_eta = new TCanvas; TH1 *h_eta = hdata->createHistogram("h_eta",*scetavar,Binning(100,-3.2,3.2)); h_eta->Draw("HIST"); c_eta->SaveAs("heta.pdf"); c_eta->SaveAs("heta.png"); TCanvas *c_phi = new TCanvas; TH1 *h_phi = hdata->createHistogram("h_phi",*scphivar,Binning(100,-3.2,3.2)); h_phi->Draw("HIST"); c_phi->SaveAs("hphi.pdf"); c_phi->SaveAs("hphi.png"); */ RooRealVar *scetaiXvar = ws->var("var_4"); RooRealVar *scphiiYvar = ws->var("var_5"); if(EEorEB=="EB") { scetaiXvar->setRange(-90,90); scetaiXvar->setBins(180); scphiiYvar->setRange(0,360); scphiiYvar->setBins(360); } else { scetaiXvar->setRange(0,50); scetaiXvar->setBins(50); scphiiYvar->setRange(0,50); scphiiYvar->setBins(50); } ecorvar->setRange(0.5,1.5); ecorvar->setBins(800); rawvar->setRange(0.5,1.5); rawvar->setBins(800); TCanvas *c_cor_eta = new TCanvas; TH3F *h3_CC_eta_phi = (TH3F*) hdata->createHistogram("var_5,var_4,ecor",(EEorEB=="EB") ? 170 : 100, (EEorEB=="EB") ? 360 : 100,25); TProfile2D *h_CC_eta_phi = h3_CC_eta_phi->Project3DProfile(); h_CC_eta_phi->SetTitle("E_{cor}/E_{true}"); if(EEorEB=="EB") { h_CC_eta_phi->GetXaxis()->SetTitle("i#eta"); h_CC_eta_phi->GetYaxis()->SetTitle("i#phi"); h_CC_eta_phi->GetXaxis()->SetRangeUser(-85,85); h_CC_eta_phi->GetYaxis()->SetRangeUser(0,360); } else { h_CC_eta_phi->GetXaxis()->SetTitle("iX"); h_CC_eta_phi->GetYaxis()->SetTitle("iY"); } h_CC_eta_phi->SetMinimum(0.5); h_CC_eta_phi->SetMaximum(1.5); h_CC_eta_phi->Draw("COLZ"); c_cor_eta->SaveAs("cor_vs_eta_phi.pdf"); c_cor_eta->SaveAs("cor_vs_eta_phi.png"); TH2F *h_CC_eta = hdata->createHistogram(*scetaiXvar, *ecorvar, "","cor_vs_eta"); if(EEorEB=="EB") { h_CC_eta->GetXaxis()->SetTitle("i#eta"); } else { h_CC_eta->GetXaxis()->SetTitle("iX"); } h_CC_eta->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_eta->Draw("COLZ"); c_cor_eta->SaveAs("cor_vs_eta.pdf"); c_cor_eta->SaveAs("cor_vs_eta.png"); TCanvas *c_cor_scEraw = new TCanvas; TH2F *h_CC_scEraw = hdata->createHistogram(*scEraw, *ecorvar, "","cor_vs_scEraw"); h_CC_scEraw->GetXaxis()->SetTitle("E_{raw}"); h_CC_scEraw->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_scEraw->Draw("COLZ"); c_cor_scEraw->SaveAs("cor_vs_scEraw.pdf"); c_cor_scEraw->SaveAs("cor_vs_scEraw.png"); TCanvas *c_raw_scEraw = new TCanvas; TH2F *h_RC_scEraw = hdata->createHistogram(*scEraw, *rawvar, "","raw_vs_scEraw"); h_RC_scEraw->GetXaxis()->SetTitle("E_{raw}"); h_RC_scEraw->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_scEraw->Draw("COLZ"); c_raw_scEraw->SaveAs("raw_vs_scEraw.pdf"); c_raw_scEraw->SaveAs("raw_vs_scEraw.png"); TCanvas *c_cor_phi = new TCanvas; TH2F *h_CC_phi = hdata->createHistogram(*scphiiYvar, *ecorvar, "","cor_vs_phi"); if(EEorEB=="EB") { h_CC_phi->GetXaxis()->SetTitle("i#phi"); } else { h_CC_phi->GetXaxis()->SetTitle("iY"); } h_CC_phi->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_phi->Draw("COLZ"); c_cor_phi->SaveAs("cor_vs_phi.pdf"); c_cor_phi->SaveAs("cor_vs_phi.png"); TCanvas *c_raw_eta = new TCanvas; TH3F *h3_RC_eta_phi = (TH3F*) hdata->createHistogram("var_5,var_4,raw",(EEorEB=="EB") ? 170 : 100, (EEorEB=="EB") ? 360 : 100,25); TProfile2D *h_RC_eta_phi = h3_RC_eta_phi->Project3DProfile(); h_RC_eta_phi->SetTitle("E_{raw}/E_{true}"); if(EEorEB=="EB") { h_RC_eta_phi->GetXaxis()->SetTitle("i#eta"); h_RC_eta_phi->GetYaxis()->SetTitle("i#phi"); h_RC_eta_phi->GetXaxis()->SetRangeUser(-85,85); h_RC_eta_phi->GetYaxis()->SetRangeUser(0,360); } else { h_RC_eta_phi->GetXaxis()->SetTitle("iX"); h_RC_eta_phi->GetYaxis()->SetTitle("iY"); } h_RC_eta_phi->SetMinimum(0.5); h_RC_eta_phi->SetMaximum(1.5); h_RC_eta_phi->Draw("COLZ"); c_raw_eta->SaveAs("raw_vs_eta_phi.pdf"); c_raw_eta->SaveAs("raw_vs_eta_phi.png"); TH2F *h_RC_eta = hdata->createHistogram(*scetaiXvar, *rawvar, "","raw_vs_eta"); if(EEorEB=="EB") { h_RC_eta->GetXaxis()->SetTitle("i#eta"); } else { h_RC_eta->GetXaxis()->SetTitle("iX"); } h_RC_eta->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_eta->Draw("COLZ"); c_raw_eta->SaveAs("raw_vs_eta.pdf"); c_raw_eta->SaveAs("raw_vs_eta.png"); TCanvas *c_raw_phi = new TCanvas; TH2F *h_RC_phi = hdata->createHistogram(*scphiiYvar, *rawvar, "","raw_vs_phi"); if(EEorEB=="EB") { h_RC_phi->GetXaxis()->SetTitle("i#phi"); } else { h_RC_phi->GetXaxis()->SetTitle("iY"); } h_RC_phi->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_phi->Draw("COLZ"); c_raw_phi->SaveAs("raw_vs_phi.pdf"); c_raw_phi->SaveAs("raw_vs_phi.png"); //on2,5,20, etc if(EEorEB == "EB") { TCanvas *myC_iCrystal_mod = new TCanvas; RooRealVar *SM_distvar = ws->var("var_6"); SM_distvar->setRange(0,10); SM_distvar->setBins(10); TH2F *h_CC_SM_dist = hdata->createHistogram(*SM_distvar, *ecorvar, "","cor_vs_SM_dist"); h_CC_SM_dist->GetXaxis()->SetTitle("SM_dist"); h_CC_SM_dist->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_SM_dist->Draw("COLZ"); myC_iCrystal_mod->SaveAs("cor_vs_SM_dist.pdf"); myC_iCrystal_mod->SaveAs("cor_vs_SM_dist.png"); TH2F *h_RC_SM_dist = hdata->createHistogram(*SM_distvar, *rawvar, "","raw_vs_SM_dist"); h_RC_SM_dist->GetXaxis()->SetTitle("distance to SM gap"); h_RC_SM_dist->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_SM_dist->Draw("COLZ"); myC_iCrystal_mod->SaveAs("raw_vs_SM_dist.pdf"); myC_iCrystal_mod->SaveAs("raw_vs_SM_dist.png"); RooRealVar *M_distvar = ws->var("var_7"); M_distvar->setRange(0,13); M_distvar->setBins(10); TH2F *h_CC_M_dist = hdata->createHistogram(*M_distvar, *ecorvar, "","cor_vs_M_dist"); h_CC_M_dist->GetXaxis()->SetTitle("M_dist"); h_CC_M_dist->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_M_dist->Draw("COLZ"); myC_iCrystal_mod->SaveAs("cor_vs_M_dist.pdf"); myC_iCrystal_mod->SaveAs("cor_vs_M_dist.png"); TH2F *h_RC_M_dist = hdata->createHistogram(*M_distvar, *rawvar, "","raw_vs_M_dist"); h_RC_M_dist->GetXaxis()->SetTitle("distance to module gap"); h_RC_M_dist->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_M_dist->Draw("COLZ"); myC_iCrystal_mod->SaveAs("raw_vs_M_dist.pdf"); myC_iCrystal_mod->SaveAs("raw_vs_M_dist.png"); /* RooRealVar *DeltaRG1G2var = ws->var("var_8"); DeltaRG1G2var->setRange(0,0.2); DeltaRG1G2var->setBins(100); TH2F *h_CC_DeltaRG1G2 = hdata->createHistogram(*DeltaRG1G2var, *ecorvar, "","cor_vs_DeltaRG1G2"); h_CC_DeltaRG1G2->GetXaxis()->SetTitle("DeltaRG1G2"); h_CC_DeltaRG1G2->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_DeltaRG1G2->Draw("COLZ"); myC_iCrystal_mod->SaveAs("cor_vs_DeltaRG1G2.pdf"); myC_iCrystal_mod->SaveAs("cor_vs_DeltaRG1G2.png"); TH2F *h_RC_DeltaRG1G2 = hdata->createHistogram(*DeltaRG1G2var, *rawvar, "","raw_vs_DeltaRG1G2"); h_RC_DeltaRG1G2->GetXaxis()->SetTitle("distance to module gap"); h_RC_DeltaRG1G2->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_DeltaRG1G2->Draw("COLZ"); myC_iCrystal_mod->SaveAs("raw_vs_DeltaRG1G2.pdf"); myC_iCrystal_mod->SaveAs("raw_vs_DeltaRG1G2.png"); */ } // other variables TCanvas *myC_variables = new TCanvas; RooRealVar *Nxtalvar = ws->var("var_1"); Nxtalvar->setRange(0,10); Nxtalvar->setBins(10); TH2F *h_CC_Nxtal = hdata->createHistogram(*Nxtalvar, *ecorvar, "","cor_vs_Nxtal"); h_CC_Nxtal->GetXaxis()->SetTitle("Nxtal"); h_CC_Nxtal->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_Nxtal->Draw("COLZ"); myC_variables->SaveAs("cor_vs_Nxtal.pdf"); myC_variables->SaveAs("cor_vs_Nxtal.png"); TH2F *h_RC_Nxtal = hdata->createHistogram(*Nxtalvar, *rawvar, "","raw_vs_Nxtal"); h_RC_Nxtal->GetXaxis()->SetTitle("Nxtal"); h_RC_Nxtal->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_Nxtal->Draw("COLZ"); myC_variables->SaveAs("raw_vs_Nxtal.pdf"); myC_variables->SaveAs("raw_vs_Nxtal.png"); RooRealVar *S4S9var = ws->var("var_2"); int Nbins_S4S9 = 100; double Low_S4S9 = 0.6; double High_S4S9 = 1.0; S4S9var->setRange(Low_S4S9,High_S4S9); S4S9var->setBins(Nbins_S4S9); TH2F *h_CC_S4S9 = hdata->createHistogram(*S4S9var, *ecorvar, "","cor_vs_S4S9"); h_CC_S4S9->GetXaxis()->SetTitle("S4S9"); h_CC_S4S9->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_S4S9->Draw("COLZ"); myC_variables->SaveAs("cor_vs_S4S9.pdf"); myC_variables->SaveAs("cor_vs_S4S9.png"); TH2F *h_RC_S4S9 = hdata->createHistogram(*S4S9var, *rawvar, "","raw_vs_S4S9"); h_RC_S4S9->GetXaxis()->SetTitle("S4S9"); h_RC_S4S9->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_S4S9->Draw("COLZ"); myC_variables->SaveAs("raw_vs_S4S9.pdf"); myC_variables->SaveAs("raw_vs_S4S9.png"); RooRealVar *S2S9var = ws->var("var_3"); int Nbins_S2S9 = 100; double Low_S2S9 = 0.5; double High_S2S9 = 1.0; S2S9var->setRange(Low_S2S9,High_S2S9); S2S9var->setBins(Nbins_S2S9); TH2F *h_CC_S2S9 = hdata->createHistogram(*S2S9var, *ecorvar, "","cor_vs_S2S9"); h_CC_S2S9->GetXaxis()->SetTitle("S2S9"); h_CC_S2S9->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_S2S9->Draw("COLZ"); myC_variables->SaveAs("cor_vs_S2S9.pdf"); myC_variables->SaveAs("cor_vs_S2S9.png"); TH2F *h_RC_S2S9 = hdata->createHistogram(*S2S9var, *rawvar, "","raw_vs_S2S9"); h_RC_S2S9->GetXaxis()->SetTitle("S2S9"); h_RC_S2S9->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_S2S9->Draw("COLZ"); myC_variables->SaveAs("raw_vs_S2S9.pdf"); myC_variables->SaveAs("raw_vs_S2S9.png"); TH2F *h_S2S9_eta = hdata->createHistogram(*scetaiXvar, *S2S9var, "","S2S9_vs_eta"); h_S2S9_eta->GetYaxis()->SetTitle("S2S9"); if(EEorEB=="EB") { h_CC_eta->GetYaxis()->SetTitle("i#eta"); } else { h_CC_eta->GetYaxis()->SetTitle("iX"); } h_S2S9_eta->Draw("COLZ"); myC_variables->SaveAs("S2S9_vs_eta.pdf"); myC_variables->SaveAs("S2S9_vs_eta.png"); TH2F *h_S4S9_eta = hdata->createHistogram(*scetaiXvar, *S4S9var, "","S4S9_vs_eta"); h_S4S9_eta->GetYaxis()->SetTitle("S4S9"); if(EEorEB=="EB") { h_CC_eta->GetYaxis()->SetTitle("i#eta"); } else { h_CC_eta->GetYaxis()->SetTitle("iX"); } h_S4S9_eta->Draw("COLZ"); myC_variables->SaveAs("S4S9_vs_eta.pdf"); myC_variables->SaveAs("S4S9_vs_eta.png"); TH2F *h_S2S9_phi = hdata->createHistogram(*scphiiYvar, *S2S9var, "","S2S9_vs_phi"); h_S2S9_phi->GetYaxis()->SetTitle("S2S9"); if(EEorEB=="EB") { h_CC_phi->GetYaxis()->SetTitle("i#phi"); } else { h_CC_phi->GetYaxis()->SetTitle("iY"); } h_S2S9_phi->Draw("COLZ"); myC_variables->SaveAs("S2S9_vs_phi.pdf"); myC_variables->SaveAs("S2S9_vs_phi.png"); TH2F *h_S4S9_phi = hdata->createHistogram(*scphiiYvar, *S4S9var, "","S4S9_vs_phi"); h_S4S9_phi->GetYaxis()->SetTitle("S4S9"); if(EEorEB=="EB") { h_CC_phi->GetYaxis()->SetTitle("i#phi"); } else { h_CC_phi->GetYaxis()->SetTitle("iY"); } h_S4S9_phi->Draw("COLZ"); myC_variables->SaveAs("S4S9_vs_phi.pdf"); myC_variables->SaveAs("S4S9_vs_phi.png"); if(EEorEB=="EE") { } TProfile *p_CC_eta = h_CC_eta->ProfileX("p_CC_eta");//,1,-1,"s"); p_CC_eta->GetYaxis()->SetRangeUser(0.8,1.05); if(EEorEB == "EB") { // p_CC_eta->GetYaxis()->SetRangeUser(0.85,1.0); // p_CC_eta->GetXaxis()->SetRangeUser(-1.5,1.5); } p_CC_eta->GetYaxis()->SetTitle("E_{cor}/E_{true}"); p_CC_eta->SetTitle(""); p_CC_eta->Draw(); myC_variables->SaveAs("profile_cor_vs_eta.pdf"); myC_variables->SaveAs("profile_cor_vs_eta.png"); gStyle->SetOptStat(111); gStyle->SetOptFit(1); TH1F *h1_fit_CC_eta = new TH1F("h1_fit_CC_eta","h1_fit_CC_eta",(EEorEB=="EB") ? 180 : 50,(EEorEB=="EB") ? -90 : 0, (EEorEB=="EB") ? 90 : 50); for(int ix = 1;ix <= h_CC_eta->GetNbinsX(); ix++) { stringstream os_iEta; os_iEta << ((EEorEB=="EB") ? (-90 + ix -1) : (0 + ix -1)); string ss_iEta = os_iEta.str(); TH1D * h_temp = h_CC_eta->ProjectionY("h_temp",ix,ix); h_temp->Rebin(4); TF1 *f_temp = new TF1("f_temp","gaus(0)",0.95,1.07); h_temp->Fit("f_temp","R"); h1_fit_CC_eta->SetBinContent(ix, f_temp->GetParameter(1)); h1_fit_CC_eta->SetBinError(ix, f_temp->GetParError(1)); h_temp->GetXaxis()->SetTitle("E_{cor}/E_{true}"); h_temp->SetTitle(""); h_temp->Draw(); myC_variables->SaveAs(("fits/CC_iEta_"+ss_iEta+".pdf").c_str()); myC_variables->SaveAs(("fits/CC_iEta_"+ss_iEta+".png").c_str()); myC_variables->SaveAs(("fits/CC_iEta_"+ss_iEta+".C").c_str()); } gStyle->SetOptStat(0); gStyle->SetOptFit(0); h1_fit_CC_eta->GetYaxis()->SetRangeUser(0.95,1.05); h1_fit_CC_eta->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h1_fit_CC_eta->GetXaxis()->SetTitle((EEorEB=="EB") ? "i#eta" : "iX"); h1_fit_CC_eta->SetTitle(""); h1_fit_CC_eta->Draw(); myC_variables->SaveAs("profile_fit_cor_vs_eta.pdf"); myC_variables->SaveAs("profile_fit_cor_vs_eta.png"); myC_variables->SaveAs("profile_fit_cor_vs_eta.C"); TProfile *p_RC_eta = h_RC_eta->ProfileX("p_RC_eta");//,1,-1,"s"); p_RC_eta->GetYaxis()->SetRangeUser(0.8,1.05); if(EEorEB=="EB") { // p_RC_eta->GetYaxis()->SetRangeUser(0.80,0.95); // p_RC_eta->GetXaxis()->SetRangeUser(-1.5,1.5); } p_RC_eta->GetYaxis()->SetTitle("E_{raw}/E_{true}"); p_RC_eta->SetTitle(""); p_RC_eta->Draw(); myC_variables->SaveAs("profile_raw_vs_eta.pdf"); myC_variables->SaveAs("profile_raw_vs_eta.png"); gStyle->SetOptStat(111); gStyle->SetOptFit(1); TH1F *h1_fit_RC_eta = new TH1F("h1_fit_RC_eta","h1_fit_RC_eta",(EEorEB=="EB") ? 180 : 50,(EEorEB=="EB") ? -90 : 0, (EEorEB=="EB") ? 90 : 50); for(int ix = 1;ix <= h_RC_eta->GetNbinsX(); ix++) { stringstream os_iEta; os_iEta << ((EEorEB=="EB") ? (-90 + ix -1) : (0 + ix -1)); string ss_iEta = os_iEta.str(); TH1D * h_temp = h_RC_eta->ProjectionY("h_temp",ix,ix); h_temp->Rebin(4); TF1 *f_temp = new TF1("f_temp","gaus(0)",0.87,1.05); h_temp->Fit("f_temp","R"); h1_fit_RC_eta->SetBinContent(ix, f_temp->GetParameter(1)); h1_fit_RC_eta->SetBinError(ix, f_temp->GetParError(1)); h_temp->GetXaxis()->SetTitle("E_{raw}/E_{true}"); h_temp->SetTitle(""); h_temp->Draw(); myC_variables->SaveAs(("fits/RC_iEta_"+ss_iEta+".pdf").c_str()); myC_variables->SaveAs(("fits/RC_iEta_"+ss_iEta+".png").c_str()); myC_variables->SaveAs(("fits/RC_iEta_"+ss_iEta+".C").c_str()); } gStyle->SetOptStat(0); gStyle->SetOptFit(0); h1_fit_RC_eta->GetYaxis()->SetRangeUser(0.9,1.0); h1_fit_RC_eta->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h1_fit_RC_eta->GetXaxis()->SetTitle((EEorEB=="EB") ? "i#eta" : "iX"); h1_fit_RC_eta->SetTitle(""); h1_fit_RC_eta->Draw(); myC_variables->SaveAs("profile_fit_raw_vs_eta.pdf"); myC_variables->SaveAs("profile_fit_raw_vs_eta.png"); myC_variables->SaveAs("profile_fit_raw_vs_eta.C"); int Nbins_iEta = EEorEB=="EB" ? 180 : 50; int nLow_iEta = EEorEB=="EB" ? -90 : 0; int nHigh_iEta = EEorEB=="EB" ? 90 : 50; TH1F *h1_RC_eta = new TH1F("h1_RC_eta","h1_RC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); for(int i=1;i<=Nbins_iEta;i++) { h1_RC_eta->SetBinContent(i,p_RC_eta->GetBinError(i)); } h1_RC_eta->GetXaxis()->SetTitle("i#eta"); h1_RC_eta->GetYaxis()->SetTitle("#sigma_{E_{raw}/E_{true}}"); h1_RC_eta->SetTitle(""); h1_RC_eta->Draw(); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_eta.pdf"); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_eta.png"); TH1F *h1_CC_eta = new TH1F("h1_CC_eta","h1_CC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); for(int i=1;i<=Nbins_iEta;i++) { h1_CC_eta->SetBinContent(i,p_CC_eta->GetBinError(i)); } h1_CC_eta->GetXaxis()->SetTitle("i#eta"); h1_CC_eta->GetYaxis()->SetTitle("#sigma_{E_{cor}/E_{true}}"); h1_CC_eta->SetTitle(""); h1_CC_eta->Draw(); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_eta.pdf"); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_eta.png"); TProfile *p_CC_phi = h_CC_phi->ProfileX("p_CC_phi");//,1,-1,"s"); p_CC_phi->GetYaxis()->SetRangeUser(0.9,1.0); if(EEorEB == "EB") { // p_CC_phi->GetYaxis()->SetRangeUser(0.94,1.00); } p_CC_phi->GetYaxis()->SetTitle("E_{cor}/E_{true}"); p_CC_phi->SetTitle(""); p_CC_phi->Draw(); myC_variables->SaveAs("profile_cor_vs_phi.pdf"); myC_variables->SaveAs("profile_cor_vs_phi.png"); gStyle->SetOptStat(111); gStyle->SetOptFit(1); TH1F *h1_fit_CC_phi = new TH1F("h1_fit_CC_phi","h1_fit_CC_phi",(EEorEB=="EB") ? 360 : 50,(EEorEB=="EB") ? 0 : 0, (EEorEB=="EB") ? 360 : 50); for(int ix = 1;ix <= h_CC_phi->GetNbinsX(); ix++) { stringstream os_iPhi; os_iPhi << ((EEorEB=="EB") ? (0 + ix -1) : (0 + ix -1)); string ss_iPhi = os_iPhi.str(); TH1D * h_temp = h_CC_phi->ProjectionY("h_temp",ix,ix); h_temp->Rebin(4); TF1 *f_temp = new TF1("f_temp","gaus(0)",0.95,1.07); h_temp->Fit("f_temp","R"); h1_fit_CC_phi->SetBinContent(ix, f_temp->GetParameter(1)); h1_fit_CC_phi->SetBinError(ix, f_temp->GetParError(1)); h_temp->GetXaxis()->SetTitle("E_{cor}/E_{true}"); h_temp->SetTitle(""); h_temp->Draw(); myC_variables->SaveAs(("fits/CC_iPhi_"+ss_iPhi+".pdf").c_str()); myC_variables->SaveAs(("fits/CC_iPhi_"+ss_iPhi+".png").c_str()); myC_variables->SaveAs(("fits/CC_iPhi_"+ss_iPhi+".C").c_str()); } gStyle->SetOptStat(0); gStyle->SetOptFit(0); h1_fit_CC_phi->GetYaxis()->SetRangeUser(0.95,1.05); h1_fit_CC_phi->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h1_fit_CC_phi->GetXaxis()->SetTitle((EEorEB=="EB") ? "i#phi" : "iX"); h1_fit_CC_phi->SetTitle(""); h1_fit_CC_phi->Draw(); myC_variables->SaveAs("profile_fit_cor_vs_phi.pdf"); myC_variables->SaveAs("profile_fit_cor_vs_phi.png"); myC_variables->SaveAs("profile_fit_cor_vs_phi.C"); TProfile *p_RC_phi = h_RC_phi->ProfileX("p_RC_phi");//,1,-1,"s"); p_RC_phi->GetYaxis()->SetRangeUser(0.8,0.9); if(EEorEB=="EB") { // p_RC_phi->GetYaxis()->SetRangeUser(0.89,0.95); } p_RC_phi->GetYaxis()->SetTitle("E_{raw}/E_{true}"); p_RC_phi->SetTitle(""); p_RC_phi->Draw(); myC_variables->SaveAs("profile_raw_vs_phi.pdf"); myC_variables->SaveAs("profile_raw_vs_phi.png"); gStyle->SetOptStat(111); gStyle->SetOptFit(1); TH1F *h1_fit_RC_phi = new TH1F("h1_fit_RC_phi","h1_fit_RC_phi",(EEorEB=="EB") ? 360 : 50,(EEorEB=="EB") ? 0 : 0, (EEorEB=="EB") ? 360 : 50); for(int ix = 1;ix <= h_RC_phi->GetNbinsX(); ix++) { stringstream os_iPhi; os_iPhi << ((EEorEB=="EB") ? (0 + ix -1) : (0 + ix -1)); string ss_iPhi = os_iPhi.str(); TH1D * h_temp = h_RC_phi->ProjectionY("h_temp",ix,ix); h_temp->Rebin(4); TF1 *f_temp = new TF1("f_temp","gaus(0)",0.87,1.05); h_temp->Fit("f_temp","R"); h1_fit_RC_phi->SetBinContent(ix, f_temp->GetParameter(1)); h1_fit_RC_phi->SetBinError(ix, f_temp->GetParError(1)); h_temp->GetXaxis()->SetTitle("E_{raw}/E_{true}"); h_temp->SetTitle(""); h_temp->Draw(); myC_variables->SaveAs(("fits/RC_iPhi_"+ss_iPhi+".pdf").c_str()); myC_variables->SaveAs(("fits/RC_iPhi_"+ss_iPhi+".png").c_str()); myC_variables->SaveAs(("fits/RC_iPhi_"+ss_iPhi+".C").c_str()); } gStyle->SetOptStat(0); gStyle->SetOptFit(0); h1_fit_RC_phi->GetYaxis()->SetRangeUser(0.9,1.0); h1_fit_RC_phi->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h1_fit_RC_phi->GetXaxis()->SetTitle((EEorEB=="EB") ? "i#phi" : "iX"); h1_fit_RC_phi->SetTitle(""); h1_fit_RC_phi->Draw(); myC_variables->SaveAs("profile_fit_raw_vs_phi.pdf"); myC_variables->SaveAs("profile_fit_raw_vs_phi.png"); myC_variables->SaveAs("profile_fit_raw_vs_phi.C"); int Nbins_iPhi = EEorEB=="EB" ? 360 : 50; int nLow_iPhi = EEorEB=="EB" ? 0 : 0; int nHigh_iPhi = EEorEB=="EB" ? 360 : 50; TH1F *h1_RC_phi = new TH1F("h1_RC_phi","h1_RC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); for(int i=1;i<=Nbins_iPhi;i++) { h1_RC_phi->SetBinContent(i,p_RC_phi->GetBinError(i)); } h1_RC_phi->GetXaxis()->SetTitle("i#phi"); h1_RC_phi->GetYaxis()->SetTitle("#sigma_{E_{raw}/E_{true}}"); h1_RC_phi->SetTitle(""); h1_RC_phi->Draw(); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_phi.pdf"); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_phi.png"); TH1F *h1_CC_phi = new TH1F("h1_CC_phi","h1_CC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); for(int i=1;i<=Nbins_iPhi;i++) { h1_CC_phi->SetBinContent(i,p_CC_phi->GetBinError(i)); } h1_CC_phi->GetXaxis()->SetTitle("i#phi"); h1_CC_phi->GetYaxis()->SetTitle("#sigma_{E_{cor}/E_{true}}"); h1_CC_phi->SetTitle(""); h1_CC_phi->Draw(); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_phi.pdf"); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_phi.png"); // FWHM over sigma_eff vs. eta/phi TH1F *h1_FoverS_RC_phi = new TH1F("h1_FoverS_RC_phi","h1_FoverS_RC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); TH1F *h1_FoverS_CC_phi = new TH1F("h1_FoverS_CC_phi","h1_FoverS_CC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); TH1F *h1_FoverS_RC_eta = new TH1F("h1_FoverS_RC_eta","h1_FoverS_RC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); TH1F *h1_FoverS_CC_eta = new TH1F("h1_FoverS_CC_eta","h1_FoverS_CC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); TH1F *h1_FoverS_CC_S2S9 = new TH1F("h1_FoverS_CC_S2S9","h1_FoverS_CC_S2S9",Nbins_S2S9,Low_S2S9,High_S2S9); TH1F *h1_FoverS_RC_S2S9 = new TH1F("h1_FoverS_RC_S2S9","h1_FoverS_RC_S2S9",Nbins_S2S9,Low_S2S9,High_S2S9); TH1F *h1_FoverS_CC_S4S9 = new TH1F("h1_FoverS_CC_S4S9","h1_FoverS_CC_S4S9",Nbins_S4S9,Low_S4S9,High_S4S9); TH1F *h1_FoverS_RC_S4S9 = new TH1F("h1_FoverS_RC_S4S9","h1_FoverS_RC_S4S9",Nbins_S4S9,Low_S4S9,High_S4S9); float FWHMoverSigmaEff = 0.0; TH1F *h_tmp_rawvar = new TH1F("tmp_rawvar","tmp_rawvar",800,0.5,1.5); TH1F *h_tmp_corvar = new TH1F("tmp_corvar","tmp_corvar",800,0.5,1.5); for(int i=1;i<=Nbins_iPhi;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_phi->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_phi->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_phi->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_phi->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_phi->GetXaxis()->SetTitle("i#phi"); h1_FoverS_CC_phi->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_phi->SetTitle(""); h1_FoverS_CC_phi->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_phi.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_phi.png"); h1_FoverS_RC_phi->GetXaxis()->SetTitle("i#phi"); h1_FoverS_RC_phi->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_phi->SetTitle(""); h1_FoverS_RC_phi->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_phi.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_phi.png"); for(int i=1;i<=Nbins_iEta;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_eta->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_eta->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_eta->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_eta->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_eta->GetXaxis()->SetTitle("i#eta"); h1_FoverS_CC_eta->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_eta->SetTitle(""); h1_FoverS_CC_eta->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_eta.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_eta.png"); h1_FoverS_RC_eta->GetXaxis()->SetTitle("i#eta"); h1_FoverS_RC_eta->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_eta->SetTitle(""); h1_FoverS_RC_eta->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_eta.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_eta.png"); for(int i=1;i<=Nbins_S2S9;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_S2S9->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_S2S9->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_S2S9->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_S2S9->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_S2S9->GetXaxis()->SetTitle("S2S9"); h1_FoverS_CC_S2S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_S2S9->GetYaxis()->SetRangeUser(0.0,1.0); h1_FoverS_CC_S2S9->SetTitle(""); h1_FoverS_CC_S2S9->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S2S9.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S2S9.png"); h1_FoverS_RC_S2S9->GetXaxis()->SetTitle("S2S9"); h1_FoverS_RC_S2S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_S2S9->GetYaxis()->SetRangeUser(0.0,2.0); h1_FoverS_RC_S2S9->SetTitle(""); h1_FoverS_RC_S2S9->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S2S9.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S2S9.png"); for(int i=1;i<=Nbins_S4S9;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_S4S9->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_S4S9->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_S4S9->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_S4S9->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_S4S9->GetXaxis()->SetTitle("S4S9"); h1_FoverS_CC_S4S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_S4S9->GetYaxis()->SetRangeUser(0.0,1.0); h1_FoverS_CC_S4S9->SetTitle(""); h1_FoverS_CC_S4S9->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S4S9.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S4S9.png"); h1_FoverS_RC_S4S9->GetXaxis()->SetTitle("S4S9"); h1_FoverS_RC_S4S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_S4S9->GetYaxis()->SetRangeUser(0.0,2.0); h1_FoverS_RC_S4S9->SetTitle(""); h1_FoverS_RC_S4S9->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S4S9.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S4S9.png"); printf("calc effsigma\n"); std::cout<<"_"<<EEorEB<<std::endl; printf("corrected curve effSigma= %5f, FWHM=%5f \n",effsigma_cor, fwhm_cor); printf("raw curve effSigma= %5f FWHM=%5f \n",effsigma_raw, fwhm_raw); /* new TCanvas; RooPlot *ploteold = testvar.frame(0.6,1.2,100); hdatasigtest->plotOn(ploteold); ploteold->Draw(); new TCanvas; RooPlot *plotecor = ecorvar->frame(0.6,1.2,100); hdatasig->plotOn(plotecor); plotecor->Draw(); */ }
void fitMass2(int iCharge,double iEtaMin,double iEtaMax,double iPhiMin,double iPhiMax,double &iRes,double &iShift,double &iResErr,double &iShiftErr) { Prep(); RooRealVar lXVar ("XVar","mass(GeV/c^{2})",60,60,120); lXVar.setBins(1000); RooRealVar lSPar ("SPar","SPar", 1.,0., 2.); RooFormulaVar lXShift("uparshift","@0*@1",RooArgList(lXVar,lSPar)); TFile *lMCFile = new TFile("../Efficiency/Data/ZTP8_v2.root"); TTree *lMCTree = (TTree*) lMCFile->FindObjectAny("WNtupleIdEffNT"); TH1F *lMass = new TH1F("M","M",100,60,120); int lCharge = 0; lMCTree->SetBranchAddress("charge",&lCharge); float lEta = 0; lMCTree->SetBranchAddress("eta" ,&lEta); float lPhi = 0; lMCTree->SetBranchAddress("phi" ,&lPhi); float lMt = 0; lMCTree->SetBranchAddress("mt" ,&lMt); float lPt = 0; lMCTree->SetBranchAddress("pt" ,&lPt); float lOPt = 0; lMCTree->SetBranchAddress("jetpt" ,&lOPt); float lOEta = 0; lMCTree->SetBranchAddress("jeteta",&lOEta); float lOPhi = 0; lMCTree->SetBranchAddress("jetphi",&lOPhi); float lTrkIso = 0; lMCTree->SetBranchAddress("trkiso",&lTrkIso); float lEcalIso = 0; lMCTree->SetBranchAddress("ecaliso",&lEcalIso); float lHcalIso = 0; lMCTree->SetBranchAddress("hcaliso",&lHcalIso); float lChi2 = 0; lMCTree->SetBranchAddress("chi2" ,&lChi2); unsigned int lNHit = 0; lMCTree->SetBranchAddress("nhit" ,&lNHit); Muon lMuon; lMCTree->SetBranchAddress("muon" ,&lMuon); double lVPt = 0; double lEt = 0; double lPx = 0; double lPy = 0; for(int i0 = 0; i0 < lMCTree->GetEntries(); i0++) { lMCTree->GetEntry(i0); if(lMt < 60) continue; if(lChi2 > 10) continue; if(lNHit < 10) continue; if(lMuon.NSeg < 2) continue; if(lMuon.NPixel == 0) continue; if(lMuon.NValid == 0) continue; if(lMuon.Type != 3) continue; if((lTrkIso+lEcalIso+lHcalIso)/lPt > 0.15) continue; //if(lCharge > 0 && iCharge < 0) continue; //if(lCharge < 0 && iCharge > 0) continue; //if(lEta < iPhiMin || lEta > iPhiMax) continue; //if(fabs(lEta) < 1.2) continue; //if(lEta < iEtaMin || lEta > iEtaMax) continue; //if(lPhi*lOPhi > 0 || lEta*lOEta > 0) continue; if(lPhi < iPhiMin || lPhi > iPhiMax) continue; lEt = lOPt + lPt; lPx = fabs(lPt)*cos(lPhi) + fabs(lOPt)*cos(lOPhi); lPy = fabs(lPt)*sin(lPhi) + fabs(lOPt)*sin(lOPhi); lVPt = sqrt(lPx*lPx + lPy*lPy); //if(lVPt < iPhiMin || lVPt > iPhiMax) continue; lMass->Fill(fabs(lMt)); //lMass->Fill(lPt); } RooDataHist *lMHist = new RooDataHist("M" ,"M" ,RooArgSet(lXVar),lMass); RooHistPdf *lMPdf = new RooHistPdf ("MH","MH",lXShift,lXVar,*lMHist,5); RooRealVar l1Sigma("sigma1","sigma1",0.2,0.,15.); //l1Sigma.setConstant(kTRUE); RooRealVar lR0Mean("xmean","xmean",0,-10,10); lR0Mean.setConstant(kTRUE); RooRealVar lExp ("exp" ,"exp" ,-0.006,-15,15.); //lExp.setConstant(kTRUE); RooRealVar lFrac ("frac","frac" ,0.9,0.,1); RooGaussian lGaus1("gaus1","gaus1",lXVar,lR0Mean,l1Sigma); RooExponential lExpF("Exp","Exp" ,lXVar,lExp); RooFFTConvPdf lConv("Conv","Conv",lXVar,*lMPdf,lGaus1); //lConv.setBufferStrategy(RooFFTConvPdf::Flat); RooAddPdf lGAdd("Add","Add" ,lConv,lExpF,lFrac); RooDataSet *lData = new RooDataSet("crap","crap",RooArgSet(lXVar)); TFile *lFile = new TFile("../Efficiency/Data/mTPNT8_v1.root"); TTree *lTree = (TTree*) lFile->FindObjectAny("WNtupleIdEffNT"); lTree->SetBranchAddress("charge",&lCharge); lTree->SetBranchAddress("eta" ,&lEta); lTree->SetBranchAddress("phi" ,&lPhi); lTree->SetBranchAddress("mt" ,&lMt); lTree->SetBranchAddress("pt" ,&lPt); lTree->SetBranchAddress("jetpt" ,&lOPt); lTree->SetBranchAddress("jeteta",&lOEta); lTree->SetBranchAddress("jetphi",&lOPhi); lTree->SetBranchAddress("trkiso",&lTrkIso); lTree->SetBranchAddress("ecaliso",&lEcalIso); lTree->SetBranchAddress("hcaliso",&lHcalIso); lTree->SetBranchAddress("chi2" ,&lChi2); lTree->SetBranchAddress("nhit" ,&lNHit); lTree->SetBranchAddress("muon" ,&lMuon); for(int i0 = 0; i0 < lTree->GetEntries();i0++) { lTree->GetEntry(i0); if(lMt < 60) continue; if(lCharge > 0 && iCharge < 0) continue; if(lCharge < 0 && iCharge > 0) continue; if(lChi2 > 10) continue; if(lNHit < 10) continue; if(lMuon.NSeg < 2) continue; if(lMuon.NPixel == 0) continue; if(lMuon.NValid == 0) continue; if(lMuon.Type != 3) continue; if((lTrkIso+lEcalIso+lHcalIso)/lPt > 0.15) continue; //if(fabs(lEta) < 1.2) continue; //if(lPhi*lOPhi > 0 || lEta*lOEta > 0) continue; //if(lEta < iPhiMin || lEta > iPhiMax) continue; if(lPhi < iPhiMin || lPhi > iPhiMax) continue; lEt = lOPt + lPt; lPx = fabs(lPt)*cos(lPhi) + fabs(lOPt)*cos(lOPhi); lPy = fabs(lPt)*sin(lPhi) + fabs(lOPt)*sin(lOPhi); lVPt = sqrt(lPx*lPx + lPy*lPy); //if(lVPt < iPhiMin || lVPt > iPhiMax) continue; lXVar.setVal(fabs(lMt)); if(lCharge > 0) lXVar.setVal(correct(lMt,lPhi,lOPhi,lEta,lOEta)); if(lCharge < 0) lXVar.setVal(correct(lMt,lOPhi,lPhi,lOEta,lEta)); lData->add(RooArgSet(lXVar)); } /* TFile *lQFile = new TFile(""); TTree *lQTree = (TTree*) lQFile->FindObjectAny("WNtupleIdEffNT"); lQTree->SetBranchAddress("mt" ,&lMt); lQTree->SetBranchAddress("charge",&lCharge); lQTree->SetBranchAddress("eta" ,&lEta); lQTree->SetBranchAddress("phi" ,&lPhi); for(int i0 = 0; i0 < lQTree->GetEntries();i0++) { lQTree->GetEntry(i0); if(lMt < 60) continue; if(lCharge > 0 && iCharge < 0) continue; if(lCharge < 0 && iCharge > 0) continue; if(lEta < iEtaMin || lEta > iEtaMax) continue; if(lPhi < iPhiMin || lPhi > iPhiMax) continue; lXVar.setVal(lMt); //lData->add(RooArgSet(lXVar)); } */ lConv.fitTo(*lData,Strategy(1)); if(l1Sigma.getError() > 1) lConv.fitTo(*lData,Strategy(2)); lXVar.setBins(60); RooPlot *lFrame1 = lXVar.frame(RooFit::Title("XXX")) ; lData->plotOn(lFrame1); lConv.plotOn(lFrame1); //lGAdd.plotOn(lFrame1,Components("Exp"),LineColor(kRed)); TCanvas *iC =new TCanvas("A","A",800,600); iC->cd(); lFrame1->Draw(); iC->SaveAs("Crap.png"); //cin.get(); iRes = l1Sigma.getVal(); iResErr = l1Sigma.getError(); iShift = lSPar.getVal(); iShiftErr = lSPar.getError(); }
int main(int argc, char* argv[]){ string bkgFileName; string sigFileName; string sigWSName; string bkgWSName; string outFileName; string datFileName; string outDir; int cat; int ntoys; int jobn; int seed; float mu_low; float mu_high; float mu_step; float expectSignal; int expectSignalMass; bool skipPlots=false; int verbosity; bool throwHybridToys=false; vector<float> switchMass; vector<string> switchFunc; po::options_description desc("Allowed options"); desc.add_options() ("help,h", "Show help") ("sigfilename,s", po::value<string>(&sigFileName), "Signal file name") ("bkgfilename,b", po::value<string>(&bkgFileName), "Background file name") ("sigwsname", po::value<string>(&sigWSName)->default_value("cms_hgg_workspace"), "Signal workspace name") ("bkgwsname", po::value<string>(&bkgWSName)->default_value("cms_hgg_workspace"), "Background workspace name") ("outfilename,o", po::value<string>(&outFileName)->default_value("BiasStudyOut.root"), "Output file name") ("datfile,d", po::value<string>(&datFileName)->default_value("config.dat"), "Name of datfile containing pdf info") ("outDir,D", po::value<string>(&outDir)->default_value("./"), "Name of out directory for plots") ("cat,c", po::value<int>(&cat), "Category") ("ntoys,t", po::value<int>(&ntoys)->default_value(0), "Number of toys to run") ("jobn,j", po::value<int>(&jobn)->default_value(0), "Job number") ("seed,r", po::value<int>(&seed)->default_value(0), "Set random seed") ("mulow,L", po::value<float>(&mu_low)->default_value(-3.), "Value of mu to start scan") ("muhigh,H", po::value<float>(&mu_high)->default_value(3.), "Value of mu to end scan") ("mustep,S", po::value<float>(&mu_step)->default_value(0.01), "Value of mu step size") ("expectSignal", po::value<float>(&expectSignal)->default_value(0.), "Inject signal into toy") ("expectSignalMass", po::value<int>(&expectSignalMass)->default_value(125), "Inject signal at this mass") ("skipPlots", "Skip full profile and toy plots") ("verbosity,v", po::value<int>(&verbosity)->default_value(0), "Verbosity level") ; 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("skipPlots")) skipPlots=true; if (expectSignalMass!=110 && expectSignalMass!=115 && expectSignalMass!=120 && expectSignalMass!=125 && expectSignalMass!=130 && expectSignalMass!=135 && expectSignalMass!=140 && expectSignalMass!=145 && expectSignalMass!=150){ cerr << "ERROR - expectSignalMass has to be integer in range (110,150,5)" << endl; exit(1); } vector<pair<int,pair<string,string> > > toysMap; vector<pair<int,pair<string,string> > > fabianMap; vector<pair<int,pair<string,string> > > paulMap; readDatFile(datFileName,cat,toysMap,fabianMap,paulMap); cout << "Toy vector.." << endl; printOptionsMap(toysMap); cout << "Fabian vector.." << endl; printOptionsMap(fabianMap); cout << "Paul vector.." << endl; printOptionsMap(paulMap); TStopwatch sw; sw.Start(); if (verbosity<1) { RooMsgService::instance().setGlobalKillBelow(RooFit::ERROR); RooMsgService::instance().setSilentMode(true); } TFile *bkgFile = TFile::Open(bkgFileName.c_str()); TFile *sigFile = TFile::Open(sigFileName.c_str()); //RooWorkspace *bkgWS = (RooWorkspace*)bkgFile->Get("cms_hgg_workspace"); RooWorkspace *bkgWS = (RooWorkspace*)bkgFile->Get(bkgWSName.c_str()); RooWorkspace *sigWS = (RooWorkspace*)sigFile->Get(sigWSName.c_str()); if (!bkgWS || !sigWS){ cerr << "ERROR - one of signal or background workspace is NULL" << endl; exit(1); } RooRealVar *mass = (RooRealVar*)bkgWS->var("CMS_hgg_mass"); RooRealVar *mu = new RooRealVar("mu","mu",0.,mu_low,mu_high); TFile *outFile = new TFile(outFileName.c_str(),"RECREATE"); TTree *muTree = new TTree("muTree","muTree"); int toyn; vector<string> truthModel; vector<double> muFab; vector<double> muPaul; vector<double> muChi2; vector<double> muAIC; vector<double> muFabErrLow; vector<double> muPaulErrLow; vector<double> muChi2ErrLow; vector<double> muAICErrLow; vector<double> muFabErrHigh; vector<double> muPaulErrHigh; vector<double> muChi2ErrHigh; vector<double> muAICErrHigh; muTree->Branch("jobn",&jobn); muTree->Branch("toyn",&toyn); muTree->Branch("truthModel",&truthModel); muTree->Branch("muFab",&muFab); muTree->Branch("muPaul",&muPaul); muTree->Branch("muChi2",&muChi2); muTree->Branch("muAIC",&muAIC); muTree->Branch("muFabErrLow",&muFabErrLow); muTree->Branch("muPaulErrLow",&muPaulErrLow); muTree->Branch("muChi2ErrLow",&muChi2ErrLow); muTree->Branch("muAICErrLow",&muAICErrLow); muTree->Branch("muFabErrHigh",&muFabErrHigh); muTree->Branch("muPaulErrHigh",&muPaulErrHigh); muTree->Branch("muChi2ErrHigh",&muChi2ErrHigh); muTree->Branch("muAICErrHigh",&muAICErrHigh); //TH1F *muDistFab = new TH1F("muDistFab","muDistFab",int(20*(mu_high-mu_low)),mu_low,mu_high); //TH1F *muDistPaul = new TH1F("muDistPaul","muDistPaul",int(20*(mu_high-mu_low)),mu_low,mu_high); //TH1F *muDistChi2 = new TH1F("muDistChi2","muDistChi2",int(20*(mu_high-mu_low)),mu_low,mu_high); //TH1F *muDistAIC = new TH1F("muDistAIC","muDistAIC",int(20*(mu_high-mu_low)),mu_low,mu_high); mass->setBins(320); RooDataSet *data = (RooDataSet*)bkgWS->data(Form("data_mass_cat%d",cat)); //RooDataSet *data = (RooDataSet*)bkgWS->data(Form("data_cat%d_7TeV",cat)); RooDataHist *dataBinned = new RooDataHist(Form("roohist_data_mass_cat%d",cat),Form("roohist_data_mass_cat%d",cat),RooArgSet(*mass),*data); RooDataSet *sigMC = (RooDataSet*)sigWS->data(Form("sig_ggh_mass_m%d_cat%d",expectSignalMass,cat)); RooDataSet *sigMC_vbf = (RooDataSet*)sigWS->data(Form("sig_wzh_mass_m%d_cat%d",expectSignalMass,cat)); RooDataSet *sigMC_wzh = (RooDataSet*)sigWS->data(Form("sig_vbf_mass_m%d_cat%d",expectSignalMass,cat)); RooDataSet *sigMC_tth = (RooDataSet*)sigWS->data(Form("sig_tth_mass_m%d_cat%d",expectSignalMass,cat)); sigMC->append(*sigMC_vbf); sigMC->append(*sigMC_wzh); sigMC->append(*sigMC_tth); //RooExtendPdf *ggh_pdf = (RooExtendPdf*)sigWS->pdf(Form("sigpdfsmrel_cat%d_7TeV_ggh",cat)); //RooExtendPdf *vbf_pdf = (RooExtendPdf*)sigWS->pdf(Form("sigpdfsmrel_cat%d_7TeV_vbf",cat)); //RooExtendPdf *wzh_pdf = (RooExtendPdf*)sigWS->pdf(Form("sigpdfsmrel_cat%d_7TeV_wzh",cat)); //RooExtendPdf *tth_pdf = (RooExtendPdf*)sigWS->pdf(Form("sigpdfsmrel_cat%d_7TeV_tth",cat)); //RooAbsPdf *sigPdf = new RooAddPdf(Form("sigpdfsmrel_cat%d_7TeV",cat),Form("sigpdfsmrel_cat%d_7TeV",cat),RooArgList(*ggh_pdf,*vbf_pdf,*wzh_pdf,*tth_pdf)); if (!dataBinned || !sigMC){ cerr << "ERROR -- one of data or signal is NULL" << endl; exit(1); } // set of truth models to throw toys from PdfModelBuilder toysModel; toysModel.setObsVar(mass); toysModel.setSignalModifier(mu); // add truth pdfs from config datfile these need to be cached // to throw a toy from the SB fit make sure that the cache happens at makeSBPdfs for (vector<pair<int,pair<string,string> > >::iterator it=toysMap.begin(); it!=toysMap.end(); it++){ if (it->first==-1) { // this is a hyrbid toy throwHybridToys=true; vector<string> temp; split(temp,it->second.first,boost::is_any_of(",")); split(switchFunc,it->second.second,boost::is_any_of(",")); for (unsigned int i=0; i<temp.size(); i++){ switchMass.push_back(atof(temp[i].c_str())); } continue; } if (it->first==-2) { // this is a keys pdf toy double rho = lexical_cast<double>(it->second.first); toysModel.setKeysPdfAttributes(data,rho); toysModel.addBkgPdf("KeysPdf",0,Form("truth_%s_cat%d",it->second.second.c_str(),cat),false); continue; } if (it->first==-3) { // this is read pdf from file toysModel.addBkgPdf(it->second.second,it->first,it->second.first,false); continue; } toysModel.addBkgPdf(it->second.second,it->first,Form("truth_%s_cat%d",it->second.first.c_str(),cat),false); } toysModel.setSignalPdfFromMC(sigMC); //toysModel.setSignalPdf(sigPdf); toysModel.makeSBPdfs(true); map<string,RooAbsPdf*> toyBkgPdfs = toysModel.getBkgPdfs(); map<string,RooAbsPdf*> toySBPdfs = toysModel.getSBPdfs(); toysModel.setSeed(seed); // fabians chosen model PdfModelBuilder fabianModel; fabianModel.setObsVar(mass); fabianModel.setSignalModifier(mu); // add pdfs from config datfile - should be no need to cache these for (vector<pair<int,pair<string,string> > >::iterator it=fabianMap.begin(); it!=fabianMap.end(); it++){ fabianModel.addBkgPdf(it->second.second,it->first,Form("fabian_%s_cat%d",it->second.first.c_str(),cat),false); } fabianModel.setSignalPdfFromMC(sigMC); //fabianModel.setSignalPdf(sigPdf); fabianModel.makeSBPdfs(false); map<string,RooAbsPdf*> fabianBkgPdfs = fabianModel.getBkgPdfs(); map<string,RooAbsPdf*> fabianSBPdfs = fabianModel.getSBPdfs(); // set of models to profile PdfModelBuilder paulModel; paulModel.setObsVar(mass); paulModel.setSignalModifier(mu); // add pdfs from config datfile - should be no need to cache these for (vector<pair<int,pair<string,string> > >::iterator it=paulMap.begin(); it!=paulMap.end(); it++){ paulModel.addBkgPdf(it->second.second,it->first,Form("paul_%s_cat%d",it->second.first.c_str(),cat),false); } paulModel.setSignalPdfFromMC(sigMC); //paulModel.setSignalPdf(sigPdf); paulModel.makeSBPdfs(false); map<string,RooAbsPdf*> paulBkgPdfs = paulModel.getBkgPdfs(); map<string,RooAbsPdf*> paulSBPdfs = paulModel.getSBPdfs(); // set up profile for Fabians models ProfileMultiplePdfs fabianProfiler; for (map<string,RooAbsPdf*>::iterator pdf=fabianSBPdfs.begin(); pdf!=fabianSBPdfs.end(); pdf++){ fabianProfiler.addPdf(pdf->second); } cout << "Fabian profiler pdfs:" << endl; fabianProfiler.printPdfs(); // set up profile for Pauls models ProfileMultiplePdfs paulProfiler; for (map<string,RooAbsPdf*>::iterator pdf=paulSBPdfs.begin(); pdf!=paulSBPdfs.end(); pdf++){ paulProfiler.addPdf(pdf->second); } cout << "Paul profiler pdfs:" << endl; paulProfiler.printPdfs(); if (!skipPlots) { system(Form("mkdir -p %s/plots/truthToData",outDir.c_str())); system(Form("mkdir -p %s/plots/envelopeNlls",outDir.c_str())); system(Form("mkdir -p %s/plots/toys",outDir.c_str())); } // throw toys - only need to fit data once as result will be cached cout << "------ FITTING TRUTH TO DATA ------" << endl; // sometimes useful to do best fit first to get reasonable starting value toysModel.setSignalModifierConstant(false); toysModel.fitToData(dataBinned,false,false,true); // ----- toysModel.setSignalModifierVal(expectSignal); toysModel.setSignalModifierConstant(true); toysModel.fitToData(dataBinned,false,true,true); if (!skipPlots) toysModel.plotPdfsToData(dataBinned,80,Form("%s/plots/truthToData/datafit_mu%3.1f",outDir.c_str(),expectSignal),false); toysModel.setSignalModifierConstant(false); toysModel.saveWorkspace(outFile); for (int toy=0; toy<ntoys; toy++){ cout << "---------------------------" << endl; cout << "--- RUNNING TOY " << toy << " / " << ntoys << " ----" << endl; cout << "---------------------------" << endl; // wipe stuff for tree truthModel.clear(); muFab.clear(); muPaul.clear(); muChi2.clear(); muAIC.clear(); muFabErrLow.clear(); muPaulErrLow.clear(); muChi2ErrLow.clear(); muAICErrLow.clear(); muFabErrHigh.clear(); muPaulErrHigh.clear(); muChi2ErrHigh.clear(); muAICErrHigh.clear(); // throw toy map<string,RooAbsData*> toys; if (throwHybridToys) { toysModel.throwHybridToy(Form("truth_job%d_toy%d",jobn,toy),dataBinned->sumEntries(),switchMass,switchFunc,false,true,true,true); toys = toysModel.getHybridToyData(); if (!skipPlots) toysModel.plotToysWithPdfs(Form("%s/plots/toys/job%d_toy%d",outDir.c_str(),jobn,toy),80,false); if (!skipPlots) toysModel.plotHybridToy(Form("%s/plots/toys/job%d_toy%d",outDir.c_str(),jobn,toy),80,switchMass,switchFunc,false); } else { toysModel.throwToy(Form("truth_job%d_toy%d",jobn,toy),dataBinned->sumEntries(),false,true,true,true); toys = toysModel.getToyData(); if (!skipPlots) toysModel.plotToysWithPdfs(Form("%s/plots/toys/job%d_toy%d",outDir.c_str(),jobn,toy),80,false); } for (map<string,RooAbsData*>::iterator it=toys.begin(); it!=toys.end(); it++){ // ----- USEFUL DEBUG ----------- // --- this can be a useful check that the truth model values are being cached properly --- //toysModel.fitToData(it->second,true,false,true); //toysModel.plotPdfsToData(it->second,80,Form("%s/plots/toys/job%d_toy%d",outDir.c_str(),jobn,toy),true,"NONE"); if (!skipPlots) fabianProfiler.plotNominalFits(it->second,mass,80,Form("%s/plots/toys/job%d_toy%d_fit_fab",outDir.c_str(),jobn,toy)); if (!skipPlots) paulProfiler.plotNominalFits(it->second,mass,80,Form("%s/plots/toys/job%d_toy%d_fit_paul",outDir.c_str(),jobn,toy)); //continue; // -------------------------------- cout << "Fitting toy for truth model " << distance(toys.begin(),it) << "/" << toys.size() << " (" << it->first << ") " << endl; // get Fabian envelope pair<double,map<string,TGraph*> > fabianMinNlls = fabianProfiler.profileLikelihood(it->second,mass,mu,mu_low,mu_high,mu_step); pair<double,map<string,TGraph*> > fabianEnvelope = fabianProfiler.computeEnvelope(fabianMinNlls,Form("fabEnvelope_job%d_%s_cat%d_toy%d",jobn,it->first.c_str(),cat,toy),0.); if (!skipPlots) fabianProfiler.plot(fabianEnvelope.second,Form("%s/plots/envelopeNlls/nlls_fab_%s_cat%d_toy%d",outDir.c_str(),it->first.c_str(),cat,toy)); // get Paul envelopes pair<double,map<string,TGraph*> > paulMinNlls = paulProfiler.profileLikelihood(it->second,mass,mu,mu_low,mu_high,mu_step); pair<double,map<string,TGraph*> > paulEnvelope = paulProfiler.computeEnvelope(paulMinNlls,Form("paulEnvelope_job%d_%s_cat%d_toy%d",jobn,it->first.c_str(),cat,toy),0.); if (!skipPlots) paulProfiler.plot(paulEnvelope.second,Form("%s/plots/envelopeNlls/nlls_paul_%s_cat%d_toy%d",outDir.c_str(),it->first.c_str(),cat,toy)); pair<double,map<string,TGraph*> > chi2Envelope = paulProfiler.computeEnvelope(paulMinNlls,Form("chi2Envelope_job%d_%s_cat%d_toy%d",jobn,it->first.c_str(),cat,toy),1.); if (!skipPlots) paulProfiler.plot(chi2Envelope.second,Form("%s/plots/envelopeNlls/nlls_chi2_%s_cat%d_toy%d",outDir.c_str(),it->first.c_str(),cat,toy)); pair<double,map<string,TGraph*> > aicEnvelope = paulProfiler.computeEnvelope(paulMinNlls,Form("aicEnvelope_job%d_%s_cat%d_toy%d",jobn,it->first.c_str(),cat,toy),2.); if (!skipPlots) paulProfiler.plot(aicEnvelope.second,Form("%s/plots/envelopeNlls/nlls_aic_%s_cat%d_toy%d",outDir.c_str(),it->first.c_str(),cat,toy)); pair<double,pair<double,double> > muFabInfo = ProfileMultiplePdfs::getMinAndErrorAsymm(fabianEnvelope.second["envelope"],1.); pair<double,pair<double,double> > muPaulInfo = ProfileMultiplePdfs::getMinAndErrorAsymm(paulEnvelope.second["envelope"],1.); pair<double,pair<double,double> > muChi2Info = ProfileMultiplePdfs::getMinAndErrorAsymm(chi2Envelope.second["envelope"],1.); pair<double,pair<double,double> > muAICInfo = ProfileMultiplePdfs::getMinAndErrorAsymm(aicEnvelope.second["envelope"],1.); truthModel.push_back(it->first); muFab.push_back(muFabInfo.first); muPaul.push_back(muPaulInfo.first); muChi2.push_back(muChi2Info.first); muAIC.push_back(muAICInfo.first); muFabErrLow.push_back(muFabInfo.second.first); muPaulErrLow.push_back(muPaulInfo.second.first); muChi2ErrLow.push_back(muChi2Info.second.first); muAICErrLow.push_back(muAICInfo.second.first); muFabErrHigh.push_back(muFabInfo.second.second); muPaulErrHigh.push_back(muPaulInfo.second.second); muChi2ErrHigh.push_back(muChi2Info.second.second); muAICErrHigh.push_back(muAICInfo.second.second); cout << "Fab mu = " << muFabInfo.first << " - " << muFabInfo.second.first << " + " << muFabInfo.second.second << endl; cout << "Paul mu = " << muPaulInfo.first << " - " << muPaulInfo.second.first << " + " << muPaulInfo.second.second << endl; cout << "Chi2 mu = " << muChi2Info.first << " - " << muChi2Info.second.first << " + " << muChi2Info.second.second << endl; cout << "AIC mu = " << muAICInfo.first << " - " << muAICInfo.second.first << " + " << muAICInfo.second.second << endl; outFile->cd(); fabianEnvelope.second["envelope"]->Write(); paulEnvelope.second["envelope"]->Write(); chi2Envelope.second["envelope"]->Write(); aicEnvelope.second["envelope"]->Write(); } toyn=toy; muTree->Fill(); } outFile->cd(); muTree->Write(); cout << "Done." << endl; cout << "Whole process took..." << endl; cout << "\t "; sw.Print(); outFile->Close(); return 0; }
void makeDatacard(double mh, double massLow, double massHigh, double merrHigh, int ch, std::string cat, std::map<std::string, std::string> file, bool useModZ, bool doMassErr) { RooMsgService::instance().setSilentMode(kTRUE); RooMsgService::instance().setGlobalKillBelow(RooFit::WARNING) ; if (doMassErr && cat != "BB" && cat != "XX" && cat != "YY") { std::cout << "When using event-by-event mass errors, set cat = BB or XX or YY" << std::endl; return; } /* Setting up the strings */ std::string chstr = getChannelName(ch); stringstream mh_ss; mh_ss << mh; std::cout << "Creating datacard for " << mh_ss.str() << " GeV mass point, channel " << chstr << " and category " << cat << " ... " << std::endl; std::stringstream card_name_ss; card_name_ss << "card_"; if (!doMassErr) card_name_ss << "1D_"; else card_name_ss << "2D_merr_"; card_name_ss << "m" << mh_ss.str() << "_"; card_name_ss << chstr << "_" << cat; std::string card_name = card_name_ss.str(); std::string workspace = card_name+"_workspace.root"; /* Higgs mass and dimuon mass variables */ const char* massvarstr = "CMS_hmumu_mass"; const char* merrvarstr = "CMS_hmumu_merr"; const char* scalevarstr = "CMS_hmumu_scale"; const char* resvarstr = "CMS_hmumu_res"; const char* mhvarstr = "MH"; RooRealVar rmh ("MH" , "MH" , mh); RooRealVar m2mu (massvarstr , "Dimuon mass", mh , massLow, massHigh, "GeV/c^{2}"); RooRealVar merr (merrvarstr , "Mass Error" , 0.0 , 0.0 , merrHigh, "" ); RooRealVar scale(scalevarstr, "Scale unc. ", 0.0 , 0.0 , 1.0 , "GeV/c^{2}"); RooRealVar res (resvarstr , "RFes. unc. ", 0.0 , 0.0 , 1.0); m2mu.setBins(200); merr.setBins(200); /* RooDataSet of the observed data */ RooDataSet* data_obs = getDataSet(file["dat"].c_str(), false, ch, cat, massLow, massHigh, merrHigh, "data_obs", massvarstr, merrvarstr, false); /* Extract shape parameters */ std::cout << "Extracting the signal fit parameters" << std::endl; std::map<std::string, double> sparams = doFit(file["ggH"], true, 6, cat, 125.0, int(massHigh-massLow)*2, massLow, 140.0, false, true, useModZ, false); std::cout << "Extracting the background fit parameters" << std::endl; std::map<std::string, double> bparams = doFit(file["dat"], false, ch, cat, 125.0, int(massHigh-massLow) , massLow, massHigh, false, false, useModZ, true ); std::string ecat = "XX"; if (cat == "BB") ecat = "BB"; if (cat == "YY") ecat = "YY"; std::map<std::string, double> esparams; std::map<std::string, double> ebparams; if (doMassErr) { if (cat == "BB") { std::cout << "Extracting the signal mass error fit parameters" << std::endl; esparams = doEbEFit(file["ggH"], true, ch, ecat, 140, 0.006, 0.013, massLow, massHigh, true, true, true); std::cout << "Extracting the background mass error fit parameters" << std::endl; ebparams = doEbEFit(file["DY"] , true, ch, ecat, 140, 0.006, 0.013, massLow, massHigh, true, true, false); } else { std::cout << "Extracting the signal mass error fit parameters" << std::endl; esparams = doEbEFit(file["ggH"], true, ch, ecat, 240, 0.005, 0.035, massLow, massHigh, true, true, true); std::cout << "Extracting the background mass error fit parameters" << std::endl; ebparams = doEbEFit(file["DY"] , true, ch, ecat, 240, 0.005, 0.035, massLow, massHigh, true, true, false); } } /* Compute yields */ double bkg_yield = computeYield(data_obs, massvarstr, false, true); bkg_yield *= bparams["bkgsf"]; std::cout << "Computing the expected background yield from the side-bands : " << bkg_yield << std::endl; RooDataSet* sig_gH_dset = getDataSet(file["ggH"], true, ch, cat, massLow, massHigh, merrHigh, "dset_gH", massvarstr, merrvarstr, false); RooDataSet* sig_qH_dset = getDataSet(file["qqH"], true, ch, cat, massLow, massHigh, merrHigh, "dset_qH", massvarstr, merrvarstr, false); RooDataSet* sig_PH_dset = getDataSet(file["WPH"], true, ch, cat, massLow, massHigh, merrHigh, "dset_PH", massvarstr, merrvarstr, false); RooDataSet* sig_MH_dset = getDataSet(file["WMH"], true, ch, cat, massLow, massHigh, merrHigh, "dset_MH", massvarstr, merrvarstr, false); RooDataSet* sig_ZH_dset = getDataSet(file["ZH" ], true, ch, cat, massLow, massHigh, merrHigh, "dset_ZH", massvarstr, merrvarstr, false); double sig_gH_yield = computeYield(sig_gH_dset, massvarstr, true, false); double sig_qH_yield = computeYield(sig_qH_dset, massvarstr, true, false); double sig_WH_yield = computeYield(sig_PH_dset, massvarstr, true, false); sig_WH_yield += computeYield(sig_MH_dset, massvarstr, true, false); double sig_ZH_yield = computeYield(sig_ZH_dset, massvarstr, true, false); double sig_tH_yield = 1e-5; delete sig_gH_dset; delete sig_qH_dset; delete sig_PH_dset; delete sig_MH_dset; delete sig_ZH_dset; std::cout << "Computing the ggH signal yield : " << sig_gH_yield << std::endl; std::cout << "Computing the qqH signal yield : " << sig_qH_yield << std::endl; std::cout << "Computing the WH signal yield : " << sig_WH_yield << std::endl; std::cout << "Computing the ZH signal yield : " << sig_ZH_yield << std::endl; std::cout << "Computing the ttH signal yield : " << sig_tH_yield << std::endl; std::string spdfstart = ""; std::string bpdfstart = ""; if (doMassErr) spdfstart = "sig_mass_merr_"; else spdfstart = "sig_mass_"; if (doMassErr) bpdfstart = "bkg_mass_merr_"; else bpdfstart = "bkg_mass_"; RooRealVar ggH_norm((spdfstart+"ggH_"+chstr+"_"+cat+"_pdf_norm").c_str(), "", sig_gH_yield); RooRealVar qqH_norm((spdfstart+"qqH_"+chstr+"_"+cat+"_pdf_norm").c_str(), "", sig_qH_yield); RooRealVar WH_norm ((spdfstart+"WH_" +chstr+"_"+cat+"_pdf_norm").c_str(), "", sig_WH_yield); RooRealVar ZH_norm ((spdfstart+"ZH_" +chstr+"_"+cat+"_pdf_norm").c_str(), "", sig_ZH_yield); RooRealVar ttH_norm((spdfstart+"ttH_"+chstr+"_"+cat+"_pdf_norm").c_str(), "", sig_tH_yield); RooRealVar bkg_norm((bpdfstart+"" +chstr+"_"+cat+"_pdf_norm").c_str(), "", bkg_yield ); ggH_norm.setConstant(kTRUE); WH_norm .setConstant(kTRUE); ZH_norm .setConstant(kTRUE); ggH_norm.setConstant(kTRUE); ttH_norm.setConstant(kTRUE); bkg_norm.setConstant(kTRUE); /* Define PDFs */ // Background RooRealVar ra_mass(("bkg_mass_"+chstr+cat+"_a" ).c_str(), "", bparams["a"], 0.0, 1.0 ); RooRealVar rb_mass(("bkg_mass_"+chstr+cat+"_b" ).c_str(), "", bparams["b"], -1.0, 10.0); RooRealVar rp_mass(("bkg_mass_"+chstr+cat+"_p" ).c_str(), "", bparams["p"], -2.0, 2.0 ); RooRealVar rq_mass(("bkg_mass_"+chstr+cat+"_q" ).c_str(), "", bparams["q"], -2.0, 2.0 ); RooRealVar rr_mass(("bkg_mass_"+chstr+cat+"_r" ).c_str(), "", bparams["r"], -2.0, 2.0 ); RooAbsPdf* bkg_mass_pdf = NULL; if (useModZ) { RooModZPdf* bkg_mass_mz_pdf = new RooModZPdf (("bkg_mass_"+chstr+"_"+cat+"_pdf" ).c_str(), "", m2mu, rp_mass, rq_mass, rr_mass); bkg_mass_pdf = bkg_mass_mz_pdf; } else { RooZPhotonPdf* bkg_mass_zg_pdf = new RooZPhotonPdf(("bkg_mass_"+chstr+"_"+cat+"_pdf" ).c_str(), "", m2mu, ra_mass, rb_mass); bkg_mass_pdf = bkg_mass_zg_pdf; } // Signal std::stringstream meanss; std::stringstream sigmass; meanss << "@0 - " << sparams["mean"] << " + " << "@0*@1"; if (!doMassErr) sigmass << sparams["sigma"] << " * " << "(1+@0)"; else sigmass << "(@0*@1)" << " * " << "(1+@2)"; RooArgList sigmalist; if (!doMassErr) sigmalist.add(res); else { sigmalist.add(merr); sigmalist.add(m2mu); sigmalist.add(res); } RooFormulaVar fmean_mass (("sig_mass_"+chstr+"_"+cat+"_fmean" ).c_str(), "", meanss .str().c_str(), RooArgList(rmh, scale)); RooFormulaVar fsigma_mass(("sig_mass_"+chstr+"_"+cat+"_fsigma").c_str(), "", sigmass.str().c_str(), sigmalist); RooRealVar raL_mass (("sig_mass_"+chstr+"_"+cat+"_aL" ).c_str(), "", sparams["aL"]); RooRealVar rnL_mass (("sig_mass_"+chstr+"_"+cat+"_nL" ).c_str(), "", sparams["nL"]); RooRealVar raR_mass (("sig_mass_"+chstr+"_"+cat+"_aR" ).c_str(), "", sparams["aR"]); RooRealVar rnR_mass (("sig_mass_"+chstr+"_"+cat+"_nR" ).c_str(), "", sparams["nR"]); RooDoubleCB sig_mass_gH_pdf(("sig_mass_ggH_"+chstr+"_"+cat+"_pdf" ).c_str(), "", m2mu, fmean_mass, fsigma_mass, raL_mass, rnL_mass, raR_mass, rnR_mass); RooDoubleCB sig_mass_qH_pdf(("sig_mass_qqH_"+chstr+"_"+cat+"_pdf" ).c_str(), "", m2mu, fmean_mass, fsigma_mass, raL_mass, rnL_mass, raR_mass, rnR_mass); RooDoubleCB sig_mass_WH_pdf(("sig_mass_WH_" +chstr+"_"+cat+"_pdf" ).c_str(), "", m2mu, fmean_mass, fsigma_mass, raL_mass, rnL_mass, raR_mass, rnR_mass); RooDoubleCB sig_mass_ZH_pdf(("sig_mass_ZH_" +chstr+"_"+cat+"_pdf" ).c_str(), "", m2mu, fmean_mass, fsigma_mass, raL_mass, rnL_mass, raR_mass, rnR_mass); RooDoubleCB sig_mass_tH_pdf(("sig_mass_ttH_"+chstr+"_"+cat+"_pdf" ).c_str(), "", m2mu, fmean_mass, fsigma_mass, raL_mass, rnL_mass, raR_mass, rnR_mass); // Event-by-event mass error RooRealVar rm1_merr_sig (("sig_merr_"+chstr+"_"+cat+"_m1" ).c_str(), "", esparams["m1"] ); RooRealVar rs1_merr_sig (("sig_merr_"+chstr+"_"+cat+"_s1" ).c_str(), "", esparams["s1"] ); RooRealVar raL1_merr_sig(("sig_merr_"+chstr+"_"+cat+"_aL1").c_str(), "", esparams["aL1"]); RooRealVar rnL1_merr_sig(("sig_merr_"+chstr+"_"+cat+"_nL1").c_str(), "", esparams["nL1"]); RooRealVar raR1_merr_sig(("sig_merr_"+chstr+"_"+cat+"_aR1").c_str(), "", esparams["aR1"]); RooRealVar rnR1_merr_sig(("sig_merr_"+chstr+"_"+cat+"_nR1").c_str(), "", esparams["nR1"]); RooRealVar rm2_merr_sig (("sig_merr_"+chstr+"_"+cat+"_m2" ).c_str(), "", esparams["m2"] ); RooRealVar rs2_merr_sig (("sig_merr_"+chstr+"_"+cat+"_s2" ).c_str(), "", esparams["s2"] ); RooRealVar raL2_merr_sig(("sig_merr_"+chstr+"_"+cat+"_aL2").c_str(), "", esparams["aL2"]); RooRealVar rnL2_merr_sig(("sig_merr_"+chstr+"_"+cat+"_nL2").c_str(), "", esparams["nL2"]); RooRealVar raR2_merr_sig(("sig_merr_"+chstr+"_"+cat+"_aR2").c_str(), "", esparams["aR2"]); RooRealVar rnR2_merr_sig(("sig_merr_"+chstr+"_"+cat+"_nR2").c_str(), "", esparams["nR2"]); RooRealVar rm3_merr_sig (("sig_merr_"+chstr+"_"+cat+"_m3" ).c_str(), "", esparams["m3"] ); RooRealVar rs3_merr_sig (("sig_merr_"+chstr+"_"+cat+"_s3" ).c_str(), "", esparams["s3"] ); RooRealVar rc0_merr_sig (("sig_merr_"+chstr+"_"+cat+"_c0" ).c_str(), "", esparams["c0"] ); RooRealVar rc1_merr_sig (("sig_merr_"+chstr+"_"+cat+"_c1" ).c_str(), "", esparams["c1"] ); RooRealVar rc2_merr_sig (("sig_merr_"+chstr+"_"+cat+"_c2" ).c_str(), "", esparams["c2"] ); RooRealVar rm1_merr_bkg (("bkg_merr_"+chstr+"_"+cat+"_m1" ).c_str(), "", ebparams["m1"] ); RooRealVar rs1_merr_bkg (("bkg_merr_"+chstr+"_"+cat+"_s1" ).c_str(), "", ebparams["s1"] ); RooRealVar raL1_merr_bkg(("bkg_merr_"+chstr+"_"+cat+"_aL1").c_str(), "", ebparams["aL1"]); RooRealVar rnL1_merr_bkg(("bkg_merr_"+chstr+"_"+cat+"_nL1").c_str(), "", ebparams["nL1"]); RooRealVar raR1_merr_bkg(("bkg_merr_"+chstr+"_"+cat+"_aR1").c_str(), "", ebparams["aR1"]); RooRealVar rnR1_merr_bkg(("bkg_merr_"+chstr+"_"+cat+"_nR1").c_str(), "", ebparams["nR1"]); RooRealVar rm2_merr_bkg (("bkg_merr_"+chstr+"_"+cat+"_m2" ).c_str(), "", ebparams["m2"] ); RooRealVar rs2_merr_bkg (("bkg_merr_"+chstr+"_"+cat+"_s2" ).c_str(), "", ebparams["s2"] ); RooRealVar raL2_merr_bkg(("bkg_merr_"+chstr+"_"+cat+"_aL2").c_str(), "", ebparams["aL2"]); RooRealVar rnL2_merr_bkg(("bkg_merr_"+chstr+"_"+cat+"_nL2").c_str(), "", ebparams["nL2"]); RooRealVar raR2_merr_bkg(("bkg_merr_"+chstr+"_"+cat+"_aR2").c_str(), "", ebparams["aR2"]); RooRealVar rnR2_merr_bkg(("bkg_merr_"+chstr+"_"+cat+"_nR2").c_str(), "", ebparams["nR2"]); RooRealVar rm3_merr_bkg (("bkg_merr_"+chstr+"_"+cat+"_m3" ).c_str(), "", ebparams["m3"] ); RooRealVar rs3_merr_bkg (("bkg_merr_"+chstr+"_"+cat+"_s3" ).c_str(), "", ebparams["s3"] ); RooRealVar rc0_merr_bkg (("bkg_merr_"+chstr+"_"+cat+"_c0" ).c_str(), "", ebparams["c0"] ); RooRealVar rc1_merr_bkg (("bkg_merr_"+chstr+"_"+cat+"_c1" ).c_str(), "", ebparams["c1"] ); RooRealVar rc2_merr_bkg (("bkg_merr_"+chstr+"_"+cat+"_c2" ).c_str(), "", ebparams["c2"] ); RooDoubleCB sig_merr_gH_pd1(("sig_merr_ggH_"+chstr+"_"+cat+"_pd1" ).c_str(), "", merr, rm1_merr_sig, rs1_merr_sig, raL1_merr_sig, rnL1_merr_sig, raR1_merr_sig, rnR1_merr_sig); RooDoubleCB sig_merr_qH_pd1(("sig_merr_qqH_"+chstr+"_"+cat+"_pd1" ).c_str(), "", merr, rm1_merr_sig, rs1_merr_sig, raL1_merr_sig, rnL1_merr_sig, raR1_merr_sig, rnR1_merr_sig); RooDoubleCB sig_merr_WH_pd1(("sig_merr_WH_" +chstr+"_"+cat+"_pd1" ).c_str(), "", merr, rm1_merr_sig, rs1_merr_sig, raL1_merr_sig, rnL1_merr_sig, raR1_merr_sig, rnR1_merr_sig); RooDoubleCB sig_merr_ZH_pd1(("sig_merr_ZH_" +chstr+"_"+cat+"_pd1" ).c_str(), "", merr, rm1_merr_sig, rs1_merr_sig, raL1_merr_sig, rnL1_merr_sig, raR1_merr_sig, rnR1_merr_sig); RooDoubleCB sig_merr_tH_pd1(("sig_merr_ttH_"+chstr+"_"+cat+"_pd1" ).c_str(), "", merr, rm1_merr_sig, rs1_merr_sig, raL1_merr_sig, rnL1_merr_sig, raR1_merr_sig, rnR1_merr_sig); RooDoubleCB sig_merr_gH_pd2(("sig_merr_ggH_"+chstr+"_"+cat+"_pd2" ).c_str(), "", merr, rm2_merr_sig, rs2_merr_sig, raL2_merr_sig, rnL2_merr_sig, raR2_merr_sig, rnR2_merr_sig); RooDoubleCB sig_merr_qH_pd2(("sig_merr_qqH_"+chstr+"_"+cat+"_pd2" ).c_str(), "", merr, rm2_merr_sig, rs2_merr_sig, raL2_merr_sig, rnL2_merr_sig, raR2_merr_sig, rnR2_merr_sig); RooDoubleCB sig_merr_WH_pd2(("sig_merr_WH_" +chstr+"_"+cat+"_pd2" ).c_str(), "", merr, rm2_merr_sig, rs2_merr_sig, raL2_merr_sig, rnL2_merr_sig, raR2_merr_sig, rnR2_merr_sig); RooDoubleCB sig_merr_ZH_pd2(("sig_merr_ZH_" +chstr+"_"+cat+"_pd2" ).c_str(), "", merr, rm2_merr_sig, rs2_merr_sig, raL2_merr_sig, rnL2_merr_sig, raR2_merr_sig, rnR2_merr_sig); RooDoubleCB sig_merr_tH_pd2(("sig_merr_ttH_"+chstr+"_"+cat+"_pd2" ).c_str(), "", merr, rm2_merr_sig, rs2_merr_sig, raL2_merr_sig, rnL2_merr_sig, raR2_merr_sig, rnR2_merr_sig); RooGaussian sig_merr_gH_pd3(("sig_merr_ggH_"+chstr+"_"+cat+"_pd3" ).c_str(), "", merr, rm3_merr_sig, rs3_merr_sig); RooGaussian sig_merr_qH_pd3(("sig_merr_qqH_"+chstr+"_"+cat+"_pd3" ).c_str(), "", merr, rm3_merr_sig, rs3_merr_sig); RooGaussian sig_merr_WH_pd3(("sig_merr_WH_" +chstr+"_"+cat+"_pd3" ).c_str(), "", merr, rm3_merr_sig, rs3_merr_sig); RooGaussian sig_merr_ZH_pd3(("sig_merr_ZH_" +chstr+"_"+cat+"_pd3" ).c_str(), "", merr, rm3_merr_sig, rs3_merr_sig); RooGaussian sig_merr_tH_pd3(("sig_merr_ttH_"+chstr+"_"+cat+"_pd3" ).c_str(), "", merr, rm3_merr_sig, rs3_merr_sig); RooAddPdf sig_merr_gH_pda(("sig_merr_ggH_"+chstr+"_"+cat+"_pda" ).c_str(), "", RooArgList(sig_merr_gH_pd1, sig_merr_gH_pd2, sig_merr_gH_pd3), RooArgList(rc1_merr_sig, rc2_merr_sig)); RooAddPdf sig_merr_qH_pda(("sig_merr_qqH_"+chstr+"_"+cat+"_pda" ).c_str(), "", RooArgList(sig_merr_qH_pd1, sig_merr_qH_pd2, sig_merr_qH_pd3), RooArgList(rc1_merr_sig, rc2_merr_sig)); RooAddPdf sig_merr_WH_pda(("sig_merr_WH_" +chstr+"_"+cat+"_pda" ).c_str(), "", RooArgList(sig_merr_WH_pd1, sig_merr_WH_pd2, sig_merr_WH_pd3), RooArgList(rc1_merr_sig, rc2_merr_sig)); RooAddPdf sig_merr_ZH_pda(("sig_merr_ZH_" +chstr+"_"+cat+"_pda" ).c_str(), "", RooArgList(sig_merr_ZH_pd1, sig_merr_ZH_pd2, sig_merr_ZH_pd3), RooArgList(rc1_merr_sig, rc2_merr_sig)); RooAddPdf sig_merr_tH_pda(("sig_merr_ttH_"+chstr+"_"+cat+"_pda" ).c_str(), "", RooArgList(sig_merr_tH_pd1, sig_merr_tH_pd2, sig_merr_tH_pd3), RooArgList(rc1_merr_sig, rc2_merr_sig)); RooAddPdf sig_merr_gH_pdb(("sig_merr_ggH_"+chstr+"_"+cat+"_pdb" ).c_str(), "", RooArgList( sig_merr_gH_pd2, sig_merr_gH_pd3), RooArgList(rc0_merr_sig )); RooAddPdf sig_merr_qH_pdb(("sig_merr_qqH_"+chstr+"_"+cat+"_pdb" ).c_str(), "", RooArgList( sig_merr_gH_pd2, sig_merr_gH_pd3), RooArgList(rc0_merr_sig )); RooAddPdf sig_merr_WH_pdb(("sig_merr_WH_" +chstr+"_"+cat+"_pdb" ).c_str(), "", RooArgList( sig_merr_gH_pd2, sig_merr_gH_pd3), RooArgList(rc0_merr_sig )); RooAddPdf sig_merr_ZH_pdb(("sig_merr_ZH_" +chstr+"_"+cat+"_pdb" ).c_str(), "", RooArgList( sig_merr_gH_pd2, sig_merr_gH_pd3), RooArgList(rc0_merr_sig )); RooAddPdf sig_merr_tH_pdb(("sig_merr_ttH_"+chstr+"_"+cat+"_pdb" ).c_str(), "", RooArgList( sig_merr_gH_pd2, sig_merr_gH_pd3), RooArgList(rc0_merr_sig )); RooDoubleCB bkg_merr_pd1 (("bkg_merr_" +chstr+"_"+cat+"_pd1" ).c_str(), "", merr, rm1_merr_bkg, rs1_merr_bkg, raL1_merr_bkg, rnL1_merr_bkg, raR1_merr_bkg, rnR1_merr_bkg); RooDoubleCB bkg_merr_pd2 (("bkg_merr_" +chstr+"_"+cat+"_pd2" ).c_str(), "", merr, rm2_merr_bkg, rs2_merr_bkg, raL2_merr_bkg, rnL2_merr_bkg, raR2_merr_bkg, rnR2_merr_bkg); RooGaussian bkg_merr_pd3 (("bkg_merr_" +chstr+"_"+cat+"_pd3" ).c_str(), "", merr, rm3_merr_bkg, rs3_merr_bkg); RooAddPdf bkg_merr_pda (("bkg_merr_" +chstr+"_"+cat+"_pda" ).c_str(), "", RooArgList(bkg_merr_pd1, bkg_merr_pd2, bkg_merr_pd3), RooArgList(rc1_merr_bkg, rc2_merr_bkg)); RooAddPdf bkg_merr_pdb (("bkg_merr_" +chstr+"_"+cat+"_pdb" ).c_str(), "", RooArgList( bkg_merr_pd2, bkg_merr_pd3), RooArgList(rc0_merr_bkg )); RooAbsPdf* sig_merr_gH_abspdf; RooAbsPdf* sig_merr_qH_abspdf; RooAbsPdf* sig_merr_WH_abspdf; RooAbsPdf* sig_merr_ZH_abspdf; RooAbsPdf* sig_merr_tH_abspdf; RooAbsPdf* bkg_merr_abspdf; if (cat == "BB") { sig_merr_gH_abspdf = &sig_merr_gH_pd1; sig_merr_qH_abspdf = &sig_merr_qH_pd1; sig_merr_WH_abspdf = &sig_merr_WH_pd1; sig_merr_ZH_abspdf = &sig_merr_ZH_pd1; sig_merr_tH_abspdf = &sig_merr_tH_pd1; bkg_merr_abspdf = &bkg_merr_pd1; } else if (cat == "XX") { sig_merr_gH_abspdf = &sig_merr_gH_pda; sig_merr_qH_abspdf = &sig_merr_qH_pda; sig_merr_WH_abspdf = &sig_merr_WH_pda; sig_merr_ZH_abspdf = &sig_merr_ZH_pda; sig_merr_tH_abspdf = &sig_merr_tH_pda; bkg_merr_abspdf = &bkg_merr_pda; } else { sig_merr_gH_abspdf = &sig_merr_gH_pdb; sig_merr_qH_abspdf = &sig_merr_qH_pdb; sig_merr_WH_abspdf = &sig_merr_WH_pdb; sig_merr_ZH_abspdf = &sig_merr_ZH_pdb; sig_merr_tH_abspdf = &sig_merr_tH_pdb; bkg_merr_abspdf = &bkg_merr_pdb; } RooProdPdf sig_mass_merr_gH_pdf(("sig_mass_merr_ggH_"+chstr+"_"+cat+"_pdf" ).c_str(), "", *sig_merr_gH_abspdf, RooFit::Conditional(sig_mass_gH_pdf , RooArgSet(m2mu))); RooProdPdf sig_mass_merr_qH_pdf(("sig_mass_merr_qqH_"+chstr+"_"+cat+"_pdf" ).c_str(), "", *sig_merr_qH_abspdf, RooFit::Conditional(sig_mass_qH_pdf , RooArgSet(m2mu))); RooProdPdf sig_mass_merr_WH_pdf(("sig_mass_merr_WH_" +chstr+"_"+cat+"_pdf" ).c_str(), "", *sig_merr_WH_abspdf, RooFit::Conditional(sig_mass_WH_pdf , RooArgSet(m2mu))); RooProdPdf sig_mass_merr_ZH_pdf(("sig_mass_merr_ZH_" +chstr+"_"+cat+"_pdf" ).c_str(), "", *sig_merr_ZH_abspdf, RooFit::Conditional(sig_mass_ZH_pdf , RooArgSet(m2mu))); RooProdPdf sig_mass_merr_tH_pdf(("sig_mass_merr_ttH_"+chstr+"_"+cat+"_pdf" ).c_str(), "", *sig_merr_tH_abspdf, RooFit::Conditional(sig_mass_tH_pdf , RooArgSet(m2mu))); RooProdPdf bkg_mass_merr_pdf (("bkg_mass_merr_" +chstr+"_"+cat+"_pdf" ).c_str(), "", *bkg_mass_pdf , *bkg_merr_abspdf); /* Creating the workspace the workspace */ RooWorkspace w("w", ""); w.import(*data_obs); w.import(ggH_norm); w.import(qqH_norm); w.import(WH_norm); w.import(ZH_norm); w.import(ttH_norm); w.import(bkg_norm); if (doMassErr) { w.import(sig_mass_merr_gH_pdf, RooFit::RecycleConflictNodes()); w.import(sig_mass_merr_qH_pdf, RooFit::RecycleConflictNodes()); w.import(sig_mass_merr_WH_pdf, RooFit::RecycleConflictNodes()); w.import(sig_mass_merr_ZH_pdf, RooFit::RecycleConflictNodes()); w.import(sig_mass_merr_tH_pdf, RooFit::RecycleConflictNodes()); w.import(bkg_mass_merr_pdf , RooFit::RecycleConflictNodes()); RooDataSet* data_pseudo = bkg_mass_merr_pdf.generate(RooArgSet(m2mu, merr), int(bkg_norm.getVal())); data_pseudo->SetName("data_pseudo"); w.import(*data_pseudo); } else { w.import(sig_mass_gH_pdf, RooFit::RecycleConflictNodes()); w.import(sig_mass_qH_pdf, RooFit::RecycleConflictNodes()); w.import(sig_mass_WH_pdf, RooFit::RecycleConflictNodes()); w.import(sig_mass_ZH_pdf, RooFit::RecycleConflictNodes()); w.import(sig_mass_tH_pdf, RooFit::RecycleConflictNodes()); w.import(*bkg_mass_pdf , RooFit::RecycleConflictNodes()); RooDataSet* data_pseudo = bkg_mass_pdf->generate(RooArgSet(m2mu), int(bkg_norm.getVal())); data_pseudo->SetName("data_pseudo"); w.import(*data_pseudo); } w.writeToFile(workspace.c_str()); /* Create the data card text file */ std::string card = createCardTemplate(mh, ch, cat, workspace, doMassErr); std::ofstream ofile; ofile.open ((card_name +".txt").c_str()); ofile << card; ofile.close(); if (bkg_mass_pdf != NULL) delete bkg_mass_pdf; delete data_obs; }
void performFit(string inputDir, string inputParameterFile, string label, string PassInputDataFilename, string FailInputDataFilename, string PassSignalTemplateHistName, string FailSignalTemplateHistName) { gBenchmark->Start("fitZCat"); //-------------------------------------------------------------------------------------------------------------- // Settings //============================================================================================================== const Double_t mlow = 60; const Double_t mhigh = 120; const Int_t nbins = 24; TString effType = inputDir; // The fit variable - lepton invariant mass RooRealVar* rooMass_ = new RooRealVar("Mass","m_{ee}",mlow, mhigh, "GeV/c^{2}"); RooRealVar Mass = *rooMass_; Mass.setBins(nbins); // Make the category variable that defines the two fits, // namely whether the probe passes or fails the eff criteria. RooCategory sample("sample","") ; sample.defineType("Pass", 1) ; sample.defineType("Fail", 2) ; RooDataSet *dataPass = RooDataSet::read((inputDir+PassInputDataFilename).c_str(),RooArgList(Mass)); RooDataSet *dataFail = RooDataSet::read((inputDir+FailInputDataFilename).c_str(),RooArgList(Mass)); RooDataSet *dataCombined = new RooDataSet("dataCombined","dataCombined", RooArgList(Mass), RooFit::Index(sample), RooFit::Import("Pass",*dataPass), RooFit::Import("Fail",*dataFail)); //********************************************************************************************* //Define Free Parameters //********************************************************************************************* RooRealVar* ParNumSignal = LoadParameters(inputParameterFile, label,"ParNumSignal"); RooRealVar* ParNumBkgPass = LoadParameters(inputParameterFile, label,"ParNumBkgPass"); RooRealVar* ParNumBkgFail = LoadParameters(inputParameterFile, label, "ParNumBkgFail"); RooRealVar* ParEfficiency = LoadParameters(inputParameterFile, label, "ParEfficiency"); RooRealVar* ParPassBackgroundExpCoefficient = LoadParameters(inputParameterFile, label, "ParPassBackgroundExpCoefficient"); RooRealVar* ParFailBackgroundExpCoefficient = LoadParameters(inputParameterFile, label, "ParFailBackgroundExpCoefficient"); RooRealVar* ParPassSignalMassShift = LoadParameters(inputParameterFile, label, "ParPassSignalMassShift"); RooRealVar* ParFailSignalMassShift = LoadParameters(inputParameterFile, label, "ParFailSignalMassShift"); RooRealVar* ParPassSignalResolution = LoadParameters(inputParameterFile, label, "ParPassSignalResolution"); RooRealVar* ParFailSignalResolution = LoadParameters(inputParameterFile, label, "ParFailSignalResolution"); // new RooRealVar ("ParPassSignalMassShift","ParPassSignalMassShift",-2.6079e-02,-10.0, 10.0); //ParPassSignalMassShift->setConstant(kTRUE); // RooRealVar* ParFailSignalMassShift = new RooRealVar ("ParFailSignalMassShift","ParFailSignalMassShift",7.2230e-01,-10.0, 10.0); //ParFailSignalMassShift->setConstant(kTRUE); // RooRealVar* ParPassSignalResolution = new RooRealVar ("ParPassSignalResolution","ParPassSignalResolution",6.9723e-01,0.0, 10.0); ParPassSignalResolution->setConstant(kTRUE); // RooRealVar* ParFailSignalResolution = new RooRealVar ("ParFailSignalResolution","ParFailSignalResolution",1.6412e+00,0.0, 10.0); ParFailSignalResolution->setConstant(kTRUE); //********************************************************************************************* // //Load Signal PDFs // //********************************************************************************************* TFile *Zeelineshape_file = new TFile("res/photonEfffromZee.dflag1.eT1.2.gT40.mt15.root", "READ"); TH1* histTemplatePass = (TH1D*) Zeelineshape_file->Get(PassSignalTemplateHistName.c_str()); TH1* histTemplateFail = (TH1D*) Zeelineshape_file->Get(FailSignalTemplateHistName.c_str()); //Introduce mass shift coordinate transformation // RooFormulaVar PassShiftedMass("PassShiftedMass","@0-@1",RooArgList(Mass,*ParPassSignalMassShift)); // RooFormulaVar FailShiftedMass("FailShiftedMass","@0-@1",RooArgList(Mass,*ParFailSignalMassShift)); RooGaussian *PassSignalResolutionFunction = new RooGaussian("PassSignalResolutionFunction","PassSignalResolutionFunction",Mass,*ParPassSignalMassShift,*ParPassSignalResolution); RooGaussian *FailSignalResolutionFunction = new RooGaussian("FailSignalResolutionFunction","FailSignalResolutionFunction",Mass,*ParFailSignalMassShift,*ParFailSignalResolution); RooDataHist* dataHistPass = new RooDataHist("dataHistPass","dataHistPass", RooArgSet(Mass), histTemplatePass); RooDataHist* dataHistFail = new RooDataHist("dataHistFail","dataHistFail", RooArgSet(Mass), histTemplateFail); RooHistPdf* signalShapePassTemplatePdf = new RooHistPdf("signalShapePassTemplatePdf", "signalShapePassTemplatePdf", Mass, *dataHistPass, 1); RooHistPdf* signalShapeFailTemplatePdf = new RooHistPdf("signalShapeFailTemplatePdf", "signalShapeFailTemplatePdf", Mass, *dataHistFail, 1); RooFFTConvPdf* signalShapePassPdf = new RooFFTConvPdf("signalShapePassPdf","signalShapePassPdf" , Mass, *signalShapePassTemplatePdf,*PassSignalResolutionFunction,2); RooFFTConvPdf* signalShapeFailPdf = new RooFFTConvPdf("signalShapeFailPdf","signalShapeFailPdf" , Mass, *signalShapeFailTemplatePdf,*FailSignalResolutionFunction,2); // Now define some efficiency/yield variables RooFormulaVar* NumSignalPass = new RooFormulaVar("NumSignalPass", "ParEfficiency*ParNumSignal", RooArgList(*ParEfficiency,*ParNumSignal)); RooFormulaVar* NumSignalFail = new RooFormulaVar("NumSignalFail", "(1.0-ParEfficiency)*ParNumSignal", RooArgList(*ParEfficiency,*ParNumSignal)); //********************************************************************************************* // // Create Background PDFs // //********************************************************************************************* RooExponential* bkgPassPdf = new RooExponential("bkgPassPdf","bkgPassPdf",Mass, *ParPassBackgroundExpCoefficient); RooExponential* bkgFailPdf = new RooExponential("bkgFailPdf","bkgFailPdf",Mass, *ParFailBackgroundExpCoefficient); //********************************************************************************************* // // Create Total PDFs // //********************************************************************************************* RooAddPdf pdfPass("pdfPass","pdfPass",RooArgList(*signalShapePassPdf,*bkgPassPdf), RooArgList(*NumSignalPass,*ParNumBkgPass)); RooAddPdf pdfFail("pdfFail","pdfFail",RooArgList(*signalShapeFailPdf,*bkgFailPdf), RooArgList(*NumSignalFail,*ParNumBkgFail)); // PDF for simultaneous fit RooSimultaneous totalPdf("totalPdf","totalPdf", sample); totalPdf.addPdf(pdfPass,"Pass"); // totalPdf.Print(); totalPdf.addPdf(pdfFail,"Fail"); totalPdf.Print(); //********************************************************************************************* // // Perform Fit // //********************************************************************************************* RooFitResult *fitResult = 0; // ********* Fix with Migrad first ********** // fitResult = totalPdf.fitTo(*dataCombined, RooFit::Save(true), RooFit::Extended(true), RooFit::PrintLevel(-1)); fitResult->Print("v"); // // ********* Fit With Minos ********** // // fitResult = totalPdf.fitTo(*dataCombined, RooFit::Save(true), // RooFit::Extended(true), RooFit::PrintLevel(-1), RooFit::Minos()); // fitResult->Print("v"); // // ********* Fix Mass Shift and Fit For Resolution ********** // // ParPassSignalMassShift->setConstant(kTRUE); // ParFailSignalMassShift->setConstant(kTRUE); // ParPassSignalResolution->setConstant(kFALSE); // ParFailSignalResolution->setConstant(kFALSE); // fitResult = totalPdf.fitTo(*dataCombined, RooFit::Save(true), // RooFit::Extended(true), RooFit::PrintLevel(-1)); // fitResult->Print("v"); // // ********* Do Final Fit ********** // // ParPassSignalMassShift->setConstant(kFALSE); // ParFailSignalMassShift->setConstant(kFALSE); // ParPassSignalResolution->setConstant(kTRUE); // ParFailSignalResolution->setConstant(kTRUE); // fitResult = totalPdf.fitTo(*dataCombined, RooFit::Save(true), // RooFit::Extended(true), RooFit::PrintLevel(-1)); // fitResult->Print("v"); double nSignalPass = NumSignalPass->getVal(); double nSignalFail = NumSignalFail->getVal(); double denominator = nSignalPass + nSignalFail; printf("\nFit results:\n"); if( fitResult->status() != 0 ){ std::cout<<"ERROR: BAD FIT STATUS"<<std::endl; } printf(" Efficiency = %.4f +- %.4f\n", ParEfficiency->getVal(), ParEfficiency->getPropagatedError(*fitResult)); cout << "Signal Pass: "******"Signal Fail: " << nSignalFail << endl; cout << "*********************************************************************\n"; cout << "Final Parameters\n"; cout << "*********************************************************************\n"; PrintParameter(ParNumSignal, label,"ParNumSignal"); PrintParameter(ParNumBkgPass, label,"ParNumBkgPass"); PrintParameter(ParNumBkgFail, label, "ParNumBkgFail"); PrintParameter(ParEfficiency , label, "ParEfficiency"); PrintParameter(ParPassBackgroundExpCoefficient , label, "ParPassBackgroundExpCoefficient"); PrintParameter(ParFailBackgroundExpCoefficient , label, "ParFailBackgroundExpCoefficient"); PrintParameter(ParPassSignalMassShift , label, "ParPassSignalMassShift"); PrintParameter(ParFailSignalMassShift , label, "ParFailSignalMassShift"); PrintParameter(ParPassSignalResolution , label, "ParPassSignalResolution"); PrintParameter(ParFailSignalResolution , label, "ParFailSignalResolution"); cout << endl << endl; //-------------------------------------------------------------------------------------------------------------- // Make plots //============================================================================================================== TFile *canvasFile = new TFile("Efficiency_FitResults.root", "UPDATE"); RooAbsData::ErrorType errorType = RooAbsData::Poisson; Mass.setBins(NBINSPASS); TString cname = TString((label+"_Pass").c_str()); TCanvas *c = new TCanvas(cname,cname,800,600); RooPlot* frame1 = Mass.frame(); frame1->SetMinimum(0); dataPass->plotOn(frame1,RooFit::DataError(errorType)); pdfPass.plotOn(frame1,RooFit::ProjWData(*dataPass), RooFit::Components(*bkgPassPdf),RooFit::LineColor(kRed)); pdfPass.plotOn(frame1,RooFit::ProjWData(*dataPass)); frame1->Draw("e0"); TPaveText *plotlabel = new TPaveText(0.23,0.87,0.43,0.92,"NDC"); plotlabel->SetTextColor(kBlack); plotlabel->SetFillColor(kWhite); plotlabel->SetBorderSize(0); plotlabel->SetTextAlign(12); plotlabel->SetTextSize(0.03); plotlabel->AddText("CMS Preliminary 2010"); TPaveText *plotlabel2 = new TPaveText(0.23,0.82,0.43,0.87,"NDC"); plotlabel2->SetTextColor(kBlack); plotlabel2->SetFillColor(kWhite); plotlabel2->SetBorderSize(0); plotlabel2->SetTextAlign(12); plotlabel2->SetTextSize(0.03); plotlabel2->AddText("#sqrt{s} = 7 TeV"); TPaveText *plotlabel3 = new TPaveText(0.23,0.75,0.43,0.80,"NDC"); plotlabel3->SetTextColor(kBlack); plotlabel3->SetFillColor(kWhite); plotlabel3->SetBorderSize(0); plotlabel3->SetTextAlign(12); plotlabel3->SetTextSize(0.03); char temp[100]; sprintf(temp, "%.4f", LUMINOSITY); plotlabel3->AddText((string("#int#font[12]{L}dt = ") + temp + string(" pb^{ -1}")).c_str()); TPaveText *plotlabel4 = new TPaveText(0.6,0.82,0.8,0.87,"NDC"); plotlabel4->SetTextColor(kBlack); plotlabel4->SetFillColor(kWhite); plotlabel4->SetBorderSize(0); plotlabel4->SetTextAlign(12); plotlabel4->SetTextSize(0.03); double nsig = ParNumSignal->getVal(); double nErr = ParNumSignal->getError(); double e = ParEfficiency->getVal(); double eErr = ParEfficiency->getError(); double corr = fitResult->correlation(*ParEfficiency, *ParNumSignal); double err = ErrorInProduct(nsig, nErr, e, eErr, corr); sprintf(temp, "Signal = %.2f #pm %.2f", NumSignalPass->getVal(), err); plotlabel4->AddText(temp); TPaveText *plotlabel5 = new TPaveText(0.6,0.77,0.8,0.82,"NDC"); plotlabel5->SetTextColor(kBlack); plotlabel5->SetFillColor(kWhite); plotlabel5->SetBorderSize(0); plotlabel5->SetTextAlign(12); plotlabel5->SetTextSize(0.03); sprintf(temp, "Bkg = %.2f #pm %.2f", ParNumBkgPass->getVal(), ParNumBkgPass->getError()); plotlabel5->AddText(temp); TPaveText *plotlabel6 = new TPaveText(0.6,0.87,0.8,0.92,"NDC"); plotlabel6->SetTextColor(kBlack); plotlabel6->SetFillColor(kWhite); plotlabel6->SetBorderSize(0); plotlabel6->SetTextAlign(12); plotlabel6->SetTextSize(0.03); plotlabel6->AddText("Passing probes"); TPaveText *plotlabel7 = new TPaveText(0.6,0.72,0.8,0.77,"NDC"); plotlabel7->SetTextColor(kBlack); plotlabel7->SetFillColor(kWhite); plotlabel7->SetBorderSize(0); plotlabel7->SetTextAlign(12); plotlabel7->SetTextSize(0.03); sprintf(temp, "Eff = %.3f #pm %.3f", ParEfficiency->getVal(), ParEfficiency->getErrorHi()); plotlabel7->AddText(temp); TPaveText *plotlabel8 = new TPaveText(0.6,0.72,0.8,0.66,"NDC"); plotlabel8->SetTextColor(kBlack); plotlabel8->SetFillColor(kWhite); plotlabel8->SetBorderSize(0); plotlabel8->SetTextAlign(12); plotlabel8->SetTextSize(0.03); sprintf(temp, "#chi^{2}/DOF = %.3f", frame1->chiSquare()); plotlabel8->AddText(temp); plotlabel4->Draw(); plotlabel5->Draw(); plotlabel6->Draw(); plotlabel7->Draw(); plotlabel8->Draw(); // c->SaveAs( cname + TString(".eps")); c->SaveAs( cname + TString(".gif")); canvasFile->WriteTObject(c, c->GetName(), "WriteDelete"); Mass.setBins(NBINSFAIL); cname = TString((label+"_Fail").c_str()); TCanvas* c2 = new TCanvas(cname,cname,800,600); RooPlot* frame2 = Mass.frame(); frame2->SetMinimum(0); dataFail->plotOn(frame2,RooFit::DataError(errorType)); pdfFail.plotOn(frame2,RooFit::ProjWData(*dataFail), RooFit::Components(*bkgFailPdf),RooFit::LineColor(kRed)); pdfFail.plotOn(frame2,RooFit::ProjWData(*dataFail)); frame2->Draw("e0"); plotlabel = new TPaveText(0.23,0.87,0.43,0.92,"NDC"); plotlabel->SetTextColor(kBlack); plotlabel->SetFillColor(kWhite); plotlabel->SetBorderSize(0); plotlabel->SetTextAlign(12); plotlabel->SetTextSize(0.03); plotlabel->AddText("CMS Preliminary 2010"); plotlabel2 = new TPaveText(0.23,0.82,0.43,0.87,"NDC"); plotlabel2->SetTextColor(kBlack); plotlabel2->SetFillColor(kWhite); plotlabel2->SetBorderSize(0); plotlabel2->SetTextAlign(12); plotlabel2->SetTextSize(0.03); plotlabel2->AddText("#sqrt{s} = 7 TeV"); plotlabel3 = new TPaveText(0.23,0.75,0.43,0.80,"NDC"); plotlabel3->SetTextColor(kBlack); plotlabel3->SetFillColor(kWhite); plotlabel3->SetBorderSize(0); plotlabel3->SetTextAlign(12); plotlabel3->SetTextSize(0.03); sprintf(temp, "%.4f", LUMINOSITY); plotlabel3->AddText((string("#int#font[12]{L}dt = ") + temp + string(" pb^{ -1}")).c_str()); plotlabel4 = new TPaveText(0.6,0.82,0.8,0.87,"NDC"); plotlabel4->SetTextColor(kBlack); plotlabel4->SetFillColor(kWhite); plotlabel4->SetBorderSize(0); plotlabel4->SetTextAlign(12); plotlabel4->SetTextSize(0.03); err = ErrorInProduct(nsig, nErr, 1.0-e, eErr, corr); sprintf(temp, "Signal = %.2f #pm %.2f", NumSignalFail->getVal(), err); plotlabel4->AddText(temp); plotlabel5 = new TPaveText(0.6,0.77,0.8,0.82,"NDC"); plotlabel5->SetTextColor(kBlack); plotlabel5->SetFillColor(kWhite); plotlabel5->SetBorderSize(0); plotlabel5->SetTextAlign(12); plotlabel5->SetTextSize(0.03); sprintf(temp, "Bkg = %.2f #pm %.2f", ParNumBkgFail->getVal(), ParNumBkgFail->getError()); plotlabel5->AddText(temp); plotlabel6 = new TPaveText(0.6,0.87,0.8,0.92,"NDC"); plotlabel6->SetTextColor(kBlack); plotlabel6->SetFillColor(kWhite); plotlabel6->SetBorderSize(0); plotlabel6->SetTextAlign(12); plotlabel6->SetTextSize(0.03); plotlabel6->AddText("Failing probes"); plotlabel7 = new TPaveText(0.6,0.72,0.8,0.77,"NDC"); plotlabel7->SetTextColor(kBlack); plotlabel7->SetFillColor(kWhite); plotlabel7->SetBorderSize(0); plotlabel7->SetTextAlign(12); plotlabel7->SetTextSize(0.03); sprintf(temp, "Eff = %.3f #pm %.3f", ParEfficiency->getVal(), ParEfficiency->getErrorHi(), ParEfficiency->getErrorLo()); plotlabel7->AddText(temp); plotlabel8 = new TPaveText(0.6,0.72,0.8,0.66,"NDC"); plotlabel8->SetTextColor(kBlack); plotlabel8->SetFillColor(kWhite); plotlabel8->SetBorderSize(0); plotlabel8->SetTextAlign(12); plotlabel8->SetTextSize(0.03); sprintf(temp, "#chi^{2}/DOF = %.3f", frame2->chiSquare()); plotlabel8->AddText(temp); // plotlabel->Draw(); // plotlabel2->Draw(); // plotlabel3->Draw(); plotlabel4->Draw(); plotlabel5->Draw(); plotlabel6->Draw(); plotlabel7->Draw(); plotlabel8->Draw(); c2->SaveAs( cname + TString(".gif")); // c2->SaveAs( cname + TString(".eps")); // c2->SaveAs( cname + TString(".root")); canvasFile->WriteTObject(c2, c2->GetName(), "WriteDelete"); canvasFile->Close(); effTextFile.width(40); effTextFile << label; effTextFile.width(20); effTextFile << setiosflags(ios::fixed) << setprecision(4) << left << ParEfficiency->getVal() ; effTextFile.width(20); effTextFile << left << ParEfficiency->getErrorHi(); effTextFile.width(20); effTextFile << left << ParEfficiency->getErrorLo(); effTextFile.width(14); effTextFile << setiosflags(ios::fixed) << setprecision(2) << left << nSignalPass ; effTextFile.width(14); effTextFile << left << nSignalFail << endl; }
void fitPtOverMCJLST(int mass = 125, int LHCsqrts = 7, int whichtype = 1, bool correctErrors = false, /* string changeParName = "", */ bool showErrorPDFs = false, string systString = "Default") // whichtype // 0 - gg Signal // 1 - VBF Signal // 2 - ZZ // 3 - ZX // 4 - ggZZ // 5 - WH // 6 - ZH // 7 - ttH { string changeParName = ""; if (systString == "Default") changeParName = "up"; string nameSample[8] = {"gg","vbf","zz","zx","ggzz","wh","zh","tth"}; float maxType[8] = {2.4,3.2,1.6,1.6,1.6,3.2,3.2,3.2}; float rebinType[8] = {1,2,1,1,4,10,10,40}; for (int t = 0; t < 8; t++) { if (mass > 150) maxType[t] = int(117.90*maxType[t]/sqrt(mass-10.91))/10.; } char fileToOpen[200]; sprintf(fileToOpen,"selRootFiles/PToverM_%s%d_SEL_%dTeV.root",nameSample[whichtype].c_str(),mass,LHCsqrts); // if (whichtype == 3) sprintf(fileToOpen,"PTOVERM_%s_SEL_allTeV.root",nameSample[whichtype].c_str()); RooRealVar* ptoverm = new RooRealVar("ptoverm","p_{T}/M^{4l}",0.,maxType[whichtype],"GeV/c"); TFile input(fileToOpen); // if (systString == "Mass" || systString == "Mela") { // sprintf(fileToOpen,"ptovermH_%sUp",systString.c_str()); // } else { sprintf(fileToOpen,"ptovermH_%s",systString.c_str()); //} TH1F* ptovermH = (TH1F*)input.Get(fileToOpen); if (rebinType[whichtype] > 1) ptovermH->Rebin(rebinType[whichtype]); if (maxType[whichtype] < ptovermH->GetBinLowEdge(ptovermH->GetNbinsX() + 1) - ptovermH->GetBinWidth(1)) { int theBin = ptovermH->FindBin(maxType[whichtype]); ptovermH->GetXaxis()->SetRange(1,theBin-1); } gROOT->ProcessLine(".L mytdrstyle.C"); gROOT->ProcessLine("setTDRStyle()"); // cout << endl << "Signal " << endl; ptoverm->setBins(ptovermH->GetNbinsX()); RooDataHist* rdh = new RooDataHist("rdh","Some dataset",RooArgList(*ptoverm),Import(*ptovermH,kFALSE)); // fit definitions // RooWorkspace *ws = new RooWorkspace("ws"); RooRealVar m("m","emme", 1.,0.01, 40.); RooRealVar n("n","enne", 0.93, 0.05, 15.); RooRealVar n2("n2","enne2", 0.75, 0.5, 15.); RooRealVar bb("bb","bibi",0.02, 0.000005, 20.0); RooRealVar T("T","tti",0.2,0.00000005,1.); RooRealVar bb2("bb2","bibi2",0.02, 0.0005, 10.0); RooRealVar fexp("fexp","f_exp",0.02, 0.0, 1.0); if (whichtype == 0) { if (LHCsqrts == 8) { m.setVal(3.319); // m.setConstant(kTRUE); n.setVal(0.7606); if (systString != "Default" || mass != 125) n.setConstant(kTRUE); n2.setVal(0.8061); n2.setConstant(kTRUE); bb.setVal(3.728); // bb.setConstant(kTRUE); T.setVal(0.00333); // T.setConstant(kTRUE); bb2.setVal(1.7172); // bb2.setConstant(kTRUE); fexp.setVal(0.002144); if (systString != "Default" || mass != 125) fexp.setConstant(kTRUE); } else { m.setVal(0.061); // m.setConstant(kTRUE); n.setVal(1.6141); if (systString == "Resummation" || systString == "TopMass") n.setConstant(kTRUE); n2.setVal(1.3294); n2.setConstant(kTRUE); bb.setVal(4.2761); // bb.setConstant(kTRUE); T.setVal(0.0361); // T.setConstant(kTRUE); bb2.setVal(1.6643); bb2.setConstant(kTRUE); fexp.setVal(0.0004); // fexp.setConstant(kTRUE); } } else if (whichtype == 1) { m.setVal(1.006); // m.setConstant(kTRUE); n.setVal(10.939); n.setConstant(kTRUE); n2.setVal(1.1448); n2.setConstant(kTRUE); bb.setVal(0.02048); bb.setConstant(kTRUE); T.setVal(0.16115); if (systString.find("Mela") != string::npos) T.setConstant(kTRUE); // T.setConstant(kTRUE); bb2.setVal(1.0024); bb2.setConstant(kTRUE); fexp.setVal(0.005); fexp.setConstant(kTRUE); if (mass > 300) { fexp.setVal(0.0); fexp.setConstant(kFALSE); } if (mass > 500) { bb2.setVal(5.0); // bb2.setConstant(kFALSE); } if (mass > 500) { bb.setVal(15.0); // bb.setConstant(kFALSE); } } else if (whichtype == 2) { if (LHCsqrts == 8) { m.setVal(1.0476); // m.setConstant(kTRUE); bb.setVal(3.3088); // if (mass != 140) bb.setConstant(kTRUE); n2.setVal(0.7146); n2.setConstant(kTRUE); n.setVal(0.9518); n.setConstant(kTRUE); bb2.setVal(100000.); bb2.setConstant(kTRUE); T.setVal(0.0021889); if (systString.find("Mela") != string::npos || mass != 140) T.setConstant(kTRUE); fexp.setVal(0.0); fexp.setConstant(kTRUE); } else { m.setVal(1.028); // m.setConstant(kTRUE); bb.setVal(2.91); // bb.setConstant(kTRUE); n2.setVal(0.7146); n2.setConstant(kTRUE); n.setVal(0.9518); n.setConstant(kTRUE); bb2.setVal(100000.); bb2.setConstant(kTRUE); T.setVal(0.002248); if (systString.find("Mela") != string::npos) T.setConstant(kTRUE); fexp.setVal(0.0); fexp.setConstant(kTRUE); } } else if (whichtype == 3) { m.setVal(1.411); // m.setConstant(kTRUE); n.setVal(3.4523); n.setConstant(kTRUE); n2.setVal(0.6910); n2.setConstant(kTRUE); bb.setVal(0.00039); // bb.setConstant(kTRUE); T.setVal(0.118); // T.setConstant(kTRUE); bb2.setVal(0.0224); bb2.setConstant(kTRUE); fexp.setVal(0.0); fexp.setConstant(kTRUE); } else if (whichtype == 4) { m.setVal(1.411); // m.setConstant(kTRUE); n.setVal(5.756); // n.setConstant(kTRUE); n2.setVal(0.8738); // n2.setConstant(kTRUE); bb.setVal(0.00039); // bb.setConstant(kTRUE); T.setVal(0.118); // T.setConstant(kTRUE); bb2.setVal(0.0224); bb2.setConstant(kTRUE); fexp.setVal(0.0); fexp.setConstant(kTRUE); } else if (whichtype == 5 && LHCsqrts == 8) { m.setVal(1.006); // m.setConstant(kTRUE); n.setVal(10.939); n.setConstant(kTRUE); n2.setVal(1.1448); n2.setConstant(kTRUE); bb.setVal(3.897); bb.setConstant(kTRUE); T.setVal(0.1009); // T.setConstant(kTRUE); bb2.setVal(1.0224); bb2.setConstant(kTRUE); fexp.setVal(0.01); fexp.setConstant(kTRUE); } else { // cout << "Entro qui" << endl; m.setVal(1.006); // m.setConstant(kTRUE); n.setVal(10.939); n.setConstant(kTRUE); n2.setVal(1.1448); n2.setConstant(kTRUE); bb.setVal(0.0129); bb.setConstant(kTRUE); T.setVal(0.1009); // T.setConstant(kTRUE); bb2.setVal(1.0224); bb2.setConstant(kTRUE); fexp.setVal(0.01); fexp.setConstant(kTRUE); } RooModifTsallis* rt3 = new RooModifTsallis("rt3","rt3",*ptoverm,m,n,n2,bb,bb2,T,fexp); // ws->import(*rt3); // fit RooFitResult* fit = rt3->fitTo(*rdh,Minos(0),Save(1),SumW2Error(kTRUE),NumCPU(1)); float mVal = m.getVal(); float nVal = n.getVal(); float n2Val = n2.getVal(); float bbVal = bb.getVal(); float bb2Val = bb2.getVal(); float fexpVal = fexp.getVal(); float TVal = T.getVal(); if (correctErrors) { // Tsallis errors not reliable, use toy MC TH1F* mHist = new TH1F("mHist","m",21,-0.5*mVal,0.5*mVal); TH1F* nHist = new TH1F("nHist","n",21,-0.2*nVal,0.2*nVal); TH1F* n2Hist = new TH1F("n2Hist","n2",21,-0.2*n2Val,0.2*n2Val); TH1F* bbHist = new TH1F("bbHist","bb",21,-0.2*bbVal,0.2*bbVal); TH1F* bb2Hist = new TH1F("bb2Hist","bb2",21,-0.2*bb2Val,0.2*bb2Val); TH1F* fexpHist = new TH1F("fexpHist","fexp",21,-0.2*fexpVal-0.000001,0.2*fexpVal+0.000001); TH1F* THist = new TH1F("THist","T",21,-0.5*TVal,0.5*TVal); mHist->GetXaxis()->SetTitle("m-m_{gen}"); nHist->GetXaxis()->SetTitle("n-n_{gen}"); n2Hist->GetXaxis()->SetTitle("n2-n2_{gen}"); bbHist->GetXaxis()->SetTitle("bb-bb_{gen}"); bb2Hist->GetXaxis()->SetTitle("bb2-bb2_{gen}"); THist->GetXaxis()->SetTitle("T-T_{gen}"); fexpHist->GetXaxis()->SetTitle("fexp-fexp_{gen}"); for (unsigned int iToy = 0; iToy < 200; iToy++) { cout << endl << "####" << endl; cout << "Generating toy experiment n. " << iToy+1 << endl; m.setVal(mVal); n.setVal(nVal); n2.setVal(n2Val); bb.setVal(bbVal); bb2.setVal(bb2Val); fexp.setVal(fexpVal); T.setVal(TVal); TDatime *now = new TDatime(); Int_t seed = now->GetDate() + now->GetTime(); cout << "RooFit Generation Seed = " << seed+iToy << endl; RooRandom::randomGenerator()->SetSeed(seed+iToy); cout << "####" << endl << endl; RooDataSet *dataToy = rt3->generate(RooArgSet(*ptoverm),ptovermH->GetEntries()); RooDataHist *dataToyH = new RooDataHist("dataToyH","toy",RooArgSet(*ptoverm),*dataToy); rt3->fitTo(*dataToyH,Minos(0),SumW2Error(kTRUE),NumCPU(1)); if (fit->floatParsFinal().find("m")) mHist->Fill(m.getVal()-mVal); if (fit->floatParsFinal().find("n")) nHist->Fill(n.getVal()-nVal); if (fit->floatParsFinal().find("n2")) n2Hist->Fill(n2.getVal()-n2Val); if (fit->floatParsFinal().find("bb")) bbHist->Fill(bb.getVal()-bbVal); if (fit->floatParsFinal().find("bb2")) bb2Hist->Fill(bb2.getVal()-bb2Val); if (fit->floatParsFinal().find("fexp")) fexpHist->Fill(fexp.getVal()-fexpVal); if (fit->floatParsFinal().find("T")) THist->Fill(T.getVal()-TVal); } TCanvas cant("cant","Test canvas",5.,5.,900.,500.); cant.Divide(4,2); cant.cd(1); mHist->Draw(); cant.cd(2); nHist->Draw(); cant.cd(3); n2Hist->Draw(); cant.cd(4); bbHist->Draw(); cant.cd(5); bb2Hist->Draw(); cant.cd(6); fexpHist->Draw(); cant.cd(7); THist->Draw(); // cant.SaveAs("figs/testToys.pdf"); cant.SaveAs("newfigs/testToys.pdf"); if (fit->floatParsFinal().find("m")) m.setError(mHist->GetRMS()); if (fit->floatParsFinal().find("n")) n.setError(nHist->GetRMS()); if (fit->floatParsFinal().find("n2")) n2.setError(n2Hist->GetRMS()); if (fit->floatParsFinal().find("bb")) bb.setError(bbHist->GetRMS()); if (fit->floatParsFinal().find("bb2")) bb2.setError(bb2Hist->GetRMS()); if (fit->floatParsFinal().find("fexp")) fexp.setError(fexpHist->GetRMS()); if (fit->floatParsFinal().find("T")) T.setError(THist->GetRMS()); } m.setVal(mVal); n.setVal(nVal); n2.setVal(n2Val); bb.setVal(bbVal); bb2.setVal(bb2Val); fexp.setVal(fexpVal); T.setVal(TVal); char fileToSave[200]; // if (changeParName != "") // sprintf(fileToSave,"text/paramsPTOverMCJLST_%s_%dTeV_%s_%s.txt",nameSample[whichtype].c_str(),LHCsqrts,systString.c_str(),changeParName.c_str()); // else sprintf(fileToSave,"text/paramsPTOverMCJLST_%s%d_%dTeV_%s.txt",nameSample[whichtype].c_str(),mass,LHCsqrts,systString.c_str()); ofstream os1(fileToSave); if (changeParName != "") { sprintf(fileToSave,"m%s",changeParName.c_str()); m.SetName(fileToSave); sprintf(fileToSave,"n%s",changeParName.c_str()); n.SetName(fileToSave); sprintf(fileToSave,"n2%s",changeParName.c_str()); n2.SetName(fileToSave); sprintf(fileToSave,"bb%s",changeParName.c_str()); bb.SetName(fileToSave); sprintf(fileToSave,"bb2%s",changeParName.c_str()); bb2.SetName(fileToSave); sprintf(fileToSave,"fexp%s",changeParName.c_str()); fexp.SetName(fileToSave); sprintf(fileToSave,"T%s",changeParName.c_str()); T.SetName(fileToSave); } (RooArgSet(m,n,n2,bb,bb2,fexp,T)).writeToStream(os1,false); os1.close(); RooRealVar mup("mup","emme", 1.,0.01, 30.); RooRealVar nup("nup","enne", 0.93, 0.5, 15.); RooRealVar n2up("n2up","enne2", 0.75, 0.5, 15.); RooRealVar bbup("bbup","bibi",0.02, 0.00005, 20.0); RooRealVar Tup("Tup","tti",0.2,0.00000005,1.); RooRealVar bb2up("bb2up","bibi2",0.02, 0.0005, 10.0); RooRealVar fexpup("fexpup","f_exp",0.02, 0.0, 1.0); RooModifTsallis* rt3up = new RooModifTsallis("rt3up","rt3up",*ptoverm,mup,nup,n2up,bbup,bb2up,Tup,fexpup); // ws->import(*rt3up); RooRealVar mdown("mdown","emme", 1.,0.01, 30.); RooRealVar ndown("ndown","enne", 0.93, 0.5, 15.); RooRealVar n2down("n2down","enne2", 0.75, 0.5, 15.); RooRealVar bbdown("bbdown","bibi",0.02, 0.00005, 20.0); RooRealVar Tdown("Tdown","tti",0.2,0.00000005,1.); RooRealVar bb2down("bb2down","bibi2",0.02, 0.0005, 10.0); RooRealVar fexpdown("fexpdown","f_exp",0.02, 0.0, 1.0); RooModifTsallis* rt3down = new RooModifTsallis("rt3down","rt3down",*ptoverm,mdown,ndown,n2down,bbdown,bb2down,Tdown,fexpdown); // ws->import(*rt3down); RooPlot *frame = ptoverm->frame(); char reducestr[300]; sprintf(reducestr,"ptoverm > %f && ptoverm < %f",ptoverm->getMin(),ptoverm->getMax()); rdh->plotOn(frame,DataError(RooAbsData::SumW2),Cut(reducestr)); static RooHist *hpull; float chi2 = 0.; if (changeParName == "") { sprintf(fileToSave,"text/paramsPTOverMCJLST_%s%d_%dTeV_Default.txt",nameSample[whichtype].c_str(),mass,LHCsqrts); ifstream is1(fileToSave); (RooArgSet(mup,nup,n2up,bbup,bb2up,fexpup,Tup)).readFromStream(is1,false); mdown.setVal(fabs(3*mup.getVal() - 2*m.getVal())); ndown.setVal(fabs(3*nup.getVal() - 2*n.getVal())); n2down.setVal(fabs(3*n2up.getVal() - 2*n2.getVal())); bbdown.setVal(fabs(3*bbup.getVal() - 2*bb.getVal())); Tdown.setVal(fabs(3*Tup.getVal() - 2*T.getVal())); bb2down.setVal(fabs(3*bb2up.getVal() - 2*bb2.getVal())); fexpdown.setVal(fabs(3*fexpup.getVal() - 2*fexp.getVal())); if (showErrorPDFs) { rt3->plotOn(frame,LineColor(kRed),LineStyle(kDashed),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent)); hpull = frame->pullHist(); rt3up->plotOn(frame,LineColor(kBlue),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent)); if (systString.find("Mela") == string::npos) rt3down->plotOn(frame,LineColor(kRed),LineStyle(kDashed),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent)); } else { rt3->plotOn(frame,LineColor(kBlue),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent)); hpull = frame->pullHist(); } } else { mup.setVal(m.getVal() + m.getError()); cout << "mup = " << mup.getVal() << endl; nup.setVal(n.getVal() + n.getError()); n2up.setVal(n2.getVal() + n2.getError()); bbup.setVal(bb.getVal() + bb.getError()); Tup.setVal(T.getVal() + T.getError()); bb2up.setVal(bb2.getVal() + bb2.getError()); fexpup.setVal(fexp.getVal() + fexp.getError()); mdown.setVal(m.getVal() - m.getError()); cout << "mdown = " << mdown.getVal() << endl; ndown.setVal(n.getVal() - n.getError()); n2down.setVal(n2.getVal() - n2.getError()); bbdown.setVal(bb.getVal() - bb.getError()); Tdown.setVal(T.getVal() - T.getError()); bb2down.setVal(bb2.getVal() - bb2.getError()); fexpdown.setVal(fexp.getVal() - fexp.getError()); rt3->plotOn(frame,LineColor(kBlue),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent)); hpull = frame->pullHist(); if (showErrorPDFs) { rt3up->plotOn(frame,LineColor(kRed),LineStyle(kDashed),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent)); rt3down->plotOn(frame,LineColor(kRed),LineStyle(kDashed),Normalization(rdh->sumEntries(),RooAbsReal::NumEvent)); } } double *ypulls = hpull->GetY(); unsigned int nBins = rdh->numEntries(); unsigned int nFullBins = 0; for (unsigned int i = 0; i < nBins; i++) { cout << "Pull of bin " << i << " = " << ypulls[i] << endl; if (fabs(ypulls[i]) < 5.0) chi2 += ypulls[i]*ypulls[i]; cout << "Partial chi2 = " << chi2 << endl; if (fabs(ypulls[i]) > 0.0001 && fabs(ypulls[i]) < 5.0) nFullBins++; } for (unsigned int i = 0; i < nBins; i++) { if (fabs(ypulls[i]) < 0.0001) ypulls[i] = 999.; hpull->SetPointError(i,0.,0.,0.,0.); } int nFitPar = fit->floatParsFinal().getSize() - 1; TCanvas can("can","The canvas",5.,5.,500.,900.); can.Divide(1,3); TLatex *t = new TLatex(); t->SetNDC(); t->SetTextAlign(22); t->SetTextSize(0.06); can.cd(1); gPad->SetBottomMargin(0.0); frame->Draw(); // gPad->SetLogy(); // Htest->Draw(); sprintf(fileToSave,"%s %d GeV at %d TeV",nameSample[whichtype].c_str(),mass,LHCsqrts); t->DrawLatex(0.6,0.8,fileToSave); can.cd(2); gPad->SetLogy(); gPad->SetTopMargin(0.0); frame->Draw(); RooPlot* pull = ptoverm->frame(Title("Pull Distribution")) ; pull->GetYaxis()->SetTitle("Pull"); /* pull->SetLabelSize(0.08,"XYZ"); pull->SetTitleSize(0.08,"XYZ"); pull->SetTitleOffset(0.6,"Y"); pull->SetTitleOffset(1.0,"X"); */ pull->addPlotable(hpull,"P") ; pull->SetMinimum(-6.); pull->SetMaximum(6.); can.cd(3); gPad->SetGridy(); pull->Draw(); sprintf(fileToSave,"#chi^{2}/n_{DoF} = %4.1f/%d",chi2,nFullBins - nFitPar); if (chi2 < 1000.) t->DrawLatex(0.80,0.86,fileToSave); // sprintf(fileToSave,"figs/fitPTOverMCJLST_%s%d_%dTeV_%s.pdf",nameSample[whichtype].c_str(),mass,LHCsqrts,systString.c_str()); sprintf(fileToSave,"newfigs/fitPTOverMCJLST_%s%d_%dTeV_%s.pdf",nameSample[whichtype].c_str(),mass,LHCsqrts,systString.c_str()); can.SaveAs(fileToSave); }
void PrepareWorkSpace() { gROOT->SetStyle("Plain"); TFile *f_MMMM_a=new TFile("PreselectedWithoutRegression/LMRSelection_chi2/Histograms_Data_BTagCSV_2015_Skim.root"); f_MMMM_a->cd(); RooRealVar *x; x=new RooRealVar("x", "m_{X} (GeV)", SR_lo, SR_hi); std::cout<<" = MMMM Background Prediction ==== "<<std::endl; TH1F *h_mMMMMa_3Tag_CR24=(TH1F*)f_MMMM_a->Get("h_mX_SB_kinFit"); TH1F *h_mMMMMa_3Tag_SR; h_mMMMMa_3Tag_SR=(TH1F*)f_MMMM_a->Get("h_mX_SR_kinFit"); h_mMMMMa_3Tag_CR24->SetLineColor(kBlue); h_mMMMMa_3Tag_SR->SetLineColor(kBlue); TH1F *h_mMMMMa_3Tag_SR_Prediction=(TH1F*)h_mMMMMa_3Tag_CR24->Clone("h_mMMMMa_3Tag_SR_Prediction"); double aC=h_mMMMMa_3Tag_CR24->Integral(h_mMMMMa_3Tag_CR24->FindBin(SR_lo), h_mMMMMa_3Tag_CR24->FindBin(SR_hi)); std::cout<<" asd "<<std::endl; RooRealVar bg_p0("bg_p0", "bg_p0", 250., 350.); RooRealVar bg_p1("bg_p1", "bg_p1", 1., 50.1); RooRealVar bg_p2("bg_p2", "bg_p2", 0.1, 0.7); GaussExp bg("bg", "Background Prediction PDF", *x, bg_p0, bg_p1, bg_p2); RooDataHist pred("pred", "Prediction from SB", RooArgList(*x), h_mMMMMa_3Tag_SR_Prediction); bg.fitTo(pred, RooFit::Range(SR_lo, SR_hi),RooFit::SumW2Error(kTRUE)); RooPlot *aC_plot=x->frame(); pred.plotOn(aC_plot, RooFit::LineColor(kRed), RooFit::MarkerColor(kRed)); bg.plotOn(aC_plot, RooFit::LineColor(kRed)); TCanvas *c_rooFit=new TCanvas("c_rooFit", "c_rooFit", 1000, 700); if (tags!="MMMM") h_mMMMMa_3Tag_CR24->Draw("Ep9 SAME"); aC_plot->Draw(); std::cout<<" --------------------- Building Envelope --------------------- "<<std::endl; std::cout<< " bg_p0 "<<bg_p0.getVal() << " err "<<bg_p0.getError()<<std::endl; std::cout<< " bg_p1 "<<bg_p1.getVal() << " err "<<bg_p1.getError()<<std::endl; std::cout<< " bg_p2 "<<bg_p2.getVal() << " err "<<bg_p2.getError()<<std::endl; std::string point[5]={"260","270","300","400","600"}; ///// keep ttbar double totalLuminosity=2190; // /pb /* double xsec_ttbar_fulllept=24.56; double xsec_ttbar_semilept=103.12; double xsec_ttbar_hadronic=106.32; TFile *ttbar_fulllept=new TFile("MMMM_nominal/a_KinFit/Histograms_DiJetPt_TTJets_FullLeptMGDecays_8TeV-madgraph_selected.root"); TFile *ttbar_semilept=new TFile("MMMM_nominal/a_KinFit/Histograms_DiJetPt_TTJets_SemiLeptMGDecays_8TeV-madgraph_selected.root"); TFile *ttbar_hadronic=new TFile("MMMM_nominal/a_KinFit/Histograms_DiJetPt_TTJets_HadronicMGDecays_8TeV-madgraph_selected.root"); TFile *ttbar_fulllept_old=new TFile("/gpfs/ddn/cms/user/cvernier/H4b_step2/CMSSW_5_3_3_patch2/src/VHbbAnalysis/VHbbDataFormats/bin/DiJetPt_TTJets_FullLeptMGDecays_8TeV-madgraph.root"); TFile *ttbar_semilept_old=new TFile("/gpfs/ddn/cms/user/cvernier/H4b_step2/CMSSW_5_3_3_patch2/src/VHbbAnalysis/VHbbDataFormats/bin/DiJetPt_TTJets_SemiLeptMGDecays_8TeV-madgraph.root"); TFile *ttbar_hadronic_old=new TFile("/gpfs/ddn/cms/user/cvernier/H4b_step2/CMSSW_5_3_3_patch2/src/VHbbAnalysis/VHbbDataFormats/bin/DiJetPt_TTJets_HadronicMGDecays_8TeV-madgraph.root"); TH1F *h_mX_SR_ttbar_fulllept=(TH1F*)ttbar_fulllept->Get("h_mX_SR"); TH1F *h_mX_SR_ttbar_semilept=(TH1F*)ttbar_semilept->Get("h_mX_SR"); TH1F *h_mX_SR_ttbar_hadronic=(TH1F*)ttbar_hadronic->Get("h_mX_SR"); double init_ttbar_fulllept=((TH1F*)ttbar_fulllept_old->Get("CountWithPU"))->GetBinContent(1); double init_ttbar_semilept=((TH1F*)ttbar_semilept_old->Get("CountWithPU"))->GetBinContent(1); double init_ttbar_hadronic=((TH1F*)ttbar_hadronic_old->Get("CountWithPU"))->GetBinContent(1); std::cout<<"init_ttbar_fulllept = "<<init_ttbar_fulllept<<std::endl; std::cout<<"init_ttbar_semilept = "<<init_ttbar_semilept<<std::endl; std::cout<<"init_ttbar_hadronic = "<<init_ttbar_hadronic<<std::endl; double scale_ttbar_fulllept=totalLuminosity*xsec_ttbar_fulllept/init_ttbar_fulllept; double scale_ttbar_semilept=totalLuminosity*xsec_ttbar_semilept/init_ttbar_semilept; double scale_ttbar_hadronic=totalLuminosity*xsec_ttbar_hadronic/init_ttbar_hadronic; h_mX_SR_ttbar_fulllept->Scale(scale_ttbar_fulllept); h_mX_SR_ttbar_semilept->Scale(scale_ttbar_semilept); h_mX_SR_ttbar_hadronic->Scale(scale_ttbar_hadronic); TH1F *h_mX_SR_ttbar=(TH1F*)h_mX_SR_ttbar_fulllept->Clone("h_mX_SR_ttbar"); h_mX_SR_ttbar->Add(h_mX_SR_ttbar_semilept); h_mX_SR_ttbar->Add(h_mX_SR_ttbar_hadronic); h_mX_SR_ttbar->Rebin(rebin); int bin1=h_mX_SR_ttbar->FindBin(SR_lo); int bin2=h_mX_SR_ttbar->FindBin(SR_hi)-1; // Print out the lnN systematics of normalization double ttbar=h_mX_SR_ttbar->Integral(bin1, bin2); std::cout<<"TT h_mX_SR_ttbar->Integral(bin1, bin2) = "<<h_mX_SR_ttbar->Integral(bin1, bin2)<<std::endl; */ for(int h=0; h<5;h++){ //std::cout<<"Background CR->SR Scale = "<<h_mX_SR->GetSumOfWeights()/h_mX_CR24->GetSumOfWeights()<<" num " << h_mX_SR->GetSumOfWeights()<<" den "<<h_mX_CR24->GetSumOfWeights()<< std::endl; std::string filename="PreselectedWithoutRegression/LMRSelection_chi2/Histograms_Graviton"+point[h]+"GeV.root"; TFile *signal=new TFile(filename.c_str()); //TFile *signal_old=new TFile(filename_old.c_str()); // Calculate nSignal events given production cross section, branching fractions and efficiency TH1F *h_CountWithPU=(TH1F*)signal->Get("Count"); double nSignal_init=h_CountWithPU->GetBinContent(1); double prodXsec_1[5]={0, 1., 2., 5., 10.}; // pb int num_toys =h_mMMMMa_3Tag_SR->Integral(h_mMMMMa_3Tag_SR->FindBin(SR_lo), h_mMMMMa_3Tag_SR->FindBin(SR_hi)-1); //GetSumOfWeights();///h_mX_CR24->GetSumOfWeights(); for(int n =1; n<2; n++){ for(int toy=0; toy<1; toy++){ TH1F *h_mX_SR_signal=(TH1F*)signal->Get("h_mX_SR_kinFit"); h_mX_SR_signal->Rebin(rebin); RooRealVar *sg_p0, *sg_p1, *sg_p2, *sg_p3, *sg_p7, *sg_p8; double rangeLo=-1, rangeHi=-1; if (point[h]=="270") { rangeLo=252, rangeHi=600.; sg_p0=new RooRealVar("sg_p0", "sg_p0", 260., 280.); sg_p1=new RooRealVar("sg_p1", "sg_p1", 2., 5.); sg_p2=new RooRealVar("sg_p2", "sg_p2", 10., 530.); sg_p3=new RooRealVar("sg_p3", "sg_p3", 10., 300.); sg_p8=new RooRealVar("sg_p8", "sg_p8", 0.5, 1.);/* sg_p0=new RooRealVar("sg_p0", "sg_p0", 260., 280.); sg_p1=new RooRealVar("sg_p1", "sg_p1", 1., 5.); sg_p2=new RooRealVar("sg_p2", "sg_p2", 10., 500.); sg_p3=new RooRealVar("sg_p3", "sg_p3", 10., 300.); sg_p8=new RooRealVar("sg_p8", "sg_p8", 0.5, 1.); */ } if (point[h]=="260") { rangeLo=252., rangeHi=630.; sg_p0=new RooRealVar("sg_p0", "sg_p0", 250., 270.); sg_p1=new RooRealVar("sg_p1", "sg_p1", 2., 6.); sg_p2=new RooRealVar("sg_p2", "sg_p2", 10., 590.); sg_p3=new RooRealVar("sg_p3", "sg_p3", 10., 300.); sg_p8=new RooRealVar("sg_p8", "sg_p8", 0.5, 1.); } if (point[h]=="600") { rangeLo=580., rangeHi=650.; sg_p0=new RooRealVar("sg_p0", "sg_p0", 580., 630.); sg_p1=new RooRealVar("sg_p1", "sg_p1", 7., 40.); sg_p2=new RooRealVar("sg_p2", "sg_p2", 500., 650.); sg_p3=new RooRealVar("sg_p3", "sg_p3", 10., 130.); sg_p8=new RooRealVar("sg_p8", "sg_p8", 0.7, 1.); } if (point[h]=="500") { rangeLo=300., rangeHi=600.; sg_p0=new RooRealVar("sg_p0", "sg_p0", 480., 520.); sg_p1=new RooRealVar("sg_p1", "sg_p1", 7., 18.); sg_p2=new RooRealVar("sg_p2", "sg_p2", 400., 590.); sg_p3=new RooRealVar("sg_p3", "sg_p3", 10., 100.); sg_p8=new RooRealVar("sg_p8", "sg_p8", 0., 1.); } if (point[h]=="350") { rangeLo=SR_lo, rangeHi=550.; sg_p0=new RooRealVar("sg_p0", "sg_p0", 320., 380.); sg_p1=new RooRealVar("sg_p1", "sg_p1", 5., 15.); sg_p2=new RooRealVar("sg_p2", "sg_p2", 330., 420.); sg_p3=new RooRealVar("sg_p3", "sg_p3", 10., 100.); sg_p8=new RooRealVar("sg_p8", "sg_p8", 0., 1.); } if (point[h]=="400") { rangeLo=300., rangeHi=600.; sg_p0=new RooRealVar("sg_p0", "sg_p0", 370., 430.); sg_p1=new RooRealVar("sg_p1", "sg_p1", 3., 15.); sg_p2=new RooRealVar("sg_p2", "sg_p2", 370.,460.); sg_p3=new RooRealVar("sg_p3", "sg_p3", 10., 100.); sg_p8=new RooRealVar("sg_p8", "sg_p8", 0., 1.); } if (point[h]=="450") { rangeLo=300., rangeHi=600.; sg_p0=new RooRealVar("sg_p0", "sg_p0", 420., 480.); sg_p1=new RooRealVar("sg_p1", "sg_p1", 3., 15.); sg_p2=new RooRealVar("sg_p2", "sg_p2", 410., 490.); sg_p3=new RooRealVar("sg_p3", "sg_p3", 10., 100.); sg_p8=new RooRealVar("sg_p8", "sg_p8", 0., 1.); } if (point[h]=="300") { rangeLo=SR_lo, rangeHi=550.; sg_p0=new RooRealVar("sg_p0", "sg_p0", 290., 320.); sg_p1=new RooRealVar("sg_p1", "sg_p1", 5., 9.); sg_p2=new RooRealVar("sg_p2", "sg_p2", 250., 360.); sg_p3=new RooRealVar("sg_p3", "sg_p3", 10., 130.); sg_p8=new RooRealVar("sg_p8", "sg_p8", 0., 1.); } // x=new RooRealVar("x", "m_{X} (GeV)", 250, 900); int binning = (abs(SR_lo-SR_hi)/(rebin)); std::cout<<" binning "<<binning<<std::endl; x->setBins(binning); RooGaussian signalCore("signalCore", "Signal Prediction", *x, *sg_p0, *sg_p1); RooGaussian Cpolyn("Cpolyn", "Combinatoric", *x, *sg_p2, *sg_p3); RooAddPdf signal_("signal_", "signal", RooArgList(signalCore, Cpolyn), *sg_p8); RooDataHist signalHistogram("signalHistogram", "Signal Histogram", RooArgList(*x), h_mX_SR_signal); signal_.fitTo(signalHistogram, RooFit::Range(SR_lo,SR_hi), RooFit::Save(),RooFit::SumW2Error(kFALSE)); RooPlot *plot=x->frame(); //RooRealVar *signal_p0, *signal_p1, *signal_p2, *signal_p3, *signal_p7, *signal_p8; // signal_p0 = new RooRealVar("signal_p0", "signal_p0", sg_p0->getVal()); //signal_p1 = new RooRealVar("signal_p1", "signal_p1", sg_p1->getVal()); //signal_p2 = new RooRealVar("signal_p2", "signal_p2", sg_p2->getVal()); //signal_p3 = new RooRealVar("signal_p3", "signal_p3", sg_p3->getVal()); //signal_p8 = new RooRealVar("signal_p8", "signal_p8", sg_p8->getVal()); /* RooGaussian g1("g1", "Signal Prediction", *x, *sg_p0, *sg_p1); RooGaussian g2("g2", "Combinatoric", *x, *sg_p2,*sg_p3); RooAddPdf signal_bkg("signal_bkg", "signal_bkg", RooArgList(g1,g2), *sg_p8); RooRealVar * signal_bkg_norm; if(point[h]=="270") signal_bkg_norm= new RooRealVar("signal_bkg_norm","signal_bkg_norm", 0., -0.27, 0.27,""); if(point[h]=="300") signal_bkg_norm= new RooRealVar("signal_bkg_norm","signal_bkg_norm", 0., -0.55, 0.55,""); if(point[h]=="350") signal_bkg_norm= new RooRealVar("signal_bkg_norm","signal_bkg_norm", 0., -0.24, 0.24,""); if(point[h]=="400") signal_bkg_norm= new RooRealVar("signal_bkg_norm","signal_bkg_norm", 0., -0.09, 0.09,""); */ //sg_p8.setConstant(kTRUE); // sg_p2.setConstant(kTRUE); // sg_p3.setConstant(kTRUE); // sg_p1.setConstant(kTRUE); /* int toyy = toy; RooRandom::randomGenerator()->SetSeed(toyy); std::cout<< " n "<<prodXsec_1[n]*totalLuminosity/nSignal_init<<std::endl; std::cout<<h_mX_SR_signal->GetIntegral()<<" asd "<<std::endl; */ double ntoys_signal = h_mX_SR_signal->Integral(h_mX_SR_signal->FindBin(SR_lo),h_mX_SR_signal->FindBin(SR_hi)-1)*prodXsec_1[n]*totalLuminosity/nSignal_init; /*if(int(ntoys_signal*btagSF)>0) RooDataHist data_sig=*(signal_.generateBinned(*x, int(ntoys_signal*btagSF))); RooDataHist data_=*(bg.generateBinned(*x, num_toys, RooAbsData::Poisson)); if(int(ntoys_signal*btagSF)>0){ for (int i=0; i<data_sig->numEntries(); i++){ RooArgSet args = *((data_sig)->get(i)); float oldw = (data_sig)->store()->weight(i); data_->add(args,oldw); } } data_->SetName("obs"); data_->SetNameTitle("obs","obs"); TH1 * h_fake = data_->createHistogram("h_fake",*x,RooFit::Binning(133, SR_lo,SR_hi)); */ int num_toys =h_mMMMMa_3Tag_SR->Integral(h_mMMMMa_3Tag_SR->FindBin(SR_lo), h_mMMMMa_3Tag_SR->FindBin(SR_hi)-1); h_mMMMMa_3Tag_CR24->Scale(num_toys/aC); std::cout<<" warning: "<<h_mMMMMa_3Tag_CR24->Integral()<< " "<<h_mMMMMa_3Tag_SR->Integral()<<std::endl; RooDataHist obs("obs", "Data", RooArgList(*x), h_mMMMMa_3Tag_CR24); //RooPlot *plot=x->frame(); obs.plotOn(plot); TCanvas *c_data=new TCanvas("c_data", "c_data", 500, 500); std::cout<<point[h]<<" Datacard imax 1 number of channels"<<std::endl; std::cout<<point[h]<<" Datacard jmax * number of backgrounds"<<std::endl; std::cout<<point[h]<<" Datacard kmax * number of systematic uncertainty sources"<<std::endl; std::cout<<point[h]<<" Datacard ----------"<<std::endl; std::cout<<point[h]<<" Datacard shapes signal_ HbbHbb w_data_LowMass"<<point[h]<<".root HbbHbb:signal_"<<std::endl; std::cout<<point[h]<<" Datacard shapes background HbbHbb w_data_LowMass"<<point[h]<<".root HbbHbb:bg"<<std::endl; std::cout<<point[h]<<" Datacard shapes data_obs HbbHbb w_data_LowMass"<<point[h]<<".root HbbHbb:obs"<<std::endl; //std::cout<<point[h]<<" Datacard shapes ttbar HbbHbb w_data_LowMass"<<point[h]<<".root HbbHbb:ttbar"<<std::endl; //std::cout<<point[h]<<" Datacard shapes signal_bkg HbbHbb w_data_LowMass"<<point[h]<<".root HbbHbb:signal_bkg"<<std::endl; std::cout<<point[h]<<" Datacard ----------"<<std::endl; std::cout<<point[h]<<" Datacard ## Observation"<<std::endl; std::cout<<point[h]<<" Datacard bin HbbHbb"<<std::endl; std::cout<<point[h]<<" Datacard observation -1"<<std::endl; std::cout<<point[h]<<" Datacard ----------"<<std::endl; std::cout<<point[h]<<" Datacard bin HbbHbb HbbHbb"<<std::endl; std::cout<<point[h]<<" Datacard process signal_ background"<<std::endl; std::cout<<point[h]<<" Datacard process 0 1"<<std::endl; std::cout<<point[h]<<" Datacard rate "<<ntoys_signal*btagSF<<" "<<num_toys<<std::endl; std::cout<<point[h]<<" Datacard lumi lnN 1.046 - "<<std::endl; /*std::cout<<point[h]<<" Datacard JEC lnN "<<JEC/100.+1.<<" - 1.00018 -"<<std::endl; std::cout<<point[h]<<" Datacard JER lnN "<<JER/100.+1.<<" - 1.00843 -"<<std::endl; std::cout<<point[h]<<" Datacard trigSFpT lnN "<<trigSFpT/100.+1.<<" - 1.09135 -"<<std::endl; std::cout<<point[h]<<" Datacard trigSFCSV lnN "<<trigSFCSV/100.+1.<<" - 1.02758 -"<<std::endl; std::cout<<point[h]<<" Datacard ttbar_xsec lnN - - 1.15 -"<<std::endl; std::cout<<point[h]<<" Datacard bg_free lnU - 2.0 - -"<<std::endl; std::cout<<point[h]<<" Datacard btag lnN 1.1273 - 1.1273 -"<<std::endl; */ std::cout<<point[h]<< " Datacard sg_p0 param "<<sg_p0->getVal() << " "<<sg_p0->getError()<<std::endl; std::cout<<point[h]<< " Datacard sg_p1 param "<<sg_p1->getVal() << " "<<sg_p1->getError()<<std::endl; std::cout<<point[h]<< " Datacard sg_p2 param "<<sg_p2->getVal() << " "<<sg_p2->getError()<<std::endl; std::cout<<point[h]<< " Datacard sg_p3 param "<<sg_p3->getVal() << " "<<sg_p3->getError()<<std::endl; std::cout<<point[h]<< " Datacard sg_p8 param "<<sg_p8->getVal() << " "<<sg_p8->getError()<<std::endl; std::cout<<point[h]<< " Datacard bg_p0 param "<<bg_p0.getVal() << " "<<bg_p0.getError()<<std::endl; std::cout<<point[h]<< " Datacard bg_p1 param "<<bg_p1.getVal() << " "<<bg_p1.getError()<<std::endl; std::cout<<point[h]<< " Datacard bg_p2 param "<<bg_p2.getVal() << " "<<bg_p2.getError()<<std::endl; plot->Draw(""); // h_fake->Draw(""); stringstream ss, stoy;//create a stringstream ss << n;//prodXsec_1[n];//add number to the stream stoy<<toy; std::cout<<"mass = "<<point[h]<<std::endl; c_data->Print(("c_data_"+point[h]+"_"+ss.str()+".png").c_str()); std::cout<<" === === "<<std::endl; std::cout<<"chi^2/ndof of aC = "<<aC_plot->chiSquare()<<std::endl; std::cout<<" === === "<<std::endl; c_rooFit->SaveAs(("c_compareData_"+tags+"_SR_RooFit_GaussExp.png").c_str()); RooWorkspace *w=new RooWorkspace("HbbHbb"); // RooDataHist r_ttbar("ttbar", "ttbar", RooArgList(*x), h_mX_SR_ttbar); // Params par; // RooPlot *plotttbar=fitttbar(r_ttbar, kBlack, par, w); // std::cout<<"Datacard ttbar_p0 param "<<par.sg_p0<<" "<<par.sg_p0_err<<std::endl; // std::cout<<"Datacard ttbar_p1 param "<<par.sg_p1<<" "<<par.sg_p1_err<<std::endl; // std::cout<<"Datacard ttbar_p2 param "<<par.sg_p2<<" "<<par.sg_p2_err<<std::endl; w->import(bg); w->import(signal_); // w->import(signal_bkg); // w->import(*signal_bkg_norm); w->import(obs); w->SaveAs(("bias_study/w_data_LowMass"+point[h]+"_"+ss.str()+"_"+stoy.str()+".root").c_str()); } } } }
void doFit_asymptotic(int which = 2, int numCat = 5, /*double splitVal1 = 0.54, double splitVal2 = 0.92, double splitVal3 = 0.865, double splitVal4 = 0, double splitVal5 = 0.71,*/ /*double splitVal1 = 0.89, double splitVal2 = 0.72, double splitVal3 = 0.55, double splitVal4 = 0.05, double splitVal5 = -100,*/ double splitVal1 = 0.05, double splitVal2 = 0.55, double splitVal3 = 0.74, double splitVal4 = 0.89, double splitVal5 = -100, //TString fileName = "appOutput_SM_Oct14.root", //TString modelDir = "/afs/cern.ch/user/f/fabstoec/scratch0/optimizeMVACats/MVAmodel/" //TString fileName = "Tmva_AppOutput_SMDipho_2012Jan16_wrongBR.root", //TString fileName = "Tmva_AppOutput_SMDipho_2012Jan16.root", //TString fileName = "Tmva_AppOutput_SMDipho_2012Jan16_NewVBF.root", //TString fileName = "Tmva_AppOutput_SMDipho_2012Jan16_NewVBF_CorrScaleFactor.root", TString fileName = "Tmva_AppOutput_SMDipho_2012Jan16_NewVBF_120.root ", TString modelDir = "/afs/cern.ch/user/m/mingyang/optimizeMVACats/MVAmodel/" ) { if(numCat > 6) return;//set maximum number of categories //===============1.remove the printout from roofit========================= RooMsgService::instance().setSilentMode(true); RooMsgService::instance().getStream(1).removeTopic(RooFit::Caching); RooMsgService::instance().getStream(0).removeTopic(RooFit::Minimization); RooMsgService::instance().getStream(1).removeTopic(RooFit::Minimization); RooMsgService::instance().getStream(0).removeTopic(RooFit::Plotting); RooMsgService::instance().getStream(1).removeTopic(RooFit::Plotting); RooMsgService::instance().getStream(1).removeTopic(RooFit::Fitting); RooMsgService::instance().getStream(0).removeTopic(RooFit::Eval); RooMsgService::instance().getStream(1).removeTopic(RooFit::Eval); //============2.define nonfit variables========================== //--------input file------------------- TString modelName = modelDir+fileName; //--------cross section----- double theXS = 1.0; double maxXS = 10.0; //--------the signal strength modifier range ------ double muMin = 0.; double muMax = maxXS/theXS; double theMu = 0.;//set the initial value of Mu to 0 (background only hypothesis) //--------parameters-------------------------------- double nsig; double nbgini; double nbg; double exp; double nbg_update; double exp_update; //--------set up category bourndary variables-------- int startCat = 0; int endCat = numCat+1; double* catVals = new double[numCat+1];//ming:array of mva category cut values double allVals[7];//ming:all the boundary values allVals[0] = splitVal1; allVals[1] = splitVal2; allVals[2] = splitVal3; allVals[3] = splitVal4; allVals[4] = splitVal5; //allVals[5] = 1.; //allVals[6] = -0.5; allVals[5] = 1.; allVals[6] = -1; double allValsSorted[7]; for(int i=0; i<7; ++i) {//make allValsSorted increase with the order allValsSorted[i]=allVals[i]; int tSpot = i; for(int j = i-1; j>=0; --j) { if(allValsSorted[j] > allValsSorted[tSpot]) { // switch double tempVal = allValsSorted[j]; allValsSorted[j] = allValsSorted[tSpot]; allValsSorted[tSpot] = tempVal; tSpot--; } else break; } } for(int i=6-numCat; i<=6; ++i) catVals[i-6+numCat] = allValsSorted[i];//catVals from -1 to 1 increase with the order //==========3.read in the input tree============== TFile* modFile = new TFile(modelName.Data()); TNtuple* tup = (TNtuple*) modFile->FindObjectAny("MITMVAtuple"); //============fit============= //-----------set the independent variable---------------- RooRealVar* mass = new RooRealVar("mass","",100.,180.); mass->setRange(100.,180.); mass->setBins(10000,"cache");//bins for numrical integration mass->setBins(320);//bins for fitting and plotting //-----------set the variable to make dataset------------- RooRealVar* weight = new RooRealVar("weight","",0.,100.); RooRealVar* proc = new RooRealVar("proc" ,"",0.,10.); RooRealVar* mva = new RooRealVar("mva" ,"",-10.,10.); RooRealVar* vbftag = new RooRealVar("vbftag" ,"",0.,1.); //----------prepare the dataset--------------------------- TString* dataNames = new TString[numCat+1]; TString* sigNames = new TString[numCat+1]; RooDataHist** sigCat = new RooDataHist*[numCat+1]; RooDataSet** dataCat = new RooDataSet*[numCat+1]; RooDataHist** dataHCat = new RooDataHist*[numCat+1]; TString baseCut = "mass > 100 && mass < 180 "; TString baseBG = baseCut + TString(" && proc > 3 && proc < 11");//MC background TString baseSIG = baseCut + TString(" && proc < 4 ");//MC signal TString baseObsData = baseCut + TString(" && proc==11");//obs data for count int* numObsData= new int[numCat+1]; //----------prepare the pdf------------------------------- //signal model RooAbsPdf** sigpdfcat_part1 = new RooAbsPdf*[numCat+1]; RooAbsPdf** sigpdfcat_part2 = new RooAbsPdf*[numCat+1]; RooAbsPdf** sigpdfcat = new RooAbsPdf*[numCat+1]; RooRealVar** sigMean_part1 = new RooRealVar*[numCat+1]; RooRealVar** sigWidth_part1 = new RooRealVar*[numCat+1]; RooRealVar** sigMean_part2 = new RooRealVar*[numCat+1]; RooRealVar** sigWidth_part2 = new RooRealVar*[numCat+1]; RooRealVar** sigRatio = new RooRealVar*[numCat+1]; double* nominalSignal = new double[numCat+1]; TH1D** sigH = new TH1D*[numCat+1];//ming:used to get nominalSignal and input to RooDataHist TH1D** ObsDataH = new TH1D*[numCat+1];//obs data for count //background model //exp RooExponential** bgpdfcat_exp = new RooExponential*[numCat+1]; RooRealVar** bgpdfval_exp = new RooRealVar*[numCat+1]; //bs RooBernstein** bgpdfcat_bs = new RooBernstein*[numCat+1]; RooConstVar* bgpdfval0_bs = new RooConstVar; RooRealVar** bgpdfval1_bs = new RooRealVar*[numCat+1]; RooRealVar** bgpdfval2_bs = new RooRealVar*[numCat+1]; RooRealVar** bgpdfval3_bs = new RooRealVar*[numCat+1]; RooRealVar** bgpdfval4_bs = new RooRealVar*[numCat+1]; //total model RooAddPdf** totpdfcat = new RooAddPdf*[numCat+1]; RooRealVar** nsigcat = new RooRealVar*[numCat+1]; RooRealVar** nbgcat = new RooRealVar*[numCat+1]; //----------nll for the mu given the dataset--------------- RooNLLVar** totNllExt = new RooNLLVar*[numCat+1];//total Nll //--------draw option------------------ /*bool drawSigModel = false; bool drawBkgModel = false; bool draw95CLlimitModel = false; bool drawcan = false;*/ bool drawSigModel = true; bool drawBkgModel = true; bool draw95CLlimitModel = true; bool drawcan = false; RooPlot** frame = new RooPlot*[20];//define an array of pointer;frame[i] is a pointer TCanvas* thisCan = new TCanvas("thisCan","MyCanvas",1200,(numCat+1)*300); TCanvas* extraCan = new TCanvas("extraCan","extraCan",800,600); thisCan->Divide(3,numCat+1); gStyle->SetMarkerSize(0.5); //---------count option------------------ bool enableCount = true; //============category boundaries=============== std::stringstream mvaCut; std::stringstream mvaCutLabel; TString SIGstring; TString BGstring; TString ObsDatastring; for(int i=0; i<numCat+1; ++i) { if(i!= numCat) { mvaCut.str(""); mvaCut << " && mva > "<<catVals[i]<<" && mva < "<<catVals[i+1];//cut values for cat i std::cout<<mvaCut.str().c_str()<<std::endl; mvaCutLabel.str(""); mvaCutLabel << " mva > "<<catVals[i]<<" && mva < "<<catVals[i+1];//cut values for cat i } if(i== numCat) { mvaCutLabel.str(""); mvaCutLabel << " Dijet-TAG "; } //-----obsData for count----- //read in the obsdata mass hist for category i std::stringstream pSS; pSS.str(""); pSS << "ObsDataH" <<i; ObsDataH[i] = new TH1D(pSS.str().c_str(),"",320,100.,180.);//0.25 GeV per bin TString theDrawString0 = TString("mass>>")+TString(pSS.str().c_str()); if(i!=numCat){ ObsDatastring = baseObsData+TString(mvaCut.str().c_str())+TString(" && vbftag==0"); } if(i==numCat){ ObsDatastring = baseObsData+TString(" && vbftag==1 && mva>0.05"); } extraCan->cd(); tup->Draw(theDrawString0.Data(),ObsDatastring.Data()); numObsData[i] = ObsDataH[i]->GetEntries();//number of events in the signal mass hist //-----signal model----- //read in the signal mass hist for category i pSS.str(""); pSS << "sigH" <<i; sigH[i] = new TH1D(pSS.str().c_str(),"",320,100.,180.);//0.25 GeV per bin TString theDrawString = TString("mass>>")+TString(pSS.str().c_str()); //TString SIGstring = TString("weight*(")+baseSIG+TString(mvaCut.str().c_str())+TString(")");//signal cut along with cat cut if(i!=numCat){ SIGstring = TString("weight*(")+baseSIG+TString(mvaCut.str().c_str())+TString(" && vbftag==0")+TString(")"); } if(i==numCat){ SIGstring = TString("weight*(")+baseSIG+TString(" && vbftag==1")+TString(" && mva>0.05")+TString(")"); } extraCan->cd(); tup->Draw(theDrawString.Data(),SIGstring.Data()); //sigH[i] = (TH1D*)gPad->GetPrimitive(pSS.str().c_str()); nominalSignal[i] = sigH[i]->GetSumOfWeights();//number of events in the signal mass hist //obtain the signal RooDataHist to be fit for category i pSS.str(""); pSS << "sigdata" << i; sigNames[i] = TString(pSS.str().c_str()); sigCat[i] = new RooDataHist( sigNames[i].Data(),"",*mass,sigH[i]);//hist used to extract signal model for category i //set fit parameter pSS.str(""); pSS << "nsigcat" << i; nsigcat[i] = new RooRealVar(pSS.str().c_str(),"",0.);//initialize number of signal events nsigcat[i]->setVal(nominalSignal[i]*theMu);//set nsigcat[i] to constant pSS.str(""); pSS<<"sigMean_part1"<<i; sigMean_part1[i] = new RooRealVar(pSS.str().c_str(),"",125.,100.,180.); sigMean_part1[i] ->removeRange(); pSS.str(""); pSS<<"sigWidth_part1"<<i; sigWidth_part1[i] = new RooRealVar(pSS.str().c_str(),"",1.5,-5.,5.); sigWidth_part1[i] ->removeRange(); pSS.str(""); pSS<<"sigMean_part2"<<i; sigMean_part2[i] = new RooRealVar(pSS.str().c_str(),"",125.,100.,180.); sigMean_part2[i] ->removeRange(); pSS.str(""); pSS<<"sigWidth_part2"<<i; sigWidth_part2[i] = new RooRealVar(pSS.str().c_str(),"",2.5,-5.,5.); sigWidth_part2[i] ->removeRange(); pSS.str(""); pSS<<"sigRatio"<<i; sigRatio[i] = new RooRealVar(pSS.str().c_str(),"",0.5,0.1,2.); sigRatio[i]->removeRange(); //signal pdf pSS.str(""); pSS << "sigpdfcat_part1" << i; sigpdfcat_part1[i] = new RooGaussian ( pSS.str().c_str(),"",*mass,*sigMean_part1[i],*sigWidth_part1[i]); pSS.str(""); pSS << "sigpdfcat_part2" << i; sigpdfcat_part2[i] = new RooGaussian ( pSS.str().c_str(),"",*mass,*sigMean_part2[i],*sigWidth_part2[i]); pSS.str(""); pSS << "sigpdfcat" << i; sigpdfcat[i] = new RooAddPdf(pSS.str().c_str(),"",*sigpdfcat_part1[i],*sigpdfcat_part2[i],*sigRatio[i]);//ratio*s1+(1-ratio)*s2 //fit sigpdfcat[i]->fitTo(*sigCat[i]); //fix signal model parameters sigMean_part1[i] ->setConstant(); sigWidth_part1[i] ->setConstant(); sigMean_part2[i] ->setConstant(); sigWidth_part2[i] ->setConstant(); sigRatio[i] ->setConstant(); if( drawSigModel ) { frame[3*i+1]= mass->frame(); pSS.str(""); pSS << "125 GeV Higgs MC and Model (5.089 fb-1) "; frame[3*i+1]->SetTitle(pSS.str().c_str()); sigCat[i]->plotOn(frame[3*i+1]); sigpdfcat[i]->plotOn(frame[3*i+1]); thisCan->cd(3*i+1); frame[3*i+1]->Draw(); TLatex* text1=new TLatex(3.5,23.5,mvaCutLabel.str().c_str()); text1->SetNDC(); text1->SetTextAlign(13); text1->SetX(0.4);//(0.940); text1->SetY(0.8); text1->SetTextFont(42); text1->SetTextSize(0.065);// dflt=28 text1->Draw(); std::stringstream NSigLabel; NSigLabel.str(""); NSigLabel <<"NSig = "<<nominalSignal[i]; printf("nsig:%d:\n",nominalSignal[i]); TLatex* text2=new TLatex(3.5,23.5,NSigLabel.str().c_str()); text2->SetNDC(); text2->SetTextAlign(13); text2->SetX(0.4);//(0.940); text2->SetY(0.7); text2->SetTextFont(42); text2->SetTextSize(0.065);// dflt=28 text2->Draw(); } //-----background model----- //obtain the backgroud RooDataHist to be fit for category i pSS.str(""); pSS << "data_cat" << i; dataNames[i] = TString(pSS.str().c_str()); if(i!=numCat){ BGstring = baseBG +TString(mvaCut.str().c_str())+TString(" && vbftag==0"); } if(i==numCat){ BGstring = baseBG +TString(" && vbftag==1"); } dataCat[i] = new RooDataSet (dataNames[i].Data(),"",tup,RooArgSet(*mass,*weight,*proc,*mva,*vbftag),BGstring.Data(), "weight");//MC bkg dataset used to extract background model for cat i //set fit parameter and pdf pSS.str(""); pSS << "nbgcat" << i; nbgini=dataCat[i]->sumEntries(); nbgcat[i] = new RooRealVar(pSS.str().c_str(),"",nbgini,0,50000);//number of background events;initial value total number of events in the mc background dataset nbgcat[i]->removeRange(); switch(which){ case 1: { pSS.str(""); pSS << "e" <<i; bgpdfval_exp[i] = new RooRealVar(pSS.str().c_str(),"",0.,-100.,100.);//exponet parameter bgpdfval_exp[i]->removeRange(); pSS.str(""); pSS << "bgpdfcat_exp" << i; bgpdfcat_exp[i] = new RooExponential(pSS.str().c_str(),"",*mass,*bgpdfval_exp[i]); bgpdfcat_exp[i]->fitTo(*dataCat[i]); if( drawBkgModel ) { frame[3*i+2]= mass->frame(); pSS.str(""); //pSS << "MC Bkg Data And Model 4thBSPol (5.089 fb-1) "<<mvaCut.str().c_str(); pSS << "MC Bkg Data And Model exp"; frame[3*i+2]->SetTitle(pSS.str().c_str()); dataCat[i]->plotOn(frame[3*i+2]); bgpdfcat_exp[i]->plotOn(frame[3*i+2]); thisCan->cd(3*i+2); frame[3*i+2]->Draw(); std::stringstream NBkgLabel; NBkgLabel.str(""); NBkgLabel <<"NBkg = "<<nbgini; TLatex* text3=new TLatex(3.5,23.5,NBkgLabel.str().c_str()); text3->SetNDC(); text3->SetTextAlign(13); text3->SetX(0.6);//(0.940); text3->SetY(0.7); text3->SetTextFont(42); text3->SetTextSize(0.065);// dflt=28 text3->Draw(); } //-----geneate asimov dataset from background model----- pSS.str(""); pSS << "dataHCat" << i; dataHCat[i] = bgpdfcat_exp[i]->generateBinned(*mass,dataCat[i]->sumEntries(),RooFit::Asimov(),RooFit::Name(pSS.str().c_str())); //---to get the total pdf--- pSS.str(""); pSS << "totpdfcat" <<i; totpdfcat[i] = new RooAddPdf(pSS.str().c_str(),"",RooArgList(*sigpdfcat[i],*bgpdfcat_exp[i]),RooArgList(*nsigcat[i],*nbgcat[i]));//build the sig plus bkg model totpdfcat[i]->fitTo(*dataHCat[i],RooFit::Extended(true)); break; } case 2: { pSS.str(""); pSS << "c0"; bgpdfval0_bs= new RooConstVar(pSS.str().c_str(),"",1.0);//exponet parameter pSS.str(""); pSS << "c1" <<i; bgpdfval1_bs[i] = new RooRealVar(pSS.str().c_str(),"",0.,0,10000.);//exponet parameter //bgpdfval1_bs[i]->removeRange(); pSS.str(""); pSS << "c2" <<i; bgpdfval2_bs[i] = new RooRealVar(pSS.str().c_str(),"",0.,0,10000.);//exponet parameter //bgpdfval2_bs[i]->removeRange(); pSS.str(""); pSS << "c3" <<i; bgpdfval3_bs[i] = new RooRealVar(pSS.str().c_str(),"",0.,0.,10000.);//exponet parameter //bgpdfval3_bs[i]->removeRange(); pSS.str(""); pSS << "c4" <<i; bgpdfval4_bs[i] = new RooRealVar(pSS.str().c_str(),"",0.,0.,10000.);//exponet parameter //bgpdfval4_bs[i]->removeRange(); pSS.str(""); pSS << "bgpdfcat_bs" << i; bgpdfcat_bs[i] = new RooBernstein(pSS.str().c_str(),"",*mass,RooArgList(*bgpdfval0_bs,*bgpdfval1_bs[i],*bgpdfval2_bs[i],*bgpdfval3_bs[i],*bgpdfval4_bs[i])); bgpdfcat_bs[i]->fitTo(*dataCat[i]); //draw the sig RooDataHist and sig model if( drawBkgModel ) { frame[3*i+2]= mass->frame(); pSS.str(""); //pSS << "MC Bkg Data And Model 4thBSPol (5.089 fb-1) "<<mvaCut.str().c_str(); pSS << "MC Bkg Data And Model 4thBSPol"; frame[3*i+2]->SetTitle(pSS.str().c_str()); dataCat[i]->plotOn(frame[3*i+2]); bgpdfcat_bs[i]->plotOn(frame[3*i+2]); thisCan->cd(3*i+2); frame[3*i+2]->Draw(); std::stringstream NBkgLabel; NBkgLabel.str(""); NBkgLabel <<"NBkg = "<<nbgini; TLatex* text3=new TLatex(3.5,23.5,NBkgLabel.str().c_str()); text3->SetNDC(); text3->SetTextAlign(13); text3->SetX(0.6);//(0.940); text3->SetY(0.7); text3->SetTextFont(42); text3->SetTextSize(0.065);// dflt=28 text3->Draw(); } //-----geneate asimov dataset from background model----- pSS.str(""); pSS << "dataHCat" << i; dataHCat[i] = bgpdfcat_bs[i]->generateBinned(*mass,dataCat[i]->sumEntries(),RooFit::Asimov(),RooFit::Name(pSS.str().c_str())); //---to get the total pdf--- pSS.str(""); pSS << "totpdfcat" <<i; totpdfcat[i] = new RooAddPdf(pSS.str().c_str(),"",RooArgList(*sigpdfcat[i],*bgpdfcat_bs[i]),RooArgList(*nsigcat[i],*nbgcat[i]));//build the sig plus bkg model totpdfcat[i]->fitTo(*dataHCat[i],RooFit::Extended(true)); break; } } totNllExt[i] = (RooNLLVar*) totpdfcat[i]->createNLL(*dataHCat[i],RooFit::Extended(true));//calculate nll for each category } // ===========95% C.L.upper limit on theMu=========== //-----NLL for background only model theMu=0----- double minNll = 0.; for(int i=startCat; i<endCat; ++i) minNll += totNllExt[i]->getVal();//ming:the total Nll for theMu=0 (background only hypothesis) std::cout<<" start = "<<minNll<<std::endl; //-----Target NLL for 95% C.L.upper limit on theMu----- //double cl = 0.95; double targetNll = minNll + 1.92 ; //0.5*pow(ROOT::Math::normal_quantile(1.-0.5*(1.-cl),1.0), 2.); //-----set the tolerance for the 95% C.L.upper limit on theMu----- double tRelAcc = 0.001; double tAbsAcc = 0.0005; //-----initial value for the eErr and theMu----- double rErr = 0.5*(muMax - muMin); theMu = 0.5*(muMax + muMin); //-----interate theMu till the rErr is less than either absolute value 0.0005 or the relative error 0.001 while ( rErr > std::max(tRelAcc * theMu, tAbsAcc) ) { double nextNll = 0.; for(int i=startCat; i<endCat; ++i) { nsigcat[i]->setVal(nominalSignal[i]*theMu);//update nsigcat with new theMu totpdfcat[i]->fitTo(*dataHCat[i],RooFit::Extended(true));//refit the totpdfcat with updated theMu nextNll += totNllExt[i]->getVal();//totNllExt update with the totpdfcat std::cout<<" for mu="<<theMu<<" nll = "<<nextNll<<" ( "<<targetNll<<" )"<<std::endl; } if(nextNll < targetNll) muMin = theMu; else muMax = theMu; rErr = 0.5*(muMax - muMin); theMu = 0.5*(muMax + muMin); } double tR_XS = theMu *theXS;//ming: the 95% C.L.limit on signal strength modifier double tR_Er = rErr *theXS;//ming: the error on the limit std::cout<<std::endl<<"95% C.L. Limit Mu="<<setprecision(5)<<" [ RES ] ( "<<tR_XS<<" +- "<<tR_Er<<" ) x sigma (FP/SM)"<<std::endl; std::stringstream label95Mu; label95Mu.str(""); label95Mu << "95% C.L. Limit Mu="<<setprecision(5)<<tR_XS<<" +- "<<tR_Er; if(draw95CLlimitModel){ for(int i=startCat; i<endCat; ++i) { frame[3*i+3]= mass->frame(); std::stringstream pSS; pSS.str(""); pSS << "Asimov Data and 95CL limit Mu Model"; frame[3*i+3]->SetTitle(pSS.str().c_str()); dataHCat[i]->plotOn(frame[3*i+3]); totpdfcat[i]->plotOn(frame[3*i+3]); thisCan->cd(3*i+3); frame[3*i+3]->Draw(); TLatex* text4=new TLatex(3.5,23.5,label95Mu.str().c_str()); text4->SetNDC(); text4->SetTextAlign(13); text4->SetX(0.2);//(0.940); text4->SetY(0.8); text4->SetTextFont(42); text4->SetTextSize(0.065);// dflt=28 text4->Draw(); } } if(drawcan){ std::stringstream CanName; CanName.str(""); CanName << "/afs/cern.ch/user/m/mingyang/optimizeMVACats/plot/"<<numCat<<"cat_95CLlimitMu_"<<setprecision(5)<<tR_XS<<".eps"; thisCan->SaveAs(CanName.str().c_str()); } for(int i=0; i<numCat+1; ++i){ if(enableCount){ printf("cat:%d NumObsData:%d\n",i,numObsData[i]); } } return; }
int main(){ system("mkdir -p plots"); RooMsgService::instance().setGlobalKillBelow(RooFit::ERROR); TFile *bkgFile = TFile::Open("comb_svn/hgg.inputbkgdata_8TeV_MVA.root"); TFile *sigFile = TFile::Open("comb_svn/hgg.inputsig_8TeV_nosplitVH_MVA.root"); RooWorkspace *bkgWS = (RooWorkspace*)bkgFile->Get("cms_hgg_workspace"); RooWorkspace *sigWS = (RooWorkspace*)sigFile->Get("wsig_8TeV"); RooRealVar *mass = (RooRealVar*)bkgWS->var("CMS_hgg_mass"); RooRealVar *mu = new RooRealVar("mu","mu",-5.,5.); mass->setBins(320); cout << mass->getBins() << endl; RooDataSet *dataAll; int firstCat=1; int lastCat=1; float mu_low=-1.; float mu_high=3.; float mu_step=0.01; vector<pair<double,TGraph*> > minNlltrack; for (int cat=firstCat; cat<=lastCat; cat++){ RooDataSet *data = (RooDataSet*)bkgWS->data(Form("data_mass_cat%d",cat)); if (cat==firstCat) dataAll = (RooDataSet*)data->Clone("data_mass_all"); else dataAll->append(*data); RooDataHist *dataBinned = new RooDataHist(Form("roohist_data_mass_cat%d",cat),Form("roohist_data_mass_cat%d",cat),RooArgSet(*mass),*data); RooDataSet *sigMC = (RooDataSet*)sigWS->data(Form("sig_mass_m125_cat%d",cat)); if (!dataBinned || !sigMC){ cerr << "ERROR -- one of data or signal is NULL" << endl; exit(1); } // Construct PDFs for this category using PdfModelBuilder PdfModelBuilder modelBuilder; modelBuilder.setObsVar(mass); modelBuilder.setSignalModifier(mu); // For Standard Analysis //if (cat>=0 && cat<=3) modelBuilder.addBkgPdf("Bernstein",5,Form("pol5_cat%d",cat)); //if (cat>=4 && cat<=5) modelBuilder.addBkgPdf("Bernstein",4,Form("pol4_cat%d",cat)); //if (cat>=6 && cat<=8) modelBuilder.addBkgPdf("Bernstein",3,Form("pol3_cat%d",cat)); // To Profile Multiple PDFs if (cat==0 || cat==1 || cat==2 || cat==3){ modelBuilder.addBkgPdf("Bernstein",4,Form("pol4_cat%d",cat)); modelBuilder.addBkgPdf("Bernstein",5,Form("pol5_cat%d",cat)); modelBuilder.addBkgPdf("Bernstein",6,Form("pol6_cat%d",cat)); /* modelBuilder.addBkgPdf("PowerLaw",1,Form("pow1_cat%d",cat)); modelBuilder.addBkgPdf("PowerLaw",3,Form("pow3_cat%d",cat)); modelBuilder.addBkgPdf("PowerLaw",5,Form("pow5_cat%d",cat)); modelBuilder.addBkgPdf("Exponential",1,Form("exp1_cat%d",cat)); modelBuilder.addBkgPdf("Exponential",3,Form("exp3_cat%d",cat)); modelBuilder.addBkgPdf("Exponential",5,Form("exp5_cat%d",cat)); modelBuilder.addBkgPdf("Laurent",1,Form("lau1_cat%d",cat)); modelBuilder.addBkgPdf("Laurent",3,Form("lau3_cat%d",cat)); modelBuilder.addBkgPdf("Laurent",5,Form("lau5_cat%d",cat)); */ } if (cat==4 || cat==5 || cat==6 || cat==7 || cat==8) { modelBuilder.addBkgPdf("Bernstein",3,Form("pol3_cat%d",cat)); modelBuilder.addBkgPdf("Bernstein",4,Form("pol4_cat%d",cat)); /* modelBuilder.addBkgPdf("PowerLaw",1,Form("pow1_cat%d",cat)); modelBuilder.addBkgPdf("PowerLaw",3,Form("pow3_cat%d",cat)); modelBuilder.addBkgPdf("Exponential",1,Form("exp1_cat%d",cat)); modelBuilder.addBkgPdf("Exponential",3,Form("exp3_cat%d",cat)); modelBuilder.addBkgPdf("Laurent",1,Form("lau1_cat%d",cat)); modelBuilder.addBkgPdf("Laurent",3,Form("lau3_cat%d",cat)); */ } map<string,RooAbsPdf*> bkgPdfs = modelBuilder.getBkgPdfs(); modelBuilder.setSignalPdfFromMC(sigMC); modelBuilder.makeSBPdfs(); map<string,RooAbsPdf*> sbPdfs = modelBuilder.getSBPdfs(); modelBuilder.fitToData(dataBinned,true,true); modelBuilder.fitToData(dataBinned,false,true); modelBuilder.throwToy(Form("cat%d_toy0",cat),dataBinned->sumEntries(),true,true); // Profile this category using ProfileMultiplePdfs ProfileMultiplePdfs profiler; for (map<string,RooAbsPdf*>::iterator pdf=sbPdfs.begin(); pdf!=sbPdfs.end(); pdf++) { string bkgOnlyName = pdf->first.substr(pdf->first.find("sb_")+3,string::npos); if (bkgPdfs.find(bkgOnlyName)==bkgPdfs.end()){ cerr << "ERROR -- couldn't find bkg only pdf " << bkgOnlyName << " for SB pdf " << pdf->first << endl; pdf->second->fitTo(*dataBinned); exit(1); } int nParams = bkgPdfs[bkgOnlyName]->getVariables()->getSize()-1; profiler.addPdf(pdf->second,2*nParams); //profiler.addPdf(pdf->second); cout << pdf->second->GetName() << " nParams=" << pdf->second->getVariables()->getSize() << " nBkgParams=" << nParams << endl; } profiler.printPdfs(); //cout << "Continue?" << endl; //string bus; cin >> bus; profiler.plotNominalFits(dataBinned,mass,80,Form("cat%d",cat)); pair<double,map<string,TGraph*> > minNlls = profiler.profileLikelihood(dataBinned,mass,mu,mu_low,mu_high,mu_step); pair<double,map<string,TGraph*> > correctedNlls = profiler.computeEnvelope(minNlls,Form("cat%d",cat),2.); minNlltrack.push_back(make_pair(correctedNlls.first,correctedNlls.second["envelope"])); //minNlls.second.insert(pair<string,TGraph*>("envelope",envelopeNll.second)); //map<string,TGraph*> minNLLs = profiler.profileLikelihoodEnvelope(dataBinned,mu,mu_low,mu_high,mu_step); profiler.plot(correctedNlls.second,Form("cat%d_nlls",cat)); //profiler.print(minNLLs,mu_low,mu_high,mu_step); /* if (minNLLs.find("envelope")==minNLLs.end()){ cerr << "ERROR -- envelope TGraph not found in minNLLs" << endl; exit(1); } */ //minNlltrack.push_back(make_pair(profiler.getGlobalMinNLL(),minNLLs["envelope"])); } //exit(1); TGraph *comb = new TGraph(); for (vector<pair<double,TGraph*> >::iterator it=minNlltrack.begin(); it!=minNlltrack.end(); it++){ if (it->second->GetN()!=minNlltrack.begin()->second->GetN()){ cerr << "ERROR -- unequal number of points for TGraphs " << it->second->GetName() << " and " << minNlltrack.begin()->second->GetName() << endl; exit(1); } } for (int p=0; p<minNlltrack.begin()->second->GetN(); p++){ double x,y,sumy=0; for (vector<pair<double,TGraph*> >::iterator it=minNlltrack.begin(); it!=minNlltrack.end(); it++){ it->second->GetPoint(p,x,y); sumy += (y+it->first); } comb->SetPoint(p,x,sumy); } pair<double,double> globalMin = getGraphMin(comb); for (int p=0; p<comb->GetN(); p++){ double x,y; comb->GetPoint(p,x,y); comb->SetPoint(p,x,y-globalMin.second); } vector<double> fitVal = getValsFromLikelihood(comb); cout << "Best fit.." << endl; cout << "\t mu = " << Form("%4.3f",fitVal[0]) << " +/- (1sig) = " << fitVal[2]-fitVal[0] << " / " << fitVal[0]-fitVal[1] << endl; cout << "\t " << " " << " +/- (2sig) = " << fitVal[4]-fitVal[0] << " / " << fitVal[0]-fitVal[3] << endl; cout << comb->Eval(fitVal[0]) << " " << comb->Eval(fitVal[1]) << " " << comb->Eval(fitVal[2]) << " " << comb->Eval(fitVal[3]) << " " << comb->Eval(fitVal[4]) << endl; double quadInterpVal = ProfileMultiplePdfs::quadInterpMinimum(comb); cout << "quadInterp: mu = " << quadInterpVal << endl; cout << "\t " << comb->Eval(quadInterpVal) << " " << comb->Eval(quadInterpVal-0.005) << " " << comb->Eval(quadInterpVal-0.01) << " " << comb->Eval(quadInterpVal+0.005) << " " << comb->Eval(quadInterpVal+0.01) << endl; comb->SetLineWidth(2); TCanvas *canv = new TCanvas(); comb->Draw("ALP"); canv->Print("plots/comb.pdf"); TFile *tempOut = new TFile("tempOut.root","RECREATE"); tempOut->cd(); comb->SetName("comb"); comb->Write(); tempOut->Close(); return 0; }
void eregtest_flextest(bool dobarrel, bool doele) { TString dirname = "/afs/cern.ch/work/b/bendavid/bare/eregtestoutalphafix2_float/"; gSystem->mkdir(dirname,true); gSystem->cd(dirname); TString fname; if (doele && dobarrel) fname = "wereg_ele_eb.root"; else if (doele && !dobarrel) fname = "wereg_ele_ee.root"; else if (!doele && dobarrel) fname = "wereg_ph_eb.root"; else if (!doele && !dobarrel) fname = "wereg_ph_ee.root"; //TString infile = TString::Format("/afs/cern.ch/work/b/bendavid/bare/eregAug10RCalphafixphiblind//%s",fname.Data()); TString infile = TString::Format("/data/bendavid/regflextesting/%s",fname.Data()); TFile *fws = TFile::Open(infile); RooWorkspace *ws = (RooWorkspace*)fws->Get("wereg"); //RooGBRFunction *func = static_cast<RooGBRFunction*>(ws->arg("func")); RooGBRTargetFlex *sigmeant = (RooGBRTargetFlex*)ws->function("sigmeant"); RooRealVar *tgtvar = ws->var("tgtvar"); //tgtvar->removeRange(); //tgtvar->setRange(0.98,1.02); RooRealVar *rawptvar = new RooRealVar("rawptvar","ph.scrawe/cosh(ph.eta)",1.); if (!dobarrel) rawptvar->SetTitle("(ph.scrawe+ph.scpse)/cosh(ph.eta)"); RooRealVar *rawevar = new RooRealVar("rawevar","ph.scrawe",1.); if (!dobarrel) rawevar->SetTitle("(ph.scrawe+ph.scpse)"); RooRealVar *nomevar = new RooRealVar("nomevar","ph.e",1.); RooArgList vars; vars.add(sigmeant->FuncVars()); vars.add(*tgtvar); vars.add(*rawptvar); vars.add(*rawevar); vars.add(*nomevar); RooArgList condvars; condvars.add(sigmeant->FuncVars()); RooRealVar weightvar("weightvar","",1.); TTree *dtree; if (doele) { TFile *fdin = TFile::Open("/data/bendavid/regTreesAug1/hgg-2013Final8TeV_reg_s12-zllm50-v7n_noskim.root"); TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterSingleInvert"); dtree = (TTree*)ddir->Get("hPhotonTreeSingle"); } else { TFile *fdin = TFile::Open("/data/bendavid/idTreesAug1/hgg-2013Final8TeV_ID_s12-h124gg-gf-v7n_noskim.root"); //TFile *fdin = TFile::Open("/data/bendavid/idTrees_7TeV_Sept17/hgg-2013Final7TeV_ID_s11-h125gg-gf-lv3_noskim.root"); TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterPreselNoSmear"); dtree = (TTree*)ddir->Get("hPhotonTreeSingle"); } // if (0) // { // // TFile *fdin = TFile::Open("/data/bendavid/8TeVFinalTreesSept17/hgg-2013Final8TeV_s12-diphoj-v7n_noskim.root"); // TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterPresel"); // dtree = (TTree*)ddir->Get("hPhotonTreeSingle"); // // } if (0) { TFile *fdin = TFile::Open("/data/bendavid/diphoTrees8TeVOct6/hgg-2013Final8TeV_s12-h123gg-gf-v7n_noskim.root"); TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterPreselNoSmear"); dtree = (TTree*)ddir->Get("hPhotonTreeSingle"); } // //TFile *fdin = TFile::Open("/home/mingyang/cms/hist/hgg-2013Moriond/merged/hgg-2013Moriond_s12-diphoj-3-v7a_noskim.root"); // //TFile *fdin = TFile::Open("root://eoscms.cern.ch//eos/cms/store/cmst3/user/bendavid/trainingtreesJul1/hgg-2013Final8TeV_s12-zllm50-v7n_noskim.root"); // TFile *fdin = TFile::Open("root://eoscms.cern.ch///eos/cms/store/cmst3/user/bendavid/idTreesAug1/hgg-2013Final8TeV_ID_s12-h124gg-gf-v7n_noskim.root"); // //TFile *fdin = TFile::Open("root://eoscms.cern.ch//eos/cms/store/cmst3/user/bendavid/regTreesAug1/hgg-2013Final8TeV_reg_s12-zllm50-v7n_noskim.root"); // //TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterSingleInvert"); // TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterPreselNoSmear"); // TTree *dtree = (TTree*)ddir->Get("hPhotonTreeSingle"); /* TFile *fdinsig = TFile::Open("/home/mingyang/cms/hist/hgg-2013Moriond/merged/hgg-2013Moriond_s12-h125gg-gf-v7a_noskim.root"); TDirectory *ddirsig = (TDirectory*)fdinsig->FindObjectAny("PhotonTreeWriterPreselNoSmear"); TTree *dtreesig = (TTree*)ddirsig->Get("hPhotonTreeSingle"); */ TCut selcut; if (dobarrel) { selcut = "ph.pt>25. && ph.isbarrel && ph.ispromptgen && abs(ph.sceta)>(-1.0)"; //selcut = "ph.pt>25. && ph.isbarrel && ph.ispromptgen && abs(ph.sceta)>(-1.0) && run==194533 && lumi==5 && evt==1400"; } else { selcut = "ph.pt>25 && !ph.isbarrel && ph.ispromptgen"; //selcut = "ph.pt>25 && !ph.isbarrel && ph.ispromptgen && run==194533 && lumi==5 && evt==1400"; } // TCut selcut = "ph.pt>25. && ph.isbarrel && ph.ispromptgen && abs(ph.sceta)<1.0"; //TCut selcut = "ph.pt>25. && ph.isbarrel && (ph.scrawe/ph.gene)>0. && (ph.scrawe/ph.gene)<2. && ph.ispromptgen"; //TCut selcut = "ph.pt>25. && ph.isbarrel && (ph.gene/ph.scrawe)>0. && (ph.gene/ph.scrawe)<2."; TCut selweight = "xsecweight(procidx)*puweight(numPU,procidx)"; TCut prescale10 = "(evt%10==0)"; TCut prescale10alt = "(evt%10==1)"; TCut prescale25 = "(evt%25==0)"; TCut prescale100 = "(evt%100==0)"; TCut prescale1000 = "(evt%1000==0)"; TCut evenevents = "(evt%2==0)"; TCut oddevents = "(evt%2==1)"; TCut prescale100alt = "(evt%100==1)"; TCut prescale1000alt = "(evt%1000==1)"; TCut prescale50alt = "(evt%50==1)"; //TCut oddevents = prescale100; if (doele) weightvar.SetTitle(prescale100alt*selcut); else weightvar.SetTitle(selcut); RooDataSet *hdata = RooTreeConvert::CreateDataSet("hdata",dtree,vars,weightvar); // for (int iev=0; iev<hdata->numEntries(); ++iev) { // const RooArgSet *dset = hdata->get(iev); // // condvars = *dset; // condvars.Print("V"); // // } //return; // if (doele) // weightvar.SetTitle(prescale100alt*selcut); // else // weightvar.SetTitle(selcut); //RooDataSet *hdatasmall = RooTreeConvert::CreateDataSet("hdatasmall",dtree,vars,weightvar); // const HybridGBRForestD *forest = func->Forest(); // for (unsigned int itgt=0; itgt<forest->Trees().size(); ++itgt) { // int ntrees = 0; // for (unsigned int itree = 0; itree<forest->Trees().at(itgt).size(); ++itree) { // if (forest->Trees()[itgt][itree].Responses().size()>1) ++ntrees; // } // printf("itgt = %i, ntrees = %i\n", int(itgt),ntrees); // } RooAbsPdf *sigpdf = ws->pdf("sigpdf"); RooRealVar *scetavar = ws->var("var_1"); RooAbsReal *sigmeanlim = ws->function("sigmeanlim"); RooAbsReal *sigwidthlim = ws->function("sigwidthlim"); RooAbsReal *signlim = ws->function("signlim"); RooAbsReal *sign2lim = ws->function("sign2lim"); RooAbsReal *alphalim = ws->function("sigalphalim"); RooAbsReal *alpha2lim = ws->function("sigalpha2lim"); //RooFormulaVar ecor("ecor","","1./(@0*@1)",RooArgList(*tgtvar,*sigmeanlim)); RooFormulaVar ecor("ecor","","@1/@0",RooArgList(*tgtvar,*sigmeanlim)); //RooFormulaVar ecor("ecor","","@0/@1",RooArgList(*tgtvar,*sigmeanlim)); //RooFormulaVar ecor("ecor","","exp(@1-@0)",RooArgList(*tgtvar,*sigmeanlim)); RooAbsReal *condnll = sigpdf->createNLL(*hdata,ConditionalObservables(sigmeant->FuncVars())); double condnllval = condnll->getVal(); //RooFormulaVar ecor("ecor","","@1/@0",RooArgList(*tgtvar,*sigmeanlim)); //RooFormulaVar ecor("ecor","","@0/@1",RooArgList(*tgtvar,*sigmeanlim)); //RooFormulaVar ecor("ecor","","@0",RooArgList(*tgtvar)); //RooRealVar *ecorvar = (RooRealVar*)hdata->addColumn(ecor); // ecorvar->setRange(0.,2.); // ecorvar->setBins(800); // RooFormulaVar raw("raw","","1./@0",RooArgList(*tgtvar)); // //RooRealVar *rawvar = (RooRealVar*)hdata->addColumn(raw); // rawvar->setRange(0.,2.); // rawvar->setBins(800); /* RooFormulaVar eraw("eraw","","@0",RooArgList(*tgtvar)); RooRealVar *erawvar = (RooRealVar*)hdatasig->addColumn(eraw); erawvar->setRange(0.,2.); erawvar->setBins(400); */ //RooFormulaVar ecor("ptcor","","@0/(@1)",RooArgList(*tgtvar,*sigmeanlim)); RooDataSet *hdataclone = new RooDataSet(*hdata,"hdataclone"); RooRealVar *ecorvar = (RooRealVar*)hdataclone->addColumn(ecor); RooRealVar *meanvar = (RooRealVar*)hdataclone->addColumn(*sigmeanlim); RooRealVar *widthvar = (RooRealVar*)hdataclone->addColumn(*sigwidthlim); RooRealVar *nvar = 0; if (signlim) nvar = (RooRealVar*)hdataclone->addColumn(*signlim); RooRealVar *n2var = 0; if (sign2lim) n2var = (RooRealVar*)hdataclone->addColumn(*sign2lim); RooRealVar *alphavar = 0;; if (alphalim) alphavar = (RooRealVar*)hdataclone->addColumn(*alphalim); RooRealVar *alpha2var = 0; if (alpha2lim) alpha2var = (RooRealVar*)hdataclone->addColumn(*alpha2lim); RooFormulaVar ecorfull("ecorfull","","@0*@1",RooArgList(*sigmeanlim,*rawevar)); RooRealVar *ecorfullvar = (RooRealVar*)hdataclone->addColumn(ecorfull); RooFormulaVar ediff("ediff","","(@0 - @1)/@1",RooArgList(*nomevar,ecorfull)); RooRealVar *ediffvar = (RooRealVar*)hdataclone->addColumn(ediff); RooFormulaVar fullerr("fullerr","","@0*@1",RooArgList(*ecorvar,*sigwidthlim)); RooRealVar *fullerrvar = (RooRealVar*)hdataclone->addColumn(fullerr); RooFormulaVar relerr("relerr","","@0/@1",RooArgList(*sigwidthlim,*sigmeanlim)); RooRealVar *relerrvar = (RooRealVar*)hdataclone->addColumn(relerr); ecorvar->setRange(0.,2.); ecorvar->setBins(800); RooFormulaVar raw("raw","","1./@0",RooArgList(*tgtvar)); //RooFormulaVar raw("raw","","exp(-@0)",RooArgList(*tgtvar)); RooRealVar *rawvar = (RooRealVar*)hdataclone->addColumn(raw); rawvar->setRange(0.,2.); rawvar->setBins(800); RooNormPdf sigpdfpeaknorm("sigpdfpeaknorm","",*sigpdf,*tgtvar); RooRealVar *sigpdfpeaknormvar = (RooRealVar*)hdataclone->addColumn(sigpdfpeaknorm); RooFormulaVar equivsigma("equivsigma","","@0/sqrt(2.0*TMath::Pi())/@1",RooArgList(sigpdfpeaknorm,*sigmeanlim)); RooRealVar *equivsigmavar = (RooRealVar*)hdataclone->addColumn(equivsigma); // for (int iev=0; iev<hdataclone->numEntries(); ++iev) { // const RooArgSet *dset = hdataclone->get(iev); // // //condvars = *dset; // //condvars.Print("V"); // dset->Print("V"); // } // // return; //hdataclone = (RooDataSet*)hdataclone->reduce("(rawptvar/sigmeanlim)>45."); //hdataclone = (RooDataSet*)hdataclone->reduce("relerr>0.1"); // hdataclone = (RooDataSet*)hdataclone->reduce("sigwidthlim>0.017"); // RooLinearVar *tgtscaled = (RooLinearVar*)ws->function("tgtscaled"); // // TCanvas *ccor = new TCanvas; // //RooPlot *plot = tgtvar->frame(0.6,1.2,100); // RooPlot *plotcor = tgtscaled->frame(0.6,2.0,100); // hdataclone->plotOn(plotcor); // sigpdf->plotOn(plotcor,ProjWData(*hdataclone)); // plotcor->Draw(); // ccor->SaveAs("CorE.eps"); // ccor->SetLogy(); // plotcor->SetMinimum(0.1); // ccor->SaveAs("CorElog.eps"); TCanvas *craw = new TCanvas; //RooPlot *plot = tgtvar->frame(0.6,1.2,100); RooPlot *plot = tgtvar->frame(0.8,1.4,400); //RooPlot *plot = tgtvar->frame(0.0,5.,400); //RooPlot *plot = tgtvar->frame(0.,5.,400); //RooPlot *plot = tgtvar->frame(-2.0,2.0,200); hdataclone->plotOn(plot); sigpdf->plotOn(plot,ProjWData(*hdataclone)); plot->Draw(); craw->SaveAs("RawE.eps"); craw->SetLogy(); plot->SetMinimum(0.1); craw->SaveAs("RawElog.eps"); /* new TCanvas; RooPlot *plotsig = tgtvar->frame(0.6,1.2,100); hdatasig->plotOn(plotsig); sigpdf.plotOn(plotsig,ProjWData(*hdatasig)); plotsig->Draw(); */ TCanvas *cmean = new TCanvas; RooPlot *plotmean = meanvar->frame(0.0,5.0,200); //RooPlot *plotmean = meanvar->frame(0.5,1.5,200); //RooPlot *plotmean = meanvar->frame(-1.0,1.0,200); hdataclone->plotOn(plotmean); plotmean->Draw(); cmean->SaveAs("mean.eps"); cmean->SetLogy(); plotmean->SetMinimum(0.1); TCanvas *cwidth = new TCanvas; RooPlot *plotwidth = widthvar->frame(0.,1.0,200); hdataclone->plotOn(plotwidth); plotwidth->Draw(); cwidth->SaveAs("width.eps"); cwidth->SetLogy(); plotwidth->SetMinimum(0.1); if (signlim) { TCanvas *cn = new TCanvas; RooPlot *plotn = nvar->frame(0.,20.,200); hdataclone->plotOn(plotn); plotn->Draw(); cn->SaveAs("n.eps"); TCanvas *cnwide = new TCanvas; RooPlot *plotnwide = nvar->frame(0.,2100.,200); hdataclone->plotOn(plotnwide); plotnwide->Draw(); cnwide->SaveAs("nwide.eps"); } if (sign2lim) { TCanvas *cn2 = new TCanvas; RooPlot *plotn2 = n2var->frame(0.,20.,200); hdataclone->plotOn(plotn2); plotn2->Draw(); cn2->SaveAs("n2.eps"); TCanvas *cn2wide = new TCanvas; RooPlot *plotn2wide = n2var->frame(0.,2100.,200); hdataclone->plotOn(plotn2wide); plotn2wide->Draw(); cn2wide->SaveAs("n2wide.eps"); } if (alphalim) { TCanvas *calpha = new TCanvas; RooPlot *plotalpha = alphavar->frame(0.,6.,200); hdataclone->plotOn(plotalpha); plotalpha->Draw(); calpha->SaveAs("alpha.eps"); calpha->SetLogy(); plotalpha->SetMinimum(0.1); } if (alpha2lim) { TCanvas *calpha2 = new TCanvas; RooPlot *plotalpha2 = alpha2var->frame(0.,6.,200); hdataclone->plotOn(plotalpha2); plotalpha2->Draw(); calpha2->SaveAs("alpha2.eps"); } TCanvas *ceta = new TCanvas; RooPlot *ploteta = scetavar->frame(-2.6,2.6,200); hdataclone->plotOn(ploteta); ploteta->Draw(); ceta->SaveAs("eta.eps"); //TH1 *heold = hdatasigtest->createHistogram("heold",testvar); //TH1 *heraw = hdata->createHistogram("heraw",*tgtvar,Binning(800,0.,2.)); TH1 *heraw = hdataclone->createHistogram("hraw",*rawvar,Binning(800,0.,2.)); TH1 *hecor = hdataclone->createHistogram("hecor",*ecorvar); //heold->SetLineColor(kRed); hecor->SetLineColor(kBlue); heraw->SetLineColor(kMagenta); hecor->GetXaxis()->SetRangeUser(0.6,1.2); //heold->GetXaxis()->SetRangeUser(0.6,1.2); TCanvas *cresponse = new TCanvas; hecor->Draw("HIST"); //heold->Draw("HISTSAME"); heraw->Draw("HISTSAME"); cresponse->SaveAs("response.eps"); cresponse->SetLogy(); cresponse->SaveAs("responselog.eps"); TCanvas *cpeakval = new TCanvas; RooPlot *plotpeak = sigpdfpeaknormvar->frame(0.,10.,100); hdataclone->plotOn(plotpeak); plotpeak->Draw(); TCanvas *cequivsigmaval = new TCanvas; RooPlot *plotequivsigma = equivsigmavar->frame(0.,0.04,100); hdataclone->plotOn(plotequivsigma); plotequivsigma->Draw(); TCanvas *cediff = new TCanvas; RooPlot *plotediff = ediffvar->frame(-0.01,0.01,100); hdataclone->plotOn(plotediff); plotediff->Draw(); printf("make fine histogram\n"); TH1 *hecorfine = hdataclone->createHistogram("hecorfine",*ecorvar,Binning(20e3,0.,2.)); printf("calc effsigma\n"); double effsigma = effSigma(hecorfine); printf("effsigma = %5f\n",effsigma); printf("condnll = %5f\n",condnllval); TFile *fhist = new TFile("hist.root","RECREATE"); fhist->WriteTObject(hecor); fhist->Close(); return; /* new TCanvas; RooPlot *ploteold = testvar.frame(0.6,1.2,100); hdatasigtest->plotOn(ploteold); ploteold->Draw(); new TCanvas; RooPlot *plotecor = ecorvar->frame(0.6,1.2,100); hdatasig->plotOn(plotecor); plotecor->Draw(); */ TH2 *profhist = (TH2*)hdataclone->createHistogram("relerrvsE",*ecorfullvar,Binning(50,0.,200.), YVar(*relerrvar,Binning(100,0.,0.05))); new TCanvas; profhist->Draw("COLZ"); new TCanvas; profhist->ProfileX()->Draw(); new TCanvas; profhist->ProfileY()->Draw(); TH2 *profhistequiv = (TH2*)hdataclone->createHistogram("equiverrvsE",*ecorfullvar,Binning(50,0.,200.), YVar(*equivsigmavar,Binning(100,0.,0.05))); new TCanvas; profhistequiv->Draw("COLZ"); new TCanvas; profhistequiv->ProfileX()->Draw(); new TCanvas; profhistequiv->ProfileY()->Draw(); }
void embeddedToysWithBackgDetEffects_1DKD(int nEvts=600, int nToys=3000, sample mySample = kScalar_fa3p5, bool bkg, bool sigFloating, int counter){ RooRealVar* kd = new RooRealVar("psMELA","psMELA",0,1); kd->setBins(1000); RooPlot* kdframe1 = kd->frame(); // 0- template TFile f1("KDdistribution_ps_analytical_detEff.root", "READ"); TH1F *h_KD_ps = (TH1F*)f1.Get("h_KD"); h_KD_ps->SetName("h_KD_ps"); RooDataHist rdh_KD_ps("rdh_KD_ps","rdh_KD_ps",RooArgList(*kd),h_KD_ps); RooHistPdf pdf_KD_ps("pdf_KD_ps","pdf_KD_ps",RooArgList(*kd),rdh_KD_ps); // 0+ template TFile f2("KDdistribution_sm_analytical_detEff.root", "READ"); TH1F *h_KD_sm = (TH1F*)f2.Get("h_KD"); h_KD_sm->SetName("h_KD_sm"); RooDataHist rdh_KD_sm("rdh_KD_sm","rdh_KD_sm",RooArgList(*kd),h_KD_sm); RooHistPdf pdf_KD_sm("pdf_KD_sm","pdf_KD_sm",RooArgList(*kd),rdh_KD_sm); // backg template TFile f3("KDdistribution_bkg_analytical_detEff.root", "READ"); TH1F *h_KD_bkg = (TH1F*)f3.Get("h_KD"); h_KD_bkg->SetName("h_KD_bkg"); RooDataHist rdh_KD_bkg("rdh_KD_bkg","rdh_KD_bkg",RooArgList(*kd),h_KD_bkg); RooHistPdf pdf_KD_bkg("pdf_KD_bkg","pdf_KD_bkg",RooArgList(*kd),rdh_KD_bkg); //Define signal model with 0+, 0- mixture RooRealVar rrv_fa3("fa3","fa3",0.5,0.,1.); //free parameter of the model RooFormulaVar rfv_fa3Obs("fa3obs","1/ (1 + (1/@0 - 1)*0.99433)",RooArgList(rrv_fa3)); RooAddPdf modelSignal("modelSignal","ps+sm",pdf_KD_ps,pdf_KD_sm,rfv_fa3Obs); rrv_fa3.setConstant(kFALSE); //Define signal+bakground model RooRealVar rrv_BoverTOT("BoverTOT","BoverTOT",1/(3.75+1),0.,10.); RooAddPdf model("model","background+modelSignal",pdf_KD_bkg,modelSignal,rrv_BoverTOT); if(sigFloating) rrv_BoverTOT.setConstant(kFALSE); else rrv_BoverTOT.setConstant(kTRUE); //Set the values of free parameters to compute pulls double fa3Val=-99; if (mySample == kScalar_fa3p0) fa3Val=0.; else if (mySample == kScalar_fa3p1) fa3Val=0.1; else if (mySample == kScalar_fa3p5 || mySample == kScalar_fa3p5phia390) fa3Val=0.5; else if (mySample == kScalar_fa3p25) fa3Val=0.25; else{ cout<<"fa3Val not correct!"<<endl; return 0; } double sigFracVal=1 - 1/(3.75+1); //Plot the models TCanvas* c = new TCanvas("modelPlot_detBkg","modelPlot_detBkg",400,400); rdh_KD_ps.plotOn(kdframe1,LineColor(kBlack),MarkerColor(kBlack)); pdf_KD_ps.plotOn(kdframe1,LineColor(kBlack),RooFit::Name("pseudo")); //rdh_KD_sm.plotOn(kdframe1,LineColor(kBlue),MarkColor(kBlue)); pdf_KD_sm.plotOn(kdframe1,LineColor(kBlue),RooFit::Name("SM")); //rdh_KD_bkg.plotOn(kdframe1,LineColor(kGreen),LineColor(kGreen)); pdf_KD_bkg.plotOn(kdframe1,LineColor(kGreen),RooFit::Name("bkg")); modelSignal.plotOn(kdframe1,LineColor(kRed),RooFit::Name("signal_fa3p5")); model.plotOn(kdframe1,LineColor(kOrange),RooFit::Name("signal+background")); TLegend *leg = new TLegend (0.7,0.6,0.95,0.8); leg->AddEntry(kdframe1->findObject("pseudo"),"0-","L"); leg->AddEntry(kdframe1->findObject("SM"),"0+","L"); leg->AddEntry(kdframe1->findObject("bkg"),"bkg","L"); leg->AddEntry(kdframe1->findObject("signal_fa3p5"),"signal fa3=0.5","L"); leg->AddEntry(kdframe1->findObject("signal+background"),"signal + bkg","L"); kdframe1->Draw(); leg->SetFillColor(kWhite); leg->Draw("same"); c->SaveAs("modelPlot_detBkg.eps"); c->SaveAs("modelPlot_detBkg.png"); //Load the trees into the datasets TChain* myChain = new TChain("SelectedTree"); myChain->Add(inputFileNames[mySample]); if(!myChain || myChain->GetEntries()<=0) { cout<<"error in the tree"<<endl; return 0; } RooDataSet* data = new RooDataSet("data","data",myChain,RooArgSet(*kd),""); TChain* myChain_bkg = new TChain("SelectedTree"); myChain_bkg->Add("samples/analyticalpsMELA/withResolution/pwgevents_mllCut10_smeared_withDiscriminants_2e2mu_cutDetector.root"); myChain_bkg->Add("samples/analyticalpsMELA/withResolution/pwgevents_mllCut4_wResolution_withDiscriminants_cutDetector.root"); if(!myChain_bkg || myChain_bkg->GetEntries()<=0) { cout<<"error in the tree"<<endl; return 0; } RooDataSet* data_bkg = new RooDataSet("data_bkg","data_bkg",myChain_bkg,RooArgSet(*kd),""); cout << "Number of events in data sig: " << data->numEntries() << endl; cout << "Number of events in data bkg: " << data_bkg->numEntries() << endl; // Initialize tree to save toys to TTree* results = new TTree("results","toy results"); double fa3,fa3Error, fa3Pull; double sigFrac,sigFracError, sigFracPull; double significance; results->Branch("fa3",&fa3,"fa3/D"); results->Branch("fa3Error",&fa3Error,"fa3Error/D"); results->Branch("fa3Pull",&fa3Pull,"fa3Pull/D"); results->Branch("sigFrac",&sigFrac,"sigFrac/D"); results->Branch("sigFracError",&sigFracError,"sigFracError/D"); results->Branch("sigFracPull",&sigFracPull,"sigFracPull/D"); results->Branch("significance",&significance,"significance/D"); //--------------------------------- RooDataSet* toyData; RooDataSet* toyData_bkgOnly; int embedTracker=nEvts*counter; int embedTracker_bkg=TMath::Ceil(nEvts/3.75*counter); RooArgSet *tempEvent; RooFitResult *toyfitresults; RooFitResult *toyfitresults_sigBkg; RooFitResult *toyfitresults_bkgOnly; RooRealVar *r_fa3; RooRealVar *r_sigFrac; for(int i = 0 ; i<nToys ; i++){ cout <<i<<"<-----------------------------"<<endl; //if(toyData) delete toyData; toyData = new RooDataSet("toyData","toyData",RooArgSet(*kd)); toyData_bkgOnly = new RooDataSet("toyData_bkgOnly","toyData_bkgOnly",RooArgSet(*kd)); if(nEvts+embedTracker > data->sumEntries()){ cout << "Playground::generate() - ERROR!!! Playground::data does not have enough events to fill toy!!!! bye :) " << endl; toyData = NULL; abort(); return 0; } if(nEvts+embedTracker_bkg > data_bkg->sumEntries()){ cout << "Playground::generate() - ERROR!!! Playground::data does not have enough events to fill toy!!!! bye :) " << endl; toyData = NULL; abort(); return 0; } for(int iEvent=0; iEvent<nEvts; iEvent++){ if(iEvent==1) cout << "generating event: " << iEvent << " embedTracker: " << embedTracker << endl; tempEvent = (RooArgSet*) data->get(embedTracker); toyData->add(*tempEvent); embedTracker++; } if(bkg){ for(int iEvent=0; iEvent<nEvts/3.75; iEvent++){ if(iEvent==1) cout << "generating bkg event: " << iEvent << " embedTracker bkg: " << embedTracker_bkg << endl; tempEvent = (RooArgSet*) data_bkg->get(embedTracker_bkg); toyData->add(*tempEvent); toyData_bkgOnly->add(*tempEvent); embedTracker_bkg++; } } if(bkg) toyfitresults =model.fitTo(*toyData,Save()); else toyfitresults =modelSignal.fitTo(*toyData,Save()); //cout<<toyfitresults<<endl; r_fa3 = (RooRealVar *) toyfitresults->floatParsFinal().find("fa3"); fa3 = r_fa3->getVal(); fa3Error = r_fa3->getError(); fa3Pull = (r_fa3->getVal() - fa3Val) / r_fa3->getError(); if(sigFloating){ r_sigFrac = (RooRealVar *) toyfitresults->floatParsFinal().find("BoverTOT"); sigFrac = 1-r_sigFrac->getVal(); sigFracError = r_sigFrac->getError(); sigFracPull = (1-r_sigFrac->getVal() - sigFracVal) / r_sigFrac->getError(); } // fill TTree results->Fill(); } char nEvtsString[100]; sprintf(nEvtsString,"_%iEvts_%iiter",nEvts, counter); // write tree to output file (ouputFileName set at top) TFile *outputFile = new TFile("embeddedToys1DKD_fa3Corr_WithBackgDetEffects_"+sampleName[mySample]+nEvtsString+".root","RECREATE"); results->Write(); outputFile->Close(); }
void runSigSepWWSingle(int higgsMass, double intLumi, int nToys, const TestType test, int var, int toy, bool draw, const unsigned int seed) { // location of data // for ucsd batch submission const char *dataLocation = "root://xrootd.unl.edu//store/user/yygao/HWWAngular/datafiles/"; // for local tests // const char *dataLocation = "datafiles/"; // // set up test kind // TString testName = getTestName(test); TString varName = getVarName(var); TString toyName = getToyName(toy); std::cout << "Doing " << toyName << " studies on " << testName << " separation based on " << varName << "\n"; double lowMt(0.); double highMt = higgsMass; double sigRate; double bkgRate; if(higgsMass==125){ sigRate = 13.0; bkgRate = 155.; }else{ cout << "HMMMM.... I don't know that mass point...BYE!" << endl; return; } RooRealVar* dphill = new RooRealVar("dphill","#Delta#phi(leptons) [radian]", 0, TMath::Pi()); dphill->setBins(20); RooRealVar* mt = new RooRealVar("mt","transverse higgs mass", 60, 130); mt->setBins(10); RooRealVar* mll = new RooRealVar("mll","dilepton mass [GeV]", 10, 90.); mll->setBins(10); RooArgSet* obs; if ( var == DPHI ) obs = new RooArgSet(*dphill) ; if ( var == MLL ) obs = new RooArgSet(*mll) ; if ( var == MLLMT ) obs = new RooArgSet(*mll, *mt) ; if ( var == DPHIMT ) obs = new RooArgSet(*dphill, *mt) ; // // read signal hypothesis 1 always SMHiggs // TChain *tsigHyp1 = new TChain("angles"); tsigHyp1->Add(Form("%s/%i/SMHiggsWW_%i_JHU.root", dataLocation, higgsMass, higgsMass)); RooDataSet *sigHyp1Data = new RooDataSet("sigHyp1Data","sigHyp1Data",tsigHyp1,*obs); RooDataHist *sigHyp1Hist = sigHyp1Data->binnedClone(0); RooHistPdf* sigHyp1Pdf = new RooHistPdf("sigHyp1Pdf", "sigHyp1Pdf", *obs, *sigHyp1Hist); // read signal hypothesis 2 TChain *tsigHyp2 = new TChain("angles"); TString secondhypName = getSecondHypInputName(test, float(higgsMass)); tsigHyp2->Add(Form("%s/%i/%s",dataLocation, higgsMass, secondhypName.Data())); std::cout << secondhypName << "\n"; RooDataSet *sigHyp2Data = new RooDataSet("sigHyp2Data","sigHyp2Data",tsigHyp2,*obs); RooDataHist *sigHyp2Hist = sigHyp2Data->binnedClone(0); RooHistPdf* sigHyp2Pdf = new RooHistPdf("sigHyp2Pdf", "sigHyp2Pdf", *obs, *sigHyp2Hist); // read background TChain *bkgTree = new TChain("angles"); bkgTree->Add(Form("%s/%i/WW_madgraph_8TeV_0j.root",dataLocation,higgsMass)); RooDataSet *bkgData = new RooDataSet("bkgData","bkgData",bkgTree,*obs); RooDataHist *bkgHist = bkgData->binnedClone(0); RooHistPdf* bkgPdf = new RooHistPdf("bkgPdf", "bkgPdf", *obs, *bkgHist); char statResults[50]; statsFactory *myHypothesisSeparation; sprintf(statResults,"stat_%s_%s_%s_%.0ffb_%u.root",testName.Data(), toyName.Data(), varName.Data(), intLumi, seed); printf(statResults); myHypothesisSeparation = new statsFactory(obs, sigHyp1Pdf, sigHyp2Pdf, seed, statResults); // running pure toys myHypothesisSeparation->hypothesisSeparationWithBackground(sigRate*intLumi,sigRate*intLumi,nToys,bkgPdf,bkgRate*intLumi); delete myHypothesisSeparation; std::cout << "deleted myHypothesisSeparation" << std::endl; // draw plots if(draw) { RooPlot* plot1; TString plot1Name; TCanvas* c1 = new TCanvas("c1","c1",400,400); if ( var == DPHIMT || var == DPHI) { plot1 = dphill->frame(); plot1Name = Form("MELAproj_%s_%s_%s_dphi", testName.Data(), toyName.Data(), varName.Data()); } if ( var == MLL || var == MLLMT) { plot1 = mll->frame(); plot1Name = Form("MELAproj_%s_%s_%s_mll", testName.Data(), toyName.Data(), varName.Data()); } bkgData->plotOn(plot1,MarkerColor(kBlack)); bkgPdf->plotOn(plot1, LineColor(kBlack), LineStyle(kDashed)); sigHyp1Data->plotOn(plot1,MarkerColor(kRed)); sigHyp1Pdf->plotOn(plot1,LineColor(kRed), LineStyle(kDashed)); sigHyp2Data->plotOn(plot1,MarkerColor(kBlue)); sigHyp2Pdf->plotOn(plot1,LineColor(kBlue), LineStyle(kDashed)); // draw... plot1->Draw(); c1->SaveAs(Form("plots/epsfiles/%s.eps", plot1Name.Data())); c1->SaveAs(Form("plots/pngfiles/%s.png", plot1Name.Data())); if ( var == DPHIMT || var == MLLMT ) { RooPlot* plot2 = mt->frame(); TString plot2Name; plot2Name = Form("MELAproj_%s_%s_%s_mt", testName.Data(), toyName.Data(), varName.Data()); bkgData->plotOn(plot2,MarkerColor(kBlack)); bkgPdf->plotOn(plot2, LineColor(kBlack), LineStyle(kDashed)); sigHyp1Data->plotOn(plot2,MarkerColor(kRed)); sigHyp1Pdf->plotOn(plot2,LineColor(kRed), LineStyle(kDashed)); sigHyp2Data->plotOn(plot2,MarkerColor(kBlue)); sigHyp2Pdf->plotOn(plot2,LineColor(kBlue), LineStyle(kDashed)); c1->Clear(); plot2->Draw(); c1->SaveAs(Form("plots/epsfiles/%s.eps", plot2Name.Data())); c1->SaveAs(Form("plots/pngfiles/%s.png", plot2Name.Data())); } delete c1; delete plot1; delete plot2; } // tidy up delete dphill; delete mt; delete mll; delete obs; delete tsigHyp1; delete sigHyp1Data; delete sigHyp1Pdf; delete tsigHyp2; delete sigHyp2Data; delete sigHyp2Pdf; delete bkgTree; delete bkgData; delete bkgPdf; delete myHypothesisSeparation; }
void eregtestingExample(bool dobarrel=true, bool doele=true) { //output dir TString dirname = "/data/bendavid/eregexampletest/eregexampletest_test/"; gSystem->mkdir(dirname,true); gSystem->cd(dirname); //read workspace from training TString fname; if (doele && dobarrel) fname = "wereg_ele_eb.root"; else if (doele && !dobarrel) fname = "wereg_ele_ee.root"; else if (!doele && dobarrel) fname = "wereg_ph_eb.root"; else if (!doele && !dobarrel) fname = "wereg_ph_ee.root"; TString infile = TString::Format("/data/bendavid/eregexampletest/%s",fname.Data()); TFile *fws = TFile::Open(infile); RooWorkspace *ws = (RooWorkspace*)fws->Get("wereg"); //read variables from workspace RooGBRTargetFlex *meantgt = static_cast<RooGBRTargetFlex*>(ws->arg("sigmeant")); RooRealVar *tgtvar = ws->var("tgtvar"); RooArgList vars; vars.add(meantgt->FuncVars()); vars.add(*tgtvar); //read testing dataset from TTree RooRealVar weightvar("weightvar","",1.); TTree *dtree; if (doele) { //TFile *fdin = TFile::Open("root://eoscms.cern.ch//eos/cms/store/cmst3/user/bendavid/regTreesAug1/hgg-2013Final8TeV_reg_s12-zllm50-v7n_noskim.root"); TFile *fdin = TFile::Open("/data/bendavid/regTreesAug1/hgg-2013Final8TeV_reg_s12-zllm50-v7n_noskim.root"); TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterSingleInvert"); dtree = (TTree*)ddir->Get("hPhotonTreeSingle"); } else { TFile *fdin = TFile::Open("root://eoscms.cern.ch///eos/cms/store/cmst3/user/bendavid/idTreesAug1/hgg-2013Final8TeV_ID_s12-h124gg-gf-v7n_noskim.root"); TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterPreselNoSmear"); dtree = (TTree*)ddir->Get("hPhotonTreeSingle"); } //selection cuts for testing TCut selcut; if (dobarrel) selcut = "ph.genpt>25. && ph.isbarrel && ph.ispromptgen"; else selcut = "ph.genpt>25. && !ph.isbarrel && ph.ispromptgen"; TCut selweight = "xsecweight(procidx)*puweight(numPU,procidx)"; TCut prescale10 = "(evt%10==0)"; TCut prescale10alt = "(evt%10==1)"; TCut prescale25 = "(evt%25==0)"; TCut prescale100 = "(evt%100==0)"; TCut prescale1000 = "(evt%1000==0)"; TCut evenevents = "(evt%2==0)"; TCut oddevents = "(evt%2==1)"; TCut prescale100alt = "(evt%100==1)"; TCut prescale1000alt = "(evt%1000==1)"; TCut prescale50alt = "(evt%50==1)"; if (doele) weightvar.SetTitle(prescale100alt*selcut); else weightvar.SetTitle(selcut); //make testing dataset RooDataSet *hdata = RooTreeConvert::CreateDataSet("hdata",dtree,vars,weightvar); if (doele) weightvar.SetTitle(prescale1000alt*selcut); else weightvar.SetTitle(prescale10alt*selcut); //make reduced testing dataset for integration over conditional variables RooDataSet *hdatasmall = RooTreeConvert::CreateDataSet("hdatasmall",dtree,vars,weightvar); //retrieve full pdf from workspace RooAbsPdf *sigpdf = ws->pdf("sigpdf"); //input variable corresponding to sceta RooRealVar *scetavar = ws->var("var_1"); //regressed output functions RooAbsReal *sigmeanlim = ws->function("sigmeanlim"); RooAbsReal *sigwidthlim = ws->function("sigwidthlim"); RooAbsReal *signlim = ws->function("signlim"); RooAbsReal *sign2lim = ws->function("sign2lim"); //formula for corrected energy/true energy ( 1.0/(etrue/eraw) * regression mean) RooFormulaVar ecor("ecor","","1./(@0)*@1",RooArgList(*tgtvar,*sigmeanlim)); RooRealVar *ecorvar = (RooRealVar*)hdata->addColumn(ecor); ecorvar->setRange(0.,2.); ecorvar->setBins(800); //formula for raw energy/true energy (1.0/(etrue/eraw)) RooFormulaVar raw("raw","","1./@0",RooArgList(*tgtvar)); RooRealVar *rawvar = (RooRealVar*)hdata->addColumn(raw); rawvar->setRange(0.,2.); rawvar->setBins(800); //clone data and add regression outputs for plotting RooDataSet *hdataclone = new RooDataSet(*hdata,"hdataclone"); RooRealVar *meanvar = (RooRealVar*)hdataclone->addColumn(*sigmeanlim); RooRealVar *widthvar = (RooRealVar*)hdataclone->addColumn(*sigwidthlim); RooRealVar *nvar = (RooRealVar*)hdataclone->addColumn(*signlim); RooRealVar *n2var = (RooRealVar*)hdataclone->addColumn(*sign2lim); //plot target variable and weighted regression prediction (using numerical integration over reduced testing dataset) TCanvas *craw = new TCanvas; //RooPlot *plot = tgtvar->frame(0.6,1.2,100); RooPlot *plot = tgtvar->frame(0.6,2.0,100); hdata->plotOn(plot); sigpdf->plotOn(plot,ProjWData(*hdatasmall)); plot->Draw(); craw->SaveAs("RawE.eps"); craw->SetLogy(); plot->SetMinimum(0.1); craw->SaveAs("RawElog.eps"); //plot distribution of regressed functions over testing dataset TCanvas *cmean = new TCanvas; RooPlot *plotmean = meanvar->frame(0.8,2.0,100); hdataclone->plotOn(plotmean); plotmean->Draw(); cmean->SaveAs("mean.eps"); TCanvas *cwidth = new TCanvas; RooPlot *plotwidth = widthvar->frame(0.,0.05,100); hdataclone->plotOn(plotwidth); plotwidth->Draw(); cwidth->SaveAs("width.eps"); TCanvas *cn = new TCanvas; RooPlot *plotn = nvar->frame(0.,111.,200); hdataclone->plotOn(plotn); plotn->Draw(); cn->SaveAs("n.eps"); TCanvas *cn2 = new TCanvas; RooPlot *plotn2 = n2var->frame(0.,111.,100); hdataclone->plotOn(plotn2); plotn2->Draw(); cn2->SaveAs("n2.eps"); TCanvas *ceta = new TCanvas; RooPlot *ploteta = scetavar->frame(-2.6,2.6,200); hdataclone->plotOn(ploteta); ploteta->Draw(); ceta->SaveAs("eta.eps"); //create histograms for eraw/etrue and ecor/etrue to quantify regression performance TH1 *heraw = hdata->createHistogram("hraw",*rawvar,Binning(800,0.,2.)); TH1 *hecor = hdata->createHistogram("hecor",*ecorvar); //heold->SetLineColor(kRed); hecor->SetLineColor(kBlue); heraw->SetLineColor(kMagenta); hecor->GetXaxis()->SetRangeUser(0.6,1.2); //heold->GetXaxis()->SetRangeUser(0.6,1.2); TCanvas *cresponse = new TCanvas; hecor->Draw("HIST"); //heold->Draw("HISTSAME"); heraw->Draw("HISTSAME"); cresponse->SaveAs("response.eps"); cresponse->SetLogy(); cresponse->SaveAs("responselog.eps"); printf("make fine histogram\n"); TH1 *hecorfine = hdata->createHistogram("hecorfine",*ecorvar,Binning(20e3,0.,2.)); printf("calc effsigma\n"); double effsigma = effSigma(hecorfine); printf("effsigma = %5f\n",effsigma); /* new TCanvas; RooPlot *ploteold = testvar.frame(0.6,1.2,100); hdatasigtest->plotOn(ploteold); ploteold->Draw(); new TCanvas; RooPlot *plotecor = ecorvar->frame(0.6,1.2,100); hdatasig->plotOn(plotecor); plotecor->Draw(); */ }
void plotPdf_7D_VWW(double mH=125) { gROOT->ProcessLine(".L tdrstyle.C"); setTDRStyle(); TGaxis::SetMaxDigits(3); gROOT->ForceStyle(); // Declaration of the PDFs to use gROOT->ProcessLine(".L PDFs/RooSpinOne_7D.cxx++"); // W/Z mass and decay width constants double mV = 80.399; double gamV = 2.085; bool offshell = false; if ( mH < 2 * mV ) offshell = true; // for the pole mass and decay width of W RooRealVar* mX = new RooRealVar("mX","mX", mH); RooRealVar* mW = new RooRealVar("mW","mW", mV); RooRealVar* gamW = new RooRealVar("gamW","gamW",gamV); // // Observables (7D) // RooRealVar* wplusmass = new RooRealVar("wplusmass","m(W+)",mV,1e-09,120); wplusmass->setBins(50); RooRealVar* wminusmass = new RooRealVar("wminusmass","m(W-)",mV,1e-09,120); wminusmass->setBins(50); RooRealVar* hs = new RooRealVar("costhetastar","cos#theta*",-1,1); hs->setBins(20); RooRealVar* Phi1 = new RooRealVar("phistar1","#Phi_{1}",-TMath::Pi(),TMath::Pi()); Phi1->setBins(20); RooRealVar* h1 = new RooRealVar("costheta1","cos#theta_{1}",-1,1); h1->setBins(20); RooRealVar* h2 = new RooRealVar("costheta2","cos#theta_{2}",-1,1); h2->setBins(20); RooRealVar* Phi = new RooRealVar("phi","#Phi",-TMath::Pi(),TMath::Pi()); Phi->setBins(20); // 1- RooRealVar* g1ValV = new RooRealVar("g1ValV","g1ValV",1.); RooRealVar* g2ValV = new RooRealVar("g2ValV","g2ValV",0.); // Even more parameters, do not have to touch, based on W couplings RooRealVar* R1Val = new RooRealVar("R1Val","R1Val",-1.); RooRealVar* R2Val = new RooRealVar("R2Val","R2Val",-1.); // these are the acceptance terms associated with the production angles // the default setting is for setting no-acceptance RooRealVar* aParam = new RooRealVar("aParam","aParam",0); RooSpinOne_7D *myPDFV; if ( offshell ) myPDFV = new RooSpinOne_7D("myPDF","myPDF", *mX, *wplusmass, *wminusmass, *h1, *h2, *hs, *Phi, *Phi1, *g1ValV, *g2ValV, *R1Val, *R2Val, *aParam, *mW, *gamW); else myPDFV = new RooSpinOne_7D("myPDF","myPDF", *mX, *mW, *mW, *h1, *h2, *hs, *Phi, *Phi1, *g1ValV, *g2ValV, *R1Val, *R2Val, *aParam, *mW, *gamW); // Grab input file to convert to RooDataSet TFile* finV = new TFile(Form("VWW_%.0f_JHU.root", mH)); TTree* tinV = (TTree*) finV->Get("angles"); if ( offshell ) RooDataSet dataV("dataV","dataV",tinV,RooArgSet(*wplusmass, *wminusmass, *h1,*h2, *hs, *Phi, *Phi1)); else RooDataSet dataV("dataV","dataV",tinV,RooArgSet(*h1,*h2, *hs, *Phi, *Phi1)); for (int i=1;i<1;i++) { RooArgSet* row = dataV.get(i); row->Print("v"); } // // 1+ // RooRealVar* g1ValA = new RooRealVar("g1ValA","g1ValA",0); RooRealVar* g2ValA = new RooRealVar("g2ValA","g2ValA",1); RooSpinOne_7D *myPDFA; if ( offshell ) myPDFA = new RooSpinOne_7D("myPDF","myPDF", *mX, *wplusmass, *wminusmass, *h1, *h2, *hs, *Phi, *Phi1, *g1ValA, *g2ValA, *R1Val, *R2Val, *aParam, *mW, *gamW); else myPDFA = new RooSpinOne_7D("myPDF","myPDF", *mX, *mW, *mW, *h1, *h2, *hs, *Phi, *Phi1, *g1ValA, *g2ValA, *R1Val, *R2Val, *aParam, *mW, *gamW); TFile* finA = new TFile(Form("AVWW_%.0f_JHU.root", mH)); TTree* tinA = (TTree*) finA->Get("angles"); if ( offshell ) RooDataSet dataA("dataA","dataA",tinA,RooArgSet(*wplusmass, *wminusmass, *hs, *h1, *h2, *Phi, *Phi1)); else RooDataSet dataA("dataA","dataA",tinA,RooArgSet(*h1,*h2, *hs, *Phi, *Phi1)); // // P L O T . . . // bool drawv = true; bool drawa = true; bool drawpaper = true; double rescale = 1.0; if (drawpaper ) rescale = 0.001; // for 1- TH1F* dum0 = new TH1F("dum0","dum0",1,0,1); dum0->SetLineColor(kRed); dum0->SetMarkerColor(kBlack); dum0->SetLineWidth(3); // for 1+ TH1F* dum1 = new TH1F("dum1","dum1",1,0,1); dum1->SetLineColor(kBlue); dum1->SetMarkerColor(kBlack); dum1->SetMarkerStyle(24), dum1->SetLineWidth(3); TLegend * box3 = new TLegend(0.1,0.1,0.9,0.92); box3->SetFillColor(0); box3->SetBorderSize(0); if ( drawa ) box3->AddEntry(dum0,"X#rightarrow WW JP = 1+","lp"); if ( drawv ) box3->AddEntry(dum1,"X#rightarrow WW JP = 1-","lp"); // // h1 // RooPlot* h1frame = h1->frame(20); h1frame->GetXaxis()->CenterTitle(); h1frame->GetYaxis()->CenterTitle(); h1frame->GetYaxis()->SetTitle(" "); double ymax_h1; TH1F *h1a = new TH1F("h1a", "h1a", 20, -1, 1); tinA->Project("h1a", "costheta1"); ymax_h1 = h1a->GetMaximum(); TH1F *h1_minus = new TH1F("h1_minus", "h1_minus", 20, -1, 1); tinV->Project("h1_minus", "costheta1"); ymax_h1 = h1_minus->GetMaximum() > ymax_h1 ? h1_minus->GetMaximum() : ymax_h1; if ( drawa ) { dataA.plotOn(h1frame, MarkerColor(kRed),MarkerStyle(4),MarkerSize(1.5),LineWidth(0),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFA->plotOn(h1frame, LineColor(kRed),LineWidth(2), Normalization(rescale)); } if ( drawv ) { //dataV.plotOn(h1frame, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); //myPDFV->plotOn(h1frame, LineColor(kBlue),LineWidth(2), Normalization(rescale)); // tempoary dataV.plotOn(h1frame, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale*.95823), DataError(RooAbsData::None)); myPDFV->plotOn(h1frame, LineColor(kBlue),LineWidth(2), Normalization(rescale*.95823)); } if ( rescale != 1.) h1frame->GetYaxis()->SetRangeUser(0, ymax_h1 / 1000. * 1.3); // // h2 // RooPlot* h2frame = h2->frame(20); h2frame->GetXaxis()->CenterTitle(); h2frame->GetYaxis()->CenterTitle(); h2frame->GetYaxis()->SetTitle(" "); double ymax_h2; TH1F *h2a = new TH1F("h2a", "h2a", 20, -1, 1); tinA->Project("h2a", "costheta2"); ymax_h2 = h2a->GetMaximum(); TH1F *h2_minus = new TH1F("h2_minus", "h2_minus", 20, -1, 1); tinV->Project("h2_minus", "costheta2"); ymax_h2 = h2_minus->GetMaximum() > ymax_h2 ? h2_minus->GetMaximum() : ymax_h2; if ( drawa ) { dataA.plotOn(h2frame, MarkerColor(kRed),MarkerStyle(4),MarkerSize(1.5),LineWidth(0),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFA->plotOn(h2frame, LineColor(kRed),LineWidth(2), Normalization(rescale)); } if ( drawv ) { // dataV.plotOn(h2frame, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale), yDataError(RooAbsData::None)); // myPDFV->plotOn(h2frame, LineColor(kBlue),LineWidth(2), Normalization(rescale)); dataV.plotOn(h2frame, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale*.95823), DataError(RooAbsData::None)); myPDFV->plotOn(h2frame, LineColor(kBlue),LineWidth(2), Normalization(rescale*.95823)); } if ( rescale != 1.) h2frame->GetYaxis()->SetRangeUser(0, ymax_h2 / 1000. * 1.3); // // Phi // RooPlot* Phiframe = Phi->frame(20); Phiframe->GetXaxis()->CenterTitle(); Phiframe->GetYaxis()->CenterTitle(); Phiframe->GetYaxis()->SetTitle(" "); double ymax_Phi; TH1F *Phia = new TH1F("Phia", "Phia", 20, -TMath::Pi(), TMath::Pi()); tinA->Project("Phia", "phi"); ymax_Phi = Phia->GetMaximum(); TH1F *Phi_minus = new TH1F("Phi_minus", "Phi_minus", 20, -TMath::Pi(), TMath::Pi()); tinV->Project("Phi_minus", "phi"); ymax_Phi = Phi_minus->GetMaximum() > ymax_Phi ? Phi_minus->GetMaximum() : ymax_Phi; if ( drawa ) { dataA.plotOn(Phiframe, MarkerColor(kRed),MarkerStyle(4),MarkerSize(1.5),LineWidth(0),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFA->plotOn(Phiframe, LineColor(kRed),LineWidth(2), Normalization(rescale)); } if ( drawv ) { //dataV.plotOn(Phiframe, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); //myPDFV->plotOn(Phiframe, LineColor(kBlue),LineWidth(2), Normalization(rescale)); dataV.plotOn(Phiframe, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale*.95823), DataError(RooAbsData::None)); myPDFV->plotOn(Phiframe, LineColor(kBlue),LineWidth(2), Normalization(rescale*.95823)); } if ( rescale != 1. ) Phiframe->GetYaxis()->SetRangeUser(0, ymax_Phi / 1000. * 1.3); // // hs // RooPlot* hsframe = hs->frame(20); hsframe->GetXaxis()->CenterTitle(); hsframe->GetYaxis()->CenterTitle(); hsframe->GetYaxis()->SetTitle(" "); double ymax_hs; TH1F *hsa = new TH1F("hsa", "hsa", 20, -1, 1); tinA->Project("hsa", "costhetastar"); ymax_hs = hsa->GetMaximum(); TH1F *hs_minus = new TH1F("hs_minus", "hs_minus", 20, -1, 1); tinV->Project("hs_minus", "costhetastar"); ymax_hs = hs_minus->GetMaximum() > ymax_hs ? hs_minus->GetMaximum() : ymax_hs; if ( drawa ) { dataA.plotOn(hsframe, MarkerColor(kRed),MarkerStyle(4),MarkerSize(1.5),LineWidth(0),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFA->plotOn(hsframe, LineColor(kRed),LineWidth(2), Normalization(rescale)); } if ( drawv ) { //dataV.plotOn(hsframe, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); //myPDFV->plotOn(hsframe, LineColor(kBlue),LineWidth(2), Normalization(rescale)); dataV.plotOn(hsframe, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale*.95823), DataError(RooAbsData::None)); myPDFV->plotOn(hsframe, LineColor(kBlue),LineWidth(2), Normalization(rescale*.95823)); } if ( rescale != 1. ) hsframe->GetYaxis()->SetRangeUser(0, ymax_hs / 1000. * 1.3); // // Phi1 // RooPlot* Phi1frame = Phi1->frame(20); Phi1frame->GetXaxis()->CenterTitle(); Phi1frame->GetYaxis()->CenterTitle(); Phi1frame->GetYaxis()->SetTitle(" "); double ymax_Phi1; TH1F *Phi1a = new TH1F("Phi1a", "Phi1a", 20, -TMath::Pi(), TMath::Pi()); tinA->Project("Phi1a", "phistar1"); ymax_Phi1 = Phi1a->GetMaximum(); TH1F *Phi1_minus = new TH1F("Phi1_minus", "Phi1_minus", 20, -TMath::Pi(), TMath::Pi()); tinV->Project("Phi1_minus", "phistar1"); ymax_Phi1 = Phi1_minus->GetMaximum() > ymax_Phi1 ? Phi1_minus->GetMaximum() : ymax_Phi1; if ( drawa ) { dataA.plotOn(Phi1frame, MarkerColor(kRed),MarkerStyle(4),MarkerSize(1.5),LineWidth(0),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFA->plotOn(Phi1frame, LineColor(kRed),LineWidth(2), Normalization(rescale)); } if ( drawv ) { // dataV.plotOn(Phi1frame, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); // myPDFV->plotOn(Phi1frame, LineColor(kBlue),LineWidth(2), Normalization(rescale)); dataV.plotOn(Phi1frame, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale*.95823), DataError(RooAbsData::None)); myPDFV->plotOn(Phi1frame, LineColor(kBlue),LineWidth(2), Normalization(rescale*.95823)); } if ( rescale != 1. ) Phi1frame->GetYaxis()->SetRangeUser(0, ymax_Phi1 / 1000. * 1.3); if ( offshell ) { RooPlot* w1frame = wplusmass->frame(50); w1frame->GetXaxis()->CenterTitle(); w1frame->GetYaxis()->CenterTitle(); w1frame->GetYaxis()->SetTitle(" "); double ymax_w1; TH1F *w1a = new TH1F("w1a", "w1a", 50, 1e-09, 120); tinA->Project("w1a", "wplusmass"); ymax_w1 = w1a->GetMaximum(); TH1F *w1_minus = new TH1F("w1_minus", "w1_minus", 50, 1e-09, 120); tinV->Project("w1_minus", "wplusmass") ymax_w1 = w1_minus->GetMaximum() > ymax_w1 ? w1_minus->GetMaximum() : ymax_w1; if ( drawa ) { dataA.plotOn(w1frame, MarkerColor(kRed),MarkerStyle(4),MarkerSize(1.5),LineWidth(0),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFA->plotOn(w1frame, LineColor(kRed),LineWidth(2), Normalization(rescale)); } if ( drawv ) { // dataV.plotOn(w1frame, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); // myPDFV->plotOn(w1frame, LineColor(kBlue),LineWidth(2), Normalization(rescale)); dataV.plotOn(w1frame, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale*.95823), DataError(RooAbsData::None)); myPDFV->plotOn(w1frame, LineColor(kBlue),LineWidth(2), Normalization(rescale*.95823)); } if ( rescale != 1. ) w1frame->GetYaxis()->SetRangeUser(0, ymax_w1 / 1000. * 1.5); // // wminus // RooPlot* w2frame = wminusmass->frame(50); w2frame->GetXaxis()->CenterTitle(); w2frame->GetYaxis()->CenterTitle(); w2frame->GetYaxis()->SetTitle(" "); double ymax_w2; TH1F *w2a = new TH1F("w2a", "w2a", 50, 1e-09, 120); tinA->Project("w2a", "wminusmass"); ymax_w2 = w2a->GetMaximum(); TH1F *w2_minus = new TH1F("w2_minus", "w2_minus", 50, 1e-09, 120); tinV->Project("w2_minus", "wminusmass") ymax_w2 = w2_minus->GetMaximum() > ymax_w2 ? w2_minus->GetMaximum() : ymax_w2; if ( drawa ) { dataA.plotOn(w2frame, MarkerColor(kRed),MarkerStyle(4),MarkerSize(1.5),LineWidth(0),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); myPDFA->plotOn(w2frame, LineColor(kRed),LineWidth(2), Normalization(rescale)); } if ( drawv ) { //dataV.plotOn(w2frame, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale), DataError(RooAbsData::None)); //myPDFV->plotOn(w2frame, LineColor(kBlue),LineWidth(2), Normalization(rescale)); dataV.plotOn(w2frame, MarkerColor(kBlue),MarkerStyle(27),MarkerSize(1.9),XErrorSize(0), Rescale(rescale*.95823), DataError(RooAbsData::None)); myPDFV->plotOn(w2frame, LineColor(kBlue),LineWidth(2), Normalization(rescale*.95823)); } if ( rescale != 1. ) w2frame->GetYaxis()->SetRangeUser(0, ymax_w2 / 1000. * 1.5); } if ( drawpaper ) { TCanvas* can =new TCanvas("can","can",600,600); if ( offshell ) { w1frame->GetXaxis()->SetTitle("m_{l#nu} [GeV]"); w1frame->Draw(); can->Print(Form("paperplots/wplusmass_%.0fGeV_spin1_2in1_ww.eps", mH)); can->SaveAs(Form("paperplots/wplusmass_%.0fGeV_spin1_2in1_ww.C", mH)); } can->Clear(); hsframe->Draw(); can->Print(Form("paperplots/costhetastar_%.0fGeV_spin1_2in1_ww.eps", mH)); can->SaveAs(Form("paperplots/costhetastar_%.0fGeV_spin1_2in1_ww.C", mH)); can->Clear(); Phi1frame->Draw(); can->Print(Form("paperplots/phistar1_%.0fGeV_spin1_2in1_ww.eps", mH)); can->SaveAs(Form("paperplots/phistar1_%.0fGeV_spin1_2in1_ww.C", mH)); can->Clear(); h1frame->GetXaxis()->SetTitle("cos#theta_{1} or cos#theta_{2}"); h1frame->Draw(); can->Print(Form("paperplots/costheta1_%.0fGeV_spin1_2in1_ww.eps", mH)); can->SaveAs(Form("paperplots/costheta1_%.0fGeV_spin1_2in1_ww.C", mH)); can->Clear(); Phiframe->Draw(); can->Print(Form("paperplots/phi_%.0fGeV_spin1_2in1_ww.eps", mH)); can->SaveAs(Form("paperplots/phi_%.0fGeV_spin1_2in1_ww.C", mH)); } else { TCanvas* cww = new TCanvas( "cww", "cww", 1000, 600 ); cww->Divide(4,2); if ( offshell ) { cww->cd(1); w1frame->Draw(); cww->cd(2); w2frame->Draw(); } cww->cd(3); hsframe->Draw(); cww->cd(4); box3->Draw(); cww->cd(5); Phi1frame->Draw(); cww->cd(6); h1frame->Draw(); cww->cd(7); h2frame->Draw(); cww->cd(8); Phiframe->Draw(); cww->Print(Form("epsfiles/angles_VWW%.0f_JHU_7D.eps", mH)); cww->Print(Form("pngfiles/angles_VWW%.0f_JHU_7D.png", mH)); delete cww; } }
void createWorkspace(const std::string &infilename, int nState, bool correctCtau, bool drawRapPt2D, bool drawPtCPM2D){ gROOT->SetStyle("Plain"); gStyle->SetTitleBorderSize(0); // Set some strings const std::string workspacename = "ws_masslifetime", treename = "selectedData"; // Get the tree from the data file TFile *f = TFile::Open(infilename.c_str()); TTree *tree = (TTree*)f->Get(treename.c_str()); // Set branch addresses in tree to be able to import tree to roofit TLorentzVector* jpsi = new TLorentzVector; tree->SetBranchAddress("JpsiP",&jpsi); double CPMval = 0; tree->SetBranchAddress("CPM",&CPMval); double massErr = 0; tree->SetBranchAddress("JpsiMassErr",&massErr); double Vprob = 0; tree->SetBranchAddress("JpsiVprob",&Vprob); double lifetime = 0; tree->SetBranchAddress("Jpsict",&lifetime); double lifetimeErr = 0; tree->SetBranchAddress("JpsictErr",&lifetimeErr); // define variables necessary for J/Psi(Psi(2S)) mass,lifetime fit RooRealVar* JpsiMass = new RooRealVar("JpsiMass", "M [GeV]", onia::massMin, onia::massMax); RooRealVar* JpsiMassErr = new RooRealVar("JpsiMassErr", "#delta M [GeV]", 0, 5); RooRealVar* JpsiRap = new RooRealVar("JpsiRap", "y", -onia::rap, onia::rap); RooRealVar* JpsiPt = new RooRealVar("JpsiPt", "p_{T} [GeV]", 0. ,100.); RooRealVar* JpsiCPM = new RooRealVar("JpsiCPM", "N_{ch}", 0. ,100.); RooRealVar* Jpsict = new RooRealVar("Jpsict", "lifetime [mm]", -1., 2.5); RooRealVar* JpsictErr = new RooRealVar("JpsictErr", "Error on lifetime [mm]", 0.0001, 1); RooRealVar* JpsiVprob = new RooRealVar("JpsiVprob", "", 0.01, 1.); // Set bins Jpsict->setBins(10000,"cache"); Jpsict->setBins(100); JpsiMass->setBins(100); JpsictErr->setBins(100); // The list of data variables RooArgList dataVars(*JpsiMass,*JpsiMassErr,*JpsiRap,*JpsiPt,*JpsiCPM,*Jpsict,*JpsictErr,*JpsiVprob); // construct dataset to contain events RooDataSet* fullData = new RooDataSet("fullData","The Full Data From the Input ROOT Trees",dataVars); int entries = tree->GetEntries(); cout << "entries " << entries << endl; // loop through events in tree and save them to dataset for (int ientries = 0; ientries < entries; ientries++) { if (ientries%100000==0) std::cout << "event " << ientries << " of " << entries << std::endl; tree->GetEntry(ientries); double M =jpsi->M(); double y=jpsi->Rapidity(); double pt=jpsi->Pt(); double cpm=CPMval; if (M > JpsiMass->getMin() && M < JpsiMass->getMax() && massErr > JpsiMassErr->getMin() && massErr < JpsiMassErr->getMax() && pt > JpsiPt->getMin() && pt < JpsiPt->getMax() && cpm > JpsiCPM->getMin() && cpm < JpsiCPM->getMax() && y > JpsiRap->getMin() && y < JpsiRap->getMax() && lifetime > Jpsict->getMin() && lifetime < Jpsict->getMax() && lifetimeErr > JpsictErr->getMin() && lifetimeErr < JpsictErr->getMax() && Vprob > JpsiVprob->getMin() && Vprob < JpsiVprob->getMax() ){ JpsiPt ->setVal(pt); JpsiCPM ->setVal(cpm); JpsiRap ->setVal(y); JpsiMass ->setVal(M); JpsiMassErr ->setVal(massErr); JpsiVprob ->setVal(Vprob); //cout<<"before lifetime correction \n" // <<"Jpsict: "<<lifetime<<" JpsictErr: "<<lifetimeErr<<endl; if(correctCtau){ lifetime = lifetime * onia::MpsiPDG / M ; lifetimeErr = lifetimeErr * onia::MpsiPDG / M ; Jpsict ->setVal(lifetime); JpsictErr ->setVal(lifetimeErr); //cout<<"MpsiPDG: "<<onia::MpsiPDG<<endl; //cout<<"after lifetime correction \n" // <<"Jpsict: "<<lifetime<<" JpsictErr: "<<lifetimeErr<<endl; } else{ Jpsict ->setVal(lifetime); JpsictErr ->setVal(lifetimeErr); } fullData->add(dataVars); } }//ientries //------------------------------------------------------------------------------------------------------------------ // Define workspace and import datasets ////Get datasets binned in pT, cpm, and y for(int iRap = 1; iRap <= onia::kNbRapForPTBins; iRap++){ Double_t yMin; Double_t yMax; if(iRap==0){ yMin = onia::rapForPTRange[0]; yMax = onia::rapForPTRange[onia::kNbRapForPTBins]; } else{ yMin = onia::rapForPTRange[iRap-1]; yMax = onia::rapForPTRange[iRap]; } for(int iPT = 1; iPT <= onia::kNbPTBins[iRap]; iPT++){ //for(int iPT = 0; iPT <= 0; iPT++) Double_t ptMin; Double_t ptMax; if(iPT==0){ ptMin = onia::pTRange[iRap][0]; ptMax = onia::pTRange[iRap][onia::kNbPTBins[0]]; } else{ ptMin = onia::pTRange[iRap][iPT-1]; ptMax = onia::pTRange[iRap][iPT]; } for(int iCPM = 1; iCPM <= onia::NchBins; iCPM++){ Double_t cpmMin; Double_t cpmMax; if(iCPM==0){ cpmMin = onia::cpmRange[0]; cpmMax = onia::cpmRange[onia::NchBins]; } else{ cpmMin = onia::cpmRange[iCPM-1]; cpmMax = onia::cpmRange[iCPM]; } // output file name and workspace std::stringstream outfilename; outfilename << "tmpFiles/backupWorkSpace/fit_Psi" << nState-3 << "S_rap" << iRap << "_pt" << iPT << "_cpm" << iCPM << ".root"; // outfilename << "tmpFiles/fit_Psi" << nState-3 << "S_rap" << iRap << "_pt" << iPT << ".root"; RooWorkspace* ws = new RooWorkspace(workspacename.c_str()); // define pt and y cuts on dataset std::stringstream cutString; cutString << "(JpsiCPM > " << cpmMin << " && JpsiCPM < "<< cpmMax << ") && " << "(JpsiPt >= " << ptMin << " && JpsiPt < "<< ptMax << ") && " << "(TMath::Abs(JpsiRap) >= " << yMin << " && TMath::Abs(JpsiRap) < " << yMax << ")"; cout << "cutString: " << cutString.str().c_str() << endl; // get the dataset for the fit RooDataSet* binData = (RooDataSet*)fullData->reduce(cutString.str().c_str()); std::stringstream name; name << "data_rap" << iRap << "_pt" << iPT << "_cpm" << iCPM;; binData->SetNameTitle(name.str().c_str(), "Data For Fitting"); // Import variables to workspace ws->import(*binData); ws->writeToFile(outfilename.str().c_str()); }//iCPM }//iPT }//iRap ////--------------------------------------------------------------- ////--Integrating rapidity and pt bins, in +/- 3*sigma mass window ////--------------------------------------------------------------- if(drawRapPt2D){ double yMin = onia::rapForPTRange[0]; double yMax = onia::rapForPTRange[onia::kNbRapForPTBins]; double ptMin = onia::pTRange[0][0]; double ptMax = onia::pTRange[0][onia::kNbPTBins[0]]; double cpmMin = onia::cpmRange[0]; double cpmMax = onia::cpmRange[onia::NchBins]; std::stringstream cutRapPt; cutRapPt << "(JpsiCPM > " << cpmMin << " && JpsiCPM < "<< cpmMax << ") && " << "(JpsiPt > " << ptMin << " && JpsiPt < "<< ptMax << ") && " << "(TMath::Abs(JpsiRap) > " << yMin << " && TMath::Abs(JpsiRap) < " << yMax << ")"; cout<<"cutRapPt: "<<cutRapPt.str().c_str()<<endl; RooDataSet* rapPtData = (RooDataSet*)fullData->reduce(cutRapPt.str().c_str()); std::stringstream nameRapPt; nameRapPt << "data_rap0_pt0_cpm0"; rapPtData->SetNameTitle(nameRapPt.str().c_str(), "Data For full rap and pt"); // output file name and workspace std::stringstream outfilename; outfilename << "tmpFiles/backupWorkSpace/fit_Psi" << nState-3 << "S_rap0_pt0_cpm0.root"; RooWorkspace* ws_RapPt = new RooWorkspace(workspacename.c_str()); //Import variables to workspace ws_RapPt->import(*rapPtData); ws_RapPt->writeToFile(outfilename.str().c_str()); TH2D* rapPt; TH1D* rap1p2; double MassMin; double MassMax; rap1p2 = new TH1D("rap1p2","rap1p2",30,0, 1.8); if(nState==4){ rapPt = new TH2D( "rapPt", "rapPt", 52,-1.3,1.3,144,0,72); MassMin=3.011;//massPsi1S-onia::nSigMass*sigma1S; MassMax=3.174;//massPsi1S+onia::nSigMass*sigma1S; // sigma 27.2 MeV // mean 3.093 GeV } if(nState==5){ rapPt = new TH2D( "rapPt", "rapPt", 64,-1.6,1.6,144,0,72); // rap<1.5 //rapPt = new TH2D( "rapPt", "rapPt", 52,-1.3,1.3,144,0,72); // rap<1.2 MassMin=3.576;//massPsi2S-onia::nSigMass*sigma2S; MassMax=3.786;//massPsi2S+onia::nSigMass*sigma2S; // sigma 34.9 MeV // pT > 7 // sigma 34.3 MeV // pT > 10 // mean 3.681 GeV } cout<<"Plotting rap-Pt for Psi"<<nState-3<<"S"<<endl; cout<<"MassMin for rap-Pt plot = "<<MassMin<<endl; cout<<"MassMax for rap-Pt plot = "<<MassMax<<endl; TTree *rapPtTree = (TTree*)rapPtData->tree(); std::stringstream cutMass; cutMass<<"(JpsiMass > " << MassMin << " && JpsiMass < "<< MassMax << ")"; //following two methods can only be used in root_v30, 34 does not work rapPtTree->Draw("JpsiPt:JpsiRap>>rapPt",cutMass.str().c_str(),"colz"); cout<<"debug"<<endl; rapPtTree->Draw("TMath::Abs(JpsiRap)>>rap1p2",cutMass.str().c_str()); TCanvas* c2 = new TCanvas("c2","c2",1200,1500); rapPt->SetYTitle("p_{T}(#mu#mu) [GeV]"); rapPt->SetXTitle("y(#mu#mu)"); gStyle->SetPalette(1); gPad->SetFillColor(kWhite); rapPt->SetTitle(0); rapPt->SetStats(0); gPad->SetLeftMargin(0.15); gPad->SetRightMargin(0.17); rapPt->GetYaxis()->SetTitleOffset(1.5); rapPt->Draw("colz"); TLine* rapPtLine; for(int iRap=0;iRap<onia::kNbRapForPTBins+1;iRap++){ rapPtLine= new TLine( -onia::rapForPTRange[iRap], onia::pTRange[0][0], -onia::rapForPTRange[iRap], onia::pTRange[0][onia::kNbPTBins[iRap]] ); rapPtLine->SetLineWidth( 2 ); rapPtLine->SetLineStyle( 1 ); rapPtLine->SetLineColor( kWhite ); rapPtLine->Draw(); rapPtLine= new TLine( onia::rapForPTRange[iRap], onia::pTRange[0][0], onia::rapForPTRange[iRap], onia::pTRange[0][onia::kNbPTBins[iRap]] ); rapPtLine->SetLineWidth( 2 ); rapPtLine->SetLineStyle( 1 ); rapPtLine->SetLineColor( kWhite ); rapPtLine->Draw(); int pTBegin = 0; if(nState==5) pTBegin = 1; for(int iPt=pTBegin;iPt<onia::kNbPTBins[iRap]+1;iPt++){ rapPtLine= new TLine( -onia::rapForPTRange[onia::kNbRapForPTBins], onia::pTRange[0][iPt], onia::rapForPTRange[onia::kNbRapForPTBins], onia::pTRange[0][iPt] ); rapPtLine->SetLineWidth( 2 ); rapPtLine->SetLineStyle( 1 ); rapPtLine->SetLineColor( kWhite ); rapPtLine->Draw(); } } char savename[200]; sprintf(savename,"Fit/rapPt_Psi%dS.pdf",nState-3); c2->SaveAs(savename); TCanvas* c3 = new TCanvas("c3","c3",1500,1200); rap1p2->SetYTitle("Events"); rap1p2->SetXTitle("y(#mu#mu)"); rap1p2->SetTitle(0); rap1p2->SetStats(0); rap1p2->GetYaxis()->SetTitleOffset(1.2); rap1p2->Draw(); sprintf(savename,"Fit/rapDimuon_1p2_Psi%dS.pdf",nState-3); c3->SaveAs(savename); } if(drawPtCPM2D){ double yMin = onia::rapForPTRange[0]; double yMax = onia::rapForPTRange[onia::kNbRapForPTBins]; double ptMin = onia::pTRange[0][0]; double ptMax = onia::pTRange[0][onia::kNbPTBins[0]]; double cpmMin = onia::cpmRange[0]; double cpmMax = onia::cpmRange[onia::NchBins]; std::stringstream cutRapPt; cutRapPt << "(JpsiCPM > " << cpmMin << " && JpsiCPM < "<< cpmMax << ") && " << "(JpsiPt > " << ptMin << " && JpsiPt < "<< ptMax << ") && " << "(TMath::Abs(JpsiRap) > " << yMin << " && TMath::Abs(JpsiRap) < " << yMax << ")"; cout<<"cutRapPt: "<<cutRapPt.str().c_str()<<endl; RooDataSet* rapPtData = (RooDataSet*)fullData->reduce(cutRapPt.str().c_str()); std::stringstream nameRapPt; nameRapPt << "data_rap0_pt0_cpm0"; rapPtData->SetNameTitle(nameRapPt.str().c_str(), "Data For full rap and pt"); // output file name and workspace std::stringstream outfilename; outfilename << "tmpFiles/backupWorkSpace/fit_Psi" << nState-3 << "S_rap0_pt0_cpm0.root"; RooWorkspace* ws_RapPt = new RooWorkspace(workspacename.c_str()); //Import variables to workspace ws_RapPt->import(*rapPtData); ws_RapPt->writeToFile(outfilename.str().c_str()); TH2D* PtCPM; double MassMin; double MassMax; if(nState==4){ PtCPM = new TH2D( "PtCPM", "PtCPM", 100,0,50,200,0,100); MassMin=3.011;//massPsi1S-onia::nSigMass*sigma1S; MassMax=3.174;//massPsi1S+onia::nSigMass*sigma1S; // sigma 27.2 MeV // mean 3.093 GeV } if(nState==5){ PtCPM = new TH2D( "PtCPM", "PtCPM", 100,0,50,200,0,100); // rap<1.5 //rapPt = new TH2D( "rapPt", "rapPt", 52,-1.3,1.3,144,0,72); // rap<1.2 MassMin=3.576;//massPsi2S-onia::nSigMass*sigma2S; MassMax=3.786;//massPsi2S+onia::nSigMass*sigma2S; // sigma 34.9 MeV // pT > 7 // sigma 34.3 MeV // pT > 10 // mean 3.681 GeV } cout<<"Plotting Pt-CPM for Psi"<<nState-3<<"S"<<endl; cout<<"MassMin for Pt-CPM plot = "<<MassMin<<endl; cout<<"MassMax for Pt-CPM plot = "<<MassMax<<endl; TTree *rapPtTree = (TTree*)rapPtData->tree(); std::stringstream cutMass; cutMass<<"(JpsiMass > " << MassMin << " && JpsiMass < "<< MassMax << ")"; //following two methods can only be used in root_v30, 34 does not work rapPtTree->Draw("JpsiCPM:JpsiPt>>PtCPM",cutMass.str().c_str(),"colz"); cout<<"debug"<<endl; TCanvas* c2 = new TCanvas("c2","c2",1200,1500); PtCPM->SetYTitle("N_{ch}"); PtCPM->SetXTitle("p_{T}(#mu#mu) [GeV]"); gStyle->SetPalette(1); gPad->SetFillColor(kWhite); PtCPM->SetTitle(0); PtCPM->SetStats(0); gPad->SetLeftMargin(0.15); gPad->SetRightMargin(0.17); PtCPM->GetYaxis()->SetTitleOffset(1.5); PtCPM->Draw("colz"); TLine* PtCPMLine; int iRap=0; for(int iPt=0;iPt<onia::kNbPTMaxBins+1;iPt++){ int cpmBegin = 0; if(nState==5) cpmBegin = 1; for(int icpm=cpmBegin;icpm<onia::NchBins+1;icpm++){ PtCPMLine= new TLine( onia::pTRange[iRap][0], onia::cpmRange[icpm], onia::pTRange[iRap][onia::kNbPTMaxBins], onia::cpmRange[icpm] ); PtCPMLine->SetLineWidth( 2 ); PtCPMLine->SetLineStyle( 1 ); PtCPMLine->SetLineColor( kWhite ); PtCPMLine->Draw(); PtCPMLine= new TLine( onia::pTRange[iRap][iPt], onia::cpmRange[0], onia::pTRange[iRap][iPt], onia::cpmRange[onia::NchBins] ); PtCPMLine->SetLineWidth( 2 ); PtCPMLine->SetLineStyle( 1 ); PtCPMLine->SetLineColor( kWhite ); PtCPMLine->Draw(); // PtCPMLine= new TLine( onia::pTRange[0][onia::kNbPTMaxBins], onia::cpmRange[icpm], onia::pTRange[0][onia::kNbPTMaxBins], onia::cpmRange[icpm] ); // PtCPMLine->SetLineWidth( 2 ); // PtCPMLine->SetLineStyle( 1 ); // PtCPMLine->SetLineColor( kWhite ); // PtCPMLine->Draw(); } } char savename[200]; sprintf(savename,"Fit/PtCPM_Psi%dS.pdf",nState-3); c2->SaveAs(savename); } f->Close(); }
void fitbkgdataCard(TString configCard="template.config", bool dobands = true, // create baerror bands for BG models bool dosignal = false, // plot the signal model (needs to be present) bool blinded = true, // blind the data in the plots? bool verbose = true ) { gROOT->Macro("MitStyle.C"); gStyle->SetErrorX(0); gStyle->SetOptStat(0); gROOT->ForceStyle(); TString projectDir; std::vector<TString> catdesc; std::vector<TString> catnames; std::vector<int> polorder; double massmin = -1.; double massmax = -1.; double theCMenergy = -1.; bool readStatus = readFromConfigCard( configCard, projectDir, catnames, catdesc, polorder, massmin, massmax, theCMenergy ); if( !readStatus ) { std::cerr<<" ERROR: Could not read from card > "<<configCard.Data()<<" <."<<std::endl; return; } TFile *fdata = new TFile(TString::Format("%s/CMS-HGG-data.root",projectDir.Data()),"READ"); if( !fdata ) { std::cerr<<" ERROR: Could not open file "<<projectDir.Data()<<"/CMS-HGG-data.root."<<std::endl; return; } if( !gSystem->cd(TString::Format("%s/databkg/",projectDir.Data())) ) { std::cerr<<" ERROR: Could not change directory to "<<TString::Format("%s/databkg/",projectDir.Data()).Data()<<"."<<std::endl; return; } // ---------------------------------------------------------------------- // load the input workspace.... RooWorkspace* win = (RooWorkspace*)fdata->Get("cms_hgg_workspace_data"); if( !win ) { std::cerr<<" ERROR: Could not load workspace > cms_hgg_workspace_data < from file > "<<TString::Format("%s/CMS-HGG-data.root",projectDir.Data()).Data()<<" <."<<std::endl; return; } RooRealVar *intLumi = win->var("IntLumi"); RooRealVar *hmass = win->var("CMS_hgg_mass"); if( !intLumi || !hmass ) { std::cerr<<" ERROR: Could not load needed variables > IntLumi < or > CMS_hgg_mass < forom input workspace."<<std::endl; return; } //win->Print(); hmass->setRange(massmin,massmax); hmass->setBins(4*(int)(massmax-massmin)); hmass->SetTitle("m_{#gamma#gamma}"); hmass->setUnit("GeV"); hmass->setRange("fitrange",massmin,massmax); hmass->setRange("blind1",100.,110.); hmass->setRange("blind2",150.,180.); // ---------------------------------------------------------------------- // some auxiliray vectro (don't know the meaning of all of them ... yet... std::vector<RooAbsData*> data_vec; std::vector<RooAbsPdf*> pdfShape_vec; // vector to store the NOT-EXTENDED PDFs (aka pdfshape) std::vector<RooAbsPdf*> pdf_vec; // vector to store the EXTENDED PDFs std::vector<RooAbsReal*> normu_vec; // this holds the normalization vars for each Cat (needed in bands for combined cat) RooArgList normList; // list of range-limityed normalizations (needed for error bands on combined category) //std::vector<RooRealVar*> coeffv; //std::vector<RooAbsReal*> normu_vecv; // ??? // ---------------------------------------------------------------------- // define output works RooWorkspace *wOut = new RooWorkspace("wbkg","wbkg") ; // util;ities for the combined fit RooCategory finalcat ("finalcat", "finalcat") ; RooSimultaneous fullbkgpdf("fullbkgpdf","fullbkgpdf",finalcat); RooDataSet datacomb ("datacomb", "datacomb", RooArgList(*hmass,finalcat)) ; RooDataSet *datacombcat = new RooDataSet("data_combcat","",RooArgList(*hmass)) ; // add the 'combcat' to the list...if more than one cat if( catnames.size() > 1 ) { catnames.push_back("combcat"); catdesc.push_back("Combined"); } for (UInt_t icat=0; icat<catnames.size(); ++icat) { TString catname = catnames.at(icat); finalcat.defineType(catname); // check if we're in a sub-cat or the comb-cat RooDataSet *data = NULL; RooDataSet *inData = NULL; if( icat < (catnames.size() - 1) || catnames.size() == 1) { // this is NOT the last cat (which is by construction the combination) inData = (RooDataSet*)win->data(TString("data_mass_")+catname); if( !inData ) { std::cerr<<" ERROR: Could not find dataset > data_mass_"<<catname.Data()<<" < in input workspace."<<std::endl; return; } data = new RooDataSet(TString("data_")+catname,"",*hmass,Import(*inData)); // copy the dataset (why?) // append the data to the combined data... RooDataSet *datacat = new RooDataSet(TString("datacat")+catname,"",*hmass,Index(finalcat),Import(catname,*data)) ; datacomb.append(*datacat); datacombcat->append(*data); // normalization for this category RooRealVar *nbkg = new RooRealVar(TString::Format("CMS_hgg_%s_bkgshape_norm",catname.Data()),"",800.0,0.0,25e3); // we keep track of the normalizario vars only for N-1 cats, naming convetnions hystoric... if( catnames.size() > 2 && icat < (catnames.size() - 2) ) { RooRealVar* cbkg = new RooRealVar(TString::Format("cbkg%s",catname.Data()),"",0.0,0.0,1e3); cbkg->removeRange(); normu_vec.push_back(cbkg); normList.add(*cbkg); } /// generate the Bernstrin polynomial (FIX-ME: add possibility ro create other models...) fstBernModel* theBGmodel = new fstBernModel(hmass, polorder[icat], icat, catname); // using my dedicated class... std::cout<<" model name is "<<theBGmodel->getPdf()->GetName()<<std::endl; RooAbsPdf* bkgshape = theBGmodel->getPdf(); // the BG shape RooAbsPdf* bkgpdf = new RooExtendPdf(TString("bkgpdf")+catname,"",*bkgshape,*nbkg); // the extended PDF // add the extedned PDF to the RooSimultaneous holding all models... fullbkgpdf.addPdf(*bkgpdf,catname); // store the NON-EXTENDED PDF for usgae to compute the error bands later.. pdfShape_vec.push_back(bkgshape); pdf_vec .push_back(bkgpdf); data_vec .push_back(data); } else { data = datacombcat; // we're looking at the last cat (by construction the combination) data_vec.push_back(data); // sum up all the cts PDFs for combined PDF RooArgList subpdfs; for (int ipdf=0; ipdf<pdf_vec.size(); ++ipdf) { subpdfs.add(*pdf_vec.at(ipdf)); } RooAddPdf* bkgpdf = new RooAddPdf(TString("bkgpdf")+catname,"",subpdfs); pdfShape_vec.push_back(bkgpdf); pdf_vec .push_back(bkgpdf); // I don't think this is really needed though.... } // generate the binned dataset (to be put into the workspace... just in case...) RooDataHist *databinned = new RooDataHist(TString("databinned_")+catname,"",*hmass,*data); wOut->import(*data); wOut->import(*databinned); } std::cout<<" ***************** "<<std::endl; // fit the RooSimultaneous to the combined dataset -> (we could also fit each cat separately) fullbkgpdf.fitTo(datacomb,Strategy(1),Minos(kFALSE),Save(kTRUE)); RooFitResult *fullbkgfitres = fullbkgpdf.fitTo(datacomb,Strategy(2),Minos(kFALSE),Save(kTRUE)); // in principle we're done now, so store the results in the output workspace wOut->import(datacomb); wOut->import(fullbkgpdf); wOut->import(*fullbkgfitres); std::cout<<" ***************** "<<std::endl; if( verbose ) wOut->Print(); std::cout<<" ***************** "<<std::endl; wOut->writeToFile("bkgdatawithfit.root") ; if( verbose ) { printf("IntLumi = %5f\n",intLumi->getVal()); printf("ndata:\n"); for (UInt_t icat=0; icat<catnames.size(); ++icat) { printf("%i ",data_vec.at(icat)->numEntries()); } printf("\n"); } // -------------------------------------------------------------------------------------------- // Now comesd the plotting // chage the Statistics style... gStyle->SetOptStat(1110); // we want to plot in 1GeV bins (apparently...) UInt_t nbins = (UInt_t) (massmax-massmin); // here we'll store the curves for the bands... std::vector<RooCurve*> fitcurves; // loop again over the cats TCanvas **canbkg = new TCanvas*[catnames.size()]; RooPlot** plot = new RooPlot*[catnames.size()]; TLatex** lat = new TLatex*[catnames.size()]; TLatex** lat2 = new TLatex*[catnames.size()]; std::cout<<" beofre plotting..."<<std::endl; for (UInt_t icat=0; icat<catnames.size(); ++icat) { TString catname = catnames.at(icat); std::cout<<" trying to plot #"<<icat<<std::endl; // plot the data and the fit canbkg[icat] = new TCanvas; plot [icat] = hmass->frame(Bins(nbins),Range("fitrange")); std::cout<<" trying to plot #"<<icat<<std::endl; // first plot the data invisibly... and put the fitted BG model on top... data_vec .at(icat)->plotOn(plot[icat],RooFit::LineColor(kWhite),MarkerColor(kWhite),Invisible()); pdfShape_vec.at(icat)->plotOn(plot[icat],RooFit::LineColor(kRed),Range("fitrange"),NormRange("fitrange")); std::cout<<" trying to plot #"<<icat<<std::endl; // if toggled on, plot also the Data visibly if( !blinded ) { data_vec.at(icat)->plotOn(plot[icat]); } std::cout<<" trying to plot #"<<icat<<std::endl; // some cosmetics... plot[icat]->SetTitle(""); plot[icat]->SetMinimum(0.0); plot[icat]->SetMaximum(1.40*plot[icat]->GetMaximum()); plot[icat]->GetXaxis()->SetTitle("m_{#gamma#gamma} (GeV/c^{2})"); plot[icat]->Draw(); std::cout<<" trying to plot #"<<icat<<std::endl; // legend.... TLegend *legmc = new TLegend(0.68,0.70,0.97,0.90); legmc->AddEntry(plot[icat]->getObject(2),"Data","LPE"); legmc->AddEntry(plot[icat]->getObject(1),"Bkg Model","L"); // this part computes the 1/2-sigma bands. TGraphAsymmErrors *onesigma = NULL; TGraphAsymmErrors *twosigma = NULL; std::cout<<" trying *** to plot #"<<icat<<std::endl; RooAddition* sumcatsnm1 = NULL; if ( dobands ) { //&& icat == (catnames.size() - 1) ) { onesigma = new TGraphAsymmErrors(); twosigma = new TGraphAsymmErrors(); // get the PDF for this cat from the vector RooAbsPdf *thisPdf = pdfShape_vec.at(icat); // get the nominal fir curve RooCurve *nomcurve = dynamic_cast<RooCurve*>(plot[icat]->getObject(1)); fitcurves.push_back(nomcurve); bool iscombcat = ( icat == (catnames.size() - 1) && catnames.size() > 1); RooAbsData *datanorm = ( iscombcat ? &datacomb : data_vec.at(icat) ); // this si the nornmalization in the 'sliding-window' (i.e. per 'test-bin') RooRealVar *nlim = new RooRealVar(TString::Format("nlim%s",catnames.at(icat).Data()),"",0.0,0.0,10.0); nlim->removeRange(); if( iscombcat ) { // ----------- HISTORIC NAMING ---------------------------------------- sumcatsnm1 = new RooAddition("sumcatsnm1","",normList); // summing all normalizations epect the last Cat // this is the normlization of the last Cat RooFormulaVar *nlast = new RooFormulaVar("nlast","","TMath::Max(0.1,@0-@1)",RooArgList(*nlim,*sumcatsnm1)); // ... and adding it ot the list of norms normu_vec.push_back(nlast); } //if (icat == 1 && catnames.size() == 2) continue; // only 1 cat, so don't need combination for (int i=1; i<(plot[icat]->GetXaxis()->GetNbins()+1); ++i) { // this defines the 'binning' we use for the error bands double lowedge = plot[icat]->GetXaxis()->GetBinLowEdge(i); double upedge = plot[icat]->GetXaxis()->GetBinUpEdge(i); double center = plot[icat]->GetXaxis()->GetBinCenter(i); // get the nominal value at the center of the bin double nombkg = nomcurve->interpolate(center); nlim->setVal(nombkg); hmass->setRange("errRange",lowedge,upedge); // this is the new extended PDF whith the normalization restricted to the bin-area RooAbsPdf *extLimPdf = NULL; if( iscombcat ) { extLimPdf = new RooSimultaneous("epdf","",finalcat); // loop over the cats and generate temporary extended PDFs for (int jcat=0; jcat<(catnames.size()-1); ++jcat) { RooRealVar *rvar = dynamic_cast<RooRealVar*>(normu_vec.at(jcat)); if (rvar) rvar->setVal(fitcurves.at(jcat)->interpolate(center)); RooExtendPdf *ecpdf = new RooExtendPdf(TString::Format("ecpdf%s",catnames.at(jcat).Data()),"",*pdfShape_vec.at(jcat),*normu_vec.at(jcat),"errRange"); static_cast<RooSimultaneous*>(extLimPdf)->addPdf(*ecpdf,catnames.at(jcat)); } } else extLimPdf = new RooExtendPdf("extLimPdf","",*thisPdf,*nlim,"errRange"); RooAbsReal *nll = extLimPdf->createNLL(*datanorm,Extended(),NumCPU(1)); RooMinimizer minim(*nll); minim.setStrategy(0); double clone = 1.0 - 2.0*RooStats::SignificanceToPValue(1.0); double cltwo = 1.0 - 2.0*RooStats::SignificanceToPValue(2.0); if (iscombcat) minim.setStrategy(2); minim.migrad(); if (!iscombcat) { minim.minos(*nlim); } else { minim.hesse(); nlim->removeAsymError(); } if( verbose ) printf("errlo = %5f, errhi = %5f\n",nlim->getErrorLo(),nlim->getErrorHi()); onesigma->SetPoint(i-1,center,nombkg); onesigma->SetPointError(i-1,0.,0.,-nlim->getErrorLo(),nlim->getErrorHi()); // to get the 2-sigma bands... minim.setErrorLevel(0.5*pow(ROOT::Math::normal_quantile(1-0.5*(1-cltwo),1.0), 2)); // the 0.5 is because qmu is -2*NLL // eventually if cl = 0.95 this is the usual 1.92! if (!iscombcat) { minim.migrad(); minim.minos(*nlim); } else { nlim->setError(2.0*nlim->getError()); nlim->removeAsymError(); } twosigma->SetPoint(i-1,center,nombkg); twosigma->SetPointError(i-1,0.,0.,-nlim->getErrorLo(),nlim->getErrorHi()); // for memory clean-up delete nll; delete extLimPdf; } hmass->setRange("errRange",massmin,massmax); if( verbose ) onesigma->Print("V"); // plot[icat] the error bands twosigma->SetLineColor(kGreen); twosigma->SetFillColor(kGreen); twosigma->SetMarkerColor(kGreen); twosigma->Draw("L3 SAME"); onesigma->SetLineColor(kYellow); onesigma->SetFillColor(kYellow); onesigma->SetMarkerColor(kYellow); onesigma->Draw("L3 SAME"); plot[icat]->Draw("SAME"); // and add the error bands to the legend legmc->AddEntry(onesigma,"#pm1 #sigma","F"); legmc->AddEntry(twosigma,"#pm2 #sigma","F"); } std::cout<<" trying ***2 to plot #"<<icat<<std::endl; // rest of the legend .... legmc->SetBorderSize(0); legmc->SetFillStyle(0); legmc->Draw(); lat[icat] = new TLatex(103.0,0.9*plot[icat]->GetMaximum(),TString::Format("#scale[0.7]{#splitline{CMS preliminary}{#sqrt{s} = %.1f TeV L = %.2f fb^{-1}}}",theCMenergy,intLumi->getVal())); lat2[icat] = new TLatex(103.0,0.75*plot[icat]->GetMaximum(),catdesc.at(icat)); lat[icat] ->Draw(); lat2[icat]->Draw(); // ------------------------------------------------------- // save canvas in different formats canbkg[icat]->SaveAs(TString("databkg") + catname + TString(".pdf")); canbkg[icat]->SaveAs(TString("databkg") + catname + TString(".eps")); canbkg[icat]->SaveAs(TString("databkg") + catname + TString(".root")); } return; }
void embeddedToysVBF_1DKD(int nEvts=50, int nToys=100, sample mySample = kScalar_fa3_0){ RooRealVar* kd = new RooRealVar("psMELA","psMELA",0,1); kd->setBins(50); RooPlot* kdframe1 = kd->frame(); // 0- template TFile f1("ggH2j_KDdistribution_ps.root", "READ"); TH2F *h_KD_ps = (TH2F*)f1.Get("h_KD"); h_KD_ps->SetName("h_KD_ps"); RooDataHist rdh_KD_ps("rdh_KD_ps","rdh_KD_ps",RooArgList(*kd),h_KD_ps); RooHistPdf pdf_KD_ps("pdf_KD_ps","pdf_KD_ps",RooArgList(*kd),rdh_KD_ps); // 0+ template TFile f2("ggH2j_KDdistribution_sm.root", "READ"); TH2F *h_KD_sm = (TH2F*)f2.Get("h_KD"); h_KD_sm->SetName("h_KD_sm"); RooDataHist rdh_KD_sm("rdh_KD_sm","rdh_KD_sm",RooArgList(*kd),h_KD_sm); RooHistPdf pdf_KD_sm("pdf_KD_sm","pdf_KD_sm",RooArgList(*kd),rdh_KD_sm); RooRealVar rrv_fa3("fa3","fa3",0.5,0.,1.); //free parameter of the model RooAddPdf model("model","ps+sm",pdf_KD_ps,pdf_KD_sm,rrv_fa3); rrv_fa3.setConstant(kFALSE); TCanvas* c = new TCanvas("modelPlot","modelPlot",400,400); rdh_KD_ps.plotOn(kdframe1,LineColor(kBlack)); pdf_KD_ps.plotOn(kdframe1,LineColor(kBlack)); rdh_KD_sm.plotOn(kdframe1,LineColor(kBlue)); pdf_KD_sm.plotOn(kdframe1,LineColor(kBlue)); model.plotOn(kdframe1,LineColor(kRed)); kdframe1->Draw(); c->SaveAs("model1DPlot.png"); c->SaveAs("model1DPlot.eps"); double fa3Val=-99; if (mySample == kScalar_fa3_0) fa3Val=0.; else if (mySample == kScalar_fa3_1) fa3Val=1; else{ cout<<"fa3Val not correct!"<<endl; return 0; } TCanvas* c = new TCanvas("modelPlot","modelPlot",400,400); rdh_KD_ps.plotOn(kdframe1,LineColor(kBlack)); pdf_KD_ps.plotOn(kdframe1,LineColor(kBlack)); rdh_KD_sm.plotOn(kdframe1,LineColor(kBlue)); pdf_KD_sm.plotOn(kdframe1,LineColor(kBlue)); model.plotOn(kdframe1,LineColor(kRed)); kdframe1->Draw(); TChain* myChain = new TChain("newTree"); myChain->Add(inputFileNames[mySample]); if(!myChain || myChain->GetEntries()<=0) { cout<<"error in the tree"<<endl; return 0; } RooDataSet* data = new RooDataSet("data","data",myChain,RooArgSet(*kd),""); cout << "Number of events in data: " << data->numEntries() << endl; // initialize tree to save toys to TTree* results = new TTree("results","toy results"); double fa3,fa3Error, fa3Pull; double fa2,fa2Error, fa2Pull; double phia2, phia2Error, phia2Pull; double phia3, phia3Error, phia3Pull; results->Branch("fa3",&fa3,"fa3/D"); results->Branch("fa3Error",&fa3Error,"fa3Error/D"); results->Branch("fa3Pull",&fa3Pull,"fa3Pull/D"); //--------------------------------- RooDataSet* toyData; int embedTracker=0; RooArgSet *tempEvent; RooFitResult *toyfitresults; RooRealVar *r_fa3; for(int i = 0 ; i<nToys ; i++){ cout <<i<<"<-----------------------------"<<endl; //if(toyData) delete toyData; toyData = new RooDataSet("toyData","toyData",RooArgSet(*kd)); if(nEvts+embedTracker > data->sumEntries()){ cout << "Playground::generate() - ERROR!!! Playground::data does not have enough events to fill toy!!!! bye :) " << endl; toyData = NULL; abort(); return 0; } for(int iEvent=0; iEvent<nEvts; iEvent++){ if(iEvent==1) cout << "generating event: " << iEvent << " embedTracker: " << embedTracker << endl; tempEvent = (RooArgSet*) data->get(embedTracker); toyData->add(*tempEvent); embedTracker++; } toyfitresults =model.fitTo(*toyData,Save()); cout<<toyfitresults<<endl; r_fa3 = (RooRealVar *) toyfitresults->floatParsFinal().find("fa3"); fa3 = r_fa3->getVal(); fa3Error = r_fa3->getError(); fa3Pull = (r_fa3->getVal() - fa3Val) / r_fa3->getError(); // fill TTree results->Fill(); //model.clear(); } char nEvtsString[100]; sprintf(nEvtsString,"_%iEvts",nEvts); // write tree to output file (ouputFileName set at top) TFile *outputFile = new TFile("embeddedToysVBF_fa3Corr_"+sampleName[mySample]+nEvtsString+".root","RECREATE"); results->Write(); outputFile->Close(); }
void createWorkspace(const std::string &infilename, int nState, bool correctCtau, bool drawRapPt2D) { gROOT->SetStyle("Plain"); gStyle->SetTitleBorderSize(0); delete gRandom; gRandom = new TRandom3(23101987); // Set some strings const std::string workspacename = "ws_masslifetime", treename = "selectedData"; // Get the tree from the data file TFile *f = TFile::Open(infilename.c_str()); TTree *tree = (TTree*)f->Get(treename.c_str()); // Set branch addresses in tree to be able to import tree to roofit TLorentzVector* chic = new TLorentzVector; tree->SetBranchAddress("chic",&chic); TLorentzVector* chic_rf = new TLorentzVector; tree->SetBranchAddress("chic_rf",&chic_rf); TLorentzVector* jpsi = new TLorentzVector; tree->SetBranchAddress("jpsi",&jpsi); double lifetime = 0; tree->SetBranchAddress("Jpsict",&lifetime); double lifetimeErr = 0; tree->SetBranchAddress("JpsictErr",&lifetimeErr); char lifetimeTitle[200]; sprintf(lifetimeTitle,"l^{#psi} [mm]"); if(correctCtau) sprintf(lifetimeTitle,"l^{#chi} [mm]"); // define variables necessary for J/Psi(Psi(2S)) mass,lifetime fit RooRealVar* JpsiMass = new RooRealVar("JpsiMass", "M^{#psi} [GeV]", onia::massMin, onia::massMax); RooRealVar* JpsiPt = new RooRealVar("JpsiPt", "p^{#psi}_{T} [GeV]", 0. ,1000.); RooRealVar* JpsiRap = new RooRealVar("JpsiRap", "y^{#psi}", -2., 2.); RooRealVar* chicMass = new RooRealVar("chicMass", "M^{#chi} [GeV]", onia::chimassMin, onia::chimassMax); RooRealVar* chicRap = new RooRealVar("chicRap", "y^{#chi}", -onia::chirap, onia::chirap); RooRealVar* chicPt = new RooRealVar("chicPt", "p^{#chi}_{T} [GeV]", 0. ,100.); RooRealVar* Jpsict = new RooRealVar("Jpsict", lifetimeTitle, onia::ctVarMin, onia::ctVarMax); RooRealVar* JpsictErr = new RooRealVar("JpsictErr", Form("Error on %s",lifetimeTitle), 0.0001, 1.); // Set bins Jpsict->setBins(10000,"cache"); JpsiMass->setBins(10000,"cache"); JpsiPt->setBins(100); JpsiRap->setBins(10000,"cache"); chicMass->setBins(10000,"cache"); //JpsictErr->setBins(100); JpsictErr->setBins(10000,"cache"); // The list of data variables RooArgList dataVars(*JpsiMass,*JpsiPt,*JpsiRap,*chicMass,*chicRap,*chicPt,*Jpsict,*JpsictErr); // construct dataset to contain events RooDataSet* fullData = new RooDataSet("fullData","The Full Data From the Input ROOT Trees",dataVars); int entries = tree->GetEntries(); cout << "entries " << entries << endl; int numEntriesTotal=0; int numEntriesInAnalysis=0; int numEntriesNotInAnalysis=0; /* /// Read in 2011 data ctauErr-histos char saveDir[200]; char PlotID[200]; char savename[200]; sprintf(saveDir,"/afs/hephy.at/scratch/k/knuenz/ChicPol/macros/polFit/Figures/CtauErrModel"); gSystem->mkdir(saveDir); sprintf(PlotID,"2014May26_MoreLbins"); sprintf(saveDir,"%s/%s",saveDir,PlotID); gSystem->mkdir(saveDir); sprintf(savename,"%s/CtauErrModel_histograms.root",saveDir); TFile *infile = new TFile(savename,"READ"); cout<<"opened file"<<endl; const int nPT=5; const int nRAP=2; const int nL=15; const double bordersPT[nPT+1] = {0., 12., 16., 20., 30., 100.}; const double bordersRAP[nRAP+1] = {0., 0.6, 2.}; const double bordersL[nL+1] = {onia::ctVarMin, -0.05, -0.03, -0.02, -0.015, -0.01, -0.005, 0., 0.005, 0.01, 0.015, 0.02, 0.03, 0.05, 0.1, onia::ctVarMax}; TH1D* h_ctauerr_2011[nRAP+1][nPT+1][nL+1]; TH1D* h_ctauerr_2012[nRAP+1][nPT+1][nL+1]; for(int iRAP = 0; iRAP < nRAP+1; iRAP++){ for(int iPT = 0; iPT < nPT+1; iPT++){ for(int iL = 0; iL < nL+1; iL++){ h_ctauerr_2011[iRAP][iPT][iL] = (TH1D*)infile->Get(Form("h_ctauerr_2011_rap%d_pt%d_l%d",iRAP, iPT, iL)); h_ctauerr_2012[iRAP][iPT][iL] = (TH1D*)infile->Get(Form("h_ctauerr_2012_rap%d_pt%d_l%d",iRAP, iPT, iL)); } } } cout<<"opened hists"<<endl; /// Finished reading in 2011 data ctauErr-histos */ // loop through events in tree and save them to dataset for (int ientries = 0; ientries < entries; ientries++) { numEntriesTotal++; if (ientries%10000==0) std::cout << "event " << ientries << " of " << entries << std::endl; tree->GetEntry(ientries); double M_jpsi =jpsi->M(); double pt_jpsi =jpsi->Pt(); double y_jpsi =jpsi->Rapidity(); double M =chic_rf->M(); //double M =chic->M()-jpsi->M()+onia::MpsiPDG; double y=chic->Rapidity(); double pt=chic->Pt(); //if (ientries%3==0){ // M_jpsi = gRandom->Uniform(JpsiMass->getMin(), JpsiMass->getMax()); //} //double JpsictErrRand = h_JpsictErr->GetRandom(); //double JpsictErrRand2 = h_JpsictErr->GetRandom(); //double JpsictMeanRand=0.; ////double pTcorrection=(pt-20.)*0.002; // ////JpsictErrRand-=pTcorrection; //if(JpsictErrRand<0) JpsictErrRand=0.001; ////JpsictErrRand2-=pTcorrection; //if(JpsictErrRand2<0) JpsictErrRand2=0.001; // //if (ientries%1000000==0){ // double exponent=0.4; // JpsictMeanRand=gRandom->Exp(exponent); //} // // //lifetime = gRandom->Gaus(JpsictMeanRand,0.8*JpsictErrRand); //lifetimeErr = JpsictErrRand2; //if (ientries%3==0){ // lifetime = gRandom->Gaus(JpsictMeanRand,1.5*JpsictErrRand); //} // //double resCorrFactor=1.08; //if(lifetime<0) // lifetimeErr/=resCorrFactor; /* int iRAPindex=0; int iPTindex=0; int iLindex=0; for(int iRAP = 1; iRAP < nRAP+1; iRAP++){ for(int iPT = 1; iPT < nPT+1; iPT++){ for(int iL = 1; iL < nL+1; iL++){ Double_t ptMin = bordersPT[iPT-1];; Double_t ptMax = bordersPT[iPT];; Double_t rapMin = bordersRAP[iRAP-1];; Double_t rapMax = bordersRAP[iRAP]; ; Double_t lMin = bordersL[iL-1];; Double_t lMax = bordersL[iL]; ; if(pt_jpsi>ptMin && pt_jpsi<ptMax && TMath::Abs(y_jpsi)>rapMin && TMath::Abs(y_jpsi)<rapMax && lifetime>lMin && lifetime<lMax){ iRAPindex=iRAP; iPTindex=iPT; iLindex=iL; } } } } double lifetimeErrRand = h_ctauerr_2011[iRAPindex][iPTindex][iLindex]->GetRandom(); lifetimeErr = lifetimeErrRand; if (ientries%10000==0){ std::cout << "Test output: lifetimeErr " << lifetimeErr << " randomly drawn from from " << h_ctauerr_2011[iRAPindex][iPTindex][iLindex]->GetName() << std::endl; } */ if ( M > chicMass->getMin() && M < chicMass->getMax() && pt > chicPt->getMin() && pt < chicPt->getMax() && y > chicRap->getMin() && y < chicRap->getMax() && M_jpsi > JpsiMass->getMin() && M_jpsi < JpsiMass->getMax() && pt_jpsi > JpsiPt->getMin() && pt_jpsi < JpsiPt->getMax() && y_jpsi > JpsiRap->getMin() && y_jpsi < JpsiRap->getMax() && lifetime > Jpsict->getMin() && lifetime < Jpsict->getMax() && lifetimeErr > JpsictErr->getMin() && lifetimeErr < JpsictErr->getMax() ) { chicPt ->setVal(pt); chicRap ->setVal(y); chicMass ->setVal(M); JpsiMass ->setVal(M_jpsi); JpsiPt ->setVal(pt_jpsi); JpsiRap ->setVal(y_jpsi); Jpsict ->setVal(lifetime); JpsictErr ->setVal(lifetimeErr); //cout<<"JpsiRap->getVal() "<<JpsiRap->getVal()<<endl; fullData->add(dataVars); numEntriesInAnalysis++; } else { numEntriesNotInAnalysis++; //if (M < chicMass->getMin() || M > chicMass->getMax()) cout << "M " << M << endl; //if (pt < chicPt->getMin() || pt > chicPt->getMax()) cout << "pt " << pt << endl; //if (y < chicRap->getMin() || y > chicRap->getMax()) cout << "y " << y << endl; //if (lifetime < Jpsict->getMin() || lifetime > Jpsict->getMax()) cout << "lifetime " << lifetime << endl; //if (lifetimeErr < JpsictErr->getMin() || lifetimeErr > JpsictErr->getMax()) cout << "lifetimeErr " << lifetimeErr << endl; //cout << "M " << M << endl; //cout << "pt " << pt << endl; //cout << "y " << y << endl; //cout << "lifetime " << lifetime << endl; //cout << "lifetimeErr " << lifetimeErr << endl; //cout << " " << endl; } }//ientries //infile->Close(); cout << "entries entering all bins " << fullData->sumEntries() << endl; cout << "numEntriesTotal " << numEntriesTotal << endl; cout << "numEntriesInAnalysis " << numEntriesInAnalysis << endl; cout << "numEntriesNotInAnalysis " << numEntriesNotInAnalysis << endl; //------------------------------------------------------------------------------------------------------------------ // Define workspace and import datasets ////Get datasets binned in pT an y for(int iRap = 0; iRap <= onia::kNbRapForPTBins; iRap++) { Double_t yMin; Double_t yMax; if(iRap==0) { yMin = onia::rapForPTRange[0]; yMax = onia::rapForPTRange[onia::kNbRapForPTBins]; } else { yMin = onia::rapForPTRange[iRap-1]; yMax = onia::rapForPTRange[iRap]; } for(int iPT = 0; iPT <= onia::kNbPTBins[iRap]; iPT++) { //for(int iPT = 0; iPT <= 0; iPT++) Double_t ptMin; Double_t ptMax; if(iPT==0) { ptMin = onia::pTRange[iRap][0]; ptMax = onia::pTRange[iRap][onia::kNbPTBins[0]]; } else { ptMin = onia::pTRange[iRap][iPT-1]; ptMax = onia::pTRange[iRap][iPT]; } // output file name and workspace std::stringstream outfilename; outfilename << "tmpFiles/backupWorkSpace/ws_createWorkspace_Chi_rap" << iRap << "_pt" << iPT << ".root"; RooWorkspace* ws = new RooWorkspace(workspacename.c_str()); // define pt and y cuts on dataset std::stringstream cutString; if(onia::KinParticleChi && !onia::KinParticleChiButJpsiRap) { cutString << "(chicPt >= " << ptMin << " && chicPt < "<< ptMax << ") && " << "(TMath::Abs(chicRap) >= " << yMin << " && TMath::Abs(chicRap) < " << yMax << ")"; } if(!onia::KinParticleChi) { cutString << "(JpsiPt >= " << ptMin << " && JpsiPt < "<< ptMax << ") && " << "(TMath::Abs(JpsiRap) >= " << yMin << " && TMath::Abs(JpsiRap) < " << yMax << ")"; } if(onia::KinParticleChi && onia::KinParticleChiButJpsiRap) { cutString << "(chicPt >= " << ptMin << " && chicPt < "<< ptMax << ") && " << "(TMath::Abs(JpsiRap) >= " << yMin << " && TMath::Abs(JpsiRap) < " << yMax << ")"; } cout << "cutString: " << cutString.str().c_str() << endl; // get the dataset for the fit RooDataSet* binData = (RooDataSet*)fullData->reduce(cutString.str().c_str()); std::stringstream name; name << "jpsi_data_rap" << iRap << "_pt" << iPT; binData->SetNameTitle(name.str().c_str(), "Data For Fitting"); cout << "numEvents = " << binData->sumEntries() << endl; double chicMeanPt = binData->mean(*chicPt); RooRealVar var_chicMeanPt("var_chicMeanPt","var_chicMeanPt",chicMeanPt); if(!ws->var("var_chicMeanPt")) ws->import(var_chicMeanPt); else ws->var("var_chicMeanPt")->setVal(chicMeanPt); cout << "chicMeanPt = " << chicMeanPt << endl; double jpsiMeanPt = binData->mean(*JpsiPt); RooRealVar var_jpsiMeanPt("var_jpsiMeanPt","var_jpsiMeanPt",jpsiMeanPt); if(!ws->var("var_jpsiMeanPt")) ws->import(var_jpsiMeanPt); else ws->var("var_jpsiMeanPt")->setVal(jpsiMeanPt); cout << "jpsiMeanPt = " << jpsiMeanPt << endl; std::stringstream cutStringPosRapChic; cutStringPosRapChic << "chicRap > 0"; RooDataSet* binDataPosRapChic = (RooDataSet*)binData->reduce(cutStringPosRapChic.str().c_str()); double chicMeanAbsRap = binDataPosRapChic->mean(*chicRap); cout << "chicMeanAbsRap = " << chicMeanAbsRap << endl; RooRealVar var_chicMeanAbsRap("var_chicMeanAbsRap","var_chicMeanAbsRap",chicMeanAbsRap); if(!ws->var("var_chicMeanAbsRap")) ws->import(var_chicMeanAbsRap); else ws->var("var_chicMeanAbsRap")->setVal(chicMeanAbsRap); std::stringstream cutStringPosRapJpsi; cutStringPosRapJpsi << "JpsiRap > 0"; RooDataSet* binDataPosRapJpsi = (RooDataSet*)binData->reduce(cutStringPosRapJpsi.str().c_str()); double jpsiMeanAbsRap = binDataPosRapJpsi->mean(*JpsiRap); cout << "jpsiMeanAbsRap = " << jpsiMeanAbsRap << endl; RooRealVar var_jpsiMeanAbsRap("var_jpsiMeanAbsRap","var_jpsiMeanAbsRap",jpsiMeanAbsRap); if(!ws->var("var_jpsiMeanAbsRap")) ws->import(var_jpsiMeanAbsRap); else ws->var("var_jpsiMeanAbsRap")->setVal(jpsiMeanAbsRap); // Import variables to workspace ws->import(*binData); ws->writeToFile(outfilename.str().c_str()); }//iPT }//iRap ////--------------------------------------------------------------- ////--Integrating rapidity and pt bins, in +/- 3*sigma mass window ////--------------------------------------------------------------- if(drawRapPt2D) { double yMin = onia::rapForPTRange[0]; double yMax = 1.6;//onia::rapForPTRange[onia::kNbRapForPTBins]; double ptMin = onia::pTRange[0][0]; double ptMax = onia::pTRange[0][onia::kNbPTBins[0]]; std::stringstream cutRapPt; cutRapPt << "(chicPt > " << ptMin << " && chicPt < "<< ptMax << ") && " << "(TMath::Abs(chicRap) > " << yMin << " && TMath::Abs(chicRap) < " << yMax << ")"; cout<<"cutRapPt: "<<cutRapPt.str().c_str()<<endl; RooDataSet* rapPtData = (RooDataSet*)fullData->reduce(cutRapPt.str().c_str()); std::stringstream nameRapPt; nameRapPt << "data_rap0_pt0"; rapPtData->SetNameTitle(nameRapPt.str().c_str(), "Data For full rap and pt"); // output file name and workspace std::stringstream outfilename; outfilename << "tmpFiles/backupWorkSpace/ws_createWorkspace_Chi_rap0_pt0.root"; RooWorkspace* ws_RapPt = new RooWorkspace(workspacename.c_str()); //Import variables to workspace ws_RapPt->import(*rapPtData); ws_RapPt->writeToFile(outfilename.str().c_str()); TH2D* rapPt; TH1D* rap1p2; double MassMin; double MassMax; rap1p2 = new TH1D("rap1p2","rap1p2",30,1.2, 1.8); if(nState==4) { rapPt = new TH2D( "rapPt", "rapPt", 52,-1.3,1.3,144,0,72); MassMin=3.011;//massPsi1S-onia::nSigMass*sigma1S; MassMax=3.174;//massPsi1S+onia::nSigMass*sigma1S; // sigma 27.2 MeV // mean 3.093 GeV } if(nState==5) { rapPt = new TH2D( "rapPt", "rapPt", 64,-1.6,1.6,144,0,72); // rap<1.5 //rapPt = new TH2D( "rapPt", "rapPt", 52,-1.3,1.3,144,0,72); // rap<1.2 MassMin=3.576;//massPsi2S-onia::nSigMass*sigma2S; MassMax=3.786;//massPsi2S+onia::nSigMass*sigma2S; // sigma 34.9 MeV // pT > 7 // sigma 34.3 MeV // pT > 10 // mean 3.681 GeV } cout<<"Plotting rap-Pt for Psi"<<nState-3<<"S"<<endl; cout<<"MassMin for rap-Pt plot = "<<MassMin<<endl; cout<<"MassMax for rap-Pt plot = "<<MassMax<<endl; TTree *rapPtTree = (TTree*)rapPtData->tree(); std::stringstream cutMass; cutMass<<"(chicMass > " << MassMin << " && chicMass < "<< MassMax << ")"; //following two methods can only be used in root_v30, 34 does not work rapPtTree->Draw("chicPt:chicRap>>rapPt",cutMass.str().c_str(),"colz"); cout<<"debug"<<endl; rapPtTree->Draw("TMath::Abs(chicRap)>>rap1p2",cutMass.str().c_str()); TCanvas* c2 = new TCanvas("c2","c2",1200,1500); rapPt->SetYTitle("p_{T}(#mu#mu) [GeV]"); rapPt->SetXTitle("y(#mu#mu)"); gStyle->SetPalette(1); gPad->SetFillColor(kWhite); rapPt->SetTitle(0); rapPt->SetStats(0); gPad->SetLeftMargin(0.15); gPad->SetRightMargin(0.17); rapPt->GetYaxis()->SetTitleOffset(1.5); rapPt->Draw("colz"); TLine* rapPtLine; for(int iRap=0; iRap<onia::kNbRapForPTBins+1; iRap++) { rapPtLine= new TLine( -onia::rapForPTRange[iRap], onia::pTRange[0][0], -onia::rapForPTRange[iRap], onia::pTRange[0][onia::kNbPTBins[iRap]] ); rapPtLine->SetLineWidth( 2 ); rapPtLine->SetLineStyle( 1 ); rapPtLine->SetLineColor( kWhite ); rapPtLine->Draw(); rapPtLine= new TLine( onia::rapForPTRange[iRap], onia::pTRange[0][0], onia::rapForPTRange[iRap], onia::pTRange[0][onia::kNbPTBins[iRap]] ); rapPtLine->SetLineWidth( 2 ); rapPtLine->SetLineStyle( 1 ); rapPtLine->SetLineColor( kWhite ); rapPtLine->Draw(); int pTBegin = 0; if(nState==5) pTBegin = 1; for(int iPt=pTBegin; iPt<onia::kNbPTBins[iRap+1]+1; iPt++) { rapPtLine= new TLine( -onia::rapForPTRange[onia::kNbRapForPTBins], onia::pTRange[0][iPt], onia::rapForPTRange[onia::kNbRapForPTBins], onia::pTRange[0][iPt] ); rapPtLine->SetLineWidth( 2 ); rapPtLine->SetLineStyle( 1 ); rapPtLine->SetLineColor( kWhite ); rapPtLine->Draw(); } } char savename[200]; sprintf(savename,"Figures/rapPt_Chi.pdf"); c2->SaveAs(savename); TCanvas* c3 = new TCanvas("c3","c3",1500,1200); rap1p2->SetYTitle("Events"); rap1p2->SetXTitle("y(#mu#mu)"); rap1p2->SetTitle(0); rap1p2->SetStats(0); rap1p2->GetYaxis()->SetTitleOffset(1.2); rap1p2->Draw(); sprintf(savename,"Figures/rap_Chi_1p2.pdf"); c3->SaveAs(savename); } f->Close(); }
void eregtesting_13TeV_Pi0(bool dobarrel=true, bool doele=false,int gammaID=0) { //output dir TString EEorEB = "EE"; if(dobarrel) { EEorEB = "EB"; } TString gammaDir = "bothGammas"; if(gammaID==1) { gammaDir = "gamma1"; } else if(gammaID==2) { gammaDir = "gamma2"; } TString dirname = TString::Format("ereg_test_plots/%s_%s",gammaDir.Data(),EEorEB.Data()); gSystem->mkdir(dirname,true); gSystem->cd(dirname); //read workspace from training TString fname; if (doele && dobarrel) fname = "wereg_ele_eb.root"; else if (doele && !dobarrel) fname = "wereg_ele_ee.root"; else if (!doele && dobarrel) fname = "wereg_ph_eb.root"; else if (!doele && !dobarrel) fname = "wereg_ph_ee.root"; TString infile = TString::Format("../../ereg_ws/%s/%s",gammaDir.Data(),fname.Data()); TFile *fws = TFile::Open(infile); RooWorkspace *ws = (RooWorkspace*)fws->Get("wereg"); //read variables from workspace RooGBRTargetFlex *meantgt = static_cast<RooGBRTargetFlex*>(ws->arg("sigmeant")); RooRealVar *tgtvar = ws->var("tgtvar"); RooArgList vars; vars.add(meantgt->FuncVars()); vars.add(*tgtvar); //read testing dataset from TTree RooRealVar weightvar("weightvar","",1.); TTree *dtree; if (doele) { //TFile *fdin = TFile::Open("root://eoscms.cern.ch//eos/cms/store/cmst3/user/bendavid/regTreesAug1/hgg-2013Final8TeV_reg_s12-zllm50-v7n_noskim.root"); TFile *fdin = TFile::Open("/data/bendavid/regTreesAug1/hgg-2013Final8TeV_reg_s12-zllm50-v7n_noskim.root"); TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterSingleInvert"); dtree = (TTree*)ddir->Get("hPhotonTreeSingle"); } else { if(dobarrel) { TFile *fdin = TFile::Open("/afs/cern.ch/work/z/zhicaiz/public/ECALpro_MC_TreeForRegression/Gun_Pi0_Pt1To15_FlatPU0to50RAW_withHLT_80X_mcRun2_GEN-SIM-RAW_ALL_EcalNtp_ALL_EB_combine_test.root");//("root://eoscms.cern.ch///eos/cms/store/cmst3/user/bendavid/idTreesAug1/hgg-2013Final8TeV_ID_s12-h124gg-gf-v7n_noskim.root"); // TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterPreselNoSmear"); if(gammaID==0) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma"); } else if(gammaID==1) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma1"); } else if(gammaID==2) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma2"); } } else { TFile *fdin = TFile::Open("/afs/cern.ch/work/z/zhicaiz/public/ECALpro_MC_TreeForRegression/Gun_Pi0_Pt1To15_FlatPU0to50RAW_withHLT_80X_mcRun2_GEN-SIM-RAW_ALL_EcalNtp_ALL_EE_combine_test.root");//("root://eoscms.cern.ch///eos/cms/store/cmst3/user/bendavid/idTreesAug1/hgg-2013Final8TeV_ID_s12-h124gg-gf-v7n_noskim.root"); // TDirectory *ddir = (TDirectory*)fdin->FindObjectAny("PhotonTreeWriterPreselNoSmear"); if(gammaID==0) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma"); } else if(gammaID==1) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma1"); } else if(gammaID==2) { dtree = (TTree*)fdin->Get("Tree_Optim_gamma2"); } } } //selection cuts for testing //TCut selcut = "(STr2_enG1_true/cosh(STr2_Eta_1)>1.0) && (STr2_S4S9_1>0.75)"; TCut selcut = "(STr2_enG_nocor/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03)"; //TCut selcut = "(STr2_enG_nocor/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (abs(STr2_iEtaiX)<60)"; //TCut selcut = "(STr2_enG_nocor/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.75) && (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (abs(STr2_iEtaiX)>60)"; //TCut selcut = "(STr2_enG_nocor/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.9) && (STr2_S2S9>0.85)&& (STr2_isMerging < 2) && (STr2_DeltaR < 0.03) && (abs(STr2_iEtaiX)<60)"; //TCut selcut = "(STr2_enG_nocor/cosh(STr2_Eta)>1.0) && (STr2_S4S9 > 0.9) && (STr2_S2S9>0.85)&& (STr2_isMerging < 2) && (STr2_DeltaR < 0.03)"; /* TCut selcut; if (dobarrel) selcut = "ph.genpt>25. && ph.isbarrel && ph.ispromptgen"; else selcut = "ph.genpt>25. && !ph.isbarrel && ph.ispromptgen"; */ TCut selweight = "xsecweight(procidx)*puweight(numPU,procidx)"; TCut prescale10 = "(Entry$%10==0)"; TCut prescale10alt = "(Entry$%10==1)"; TCut prescale25 = "(Entry$%25==0)"; TCut prescale100 = "(Entry$%100==0)"; TCut prescale1000 = "(Entry$%1000==0)"; TCut evenevents = "(Entry$%2==0)"; TCut oddevents = "(Entry$%2==1)"; TCut prescale100alt = "(Entry$%100==1)"; TCut prescale1000alt = "(Entry$%1000==1)"; TCut prescale50alt = "(Entry$%50==1)"; TCut Events3_4 = "(Entry$%4==3)"; TCut Events1_4 = "(Entry$%4==1)"; TCut Events2_4 = "(Entry$%4==2)"; TCut Events0_4 = "(Entry$%4==0)"; TCut Events01_4 = "(Entry$%4<2)"; TCut Events23_4 = "(Entry$%4>1)"; if (doele) weightvar.SetTitle(prescale100alt*selcut); else weightvar.SetTitle(selcut); //make testing dataset RooDataSet *hdata = RooTreeConvert::CreateDataSet("hdata",dtree,vars,weightvar); if (doele) weightvar.SetTitle(prescale1000alt*selcut); else weightvar.SetTitle(prescale10alt*selcut); //make reduced testing dataset for integration over conditional variables RooDataSet *hdatasmall = RooTreeConvert::CreateDataSet("hdatasmall",dtree,vars,weightvar); //retrieve full pdf from workspace RooAbsPdf *sigpdf = ws->pdf("sigpdf"); //input variable corresponding to sceta RooRealVar *scetavar = ws->var("var_1"); RooRealVar *scphivar = ws->var("var_2"); //regressed output functions RooAbsReal *sigmeanlim = ws->function("sigmeanlim"); RooAbsReal *sigwidthlim = ws->function("sigwidthlim"); RooAbsReal *signlim = ws->function("signlim"); RooAbsReal *sign2lim = ws->function("sign2lim"); RooAbsReal *sigalphalim = ws->function("sigalphalim"); RooAbsReal *sigalpha2lim = ws->function("sigalpha2lim"); //formula for corrected energy/true energy ( 1.0/(etrue/eraw) * regression mean) RooFormulaVar ecor("ecor","","1./(@0)*@1",RooArgList(*tgtvar,*sigmeanlim)); RooRealVar *ecorvar = (RooRealVar*)hdata->addColumn(ecor); ecorvar->setRange(0.,2.); ecorvar->setBins(800); //formula for raw energy/true energy (1.0/(etrue/eraw)) RooFormulaVar raw("raw","","1./@0",RooArgList(*tgtvar)); RooRealVar *rawvar = (RooRealVar*)hdata->addColumn(raw); rawvar->setRange(0.,2.); rawvar->setBins(800); //clone data and add regression outputs for plotting RooDataSet *hdataclone = new RooDataSet(*hdata,"hdataclone"); RooRealVar *meanvar = (RooRealVar*)hdataclone->addColumn(*sigmeanlim); RooRealVar *widthvar = (RooRealVar*)hdataclone->addColumn(*sigwidthlim); RooRealVar *nvar = (RooRealVar*)hdataclone->addColumn(*signlim); RooRealVar *n2var = (RooRealVar*)hdataclone->addColumn(*sign2lim); RooRealVar *alphavar = (RooRealVar*)hdataclone->addColumn(*sigalphalim); RooRealVar *alpha2var = (RooRealVar*)hdataclone->addColumn(*sigalpha2lim); //plot target variable and weighted regression prediction (using numerical integration over reduced testing dataset) TCanvas *craw = new TCanvas; //RooPlot *plot = tgtvar->frame(0.6,1.2,100); RooPlot *plot = tgtvar->frame(0.6,2.0,100); hdata->plotOn(plot); sigpdf->plotOn(plot,ProjWData(*hdatasmall)); plot->Draw(); craw->SaveAs("RawE.pdf"); craw->SaveAs("RawE.png"); craw->SetLogy(); plot->SetMinimum(0.1); craw->SaveAs("RawElog.pdf"); craw->SaveAs("RawElog.png"); //plot distribution of regressed functions over testing dataset TCanvas *cmean = new TCanvas; RooPlot *plotmean = meanvar->frame(0.8,2.0,100); hdataclone->plotOn(plotmean); plotmean->Draw(); cmean->SaveAs("mean.pdf"); cmean->SaveAs("mean.png"); TCanvas *cwidth = new TCanvas; RooPlot *plotwidth = widthvar->frame(0.,0.05,100); hdataclone->plotOn(plotwidth); plotwidth->Draw(); cwidth->SaveAs("width.pdf"); cwidth->SaveAs("width.png"); TCanvas *cn = new TCanvas; RooPlot *plotn = nvar->frame(0.,111.,200); hdataclone->plotOn(plotn); plotn->Draw(); cn->SaveAs("n.pdf"); cn->SaveAs("n.png"); TCanvas *cn2 = new TCanvas; RooPlot *plotn2 = n2var->frame(0.,111.,100); hdataclone->plotOn(plotn2); plotn2->Draw(); cn2->SaveAs("n2.pdf"); cn2->SaveAs("n2.png"); TCanvas *calpha = new TCanvas; RooPlot *plotalpha = alphavar->frame(0.,5.,200); hdataclone->plotOn(plotalpha); plotalpha->Draw(); calpha->SaveAs("alpha.pdf"); calpha->SaveAs("alpha.png"); TCanvas *calpha2 = new TCanvas; RooPlot *plotalpha2 = alpha2var->frame(0.,5.,200); hdataclone->plotOn(plotalpha2); plotalpha2->Draw(); calpha2->SaveAs("alpha2.pdf"); calpha2->SaveAs("alpha2.png"); TCanvas *ceta = new TCanvas; RooPlot *ploteta = scetavar->frame(-2.6,2.6,200); hdataclone->plotOn(ploteta); ploteta->Draw(); ceta->SaveAs("eta.pdf"); ceta->SaveAs("eta.png"); //create histograms for eraw/etrue and ecor/etrue to quantify regression performance TH1 *heraw;// = hdata->createHistogram("hraw",*rawvar,Binning(800,0.,2.)); TH1 *hecor;// = hdata->createHistogram("hecor",*ecorvar); if (EEorEB == "EB") { heraw = hdata->createHistogram("hraw",*rawvar,Binning(800,0.8,1.1)); hecor = hdata->createHistogram("hecor",*ecorvar, Binning(800,0.8,1.1)); } else { heraw = hdata->createHistogram("hraw",*rawvar,Binning(200,0.,2.)); hecor = hdata->createHistogram("hecor",*ecorvar, Binning(200,0.,2.)); } //heold->SetLineColor(kRed); hecor->SetLineColor(kBlue); heraw->SetLineColor(kMagenta); hecor->GetYaxis()->SetRangeUser(1.0,1.3*hecor->GetMaximum()); heraw->GetYaxis()->SetRangeUser(1.0,1.3*hecor->GetMaximum()); hecor->GetXaxis()->SetRangeUser(0.0,1.5); heraw->GetXaxis()->SetRangeUser(0.0,1.5); /*if(EEorEB == "EE") { heraw->GetYaxis()->SetRangeUser(10.0,200.0); hecor->GetYaxis()->SetRangeUser(10.0,200.0); } */ //heold->GetXaxis()->SetRangeUser(0.6,1.2); double effsigma_cor, effsigma_raw, fwhm_cor, fwhm_raw; if(EEorEB == "EB") { TH1 *hecorfine = hdata->createHistogram("hecorfine",*ecorvar,Binning(200,0.,2.)); effsigma_cor = effSigma(hecorfine); fwhm_cor = FWHM(hecorfine); TH1 *herawfine = hdata->createHistogram("herawfine",*rawvar,Binning(200,0.,2.)); effsigma_raw = effSigma(herawfine); fwhm_raw = FWHM(herawfine); } else { TH1 *hecorfine = hdata->createHistogram("hecorfine",*ecorvar,Binning(200,0.,2.)); effsigma_cor = effSigma(hecorfine); fwhm_cor = FWHM(hecorfine); TH1 *herawfine = hdata->createHistogram("herawfine",*rawvar,Binning(200,0.,2.)); effsigma_raw = effSigma(herawfine); fwhm_raw = FWHM(herawfine); } TCanvas *cresponse = new TCanvas; gStyle->SetOptStat(0); gStyle->SetPalette(107); hecor->SetTitle(""); heraw->SetTitle(""); hecor->Draw("HIST"); //heold->Draw("HISTSAME"); heraw->Draw("HISTSAME"); //show errSigma in the plot TLegend *leg = new TLegend(0.1, 0.75, 0.7, 0.9); leg->AddEntry(hecor,Form("E_{cor}/E_{true}, #sigma_{eff}=%4.3f, FWHM=%4.3f", effsigma_cor, fwhm_cor),"l"); leg->AddEntry(heraw,Form("E_{raw}/E_{true}, #sigma_{eff}=%4.3f, FWHM=%4.3f", effsigma_raw, fwhm_raw),"l"); leg->SetFillStyle(0); leg->SetBorderSize(0); // leg->SetTextColor(kRed); leg->Draw(); cresponse->SaveAs("response.pdf"); cresponse->SaveAs("response.png"); cresponse->SetLogy(); cresponse->SaveAs("responselog.pdf"); cresponse->SaveAs("responselog.png"); // draw CCs vs eta and phi TCanvas *c_eta = new TCanvas; TH1 *h_eta = hdata->createHistogram("h_eta",*scetavar,Binning(100,-3.2,3.2)); h_eta->Draw("HIST"); c_eta->SaveAs("heta.pdf"); c_eta->SaveAs("heta.png"); TCanvas *c_phi = new TCanvas; TH1 *h_phi = hdata->createHistogram("h_phi",*scphivar,Binning(100,-3.2,3.2)); h_phi->Draw("HIST"); c_phi->SaveAs("hphi.pdf"); c_phi->SaveAs("hphi.png"); RooRealVar *scetaiXvar = ws->var("var_6"); RooRealVar *scphiiYvar = ws->var("var_7"); if(EEorEB=="EB") { scetaiXvar->setRange(-90,90); scetaiXvar->setBins(180); scphiiYvar->setRange(0,360); scphiiYvar->setBins(360); } else { scetaiXvar->setRange(0,50); scetaiXvar->setBins(50); scphiiYvar->setRange(0,50); scphiiYvar->setBins(50); } ecorvar->setRange(0.5,1.5); ecorvar->setBins(800); rawvar->setRange(0.5,1.5); rawvar->setBins(800); TCanvas *c_cor_eta = new TCanvas; TH2F *h_CC_eta = hdata->createHistogram(*scetaiXvar, *ecorvar, "","cor_vs_eta"); if(EEorEB=="EB") { h_CC_eta->GetXaxis()->SetTitle("i#eta"); } else { h_CC_eta->GetXaxis()->SetTitle("iX"); } h_CC_eta->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_eta->Draw("COLZ"); c_cor_eta->SaveAs("cor_vs_eta.pdf"); c_cor_eta->SaveAs("cor_vs_eta.png"); TCanvas *c_cor_phi = new TCanvas; TH2F *h_CC_phi = hdata->createHistogram(*scphiiYvar, *ecorvar, "","cor_vs_phi"); if(EEorEB=="EB") { h_CC_phi->GetXaxis()->SetTitle("i#phi"); } else { h_CC_phi->GetXaxis()->SetTitle("iY"); } h_CC_phi->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_phi->Draw("COLZ"); c_cor_phi->SaveAs("cor_vs_phi.pdf"); c_cor_phi->SaveAs("cor_vs_phi.png"); TCanvas *c_raw_eta = new TCanvas; TH2F *h_RC_eta = hdata->createHistogram(*scetaiXvar, *rawvar, "","raw_vs_eta"); if(EEorEB=="EB") { h_RC_eta->GetXaxis()->SetTitle("i#eta"); } else { h_RC_eta->GetXaxis()->SetTitle("iX"); } h_RC_eta->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_eta->Draw("COLZ"); c_raw_eta->SaveAs("raw_vs_eta.pdf"); c_raw_eta->SaveAs("raw_vs_eta.png"); TCanvas *c_raw_phi = new TCanvas; TH2F *h_RC_phi = hdata->createHistogram(*scphiiYvar, *rawvar, "","raw_vs_phi"); if(EEorEB=="EB") { h_RC_phi->GetXaxis()->SetTitle("i#phi"); } else { h_RC_phi->GetXaxis()->SetTitle("iY"); } h_RC_phi->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_phi->Draw("COLZ"); c_raw_phi->SaveAs("raw_vs_phi.pdf"); c_raw_phi->SaveAs("raw_vs_phi.png"); //on2,5,20, etc if(EEorEB == "EB") { TCanvas *myC_iCrystal_mod = new TCanvas; RooRealVar *iEtaOn5var = ws->var("var_8"); iEtaOn5var->setRange(0,5); iEtaOn5var->setBins(5); TH2F *h_CC_iEtaOn5 = hdata->createHistogram(*iEtaOn5var, *ecorvar, "","cor_vs_iEtaOn5"); h_CC_iEtaOn5->GetXaxis()->SetTitle("iEtaOn5"); h_CC_iEtaOn5->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_iEtaOn5->Draw("COLZ"); myC_iCrystal_mod->SaveAs("cor_vs_iEtaOn5.pdf"); myC_iCrystal_mod->SaveAs("cor_vs_iEtaOn5.png"); TH2F *h_RC_iEtaOn5 = hdata->createHistogram(*iEtaOn5var, *rawvar, "","raw_vs_iEtaOn5"); h_RC_iEtaOn5->GetXaxis()->SetTitle("iEtaOn5"); h_RC_iEtaOn5->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_iEtaOn5->Draw("COLZ"); myC_iCrystal_mod->SaveAs("raw_vs_iEtaOn5.pdf"); myC_iCrystal_mod->SaveAs("raw_vs_iEtaOn5.png"); RooRealVar *iPhiOn2var = ws->var("var_9"); iPhiOn2var->setRange(0,2); iPhiOn2var->setBins(2); TH2F *h_CC_iPhiOn2 = hdata->createHistogram(*iPhiOn2var, *ecorvar, "","cor_vs_iPhiOn2"); h_CC_iPhiOn2->GetXaxis()->SetTitle("iPhiOn2"); h_CC_iPhiOn2->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_iPhiOn2->Draw("COLZ"); myC_iCrystal_mod->SaveAs("cor_vs_iPhiOn2.pdf"); myC_iCrystal_mod->SaveAs("cor_vs_iPhiOn2.png"); TH2F *h_RC_iPhiOn2 = hdata->createHistogram(*iPhiOn2var, *rawvar, "","raw_vs_iPhiOn2"); h_RC_iPhiOn2->GetXaxis()->SetTitle("iPhiOn2"); h_RC_iPhiOn2->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_iPhiOn2->Draw("COLZ"); myC_iCrystal_mod->SaveAs("raw_vs_iPhiOn2.pdf"); myC_iCrystal_mod->SaveAs("raw_vs_iPhiOn2.png"); RooRealVar *iPhiOn20var = ws->var("var_10"); iPhiOn20var->setRange(0,20); iPhiOn20var->setBins(20); TH2F *h_CC_iPhiOn20 = hdata->createHistogram(*iPhiOn20var, *ecorvar, "","cor_vs_iPhiOn20"); h_CC_iPhiOn20->GetXaxis()->SetTitle("iPhiOn20"); h_CC_iPhiOn20->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_iPhiOn20->Draw("COLZ"); myC_iCrystal_mod->SaveAs("cor_vs_iPhiOn20.pdf"); myC_iCrystal_mod->SaveAs("cor_vs_iPhiOn20.png"); TH2F *h_RC_iPhiOn20 = hdata->createHistogram(*iPhiOn20var, *rawvar, "","raw_vs_iPhiOn20"); h_RC_iPhiOn20->GetXaxis()->SetTitle("iPhiOn20"); h_RC_iPhiOn20->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_iPhiOn20->Draw("COLZ"); myC_iCrystal_mod->SaveAs("raw_vs_iPhiOn20.pdf"); myC_iCrystal_mod->SaveAs("raw_vs_iPhiOn20.png"); RooRealVar *iEtaOn2520var = ws->var("var_11"); iEtaOn2520var->setRange(-25,25); iEtaOn2520var->setBins(50); TH2F *h_CC_iEtaOn2520 = hdata->createHistogram(*iEtaOn2520var, *ecorvar, "","cor_vs_iEtaOn2520"); h_CC_iEtaOn2520->GetXaxis()->SetTitle("iEtaOn2520"); h_CC_iEtaOn2520->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_iEtaOn2520->Draw("COLZ"); myC_iCrystal_mod->SaveAs("cor_vs_iEtaOn2520.pdf"); myC_iCrystal_mod->SaveAs("cor_vs_iEtaOn2520.png"); TH2F *h_RC_iEtaOn2520 = hdata->createHistogram(*iEtaOn2520var, *rawvar, "","raw_vs_iEtaOn2520"); h_RC_iEtaOn2520->GetXaxis()->SetTitle("iEtaOn2520"); h_RC_iEtaOn2520->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_iEtaOn2520->Draw("COLZ"); myC_iCrystal_mod->SaveAs("raw_vs_iEtaOn2520.pdf"); myC_iCrystal_mod->SaveAs("raw_vs_iEtaOn2520.png"); } // other variables TCanvas *myC_variables = new TCanvas; RooRealVar *Nxtalvar = ws->var("var_3"); Nxtalvar->setRange(0,10); Nxtalvar->setBins(10); TH2F *h_CC_Nxtal = hdata->createHistogram(*Nxtalvar, *ecorvar, "","cor_vs_Nxtal"); h_CC_Nxtal->GetXaxis()->SetTitle("Nxtal"); h_CC_Nxtal->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_Nxtal->Draw("COLZ"); myC_variables->SaveAs("cor_vs_Nxtal.pdf"); myC_variables->SaveAs("cor_vs_Nxtal.png"); TH2F *h_RC_Nxtal = hdata->createHistogram(*Nxtalvar, *rawvar, "","raw_vs_Nxtal"); h_RC_Nxtal->GetXaxis()->SetTitle("Nxtal"); h_RC_Nxtal->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_Nxtal->Draw("COLZ"); myC_variables->SaveAs("raw_vs_Nxtal.pdf"); myC_variables->SaveAs("raw_vs_Nxtal.png"); RooRealVar *S4S9var = ws->var("var_4"); int Nbins_S4S9 = 100; double Low_S4S9 = 0.6; double High_S4S9 = 1.0; S4S9var->setRange(Low_S4S9,High_S4S9); S4S9var->setBins(Nbins_S4S9); TH2F *h_CC_S4S9 = hdata->createHistogram(*S4S9var, *ecorvar, "","cor_vs_S4S9"); h_CC_S4S9->GetXaxis()->SetTitle("S4S9"); h_CC_S4S9->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_S4S9->Draw("COLZ"); myC_variables->SaveAs("cor_vs_S4S9.pdf"); myC_variables->SaveAs("cor_vs_S4S9.png"); TH2F *h_RC_S4S9 = hdata->createHistogram(*S4S9var, *rawvar, "","raw_vs_S4S9"); h_RC_S4S9->GetXaxis()->SetTitle("S4S9"); h_RC_S4S9->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_S4S9->Draw("COLZ"); myC_variables->SaveAs("raw_vs_S4S9.pdf"); myC_variables->SaveAs("raw_vs_S4S9.png"); /* RooRealVar *S1S9var = ws->var("var_5"); S1S9var->setRange(0.3,1.0); S1S9var->setBins(100); TH2F *h_CC_S1S9 = hdata->createHistogram(*S1S9var, *ecorvar, "","cor_vs_S1S9"); h_CC_S1S9->GetXaxis()->SetTitle("S1S9"); h_CC_S1S9->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_S1S9->Draw("COLZ"); myC_variables->SaveAs("cor_vs_S1S9.pdf"); TH2F *h_RC_S1S9 = hdata->createHistogram(*S1S9var, *rawvar, "","raw_vs_S1S9"); h_RC_S1S9->GetXaxis()->SetTitle("S1S9"); h_RC_S1S9->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_S1S9->Draw("COLZ"); myC_variables->SaveAs("raw_vs_S1S9.pdf"); */ RooRealVar *S2S9var = ws->var("var_5"); int Nbins_S2S9 = 100; double Low_S2S9 = 0.5; double High_S2S9 = 1.0; S2S9var->setRange(Low_S2S9,High_S2S9); S2S9var->setBins(Nbins_S2S9); TH2F *h_CC_S2S9 = hdata->createHistogram(*S2S9var, *ecorvar, "","cor_vs_S2S9"); h_CC_S2S9->GetXaxis()->SetTitle("S2S9"); h_CC_S2S9->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_S2S9->Draw("COLZ"); myC_variables->SaveAs("cor_vs_S2S9.pdf"); myC_variables->SaveAs("cor_vs_S2S9.png"); TH2F *h_RC_S2S9 = hdata->createHistogram(*S2S9var, *rawvar, "","raw_vs_S2S9"); h_RC_S2S9->GetXaxis()->SetTitle("S2S9"); h_RC_S2S9->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_S2S9->Draw("COLZ"); myC_variables->SaveAs("raw_vs_S2S9.pdf"); myC_variables->SaveAs("raw_vs_S2S9.png"); TH2F *h_S2S9_eta = hdata->createHistogram(*scetaiXvar, *S2S9var, "","S2S9_vs_eta"); h_S2S9_eta->GetYaxis()->SetTitle("S2S9"); if(EEorEB=="EB") { h_CC_eta->GetYaxis()->SetTitle("i#eta"); } else { h_CC_eta->GetYaxis()->SetTitle("iX"); } h_S2S9_eta->Draw("COLZ"); myC_variables->SaveAs("S2S9_vs_eta.pdf"); myC_variables->SaveAs("S2S9_vs_eta.png"); TH2F *h_S4S9_eta = hdata->createHistogram(*scetaiXvar, *S4S9var, "","S4S9_vs_eta"); h_S4S9_eta->GetYaxis()->SetTitle("S4S9"); if(EEorEB=="EB") { h_CC_eta->GetYaxis()->SetTitle("i#eta"); } else { h_CC_eta->GetYaxis()->SetTitle("iX"); } h_S4S9_eta->Draw("COLZ"); myC_variables->SaveAs("S4S9_vs_eta.pdf"); myC_variables->SaveAs("S4S9_vs_eta.png"); TH2F *h_S2S9_phi = hdata->createHistogram(*scphiiYvar, *S2S9var, "","S2S9_vs_phi"); h_S2S9_phi->GetYaxis()->SetTitle("S2S9"); if(EEorEB=="EB") { h_CC_phi->GetYaxis()->SetTitle("i#phi"); } else { h_CC_phi->GetYaxis()->SetTitle("iY"); } h_S2S9_phi->Draw("COLZ"); myC_variables->SaveAs("S2S9_vs_phi.pdf"); myC_variables->SaveAs("S2S9_vs_phi.png"); TH2F *h_S4S9_phi = hdata->createHistogram(*scphiiYvar, *S4S9var, "","S4S9_vs_phi"); h_S4S9_phi->GetYaxis()->SetTitle("S4S9"); if(EEorEB=="EB") { h_CC_phi->GetYaxis()->SetTitle("i#phi"); } else { h_CC_phi->GetYaxis()->SetTitle("iY"); } h_S4S9_phi->Draw("COLZ"); myC_variables->SaveAs("S4S9_vs_phi.pdf"); myC_variables->SaveAs("S4S9_vs_phi.png"); /* RooRealVar *DeltaRvar = ws->var("var_6"); DeltaRvar->setRange(0.0,0.1); DeltaRvar->setBins(100); TH2F *h_CC_DeltaR = hdata->createHistogram(*DeltaRvar, *ecorvar, "","cor_vs_DeltaR"); h_CC_DeltaR->GetXaxis()->SetTitle("#Delta R"); h_CC_DeltaR->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_DeltaR->Draw("COLZ"); myC_variables->SaveAs("cor_vs_DeltaR.pdf"); myC_variables->SaveAs("cor_vs_DeltaR.png"); TH2F *h_RC_DeltaR = hdata->createHistogram(*DeltaRvar, *rawvar, "","raw_vs_DeltaR"); h_RC_DeltaR->GetXaxis()->SetTitle("#Delta R"); h_RC_DeltaR->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_DeltaR->Draw("COLZ"); myC_variables->SaveAs("raw_vs_DeltaR.pdf"); myC_variables->SaveAs("raw_vs_DeltaR.png"); */ if(EEorEB=="EE") { /* RooRealVar *Es_e1var = ws->var("var_9"); Es_e1var->setRange(0.0,200.0); Es_e1var->setBins(1000); TH2F *h_CC_Es_e1 = hdata->createHistogram(*Es_e1var, *ecorvar, "","cor_vs_Es_e1"); h_CC_Es_e1->GetXaxis()->SetTitle("Es_e1"); h_CC_Es_e1->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_Es_e1->Draw("COLZ"); myC_variables->SaveAs("cor_vs_Es_e1.pdf"); myC_variables->SaveAs("cor_vs_Es_e1.png"); TH2F *h_RC_Es_e1 = hdata->createHistogram(*Es_e1var, *rawvar, "","raw_vs_Es_e1"); h_RC_Es_e1->GetXaxis()->SetTitle("Es_e1"); h_RC_Es_e1->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_Es_e1->Draw("COLZ"); myC_variables->SaveAs("raw_vs_Es_e1.pdf"); myC_variables->SaveAs("raw_vs_Es_e1.png"); RooRealVar *Es_e2var = ws->var("var_10"); Es_e2var->setRange(0.0,200.0); Es_e2var->setBins(1000); TH2F *h_CC_Es_e2 = hdata->createHistogram(*Es_e2var, *ecorvar, "","cor_vs_Es_e2"); h_CC_Es_e2->GetXaxis()->SetTitle("Es_e2"); h_CC_Es_e2->GetYaxis()->SetTitle("E_{cor}/E_{true}"); h_CC_Es_e2->Draw("COLZ"); myC_variables->SaveAs("cor_vs_Es_e2.pdf"); myC_variables->SaveAs("cor_vs_Es_e2.png"); TH2F *h_RC_Es_e2 = hdata->createHistogram(*Es_e2var, *rawvar, "","raw_vs_Es_e2"); h_RC_Es_e2->GetXaxis()->SetTitle("Es_e2"); h_RC_Es_e2->GetYaxis()->SetTitle("E_{raw}/E_{true}"); h_RC_Es_e2->Draw("COLZ"); myC_variables->SaveAs("raw_vs_Es_e2.pdf"); myC_variables->SaveAs("raw_vs_Es_e2.png"); */ } TProfile *p_CC_eta = h_CC_eta->ProfileX("p_CC_eta",1,-1,"s"); p_CC_eta->GetYaxis()->SetRangeUser(0.7,1.2); if(EEorEB == "EB") { // p_CC_eta->GetYaxis()->SetRangeUser(0.85,1.0); // p_CC_eta->GetXaxis()->SetRangeUser(-1.5,1.5); } p_CC_eta->GetYaxis()->SetTitle("E_{cor}/E_{true}"); p_CC_eta->SetTitle(""); p_CC_eta->Draw(); myC_variables->SaveAs("profile_cor_vs_eta.pdf"); myC_variables->SaveAs("profile_cor_vs_eta.png"); TProfile *p_RC_eta = h_RC_eta->ProfileX("p_RC_eta",1,-1,"s"); p_RC_eta->GetYaxis()->SetRangeUser(0.7,1.2); if(EEorEB=="EB") { // p_RC_eta->GetYaxis()->SetRangeUser(0.80,0.95); // p_RC_eta->GetXaxis()->SetRangeUser(-1.5,1.5); } p_RC_eta->GetYaxis()->SetTitle("E_{raw}/E_{true}"); p_RC_eta->SetTitle(""); p_RC_eta->Draw(); myC_variables->SaveAs("profile_raw_vs_eta.pdf"); myC_variables->SaveAs("profile_raw_vs_eta.png"); int Nbins_iEta = EEorEB=="EB" ? 180 : 50; int nLow_iEta = EEorEB=="EB" ? -90 : 0; int nHigh_iEta = EEorEB=="EB" ? 90 : 50; TH1F *h1_RC_eta = new TH1F("h1_RC_eta","h1_RC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); for(int i=1;i<=Nbins_iEta;i++) { h1_RC_eta->SetBinContent(i,p_RC_eta->GetBinError(i)); } h1_RC_eta->GetXaxis()->SetTitle("i#eta"); h1_RC_eta->GetYaxis()->SetTitle("#sigma_{E_{raw}/E_{true}}"); h1_RC_eta->SetTitle(""); h1_RC_eta->Draw(); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_eta.pdf"); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_eta.png"); TH1F *h1_CC_eta = new TH1F("h1_CC_eta","h1_CC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); for(int i=1;i<=Nbins_iEta;i++) { h1_CC_eta->SetBinContent(i,p_CC_eta->GetBinError(i)); } h1_CC_eta->GetXaxis()->SetTitle("i#eta"); h1_CC_eta->GetYaxis()->SetTitle("#sigma_{E_{cor}/E_{true}}"); h1_CC_eta->SetTitle(""); h1_CC_eta->Draw(); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_eta.pdf"); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_eta.png"); TProfile *p_CC_phi = h_CC_phi->ProfileX("p_CC_phi",1,-1,"s"); p_CC_phi->GetYaxis()->SetRangeUser(0.7,1.2); if(EEorEB == "EB") { // p_CC_phi->GetYaxis()->SetRangeUser(0.94,1.00); } p_CC_phi->GetYaxis()->SetTitle("E_{cor}/E_{true}"); p_CC_phi->SetTitle(""); p_CC_phi->Draw(); myC_variables->SaveAs("profile_cor_vs_phi.pdf"); myC_variables->SaveAs("profile_cor_vs_phi.png"); TProfile *p_RC_phi = h_RC_phi->ProfileX("p_RC_phi",1,-1,"s"); p_RC_phi->GetYaxis()->SetRangeUser(0.7,1.2); if(EEorEB=="EB") { // p_RC_phi->GetYaxis()->SetRangeUser(0.89,0.95); } p_RC_phi->GetYaxis()->SetTitle("E_{raw}/E_{true}"); p_RC_phi->SetTitle(""); p_RC_phi->Draw(); myC_variables->SaveAs("profile_raw_vs_phi.pdf"); myC_variables->SaveAs("profile_raw_vs_phi.png"); int Nbins_iPhi = EEorEB=="EB" ? 360 : 50; int nLow_iPhi = EEorEB=="EB" ? 0 : 0; int nHigh_iPhi = EEorEB=="EB" ? 360 : 50; TH1F *h1_RC_phi = new TH1F("h1_RC_phi","h1_RC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); for(int i=1;i<=Nbins_iPhi;i++) { h1_RC_phi->SetBinContent(i,p_RC_phi->GetBinError(i)); } h1_RC_phi->GetXaxis()->SetTitle("i#phi"); h1_RC_phi->GetYaxis()->SetTitle("#sigma_{E_{raw}/E_{true}}"); h1_RC_phi->SetTitle(""); h1_RC_phi->Draw(); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_phi.pdf"); myC_variables->SaveAs("sigma_Eraw_Etrue_vs_phi.png"); TH1F *h1_CC_phi = new TH1F("h1_CC_phi","h1_CC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); for(int i=1;i<=Nbins_iPhi;i++) { h1_CC_phi->SetBinContent(i,p_CC_phi->GetBinError(i)); } h1_CC_phi->GetXaxis()->SetTitle("i#phi"); h1_CC_phi->GetYaxis()->SetTitle("#sigma_{E_{cor}/E_{true}}"); h1_CC_phi->SetTitle(""); h1_CC_phi->Draw(); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_phi.pdf"); myC_variables->SaveAs("sigma_Ecor_Etrue_vs_phi.png"); // FWHM over sigma_eff vs. eta/phi TH1F *h1_FoverS_RC_phi = new TH1F("h1_FoverS_RC_phi","h1_FoverS_RC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); TH1F *h1_FoverS_CC_phi = new TH1F("h1_FoverS_CC_phi","h1_FoverS_CC_phi",Nbins_iPhi,nLow_iPhi,nHigh_iPhi); TH1F *h1_FoverS_RC_eta = new TH1F("h1_FoverS_RC_eta","h1_FoverS_RC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); TH1F *h1_FoverS_CC_eta = new TH1F("h1_FoverS_CC_eta","h1_FoverS_CC_eta",Nbins_iEta,nLow_iEta,nHigh_iEta); TH1F *h1_FoverS_CC_S2S9 = new TH1F("h1_FoverS_CC_S2S9","h1_FoverS_CC_S2S9",Nbins_S2S9,Low_S2S9,High_S2S9); TH1F *h1_FoverS_RC_S2S9 = new TH1F("h1_FoverS_RC_S2S9","h1_FoverS_RC_S2S9",Nbins_S2S9,Low_S2S9,High_S2S9); TH1F *h1_FoverS_CC_S4S9 = new TH1F("h1_FoverS_CC_S4S9","h1_FoverS_CC_S4S9",Nbins_S4S9,Low_S4S9,High_S4S9); TH1F *h1_FoverS_RC_S4S9 = new TH1F("h1_FoverS_RC_S4S9","h1_FoverS_RC_S4S9",Nbins_S4S9,Low_S4S9,High_S4S9); float FWHMoverSigmaEff = 0.0; TH1F *h_tmp_rawvar = new TH1F("tmp_rawvar","tmp_rawvar",800,0.5,1.5); TH1F *h_tmp_corvar = new TH1F("tmp_corvar","tmp_corvar",800,0.5,1.5); for(int i=1;i<=Nbins_iPhi;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_phi->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_phi->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_phi->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_phi->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_phi->GetXaxis()->SetTitle("i#phi"); h1_FoverS_CC_phi->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_phi->SetTitle(""); h1_FoverS_CC_phi->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_phi.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_phi.png"); h1_FoverS_RC_phi->GetXaxis()->SetTitle("i#phi"); h1_FoverS_RC_phi->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_phi->SetTitle(""); h1_FoverS_RC_phi->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_phi.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_phi.png"); for(int i=1;i<=Nbins_iEta;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_eta->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_eta->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_eta->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_eta->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_eta->GetXaxis()->SetTitle("i#eta"); h1_FoverS_CC_eta->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_eta->SetTitle(""); h1_FoverS_CC_eta->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_eta.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_eta.png"); h1_FoverS_RC_eta->GetXaxis()->SetTitle("i#eta"); h1_FoverS_RC_eta->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_eta->SetTitle(""); h1_FoverS_RC_eta->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_eta.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_eta.png"); for(int i=1;i<=Nbins_S2S9;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_S2S9->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_S2S9->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_S2S9->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_S2S9->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_S2S9->GetXaxis()->SetTitle("S2S9"); h1_FoverS_CC_S2S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_S2S9->GetYaxis()->SetRangeUser(0.0,1.0); h1_FoverS_CC_S2S9->SetTitle(""); h1_FoverS_CC_S2S9->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S2S9.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S2S9.png"); h1_FoverS_RC_S2S9->GetXaxis()->SetTitle("S2S9"); h1_FoverS_RC_S2S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_S2S9->GetYaxis()->SetRangeUser(0.0,2.0); h1_FoverS_RC_S2S9->SetTitle(""); h1_FoverS_RC_S2S9->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S2S9.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S2S9.png"); for(int i=1;i<=Nbins_S4S9;i++) { float FWHM_tmp = 0.0; float effSigma_tmp = 0.0; for(int j=1;j<=800;j++) { h_tmp_rawvar->SetBinContent(j,h_RC_S4S9->GetBinContent(i,j)); h_tmp_corvar->SetBinContent(j,h_CC_S4S9->GetBinContent(i,j)); } FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_rawvar); effSigma_tmp = effSigma(h_tmp_rawvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_RC_S4S9->SetBinContent(i, FWHMoverSigmaEff); FWHMoverSigmaEff = 0.0; FWHM_tmp= FWHM(h_tmp_corvar); effSigma_tmp = effSigma(h_tmp_corvar); if(effSigma_tmp>0.000001) FWHMoverSigmaEff = FWHM_tmp/effSigma_tmp; h1_FoverS_CC_S4S9->SetBinContent(i, FWHMoverSigmaEff); } h1_FoverS_CC_S4S9->GetXaxis()->SetTitle("S4S9"); h1_FoverS_CC_S4S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{cor}/E_{true}"); h1_FoverS_CC_S4S9->GetYaxis()->SetRangeUser(0.0,1.0); h1_FoverS_CC_S4S9->SetTitle(""); h1_FoverS_CC_S4S9->Draw(); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S4S9.pdf"); myC_variables->SaveAs("FoverS_Ecor_Etrue_vs_S4S9.png"); h1_FoverS_RC_S4S9->GetXaxis()->SetTitle("S4S9"); h1_FoverS_RC_S4S9->GetYaxis()->SetTitle("FWHM/#sigma_{eff} of E_{raw}/E_{true}"); h1_FoverS_RC_S4S9->GetYaxis()->SetRangeUser(0.0,2.0); h1_FoverS_RC_S4S9->SetTitle(""); h1_FoverS_RC_S4S9->Draw(); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S4S9.pdf"); myC_variables->SaveAs("FoverS_Eraw_Etrue_vs_S4S9.png"); printf("calc effsigma\n"); std::cout<<"_"<<EEorEB<<std::endl; printf("corrected curve effSigma= %5f, FWHM=%5f \n",effsigma_cor, fwhm_cor); printf("raw curve effSigma= %5f FWHM=%5f \n",effsigma_raw, fwhm_raw); /* new TCanvas; RooPlot *ploteold = testvar.frame(0.6,1.2,100); hdatasigtest->plotOn(ploteold); ploteold->Draw(); new TCanvas; RooPlot *plotecor = ecorvar->frame(0.6,1.2,100); hdatasig->plotOn(plotecor); plotecor->Draw(); */ }
void PrepareWorkspace_GaussOverFlat_withSystematics( TString fileName = "WS_GaussOverFlat_withSystematics.root" ) { // In this macro a PDF model is built assuming signal has a Gaussian // PDF and the background a flat PDF. The parameter of interest is // the signal yield and we assume for it a flat prior. It is shown // how two types of systematics uncertainties can be expressed; // those are a sytematic uncertainty on the background yield and // another on one of the parameters (sigma) of the signal shape. // All needed objects are stored in a ROOT file (within a // RooWorkspace container); this ROOT file can then be fed as input // to various statistical methods. using namespace RooFit; using namespace RooStats; // use an observable for this shape-based analysis RooRealVar* mass = new RooRealVar("mass","mass",0,500,"GeV/c^{2}"); mass->setBins(100); RooArgSet* observables = new RooArgSet(*mass,"observables"); // signal (Gaussian) and background (flat) PDFs RooRealVar* sigSigma = new RooRealVar("sigSigma","sigma in signal PDF",0,100); RooAbsPdf* sigPdf = new RooGaussian("sigPdf","signal PDF",*mass,RooConst(200),*sigSigma); RooAbsPdf* bkgPdf = new RooPolynomial("bkgPdf","background PDF",*mass,RooFit::RooConst(0)); // S+B model: the sum of both shapes weighted with the yields RooRealVar* S = new RooRealVar("S","signal yield",10,0,50); RooRealVar* B = new RooRealVar("B","background yield",10,0,50); RooAbsPdf* model = new RooAddPdf("model","S+B PDF",RooArgList(*sigPdf,*bkgPdf),RooArgList(*S,*B)); // B-only model: the same as with a signal yield fixed to 0 RooAbsPdf* modelBkg = new RooExtendPdf("modelBkg","B-only PDF",*bkgPdf,*B); // assume a Gaussian uncertainty on the detector resolution affecting the signal width (of 10%) // another nuisance parameter is the background yield (apply an uncertainty of 20%) RooAbsPdf* prior_sigSigma = new RooGaussian("prior_sigSigma","prior probability on sigSigma",*sigSigma,RooConst(sigSigma->getVal()),RooConst(sigSigma->getVal()*0.10)); RooAbsPdf* prior_B = new RooGaussian("prior_B","prior probability on B",*B,RooConst(B->getVal()),RooConst(B->getVal()*0.20)); RooAbsPdf* priorNuisance = new RooProdPdf("priorNuisance","prior on the nuisance parameters",*prior_B,*prior_sigSigma); RooArgSet* parameters = new RooArgSet(*B,*sigSigma,"parameters"); // assume a flat prior on our parameter of interest (POI) which is the signal yield RooAbsPdf* priorPOI = new RooPolynomial("priorPOI","flat prior on the POI",*S,RooFit::RooConst(0)); RooArgSet* POI = new RooArgSet(*S,"POI"); // different options are shown for the data generation from the model // unbinned data with Poisson fluctuations // RooAbsData* data = (RooDataSet*) model->generate(*observables,RooFit::Extended(),Name("data")); // binned data with Poisson fluctuations // RooAbsData* data = (RooDataHist*) model->generateBinned(*observables,Extended(),Name("data")); // binned without any fluctuations (average case) RooAbsData* data = (RooDataHist*) model->generateBinned(*observables,Name("data"),ExpectedData()); // control plot of the generated data // RooPlot* plot = mass->frame(); // data->plotOn(plot); // plot->Draw(); // use a RooWorkspace to store the pdf models, prior informations, list of parameters,... RooWorkspace myWS("myWS"); myWS.import(*data,Rename("data")); myWS.import(*model,RecycleConflictNodes()); myWS.import(*modelBkg,RecycleConflictNodes()); myWS.import(*priorPOI,RecycleConflictNodes()); myWS.import(*priorNuisance,RecycleConflictNodes()); myWS.defineSet("observables",*observables,kTRUE); myWS.defineSet("parameters",*parameters,kTRUE); myWS.defineSet("POI",*POI,kTRUE); // store the workspace in a ROOT file TFile file(fileName,"RECREATE"); file.cd(); myWS.Write(); file.Write(); file.Close(); std::cout << "\nRooFit model initialized and stored in " << fileName << std::endl; }
void MakeSpinPlots::DrawBlindFit(TString tag, TString mcName,TString cosThetaBin){ TString fitTag="FULLFIT"; TString cat = "evtcat"; if(cosThetaBin!=""){ tag+="_"+cosThetaBin; fitTag="FULLCOSTFIT"; cat = "evtcat_cosT"; } TString dataTag = "_Combined"; if(cosThetaBin!="") dataTag+="_CosTBin"; TCanvas *cv = new TCanvas(Form("%s_%s",mcName.Data(),tag.Data())); RooRealVar* mass = ws->var("mass"); mass->setBins( (mass->getMax() - mass->getMin())/1.5 ); //enfore 1.5GeV bin width RooPlot* frame = mass->frame(); double Nb = ws->var(Form("Data_BKGFIT_%s_Nbkg",tag.Data()))->getVal(); cout << Nb << endl; RooDataSet *blind = (RooDataSet*)ws->data("Data"+dataTag)->reduce(TString("((mass<119) || (mass>135.5)) && ")+cat+"=="+cat+"::"+tag); blind->plotOn(frame); tPair lbl(mcName,tag); double nBkg = ws->data("Data"+dataTag)->sumEntries(cat+"=="+cat+"::"+tag); ws->pdf( Form("Data_BKGFIT_%s_bkgModel",tag.Data()) )->plotOn(frame,RooFit::Range("all"),RooFit::Normalization(nBkg/blind->sumEntries()), RooFit::LineColor(kRed)); //TLatex *prelim = new TLatex(250,x->GetXmax()-40.,"CMS Preliminary"); TLatex *prelim = new TLatex(0.12,0.96,"CMS Preliminary"); TLatex *lum = new TLatex(0.7,0.96,Form("#sqrt{s}=8 TeV L = %0.1f fb^{-1}",lumi)); prelim->SetNDC(); lum->SetNDC(); prelim->SetTextSize(0.045); prelim->SetTextColor(kBlack); lum->SetTextSize(0.045); lum->SetTextColor(kBlack); TLatex *owner = new TLatex(0.6,0.88,"Caltech-CMS Preliminary"); owner->SetNDC(); owner->SetTextSize(0.045); owner->SetTextColor(kBlack); TLatex *Nbkg = new TLatex(0.7,0.8,Form("N_{bkg}= %0.1f #pm %0.1f",nBackground[lbl].first,nBackground[lbl].second)); Nbkg->SetNDC(); Nbkg->SetTextSize(0.045); TLatex *sig = new TLatex(0.7,0.72,Form("#sigma_{eff} = %0.1f #pm %0.2f",fitSigEff[lbl].first,fitSigEff[lbl].second)); sig->SetNDC(); sig->SetTextSize(0.045); TLatex *expBkg = new TLatex(0.7,0.64,Form("B @ 125 = %0.1f",fitBkg1Sigma[lbl].first)); expBkg->SetNDC(); expBkg->SetTextSize(0.045); frame->addObject(prelim); frame->addObject(lum); //frame->addObject(owner); frame->addObject(Nbkg); frame->addObject(sig); frame->addObject(expBkg); frame->Draw(); cv->SaveAs( basePath+Form("/mgg-%s-%s-%s_BLIND.png",outputTag.Data(),mcName.Data(),tag.Data()) ); cv->SaveAs( basePath+Form("/C/mgg-%s-%s-%s_BLIND.C",outputTag.Data(),mcName.Data(),tag.Data()) ); cv->SaveAs( basePath+Form("/mgg-%s-%s-%s_BLIND.pdf",outputTag.Data(),mcName.Data(),tag.Data()) ); delete cv; }
void runUPWW() { int higgsMass=125; double intLumi=5.1; int nToys = 10; bool draw=true; using namespace RooFit; gROOT->ProcessLine(".L ~/tdrstyle.C"); setTDRStyle(); gStyle->SetPadLeftMargin(0.16); gROOT->ForceStyle(); gROOT->ProcessLine(".L statsFactory.cc+"); // // set up test kind // double sigRate; double bkgRate; if(higgsMass==125){ sigRate = 7.; bkgRate = 66.; }else{ cout << "HMMMM.... I don't know that mass point...BYE!" << endl; return; } RooRealVar* mll = new RooRealVar("mll","dilepton mass [GeV]", 12, 80.); mll->setBins(17); RooArgSet* obs = new RooArgSet(*mll) ; // read signal hypothesis 1 TChain *tsigHyp1 = new TChain("angles"); tsigHyp1->Add(Form("datafiles/bdtpresel/%i/SMHiggsWW_%i_JHU.root",higgsMass, higgsMass)); RooDataSet *sigHyp1Data = new RooDataSet("sigHyp1Data","sigHyp1Data",tsigHyp1,*obs); RooDataHist *sigHyp1Hist = sigHyp1Data->binnedClone(0); RooHistPdf* sigHyp1Pdf = new RooHistPdf("sigHyp1Pdf", "sigHyp1Pdf", *obs, *sigHyp1Hist); // read background TChain *bkgTree = new TChain("angles"); bkgTree->Add(Form("datafiles/bdtpresel/%i/WW_madgraph_8TeV.root",higgsMass)); RooDataSet *bkgData = new RooDataSet("bkgData","bkgData",bkgTree,*obs); RooDataHist *bkgHist = bkgData->binnedClone(0); RooHistPdf* bkgPdf = new RooHistPdf("bkgPdf", "bkgPdf", *obs, *bkgHist); char statResults[25]; statsFactory *hwwuls; sprintf(statResults,"uls_hww125_%.0ffb.root", intLumi); hwwuls = new statsFactory(obs, sigHyp1Pdf, sigHyp1Pdf, statResults); hwwuls->runUpperLimitWithBackground(sigRate*intLumi, bkgRate*intLumi, bkgPdf, nToys); delete hwwuls; // draw plots if(draw) { RooPlot* plot1 = mll->frame(); TString plot1Name = "mll"; TCanvas* c1 = new TCanvas("c1","c1",400,400); bkgData->plotOn(plot1,MarkerColor(kBlack)); bkgPdf->plotOn(plot1, LineColor(kBlack), LineStyle(kDashed)); sigHyp1Data->plotOn(plot1,MarkerColor(kRed)); sigHyp1Pdf->plotOn(plot1,LineColor(kRed), LineStyle(kDashed)); // draw... plot1->Draw(); c1->SaveAs(Form("plots/ul/epsfiles/%s.eps", plot1Name.Data())); c1->SaveAs(Form("plots/ul/pngfiles/%s.png", plot1Name.Data())); delete c1; } }
void MakeSpinPlots::DrawIndFit(TString tag, TString mcName){ TCanvas *cv = new TCanvas(Form("%s_%s",mcName.Data(),tag.Data())); if(ws->var( Form("Data_%s_INDFIT_%s_Nsig",mcName.Data(),tag.Data()) ) == 0) return; RooRealVar* mass = ws->var("mass"); mass->setBins( (mass->getMax() - mass->getMin())/1.5 ); //enfore 1.5GeV bin width RooPlot* frame = mass->frame(); tPair lbl(mcName,tag); double Ns = ws->var( Form("Data_%s_INDFIT_%s_Nsig",mcName.Data(),tag.Data()) )->getVal(); double Nb = ws->var( Form("Data_%s_INDFIT_%s_Nbkg",mcName.Data(),tag.Data()) )->getVal(); double Nblind = ws->data("Data_Combined")->reduce("(mass>100 && mass<119) || (mass>135.5 && mass<170)")->sumEntries(TString("evtcat==evtcat::")+tag); double Ntot = ws->data("Data_Combined")->sumEntries(TString("evtcat==evtcat::")+tag); RooFitResult* fitres = (RooFitResult*)ws->obj(Form("Data_%s_INDFIT_fitResult",mcName.Data())); std::cout << fitres << std::endl; ws->data("Data_Combined")->reduce(TString("evtcat==evtcat::")+tag)->plotOn(frame,RooFit::LineColor(kWhite),RooFit::MarkerColor(kWhite)); //Data_Hgg125_INDFIT_EB_0 ws->pdf(Form("Data_%s_INDFIT_%s",mcName.Data(),tag.Data()))->plotOn(frame, RooFit::FillColor(kGreen),RooFit::VisualizeError(*fitres,2.0)); ws->pdf(Form("Data_%s_INDFIT_%s",mcName.Data(),tag.Data()))->plotOn(frame, RooFit::FillColor(kYellow),RooFit::VisualizeError(*fitres,1.0)); ws->pdf(Form("Data_%s_INDFIT_%s",mcName.Data(),tag.Data()))->plotOn(frame, RooFit::LineColor(kRed)); std::cout << "1" << std::endl; ws->pdf(Form("Data_BKGFIT_%s_bkgModel",tag.Data()))->plotOn(frame, RooFit::Normalization(Nb/(Nb+Ns)),RooFit::LineColor(kRed),RooFit::LineStyle(kDashed)); std::cout << "2" << std::endl; ws->data("Data_Combined")->reduce(TString("evtcat==evtcat::")+tag)->plotOn(frame); frame->Draw(); //TLatex *prelim = new TLatex(250,x->GetXmax()-40.,"CMS Preliminary"); TLatex *prelim = new TLatex(0.12,0.96,"CMS Preliminary"); TLatex *lum = new TLatex(0.7,0.96,Form("#sqrt{s}=8 TeV L = %0.1f fb^{-1}",lumi)); prelim->SetNDC(); lum->SetNDC(); prelim->SetTextSize(0.045); prelim->SetTextColor(kBlack); lum->SetTextSize(0.045); lum->SetTextColor(kBlack); TLatex *owner = new TLatex(0.6,0.88,"Alex Mott (Nov. 13, 2012)"); owner->SetNDC(); owner->SetTextSize(0.045); owner->SetTextColor(kBlack); TLatex *mu = new TLatex(0.7,0.8,Form("#mu = %0.1f #pm %0.2f", fitMean[lbl].first,fitMean[lbl].second)); mu->SetNDC(); mu->SetTextSize(0.045); TLatex *sig = new TLatex(0.7,0.72,Form("#sigma_{eff} = %0.1f #pm %0.2f", fitSigEff[lbl].first,fitSigEff[lbl].second)); sig->SetNDC(); sig->SetTextSize(0.045); float nSig = ws->var( Form("Data_%s_INDFIT_%s_Nsig",mcName.Data(),tag.Data()) )->getVal(); float nSigErr = ws->var( Form("Data_%s_INDFIT_%s_Nsig",mcName.Data(),tag.Data()) )->getError(); TLatex *Nsig = new TLatex(0.7,0.64,Form("N_{sig}= %0.1f #pm %0.1f",nSig,nSigErr)); Nsig->SetNDC(); Nsig->SetTextSize(0.045); frame->addObject(prelim); frame->addObject(lum); //frame->addObject(owner); frame->addObject(mu); frame->addObject(sig); frame->addObject(Nsig); frame->Draw(); cv->SaveAs( basePath+Form("/mgg-FloatedFraction-%s-%s-%s.png",outputTag.Data(),mcName.Data(),tag.Data()) ); cv->SaveAs( basePath+Form("/C/mgg-FloatedFraction-%s-%s-%s.C",outputTag.Data(),mcName.Data(),tag.Data()) ); cv->SaveAs( basePath+Form("/mgg-FloatedFraction-%s-%s-%s.pdf",outputTag.Data(),mcName.Data(),tag.Data()) ); delete cv; }
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 testChebychev() { TCanvas* cnv = new TCanvas("cnv","",800,600); Int_t xNbins = (Int_t)((xFullMax-xFullMin)/xBinSize); RooRealVar* x = new RooRealVar("x","x [units]",xFullMin,xFullMax); x->setBins(xNbins); x->setRange("range_x", xFullMin,xFullMax); x->setRange("range_left", xFullMin,xBlindMin); x->setRange("range_right", xBlindMax,xFullMax); x->setRange("range_blind", xBlindMin,xBlindMax); x->setRange("range_signal", xSignalmin,xSignalmax); TString fitrange = "range_left,range_right"; // "range_x" // RooRealVar* a0 = new RooRealVar("a0","a0", -1.42803e-01, -1.0, 1.0); // RooRealVar* a1 = new RooRealVar("a1","a1", +2.87161e-02, -1.0, 1.0); // RooRealVar* a2 = new RooRealVar("a2","a2", -1.45196e-03, -1.0, 1.0); // RooRealVar* a3 = new RooRealVar("a3","a3", -6.00993e-04, -1.0, 1.0); RooRealVar* a0 = new RooRealVar("a0","a0", -0.3497, -1.0, 1.0); RooRealVar* a1 = new RooRealVar("a1","a1", -0.1187, -1.0, 1.0); RooRealVar* a2 = new RooRealVar("a2","a2", -0.0885, -1.0, 1.0); RooRealVar* a3 = new RooRealVar("a3","a3", -0.0040, -1.0, 1.0); RooChebychev* pdfCheb = new RooChebychev("pdfCheb","pdfCheb",*x,RooArgSet(*a0,*a1,*a2,*a3)); RooAbsData* xData = pdfCheb->generate(*x,1000,Range(fitrange)); RooRealVar* b0 = new RooRealVar("b0","b0",1.,0.,100.); RooRealVar* b1 = new RooRealVar("b1","b1",1.,0.,100.); RooRealVar* b2 = new RooRealVar("b2","b2",1.,0.,100.); RooRealVar* b3 = new RooRealVar("b3","b3",1.,0.,100.); RooRealVar* b4 = new RooRealVar("b4","b4",1.,0.,100.); RooRealVar* b5 = new RooRealVar("b5","b5",1.,0.,100.); RooRealVar* b6 = new RooRealVar("b6","b6",1.,0.,100.); RooBernstein* pdfBern = new RooBernstein("pdfBern","pdfBern",*x,RooArgSet(*b0,*b1,*b2,*b3,*b4,*b5,*b6)); // RooChebychev* pdf = pdfCheb; RooBernstein* pdf = pdfBern; RooFitResult* fitresult = pdf->fitTo(*xData,Minos(kTRUE),Range(fitrange),Strategy(2),Save(kTRUE),Timer(kTRUE)); TString stat = gMinuit->fCstatu; cout << "Minuit: " << stat << endl; fitresult->Print("v"); RooPlot* xFrame = x->frame(Name("xFrame"),Title("Chebychev sideband fit test")); xData->plotOn(xFrame,Name("x"),MarkerSize(1),Binning(xNbins)); pdf->plotOn(xFrame,LineWidth(2),LineColor(kBlue),Range(fitrange),NormRange(fitrange)); pdf->plotOn(xFrame,LineWidth(2),LineColor(kRed),LineStyle(kDashed),Range("range_blind"),NormRange(fitrange)); pdf->paramOn(xFrame,Layout(0.62,0.88,0.4), Format("NEU", AutoPrecision(3))); xFrame->getAttText()->SetTextSize(0.03); cnv->SetLeftMargin(0.2); xFrame->SetTitleOffset(2,"Y"); xFrame->Draw(); cnv->SaveAs("testChebychev.pdf"); RooAbsReal* integralFull = pdf->createIntegral(*x,Range("range_x")); RooAbsReal* integralSR = pdf->createIntegral(*x,Range("range_signal")); RooAbsReal* integralSBleft = pdf->createIntegral(*x,Range("range_left")); RooAbsReal* integralSBright = pdf->createIntegral(*x,Range("range_right")); float nSB0 = integralSBleft->getVal()+integralSBright->getVal(); float nSR0 = integralSR->getVal(); float nAll = integralFull->getVal(); cout << "nAll=" << nAll << endl; cout << "nSB0=" << nSB0 << endl; cout << "nSR0=" << nSR0 << endl; }