Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
L1Calo_BinsDiffFromStripMedian.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 /* L1Calo_BinsDiffFromStripMedian.cxx is to pick out the problematic bins in 2D histogram assuming that y-axis(the phi direction) be symmetric.
6  Originally Based on the BinsDiffFromStripMedian dqm algorithm.
7  Author: Will Buttinger
8  Email: will@cern.ch
9 */
10 
11 #include <dqm_core/AlgorithmConfig.h>
14 #include <dqm_core/AlgorithmManager.h>
15 
16 #include <TH1.h>
17 #include <TF1.h>
18 #include <TClass.h>
19 #include <TRandom3.h>
20 #include <cmath>
21 
22 #include <iostream>
23 #include <string>
24 #include <set>
25 
26 
28  const dqm_algorithms::L1Calo_BinsDiffFromStripMedian::bin& j){return (std::abs(i.m_outstandingRatio) > std::abs(j.m_outstandingRatio));}
30 
32 {
33  dqm_core::AlgorithmManager::instance().registerAlgorithm("L1Calo_BinsDiffFromStripMedian", this);
34 }
35 
37 {
38 }
39 
42 {
43 
44  return new L1Calo_BinsDiffFromStripMedian();
45 }
46 
47 
50  const TObject& object,
51  const dqm_core::AlgorithmConfig& config ) {
52  const TH1* histogram;
53 
54  if( object.IsA()->InheritsFrom( "TH1" ) ) {
55  histogram = static_cast<const TH1*>(&object);
56  if (histogram->GetDimension() > 2 ){
57  throw dqm_core::BadConfig( ERS_HERE, name, "dimension > 2 " );
58  }
59  } else {
60  throw dqm_core::BadConfig( ERS_HERE, name, "does not inherit from TH1" );
61  }
62 
63  const double minstat = dqm_algorithms::tools::GetFirstFromMap( "MinStat", config.getParameters(), 100);
64  const double ignoreBelow = dqm_algorithms::tools::GetFirstFromMap( "IgnoreBelow", config.getParameters(), 0);
65  const double probThreshold = dqm_algorithms::tools::GetFirstFromMap( "ProbThreshold", config.getParameters(), 0.01);
66  const int publishDetail = dqm_algorithms::tools::GetFirstFromMap( "PublishDetail", config.getParameters(), 0x20/*publish status code - since saw some inconsistencies in webdisplay on local testing. Should plan to set to 0 in future*/);
67  const int nBinsZ = dqm_algorithms::tools::GetFirstFromMap( "NBinsY", config.getParameters(), 0); // if this is specified, plot is interpreted as being temporal ... this is number of bins in the 'y-axis' direction of each time slice
68  const int minDuration = dqm_algorithms::tools::GetFirstFromMap( "MinDuration", config.getParameters(),3); // when in temporal mode, this is the number of consecutive bins in the time axis (x-axis) that an anomaly must exist for to be flagged
69  const int liveMode = dqm_algorithms::tools::GetFirstFromMap( "LiveMode", config.getParameters(), 0); // if non-zero, running in live (p1) mode, will influence how results presented
70  const int printLevel = dqm_algorithms::tools::GetFirstFromMap("OutputLevel",config.getParameters(),3); // controls debugging printout .. follows same outputlevel codes as athena (3=info)
71 
72  // use y-axis label to determine convention for temporal plot
73  bool reverseConvention = TString(histogram->GetYaxis()->GetTitle()).EndsWith("+y");
74 
75  std::map<std::string,std::set<std::pair<int,int>>> knownBins; // bins which are known to be a particular class
76 
77  auto knownBinParser = [&](const std::string& cutName) {
78  std::string known = dqm_algorithms::tools::GetFirstFromMap("Known"+cutName, config.getGenericParameters(), "");
79  // strip any non-numeric chars from the front
80  size_t i = 0;
81  while (i < known.length() && !std::isdigit(known[i])) {
82  i++;
83  }
84  known = known.substr(i);
85  known += ";"; // add final semicolon
86  i = known.find(",");
87  while(i != std::string::npos) {
88  size_t j = known.find(";");
89  knownBins[cutName].insert({TString(known.substr(0,i)).Atoi(),TString(known.substr(i+1,j-i-1)).Atoi()});
90  known = known.substr(j+1);
91  i = known.find(",");
92  }
93  };
94 
95  std::vector<std::pair<double,std::string>> orderedCuts;
96  double mostNegativeCut = 0;
97  for(auto& [k,v] : config.getParameters()) {
98  TString kk(k);
99  if(!kk.EndsWith("Cut")) continue;
100  kk = kk(0,kk.Length()-3);
101  orderedCuts.push_back({v,kk.Data()});
102  mostNegativeCut = std::min(mostNegativeCut,v);
103  knownBinParser(kk.Data());
104  }
105  knownBinParser("Dead"); // also parse for any known dead spots
106 
107  // order cuts by magnitude of cut, biggest first
108  std::sort(orderedCuts.begin(),orderedCuts.end(),[](const auto& v1, const auto& v2) { return std::abs(v1.first) > std::abs(v2.first); });
109 
110  if ( histogram->GetEntries() < minstat ) {
112  result->status_ = dqm_core::Result::Yellow; // will treat almost-empty histograms as a warning .... shifter should think if this is expected
113  result->tags_["InsufficientEntries"] = histogram->GetEntries();
114  return result;
115  }
116 
117 
118  std::vector<int> range=dqm_algorithms::tools::GetBinRange(histogram, config.getParameters());
119 
120  std::map<int,dqm_core::Result*> resultsByTimeBin;
121  std::map<std::string,int> counts;
122  dqm_core::Result* lastFilledResult = nullptr;
123  //if nBinsZ == 0, this loop executes *once* with t = -1
124  for(int t=(nBinsZ>0 ? range[0] : -1) ; t <= (nBinsZ>0 ? range[1] : -1); t++) {
125  int xmin = range[0], xmax = range[1];
126  int ymin = range[2], ymax = range[3];
127  if(t!=-1) {
128  // need to adjust ranges using y-axis bins and nBinsZ parameter
129  xmin = 1; xmax = histogram->GetNbinsY()/nBinsZ;
130  ymin = 1; ymax = nBinsZ;
131  }
132 
133 
134  std::set<int> filledRows; // will only look for dead strips once all rows are filled
135 
136  // compute medians, means, variances, k-test probabilities
137  std::vector<double> stripsMedian;
138  std::vector<double> stripsAvg;
139  std::vector<double> stripsVariance;
140  std::vector<size_t> stripsN;
141  std::vector<double> stripsProb;
142  TRandom3 r;
143  for ( int i = xmin; i <= xmax; ++i ) {
144  std::vector<double> onestrip;
145  double stripSum=0/*, stripSum2=0*/;
146  for ( int j = ymin; j <= ymax; ++j ) {
147  double binvalue = (nBinsZ<=0) ? histogram->GetBinContent(i,j) : histogram->GetBinContent(t,reverseConvention ? ((ymax-ymin+1)*(i-1)+j) : ((xmax-xmin+1)*(j-1)+i));
148  if (binvalue < ignoreBelow) continue;
149  if(binvalue>0) filledRows.insert(j); // used to veto running deadstrip tests on sparsely populated plots
150  onestrip.push_back(binvalue);
151  stripSum += binvalue;
152  //stripSum2 += binvalue*binvalue;
153  }
154  stripsAvg.push_back(stripSum/onestrip.size());
155  // traditional variance calculation, not robust to outliers
156  // leaving this commented for reference
157  //stripsVariance.push_back( stripSum2/onestrip.size() - std::pow(stripsAvg.back(),2) );
158 
159  std::sort(onestrip.begin(),onestrip.end());
160 
161  stripsMedian.push_back( onestrip.at(onestrip.size()/2) );
162  // estimate variance as square of half of the middle ~68% - more robust against outliers than calculating from sumw2
163  stripsVariance.push_back( std::pow((onestrip.at(onestrip.size()*0.84) - onestrip.at(onestrip.size()*0.16))/2.,2) );
164  stripsN.push_back(onestrip.size());
165  // also compute Kolmogorov test probability vs a same-size dataset generated from a gaussian with the strip mean and variance
166  if(stripsVariance.back() > 0) {
167  std::vector<double> stripRef;
168  for (size_t i = 0; i < onestrip.size(); i++) {
169  // use possion for variances less than 100 (corresponding ~ to averages fewer than 100)
170  // otherwise switch to gaussian
171  double nextVal = 0;
172  do {
173  nextVal = (stripsVariance.back()>=100) ? r.Gaus(stripsAvg.back(), std::sqrt(stripsVariance.back())) : r.Poisson(stripsAvg.back());
174  } while(nextVal<ignoreBelow);
175  stripRef.push_back(nextVal);
176  }
177  std::sort(stripRef.begin(),stripRef.end());
178  stripsProb.push_back( TMath::KolmogorovTest(onestrip.size(),&onestrip[0],stripRef.size(),&stripRef[0],"") );
179  } else {
180  stripsProb.push_back(1);
181  }
182  }
183  if(nBinsZ>0 && filledRows.empty()) {
184  continue; // don't create a result object for empty time slices
185  }
186 
188  std::map<std::pair<int,int>,bin> bins;
189  for ( int k = xmin; k <= xmax; ++k ) {
190  double strip_median = stripsMedian[k - xmin];
191  double strip_variance = stripsVariance[k - xmin];
192  for (int l = ymin; l <= ymax; ++l) {
193  double binvalue = (nBinsZ<=0) ? histogram->GetBinContent(k,l) : histogram->GetBinContent(t,reverseConvention ? ((ymax-ymin+1)*(k-1)+l) : ((xmax-xmin+1)*(l-1)+k));
194  if (binvalue < ignoreBelow) continue;
195  double residual = (strip_variance) ? ((binvalue - strip_median) / std::sqrt(strip_variance)) : 0;
196  bins[{k,l}] = {/*histogram->GetXaxis()->GetBinCenter(k), histogram->GetYaxis()->GetBinCenter(l),*/ k, l,
197  binvalue, residual};
198  }
199  }
200 
201 
202  bool testDeadStrips = (filledRows.size() == size_t(ymax-ymin+1));
203 
204 
205 
206  // ensure all counts defined, even if will end up being 0
207  counts["NDeadStrip"]= (testDeadStrips) ? 0 : -1; // use -1 to flag not running this test
208  counts["NDead"]=0;
209  counts["NWrongKnown"]=0;
210  counts["NConsecUnlikelyStrip"]=0;
211  for(auto& [cut,k] : orderedCuts) {
212  counts["N"+k] = 0;
213  }
214 
215  // publish deadstrips (whole strip is 0), and unlikely strips
216  int nUnlikelyStrips = 0;
217  for(size_t i = 0;i<stripsVariance.size();i++) {
218  if (testDeadStrips && stripsVariance.at(i) == 0 && stripsAvg.at(i) == 0) {
219  // only dead if at least one of the neighbour strips has enough entries in it
220  if( (i>0 && (stripsAvg.at(i-1)*stripsN.at(i-1))>=minstat) || (i<stripsVariance.size()-1 && (stripsAvg.at(i+1)*stripsN.at(i+1))>=minstat)) {
221  result->tags_[TString::Format("_DeadStrip%02ld", i+1).Data()] = histogram->GetXaxis()->GetBinCenter(xmin + i);
222  counts["NDeadStrip"]++;
223  }
224 
225  }
226  if (stripsProb.at(i) < probThreshold) {
227  result->tags_[TString::Format("_UnlikelyStrip%02ld", i+1).Data()] = -log(stripsProb.at(i));
228  nUnlikelyStrips++;
229  if(nUnlikelyStrips > counts["NConsecUnlikelyStrip"]) counts["NConsecUnlikelyStrip"] = nUnlikelyStrips;
230  } else {
231  nUnlikelyStrips=0; // reset counter
232  }
233  if(publishDetail & 0x1) {
234  result->tags_[TString::Format("_Median%02ld", i+1).Data()] = stripsMedian.at(i);
235  }
236  if(publishDetail & 0x2) {
237  result->tags_[TString::Format("_StdDev%02ld", i+1).Data()] = sqrt(stripsVariance.at(i));
238  }
239  if(publishDetail & 0x4) {
240  result->tags_[TString::Format("_Prob%02ld", i+1).Data()] = stripsProb.at(i);
241  }
242  if(publishDetail & 0x8) {
243  // attempt to estimate residual noise, by subtracting off the statistical variance (which equals the average, i.e. poissonian)
244  result->tags_[TString::Format("_Noise%02ld", i+1).Data()] = sqrt(std::abs(stripsVariance.at(i) - stripsMedian.at(i)));
245  }
246  }
247 
248  // publish deadspots (anomalous 0s) and other anomalies defined by the cuts
249 
250  for(auto& [pos,bin] : bins) {
251  if(bin.m_value==0 && bin.m_outstandingRatio < mostNegativeCut) {
252  // publish if spot is not known
253  if(knownBins["Dead"].find({bin.m_ix,bin.m_iy})==knownBins["Dead"].end()) {
254  result->tags_[TString::Format("_Dead(%d,%d)", bin.m_ix, bin.m_iy).Data()] = bin.m_outstandingRatio;
255  counts["NDead"]++;
256  }
257  } else {
258  if( (publishDetail & 0x10) && bin.m_value==0) {
259  result->tags_[TString::Format("_Zero(%d,%d)",bin.m_ix,bin.m_iy).Data()] = bin.m_outstandingRatio;
260  }
261  // loop through cuts, assign bin to one of the ranges, and report if not a known bin
262  double classCut = 0;
263  for(auto& [cut,k] : orderedCuts) {
264  if( (cut < 0 && bin.m_outstandingRatio < cut) || (cut > 0 && bin.m_outstandingRatio > cut && bin.m_value>=minstat) ) {
265  classCut = cut;
266  if(knownBins[k].find({bin.m_ix,bin.m_iy})==knownBins[k].end()) {
267  if(printLevel<=2) std::cout << " found " << k << " @ " << bin.m_ix << " " << bin.m_iy << " " << t << " : " << bin.m_outstandingRatio << std::endl;
268  result->tags_[TString::Format("_%s(%d,%d)", k.c_str(), bin.m_ix,
269  bin.m_iy).Data()] = bin.m_outstandingRatio;
270  counts["N"+k]++;
271  } else {
272  // report as a known anomaly
273  result->tags_[TString::Format("_Known%s(%d,%d)",k.c_str(), bin.m_ix,
274  bin.m_iy).Data()] = bin.m_outstandingRatio;
275  }
276  break;
277  }
278  }
279  // if this is a known bin in a given cut range, check if we have any evidence it is wrong
280  // start with known dead ... if this bin has an entry, its not dead
281  if(bin.m_value>0 && knownBins["Dead"].find({bin.m_ix,bin.m_iy})!=knownBins["Dead"].end()) {
282  counts["NWrongKnown"]++;
283  result->tags_[TString::Format("_UnDead(%d,%d)", bin.m_ix,
284  bin.m_iy).Data()] = bin.m_outstandingRatio;
285  } else if(classCut != 0) {
286  // if class cut is in opposite direction to known bin list, report that too
287  for(auto& [cut,k] : orderedCuts) {
288  if(knownBins[k].find({bin.m_ix,bin.m_iy})==knownBins[k].end()) continue;
289  if(cut*classCut < 0) {
290  counts["NWrongKnown"]++;
291  result->tags_[TString::Format("_Un%s(%d,%d)",k.c_str(), bin.m_ix,
292  bin.m_iy).Data()] = bin.m_outstandingRatio;
293  }
294  }
295  }
296  }
297  }
298 
299  resultsByTimeBin[t] = result;
300  lastFilledResult = result;
301 
302  }
303 
305  if(nBinsZ>0) {
306  // ensure all counts defined, even if will end up being 0
307  counts["NDeadStrip"]= 0;
308  counts["NDead"]=0;
309  counts["NWrongKnown"]=0;
310  counts["NConsecUnlikelyStrip"]=0;
311  for(auto& [cut,k] : orderedCuts) {
312  counts["N"+k] = 0;
313  }
314  dqm_core::Result* lastResult = nullptr;
315  result = new dqm_core::Result();
316  // must now analyse results by time slice ... require a result in min number of consecutive slices to count an anomaly
317  std::map<std::string,int> anomalies;
318  for(int t=range[0];t<=range[1]+1;t++) { // go one extra slice to trigger 'empty slice' condition to write active anomalies
319  if(resultsByTimeBin.find(t)==resultsByTimeBin.end()) {
320  // empty slice .. record all sufficiently large anomalies and reset
321  for(auto& [k,v] : anomalies) {
322  if(v>=minDuration) {
323  if(printLevel<=2) std::cout << " Got anomaly: " << k << " duration: " << v << " end: " << t << std::endl;
324  int lbStart = histogram->GetXaxis()->GetBinLowEdge(t-v);
325  int lbEnd = histogram->GetXaxis()->GetBinLowEdge(t);
326  // in liveMode (for P1 monitoring), don't put the LBs in the result name, so that we get a consistent history plot
327  if (lastResult){
328  if(liveMode) {
329  result->tags_[k] = lastResult->tags_[k];//lastResult must not be null
330  } else {
331  result->tags_[k +
332  TString::Format("_LB%d-%d", lbStart, lbEnd).Data()] = lastResult->tags_[k];
333  }
334  }
335  // increment appropriate counter
336  if(k.find("_DeadStrip")==0) {
337  counts["NDeadStrip"]++;
338  } else if(k.find("_Dead")==0) {
339  counts["NDead"]++;
340  } else if(k.find("_UnlikelyStrip")==0) {
341  // not sure how to handle this one
342  } else if(k.find("_Un")==0) {
343  counts["NWrongKnown"]++;
344  } else {
345  for(auto& [cut,k2] : orderedCuts) {
346  if(k.find("_" + k2)==0) {
347  counts["N"+k2]++;
348  }
349  }
350  }
351  }
352  }
353  anomalies.clear();
354  } else {
355  auto thisResult = resultsByTimeBin[t];
356  if(liveMode && thisResult==lastFilledResult) {
357  // don't consider the time slice that is currently being filled, statistics not reliable
358  // can delete this slice because we wont use it
359  delete thisResult;
360  continue;
361  }
362  // increase counts on all active anomalies ...
363  for(auto& [k,v] : thisResult->tags_) {
364  // increment time counter for anomalies
365  if(k.find("_DeadStrip")==0) {
366  anomalies[k]++;
367  } else if(k.find("_Dead")==0) {
368  anomalies[k]++;
369  } else if(k.find("_UnlikelyStrip")==0) {
370  anomalies[k]++;
371  } else if(k.find("_Un")==0) {
372  anomalies[k]++;
373  } else {
374  for(auto& [cut,k2] : orderedCuts) {
375  if(k.find("_" + k2)==0) {
376  anomalies[k]++;
377  }
378  }
379  }
380  }
381 
382  // reset counts on all disappeared anomalies (recording to results if was long enough)
383  // empty slice .. record all sufficiently large anomalies and reset
384  for(auto& [k,v] : anomalies) {
385  if(thisResult->tags_.find(k) != thisResult->tags_.end()) continue;
386  if(v>=minDuration) {
387  int lbStart = histogram->GetXaxis()->GetBinLowEdge(t-v);
388  int lbEnd = histogram->GetXaxis()->GetBinLowEdge(t);
389  if(liveMode) {
390  // don't record any result for an anomaly that has disappeared
391  } else {
392  result->tags_[k+TString::Format("_LB%d-%d",lbStart,lbEnd).Data()]=lastResult->tags_[k];
393  }
394 
395  // increment appropriate counter
396  if(k.find("_DeadStrip")==0) {
397  counts["NDeadStrip"]++;
398  } else if(k.find("_Dead")==0) {
399  counts["NDead"]++;
400  } else if(k.find("_UnlikelyStrip")==0) {
401  // not sure how to handle this one
402  } else if(k.find("_Un")==0) {
403  counts["NWrongKnown"]++;
404  } else {
405  for(auto& [cut,k2] : orderedCuts) {
406  if(k.find("_" + k2)==0) {
407  counts["N"+k2]++;
408  }
409  }
410  }
411  }
412  v=0; // reset counter on the anomaly
413  }
414  // delete the lastResult if there is one
415  if(lastResult) delete lastResult;
416  lastResult = thisResult;
417  }
418  }
419  if(lastResult) delete lastResult; // cleans up unneeded results
420 
421 
422  } else {
423  // not doing a temporal analysis, just use the single result object
424  result = resultsByTimeBin[-1];
425  }
426 
427 
428 
429  // determine algorithm status from provided thresholds
430 
431  const auto& redThresholds = config.getRedThresholds();
432  const auto& greenThresholds = config.getGreenThresholds();
434  if(publishDetail & 0x20) {
435  result->tags_["StatusCode"] = 0;
436  }
437  for(auto& [k,v] : counts) {
438  if(nBinsZ>0 && k=="NConsecUnlikelyStrip") continue; // not currently counting consecutive unlikely strips in temporal mode
439  result->tags_[k] = v;
441  result->status_ = dqm_core::Result::Red;
442  if(publishDetail & 0x20) {
443  result->tags_["StatusCode"] = 3;
444  }
446  result->status_ = dqm_core::Result::Yellow;
447  if(publishDetail & 0x20) {
448  result->tags_["StatusCode"] = 2;
449  }
450  } else if(result->status_==dqm_core::Result::Undefined && greenThresholds.find(k)!=greenThresholds.end()) {
451  result->status_ = dqm_core::Result::Green;
452  if(publishDetail & 0x20) {
453  result->tags_["StatusCode"] = 1;
454  }
455  }
456  }
457 
458 
459  return result;
460 
461 }
462 
463 
464 
466 
467  out<<"L1Calo_BinsDiffFromStripMedian: Calculates strip median and then find out bins which are aliens "<<std::endl;
468  out<<"Specify cuts with parameters named <cutName>Cut will generate a result of form Nxxx" << std::endl;
469  out<<"Specify known anomalies with Known<cutName> string argument - note any leading non-numeric char will be stripped" << std::endl;
470  out<<"Special results are: NDead (number of 0 bins below most negative cut), NDeadStrip (strips that are all 0 .. will be -1 if not got an entry in every row of plot), NConsecUnlikelyStrip (most consecutive strips that are below ProbThreshold)" << std::endl;
471  out<<"Thresholds can be set on any of the results\n"<<std::endl;
472 
473  out<<"Optional Parameter: MinStat: Minimum histogram statistics needed to perform Algorithm, also min entries for warm/hot spots (cuts > 0), and min entries in neighbour strip to declare a strip dead"<<std::endl;
474  out<<"Optional Parameter: IgnoreBelow: values below which the bins wont be considered (default 0)"<<std::endl;
475  out<<"Optional Parameter: ProbThreshold: cutoff for strip k-test probabilities for strip to be considered unlikely (default 0.05)"<<std::endl;
476  out<<"Optional Parameter: PublishDetail: Bitmask of what extra info to publish about strips. Starting with MSB: AlgStatusCode,Zeros,Noise,Prob,StdDev,Median (default 100000)"<<std::endl;
477 
478 }
479 
dqm_algorithms::L1Calo_BinsDiffFromStripMedian::bin::m_outstandingRatio
double m_outstandingRatio
Definition: L1Calo_BinsDiffFromStripMedian.h:37
dqm_algorithms::tools::GetBinRange
std::vector< int > GetBinRange(const TH1 *histogram, const std::map< std::string, double > &params)
Definition: AlgorithmHelper.cxx:380
beamspotman.r
def r
Definition: beamspotman.py:676
plotBeamSpotCompare.x1
x1
Definition: plotBeamSpotCompare.py:216
dqm_algorithms::L1Calo_BinsDiffFromStripMedian::bin::m_iy
int m_iy
Definition: L1Calo_BinsDiffFromStripMedian.h:35
ymin
double ymin
Definition: listroot.cxx:63
Undefined
@ Undefined
Definition: MaterialTypes.h:8
get_generator_info.result
result
Definition: get_generator_info.py:21
IsA
#define IsA
Declare the TObject style functions.
Definition: xAODTEventBranch.h:59
find
std::string find(const std::string &s)
return a remapped string
Definition: hcg.cxx:135
ClusterSeg::residual
@ residual
Definition: ClusterNtuple.h:20
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
StateLessPT_NewConfig.Format
Format
Definition: StateLessPT_NewConfig.py:149
plotBeamSpotCompare.x2
x2
Definition: plotBeamSpotCompare.py:218
mySortfunc_ratio
bool mySortfunc_ratio(const dqm_algorithms::L1Calo_BinsDiffFromStripMedian::bin &i, const dqm_algorithms::L1Calo_BinsDiffFromStripMedian::bin &j)
Definition: L1Calo_BinsDiffFromStripMedian.cxx:27
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
config
Definition: PhysicsAnalysis/AnalysisCommon/AssociationUtils/python/config.py:1
mergePhysValFiles.end
end
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:93
instance
std::map< std::string, double > instance
Definition: Run_To_Get_Tags.h:8
python.changerun.kk
list kk
Definition: changerun.py:41
dqm_algorithms::L1Calo_BinsDiffFromStripMedian::bin::m_ix
int m_ix
Definition: L1Calo_BinsDiffFromStripMedian.h:34
lumiFormat.i
int i
Definition: lumiFormat.py:85
xmin
double xmin
Definition: listroot.cxx:60
dqm_algorithms::L1Calo_BinsDiffFromStripMedian
Definition: L1Calo_BinsDiffFromStripMedian.h:22
Result
ICscStripFitter::Result Result
Definition: CalibCscStripFitter.cxx:13
BindingsTest.cut
cut
This script demonstrates how to call a C++ class from Python Also how to use PyROOT is shown.
Definition: BindingsTest.py:13
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
python.handimod.Green
int Green
Definition: handimod.py:524
dqm_algorithms::L1Calo_BinsDiffFromStripMedian::~L1Calo_BinsDiffFromStripMedian
~L1Calo_BinsDiffFromStripMedian()
Definition: L1Calo_BinsDiffFromStripMedian.cxx:36
plotting.yearwise_luminosity_vs_mu.bins
bins
Definition: yearwise_luminosity_vs_mu.py:30
dqm_algorithms::L1Calo_BinsDiffFromStripMedian::printDescription
void printDescription(std::ostream &out)
Definition: L1Calo_BinsDiffFromStripMedian.cxx:465
python.handimod.Red
Red
Definition: handimod.py:551
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
ReadCellNoiseFromCoolCompare.v2
v2
Definition: ReadCellNoiseFromCoolCompare.py:364
python.PyAthena.v
v
Definition: PyAthena.py:154
L1Calo_BinsDiffFromStripMedian.h
dqm_algorithms::L1Calo_BinsDiffFromStripMedian::L1Calo_BinsDiffFromStripMedian
L1Calo_BinsDiffFromStripMedian()
Definition: L1Calo_BinsDiffFromStripMedian.cxx:31
dqm_algorithms::L1Calo_BinsDiffFromStripMedian::clone
L1Calo_BinsDiffFromStripMedian * clone()
Definition: L1Calo_BinsDiffFromStripMedian.cxx:41
dqm_algorithms::L1Calo_BinsDiffFromStripMedian::bin::m_value
double m_value
Definition: L1Calo_BinsDiffFromStripMedian.h:36
known
Definition: TrigBStoxAODTool.cxx:107
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
xmax
double xmax
Definition: listroot.cxx:61
AlgorithmHelper.h
dqm_algorithms::L1Calo_BinsDiffFromStripMedian::bin
Definition: L1Calo_BinsDiffFromStripMedian.h:32
pickleTool.object
object
Definition: pickleTool.py:30
dqm_algorithms::tools::GetFirstFromMap
double GetFirstFromMap(const std::string &paramName, const std::map< std::string, double > &params)
Definition: AlgorithmHelper.cxx:339
pow
constexpr int pow(int base, int exp) noexcept
Definition: ap_fixedTest.cxx:15
histogram
std::string histogram
Definition: chains.cxx:52
fitman.k
k
Definition: fitman.py:528
ymax
double ymax
Definition: listroot.cxx:64
dqm_algorithms::L1Calo_BinsDiffFromStripMedian::execute
dqm_core::Result * execute(const std::string &, const TObject &, const dqm_core::AlgorithmConfig &)
Definition: L1Calo_BinsDiffFromStripMedian.cxx:49