CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes
JetSubstructurePacker Class Reference

#include <JetSubstructurePacker.h>

Inheritance diagram for JetSubstructurePacker:
edm::stream::EDProducer<>

Public Member Functions

 JetSubstructurePacker (const edm::ParameterSet &)
 
 ~JetSubstructurePacker () override
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
bool hasAbilityToProduceInBeginLumis () const final
 
bool hasAbilityToProduceInBeginRuns () const final
 
bool hasAbilityToProduceInEndLumis () const final
 
bool hasAbilityToProduceInEndRuns () const final
 

Private Member Functions

void produce (edm::Event &, const edm::EventSetup &) override
 

Private Attributes

std::vector< std::string > algoLabels_
 
std::vector< edm::InputTagalgoTags_
 
std::vector< edm::EDGetTokenT< edm::View< pat::Jet > > > algoTokens_
 
float distMax_
 
bool fixDaughters_
 
edm::EDGetTokenT< edm::View< pat::Jet > > jetToken_
 
edm::EDGetTokenT< edm::Association< reco::PFCandidateCollection > > pc2pf_
 
edm::EDGetTokenT< edm::Association< pat::PackedCandidateCollection > > pf2pc_
 

Additional Inherited Members

- Public Types inherited from edm::stream::EDProducer<>
typedef CacheContexts< T... > CacheTypes
 
typedef CacheTypes::GlobalCache GlobalCache
 
typedef AbilityChecker< T... > HasAbility
 
typedef CacheTypes::LuminosityBlockCache LuminosityBlockCache
 
typedef LuminosityBlockContextT< LuminosityBlockCache, RunCache, GlobalCacheLuminosityBlockContext
 
typedef CacheTypes::LuminosityBlockSummaryCache LuminosityBlockSummaryCache
 
typedef CacheTypes::RunCache RunCache
 
typedef RunContextT< RunCache, GlobalCacheRunContext
 
typedef CacheTypes::RunSummaryCache RunSummaryCache
 

Detailed Description

Definition at line 34 of file JetSubstructurePacker.h.

Constructor & Destructor Documentation

JetSubstructurePacker::JetSubstructurePacker ( const edm::ParameterSet iConfig)
explicit

Definition at line 5 of file JetSubstructurePacker.cc.

References algoTags_, algoTokens_, fixDaughters_, edm::ParameterSet::getParameter(), pc2pf_, pf2pc_, GlobalPosition_Frontier_DevDB_cff::tag, and edm::vector_transform().

6  : distMax_(iConfig.getParameter<double>("distMax")),
7  jetToken_(consumes<edm::View<pat::Jet>>(iConfig.getParameter<edm::InputTag>("jetSrc"))),
8  algoLabels_(iConfig.getParameter<std::vector<std::string>>("algoLabels")),
9  algoTags_(iConfig.getParameter<std::vector<edm::InputTag>>("algoTags")),
10  fixDaughters_(iConfig.getParameter<bool>("fixDaughters")) {
11  algoTokens_ =
12  edm::vector_transform(algoTags_, [this](edm::InputTag const& tag) { return consumes<edm::View<pat::Jet>>(tag); });
13  if (fixDaughters_) {
14  pf2pc_ = consumes<edm::Association<pat::PackedCandidateCollection>>(
15  iConfig.getParameter<edm::InputTag>("packedPFCandidates"));
16  pc2pf_ = consumes<edm::Association<reco::PFCandidateCollection>>(
17  iConfig.getParameter<edm::InputTag>("packedPFCandidates"));
18  }
19  //register products
20  produces<std::vector<pat::Jet>>();
21 }
T getParameter(std::string const &) const
edm::EDGetTokenT< edm::View< pat::Jet > > jetToken_
std::vector< edm::EDGetTokenT< edm::View< pat::Jet > > > algoTokens_
edm::EDGetTokenT< edm::Association< reco::PFCandidateCollection > > pc2pf_
std::vector< edm::InputTag > algoTags_
auto vector_transform(std::vector< InputType > const &input, Function predicate) -> std::vector< typename std::remove_cv< typename std::remove_reference< decltype(predicate(input.front()))>::type >::type >
Definition: transform.h:11
edm::EDGetTokenT< edm::Association< pat::PackedCandidateCollection > > pf2pc_
std::vector< std::string > algoLabels_
JetSubstructurePacker::~JetSubstructurePacker ( )
override

Definition at line 23 of file JetSubstructurePacker.cc.

23 {}

Member Function Documentation

void JetSubstructurePacker::produce ( edm::Event iEvent,
const edm::EventSetup  
)
overrideprivate

Definition at line 26 of file JetSubstructurePacker.cc.

References algoLabels_, algoTags_, algoTokens_, DEFINE_FWK_MODULE, reco::deltaR(), distMax_, HLT_2018_cff::dRMin, spr::find(), fixDaughters_, edm::Event::getByToken(), mps_fire::i, jetToken_, eostools::move(), PatBasicFWLiteJetAnalyzer_Selector_cfg::outputs, pc2pf_, pf2pc_, edm::Event::put(), and edm::refToPtr().

26  {
27  auto outputs = std::make_unique<std::vector<pat::Jet>>();
28 
30  std::vector<edm::Handle<edm::View<pat::Jet>>> algoHandles;
31 
34  if (fixDaughters_) {
35  iEvent.getByToken(pf2pc_, pf2pc);
36  iEvent.getByToken(pc2pf_, pc2pf);
37  }
38 
39  iEvent.getByToken(jetToken_, jetHandle);
40  algoHandles.resize(algoTags_.size());
41  for (size_t i = 0; i < algoTags_.size(); ++i) {
42  iEvent.getByToken(algoTokens_[i], algoHandles[i]);
43  }
44 
45  // Loop over the input jets that will be modified.
46  for (auto const& ijet : *jetHandle) {
47  // Copy the jet.
48  outputs->push_back(ijet);
49  // Loop over the substructure collections
50  unsigned int index = 0;
51 
52  for (auto const& ialgoHandle : algoHandles) {
53  std::vector<edm::Ptr<pat::Jet>> nextSubjets;
54  float dRMin = distMax_;
55  for (auto const& jjet : *ialgoHandle) {
56  if (reco::deltaR(ijet, jjet) < dRMin) {
57  for (auto const& userfloatstr : jjet.userFloatNames()) {
58  outputs->back().addUserFloat(userfloatstr, jjet.userFloat(userfloatstr));
59  }
60  for (auto const& userintstr : jjet.userIntNames()) {
61  outputs->back().addUserInt(userintstr, jjet.userInt(userintstr));
62  }
63  for (auto const& usercandstr : jjet.userCandNames()) {
64  outputs->back().addUserCand(usercandstr, jjet.userCand(usercandstr));
65  }
66  for (size_t ida = 0; ida < jjet.numberOfDaughters(); ++ida) {
67  reco::CandidatePtr candPtr = jjet.daughterPtr(ida);
68  nextSubjets.push_back(edm::Ptr<pat::Jet>(candPtr));
69  }
70  break;
71  }
72  }
73  outputs->back().addSubjets(nextSubjets, algoLabels_[index]);
74  ++index;
75  }
76 
77  // fix daughters
78  if (fixDaughters_) {
79  std::vector<reco::CandidatePtr> daughtersInSubjets;
80  std::vector<reco::CandidatePtr> daughtersNew;
81  const std::vector<reco::CandidatePtr>& jdausPF = outputs->back().daughterPtrVector();
82  std::vector<reco::CandidatePtr> jdaus;
83  jdaus.reserve(jdausPF.size());
84  // Convert the daughters to packed candidates. This is easier than ref-navigating through PUPPI or CHS to particleFlow.
85  for (auto const& jdau : jdausPF) {
86  jdaus.push_back(edm::refToPtr((*pf2pc)[jdau]));
87  }
88 
89  for (const edm::Ptr<pat::Jet>& subjet : outputs->back().subjets()) {
90  const std::vector<reco::CandidatePtr>& sjdaus = subjet->daughterPtrVector();
91  // check that the subjet does not contain any extra constituents not contained in the jet
92  bool skipSubjet = false;
93  for (const reco::CandidatePtr& dau : sjdaus) {
94  if (std::find(jdaus.begin(), jdaus.end(), dau) == jdaus.end()) {
95  skipSubjet = true;
96  break;
97  }
98  }
99  if (skipSubjet)
100  continue;
101 
102  daughtersInSubjets.insert(daughtersInSubjets.end(), sjdaus.begin(), sjdaus.end());
103  daughtersNew.push_back(reco::CandidatePtr(subjet));
104  }
105  for (const reco::CandidatePtr& dau : jdaus) {
106  if (std::find(daughtersInSubjets.begin(), daughtersInSubjets.end(), dau) == daughtersInSubjets.end()) {
107  daughtersNew.push_back(dau);
108  }
109  }
110  outputs->back().clearDaughters();
111  for (const auto& dau : daughtersNew)
112  outputs->back().addDaughter(dau);
113  }
114  }
115 
116  iEvent.put(std::move(outputs));
117 }
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
Ptr< typename C::value_type > refToPtr(Ref< C, typename C::value_type, refhelper::FindUsingAdvance< C, typename C::value_type > > const &ref)
Definition: RefToPtr.h:18
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:19
edm::EDGetTokenT< edm::View< pat::Jet > > jetToken_
std::vector< edm::EDGetTokenT< edm::View< pat::Jet > > > algoTokens_
edm::EDGetTokenT< edm::Association< reco::PFCandidateCollection > > pc2pf_
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:30
std::vector< edm::InputTag > algoTags_
edm::EDGetTokenT< edm::Association< pat::PackedCandidateCollection > > pf2pc_
std::vector< std::string > algoLabels_
def move(src, dest)
Definition: eostools.py:511

Member Data Documentation

std::vector<std::string> JetSubstructurePacker::algoLabels_
private

Definition at line 47 of file JetSubstructurePacker.h.

Referenced by produce().

std::vector<edm::InputTag> JetSubstructurePacker::algoTags_
private

Definition at line 48 of file JetSubstructurePacker.h.

Referenced by JetSubstructurePacker(), and produce().

std::vector<edm::EDGetTokenT<edm::View<pat::Jet> > > JetSubstructurePacker::algoTokens_
private

Definition at line 49 of file JetSubstructurePacker.h.

Referenced by JetSubstructurePacker(), and produce().

float JetSubstructurePacker::distMax_
private

Definition at line 45 of file JetSubstructurePacker.h.

Referenced by produce().

bool JetSubstructurePacker::fixDaughters_
private

Definition at line 50 of file JetSubstructurePacker.h.

Referenced by JetSubstructurePacker(), and produce().

edm::EDGetTokenT<edm::View<pat::Jet> > JetSubstructurePacker::jetToken_
private

Definition at line 46 of file JetSubstructurePacker.h.

Referenced by produce().

edm::EDGetTokenT<edm::Association<reco::PFCandidateCollection> > JetSubstructurePacker::pc2pf_
private

Definition at line 52 of file JetSubstructurePacker.h.

Referenced by JetSubstructurePacker(), and produce().

edm::EDGetTokenT<edm::Association<pat::PackedCandidateCollection> > JetSubstructurePacker::pf2pc_
private

Definition at line 51 of file JetSubstructurePacker.h.

Referenced by JetSubstructurePacker(), and produce().