ATLAS Offline Software
BinsDiffFromStripMedianOnline.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 /* BinsDiffFromStripMedianOnline.cxx is to pick out the problematic bins in 2D histogram assuming that y-axis(the phi direction) be symmetric.
6  Author: Feng TIAN (columbia university)
7  Email: Feng.Tian@cern.ch
8 */
9 
10 #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 <cmath>
20 
21 #include <iostream>
22 #include <string>
23 
24 
25 //bool mySortfunc(binOnline i,binOnline j){return (i.m_value > j.m_value);}
26 //bool mySortfunc_ratio(binOnline i, binOnline j){return (i.m_outstandingRatio> j.m_outstandingRatio);}
27 
29 
31  dqm_core::AlgorithmManager::instance().registerAlgorithm("BinsDiffFromStripMedianOnline", this);
32 }
33 
35 }
36 
38  return new BinsDiffFromStripMedianOnline();
39 }
40 
41 
43  const TObject& object,
44  const dqm_core::AlgorithmConfig& config ){
45  const TH1* histogram;
46 
47  if( object.IsA()->InheritsFrom( "TH1" ) ) {
48  histogram = static_cast<const TH1*>(&object);
49  if (histogram->GetDimension() > 2 ){
50  throw dqm_core::BadConfig( ERS_HERE, name, "dimension > 2 " );
51  }
52  } else {
53  throw dqm_core::BadConfig( ERS_HERE, name, "does not inherit from TH1" );
54  }
55 
56  const double minstat = dqm_algorithms::tools::GetFirstFromMap( "MinStat", config.getParameters(), -1);
57  const double minstatperstrip = dqm_algorithms::tools::GetFirstFromMap( "MinStatPerstrip", config.getParameters(), -1);
58  const double ignoreval1 = dqm_algorithms::tools::GetFirstFromMap( "ignoreval1", config.getParameters(), -99999);
59  const double ignoreval2 = dqm_algorithms::tools::GetFirstFromMap( "ignoreval2", config.getParameters(), 0.);
60  const bool publish = (bool) dqm_algorithms::tools::GetFirstFromMap( "PublishBins", config.getParameters(), 1);
61  const int Nmaxpublish = (int) dqm_algorithms::tools::GetFirstFromMap( "MaxPublish", config.getParameters(), 20);
62  const bool VisualMode = (bool) dqm_algorithms::tools::GetFirstFromMap( "VisualMode", config.getParameters(), 1);
63  const int NpublishRed = (int) dqm_algorithms::tools::GetFirstFromMap( "PublishRedBins",config.getParameters(), 0);
64  const bool ClusterResult = (bool) dqm_algorithms::tools::GetFirstFromMap( "ClusterResult", config.getParameters(), 0);
65  const double suppressFactor = dqm_algorithms::tools::GetFirstFromMap("SuppressFactor", config.getParameters(), 0.05);
66  const double suppressRedFactor = dqm_algorithms::tools::GetFirstFromMap("SuppressRedFactor", config.getParameters(), 0.01);
67  const bool OnlineMode = (bool) dqm_algorithms::tools::GetFirstFromMap( "OnlineMode", config.getParameters(), 0);
68  const double Nred_red = (double) dqm_algorithms::tools::GetFirstFromMap( "Nred_red", config.getParameters(), 5.);
69  const double Nred_yellow = (double) dqm_algorithms::tools::GetFirstFromMap( "Nred_yellow", config.getParameters(), 3.);
70  const double Nyellow_yellow = (double) dqm_algorithms::tools::GetFirstFromMap( "Nyellow_yellow", config.getParameters(), 5.);
71  const double Nredyellow_yellow = (double) dqm_algorithms::tools::GetFirstFromMap( "Nredyellow_yellow", config.getParameters(), 4.);
72 
73  if ( histogram->GetEntries() < minstat ) {
75  result->tags_["InsufficientEntries"] = histogram->GetEntries();
76  return result;
77  }
78 
79  double gthreshold;
80  double rthreshold;
81  try {
82  rthreshold = dqm_algorithms::tools::GetFromMap( "MaxDeviation", config.getRedThresholds() );
83  gthreshold = dqm_algorithms::tools::GetFromMap( "MaxDeviation", config.getGreenThresholds() );
84  }catch( dqm_core::Exception & ex ) {
85  throw dqm_core::BadConfig( ERS_HERE, name, ex.what(), ex );
86  }
87 
88  std::vector<int> range=dqm_algorithms::tools::GetBinRange(histogram, config.getParameters());
89  std::vector<double> stripsSize;
90  std::vector<double> stripsMedian;
91  std::vector<double> stripsAvg;
92  std::vector<double> stripsVariance;
93  double maxInMap=0;
94 
95  if ( (int)range.size() < 4 ){
96  throw dqm_core::BadConfig( ERS_HERE, name, "BinRange vector <4 " );
97  }
98 
99  for ( int i = range[0]; i <= range[1]; ++i ) {
100  std::vector<double> onestrip;
101  double stripSum=0;
102  for ( int j = range[2]; j <= range[3]; ++j ) {
103  float binvalue = histogram->GetBinContent(i,j);
104  if (std::abs(binvalue- ignoreval1)<0.0001 || std::abs(binvalue - ignoreval2)<0.0001) continue;
105  onestrip.push_back(binvalue);
106  stripSum += binvalue;
107  if(binvalue > maxInMap) {
108  maxInMap = binvalue;
109  }
110  }
111  if(onestrip.size()!=0 ) {
112  stripsAvg.push_back(stripSum/onestrip.size());
113  }else {
114  stripsAvg.push_back(0);
115  }
116  FindStripMedianOnline(name,onestrip,stripsMedian);
117  stripsSize.push_back(onestrip.size());
118 
119  float sumdiff2=0;
120  int counter=0;
121  if ((int)stripsAvg.size() <= i-range[0] ){
122  throw dqm_core::BadConfig( ERS_HERE, name, "out of stripsAvg range " );
123  }
124  float strip_avg = stripsAvg[i-range[0]];
125 
126  for ( int j = range[2]; j <= range[3]; ++j ) {
127  if (std::abs(histogram->GetBinContent(i,j)-ignoreval1)<0.0001 || std::abs(histogram->GetBinContent(i,j)-ignoreval2)<0.0001) continue;
128  double binvalue = histogram->GetBinContent(i,j);
129  double diff=binvalue-strip_avg;
130  sumdiff2 +=std::pow(diff,2);
131  counter++;
132  }
133  double variance=-1;
134  if(counter!=0) variance = sumdiff2 / counter ;
135  stripsVariance.push_back(variance);
136  }
137 
139  std::vector<binOnline> redbins;
140  std::vector<binOnline> yellowbins;
141  std::vector<binOnline> Allbins;
142  int limit = range[1]-range[0];
143  for ( int q=0; q <= limit; ++q ) {
144  int k=q+range[0];
145  if ((int)stripsSize.size() <= q ){
146  throw dqm_core::BadConfig( ERS_HERE, name, "out of stripsSize range " );
147  }
148  if(stripsSize[q]<minstatperstrip) continue;
149  if ((int)stripsMedian.size() <= q ){
150  throw dqm_core::BadConfig( ERS_HERE, name, "out of stripsMedian range " );
151  }
152  if ((int)stripsVariance.size() <= q){
153  throw dqm_core::BadConfig( ERS_HERE, name, "out of stripsVariance range " );
154  }
155  if ((int)stripsAvg.size() <= q ){
156  throw dqm_core::BadConfig( ERS_HERE, name, "out of stripsAvg range " );
157  }
158  double strip_median = stripsMedian[q];
159  double strip_variance = stripsVariance[q];
160  double strip_avg = stripsAvg[q];
161 
162  if(std::abs(strip_median)<0.0001 && std::abs(strip_variance)<0.0001){
163  continue; // skip empty strip
164  }else {
165  if(std::abs(strip_median)<0.0001 && std::abs(strip_variance)>0.0001 && std::abs(strip_avg)>0.0001) {
166  strip_median = strip_avg;
167  } else{
168  if(std::abs(strip_median)<0.0001 && std::abs(strip_variance)>0.0001 && std::abs(strip_avg)<0.0001) continue;
169  }
170  }
171 
172 
173  for ( int l = range[2]; l <= range[3]; ++l ) {
174  double binvalue = histogram->GetBinContent(k,l);
175  if (std::abs(binvalue-ignoreval1)<0.0001 || std::abs(binvalue-ignoreval2)<0.0001) continue;
176  double outstandingRatio=0;
177  if(std::abs(strip_median) > 0.0001 ){
178  outstandingRatio= /*binvalue/strip_median*/ (binvalue-strip_median)/std::sqrt(std::abs(strip_median));
179  }else{
180  continue;
181  }
182  double eta = histogram->GetXaxis()->GetBinCenter(k);
183  double phi = histogram->GetYaxis()->GetBinCenter(l);
184  binOnline onebin = {eta,phi,k,l,binvalue,outstandingRatio};
185  Allbins.push_back(onebin);
186  // if( VisualMode && (binvalue / maxInMap < suppressFactor) ) continue;
187  if(std::abs(outstandingRatio) > rthreshold ) {
188  if( VisualMode && (binvalue / maxInMap < suppressRedFactor) ){
189  continue;
190  }
191  redbins.push_back(onebin);
192  }else if(std::abs(outstandingRatio) > gthreshold ){
193  if( VisualMode && (binvalue / maxInMap < suppressFactor) ){
194  continue;
195  }
196  yellowbins.push_back(onebin);
197  }
198  }
199  }
200  int count_red_c = 0;
201  int count_yellow_c = 0;
202  std::vector<std::vector<colorbinOnline> > ColorBinMap;
203  if(ClusterResult){
204  // initialize ColorBinMap
205  int limit = range[1]-range[0];
206  for ( int q = 0; q <= limit; ++q ) {
207  int k =q+range[0];
208  std::vector<colorbinOnline> oneColorStrip;
209  for ( int l = range[2]; l <= range[3]; ++l ) {
210  // colorbinOnline oneColorBin = {k,l,-1,-1,-1,green,1};
211  colorbinOnline oneColorBin = {-1,-1,k,l,-1,green,1};
212  oneColorStrip.push_back(oneColorBin);
213  }
214  ColorBinMap.push_back(oneColorStrip);
215  }
216 
217  // map redbins and yellowbins to ColorBinMap
218  for(unsigned int i=0;i<redbins.size();i++){
219  // int k=redbins[i].m_ix;
220  // int l=redbins[i].m_iy;
221  int q=redbins[i].m_ix - range[0];
222  int p = redbins[i].m_iy-range[2];
223 
224  if ((int)ColorBinMap.size() <= q){
225  throw dqm_core::BadConfig( ERS_HERE, name, "out of ColorBinMap range " );
226  }
227 
228  if ((int)ColorBinMap[q].size() <= p ){
229  throw dqm_core::BadConfig( ERS_HERE, name, "out of ColorBinMap range " );
230  }
231 
232  ColorBinMap[q][p].m_eta = redbins[i].m_eta;
233 
234  ColorBinMap[q][p].m_phi = redbins[i].m_phi;
235  ColorBinMap[q][p].m_value = redbins[i].m_value;
236  ColorBinMap[q][p].m_color = red;
237 
238  }
239 
240 
241  for(unsigned int i=0;i<yellowbins.size();i++){
242  // int k=yellowbins[i].m_ix;
243  // int l=yellowbins[i].m_iy;
244  int q=yellowbins[i].m_ix - range[0];
245  int p = yellowbins[i].m_iy-range[2];
246 
247  if ((int)ColorBinMap.size() <= q ){
248  throw dqm_core::BadConfig( ERS_HERE, name, "out of ColorBinMap range " );
249  }
250 
251  if ((int)ColorBinMap[q].size() <= p ){
252  throw dqm_core::BadConfig( ERS_HERE, name, "out of ColorBinMap range " );
253  }
254 
255  ColorBinMap[q][p].m_eta = yellowbins[i].m_eta;
256  ColorBinMap[q][p].m_phi = yellowbins[i].m_phi;
257  ColorBinMap[q][p].m_value = yellowbins[i].m_value;
258  ColorBinMap[q][p].m_color = yellow;
259  }
260 
261 
262  // cluster bad bins
263  std::vector<colorclusterOnline > clusterArray;
264  for(unsigned int i=0;i<redbins.size();i++){
265  // const int k=redbins[i].m_ix;
266  // const int l=redbins[i].m_iy;
267  int q=redbins[i].m_ix - range[0];
268  int p = redbins[i].m_iy-range[2];
269 
270  if ((int)ColorBinMap.size() <= q ){
271  throw dqm_core::BadConfig( ERS_HERE, name, "out of ColorBinMap range " );
272  }
273 
274  if ((int)ColorBinMap[q].size() <= p ){
275  throw dqm_core::BadConfig( ERS_HERE, name, "out of ColorBinMap range " );
276  }
277 
278  if(ColorBinMap[q][p].m_color != green){
279  colorclusterOnline onecluster = MakeClusterOnline(name,range[0],range[2],redbins[i],ColorBinMap);
280  // colorclusterOnline onecluster = {0,0,0,0,green,-1};
281  if((int)onecluster.m_size > 1) clusterArray.push_back(onecluster);
282  }
283  }
284  for(unsigned int i=0;i<yellowbins.size();i++){
285  // const int k=yellowbins[i].m_ix;
286  // const int l=yellowbins[i].m_iy;
287  int q=yellowbins[i].m_ix - range[0];
288  int p = yellowbins[i].m_iy-range[2];
289 
290  if ((int)ColorBinMap.size() <= q ){
291  throw dqm_core::BadConfig( ERS_HERE, name, "out of ColorBinMap range " );
292  }
293 
294  if ((int)ColorBinMap[q].size() <= p ){
295  throw dqm_core::BadConfig( ERS_HERE, name, "out of ColorBinMap range " );
296  }
297 
298  if(ColorBinMap[q][p].m_color != green){
299  colorclusterOnline onecluster = MakeClusterOnline(name,range[0],range[2],yellowbins[i],ColorBinMap);
300  // colorclusterOnline onecluster = {0,0,0,0,green,-1};
301  if((int)onecluster.m_size > 1) clusterArray.push_back(onecluster);
302  }
303  }
304 
305  // publish clusters here:
306  for(unsigned int i=0;i<clusterArray.size();i++){
307  char tmp[500];
308  if(clusterArray[i].m_color==red){
309  snprintf(tmp,500,"CR%i-(eta,phi)(r)(size)=(%0.3f,%0.3f)(%0.3f)(%i)",count_red_c,clusterArray[i].m_eta,clusterArray[i].m_phi,clusterArray[i].m_radius,clusterArray[i].m_size);
310  count_red_c++;
311  }else if(clusterArray[i].m_color==yellow){
312  snprintf(tmp,500,"CY%i-(eta,phi)(r)(size)=(%0.3f,%0.3f)(%0.3f)(%i)",count_yellow_c,clusterArray[i].m_eta,clusterArray[i].m_phi,clusterArray[i].m_radius,clusterArray[i].m_size);
313  count_yellow_c++;
314  }
315  std::string tag(tmp);
316  result->tags_[tag] = clusterArray[i].m_value;
317  }
318  result->tags_["NRedClusters"] = count_red_c;
319  result->tags_["NYellowClusters"] = count_yellow_c;
320 
321  }
322 
323  // std::sort(redbins.begin(),redbins.end(),mySortfunc);
324  std::sort(redbins.begin(),redbins.end());
325  // std::sort(yellowbins.begin(),yellowbins.end(),mySortfunc);
326  std::sort(yellowbins.begin(),yellowbins.end());
327  // std::sort(Allbins.begin(),Allbins.end(),mySortfunc_ratio);
328  std::sort(Allbins.begin(),Allbins.end());
329  // publish red bins
330  int count_red=0;
331  for(unsigned int i=0;i<redbins.size();i++){
332 
333  int q = redbins[i].m_ix-range[0];
334  int p = redbins[i].m_iy-range[2];
335 
336  if(ClusterResult){
337  if(q<(int)ColorBinMap.size()){
338  if(p<(int)ColorBinMap[q].size()){
339  if( ColorBinMap[q][p].m_status==0 ) continue;
340  }
341  }
342  }
343 
344  if(publish){
345  char tmp[500];
346  snprintf(tmp,500,"R%i-(eta,phi)[OSRatio]=(%0.3f,%0.3f)[%0.2e]",count_red,redbins[i].m_eta,redbins[i].m_phi,redbins[i].m_outstandingRatio);
347  std::string tag(tmp);
348  result->tags_[tag] = redbins[i].m_value;
349  }
350  count_red++;
351  if(NpublishRed > 0){
352  if(count_red > NpublishRed) break;
353  }
354  }
355 
356  // publish yellow bins
357  int count_yellow=0;
358  for(unsigned int i=0;i<yellowbins.size();i++){
359  int q = yellowbins[i].m_ix-range[0];
360  int p = yellowbins[i].m_iy-range[2];
361 
362  if(ClusterResult){
363  if(q<(int)ColorBinMap.size()){
364  if(p<(int)ColorBinMap[q].size()){
365  if(ColorBinMap[q][p].m_status==0) continue;
366  }
367  }
368  }
369  if(publish && (count_red+count_yellow) < Nmaxpublish ){
370  char tmp[500];
371  snprintf(tmp,500,"Y%i-(eta,phi)[OSRatio]=(%0.3f,%0.3f)[%.2e]",count_yellow,yellowbins[i].m_eta,yellowbins[i].m_phi,yellowbins[i].m_outstandingRatio);
372  std::string tag(tmp);
373  result->tags_[tag] = yellowbins[i].m_value;
374  }
375  count_yellow++;
376  }
377  result->tags_["NRedBins"] = count_red; // count_red is the number of red bins printed
378  result->tags_["NYellowBins"] = count_yellow; // count_yellow is the number of yellow bins printed
379 
380  if(count_red+count_yellow==0 && (int)Allbins.size()>=5 ){
381  for(int i=0;i<5;i++){
382  char tmptmp[500];
383  snprintf(tmptmp,500,"LeadingBin%i-(eta,phi)=(%0.3f,%0.3f)",i,Allbins[i].m_eta,Allbins[i].m_phi);
384  std::string tagtag(tmptmp);
385  result->tags_[tagtag] = Allbins[i].m_value;
386  }
387 
388  }
389 
390 
391  if(!OnlineMode){
392  if(count_red>0 || count_red_c>0) {
393  result->status_ = dqm_core::Result::Red;
394  } else {
395  if (count_yellow>0||count_yellow_c>0) {
396  result->status_ = dqm_core::Result::Yellow;
397  } else { result->status_ = dqm_core::Result::Green; }
398  }
399  } else {
400  if(count_red>=Nred_red){
401  result->status_ = dqm_core::Result::Red;
402  }else if (count_red>=Nred_yellow || count_yellow>=Nyellow_yellow || (count_red+count_yellow)>=Nredyellow_yellow){
403  result->status_ = dqm_core::Result::Yellow;
404  }else{
405  result->status_ = dqm_core::Result::Green;
406  }
407  }
408 
409  return result;
410 
411 }
412 
413 void dqm_algorithms::BinsDiffFromStripMedianOnline::FindStripMedianOnline(const std::string & name,std::vector<double> onestrip_tmp,std::vector<double>& stripsMedian){
414  double median=0;
415  // if(onestrip_tmp.size()==0) stripsMedian.push_back(median);
416  // else{
417  std::sort(onestrip_tmp.begin(),onestrip_tmp.end());
418  int index1=(int)(onestrip_tmp.size()/4.);
419  // int index1=int(floor(onestrip_tmp.size()/4.));
420  // int index2=int(floor(onestrip_tmp.size()/2.));
421  int index2=(int)(onestrip_tmp.size()/2.);
422  int index3=(int) (3.*onestrip_tmp.size()/4.);
423  // int index3=int(floor(3*onestrip_tmp.size()/4.));
424  if(onestrip_tmp.size()>0){
425  if ((int)onestrip_tmp.size() <= index1 || (int)onestrip_tmp.size() <= index2 || (int)onestrip_tmp.size() <= index3){
426  throw dqm_core::BadConfig( ERS_HERE, name, "out of onestrip_tmp range " );
427  }
428 
429  median = (onestrip_tmp[index1]+onestrip_tmp[index2]+onestrip_tmp[index3])/3.0;
430  }
431  // median = (onestrip_tmp[index2]);
432  stripsMedian.push_back(median);
433  // }
434 }
435 
436 void dqm_algorithms::BinsDiffFromStripMedianOnline::AddToList(const int r0,const int r2,int i,int j,std::vector<std::vector<colorbinOnline> > & ColorBinMap, std::vector<colorbinOnline>& LookAtList){
437 
438  if( i-r0<0 || i-r0>=(int)ColorBinMap.size()) return;
439  if( j-r2<0 || j-r2>=(int)ColorBinMap[i-r0].size() ) return;
440 
441  std::vector<colorbinOnline> tmp;
442 
443  if(i-1-r0>=0 && i-1-r0<(int)ColorBinMap.size()){
444  if(j-1-r2>=0 && j-1-r2<(int)ColorBinMap[i-1-r0].size()){
445  if(ColorBinMap[i-1-r0][j-1-r2].m_status==1){
446  tmp.push_back(ColorBinMap[i-1-r0][j-1-r2]);
447  ColorBinMap[i-1-r0][j-1-r2].m_status=0;
448  }
449  }
450  }
451  if(i-r0>=0 && i-r0<(int)ColorBinMap.size()){
452  if(j-1-r2>=0 && j-1-r2<(int)ColorBinMap[i-r0].size()){
453  if(ColorBinMap[i-r0][j-1-r2].m_status==1){
454  tmp.push_back(ColorBinMap[i-r0][j-1-r2]);
455  ColorBinMap[i-r0][j-1-r2].m_status=0;
456  }
457  }
458  }
459 
460  if(i+1-r0>=0 && i+1-r0<(int)ColorBinMap.size()){
461  if(j-1-r2>=0 && j-1-r2<(int)ColorBinMap[i+1-r0].size()){
462  if(ColorBinMap[i+1-r0][j-1-r2].m_status==1){
463  tmp.push_back(ColorBinMap[i+1-r0][j-1-r2]);
464  ColorBinMap[i+1-r0][j-1-r2].m_status=0;
465  }
466  }
467  }
468 
469  if(i-1-r0>=0 && i-1-r0<(int)ColorBinMap.size()){
470  if(j-r2>=0 && j-r2<(int)ColorBinMap[i-1-r0].size()){
471  if(ColorBinMap[i-1-r0][j-r2].m_status==1){
472  tmp.push_back(ColorBinMap[i-1-r0][j-r2]);
473  ColorBinMap[i-1-r0][j-r2].m_status=0;
474  }
475  }
476  }
477 
478 
479  if(i+1-r0>=0 && i+1-r0<(int)ColorBinMap.size()){
480  if(j-r2>=0 && j-r2<(int)ColorBinMap[i+1-r0].size()){
481  if(ColorBinMap[i+1-r0][j-r2].m_status==1){
482  tmp.push_back(ColorBinMap[i+1-r0][j-r2]);
483  ColorBinMap[i+1-r0][j-r2].m_status=0;
484  }
485  }
486  }
487 
488 
489  if(i-1-r0>=0 && i-1-r0<(int)ColorBinMap.size()){
490  if(j+1-r2>=0 && j+1-r2<(int)ColorBinMap[i-1-r0].size()){
491  if(ColorBinMap[i-1-r0][j+1-r2].m_status==1){
492  tmp.push_back(ColorBinMap[i-1-r0][j+1-r2]);
493  ColorBinMap[i-1-r0][j+1-r2].m_status=0;
494  }
495  }
496  }
497 
498  if(i-r0>=0 && i-r0<(int)ColorBinMap.size()){
499  if(j+1-r2>=0 && j+1-r2<(int)ColorBinMap[i-r0].size()){
500  if(ColorBinMap[i-r0][j+1-r2].m_status==1){
501  tmp.push_back(ColorBinMap[i-r0][j+1-r2]);
502  ColorBinMap[i-r0][j+1-r2].m_status=0;
503  }
504  }
505  }
506 
507  if(i+1-r0>=0 && i+1-r0<(int)ColorBinMap.size()){
508  if(j+1-r2>=0 && j+1-r2<(int)ColorBinMap[i+1-r0].size()){
509  if(ColorBinMap[i+1-r0][j+1-r2].m_status==1){
510  tmp.push_back(ColorBinMap[i+1-r0][j+1-r2]);
511  ColorBinMap[i+1-r0][j+1-r2].m_status=0;
512  }
513  }
514  }
515 
516  for(unsigned int k=0;k<tmp.size();k++){
517  if(tmp[k].m_color!=green){
518  LookAtList.push_back(tmp[k]);
519  AddToList(r0,r2,tmp[k].m_ix,tmp[k].m_iy,ColorBinMap,LookAtList);
520  }
521  }
522  return;
523 
524 }
525 
526 double dqm_algorithms::BinsDiffFromStripMedianOnline::CalEta(std::vector<colorbinOnline>& LookAtList){
527  double sumEta=0;
528  double sumN=0;
529  for(unsigned int i=0;i<LookAtList.size();i++){
530  double eta = LookAtList[i].m_eta;
531  double n = LookAtList[i].m_value;
532  sumEta += n*eta;
533  sumN +=n;
534  }
535  if(sumN!=0){
536  return sumEta/sumN;
537  }else{
538  return -99.;
539  }
540 }
541 
542 double dqm_algorithms::BinsDiffFromStripMedianOnline::CalPhi(std::vector<colorbinOnline>& LookAtList){
543  double sumPhi=0;
544  double sumN=0;
545  for(unsigned int i=0;i<LookAtList.size();i++){
546  double phi = LookAtList[i].m_phi;
547  double n = LookAtList[i].m_value;
548  sumPhi += n*phi;
549  sumN +=n;
550  }
551  if(sumN!=0){
552  return sumPhi/sumN;
553  }else{
554  return -99.;
555  }
556 }
557 
558 double dqm_algorithms::BinsDiffFromStripMedianOnline::CalVal(std::vector<colorbinOnline>& LookAtList){
559  double sumN=0;
560  for(unsigned int i=0;i<LookAtList.size();i++){
561  double n = LookAtList[i].m_value;
562  sumN += n;
563  }
564  return sumN;
565 }
566 double dqm_algorithms::BinsDiffFromStripMedianOnline::CalR(std::vector<colorbinOnline>& LookAtList,double eta, double phi){
567  if(LookAtList.size()<2) return 0;
568  double maxR=0;
569  for(unsigned int i=0;i<LookAtList.size();i++){
570  double distance = std::sqrt(std::pow((LookAtList[i].m_eta-eta),2)+std::pow((LookAtList[i].m_phi-phi),2));
571  maxR=distance>maxR?distance:maxR;
572  }
573  return maxR;
574 }
575 
577 dqm_algorithms::BinsDiffFromStripMedianOnline::MakeClusterOnline(const std::string & name,const int r0,const int r2,binOnline& onebin, std::vector<std::vector<colorbinOnline> > & ColorBinMap){
578  colorclusterOnline onecluster={0,0,0,0,green,-1};
579 
580  if ((int)ColorBinMap.size() <= (onebin.m_ix-r0) ){
581  throw dqm_core::BadConfig( ERS_HERE, name, "out of ColorBinMap range " );
582  }
583 
584  if ((int)ColorBinMap[onebin.m_ix-r0].size() <= (onebin.m_iy-r2) ){
585  throw dqm_core::BadConfig( ERS_HERE, name, "out of ColorBinMap range " );
586  }
587 
588  if(ColorBinMap[onebin.m_ix-r0][onebin.m_iy-r2].m_status==0)
589  return onecluster;
590  std::vector<colorbinOnline> LookAtList;
591  if(ColorBinMap[onebin.m_ix-r0][onebin.m_iy-r2].m_color!=green){
592  LookAtList.push_back(ColorBinMap[onebin.m_ix-r0][onebin.m_iy-r2]);
593  ColorBinMap[onebin.m_ix-r0][onebin.m_iy-r2].m_status=0;
594  AddToList(r0,r2,onebin.m_ix,onebin.m_iy,ColorBinMap, LookAtList);
595  if(LookAtList.size()>1){
596  onecluster.m_size = LookAtList.size();
597  onecluster.m_value = CalVal(LookAtList);
598  if(ColorBinMap[onebin.m_ix-r0][onebin.m_iy-r2].m_color==red){
599  onecluster.m_color = red;
600  }else{
601  onecluster.m_color = yellow;
602  }
603  onecluster.m_eta = CalEta(LookAtList);
604  onecluster.m_phi = CalPhi(LookAtList);
605  onecluster.m_radius = CalR(LookAtList,onecluster.m_eta,onecluster.m_phi);
606  } else {
607  ColorBinMap[onebin.m_ix-r0][onebin.m_iy-r2].m_status=1;
608  }
609  }
610  return onecluster;
611 }
612 
614 
615  out<<"BinsDiffFromStripMedianOnline: Calculates smoothed strip median and then find out bins which are aliens "<<std::endl;
616 
617  out<<"Mandatory Green/Red Threshold is the value of outstandingRatio=(bin value)/(strip median) based on which to give Green/Red result\n"<<std::endl;
618 
619  out<<"Optional Parameter: MinStat: Minimum histogram statistics needed to perform Algorithm"<<std::endl;
620  out<<"Optional Parameter: MinStatPerstrip: Minimum strip statistics needed to perform Algorithm"<<std::endl;
621  out<<"Optional Parameter: ignoreval0: values to be ignored for being processed"<<std::endl;
622  out<<"Optional Parameter: ignoreval1: values to be ignored for being processed"<<std::endl;
623  out<<"Optional Parameter: PublishBins: Save bins which are different from average in Result (on:1,off:0,default is 1)"<<std::endl;
624  out<<"Optional Parameter: MaxPublish: Max number of bins to save (default 20)"<<std::endl;
625  out<<"Optional Parameter: VisualMode: is to make the evaluation process similar to the shift work, so one will get resonable result efficiently."<<std::endl;
626 
627  out<<"Optional Parameter: PublishRedBins: Max number of red bins to save."<<std::endl;
628  out<<"Optional Parameter: ClusterResult: to cluster close bad bins together."<<std::endl;
629  out<<"Optional Parameter: SuppressFactor: if the ratio of the bin contennt to max one in the histogram is smaller than SuppressFactor, don't set the bin as red or yellow ."<<std::endl;
630  out<<"Optional Parameter: SuppressRedFactor: if the ratio of the bin contennt to max one in the histogram is smaller than SuppressRedFactor, don't set the bin as red ."<<std::endl;
631  out<<"Optional Parameter: OnlineMode: switch on when running online."<<std::endl;
632  out<<"Optional Parameter: Nred_red: minimum number of red bins needed to label the histogram as red."<<std::endl;
633  out<<"Optional Parameter: Nyellow_yellow: minimum number of yellow bins needed to label the histogram as yellow."<<std::endl;
634  out<<"Optional Parameter: Nred_yellow: minimum number of red bins needed to label the histogram as yellow."<<std::endl;
635  out<<"Optional Parameter: Nredyellow_yellow: minimum number of yellow+red bins needed to label the histogram as yellow."<<std::endl;
636 
637 }
dqm_algorithms::tools::GetBinRange
std::vector< int > GetBinRange(const TH1 *histogram, const std::map< std::string, double > &params)
Definition: AlgorithmHelper.cxx:380
dqm_algorithms::BinsDiffFromStripMedianOnline::AddToList
void AddToList(const int r0, const int r2, int i, int j, std::vector< std::vector< colorbinOnline > > &ColorBinMap, std::vector< colorbinOnline > &LookAtList)
Definition: BinsDiffFromStripMedianOnline.cxx:436
Undefined
@ Undefined
Definition: MaterialTypes.h:8
dqm_algorithms::BinsDiffFromStripMedianOnline::~BinsDiffFromStripMedianOnline
~BinsDiffFromStripMedianOnline()
Definition: BinsDiffFromStripMedianOnline.cxx:34
get_generator_info.result
result
Definition: get_generator_info.py:21
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
dqm_algorithms::BinsDiffFromStripMedianOnline::colorclusterOnline
Definition: BinsDiffFromStripMedianOnline.h:71
dqm_algorithms::BinsDiffFromStripMedianOnline::FindStripMedianOnline
void FindStripMedianOnline(const std::string &, std::vector< double > onestrip, std::vector< double > &stripsMedian)
Definition: BinsDiffFromStripMedianOnline.cxx:413
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:64
BinsDiffFromStripMedianOnline.h
IsA
#define IsA
Declare the TObject style functions.
Definition: xAODTEventBranch.h:59
CaloCellPos2Ntuple.int
int
Definition: CaloCellPos2Ntuple.py:24
dqm_algorithms::BinsDiffFromStripMedianOnline::colorclusterOnline::m_radius
double m_radius
Definition: BinsDiffFromStripMedianOnline.h:75
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
conifer::pow
constexpr int pow(int x)
Definition: conifer.h:20
python.AthDsoLogger.out
out
Definition: AthDsoLogger.py:71
mc.diff
diff
Definition: mc.SFGenPy8_MuMu_DD.py:14
UploadAMITag.l
list l
Definition: UploadAMITag.larcaf.py:158
InDet::median
float median(std::vector< float > &Vec)
Definition: BTagVrtSec.cxx:35
dqm_algorithms::BinsDiffFromStripMedianOnline::MakeClusterOnline
colorclusterOnline MakeClusterOnline(const std::string &name, const int r0, const int r2, binOnline &onebin, std::vector< std::vector< colorbinOnline > > &ColorBinMap)
Definition: BinsDiffFromStripMedianOnline.cxx:577
CalPhi
double CalPhi(std::vector< colorbin > &LookAtList)
Definition: BinsDiffFromStripMedian.cxx:355
dqm_algorithms::BinsDiffFromStripMedianOnline::colorbinOnline
Definition: BinsDiffFromStripMedianOnline.h:60
config
Definition: PhysicsAnalysis/AnalysisCommon/AssociationUtils/python/config.py:1
dqm_algorithms::BinsDiffFromStripMedianOnline::colorclusterOnline::m_eta
double m_eta
Definition: BinsDiffFromStripMedianOnline.h:73
instance
std::map< std::string, double > instance
Definition: Run_To_Get_Tags.h:8
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
Trk::index3
@ index3
Definition: BoundarySurfaceFace.h:50
CalR
double CalR(std::vector< colorbin > &LookAtList, double eta, double phi)
Definition: BinsDiffFromStripMedian.cxx:375
dqm_algorithms::BinsDiffFromStripMedianOnline::CalVal
double CalVal(std::vector< colorbinOnline > &LookAtList)
Definition: BinsDiffFromStripMedianOnline.cxx:558
Trk::index1
@ index1
Definition: BoundarySurfaceFace.h:48
dqm_algorithms::BinsDiffFromStripMedianOnline::printDescription
void printDescription(std::ostream &out)
Definition: BinsDiffFromStripMedianOnline.cxx:613
BinsDiffFromStripMedian.h
yellow
@ yellow
Definition: BinsDiffFromStripMedian.h:18
lumiFormat.i
int i
Definition: lumiFormat.py:92
dqm_algorithms::BinsDiffFromStripMedianOnline::colorclusterOnline::m_phi
double m_phi
Definition: BinsDiffFromStripMedianOnline.h:74
beamspotman.n
n
Definition: beamspotman.py:731
dqm_algorithms::BinsDiffFromStripMedianOnline::binOnline::m_ix
int m_ix
Definition: BinsDiffFromStripMedianOnline.h:53
Result
ICscStripFitter::Result Result
Definition: CalibCscStripFitter.cxx:13
dqm_algorithms::BinsDiffFromStripMedianOnline
Definition: BinsDiffFromStripMedianOnline.h:26
dqm_algorithms::BinsDiffFromStripMedianOnline::binOnline
Definition: BinsDiffFromStripMedianOnline.h:49
dqm_algorithms::BinsDiffFromStripMedianOnline::execute
dqm_core::Result * execute(const std::string &, const TObject &, const dqm_core::AlgorithmConfig &)
Definition: BinsDiffFromStripMedianOnline.cxx:42
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
python.handimod.Green
int Green
Definition: handimod.py:524
dqm_algorithms::BinsDiffFromStripMedianOnline::clone
BinsDiffFromStripMedianOnline * clone()
Definition: BinsDiffFromStripMedianOnline.cxx:37
xAOD::double
double
Definition: CompositeParticle_v1.cxx:159
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
CalVal
double CalVal(std::vector< colorbin > &LookAtList)
Definition: BinsDiffFromStripMedian.cxx:367
python.handimod.Red
Red
Definition: handimod.py:551
Trk::index2
@ index2
Definition: BoundarySurfaceFace.h:49
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
green
@ green
Definition: BinsDiffFromStripMedian.h:18
dqm_algorithms::BinsDiffFromStripMedianOnline::binOnline::m_iy
int m_iy
Definition: BinsDiffFromStripMedianOnline.h:54
dqm_algorithms::BinsDiffFromStripMedianOnline::CalEta
double CalEta(std::vector< colorbinOnline > &LookAtList)
Definition: BinsDiffFromStripMedianOnline.cxx:526
TH1
Definition: rootspy.cxx:268
AlgorithmHelper.h
extractSporadic.q
list q
Definition: extractSporadic.py:98
dqm_algorithms::tools::GetFromMap
const T & GetFromMap(const std::string &pname, const std::map< std::string, T > &params)
Definition: AlgorithmHelper.h:114
pickleTool.object
object
Definition: pickleTool.py:30
CaloCondBlobAlgs_fillNoiseFromASCII.tag
string tag
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:24
dqm_algorithms::BinsDiffFromStripMedianOnline::colorclusterOnline::m_color
color m_color
Definition: BinsDiffFromStripMedianOnline.h:77
dqm_algorithms::BinsDiffFromStripMedianOnline::CalR
double CalR(std::vector< colorbinOnline > &LookAtList, double eta, double phi)
Definition: BinsDiffFromStripMedianOnline.cxx:566
test_pyathena.counter
counter
Definition: test_pyathena.py:15
dqm_algorithms::tools::GetFirstFromMap
double GetFirstFromMap(const std::string &paramName, const std::map< std::string, double > &params)
Definition: AlgorithmHelper.cxx:339
xAOD::bool
setBGCode setTAP setLVL2ErrorBits bool
Definition: TrigDecision_v1.cxx:60
dqm_algorithms::BinsDiffFromStripMedianOnline::colorclusterOnline::m_size
int m_size
Definition: BinsDiffFromStripMedianOnline.h:78
dqm_algorithms::BinsDiffFromStripMedianOnline::BinsDiffFromStripMedianOnline
BinsDiffFromStripMedianOnline()
Definition: BinsDiffFromStripMedianOnline.cxx:30
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
updateCoolNtuple.limit
int limit
Definition: updateCoolNtuple.py:45
red
@ red
Definition: BinsDiffFromStripMedian.h:18
CalEta
double CalEta(std::vector< colorbin > &LookAtList)
Definition: BinsDiffFromStripMedian.cxx:343
AddToList
void AddToList(const int r0, const int r2, int i, int j, std::vector< std::vector< colorbin > > &ColorBinMap, std::vector< colorbin > &LookAtList)
Definition: BinsDiffFromStripMedian.cxx:291
histogram
std::string histogram
Definition: chains.cxx:52
fitman.k
k
Definition: fitman.py:528
dqm_algorithms::BinsDiffFromStripMedianOnline::CalPhi
double CalPhi(std::vector< colorbinOnline > &LookAtList)
Definition: BinsDiffFromStripMedianOnline.cxx:542
dqm_algorithms::BinsDiffFromStripMedianOnline::colorclusterOnline::m_value
double m_value
Definition: BinsDiffFromStripMedianOnline.h:76