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 ) {
71 dqm_core::Result *
result =
new dqm_core::Result(dqm_core::Result::Undefined);
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;
91 for (
int i = range[0]; i <= range[1]; ++i ) {
92 std::vector<double> onestrip;
94 for (
int j = range[2]; j <= range[3]; ++j ) {
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());
106 for (
int i = range[0]; i <= range[1]; ++i ) {
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);
112 double diff=binvalue-stripsAvg[i-range[0]];
113 sumdiff2 +=std::pow(
diff,2);
117 if(counter!=0) variance = sumdiff2 / counter ;
118 stripsVariance.push_back(variance);
120 dqm_core::Result*
result =
new dqm_core::Result();
121 std::vector<bin> redbins;
122 std::vector<bin> yellowbins;
123 std::vector<bin> Allbins;
124 for (
int k = range[0]; k <= range[1]; ++k ) {
125 for (
int l = range[2]; l <= range[3]; ++l ) {
126 double binvalue =
histogram->GetBinContent(k,l);
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;
157 for (
int k = range[0]; k <= range[1]; ++k ) {
158 std::vector<colorbin> oneColorStrip;
159 for (
int l = range[2]; l <= range[3]; ++l ) {
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;
175 ColorBinMap[k-range[0]][l-range[2]].m_color =
red;
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;
186 ColorBinMap[k-range[0]][l-range[2]].m_color =
yellow;
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;
195 if(ColorBinMap[k-range[0]][l-range[2]].m_color !=
green){
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;
203 if(ColorBinMap[k-range[0]][l-range[2]].m_color !=
green){
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);
232 result->tags_[tag] = clusterArray[i].m_value;
234 result->tags_[
"NRedClusters"] = count_red_c;
235 result->tags_[
"NYellowClusters"] = count_yellow_c;
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);
250 std::string tag = tmp;
251 result->tags_[tag] = redbins[i].m_value;
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);
266 std::string tag = tmp;
267 result->tags_[tag] = yellowbins[i].m_value;
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;
285 if(count_red>0 || count_red_c>0)
result->status_ = dqm_core::Result::Red;
286 else if (count_yellow>0||count_yellow_c>0)
result->status_ = dqm_core::Result::Yellow;
287 else result->status_ = dqm_core::Result::Green;
304void 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;
337if(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++){
347 if(tmp[k].m_color!=
green){
348 LookAtList.push_back(tmp[k]);
349 AddToList(r0,r2,tmp[k].m_ix,tmp[k].m_iy,ColorBinMap,LookAtList);