CMS 3D CMS Logo

PileupJetIdAlgo.cc
Go to the documentation of this file.
2 
10 
11 #include "TMatrixDSym.h"
12 #include "TMatrixDSymEigen.h"
13 
14 #include <utility>
15 
16 // ------------------------------------------------------------------------------------------
18 
19 // ------------------------------------------------------------------------------------------
20 
22  : cutBased_(ps.getParameter<bool>("cutBased")),
23  etaBinnedWeights_(false),
24  runMvas_(runMvas),
25  nEtaBins_(0),
26  label_(ps.getParameter<std::string>("label")),
27  mvacut_{},
28  rmsCut_{},
29  betaStarCut_{} {
30  std::vector<edm::FileInPath> tmvaEtaWeights;
31  std::vector<std::string> tmvaSpectators;
32  int version;
33 
34  if (!cutBased_) {
35  etaBinnedWeights_ = ps.getParameter<bool>("etaBinnedWeights");
36  if (etaBinnedWeights_) {
37  const std::vector<edm::ParameterSet>& trainings = ps.getParameter<std::vector<edm::ParameterSet> >("trainings");
38  nEtaBins_ = ps.getParameter<int>("nEtaBins");
39  for (int v = 0; v < nEtaBins_; v++) {
40  tmvaEtaWeights.push_back(trainings.at(v).getParameter<edm::FileInPath>("tmvaWeights"));
41  jEtaMin_.push_back(trainings.at(v).getParameter<double>("jEtaMin"));
42  jEtaMax_.push_back(trainings.at(v).getParameter<double>("jEtaMax"));
43  }
44  for (int v = 0; v < nEtaBins_; v++) {
45  tmvaEtaVariables_.push_back(trainings.at(v).getParameter<std::vector<std::string> >("tmvaVariables"));
46  }
47  } else {
48  tmvaVariables_ = ps.getParameter<std::vector<std::string> >("tmvaVariables");
49  }
50  tmvaMethod_ = ps.getParameter<std::string>("tmvaMethod");
51  tmvaSpectators = ps.getParameter<std::vector<std::string> >("tmvaSpectators");
52  version = ps.getParameter<int>("version");
53  } else {
54  version = USER;
55  }
56 
57  edm::ParameterSet jetConfig = ps.getParameter<edm::ParameterSet>("JetIdParams");
58  for (int i0 = 0; i0 < 3; i0++) {
59  std::string lCutType = "Tight";
61  lCutType = "Medium";
63  lCutType = "Loose";
64  int nCut = 1;
65  if (cutBased_)
66  nCut++;
67  for (int i1 = 0; i1 < nCut; i1++) {
68  std::string lFullCutType = lCutType;
69  if (cutBased_ && i1 == 0)
70  lFullCutType = "BetaStar" + lCutType;
71  if (cutBased_ && i1 == 1)
72  lFullCutType = "RMS" + lCutType;
73  std::vector<double> pt010 = jetConfig.getParameter<std::vector<double> >(("Pt010_" + lFullCutType).c_str());
74  std::vector<double> pt1020 = jetConfig.getParameter<std::vector<double> >(("Pt1020_" + lFullCutType).c_str());
75  std::vector<double> pt2030 = jetConfig.getParameter<std::vector<double> >(("Pt2030_" + lFullCutType).c_str());
76  std::vector<double> pt3040 = jetConfig.getParameter<std::vector<double> >(("Pt3040_" + lFullCutType).c_str());
77  std::vector<double> pt4050 = jetConfig.getParameter<std::vector<double> >(("Pt4050_" + lFullCutType).c_str());
78  if (!cutBased_) {
79  for (int i2 = 0; i2 < 4; i2++)
80  mvacut_[i0][0][i2] = pt010[i2];
81  for (int i2 = 0; i2 < 4; i2++)
82  mvacut_[i0][1][i2] = pt1020[i2];
83  for (int i2 = 0; i2 < 4; i2++)
84  mvacut_[i0][2][i2] = pt2030[i2];
85  for (int i2 = 0; i2 < 4; i2++)
86  mvacut_[i0][3][i2] = pt3040[i2];
87  for (int i2 = 0; i2 < 4; i2++)
88  mvacut_[i0][4][i2] = pt4050[i2];
89  }
90  if (cutBased_ && i1 == 0) {
91  for (int i2 = 0; i2 < 4; i2++)
92  betaStarCut_[i0][0][i2] = pt010[i2];
93  for (int i2 = 0; i2 < 4; i2++)
94  betaStarCut_[i0][1][i2] = pt1020[i2];
95  for (int i2 = 0; i2 < 4; i2++)
96  betaStarCut_[i0][2][i2] = pt2030[i2];
97  for (int i2 = 0; i2 < 4; i2++)
98  betaStarCut_[i0][3][i2] = pt3040[i2];
99  for (int i2 = 0; i2 < 4; i2++)
100  betaStarCut_[i0][4][i2] = pt4050[i2];
101  }
102  if (cutBased_ && i1 == 1) {
103  for (int i2 = 0; i2 < 4; i2++)
104  rmsCut_[i0][0][i2] = pt010[i2];
105  for (int i2 = 0; i2 < 4; i2++)
106  rmsCut_[i0][1][i2] = pt1020[i2];
107  for (int i2 = 0; i2 < 4; i2++)
108  rmsCut_[i0][2][i2] = pt2030[i2];
109  for (int i2 = 0; i2 < 4; i2++)
110  rmsCut_[i0][3][i2] = pt3040[i2];
111  for (int i2 = 0; i2 < 4; i2++)
112  rmsCut_[i0][4][i2] = pt4050[i2];
113  }
114  }
115  }
116 
117  if (!cutBased_) {
118  assert(tmvaMethod_.empty() || ((!tmvaVariables_.empty() || (!tmvaEtaVariables_.empty())) && version == USER));
119  }
120 
121  if ((!cutBased_) && (runMvas_)) {
122  if (etaBinnedWeights_) {
123  for (int v = 0; v < nEtaBins_; v++) {
124  etaReader_.push_back(createGBRForest(tmvaEtaWeights.at(v)));
125  }
126  } else {
127  reader_ = createGBRForest(ps.getParameter<std::string>("tmvaWeights"));
128  }
129  }
130 }
131 
133 
134 // ------------------------------------------------------------------------------------------
136 
137 // ------------------------------------------------------------------------------------------
138 void assign(const std::vector<float>& vec, float& a, float& b, float& c, float& d) {
139  size_t sz = vec.size();
140  a = (sz > 0 ? vec[0] : 0.);
141  b = (sz > 1 ? vec[1] : 0.);
142  c = (sz > 2 ? vec[2] : 0.);
143  d = (sz > 3 ? vec[3] : 0.);
144 }
145 // ------------------------------------------------------------------------------------------
146 void setPtEtaPhi(const reco::Candidate& p, float& pt, float& eta, float& phi) {
147  pt = p.pt();
148  eta = p.eta();
149  phi = p.phi();
150 }
151 
152 // ------------------------------------------------------------------------------------------
154 
155 // ------------------------------------------------------------------------------------------
156 
157 float PileupJetIdAlgo::getMVAval(const std::vector<std::string>& varList,
158  const std::unique_ptr<const GBRForest>& reader) {
159  std::vector<float> vars;
160  for (std::vector<std::string>::const_iterator it = varList.begin(); it != varList.end(); ++it) {
161  std::pair<float*, float> var = variables_.at(*it);
162  vars.push_back(*var.first);
163  }
164  return reader->GetClassifier(vars.data());
165 }
166 
168  if (cache_->cutBased()) {
170  internalId_.betaStarClassic_, internalId_.dR2Mean_, internalId_.nvtx_, internalId_.jetPt_, internalId_.jetEta_);
171  } else {
172  if (std::abs(internalId_.jetEta_) >= 5.0) {
173  internalId_.mva_ = -2.;
174  } else {
175  if (cache_->etaBinnedWeights()) {
176  if (std::abs(internalId_.jetEta_) > cache_->jEtaMax().at(cache_->nEtaBins() - 1)) {
177  internalId_.mva_ = -2.;
178  } else {
179  for (int v = 0; v < cache_->nEtaBins(); v++) {
180  if (std::abs(internalId_.jetEta_) >= cache_->jEtaMin().at(v) &&
181  std::abs(internalId_.jetEta_) < cache_->jEtaMax().at(v)) {
183  break;
184  }
185  }
186  }
187  } else {
189  }
190  }
192  }
193 }
194 
195 // ------------------------------------------------------------------------------------------
196 std::pair<int, int> PileupJetIdAlgo::getJetIdKey(float jetPt, float jetEta) {
197  int ptId = 0;
198  if (jetPt >= 10 && jetPt < 20)
199  ptId = 1;
200  if (jetPt >= 20 && jetPt < 30)
201  ptId = 2;
202  if (jetPt >= 30 && jetPt < 40)
203  ptId = 3;
204  if (jetPt >= 40)
205  ptId = 4;
206 
207  int etaId = 0;
208  if (std::abs(jetEta) >= 2.5 && std::abs(jetEta) < 2.75)
209  etaId = 1;
210  if (std::abs(jetEta) >= 2.75 && std::abs(jetEta) < 3.0)
211  etaId = 2;
212  if (std::abs(jetEta) >= 3.0 && std::abs(jetEta) < 5.0)
213  etaId = 3;
214 
215  return std::pair<int, int>(ptId, etaId);
216 }
217 // ------------------------------------------------------------------------------------------
218 int PileupJetIdAlgo::computeCutIDflag(float betaStarClassic, float dR2Mean, float nvtx, float jetPt, float jetEta) {
219  std::pair<int, int> jetIdKey = getJetIdKey(jetPt, jetEta);
220  float betaStarModified = betaStarClassic / log(nvtx - 0.64);
221  int idFlag(0);
222  if (betaStarModified < cache_->betaStarCut()[PileupJetIdentifier::kTight][jetIdKey.first][jetIdKey.second] &&
223  dR2Mean < cache_->rmsCut()[PileupJetIdentifier::kTight][jetIdKey.first][jetIdKey.second])
224  idFlag += 1 << PileupJetIdentifier::kTight;
225 
226  if (betaStarModified < cache_->betaStarCut()[PileupJetIdentifier::kMedium][jetIdKey.first][jetIdKey.second] &&
227  dR2Mean < cache_->rmsCut()[PileupJetIdentifier::kMedium][jetIdKey.first][jetIdKey.second])
228  idFlag += 1 << PileupJetIdentifier::kMedium;
229 
230  if (betaStarModified < cache_->betaStarCut()[PileupJetIdentifier::kLoose][jetIdKey.first][jetIdKey.second] &&
231  dR2Mean < cache_->rmsCut()[PileupJetIdentifier::kLoose][jetIdKey.first][jetIdKey.second])
232  idFlag += 1 << PileupJetIdentifier::kLoose;
233  return idFlag;
234 }
235 // ------------------------------------------------------------------------------------------
236 int PileupJetIdAlgo::computeIDflag(float mva, float jetPt, float jetEta) {
237  std::pair<int, int> jetIdKey = getJetIdKey(jetPt, jetEta);
238  return computeIDflag(mva, jetIdKey.first, jetIdKey.second);
239 }
240 
241 // ------------------------------------------------------------------------------------------
242 int PileupJetIdAlgo::computeIDflag(float mva, int ptId, int etaId) {
243  int idFlag(0);
244  if (mva > cache_->mvacut()[PileupJetIdentifier::kTight][ptId][etaId])
245  idFlag += 1 << PileupJetIdentifier::kTight;
246  if (mva > cache_->mvacut()[PileupJetIdentifier::kMedium][ptId][etaId])
247  idFlag += 1 << PileupJetIdentifier::kMedium;
248  if (mva > cache_->mvacut()[PileupJetIdentifier::kLoose][ptId][etaId])
249  idFlag += 1 << PileupJetIdentifier::kLoose;
250  return idFlag;
251 }
252 
253 // ------------------------------------------------------------------------------------------
255  runMva();
257 }
258 
259 // ------------------------------------------------------------------------------------------
261  float jec,
262  const reco::Vertex* vtx,
263  const reco::VertexCollection& allvtx,
264  double rho,
265  bool usePuppi) {
266  // initialize all variables to 0
267  resetVariables();
268 
269  // loop over constituents, accumulate sums and find leading candidates
270  const pat::Jet* patjet = dynamic_cast<const pat::Jet*>(jet);
271  const reco::PFJet* pfjet = dynamic_cast<const reco::PFJet*>(jet);
272  assert(patjet != nullptr || pfjet != nullptr);
273  if (patjet != nullptr && jec == 0.) { // if this is a pat jet and no jec has been passed take the jec from the object
274  jec = patjet->pt() / patjet->correctedJet(0).pt();
275  }
276  if (jec <= 0.) {
277  jec = 1.;
278  }
279 
280  const reco::Candidate *lLead = nullptr, *lSecond = nullptr, *lLeadNeut = nullptr, *lLeadEm = nullptr,
281  *lLeadCh = nullptr, *lTrail = nullptr;
282  std::vector<float> frac, fracCh, fracEm, fracNeut;
283  float cones[] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7};
284  size_t ncones = sizeof(cones) / sizeof(float);
285  float* coneFracs[] = {&internalId_.frac01_,
286  &internalId_.frac02_,
287  &internalId_.frac03_,
288  &internalId_.frac04_,
289  &internalId_.frac05_,
290  &internalId_.frac06_,
291  &internalId_.frac07_};
292  float* coneEmFracs[] = {&internalId_.emFrac01_,
299  float* coneNeutFracs[] = {&internalId_.neutFrac01_,
306  float* coneChFracs[] = {&internalId_.chFrac01_,
313  TMatrixDSym covMatrix(2);
314  covMatrix = 0.;
315  float jetPt = jet->pt() / jec; // use uncorrected pt for shape variables
316  float sumPt = 0., sumPt2 = 0., sumTkPt = 0., sumPtCh = 0, sumPtNe = 0;
317  float multNeut = 0.0;
318  setPtEtaPhi(
319  *jet, internalId_.jetPt_, internalId_.jetEta_, internalId_.jetPhi_); // use corrected pt for jet kinematics
320  internalId_.jetM_ = jet->mass();
321  internalId_.nvtx_ = allvtx.size();
322  internalId_.rho_ = rho;
323 
324  float dRmin(1000);
325 
326  for (unsigned i = 0; i < jet->numberOfSourceCandidatePtrs(); ++i) {
327  reco::CandidatePtr pfJetConstituent = jet->sourceCandidatePtr(i);
328 
329  const reco::Candidate* icand = pfJetConstituent.get();
330  const pat::PackedCandidate* lPack = dynamic_cast<const pat::PackedCandidate*>(icand);
331  const reco::PFCandidate* lPF = dynamic_cast<const reco::PFCandidate*>(icand);
332  bool isPacked = true;
333  if (lPack == nullptr) {
334  isPacked = false;
335  }
336  float candPuppiWeight = 1.0;
337  if (usePuppi && isPacked)
338  candPuppiWeight = lPack->puppiWeight();
339  float candPt = (icand->pt()) * candPuppiWeight;
340  float candPtFrac = candPt / jetPt;
341  float candDr = reco::deltaR(*icand, *jet);
342  float candDeta = icand->eta() - jet->eta();
343  float candDphi = reco::deltaPhi(*icand, *jet);
344  float candPtDr = candPt * candDr;
345  size_t icone = std::lower_bound(&cones[0], &cones[ncones], candDr) - &cones[0];
346 
347  if (candDr < dRmin)
348  dRmin = candDr;
349 
350  // // all particles
351  if (lLead == nullptr || candPt > lLead->pt()) {
352  lSecond = lLead;
353  lLead = icand;
354  } else if ((lSecond == nullptr || candPt > lSecond->pt()) && (candPt < lLead->pt())) {
355  lSecond = icand;
356  }
357 
358  // // average shapes
359  internalId_.dRMean_ += candPtDr;
360  internalId_.dR2Mean_ += candPtDr * candPtDr;
361  covMatrix(0, 0) += candPt * candPt * candDeta * candDeta;
362  covMatrix(0, 1) += candPt * candPt * candDeta * candDphi;
363  covMatrix(1, 1) += candPt * candPt * candDphi * candDphi;
364  internalId_.ptD_ += candPt * candPt;
365  sumPt += candPt;
366  sumPt2 += candPt * candPt;
367 
368  // single most energetic candiates and jet shape profiles
369  frac.push_back(candPtFrac);
370 
371  if (icone < ncones) {
372  *coneFracs[icone] += candPt;
373  }
374 
375  // neutrals
376  if (abs(icand->pdgId()) == 130) {
377  if (lLeadNeut == nullptr || candPt > lLeadNeut->pt()) {
378  lLeadNeut = icand;
379  }
380  internalId_.dRMeanNeut_ += candPtDr;
381  fracNeut.push_back(candPtFrac);
382  if (icone < ncones) {
383  *coneNeutFracs[icone] += candPt;
384  }
385  internalId_.ptDNe_ += candPt * candPt;
386  sumPtNe += candPt;
387  multNeut += candPuppiWeight;
388  }
389  // EM candidated
390  if (icand->pdgId() == 22) {
391  if (lLeadEm == nullptr || candPt > lLeadEm->pt()) {
392  lLeadEm = icand;
393  }
394  internalId_.dRMeanEm_ += candPtDr;
395  fracEm.push_back(candPtFrac);
396  if (icone < ncones) {
397  *coneEmFracs[icone] += candPt;
398  }
399  internalId_.ptDNe_ += candPt * candPt;
400  sumPtNe += candPt;
401  multNeut += candPuppiWeight;
402  }
403  if ((abs(icand->pdgId()) == 1) || (abs(icand->pdgId()) == 2))
404  multNeut += candPuppiWeight;
405 
406  // Charged particles
407  if (icand->charge() != 0) {
408  if (lLeadCh == nullptr || candPt > lLeadCh->pt()) {
409  lLeadCh = icand;
410 
411  const reco::Track* pfTrk = icand->bestTrack();
412  if (lPF && std::abs(icand->pdgId()) == 13 && pfTrk == nullptr) {
413  reco::MuonRef lmuRef = lPF->muonRef();
414  if (lmuRef.isNonnull()) {
415  const reco::Muon& lmu = *lmuRef.get();
416  pfTrk = lmu.bestTrack();
417  edm::LogWarning("BadMuon")
418  << "Found a PFCandidate muon without a trackRef: falling back to Muon::bestTrack ";
419  }
420  }
421  if (pfTrk == nullptr) { //protection against empty pointers for the miniAOD case
422  //To handle the electron case
423  if (isPacked) {
424  internalId_.d0_ = std::abs(lPack->dxy(vtx->position()));
425  internalId_.dZ_ = std::abs(lPack->dz(vtx->position()));
426  } else if (lPF != nullptr) {
427  pfTrk = (lPF->trackRef().get() == nullptr) ? lPF->gsfTrackRef().get() : lPF->trackRef().get();
428  internalId_.d0_ = std::abs(pfTrk->dxy(vtx->position()));
429  internalId_.dZ_ = std::abs(pfTrk->dz(vtx->position()));
430  }
431  } else {
432  internalId_.d0_ = std::abs(pfTrk->dxy(vtx->position()));
433  internalId_.dZ_ = std::abs(pfTrk->dz(vtx->position()));
434  }
435  }
436  internalId_.dRMeanCh_ += candPtDr;
437  internalId_.ptDCh_ += candPt * candPt;
438  fracCh.push_back(candPtFrac);
439  if (icone < ncones) {
440  *coneChFracs[icone] += candPt;
441  }
442  sumPtCh += candPt;
443  }
444  // // beta and betastar
445  if (icand->charge() != 0) {
446  if (!isPacked) {
447  if (lPF->trackRef().isNonnull()) {
448  float tkpt = candPt;
449  sumTkPt += tkpt;
450  // 'classic' beta definition based on track-vertex association
451  bool inVtx0 = vtx->trackWeight(lPF->trackRef()) > 0;
452 
453  bool inAnyOther = false;
454  // alternative beta definition based on track-vertex distance of closest approach
455  double dZ0 = std::abs(lPF->trackRef()->dz(vtx->position()));
456  double dZ = dZ0;
457  for (reco::VertexCollection::const_iterator vi = allvtx.begin(); vi != allvtx.end(); ++vi) {
458  const reco::Vertex& iv = *vi;
459  if (iv.isFake() || iv.ndof() < 4) {
460  continue;
461  }
462  // the primary vertex may have been copied by the user: check identity by position
463  bool isVtx0 = (iv.position() - vtx->position()).r() < 0.02;
464  // 'classic' beta definition: check if the track is associated with
465  // any vertex other than the primary one
466  if (!isVtx0 && !inAnyOther) {
467  inAnyOther = vtx->trackWeight(lPF->trackRef()) <= 0;
468  }
469  // alternative beta: find closest vertex to the track
470  dZ = std::min(dZ, std::abs(lPF->trackRef()->dz(iv.position())));
471  }
472  // classic beta/betaStar
473  if (inVtx0 && !inAnyOther) {
474  internalId_.betaClassic_ += tkpt;
475  } else if (!inVtx0 && inAnyOther) {
476  internalId_.betaStarClassic_ += tkpt;
477  }
478  // alternative beta/betaStar
479  if (dZ0 < 0.2) {
480  internalId_.beta_ += tkpt;
481  } else if (dZ < 0.2) {
482  internalId_.betaStar_ += tkpt;
483  }
484  }
485  } else {
486  float tkpt = candPt;
487  sumTkPt += tkpt;
488  bool inVtx0 = false;
489  bool inVtxOther = false;
490  double dZ0 = 9999.;
491  double dZ_tmp = 9999.;
492  for (unsigned vtx_i = 0; vtx_i < allvtx.size(); vtx_i++) {
493  auto iv = allvtx[vtx_i];
494 
495  if (iv.isFake())
496  continue;
497 
498  // Match to vertex in case of copy as above
499  bool isVtx0 = (iv.position() - vtx->position()).r() < 0.02;
500 
501  if (isVtx0) {
502  if (lPack->fromPV(vtx_i) == pat::PackedCandidate::PVUsedInFit)
503  inVtx0 = true;
504  if (lPack->fromPV(vtx_i) == 0)
505  inVtxOther = true;
506  dZ0 = lPack->dz(iv.position());
507  }
508 
509  if (fabs(lPack->dz(iv.position())) < fabs(dZ_tmp)) {
510  dZ_tmp = lPack->dz(iv.position());
511  }
512  }
513  if (inVtx0) {
514  internalId_.betaClassic_ += tkpt;
515  } else if (inVtxOther) {
516  internalId_.betaStarClassic_ += tkpt;
517  }
518  if (fabs(dZ0) < 0.2) {
519  internalId_.beta_ += tkpt;
520  } else if (fabs(dZ_tmp) < 0.2) {
521  internalId_.betaStar_ += tkpt;
522  }
523  }
524  }
525 
526  // trailing candidate
527  if (lTrail == nullptr || candPt < lTrail->pt()) {
528  lTrail = icand;
529  }
530  }
531 
532  // // Finalize all variables
533  assert(!(lLead == nullptr));
534 
535  if (lSecond == nullptr) {
536  lSecond = lTrail;
537  }
538  if (lLeadNeut == nullptr) {
539  lLeadNeut = lTrail;
540  }
541  if (lLeadEm == nullptr) {
542  lLeadEm = lTrail;
543  }
544  if (lLeadCh == nullptr) {
545  lLeadCh = lTrail;
546  }
547 
548  if (patjet != nullptr) { // to enable running on MiniAOD slimmedJets
549  internalId_.nCharged_ = patjet->chargedMultiplicity();
550  internalId_.nNeutrals_ = patjet->neutralMultiplicity();
551  internalId_.chgEMfrac_ = patjet->chargedEmEnergy() / jet->energy();
552  internalId_.neuEMfrac_ = patjet->neutralEmEnergy() / jet->energy();
553  internalId_.chgHadrfrac_ = patjet->chargedHadronEnergy() / jet->energy();
554  internalId_.neuHadrfrac_ = patjet->neutralHadronEnergy() / jet->energy();
555  if (usePuppi)
556  internalId_.nNeutrals_ = multNeut;
557  } else {
558  internalId_.nCharged_ = pfjet->chargedMultiplicity();
559  internalId_.nNeutrals_ = pfjet->neutralMultiplicity();
560  internalId_.chgEMfrac_ = pfjet->chargedEmEnergy() / jet->energy();
561  internalId_.neuEMfrac_ = pfjet->neutralEmEnergy() / jet->energy();
564  }
565  internalId_.nParticles_ = jet->nConstituents();
566 
568  float sumW2(0.0);
569  float sum_deta(0.0), sum_dphi(0.0);
570  float ave_deta(0.0), ave_dphi(0.0);
571  for (size_t j = 0; j < jet->numberOfDaughters(); j++) {
572  const auto& part = jet->daughterPtr(j);
573  if (!(part.isAvailable() && part.isNonnull())) {
574  continue;
575  }
576 
577  float partPuppiWeight = 1.0;
578  if (usePuppi) {
579  const pat::PackedCandidate* partpack = dynamic_cast<const pat::PackedCandidate*>(part.get());
580  if (partpack != nullptr)
581  partPuppiWeight = partpack->puppiWeight();
582  }
583 
584  float weight = (part->pt()) * partPuppiWeight;
585  float weight2 = weight * weight;
586  sumW2 += weight2;
587  float deta = part->eta() - jet->eta();
588  float dphi = reco::deltaPhi(*part, *jet);
589  sum_deta += deta * weight2;
590  sum_dphi += dphi * weight2;
591  if (sumW2 > 0) {
592  ave_deta = sum_deta / sumW2;
593  ave_dphi = sum_dphi / sumW2;
594  }
595  }
596 
597  float ddetaR_sum(0.0), ddphiR_sum(0.0), pull_tmp(0.0);
598  for (size_t i = 0; i < jet->numberOfDaughters(); i++) {
599  const auto& part = jet->daughterPtr(i);
600  if (!(part.isAvailable() && part.isNonnull())) {
601  continue;
602  }
603 
604  float partPuppiWeight = 1.0;
605  if (usePuppi) {
606  const pat::PackedCandidate* partpack = dynamic_cast<const pat::PackedCandidate*>(part.get());
607  if (partpack != nullptr)
608  partPuppiWeight = partpack->puppiWeight();
609  }
610 
611  float weight = partPuppiWeight * (part->pt()) * partPuppiWeight * (part->pt());
612  float deta = part->eta() - jet->eta();
613  float dphi = reco::deltaPhi(*part, *jet);
614  float ddeta, ddphi, ddR;
615  ddeta = deta - ave_deta;
616  ddphi = dphi - ave_dphi;
617  ddR = sqrt(ddeta * ddeta + ddphi * ddphi);
618  ddetaR_sum += ddR * ddeta * weight;
619  ddphiR_sum += ddR * ddphi * weight;
620  }
621  if (sumW2 > 0) {
622  float ddetaR_ave = ddetaR_sum / sumW2;
623  float ddphiR_ave = ddphiR_sum / sumW2;
624  pull_tmp = sqrt(ddetaR_ave * ddetaR_ave + ddphiR_ave * ddphiR_ave);
625  }
626  internalId_.pull_ = pull_tmp;
628 
634 
635  std::sort(frac.begin(), frac.end(), std::greater<float>());
636  std::sort(fracCh.begin(), fracCh.end(), std::greater<float>());
637  std::sort(fracEm.begin(), fracEm.end(), std::greater<float>());
638  std::sort(fracNeut.begin(), fracNeut.end(), std::greater<float>());
640  assign(
642  assign(
644  assign(fracNeut,
649 
650  covMatrix(0, 0) /= sumPt2;
651  covMatrix(0, 1) /= sumPt2;
652  covMatrix(1, 1) /= sumPt2;
653  covMatrix(1, 0) = covMatrix(0, 1);
654  internalId_.etaW_ = sqrt(covMatrix(0, 0));
655  internalId_.phiW_ = sqrt(covMatrix(1, 1));
657  TVectorD eigVals(2);
658  eigVals = TMatrixDSymEigen(covMatrix).GetEigenValues();
659  internalId_.majW_ = sqrt(std::abs(eigVals(0)));
660  internalId_.minW_ = sqrt(std::abs(eigVals(1)));
661  if (internalId_.majW_ < internalId_.minW_) {
662  std::swap(internalId_.majW_, internalId_.minW_);
663  }
664 
665  internalId_.dRLeadCent_ = reco::deltaR(*jet, *lLead);
666  if (lSecond == nullptr) {
667  internalId_.dRLead2nd_ = reco::deltaR(*jet, *lSecond);
668  }
669  internalId_.dRMean_ /= jetPt;
673  internalId_.dR2Mean_ /= sumPt2;
674 
675  for (size_t ic = 0; ic < ncones; ++ic) {
676  *coneFracs[ic] /= jetPt;
677  *coneEmFracs[ic] /= jetPt;
678  *coneNeutFracs[ic] /= jetPt;
679  *coneChFracs[ic] /= jetPt;
680  }
681  //http://jets.physics.harvard.edu/qvg/
682  double ptMean = sumPt / internalId_.nParticles_;
683  double ptRMS = 0;
684  for (unsigned int i0 = 0; i0 < frac.size(); i0++) {
685  ptRMS += (frac[i0] - ptMean) * (frac[i0] - ptMean);
686  }
687  ptRMS /= internalId_.nParticles_;
688  ptRMS = sqrt(ptRMS);
689 
690  internalId_.ptMean_ = ptMean;
691  internalId_.ptRMS_ = ptRMS / jetPt;
692  internalId_.pt2A_ = sqrt(internalId_.ptD_ / internalId_.nParticles_) / jetPt;
693  internalId_.ptD_ = sqrt(internalId_.ptD_) / sumPt;
697  internalId_.sumChPt_ = sumPtCh;
698  internalId_.sumNePt_ = sumPtNe;
699 
700  internalId_.jetR_ = lLead->pt() / sumPt;
701  internalId_.jetRchg_ = lLeadCh->pt() / sumPt;
702  internalId_.dRMatch_ = dRmin;
703 
704  if (sumTkPt != 0.) {
705  internalId_.beta_ /= sumTkPt;
706  internalId_.betaStar_ /= sumTkPt;
707  internalId_.betaClassic_ /= sumTkPt;
708  internalId_.betaStarClassic_ /= sumTkPt;
709  } else {
710  assert(internalId_.beta_ == 0. && internalId_.betaStar_ == 0. && internalId_.betaClassic_ == 0. &&
711  internalId_.betaStarClassic_ == 0.);
712  }
713 
714  if (cache_->runMvas()) {
715  runMva();
716  }
717 
719 }
720 
721 // ------------------------------------------------------------------------------------------
723  std::stringstream out;
724  for (variables_list_t::const_iterator it = variables_.begin(); it != variables_.end(); ++it) {
725  out << std::setw(15) << it->first << std::setw(3) << "=" << std::setw(5) << *it->second.first << " ("
726  << std::setw(5) << it->second.second << ")" << std::endl;
727  }
728  return out.str();
729 }
730 
731 // ------------------------------------------------------------------------------------------
733  internalId_.idFlag_ = 0;
734  for (variables_list_t::iterator it = variables_.begin(); it != variables_.end(); ++it) {
735  *it->second.first = it->second.second;
736  }
737 }
738 
739 // ------------------------------------------------------------------------------------------
740 #define INIT_VARIABLE(NAME, TMVANAME, VAL) \
741  internalId_.NAME##_ = VAL; \
742  variables_[#NAME] = std::make_pair(&internalId_.NAME##_, VAL);
743 
744 // ------------------------------------------------------------------------------------------
746  internalId_.idFlag_ = 0;
747  INIT_VARIABLE(mva, "", -100.);
748  //INIT_VARIABLE(jetPt , "jspt_1", 0.);
749  //INIT_VARIABLE(jetEta , "jseta_1", large_val);
750  INIT_VARIABLE(jetPt, "", 0.);
752  INIT_VARIABLE(jetPhi, "jsphi_1", large_val);
753  INIT_VARIABLE(jetM, "jm_1", 0.);
754 
755  INIT_VARIABLE(nCharged, "", 0.);
756  INIT_VARIABLE(nNeutrals, "", 0.);
757 
758  INIT_VARIABLE(chgEMfrac, "", 0.);
759  INIT_VARIABLE(neuEMfrac, "", 0.);
760  INIT_VARIABLE(chgHadrfrac, "", 0.);
761  INIT_VARIABLE(neuHadrfrac, "", 0.);
762 
763  INIT_VARIABLE(d0, "jd0_1", -1000.);
764  INIT_VARIABLE(dZ, "jdZ_1", -1000.);
765  //INIT_VARIABLE(nParticles , "npart_1" , 0.);
766  INIT_VARIABLE(nParticles, "", 0.);
767 
768  INIT_VARIABLE(leadPt, "lpt_1", 0.);
769  INIT_VARIABLE(leadEta, "leta_1", large_val);
770  INIT_VARIABLE(leadPhi, "lphi_1", large_val);
771  INIT_VARIABLE(secondPt, "spt_1", 0.);
772  INIT_VARIABLE(secondEta, "seta_1", large_val);
773  INIT_VARIABLE(secondPhi, "sphi_1", large_val);
774  INIT_VARIABLE(leadNeutPt, "lnept_1", 0.);
775  INIT_VARIABLE(leadNeutEta, "lneeta_1", large_val);
776  INIT_VARIABLE(leadNeutPhi, "lnephi_1", large_val);
777  INIT_VARIABLE(leadEmPt, "lempt_1", 0.);
778  INIT_VARIABLE(leadEmEta, "lemeta_1", large_val);
779  INIT_VARIABLE(leadEmPhi, "lemphi_1", large_val);
780  INIT_VARIABLE(leadChPt, "lchpt_1", 0.);
781  INIT_VARIABLE(leadChEta, "lcheta_1", large_val);
782  INIT_VARIABLE(leadChPhi, "lchphi_1", large_val);
783  INIT_VARIABLE(leadFrac, "lLfr_1", 0.);
784 
785  INIT_VARIABLE(dRLeadCent, "drlc_1", 0.);
786  INIT_VARIABLE(dRLead2nd, "drls_1", 0.);
787  INIT_VARIABLE(dRMean, "drm_1", 0.);
788  INIT_VARIABLE(dRMean, "", 0.);
789  INIT_VARIABLE(pull, "", 0.);
790  INIT_VARIABLE(dRMeanNeut, "drmne_1", 0.);
791  INIT_VARIABLE(dRMeanEm, "drem_1", 0.);
792  INIT_VARIABLE(dRMeanCh, "drch_1", 0.);
793  INIT_VARIABLE(dR2Mean, "", 0.);
794 
795  INIT_VARIABLE(ptD, "", 0.);
796  INIT_VARIABLE(ptMean, "", 0.);
797  INIT_VARIABLE(ptRMS, "", 0.);
798  INIT_VARIABLE(pt2A, "", 0.);
799  INIT_VARIABLE(ptDCh, "", 0.);
800  INIT_VARIABLE(ptDNe, "", 0.);
801  INIT_VARIABLE(sumPt, "", 0.);
802  INIT_VARIABLE(sumChPt, "", 0.);
803  INIT_VARIABLE(sumNePt, "", 0.);
804 
805  INIT_VARIABLE(secondFrac, "", 0.);
806  INIT_VARIABLE(thirdFrac, "", 0.);
807  INIT_VARIABLE(fourthFrac, "", 0.);
808 
809  INIT_VARIABLE(leadChFrac, "", 0.);
810  INIT_VARIABLE(secondChFrac, "", 0.);
811  INIT_VARIABLE(thirdChFrac, "", 0.);
812  INIT_VARIABLE(fourthChFrac, "", 0.);
813 
814  INIT_VARIABLE(leadNeutFrac, "", 0.);
815  INIT_VARIABLE(secondNeutFrac, "", 0.);
816  INIT_VARIABLE(thirdNeutFrac, "", 0.);
817  INIT_VARIABLE(fourthNeutFrac, "", 0.);
818 
819  INIT_VARIABLE(leadEmFrac, "", 0.);
820  INIT_VARIABLE(secondEmFrac, "", 0.);
821  INIT_VARIABLE(thirdEmFrac, "", 0.);
822  INIT_VARIABLE(fourthEmFrac, "", 0.);
823 
824  INIT_VARIABLE(jetW, "", 1.);
825  INIT_VARIABLE(etaW, "", 1.);
826  INIT_VARIABLE(phiW, "", 1.);
827 
828  INIT_VARIABLE(majW, "", 1.);
829  INIT_VARIABLE(minW, "", 1.);
830 
831  INIT_VARIABLE(frac01, "", 0.);
832  INIT_VARIABLE(frac02, "", 0.);
833  INIT_VARIABLE(frac03, "", 0.);
834  INIT_VARIABLE(frac04, "", 0.);
835  INIT_VARIABLE(frac05, "", 0.);
836  INIT_VARIABLE(frac06, "", 0.);
837  INIT_VARIABLE(frac07, "", 0.);
838 
839  INIT_VARIABLE(chFrac01, "", 0.);
840  INIT_VARIABLE(chFrac02, "", 0.);
841  INIT_VARIABLE(chFrac03, "", 0.);
842  INIT_VARIABLE(chFrac04, "", 0.);
843  INIT_VARIABLE(chFrac05, "", 0.);
844  INIT_VARIABLE(chFrac06, "", 0.);
845  INIT_VARIABLE(chFrac07, "", 0.);
846 
847  INIT_VARIABLE(neutFrac01, "", 0.);
848  INIT_VARIABLE(neutFrac02, "", 0.);
849  INIT_VARIABLE(neutFrac03, "", 0.);
850  INIT_VARIABLE(neutFrac04, "", 0.);
851  INIT_VARIABLE(neutFrac05, "", 0.);
852  INIT_VARIABLE(neutFrac06, "", 0.);
853  INIT_VARIABLE(neutFrac07, "", 0.);
854 
855  INIT_VARIABLE(emFrac01, "", 0.);
856  INIT_VARIABLE(emFrac02, "", 0.);
857  INIT_VARIABLE(emFrac03, "", 0.);
858  INIT_VARIABLE(emFrac04, "", 0.);
859  INIT_VARIABLE(emFrac05, "", 0.);
860  INIT_VARIABLE(emFrac06, "", 0.);
861  INIT_VARIABLE(emFrac07, "", 0.);
862 
863  INIT_VARIABLE(beta, "", 0.);
864  INIT_VARIABLE(betaStar, "", 0.);
865  INIT_VARIABLE(betaClassic, "", 0.);
866  INIT_VARIABLE(betaStarClassic, "", 0.);
867 
868  INIT_VARIABLE(nvtx, "", 0.);
869  INIT_VARIABLE(rho, "", 0.);
870  INIT_VARIABLE(nTrueInt, "", 0.);
871 
872  INIT_VARIABLE(jetR, "", 0.);
873  INIT_VARIABLE(jetRchg, "", 0.);
874  INIT_VARIABLE(dRMatch, "", 0.);
875 }
876 
877 #undef INIT_VARIABLE
float puppiWeight() const
const float large_val
virtual float dz(size_t ipv=0) const
dz with respect to the PV[ipv]
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:22
T getParameter(std::string const &) const
void set(const PileupJetIdentifier &)
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:251
AlgoGBRForestsAndConstants const * cache_
double eta() const final
momentum pseudorapidity
#define INIT_VARIABLE(NAME, TMVANAME, VAL)
AlgoGBRForestsAndConstants(edm::ParameterSet const &, bool runMvas)
float chargedHadronEnergy() const
chargedHadronEnergy
Definition: Jet.h:658
float chargedEmEnergy() const
chargedEmEnergy
Definition: PFJet.h:142
std::vector< double > const & jEtaMin() const
float neutralEmEnergy() const
neutralEmEnergy
Definition: Jet.h:679
std::vector< std::unique_ptr< const GBRForest > > etaReader_
virtual const Track * bestTrack() const
Definition: Candidate.h:247
T const * get() const
Returns C++ pointer to the item.
Definition: Ptr.h:159
Base class for all types of Jets.
Definition: Jet.h:20
float neutralHadronEnergy() const
neutralHadronEnergy
Definition: Jet.h:665
std::pair< int, int > getJetIdKey(float jetPt, float jetEta)
size_type numberOfSourceCandidatePtrs() const override
double pt() const final
transverse momentum
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
Definition: weight.py:1
int neutralMultiplicity() const
neutralMultiplicity
Definition: Jet.h:425
int computeCutIDflag(float betaStarClassic, float dR2Mean, float nvtx, float jetPt, float jetEta)
std::vector< double > const & jEtaMax() const
int chargedMultiplicity() const
chargedMultiplicity
Definition: PFJet.h:155
const Track * bestTrack() const override
Definition: Muon.h:61
const Point & position() const
position
Definition: Vertex.h:109
Jets made from PFObjects.
Definition: PFJet.h:21
float neutralEmEnergy() const
neutralEmEnergy
Definition: PFJet.h:150
float chargedEmEnergy() const
chargedEmEnergy
Definition: Jet.h:672
size_t numberOfDaughters() const override
number of daughters
reco::TrackRef trackRef() const
Definition: PFCandidate.cc:442
std::vector< std::string > tmvaVariables_
PileupJetIdentifier computeIdVariables(const reco::Jet *jet, float jec, const reco::Vertex *, const reco::VertexCollection &, double rho, bool usePuppi)
PileupJetIdentifier internalId_
void swap(edm::DataFrameContainer &lhs, edm::DataFrameContainer &rhs)
virtual int pdgId() const =0
PDG identifier.
const PVAssoc fromPV(size_t ipv=0) const
T sqrt(T t)
Definition: SSEVec.h:18
std::string dumpVariables() const
double energy() const final
energy
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
void assign(const std::vector< float > &vec, float &a, float &b, float &c, float &d)
float trackWeight(const TREF &r) const
returns the weight with which a Track has contributed to the vertex-fit.
Definition: Vertex.h:81
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:243
T min(T a, T b)
Definition: MathUtil.h:58
std::unique_ptr< const GBRForest > const & reader() const
std::vector< std::vector< std::string > > tmvaEtaVariables_
int computeIDflag(float mva, float jetPt, float jetEta)
double ndof() const
Definition: Vertex.h:105
int neutralMultiplicity() const
neutralMultiplicity
Definition: PFJet.h:157
reco::MuonRef muonRef() const
Definition: PFCandidate.cc:459
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:28
double dz() const
dz parameter (= dsz/cos(lambda)). This is the track z0 w.r.t (0,0,0) only if the refPoint is close to...
Definition: TrackBase.h:648
void setPtEtaPhi(const reco::Candidate &p, float &pt, float &eta, float &phi)
virtual double eta() const =0
momentum pseudorapidity
bool isFake() const
Definition: Vertex.h:72
virtual double pt() const =0
transverse momentum
part
Definition: HCALResponse.h:20
virtual CandidatePtr daughterPtr(size_type i) const
reference to daughter at given position
PileupJetIdentifier computeMva()
double b
Definition: hdecay.h:120
Analysis-level calorimeter jet class.
Definition: Jet.h:80
std::vector< std::unique_ptr< const GBRForest > > const & etaReader() const
virtual int charge() const =0
electric charge
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:40
virtual int nConstituents() const
of constituents
Definition: Jet.h:65
double a
Definition: hdecay.h:121
def cache(function)
Definition: utilities.py:3
reco::GsfTrackRef gsfTrackRef() const
Definition: PFCandidate.cc:480
CandidatePtr sourceCandidatePtr(size_type i) const override
std::vector< std::vector< std::string > > const & tmvaEtaVariables() const
variables_list_t variables_
float neutralHadronEnergy() const
neutralHadronEnergy
Definition: PFJet.h:102
vars
Definition: DeepTauId.cc:77
virtual float dxy() const
dxy with respect to the PV ref
double dxy() const
dxy parameter. (This is the transverse impact parameter w.r.t. to (0,0,0) ONLY if refPoint is close t...
Definition: TrackBase.h:630
Jet correctedJet(const std::string &level, const std::string &flavor="none", const std::string &set="") const
std::vector< std::string > const & tmvaVariables() const
float getMVAval(const std::vector< std::string > &, const std::unique_ptr< const GBRForest > &)
virtual double phi() const =0
momentum azimuthal angle
int chargedMultiplicity() const
chargedMultiplicity
Definition: Jet.h:693
float chargedHadronEnergy() const
chargedHadronEnergy
Definition: PFJet.h:98
std::unique_ptr< const GBRForest > reader_
PileupJetIdAlgo(AlgoGBRForestsAndConstants const *cache)
std::unique_ptr< const GBRForest > createGBRForest(const std::string &weightsFile)
double mass() const final
mass