File indexing completed on 2024-04-06 12:07:32
0001
0002
0003
0004
0005
0006
0007
0008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0010 #include "FWCore/Framework/interface/Event.h"
0011 #include "FWCore/Framework/interface/ESHandle.h"
0012
0013 #include "DQMServices/Core/interface/DQMEDAnalyzer.h"
0014 #include "DQMServices/Core/interface/DQMStore.h"
0015
0016 #include "DQM/HcalCommon/interface/HcalCommonHeaders.h"
0017
0018 #include <vector>
0019 #include <string>
0020
0021 using namespace std;
0022 using namespace edm;
0023
0024 class HcalFEDIntegrityTask : public DQMEDAnalyzer {
0025 public:
0026 HcalFEDIntegrityTask(const edm::ParameterSet &ps);
0027 ~HcalFEDIntegrityTask() override;
0028
0029 void dqmBeginRun(const edm::Run &, edm::EventSetup const &) override;
0030 void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override;
0031 void analyze(const edm::Event &, const edm::EventSetup &) override;
0032
0033 static void fillDescriptions(edm::ConfigurationDescriptions &descriptions);
0034
0035 private:
0036 void labelBins(MonitorElement *me);
0037
0038 edm::EDGetTokenT<FEDRawDataCollection> tokFEDs_;
0039 edm::EDGetTokenT<HcalUnpackerReport> tokReport_;
0040
0041 int numOfFED_, minFEDNum_, maxFEDNum_;
0042 std::string dirName_;
0043 MonitorElement *meFEDEntries_;
0044 MonitorElement *meFEDFatal_;
0045 MonitorElement *meFEDNonFatal_;
0046 };
0047
0048 HcalFEDIntegrityTask::HcalFEDIntegrityTask(const edm::ParameterSet &ps)
0049 : tokFEDs_(consumes<FEDRawDataCollection>(
0050 ps.getUntrackedParameter<edm::InputTag>("tagFEDs", edm::InputTag("rawDataCollector")))),
0051 tokReport_(consumes<HcalUnpackerReport>(
0052 ps.getUntrackedParameter<edm::InputTag>("tagReport", edm::InputTag("hcalDigis")))),
0053 minFEDNum_(ps.getUntrackedParameter<int>("MinHcalFEDID", FEDNumbering::MINHCALuTCAFEDID)),
0054 maxFEDNum_(ps.getUntrackedParameter<int>("MaxHcalFEDID", FEDNumbering::MAXHCALuTCAFEDID)),
0055 dirName_(ps.getUntrackedParameter<std::string>("DirName", "Hcal/FEDIntegrity/")) {
0056 LogInfo("HcalDQM") << "HcalFEDIntegrityTask::HcalFEDIntegrityTask: Constructor Initialization" << endl;
0057 numOfFED_ = maxFEDNum_ - minFEDNum_ + 1;
0058 }
0059
0060 HcalFEDIntegrityTask::~HcalFEDIntegrityTask() {
0061 LogInfo("HcalDQM") << "HcalFEDIntegrityTask::~HcalFEDIntegrityTask: Destructor" << endl;
0062 }
0063
0064 void HcalFEDIntegrityTask::dqmBeginRun(const edm::Run &iRun, const edm::EventSetup &iSetup) {}
0065
0066 void HcalFEDIntegrityTask::bookHistograms(DQMStore::IBooker &iBooker,
0067 edm::Run const &iRun,
0068 edm::EventSetup const &iSetup) {
0069 iBooker.cd();
0070 iBooker.setCurrentFolder(dirName_);
0071
0072 meFEDEntries_ = iBooker.book1D("FEDEntries", "FED Entries", numOfFED_, minFEDNum_, maxFEDNum_ + 1);
0073 this->labelBins(meFEDEntries_);
0074 meFEDFatal_ = iBooker.book1D("FEDFatal", "FED Fatal Errors", numOfFED_, minFEDNum_, maxFEDNum_ + 1);
0075 this->labelBins(meFEDFatal_);
0076 meFEDNonFatal_ = iBooker.book1D("FEDNonFatal", "FED NON Fatal Errors", numOfFED_, minFEDNum_, maxFEDNum_ + 1);
0077 this->labelBins(meFEDNonFatal_);
0078 }
0079
0080 void HcalFEDIntegrityTask::analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) {
0081 edm::Handle<FEDRawDataCollection> raw;
0082 edm::Handle<HcalUnpackerReport> report;
0083 iEvent.getByToken(tokFEDs_, raw);
0084 iEvent.getByToken(tokReport_, report);
0085
0086
0087 const std::vector<int> FedsError = (*report).getFedsError();
0088 for (auto &fed : FedsError) {
0089 if (fed < 1000)
0090 LogWarning("HcalDQM") << "HcalFEDIntegrityTask::analyze: obsoleteVME FEDs from HcalUnpackerReport" << endl;
0091 meFEDFatal_->Fill(fed);
0092 }
0093
0094
0095
0096
0097 for (int fed = FEDNumbering::MINHCALuTCAFEDID; fed <= FEDNumbering::MAXHCALuTCAFEDID; fed++) {
0098 const FEDRawData &fedRawData = raw->FEDData(fed);
0099 if (fedRawData.size() != 0) {
0100 meFEDEntries_->Fill(fed);
0101 }
0102
0103 hcal::AMC13Header const *amc13 = (hcal::AMC13Header const *)fedRawData.data();
0104 if (!amc13) {
0105 continue;
0106 }
0107
0108 uint32_t bcn = amc13->bunchId();
0109 uint32_t orn = amc13->orbitNumber() & 0xFFFF;
0110 uint32_t evn = amc13->l1aNumber();
0111 int namc = amc13->NAMC();
0112
0113
0114 for (int iamc = 0; iamc < namc; iamc++) {
0115 if (!amc13->AMCEnabled(iamc) || !amc13->AMCDataPresent(iamc) || !amc13->AMCCRCOk(iamc) ||
0116 amc13->AMCSegmented(iamc)) {
0117 LogWarning("HcalDQM") << "HcalFEDIntegrityTask::analyze: AMC issue on iamc" << iamc << endl;
0118 continue;
0119 }
0120
0121 HcalUHTRData uhtr(amc13->AMCPayload(iamc), amc13->AMCSize(iamc));
0122 uint32_t uhtr_evn = uhtr.l1ANumber();
0123 uint32_t uhtr_bcn = uhtr.bunchNumber();
0124 uint32_t uhtr_orn = uhtr.orbitNumber();
0125
0126 if (uhtr_evn != evn || uhtr_bcn != bcn || uhtr_orn != orn) {
0127 if (std::find(FedsError.begin(), FedsError.end(), fed) ==
0128 FedsError.end())
0129 meFEDFatal_->Fill(fed);
0130 break;
0131 }
0132 }
0133
0134 }
0135 }
0136
0137 void HcalFEDIntegrityTask::labelBins(MonitorElement *me) {
0138 int xbins = me->getNbinsX();
0139
0140 if (xbins != numOfFED_)
0141 return;
0142
0143 for (int i = 0; i < xbins; i++) {
0144 const std::string xLabel = fmt::format("{}", minFEDNum_ + i);
0145 me->setBinLabel(i + 1, xLabel, 1);
0146 }
0147 }
0148
0149 void HcalFEDIntegrityTask::fillDescriptions(edm::ConfigurationDescriptions &descriptions) {
0150 edm::ParameterSetDescription desc;
0151 desc.addUntracked<std::string>("name", "HcalFEDIntegrityTask");
0152 desc.addUntracked<int>("debug", 0);
0153 desc.addUntracked<edm::InputTag>("tagFEDs", edm::InputTag("rawDataCollector"));
0154 desc.addUntracked<edm::InputTag>("tagReport", edm::InputTag("hcalDigis"));
0155 desc.addUntracked<int>(
0156 "MinHcalFEDID",
0157 FEDNumbering::MINHCALuTCAFEDID);
0158 desc.addUntracked<int>("MaxHcalFEDID", FEDNumbering::MAXHCALuTCAFEDID);
0159 desc.addUntracked<std::string>("DirName", "Hcal/FEDIntegrity/");
0160 descriptions.addWithDefaultLabel(desc);
0161 }
0162
0163 DEFINE_FWK_MODULE(HcalFEDIntegrityTask);