10 #include <dqm_core/AlgorithmConfig.h>
13 #include <dqm_core/AlgorithmManager.h>
47 const TObject&
object,
48 const dqm_core::AlgorithmConfig&
config )
52 if(
object.
IsA()->InheritsFrom(
"TH1" ) ) {
55 throw dqm_core::BadConfig( ERS_HERE,
name,
"dimension > 2 " );
58 throw dqm_core::BadConfig( ERS_HERE,
name,
"does not inherit from TH1" );
70 if (
histogram->GetEntries() < minstat ) {
82 catch( dqm_core::Exception & ex ) {
83 throw dqm_core::BadConfig( ERS_HERE,
name, ex.what(), ex );
87 std::vector<double> stripsMedian;
88 std::vector<double> stripsAvg;
89 std::vector<double> stripsVariance;
92 std::vector<double> onestrip;
95 if (
histogram->GetBinContent(
i,j) == ignoreval)
continue;
96 float binvalue =
histogram->GetBinContent(
i,j);
97 onestrip.push_back(binvalue);
99 if(binvalue > maxInMap) {
103 stripsAvg.push_back(stripSum/onestrip.size());
104 FindStripMedian(std::move(onestrip),stripsMedian);
109 for (
int j =
range[2]; j <=
range[3]; ++j ) {
110 if (
histogram->GetBinContent(
i,j) == ignoreval)
continue;
111 double binvalue =
histogram->GetBinContent(
i,j);
118 stripsVariance.push_back(variance);
121 std::vector<bin> redbins;
122 std::vector<bin> yellowbins;
123 std::vector<bin> Allbins;
127 if (binvalue== ignoreval)
continue;
128 double strip_median = stripsMedian[
k-
range[0]];
129 if(stripsMedian[
k-
range[0]]==0 && stripsVariance[
k-
range[0]]==0)
continue;
130 else if(stripsMedian[
k-
range[0]]==0 && stripsVariance[
k-
range[0]]!=0 && stripsAvg[
k-
range[0]]!=0) strip_median = stripsAvg[
k-
range[0]];
131 else if(stripsMedian[
k-
range[0]]==0 && stripsVariance[
k-
range[0]]!=0 && stripsAvg[
k-
range[0]]==0)
continue;
132 double outstandingRatio=0;
133 if(std::abs(strip_median) > 0.00001 ) outstandingRatio= (binvalue-strip_median)/std::sqrt(std::abs(strip_median));
137 bin onebin = {
eta,
phi,
k,
l,binvalue,outstandingRatio};
138 Allbins.push_back(onebin);
139 if (maxInMap == 0)
continue;
140 if(std::abs(outstandingRatio) > rthreshold ) {
141 if( VisualMode && (binvalue / maxInMap < suppressRedFactor) )
143 redbins.push_back(onebin);
145 else if(std::abs(outstandingRatio) > gthreshold ){
146 if( VisualMode && (binvalue / maxInMap < suppressFactor) )
148 yellowbins.push_back(onebin);
153 int count_yellow_c = 0;
154 std::vector<std::vector<colorbin> > ColorBinMap;
158 std::vector<colorbin> oneColorStrip;
160 colorbin oneColorBin = {
static_cast<double>(
k),
static_cast<double>(
l), -1, -1, -1,
green, 1};
161 oneColorStrip.push_back(oneColorBin);
163 ColorBinMap.push_back(std::move(oneColorStrip));
167 for(
unsigned int i=0;
i<redbins.size();
i++){
168 int k=redbins[
i].m_ix;
169 int l=redbins[
i].m_iy;
171 ColorBinMap[
k-
range[0]][
l-
range[2]].m_eta = redbins[
i].m_eta;
173 ColorBinMap[
k-
range[0]][
l-
range[2]].m_phi = redbins[
i].m_phi;
174 ColorBinMap[
k-
range[0]][
l-
range[2]].m_value = redbins[
i].m_value;
180 for(
unsigned int i=0;
i<yellowbins.size();
i++){
181 int k=yellowbins[
i].m_ix;
182 int l=yellowbins[
i].m_iy;
183 ColorBinMap[
k-
range[0]][
l-
range[2]].m_eta = yellowbins[
i].m_eta;
184 ColorBinMap[
k-
range[0]][
l-
range[2]].m_phi = yellowbins[
i].m_phi;
185 ColorBinMap[
k-
range[0]][
l-
range[2]].m_value = yellowbins[
i].m_value;
191 std::vector<colorcluster > clusterArray;
192 for(
unsigned int i=0;
i<redbins.size();
i++){
193 const int k=redbins[
i].m_ix;
194 const int l=redbins[
i].m_iy;
197 if(onecluster.
m_size > 1) clusterArray.push_back(onecluster);
200 for(
unsigned int i=0;
i<yellowbins.size();
i++){
201 const int k=yellowbins[
i].m_ix;
202 const int l=yellowbins[
i].m_iy;
205 if(onecluster.
m_size > 1) clusterArray.push_back(onecluster);
210 for(
unsigned int i=0;
i<clusterArray.size();
i++){
212 if(clusterArray[
i].m_color==
red){
214 "CR{}-(eta,phi)(r)(size)=({:.3f},{:.3f})({:.3f})({})",
216 clusterArray[
i].m_eta,
217 clusterArray[
i].m_phi,
218 clusterArray[
i].m_radius,
219 clusterArray[
i].m_size);
222 else if(clusterArray[
i].m_color==
yellow){
224 "CY{}-(eta,phi)(r)(size)=({:.3f},{:.3f})({:.3f})({})",
226 clusterArray[
i].m_eta,
227 clusterArray[
i].m_phi,
228 clusterArray[
i].m_radius,
229 clusterArray[
i].m_size);
234 result->tags_[
"NRedClusters"] = count_red_c;
235 result->tags_[
"NYellowClusters"] = count_yellow_c;
240 std::sort(redbins.begin(),redbins.end(),
mySortfunc);
241 std::sort(yellowbins.begin(),yellowbins.end(),
mySortfunc);
245 for(
unsigned int i=0;
i<redbins.size();
i++){
246 if(ClusterResult && ColorBinMap[redbins[
i].m_ix-
range[0]][redbins[
i].m_iy-
range[2]].m_status==0 )
continue;
249 sprintf(
tmp,
"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);
255 if(count_red > NpublishRed)
break;
261 for(
unsigned int i=0;
i<yellowbins.size();
i++){
262 if(ClusterResult &&ColorBinMap[yellowbins[
i].m_ix-
range[0]][yellowbins[
i].m_iy-
range[2]].m_status==0)
continue;
263 if(publish && (count_red+count_yellow) < Nmaxpublish ){
265 sprintf(
tmp,
"Y%i-(eta,phi)[OSRatio]=(%0.3f,%0.3f)[%.2e]",count_yellow,yellowbins[
i].m_eta,yellowbins[
i].m_phi,yellowbins[
i].m_outstandingRatio);
271 result->tags_[
"NRedBins"] = count_red;
272 result->tags_[
"NYellowBins"] = count_yellow;
274 if(count_red+count_yellow==0 && Allbins.size()>=5 ){
275 for(
int i=0;
i<5;
i++){
277 sprintf(tmptmp,
"LeadingBin%i-(eta,phi)=(%0.3f,%0.3f)",
i,Allbins[
i].m_eta,Allbins[
i].m_phi);
278 std::string tagtag = tmptmp;
279 result->tags_[tagtag] = Allbins[
i].m_value;
286 else if (count_yellow>0||count_yellow_c>0)
result->status_ = dqm_core::Result::Yellow;
296 std::sort(onestrip_tmp.begin(),onestrip_tmp.end());
297 int index1=onestrip_tmp.size()/4;
299 int index2=onestrip_tmp.size()/2;
300 int index3=3*onestrip_tmp.size()/4;
302 stripsMedian.push_back(
median);
304 void AddToList(
const int r0,
const int r2,
int i,
int j,std::vector<std::vector<colorbin> > & ColorBinMap, std::vector<colorbin>& LookAtList){
306 if(
i-r0<0 || i-r0>=(
int)ColorBinMap.size()
307 || j-r2<0 ||j-r2>=(
int)ColorBinMap[0].size() )
return;
309 std::vector<colorbin>
tmp;
311 if(
i-1-r0>=0 && j-1-r2>=0 && ColorBinMap[
i-1-r0][j-1-r2].m_status==1){
312 tmp.push_back(ColorBinMap[
i-1-r0][j-1-r2]);
313 ColorBinMap[
i-1-r0][j-1-r2].m_status=0;
315 if(j-1-r2 >=0 && ColorBinMap[
i-r0][j-1-r2].m_status==1){
316 tmp.push_back(ColorBinMap[
i-r0][j-1-r2]);
317 ColorBinMap[
i-r0][j-1-r2].m_status=0;
319 if(
i+1-r0<(
int)ColorBinMap.size() && j-1-r2 >=0 && ColorBinMap[
i+1-r0][j-1-r2].m_status==1){
320 tmp.push_back(ColorBinMap[
i+1-r0][j-1-r2]);
321 ColorBinMap[
i+1-r0][j-1-r2].m_status=0;
323 if(
i-1-r0>=0 && ColorBinMap[
i-1-r0][j-r2].m_status==1){
324 tmp.push_back(ColorBinMap[
i-1-r0][j-r2]);
325 ColorBinMap[
i-1-r0][j-r2].m_status=0;
328 if(
i+1-r0<(
int)ColorBinMap.size() && ColorBinMap[
i+1-r0][j-r2].m_status==1){
329 tmp.push_back(ColorBinMap[
i+1-r0][j-r2]);
330 ColorBinMap[
i+1-r0][j-r2].m_status=0;
332 if(
i-1-r0>=0 && j+1-r2 < (
int)ColorBinMap[0].
size()
333 && ColorBinMap[
i-1-r0][j+1-r2].m_status==1){
334 tmp.push_back(ColorBinMap[
i-1-r0][j+1-r2]);
335 ColorBinMap[
i-1-r0][j+1-r2].m_status=0;
337 if(j+1-r2<(
int)ColorBinMap[0].
size()&& ColorBinMap[
i-r0][j+1-r2].m_status==1){
338 tmp.push_back(ColorBinMap[
i-r0][j+1-r2]);
339 ColorBinMap[
i-r0][j+1-r2].m_status=0;
341 if(
i+1-r0<(
int)ColorBinMap.size() && j+1-r2<(
int)ColorBinMap[0].size()&&ColorBinMap[
i+1-r0][j+1-r2].m_status==1){
342 tmp.push_back(ColorBinMap[
i+1-r0][j+1-r2]);
343 ColorBinMap[
i+1-r0][j+1-r2].m_status=0;
346 for(
unsigned int k=0;
k<
tmp.size();
k++){
348 LookAtList.push_back(
tmp[
k]);
356 double CalEta(std::vector<colorbin>& LookAtList){
359 for(
unsigned int i=0;
i<LookAtList.size();
i++){
360 double eta = LookAtList[
i].m_eta;
361 double n = LookAtList[
i].m_value;
365 if(sumN!=0)
return sumEta/sumN;
368 double CalPhi(std::vector<colorbin>& LookAtList){
371 for(
unsigned int i=0;
i<LookAtList.size();
i++){
372 double phi = LookAtList[
i].m_phi;
373 double n = LookAtList[
i].m_value;
377 if(sumN!=0)
return sumPhi/sumN;
380 double CalVal(std::vector<colorbin>& LookAtList){
382 for(
unsigned int i=0;
i<LookAtList.size();
i++){
383 double n = LookAtList[
i].m_value;
388 double CalR(std::vector<colorbin>& LookAtList,
double eta,
double phi){
389 if(LookAtList.size()<2)
return 0;
391 for(
unsigned int i=0;
i<LookAtList.size();
i++){
401 if(ColorBinMap[onebin.
m_ix-r0][onebin.
m_iy-r2].m_status==0)
403 std::vector<colorbin> LookAtList;
404 if(ColorBinMap[onebin.
m_ix-r0][onebin.
m_iy-r2].m_color!=
green){
405 LookAtList.push_back(ColorBinMap[onebin.
m_ix-r0][onebin.
m_iy-r2]);
406 ColorBinMap[onebin.
m_ix-r0][onebin.
m_iy-r2].m_status=0;
408 if(LookAtList.size()>1){
409 onecluster.
m_size = LookAtList.size();
411 if(ColorBinMap[onebin.
m_ix-r0][onebin.
m_iy-r2].m_color==
red)
418 else ColorBinMap[onebin.
m_ix-r0][onebin.
m_iy-r2].m_status=1;
427 out<<
"BinsDiffFromStripMedian: Calculates smoothed strip median and then find out bins which are aliens "<<std::endl;
429 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;
431 out<<
"Optional Parameter: MinStat: Minimum histogram statistics needed to perform Algorithm"<<std::endl;
432 out<<
"Optional Parameter: ignoreval: valued to be ignored for being processed"<<std::endl;
433 out<<
"Optional Parameter: PublishBins: Save bins which are different from average in Result (on:1,off:0,default is 1)"<<std::endl;
434 out<<
"Optional Parameter: MaxPublish: Max number of bins to save (default 20)"<<std::endl;
435 out<<
"Optional Parameter: VisualMode: is to make the evaluation process similar to the shift work, so one will get resonable result efficiently."<<std::endl;