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
#include "DQMOffline/L1Trigger/interface/L1TCommon.h"
#include "DataFormats/Math/interface/deltaR.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"

#include <iostream>

namespace dqmoffline {
  namespace l1t {

    std::vector<unsigned int> getTriggerIndices(const std::vector<std::string> &requestedTriggers,
                                                const std::vector<std::string> &triggersInEvent) {
      std::vector<unsigned int> triggerIndices;

      for (const auto &requestedTriggerName : requestedTriggers) {
        std::string name(requestedTriggerName);
        std::size_t wildcarPosition = name.find('*');
        if (wildcarPosition != std::string::npos) {
          // take everything up to the wildcard
          name = name.substr(0, wildcarPosition - 1);
        }

        unsigned int triggerIndex = 0;
        for (const auto &triggerName : triggersInEvent) {
          if (triggerName.find(name) != std::string::npos) {
            triggerIndices.push_back(triggerIndex);
            break;
          }
          ++triggerIndex;
        }
      }
      return triggerIndices;
    }

    std::vector<bool> getTriggerResults(const std::vector<unsigned int> &triggers,
                                        const edm::TriggerResults &triggerResults) {
      std::vector<bool> results;
      results.resize(triggers.size());

      for (unsigned int index = 0; index < triggers.size(); ++index) {
        if (triggers[index] >= triggerResults.size()) {
          results[index] = false;
          continue;
        }

        if (triggerResults.accept(triggers[index])) {
          results[index] = true;
        } else {
          results[index] = false;
        }
      }
      return results;
    }

    std::vector<unsigned int> getFiredTriggerIndices(const std::vector<unsigned int> &triggers,
                                                     const std::vector<bool> &triggerResults) {
      std::vector<unsigned int> results;
      // std::copy_if instead?
      for (unsigned int i = 0; i < triggerResults.size(); ++i) {
        if (triggerResults[i]) {
          results.push_back(triggers[i]);
        }
      }
      return results;
    }

    bool passesAnyTriggerFromList(const std::vector<unsigned int> &triggers,
                                  const edm::TriggerResults &triggerResults) {
      std::vector<bool> results = dqmoffline::l1t::getTriggerResults(triggers, triggerResults);
      if (std::count(results.begin(), results.end(), true) == 0) {
        return false;
      }
      return true;
    }

    trigger::TriggerObjectCollection getTriggerObjects(const std::vector<edm::InputTag> &hltFilters,
                                                       const trigger::TriggerEvent &triggerEvent) {
      trigger::TriggerObjectCollection triggerObjects = triggerEvent.getObjects();
      trigger::TriggerObjectCollection results;

      for (const auto &filter : hltFilters) {
        const unsigned filterIndex = triggerEvent.filterIndex(filter);

        if (filterIndex < triggerEvent.sizeFilters()) {
          const trigger::Keys &triggerKeys(triggerEvent.filterKeys(filterIndex));
          const size_t nTriggers = triggerEvent.filterIds(filterIndex).size();
          for (size_t i = 0; i < nTriggers; ++i) {
            results.push_back(triggerObjects[triggerKeys[i]]);
          }
        }
      }
      // sort by ET
      typedef trigger::TriggerObject trigObj;
      std::sort(results.begin(), results.end(), [](const trigObj &obj1, const trigObj &obj2) {
        return obj1.et() > obj2.et();
      });
      return results;
    }

    std::vector<edm::InputTag> getHLTFilters(const std::vector<unsigned int> &triggers,
                                             const HLTConfigProvider &hltConfig,
                                             const std::string triggerProcess) {
      std::vector<edm::InputTag> results;
      for (auto trigger : triggers) {
        // For some reason various modules now come *after* "hltBoolEnd"
        // Really just want module one index before "hltBoolEnd" - AWB 2022.09.28
        unsigned int moduleIndex = 999999;
        for (int ii = 0; ii < int(hltConfig.size(trigger)); ii++) {
          if (hltConfig.moduleLabels(trigger)[ii] == "hltBoolEnd") {
            moduleIndex = ii - 1;
            break;
          }
        }
        if (moduleIndex == 999999) {
          edm::LogError("L1TCommon") << " Found no module label in trigger " << trigger << std::endl;
          continue;
        }
        const std::vector<std::string> &modules(hltConfig.moduleLabels(trigger));
        const std::string &module(modules[moduleIndex]);
        edm::InputTag filterInputTag = edm::InputTag(module, "", triggerProcess);
        results.push_back(filterInputTag);
      }
      return results;
    }

    trigger::TriggerObjectCollection getMatchedTriggerObjects(double eta,
                                                              double phi,
                                                              double maxDeltaR,
                                                              const trigger::TriggerObjectCollection triggerObjects) {
      trigger::TriggerObjectCollection results;
      typedef trigger::TriggerObject trigObj;
      std::copy_if(
          triggerObjects.begin(),
          triggerObjects.end(),
          std::back_inserter(results),
          [eta, phi, maxDeltaR](const trigObj &obj) { return deltaR(obj.eta(), obj.phi(), eta, phi) < maxDeltaR; });
      return results;
    }

  }  // namespace l1t
}  // namespace dqmoffline