diff --git a/Modules/CTP/include/CTP/RawDataQcTask.h b/Modules/CTP/include/CTP/RawDataQcTask.h index ea55abfc8c..2eea8bdc20 100644 --- a/Modules/CTP/include/CTP/RawDataQcTask.h +++ b/Modules/CTP/include/CTP/RawDataQcTask.h @@ -56,6 +56,7 @@ class CTPRawDataReaderTask final : public TaskInterface std::unique_ptr mHistoClassRatios = nullptr; // histogram with ctp class ratios to MB std::unique_ptr mHistoBCMinBias1 = nullptr; // histogram of BC positions to check LHC filling scheme std::unique_ptr mHistoBCMinBias2 = nullptr; // histogram of BC positions to check LHC filling scheme + std::unique_ptr mHistoDecodeError = nullptr; // histogram of erros from decoder int mRunNumber; int indexMB1 = -1; int indexMB2 = -1; diff --git a/Modules/CTP/include/CTP/RawDataReaderCheck.h b/Modules/CTP/include/CTP/RawDataReaderCheck.h index 3cf9d480e4..550919f978 100644 --- a/Modules/CTP/include/CTP/RawDataReaderCheck.h +++ b/Modules/CTP/include/CTP/RawDataReaderCheck.h @@ -20,6 +20,7 @@ #include "QualityControl/CheckInterface.h" #include "CommonConstants/LHCConstants.h" #include "DetectorsBase/GRPGeomHelper.h" +#include #include class TH1D; @@ -50,6 +51,7 @@ class RawDataReaderCheck : public o2::quality_control::checker::CheckInterface int getRunNumberFromMO(std::shared_ptr mo); int checkChange(TH1D* mHist, TH1D* mHistPrev); int checkChangeOfRatio(TH1D* mHist, TH1D* mHistPrev, TH1D* mHistAbs); + float setTextPosition(float iPos, std::shared_ptr msg, TH1D* h); Quality setQualityResult(std::vector& vBad, std::vector& vMedium); void clearIndexVectors(); long int mTimestamp; @@ -73,7 +75,7 @@ class RawDataReaderCheck : public o2::quality_control::checker::CheckInterface std::vector mVecIndexMedium; // vector of ctp input and class indices, which had a relative change std::bitset mLHCBCs; // LHC filling scheme - ClassDefOverride(RawDataReaderCheck, 9); + ClassDefOverride(RawDataReaderCheck, 10); }; } // namespace o2::quality_control_modules::ctp diff --git a/Modules/CTP/src/CTPTrendingTask.cxx b/Modules/CTP/src/CTPTrendingTask.cxx index 3e34947816..05dfc12792 100644 --- a/Modules/CTP/src/CTPTrendingTask.cxx +++ b/Modules/CTP/src/CTPTrendingTask.cxx @@ -62,6 +62,7 @@ void CTPTrendingTask::initCTP(Trigger& t) mgr.setURL(CCDBHost); map metadata; // can be empty metadata["runNumber"] = run; + mgr.setFatalWhenNull(false); auto ctpconfigdb = mgr.getSpecific(o2::ctp::CCDBPathCTPConfig, t.timestamp, metadata); if (ctpconfigdb == nullptr) { LOG(info) << "CTP config not in database, timestamp:" << t.timestamp; @@ -125,6 +126,7 @@ void CTPTrendingTask::initCTP(Trigger& t) } void CTPTrendingTask::initialize(Trigger t, framework::ServiceRegistryRef services) { + initCTP(t); } void CTPTrendingTask::update(Trigger t, framework::ServiceRegistryRef services) diff --git a/Modules/CTP/src/RawDataQcTask.cxx b/Modules/CTP/src/RawDataQcTask.cxx index c3c2599e88..89e02ab7c8 100644 --- a/Modules/CTP/src/RawDataQcTask.cxx +++ b/Modules/CTP/src/RawDataQcTask.cxx @@ -51,14 +51,18 @@ void CTPRawDataReaderTask::initialize(o2::framework::InitContext& /*ctx*/) mHistoBCMinBias2 = std::make_unique("bcMinBias2", "BC position MB2", norbits, 0, norbits); mHistoInputRatios = std::make_unique("inputRatio", "Input Ratio to MTVX; Input; Ratio;", ninps, 0, ninps, true); mHistoClassRatios = std::make_unique("classRatio", "Class Ratio to MB; Class; Ratio", nclasses, 0, nclasses, true); + mHistoDecodeError = std::make_unique("decodeError", "Errors from decoder", 10, 1, 11); getObjectsManager()->startPublishing(mHistoInputs.get()); getObjectsManager()->startPublishing(mHistoClasses.get()); getObjectsManager()->startPublishing(mHistoClassRatios.get()); getObjectsManager()->startPublishing(mHistoInputRatios.get()); getObjectsManager()->startPublishing(mHistoBCMinBias1.get()); getObjectsManager()->startPublishing(mHistoBCMinBias2.get()); + getObjectsManager()->startPublishing(mHistoDecodeError.get()); mDecoder.setDoLumi(1); + mDecoder.setDecodeInps(1); + mDecoder.setCheckConsistency(1); mDecoder.setDoDigits(1); for (size_t i = 0; i < nclasses; i++) { classNames[i] = ""; @@ -76,6 +80,7 @@ void CTPRawDataReaderTask::startOfActivity(const Activity& activity) mHistoInputRatios->Reset(); mHistoBCMinBias1->Reset(); mHistoBCMinBias2->Reset(); + mHistoDecodeError->Reset(); mRunNumber = activity.mId; mTimestamp = activity.mValidity.getMin(); @@ -115,6 +120,7 @@ void CTPRawDataReaderTask::startOfActivity(const Activity& activity) break; } } + mDecoder.setCTPConfig(*ctpconfigdb); } else { ILOG(Warning, Support) << "CTP config not found, run:" << run << ENDM; } @@ -215,7 +221,10 @@ void CTPRawDataReaderTask::monitorData(o2::framework::ProcessingContext& ctx) std::vector outputDigits; o2::framework::InputRecord& inputs = ctx.inputs(); - mDecoder.decodeRaw(inputs, filter, outputDigits, lumiPointsHBF1); + int ret = mDecoder.decodeRaw(inputs, filter, outputDigits, lumiPointsHBF1); + if (ret > 0) { + mHistoDecodeError->Fill(log2(ret) + 1.5); + } // reading the ctp inputs and ctp classes for (auto const digit : outputDigits) { @@ -282,6 +291,7 @@ void CTPRawDataReaderTask::reset() mHistoClassRatios->Reset(); mHistoBCMinBias1->Reset(); mHistoBCMinBias2->Reset(); + mHistoDecodeError->Reset(); } } // namespace o2::quality_control_modules::ctp diff --git a/Modules/CTP/src/RawDataReaderCheck.cxx b/Modules/CTP/src/RawDataReaderCheck.cxx index e5e0671059..9bde558f06 100644 --- a/Modules/CTP/src/RawDataReaderCheck.cxx +++ b/Modules/CTP/src/RawDataReaderCheck.cxx @@ -137,6 +137,12 @@ Quality RawDataReaderCheck::check(std::mapClone(); + } else if (mo->getName() == "decodeError") { + if (h->GetEntries() > 0) { + result.set(Quality::Bad); + } else { + result.set(Quality::Good); + } } else { ILOG(Info, Support) << "Unknown histo:" << moName << ENDM; } @@ -186,6 +192,14 @@ int RawDataReaderCheck::checkChangeOfRatio(TH1D* mHist, TH1D* mHistPrev, TH1D* m } return 0; } +float RawDataReaderCheck::setTextPosition(float iPos, std::shared_ptr msg, TH1D* h) +{ + msg->SetTextSize(0.03); + msg->SetNDC(); + h->GetListOfFunctions()->Add(msg->Clone()); + float MessagePos = iPos - 0.04; + return MessagePos; +} std::string RawDataReaderCheck::getAcceptedType() { return "TH1"; } @@ -194,6 +208,10 @@ void RawDataReaderCheck::beautify(std::shared_ptr mo, Quality che std::shared_ptr msg; if (mo->getName() == "bcMinBias1" || mo->getName() == "bcMinBias2") { auto* h = dynamic_cast(mo->getObject()); + if (h == nullptr) { + ILOG(Info, Support) << "null pointer for hist:" << mo->getName() << ENDM; + return; + } h->SetMarkerStyle(20); h->SetMarkerSize(0.6); if (checkResult != Quality::Null) { @@ -255,8 +273,47 @@ void RawDataReaderCheck::beautify(std::shared_ptr mo, Quality che } h->SetStats(kFALSE); h->GetYaxis()->SetRangeUser(0, h->GetMaximum() * 1.5); + } else if (mo->getName() == "decodeError") { + auto* h = dynamic_cast(mo->getObject()); + if (h == nullptr) { + ILOG(Info, Support) << "null pointer for hist:" << mo->getName() << ENDM; + return; + } + if (checkResult != Quality::Null) { + msg = std::make_shared(0.2, 0.85, Form("Quality: %s", (checkResult.getName()).c_str())); + if (checkResult == Quality::Bad) { + msg->SetTextColor(kRed); + } else if (checkResult == Quality::Good) { + msg->SetTextColor(kGreen + 1); + } + msg->SetTextSize(0.03); + msg->SetNDC(); + h->GetListOfFunctions()->Add(msg->Clone()); + } + if (checkResult == Quality::Bad) { + float initialMessagePos = 0.8; + string messages[9] = { "Failed to extract RDD", + "", + "Two CTP IRs with the same ts", + "Two digits with the same ts", + "Two CTP class masks with the same ts", + "Two digits (Class Mask) with the same ts", + "Trigger class without input", + "CTP class mask not compatible with input class mask", + "CTP class not found in the digit" }; + for (int i = 1; i < h->GetXaxis()->GetNbins() + 1; i++) { + if (h->GetBinContent(i) > 0) { + msg = std::make_shared(0.2, initialMessagePos, messages[i - 1].c_str()); + initialMessagePos = setTextPosition(initialMessagePos, msg, h); + } + } + } } else { auto* h = dynamic_cast(mo->getObject()); + if (h == nullptr) { + ILOG(Info, Support) << "null pointer for hist:" << mo->getName() << ENDM; + return; + } h->SetStats(kFALSE); msg = std::make_shared(0.45, 0.8, Form("Quality: %s", (checkResult.getName()).c_str())); std::string groupName = "Input"; diff --git a/Modules/CTP/src/qc-ctp.json b/Modules/CTP/src/qc-ctp.json index 8325bd380d..249cebd2b4 100644 --- a/Modules/CTP/src/qc-ctp.json +++ b/Modules/CTP/src/qc-ctp.json @@ -48,14 +48,14 @@ "ccdbName": "https://alice-ccdb.cern.ch", "MBclassName" : "CMTVX-B-NOPF", "MB1inputName" : "MTVX", - "MB2inputName" : "MTVA" + "MB2inputName" : "MVBA" } }, "PHYSICS": { "default": { "MBclassName" : "CMTVX-B-NOPF", "MB1inputName" : "MTVX", - "MB2inputName" : "MTVA" + "MB2inputName" : "MVBA" }, "PROTON-PROTON": { "MBclassName" : "CMTVX-B-NOPF", @@ -63,7 +63,7 @@ "MB2inputName" : "MTVA" }, "Pb-Pb": { - "MBclassName" : "CMTVX-B-NOPF", + "MBclassName" : "CMTCE-B-NOPF", "MB1inputName" : "MTSC", "MB2inputName" : "MTCE" } @@ -81,14 +81,14 @@ "dataSource": [{ "type": "Task", "name": "CTPRawData", - "MOs": ["bcMinBias1","bcMinBias2","inputs","classes","inputRatio","classRatio"] + "MOs": ["bcMinBias1","bcMinBias2","inputs","classes","inputRatio","classRatio","decodeError"] }], "checkParameters": { "thresholdRateBad": "3", "thresholdRateMedium": "2", "thresholdRateRatioBad": "3", "thresholdRateRatioMedium": "2", - "mNSigBC": "2" + "nSigmaBC": "1" } } }