diff --git a/Modules/MUON/MID/include/MID/DigitsQcTask.h b/Modules/MUON/MID/include/MID/DigitsQcTask.h index ee9e189533..07a850b02a 100644 --- a/Modules/MUON/MID/include/MID/DigitsQcTask.h +++ b/Modules/MUON/MID/include/MID/DigitsQcTask.h @@ -69,6 +69,10 @@ class DigitsQcTask final : public TaskInterface std::unique_ptr mNbLBHighRate{ nullptr }; std::unique_ptr mLBHighRate{ nullptr }; + std::unique_ptr mGBTRate{ nullptr }; + std::unique_ptr mCRURate{ nullptr }; + std::unique_ptr mEPRate{ nullptr }; + std::array, 5> mMultHitB{}; std::array, 5> mMultHitNB{}; std::unique_ptr mMeanMultiHits; @@ -82,6 +86,8 @@ class DigitsQcTask final : public TaskInterface std::array, 4> mNBendHitsMap{}; std::unique_ptr mDigitBCCounts{ nullptr }; + + o2::mid::Mapping mMapping; }; } // namespace o2::quality_control_modules::mid diff --git a/Modules/MUON/MID/src/ClustQcTask.cxx b/Modules/MUON/MID/src/ClustQcTask.cxx index ad7409f0a2..eff08841fc 100644 --- a/Modules/MUON/MID/src/ClustQcTask.cxx +++ b/Modules/MUON/MID/src/ClustQcTask.cxx @@ -184,7 +184,7 @@ void ClustQcTask::monitorData(o2::framework::ProcessingContext& ctx) } } } // loop on MT // - } // cluster in ROF // + } // cluster in ROF // mMultClust11->Fill(multClusterMT11); mMultClust12->Fill(multClusterMT12); mMultClust21->Fill(multClusterMT21); diff --git a/Modules/MUON/MID/src/DigitsHelper.cxx b/Modules/MUON/MID/src/DigitsHelper.cxx index b579374362..5c663afe53 100644 --- a/Modules/MUON/MID/src/DigitsHelper.cxx +++ b/Modules/MUON/MID/src/DigitsHelper.cxx @@ -17,6 +17,8 @@ #include #include "TH1.h" #include "TH2.h" +#include "MIDRaw/CrateMapper.h" +#include "MIDRaw/CrateParameters.h" #include "MIDBase/DetectorParameters.h" #include "MIDBase/GeometryParameters.h" #include "MIDGlobalMapping/GlobalMapper.h" @@ -32,6 +34,7 @@ void DigitsHelper::initMaps() { o2::mid::GlobalMapper gm; auto infos = gm.buildStripsInfo(); + o2::mid::CrateMapper cm; auto stripHistoB = makeStripMapHisto("templateStripB", "templateStripB", 0); auto stripHistoNB = makeStripMapHisto("templateStripNB", "templateStripNB", 1); @@ -238,4 +241,4 @@ void DigitsHelper::fillStripHisto(const o2::mid::ColumnData& col, TH1* histo) co } } -} // namespace o2::quality_control_modules::mid \ No newline at end of file +} // namespace o2::quality_control_modules::mid diff --git a/Modules/MUON/MID/src/DigitsQcCheck.cxx b/Modules/MUON/MID/src/DigitsQcCheck.cxx index 2208f536e7..fd07d49e3e 100644 --- a/Modules/MUON/MID/src/DigitsQcCheck.cxx +++ b/Modules/MUON/MID/src/DigitsQcCheck.cxx @@ -248,37 +248,76 @@ void DigitsQcCheck::beautify(std::shared_ptr mo, Quality checkRes if (mo->getName().find(lbHistoName) != std::string::npos) { // This matches "LocalBoardsMap*" auto histo = dynamic_cast(mo->getObject()); - if (mo->getName() == lbHistoName) { - // This is LocalBoardsMap and it was already scaled in the checker - if (!checkResult.getFlags().empty()) { - mHistoHelper.addLatex(histo, 0.12, 0.72, color, checkResult.getFlags().front().second.c_str()); + if (histo) { + if (mo->getName() == lbHistoName) { + // This is LocalBoardsMap and it was already scaled in the checker + if (!checkResult.getFlags().empty()) { + mHistoHelper.addLatex(histo, 0.12, 0.72, color, checkResult.getFlags().front().second.c_str()); + } + mHistoHelper.addLatex(histo, 0.3, 0.32, color, fmt::format("Quality::{}", checkResult.getName())); + histo->SetMaximum(zcontoursLoc4.back()); + histo->SetContour(zcontoursLoc4.size(), zcontoursLoc4.data()); + } else { + mHistoHelper.normalizeHistoTokHz(histo); + histo->SetMaximum(zcontoursLoc.back()); + histo->SetContour(zcontoursLoc.size(), zcontoursLoc.data()); } - mHistoHelper.addLatex(histo, 0.3, 0.32, color, fmt::format("Quality::{}", checkResult.getName())); - histo->SetMaximum(zcontoursLoc4.back()); - histo->SetContour(zcontoursLoc4.size(), zcontoursLoc4.data()); - } else { - mHistoHelper.normalizeHistoTokHz(histo); - histo->SetMaximum(zcontoursLoc.back()); - histo->SetContour(zcontoursLoc.size(), zcontoursLoc.data()); + mHistoHelper.updateTitleWithNTF(histo); + histo->SetStats(0); } - mHistoHelper.updateTitleWithNTF(histo); - histo->SetStats(0); - } else { - - // Strips Display - if (mo->getName().find("BendHitsMap") != std::string::npos) { - // This matches both [N]BendHitsMap* - int maxStrip = 20; // 20kHz Max Display - auto histo = dynamic_cast(mo->getObject()); + } else if (mo->getName().find("BendHitsMap") != std::string::npos) { // Strips Display + // This matches both [N]BendHitsMap* + int maxStrip = 20; // 20kHz Max Display + auto histo = dynamic_cast(mo->getObject()); + if (histo) { mHistoHelper.normalizeHistoTokHz(histo); histo->SetMaximum(zcontoursStrip.back()); histo->SetContour(zcontoursStrip.size(), zcontoursStrip.data()); histo->SetStats(0); - } else if (mo->getName() == "Hits") { - auto histo = dynamic_cast(mo->getObject()); + } + } else if (mo->getName() == "Hits") { + auto histo = dynamic_cast(mo->getObject()); + if (histo) { mHistoHelper.normalizeHistoTokHz(histo); histo->SetStats(0); } + } else if (mo->getName() == "GBTRate") { + auto histo = dynamic_cast(mo->getObject()); + if (histo) { + // if (mHistoHelper.getNTFs() > 0) + mHistoHelper.normalizeHistoTokHz(histo); + histo->SetMinimum(0.); + TString XLabel[32] = { "5R0", "5R1", "4R0", "4R1", "1R0", "1R1", "0R0", "0R1", + "2R0", "2R1", "3R0", "3R1", "7R0", "7R1", "6R0", "6R1", + "5L0", "5L1", "4L0", "4L1", "1L0", "1L1", "0L0", "0L1", + "2L0", "2L1", "3L0", "3L1", "7L0", "7L1", "6L0", "6L1" }; + for (Int_t i = 0; i < 32; ++i) + histo->GetXaxis()->SetBinLabel(i + 1, XLabel[i]); + histo->GetXaxis()->SetLabelSize(0.07); + histo->GetXaxis()->SetLabelColor(4); + } + } else if (mo->getName() == "EPRate") { + auto histo = dynamic_cast(mo->getObject()); + if (histo) { + mHistoHelper.normalizeHistoTokHz(histo); + histo->SetMinimum(0.); + histo->GetXaxis()->SetBinLabel(1, "CRU0(990)-EP0"); + histo->GetXaxis()->SetBinLabel(2, "CRU0(990)-EP1"); + histo->GetXaxis()->SetBinLabel(3, "CRU1(974)-EP0"); + histo->GetXaxis()->SetBinLabel(4, "CRU1(974)-EP1"); + histo->GetXaxis()->SetLabelSize(0.07); + histo->GetXaxis()->SetLabelColor(4); + } + } else if (mo->getName() == "CRURate") { + auto histo = dynamic_cast(mo->getObject()); + if (histo) { + mHistoHelper.normalizeHistoTokHz(histo); + histo->SetMinimum(0.); + histo->GetXaxis()->SetBinLabel(1, "CRU0 (990)"); + histo->GetXaxis()->SetBinLabel(2, "CRU1 (974)"); + histo->GetXaxis()->SetLabelSize(0.07); + histo->GetXaxis()->SetLabelColor(4); + } } } mHistoHelper.updateTitle(dynamic_cast(mo->getObject()), mHistoHelper.getCurrentTime()); diff --git a/Modules/MUON/MID/src/DigitsQcTask.cxx b/Modules/MUON/MID/src/DigitsQcTask.cxx index fcc8c24bed..237164431f 100644 --- a/Modules/MUON/MID/src/DigitsQcTask.cxx +++ b/Modules/MUON/MID/src/DigitsQcTask.cxx @@ -24,9 +24,14 @@ #include #include "DataFormatsMID/ColumnData.h" #include "DataFormatsMID/ROFRecord.h" +#include "MIDBase/Mapping.h" #include "MIDBase/DetectorParameters.h" #include "MIDBase/GeometryParameters.h" #include "MIDWorkflow/ColumnDataSpecsUtils.h" +#include "MIDGlobalMapping/GlobalMapper.h" +#include "MIDRaw/CrateMapper.h" +#include "MIDRaw/CrateParameters.h" +#include "MIDRaw/Decoder.h" #include "MID/DigitsHelper.h" namespace o2::quality_control_modules::mid @@ -52,6 +57,15 @@ void DigitsQcTask::initialize(o2::framework::InitContext& /*ctx*/) mLBHighRate = std::make_unique("LBHighRate", "LocalBoardHigherRate", 1, 0, 1.); getObjectsManager()->startPublishing(mLBHighRate.get()); + mGBTRate = std::make_unique("GBTRate", "GBTRate", 32, 0, 32.); + getObjectsManager()->startPublishing(mGBTRate.get()); + + mCRURate = std::make_unique("CRURate", "CRURate", 2, 0, 2.); + getObjectsManager()->startPublishing(mCRURate.get()); + + mEPRate = std::make_unique("EPRate", "EPRate", 4, 0, 4.); + getObjectsManager()->startPublishing(mEPRate.get()); + std::array chId{ "11", "12", "21", "22" }; for (size_t ich = 0; ich < 5; ++ich) { @@ -128,15 +142,51 @@ void DigitsQcTask::monitorData(o2::framework::ProcessingContext& ctx) unsigned long int prevSize = 0; o2::InteractionRecord prevIr; bool isFirst = true; + + o2::mid::CrateMapper cm; + for (auto& rof : rofs) { auto eventDigits = digits.subspan(rof.firstEntry, rof.nEntries); evtSizeB.fill(0); evtSizeNB.fill(0); + for (auto& col : eventDigits) { + auto ich = o2::mid::detparams::getChamber(col.deId); evtSizeB[ich] += mDigitsHelper.countDigits(col, 0); evtSizeNB[ich] += mDigitsHelper.countDigits(col, 1); mDigitsHelper.fillStripHisto(col, mHits.get()); + + for (int lineId = 0; lineId < 4; lineId++) { + if (col.getBendPattern(lineId)) { + auto locId = cm.deLocalBoardToRO(col.deId, col.columnId, lineId); + + int crateId = o2::mid::raw::getCrateId(locId); + int cruId = o2::mid::crateparams::isRightSide(crateId) ? 0 : 1; + int epId = 0; + switch (crateId % 8) { + case 0: + case 1: + case 4: + case 5: + epId = 0; + break; + case 2: + case 3: + case 6: + case 7: + epId = 1; + break; + } + auto locIdInCrate = o2::mid::raw::getLocId(locId); + auto gbtId = o2::mid::crateparams::getGBTIdFromBoardInCrate(locIdInCrate); + auto gbtUniqueId = o2::mid::crateparams::makeGBTUniqueId(crateId, gbtId); + mGBTRate->Fill(gbtUniqueId); + mCRURate->Fill(cruId); + int epIndex = 2 * cruId + epId; + mEPRate->Fill(epIndex); + } + } } unsigned long int sizeTot = 0; @@ -218,6 +268,10 @@ void DigitsQcTask::reset() resetDisplayHistos(); mDigitBCCounts->Reset(); + + mGBTRate->Reset(); + mCRURate->Reset(); + mEPRate->Reset(); } } // namespace o2::quality_control_modules::mid diff --git a/Modules/MUON/MID/src/RawQcTask.cxx b/Modules/MUON/MID/src/RawQcTask.cxx index 092716bfa9..87286d9e49 100644 --- a/Modules/MUON/MID/src/RawQcTask.cxx +++ b/Modules/MUON/MID/src/RawQcTask.cxx @@ -232,7 +232,6 @@ void RawQcTask::monitorData(o2::framework::ProcessingContext& ctx) int isLoc = (statusWord >> 6) & 1; int busyLoc = (statusWord >> 5) & 1; int decisionLoc = (statusWord >> 4) & 1; - int isPhys = (triggerWord >> 2) & 1; int isCalib = (triggerWord >> 3) & 1; int sOrb = triggerWord & 1; diff --git a/Modules/MUON/MID/src/TracksQcTask.cxx b/Modules/MUON/MID/src/TracksQcTask.cxx index 851be8cc9c..ec808ff28d 100644 --- a/Modules/MUON/MID/src/TracksQcTask.cxx +++ b/Modules/MUON/MID/src/TracksQcTask.cxx @@ -478,12 +478,12 @@ void TracksQcTask::monitorData(o2::framework::ProcessingContext& ctx) mTrackLocalBoardsNBRatio44Map->Fill(-colId - 0.5, linePos, NBFired); } } // board in line loop - } // board loop - } // only fire board in the line - } //(EffFlag>2) - } //(EffFlag>1) - } // Efficiency part (EffFlag>0) - } // tracks in ROF + } // board loop + } // only fire board in the line + } //(EffFlag>2) + } //(EffFlag>1) + } // Efficiency part (EffFlag>0) + } // tracks in ROF mMultTracks->Fill(multTracks); } // ROFRecords //