Skip to content

Commit 4d2366d

Browse files
authored
[MCH] various fixes to post-processing and checks (#1710)
- fixed retrieval of QualityObjects from CCDB - fixed display of QualityObjects in summary canvas when objects are not updated - fixed bug in check of "good channels ratio" plot when no reference is available - removed verbose infologger messages - made plots and reductors optional in post-processing configuration - removed PaveText panel with check result on individual plots
1 parent f696914 commit 4d2366d

9 files changed

Lines changed: 122 additions & 152 deletions

File tree

Modules/MUON/MCH/include/MCH/Helpers.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,26 @@ struct CcdbObjectHelper {
137137

138138
//_________________________________________________________________________________________
139139

140+
struct QualityObjectHelper {
141+
QualityObjectHelper();
142+
QualityObjectHelper(std::string p, std::string n);
143+
144+
bool update(o2::quality_control::repository::DatabaseInterface* qcdb,
145+
long timeStamp = -1,
146+
const o2::quality_control::core::Activity& activity = {});
147+
void setStartIme();
148+
long getTimeStamp() { return mTimeStamp; }
149+
150+
std::shared_ptr<o2::quality_control::core::QualityObject> mObject;
151+
bool mUpdated{ false };
152+
std::string mPath;
153+
std::string mName;
154+
uint64_t mTimeStart{ 0 };
155+
uint64_t mTimeStamp{ 0 };
156+
};
157+
158+
//_________________________________________________________________________________________
159+
140160
class TrendGraph : public TCanvas
141161
{
142162
public:

Modules/MUON/MCH/include/MCH/QualityPostProcessing.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class QualityPostProcessing : public PostProcessingInterface
6767
std::string mMessageNull;
6868

6969
// CCDB object accessors
70-
std::vector<CcdbObjectHelper> mCcdbObjects;
70+
std::vector<QualityObjectHelper> mCcdbObjects;
7171
std::vector<std::string> mCheckerMessages;
7272

7373
// Quality histograms ===============================================

Modules/MUON/MCH/src/DecodingCheck.cxx

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
#include <TH2.h>
2626
#include <TList.h>
2727
#include <TMath.h>
28-
#include <TPaveText.h>
2928
#include <TLine.h>
3029
#include <iostream>
3130
#include <fstream>
@@ -209,31 +208,11 @@ void DecodingCheck::beautify(std::shared_ptr<MonitorObject> mo, Quality checkRes
209208
l->SetLineStyle(kDashed);
210209
h->GetListOfFunctions()->Add(l);
211210

212-
TPaveText* msg = new TPaveText(0.1, 0.9, 0.9, 0.95, "NDC");
213-
h->GetListOfFunctions()->Add(msg);
214-
msg->SetName(Form("%s_msg", mo->GetName()));
215-
msg->SetBorderSize(0);
216-
217211
if (checkResult == Quality::Good) {
218-
msg->Clear();
219-
msg->AddText("All errors within limits: OK!!!");
220-
msg->SetFillColor(kGreen);
221-
222212
h->SetFillColor(kGreen);
223213
} else if (checkResult == Quality::Bad) {
224-
ILOG(Debug, Devel) << "Quality::Bad, setting to red";
225-
//
226-
msg->Clear();
227-
msg->AddText("Too many errors, call MCH on-call.");
228-
msg->SetFillColor(kRed);
229-
230214
h->SetFillColor(kRed);
231215
} else if (checkResult == Quality::Medium) {
232-
ILOG(Debug, Devel) << "Quality::medium, setting to orange";
233-
234-
msg->Clear();
235-
msg->AddText("No entries. If MCH in the run, check Infologger");
236-
msg->SetFillColor(kYellow);
237216
h->SetFillColor(kOrange);
238217
}
239218
h->SetLineColor(kBlack);
@@ -258,31 +237,11 @@ void DecodingCheck::beautify(std::shared_ptr<MonitorObject> mo, Quality checkRes
258237
l->SetLineStyle(kDashed);
259238
h->GetListOfFunctions()->Add(l);
260239

261-
TPaveText* msg = new TPaveText(0.1, 0.9, 0.9, 0.95, "NDC");
262-
h->GetListOfFunctions()->Add(msg);
263-
msg->SetName(Form("%s_msg", mo->GetName()));
264-
msg->SetBorderSize(0);
265-
266240
if (checkResult == Quality::Good) {
267-
msg->Clear();
268-
msg->AddText("All errors within limits: OK!!!");
269-
msg->SetFillColor(kGreen);
270-
271241
h->SetFillColor(kGreen);
272242
} else if (checkResult == Quality::Bad) {
273-
ILOG(Debug, Devel) << "Quality::Bad, setting to red";
274-
//
275-
msg->Clear();
276-
msg->AddText("Too many errors, call MCH on-call.");
277-
msg->SetFillColor(kRed);
278-
279243
h->SetFillColor(kRed);
280244
} else if (checkResult == Quality::Medium) {
281-
ILOG(Debug, Devel) << "Quality::medium, setting to orange";
282-
283-
msg->Clear();
284-
msg->AddText("No entries. If MCH in the run, check Infologger");
285-
msg->SetFillColor(kYellow);
286245
h->SetFillColor(kOrange);
287246
}
288247
h->SetLineColor(kBlack);

Modules/MUON/MCH/src/DigitsCheck.cxx

Lines changed: 1 addition & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
#include <TCanvas.h>
2727
#include <TList.h>
2828
#include <TMath.h>
29-
#include <TPaveText.h>
3029
#include <TLine.h>
3130
#include <iostream>
3231
#include <fstream>
@@ -199,7 +198,7 @@ Quality DigitsCheck::check(std::map<std::string, std::shared_ptr<MonitorObject>>
199198

200199
if (matchHistName(mo->getName(), mGoodChanFracRatioHistName)) {
201200
TH1F* h = getHisto<TH1F>(mo);
202-
if (h) {
201+
if (h && h->GetEntries() > 0) {
203202
auto q = checkBadChannelsRatio(h);
204203
mQualityChecker.addCheckResult(q);
205204
}
@@ -265,31 +264,12 @@ void DigitsCheck::beautify(std::shared_ptr<MonitorObject> mo, Quality checkResul
265264
h->SetDrawOption("colz");
266265
h->SetMinimum(mRatePlotScaleMin);
267266
h->SetMaximum(mRatePlotScaleMax);
268-
TPaveText* msg = new TPaveText(0.1, 0.9, 0.9, 0.95, "NDC");
269-
h->GetListOfFunctions()->Add(msg);
270-
msg->SetName(Form("%s_msg", mo->GetName()));
271-
msg->SetBorderSize(0);
272267

273268
if (checkResult == Quality::Good) {
274-
msg->Clear();
275-
msg->AddText("All occupancies within limits: OK!!!");
276-
msg->SetFillColor(kGreen);
277-
278269
h->SetFillColor(kGreen);
279270
} else if (checkResult == Quality::Bad) {
280-
LOG(info) << "Quality::Bad, setting to red";
281-
//
282-
msg->Clear();
283-
msg->AddText("Call MCH experts");
284-
msg->SetFillColor(kRed);
285-
286271
h->SetFillColor(kRed);
287272
} else if (checkResult == Quality::Medium) {
288-
LOG(info) << "Quality::medium, setting to orange";
289-
290-
msg->Clear();
291-
msg->AddText("No entries. If MCH in the run, call MCH experts");
292-
msg->SetFillColor(kYellow);
293273
h->SetFillColor(kOrange);
294274
}
295275
h->SetLineColor(kBlack);
@@ -362,33 +342,11 @@ void DigitsCheck::beautify(std::shared_ptr<MonitorObject> mo, Quality checkResul
362342
h->GetListOfFunctions()->Add(l);
363343
}
364344

365-
h->SetFillColor(kGreen);
366-
367-
TPaveText* msg = new TPaveText(0.1, 0.903, 0.9, 0.945, "NDC");
368-
h->GetListOfFunctions()->Add(msg);
369-
msg->SetName(Form("%s_msg", mo->GetName()));
370-
msg->SetBorderSize(0);
371-
372345
if (checkResult == Quality::Good) {
373-
msg->Clear();
374-
msg->AddText("All occupancies within limits: OK!!!");
375-
msg->SetFillColor(kGreen);
376-
377346
h->SetFillColor(kGreen);
378347
} else if (checkResult == Quality::Bad) {
379-
LOG(info) << "Quality::Bad, setting to red";
380-
//
381-
msg->Clear();
382-
msg->AddText("Call MCH experts");
383-
msg->SetFillColor(kRed);
384-
385348
h->SetFillColor(kRed);
386349
} else if (checkResult == Quality::Medium) {
387-
LOG(info) << "Quality::medium, setting to orange";
388-
389-
msg->Clear();
390-
msg->AddText("No entries. If MCH in the run, call MCH experts");
391-
msg->SetFillColor(kYellow);
392350
h->SetFillColor(kOrange);
393351
}
394352
h->SetLineColor(kBlack);
@@ -442,33 +400,11 @@ void DigitsCheck::beautify(std::shared_ptr<MonitorObject> mo, Quality checkResul
442400
h->GetListOfFunctions()->Add(l);
443401
}
444402

445-
h->SetFillColor(kGreen);
446-
447-
TPaveText* msg = new TPaveText(0.1, 0.903, 0.9, 0.945, "NDC");
448-
h->GetListOfFunctions()->Add(msg);
449-
msg->SetName(Form("%s_msg", mo->GetName()));
450-
msg->SetBorderSize(0);
451-
452403
if (checkResult == Quality::Good) {
453-
msg->Clear();
454-
msg->AddText("All occupancies within limits: OK!!!");
455-
msg->SetFillColor(kGreen);
456-
457404
h->SetFillColor(kGreen);
458405
} else if (checkResult == Quality::Bad) {
459-
LOG(info) << "Quality::Bad, setting to red";
460-
//
461-
msg->Clear();
462-
msg->AddText("Call MCH experts");
463-
msg->SetFillColor(kRed);
464-
465406
h->SetFillColor(kRed);
466407
} else if (checkResult == Quality::Medium) {
467-
LOG(info) << "Quality::medium, setting to orange";
468-
469-
msg->Clear();
470-
msg->AddText("No entries. If MCH in the run, call MCH experts");
471-
msg->SetFillColor(kYellow);
472408
h->SetFillColor(kOrange);
473409
}
474410
h->SetLineColor(kBlack);

Modules/MUON/MCH/src/Helpers.cxx

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
#include "MCH/Helpers.h"
2020
#include "QualityControl/MonitorObject.h"
21+
#include "QualityControl/QualityObject.h"
22+
#include "QualityControl/ObjectMetadataKeys.h"
2123
#include "MCHRawElecMap/Mapper.h"
2224
#include <TLine.h>
2325
#include <TLine.h>
@@ -400,7 +402,7 @@ static long getMoTimeStamp(std::shared_ptr<o2::quality_control::core::MonitorObj
400402
{
401403
long timeStamp{ 0 };
402404

403-
auto iter = mo->getMetadataMap().find("Created");
405+
auto iter = mo->getMetadataMap().find(repository::metadata_keys::created);
404406
if (iter != mo->getMetadataMap().end()) {
405407
timeStamp = std::stol(iter->second);
406408
}
@@ -481,6 +483,77 @@ bool CcdbObjectHelper::update(repository::DatabaseInterface* qcdb, long timeStam
481483

482484
//_________________________________________________________________________________________
483485

486+
static long getQoTimeStamp(std::shared_ptr<o2::quality_control::core::QualityObject> qo)
487+
{
488+
long timeStamp{ 0 };
489+
490+
auto iter = qo->getMetadataMap().find(repository::metadata_keys::created);
491+
if (iter != qo->getMetadataMap().end()) {
492+
timeStamp = std::stol(iter->second);
493+
}
494+
495+
return timeStamp;
496+
}
497+
498+
//_________________________________________________________________________________________
499+
500+
static bool checkQoTimeStamp(std::shared_ptr<o2::quality_control::core::QualityObject> qo, uint64_t& timeStampOld)
501+
{
502+
auto timeStamp = getQoTimeStamp(qo);
503+
bool result = (timeStamp != timeStampOld) ? true : false;
504+
timeStampOld = timeStamp;
505+
return result;
506+
}
507+
508+
//_________________________________________________________________________________________
509+
510+
QualityObjectHelper::QualityObjectHelper()
511+
{
512+
setStartIme();
513+
}
514+
515+
//_________________________________________________________________________________________
516+
517+
QualityObjectHelper::QualityObjectHelper(std::string p, std::string n) : mPath(p), mName(n)
518+
{
519+
setStartIme();
520+
}
521+
522+
//_________________________________________________________________________________________
523+
524+
void QualityObjectHelper::setStartIme()
525+
{
526+
mTimeStart = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
527+
}
528+
529+
//_________________________________________________________________________________________
530+
531+
bool QualityObjectHelper::update(repository::DatabaseInterface* qcdb, long timeStamp, const core::Activity& activity)
532+
{
533+
mObject = qcdb->retrieveQO(mPath + "/" + mName, timeStamp, activity);
534+
if (!mObject) {
535+
return false;
536+
}
537+
538+
if (timeStamp > mTimeStart) {
539+
// we are requesting a new object, so check that the retrieved one
540+
// was created after the start of the processing
541+
if (getQoTimeStamp(mObject) < mTimeStart) {
542+
return false;
543+
}
544+
}
545+
546+
if (!checkQoTimeStamp(mObject, mTimeStamp)) {
547+
mUpdated = false;
548+
} else {
549+
mUpdated = true;
550+
}
551+
552+
return true;
553+
}
554+
555+
//_________________________________________________________________________________________
556+
484557
TrendGraph::TrendGraph(std::string name, std::string title, std::string label, std::optional<float> refValue)
485558
: TCanvas(name.c_str(), title.c_str()),
486559
mRefValue(refValue),

Modules/MUON/MCH/src/MCHAggregator.cxx

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,6 @@ std::map<std::string, Quality> MCHAggregator::aggregate(QualityObjectsMapType& q
2929
{
3030
std::map<std::string, Quality> result;
3131

32-
ILOG(Info, Devel) << "Entered MCHAggregator::aggregate" << ENDM;
33-
ILOG(Info, Devel) << " received a list of size : " << qoMap.size() << ENDM;
34-
for (const auto& item : qoMap) {
35-
ILOG(Info, Devel) << "Object: " << (*item.second) << ENDM;
36-
}
37-
3832
// we return the worse quality of all the objects we receive
3933
Quality current = Quality::Good;
4034
for (auto qo : qoMap) {
@@ -43,7 +37,6 @@ std::map<std::string, Quality> MCHAggregator::aggregate(QualityObjectsMapType& q
4337
}
4438
}
4539

46-
ILOG(Info, Devel) << " result: " << current << ENDM;
4740
result["MCHQuality"] = current;
4841

4942
return result;

Modules/MUON/MCH/src/PostProcessingConfigMCH.cxx

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,29 @@ PostProcessingConfigMCH::PostProcessingConfigMCH(std::string name, const boost::
3636
}
3737

3838
// Plot configuration
39-
for (const auto& plotConfig : config.get_child("qc.postprocessing." + name + ".plots")) {
40-
plots.push_back({ plotConfig.second.get<std::string>("name"),
41-
plotConfig.second.get<std::string>("title", ""),
42-
plotConfig.second.get<std::string>("varexp"),
43-
plotConfig.second.get<std::string>("selection", ""),
44-
plotConfig.second.get<std::string>("option", ""),
45-
plotConfig.second.get<std::string>("graphErrors", "") });
39+
auto plotConfigs = config.get_child_optional("qc.postprocessing." + name + ".plots");
40+
if (plotConfigs.has_value()) {
41+
for (const auto& plotConfig : plotConfigs.value()) {
42+
plots.push_back({ plotConfig.second.get<std::string>("name"),
43+
plotConfig.second.get<std::string>("title", ""),
44+
plotConfig.second.get<std::string>("varexp"),
45+
plotConfig.second.get<std::string>("selection", ""),
46+
plotConfig.second.get<std::string>("option", ""),
47+
plotConfig.second.get<std::string>("graphErrors", "") });
48+
}
4649
}
4750

4851
// Data source configuration
4952
for (const auto& dataSourceConfig : config.get_child("qc.postprocessing." + name + ".dataSources")) {
5053
if (const auto& sourceNames = dataSourceConfig.second.get_child_optional("names"); sourceNames.has_value()) {
5154
for (const auto& sourceName : sourceNames.value()) {
55+
auto reductorName = dataSourceConfig.second.get_optional<std::string>("reductorName");
56+
auto moduleName = dataSourceConfig.second.get_optional<std::string>("moduleName");
5257
dataSources.push_back({ dataSourceConfig.second.get<std::string>("type", "repository"),
5358
dataSourceConfig.second.get<std::string>("path"),
5459
sourceName.second.data(),
55-
dataSourceConfig.second.get<std::string>("reductorName"),
56-
dataSourceConfig.second.get<std::string>("moduleName") });
60+
(reductorName.has_value() ? reductorName.value() : ""),
61+
(moduleName.has_value() ? moduleName.value() : "") });
5762
}
5863
} else if (!dataSourceConfig.second.get<std::string>("name").empty()) {
5964
// "name" : [ "something" ] would return an empty string here

0 commit comments

Comments
 (0)