File indexing completed on 2023-03-17 10:58:27
0001 #ifndef DQMOFFLINE_TRIGGER_EGHLTTRIGTOOLS
0002 #define DQMOFFLINE_TRIGGER_EGHLTTRIGTOOLS
0003
0004 #include "DQMOffline/Trigger/interface/EgHLTTrigCodes.h"
0005 #include "DataFormats/HLTReco/interface/TriggerEvent.h"
0006 #include "DataFormats/Common/interface/Handle.h"
0007 #include "DataFormats/Math/interface/deltaR.h"
0008 #include <vector>
0009
0010 class HLTConfigProvider;
0011
0012 namespace egHLT {
0013
0014 namespace trigTools {
0015 TrigCodes::TrigBitSet getFiltersPassed(const std::vector<std::pair<std::string, int> >& filters,
0016 const trigger::TriggerEvent* trigEvt,
0017 const std::string& hltTag,
0018 const TrigCodes& trigCodes);
0019
0020 template <class T>
0021 void setFiltersObjPasses(std::vector<T>& objs,
0022 const std::vector<std::string>& filters,
0023 const std::vector<std::pair<std::string, std::string> >& l1PreAndSeedFilters,
0024 const TrigCodes::TrigBitSet& evtTrigBits,
0025 const TrigCodes& trigCodes,
0026 const trigger::TriggerEvent* trigEvt,
0027 const std::string& hltTag);
0028
0029 template <class T, class U>
0030 void fillHLTposition(T& obj,
0031 U& hltData,
0032 const std::vector<std::string>& filters,
0033 const trigger::TriggerEvent* trigEvt,
0034 const std::string& hltTag);
0035 std::vector<int> getMinNrObjsRequiredByFilter(
0036 const std::vector<std::string>& filterName);
0037
0038
0039 void getActiveFilters(const HLTConfigProvider& hltConfig,
0040 std::vector<std::string>& activeFilters,
0041 std::vector<std::string>& activeEleFilters,
0042 std::vector<std::string>& activeEle2LegFilters,
0043 std::vector<std::string>& activePhoFilters,
0044 std::vector<std::string>& activePho2LegFilters);
0045
0046
0047
0048
0049 void filterInactiveTriggers(std::vector<std::string>& namesToFilter, std::vector<std::string>& activeFilters);
0050
0051 void filterInactiveTightLooseTriggers(std::vector<std::string>& namesToFilter,
0052 const std::vector<std::string>& activeFilters);
0053
0054 void translateFiltersToPathNames(const HLTConfigProvider& hltConfig,
0055 const std::vector<std::string>& filters,
0056 std::vector<std::string>& paths);
0057 std::string getL1SeedFilterOfPath(const HLTConfigProvider& hltConfig, const std::string& path);
0058
0059
0060
0061 float getEtThresFromName(const std::string& trigName);
0062 float getSecondEtThresFromName(const std::string& trigName);
0063 }
0064
0065
0066
0067
0068
0069
0070
0071 template <class T>
0072 void trigTools::setFiltersObjPasses(std::vector<T>& particles,
0073 const std::vector<std::string>& filters,
0074 const std::vector<std::pair<std::string, std::string> >& l1PreAndSeedFilters,
0075 const TrigCodes::TrigBitSet& evtTrigBits,
0076 const TrigCodes& trigCodes,
0077 const trigger::TriggerEvent* trigEvt,
0078 const std::string& hltTag) {
0079 std::vector<TrigCodes::TrigBitSet> partTrigBits(particles.size());
0080 const double maxDeltaR = 0.1;
0081 for (const auto& filter : filters) {
0082 size_t filterNrInEvt = trigEvt->filterIndex(edm::InputTag(filter, "", hltTag));
0083 const TrigCodes::TrigBitSet filterCode = trigCodes.getCode(filter.c_str());
0084
0085 if (filterNrInEvt < trigEvt->sizeFilters()) {
0086 const trigger::Keys& trigKeys = trigEvt->filterKeys(
0087 filterNrInEvt);
0088 const trigger::TriggerObjectCollection& trigObjColl(trigEvt->getObjects());
0089 for (size_t partNr = 0; partNr < particles.size(); partNr++) {
0090 for (unsigned short trigKey : trigKeys) {
0091 float trigObjEta = trigObjColl[trigKey].eta();
0092 float trigObjPhi = trigObjColl[trigKey].phi();
0093 if (reco::deltaR(particles[partNr].eta(), particles[partNr].phi(), trigObjEta, trigObjPhi) < maxDeltaR) {
0094 partTrigBits[partNr] |= filterCode;
0095 }
0096 }
0097 }
0098 }
0099 }
0100
0101
0102 for (const auto& l1PreAndSeedFilter : l1PreAndSeedFilters) {
0103 const TrigCodes::TrigBitSet filterCode = trigCodes.getCode(l1PreAndSeedFilter.first.c_str());
0104 if ((filterCode & evtTrigBits) == filterCode) {
0105
0106 size_t filterNrInEvt = trigEvt->filterIndex(edm::InputTag(l1PreAndSeedFilter.second, "", hltTag));
0107
0108 if (filterNrInEvt < trigEvt->sizeFilters()) {
0109 const trigger::Keys& trigKeys = trigEvt->filterKeys(
0110 filterNrInEvt);
0111 const trigger::TriggerObjectCollection& trigObjColl(trigEvt->getObjects());
0112 for (size_t partNr = 0; partNr < particles.size(); partNr++) {
0113 for (unsigned short trigKey : trigKeys) {
0114 float trigObjEta = trigObjColl[trigKey].eta();
0115 float trigObjPhi = trigObjColl[trigKey].phi();
0116 if (reco::deltaR(particles[partNr].eta(), particles[partNr].phi(), trigObjEta, trigObjPhi) < maxDeltaR) {
0117 partTrigBits[partNr] |= filterCode;
0118 }
0119 }
0120 }
0121 }
0122 }
0123 }
0124
0125 for (size_t partNr = 0; partNr < particles.size(); partNr++)
0126 particles[partNr].setTrigBits(partTrigBits[partNr]);
0127 }
0128
0129 template <class T, class U>
0130 void trigTools::fillHLTposition(T& particle,
0131 U& hltData,
0132 const std::vector<std::string>& filters,
0133 const trigger::TriggerEvent* trigEvt,
0134 const std::string& hltTag) {
0135 std::vector<TrigCodes::TrigBitSet> partTrigBits(1);
0136 const double maxDeltaR = 0.1;
0137 for (const auto& filter : filters) {
0138 size_t filterNrInEvt = trigEvt->filterIndex(edm::InputTag(filter, "", hltTag));
0139
0140 if (filterNrInEvt < trigEvt->sizeFilters()) {
0141 const trigger::Keys& trigKeys = trigEvt->filterKeys(
0142 filterNrInEvt);
0143 const trigger::TriggerObjectCollection& trigObjColl(trigEvt->getObjects());
0144 for (unsigned short trigKey : trigKeys) {
0145 float trigObjEta = trigObjColl[trigKey].eta();
0146 float trigObjPhi = trigObjColl[trigKey].phi();
0147 float trigObjE = trigObjColl[trigKey].energy();
0148 if (reco::deltaR(particle.superCluster()->eta(), particle.superCluster()->phi(), trigObjEta, trigObjPhi) <
0149 maxDeltaR) {
0150 hltData.HLTeta = trigObjEta;
0151 hltData.HLTphi = trigObjPhi;
0152 hltData.HLTenergy = trigObjE;
0153 }
0154 }
0155 }
0156 }
0157 }
0158
0159 }
0160
0161 #endif