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(), 0x10/*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 
71  // use y-axis label to determine convention for temporal plot
72  bool reverseConvention = TString(histogram->GetYaxis()->GetTitle()).EndsWith("+y");
73 
74  std::map<std::string,std::set<std::pair<int,int>>> knownBins; // bins which are known to be a particular class
75 
76  auto knownBinParser = [&](const std::string& cutName) {
77  std::string known = dqm_algorithms::tools::GetFirstFromMap("Known"+cutName, config.getGenericParameters(), "");
78  // strip any non-numeric chars from the front
79  size_t i = 0;
80  while (i < known.length() && !std::isdigit(known[i])) {
81  i++;
82  }
83  known = known.substr(i);
84  known += ";"; // add final semicolon
85  i = known.find(",");
86  while(i != std::string::npos) {
87  size_t j = known.find(";");
88  knownBins[cutName].insert({TString(known.substr(0,i)).Atoi(),TString(known.substr(i+1,j-i-1)).Atoi()});
89  known = known.substr(j+1);
90  i = known.find(",");
91  }
92  };
93 
94  std::vector<std::pair<double,std::string>> orderedCuts;
95  double mostNegativeCut = 0;
96  for(auto& [k,v] : config.getParameters()) {
97  TString kk(k);
98  if(!kk.EndsWith("Cut")) continue;
99  kk = kk(0,kk.Length()-3);
100  orderedCuts.push_back({v,kk.Data()});
101  mostNegativeCut = std::min(mostNegativeCut,v);
102  knownBinParser(kk.Data());
103  }
104  knownBinParser("Dead"); // also parse for any known dead spots
105 
106  // order cuts by magnitude of cut, biggest first
107  std::sort(orderedCuts.begin(),orderedCuts.end(),[](const auto& v1, const auto& v2) { return std::abs(v1.first) > std::abs(v2.first); });
108 
109  if ( histogram->GetEntries() < minstat ) {
111  result->status_ = dqm_core::Result::Yellow; // will treat almost-empty histograms as a warning .... shifter should think if this is expected
112  result->tags_["InsufficientEntries"] = histogram->GetEntries();
113  return result;
114  }
115 
116 
117  std::vector<int> range=dqm_algorithms::tools::GetBinRange(histogram, config.getParameters());
118 
119  std::map<int,dqm_core::Result*> resultsByTimeBin;
120  std::map<std::string,int> counts;
121  dqm_core::Result* lastFilledResult = nullptr;
122 
123  for(int t=(nBinsZ>0 ? range[0] : -1) ; t <= (nBinsZ>0 ? range[1] : -1); t++) {
124  int xmin = range[0], xmax = range[1];
125  int ymin = range[2], ymax = range[3];
126  if(t!=-1) {
127  // need to adjust ranges using y-axis bins and nBinsZ parameter
128  xmin = 1; xmax = histogram->GetNbinsY()/nBinsZ;
129  ymin = 1; ymax = nBinsZ;
130  }
131 
132 
133  std::set<int> filledRows; // will only look for dead strips once all rows are filled
134 
135  // compute medians, means, variances, k-test probabilities
136  std::vector<double> stripsMedian;
137  std::vector<double> stripsAvg;
138  std::vector<double> stripsVariance;
139  std::vector<size_t> stripsN;
140  std::vector<double> stripsProb;
141  TRandom3 r;
142  for ( int i = xmin; i <= xmax; ++i ) {
143  std::vector<double> onestrip;
144  double stripSum=0, stripSum2=0;
145  for ( int j = ymin; j <= ymax; ++j ) {
146  double binvalue = (nBinsZ<=0) ? histogram->GetBinContent(i,j) : histogram->GetBinContent(t,reverseConvention ? ((ymax-ymin+1)*(i-1)+j) : ((xmax-xmin+1)*(j-1)+i));
147  if (binvalue < ignoreBelow) continue;
148  if(binvalue>0) filledRows.insert(j); // used to veto running deadstrip tests on sparsely populated plots
149  onestrip.push_back(binvalue);
150  stripSum += binvalue;
151  stripSum2 += binvalue*binvalue;
152  }
153  stripsAvg.push_back(stripSum/onestrip.size());
154  // traditional variance calculation, not robust to outliers
155  // leaving this commented for reference
156  //stripsVariance.push_back( stripSum2/onestrip.size() - std::pow(stripsAvg.back(),2) );
157 
158  std::sort(onestrip.begin(),onestrip.end());
159 
160  stripsMedian.push_back( onestrip.at(onestrip.size()/2) );
161  // estimate variance as square of half of the middle ~68% - more robust against outliers than calculating from sumw2
162  stripsVariance.push_back( std::pow((onestrip.at(onestrip.size()*0.84) - onestrip.at(onestrip.size()*0.16))/2.,2) );
163  stripsN.push_back(onestrip.size());
164  // also compute Kolmogorov test probability vs a same-size dataset generated from a gaussian with the strip mean and variance
165  if(stripsVariance.back() > 0) {
166  std::vector<double> stripRef;
167  for (size_t i = 0; i < onestrip.size(); i++) {
168  // use possion for variances less than 100 (corresponding ~ to averages fewer than 100)
169  // otherwise switch to gaussian
170  double nextVal = 0;
171  do {
172  nextVal = (stripsVariance.back()>=100) ? r.Gaus(stripsAvg.back(), std::sqrt(stripsVariance.back())) : r.Poisson(stripsAvg.back());
173  } while(nextVal<ignoreBelow);
174  stripRef.push_back(nextVal);
175  }
176  std::sort(stripRef.begin(),stripRef.end());
177  stripsProb.push_back( TMath::KolmogorovTest(onestrip.size(),&onestrip[0],stripRef.size(),&stripRef[0],"") );
178  } else {
179  stripsProb.push_back(1);
180  }
181  }
182  if(nBinsZ>=0 && filledRows.empty()) {
183  continue; // don't create a result object for empty time slices
184  }
185 
187  std::map<std::pair<int,int>,bin> bins;
188  for ( int k = xmin; k <= xmax; ++k ) {
189  double strip_median = stripsMedian[k - xmin];
190  double strip_variance = stripsVariance[k - xmin];
191  for (int l = ymin; l <= ymax; ++l) {
192  double binvalue = (nBinsZ<=0) ? histogram->GetBinContent(k,l) : histogram->GetBinContent(t,reverseConvention ? ((ymax-ymin+1)*(k-1)+l) : ((xmax-xmin+1)*(l-1)+k));
193  if (binvalue < ignoreBelow) continue;
194  double residual = (strip_variance) ? ((binvalue - strip_median) / std::sqrt(strip_variance)) : 0;
195  bins[{k,l}] = {/*histogram->GetXaxis()->GetBinCenter(k), histogram->GetYaxis()->GetBinCenter(l),*/ k, l,
196  binvalue, residual};
197  }
198  }
199 
200 
201  bool testDeadStrips = (filledRows.size() == size_t(ymax-ymin+1));
202 
203 
204 
205  // ensure all counts defined, even if will end up being 0
206  counts["NDeadStrip"]= (testDeadStrips) ? 0 : -1; // use -1 to flag not running this test
207  counts["NDead"]=0;
208  counts["NWrongKnown"]=0;
209  counts["NConsecUnlikelyStrip"]=0;
210  for(auto& [cut,k] : orderedCuts) {
211  counts["N"+k] = 0;
212  }
213 
214  // publish deadstrips (whole strip is 0), and unlikely strips
215  int nUnlikelyStrips = 0;
216  for(size_t i = 0;i<stripsVariance.size();i++) {
217  if (testDeadStrips && stripsVariance.at(i) == 0 && stripsAvg.at(i) == 0) {
218  // only dead if at least one of the neighbour strips has enough entries in it
219  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)) {
220  result->tags_[TString::Format("_DeadStrip%02ld", i+1).Data()] = histogram->GetXaxis()->GetBinCenter(xmin + i);
221  counts["NDeadStrip"]++;
222  }
223 
224  }
225  if (stripsProb.at(i) < probThreshold) {
226  result->tags_[TString::Format("_UnlikelyStrip%02ld", i+1).Data()] = -log(stripsProb.at(i));
227  nUnlikelyStrips++;
228  if(nUnlikelyStrips > counts["NConsecUnlikelyStrip"]) counts["NConsecUnlikelyStrip"] = nUnlikelyStrips;
229  } else {
230  nUnlikelyStrips=0; // reset counter
231  }
232  if(publishDetail & 0x1) {
233  result->tags_[TString::Format("_Median%02ld", i+1).Data()] = stripsMedian.at(i);
234  }
235  if(publishDetail & 0x2) {
236  result->tags_[TString::Format("_StdDev%02ld", i+1).Data()] = sqrt(stripsVariance.at(i));
237  }
238  if(publishDetail & 0x4) {
239  result->tags_[TString::Format("_Prob%02ld", i+1).Data()] = stripsProb.at(i);
240  }
241  if(publishDetail & 0x8) {
242  // attempt to estimate residual noise, by subtracting off the statistical variance (which equals the average, i.e. poissonian)
243  result->tags_[TString::Format("_Noise%02ld", i+1).Data()] = sqrt(std::abs(stripsVariance.at(i) - stripsMedian.at(i)));
244  }
245  }
246 
247  // publish deadspots (anomalous 0s) and other anomalies defined by the cuts
248 
249  for(auto& [pos,bin] : bins) {
250  if(bin.m_value==0 && bin.m_outstandingRatio < mostNegativeCut) {
251  // publish if spot is not known
252  if(knownBins["Dead"].find({bin.m_ix,bin.m_iy})==knownBins["Dead"].end()) {
253  result->tags_[TString::Format("_Dead(%d,%d)", bin.m_ix, bin.m_iy).Data()] = bin.m_outstandingRatio;
254  counts["NDead"]++;
255  }
256  } else {
257  if( (publishDetail & 0x10) && bin.m_value==0) {
258  result->tags_[TString::Format("_Zero(%d,%d)",bin.m_ix,bin.m_iy).Data()] = bin.m_outstandingRatio;
259  }
260  // loop through cuts, assign bin to one of the ranges, and report if not a known bin
261  double classCut = 0;
262  for(auto& [cut,k] : orderedCuts) {
263  if( (cut < 0 && bin.m_outstandingRatio < cut) || (cut > 0 && bin.m_outstandingRatio > cut && bin.m_value>=minstat) ) {
264  classCut = cut;
265  if(knownBins[k].find({bin.m_ix,bin.m_iy})==knownBins[k].end()) {
266  result->tags_[TString::Format("_%s(%d,%d)", k.c_str(), bin.m_ix,
267  bin.m_iy).Data()] = bin.m_outstandingRatio;
268  counts["N"+k]++;
269  }
270  break;
271  }
272  }
273  // if this is a known bin in a given cut range, check if we have any evidence it is wrong
274  // start with known dead ... if this bin has an entry, its not dead
275  if(bin.m_value>0 && knownBins["Dead"].find({bin.m_ix,bin.m_iy})!=knownBins["Dead"].end()) {
276  counts["NWrongKnown"]++;
277  result->tags_[TString::Format("_UnDead(%d,%d)", bin.m_ix,
278  bin.m_iy).Data()] = bin.m_outstandingRatio;
279  } else if(classCut != 0) {
280  // if class cut is in opposite direction to known bin list, report that too
281  for(auto& [cut,k] : orderedCuts) {
282  if(knownBins[k].find({bin.m_ix,bin.m_iy})==knownBins[k].end()) continue;
283  if(cut*classCut < 0) {
284  counts["NWrongKnown"]++;
285  result->tags_[TString::Format("_Un%s(%d,%d)",k.c_str(), bin.m_ix,
286  bin.m_iy).Data()] = bin.m_outstandingRatio;
287  }
288  }
289  }
290  }
291  }
292 
293  resultsByTimeBin[t] = result;
294  lastFilledResult = result;
295 
296  }
297 
299  if(nBinsZ>=0) {
300  // ensure all counts defined, even if will end up being 0
301  counts["NDeadStrip"]= 0;
302  counts["NDead"]=0;
303  counts["NWrongKnown"]=0;
304  counts["NConsecUnlikelyStrip"]=0;
305  for(auto& [cut,k] : orderedCuts) {
306  counts["N"+k] = 0;
307  }
308  dqm_core::Result* lastResult = nullptr;
309  result = new dqm_core::Result();
310  // must now analyse results by time slice ... require a result in min number of consecutive slices to count an anomaly
311  std::map<std::string,int> anomalies;
312  for(int t=range[0];t<=range[1]+1;t++) { // go one extra slice to trigger 'empty slice' condition to write active anomalies
313  if(resultsByTimeBin.find(t)==resultsByTimeBin.end()) {
314  // empty slice .. record all sufficiently large anomalies and reset
315  for(auto& [k,v] : anomalies) {
316  if(v>=minDuration) {
317  int lbStart = histogram->GetXaxis()->GetBinLowEdge(t-v);
318  int lbEnd = histogram->GetXaxis()->GetBinLowEdge(t);
319  // in liveMode (for P1 monitoring), don't put the LBs in the result name, so that we get a consistent history plot
320  if(liveMode) {
321  result->tags_[k] = lastResult->tags_[k];
322  } else {
323  result->tags_[k +
324  TString::Format("_LB%d-%d", lbStart, lbEnd).Data()] = lastResult->tags_[k];
325  }
326  // increment appropriate counter
327  if(k.find("_DeadStrip")==0) {
328  counts["NDeadStrip"]++;
329  } else if(k.find("_Dead")==0) {
330  counts["NDead"]++;
331  } else if(k.find("_UnlikelyStrip")==0) {
332  // not sure how to handle this one
333  } else if(k.find("_Un")==0) {
334  counts["NWrongKnown"]++;
335  } else {
336  for(auto& [cut,k2] : orderedCuts) {
337  if(k.find("_" + k2)==0) {
338  counts["N"+k2]++;
339  }
340  }
341  }
342  }
343  }
344  anomalies.clear();
345  } else {
346  auto thisResult = resultsByTimeBin[t];
347  if(liveMode && thisResult==lastFilledResult) {
348  // don't consider the time slice that is currently being filled, statistics not reliable
349  // can delete this slice because we wont use it
350  delete thisResult;
351  continue;
352  }
353  // increase counts on all active anomalies ...
354  for(auto& [k,v] : thisResult->tags_) {
355  // increment time counter for anomalies
356  if(k.find("_DeadStrip")==0) {
357  anomalies[k]++;
358  } else if(k.find("_Dead")==0) {
359  anomalies[k]++;
360  } else if(k.find("_UnlikelyStrip")==0) {
361  anomalies[k]++;
362  } else if(k.find("_Un")==0) {
363  anomalies[k]++;
364  } else {
365  for(auto& [cut,k2] : orderedCuts) {
366  if(k.find("_" + k2)==0) {
367  anomalies[k]++;
368  }
369  }
370  }
371  }
372 
373  // reset counts on all disappeared anomalies (recording to results if was long enough)
374  // empty slice .. record all sufficiently large anomalies and reset
375  for(auto& [k,v] : anomalies) {
376  if(thisResult->tags_.find(k) != thisResult->tags_.end()) continue;
377  if(v>=minDuration) {
378  int lbStart = histogram->GetXaxis()->GetBinLowEdge(t-v);
379  int lbEnd = histogram->GetXaxis()->GetBinLowEdge(t);
380  if(liveMode) {
381  // don't record any result for an anomaly that has disappeared
382  } else {
383  result->tags_[k+TString::Format("_LB%d-%d",lbStart,lbEnd).Data()]=lastResult->tags_[k];
384  }
385 
386  // increment appropriate counter
387  if(k.find("_DeadStrip")==0) {
388  counts["NDeadStrip"]++;
389  } else if(k.find("_Dead")==0) {
390  counts["NDead"]++;
391  } else if(k.find("_UnlikelyStrip")==0) {
392  // not sure how to handle this one
393  } else if(k.find("_Un")==0) {
394  counts["NWrongKnown"]++;
395  } else {
396  for(auto& [cut,k2] : orderedCuts) {
397  if(k.find("_" + k2)==0) {
398  counts["N"+k2]++;
399  }
400  }
401  }
402  }
403  v=0; // reset counter on the anomaly
404  }
405  // delete the lastResult if there is one
406  if(lastResult) delete lastResult;
407  lastResult = thisResult;
408  }
409  }
410  if(lastResult) delete lastResult; // cleans up unneeded results
411 
412 
413  } else {
414  // not doing a temporal analysis, just use the single result object
415  result = resultsByTimeBin[-1];
416  }
417 
418 
419 
420  // determine algorithm status from provided thresholds
421 
422  const auto& redThresholds = config.getRedThresholds();
423  const auto& greenThresholds = config.getGreenThresholds();
425  if(publishDetail & 0x20) {
426  result->tags_["StatusCode"] = 0;
427  }
428  for(auto& [k,v] : counts) {
429  if(nBinsZ>=0 && k=="NConsecUnlikelyStrip") continue; // not currently counting consecutive unlikely strips in temporal mode
430  result->tags_[k] = v;
432  result->status_ = dqm_core::Result::Red;
433  if(publishDetail & 0x20) {
434  result->tags_["StatusCode"] = 3;
435  }
437  result->status_ = dqm_core::Result::Yellow;
438  if(publishDetail & 0x20) {
439  result->tags_["StatusCode"] = 2;
440  }
441  } else if(result->status_==dqm_core::Result::Undefined && greenThresholds.find(k)!=greenThresholds.end()) {
442  result->status_ = dqm_core::Result::Green;
443  if(publishDetail & 0x20) {
444  result->tags_["StatusCode"] = 1;
445  }
446  }
447  }
448 
449 
450  return result;
451 
452 }
453 
454 
455 
457 
458  out<<"L1Calo_BinsDiffFromStripMedian: Calculates strip median and then find out bins which are aliens "<<std::endl;
459  out<<"Specify cuts with parameters named <cutName>Cut will generate a result of form Nxxx" << std::endl;
460  out<<"Specify known anomalies with Known<cutName> string argument - note any leading non-numeric char will be stripped" << std::endl;
461  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;
462  out<<"Thresholds can be set on any of the results\n"<<std::endl;
463 
464  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;
465  out<<"Optional Parameter: IgnoreBelow: values below which the bins wont be considered (default 0)"<<std::endl;
466  out<<"Optional Parameter: ProbThreshold: cutoff for strip k-test probabilities for strip to be considered unlikely (default 0.05)"<<std::endl;
467  out<<"Optional Parameter: PublishDetail: Bitmask of what extra info to publish about strips. Starting with MSB: AlgStatusCode,Zeros,Noise,Prob,StdDev,Median (default 000000)"<<std::endl;
468 
469 }
470 
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:456
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