Skip to content

Commit eafbbd5

Browse files
TRD: Check on Trigger and timeframe without tracklets (#2011)
* using smart pointer for TPave text in place of plain pointer in check function * Tried to use ALICE guidlines and to fix smart pointer issue
1 parent 0bd4450 commit eafbbd5

5 files changed

Lines changed: 220 additions & 136 deletions

File tree

Modules/TRD/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
add_library(O2QcTRD)
44

5-
target_sources(O2QcTRD PRIVATE src/TrackletPerTriggerCheck.cxx src/TRDReductor.cxx src/PulsePositionCheck.cxx src/TrackingTask.cxx src/PulseHeightTrackMatch.cxx src/TrackletsCheck.cxx src/TrackletsTask.cxx src/PulseHeightCheck.cxx src/PulseHeight.cxx src/RawData.cxx src/DigitsTask.cxx
5+
target_sources(O2QcTRD PRIVATE src/TrackletCountCheck.cxx src/TRDReductor.cxx src/PulsePositionCheck.cxx src/TrackingTask.cxx src/PulseHeightTrackMatch.cxx src/TrackletsCheck.cxx src/TrackletsTask.cxx src/PulseHeightCheck.cxx src/PulseHeight.cxx src/RawData.cxx src/DigitsTask.cxx
66
src/DigitsCheck.cxx src/TRDTrending.cxx src/TrendingTaskConfigTRD.cxx src/PulseHeightPostProcessing.cxx)
77

88
target_include_directories(
@@ -20,7 +20,7 @@ install(TARGETS O2QcTRD
2020

2121
add_root_dictionary(O2QcTRD
2222
HEADERS
23-
include/TRD/TrackletPerTriggerCheck.h
23+
include/TRD/TrackletCountCheck.h
2424
include/TRD/TRDReductor.h
2525
include/TRD/PulsePositionCheck.h
2626
include/TRD/TrackingTask.h

Modules/TRD/include/TRD/LinkDef.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@
1717
#pragma link C++ class o2::quality_control_modules::trd::TrackingTask + ;
1818
#pragma link C++ class o2::quality_control_modules::trd::PulsePositionCheck + ;
1919
#pragma link C++ class o2::quality_control_modules::trd::TRDReductor + ;
20-
#pragma link C++ class o2::quality_control_modules::trd::TrackletPerTriggerCheck + ;
20+
#pragma link C++ class o2::quality_control_modules::trd::TrackletCountCheck + ;
2121
#endif

Modules/TRD/include/TRD/TrackletPerTriggerCheck.h renamed to Modules/TRD/include/TRD/TrackletCountCheck.h

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,39 +10,43 @@
1010
// or submit itself to any jurisdiction.
1111

1212
///
13-
/// \file TrackletPerTriggerCheck.h
14-
/// \author Deependra Sharma
13+
/// \file TrackletCountCheck.h
14+
/// \author Deependra Sharma @IITB
1515
///
1616

17-
#ifndef QC_MODULE_TRD_TRDTRACKLETPERTRIGGERCHECK_H
18-
#define QC_MODULE_TRD_TRDTRACKLETPERTRIGGERCHECK_H
17+
#ifndef QC_MODULE_TRD_TRDTRACKLETCOUNTCHECK_H
18+
#define QC_MODULE_TRD_TRDTRACKLETCOUNTCHECK_H
1919

20+
#include <TPaveText.h>
2021
#include "QualityControl/CheckInterface.h"
2122

2223
namespace o2::quality_control_modules::trd
2324
{
24-
25-
/// \brief QC Check on TrackletPerTriggerCheck
26-
/// \author Deependra Sharma
27-
class TrackletPerTriggerCheck : public o2::quality_control::checker::CheckInterface
25+
class TrackletCountCheck : public o2::quality_control::checker::CheckInterface
2826
{
2927
public:
3028
/// Default constructor
31-
TrackletPerTriggerCheck() = default;
29+
TrackletCountCheck() = default;
3230
/// Destructor
33-
~TrackletPerTriggerCheck() override = default;
31+
~TrackletCountCheck() override = default;
3432

3533
// Override interface
3634
void configure() override;
3735
Quality check(std::map<std::string, std::shared_ptr<MonitorObject>>* moMap) override;
3836
void beautify(std::shared_ptr<MonitorObject> mo, Quality checkResult = Quality::Null) override;
3937
std::string getAcceptedType() override;
40-
float mThresholdMeanLow, mThresholdMeanHigh;
41-
int mStatThreshold;
38+
float mThresholdMeanLowPerTrigger, mThresholdMeanHighPerTrigger, mThresholdMeanLowPerTimeFrame, mThresholdMeanHighPerTimeFrame;
39+
int mStatThresholdPerTrigger;
40+
Quality mResultPertrigger;
41+
Quality mResultPerTimeFrame;
42+
Quality mFinalResult;
43+
44+
std::shared_ptr<TPaveText> mTrackletPerTriggerMessage;
45+
std::shared_ptr<TPaveText> mTrackletPerTimeFrameMessage;
4246

43-
ClassDefOverride(TrackletPerTriggerCheck, 2);
47+
ClassDefOverride(TrackletCountCheck, 2);
4448
};
4549

4650
} // namespace o2::quality_control_modules::trd
4751

48-
#endif // QC_MODULE_TRD_TRDTRACKLETPERTRIGGERCHECK_H
52+
#endif // QC_MODULE_TRD_TRDTRACKLETCOUNTCHECK_H
Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2+
// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3+
// All rights not expressly granted are reserved.
4+
//
5+
// This software is distributed under the terms of the GNU General Public
6+
// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7+
//
8+
// In applying this license CERN does not waive the privileges and immunities
9+
// granted to it by virtue of its status as an Intergovernmental Organization
10+
// or submit itself to any jurisdiction.
11+
12+
///
13+
/// \file TrackletCountCheck.cxx
14+
/// \author Deependra Sharma @IITB
15+
///
16+
17+
#include "TRD/TrackletCountCheck.h"
18+
#include "QualityControl/MonitorObject.h"
19+
#include "QualityControl/Quality.h"
20+
#include "QualityControl/QcInfoLogger.h"
21+
#include "Common/Utils.h"
22+
// ROOT
23+
#include <TH1.h>
24+
#include <TPaveText.h>
25+
26+
#include <DataFormatsQualityControl/FlagReasons.h>
27+
28+
using namespace std;
29+
using namespace o2::quality_control;
30+
using namespace o2::quality_control_modules::common;
31+
32+
namespace o2::quality_control_modules::trd
33+
{
34+
35+
void TrackletCountCheck::configure()
36+
{
37+
ILOG(Debug, Devel) << "initializing TrackletCountCheck" << ENDM;
38+
39+
mThresholdMeanHighPerTimeFrame = getFromConfig<float>(mCustomParameters, "UpperthresholdPerTimeFrame", 520.f);
40+
ILOG(Debug, Support) << "using Upperthreshold Per Timeframe= " << mThresholdMeanHighPerTimeFrame << ENDM;
41+
42+
mThresholdMeanLowPerTimeFrame = getFromConfig<float>(mCustomParameters, "LowerthresholdPerTimeFrame", 600.f);
43+
ILOG(Debug, Support) << "using Lowerthreshold Per Timeframe= " << mThresholdMeanLowPerTimeFrame << ENDM;
44+
45+
mThresholdMeanHighPerTrigger = getFromConfig<float>(mCustomParameters, "UpperthresholdPerTrigger", 520.f);
46+
ILOG(Debug, Support) << "using Upperthreshold Per Trigger= " << mThresholdMeanHighPerTrigger << ENDM;
47+
48+
mThresholdMeanLowPerTrigger = getFromConfig<float>(mCustomParameters, "LowerthresholdPerTrigger", 500.f);
49+
ILOG(Debug, Support) << "using Lowerthreshold Per Trigger= " << mThresholdMeanLowPerTrigger << ENDM;
50+
51+
mStatThresholdPerTrigger = getFromConfig<int>(mCustomParameters, "StatThresholdPerTrigger", 1000);
52+
ILOG(Debug, Support) << "using StatThreshold Per Trigger= " << mStatThresholdPerTrigger << ENDM;
53+
}
54+
55+
Quality TrackletCountCheck::check(std::map<std::string, std::shared_ptr<MonitorObject>>* moMap)
56+
{
57+
mResultPertrigger = Quality::Null;
58+
mResultPerTimeFrame = Quality::Null;
59+
60+
for (auto& [moName, mo] : *moMap) {
61+
ILOG(Debug, Support) << "moName =" << moName << ENDM;
62+
(void)moName;
63+
if (mo->getName() == "trackletsperevent") {
64+
auto* h = dynamic_cast<TH1F*>(mo->getObject());
65+
if (h == nullptr) {
66+
// ILOG(Debug, Support) << "Requested Histogram type does not match with the Histogram in source" << ENDM;
67+
continue;
68+
}
69+
// warning about statistics available
70+
mTrackletPerTriggerMessage.reset();
71+
if (!mTrackletPerTriggerMessage) {
72+
mTrackletPerTriggerMessage = std::make_shared<TPaveText>(0.3, 0.7, 0.7, 0.9, "NDC");
73+
}
74+
// mTrackletPerTriggerMessage = std::make_shared<TPaveText>(0.3, 0.7, 0.7, 0.9, "NDC");
75+
// mTrackletPerTriggerMessage->DeleteText();
76+
mTrackletPerTriggerMessage->SetTextSize(10);
77+
int entriesInQcHist = h->GetEntries();
78+
if (entriesInQcHist > mStatThresholdPerTrigger) {
79+
mTrackletPerTriggerMessage->AddText(TString::Format("Hist Can't be ignored. Stat is enough. entriesInQcHist: %d > Threshold: %d", entriesInQcHist, mStatThresholdPerTrigger));
80+
// mTrackletPerTriggerMessage->SetTextColor(kGreen);
81+
} else if (entriesInQcHist > 0) {
82+
mTrackletPerTriggerMessage->AddText(TString::Format("Hist Can be ignored. Stat is low. entriesInQcHist: %d < Threshold: %d", entriesInQcHist, mStatThresholdPerTrigger));
83+
// mTrackletPerTriggerMessage->SetTextColor(kYellow);
84+
} else if (entriesInQcHist == 0) {
85+
mTrackletPerTriggerMessage->AddText(TString::Format("Hist is empty. entriesInQcHist: %d < Threshold: %d", entriesInQcHist, mStatThresholdPerTrigger));
86+
mTrackletPerTriggerMessage->SetTextColor(kRed);
87+
}
88+
89+
// Warning about triggers without any tracklets
90+
int underFlowTrackletPerTrigger = h->GetBinContent(0);
91+
if (underFlowTrackletPerTrigger > 0.) {
92+
mTrackletPerTriggerMessage->AddText(TString::Format("Number of Triggers without Tracklets: %d", underFlowTrackletPerTrigger));
93+
}
94+
95+
// applying check
96+
float meanTrackletPerTrigger = h->GetMean();
97+
if (meanTrackletPerTrigger > mThresholdMeanLowPerTrigger && meanTrackletPerTrigger < mThresholdMeanHighPerTrigger) {
98+
TText* checkMessagePerTriggerPtr = mTrackletPerTriggerMessage->AddText(TString::Format("Mean Per Trigger: %f is found in bound region [%f, %f]", meanTrackletPerTrigger, mThresholdMeanLowPerTrigger, mThresholdMeanHighPerTrigger));
99+
checkMessagePerTriggerPtr->SetTextColor(kGreen);
100+
mResultPertrigger = Quality::Good;
101+
} else {
102+
mResultPertrigger = Quality::Bad;
103+
TText* checkMessagePerTriggerPtr = mTrackletPerTriggerMessage->AddText(TString::Format("Mean Per Trigger: %f is not found in bound region [%f, %f]", meanTrackletPerTrigger, mThresholdMeanLowPerTrigger, mThresholdMeanHighPerTrigger));
104+
checkMessagePerTriggerPtr->SetTextColor(kRed);
105+
mResultPertrigger.addReason(FlagReasonFactory::Unknown(), "meanTrackletPerTrigger is not in bound region");
106+
}
107+
h->GetListOfFunctions()->Add(mTrackletPerTriggerMessage->Clone());
108+
}
109+
if (mo->getName() == "trackletspertimeframe") {
110+
auto* h2 = dynamic_cast<TH1F*>(mo->getObject());
111+
if (h2 == nullptr) {
112+
// ILOG(Debug, Support) << "Requested Histogram type does not match with the Histogram in source" << ENDM;
113+
continue;
114+
}
115+
mTrackletPerTimeFrameMessage.reset();
116+
if (!mTrackletPerTimeFrameMessage) {
117+
mTrackletPerTimeFrameMessage = std::make_shared<TPaveText>(0.3, 0.7, 0.7, 0.9, "NDC");
118+
}
119+
// mTrackletPerTimeFrameMessage = std::make_shared<TPaveText>(0.3, 0.7, 0.7, 0.9, "NDC");
120+
// mTrackletPerTimeFrameMessage->DeleteText();
121+
mTrackletPerTimeFrameMessage->SetTextSize(10);
122+
123+
// Warning about TimeFrame without any tracklets
124+
int underFlowTrackletPerTimeFrame = h2->GetBinContent(0);
125+
if (underFlowTrackletPerTimeFrame > 0.) {
126+
mTrackletPerTimeFrameMessage->AddText(TString::Format("Number of TimeFrames without Tracklets: %d", underFlowTrackletPerTimeFrame));
127+
}
128+
129+
// applying check
130+
float meanTrackletPerTimeframe = h2->GetMean();
131+
if (meanTrackletPerTimeframe > mThresholdMeanLowPerTimeFrame && meanTrackletPerTimeframe < mThresholdMeanHighPerTimeFrame) {
132+
TText* checkMessagePerTimeframePtr = mTrackletPerTimeFrameMessage->AddText(TString::Format("Mean Per Timeframe: %f is found in bound region [%f, %f]", meanTrackletPerTimeframe, mThresholdMeanLowPerTimeFrame, mThresholdMeanHighPerTimeFrame));
133+
checkMessagePerTimeframePtr->SetTextColor(kGreen);
134+
mResultPerTimeFrame = Quality::Good;
135+
} else {
136+
mResultPerTimeFrame = Quality::Bad;
137+
TText* checkMessagePerTimeframePtr = mTrackletPerTimeFrameMessage->AddText(TString::Format("Mean per Timeframe: %f is not found in bound region[%f, %f]", meanTrackletPerTimeframe, mThresholdMeanLowPerTimeFrame, mThresholdMeanHighPerTimeFrame));
138+
checkMessagePerTimeframePtr->SetTextColor(kRed);
139+
mResultPerTimeFrame.addReason(FlagReasonFactory::Unknown(), "meanTrackletPerTimeframe is not in bound region");
140+
}
141+
h2->GetListOfFunctions()->Add(mTrackletPerTimeFrameMessage->Clone());
142+
}
143+
}
144+
if (mResultPertrigger == Quality::Null && mResultPerTimeFrame == Quality::Null) {
145+
mFinalResult = Quality::Null;
146+
mFinalResult.addReason(FlagReasonFactory::Unknown(), "Quality of both trackletspertimeframe and trackletsperevent is unknown");
147+
} else if ((mResultPertrigger == Quality::Null && mResultPerTimeFrame == Quality::Good) || (mResultPertrigger == Quality::Good && mResultPerTimeFrame == Quality::Null)) {
148+
mFinalResult = Quality::Medium;
149+
mFinalResult.addReason(FlagReasonFactory::Unknown(), "Quality of any of trackletspertimeframe and trackletsperevent is unknown");
150+
} else if (mResultPertrigger == Quality::Bad || mResultPerTimeFrame == Quality::Bad) {
151+
mFinalResult = Quality::Bad;
152+
mFinalResult.addReason(FlagReasonFactory::Unknown(), "Quality of both or any of trackletspertimeframe and trackletsperevent is bad");
153+
} else {
154+
mFinalResult = Quality::Good;
155+
}
156+
return mFinalResult;
157+
}
158+
159+
std::string TrackletCountCheck::getAcceptedType() { return "TH1"; }
160+
161+
void TrackletCountCheck::beautify(std::shared_ptr<MonitorObject> mo, Quality checkResult)
162+
{
163+
if (mo->getName() == "trackletsperevent") {
164+
auto* h1 = dynamic_cast<TH1F*>(mo->getObject());
165+
if (h1 == nullptr) {
166+
// ILOG(Debug, Support) << "Requested Histogram type does not match with the Histogram in source" << ENDM;
167+
return;
168+
}
169+
if (mResultPertrigger == Quality::Good) {
170+
h1->SetFillColor(kGreen);
171+
} else if (mResultPertrigger == Quality::Bad) {
172+
ILOG(Debug, Devel) << "Quality::Bad, setting to red" << ENDM;
173+
h1->SetFillColor(kRed);
174+
} else if (mResultPertrigger == Quality::Medium) {
175+
ILOG(Debug, Devel) << "Quality::medium, setting to orange" << ENDM;
176+
h1->SetFillColor(kOrange);
177+
}
178+
h1->SetLineColor(kBlack);
179+
}
180+
if (mo->getName() == "trackletspertimeframe") {
181+
auto* h2 = dynamic_cast<TH1F*>(mo->getObject());
182+
if (h2 == nullptr) {
183+
// ILOG(Debug, Support) << "Requested Histogram type does not match with the Histogram in source" << ENDM;
184+
return;
185+
}
186+
if (mResultPerTimeFrame == Quality::Good) {
187+
h2->SetFillColor(kGreen);
188+
} else if (mResultPerTimeFrame == Quality::Bad) {
189+
ILOG(Debug, Devel) << "Quality::Bad, setting to red" << ENDM;
190+
h2->SetFillColor(kRed);
191+
} else if (mResultPerTimeFrame == Quality::Medium) {
192+
ILOG(Debug, Devel) << "Quality::medium, setting to orange" << ENDM;
193+
h2->SetFillColor(kOrange);
194+
}
195+
h2->SetLineColor(kBlack);
196+
}
197+
}
198+
199+
} // namespace o2::quality_control_modules::trd

0 commit comments

Comments
 (0)