Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:23:41

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_bits_;
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_bits_(!legacyL1_ ? params.getParameter<bool>("storeUnprefireableBits") : 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_bits_
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_bits_) {
0121       names_.push_back("L1_UnprefireableEvent_TriggerRules");
0122       names_.push_back("L1_UnprefireableEvent_FirstBxInTrain");
0123       names_.push_back("L1_FinalOR_BXmin1");
0124       names_.push_back("L1_FinalOR_BXmin2");
0125     }
0126   }
0127 }
0128 
0129 // ------------ method called to produce the data  ------------
0130 
0131 void L1TriggerResultsConverter::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
0132   const std::vector<bool>* wordp = nullptr;
0133   const std::vector<bool>* wordp_bxmin1 = nullptr;
0134   const std::vector<bool>* wordp_bxmin2 = nullptr;
0135   bool unprefireable_bit_triggerrules = false;
0136   bool unprefireable_bit_firstbxintrain = false;
0137   bool l1FinalOR_bxmin1 = false;
0138   bool l1FinalOR_bxmin2 = false;
0139 
0140   if (!legacyL1_) {
0141     const auto& resultsProd = iEvent.get(token_);
0142     if (not resultsProd.isEmpty(0)) {
0143       wordp = &resultsProd.at(0, 0).getAlgoDecisionFinal();
0144     }
0145     if (not resultsProd.isEmpty(-1)) {
0146       wordp_bxmin1 = &resultsProd.at(-1, 0).getAlgoDecisionFinal();
0147     }
0148     if (not resultsProd.isEmpty(-2)) {
0149       wordp_bxmin2 = &resultsProd.at(-2, 0).getAlgoDecisionFinal();
0150     }
0151     if (store_unprefireable_bits_) {
0152       auto handleExtResults = iEvent.getHandle(token_ext_);
0153       if (handleExtResults.isValid()) {
0154         if (not handleExtResults->isEmpty(0)) {
0155           //Stores the unprefirable event decision corresponding to trigger rules (e.g.: BX0 is unprefirable because BX-3 fired and therefore BX-2/-1 are masked).
0156           unprefireable_bit_triggerrules =
0157               handleExtResults->at(0, 0).getExternalDecision(GlobalExtBlk::maxExternalConditions - 1);
0158         }
0159       } else {
0160         LogDebug("Unprefirable bit (trigger rules) not found, always set to false");
0161       }
0162     }
0163   } else {
0164     // Legacy access
0165     const auto& resultsProd = iEvent.get(tokenLegacy_);
0166     wordp = &resultsProd.decisionWord();
0167   }
0168   edm::HLTGlobalStatus l1bitsAsHLTStatus(names_.size());
0169   unsigned indices_size = indices_.size();
0170   for (size_t nidx = 0; nidx < indices_size; nidx++) {
0171     unsigned int const index = indices_[nidx];
0172     bool result = wordp ? wordp->at(index) : false;
0173     bool result_bxmin1 = wordp_bxmin1 ? wordp_bxmin1->at(index) : false;
0174     bool result_bxmin2 = wordp_bxmin2 ? wordp_bxmin2->at(index) : false;
0175     if (not mask_.empty())
0176       result &= (mask_.at(index) != 0);
0177     l1bitsAsHLTStatus[nidx] = edm::HLTPathStatus(result ? edm::hlt::Pass : edm::hlt::Fail);
0178     //Stores the unprefirable event decision corresponding to events in the first bx of a train.
0179     //In 2022/2023 the bx before that was manually masked.
0180     //Technically this was done by enabling the L1_FirstBunchBeforeTrain bit in the L1 menu, and vetoing that bit after L1 Final OR is evaluated.
0181     if (!legacyL1_) {
0182       if (names_[nidx] == "L1_FirstBunchBeforeTrain")
0183         unprefireable_bit_firstbxintrain = result_bxmin1;
0184       //Checks if any other seed was fired in BX-1 or -2
0185       else if (result_bxmin1) {
0186         l1FinalOR_bxmin1 = true;
0187       } else if (result_bxmin2) {
0188         l1FinalOR_bxmin2 = true;
0189       }
0190     }
0191   }
0192   if (store_unprefireable_bits_) {
0193     l1bitsAsHLTStatus[indices_size] =
0194         edm::HLTPathStatus(unprefireable_bit_triggerrules ? edm::hlt::Pass : edm::hlt::Fail);
0195     l1bitsAsHLTStatus[indices_size + 1] =
0196         edm::HLTPathStatus(unprefireable_bit_firstbxintrain ? edm::hlt::Pass : edm::hlt::Fail);
0197     l1bitsAsHLTStatus[indices_size + 2] = edm::HLTPathStatus(l1FinalOR_bxmin1 ? edm::hlt::Pass : edm::hlt::Fail);
0198     l1bitsAsHLTStatus[indices_size + 3] = edm::HLTPathStatus(l1FinalOR_bxmin2 ? edm::hlt::Pass : edm::hlt::Fail);
0199   }
0200   //mimic HLT trigger bits for L1
0201   auto out = std::make_unique<edm::TriggerResults>(l1bitsAsHLTStatus, names_);
0202   iEvent.put(std::move(out));
0203 }
0204 
0205 // ------------ method fills 'descriptions' with the allowed parameters for the module  ------------
0206 void L1TriggerResultsConverter::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0207   edm::ParameterSetDescription desc;
0208   desc.add<bool>("legacyL1")->setComment("is legacy L1");
0209   desc.add<edm::InputTag>("src")->setComment(
0210       "L1 input (L1GlobalTriggerReadoutRecord if legacy, GlobalAlgBlkBxCollection otherwise)");
0211   desc.add<bool>("storeUnprefireableBits", false)
0212       ->setComment("Activate storage of L1 unprefireable bits (needs L1 external decision input)");
0213   desc.add<edm::InputTag>("src_ext", edm::InputTag(""))
0214       ->setComment("L1 external decision input (GlobalExtBlkBxCollection, only supported if not legacy");
0215   descriptions.add("L1TriggerResultsConverter", desc);
0216 }
0217 
0218 //define this as a plug-in
0219 DEFINE_FWK_MODULE(L1TriggerResultsConverter);