void JESUnc(){ gSystem->Load("libFWCoreFWLite.so"); AutoLibraryLoader::enable(); JetCorrectionUncertainty *jecUnc = new JetCorrectionUncertainty("Jec10V3_Uncertainty_AK5PF.txt"); ofstream myfile; myfile.open ("JESUnc.cxx"); myfile << "double JESUnc(double eta, double pT){ " << std::endl; myfile << " double feta = abs(eta);" << std::endl; AutoLibraryLoader::enable(); JetCorrectionUncertainty *jecUnc = new JetCorrectionUncertainty("Jec10V3_Uncertainty_AK5PF.txt"); for (int iPt = 20; iPt < 100; iPt+=10){ for (int iEta = 0; iEta < 50; iEta++){ jecUnc->setJetEta(iEta / 10.); jecUnc->setJetPt(iPt); double unc = jecUnc->getUncertainty(true); myfile << " if (feta > " << iEta/10. << " && feta < " << (iEta+1)/10. << " && pT > " << iPt << " && pT < " << (iPt+10) << ") return " << unc << " ; " << std::endl; } } myfile << "return 0;" << std::endl; myfile << "}" << std::endl; myfile.close(); }
void JESUncertainty(double pt, double eta){ gSystem->Load("libFWCoreFWLite.so"); AutoLibraryLoader::enable(); //----------- Correction Object ------------------------------ // vector<JetCorrectorParameters> JetCorPar; // JetCorrectorParameters *par1 = new JetCorrectorParameters("Fall10_AK5PF_L2Relative.txt"); // JetCorrectorParameters *par2 = new JetCorrectorParameters("Fall10_AK5PF_L3Absolute.txt"); // JetCorrectorParameters *par3 = new JetCorrectorParameters("Fall10_AK5PF_L2L3Residual.txt"); // JetCorPar.push_back(*par1); // JetCorPar.push_back(*par2); // JetCorPar.push_back(*par3); // FactorizedJetCorrector *JetCor = new FactorizedJetCorrector(JetCorPar); //----------- Uncertainty Object ----------------------------- JetCorrectionUncertainty *jecUnc = new JetCorrectionUncertainty("Fall10_AK5PF_Uncertainty.txt"); jecUnc->setJetEta(eta); jecUnc->setJetPt(pt); return jecUnc->getUncertainty(true); }
void drawSourceCorrelations() { setTDRStyle(); // Autogenerate list of sources from UncertaintySources.txt with this macro: // grep '\[' CondFormats/JetMETObjects/data/Winter14_V5_DATA_UncertaintySources_AK5PFchs.txt | sed 's/\]/"\);/' | sed 's/\[/s.push_back\("/' // The ones that are included in Total (kData) are listed in JetDefs.hpp, // with bit-name mapping found in drawJetCorrectionUncertainty.cpp // 8 TeV Winter14_V5 sources vector<string> s; s.push_back("AbsoluteStat"); s.push_back("AbsoluteScale"); s.push_back("AbsoluteFlavMap"); s.push_back("AbsoluteMPFBias"); //s.push_back("HighPtExtra"); // 8 TeV GR s.push_back("Fragmentation"); // new patched 8 TeV s.push_back("SinglePionECAL"); s.push_back("SinglePionHCAL"); s.push_back("FlavorQCD"); //s.push_back("TimeEta"); //s.push_back("TimePt"); s.push_back("RelativeJEREC1"); s.push_back("RelativeJEREC2"); s.push_back("RelativeJERHF"); s.push_back("RelativePtBB"); s.push_back("RelativePtEC1"); s.push_back("RelativePtEC2"); s.push_back("RelativePtHF"); s.push_back("RelativeFSR"); s.push_back("RelativeStatEC2"); s.push_back("RelativeStatHF"); s.push_back("PileUpDataMC"); s.push_back("PileUpPtRef"); s.push_back("PileUpPtBB"); s.push_back("PileUpPtEC1"); s.push_back("PileUpPtEC2"); s.push_back("PileUpPtHF"); //s.push_back("PileUpMuZero"); //s.push_back("PileUpEnvelope"); //s.push_back("SubTotalPileUp"); //s.push_back("SubTotalRelative"); //s.push_back("SubTotalPt"); //s.push_back("SubTotalScale"); //s.push_back("SubTotalMC"); //s.push_back("Total"); //s.push_back("TotalNoFlavor"); //s.push_back("TotalNoTime"); //s.push_back("TotalNoFlavorNoTime"); //s.push_back("FlavorZJet"); //s.push_back("FlavorPhotonJet"); //s.push_back("FlavorPureGluon"); //s.push_back("FlavorPureQuark"); //s.push_back("FlavorPureCharm"); //s.push_back("FlavorPureBottom"); //s.push_back("TimeRunA"); //s.push_back("TimeRunB"); //s.push_back("TimeRunC"); //s.push_back("TimeRunD"); //s.push_back("CorrelationGroupMPFInSitu"); //s.push_back("CorrelationGroupIntercalibration"); //s.push_back("CorrelationGroupbJES"); //s.push_back("CorrelationGroupFlavor"); //s.push_back("CorrelationGroupUncorrelated"); // 7 TeV JEC11_V12 sources /* vector<string> s; s.push_back("Absolute"); s.push_back("HighPtExtra"); s.push_back("SinglePion"); s.push_back("Flavor"); //s.push_back("Time"); s.push_back("RelativeJEREC1"); s.push_back("RelativeJEREC2"); s.push_back("RelativeJERHF"); s.push_back("RelativeFSR"); s.push_back("RelativeStatEC2"); s.push_back("RelativeStatHF"); s.push_back("PileUpDataMC"); s.push_back("PileUpOOT"); s.push_back("PileUpPt"); s.push_back("PileUpBias"); s.push_back("PileUpJetRate"); //s.push_back("SubTotalPileUp"); //s.push_back("SubTotalRelative"); //s.push_back("SubTotalPt"); //s.push_back("SubTotalDataMC"); //s.push_back("Total"); */ // define this bit to test that quadratic sum equals total string sref = "Total"; double etabins[] = {0,1.3,2.5,3.0,4.7}; const int neta = sizeof(etabins)/sizeof(etabins[0])-1; double ptbins[] = {10, 12, 15, 18, 21, 24, 28, 32, 37, 43, 49, 56, 64, 74, 84, 97, 114, 133, 153, 174, 196, 220, 245, 272, 300, 362, 430, 507, 592, 686, 790, 905, 1032, 1172, 1327, 1497, 1684, 1890, //1999}; 2000, 2238, 2500}; // pT=2504 observed limit with 20/fb at 8 TeV //, 2787, 3103, 3450}; const int npt = sizeof(ptbins)/sizeof(ptbins[0])-1; const int netapt = neta*npt; double etaptbins[netapt+1]; for (int ieta = 0; ieta != neta; ++ieta) { for (int ipt = 0; ipt != npt; ++ipt) { double x = pow(2500/10,ieta)*(ptbins[ipt]); etaptbins[ieta*npt+ipt] = x; } // for npt } // for ieta etaptbins[netapt] = pow(2500/10,neta)*10; TH2D *h2 = new TH2D("h2",";p_{T} (GeV);p_{T} (GeV)", npt, ptbins, npt, ptbins); TH2D *h2x = new TH2D("h2x",";250^{i_{#eta}}p_{T} (GeV)" ";250^{i_{#eta}}p_{T} (GeV)", netapt, etaptbins, netapt, etaptbins); const double zmin = -0.4;//-0.25; // Set empty cells to white (below lower limit of zmin+eps) for (int i = 1; i != h2x->GetNbinsX()+1; ++i) { for (int j = 1; j != h2x->GetNbinsY()+1; ++j) { h2x->SetBinContent(i, j, zmin); } } // Create uncertainty sources vector<JetCorrectionUncertainty*> uncs(s.size()); for (unsigned int k = 0; k != s.size(); ++k) { // GT 8 TeV //const char *sf = "CondFormats/JetMETObjects/data/" ////"Winter14_V5_DATA_UncertaintySources_AK7PF.txt"; // 8 TeV //"Winter14_V5_DATA_UncertaintySources_AK5PFchs.txt"; // 8 TeV // New patched 8 TeV (fixed fragmentation source sign) const char *sf = "../txt/" "Winter14_V8M_DATA_UncertaintySources_AK5PFchs.txt"; // 8 TeV // Older 7 TeV //const char *sf = "../../CondFormats/JetMETObjects/data/" //"JEC11_V12_AK7PF_UncertaintySources.txt"; // 7 TeV const char *src = s[k].c_str(); JetCorrectorParameters *p = new JetCorrectorParameters(sf, src); JetCorrectionUncertainty *unc = new JetCorrectionUncertainty(*p); uncs[k] = unc; } // Correlation plot between (eta,pT) pairs for (int ii = 0; ii != neta; ++ii) { for (int jj = 0; jj != neta; ++jj) { double eta1 = etabins[ii]; double eta2 = etabins[jj]; for (int i = 1; i != h2->GetNbinsX()+1; ++i) { for (int j = 1; j != h2->GetNbinsY()+1; ++j) { double pt1 = h2->GetXaxis()->GetBinCenter(i); double pt2 = h2->GetYaxis()->GetBinCenter(j); // Calculate correlation according to Sec. 8 Eq.(46) in JEC paper v3 double sumski2(0), sumskj2(0), sumskiskj(0); for (unsigned int k = 0; k != s.size(); ++k) { JetCorrectionUncertainty *unc = uncs[k]; assert(unc); unc->setJetPt(pt1); unc->setJetEta(eta1); double ski = unc->getUncertainty(true); unc->setJetPt(pt2); unc->setJetEta(eta2); double skj = unc->getUncertainty(true); sumski2 += ski*ski; sumskj2 += skj*skj; sumskiskj += ski*skj; } double si = sqrt(sumski2); double sj = sqrt(sumskj2); double rhoij = sumskiskj / (si*sj); if (pt1*cosh(eta1)<4000 && pt2*cosh(eta2)<4000) { // |eta|<1.3 if (ii==0 && jj==0) { if (!(pt1<400 && pt2>900)) // white background for legend h2->SetBinContent(i, j, rhoij); else h2->SetBinContent(i, j, zmin); } // all etas if (!(ii==jj && pt1<150 && pt2>600)) // white background for labels h2x->SetBinContent(ii*npt+i, jj*npt+j, rhoij); else h2x->SetBinContent(i, j, zmin); } } // for j } // for i } // for jj } // for ii // Sigle eta bin { TH1D *h1 = new TH1D("h1",";p_{T} (GeV);p_{T} (GeV)",npt,ptbins); h1->SetMinimum(ptbins[0]); h1->SetMaximum(ptbins[npt]); //h1->GetXaxis()->SetMoreLogLabels(); h1->GetXaxis()->SetNoExponent(); //h1->GetYaxis()->SetMoreLogLabels(); h1->GetYaxis()->SetNoExponent(); TCanvas *c1 = tdrCanvas("c1",h1,2,0,kSquare); // 8 TeV //TCanvas *c1 = tdrCanvas("c1",h1,1,0,kSquare); // 7 TeV gPad->SetLogx(); gPad->SetLogy(); gStyle->SetPalette(1); gStyle->SetOptStat(0); h2->Draw("COLZ SAME"); //h2->GetZaxis()->SetRangeUser(0,1-1e-4); h2->GetZaxis()->SetRangeUser(zmin+1e-4,1-1e-4); gPad->SetRightMargin(0.12); gPad->SetLeftMargin(0.17); gPad->RedrawAxis(); gPad->Update(); TLine *l = new TLine(); l->DrawLine(10,10,2500,2500); l->SetLineStyle(kDashed); l->DrawLine(1000,10,1000,1000); l->DrawLine(1000,1000,2500,1000); l->DrawLine(200,10,200,200); l->DrawLine(200,200,2500,200); l->DrawLine(40,10,40,40); l->DrawLine(40,40,2500,40); TLatex *tex = new TLatex(); tex->SetNDC(); tex->SetTextSize(0.045); tex->DrawLatex(0.20,0.87,"Anti-k_{T} R=0.5, PF+CHS"); //tex->DrawLatex(0.20,0.80,"TotalNoTime"); tex->DrawLatex(0.20,0.80,"Total excl. time"); tex->SetTextFont(42); tex->SetTextSize(0.05); tex->DrawLatex(0.10,0.09,"10"); c1->SaveAs("pdf/drawSourceCorrelations_8TeV_Eta13.pdf"); //c1->SaveAs("pdf/drawSourceCorrelations_7TeV.pdf"); } // Multiple eta bins { TH1D *h1x = new TH1D("h1x",";250^{i#eta} #times p_{T} (GeV)" ";250^{i#eta} #times p_{T} (GeV)", netapt,etaptbins); h1x->SetMinimum(etaptbins[0]); h1x->SetMaximum(etaptbins[netapt]); //h1x->GetXaxis()->SetMoreLogLabels(); //h1x->GetXaxis()->SetNoExponent(); //h1x->GetYaxis()->SetMoreLogLabels(); //h1x->GetYaxis()->SetNoExponent(); TCanvas *c1x = tdrCanvas("c1x",h1x,2,0,kSquare); // 8 TeV cross-eta gPad->SetLogx(); gPad->SetLogy(); gStyle->SetPalette(1); gStyle->SetOptStat(0); h2x->Draw("COLZ SAME"); //h2x->GetZaxis()->SetRangeUser(0,1-1e-4); h2x->GetZaxis()->SetRangeUser(zmin+1e-4,1-1e-4); gPad->SetBottomMargin(0.15); h1x->GetXaxis()->SetTitleOffset(1.2); gPad->SetRightMargin(0.12); gPad->SetLeftMargin(0.17); gPad->RedrawAxis(); gPad->Update(); TLine *l = new TLine(); l->DrawLine(10,10,2500*pow(250,3),2500*pow(250,3)); l->SetLineStyle(kDashed); l->DrawLine(1000,10,1000,1000); l->DrawLine(1000,1000,2500*pow(250,3),1000); l->DrawLine(200,10,200,200); l->DrawLine(200,200,2500*pow(250,3),200); l->DrawLine(40,10,40,40); l->DrawLine(40,40,2500*pow(250,3),40); TLatex *tex = new TLatex(); tex->SetNDC(); tex->SetTextSize(0.045); tex->DrawLatex(0.20,0.88,"Anti-k_{T} R=0.5, PF+CHS");//, TotalNoTime"); //tex->DrawLatex(0.20,0.80,"TotalNoTime"); tex->DrawLatex(0.71,0.88,"HF"); tex->DrawLatex(0.530,0.69,"EC2"); tex->DrawLatex(0.355,0.50,"EC1"); tex->DrawLatex(0.190,0.30,"BB"); tex->SetTextFont(42); tex->SetTextSize(0.05); tex->DrawLatex(0.10,0.09,"10"); c1x->SaveAs("pdf/drawSourceCorrelations_8TeV.pdf"); } }
vector<Jet> selectJetsCMG(const Event & ev, const vector<Lepton> & leptons, JetCorrectionUncertainty & jecUnc, TLorentzVector * diff, unsigned mode, double ptMin, double etaMax) { #else vector<Jet> selectJetsCMG(const Event & ev, const vector<Lepton> & leptons, TLorentzVector * diff, unsigned mode, double ptMin, double etaMax) { #endif const SingleVariableContainer<int> * jn = dynamic_cast<const SingleVariableContainer<int> *>(ev.findVariable("jn")); const ArrayVariableContainer<float> * jn_px = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_px")); const ArrayVariableContainer<float> * jn_py = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_py")); const ArrayVariableContainer<float> * jn_pz = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_pz")); const ArrayVariableContainer<float> * jn_en = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_en")); const ArrayVariableContainer<float> * jn_jp = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_jp")); const ArrayVariableContainer<float> * jn_genpx = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_genjpx")); const ArrayVariableContainer<float> * jn_genpy = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_genjpy")); const ArrayVariableContainer<float> * jn_genpz = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_genjpz")); const ArrayVariableContainer<float> * jn_genen = dynamic_cast<const ArrayVariableContainer<float> *>(ev.findVariable("jn_genjen")); const ArrayVariableContainer<int> * jn_idbits = dynamic_cast<const ArrayVariableContainer<int> *>(ev.findVariable("jn_idbits")); if (mode == 1 || mode == 2) { if (diff == 0) throw string("ERROR - selectJetsCMG(): NULL pointer!"); diff->SetPxPyPzE(0, 0, 0, 0); } vector<Jet> jets; for ( int i = 0; i < jn->getVal(); ++i ) { TLorentzVector jet(jn_px->getVal(i), jn_py->getVal(i), jn_pz->getVal(i), jn_en->getVal(i)); bool matchesLepton = false; for (unsigned k = 0; k < leptons.size(); ++k) { TLorentzVector lepton = leptons[k].lorentzVector(); double delR = deltaR(lepton.Eta(), lepton.Phi(), jet.Eta(), jet.Phi()); if (delR < 0.15) { matchesLepton = true; break; } } if (matchesLepton) continue; if (mode == 1 || mode == 2) { #ifdef CMSSWENV jecUnc.setJetEta(jet.Eta()); jecUnc.setJetPt(jet.Pt()); double sF = fabs(jecUnc.getUncertainty(true)); if ( sF > 0.3 ) { cout << setw(10) << jet.Pt() << setw(10) << jet.Eta() << setw(10) << sF << endl; throw string("ERROR!"); } if (mode == 1) sF = 1 + sF; else sF = 1 - sF; TLorentzVector newJet = sF * jet; (*diff) += (newJet - jet); jet = newJet; #else throw string("ERROR: Jet Uncertainty Systematic variation not supported!"); #endif } Jet tmp; tmp.addFloatVar( jn_px->getName(), jet.Px() ); tmp.addFloatVar( jn_py->getName(), jet.Py() ); tmp.addFloatVar( jn_pz->getName(), jet.Pz() ); tmp.addFloatVar( jn_en->getName(), jet.E() ); tmp.addIntVar( jn_idbits->getName(), jn_idbits->getVal(i) ); tmp.addFloatVar( jn_jp->getName(), jn_jp->getVal(i) ); TLorentzVector genJet( jn_genpx->getVal(i), jn_genpy->getVal(i), jn_genpz->getVal(i), jn_genen->getVal(i) ); tmp.addFloatVar( "jn_genpt", genJet.Pt() ); jets.push_back(tmp); } return jets; } TLorentzVector smearJets(vector<Jet> & jets, unsigned mode) { TLorentzVector jetDiff; for ( unsigned j = 0; j < jets.size(); ++j ) { Jet smJet = smearedJet( jets[j], mode ); jetDiff += (smJet.lorentzVector() - jets[j].lorentzVector()); jets[j] = smJet; } return jetDiff; }
bool testSources(string file1, string file2, double jetpt=50., double jeteta=2.4, std::string src_selection="Summer13_V2") { if(debug){ std::cout<< "WARNING: debug/verbose mode activated" << std::endl; verbose = true; } const char** srcnames; int nsrc; // Instantiate uncertainty sources if(src_selection == "Summer13_V2"){ srcnames = srcnames_Summer13_V2; nsrc=nsrc_Summer13_V2; } else if(src_selection == "Summer13_V5"){ srcnames = srcnames_Summer13_V5; nsrc=nsrc_Summer13_V5; } else if(src_selection == "Summer13_V5_SubTotalPt"){ srcnames = srcnames_Summer13_V5_SubTotalPt; nsrc=nsrc_Summer13_V5_SubTotalPt; } else if(src_selection == "Summer13_V5_SubTotalRelative"){ srcnames = srcnames_Summer13_V5_SubTotalRelative; nsrc=nsrc_Summer13_V5_SubTotalRelative; } else if(src_selection == "Summer13_V5_SubTotalPileUp"){ srcnames = srcnames_Summer13_V5_SubTotalPileUp; nsrc=nsrc_Summer13_V5_SubTotalPileUp; } else if(src_selection == "Summer13_V5_CorrGroups"){ srcnames = srcnames_Summer13_V5_CorrGroups; nsrc=nsrc_Summer13_V5_CorrGroups; } std::vector<JetCorrectionUncertainty*> vsrc(nsrc); // Load individual sources from file1 if(verbose)cout <<"\nLoading individual sources ("<<nsrc<<") from file1..." << endl; for (int isrc = 0; isrc < nsrc; isrc++) { const char *name = srcnames[isrc]; if(verbose)cout << Form("=> %s:%s",file1.c_str(),name) << endl << flush; JetCorrectorParameters *p = new JetCorrectorParameters(file1.c_str(), name); JetCorrectionUncertainty *unc = new JetCorrectionUncertainty(*p); vsrc[isrc] = unc; } // for isrc // Load total uncertainty source from file1 if(verbose)cout << "\nLoading Total source from file1..." << endl; if(verbose)cout << Form("=> %s:%s",file1.c_str(),srcnames[nsrc]) << endl << flush; JetCorrectorParameters *p = new JetCorrectorParameters(file1.c_str(),srcnames[nsrc]); JetCorrectionUncertainty *total = new JetCorrectionUncertainty(*p); JetCorrectorParameters *p2=0; JetCorrectionUncertainty *total2=0; if(file2!=""){ // Load total uncertainty from file2 if(verbose)cout << "\nLoading total uncertainty from file2..." << endl; if(verbose)cout << "=> " << file2 << endl << flush; p2 = new JetCorrectorParameters(file2.c_str()); total2 = new JetCorrectionUncertainty(*p2); } // Calculate uncertainty per source and as a total double sum2_up(0), sum2_dw(0), sum2(0); for (int isrc = 0; isrc != nsrc; isrc++) { JetCorrectionUncertainty *unc = vsrc[isrc]; unc->setJetPt(jetpt); unc->setJetEta(jeteta); double sup = unc->getUncertainty(true); // up variation if(debug)printf("%20s: %10.7f \n",srcnames[isrc],sup); unc->setJetPt(jetpt); unc->setJetEta(jeteta); double sdw = unc->getUncertainty(false); // down variation sum2_up += pow(max(sup,sdw),2); sum2_dw += pow(min(sup,sdw),2); sum2 += pow(max(fabs(sup),fabs(sdw)),2); } // for isrc // Check that uncertainties are symmetric assert(fabs(sum2_up-sum2_dw)<5e-4); assert(fabs(sum2-fabs(sum2_up))<5e-4); total->setJetPt(jetpt); total->setJetEta(jeteta); double uncert = total->getUncertainty(true); double uncert2=-1; if(file2!=""){ total2->setJetPt(jetpt); total2->setJetEta(jeteta); uncert2 = total2->getUncertainty(true); } bool fail = false; // Check that quadratic sum of sources equals total uncertainty if(verbose)cout << "\nTesting sum versus file1 total..."; if (fail = (fabs(uncert - sqrt(sum2)) > 5e-4)) { cout << "FAIL" << endl; cout << "Error: Quadratic sum of sources does not agree with total" << endl << " Difference is "<<uncert<<"(total) - "<<sqrt(sum2) << "(sum) = " << uncert - sqrt(sum2) << endl; //assert(fabs(uncert - sqrt(sum2_up)) < 1e-3); } else if(verbose)cout << "ok" << endl; if(file2!=""){ if(verbose)cout << "Testing sum versus file2 total..."; if (fail = (fabs(uncert2 - sqrt(sum2)) > 5e-4)) { cout << "FAIL" << endl; cout << "Error: Quadratic sum of sources does not agree with total" << endl << " Difference is "<<uncert2<<"(total) - "<<sqrt(sum2) << "(sum) = " << uncert2 - sqrt(sum2) << endl; //assert(fabs(uncert2 - sqrt(sum2_up)) < 1e-3); } else if(verbose)cout << "ok" << endl; } if(verbose)cout << "Test result: " << (fail ? "FAIL" : "PASS") << endl; if(verbose)cout << "Tested eta="<<jeteta<<" pt="<<jetpt<<endl; if(fail)nFailedTests++; return (!fail); } // testSources