CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
JetSubstructurePacker.cc
Go to the documentation of this file.
4 
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 }
22 
24 
25 // ------------ method called to produce the data ------------
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 }
118 
119 //define this as a plug-in
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:133
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:539
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
JetSubstructurePacker(const edm::ParameterSet &)
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
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_
int iEvent
Definition: GenABIO.cc:224
def move
Definition: eostools.py:511
void produce(edm::Event &, const edm::EventSetup &) override
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_
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
std::vector< std::string > algoLabels_
constexpr char Jet[]
Definition: modules.cc:9