File indexing completed on 2023-03-17 11:16:06
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <memory>
0021 #include <algorithm>
0022
0023
0024 #include "FWCore/Framework/interface/Frameworkfwd.h"
0025 #include "FWCore/Framework/interface/stream/EDProducer.h"
0026 #include "FWCore/Framework/interface/ESHandle.h"
0027 #include "CondFormats/DataRecord/interface/L1GtTriggerMenuRcd.h"
0028 #include "CondFormats/DataRecord/interface/L1GtTriggerMaskAlgoTrigRcd.h"
0029 #include "CondFormats/L1TObjects/interface/L1GtTriggerMenu.h"
0030 #include "CondFormats/L1TObjects/interface/L1GtTriggerMask.h"
0031 #include "CondFormats/L1TObjects/interface/L1TUtmTriggerMenu.h"
0032 #include "CondFormats/DataRecord/interface/L1TUtmTriggerMenuRcd.h"
0033
0034 #include "DataFormats/L1TGlobal/interface/GlobalAlgBlk.h"
0035 #include "DataFormats/L1TGlobal/interface/GlobalExtBlk.h"
0036
0037 #include "FWCore/Framework/interface/Event.h"
0038 #include "FWCore/Framework/interface/MakerMacros.h"
0039
0040 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0041
0042 #include "FWCore/Common/interface/TriggerNames.h"
0043 #include "DataFormats/Common/interface/TriggerResults.h"
0044
0045 #include "L1Trigger/GlobalTriggerAnalyzer/interface/L1GtUtils.h"
0046
0047
0048
0049
0050 class L1TriggerResultsConverter : public edm::stream::EDProducer<> {
0051 public:
0052 explicit L1TriggerResultsConverter(const edm::ParameterSet&);
0053 ~L1TriggerResultsConverter() override;
0054
0055 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0056
0057 private:
0058 void produce(edm::Event&, const edm::EventSetup&) override;
0059 void beginRun(edm::Run const&, edm::EventSetup const&) override;
0060
0061
0062 const bool legacyL1_;
0063 const bool store_unprefireable_bit_;
0064 const edm::EDGetTokenT<L1GlobalTriggerReadoutRecord> tokenLegacy_;
0065 const edm::EDGetTokenT<GlobalAlgBlkBxCollection> token_;
0066 const edm::EDGetTokenT<GlobalExtBlkBxCollection> token_ext_;
0067 edm::ESGetToken<L1GtTriggerMenu, L1GtTriggerMenuRcd> l1gtmenuToken_;
0068 edm::ESGetToken<L1GtTriggerMask, L1GtTriggerMaskAlgoTrigRcd> l1gtalgoMaskToken_;
0069 edm::ESGetToken<L1TUtmTriggerMenu, L1TUtmTriggerMenuRcd> l1utmTrigToken_;
0070 std::vector<std::string> names_;
0071 std::vector<unsigned int> mask_;
0072 std::vector<unsigned int> indices_;
0073 };
0074
0075
0076
0077
0078 L1TriggerResultsConverter::L1TriggerResultsConverter(const edm::ParameterSet& params)
0079 : legacyL1_(params.getParameter<bool>("legacyL1")),
0080 store_unprefireable_bit_(!legacyL1_ ? params.getParameter<bool>("storeUnprefireableBit") : false),
0081 tokenLegacy_(legacyL1_ ? consumes<L1GlobalTriggerReadoutRecord>(params.getParameter<edm::InputTag>("src"))
0082 : edm::EDGetTokenT<L1GlobalTriggerReadoutRecord>()),
0083 token_(!legacyL1_ ? consumes<GlobalAlgBlkBxCollection>(params.getParameter<edm::InputTag>("src"))
0084 : edm::EDGetTokenT<GlobalAlgBlkBxCollection>()),
0085 token_ext_(store_unprefireable_bit_
0086 ? consumes<GlobalExtBlkBxCollection>(params.getParameter<edm::InputTag>("src_ext"))
0087 : edm::EDGetTokenT<GlobalExtBlkBxCollection>()),
0088 l1gtmenuToken_(esConsumes<edm::Transition::BeginRun>()),
0089 l1gtalgoMaskToken_(esConsumes<edm::Transition::BeginRun>()),
0090 l1utmTrigToken_(esConsumes<edm::Transition::BeginRun>()) {
0091 produces<edm::TriggerResults>();
0092 }
0093
0094 L1TriggerResultsConverter::~L1TriggerResultsConverter() {
0095
0096
0097 }
0098
0099
0100
0101
0102
0103 void L1TriggerResultsConverter::beginRun(edm::Run const&, edm::EventSetup const& setup) {
0104 mask_.clear();
0105 names_.clear();
0106 indices_.clear();
0107 if (legacyL1_) {
0108 auto const& mapping = setup.getHandle(l1gtmenuToken_)->gtAlgorithmAliasMap();
0109 for (auto const& keyval : mapping) {
0110 names_.push_back(keyval.first);
0111 indices_.push_back(keyval.second.algoBitNumber());
0112 }
0113 mask_ = setup.getHandle(l1gtalgoMaskToken_)->gtTriggerMask();
0114 } else {
0115 auto const& mapping = setup.getHandle(l1utmTrigToken_)->getAlgorithmMap();
0116 for (auto const& keyval : mapping) {
0117 names_.push_back(keyval.first);
0118 indices_.push_back(keyval.second.getIndex());
0119 }
0120 if (store_unprefireable_bit_)
0121 names_.push_back("L1_UnprefireableEvent");
0122 }
0123 }
0124
0125
0126
0127 void L1TriggerResultsConverter::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0128 const std::vector<bool>* wordp = nullptr;
0129 bool unprefireable_bit = false;
0130 if (!legacyL1_) {
0131 const auto& resultsProd = iEvent.get(token_);
0132 if (not resultsProd.isEmpty(0)) {
0133 wordp = &resultsProd.at(0, 0).getAlgoDecisionFinal();
0134 }
0135 if (store_unprefireable_bit_) {
0136 auto handleExtResults = iEvent.getHandle(token_ext_);
0137 if (handleExtResults.isValid()) {
0138 if (not handleExtResults->isEmpty(0)) {
0139 unprefireable_bit = handleExtResults->at(0, 0).getExternalDecision(GlobalExtBlk::maxExternalConditions - 1);
0140 }
0141 } else {
0142 LogDebug("Unprefirable bit not found, always set to false");
0143 }
0144 }
0145 } else {
0146
0147 const auto& resultsProd = iEvent.get(tokenLegacy_);
0148 wordp = &resultsProd.decisionWord();
0149 }
0150 edm::HLTGlobalStatus l1bitsAsHLTStatus(names_.size());
0151 unsigned indices_size = indices_.size();
0152 for (size_t nidx = 0; nidx < indices_size; nidx++) {
0153 unsigned int const index = indices_[nidx];
0154 bool result = wordp ? wordp->at(index) : false;
0155 if (not mask_.empty())
0156 result &= (mask_.at(index) != 0);
0157 l1bitsAsHLTStatus[nidx] = edm::HLTPathStatus(result ? edm::hlt::Pass : edm::hlt::Fail);
0158 }
0159 if (store_unprefireable_bit_)
0160 l1bitsAsHLTStatus[indices_size] = edm::HLTPathStatus(unprefireable_bit ? edm::hlt::Pass : edm::hlt::Fail);
0161
0162 auto out = std::make_unique<edm::TriggerResults>(l1bitsAsHLTStatus, names_);
0163 iEvent.put(std::move(out));
0164 }
0165
0166
0167 void L1TriggerResultsConverter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0168 edm::ParameterSetDescription desc;
0169 desc.add<bool>("legacyL1")->setComment("is legacy L1");
0170 desc.add<edm::InputTag>("src")->setComment(
0171 "L1 input (L1GlobalTriggerReadoutRecord if legacy, GlobalAlgBlkBxCollection otherwise)");
0172 desc.add<bool>("storeUnprefireableBit", false)
0173 ->setComment("Activate storage of L1 unprefireable bit (needs L1 external decision input)");
0174 desc.add<edm::InputTag>("src_ext", edm::InputTag(""))
0175 ->setComment("L1 external decision input (GlobalExtBlkBxCollection, only supported if not legacy");
0176 descriptions.add("L1TriggerResultsConverter", desc);
0177 }
0178
0179
0180 DEFINE_FWK_MODULE(L1TriggerResultsConverter);