ATLAS Offline Software
Loading...
Searching...
No Matches
LastBinThresholdAction.cxx
Go to the documentation of this file.
1/*
2Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include <dqm_core/AlgorithmConfig.h>
8#include <TH1.h>
9#include <TF1.h>
10#include <TProfile.h>
11#include <TClass.h>
12#include <ers/ers.h>
13
14#include <iostream>
15#include <cstdlib>
16#include <regex>
17
18#include <dqm_core/AlgorithmManager.h>
19
20namespace {
21
22
24 LastBinGreaterThanThreshold("LastBinGreaterThanThreshold");
25
27 LastBinLessThanThreshold("LastBinLessThanThreshold");
28
30 LastBinDifferentThanThreshold("LastBinDifferentThanThreshold");
31
33 TileDataCorruptionFractionGreaterThanThreshold("TileDataCorruptionGreaterThanThreshold");
34}
35
36void dqm_algorithms::TileDQAction::operator() (const std::string& histogramName, std::string action,
37 double averageBinContent, double lastBinContent) const {
38
39 const char* actionPath = std::getenv("TILE_DQ_ACTION_PATH");
40 if (actionPath != nullptr) action = std::string(actionPath) + "/" + action;
41
42 std::smatch match;
43 std::regex expression (".*([LE]B[AC]\\d\\d).*");
44
45 std::string module("UNKNOWN");
46 if (std::regex_search(histogramName, match, expression) && match.size() > 1) {
47 module = match.str(1);
48 }
49
50 action += " ";
51 action += histogramName;
52 action += " ";
53 action += module;
54 action += " ";
55 action += std::to_string(lastBinContent);
56 action += " ";
57 action += std::to_string(averageBinContent);
58 action += " &";
59 std::system(action.c_str());
60}
61
62
63template<class Exceed, class Action>
65 : m_name( name )
66{
67 dqm_core::AlgorithmManager::instance().registerAlgorithm(name, this);
68}
69
70template<class Exceed, class Action>
75
76
77template<class Exceed, class Action> dqm_core::Result*
79 const TObject& object,
80 const dqm_core::AlgorithmConfig& config )
81{
82 const TProfile* histogram;
83
84 if( object.IsA()->InheritsFrom( "TProfile" ) ) {
85 histogram = static_cast<const TProfile*>(&object);
86 if (histogram->GetDimension() > 1){
87 throw dqm_core::BadConfig( ERS_HERE, name, "dimension > 2 " );
88 }
89 } else {
90 throw dqm_core::BadConfig( ERS_HERE, name, "does not inherit from TProfile" );
91 }
92
93 const double minStat = dqm_algorithms::tools::GetFirstFromMap( "MinStat", config.getParameters(), -1);
94 const double fixedError = dqm_algorithms::tools::GetFirstFromMap( "FixedError", config.getParameters(), -1);
95 const bool ignoreEmpty = static_cast<bool>( dqm_algorithms::tools::GetFirstFromMap( "IgnoreEmpty", config.getParameters(), 1) );
96 const bool publish = static_cast<bool>( dqm_algorithms::tools::GetFirstFromMap( "PublishBins", config.getParameters(), 0) );
97 const int maxPublish = static_cast<int>( dqm_algorithms::tools::GetFirstFromMap( "MaxPublish", config.getParameters(), 20) );
98 const int nBinsToWatch = static_cast<int>( dqm_algorithms::tools::GetFirstFromMap( "NBinsToWatch", config.getParameters(), -1) );
99 const int nBinsForAction = static_cast<int>( dqm_algorithms::tools::GetFirstFromMap( "NBinsForAction", config.getParameters(), 99999) );
100
101 std::string action("");
102 std::map<std::string, std::string>::const_iterator itAction = config.getGenericParameters().find("Action");
103 if (itAction != config.getGenericParameters().end()) {
104 action = itAction->second;
105 }
106
107 if (histogram->GetEntries() < minStat ) {
108 dqm_core::Result *result = new dqm_core::Result(dqm_core::Result::Undefined);
109 result->tags_["InsufficientEntries"] = histogram->GetEntries();
110 return result;
111 }
112
113 double binThreshold;
114 double greenThreshold;
115 double redThreshold;
116 try {
117 binThreshold = dqm_algorithms::tools::GetFirstFromMap( "BinThreshold", config.getParameters() );
118 redThreshold = dqm_algorithms::tools::GetFromMap( "NBins", config.getRedThresholds() );
119 greenThreshold = dqm_algorithms::tools::GetFromMap( "NBins", config.getGreenThresholds() );
120 } catch ( dqm_core::Exception & ex ) {
121 throw dqm_core::BadConfig( ERS_HERE, name, ex.what(), ex );
122 }
123
124 dqm_core::Result* result = new dqm_core::Result();
125
126 int nBinsOverThreshold = 0;
127
128 int firstBin = 1;
129 int lastBin = histogram->GetNbinsX();
130
131 if (nBinsToWatch > 0) {
132 while ((histogram->GetBinEntries(lastBin) == 0) && (lastBin > 1)) --lastBin;
133 firstBin = (lastBin > nBinsToWatch) ? (lastBin - nBinsToWatch + 1) : 1;
134
135 result->tags_["LastBinNumber"] = lastBin; // report where we began the checks (mostly for debugging)
136 result->tags_["LastBinCenter"] = histogram->GetBinCenter(lastBin); // report where that is on the x-axis
137 }
138
139 double lastBinOverThresholdContent(0.0);
140 double binsOverThresholdContent(0.0);
141
142 for (int bin = firstBin; bin <= lastBin; ++bin) {
143 if (ignoreEmpty && (histogram->GetBinEntries(bin) == 0)) {
144 continue;
145 }
146 double content = histogram->GetBinContent(bin);
147 if (m_exceeds(content, binThreshold, fixedError)) {
148 ++nBinsOverThreshold;
149 lastBinOverThresholdContent = content;
150 binsOverThresholdContent += content;
151 if (publish && nBinsOverThreshold < maxPublish){
153 }
154 }
155 }
156
157 ERS_DEBUG(1,"Number of bins exceeded threshold of " << binThreshold << " is " << nBinsOverThreshold );
158 ERS_DEBUG(1,"Green threshold: "<< greenThreshold << " bin(s); Red threshold : " << redThreshold << " bin(s) ");
159
160 result->tags_["NBins"] = nBinsOverThreshold;
161 if (greenThreshold > redThreshold) {
162 if (nBinsOverThreshold >= greenThreshold) {
163 result->status_ = dqm_core::Result::Green;
164 } else if (nBinsOverThreshold > redThreshold) {
165 result->status_ = dqm_core::Result::Yellow;
166 } else {
167 result->status_ = dqm_core::Result::Red;
168 }
169 } else {
170 if (nBinsOverThreshold <= greenThreshold) {
171 result->status_ = dqm_core::Result::Green;
172 } else if (nBinsOverThreshold < redThreshold) {
173 result->status_ = dqm_core::Result::Yellow;
174 } else {
175 result->status_ = dqm_core::Result::Red;
176 }
177 }
178
179 if (!action.empty() && nBinsOverThreshold >= nBinsForAction && nBinsOverThreshold!=0) {
180 double averageBinContent = binsOverThresholdContent / nBinsOverThreshold;
181 //coverity[copy_constructor_call]
182 m_doAction(histogram->GetName(), action, lastBinOverThresholdContent, averageBinContent);
183 }
184
185 return result;
186
187}
188
189template<class Exceed, class Action>
191
192 out << m_name + ": Checks for number of bins exceded threshold value" << std::endl;
193 out << "Mandatory Parameter: BinThreshold: Look for bins exceeded BinTreshold; Count number of bins satifying requirement" << std::endl;
194 out << "Mandatory Green/Red Threshold: NBins: Number of bins satifying BinThreshold constraint to give Green/Red result" << std::endl;
195
196 out << "Optional Parameter: FixedError: override the histogram errors with this value" << std::endl;
197 out << "Optional Parameter: IgnoreEmpty: Ignore bins which have zero entries in histogram" << std::endl;
198 out << "Optional Parameter: PublishBins: Save bins which are different from average in Result (set to 1)" << std::endl;
199 out << "Optional Parameter: MaxPublish: Max number of bins to save (default 20)" << std::endl;
200 out << "Optional Parameter: MinStat: Minimum histogram statistics needed to perform Algorithm" << std::endl;
201 out << "Optional parameter: NBinsToWatch - number of final bins that will be checked. (NBinsToWatch >= 1, default = -1)" << std::endl;
202}
203
204
205// Make sure these are completely instantiated here, as the definitions
206// are only in this file.
std::string histogram
Definition chains.cxx:52
virtual dqm_core::Result * execute(const std::string &, const TObject &, const dqm_core::AlgorithmConfig &) override
virtual LastBinThresholdAction * clone() override
virtual void printDescription(std::ostream &out) const
void operator()(const std::string &histogramName, std::string action, double averageBinContent, double lastBinContent) const
bool match(std::string s1, std::string s2)
match the individual directories of two strings
Definition hcg.cxx:357
double GetFirstFromMap(const std::string &paramName, const std::map< std::string, double > &params)
const T & GetFromMap(const std::string &pname, const std::map< std::string, T > &params)
void PublishBin(const TH1 *histogram, int xbin, int ybin, double content, dqm_core::Result *result)
#define IsA
Declare the TObject style functions.