CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TriggerSummaryProducerAOD.cc
Go to the documentation of this file.
1 
17 
20 
31 
37 
40 
43 
44 #include <algorithm>
45 #include <memory>
46 #include <typeinfo>
47 
48 
49 //
50 // constructors and destructor
51 //
53  pn_(ps.getParameter<std::string>("processName")),
54  filterTagsEvent_(pn_!="*"),
55  filterTagsGlobal_(pn_!="*"),
56  collectionTagsEvent_(pn_!="*"),
57  collectionTagsGlobal_(pn_!="*"),
58  toc_(),
59  tags_(),
60  offset_(),
61  keys_(),
62  ids_(),
63  maskFilters_()
64 {
65  if (pn_=="@") {
67  if (tns.isAvailable()) {
68  pn_ = tns->getProcessName();
69  } else {
70  edm::LogError("TriggerSummaryProducerAOD") << "HLT Error: TriggerNamesService not available!";
71  pn_="*";
72  }
73 
78  }
79  LogDebug("TriggerSummaryProducerAOD") << "Using process name: '" << pn_ <<"'";
80 
81  filterTagsGlobal_.clear();
82  collectionTagsGlobal_.clear();
83 
84  produces<trigger::TriggerEvent>();
85 
102 
110  getMETCollection_(bd);
120  });
121 }
122 
124 {
125 }
126 
127 //
128 // member functions
129 //
130 
131 namespace {
132  inline void
134 
135  using std::string;
136 
137  const char token(':');
138  const string empty;
139 
140  label=tag;
141  const string::size_type i1(label.find(token));
142  if (i1==string::npos) {
143  instance=empty;
144  process=empty;
145  } else {
146  instance=label.substr(i1+1);
147  label.resize(i1);
148  const string::size_type i2(instance.find(token));
149  if (i2==string::npos) {
150  process=empty;
151  } else {
152  process=instance.substr(i2+1);
153  instance.resize(i2);
154  }
155  }
156  }
157 }
158 
159 // ------------ method called to produce the data ------------
160 void
162 {
163  using namespace std;
164  using namespace edm;
165  using namespace reco;
166  using namespace l1extra;
167  using namespace trigger;
168 
169  std::vector<edm::Handle<trigger::TriggerFilterObjectWithRefs> > fobs;
171 
172  const unsigned int nfob(fobs.size());
173  LogTrace("TriggerSummaryProducerAOD") << "Number of filter objects found: " << nfob;
174 
175  string tagLabel,tagInstance,tagProcess;
176 
182  maskFilters_.clear();
183  maskFilters_.resize(nfob);
184  filterTagsEvent_.clear();
185  collectionTagsEvent_.clear();
186  unsigned int nf(0);
187  for (unsigned int ifob=0; ifob!=nfob; ++ifob) {
188  maskFilters_[ifob]=false;
189  const vector<string>& collectionTags_(fobs[ifob]->getCollectionTagsAsStrings());
190  const unsigned int ncol(collectionTags_.size());
191  if (ncol>0) {
192  nf++;
193  maskFilters_[ifob]=true;
194  const string& label (fobs[ifob].provenance()->moduleLabel());
195  const string& instance (fobs[ifob].provenance()->productInstanceName());
196  const string& process (fobs[ifob].provenance()->processName());
197  filterTagsEvent_.insert(InputTag(label,instance,process));
198  for (unsigned int icol=0; icol!=ncol; ++icol) {
199  // overwrite process name (usually not set)
200  tokenizeTag(collectionTags_[icol],tagLabel,tagInstance,tagProcess);
201  collectionTagsEvent_.insert(InputTag(tagLabel,tagInstance,pn_));
202  }
203  }
204  }
206  if (filterTagsEvent_.size()!=nf) {
207  LogError("TriggerSummaryProducerAOD")
208  << "Mismatch in number of filter tags: "
209  << filterTagsEvent_.size() << "!=" << nf ;
210  }
211 
215 
217  if (isDebugEnabled()) {
218 
220  const unsigned int nc(collectionTagsEvent_.size());
221  LogTrace("TriggerSummaryProducerAOD") << "Number of unique collections requested " << nc;
222  const InputTagSet::const_iterator cb(collectionTagsEvent_.begin());
223  const InputTagSet::const_iterator ce(collectionTagsEvent_.end());
224  for ( InputTagSet::const_iterator ci=cb; ci!=ce; ++ci) {
225  LogTrace("TriggerSummaryProducerAOD") << distance(cb,ci) << " " << ci->encode();
226  }
227  const unsigned int nf(filterTagsEvent_.size());
228  LogTrace("TriggerSummaryProducerAOD") << "Number of unique filters requested " << nf;
229  const InputTagSet::const_iterator fb(filterTagsEvent_.begin());
230  const InputTagSet::const_iterator fe(filterTagsEvent_.end());
231  for ( InputTagSet::const_iterator fi=fb; fi!=fe; ++fi) {
232  LogTrace("TriggerSummaryProducerAOD") << distance(fb,fi) << " " << fi->encode();
233  }
234 
235  }
236 
242  toc_.clear();
243  tags_.clear();
244  keys_.clear();
245  offset_.clear();
246  fillTriggerObjectCollections< RecoEcalCandidateCollection>(iEvent, getRecoEcalCandidateCollection_);
247  fillTriggerObjectCollections< ElectronCollection>(iEvent, getElectronCollection_);
248  fillTriggerObjectCollections< RecoChargedCandidateCollection>(iEvent, getRecoChargedCandidateCollection_);
249  fillTriggerObjectCollections< CaloJetCollection>(iEvent, getCaloJetCollection_);
250  fillTriggerObjectCollections< CompositeCandidateCollection>(iEvent, getCompositeCandidateCollection_);
251  fillTriggerObjectCollections< METCollection>(iEvent, getMETCollection_);
252  fillTriggerObjectCollections< CaloMETCollection>(iEvent, getCaloMETCollection_);
253  fillTriggerObjectCollections<IsolatedPixelTrackCandidateCollection>(iEvent, getIsolatedPixelTrackCandidateCollection_);
255  fillTriggerObjectCollections< L1EmParticleCollection>(iEvent, getL1EmParticleCollection_);
256  fillTriggerObjectCollections< L1MuonParticleCollection>(iEvent, getL1MuonParticleCollection_);
257  fillTriggerObjectCollections< L1JetParticleCollection>(iEvent, getL1JetParticleCollection_);
258  fillTriggerObjectCollections< L1EtMissParticleCollection>(iEvent, getL1EtMissParticleCollection_);
259  fillTriggerObjectCollections< L1HFRingsCollection>(iEvent, getL1HFRingsCollection_);
261  fillTriggerObjectCollections< PFJetCollection>(iEvent, getPFJetCollection_);
262  fillTriggerObjectCollections< PFTauCollection>(iEvent, getPFTauCollection_);
264  const unsigned int nk(tags_.size());
265  LogDebug("TriggerSummaryProducerAOD") << "Number of collections found: " << nk;
266  const unsigned int no(toc_.size());
267  LogDebug("TriggerSummaryProducerAOD") << "Number of physics objects found: " << no;
268 
271  auto_ptr<TriggerEvent> product(new TriggerEvent(pn_,nk,no,nf));
272 
274  product->addCollections(tags_,keys_);
275  product->addObjects(toc_);
276 
278  for (unsigned int ifob=0; ifob!=nfob; ++ifob) {
279  if (maskFilters_[ifob]) {
280  const string& label (fobs[ifob].provenance()->moduleLabel());
281  const string& instance (fobs[ifob].provenance()->productInstanceName());
282  const string& process (fobs[ifob].provenance()->processName());
283  const edm::InputTag filterTag(label,instance,process);
284  ids_.clear();
285  keys_.clear();
286  fillFilterObjectMembers(iEvent,filterTag,fobs[ifob]->photonIds() ,fobs[ifob]->photonRefs());
287  fillFilterObjectMembers(iEvent,filterTag,fobs[ifob]->electronIds() ,fobs[ifob]->electronRefs());
288  fillFilterObjectMembers(iEvent,filterTag,fobs[ifob]->muonIds() ,fobs[ifob]->muonRefs());
289  fillFilterObjectMembers(iEvent,filterTag,fobs[ifob]->jetIds() ,fobs[ifob]->jetRefs());
290  fillFilterObjectMembers(iEvent,filterTag,fobs[ifob]->compositeIds(),fobs[ifob]->compositeRefs());
291  fillFilterObjectMembers(iEvent,filterTag,fobs[ifob]->basemetIds() ,fobs[ifob]->basemetRefs());
292  fillFilterObjectMembers(iEvent,filterTag,fobs[ifob]->calometIds() ,fobs[ifob]->calometRefs());
293  fillFilterObjectMembers(iEvent,filterTag,fobs[ifob]->pixtrackIds() ,fobs[ifob]->pixtrackRefs());
294  fillFilterObjectMembers(iEvent,filterTag,fobs[ifob]->l1emIds() ,fobs[ifob]->l1emRefs());
295  fillFilterObjectMembers(iEvent,filterTag,fobs[ifob]->l1muonIds() ,fobs[ifob]->l1muonRefs());
296  fillFilterObjectMembers(iEvent,filterTag,fobs[ifob]->l1jetIds() ,fobs[ifob]->l1jetRefs());
297  fillFilterObjectMembers(iEvent,filterTag,fobs[ifob]->l1etmissIds() ,fobs[ifob]->l1etmissRefs());
298  fillFilterObjectMembers(iEvent,filterTag,fobs[ifob]->l1hfringsIds(),fobs[ifob]->l1hfringsRefs());
299  fillFilterObjectMembers(iEvent,filterTag,fobs[ifob]->pfjetIds() ,fobs[ifob]->pfjetRefs());
300  fillFilterObjectMembers(iEvent,filterTag,fobs[ifob]->pftauIds() ,fobs[ifob]->pftauRefs());
301  product->addFilter(filterTag,ids_,keys_);
302  }
303  }
304 
305  OrphanHandle<TriggerEvent> ref = iEvent.put(product);
306  LogTrace("TriggerSummaryProducerAOD") << "Number of physics objects packed: " << ref->sizeObjects();
307  LogTrace("TriggerSummaryProducerAOD") << "Number of filter objects packed: " << ref->sizeFilters();
308 
309 }
310 
311 template <typename C>
313 
317 
318  using namespace std;
319  using namespace edm;
320  using namespace reco;
321  using namespace l1extra;
322  using namespace trigger;
323 
324  vector<Handle<C> > collections;
325  getter.fillHandles(iEvent, collections);
326  const unsigned int nc(collections.size());
327 
328  for (unsigned int ic=0; ic!=nc; ++ic) {
329  const Provenance& provenance(*(collections[ic].provenance()));
330  const string& label (provenance.moduleLabel());
331  const string& instance (provenance.productInstanceName());
332  const string& process (provenance.processName());
333  const InputTag collectionTag(label,instance,process);
334 
335  if (collectionTagsEvent_.find(collectionTag)!=collectionTagsEvent_.end()) {
336  const ProductID pid(collections[ic].provenance()->productID());
337  if (offset_.find(pid)!=offset_.end()) {
338  LogError("TriggerSummaryProducerAOD") << "Duplicate pid!";
339  }
340  offset_[pid]=toc_.size();
341  const unsigned int n(collections[ic]->size());
342  for (unsigned int i=0; i!=n; ++i) {
343  fillTriggerObject( (*collections[ic])[i] );
344  }
345  tags_.push_back(collectionTag.encode());
346  keys_.push_back(toc_.size());
347  }
348 
349  }
350 }
351 
352 template <typename T>
354 
355  using namespace trigger;
356  toc_.push_back( TriggerObject(object) );
357 
358  return;
359 }
360 
362 
363  using namespace l1extra;
364  using namespace trigger;
365 
367  object.hfEtSum(L1HFRings::kRing1PosEta),
368  object.hfEtSum(L1HFRings::kRing1NegEta),
369  object.hfEtSum(L1HFRings::kRing2PosEta),
370  object.hfEtSum(L1HFRings::kRing2NegEta) ) );
372  object.hfBitCount(L1HFRings::kRing1PosEta),
373  object.hfBitCount(L1HFRings::kRing1NegEta),
374  object.hfBitCount(L1HFRings::kRing2PosEta),
375  object.hfBitCount(L1HFRings::kRing2NegEta) ) );
376 
377  return;
378 }
379 
381 
382  using namespace l1extra;
383  using namespace trigger;
384 
385  toc_.push_back( TriggerObject(object) );
386  if (object.type()==L1EtMissParticle::kMET) {
387  toc_.push_back(TriggerObject(TriggerL1ETT,object.etTotal(),0.0,0.0,0.0));
388  } else if (object.type()==L1EtMissParticle::kMHT) {
389  toc_.push_back(TriggerObject(TriggerL1HTT,object.etTotal(),0.0,0.0,0.0));
390  } else {
391  toc_.push_back(TriggerObject(0, object.etTotal(),0.0,0.0,0.0));
392  }
393 
394  return;
395 }
396 
398 
399  using namespace reco;
400  using namespace trigger;
401 
402  toc_.push_back( TriggerObject(object) );
403  toc_.push_back(TriggerObject(TriggerTET ,object.sumEt() ,0.0,0.0,0.0));
404  toc_.push_back(TriggerObject(TriggerMETSig ,object.mEtSig() ,0.0,0.0,0.0));
405  toc_.push_back(TriggerObject(TriggerELongit,object.e_longitudinal(),0.0,0.0,0.0));
406 
407  return;
408 }
409 
411 
412  using namespace reco;
413  using namespace trigger;
414 
415  toc_.push_back( TriggerObject(object) );
416  toc_.push_back(TriggerObject(TriggerTHT ,object.sumEt() ,0.0,0.0,0.0));
417  toc_.push_back(TriggerObject(TriggerMHTSig ,object.mEtSig() ,0.0,0.0,0.0));
418  toc_.push_back(TriggerObject(TriggerHLongit,object.e_longitudinal(),0.0,0.0,0.0));
419 
420  return;
421 }
422 
423 template <typename C>
424 void TriggerSummaryProducerAOD::fillFilterObjectMembers(const edm::Event& iEvent, const edm::InputTag& tag, const trigger::Vids& ids, const std::vector<edm::Ref<C> >& refs) {
425 
429 
430  using namespace std;
431  using namespace edm;
432  using namespace reco;
433  using namespace l1extra;
434  using namespace trigger;
435 
436  if (ids.size()!=refs.size()) {
437  LogError("TriggerSummaryProducerAOD") << "Vector length is different: "
438  << ids.size() << " " << refs.size();
439  }
440 
441  const unsigned int n(min(ids.size(),refs.size()));
442  for (unsigned int i=0; i!=n; ++i) {
443  const ProductID pid(refs[i].id());
444  if (offset_.find(pid)==offset_.end()) {
445  const string& label(iEvent.getProvenance(pid).moduleLabel());
446  const string& instance(iEvent.getProvenance(pid).productInstanceName());
447  const string& process(iEvent.getProvenance(pid).processName());
448  LogError("TriggerSummaryProducerAOD")
449  << "Uunknown pid:"
450  << " FilterTag/Key: " << tag.encode()
451  << "/" << i
452  << " CollectionTag/Key: "
453  << InputTag(label,instance,process).encode()
454  << "/" << refs[i].key()
455  << " CollectionType: " << typeid(C).name();
456  } else {
457  fillFilterObjectMember(offset_[pid],ids[i],refs[i]);
458  }
459  }
460  return;
461 
462 }
463 
464 template <typename C>
465 void TriggerSummaryProducerAOD::fillFilterObjectMember(const int& offset, const int& id, const edm::Ref<C> & ref) {
466 
467  keys_.push_back(offset+ref.key());
468  ids_.push_back(id);
469 
470  return;
471 }
472 
474 
475  using namespace trigger;
476 
477  if (id==TriggerL1HfBitCounts) {
478  keys_.push_back(offset+2*ref.key()+1);
479  } else { // if (ids[i]==TriggerL1HfRingEtSums) {
480  keys_.push_back(offset+2*ref.key()+0);
481  }
482  ids_.push_back(id);
483 
484  return;
485 }
486 
488 
489  using namespace trigger;
490 
491  if ( (id==TriggerL1ETT) || (id==TriggerL1HTT) ) {
492  keys_.push_back(offset+2*ref.key()+1);
493  } else {
494  keys_.push_back(offset+2*ref.key()+0);
495  }
496  ids_.push_back(id);
497 
498  return;
499 }
500 
502 
503  using namespace trigger;
504 
505  if ( (id==TriggerTHT) || (id==TriggerTET) ) {
506  keys_.push_back(offset+4*ref.key()+1);
507  } else if ( (id==TriggerMETSig) || (id==TriggerMHTSig) ) {
508  keys_.push_back(offset+4*ref.key()+2);
509  } else if ( (id==TriggerELongit) || (id==TriggerHLongit) ) {
510  keys_.push_back(offset+4*ref.key()+3);
511  } else {
512  keys_.push_back(offset+4*ref.key()+0);
513  }
514  ids_.push_back(id);
515 
516  return;
517 }
518 
520 
521  using namespace trigger;
522 
523  if ( (id==TriggerTHT) || (id==TriggerTET) ) {
524  keys_.push_back(offset+4*ref.key()+1);
525  } else if ( (id==TriggerMETSig) || (id==TriggerMHTSig) ) {
526  keys_.push_back(offset+4*ref.key()+2);
527  } else if ( (id==TriggerELongit) || (id==TriggerHLongit) ) {
528  keys_.push_back(offset+4*ref.key()+3);
529  } else {
530  keys_.push_back(offset+4*ref.key()+0);
531  }
532  ids_.push_back(id);
533 
534  return;
535 }
536 
538 
539  using namespace std;
540  using namespace edm;
541  using namespace trigger;
542 
543  LogVerbatim("TriggerSummaryProducerAOD") << endl;
544  LogVerbatim("TriggerSummaryProducerAOD") << "TriggerSummaryProducerAOD::endJob - accumulated tags:" << endl;
545 
546  const unsigned int nc(collectionTagsGlobal_.size());
547  const unsigned int nf(filterTagsGlobal_.size());
548  LogVerbatim("TriggerSummaryProducerAOD") << " Overall number of Collections/Filters: "
549  << nc << "/" << nf << endl;
550 
551  LogVerbatim("TriggerSummaryProducerAOD") << " The collections: " << nc << endl;
552  const InputTagSet::const_iterator cb(collectionTagsGlobal_.begin());
553  const InputTagSet::const_iterator ce(collectionTagsGlobal_.end());
554  for ( InputTagSet::const_iterator ci=cb; ci!=ce; ++ci) {
555  LogVerbatim("TriggerSummaryProducerAOD") << " " << distance(cb,ci) << " " << ci->encode() << endl;
556  }
557 
558  LogVerbatim("TriggerSummaryProducerAOD") << " The filters:" << nf << endl;
559  const InputTagSet::const_iterator fb(filterTagsGlobal_.begin());
560  const InputTagSet::const_iterator fe(filterTagsGlobal_.end());
561  for ( InputTagSet::const_iterator fi=fb; fi!=fe; ++fi) {
562  LogVerbatim("TriggerSummaryProducerAOD") << " " << distance(fb,fi) << " " << fi->encode() << endl;
563  }
564 
565  LogVerbatim("TriggerSummaryProducerAOD") << "TriggerSummaryProducerAOD::endJob." << endl;
566  LogVerbatim("TriggerSummaryProducerAOD") << endl;
567 
568  return;
569 
570 }
#define LogDebug(id)
type
Definition: HCALResponse.h:21
void callWhenNewProductsRegistered(std::function< void(BranchDescription const &)> const &func)
Definition: ProducerBase.h:44
bool isDebugEnabled()
int i
Definition: DBlmapReader.cc:9
edm::GetterOfProducts< l1extra::L1JetParticleCollection > getL1JetParticleCollection_
edm::GetterOfProducts< reco::IsolatedPixelTrackCandidateCollection > getIsolatedPixelTrackCandidateCollection_
virtual void produce(edm::Event &, const edm::EventSetup &)
edm::GetterOfProducts< reco::RecoEcalCandidateCollection > getRecoEcalCandidateCollection_
std::string const & getProcessName() const
edm::GetterOfProducts< l1extra::L1MuonParticleCollection > getL1MuonParticleCollection_
The single EDProduct to be saved for each event (AOD case)
Definition: TriggerEvent.h:27
trigger::TriggerObjectCollection toc_
trigger object collection
edm::GetterOfProducts< reco::PFTauCollection > getPFTauCollection_
static PFTauRenderPlugin instance
std::vector< bool > maskFilters_
packing decision
edm::GetterOfProducts< reco::METCollection > getMETCollection_
std::set< edm::InputTag, OrderInputTag > InputTagSet
#define min(a, b)
Definition: mlp_lapack.h:161
edm::GetterOfProducts< reco::CaloJetCollection > getCaloJetCollection_
void fillFilterObjectMember(const int &, const int &, const edm::Ref< C > &)
edm::GetterOfProducts< l1extra::L1EtMissParticleCollection > getL1EtMissParticleCollection_
std::vector< std::string > tags_
std::string const & processName() const
Definition: Provenance.h:63
uint16_t size_type
std::string encode() const
Definition: InputTag.cc:164
edm::GetterOfProducts< reco::PFJetCollection > getPFJetCollection_
Single trigger physics object (e.g., an isolated muon)
Definition: TriggerObject.h:24
int iEvent
Definition: GenABIO.cc:243
edm::GetterOfProducts< reco::RecoChargedCandidateCollection > getRecoChargedCandidateCollection_
TriggerSummaryProducerAOD(const edm::ParameterSet &)
OrphanHandle< PROD > put(std::auto_ptr< PROD > product)
Put a new product.
Definition: Event.h:94
Definition: MET.h:32
edm::GetterOfProducts< l1extra::L1HFRingsCollection > getL1HFRingsCollection_
bool isAvailable() const
Definition: Service.h:47
std::map< edm::ProductID, unsigned int > offset_
global map for indices into toc_: offset per input L3 collection
unsigned int offset(bool)
void fillFilterObjectMembers(const edm::Event &, const edm::InputTag &tag, const trigger::Vids &, const std::vector< edm::Ref< C > > &)
#define LogTrace(id)
key_type key() const
Accessor for product key.
Definition: Ref.h:266
std::string const & moduleLabel() const
Definition: Provenance.h:62
edm::GetterOfProducts< reco::CaloMETCollection > getCaloMETCollection_
edm::GetterOfProducts< reco::ElectronCollection > getElectronCollection_
InputTagSet collectionTagsEvent_
list of L3 collection tags
void fillHandles(edm::Event const &event, std::vector< edm::Handle< T > > &handles) const
edm::GetterOfProducts< reco::CompositeCandidateCollection > getCompositeCandidateCollection_
edm::GetterOfProducts< trigger::TriggerFilterObjectWithRefs > getTriggerFilterObjectWithRefs_
std::string pn_
process name
void fillTriggerObjectCollections(const edm::Event &, edm::GetterOfProducts< C > &)
InputTagSet filterTagsEvent_
list of L3 filter tags
std::string const & productInstanceName() const
Definition: Provenance.h:64
tuple process
Definition: LaserDQM_cfg.py:3
Provenance getProvenance(BranchID const &theID) const
Definition: Event.cc:68
long double T
tuple size
Write out results.
std::vector< int > Vids
edm::GetterOfProducts< l1extra::L1EmParticleCollection > getL1EmParticleCollection_