File indexing completed on 2024-09-11 04:32:31
0001 #ifndef L1TStage2CaloLayer1_H
0002 #define L1TStage2CaloLayer1_H
0003
0004
0005 #include <memory>
0006 #include <string>
0007 #include <array>
0008 #include <map>
0009
0010 #include "DQMServices/Core/interface/DQMGlobalEDAnalyzer.h"
0011
0012
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
0034
0035
0036
0037
0038
0039
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 }
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
0123
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 }
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
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
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
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
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
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