Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-03-17 10:55:13

0001 #ifndef L1TStage2CaloLayer1_H
0002 #define L1TStage2CaloLayer1_H
0003 
0004 // system include files
0005 #include <memory>
0006 #include <string>
0007 #include <array>
0008 #include <map>
0009 
0010 #include "DQMServices/Core/interface/DQMGlobalEDAnalyzer.h"
0011 
0012 // user include files
0013 #include "FWCore/Framework/interface/Frameworkfwd.h"
0014 
0015 #include "FWCore/Framework/interface/Event.h"
0016 #include "FWCore/Framework/interface/MakerMacros.h"
0017 
0018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0019 
0020 #include "FWCore/ServiceRegistry/interface/Service.h"
0021 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0022 
0023 #include "DQMServices/Core/interface/DQMStore.h"
0024 
0025 #include "DataFormats/EcalDigi/interface/EcalDigiCollections.h"
0026 #include "DataFormats/HcalDigi/interface/HcalDigiCollections.h"
0027 
0028 #include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
0029 
0030 #include "DataFormats/L1TCalorimeter/interface/CaloTower.h"
0031 
0032 namespace ComparisonHelper {
0033   // Designed for edm::SortedCollection<T>
0034   // Iterators should have a value type that derives from DetID, or
0035   // otherwise implements value_type::id().
0036   // Compare should be strict weak ordering (e.g. edm::SortedCollection<T>::key_compare)
0037   // Mostly http://www.cplusplus.com/reference/algorithm/set_union/
0038   // But with both collections saved in std::pair
0039   // Is this necessary? Absolutely not... but it was fun to make!
0040   template <class InputIterator1, class InputIterator2, class OutputIterator, class Compare>
0041   OutputIterator zip(InputIterator1 first1,
0042                      InputIterator1 last1,
0043                      InputIterator2 first2,
0044                      InputIterator2 last2,
0045                      OutputIterator result,
0046                      Compare comp) {
0047     typedef typename InputIterator1::value_type dummy1;
0048     typedef typename InputIterator2::value_type dummy2;
0049     while (first1 != last1 || first2 != last2) {
0050       if (first1 == last1) {
0051         while (first2 != last2) {
0052           *result = std::make_pair(dummy1{first2->id()}, *first2);
0053           ++first2;
0054           ++result;
0055         }
0056         return result;
0057       }
0058       if (first2 == last2) {
0059         while (first1 != last1) {
0060           *result = std::make_pair(*first1, dummy2{first1->id()});
0061           ++first1;
0062           ++result;
0063         }
0064         return result;
0065       }
0066       if (comp(*first1, *first2)) {
0067         *result = std::make_pair(*first1, dummy2{first1->id()});
0068         ++first1;
0069       } else if (comp(*first2, *first1)) {
0070         *result = std::make_pair(dummy1{first2->id()}, *first2);
0071         ++first2;
0072       } else {
0073         *result = std::make_pair(*first1, *first2);
0074         ++first1;
0075         ++first2;
0076       }
0077       ++result;
0078     }
0079     return result;
0080   }
0081 }  // namespace ComparisonHelper
0082 
0083 namespace CaloL1Information {
0084 
0085   struct monitoringDataHolder {
0086     dqm::reco::MonitorElement *ecalDiscrepancy_;
0087     dqm::reco::MonitorElement *ecalLinkError_;
0088     dqm::reco::MonitorElement *ecalOccupancy_;
0089     dqm::reco::MonitorElement *hcalDiscrepancy_;
0090     dqm::reco::MonitorElement *hcalLinkError_;
0091     dqm::reco::MonitorElement *hcalOccupancy_;
0092 
0093     dqm::reco::MonitorElement *ecalOccEtDiscrepancy_;
0094     dqm::reco::MonitorElement *ecalOccFgDiscrepancy_;
0095     dqm::reco::MonitorElement *ecalOccLinkMasked_;
0096     dqm::reco::MonitorElement *ecalOccRecdEtWgt_;
0097     dqm::reco::MonitorElement *ecalOccRecdFgVB_;
0098     dqm::reco::MonitorElement *ecalOccSentAndRecd_;
0099     dqm::reco::MonitorElement *ecalOccSentFgVB_;
0100     dqm::reco::MonitorElement *ecalOccSent_;
0101     dqm::reco::MonitorElement *ecalOccTowerMasked_;
0102     dqm::reco::MonitorElement *ecalTPRawEtCorrelation_;
0103     dqm::reco::MonitorElement *ecalTPRawEtDiffNoMatch_;
0104     dqm::reco::MonitorElement *ecalTPRawEtRecd_;
0105     dqm::reco::MonitorElement *ecalTPRawEtSentAndRecd_;
0106     dqm::reco::MonitorElement *ecalTPRawEtSent_;
0107 
0108     dqm::reco::MonitorElement *ecalOccSentNotRecd_;
0109     dqm::reco::MonitorElement *ecalOccRecdNotSent_;
0110     dqm::reco::MonitorElement *ecalOccNoMatch_;
0111 
0112     dqm::reco::MonitorElement *hcalOccEtDiscrepancy_;
0113     dqm::reco::MonitorElement *hcalOccLLPFbDiscrepancy_;
0114     dqm::reco::MonitorElement *hcalOccLLPFbExpd_;
0115     dqm::reco::MonitorElement *hcalOccLLPFbData_;
0116     dqm::reco::MonitorElement *hcalOccLinkMasked_;
0117     dqm::reco::MonitorElement *hcalOccRecdEtWgt_;
0118     dqm::reco::MonitorElement *hcalOccFg0Discrepancy_;
0119     dqm::reco::MonitorElement *hcalOccFg1Discrepancy_;
0120     dqm::reco::MonitorElement *hcalOccFg2Discrepancy_;
0121     dqm::reco::MonitorElement *hcalOccFg3Discrepancy_;
0122     dqm::reco::MonitorElement *hcalOccFg4Discrepancy_;
0123     dqm::reco::MonitorElement *hcalOccFg5Discrepancy_;
0124     dqm::reco::MonitorElement *hcalOccRecdFg0_;
0125     dqm::reco::MonitorElement *hcalOccRecdFg1_;
0126     dqm::reco::MonitorElement *hcalOccRecdFg2_;
0127     dqm::reco::MonitorElement *hcalOccRecdFg3_;
0128     dqm::reco::MonitorElement *hcalOccRecdFg4_;
0129     dqm::reco::MonitorElement *hcalOccRecdFg5_;
0130     dqm::reco::MonitorElement *hcalOccSentAndRecd_;
0131     dqm::reco::MonitorElement *hcalOccSentFg0_;
0132     dqm::reco::MonitorElement *hcalOccSentFg1_;
0133     dqm::reco::MonitorElement *hcalOccSentFg2_;
0134     dqm::reco::MonitorElement *hcalOccSentFg3_;
0135     dqm::reco::MonitorElement *hcalOccSentFg4_;
0136     dqm::reco::MonitorElement *hcalOccSentFg5_;
0137     dqm::reco::MonitorElement *hcalOccSent_;
0138     dqm::reco::MonitorElement *hcalOccTowerMasked_;
0139     dqm::reco::MonitorElement *hcalTPRawEtCorrelationHBHE_;
0140     dqm::reco::MonitorElement *hcalTPRawEtCorrelationHF_;
0141     dqm::reco::MonitorElement *hcalTPRawEtDiffNoMatch_;
0142     dqm::reco::MonitorElement *hcalTPRawEtRecd_;
0143     dqm::reco::MonitorElement *hcalTPRawEtSentAndRecd_;
0144     dqm::reco::MonitorElement *hcalTPRawEtSent_;
0145 
0146     dqm::reco::MonitorElement *hcalOccSentNotRecd_;
0147     dqm::reco::MonitorElement *hcalOccRecdNotSent_;
0148     dqm::reco::MonitorElement *hcalOccNoMatch_;
0149 
0150     dqm::reco::MonitorElement *ECALmismatchesPerBx_;
0151     dqm::reco::MonitorElement *HBHEmismatchesPerBx_;
0152     dqm::reco::MonitorElement *HFmismatchesPerBx_;
0153 
0154     dqm::reco::MonitorElement *bxidErrors_;
0155     dqm::reco::MonitorElement *l1idErrors_;
0156     dqm::reco::MonitorElement *orbitErrors_;
0157 
0158     dqm::reco::MonitorElement *ecalLinkErrorByLumi_;
0159     dqm::reco::MonitorElement *ecalMismatchByLumi_;
0160     dqm::reco::MonitorElement *hcalLinkErrorByLumi_;
0161     dqm::reco::MonitorElement *hcalMismatchByLumi_;
0162 
0163     dqm::reco::MonitorElement *maxEvtLinkErrorsByLumiECAL_;
0164     dqm::reco::MonitorElement *maxEvtLinkErrorsByLumiHCAL_;
0165     dqm::reco::MonitorElement *maxEvtLinkErrorsByLumi_;
0166 
0167     dqm::reco::MonitorElement *maxEvtMismatchByLumiECAL_;
0168     dqm::reco::MonitorElement *maxEvtMismatchByLumiHCAL_;
0169     dqm::reco::MonitorElement *maxEvtMismatchByLumi_;
0170 
0171     dqm::reco::MonitorElement *last20Mismatches_;
0172 
0173     dqm::reco::MonitorElement *ecalOccRecd5Bx_;
0174     dqm::reco::MonitorElement *ecalOccRecd5BxEtWgt_;
0175     dqm::reco::MonitorElement *ecalOccRecdBx1_;
0176     dqm::reco::MonitorElement *ecalOccRecdBx2_;
0177     dqm::reco::MonitorElement *ecalOccRecdBx3_;
0178     dqm::reco::MonitorElement *ecalOccRecdBx4_;
0179     dqm::reco::MonitorElement *ecalOccRecdBx5_;
0180 
0181     std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>> runMismatchList;
0182   };
0183 
0184   struct perStreamMonitoringDataHolder {
0185     int streamNumMaxEvtLinkErrorsECAL{0};
0186     int streamNumMaxEvtLinkErrorsHCAL{0};
0187     int streamNumMaxEvtLinkErrors{0};
0188 
0189     int streamNumMaxEvtMismatchECAL{0};
0190     int streamNumMaxEvtMismatchHCAL{0};
0191     int streamNumMaxEvtMismatch{0};
0192     std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>> streamMismatchList;
0193   };
0194 
0195   struct perLumiBlockMonitoringInformation {
0196     int lumiNumMaxEvtLinkErrorsECAL{0};
0197     int lumiNumMaxEvtLinkErrorsHCAL{0};
0198     int lumiNumMaxEvtLinkErrors{0};
0199 
0200     int lumiNumMaxEvtMismatchECAL{0};
0201     int lumiNumMaxEvtMismatchHCAL{0};
0202     int lumiNumMaxEvtMismatch{0};
0203 
0204     std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>> lumiMismatchList;
0205   };
0206 
0207   struct perRunSummaryMonitoringInformation {
0208     std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>> runMismatchList;
0209   };
0210 
0211 }  // namespace CaloL1Information
0212 
0213 class L1TStage2CaloLayer1
0214     : public DQMGlobalRunSummaryEDAnalyzer<
0215           CaloL1Information::monitoringDataHolder,
0216           CaloL1Information::perRunSummaryMonitoringInformation,
0217           edm::StreamCache<CaloL1Information::perStreamMonitoringDataHolder>,
0218           edm::LuminosityBlockSummaryCache<CaloL1Information::perLumiBlockMonitoringInformation>> {
0219 public:
0220   L1TStage2CaloLayer1(const edm::ParameterSet &ps);
0221   ~L1TStage2CaloLayer1() override;
0222 
0223 protected:
0224   //DQM module implemented functionality
0225   void dqmBeginRun(edm::Run const &, edm::EventSetup const &, CaloL1Information::monitoringDataHolder &) const override;
0226   void bookHistograms(DQMStore::IBooker &ibooker,
0227                       const edm::Run &,
0228                       const edm::EventSetup &,
0229                       CaloL1Information::monitoringDataHolder &eventMonitors) const override;
0230   void dqmAnalyze(edm::Event const &,
0231                   edm::EventSetup const &,
0232                   CaloL1Information::monitoringDataHolder const &) const override;
0233   void dqmEndRun(edm::Run const &,
0234                  edm::EventSetup const &,
0235                  CaloL1Information::monitoringDataHolder const &,
0236                  CaloL1Information::perRunSummaryMonitoringInformation const &) const override;
0237   //stream functionality
0238   std::unique_ptr<CaloL1Information::perStreamMonitoringDataHolder> beginStream(edm::StreamID) const override {
0239     return std::make_unique<CaloL1Information::perStreamMonitoringDataHolder>();
0240   };
0241   void streamEndLuminosityBlock(edm::StreamID, edm::LuminosityBlock const &, edm::EventSetup const &) const override{};
0242 
0243   //lumi summary functionality
0244   void streamEndLuminosityBlockSummary(edm::StreamID,
0245                                        edm::LuminosityBlock const &,
0246                                        edm::EventSetup const &,
0247                                        CaloL1Information::perLumiBlockMonitoringInformation *) const override;
0248 
0249   std::shared_ptr<CaloL1Information::perLumiBlockMonitoringInformation> globalBeginLuminosityBlockSummary(
0250       edm::LuminosityBlock const &, edm::EventSetup const &) const override {
0251     return std::make_unique<CaloL1Information::perLumiBlockMonitoringInformation>();
0252   };
0253 
0254   void globalEndLuminosityBlockSummary(edm::LuminosityBlock const &,
0255                                        edm::EventSetup const &,
0256                                        CaloL1Information::perLumiBlockMonitoringInformation *) const override;
0257 
0258   //run summary functionality.
0259   std::shared_ptr<CaloL1Information::perRunSummaryMonitoringInformation> globalBeginRunSummary(
0260       edm::Run const &, edm::EventSetup const &) const override {
0261     return std::make_unique<CaloL1Information::perRunSummaryMonitoringInformation>();
0262   };
0263 
0264   void streamEndRunSummary(edm::StreamID,
0265                            edm::Run const &,
0266                            edm::EventSetup const &,
0267                            CaloL1Information::perRunSummaryMonitoringInformation *) const override;
0268 
0269   void globalEndRunSummary(edm::Run const &,
0270                            edm::EventSetup const &,
0271                            CaloL1Information::perRunSummaryMonitoringInformation *) const override;
0272 
0273 private:
0274   void updateMismatch(const edm::Event &e,
0275                       int mismatchType,
0276                       std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>>
0277                           &streamMismatches) const;
0278 
0279   void mergeMismatchVectors(
0280       std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>> &,
0281       std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>> &) const;
0282 
0283   bool isLaterMismatch(
0284       std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>> &candidateMismatch,
0285       std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>> &comparisonMismatch) const;
0286 
0287   int findIndex(std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>,
0288                 std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>>,
0289                 int lowerIndexToSearch,
0290                 int upperIndexToSearch) const;
0291   // Input and config info
0292   edm::EDGetTokenT<EcalTrigPrimDigiCollection> ecalTPSourceRecd_;
0293   std::string ecalTPSourceRecdLabel_;
0294   edm::EDGetTokenT<EcalTrigPrimDigiCollection> ecalTPSourceRecdBx1_;
0295   std::string ecalTPSourceRecdBx1Label_;
0296   edm::EDGetTokenT<EcalTrigPrimDigiCollection> ecalTPSourceRecdBx2_;
0297   std::string ecalTPSourceRecdBx2Label_;
0298   edm::EDGetTokenT<EcalTrigPrimDigiCollection> ecalTPSourceRecdBx3_;
0299   std::string ecalTPSourceRecdBx3Label_;
0300   edm::EDGetTokenT<EcalTrigPrimDigiCollection> ecalTPSourceRecdBx4_;
0301   std::string ecalTPSourceRecdBx4Label_;
0302   edm::EDGetTokenT<EcalTrigPrimDigiCollection> ecalTPSourceRecdBx5_;
0303   std::string ecalTPSourceRecdBx5Label_;
0304   edm::EDGetTokenT<HcalTrigPrimDigiCollection> hcalTPSourceRecd_;
0305   std::string hcalTPSourceRecdLabel_;
0306   edm::EDGetTokenT<EcalTrigPrimDigiCollection> ecalTPSourceSent_;
0307   std::string ecalTPSourceSentLabel_;
0308   edm::EDGetTokenT<HcalTrigPrimDigiCollection> hcalTPSourceSent_;
0309   std::string hcalTPSourceSentLabel_;
0310   edm::EDGetTokenT<l1t::CaloTowerBxCollection> CaloTowerCollectionData_;
0311   std::string CaloTowerCollectionDataLabel_;
0312   edm::EDGetTokenT<FEDRawDataCollection> fedRawData_;
0313   std::string histFolder_;
0314   int tpFillThreshold_;
0315   int tpFillThreshold5Bx_;
0316   bool ignoreHFfbs_;
0317 };
0318 
0319 #endif