Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-03-17 11:16:06

0001 // -*- C++ -*-
0002 //
0003 // Package:    PhysicsTools/NanoAOD
0004 // Class:      L1TriggerResultsConverter
0005 //
0006 /**\class L1TriggerResultsConverter L1TriggerResultsConverter.cc PhysicsTools/L1TriggerResultsConverter/plugins/L1TriggerResultsConverter.cc
0007 
0008  Description: [one line class summary]
0009 
0010  Implementation:
0011      [Notes on implementation]
0012 */
0013 //
0014 // Original Author:  Andrea Rizzi
0015 //         Created:  Mon, 11 Aug 2017 11:20:30 GMT
0016 //
0017 //
0018 
0019 // system include files
0020 #include <memory>
0021 #include <algorithm>
0022 
0023 // user include files
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 // class declaration
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   // ----------member data ---------------------------
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 // constructors and destructor
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   // do anything here that needs to be done at destruction time
0096   // (e.g. close files, deallocate resources etc.)
0097 }
0098 
0099 //
0100 // member functions
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 // ------------ method called to produce the data  ------------
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     // Legacy access
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   //mimic HLT trigger bits for L1
0162   auto out = std::make_unique<edm::TriggerResults>(l1bitsAsHLTStatus, names_);
0163   iEvent.put(std::move(out));
0164 }
0165 
0166 // ------------ method fills 'descriptions' with the allowed parameters for the module  ------------
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 //define this as a plug-in
0180 DEFINE_FWK_MODULE(L1TriggerResultsConverter);