9 #include "CommonTools/Utils/interface/StringCutObjectSelector.h" 10 #include <DataFormats/Math/interface/deltaR.h> 11 #include <DataFormats/Math/interface/deltaPhi.h> 12 #include <fastjet/JetDefinition.hh> 13 #include <fastjet/PseudoJet.hh> 14 #include <fastjet/ClusterSequence.hh> 15 #include <fastjet/GhostedAreaSpec.hh> 27 const vector<BTagEntry::OperatingPoint>
jet_met_tools::op_pts_{BTagEntry::OP_LOOSE, BTagEntry::OP_MEDIUM, BTagEntry::OP_TIGHT};
28 const vector<BTagEntry::JetFlavor>
jet_met_tools::flavors_{BTagEntry::FLAV_B, BTagEntry::FLAV_C, BTagEntry::FLAV_UDSG};
31 template<
typename T,
typename... Args>
33 return std::unique_ptr<T>(
new T(std::forward<Args>(
args)...));
38 for(
unsigned ilep(0); ilep < leptons.size(); ilep++){
40 unsigned npflep(leptons[ilep]->numberOfSourceCandidatePtrs());
41 if(leptons[ilep]->isMuon() && npflep==1) indpf = 0;
42 if(leptons[ilep]->isElectron() && npflep==2) indpf = 1;
44 for (
unsigned ijet(0); ijet < jet.numberOfSourceCandidatePtrs(); ijet++)
45 if(jet.sourceCandidatePtr(ijet) == leptons[ilep]->sourceCandidatePtr(indpf))
48 if(deltaR(jet, *leptons[ilep]) < sizeJet)
return true;
58 for(
unsigned ind(0);
ind < objects.size();
ind++){
59 double dr(deltaR(jet, *(objects[
ind])));
60 double drelpt(fabs((objects[ind]->pt() - jet.pt())/objects[ind]->pt()));
61 if(objects[ind]->pdgId()==22) {
62 if(objects[ind]->pt()>100){
67 if(drelpt < 1. && dr < sizeJet)
return true;
73 if(!genjets.isValid())
return -99999.;
75 float genjetpt = -99999.;
77 for (
size_t ijet(0); ijet < genjets->size(); ijet++) {
78 const reco::GenJet &genjet = (*genjets)[ijet];
79 double dr(deltaR(jet, genjet));
82 genjetpt = genjet.pt();
85 if (mindr<0.3)
return genjetpt;
90 if(!genjets.isValid())
return false;
91 for (
size_t ijet(0); ijet < genjets->size(); ijet++) {
92 const reco::GenJet &genjet = (*genjets)[ijet];
93 double dr(deltaR(jet, genjet));
94 if(dr < 0.3)
return true;
102 dphi1 = 10.; dphi2 = 10.; dphi3 = 10.; dphi4 = 10.;
103 float *dphi[] = {&dphi1, &dphi2, &dphi3, &dphi4};
104 for(
unsigned ind(0);
ind < jets.size() &&
ind < 4;
ind++)
105 *(dphi[
ind]) = abs(reco::deltaPhi(jets[ind]->phi(), mht_phi));
106 return (dphi1<0.5 || dphi2<0.5 || dphi3<0.3 || dphi4<0.3);
111 for (
size_t ijet(0); ijet < genjets->size(); ijet++) {
112 const reco::GenJet &jet = (*genjets)[ijet];
113 if(jet.pt() > JetHLTPtCut && fabs(jet.eta()) <= JetHLTEtaCut) ht += jet.pt();
120 double eta = fabs(jet.eta());
121 double NHF = jet.neutralHadronEnergyFraction();
122 double NEMF = jet.neutralEmEnergyFraction();
123 double NumConst = jet.chargedMultiplicity()+jet.neutralMultiplicity();
124 double NumNeutralParticles =jet.neutralMultiplicity();
126 double CHF = jet.chargedHadronEnergyFraction();
127 double CHM = jet.chargedMultiplicity();
128 double CEMF = jet.chargedEmEnergyFraction();
131 bool eta_l_2p4 = NumConst>=2 && NHF<0.9 && NEMF<0.95 && CHM>0 && CHF>0 && CEMF<0.99;
132 bool eta_geq_2p4 = NHF<0.9 && NEMF<0.95 && NumConst>=2;
133 return (eta_l_2p4 && eta<2.4) || (eta>=2.4 && eta_geq_2p4);
136 bool passJetID =
true;
138 if (cut==kLoose) passJetID = NHF<0.99 && NEMF<0.99 && NumConst>1;
139 if (cut==kTight) passJetID = NHF<0.90 && NEMF<0.90 && NumConst>1;
141 passJetID = passJetID && CHF>0 && CHM>0 && CEMF<0.99;
143 }
else if (eta<=3.0) {
144 passJetID = NHF<0.98 && NEMF>0.01 && NumNeutralParticles>2;
146 passJetID = NEMF<0.90 && NumNeutralParticles>10;
153 rhoEvent_ = rhoEvent;
155 jetTotCorrections.resize(alljets->size(), 1.);
156 jetL1Corrections.resize(alljets->size(), 1.);
157 jecUnc.resize(alljets->size(), 0.);
158 jerUnc.resize(alljets->size(), 0.);
162 for (
size_t ijet(0); ijet < alljets->size(); ijet++) {
163 const pat::Jet &jet = (*alljets)[ijet];
164 corrJet.push_back(jet.p4());
165 genJetPt.push_back(getGenPt(jet, genjets));
171 for (
size_t ijet(0); ijet < alljets->size(); ijet++) {
172 const pat::Jet &jet = (*alljets)[ijet];
173 float rawFactor(jet.jecFactor(
"Uncorrected"));
174 jetValues.setJetPt(jet.pt()*rawFactor);
175 jetValues.setJetEta(jet.eta());
176 jetValues.setJetA(jet.jetArea());
177 jetValues.setRho(rhoEvent);
178 vector<float> corr_vals = jetCorrector->getSubCorrections(jetValues);
179 jetTotCorrections[ijet] = corr_vals.at(corr_vals.size()-1);
180 jetL1Corrections[ijet] = corr_vals.at(0);
181 corrJet.push_back(jet.p4()*rawFactor*jetTotCorrections[ijet]);
184 genJetPt.push_back(getGenPt(jet, genjets));
187 jecUncProvider->setJetEta(jet.eta());
188 jecUncProvider->setJetPt(corrJet[ijet].pt());
189 jecUnc[ijet] = jecUncProvider->getUncertainty(
true);
190 if (
isData) jecUnc[ijet] = sqrt(pow(jecUnc[ijet],2) + pow((corr_vals.at(corr_vals.size()-1)/corr_vals.at(corr_vals.size()-2)-1.),2));
193 float smearedJetPt(0.);
194 if (genJetPt[ijet]>0) smearedJetPt = genJetPt[ijet] + getJetResolutionSF(jet.eta())*(corrJet[ijet].pt() - genJetPt[ijet]);
195 jerUnc[ijet] = smearedJetPt/corrJet[ijet].pt() - 1.;
196 if (smearedJetPt < 0.01) jerUnc[ijet] = 0.;
204 for (
size_t ijet(0); ijet < alljets_->size(); ijet++) {
205 const pat::Jet &jet = (*alljets_)[ijet];
207 jecUncProvider->setJetEta(jet.eta());
208 jecUncProvider->setJetPt(corrJet[ijet].pt());
209 jecUnc[ijet] = jecUncProvider->getUncertainty(
true);
211 float rawFactor(jet.jecFactor(
"Uncorrected"));
212 jetValues.setJetPt(jet.pt()*rawFactor);
213 jetValues.setJetEta(jet.eta());
214 jetValues.setJetA(jet.jetArea());
215 jetValues.setRho(rhoEvent_);
216 vector<float> corr_vals = jetCorrector->getSubCorrections(jetValues);
217 jecUnc[ijet] = sqrt(pow(jecUnc[ijet],2) + pow((corr_vals.at(corr_vals.size()-1)/corr_vals.at(corr_vals.size()-2)-1.),2));
220 float smearedJetPt(0.);
221 if (genJetPt[ijet]>0) smearedJetPt = genJetPt[ijet] + getJetResolutionSF(jet.eta())*(corrJet[ijet].pt() - genJetPt[ijet]);
222 jerUnc[ijet] = smearedJetPt/corrJet[ijet].pt() - 1.;
223 if (smearedJetPt < 0.01) jerUnc[ijet] = 0.;
228 metRaw = mets->at(0).uncorPt();
229 metRawPhi = mets->at(0).uncorPhi();
234 met = mets->at(0).pt();
235 metPhi = mets->at(0).phi();
239 float metRaw, metRawPhi;
240 getMETRaw(mets, metRaw, metRawPhi);
241 float metx(metRaw*cos(metRawPhi)), mety(metRaw*sin(metRawPhi));
245 StringCutObjectSelector<reco::Candidate> skipMuonSelection(
"isGlobalMuon | isStandAloneMuon",
true);
246 for (
size_t ijet(0); ijet < alljets_->size(); ijet++) {
247 const pat::Jet &jet = (*alljets_)[ijet];
249 double emEnergyFraction = jet.chargedEmEnergyFraction() + jet.neutralEmEnergyFraction();
250 if(emEnergyFraction > 0.90 || fabs(jet.eta()) > 9.9)
continue;
252 reco::Candidate::LorentzVector rawJetP4 = jet.p4()*jet.jecFactor(
"Uncorrected");
253 float totCorr(jetTotCorrections[ijet]), l1Corr(jetL1Corrections[ijet]);
254 const std::vector<reco::CandidatePtr> & cands = jet.daughterPtrVector();
255 for ( std::vector<reco::CandidatePtr>::const_iterator cand = cands.begin();
256 cand != cands.end(); ++cand ) {
257 const reco::PFCandidate *pfcand =
dynamic_cast<const reco::PFCandidate *
>(cand->get());
258 const reco::Candidate *mu = (pfcand != 0 ? ( pfcand->muonRef().isNonnull() ? pfcand->muonRef().get() : 0) : cand->get());
259 if ( mu != 0 && skipMuonSelection(*mu) ) {
260 reco::Candidate::LorentzVector muonP4 = (*cand)->p4();
262 jetValues.setJetPt(rawJetP4.pt());
263 jetValues.setJetEta(rawJetP4.eta());
264 jetValues.setJetA(jet.jetArea());
265 jetValues.setRho(rhoEvent_);
266 vector<float> corr_vals = jetCorrector->getSubCorrections(jetValues);
267 totCorr = corr_vals.at(corr_vals.size()-1);
268 l1Corr = corr_vals.at(0);
272 if (isys ==
kSysJER) totCorr *= 1+jerUnc[ijet];
273 else if (isys ==
kSysJECUp) totCorr *= 1+jecUnc[ijet];
274 else if (isys ==
kSysJECDn) totCorr *= 1-jecUnc[ijet];
276 if((rawJetP4.pt()*totCorr) <= 15.)
continue;
277 metx -= rawJetP4.px()*(totCorr - l1Corr);
278 mety -= rawJetP4.py()*(totCorr - l1Corr);
281 met = hypot(metx,mety);
282 metPhi = atan2(mety,metx);
287 BTagEntry::OperatingPoint op,
288 const string &bc_full_syst,
const string &udsg_full_syst,
289 const string &bc_fast_syst,
const string &udsg_fast_syst,
bool doDeepCSV,
bool doByProc)
const{
290 return jetBTagWeight(jet, jetp4, vector<BTagEntry::OperatingPoint>{op},
291 bc_full_syst, udsg_full_syst, bc_fast_syst, udsg_fast_syst, doDeepCSV, doByProc);
295 BTagEntry::OperatingPoint op,
296 const string &bc_full_syst,
const string &udsg_full_syst,
bool doDeepCSV,
bool doByProc)
const{
297 return jetBTagWeight(jet, jetp4, vector<BTagEntry::OperatingPoint>{op},
298 bc_full_syst, udsg_full_syst,
"central",
"central", doDeepCSV, doByProc);
302 const vector<BTagEntry::OperatingPoint> &ops,
303 const string &bc_full_syst,
const string &udsg_full_syst,
bool doDeepCSV,
bool doByProc)
const{
304 return jetBTagWeight(jet, jetp4, ops,
305 bc_full_syst, udsg_full_syst,
"central",
"central", doDeepCSV, doByProc);
309 const vector<BTagEntry::OperatingPoint> &ops,
310 const string &bc_full_syst,
const string &udsg_full_syst,
311 const string &bc_fast_syst,
const string &udsg_fast_syst,
bool doDeepCSV,
bool doByProc)
const{
313 int hadronFlavour = abs(jet.hadronFlavour());
314 BTagEntry::JetFlavor flav;
315 string full_syst, fast_syst;
316 switch(hadronFlavour){
317 case 5: flav = BTagEntry::FLAV_B;
break;
318 case 4: flav = BTagEntry::FLAV_C;
break;
319 default: flav = BTagEntry::FLAV_UDSG;
break;
322 case BTagEntry::FLAV_B:
323 case BTagEntry::FLAV_C:
324 full_syst = bc_full_syst;
325 fast_syst = bc_fast_syst;
327 case BTagEntry::FLAV_UDSG:
328 full_syst = udsg_full_syst;
329 fast_syst = udsg_fast_syst;
332 ERROR(
"Did not recognize BTagEntry::JetFlavor " << static_cast<int>(flav));
335 vector<float> opcuts;
336 for (
auto &iop: ops) {
337 if (iop==BTagEntry::OP_LOOSE) opcuts.push_back(doDeepCSV ? DeepCSVLoose: CSVLoose);
338 else if (iop==BTagEntry::OP_MEDIUM) opcuts.push_back(doDeepCSV ? DeepCSVMedium: CSVMedium);
339 else if (iop==BTagEntry::OP_TIGHT) opcuts.push_back(doDeepCSV ? DeepCSVTight: CSVTight);
342 float csv = jet.bDiscriminator(
"pfCombinedInclusiveSecondaryVertexV2BJetTags");
344 csv = jet.bDiscriminator(
"deepFlavourJetTags:probb")+jet.bDiscriminator(
"deepFlavourJetTags:probbb");
347 for (
unsigned iop(0); iop<opcuts.size(); iop++)
348 if (csv>opcuts[iop]) tag = iop;
350 const map<BTagEntry::OperatingPoint, unique_ptr<BTagCalibrationReader> > *ireaders_full = &readers_full_;
351 if (doDeepCSV) ireaders_full = &readers_deep_full_;
352 const map<BTagEntry::OperatingPoint, unique_ptr<BTagCalibrationReader> > *ireaders_fast = &readers_fast_;
353 if (doDeepCSV) ireaders_fast = &readers_deep_fast_;
355 double eff1(1), eff2(0), sf1(1), sf2(1), sf1_fs(1), sf2_fs(1);
357 BTagEntry::OperatingPoint iop = ops[
tag];
358 eff1 = getMCTagEfficiency(hadronFlavour, jetp4.pt(), jetp4.eta(), iop, doDeepCSV, doByProc);
359 sf1 = ireaders_full->at(iop)->eval_auto_bounds(full_syst, flav, jetp4.eta(), jetp4.pt());
360 if (
isFastSim) sf1_fs = ireaders_fast->at(iop)->eval_auto_bounds(fast_syst, flav, jetp4.eta(), jetp4.pt());
362 if (tag <
int(ops.size())-1) {
363 BTagEntry::OperatingPoint iop = ops[tag+1];
364 eff2 = getMCTagEfficiency(hadronFlavour, jetp4.pt(), jetp4.eta(), iop, doDeepCSV, doByProc);
365 sf2 = ireaders_full->at(iop)->eval_auto_bounds(full_syst, flav, jetp4.eta(), jetp4.pt());
366 if (
isFastSim) sf2_fs = ireaders_fast->at(iop)->eval_auto_bounds(fast_syst, flav, jetp4.eta(), jetp4.pt());
369 double eff1_fs(eff1/sf1_fs), eff2_fs(eff2/sf2_fs);
370 return (sf1*sf1_fs*eff1_fs-sf2*sf2_fs*eff2_fs)/(eff1_fs-eff2_fs);
374 size_t rdr_idx = distance(op_pts_.cbegin(), find(op_pts_.cbegin(), op_pts_.cend(), op));
376 if(pdgId != 4 && pdgId != 5){
385 bin = btag_efficiencies_.at(rdr_idx)->FindFixBin(fabs(eta), pT, pdgId);
386 eff = btag_efficiencies_.at(rdr_idx)->GetBinContent(bin);
389 bin = btag_efficiencies_proc_.at(rdr_idx)->FindFixBin(fabs(eta), pT, pdgId);
390 eff = btag_efficiencies_proc_.at(rdr_idx)->GetBinContent(bin);
395 bin = btag_efficiencies_deep_.at(rdr_idx)->FindFixBin(fabs(eta), pT, pdgId);
396 eff = btag_efficiencies_deep_.at(rdr_idx)->GetBinContent(bin);
399 bin = btag_efficiencies_deep_proc_.at(rdr_idx)->FindFixBin(fabs(eta), pT, pdgId);
400 eff = btag_efficiencies_deep_proc_.at(rdr_idx)->GetBinContent(bin);
408 void jet_met_tools::fillDeltaRbb(vector<float> & deltaRbb, vector<float> & bb_pt,vector<float> & bb_m,vector<int> & bb_jet_idx1, vector<int> & bb_jet_idx2,vector<int> & bb_gs_idx,vector<int> & bb_gs_flavor,
const vector<LVector> &
jets,
const vector<float> &jets_csv,
const vector<bool> &jets_islep,
const vector<float> &jets_pt,
const vector<size_t> &branks,
int & highcsv_index,
bool deep)
410 for(
size_t ijet(0); ijet<jets.size(); ijet++) {
411 for(
size_t jjet=ijet+1; jjet<jets.size(); jjet++) {
412 if(jets_pt[ijet]<JetPtCut || jets_pt[jjet]<JetPtCut)
continue;
413 if(!deep) {
if(jets_csv[ijet]<CSVMedium || jets_csv[jjet]<CSVMedium)
continue;}
414 else {
if(jets_csv[ijet]<DeepCSVMedium || jets_csv[jjet]<DeepCSVMedium)
continue;}
415 if(jets_islep[ijet] || jets_islep[jjet])
continue;
416 deltaRbb.push_back(deltaR(jets.at(ijet), jets.at(jjet)));
417 bb_pt.push_back(
sumPt(jets.at(ijet), jets.at(jjet)));
418 bb_m.push_back(
sumMass(jets.at(ijet), jets.at(jjet)));
419 bb_jet_idx1.push_back(ijet);
420 bb_jet_idx2.push_back(jjet);
423 if((ijet==branks.at(0) && jjet==branks.at(1)) || (ijet==branks.at(1) && jjet==branks.at(0))) highcsv_index = deltaRbb.size()-1;
425 bb_gs_idx.push_back(-1);
426 bb_gs_flavor.push_back(0);
434 const vector<bool> &is_lep){
435 typedef tuple<bool, float, float, float> Bness;
436 vector<pair<Bness, long> >
jets;
437 for(
size_t i = 0; i < momentum.size(); ++i){
438 jets.push_back(pair<Bness, size_t>(Bness(!(is_lep.at(i)||momentum.at(i).pt()<30.0), csv.at(i), momentum.at(i).pt(), momentum.at(i).M()), -i));
440 sort(jets.rbegin(), jets.rend());
441 vector<size_t> indices(jets.size());
442 for(
size_t i = 0; i < jets.size(); ++i){
443 indices.at(i) = -jets.at(i).second;
449 return (brank.size() > 1 && nb > 1) ? deltaR(momentum.at(brank.at(0)), momentum.at(brank.at(1))) : -1.;
455 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
456 for(
size_t j = i + 1; j < nb && j < brank.size(); ++j){
457 float x = deltaR(momentum.at(brank.at(i)), momentum.at(brank.at(j)));
467 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
468 for(
size_t j = i + 1; j < nb && j < brank.size(); ++j){
469 float x = deltaR(momentum.at(brank.at(i)), momentum.at(brank.at(j)));
470 if(x < min || min < 0.) min = x;
477 return (brank.size() > 1 && nb > 1) ? fabs(reco::deltaPhi(momentum.at(brank.at(0)).phi(), momentum.at(brank.at(1)).phi())) : -1.;
483 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
484 for(
size_t j = i + 1; j < nb && j < brank.size(); ++j){
485 float x = fabs(reco::deltaPhi(momentum.at(brank.at(i)).phi(), momentum.at(brank.at(j)).phi()));
495 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
496 for(
size_t j = i + 1; j < nb && j < brank.size(); ++j){
497 float x = fabs(reco::deltaPhi(momentum.at(brank.at(i)).phi(), momentum.at(brank.at(j)).phi()));
498 if(x < min || min < 0.) min = x;
505 return (brank.size() > 1 && nb > 1) ?
sumMass(momentum.at(brank.at(0)), momentum.at(brank.at(1))) : -1.;
511 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
512 for(
size_t j = i + 1; j < nb && j < brank.size(); ++j){
513 float x =
sumMass(momentum.at(brank.at(i)), momentum.at(brank.at(j)));
523 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
524 for(
size_t j = i + 1; j < nb && j < brank.size(); ++j){
525 float x =
sumMass(momentum.at(brank.at(i)), momentum.at(brank.at(j)));
526 if(x < min || min < 0.) min = x;
533 size_t nb,
const LVector &lep){
536 case 1:
return sumMass(jets.at(brank.at(0)), lep);
538 float a =
sumMass(jets.at(brank.at(0)), lep);
539 float b =
sumMass(jets.at(brank.at(1)), lep);
545 size_t nb,
const LVector &lep){
548 case 1:
return sumMass(jets.at(brank.at(0)), lep);
550 float a =
sumMass(jets.at(brank.at(0)), lep);
551 float b =
sumMass(jets.at(brank.at(1)), lep);
557 size_t nb,
const LVector &lep){
559 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
560 float m =
sumMass(jets.at(brank.at(i)), lep);
567 size_t nb,
const LVector &lep){
569 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
570 float m =
sumMass(jets.at(brank.at(i)), lep);
571 if(m<min || min<0.) min = m;
577 size_t nb,
const LVector &lep){
580 case 1:
return deltaR(jets.at(brank.at(0)), lep);
582 float a = deltaR(jets.at(brank.at(0)), lep);
583 float b = deltaR(jets.at(brank.at(1)), lep);
589 size_t nb,
const LVector &lep){
592 case 1:
return deltaR(jets.at(brank.at(0)), lep);
594 float a = deltaR(jets.at(brank.at(0)), lep);
595 float b = deltaR(jets.at(brank.at(1)), lep);
601 size_t nb,
const LVector &lep){
603 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
604 float m = deltaR(jets.at(brank.at(i)), lep);
611 size_t nb,
const LVector &lep){
613 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
614 float m = deltaR(jets.at(brank.at(i)), lep);
615 if(m<min || min < 0.) min = m;
621 size_t nb,
const LVector &lep){
624 case 1:
return fabs(reco::deltaPhi(jets.at(brank.at(0)).phi(), lep.phi()));
626 float a = fabs(reco::deltaPhi(jets.at(brank.at(0)).phi(), lep.phi()));
627 float b = fabs(reco::deltaPhi(jets.at(brank.at(1)).phi(), lep.phi()));
633 size_t nb,
const LVector &lep){
636 case 1:
return fabs(reco::deltaPhi(jets.at(brank.at(0)).phi(), lep.phi()));
638 float a = fabs(reco::deltaPhi(jets.at(brank.at(0)).phi(), lep.phi()));
639 float b = fabs(reco::deltaPhi(jets.at(brank.at(1)).phi(), lep.phi()));
645 size_t nb,
const LVector &lep){
647 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
648 float m = fabs(reco::deltaPhi(jets.at(brank.at(i)).phi(), lep.phi()));
655 size_t nb,
const LVector &lep){
657 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
658 float m = fabs(reco::deltaPhi(jets.at(brank.at(i)).phi(), lep.phi()));
659 if(m<min || min < 0.) min = m;
665 size_t nb,
float met,
float met_phi){
669 const auto &j = jets.at(brank.at(0));
670 return getMT(j.M(), j.pt(), j.phi(), 0.,
met, met_phi);
672 const auto &ja = jets.at(brank.at(0));
673 const auto &jb = jets.at(brank.at(1));
674 float a =
getMT(ja.M(), ja.pt(), ja.phi(), 0.,
met, met_phi);
675 float b =
getMT(jb.M(), jb.pt(), jb.phi(), 0.,
met, met_phi);
681 size_t nb,
float met,
float met_phi){
685 const auto &j = jets.at(brank.at(0));
686 return getMT(j.M(), j.pt(), j.phi(), 0.,
met, met_phi);
688 const auto &ja = jets.at(brank.at(0));
689 const auto &jb = jets.at(brank.at(1));
690 float a =
getMT(ja.M(), ja.pt(), ja.phi(), 0.,
met, met_phi);
691 float b =
getMT(jb.M(), jb.pt(), jb.phi(), 0.,
met, met_phi);
697 size_t nb,
float met,
float met_phi){
699 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
700 const auto &jet = jets.at(brank.at(i));
701 float m =
getMT(jet.M(), jet.pt(), jet.phi(), 0.,
met, met_phi);
708 size_t nb,
float met,
float met_phi){
710 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
711 const auto &jet = jets.at(brank.at(i));
712 float m =
getMT(jet.M(), jet.pt(), jet.phi(), 0.,
met, met_phi);
713 if(m<min || min<0.) m = min;
719 size_t nb,
float met_phi){
722 case 1:
return fabs(reco::deltaPhi(jets.at(brank.at(0)).phi(), met_phi));
724 float a = fabs(reco::deltaPhi(jets.at(brank.at(0)).phi(), met_phi));
725 float b = fabs(reco::deltaPhi(jets.at(brank.at(1)).phi(), met_phi));
731 size_t nb,
float met_phi){
734 case 1:
return fabs(reco::deltaPhi(jets.at(brank.at(0)).phi(), met_phi));
736 float a = fabs(reco::deltaPhi(jets.at(brank.at(0)).phi(), met_phi));
737 float b = fabs(reco::deltaPhi(jets.at(brank.at(1)).phi(), met_phi));
743 size_t nb,
float met_phi){
745 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
746 float m = fabs(reco::deltaPhi(jets.at(brank.at(i)).phi(), met_phi));
753 size_t nb,
float met_phi){
755 for(
size_t i = 0; i < nb && i < brank.size(); ++i){
756 float m = fabs(reco::deltaPhi(jets.at(brank.at(i)).phi(), met_phi));
757 if(m<min || min < 0.) min = m;
763 std::vector<float> &fjets_pt,
764 std::vector<float> &fjets_eta,
765 std::vector<float> &fjets_phi,
766 std::vector<float> &fjets_m,
767 std::vector<int> &fjets_nconst,
768 std::vector<int> &jets_fjet_index,
774 vector<fastjet::PseudoJet> sjets(0);
775 for(
size_t ijet(0); ijet < baby.
jets_pt().size(); ijet++){
776 if (!cluster_leps && baby.
jets_islep()[ijet])
continue;
777 if (baby.
jets_pt()[ijet]>min_jets_pt || (cluster_leps && baby.
jets_islep()[ijet])) {
779 const fastjet::PseudoJet this_pj(vjet.Px(), vjet.Py(), vjet.Pz(), vjet.E());
780 sjets.push_back(this_pj);
783 fastjet::JetDefinition jet_def(fastjet::antikt_algorithm, radius);
784 fastjet::ClusterSequence cs(sjets, jet_def);
785 vector<fastjet::PseudoJet> fjets = cs.inclusive_jets();
786 sort(fjets.begin(), fjets.end(),
greaterM);
789 fjets_pt.resize(fjets.size());
790 fjets_eta.resize(fjets.size());
791 fjets_phi.resize(fjets.size());
792 fjets_m.resize(fjets.size());
793 fjets_nconst.resize(fjets.size());
794 jets_fjet_index.resize(baby.
jets_csv().size(), -1);
796 for(
size_t ipj = 0; ipj < fjets.size(); ++ipj){
797 const fastjet::PseudoJet &pj = fjets.at(ipj);
798 fjets_pt.at(ipj) = pj.pt();
799 fjets_eta.at(ipj) = pj.eta();
800 fjets_phi.at(ipj) = pj.phi_std();
801 fjets_m.at(ipj) = pj.m();
802 const vector<fastjet::PseudoJet> &cjets = pj.constituents();
803 fjets_nconst.at(ipj) = cjets.size();
806 for(
size_t ijet = 0; ijet < baby.
jets_pt().size(); ++ijet){
807 for(
size_t cjet = 0; cjet < cjets.size(); ++ cjet){
808 if(fabs(cjets.at(cjet).pt() - baby.
jets_pt()[ijet]) < 0.0001){
809 jets_fjet_index.at(ijet) = ipj;
820 vector<fastjet::PseudoJet> sjets(0);
821 for(
size_t ijet(0); ijet < jets.size(); ijet++){
822 if (!cluster_leps && jets_islep[ijet])
continue;
823 if (jets[ijet].pt()>min_jets_pt || (cluster_leps && jets_islep[ijet])) {
824 const fastjet::PseudoJet this_pj(jets[ijet].px(), jets[ijet].py(), jets[ijet].pz(), jets[ijet].energy());
825 sjets.push_back(this_pj);
828 fastjet::JetDefinition jet_def(fastjet::antikt_algorithm, radius);
829 fastjet::ClusterSequence cs(sjets, jet_def);
830 vector<fastjet::PseudoJet> fjets = cs.inclusive_jets();
831 sort(fjets.begin(), fjets.end(),
greaterM);
832 for(
size_t ipj = 0; ipj < fjets.size(); ++ipj) mj += fjets.at(ipj).m();
844 btag_efficiencies_(op_pts_.size()),
845 btag_efficiencies_proc_(op_pts_.size()),
848 readers_deep_full_(),
849 readers_deep_fast_(),
850 btag_efficiencies_deep_(op_pts_.size()),
851 btag_efficiencies_deep_proc_(op_pts_.size()){
854 else cout<<endl<<
"BABYMAKER: jet_met_tools: The jecLabel string must contain either 'DATA' or 'MC'. " 855 <<
"Currently running with "<<
jecName<<endl<<endl;
858 jecName.ReplaceAll(
"onthefly_",
"");
859 string basename(getenv(
"CMSSW_BASE"));
860 basename +=
"/src/babymaker/data/jec/";
864 vector<JetCorrectorParameters> jecFiles;
865 if (
doJEC) cout<<endl<<
"BABYMAKER: jet_met_tools: Applying JECs on-the-fly with files " 866 <<basename.c_str()<<
"*.txt"<<endl<<endl;
868 jecFiles.push_back(JetCorrectorParameters(basename+
"_L1FastJet_AK4PFchs.txt"));
869 jecFiles.push_back(JetCorrectorParameters(basename+
"_L2Relative_AK4PFchs.txt"));
870 jecFiles.push_back(JetCorrectorParameters(basename+
"_L3Absolute_AK4PFchs.txt"));
872 jecFiles.push_back(JetCorrectorParameters(basename+
"_L2L3Residual_AK4PFchs.txt"));
873 jetCorrector.reset(
new FactorizedJetCorrectorCalculator(jecFiles));
876 cout<<endl<<
"BABYMAKER: jet_met_tools: Using JEC uncertainties from file " 877 <<basename.c_str()<<
"_Uncertainty_AK4PFchs.txt"<<endl<<endl;
878 jecUncProvider.reset(
new JetCorrectionUncertainty(basename+
"_Uncertainty_AK4PFchs.txt"));
882 TString
cmssw(getenv(
"CMSSW_VERSION"));
883 if(cmssw.Contains(
"CMSSW_7_4")){
888 else if (cmssw.Contains(
"CMSSW_8")){
896 else if (cmssw.Contains(
"CMSSW_9") || cmssw.Contains(
"CMSSW_10")){
909 string scaleFactorFile(getenv(
"CMSSW_BASE"));
910 scaleFactorFile+=
"/src/babymaker/bmaker/data/CSVv2_Moriond17_B_H.csv";
911 calib_full_.reset(
new BTagCalibration(
"csvv2", scaleFactorFile));
913 readers_full_[op] = MakeUnique<BTagCalibrationReader>(op,
"central", vector<string>{
"up",
"down"});
918 string scaleFactorFile_deep(getenv(
"CMSSW_BASE"));
919 scaleFactorFile_deep+=
"/src/babymaker/bmaker/data/DeepCSV_Moriond17_B_H.csv";
920 calib_deep_full_.reset(
new BTagCalibration(
"csvv2_deep", scaleFactorFile_deep));
921 for(
const auto &op: op_pts_){
922 readers_deep_full_[op] = MakeUnique<BTagCalibrationReader>(op,
"central", vector<string>{
"up",
"down"});
929 string scaleFactorFileFastSim(getenv(
"CMSSW_BASE"));
930 scaleFactorFileFastSim+=
"/src/babymaker/bmaker/data/fastsim_csvv2_ttbar_26_1_2017.csv";
931 calib_fast_.reset(
new BTagCalibration(
"csvv2", scaleFactorFileFastSim));
932 for(
const auto &op: op_pts_){
933 readers_fast_[op] = MakeUnique<BTagCalibrationReader>(op,
"central", vector<string>{
"up",
"down"});
938 string scaleFactorFileFastSim_deep(getenv(
"CMSSW_BASE"));
939 scaleFactorFileFastSim_deep+=
"/src/babymaker/bmaker/data/fastsim_deepcsv_ttbar_26_1_2017.csv";
940 calib_deep_fast_.reset(
new BTagCalibration(
"csvv2", scaleFactorFileFastSim_deep));
941 for(
const auto &op: op_pts_){
942 readers_deep_fast_[op] = MakeUnique<BTagCalibrationReader>(op,
"central", vector<string>{
"up",
"down"});
949 string filename(getenv(
"CMSSW_BASE"));
950 filename+=
"/src/babymaker/bmaker/data/btagEfficiencies/btagEfficiency.root";
951 TFile *efficiencyFile = TFile::Open(filename.c_str());
952 if(efficiencyFile->IsOpen()) {
953 for(
size_t i = 0; i < op_pts_.size(); ++i){
955 switch(op_pts_.at(i)){
956 case BTagEntry::OP_LOOSE: hist_name =
"btagEfficiency_loose";
break;
957 case BTagEntry::OP_MEDIUM: hist_name =
"btagEfficiency_medium";
break;
958 case BTagEntry::OP_TIGHT: hist_name =
"btagEfficiency_tight";
break;
959 case BTagEntry::OP_RESHAPING: hist_name =
"btagEfficiency_reshaping";
break;
960 default: hist_name =
"btagEfficiency";
break;
962 btag_efficiencies_.at(i) =
static_cast<const TH3D*
>(efficiencyFile->Get(hist_name.c_str()));
964 ERROR(
"Could not find efficiency parametrization " << hist_name);
968 ERROR(
"Could not find efficiency file " << filename);
971 string filename_deep(getenv(
"CMSSW_BASE"));
972 filename_deep+=
"/src/babymaker/bmaker/data/btagEfficiencies/btagEfficiency_deep.root";
973 TFile *efficiencyFile_deep = TFile::Open(filename_deep.c_str());
974 if(efficiencyFile_deep->IsOpen()) {
975 for(
size_t i = 0; i < op_pts_.size(); ++i){
977 switch(op_pts_.at(i)){
978 case BTagEntry::OP_LOOSE: hist_name =
"btagEfficiency_deep_loose";
break;
979 case BTagEntry::OP_MEDIUM: hist_name =
"btagEfficiency_deep_medium";
break;
980 case BTagEntry::OP_TIGHT: hist_name =
"btagEfficiency_deep_tight";
break;
981 case BTagEntry::OP_RESHAPING: hist_name =
"btagEfficiency_deep_reshaping";
break;
982 default: hist_name =
"btagEfficiency";
break;
986 ERROR(
"Could not find efficiency parametrization " << hist_name);
990 ERROR(
"Could not find efficiency file " << filename_deep);
993 string filename_proc(getenv(
"CMSSW_BASE"));
994 if(outname.Contains(
"QCD")) filename_proc+=
"/src/babymaker/bmaker/data/btagEfficiencies/btagEfficiency_qcd.root";
995 else if(outname.Contains(
"WJets") && !outname.Contains(
"TTWJets")) filename_proc+=
"/src/babymaker/bmaker/data/btagEfficiencies/btagEfficiency_wjets.root";
996 else filename_proc+=
"/src/babymaker/bmaker/data/btagEfficiencies/btagEfficiency_tt.root";
997 TFile *efficiencyFile_proc = TFile::Open(filename_proc.c_str());
998 if(efficiencyFile_proc->IsOpen()) {
999 for(
size_t i = 0; i < op_pts_.size(); ++i){
1001 switch(op_pts_.at(i)){
1002 case BTagEntry::OP_LOOSE: hist_name =
"btagEfficiency_loose";
break;
1003 case BTagEntry::OP_MEDIUM: hist_name =
"btagEfficiency_medium";
break;
1004 case BTagEntry::OP_TIGHT: hist_name =
"btagEfficiency_tight";
break;
1005 case BTagEntry::OP_RESHAPING: hist_name =
"btagEfficiency_reshaping";
break;
1006 default: hist_name =
"btagEfficiency";
break;
1010 ERROR(
"Could not find efficiency parametrization " << hist_name);
1014 ERROR(
"Could not find efficiency file " << filename_proc);
1017 string filename_deep_proc(getenv(
"CMSSW_BASE"));
1018 if(outname.Contains(
"QCD")) filename_deep_proc+=
"/src/babymaker/bmaker/data/btagEfficiencies/btagEfficiency_deep_qcd.root";
1019 else if(outname.Contains(
"WJets") && !outname.Contains(
"TTWJets")) filename_deep_proc+=
"/src/babymaker/bmaker/data/btagEfficiencies/btagEfficiency_deep_wjets.root";
1020 else filename_deep_proc+=
"/src/babymaker/bmaker/data/btagEfficiencies/btagEfficiency_deep_tt.root";
1021 TFile *efficiencyFile_deep_proc = TFile::Open(filename_deep_proc.c_str());
1022 if(efficiencyFile_deep_proc->IsOpen()) {
1023 for(
size_t i = 0; i < op_pts_.size(); ++i){
1025 switch(op_pts_.at(i)){
1026 case BTagEntry::OP_LOOSE: hist_name =
"btagEfficiency_deep_loose";
break;
1027 case BTagEntry::OP_MEDIUM: hist_name =
"btagEfficiency_deep_medium";
break;
1028 case BTagEntry::OP_TIGHT: hist_name =
"btagEfficiency_deep_tight";
break;
1029 case BTagEntry::OP_RESHAPING: hist_name =
"btagEfficiency_deep_reshaping";
break;
1030 default: hist_name =
"btagEfficiency";
break;
1034 ERROR(
"Could not find efficiency parametrization " << hist_name);
1038 ERROR(
"Could not find efficiency file " << filename_deep_proc);
1045 double abseta = fabs(jet_eta);
1046 if (abseta < 0.5)
return 1.109;
1047 else if (abseta < 0.8)
return 1.138;
1048 else if (abseta < 1.1)
return 1.114;
1049 else if (abseta < 1.3)
return 1.123;
1050 else if (abseta < 1.7)
return 1.084;
1051 else if (abseta < 1.9)
return 1.082;
1052 else if (abseta < 2.1)
return 1.140;
1053 else if (abseta < 2.3)
return 1.067;
1054 else if (abseta < 2.5)
return 1.177;
1055 else if (abseta < 2.8)
return 1.364;
1056 else if (abseta < 3.0)
return 1.857;
1057 else if (abseta < 3.2)
return 1.328;
1058 else if (abseta < 5.0)
return 1.160;
bool greaterM(const fastjet::PseudoJet &a, const fastjet::PseudoJet &b)
std::vector< float > const & jets_csv() const
std::vector< const reco::Candidate * > vCands
std::vector< bool > const & jets_islep() const
std::vector< float > const & jets_phi() const
isData
If you only want to re-correct and get the proper uncertainties, no reclustering. ...
float getMT(float pt1, float phi1, float pt2, float phi2)
std::vector< float > const & jets_pt() const
doJEC
JECs must be undone and reapplied when rerunning b-tagging => if doJEC = False, DeepCSV discriminator...
std::vector< float > const & jets_eta() const
float sumMass(const LVector &a, const LVector &b)
std::vector< float > const & jets_m() const
reco::Candidate::LorentzVector LVector
float sumPt(const LVector &a, const LVector &b)