Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Modules/MUON/MCH/include/MCH/DecodingCheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@ class DecodingCheck : public o2::quality_control::checker::CheckInterface
std::array<std::optional<double>, 5> mMinGoodErrorFracPerStation;
double mMinGoodSyncFrac{ 0.9 };
std::array<std::optional<double>, 5> mMinGoodSyncFracPerStation;
double mMinHeartBeatRate{ 0 };
double mMaxHeartBeatRate{ 2 };

QualityChecker mQualityChecker;

Expand Down
4 changes: 3 additions & 1 deletion Modules/MUON/MCH/include/MCH/DecodingTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@

using namespace o2::quality_control_modules::common;

class TH1I;

namespace o2::quality_control_modules::muonchambers
{

Expand Down Expand Up @@ -96,7 +98,7 @@ class DecodingTask /*final*/ : public TaskInterface
std::array<HBCount, o2::mch::NumberOfDualSampas> mHBcount;

/// \brief number of processed time-frames
std::unique_ptr<TH1F> mHistogramTimeFramesCount;
std::unique_ptr<TH1I> mHistogramTimeFramesCount;

/// \brief decoding error plots
std::unique_ptr<TH2FRatio> mHistogramErrorsFEC; ///< error codes per FEC
Expand Down
14 changes: 13 additions & 1 deletion Modules/MUON/MCH/src/DecodingCheck.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,11 @@ void DecodingCheck::startOfActivity(const Activity& activity)

mMaxBadST12 = getConfigurationParameter<int>(mCustomParameters, "MaxBadDE_ST12", mMaxBadST12, activity);
mMaxBadST345 = getConfigurationParameter<int>(mCustomParameters, "MaxBadDE_ST345", mMaxBadST345, activity);

mQualityChecker.mMaxBadST12 = mMaxBadST12;
mQualityChecker.mMaxBadST345 = mMaxBadST345;

mMinHeartBeatRate = getConfigurationParameter<double>(mCustomParameters, "MinHeartBeatRate", mMinHeartBeatRate, activity);
mMaxHeartBeatRate = getConfigurationParameter<double>(mCustomParameters, "MaxHeartBeatRate", mMaxHeartBeatRate, activity);
}

Quality DecodingCheck::check(std::map<std::string, std::shared_ptr<MonitorObject>>* moMap)
Expand Down Expand Up @@ -264,6 +266,16 @@ void DecodingCheck::beautify(std::shared_ptr<MonitorObject> mo, Quality checkRes
h->SetBinContent(deId + 1, ybin, 1);
}
}

// Normalize the heartBeat rate plots
if (mo->getName().find("HBRate_ST") != std::string::npos) {
TH2F* h = dynamic_cast<TH2F*>(mo->getObject());
if (!h) {
return;
}
h->SetMinimum(mMinHeartBeatRate);
h->SetMaximum(mMaxHeartBeatRate);
}
}

} // namespace o2::quality_control_modules::muonchambers
36 changes: 13 additions & 23 deletions Modules/MUON/MCH/src/DecodingTask.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
#include "MCHBase/DecoderError.h"
#include "MCHBase/HeartBeatPacket.h"

#include <TH1I.h>

using namespace o2;
using namespace o2::framework;
using namespace o2::mch;
Expand Down Expand Up @@ -57,7 +59,7 @@ void DecodingTask::createErrorHistos()
const uint32_t nElecXbins = NumberOfDualSampas;

// Number of decoding errors, grouped by chamber ID and normalized to the number of processed TF
mHistogramErrorsFEC = std::make_unique<TH2FRatio>("DecodingErrors_Elec", "Error Code vs. FEC ID", nElecXbins, 0, nElecXbins, getErrorCodesSize(), 0, getErrorCodesSize());
mHistogramErrorsFEC = std::make_unique<TH2FRatio>("DecodingErrors_Elec", "Error Code vs. FEC ID", nElecXbins, 0, nElecXbins, getErrorCodesSize(), 0, getErrorCodesSize(), true);
{
TAxis* ax = mHistogramErrorsFEC->GetYaxis();
for (int i = 0; i < getErrorCodesSize(); i++) {
Expand All @@ -75,16 +77,16 @@ void DecodingTask::createHeartBeatHistos()
const uint32_t nElecXbins = NumberOfDualSampas;

// Heart-beat packets time distribution and synchronization errors
mHistogramHBTimeFEC = std::make_unique<TH2FRatio>("HBTime_Elec", "HB time vs. FEC ID", nElecXbins, 0, nElecXbins, 40, mHBExpectedBc - 20, mHBExpectedBc + 20);
mHistogramHBTimeFEC = std::make_unique<TH2FRatio>("HBTime_Elec", "HB time vs. FEC ID", nElecXbins, 0, nElecXbins, 40, mHBExpectedBc - 20, mHBExpectedBc + 20, true);
mHistogramHBTimeFEC->Sumw2(kFALSE);
publishObject(mHistogramHBTimeFEC.get(), "colz", "logz", false, false);

uint64_t max = ((static_cast<uint64_t>(0x100000) / 100) + 1) * 100;
mHistogramHBCoarseTimeFEC = std::make_unique<TH2FRatio>("HBCoarseTime_Elec", "HB time vs. FEC ID (coarse)", nElecXbins, 0, nElecXbins, 100, 0, max);
mHistogramHBCoarseTimeFEC = std::make_unique<TH2FRatio>("HBCoarseTime_Elec", "HB time vs. FEC ID (coarse)", nElecXbins, 0, nElecXbins, 100, 0, max, true);
mHistogramHBCoarseTimeFEC->Sumw2(kFALSE);
publishObject(mHistogramHBCoarseTimeFEC.get(), "colz", "", false, false);

mSyncStatusFEC = std::make_unique<TH2FRatio>("SyncStatus_Elec", "Heart-beat status vs. FEC ID", nElecXbins, 0, nElecXbins, 3, 0, 3);
mSyncStatusFEC = std::make_unique<TH2FRatio>("SyncStatus_Elec", "Heart-beat status vs. FEC ID", nElecXbins, 0, nElecXbins, 3, 0, 3, true);
mSyncStatusFEC->Sumw2(kFALSE);
mSyncStatusFEC->GetYaxis()->SetBinLabel(1, "OK");
mSyncStatusFEC->GetYaxis()->SetBinLabel(2, "Out-of-sync");
Expand All @@ -103,7 +105,7 @@ void DecodingTask::initialize(o2::framework::InitContext& /*ic*/)

mElec2DetMapper = createElec2DetMapper<ElectronicMapperGenerated>();

mHistogramTimeFramesCount = std::make_unique<TH1F>("TimeFramesCount", "Number of Time Frames", 1, 0, 1);
mHistogramTimeFramesCount = std::make_unique<TH1I>("TimeFramesCount", "Number of Time Frames", 1, 0, 1);
publishObject(mHistogramTimeFramesCount.get(), "hist", "", true, false);

createErrorHistos();
Expand Down Expand Up @@ -329,7 +331,6 @@ void DecodingTask::updateSyncErrors()

void DecodingTask::monitorData(o2::framework::ProcessingContext& ctx)
{
static int nTF = 1;
for (auto&& input : ctx.inputs()) {
if (input.spec->binding == "readout") {
decodeReadout(input);
Expand All @@ -345,24 +346,7 @@ void DecodingTask::monitorData(o2::framework::ProcessingContext& ctx)
}
}

// Count the number of processed TF and set the denominators of the error histograms accordingly
nTF += 1;

mHistogramTimeFramesCount->Fill(0.5);

auto updateTFcount = [](TH2FRatio* hr, int nTF) {
auto hTF = hr->getDen();
for (int ybin = 1; ybin <= hTF->GetYaxis()->GetNbins(); ybin++) {
for (int xbin = 1; xbin <= hTF->GetXaxis()->GetNbins(); xbin++) {
hTF->SetBinContent(xbin, ybin, nTF);
}
}
};

updateTFcount(mHistogramErrorsFEC.get(), nTF);
updateTFcount(mHistogramHBTimeFEC.get(), nTF);
updateTFcount(mHistogramHBCoarseTimeFEC.get(), nTF);
updateTFcount(mSyncStatusFEC.get(), nTF);
}

//_____________________________________________________________________________
Expand All @@ -371,6 +355,12 @@ void DecodingTask::endOfCycle()
{
ILOG(Debug, Devel) << "endOfCycle" << ENDM;

int nTF = static_cast<int>(mHistogramTimeFramesCount->GetBinContent(1));
mHistogramErrorsFEC->getDen()->SetBinContent(1, 1, nTF);
mHistogramHBTimeFEC->getDen()->SetBinContent(1, 1, nTF);
mHistogramHBCoarseTimeFEC->getDen()->SetBinContent(1, 1, nTF);
mSyncStatusFEC->getDen()->SetBinContent(1, 1, nTF);

mHistogramErrorsFEC->update();
mHistogramHBCoarseTimeFEC->update();
mHistogramHBTimeFEC->update();
Expand Down
Loading