CMS 3D CMS Logo

PATObject.h
Go to the documentation of this file.
1 //
2 //
3 
4 #ifndef DataFormats_PatCandidates_PATObject_h
5 #define DataFormats_PatCandidates_PATObject_h
6 
23 #include <vector>
24 #include <string>
25 #include <iosfwd>
26 
29 
31 
34 
36 
38 
40 
41 namespace pat {
42 
43  namespace pat_statics {
45  static const std::string EMPTY_STR("");
46  }
47 
48  template <class ObjectType>
49  class PATObject : public ObjectType {
50  public:
51 
53 
55  PATObject();
57  PATObject(const ObjectType & obj);
61  PATObject(const edm::Ptr<ObjectType> & ref);
63  ~PATObject() override {}
64  // returns a clone // NO: ObjectType can be an abstract type like reco::Candidate
65  // virtual PATObject<ObjectType> * clone() const ; // for which the clone() can't be defined
66 
68  const reco::Candidate * originalObject() const;
70  const edm::Ptr<reco::Candidate> & originalObjectRef() const;
71 
75 
77  const TriggerObjectStandAloneCollection & triggerObjectMatches() const { return triggerObjectMatchesEmbedded_; };
79  const TriggerObjectStandAlone * triggerObjectMatch( const size_t idx = 0 ) const;
82  const TriggerObjectStandAloneCollection triggerObjectMatchesByType( const trigger::TriggerObjectType triggerObjectType ) const;
83  const TriggerObjectStandAloneCollection triggerObjectMatchesByType( const unsigned triggerObjectType ) const {
84  return triggerObjectMatchesByType( trigger::TriggerObjectType( triggerObjectType ) );
85  };
86  // for backward compatibility
87  const TriggerObjectStandAloneCollection triggerObjectMatchesByFilterID( const unsigned triggerObjectType ) const {
88  return triggerObjectMatchesByType( trigger::TriggerObjectType( triggerObjectType ) );
89  };
91  const TriggerObjectStandAlone * triggerObjectMatchByType( const trigger::TriggerObjectType triggerObjectType, const size_t idx = 0 ) const;
92  const TriggerObjectStandAlone * triggerObjectMatchByType( const unsigned triggerObjectType, const size_t idx = 0 ) const {
93  return triggerObjectMatchByType( trigger::TriggerObjectType( triggerObjectType ), idx );
94  };
95  // for backward compatibility
96  const TriggerObjectStandAlone * triggerObjectMatchByFilterID( const unsigned triggerObjectType, const size_t idx = 0 ) const {
97  return triggerObjectMatchByType( trigger::TriggerObjectType( triggerObjectType ), idx );
98  };
100  const TriggerObjectStandAloneCollection triggerObjectMatchesByCollection( const std::string & coll ) const;
101  // for RooT command line
103  return triggerObjectMatchesByCollection( std::string( coll ) );
104  };
106  const TriggerObjectStandAlone * triggerObjectMatchByCollection( const std::string & coll, const size_t idx = 0 ) const;
107  // for RooT command line
108  const TriggerObjectStandAlone * triggerObjectMatchByCollection( const char * coll, const size_t idx = 0 ) const {
109  return triggerObjectMatchByCollection( std::string( coll ), idx );
110  };
112  const TriggerObjectStandAloneCollection triggerObjectMatchesByCondition( const std::string & nameCondition ) const;
113  // for RooT command line
114  const TriggerObjectStandAloneCollection triggerObjectMatchesByCondition( const char * nameCondition ) const {
115  return triggerObjectMatchesByCondition( std::string( nameCondition ) );
116  };
118  const TriggerObjectStandAlone * triggerObjectMatchByCondition( const std::string & nameCondition, const size_t idx = 0 ) const;
119  // for RooT command line
120  const TriggerObjectStandAlone * triggerObjectMatchByCondition( const char * nameCondition, const size_t idx = 0 ) const {
121  return triggerObjectMatchByCondition( std::string( nameCondition ), idx );
122  };
126  const TriggerObjectStandAloneCollection triggerObjectMatchesByAlgorithm( const std::string & nameAlgorithm, const bool algoCondAccepted = true ) const;
127  // for RooT command line
128  const TriggerObjectStandAloneCollection triggerObjectMatchesByAlgorithm( const char * nameAlgorithm, const bool algoCondAccepted = true ) const {
129  return triggerObjectMatchesByAlgorithm( std::string( nameAlgorithm ), algoCondAccepted );
130  };
131  // for the cut string parser
132  const TriggerObjectStandAloneCollection triggerObjectMatchesByAlgorithm( const std::string & nameAlgorithm, const unsigned algoCondAccepted ) const {
133  return triggerObjectMatchesByAlgorithm( nameAlgorithm, bool( algoCondAccepted ) );
134  };
135  // for RooT command line and the cut string parser
136  const TriggerObjectStandAloneCollection triggerObjectMatchesByAlgorithm( const char * nameAlgorithm, const unsigned algoCondAccepted ) const {
137  return triggerObjectMatchesByAlgorithm( std::string( nameAlgorithm ), bool( algoCondAccepted ) );
138  };
142  const TriggerObjectStandAlone * triggerObjectMatchByAlgorithm( const std::string & nameAlgorithm, const bool algoCondAccepted = true, const size_t idx = 0 ) const;
143  // for RooT command line
144  const TriggerObjectStandAlone * triggerObjectMatchByAlgorithm( const char * nameAlgorithm, const bool algoCondAccepted = true, const size_t idx = 0 ) const {
145  return triggerObjectMatchByAlgorithm( std::string( nameAlgorithm ), algoCondAccepted, idx );
146  };
147  // for the cut string parser
148  const TriggerObjectStandAlone * triggerObjectMatchByAlgorithm( const std::string & nameAlgorithm, const unsigned algoCondAccepted, const size_t idx = 0 ) const {
149  return triggerObjectMatchByAlgorithm( nameAlgorithm, bool( algoCondAccepted ), idx );
150  };
151  // for RooT command line and the cut string parser
152  const TriggerObjectStandAlone * triggerObjectMatchByAlgorithm( const char * nameAlgorithm, const unsigned algoCondAccepted, const size_t idx = 0 ) const {
153  return triggerObjectMatchByAlgorithm( std::string( nameAlgorithm ), bool( algoCondAccepted ), idx );
154  };
156  const TriggerObjectStandAloneCollection triggerObjectMatchesByFilter( const std::string & labelFilter ) const;
157  // for RooT command line
158  const TriggerObjectStandAloneCollection triggerObjectMatchesByFilter( const char * labelFilter ) const {
159  return triggerObjectMatchesByFilter( std::string( labelFilter ) );
160  };
162  const TriggerObjectStandAlone * triggerObjectMatchByFilter( const std::string & labelFilter, const size_t idx = 0 ) const;
163  // for RooT command line
164  const TriggerObjectStandAlone * triggerObjectMatchByFilter( const char * labelFilter, const size_t idx = 0 ) const {
165  return triggerObjectMatchByFilter( std::string( labelFilter ), idx );
166  };
172  const TriggerObjectStandAloneCollection triggerObjectMatchesByPath( const std::string & namePath, const bool pathLastFilterAccepted = false, const bool pathL3FilterAccepted = true ) const;
173  // for RooT command line
174  const TriggerObjectStandAloneCollection triggerObjectMatchesByPath( const char * namePath, const bool pathLastFilterAccepted = false, const bool pathL3FilterAccepted = true ) const {
175  return triggerObjectMatchesByPath( std::string( namePath ), pathLastFilterAccepted, pathL3FilterAccepted );
176  };
177  // for the cut string parser
178  const TriggerObjectStandAloneCollection triggerObjectMatchesByPath( const std::string & namePath, const unsigned pathLastFilterAccepted, const unsigned pathL3FilterAccepted = 1 ) const {
179  return triggerObjectMatchesByPath( namePath, bool( pathLastFilterAccepted ), bool( pathL3FilterAccepted ) );
180  };
181  // for RooT command line and the cut string parser
182  const TriggerObjectStandAloneCollection triggerObjectMatchesByPath( const char * namePath, const unsigned pathLastFilterAccepted, const unsigned pathL3FilterAccepted = 1 ) const {
183  return triggerObjectMatchesByPath( std::string( namePath ), bool( pathLastFilterAccepted ), bool( pathL3FilterAccepted ) );
184  };
190  const TriggerObjectStandAlone * triggerObjectMatchByPath( const std::string & namePath, const bool pathLastFilterAccepted = false, const bool pathL3FilterAccepted = true, const size_t idx = 0 ) const;
191  // for RooT command line
192  const TriggerObjectStandAlone * triggerObjectMatchByPath( const char * namePath, const bool pathLastFilterAccepted = false, const bool pathL3FilterAccepted = true, const size_t idx = 0 ) const {
193  return triggerObjectMatchByPath( std::string( namePath ), pathLastFilterAccepted, pathL3FilterAccepted, idx );
194  };
195  // for the cut string parser
196  const TriggerObjectStandAlone * triggerObjectMatchByPath( const std::string & namePath, const unsigned pathLastFilterAccepted, const unsigned pathL3FilterAccepted = 1, const size_t idx = 0 ) const {
197  return triggerObjectMatchByPath( namePath, bool( pathLastFilterAccepted ), bool( pathL3FilterAccepted ), idx );
198  };
199  // for RooT command line and the cut string parser
200  const TriggerObjectStandAlone * triggerObjectMatchByPath( const char * namePath, const unsigned pathLastFilterAccepted, const unsigned pathL3FilterAccepted = 1, const size_t idx = 0 ) const {
201  return triggerObjectMatchByPath( std::string( namePath ), bool( pathLastFilterAccepted ), bool( pathL3FilterAccepted ), idx );
202  };
204  void addTriggerObjectMatch( const TriggerObjectStandAlone & trigObj ) { triggerObjectMatchesEmbedded_.push_back( trigObj ); };
207  for (std::vector<TriggerObjectStandAlone>::iterator it = triggerObjectMatchesEmbedded_.begin(), ed = triggerObjectMatchesEmbedded_.end(); it != ed; ++it) it->unpackPathNames(names);
208  }
209 
211  const pat::LookupTableRecord & efficiency(const std::string &name) const ;
213  std::vector<std::pair<std::string,pat::LookupTableRecord> > efficiencies() const ;
215  const std::vector<std::string> & efficiencyNames() const { return efficiencyNames_; }
217  const std::vector<pat::LookupTableRecord> & efficiencyValues() const { return efficiencyValues_; }
221  void setEfficiency(const std::string &name, const pat::LookupTableRecord & value) ;
222 
226  if (idx >= genParticlesSize()) return reco::GenParticleRef();
227  return genParticleEmbedded_.empty() ? genParticleRef_[idx] : reco::GenParticleRef(&genParticleEmbedded_, idx);
228  }
239  // implementation note: uint8_t instead of bool, because the string parser doesn't allow bool currently
240  reco::GenParticleRef genParticleById(int pdgId, int status, uint8_t autoCharge=0) const ;
241 
244  const reco::GenParticle * genParticle(size_t idx=0) const {
245  reco::GenParticleRef ref = genParticleRef(idx);
246  return ref.isNonnull() ? ref.get() : nullptr;
247  }
249  size_t genParticlesSize() const {
250  return genParticleEmbedded_.empty() ? genParticleRef_.size() : genParticleEmbedded_.size();
251  }
254  std::vector<reco::GenParticleRef> genParticleRefs() const ;
255 
257  void setGenParticleRef(const reco::GenParticleRef &ref, bool embed=false) ;
260  void addGenParticleRef(const reco::GenParticleRef &ref) ;
262  void setGenParticle( const reco::GenParticle &particle ) ;
265  void embedGenParticle() ;
266 
268  bool hasOverlaps(const std::string &label) const ;
271  const reco::CandidatePtrVector & overlaps(const std::string &label) const ;
273  const std::vector<std::string> & overlapLabels() const { return overlapLabels_; }
277  void setOverlaps(const std::string &label, const reco::CandidatePtrVector & overlaps) ;
278 
280  template<typename T> const T * userData(const std::string &key) const {
281  const pat::UserData * data = userDataObject_(key);
282  return (data != nullptr ? data->template get<T>() : nullptr);
283 
284  }
286  bool hasUserData(const std::string &key) const {
287  return (userDataObject_(key) != nullptr);
288  }
291  const pat::UserData * data = userDataObject_(key);
292  return (data != nullptr ? data->typeName() : pat_statics::EMPTY_STR);
293  };
295  const std::vector<std::string> & userDataNames() const { return userDataLabels_; }
296 
299  const void * userDataBare(const std::string &key) const {
300  const pat::UserData * data = userDataObject_(key);
301  return (data != nullptr ? data->bareData() : nullptr);
302  }
303 
308  template<typename T>
309  void addUserData( const std::string & label, const T & data, bool transientOnly=false, bool overwrite=false ) {
310  std::unique_ptr<pat::UserData> made(pat::UserData::make<T>(data, transientOnly));
311  addUserDataObject_( label, std::move(made), overwrite );
312  }
313 
316  void addUserDataFromPtr( const std::string & label, const edm::Ptr<pat::UserData> & data, bool overwrite=false ) {
317  std::unique_ptr<pat::UserData> cloned(data->clone());
318  addUserDataObject_( label, std::move(cloned), overwrite );
319  }
320 
323  float userFloat( const std::string & key ) const;
325  std::vector<float> userFloatRange( const std::string& key ) const;
327  float userFloat( const char* key ) const { return userFloat( std::string(key) ); }
328 
330  void addUserFloat( const std::string & label, float data, const bool overwrite = false );
332  const std::vector<std::string> & userFloatNames() const { return userFloatLabels_; }
334  bool hasUserFloat( const std::string & key ) const {
335  auto it = std::lower_bound(userFloatLabels_.cbegin(), userFloatLabels_.cend(), key);
336  return ( it != userFloatLabels_.cend() && *it == key );
337  }
339  bool hasUserFloat( const char* key ) const {return hasUserFloat( std::string(key) );}
340 
343  int32_t userInt( const std::string & key ) const;
345  std::vector<int> userIntRange( const std::string& key ) const;
347  void addUserInt( const std::string & label, int32_t data, const bool overwrite = false );
349  const std::vector<std::string> & userIntNames() const { return userIntLabels_; }
351  bool hasUserInt( const std::string & key ) const {
352  auto it = std::lower_bound(userIntLabels_.cbegin(), userIntLabels_.cend(), key);
353  return ( it != userIntLabels_.cend() && *it == key );
354  }
355 
358  reco::CandidatePtr userCand( const std::string & key ) const;
360  void addUserCand( const std::string & label, const reco::CandidatePtr & data, const bool overwrite = false );
362  const std::vector<std::string> & userCandNames() const { return userCandLabels_; }
364  bool hasUserCand( const std::string & key ) const {
365  auto it = std::lower_bound(userCandLabels_.cbegin(), userCandLabels_.cend(), key);
366  return ( it != userCandLabels_.cend() && *it == key );
367  }
368 
369  // === New Kinematic Resolutions
372  const pat::CandKinResolution & getKinResolution(const std::string &label="") const ;
373 
375  bool hasKinResolution(const std::string &label="") const ;
376 
378  void setKinResolution(const pat::CandKinResolution &resol, const std::string &label="") ;
379 
381  double resolEta(const std::string &label="") const { return getKinResolution(label).resolEta(this->p4()); }
382 
384  double resolTheta(const std::string &label="") const { return getKinResolution(label).resolTheta(this->p4()); }
385 
387  double resolPhi(const std::string &label="") const { return getKinResolution(label).resolPhi(this->p4()); }
388 
390  double resolE(const std::string &label="") const { return getKinResolution(label).resolE(this->p4()); }
391 
393  double resolEt(const std::string &label="") const { return getKinResolution(label).resolEt(this->p4()); }
394 
396  double resolP(const std::string &label="") const { return getKinResolution(label).resolP(this->p4()); }
397 
399  double resolPt(const std::string &label="") const { return getKinResolution(label).resolPt(this->p4()); }
400 
402  double resolPInv(const std::string &label="") const { return getKinResolution(label).resolPInv(this->p4()); }
403 
405  double resolPx(const std::string &label="") const { return getKinResolution(label).resolPx(this->p4()); }
406 
408  double resolPy(const std::string &label="") const { return getKinResolution(label).resolPy(this->p4()); }
409 
411  double resolPz(const std::string &label="") const { return getKinResolution(label).resolPz(this->p4()); }
412 
415  double resolM(const std::string &label="") const { return getKinResolution(label).resolM(this->p4()); }
416 
417 
418 
419  protected:
420  // reference back to the original object
422 
425 
427  std::vector<pat::LookupTableRecord> efficiencyValues_;
429  std::vector<std::string> efficiencyNames_;
430 
432  std::vector<reco::GenParticleRef> genParticleRef_;
434  std::vector<reco::GenParticle> genParticleEmbedded_;
435 
437  std::vector<std::string> overlapLabels_;
439  std::vector<reco::CandidatePtrVector> overlapItems_;
440 
442  std::vector<std::string> userDataLabels_;
444  // User float values
445  std::vector<std::string> userFloatLabels_;
446  std::vector<float> userFloats_;
447  // User int values
448  std::vector<std::string> userIntLabels_;
449  std::vector<int32_t> userInts_;
450  // User candidate matches
451  std::vector<std::string> userCandLabels_;
452  std::vector<reco::CandidatePtr> userCands_;
453 
455  std::vector<pat::CandKinResolution> kinResolutions_;
458  std::vector<std::string> kinResolutionLabels_;
459 
460  void addUserDataObject_( const std::string & label, std::unique_ptr<pat::UserData> value, bool overwrite = false ) ;
461 
462  private:
463  const pat::UserData * userDataObject_(const std::string &key) const ;
464  };
465 
466 
467  template <class ObjectType> PATObject<ObjectType>::PATObject() {
468  }
469 
470  template <class ObjectType> PATObject<ObjectType>::PATObject(const ObjectType & obj) :
471  ObjectType(obj),
472  refToOrig_() {
473  }
474 
475  template <class ObjectType> PATObject<ObjectType>::PATObject(const edm::RefToBase<ObjectType> & ref) :
476  ObjectType(*ref),
477  refToOrig_(ref.id(), ref.get(), ref.key()) // correct way to convert RefToBase=>Ptr, if ref is guaranteed to be available
478  // which happens to be true, otherwise the line before this throws ex. already
479  {
480  }
481 
482  template <class ObjectType> PATObject<ObjectType>::PATObject(const edm::Ptr<ObjectType> & ref) :
483  ObjectType(*ref),
484  refToOrig_(ref) {
485  }
486 
487  template <class ObjectType> const reco::Candidate * PATObject<ObjectType>::originalObject() const {
488  if (refToOrig_.isNull()) {
489  // this object was not produced from a reference, so no link to the
490  // original object exists -> return a 0-pointer
491  return nullptr;
492  } else if (!refToOrig_.isAvailable()) {
493  throw edm::Exception(edm::errors::ProductNotFound) << "The original collection from which this PAT object was made is not present any more in the event, hence you cannot access the originating object anymore.";
494  } else {
495  return refToOrig_.get();
496  }
497  }
498 
499  template <class ObjectType>
501 
502  template <class ObjectType>
504  if ( idx >= triggerObjectMatches().size() ) return nullptr;
506  return ref.isNonnull() ? ref.get() : nullptr;
507  }
508 
509  template <class ObjectType>
512  for ( size_t i = 0; i < triggerObjectMatches().size(); ++i ) {
513  if ( triggerObjectMatch( i ) != 0 && triggerObjectMatch( i )->hasTriggerObjectType( triggerObjectType ) ) matches.push_back( *( triggerObjectMatch( i ) ) );
514  }
515  return matches;
516  }
517 
518  template <class ObjectType>
520  std::vector< size_t > refs;
521  for ( size_t i = 0; i < triggerObjectMatches().size(); ++i ) {
522  if ( triggerObjectMatch( i ) != 0 && triggerObjectMatch( i )->hasTriggerObjectType( triggerObjectType ) ) refs.push_back( i );
523  }
524  if ( idx >= refs.size() ) return nullptr;
526  return ref.isNonnull() ? ref.get() : nullptr;
527  }
528 
529  template <class ObjectType>
532  for ( size_t i = 0; i < triggerObjectMatches().size(); ++i ) {
533  if ( triggerObjectMatch( i ) != 0 && triggerObjectMatch( i )->hasCollection( coll ) ) matches.push_back( *( triggerObjectMatch( i ) ) );
534  }
535  return matches;
536  }
537 
538  template <class ObjectType>
540  std::vector< size_t > refs;
541  for ( size_t i = 0; i < triggerObjectMatches().size(); ++i ) {
542  if ( triggerObjectMatch( i ) != 0 && triggerObjectMatch( i )->hasCollection( coll ) ) {
543  refs.push_back( i );
544  }
545  }
546  if ( idx >= refs.size() ) return nullptr;
548  return ref.isNonnull() ? ref.get() : nullptr;
549  }
550 
551  template <class ObjectType>
554  for ( size_t i = 0; i < triggerObjectMatches().size(); ++i ) {
555  if ( triggerObjectMatch( i ) != 0 && triggerObjectMatch( i )->hasConditionName( nameCondition ) ) matches.push_back( *( triggerObjectMatch( i ) ) );
556  }
557  return matches;
558  }
559 
560  template <class ObjectType>
562  std::vector< size_t > refs;
563  for ( size_t i = 0; i < triggerObjectMatches().size(); ++i ) {
564  if ( triggerObjectMatch( i ) != 0 && triggerObjectMatch( i )->hasConditionName( nameCondition ) ) refs.push_back( i );
565  }
566  if ( idx >= refs.size() ) return nullptr;
568  return ref.isNonnull() ? ref.get() : nullptr;
569  }
570 
571  template <class ObjectType>
572  const TriggerObjectStandAloneCollection PATObject<ObjectType>::triggerObjectMatchesByAlgorithm( const std::string & nameAlgorithm, const bool algoCondAccepted ) const {
574  for ( size_t i = 0; i < triggerObjectMatches().size(); ++i ) {
575  if ( triggerObjectMatch( i ) != 0 && triggerObjectMatch( i )->hasAlgorithmName( nameAlgorithm, algoCondAccepted ) ) matches.push_back( *( triggerObjectMatch( i ) ) );
576  }
577  return matches;
578  }
579 
580  template <class ObjectType>
581  const TriggerObjectStandAlone * PATObject<ObjectType>::triggerObjectMatchByAlgorithm( const std::string & nameAlgorithm, const bool algoCondAccepted, const size_t idx ) const {
582  std::vector< size_t > refs;
583  for ( size_t i = 0; i < triggerObjectMatches().size(); ++i ) {
584  if ( triggerObjectMatch( i ) != 0 && triggerObjectMatch( i )->hasAlgorithmName( nameAlgorithm, algoCondAccepted ) ) refs.push_back( i );
585  }
586  if ( idx >= refs.size() ) return nullptr;
588  return ref.isNonnull() ? ref.get() : nullptr;
589  }
590 
591  template <class ObjectType>
594  for ( size_t i = 0; i < triggerObjectMatches().size(); ++i ) {
595  if ( triggerObjectMatch( i ) != 0 && triggerObjectMatch( i )->hasFilterLabel( labelFilter ) ) matches.push_back( *( triggerObjectMatch( i ) ) );
596  }
597  return matches;
598  }
599 
600  template <class ObjectType>
602  std::vector< size_t > refs;
603  for ( size_t i = 0; i < triggerObjectMatches().size(); ++i ) {
604  if ( triggerObjectMatch( i ) != 0 && triggerObjectMatch( i )->hasFilterLabel( labelFilter ) ) refs.push_back( i );
605  }
606  if ( idx >= refs.size() ) return nullptr;
608  return ref.isNonnull() ? ref.get() : nullptr;
609  }
610 
611  template <class ObjectType>
612  const TriggerObjectStandAloneCollection PATObject<ObjectType>::triggerObjectMatchesByPath( const std::string & namePath, const bool pathLastFilterAccepted, const bool pathL3FilterAccepted ) const {
614  for ( size_t i = 0; i < triggerObjectMatches().size(); ++i ) {
615  if ( triggerObjectMatch( i ) != 0 && triggerObjectMatch( i )->hasPathName( namePath, pathLastFilterAccepted, pathL3FilterAccepted ) ) matches.push_back( *( triggerObjectMatch( i ) ) );
616  }
617  return matches;
618  }
619 
620  template <class ObjectType>
621  const TriggerObjectStandAlone * PATObject<ObjectType>::triggerObjectMatchByPath( const std::string & namePath, const bool pathLastFilterAccepted, const bool pathL3FilterAccepted, const size_t idx ) const {
622  std::vector< size_t > refs;
623  for ( size_t i = 0; i < triggerObjectMatches().size(); ++i ) {
624  if ( triggerObjectMatch( i ) != 0 && triggerObjectMatch( i )->hasPathName( namePath, pathLastFilterAccepted, pathL3FilterAccepted ) ) refs.push_back( i );
625  }
626  if ( idx >= refs.size() ) return nullptr;
628  return ref.isNonnull() ? ref.get() : nullptr;
629  }
630 
631  template <class ObjectType>
632  const pat::LookupTableRecord &
634  // find the name in the (sorted) list of names
635  auto it = std::lower_bound(efficiencyNames_.cbegin(), efficiencyNames_.cend(), name);
636  if ((it == efficiencyNames_.end()) || (*it != name)) {
637  throw cms::Exception("Invalid Label") << "There is no efficiency with name '" << name << "' in this PAT Object\n";
638  }
639  return efficiencyValues_[std::distance(efficiencyNames_.cbegin(),it)];
640  }
641 
642  template <class ObjectType>
643  std::vector<std::pair<std::string,pat::LookupTableRecord> >
645  std::vector<std::pair<std::string,pat::LookupTableRecord> > ret;
646  std::vector<std::string>::const_iterator itn = efficiencyNames_.begin(), edn = efficiencyNames_.end();
647  std::vector<pat::LookupTableRecord>::const_iterator itv = efficiencyValues_.begin();
648  for ( ; itn != edn; ++itn, ++itv) {
649  ret.emplace_back( *itn, *itv);
650  }
651  return ret;
652  }
653 
654  template <class ObjectType>
656  // look for the name, or to the place where we can insert it without violating the alphabetic order
657  auto it = std::lower_bound(efficiencyNames_.begin(), efficiencyNames_.end(), name);
658  const auto dist = std::distance(efficiencyNames_.begin(),it);
659  if (it == efficiencyNames_.end()) { // insert at the end
660  efficiencyNames_.push_back(name);
661  efficiencyValues_.push_back(value);
662  } else if (*it == name) { // replace existing
663  efficiencyValues_[dist] = value;
664  } else { // insert in the middle :-(
665  efficiencyNames_. insert(it, name);
666  efficiencyValues_.insert( efficiencyValues_.begin() + dist, value );
667  }
668  }
669 
670  template <class ObjectType>
672  genParticleRef_ = std::vector<reco::GenParticleRef>(1,ref);
673  genParticleEmbedded_.clear();
674  if (embed) embedGenParticle();
675  }
676 
677  template <class ObjectType>
679  if (!genParticleEmbedded_.empty()) { // we're embedding
680  if (ref.isNonnull()) genParticleEmbedded_.push_back(*ref);
681  } else {
682  genParticleRef_.push_back(ref);
683  }
684  }
685 
686  template <class ObjectType>
688  genParticleEmbedded_.clear();
689  genParticleEmbedded_.push_back(particle);
690  genParticleRef_.clear();
691  }
692 
693  template <class ObjectType>
695  genParticleEmbedded_.clear();
696  for (std::vector<reco::GenParticleRef>::const_iterator it = genParticleRef_.begin(); it != genParticleRef_.end(); ++it) {
697  if (it->isNonnull()) genParticleEmbedded_.push_back(**it);
698  }
699  genParticleRef_.clear();
700  }
701 
702  template <class ObjectType>
703  std::vector<reco::GenParticleRef> PATObject<ObjectType>::genParticleRefs() const {
704  if (genParticleEmbedded_.empty()) return genParticleRef_;
705  std::vector<reco::GenParticleRef> ret(genParticleEmbedded_.size());
706  for (size_t i = 0, n = ret.size(); i < n; ++i) {
708  }
709  return ret;
710  }
711 
712  template <class ObjectType>
714  // get a vector, avoiding an unneeded copy if there is no embedding
715  const std::vector<reco::GenParticleRef> & vec = (genParticleEmbedded_.empty() ? genParticleRef_ : genParticleRefs());
716  for (std::vector<reco::GenParticleRef>::const_iterator ref = vec.begin(), end = vec.end(); ref != end; ++ref) {
717  if (ref->isNonnull()) {
718  const reco::GenParticle & g = **ref;
719  if ((status != 0) && (g.status() != status)) continue;
720  if (pdgId == 0) {
721  return *ref;
722  } else if (!autoCharge) {
723  if (pdgId == g.pdgId()) return *ref;
724  } else if (abs(pdgId) == abs(g.pdgId())) {
725  // I want pdgId > 0 to match "correct charge" (for charged particles)
726  if (g.charge() == 0) return *ref;
727  else if ((this->charge() == 0) && (pdgId == g.pdgId())) return *ref;
728  else if (g.charge()*this->charge()*pdgId > 0) return *ref;
729  }
730  }
731  }
732  return reco::GenParticleRef();
733  }
734 
735  template <class ObjectType>
737  auto match = std::lower_bound(overlapLabels_.cbegin(), overlapLabels_.cend(), label);
738  return ( match != overlapLabels_.end() && *match == label );
739  }
740 
741  template <class ObjectType>
743 
744  auto match = std::lower_bound(overlapLabels_.cbegin(), overlapLabels_.cend(), label);
745  if( match == overlapLabels_.cend() || *match != label ) return pat_statics::EMPTY_CPV;
747  }
748 
749  template <class ObjectType>
751 
752  auto match = std::lower_bound(overlapLabels_.begin(), overlapLabels_.end(), label);
753  const auto dist = std::distance(overlapLabels_.begin(),match);
754  if ( match == overlapLabels_.end() || *match != label ) {
755  overlapLabels_.insert(match,label);
756  overlapItems_.insert(overlapItems_.begin()+dist,overlaps);
757  } else {
758  overlapItems_[dist] = overlaps;
759  }
760  }
761 
762  template <class ObjectType>
764  {
765  auto it = std::lower_bound(userDataLabels_.cbegin(),userDataLabels_.cend(),key);
766  if ( it != userDataLabels_.cend() && *it == key) {
767  return &userDataObjects_[std::distance(userDataLabels_.cbegin(),it)];
768  }
769  return nullptr;
770  }
771 
772  template <class ObjectType>
773  void PATObject<ObjectType>::addUserDataObject_( const std::string & label, std::unique_ptr<pat::UserData> data, bool overwrite )
774  {
775  auto it = std::lower_bound(userDataLabels_.begin(), userDataLabels_.end(), label);
776  const auto dist = std::distance(userDataLabels_.begin(), it);
777  if( it == userDataLabels_.end() || *it != label ) {
778  userDataLabels_.insert(it,label);
780  } else if( overwrite ) {
781  userDataObjects_.set(dist, std::move(data));
782  } else {
783  //create a range by adding behind the first entry
784  userDataLabels_.insert(it+1,label);
786  }
787  }
788 
789 
790  template <class ObjectType>
792  {
793  auto it = std::lower_bound(userFloatLabels_.cbegin(),userFloatLabels_.cend(),key);
794  if( it != userFloatLabels_.cend() && *it == key ) {
795  return userFloats_[std::distance(userFloatLabels_.cbegin(),it)];
796  }
797  throwMissingLabel("UserFloat",key,userFloatLabels_);
798  return std::numeric_limits<float>::quiet_NaN();
799  }
800 
801  template<class ObjectType>
802  std::vector<float> PATObject<ObjectType>::userFloatRange( const std::string& key ) const {
803  auto range = std::equal_range(userFloatLabels_.cbegin(),userFloatLabels_.cend(),key);
804  std::vector<float> result;
805  result.reserve(std::distance(range.first,range.second));
806  for( auto it = range.first; it != range.second; ++it ) {
807  result.push_back(userFloats_[std::distance(userFloatLabels_.cbegin(),it)]);
808  }
809  return result;
810  }
811 
812  template <class ObjectType>
814  float data,
815  const bool overwrite )
816  {
817  auto it = std::lower_bound(userFloatLabels_.begin(),userFloatLabels_.end(),label);
818  const auto dist = std::distance(userFloatLabels_.begin(),it);
819  if( it == userFloatLabels_.end() || *it != label ) {
820  userFloatLabels_.insert(it,label);
821  userFloats_.insert(userFloats_.begin()+dist,data);
822  } else if( overwrite ) {
823  userFloats_[ dist ] = data;
824  } else {
825  //create a range by adding behind the first entry
826  userFloatLabels_.insert(it+1,label);
827  userFloats_.insert(userFloats_.begin()+dist+1, data);
828  }
829  }
830 
831 
832  template <class ObjectType>
834  {
835  auto it = std::lower_bound(userIntLabels_.cbegin(), userIntLabels_.cend(), key);
836  if ( it != userIntLabels_.cend() && *it == key ) {
837  return userInts_[std::distance(userIntLabels_.cbegin(),it)];
838  }
839  throwMissingLabel("UserInt",key,userIntLabels_);
841  }
842 
843  template<class ObjectType>
844  std::vector<int> PATObject<ObjectType>::userIntRange( const std::string& key ) const{
845  auto range = std::equal_range(userIntLabels_.cbegin(),userIntLabels_.cend(),key);
846  std::vector<int> result;
847  result.reserve(std::distance(range.first,range.second));
848  for( auto it = range.first; it != range.second; ++it ) {
849  result.push_back(userInts_[std::distance(userIntLabels_.cbegin(),it)]);
850  }
851  return result;
852  }
853 
854  template <class ObjectType>
856  int data,
857  bool overwrite )
858  {
859  auto it = std::lower_bound(userIntLabels_.begin(),userIntLabels_.end(),label);
860  const auto dist = std::distance(userIntLabels_.begin(),it);
861  if( it == userIntLabels_.end() || *it != label ) {
862  userIntLabels_.insert(it,label);
863  userInts_.insert(userInts_.begin()+dist,data);
864  } else if( overwrite ) {
865  userInts_[dist] = data;
866  } else {
867  //create a range by adding behind the first entry
868  userIntLabels_.insert(it+1, label);
869  userInts_.insert(userInts_.begin()+dist+1,data);
870  }
871  }
872 
873  template <class ObjectType>
875  {
876  auto it = std::lower_bound(userCandLabels_.cbegin(), userCandLabels_.cend(), key);
877  if (it != userCandLabels_.cend()) {
878  return userCands_[std::distance(userCandLabels_.begin(),it)];
879  }
880  return reco::CandidatePtr();
881  }
882 
883  template <class ObjectType>
885  const reco::CandidatePtr & data,
886  const bool overwrite )
887  {
888  auto it = std::lower_bound(userCandLabels_.begin(),userCandLabels_.end(),label);
889  const auto dist = std::distance(userCandLabels_.begin(),it);
890  if( it == userCandLabels_.end() || *it != label ) {
891  userCandLabels_.insert(it,label);
892  userCands_.insert(userCands_.begin()+dist,data);
893  } else if( overwrite ) {
894  userCands_[dist] = data;
895  } else {
896  userCandLabels_.insert(it+1,label);
897  userCands_.insert(userCands_.begin()+dist+1,data);
898  }
899  }
900 
901 
902  template <class ObjectType>
904  const bool has_unlabelled = (kinResolutionLabels_.size()+1 == kinResolutions_.size());
905  if (label.empty()) {
906  if ( has_unlabelled ) {
907  return kinResolutions_[0];
908  } else {
909  throw cms::Exception("Missing Data", "This object does not contain an un-labelled kinematic resolution");
910  }
911  } else {
912  auto match = std::lower_bound(kinResolutionLabels_.cbegin(), kinResolutionLabels_.cend(), label);
913  const auto dist = std::distance(kinResolutionLabels_.begin(),match);
914  const size_t increment = ( has_unlabelled ? 1 : 0 );
915  if ( match == kinResolutionLabels_.end() || *match != label ) {
916  cms::Exception ex("Missing Data");
917  ex << "This object does not contain a kinematic resolution with name '" << label << "'.\n";
918  ex << "The known labels are: " ;
919  for (std::vector<std::string>::const_iterator it = kinResolutionLabels_.cbegin(); it != kinResolutionLabels_.cend(); ++it) {
920  ex << "'" << *it << "' ";
921  }
922  ex << "\n";
923  throw ex;
924  } else {
925  return kinResolutions_[dist+increment];
926  }
927  }
928  }
929 
930  template <class ObjectType>
932  if (label.empty()) {
933  return (kinResolutionLabels_.size()+1 == kinResolutions_.size());
934  } else {
935  auto match = std::lower_bound(kinResolutionLabels_.cbegin(), kinResolutionLabels_.cend(), label);
936  return ( match != kinResolutionLabels_.cend() && *match == label );
937  }
938  }
939 
940  template <class ObjectType>
942  const bool has_unlabelled = (kinResolutionLabels_.size()+1 == kinResolutions_.size());
943  if (label.empty()) {
944  if (has_unlabelled) {
945  // There is already an un-labelled object. Replace it
946  kinResolutions_[0] = resol;
947  } else {
948  // Insert. Note that the un-labelled is always the first, so we need to insert before begin()
949  // (for an empty vector, this should not cost more than push_back)
950  kinResolutions_.insert(kinResolutions_.begin(), resol);
951  }
952  } else {
953  auto match = std::lower_bound(kinResolutionLabels_.begin(), kinResolutionLabels_.end(), label);
954  const auto dist = std::distance(kinResolutionLabels_.begin(),match);
955  const size_t increment = ( has_unlabelled ? 1 : 0 );
956  if ( match != kinResolutionLabels_.end() && *match == label ) {
957  // Existing object: replace
958  kinResolutions_[dist+increment] = resol;
959  } else {
960  kinResolutionLabels_.insert(match,label);
961  kinResolutions_.insert(kinResolutions_.begin()+dist+increment,resol);
962  }
963  }
964  }
965 
966 
967 
968 
969 }
970 
971 #endif
size
Write out results.
std::vector< std::string > efficiencyNames_
vector of the efficiencies (names)
Definition: PATObject.h:429
const TriggerObjectStandAlone * triggerObjectMatchByCollection(const std::string &coll, const size_t idx=0) const
get one matched trigger object from a certain collection by index
Definition: PATObject.h:539
~PATObject() override
destructor
Definition: PATObject.h:63
bool hasUserFloat(const char *key) const
a CINT-friendly interface
Definition: PATObject.h:339
int pdgId() const final
PDG identifier.
void addUserCand(const std::string &label, const reco::CandidatePtr &data, const bool overwrite=false)
Set user-defined int.
Definition: PATObject.h:884
bool hasOverlaps(const std::string &label) const
Returns true if there was at least one overlap for this test label.
Definition: PATObject.h:736
const TriggerObjectStandAlone * triggerObjectMatchByPath(const std::string &namePath, const unsigned pathLastFilterAccepted, const unsigned pathL3FilterAccepted=1, const size_t idx=0) const
Definition: PATObject.h:196
void addUserDataObject_(const std::string &label, std::unique_ptr< pat::UserData > value, bool overwrite=false)
Definition: PATObject.h:773
def addGenParticleRef(patMuonProducer, label='classByHitsGlbOrTrk')
const TriggerObjectStandAlone * triggerObjectMatchByAlgorithm(const char *nameAlgorithm, const bool algoCondAccepted=true, const size_t idx=0) const
Definition: PATObject.h:144
bool hasPathName(const std::string &pathName, bool pathLastFilterAccepted=false, bool pathL3FilterAccepted=true) const
Checks, if a certain HLT path name is assigned.
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:253
std::vector< std::pair< std::string, pat::LookupTableRecord > > efficiencies() const
Returns the efficiencies as <name,value> pairs (by value)
Definition: PATObject.h:644
const TriggerObjectStandAlone * triggerObjectMatchByPath(const char *namePath, const unsigned pathLastFilterAccepted, const unsigned pathL3FilterAccepted=1, const size_t idx=0) const
Definition: PATObject.h:200
const TriggerObjectStandAlone * triggerObjectMatchByAlgorithm(const char *nameAlgorithm, const unsigned algoCondAccepted, const size_t idx=0) const
Definition: PATObject.h:152
double resolPhi(const LorentzVector &p4) const
Resolution on phi, given the 4-momentum of the associated Candidate.
static const HistoName names[]
std::vector< reco::GenParticleRef > genParticleRef_
Reference to a generator level particle.
Definition: PATObject.h:432
bool hasKinResolution(const std::string &label="") const
Check if the kinematic resolutions are stored into this object (possibly specifying a label for them)...
Definition: PATObject.h:931
reco::GenParticleRef genParticleRef(size_t idx=0) const
Definition: PATObject.h:225
const reco::GenParticle * genParticle(size_t idx=0) const
Definition: PATObject.h:244
PATObject()
default constructor
Definition: PATObject.h:467
double resolP(const std::string &label="") const
Resolution on p, possibly with a label to specify which resolution to use.
Definition: PATObject.h:396
const TriggerObjectStandAlone * triggerObjectMatchByFilterID(const unsigned triggerObjectType, const size_t idx=0) const
Definition: PATObject.h:96
T const * get() const
Returns C++ pointer to the item.
Definition: Ptr.h:159
size_t genParticlesSize() const
Number of generator level particles stored as ref or embedded.
Definition: PATObject.h:249
std::vector< reco::CandidatePtr > userCands_
Definition: PATObject.h:452
const TriggerObjectStandAloneCollection triggerObjectMatchesByPath(const char *namePath, const unsigned pathLastFilterAccepted, const unsigned pathL3FilterAccepted=1) const
Definition: PATObject.h:182
edm::Ref< GenParticleCollection > GenParticleRef
persistent reference to a GenParticle
bool isAvailable() const
Definition: Ptr.h:258
Class to store the result of a lookup table fetch, e.g. for efficiencies.
const TriggerObjectStandAloneCollection triggerObjectMatchesByFilter(const std::string &labelFilter) const
get all matched HLT objects used in a certain HLT filter
Definition: PATObject.h:592
double resolPInv(const std::string &label="") const
Resolution on 1/p, possibly with a label to specify which resolution to use.
Definition: PATObject.h:402
bool hasUserFloat(const std::string &key) const
Return true if there is a user-defined float with a given name.
Definition: PATObject.h:334
int charge() const final
electric charge
Definition: LeafCandidate.h:91
std::vector< pat::CandKinResolution > kinResolutions_
Kinematic resolutions.
Definition: PATObject.h:455
double resolPz(const std::string &label="") const
Resolution on pz, possibly with a label to specify which resolution to use.
Definition: PATObject.h:411
const TriggerObjectStandAlone * triggerObjectMatchByCondition(const char *nameCondition, const size_t idx=0) const
Definition: PATObject.h:120
bool hasUserCand(const std::string &key) const
Return true if there is a user-defined int with a given name.
Definition: PATObject.h:364
void addUserFloat(const std::string &label, float data, const bool overwrite=false)
Set user-defined float.
Definition: PATObject.h:813
std::vector< std::string > userCandLabels_
Definition: PATObject.h:451
std::vector< TriggerObjectStandAlone > TriggerObjectStandAloneCollection
Collection of TriggerObjectStandAlone.
void setGenParticle(const reco::GenParticle &particle)
Set the generator level particle from a particle not in the Event (embedding it, of course) ...
Definition: PATObject.h:687
std::vector< reco::GenParticleRef > genParticleRefs() const
Definition: PATObject.h:703
std::vector< float > userFloatRange(const std::string &key) const
return a range of values corresponding to key
Definition: PATObject.h:802
void setEfficiency(const std::string &name, const pat::LookupTableRecord &value)
Definition: PATObject.h:655
TriggerObjectStandAloneCollection triggerObjectMatchesEmbedded_
vector of trigger matches
Definition: PATObject.h:424
void setGenParticleRef(const reco::GenParticleRef &ref, bool embed=false)
Set the generator level particle reference.
Definition: PATObject.h:671
bool hasCollection(const std::string &collName) const override
Checks, if a certain label of original collection is assigned (method overrides)
std::vector< std::string > userDataLabels_
User data object.
Definition: PATObject.h:442
std::vector< reco::GenParticle > genParticleEmbedded_
vector to hold an embedded generator level particle
Definition: PATObject.h:434
const std::vector< std::string > & userCandNames() const
Get list of user-defined cand names.
Definition: PATObject.h:362
The Signals That Services Can Subscribe To This is based on ActivityRegistry and is current per Services can connect to the signals distributed by the ActivityRegistry in order to monitor the activity of the application Each possible callback has some defined which we here list in angle e g
Definition: Activities.doc:4
const std::vector< pat::LookupTableRecord > & efficiencyValues() const
Returns the list of the values of the stored efficiencies (the ordering is the same as in efficiencyN...
Definition: PATObject.h:217
std::vector< float > userFloats_
Definition: PATObject.h:446
float userFloat(const std::string &key) const
Definition: PATObject.h:791
#define embed
Definition: AMPTWrapper.h:178
Definition: HeavyIon.h:7
void setKinResolution(const pat::CandKinResolution &resol, const std::string &label="")
Add a kinematic resolution to this object (possibly with a label)
Definition: PATObject.h:941
iterator begin()
Definition: OwnVector.h:244
void unpackTriggerObjectPathNames(const edm::TriggerNames &names)
unpack path names of matched trigger objects (if they were packed before embedding, which is not normally the case)
Definition: PATObject.h:206
bool hasUserInt(const std::string &key) const
Return true if there is a user-defined int with a given name.
Definition: PATObject.h:351
bool hasAlgorithmName(const std::string &algorithmName, bool algoCondAccepted=true) const
Checks, if a certain L1 algorithm name is assigned.
double resolPt(const std::string &label="") const
Resolution on pt, possibly with a label to specify which resolution to use.
Definition: PATObject.h:399
const reco::CandidatePtrVector & overlaps(const std::string &label) const
Definition: PATObject.h:742
const TriggerObjectStandAlone * triggerObjectMatchByAlgorithm(const std::string &nameAlgorithm, const bool algoCondAccepted=true, const size_t idx=0) const
Definition: PATObject.h:581
double resolPz(const LorentzVector &p4) const
Resolution on pz, given the 4-momentum of the associated Candidate.
const TriggerObjectStandAlone * triggerObjectMatchByFilter(const std::string &labelFilter, const size_t idx=0) const
get one matched HLT object used in a certain HLT filter by index
Definition: PATObject.h:601
std::vector< pat::LookupTableRecord > efficiencyValues_
vector of the efficiencies (values)
Definition: PATObject.h:427
double resolPy(const std::string &label="") const
Resolution on py, possibly with a label to specify which resolution to use.
Definition: PATObject.h:408
double resolEt(const std::string &label="") const
Resolution on et, possibly with a label to specify which resolution to use.
Definition: PATObject.h:393
double resolPx(const std::string &label="") const
Resolution on px, possibly with a label to specify which resolution to use.
Definition: PATObject.h:405
double resolP(const LorentzVector &p4) const
Resolution on p, given the 4-momentum of the associated Candidate.
void embedGenParticle()
Definition: PATObject.h:694
double resolPy(const LorentzVector &p4) const
Resolution on py, given the 4-momentum of the associated Candidate.
const TriggerObjectStandAlone * triggerObjectMatchByPath(const char *namePath, const bool pathLastFilterAccepted=false, const bool pathL3FilterAccepted=true, const size_t idx=0) const
Definition: PATObject.h:192
static const std::string EMPTY_STR("")
virtual const std::string & typeName() const =0
Human readable name of the concrete type of stored data.
double p4[4]
Definition: TauolaWrapper.h:92
bool isNull() const
Checks for null.
Definition: Ptr.h:164
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double resolEta(const LorentzVector &p4) const
Resolution on eta, given the 4-momentum of the associated Candidate.
std::vector< std::string > userFloatLabels_
Definition: PATObject.h:445
void throwMissingLabel(const std::string &what, const std::string &bad_label, const std::vector< std::string > &available)
const TriggerObjectStandAlone * triggerObjectMatch(const size_t idx=0) const
get one matched trigger object by index
Definition: PATObject.h:503
void set(size_t i, D *&d)
Definition: OwnVector.h:322
const T * userData(const std::string &key) const
Returns user-defined data. Returns NULL if the data is not present, or not of type T...
Definition: PATObject.h:280
const TriggerObjectStandAlone * triggerObjectMatchByFilter(const char *labelFilter, const size_t idx=0) const
Definition: PATObject.h:164
#define end
Definition: vmac.h:37
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:245
Definition: value.py:1
const TriggerObjectStandAloneCollection triggerObjectMatchesByPath(const std::string &namePath, const bool pathLastFilterAccepted=false, const bool pathL3FilterAccepted=true) const
Definition: PATObject.h:612
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
Definition: HCMethods.h:49
double resolPhi(const std::string &label="") const
Resolution on phi, possibly with a label to specify which resolution to use.
Definition: PATObject.h:387
const edm::Ptr< reco::Candidate > & originalObjectRef() const
reference to original object. Returns a null reference if not available
Definition: PATObject.h:500
const TriggerObjectStandAlone * triggerObjectMatchByPath(const std::string &namePath, const bool pathLastFilterAccepted=false, const bool pathL3FilterAccepted=true, const size_t idx=0) const
Definition: PATObject.h:621
const TriggerObjectStandAloneCollection triggerObjectMatchesByCondition(const char *nameCondition) const
Definition: PATObject.h:114
bool hasUserData(const std::string &key) const
Check if user data with a specific type is present.
Definition: PATObject.h:286
void addUserInt(const std::string &label, int32_t data, const bool overwrite=false)
Set user-defined int.
Definition: PATObject.h:855
double resolE(const std::string &label="") const
Resolution on energy, possibly with a label to specify which resolution to use.
Definition: PATObject.h:390
const TriggerObjectStandAloneCollection triggerObjectMatchesByPath(const char *namePath, const bool pathLastFilterAccepted=false, const bool pathL3FilterAccepted=true) const
Definition: PATObject.h:174
bool hasTriggerObjectType(trigger::TriggerObjectType triggerObjectType) const
Checks, if a certain trigger object type identifier is assigned.
const TriggerObjectStandAloneCollection triggerObjectMatchesByAlgorithm(const std::string &nameAlgorithm, const bool algoCondAccepted=true) const
Definition: PATObject.h:572
ObjectType base_type
Definition: PATObject.h:52
const TriggerObjectStandAloneCollection triggerObjectMatchesByAlgorithm(const char *nameAlgorithm, const bool algoCondAccepted=true) const
Definition: PATObject.h:128
double resolM(const LorentzVector &p4) const
std::vector< reco::CandidatePtrVector > overlapItems_
Overlapping items (sorted by distance)
Definition: PATObject.h:439
std::vector< std::string > kinResolutionLabels_
Definition: PATObject.h:458
void setOverlaps(const std::string &label, const reco::CandidatePtrVector &overlaps)
Definition: PATObject.h:750
const TriggerObjectStandAloneCollection triggerObjectMatchesByFilterID(const unsigned triggerObjectType) const
Definition: PATObject.h:87
void addGenParticleRef(const reco::GenParticleRef &ref)
Definition: PATObject.h:678
edm::Ptr< Candidate > CandidatePtr
persistent reference to an object in a collection of Candidate objects
Definition: CandidateFwd.h:25
double resolPInv(const LorentzVector &p4) const
Resolution on 1/p, given the 4-momentum of the associated Candidate.
pat::UserDataCollection userDataObjects_
Definition: PATObject.h:443
const TriggerObjectStandAloneCollection triggerObjectMatchesByCollection(const std::string &coll) const
get all matched trigger objects from a certain collection
Definition: PATObject.h:530
double resolPx(const LorentzVector &p4) const
Resolution on px, given the 4-momentum of the associated Candidate.
JetCorrectorParametersCollection coll
Definition: classes.h:10
const TriggerObjectStandAloneCollection triggerObjectMatchesByAlgorithm(const std::string &nameAlgorithm, const unsigned algoCondAccepted) const
Definition: PATObject.h:132
const pat::UserData * userDataObject_(const std::string &key) const
Definition: PATObject.h:763
bool hasFilterLabel(const std::string &filterLabel) const
Checks, if a certain HLT filter label is assigned.
bool hasConditionName(const std::string &conditionName) const
Checks, if a certain L1 condition name is assigned.
virtual UserData * clone() const =0
Necessary for deep copy in OwnVector.
int32_t userInt(const std::string &key) const
Definition: PATObject.h:833
const TriggerObjectStandAlone * triggerObjectMatchByType(const unsigned triggerObjectType, const size_t idx=0) const
Definition: PATObject.h:92
void addTriggerObjectMatch(const TriggerObjectStandAlone &trigObj)
add a trigger match
Definition: PATObject.h:204
const std::vector< std::string > & userDataNames() const
Get list of user data object names.
Definition: PATObject.h:295
const TriggerObjectStandAlone * triggerObjectMatchByAlgorithm(const std::string &nameAlgorithm, const unsigned algoCondAccepted, const size_t idx=0) const
Definition: PATObject.h:148
const TriggerObjectStandAloneCollection & triggerObjectMatches() const
get all matched trigger objects
Definition: PATObject.h:77
const void * userDataBare(const std::string &key) const
Definition: PATObject.h:299
reco::CandidatePtr userCand(const std::string &key) const
Definition: PATObject.h:874
const TriggerObjectStandAlone * triggerObjectMatchByCollection(const char *coll, const size_t idx=0) const
Definition: PATObject.h:108
const TriggerObjectStandAloneCollection triggerObjectMatchesByType(const unsigned triggerObjectType) const
Definition: PATObject.h:83
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
const TriggerObjectStandAlone * triggerObjectMatchByCondition(const std::string &nameCondition, const size_t idx=0) const
get one matched L1 object used in a succeeding object combination of a certain L1 condition by index ...
Definition: PATObject.h:561
double resolE(const LorentzVector &p4) const
Resolution on energy, given the 4-momentum of the associated Candidate.
const TriggerObjectStandAloneCollection triggerObjectMatchesByType(const trigger::TriggerObjectType triggerObjectType) const
Definition: PATObject.h:510
const TriggerObjectStandAloneCollection triggerObjectMatchesByCollection(const char *coll) const
Definition: PATObject.h:102
const TriggerObjectStandAloneCollection triggerObjectMatchesByCondition(const std::string &nameCondition) const
get all matched L1 objects used in a succeeding object combination of a certain L1 condition ...
Definition: PATObject.h:552
float userFloat(const char *key) const
a CINT-friendly interface
Definition: PATObject.h:327
int status() const final
status word
const pat::LookupTableRecord & efficiency(const std::string &name) const
Returns an efficiency given its name.
Definition: PATObject.h:633
const TriggerObjectStandAloneCollection triggerObjectMatchesByPath(const std::string &namePath, const unsigned pathLastFilterAccepted, const unsigned pathL3FilterAccepted=1) const
Definition: PATObject.h:178
const reco::Candidate * originalObject() const
access to the original object; returns zero for null Ref and throws for unavailable collection ...
Definition: PATObject.h:487
Templated PAT object container.
Definition: PATObject.h:49
const pat::CandKinResolution & getKinResolution(const std::string &label="") const
Definition: PATObject.h:903
const TriggerObjectStandAlone * triggerObjectMatchByType(const trigger::TriggerObjectType triggerObjectType, const size_t idx=0) const
get one matched trigger object of a certain type by index
Definition: PATObject.h:519
double resolTheta(const std::string &label="") const
Resolution on theta, possibly with a label to specify which resolution to use.
Definition: PATObject.h:384
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
Base class for data that users can add to pat objects.
Definition: UserData.h:24
std::vector< int > userIntRange(const std::string &key) const
returns a range of values corresponding to key
Definition: PATObject.h:844
std::vector< std::string > overlapLabels_
Overlapping test labels (only if there are any overlaps)
Definition: PATObject.h:437
double resolEt(const LorentzVector &p4) const
Resolution on et, given the 4-momentum of the associated Candidate.
const std::vector< std::string > & userFloatNames() const
Get list of user-defined float names.
Definition: PATObject.h:332
double resolPt(const LorentzVector &p4) const
Resolution on pt, given the 4-momentum of the associated Candidate.
static const reco::CandidatePtrVector EMPTY_CPV
Definition: PATObject.h:44
std::vector< int32_t > userInts_
Definition: PATObject.h:449
const TriggerObjectStandAloneCollection triggerObjectMatchesByFilter(const char *labelFilter) const
Definition: PATObject.h:158
long double T
const std::vector< std::string > & userIntNames() const
Get list of user-defined int names.
Definition: PATObject.h:349
void insert(const_iterator i, D *&d)
Definition: OwnVector.h:357
const TriggerObjectStandAloneCollection triggerObjectMatchesByAlgorithm(const char *nameAlgorithm, const unsigned algoCondAccepted) const
Definition: PATObject.h:136
edm::Ptr< reco::Candidate > refToOrig_
Definition: PATObject.h:421
void addUserData(const std::string &label, const T &data, bool transientOnly=false, bool overwrite=false)
Definition: PATObject.h:309
double resolM(const std::string &label="") const
Definition: PATObject.h:415
reco::GenParticleRef genParticleById(int pdgId, int status, uint8_t autoCharge=0) const
Definition: PATObject.h:713
def move(src, dest)
Definition: eostools.py:510
void addUserDataFromPtr(const std::string &label, const edm::Ptr< pat::UserData > &data, bool overwrite=false)
Definition: PATObject.h:316
const void * bareData() const
Definition: UserData.h:49
T get(const Candidate &c)
Definition: component.h:55
double resolEta(const std::string &label="") const
Resolution on eta, possibly with a label to specify which resolution to use.
Definition: PATObject.h:381
const std::string & userDataObjectType(const std::string &key) const
Get human-readable type of user data object, for debugging.
Definition: PATObject.h:290
const std::vector< std::string > & efficiencyNames() const
Returns the list of the names of the stored efficiencies.
Definition: PATObject.h:215
Analysis-level trigger object class (stand-alone)
double resolTheta(const LorentzVector &p4) const
Resolution on theta, given the 4-momentum of the associated Candidate.
std::vector< std::string > userIntLabels_
Definition: PATObject.h:448
const std::vector< std::string > & overlapLabels() const
Returns the labels of the overlap tests that found at least one overlap.
Definition: PATObject.h:273