TriggerObject

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
#ifndef DataFormats_PatCandidates_TriggerObject_h
#define DataFormats_PatCandidates_TriggerObject_h

// -*- C++ -*-
//
// Package:    PatCandidates
// Class:      pat::TriggerObject
//
//
/**
  \class    pat::TriggerObject TriggerObject.h "DataFormats/PatCandidates/interface/TriggerObject.h"
  \brief    Analysis-level trigger object class

   TriggerObject implements a container for trigger objects' information within the 'pat' namespace.
   For detailed information, consult
   https://twiki.cern.ch/twiki/bin/view/CMS/SWGuidePATTrigger#TriggerObject

  \author   Volker Adler
*/

#include "DataFormats/Candidate/interface/LeafCandidate.h"

#include <map>
#include <string>
#include <vector>
#include <algorithm>

#include "DataFormats/L1Trigger/interface/L1EmParticle.h"
#include "DataFormats/L1Trigger/interface/L1EmParticleFwd.h"
#include "DataFormats/L1Trigger/interface/L1EtMissParticle.h"
#include "DataFormats/L1Trigger/interface/L1EtMissParticleFwd.h"
#include "DataFormats/L1Trigger/interface/L1JetParticle.h"
#include "DataFormats/L1Trigger/interface/L1JetParticleFwd.h"
#include "DataFormats/L1Trigger/interface/L1MuonParticle.h"
#include "DataFormats/L1Trigger/interface/L1MuonParticleFwd.h"
#include "DataFormats/HLTReco/interface/TriggerTypeDefs.h"
#include "DataFormats/HLTReco/interface/TriggerObject.h"
#include "DataFormats/Common/interface/RefVectorIterator.h"
#include "DataFormats/Common/interface/Association.h"
#include "FWCore/Utilities/interface/InputTag.h"

namespace pat {

  class TriggerObject : public reco::LeafCandidate {
    /// Data Members

    /// Label of the collection the trigger object originates from
    std::string collection_;
    /// Vector of special identifiers for the trigger object type as defined in
    /// trigger::TriggerObjectType (DataFormats/HLTReco/interface/TriggerTypeDefs.h),
    /// possibly empty
    std::vector<trigger::TriggerObjectType> triggerObjectTypes_;
    /// Reference to trigger object,
    /// meant for 'l1extra' particles to access their additional functionalities,
    /// empty otherwise
    reco::CandidateBaseRef refToOrig_;

  public:
    /// Constructors and Destructor

    /// Default constructor
    TriggerObject();
    /// Constructor from trigger::TriggerObject
    TriggerObject(const trigger::TriggerObject& trigObj);
    /// Constructors from base class object
    TriggerObject(const reco::LeafCandidate& leafCand);
    /// Constructors from base candidate reference (for 'l1extra' particles)
    TriggerObject(const reco::CandidateBaseRef& candRef);
    /// Constructors from Lorentz-vectors and (optional) PDG ID
    TriggerObject(const reco::Particle::LorentzVector& vec, int id = 0);
    TriggerObject(const reco::Particle::PolarLorentzVector& vec, int id = 0);

    /// Destructor
    ~TriggerObject() override {}

    /// Methods

    /// Set the label of the collection the trigger object originates from
    void setCollection(const std::string& collName) { collection_ = collName; };
    void setCollection(const edm::InputTag& collName) { collection_ = collName.encode(); };
    /// Add a new trigger object type identifier
    void addTriggerObjectType(trigger::TriggerObjectType triggerObjectType) {
      if (!hasTriggerObjectType(triggerObjectType))
        triggerObjectTypes_.push_back(triggerObjectType);
    };
    void addTriggerObjectType(int triggerObjectType) {
      addTriggerObjectType(trigger::TriggerObjectType(triggerObjectType));
    };
    void addFilterId(trigger::TriggerObjectType triggerObjectType) {
      addTriggerObjectType(triggerObjectType);
    };  // for backward compatibility
    void addFilterId(int triggerObjectType) {
      addTriggerObjectType(trigger::TriggerObjectType(triggerObjectType));
    };  // for backward compatibility
    /// Get the label of the collection the trigger object originates from
    const std::string& collection() const { return collection_; };
    /// Get all trigger object type identifiers
    //       std::vector< trigger::TriggerObjectType > triggerObjectTypes() const { return triggerObjectTypes_; };
    //       std::vector< trigger::TriggerObjectType > filterIds()          const { return triggerObjectTypes(); }; // for backward compatibility
    std::vector<int> triggerObjectTypes() const;                          // for backward compatibility
    std::vector<int> filterIds() const { return triggerObjectTypes(); };  // for double backward compatibility
    /// Checks, if a certain label of original collection is assigned
    virtual bool hasCollection(const std::string& collName) const;
    virtual bool hasCollection(const edm::InputTag& collName) const { return hasCollection(collName.encode()); };
    /// Checks, if a certain trigger object type identifier is assigned
    bool hasTriggerObjectType(trigger::TriggerObjectType triggerObjectType) const;
    bool hasTriggerObjectType(int triggerObjectType) const {
      return hasTriggerObjectType(trigger::TriggerObjectType(triggerObjectType));
    };
    bool hasFilterId(trigger::TriggerObjectType triggerObjectType) const {
      return hasTriggerObjectType(triggerObjectType);
    };  // for backward compatibility
    bool hasFilterId(int triggerObjectType) const {
      return hasTriggerObjectType(trigger::TriggerObjectType(triggerObjectType));
    };  // for backward compatibility

    /// Special methods for 'l1extra' particles

    /// General getters
    const reco::CandidateBaseRef& origObjRef() const { return refToOrig_; };
    const reco::Candidate* origObjCand() const { return refToOrig_.get(); };
    /// Getters specific to the 'l1extra' particle type for
    /// - EM
    const l1extra::L1EmParticleRef origL1EmRef() const;
    const L1GctEmCand* origL1GctEmCand() const {
      return origL1EmRef().isNonnull() ? origL1EmRef()->gctEmCand() : nullptr;
    };
    /// - EtMiss
    const l1extra::L1EtMissParticleRef origL1EtMissRef() const;
    const L1GctEtMiss* origL1GctEtMiss() const {
      return origL1EtMissRef().isNonnull() ? origL1EtMissRef()->gctEtMiss() : nullptr;
    };
    const L1GctEtTotal* origL1GctEtTotal() const {
      return origL1EtMissRef().isNonnull() ? origL1EtMissRef()->gctEtTotal() : nullptr;
    };
    const L1GctHtMiss* origL1GctHtMiss() const {
      return origL1EtMissRef().isNonnull() ? origL1EtMissRef()->gctHtMiss() : nullptr;
    };
    const L1GctEtHad* origL1GctEtHad() const {
      return origL1EtMissRef().isNonnull() ? origL1EtMissRef()->gctEtHad() : nullptr;
    };
    /// - Jet
    const l1extra::L1JetParticleRef origL1JetRef() const;
    const L1GctJetCand* origL1GctJetCand() const {
      return origL1JetRef().isNonnull() ? origL1JetRef()->gctJetCand() : nullptr;
    };
    /// - Muon
    const l1extra::L1MuonParticleRef origL1MuonRef() const;
    const L1MuGMTExtendedCand* origL1GmtMuonCand() const {
      return origL1MuonRef().isNonnull() ? &(origL1MuonRef()->gmtMuonCand()) : nullptr;
    };

    /// Special methods for the cut string parser
    /// - argument types usable in the cut string parser
    /// - short names for readable configuration files

    /// Calls 'hasCollection(...)'
    virtual bool coll(const std::string& collName) const { return hasCollection(collName); };
    /// Calls 'hasTriggerObjectType(...)'
    bool type(trigger::TriggerObjectType triggerObjectType) const { return hasTriggerObjectType(triggerObjectType); };
    bool type(int triggerObjectType) const {
      return hasTriggerObjectType(trigger::TriggerObjectType(triggerObjectType));
    };
    bool id(trigger::TriggerObjectType triggerObjectType) const {
      return hasTriggerObjectType(triggerObjectType);
    };  // for backward compatibility
    bool id(int triggerObjectType) const {
      return hasTriggerObjectType(trigger::TriggerObjectType(triggerObjectType));
    };  // for backward compatibility
  };

  /// Collection of TriggerObject
  typedef std::vector<TriggerObject> TriggerObjectCollection;
  /// Persistent reference to an item in a TriggerObjectCollection
  typedef edm::Ref<TriggerObjectCollection> TriggerObjectRef;
  /// Container to store match references from different producers (for one PAT object)
  typedef std::map<std::string, TriggerObjectRef> TriggerObjectMatchMap;
  /// Persistent reference to a TriggerObjectCollection product
  typedef edm::RefProd<TriggerObjectCollection> TriggerObjectRefProd;
  /// Vector of persistent references to items in the same TriggerObjectCollection
  typedef edm::RefVector<TriggerObjectCollection> TriggerObjectRefVector;
  /// Const iterator over vector of persistent references to items in the same TriggerObjectCollection
  typedef edm::RefVectorIterator<TriggerObjectCollection> TriggerObjectRefVectorIterator;
  /// Association of TriggerObjects to store matches to Candidates
  typedef edm::Association<TriggerObjectCollection> TriggerObjectMatch;
  /// Persistent reference to a TriggerObjectMatch product
  typedef edm::RefProd<TriggerObjectMatch> TriggerObjectMatchRefProd;
  /// Container to store references to matches from different producers in the trigger event
  typedef std::map<std::string, TriggerObjectMatchRefProd> TriggerObjectMatchContainer;

}  // namespace pat

#endif