ATLAS Offline Software
Loading...
Searching...
No Matches
HLTMETStatus.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
5/* Algorithm: AlgHLTMETStatus does the following
6 * Checks the [EF/L2]_MET_status histograms (produced for 10 min block / entire run)
7 * There are 32 status bits and each bin of the above histograms represent a status.
8 * If the status bits 17 -> 29 (in general binLo -> binHi) are filled, flag = YELLOW
9 * If the status bits 32 -> 32 (in general binLo -> binHi) are filled, flag = RED
10 * Expects the following from configuration [<value> corresponds to a bin number]
11 * METYellowMin = <value> specify the bins you want to compute flags for [1-32]
12 * METYellowMax = <value> ditto
13 * METRedMin = <value> ditto
14 * METRedMax = <value> ditto
15 * DoYellowFlag = <1 or 0> 0 means don't compute yellow flags
16 * DoRedFlag = <1 or 0> 0 means don't compute red flags
17 *
18 * Author : Venkatesh Kaushik <venkat.kaushik@cern.ch>
19 * Date : March 2010
20 */
21
22#include <dqm_core/AlgorithmConfig.h>
25#include <TH1.h>
26#include <TH2.h>
27#include <TF1.h>
28#include <TClass.h>
29#include <ers/ers.h>
30
31#include <dqm_core/AlgorithmManager.h>
32
34
36
37{
38 dqm_core::AlgorithmManager::instance().registerAlgorithm("AlgHLTMETStatus", this);
39}
40
47
48
49dqm_core::Result *
51 const TObject & object,
52 const dqm_core::AlgorithmConfig & config)
53{
54 const TH1 * histogram;
55
56 if( object.IsA()->InheritsFrom( "TH1" ) ) {
57 histogram = static_cast<const TH1*>(&object);
58 if (histogram->GetDimension() > 2 ){
59 throw dqm_core::BadConfig( ERS_HERE, name, "dimension > 2 " );
60 }
61 } else {
62 throw dqm_core::BadConfig( ERS_HERE, name, "does not inherit from TH1" );
63 }
65 // Get Green and Red Thresholds
66 double grThr = 0.05, reThr = 0.1; // Green and Red thresholds
67 try {
68 grThr = dqm_algorithms::tools::GetFromMap("Threshold",config.getGreenThresholds() );
69 reThr = dqm_algorithms::tools::GetFromMap("Threshold",config.getRedThresholds() );
70 } catch ( dqm_core::Exception & ex ) {
71 throw dqm_core::BadConfig(ERS_HERE,name,"Paramter: 'Threshold' is mandatory, cannot continue");
72 }
73
74 //non sense case: compare fraction and threshold >100%
75 if ((grThr>1.0 || reThr>1.0) ) {
76 throw dqm_core::BadConfig(ERS_HERE,m_name,"Configuration Error: Threshold should be between [0.0, 1.0] 10% => 0.1");
77 }
78
79
81 // Get Parameters
82 size_t ntotBins = (size_t) histogram -> GetNbinsX();
83
84 // read thresholds
85 size_t colflags[4];
86 colflags[0] = static_cast<size_t>(dqm_algorithms::tools::GetFirstFromMap("METYellowMin", config.getParameters(), 1));
87 colflags[1] = static_cast<size_t>(dqm_algorithms::tools::GetFirstFromMap("METYellowMax", config.getParameters(), ntotBins));
88 colflags[2] = static_cast<size_t>(dqm_algorithms::tools::GetFirstFromMap("METRedMin", config.getParameters(), 1));
89 colflags[3] = static_cast<size_t>(dqm_algorithms::tools::GetFirstFromMap("METRedMax", config.getParameters(), ntotBins));
90 // read options
91 bool doflags[2];
92 doflags[0] = static_cast<bool>(dqm_algorithms::tools::GetFirstFromMap("DoYellowFlag", config.getParameters(), 1));
93 doflags[1] = static_cast<bool>(dqm_algorithms::tools::GetFirstFromMap("DoRedFlag", config.getParameters(), 1));
94
95 dqm_core::Result* result = new dqm_core::Result();
96 colflags[0] = ((colflags[0] > 0) && (colflags[0] <= ntotBins)) ? colflags[0] : 1;
97 colflags[1] = ((colflags[1] >= colflags[0]) && (colflags[1] <= ntotBins)) ? colflags[1] : ntotBins;
98 colflags[2] = ((colflags[2] > 0) && (colflags[2] <= ntotBins)) ? colflags[2] : 1;
99 colflags[3] = ((colflags[3] >= colflags[2]) && (colflags[3] <= ntotBins)) ? colflags[3] : ntotBins;
100 bool yellowLo2HiEmpty = true, redLo2HiEmpty = true;
101 int ycnt = 0, rcnt = 0;
102
103 // we fill 1(error) or 0(no-error) for each bin for every event
104 // therefore we have to divide #of entries by #of bins
105 // to get the #of events
106 double nentries = histogram -> GetEntries();
107 double nevtstot = 1.; // no. of events
108 if(!std::isnan(nentries/ntotBins) || !std::isinf(nentries / ntotBins)) nevtstot = nentries/ntotBins;
109
110 // yellow flag
111 double theYFracMax = -9., theRFracMax = -9.;
112 if(doflags[0]) {
113 for( size_t j = colflags[0]; j <= colflags[1]; j++ ) {
114 // if at least one of the bins > 0 : flag = YELLOW
115 double thebinc = histogram -> GetBinContent(j);
116 // fraction of events having this error-bit set
117 double thefrac = thebinc / nevtstot;
118
119 // "Worst-case flag not to exceed YELLOW" flag:
120 // if threshold exceeds green threshold, set yellow
121 // if threshold exceeds red threshold, still set yellow
122 // reThr > grThr
123 if(thefrac > grThr) {
124 if(theYFracMax < thefrac) theYFracMax = thefrac;
125 yellowLo2HiEmpty = false;
126 ycnt ++;
127 }
128 }
129 }
130
131 // red flag
132 if(doflags[1]) {
133 for( size_t j = colflags[2]; j <= colflags[3]; j++ ) {
134 // if at least one of the bins > 0 : flag = RED
135 double thebinc = histogram -> GetBinContent(j);
136 // fraction of events having this error-bit set
137 double thefrac = thebinc / nevtstot;
138 if(thefrac > reThr) {
139 if(theRFracMax < thefrac) theRFracMax = thefrac;
140 redLo2HiEmpty = false;
141 rcnt++;
142 }
143 }
144 }
145
146 // set results
147 result->status_ = dqm_core::Result::Green;
148
149 if(doflags[0] && !yellowLo2HiEmpty) {
150 result->status_ = dqm_core::Result::Yellow;
151 }
152
153 if(doflags[1] && !redLo2HiEmpty) {
154 result->status_ = dqm_core::Result::Red;
155 }
156
157 result->tags_["NumOfStatusBitsYellow"] = ycnt;
158 result->tags_["EventFractionYellow"] = theYFracMax;
159 result->tags_["NumOfStatusBitsRed"] = rcnt;
160 result->tags_["EventFractionRed"] = theRFracMax;
161
163
164 return result;
165}
166
167void
169{
170
171 out<<"HLT MET Status: Of the 32 status bits, check if any subset of bits are set. If so, flag YELLOW" << std::endl;
172 out<<"Bit #32 is global error bit, if set flag RED." << std::endl;
173
174 out<<"Mandatory parameter: XBin: The label of the X bin that you would like to check\n"<<std::endl;
175
176}
177
static dqm_algorithms::BinContentComp myInstance
TGraphErrors * GetEntries(TH2F *histo)
std::string histogram
Definition chains.cxx:52
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)
dqm_core::Result * execute(const std::string &, const TObject &, const dqm_core::AlgorithmConfig &)
void printDescription(std::ostream &out)
#define IsA
Declare the TObject style functions.