Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-15 23:25:03

0001 #ifndef L1TGlobalProducer_h
0002 #define L1TGlobalProducer_h
0003 
0004 // Emulator for L1T Global
0005 // author: Brian Winer  Ohio State
0006 
0007 #include <string>
0008 #include <vector>
0009 #include <iostream>
0010 #include <fstream>
0011 
0012 #include "FWCore/Framework/interface/Frameworkfwd.h"
0013 #include "FWCore/Framework/interface/stream/EDProducer.h"
0014 #include "FWCore/Framework/interface/Event.h"
0015 #include "FWCore/Framework/interface/EventSetup.h"
0016 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0017 #include "FWCore/Utilities/interface/InputTag.h"
0018 #include "FWCore/Utilities/interface/ESGetToken.h"
0019 
0020 #include "L1Trigger/L1TGlobal/interface/GlobalBoard.h"
0021 
0022 #include "CondFormats/L1TObjects/interface/L1TGlobalParameters.h"
0023 #include "L1Trigger/L1TGlobal/interface/GlobalParamsHelper.h"
0024 #include "L1Trigger/L1TGlobal/interface/PrescalesVetosFractHelper.h"
0025 #include "CondFormats/L1TObjects/interface/L1TUtmTriggerMenu.h"
0026 #include "CondFormats/DataRecord/interface/L1TUtmTriggerMenuRcd.h"
0027 #include "CondFormats/L1TObjects/interface/L1TGlobalParameters.h"
0028 #include "CondFormats/DataRecord/interface/L1TGlobalParametersRcd.h"
0029 #include "CondFormats/L1TObjects/interface/L1TGlobalPrescalesVetosFract.h"
0030 #include "CondFormats/DataRecord/interface/L1TGlobalPrescalesVetosFractRcd.h"
0031 
0032 class L1TGlobalParameters;
0033 class L1GtParameters;
0034 class L1GtBoardMaps;
0035 
0036 class L1GtPrescaleFactors;
0037 class L1GtTriggerMask;
0038 
0039 class TriggerMenu;
0040 
0041 // class declaration
0042 
0043 class L1TGlobalProducer : public edm::stream::EDProducer<> {
0044 public:
0045   explicit L1TGlobalProducer(const edm::ParameterSet&);
0046   ~L1TGlobalProducer() override = default;
0047 
0048   void beginRun(edm::Run const& iRun, const edm::EventSetup& iEventSetup) override;
0049 
0050   void produce(edm::Event& iEvent, const edm::EventSetup& iEventSetup) override;
0051 
0052   static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0053 
0054 private:
0055   // trigger menu
0056   std::unique_ptr<TriggerMenu> m_l1GtMenu;
0057   L1TUtmTriggerMenu const* m_utml1GtMenu;
0058 
0059   // number of physics triggers
0060   unsigned int m_numberPhysTriggers;
0061 
0062   // number of DAQ partitions
0063   unsigned int m_numberDaqPartitions;
0064 
0065   // number of objects of each type
0066   int m_nrL1Mu;
0067   int m_nrL1MuShower;
0068   int m_nrL1EG;
0069   int m_nrL1Tau;
0070 
0071   int m_nrL1Jet;
0072 
0073   // ... the rest of the objects are global
0074   int m_ifMuEtaNumberBits;
0075   int m_ifCaloEtaNumberBits;
0076 
0077   ///    total number of Bx's in the event coming from EventSetup
0078   int m_totalBxInEvent;
0079 
0080   ///    active boards in L1 GT DAQ record
0081   uint16_t m_activeBoardsGtDaq;
0082 
0083   /// length of BST record (in bytes) from event setup
0084   unsigned int m_bstLengthBytes;
0085 
0086   /// board maps - cache only the record
0087   const L1GtBoardMaps* m_l1GtBM;
0088   unsigned long long m_l1GtBMCacheID;
0089 
0090   /// prescale factors
0091   const l1t::PrescalesVetosFractHelper* m_l1GtPrescalesVetosFract;
0092   unsigned long long m_l1GtPfAlgoCacheID;
0093 
0094   const std::vector<std::vector<double>>* m_prescaleFactorsAlgoTrig;
0095   std::vector<std::vector<double>> m_initialPrescaleFactorsAlgoTrig;
0096 
0097   /// trigger masks & veto masks
0098   const L1GtTriggerMask* m_l1GtTmAlgo;
0099   unsigned long long m_l1GtTmAlgoCacheID;
0100 
0101   const L1GtTriggerMask* m_l1GtTmVetoAlgo;
0102   unsigned long long m_l1GtTmVetoAlgoCacheID;
0103 
0104   const std::vector<unsigned int>* m_triggerMaskAlgoTrig;
0105   std::vector<unsigned int> m_initialTriggerMaskAlgoTrig;
0106 
0107   const std::vector<int>* m_triggerMaskVetoAlgoTrig;
0108   std::vector<int> m_initialTriggerMaskVetoAlgoTrig;
0109 
0110   std::unique_ptr<l1t::GlobalBoard> m_uGtBrd;
0111 
0112   /// input tag for muon collection from the Global Muon Trigger (GMT)
0113   edm::InputTag m_muInputTag;
0114   edm::InputTag m_muShowerInputTag;
0115   edm::EDGetTokenT<BXVector<l1t::Muon>> m_muInputToken;
0116   edm::EDGetTokenT<BXVector<l1t::MuonShower>> m_muShowerInputToken;
0117 
0118   /// input tag for calorimeter collections from Calo Layer 2 (GCT) or Zero Degree Calorimeter (ZDC)
0119   edm::InputTag m_egInputTag;
0120   edm::InputTag m_tauInputTag;
0121   edm::InputTag m_jetInputTag;
0122   edm::InputTag m_sumInputTag;
0123   edm::InputTag m_sumZdcInputTag;
0124   edm::InputTag m_CICADAInputTag;
0125   edm::EDGetTokenT<BXVector<l1t::EGamma>> m_egInputToken;
0126   edm::EDGetTokenT<BXVector<l1t::Tau>> m_tauInputToken;
0127   edm::EDGetTokenT<BXVector<l1t::Jet>> m_jetInputToken;
0128   edm::EDGetTokenT<BXVector<l1t::EtSum>> m_sumInputToken;
0129   edm::EDGetTokenT<BXVector<l1t::EtSum>> m_sumZdcInputToken;
0130   edm::EDGetTokenT<BXVector<float>> m_CICADAInputToken;
0131 
0132   /// input tag for external conditions
0133   edm::InputTag m_extInputTag;
0134   edm::EDGetTokenT<BXVector<GlobalExtBlk>> m_extInputToken;
0135 
0136   /// logical flag to produce the L1 GT DAQ readout record
0137   bool m_produceL1GtDaqRecord;
0138 
0139   /// logical flag to produce the L1 GT object map record
0140   bool m_produceL1GtObjectMapRecord;
0141 
0142   /// logical flag to write the PSB content in the  L1 GT DAQ record
0143   bool m_writePsbL1GtDaqRecord;
0144 
0145   /// number of "bunch crossing in the event" (BxInEvent) to be emulated
0146   /// symmetric around L1Accept (BxInEvent = 0):
0147   ///    1 (BxInEvent = 0); 3 (F 0 1) (standard record); 5 (E F 0 1 2) (debug record)
0148   /// even numbers (except 0) "rounded" to the nearest lower odd number
0149   int m_emulateBxInEvent;
0150 
0151   /// Bx expected in Data coming to GT
0152   int m_L1DataBxInEvent;
0153 
0154   /// alternative for number of BX per active board in GT DAQ record: 0 or 1
0155   /// the position is identical with the active board bit
0156   unsigned int m_alternativeNrBxBoardDaq;
0157 
0158   /// length of BST record (in bytes) from parameter set
0159   int m_psBstLengthBytes;
0160 
0161   /// prescale set used
0162   unsigned int m_prescaleSet;
0163 
0164   /// run algorithm triggers
0165   ///     if true, unprescaled (all prescale factors 1)
0166   ///     will overwrite the event setup
0167   bool m_algorithmTriggersUnprescaled;
0168 
0169   ///     if true, unmasked - all enabled (all trigger masks set to 0)
0170   ///     will overwrite the event setup
0171   bool m_algorithmTriggersUnmasked;
0172 
0173   /// verbosity level
0174   int m_verbosity;
0175   bool m_printL1Menu;
0176   bool m_isDebugEnabled;
0177 
0178   bool m_getPrescaleColumnFromData;
0179   bool m_requireMenuToMatchAlgoBlkInput;
0180   edm::InputTag m_algoblkInputTag;
0181   edm::EDGetTokenT<BXVector<GlobalAlgBlk>> m_algoblkInputToken;
0182 
0183   edm::ESGetToken<L1TGlobalParameters, L1TGlobalParametersRcd> m_l1GtStableParToken;
0184   edm::ESGetToken<L1TUtmTriggerMenu, L1TUtmTriggerMenuRcd> m_l1GtMenuToken;
0185   edm::ESGetToken<L1TGlobalPrescalesVetosFract, L1TGlobalPrescalesVetosFractRcd> m_l1GtPrescaleVetosToken;
0186 
0187   // disables resetting the prescale counters each lumisection (needed for offline)
0188   bool m_resetPSCountersEachLumiSec;
0189 
0190   // initialise prescale counters with a semi-random value in the range [0, prescale*10^precision - 1];
0191   // if false, the prescale counters are initialised to zero
0192   bool m_semiRandomInitialPSCounters;
0193 
0194   // switch to load muon showers in the global board
0195   bool m_useMuonShowers;
0196 
0197   //switch to save axo scores in global board
0198   bool m_produceAXOL1TLScore;
0199 };
0200 
0201 #endif  // L1TGlobalProducer_h