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"};
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",
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"))),
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) {
121 if (!puppi_value_map_tag.label().empty()) {
127 if (!pvas_tag.label().empty()) {
129 pvas_token_ = consumes<edm::Association<VertexCollection>>(pvas_tag);
133 produces<DeepBoostedJetTagInfoCollection>();
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);
157 descriptions.
add(
"pfDeepBoostedJetTagInfos", desc);
161 auto output_tag_infos = std::make_unique<DeepBoostedJetTagInfoCollection>();
166 if (
vtxs_->empty()) {
189 for (std::size_t jet_n = 0; jet_n < jets->size(); jet_n++) {
190 const auto &
jet = (*jets)[jet_n];
205 bool fill_vars =
true;
208 if (
jet.numberOfDaughters() == 0)
220 output_tag_infos->emplace_back(features, jet_ref);
228 const auto *patJet =
dynamic_cast<const pat::Jet *
>(&
jet);
240 const float etasign = jet.
eta() > 0 ? 1 : -1;
242 std::map<reco::CandidatePtr::key_type, float> puppi_wgt_cache;
248 wgt = pack_cand->puppiWeight();
249 }
else if (reco_cand) {
251 wgt = (*puppi_value_map_)[
cand];
259 puppi_wgt_cache[
cand.key()] = wgt;
263 std::vector<reco::CandidatePtr>
daughters;
281 daughters.push_back(
cand);
284 std::vector<btagbtvdeep::SortingClass<reco::CandidatePtr>> c_sorted;
287 for (
const auto &
cand : daughters) {
290 c_sorted.emplace_back(
cand,
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;
307 return puppi_wgt_cache.at(a.
key()) * a->pt() > puppi_wgt_cache.at(
b.key()) *
b->pt();
311 std::sort(daughters.begin(), daughters.end(), [](
const auto &
a,
const auto &
b) {
return a->pt() >
b->pt(); });
321 const auto *trk = reco_cand->bestTrack();
325 for (
const auto &
cand : daughters) {
330 ((packed_cand && !packed_cand->hasTrackDetails()) || (reco_cand && !useTrackProperties(reco_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();
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);
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);
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);
362 }
else if (reco_cand) {
364 int pv_ass_quality = 0;
367 pv_ass_quality = (*pvasq_value_map_)[
cand];
374 fts.
fill(
"pfcand_hcalFrac", reco_cand->hcalEnergy() / (reco_cand->ecalEnergy() + reco_cand->hcalEnergy()));
375 fts.
fill(
"pfcand_VTX_ass", vtx_ass);
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);
387 const auto *trk = reco_cand->bestTrack();
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);
397 fts.
fill(
"pfcand_puppiw", puppi_wgt_cache.at(
cand.key()));
399 fts.
fill(
"pfcand_etarel", etasign * (candP4.eta() - jet.
eta()));
404 fts.
fill(
"pfcand_ptrel", candP4.pt() / jet.
pt());
406 fts.
fill(
"pfcand_erel", candP4.energy() / jet.
energy());
409 fts.
fill(
"pfcand_mask", 1);
414 fts.
fill(
"pfcand_drminsv", drminpfcandsv);
417 if (patJet->nSubjetCollections() > 0) {
418 auto subjets = patJet->subjets();
420 return p1->
pt() >
p2->pt();
425 fts.
fill(
"pfcand_drsubjet1", -1);
426 fts.
fill(
"pfcand_drsubjet2", -1);
431 trk = packed_cand->bestTrack();
432 }
else if (reco_cand && useTrackProperties(reco_cand)) {
433 trk = reco_cand->bestTrack();
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));
460 fts.
fill(
"pfcand_normchi2", 999);
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);
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);
484 std::vector<const reco::VertexCompositePtrCandidate *> jetSVs;
485 for (
const auto &
sv : *
svs_) {
487 jetSVs.push_back(&
sv);
502 const float etasign = jet.
eta() > 0 ? 1 : -1;
504 for (
const auto *
sv : jetSVs) {
506 fts.
fill(
"sv_mask", 1);
508 fts.
fill(
"sv_etarel", etasign * (
sv->eta() - jet.
eta()));
511 fts.
fill(
"sv_mass",
sv->mass());
514 fts.
fill(
"sv_ptrel",
sv->pt() / jet.
pt());
518 fts.
fill(
"sv_pt",
sv->pt());
521 fts.
fill(
"sv_ntracks",
sv->numberOfDaughters());
522 fts.
fill(
"sv_normchi2",
sv->vertexNormalizedChi2());
525 fts.
fill(
"sv_dxy",
dxy.value());
526 fts.
fill(
"sv_dxysig",
dxy.significance());
529 fts.
fill(
"sv_d3d", d3d.value());
530 fts.
fill(
"sv_d3dsig", d3d.significance());
constexpr double deltaPhi(double phi1, double phi2)
reco::VertexCollection VertexCollection
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.
double eta() const final
momentum pseudorapidity
void endStream() override
float vertexDdotP(const reco::VertexCompositePtrCandidate &sv, const reco::Vertex &pv)
Measurement1D vertexD3d(const reco::VertexCompositePtrCandidate &svcand, const reco::Vertex &pv)
void buildTrackInfo(const reco::Candidate *candidate, const math::XYZVector &jetDir, GlobalVector refjetdirection, const reco::Vertex &pv)
double normalizedChi2() const
chi-squared divided by n.d.o.f. (or chi-squared * 1e6 if n.d.o.f. is zero)
static const std::vector< std::string > particle_features_
bool use_pvasq_value_map_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Base class for all types of Jets.
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
bool use_puppi_value_map_
std::vector< reco::DeepBoostedJetTagInfo > DeepBoostedJetTagInfoCollection
const Point & position() const
position
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
const bool include_neutrals_
Handle< PROD > getHandle(EDGetTokenT< PROD > token) const
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)
#define DEFINE_FWK_MODULE(type)
void reserve(const std::string &name, unsigned capacity)
double pz() const final
z coordinate of momentum vector
CovarianceMatrix covariance() const
return track covariance matrix
Measurement1D vertexDxy(const reco::VertexCompositePtrCandidate &svcand, const reco::Vertex &pv)
double energy() const final
energy
Abs< T >::type abs(const T &t)
const float getTrackPtRatio() const
float vtx_ass_from_pfcand(const reco::PFCandidate &pfcand, int pv_ass_quality, const reco::VertexRef &pv)
void check_consistency(const std::vector< std::string > &names) const
ParameterDescriptionBase * add(U const &iLabel, T const &value)
edm::Handle< edm::ValueMap< int > > pvasq_value_map_
const float getTrackSip3dVal() const
~DeepBoostedJetTagInfoProducer() override
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
const float getTrackJetDistVal() const
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
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)
void add(const std::string &name)
XYZVectorD XYZVector
spatial vector with cartesian internal representation
edm::EDGetTokenT< CandidateView > pfcand_token_
edm::Handle< SVCollection > svs_
edm::Handle< CandidateView > pfcands_
double py() const final
y coordinate of momentum vector
Analysis-level calorimeter jet class.
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_
const double max_sip3dsig_
edm::Handle< edm::Association< VertexCollection > > pvas_
Particle reconstructed by the particle flow algorithm.
edm::View< reco::Candidate > CandidateView
DeepBoostedJetTagInfoProducer(const edm::ParameterSet &)
const double min_pt_for_track_properties_
edm::EDGetTokenT< edm::View< reco::Jet > > jet_token_
edm::Handle< edm::ValueMap< float > > puppi_value_map_
const float getTrackSip2dVal() const
const double max_jet_eta_
edm::EDGetTokenT< edm::Association< VertexCollection > > pvas_token_
edm::Handle< VertexCollection > vtxs_
const double min_puppi_wgt_
edm::EDGetTokenT< edm::ValueMap< int > > pvasq_value_map_token_
const bool sort_by_sip2dsig_
const float getTrackSip3dSig() const
edm::EDGetTokenT< edm::ValueMap< float > > puppi_value_map_token_
void fillSVFeatures(DeepBoostedJetFeatures &fts, const reco::Jet &jet)