Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:07:45

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     dqm::reco::MonitorElement *slot7bit_;
0182 
0183     std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>> runMismatchList;
0184   };
0185 
0186   struct perStreamMonitoringDataHolder {
0187     int streamNumMaxEvtLinkErrorsECAL{0};
0188     int streamNumMaxEvtLinkErrorsHCAL{0};
0189     int streamNumMaxEvtLinkErrors{0};
0190 
0191     int streamNumMaxEvtMismatchECAL{0};
0192     int streamNumMaxEvtMismatchHCAL{0};
0193     int streamNumMaxEvtMismatch{0};
0194     std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>> streamMismatchList;
0195   };
0196 
0197   struct perLumiBlockMonitoringInformation {
0198     int lumiNumMaxEvtLinkErrorsECAL{0};
0199     int lumiNumMaxEvtLinkErrorsHCAL{0};
0200     int lumiNumMaxEvtLinkErrors{0};
0201 
0202     int lumiNumMaxEvtMismatchECAL{0};
0203     int lumiNumMaxEvtMismatchHCAL{0};
0204     int lumiNumMaxEvtMismatch{0};
0205 
0206     std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>> lumiMismatchList;
0207   };
0208 
0209   struct perRunSummaryMonitoringInformation {
0210     std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>> runMismatchList;
0211   };
0212 
0213 }  // namespace CaloL1Information
0214 
0215 class L1TStage2CaloLayer1
0216     : public DQMGlobalRunSummaryEDAnalyzer<
0217           CaloL1Information::monitoringDataHolder,
0218           CaloL1Information::perRunSummaryMonitoringInformation,
0219           edm::StreamCache<CaloL1Information::perStreamMonitoringDataHolder>,
0220           edm::LuminosityBlockSummaryCache<CaloL1Information::perLumiBlockMonitoringInformation>> {
0221 public:
0222   L1TStage2CaloLayer1(const edm::ParameterSet &ps);
0223   ~L1TStage2CaloLayer1() override;
0224 
0225 protected:
0226   //DQM module implemented functionality
0227   void dqmBeginRun(edm::Run const &, edm::EventSetup const &, CaloL1Information::monitoringDataHolder &) const override;
0228   void bookHistograms(DQMStore::IBooker &ibooker,
0229                       const edm::Run &,
0230                       const edm::EventSetup &,
0231                       CaloL1Information::monitoringDataHolder &eventMonitors) const override;
0232   void dqmAnalyze(edm::Event const &,
0233                   edm::EventSetup const &,
0234                   CaloL1Information::monitoringDataHolder const &) const override;
0235   void dqmEndRun(edm::Run const &,
0236                  edm::EventSetup const &,
0237                  CaloL1Information::monitoringDataHolder const &,
0238                  CaloL1Information::perRunSummaryMonitoringInformation const &) const override;
0239   //stream functionality
0240   std::unique_ptr<CaloL1Information::perStreamMonitoringDataHolder> beginStream(edm::StreamID) const override {
0241     return std::make_unique<CaloL1Information::perStreamMonitoringDataHolder>();
0242   };
0243   void streamEndLuminosityBlock(edm::StreamID, edm::LuminosityBlock const &, edm::EventSetup const &) const override{};
0244 
0245   //lumi summary functionality
0246   void streamEndLuminosityBlockSummary(edm::StreamID,
0247                                        edm::LuminosityBlock const &,
0248                                        edm::EventSetup const &,
0249                                        CaloL1Information::perLumiBlockMonitoringInformation *) const override;
0250 
0251   std::shared_ptr<CaloL1Information::perLumiBlockMonitoringInformation> globalBeginLuminosityBlockSummary(
0252       edm::LuminosityBlock const &, edm::EventSetup const &) const override {
0253     return std::make_unique<CaloL1Information::perLumiBlockMonitoringInformation>();
0254   };
0255 
0256   void globalEndLuminosityBlockSummary(edm::LuminosityBlock const &,
0257                                        edm::EventSetup const &,
0258                                        CaloL1Information::perLumiBlockMonitoringInformation *) const override;
0259 
0260   //run summary functionality.
0261   std::shared_ptr<CaloL1Information::perRunSummaryMonitoringInformation> globalBeginRunSummary(
0262       edm::Run const &, edm::EventSetup const &) const override {
0263     return std::make_unique<CaloL1Information::perRunSummaryMonitoringInformation>();
0264   };
0265 
0266   void streamEndRunSummary(edm::StreamID,
0267                            edm::Run const &,
0268                            edm::EventSetup const &,
0269                            CaloL1Information::perRunSummaryMonitoringInformation *) const override;
0270 
0271   void globalEndRunSummary(edm::Run const &,
0272                            edm::EventSetup const &,
0273                            CaloL1Information::perRunSummaryMonitoringInformation *) const override;
0274 
0275 private:
0276   void updateMismatch(const edm::Event &e,
0277                       int mismatchType,
0278                       std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>>
0279                           &streamMismatches) const;
0280 
0281   void mergeMismatchVectors(
0282       std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>> &,
0283       std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>> &) const;
0284 
0285   bool isLaterMismatch(
0286       std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>> &candidateMismatch,
0287       std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>> &comparisonMismatch) const;
0288 
0289   int findIndex(std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>,
0290                 std::vector<std::tuple<edm::RunID, edm::LuminosityBlockID, edm::EventID, std::vector<int>>>,
0291                 int lowerIndexToSearch,
0292                 int upperIndexToSearch) const;
0293   // Input and config info
0294   edm::EDGetTokenT<EcalTrigPrimDigiCollection> ecalTPSourceRecd_;
0295   std::string ecalTPSourceRecdLabel_;
0296   edm::EDGetTokenT<EcalTrigPrimDigiCollection> ecalTPSourceRecdBx1_;
0297   std::string ecalTPSourceRecdBx1Label_;
0298   edm::EDGetTokenT<EcalTrigPrimDigiCollection> ecalTPSourceRecdBx2_;
0299   std::string ecalTPSourceRecdBx2Label_;
0300   edm::EDGetTokenT<EcalTrigPrimDigiCollection> ecalTPSourceRecdBx3_;
0301   std::string ecalTPSourceRecdBx3Label_;
0302   edm::EDGetTokenT<EcalTrigPrimDigiCollection> ecalTPSourceRecdBx4_;
0303   std::string ecalTPSourceRecdBx4Label_;
0304   edm::EDGetTokenT<EcalTrigPrimDigiCollection> ecalTPSourceRecdBx5_;
0305   std::string ecalTPSourceRecdBx5Label_;
0306   edm::EDGetTokenT<HcalTrigPrimDigiCollection> hcalTPSourceRecd_;
0307   std::string hcalTPSourceRecdLabel_;
0308   edm::EDGetTokenT<EcalTrigPrimDigiCollection> ecalTPSourceSent_;
0309   std::string ecalTPSourceSentLabel_;
0310   edm::EDGetTokenT<HcalTrigPrimDigiCollection> hcalTPSourceSent_;
0311   std::string hcalTPSourceSentLabel_;
0312   edm::EDGetTokenT<l1t::CaloTowerBxCollection> CaloTowerCollectionData_;
0313   std::string CaloTowerCollectionDataLabel_;
0314   edm::EDGetTokenT<FEDRawDataCollection> fedRawData_;
0315   std::string histFolder_;
0316   int tpFillThreshold_;
0317   int tpFillThreshold5Bx_;
0318   bool ignoreHFfbs_;
0319 };
0320 
0321 #endif