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  // Loop over the substructure collections
55  unsigned int index = 0;
56 
57  for ( auto const & ialgoHandle : algoHandles ) {
58  std::vector< edm::Ptr<pat::Jet> > nextSubjets;
59  float dRMin = distMax_;
60  for ( auto const & jjet : *ialgoHandle ) {
61  if ( reco::deltaR( ijet, jjet ) < dRMin ) {
62  for ( auto const & userfloatstr : jjet.userFloatNames() ) {
63  outputs->back().addUserFloat( userfloatstr, jjet.userFloat(userfloatstr) );
64  }
65  for ( auto const & userintstr : jjet.userIntNames() ) {
66  outputs->back().addUserInt( userintstr, jjet.userInt(userintstr) );
67  }
68  for ( auto const & usercandstr : jjet.userCandNames() ) {
69  outputs->back().addUserCand( usercandstr, jjet.userCand(usercandstr) );
70  }
71  for ( size_t ida = 0; ida < jjet.numberOfDaughters(); ++ida ) {
72  reco::CandidatePtr candPtr = jjet.daughterPtr( ida);
73  nextSubjets.push_back( edm::Ptr<pat::Jet> ( candPtr ) );
74  }
75  break;
76  }
77  }
78  outputs->back().addSubjets( nextSubjets, algoLabels_[index] );
79  ++index;
80  }
81 
82  // fix daughters
83  if (fixDaughters_) {
84 
85  std::vector<reco::CandidatePtr> daughtersInSubjets;
86  std::vector<reco::CandidatePtr> daughtersNew;
87  const std::vector<reco::CandidatePtr> & jdausPF = outputs->back().daughterPtrVector();
88  std::vector<reco::CandidatePtr> jdaus;
89  jdaus.reserve( jdausPF.size() );
90  // Convert the daughters to packed candidates. This is easier than ref-navigating through PUPPI or CHS to particleFlow.
91  for ( auto const & jdau : jdausPF ) {
92  jdaus.push_back( edm::refToPtr((*pf2pc)[jdau]) );
93  }
94 
95  for ( const edm::Ptr<pat::Jet> & subjet : outputs->back().subjets()) {
96  const std::vector<reco::CandidatePtr> & sjdaus = subjet->daughterPtrVector();
97  // check that the subjet does not contain any extra constituents not contained in the jet
98  bool skipSubjet = false;
99  for (const reco::CandidatePtr & dau : sjdaus) {
100  if (std::find(jdaus.begin(), jdaus.end(), dau) == jdaus.end()) {
101  skipSubjet = true;
102  break;
103  }
104  }
105  if (skipSubjet) continue;
106 
107  daughtersInSubjets.insert(daughtersInSubjets.end(), sjdaus.begin(), sjdaus.end());
108  daughtersNew.push_back( reco::CandidatePtr(subjet) );
109  }
110  for (const reco::CandidatePtr & dau : jdaus) {
111  if (std::find(daughtersInSubjets.begin(), daughtersInSubjets.end(), dau) == daughtersInSubjets.end()) {
112  daughtersNew.push_back( dau );
113  }
114  }
115  outputs->back().clearDaughters();
116  for (const auto & dau : daughtersNew) outputs->back().addDaughter(dau);
117  }
118  }
119 
120  iEvent.put(std::move(outputs));
121 
122 }
123 
124 //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:137
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:579
#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
void produce(edm::Event &, const edm::EventSetup &) override
constexpr 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:511