TriggerEvent

TriggerFilterObject

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
#ifndef HLTReco_TriggerEvent_h
#define HLTReco_TriggerEvent_h

/** \class trigger::TriggerEvent
 *
 *  The single EDProduct to be saved for each event (AOD case)
 *  describing the (HLT) trigger table
 *
 *
 *  \author Martin Grunewald
 *
 */

#include "DataFormats/HLTReco/interface/TriggerTypeDefs.h"
#include "DataFormats/HLTReco/interface/TriggerObject.h"
#include "FWCore/Utilities/interface/InputTag.h"
#include "DataFormats/Common/interface/traits.h"
#include <string>
#include <string_view>
#include <vector>
#include <cassert>

namespace trigger {

  /// The single EDProduct to be saved for each event (AOD case)
  class TriggerEvent : public edm::DoNotRecordParents {
  public:
    /// Helper class: recording trigger objects firing a single filter
    class TriggerFilterObject {
    public:
      /// encoded InputTag of filter product
      std::string filterTag_;
      /// physics object type as per filter
      Vids filterIds_;
      /// indices pointing into collection of unique TriggerObjects
      Keys filterKeys_;
      /// constructors
      TriggerFilterObject() : filterTag_(), filterIds_(), filterKeys_() { filterTag_ = edm::InputTag().encode(); }
      TriggerFilterObject(const edm::InputTag& filterTag)
          : filterTag_(filterTag.encode()), filterIds_(), filterKeys_() {}
      TriggerFilterObject(const edm::InputTag& filterTag, const Vids& filterIds, const Keys& filterKeys)
          : filterTag_(filterTag.encode()), filterIds_(filterIds), filterKeys_(filterKeys) {}
    };

    /// data members
  private:
    /// processName used to select products packed up
    std::string usedProcessName_;
    /// Input tags of packed up collections
    std::vector<std::string> collectionTags_;
    /// 1-past-end indices into linearised vector
    Keys collectionKeys_;
    /// collection of all unique physics objects (linearised vector)
    TriggerObjectCollection triggerObjects_;
    /// collection of all TriggerFilterObjects
    std::vector<TriggerFilterObject> triggerFilters_;

    ///methods
  public:
    /// constructors
    TriggerEvent() : usedProcessName_(), collectionTags_(), collectionKeys_(), triggerObjects_(), triggerFilters_() {}
    TriggerEvent(const std::string& usedProcessName, trigger::size_type nc, trigger::size_type no, trigger::size_type nf)
        : usedProcessName_(usedProcessName),
          collectionTags_(),
          collectionKeys_(),
          triggerObjects_(),
          triggerFilters_() {
      collectionTags_.reserve(nc);
      collectionKeys_.reserve(nc);
      triggerObjects_.reserve(no);
      triggerFilters_.reserve(nf);
    }

    /// setters
    void addObjects(const TriggerObjectCollection& triggerObjects) {
      triggerObjects_.insert(triggerObjects_.end(), triggerObjects.begin(), triggerObjects.end());
    }

    void addCollections(const std::vector<edm::InputTag>& collectionTags, const Keys& collectionKeys) {
      assert(collectionTags.size() == collectionKeys.size());
      const trigger::size_type n(collectionTags.size());
      for (trigger::size_type i = 0; i != n; ++i) {
        collectionTags_.push_back(collectionTags[i].encode());
      }
      collectionKeys_.insert(collectionKeys_.end(), collectionKeys.begin(), collectionKeys.end());
    }

    void addCollections(const std::vector<std::string>& collectionTags, const Keys& collectionKeys) {
      assert(collectionTags.size() == collectionKeys.size());
      collectionTags_.insert(collectionTags_.end(), collectionTags.begin(), collectionTags.end());
      collectionKeys_.insert(collectionKeys_.end(), collectionKeys.begin(), collectionKeys.end());
    }

    void addFilter(const edm::InputTag& filterTag, const Vids& filterIds, const Keys& filterKeys) {
      triggerFilters_.push_back(TriggerFilterObject(filterTag, filterIds, filterKeys));
    }

    /// getters
    const std::string& usedProcessName() const { return usedProcessName_; }
    const std::vector<std::string>& collectionTags() const { return collectionTags_; }
    const Keys& collectionKeys() const { return collectionKeys_; }
    const TriggerObjectCollection& getObjects() const { return triggerObjects_; }

    const edm::InputTag collectionTag(trigger::size_type index) const {
      return edm::InputTag(collectionTags_.at(index));
    }
    const std::string& collectionTagEncoded(trigger::size_type index) const { return collectionTags_.at(index); }
    trigger::size_type collectionKey(trigger::size_type index) const { return collectionKeys_.at(index); }
    const edm::InputTag filterTag(trigger::size_type index) const {
      return edm::InputTag(triggerFilters_.at(index).filterTag_);
    }
    const std::string& filterTagEncoded(trigger::size_type index) const { return triggerFilters_.at(index).filterTag_; }
    std::string_view filterLabel(trigger::size_type index) const {
      std::string_view tag = triggerFilters_.at(index).filterTag_;
      auto const idx = tag.find(':');
      return (idx == tag.npos ? tag : tag.substr(0, idx));
    }
    const Vids& filterIds(trigger::size_type index) const { return triggerFilters_.at(index).filterIds_; }
    const Keys& filterKeys(trigger::size_type index) const { return triggerFilters_.at(index).filterKeys_; }

    /// find index of collection from collection tag
    trigger::size_type collectionIndex(const edm::InputTag& collectionTag) const {
      const std::string encodedCollectionTag(collectionTag.encode());
      const trigger::size_type n(collectionTags_.size());
      for (trigger::size_type i = 0; i != n; ++i) {
        if (encodedCollectionTag == collectionTags_[i]) {
          return i;
        }
      }
      return n;
    }
    /// find index of filter in data-member vector from filter tag
    trigger::size_type filterIndex(const edm::InputTag& filterTag) const {
      const std::string encodedFilterTag(filterTag.encode());
      const trigger::size_type n(triggerFilters_.size());
      for (trigger::size_type i = 0; i != n; ++i) {
        if (encodedFilterTag == triggerFilters_[i].filterTag_) {
          return i;
        }
      }
      return n;
    }

    /// other
    trigger::size_type sizeCollections() const { return collectionTags_.size(); }
    trigger::size_type sizeObjects() const { return triggerObjects_.size(); }
    trigger::size_type sizeFilters() const { return triggerFilters_.size(); }
  };

}  // namespace trigger

#endif