CMS 3D CMS Logo

HLTScoutingPFProducer.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: HLTrigger/JetMET
4 // Class: HLTScoutingPFProducer
5 //
11 //
12 // Original Author: Dustin James Anderson
13 // Created: Fri, 12 Jun 2015 15:49:20 GMT
14 //
15 //
16 
17 // system include files
18 #include <memory>
19 
20 // user include files
26 
35 
39 
41 
43  public:
46 
47  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
48 
49  private:
50  virtual void produce(edm::StreamID sid, edm::Event & iEvent, edm::EventSetup const & setup) const override final;
51 
58 
59  const double pfJetPtCut;
60  const double pfJetEtaCut;
61  const double pfCandidatePtCut;
62 
63  const bool doJetTags;
64  const bool doCandidates;
65  const bool doMet;
66 };
67 
68 //
69 // constructors and destructor
70 //
72  pfJetCollection_(consumes<reco::PFJetCollection>(iConfig.getParameter<edm::InputTag>("pfJetCollection"))),
73  pfJetTagCollection_(consumes<reco::JetTagCollection>(iConfig.getParameter<edm::InputTag>("pfJetTagCollection"))),
74  pfCandidateCollection_(consumes<reco::PFCandidateCollection>(iConfig.getParameter<edm::InputTag>("pfCandidateCollection"))),
75  vertexCollection_(consumes<reco::VertexCollection>(iConfig.getParameter<edm::InputTag>("vertexCollection"))),
76  metCollection_(consumes<reco::PFMETCollection>(iConfig.getParameter<edm::InputTag>("metCollection"))),
77  rho_(consumes<double>(iConfig.getParameter<edm::InputTag>("rho"))),
78  pfJetPtCut(iConfig.getParameter<double>("pfJetPtCut")),
79  pfJetEtaCut(iConfig.getParameter<double>("pfJetEtaCut")),
80  pfCandidatePtCut(iConfig.getParameter<double>("pfCandidatePtCut")),
81  doJetTags(iConfig.getParameter<bool>("doJetTags")),
82  doCandidates(iConfig.getParameter<bool>("doCandidates")),
83  doMet(iConfig.getParameter<bool>("doMet"))
84 {
85  //register products
86  produces<ScoutingPFJetCollection>();
87  produces<ScoutingParticleCollection>();
88  produces<double>("rho");
89  produces<double>("pfMetPt");
90  produces<double>("pfMetPhi");
91 }
92 
94 { }
95 
96 // ------------ method called to produce the data ------------
98 {
99  using namespace edm;
100 
101  //get vertices
103  std::unique_ptr<ScoutingVertexCollection> outVertices(new ScoutingVertexCollection());
104  if(iEvent.getByToken(vertexCollection_, vertexCollection)){
105  for(auto &vtx : *vertexCollection){
106  outVertices->emplace_back(
107  vtx.x(), vtx.y(), vtx.z(), vtx.zError(), vtx.xError(), vtx.yError(), vtx.tracksSize(), vtx.chi2(), vtx.ndof(), vtx.isValid()
108  );
109  }
110  }
111 
112  //get rho
114  std::unique_ptr<double> outRho(new double(-999));
115  if(iEvent.getByToken(rho_, rho)){
116  outRho.reset(new double(*rho));
117  }
118 
119  //get MET
121  std::unique_ptr<double> outMetPt(new double(-999));
122  std::unique_ptr<double> outMetPhi(new double(-999));
123  if(doMet && iEvent.getByToken(metCollection_, metCollection)){
124  outMetPt.reset(new double(metCollection->front().pt()));
125  outMetPhi.reset(new double(metCollection->front().phi()));
126  }
127 
128  //get PF candidates
129  Handle<reco::PFCandidateCollection> pfCandidateCollection;
130  std::unique_ptr<ScoutingParticleCollection> outPFCandidates(new ScoutingParticleCollection());
131  if(doCandidates && iEvent.getByToken(pfCandidateCollection_, pfCandidateCollection)){
132  for(auto &cand : *pfCandidateCollection){
133  if(cand.pt() > pfCandidatePtCut){
134  int vertex_index = -1;
135  int index_counter = 0;
136  double dr2 = 0.0001;
137  for (auto &vtx: *outVertices) {
138  double tmp_dr2 = pow(vtx.x() - cand.vx(), 2) + pow(vtx.y() - cand.vy(), 2)
139  + pow(vtx.z() - cand.vz(), 2);
140  if (tmp_dr2 < dr2) {
141  dr2 = tmp_dr2;
142  vertex_index = index_counter;
143  }
144  if (dr2 == 0.0)
145  break;
146  ++index_counter;
147  }
148  outPFCandidates->emplace_back(
149  cand.pt(), cand.eta(), cand.phi(), cand.mass(), cand.pdgId(), vertex_index
150  );
151  }
152  }
153  }
154 
155  //get PF jets
156  Handle<reco::PFJetCollection> pfJetCollection;
157  std::unique_ptr<ScoutingPFJetCollection> outPFJets(new ScoutingPFJetCollection());
158  if(iEvent.getByToken(pfJetCollection_, pfJetCollection)){
159  //get PF jet tags
160  Handle<reco::JetTagCollection> pfJetTagCollection;
161  bool haveJetTags = false;
162  if(doJetTags && iEvent.getByToken(pfJetTagCollection_, pfJetTagCollection)){
163  haveJetTags = true;
164  }
165 
166  for(auto &jet : *pfJetCollection){
167  if(jet.pt() < pfJetPtCut || fabs(jet.eta()) > pfJetEtaCut) continue;
168  //find the jet tag corresponding to the jet
169  float tagValue = -20;
170  float minDR2 = 0.01;
171  if(haveJetTags){
172  for(auto &tag : *pfJetTagCollection){
173  float dR2 = reco::deltaR2(jet, *(tag.first));
174  if(dR2 < minDR2){
175  minDR2 = dR2;
176  tagValue = tag.second;
177  }
178  }
179  }
180  //get the PF constituents of the jet
181  std::vector<int> candIndices;
182  if(doCandidates){
183  for(auto &cand : jet.getPFConstituents()){
184  if(cand->pt() > pfCandidatePtCut){
185  //search for the candidate in the collection
186  float minDR2 = 0.0001;
187  int matchIndex = -1;
188  int outIndex = 0;
189  for(auto &outCand : *outPFCandidates){
190  float dR2 = pow(cand->eta() - outCand.eta(), 2) + pow(cand->phi() - outCand.phi(), 2);
191  if(dR2 < minDR2){
192  minDR2 = dR2;
193  matchIndex = outIndex;
194  }
195  if(minDR2 == 0){
196  break;
197  }
198  outIndex++;
199  }
200  candIndices.push_back(matchIndex);
201  }
202  }
203  }
204  outPFJets->emplace_back(
205  jet.pt(), jet.eta(), jet.phi(), jet.mass(), jet.jetArea(),
206  jet.chargedHadronEnergy(), jet.neutralHadronEnergy(), jet.photonEnergy(),
207  jet.electronEnergy(), jet.muonEnergy(), jet.HFHadronEnergy(), jet.HFEMEnergy(),
208  jet.chargedHadronMultiplicity(), jet.neutralHadronMultiplicity(), jet.photonMultiplicity(),
209  jet.electronMultiplicity(), jet.muonMultiplicity(),
210  jet.HFHadronMultiplicity(), jet.HFEMMultiplicity(),
211  jet.hoEnergy(), tagValue, 0.0, candIndices
212  );
213  }
214  }
215 
216  //put output
217  iEvent.put(std::move(outPFCandidates));
218  iEvent.put(std::move(outPFJets));
219  iEvent.put(std::move(outRho), "rho");
220  iEvent.put(std::move(outMetPt), "pfMetPt");
221  iEvent.put(std::move(outMetPhi), "pfMetPhi");
222 }
223 
224 // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
227  desc.add<edm::InputTag>("pfJetCollection",edm::InputTag("hltAK4PFJets"));
228  desc.add<edm::InputTag>("pfJetTagCollection",edm::InputTag("hltCombinedSecondaryVertexBJetTagsPF"));
229  desc.add<edm::InputTag>("pfCandidateCollection", edm::InputTag("hltParticleFlow"));
230  desc.add<edm::InputTag>("vertexCollection", edm::InputTag("hltPixelVertices"));
231  desc.add<edm::InputTag>("metCollection", edm::InputTag("hltPFMETProducer"));
232  desc.add<edm::InputTag>("rho", edm::InputTag("hltFixedGridRhoFastjetAll"));
233  desc.add<double>("pfJetPtCut", 20.0);
234  desc.add<double>("pfJetEtaCut", 3.0);
235  desc.add<double>("pfCandidatePtCut", 0.6);
236  desc.add<bool>("doJetTags", true);
237  desc.add<bool>("doCandidates", true);
238  desc.add<bool>("doMet", true);
239  descriptions.add("hltScoutingPFProducer", desc);
240 }
241 
242 //define this as a plug-in
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:122
const edm::EDGetTokenT< reco::PFMETCollection > metCollection_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:457
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
def setup(process, global_tag, zero_tesla=False)
Definition: GeneralSetup.py:1
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
JetFloatAssociation::Container JetTagCollection
Definition: JetTag.h:18
const edm::EDGetTokenT< reco::PFCandidateCollection > pfCandidateCollection_
EDGetTokenT< ProductType > consumes(edm::InputTag const &tag)
const edm::EDGetTokenT< reco::VertexCollection > vertexCollection_
int iEvent
Definition: GenABIO.cc:230
std::vector< ScoutingVertex > ScoutingVertexCollection
std::vector< ScoutingParticle > ScoutingParticleCollection
const edm::EDGetTokenT< reco::PFJetCollection > pfJetCollection_
HLTScoutingPFProducer(const edm::ParameterSet &)
ParameterDescriptionBase * add(U const &iLabel, T const &value)
const edm::EDGetTokenT< reco::JetTagCollection > pfJetTagCollection_
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
std::vector< reco::PFCandidate > PFCandidateCollection
collection of PFCandidates
virtual void produce(edm::StreamID sid, edm::Event &iEvent, edm::EventSetup const &setup) const override final
const edm::EDGetTokenT< double > rho_
void add(std::string const &label, ParameterSetDescription const &psetDescription)
T1 deltaR2(T1 eta1, T2 phi1, T3 eta2, T4 phi2)
Definition: deltaR.h:36
std::vector< PFJet > PFJetCollection
collection of PFJet objects
fixed size matrix
HLT enums.
std::vector< ScoutingPFJet > ScoutingPFJetCollection
Definition: ScoutingPFJet.h:87
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:40
def move(src, dest)
Definition: eostools.py:510
Collection of PF MET.