CMS 3D CMS Logo

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 {
12  algoTokens_ =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> >(iConfig.getParameter<edm::InputTag>("packedPFCandidates"));
15  pc2pf_ = consumes<edm::Association<reco::PFCandidateCollection > >(iConfig.getParameter<edm::InputTag>("packedPFCandidates"));
16  }
17  //register products
18  produces<std::vector<pat::Jet> > ();
19 }
20 
21 
23 {
24 }
25 
26 
27 // ------------ method called to produce the data ------------
28 void
30 {
31 
32  auto outputs = std::make_unique<std::vector<pat::Jet>>();
33 
35  std::vector< edm::Handle< edm::View<pat::Jet> > > algoHandles;
36 
39  if (fixDaughters_) {
40  iEvent.getByToken(pf2pc_,pf2pc);
41  iEvent.getByToken(pc2pf_,pc2pf);
42  }
43 
44  iEvent.getByToken( jetToken_, jetHandle );
45  algoHandles.resize( algoTags_.size() );
46  for ( size_t i = 0; i < algoTags_.size(); ++i ) {
47  iEvent.getByToken( algoTokens_[i], algoHandles[i] );
48  }
49 
50  // Loop over the input jets that will be modified.
51  for ( auto const & ijet : *jetHandle ) {
52  // Copy the jet.
53  outputs->push_back( ijet );
54 
55  // Loop over the substructure collections
56  unsigned int index = 0;
57  for ( auto const & ialgoHandle : algoHandles ) {
58  std::vector< edm::Ptr<pat::Jet> > nextSubjets;
59  float dRMin = distMax_;
60 
61  for ( auto const & jjet : *ialgoHandle ) {
62 
63  if ( reco::deltaR( ijet, jjet ) < dRMin ) {
64  for ( size_t ida = 0; ida < jjet.numberOfDaughters(); ++ida ) {
65 
66  reco::CandidatePtr candPtr = jjet.daughterPtr( ida);
67  nextSubjets.push_back( edm::Ptr<pat::Jet> ( candPtr ) );
68  }
69  break;
70  }
71 
72  }
73 
74  outputs->back().addSubjets( nextSubjets, algoLabels_[index] );
75  ++index;
76  }
77 
78  // fix daughters
79  if (fixDaughters_) {
80  std::vector<reco::CandidatePtr> daughtersInSubjets;
81  std::vector<reco::CandidatePtr> daughtersNew;
82  const std::vector<reco::CandidatePtr> & jdaus = outputs->back().daughterPtrVector();
83  //std::cout << "Jet with pt " << outputs->back().pt() << ", " << outputs->back().numberOfDaughters() << " daughters, " << outputs->back().subjets().size() << ", subjets" << std::endl;
84  for ( const edm::Ptr<pat::Jet> & subjet : outputs->back().subjets()) {
85  const std::vector<reco::CandidatePtr> & sjdaus = subjet->daughterPtrVector();
86 
87  // check that the subjet does not contain any extra constituents not contained in the jet
88  bool skipSubjet = false;
89  for (const reco::CandidatePtr & dau : sjdaus) {
90  reco::CandidatePtr rekeyed = edm::refToPtr((*pc2pf)[dau]);
91  if (std::find(jdaus.begin(), jdaus.end(), rekeyed) == jdaus.end()) {
92  skipSubjet = true;
93  break;
94  }
95  }
96  if (skipSubjet) continue;
97 
98  daughtersInSubjets.insert(daughtersInSubjets.end(), sjdaus.begin(), sjdaus.end());
99  daughtersNew.push_back( reco::CandidatePtr(subjet) );
100  //std::cout << " found " << subjet->numberOfDaughters() << " daughters in a subjet" << std::endl;
101  }
102  //if (!daughtersInSubjets.empty()) std::cout << " subjet daughters are from collection " << daughtersInSubjets.front().id() << std::endl;
103  //std::cout << " in total, " << daughtersInSubjets.size() << " daughters from subjets" << std::endl;
104  for (const reco::CandidatePtr & dau : jdaus) {
105  //if (!pf2pc->contains(dau.id())) {
106  // std::cout << " daughter from collection " << dau.id() << " not in the value map!" << std::endl;
107  // std::cout << " map expects collection " << pf2pc->ids().front().first << std::endl;
108  // continue;
109  //}
110  reco::CandidatePtr rekeyed = edm::refToPtr((*pf2pc)[dau]);
111  if (std::find(daughtersInSubjets.begin(), daughtersInSubjets.end(), rekeyed) == daughtersInSubjets.end()) {
112  daughtersNew.push_back( rekeyed );
113  }
114  }
115  //std::cout << " in total, " << daughtersNew.size() << " daughters including subjets" << std::endl;
116  //if (daughtersNew.size() + daughtersInSubjets.size() - outputs->back().subjets().size() == outputs->back().numberOfDaughters()) {
117  // std::cout << " it all adds up to the original number of daughters" << std::endl;
118  //}
119  outputs->back().clearDaughters();
120  for (const auto & dau : daughtersNew) outputs->back().addDaughter(dau);
121  }
122  }
123 
124  iEvent.put(std::move(outputs));
125 
126 }
127 
128 //define this as a plug-in
T getParameter(std::string const &) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:122
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:460
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
std::vector< edm::EDGetTokenT< edm::View< pat::Jet > > > algoTokens_
JetSubstructurePacker(const edm::ParameterSet &)
edm::EDGetTokenT< edm::Association< reco::PFCandidateCollection > > pc2pf_
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:20
edm::EDGetTokenT< edm::View< pat::Jet > > jetToken_
Definition: HeavyIon.h:7
int iEvent
Definition: GenABIO.cc:230
Definition: Jet.py:1
virtual void produce(edm::Event &, const edm::EventSetup &) override
auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:28
std::vector< edm::InputTag > algoTags_
edm::EDGetTokenT< edm::Association< pat::PackedCandidateCollection > > pf2pc_
std::vector< std::string > algoLabels_
HLT enums.
def move(src, dest)
Definition: eostools.py:510