CMS 3D CMS Logo

DeepBoostedJetTagInfoProducer.cc
Go to the documentation of this file.
3 
6 
9 
11 
14 
19 
22 
24 
25 using namespace btagbtvdeep;
26 
28 public:
31 
32  static void fillDescriptions(edm::ConfigurationDescriptions &descriptions);
33 
34 private:
35  typedef std::vector<reco::DeepBoostedJetTagInfo> DeepBoostedJetTagInfoCollection;
39 
40  void beginStream(edm::StreamID) override {}
41  void produce(edm::Event &, const edm::EventSetup &) override;
42  void endStream() override {}
43 
44  void fillParticleFeatures(DeepBoostedJetFeatures &fts, const reco::Jet &jet);
45  void fillSVFeatures(DeepBoostedJetFeatures &fts, const reco::Jet &jet);
46 
47  const double jet_radius_;
48  const double min_jet_pt_;
49  const double max_jet_eta_;
51  const bool use_puppiP4_;
52  const bool include_neutrals_;
53  const bool sort_by_sip2dsig_;
54  const double min_puppi_wgt_;
55  const bool flip_ip_sign_;
56  const double max_sip3dsig_;
57 
62 
65 
69 
77 
78  const static std::vector<std::string> particle_features_;
79  const static std::vector<std::string> sv_features_;
80  const reco::Vertex *pv_ = nullptr;
81 };
82 
83 const std::vector<std::string> DeepBoostedJetTagInfoProducer::particle_features_{
84  "pfcand_puppiw", "pfcand_hcalFrac", "pfcand_VTX_ass", "pfcand_lostInnerHits",
85  "pfcand_quality", "pfcand_charge", "pfcand_isEl", "pfcand_isMu",
86  "pfcand_isChargedHad", "pfcand_isGamma", "pfcand_isNeutralHad", "pfcand_phirel",
87  "pfcand_etarel", "pfcand_deltaR", "pfcand_abseta", "pfcand_ptrel_log",
88  "pfcand_erel_log", "pfcand_pt_log", "pfcand_drminsv", "pfcand_drsubjet1",
89  "pfcand_drsubjet2", "pfcand_normchi2", "pfcand_dz", "pfcand_dzsig",
90  "pfcand_dxy", "pfcand_dxysig", "pfcand_dptdpt", "pfcand_detadeta",
91  "pfcand_dphidphi", "pfcand_dxydxy", "pfcand_dzdz", "pfcand_dxydz",
92  "pfcand_dphidxy", "pfcand_dlambdadz", "pfcand_btagEtaRel", "pfcand_btagPtRatio",
93  "pfcand_btagPParRatio", "pfcand_btagSip2dVal", "pfcand_btagSip2dSig", "pfcand_btagSip3dVal",
94  "pfcand_btagSip3dSig", "pfcand_btagJetDistVal", "pfcand_mask", "pfcand_pt_log_nopuppi",
95  "pfcand_e_log_nopuppi", "pfcand_ptrel", "pfcand_erel"};
96 
97 const std::vector<std::string> DeepBoostedJetTagInfoProducer::sv_features_{
98  "sv_mask", "sv_ptrel", "sv_erel", "sv_phirel", "sv_etarel", "sv_deltaR", "sv_abseta",
99  "sv_mass", "sv_ptrel_log", "sv_erel_log", "sv_pt_log", "sv_pt", "sv_ntracks", "sv_normchi2",
100  "sv_dxy", "sv_dxysig", "sv_d3d", "sv_d3dsig", "sv_costhetasvpv",
101 };
102 
104  : jet_radius_(iConfig.getParameter<double>("jet_radius")),
105  min_jet_pt_(iConfig.getParameter<double>("min_jet_pt")),
106  max_jet_eta_(iConfig.getParameter<double>("max_jet_eta")),
107  min_pt_for_track_properties_(iConfig.getParameter<double>("min_pt_for_track_properties")),
108  use_puppiP4_(iConfig.getParameter<bool>("use_puppiP4")),
109  include_neutrals_(iConfig.getParameter<bool>("include_neutrals")),
110  sort_by_sip2dsig_(iConfig.getParameter<bool>("sort_by_sip2dsig")),
111  min_puppi_wgt_(iConfig.getParameter<double>("min_puppi_wgt")),
112  flip_ip_sign_(iConfig.getParameter<bool>("flip_ip_sign")),
113  max_sip3dsig_(iConfig.getParameter<double>("sip3dSigMax")),
114  jet_token_(consumes<edm::View<reco::Jet>>(iConfig.getParameter<edm::InputTag>("jets"))),
115  vtx_token_(consumes<VertexCollection>(iConfig.getParameter<edm::InputTag>("vertices"))),
116  sv_token_(consumes<SVCollection>(iConfig.getParameter<edm::InputTag>("secondary_vertices"))),
117  pfcand_token_(consumes<CandidateView>(iConfig.getParameter<edm::InputTag>("pf_candidates"))),
118  use_puppi_value_map_(false),
119  use_pvasq_value_map_(false) {
120  const auto &puppi_value_map_tag = iConfig.getParameter<edm::InputTag>("puppi_value_map");
121  if (!puppi_value_map_tag.label().empty()) {
122  puppi_value_map_token_ = consumes<edm::ValueMap<float>>(puppi_value_map_tag);
123  use_puppi_value_map_ = true;
124  }
125 
126  const auto &pvas_tag = iConfig.getParameter<edm::InputTag>("vertex_associator");
127  if (!pvas_tag.label().empty()) {
128  pvasq_value_map_token_ = consumes<edm::ValueMap<int>>(pvas_tag);
129  pvas_token_ = consumes<edm::Association<VertexCollection>>(pvas_tag);
130  use_pvasq_value_map_ = true;
131  }
132 
133  produces<DeepBoostedJetTagInfoCollection>();
134 }
135 
137 
139  // pfDeepBoostedJetTagInfos
141  desc.add<double>("jet_radius", 0.8);
142  desc.add<double>("min_jet_pt", 150);
143  desc.add<double>("max_jet_eta", 99);
144  desc.add<double>("min_pt_for_track_properties", -1);
145  desc.add<bool>("use_puppiP4", true);
146  desc.add<bool>("include_neutrals", true);
147  desc.add<bool>("sort_by_sip2dsig", false);
148  desc.add<double>("min_puppi_wgt", 0.01);
149  desc.add<bool>("flip_ip_sign", false);
150  desc.add<double>("sip3dSigMax", -1);
151  desc.add<edm::InputTag>("vertices", edm::InputTag("offlinePrimaryVertices"));
152  desc.add<edm::InputTag>("secondary_vertices", edm::InputTag("inclusiveCandidateSecondaryVertices"));
153  desc.add<edm::InputTag>("pf_candidates", edm::InputTag("particleFlow"));
154  desc.add<edm::InputTag>("jets", edm::InputTag("ak8PFJetsPuppi"));
155  desc.add<edm::InputTag>("puppi_value_map", edm::InputTag("puppi"));
156  desc.add<edm::InputTag>("vertex_associator", edm::InputTag("primaryVertexAssociation", "original"));
157  descriptions.add("pfDeepBoostedJetTagInfos", desc);
158 }
159 
161  auto output_tag_infos = std::make_unique<DeepBoostedJetTagInfoCollection>();
162 
163  auto jets = iEvent.getHandle(jet_token_);
164 
165  iEvent.getByToken(vtx_token_, vtxs_);
166  if (vtxs_->empty()) {
167  // produce empty TagInfos in case no primary vertex
168  iEvent.put(std::move(output_tag_infos));
169  return; // exit event
170  }
171  // primary vertex
172  pv_ = &vtxs_->at(0);
173 
174  iEvent.getByToken(sv_token_, svs_);
175 
177 
178  iSetup.get<TransientTrackRecord>().get("TransientTrackBuilder", track_builder_);
179 
180  if (use_puppi_value_map_) {
182  }
183 
184  if (use_pvasq_value_map_) {
186  iEvent.getByToken(pvas_token_, pvas_);
187  }
188 
189  for (std::size_t jet_n = 0; jet_n < jets->size(); jet_n++) {
190  const auto &jet = (*jets)[jet_n];
191  edm::RefToBase<reco::Jet> jet_ref(jets, jet_n);
192 
193  // create jet features
195  // declare all the feature variables (init as empty vector)
196  for (const auto &name : particle_features_) {
197  features.add(name);
198  }
199  for (const auto &name : sv_features_) {
200  features.add(name);
201  }
202 
203  // fill values only if above pt threshold and has daughters, otherwise left
204  // empty
205  bool fill_vars = true;
206  if (jet.pt() < min_jet_pt_ || std::abs(jet.eta()) > max_jet_eta_)
207  fill_vars = false;
208  if (jet.numberOfDaughters() == 0)
209  fill_vars = false;
210 
211  if (fill_vars) {
212  fillParticleFeatures(features, jet);
213  fillSVFeatures(features, jet);
214 
215  features.check_consistency(particle_features_);
216  features.check_consistency(sv_features_);
217  }
218 
219  // this should always be done even if features are not filled
220  output_tag_infos->emplace_back(features, jet_ref);
221  }
222 
223  iEvent.put(std::move(output_tag_infos));
224 }
225 
227  // require the input to be a pat::Jet
228  const auto *patJet = dynamic_cast<const pat::Jet *>(&jet);
229  if (!patJet) {
230  throw edm::Exception(edm::errors::InvalidReference) << "Input is not a pat::Jet.";
231  }
232 
233  // do nothing if jet does not have constituents
234  if (jet.numberOfDaughters() == 0)
235  return;
236 
237  // some jet properties
238  math::XYZVector jet_dir = jet.momentum().Unit();
239  GlobalVector jet_ref_track_dir(jet.px(), jet.py(), jet.pz());
240  const float etasign = jet.eta() > 0 ? 1 : -1;
241 
242  std::map<reco::CandidatePtr::key_type, float> puppi_wgt_cache;
243  auto puppiWgt = [&](const reco::CandidatePtr &cand) {
244  const auto *pack_cand = dynamic_cast<const pat::PackedCandidate *>(&(*cand));
245  const auto *reco_cand = dynamic_cast<const reco::PFCandidate *>(&(*cand));
246  float wgt = 1.;
247  if (pack_cand) {
248  wgt = pack_cand->puppiWeight();
249  } else if (reco_cand) {
250  if (use_puppi_value_map_) {
251  wgt = (*puppi_value_map_)[cand];
252  } else {
253  throw edm::Exception(edm::errors::InvalidReference) << "Puppi value map is missing";
254  }
255  } else {
256  throw edm::Exception(edm::errors::InvalidReference) << "Cannot convert to either pat::PackedCandidate or "
257  "reco::PFCandidate";
258  }
259  puppi_wgt_cache[cand.key()] = wgt;
260  return wgt;
261  };
262 
263  std::vector<reco::CandidatePtr> daughters;
264  for (const auto &dau : jet.daughterPtrVector()) {
265  // remove particles w/ extremely low puppi weights
266  // [Note] use jet daughters here to get the puppiWgt correctly
267  if ((puppiWgt(dau)) < min_puppi_wgt_)
268  continue;
269  // from here: get the original reco/packed candidate not scaled by the puppi weight
270  auto cand = pfcands_->ptrAt(dau.key());
271  // charged candidate selection (for Higgs Interaction Net)
272  if (!include_neutrals_ && (cand->charge() == 0 || cand->pt() < min_pt_for_track_properties_))
273  continue;
274  // only when computing the nagative tagger: remove charged candidates with high sip3d
275  if (flip_ip_sign_ && cand->charge()) {
277  trkinfo.buildTrackInfo(&(*cand), jet_dir, jet_ref_track_dir, *pv_);
278  if (trkinfo.getTrackSip3dSig() > max_sip3dsig_)
279  continue;
280  }
281  daughters.push_back(cand);
282  }
283 
284  std::vector<btagbtvdeep::SortingClass<reco::CandidatePtr>> c_sorted;
285  if (sort_by_sip2dsig_) {
286  // sort charged pf candidates by 2d impact parameter significance
287  for (const auto &cand : daughters) {
289  trkinfo.buildTrackInfo(&(*cand), jet_dir, jet_ref_track_dir, *pv_);
290  c_sorted.emplace_back(cand,
291  trkinfo.getTrackSip2dSig(),
293  cand->pt() / jet.pt());
295  }
296  for (unsigned int i = 0; i < c_sorted.size(); i++) {
297  const auto &c = c_sorted.at(i);
298  const auto &cand = c.get();
299  daughters.at(i) = cand;
300  }
301  } else {
302  if (use_puppiP4_) {
303  // sort by Puppi-weighted pt
304  std::sort(daughters.begin(),
305  daughters.end(),
306  [&puppi_wgt_cache](const reco::CandidatePtr &a, const reco::CandidatePtr &b) {
307  return puppi_wgt_cache.at(a.key()) * a->pt() > puppi_wgt_cache.at(b.key()) * b->pt();
308  });
309  } else {
310  // sort by original pt (not Puppi-weighted)
311  std::sort(daughters.begin(), daughters.end(), [](const auto &a, const auto &b) { return a->pt() > b->pt(); });
312  }
313  }
314 
315  // reserve space
316  for (const auto &name : particle_features_) {
317  fts.reserve(name, daughters.size());
318  }
319 
320  auto useTrackProperties = [&](const reco::PFCandidate *reco_cand) {
321  const auto *trk = reco_cand->bestTrack();
322  return trk != nullptr && trk->pt() > min_pt_for_track_properties_;
323  };
324 
325  for (const auto &cand : daughters) {
326  const auto *packed_cand = dynamic_cast<const pat::PackedCandidate *>(&(*cand));
327  const auto *reco_cand = dynamic_cast<const reco::PFCandidate *>(&(*cand));
328 
329  if (!include_neutrals_ &&
330  ((packed_cand && !packed_cand->hasTrackDetails()) || (reco_cand && !useTrackProperties(reco_cand))))
331  continue;
332 
333  const float ip_sign = flip_ip_sign_ ? -1 : 1;
334 
335  auto candP4 = use_puppiP4_ ? puppi_wgt_cache.at(cand.key()) * cand->p4() : cand->p4();
336  if (packed_cand) {
337  float hcal_fraction = 0.;
338  if (packed_cand->pdgId() == 1 || packed_cand->pdgId() == 130) {
339  hcal_fraction = packed_cand->hcalFraction();
340  } else if (packed_cand->isIsolatedChargedHadron()) {
341  hcal_fraction = packed_cand->rawHcalFraction();
342  }
343 
344  fts.fill("pfcand_hcalFrac", hcal_fraction);
345  fts.fill("pfcand_VTX_ass", packed_cand->pvAssociationQuality());
346  fts.fill("pfcand_lostInnerHits", packed_cand->lostInnerHits());
347  fts.fill("pfcand_quality", packed_cand->bestTrack() ? packed_cand->bestTrack()->qualityMask() : 0);
348 
349  fts.fill("pfcand_charge", packed_cand->charge());
350  fts.fill("pfcand_isEl", std::abs(packed_cand->pdgId()) == 11);
351  fts.fill("pfcand_isMu", std::abs(packed_cand->pdgId()) == 13);
352  fts.fill("pfcand_isChargedHad", std::abs(packed_cand->pdgId()) == 211);
353  fts.fill("pfcand_isGamma", std::abs(packed_cand->pdgId()) == 22);
354  fts.fill("pfcand_isNeutralHad", std::abs(packed_cand->pdgId()) == 130);
355 
356  // impact parameters
357  fts.fill("pfcand_dz", ip_sign * packed_cand->dz());
358  fts.fill("pfcand_dxy", ip_sign * packed_cand->dxy());
359  fts.fill("pfcand_dzsig", packed_cand->bestTrack() ? ip_sign * packed_cand->dz() / packed_cand->dzError() : 0);
360  fts.fill("pfcand_dxysig", packed_cand->bestTrack() ? ip_sign * packed_cand->dxy() / packed_cand->dxyError() : 0);
361 
362  } else if (reco_cand) {
363  // get vertex association quality
364  int pv_ass_quality = 0; // fallback value
365  float vtx_ass = 0;
366  if (use_pvasq_value_map_) {
367  pv_ass_quality = (*pvasq_value_map_)[cand];
368  const reco::VertexRef &PV_orig = (*pvas_)[cand];
369  vtx_ass = vtx_ass_from_pfcand(*reco_cand, pv_ass_quality, PV_orig);
370  } else {
371  throw edm::Exception(edm::errors::InvalidReference) << "Vertex association missing";
372  }
373 
374  fts.fill("pfcand_hcalFrac", reco_cand->hcalEnergy() / (reco_cand->ecalEnergy() + reco_cand->hcalEnergy()));
375  fts.fill("pfcand_VTX_ass", vtx_ass);
376  fts.fill("pfcand_lostInnerHits", useTrackProperties(reco_cand) ? lost_inner_hits_from_pfcand(*reco_cand) : 0);
377  fts.fill("pfcand_quality", useTrackProperties(reco_cand) ? quality_from_pfcand(*reco_cand) : 0);
378 
379  fts.fill("pfcand_charge", reco_cand->charge());
380  fts.fill("pfcand_isEl", std::abs(reco_cand->pdgId()) == 11);
381  fts.fill("pfcand_isMu", std::abs(reco_cand->pdgId()) == 13);
382  fts.fill("pfcand_isChargedHad", std::abs(reco_cand->pdgId()) == 211);
383  fts.fill("pfcand_isGamma", std::abs(reco_cand->pdgId()) == 22);
384  fts.fill("pfcand_isNeutralHad", std::abs(reco_cand->pdgId()) == 130);
385 
386  // impact parameters
387  const auto *trk = reco_cand->bestTrack();
388  float dz = trk ? ip_sign * trk->dz(pv_->position()) : 0;
389  float dxy = trk ? ip_sign * trk->dxy(pv_->position()) : 0;
390  fts.fill("pfcand_dz", dz);
391  fts.fill("pfcand_dzsig", trk ? dz / trk->dzError() : 0);
392  fts.fill("pfcand_dxy", dxy);
393  fts.fill("pfcand_dxysig", trk ? dxy / trk->dxyError() : 0);
394  }
395 
396  // basic kinematics
397  fts.fill("pfcand_puppiw", puppi_wgt_cache.at(cand.key()));
398  fts.fill("pfcand_phirel", reco::deltaPhi(candP4, jet));
399  fts.fill("pfcand_etarel", etasign * (candP4.eta() - jet.eta()));
400  fts.fill("pfcand_deltaR", reco::deltaR(candP4, jet));
401  fts.fill("pfcand_abseta", std::abs(candP4.eta()));
402 
403  fts.fill("pfcand_ptrel_log", std::log(candP4.pt() / jet.pt()));
404  fts.fill("pfcand_ptrel", candP4.pt() / jet.pt());
405  fts.fill("pfcand_erel_log", std::log(candP4.energy() / jet.energy()));
406  fts.fill("pfcand_erel", candP4.energy() / jet.energy());
407  fts.fill("pfcand_pt_log", std::log(candP4.pt()));
408 
409  fts.fill("pfcand_mask", 1);
410  fts.fill("pfcand_pt_log_nopuppi", std::log(cand->pt()));
411  fts.fill("pfcand_e_log_nopuppi", std::log(cand->energy()));
412 
414  fts.fill("pfcand_drminsv", drminpfcandsv);
415 
416  // subjets
417  if (patJet->nSubjetCollections() > 0) {
418  auto subjets = patJet->subjets();
419  std::sort(subjets.begin(), subjets.end(), [](const edm::Ptr<pat::Jet> &p1, const edm::Ptr<pat::Jet> &p2) {
420  return p1->pt() > p2->pt();
421  }); // sort by pt
422  fts.fill("pfcand_drsubjet1", !subjets.empty() ? reco::deltaR(*cand, *subjets.at(0)) : -1);
423  fts.fill("pfcand_drsubjet2", subjets.size() > 1 ? reco::deltaR(*cand, *subjets.at(1)) : -1);
424  } else {
425  fts.fill("pfcand_drsubjet1", -1);
426  fts.fill("pfcand_drsubjet2", -1);
427  }
428 
429  const reco::Track *trk = nullptr;
430  if (packed_cand) {
431  trk = packed_cand->bestTrack();
432  } else if (reco_cand && useTrackProperties(reco_cand)) {
433  trk = reco_cand->bestTrack();
434  }
435  if (trk) {
436  fts.fill("pfcand_normchi2", std::floor(trk->normalizedChi2()));
437 
438  // track covariance
439  auto cov = [&](unsigned i, unsigned j) { return trk->covariance(i, j); };
440  fts.fill("pfcand_dptdpt", cov(0, 0));
441  fts.fill("pfcand_detadeta", cov(1, 1));
442  fts.fill("pfcand_dphidphi", cov(2, 2));
443  fts.fill("pfcand_dxydxy", cov(3, 3));
444  fts.fill("pfcand_dzdz", cov(4, 4));
445  fts.fill("pfcand_dxydz", cov(3, 4));
446  fts.fill("pfcand_dphidxy", cov(2, 3));
447  fts.fill("pfcand_dlambdadz", cov(1, 4));
448 
450  trkinfo.buildTrackInfo(&(*cand), jet_dir, jet_ref_track_dir, *pv_);
451  fts.fill("pfcand_btagEtaRel", trkinfo.getTrackEtaRel());
452  fts.fill("pfcand_btagPtRatio", trkinfo.getTrackPtRatio());
453  fts.fill("pfcand_btagPParRatio", trkinfo.getTrackPParRatio());
454  fts.fill("pfcand_btagSip2dVal", ip_sign * trkinfo.getTrackSip2dVal());
455  fts.fill("pfcand_btagSip2dSig", ip_sign * trkinfo.getTrackSip2dSig());
456  fts.fill("pfcand_btagSip3dVal", ip_sign * trkinfo.getTrackSip3dVal());
457  fts.fill("pfcand_btagSip3dSig", ip_sign * trkinfo.getTrackSip3dSig());
458  fts.fill("pfcand_btagJetDistVal", trkinfo.getTrackJetDistVal());
459  } else {
460  fts.fill("pfcand_normchi2", 999);
461 
462  fts.fill("pfcand_dptdpt", 0);
463  fts.fill("pfcand_detadeta", 0);
464  fts.fill("pfcand_dphidphi", 0);
465  fts.fill("pfcand_dxydxy", 0);
466  fts.fill("pfcand_dzdz", 0);
467  fts.fill("pfcand_dxydz", 0);
468  fts.fill("pfcand_dphidxy", 0);
469  fts.fill("pfcand_dlambdadz", 0);
470 
471  fts.fill("pfcand_btagEtaRel", 0);
472  fts.fill("pfcand_btagPtRatio", 0);
473  fts.fill("pfcand_btagPParRatio", 0);
474  fts.fill("pfcand_btagSip2dVal", 0);
475  fts.fill("pfcand_btagSip2dSig", 0);
476  fts.fill("pfcand_btagSip3dVal", 0);
477  fts.fill("pfcand_btagSip3dSig", 0);
478  fts.fill("pfcand_btagJetDistVal", 0);
479  }
480  }
481 }
482 
484  std::vector<const reco::VertexCompositePtrCandidate *> jetSVs;
485  for (const auto &sv : *svs_) {
486  if (reco::deltaR2(sv, jet) < jet_radius_ * jet_radius_) {
487  jetSVs.push_back(&sv);
488  }
489  }
490  // sort by dxy significance
491  std::sort(jetSVs.begin(),
492  jetSVs.end(),
494  return sv_vertex_comparator(*sva, *svb, *pv_);
495  });
496 
497  // reserve space
498  for (const auto &name : sv_features_) {
499  fts.reserve(name, jetSVs.size());
500  }
501 
502  const float etasign = jet.eta() > 0 ? 1 : -1;
503 
504  for (const auto *sv : jetSVs) {
505  // basic kinematics
506  fts.fill("sv_mask", 1);
507  fts.fill("sv_phirel", reco::deltaPhi(*sv, jet));
508  fts.fill("sv_etarel", etasign * (sv->eta() - jet.eta()));
509  fts.fill("sv_deltaR", reco::deltaR(*sv, jet));
510  fts.fill("sv_abseta", std::abs(sv->eta()));
511  fts.fill("sv_mass", sv->mass());
512 
513  fts.fill("sv_ptrel_log", std::log(sv->pt() / jet.pt()));
514  fts.fill("sv_ptrel", sv->pt() / jet.pt());
515  fts.fill("sv_erel_log", std::log(sv->energy() / jet.energy()));
516  fts.fill("sv_erel", sv->energy() / jet.energy());
517  fts.fill("sv_pt_log", std::log(sv->pt()));
518  fts.fill("sv_pt", sv->pt());
519 
520  // sv properties
521  fts.fill("sv_ntracks", sv->numberOfDaughters());
522  fts.fill("sv_normchi2", sv->vertexNormalizedChi2());
523 
524  const auto &dxy = vertexDxy(*sv, *pv_);
525  fts.fill("sv_dxy", dxy.value());
526  fts.fill("sv_dxysig", dxy.significance());
527 
528  const auto &d3d = vertexD3d(*sv, *pv_);
529  fts.fill("sv_d3d", d3d.value());
530  fts.fill("sv_d3dsig", d3d.significance());
531 
532  fts.fill("sv_costhetasvpv", (flip_ip_sign_ ? -1.f : 1.f) * vertexDdotP(*sv, *pv_));
533  }
534 }
535 
536 // define this as a plug-in
constexpr double deltaPhi(double phi1, double phi2)
Definition: deltaPhi.h:22
T getParameter(std::string const &) const
float quality_from_pfcand(const reco::PFCandidate &pfcand)
void produce(edm::Event &, const edm::EventSetup &) override
static const std::vector< std::string > sv_features_
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
double eta() const final
momentum pseudorapidity
float vertexDdotP(const reco::VertexCompositePtrCandidate &sv, const reco::Vertex &pv)
Definition: deep_helpers.cc:66
Measurement1D vertexD3d(const reco::VertexCompositePtrCandidate &svcand, const reco::Vertex &pv)
Definition: deep_helpers.cc:58
void buildTrackInfo(const reco::Candidate *candidate, const math::XYZVector &jetDir, GlobalVector refjetdirection, const reco::Vertex &pv)
key_type key() const
Definition: Ptr.h:185
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
Definition: TrackBase.h:600
static const std::vector< std::string > particle_features_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
Base class for all types of Jets.
Definition: Jet.h:20
double px() const final
x coordinate of momentum vector
void fillParticleFeatures(DeepBoostedJetFeatures &fts, const reco::Jet &jet)
double pt() const final
transverse momentum
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
std::vector< reco::DeepBoostedJetTagInfo > DeepBoostedJetTagInfoCollection
const Point & position() const
position
Definition: Vertex.h:109
const float getTrackEtaRel() const
std::vector< VertexCompositePtrCandidate > VertexCompositePtrCandidateCollection
collection of Candidate objects
virtual const daughters & daughterPtrVector() const
references to daughtes
const float getTrackPParRatio() const
edm::EDGetTokenT< VertexCollection > vtx_token_
size_t numberOfDaughters() const override
number of daughters
void beginStream(edm::StreamID) override
const float getTrackSip2dSig() const
Handle< PROD > getHandle(EDGetTokenT< PROD > token) const
Definition: Event.h:539
Vector momentum() const final
spatial momentum vector
edm::ESHandle< TransientTrackBuilder > track_builder_
float mindrsvpfcand(const std::vector< reco::VertexCompositePtrCandidate > &svs, const reco::Candidate *cand, float mindr=0.4)
Definition: deep_helpers.cc:73
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
void reserve(const std::string &name, unsigned capacity)
Definition: Jet.py:1
double pz() const final
z coordinate of momentum vector
CovarianceMatrix covariance() const
return track covariance matrix
Definition: TrackBase.h:782
Measurement1D vertexDxy(const reco::VertexCompositePtrCandidate &svcand, const reco::Vertex &pv)
Definition: deep_helpers.cc:50
vector< PseudoJet > jets
double energy() const final
energy
const double infinity
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
const float getTrackPtRatio() const
double f[11][100]
float vtx_ass_from_pfcand(const reco::PFCandidate &pfcand, int pv_ass_quality, const reco::VertexRef &pv)
Definition: deep_helpers.cc:90
void check_consistency(const std::vector< std::string > &names) const
ParameterDescriptionBase * add(U const &iLabel, T const &value)
double p2[4]
Definition: TauolaWrapper.h:90
edm::Handle< edm::ValueMap< int > > pvasq_value_map_
const float getTrackSip3dVal() const
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:28
const float getTrackJetDistVal() const
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:16
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
bool sv_vertex_comparator(const SVType &sva, const SVType &svb, const PVType &pv)
Definition: deep_helpers.h:43
void add(const std::string &name)
XYZVectorD XYZVector
spatial vector with cartesian internal representation
Definition: Vector3D.h:30
edm::EDGetTokenT< CandidateView > pfcand_token_
double b
Definition: hdecay.h:120
double py() const final
y coordinate of momentum vector
Analysis-level calorimeter jet class.
Definition: Jet.h:80
void add(std::string const &label, ParameterSetDescription const &psetDescription)
void fill(const std::string &name, float value)
reco::VertexCompositePtrCandidateCollection SVCollection
float lost_inner_hits_from_pfcand(const reco::PFCandidate &pfcand)
edm::EDGetTokenT< SVCollection > sv_token_
edm::Handle< edm::Association< VertexCollection > > pvas_
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:40
fixed size matrix
HLT enums.
edm::View< reco::Candidate > CandidateView
double p1[4]
Definition: TauolaWrapper.h:89
double a
Definition: hdecay.h:121
DeepBoostedJetTagInfoProducer(const edm::ParameterSet &)
T get() const
Definition: EventSetup.h:71
edm::EDGetTokenT< edm::View< reco::Jet > > jet_token_
edm::Handle< edm::ValueMap< float > > puppi_value_map_
const float getTrackSip2dVal() const
edm::EDGetTokenT< edm::Association< VertexCollection > > pvas_token_
edm::Handle< VertexCollection > vtxs_
edm::EDGetTokenT< edm::ValueMap< int > > pvasq_value_map_token_
const float getTrackSip3dSig() const
def move(src, dest)
Definition: eostools.py:511
edm::EDGetTokenT< edm::ValueMap< float > > puppi_value_map_token_
void fillSVFeatures(DeepBoostedJetFeatures &fts, const reco::Jet &jet)