149 execute(
const std::string& name,
const TObject&
data,
const dqm_core::AlgorithmConfig& config)
151 dqm_core::Result* result =
new dqm_core::Result();
162 if (!
data.IsA()->InheritsFrom(
"TH1")) {
163 throw dqm_core::BadConfig(ERS_HERE, name,
"does not inherit from TH1");
165 const TH1*
h =
static_cast<const TH1*
>(&
data);
166 if (
h->GetDimension() > 2) {
167 throw dqm_core::BadConfig(ERS_HERE, name,
"dimension > 2 ");
182 catch (dqm_core::Exception & ex) {
183 throw dqm_core::BadConfig( ERS_HERE, name, ex.what(), ex );
185 if ( UseValue == 0 ) ERS_INFO(
"UseValue == 0 is meaningless");
190 if (
data.IsA()->InheritsFrom(
"TProfile") ) {
191 const TProfile* hp =
static_cast<const TProfile*
>(&
data);
196 std::vector<BinThresh::mask_limits> Limits;
198 Limits =
Limits1D_GetFromMap(config.getParameters(), config.getGreenThresholds(), config.getRedThresholds());
200 catch (dqm_core::Exception & ex) {
201 throw dqm_core::BadConfig( ERS_HERE, name, ex.what(), ex );
206 if ((UseValue > 0 && Limits[
bin].WarningValue > Limits[
bin].ErrorValue) ||
207 (UseValue < 0 && Limits[
bin].WarningValue < Limits[
bin].ErrorValue)) {
209 if ( !Limits[
bin].Mask ) {
210 std::string problem_message = Form(
"Incompatible Warning and Error Values in bin_%d : Warning = %e -> Error = %e",
bin + 1, Limits[
bin].WarningValue, Limits[
bin].ErrorValue);
211 ERS_INFO(problem_message.c_str());
217 double h_entries = hp->GetEntries();
220 Limits[
bin].WarningValue = Limits[
bin].WarningValue * h_entries;
221 Limits[
bin].ErrorValue = Limits[
bin].ErrorValue * h_entries;
227 double bincon = hp->GetBinContent(
bin + 1);
228 if ( !Limits[
bin].Mask && hp->GetBinEntries(
bin + 1) >= BinMinEntries ) {
230 if ((UseValue == 1 && bincon >= Limits[
bin].ErrorValue) ||
231 (UseValue > 1 && bincon > Limits[
bin].ErrorValue) ||
232 (UseValue == -1 && bincon <= Limits[
bin].ErrorValue) ||
233 (UseValue < -1 && bincon < Limits[
bin].ErrorValue) ) {
235 if ( NErrors + NWarnings + NGoodPrint <= Publish ) {
236 double binval = hp->GetXaxis()->GetBinCenter(
bin + 1);
241 std::string binname = Form(
"%s_ErrorBin(%u | %.*e)", name.c_str(),
bin, 2, binval);
243 if ( TypeValue > 0.5 ) {
244 result->tags_[binname.c_str()] = (bincon / h_entries);
246 result->tags_[binname.c_str()] = bincon;
251 else if ((UseValue == 1 && bincon >= Limits[
bin].WarningValue) ||
252 (UseValue > 1 && bincon > Limits[
bin].WarningValue) ||
253 (UseValue == -1 && bincon <= Limits[
bin].WarningValue) ||
254 (UseValue < -1 && bincon < Limits[
bin].WarningValue) ) {
256 if ( TypePublish >= 1 && NErrors + NWarnings + NGoodPrint <= Publish ) {
257 float binval = hp->GetXaxis()->GetBinCenter(
bin + 1);
261 std::string binname = Form(
"%s_WarningBin(%u | %.*e)", name.c_str(),
bin, 2, binval);
262 if ( TypeValue > 0.5 ) {
263 result->tags_[binname.c_str()] = (bincon / h_entries);
265 result->tags_[binname.c_str()] = bincon;
272 if ( TypePublish >= 2 && NErrors + NWarnings + NGoodPrint <= Publish ) {
273 float binval = hp->GetXaxis()->GetBinCenter(
bin + 1);
277 std::string binname = Form(
"%s_GoodBin(%u | %.*e)", name.c_str(),
bin, 2, binval);
278 if ( TypeValue > 0.5 ) {
279 result->tags_[binname.c_str()] = (bincon / h_entries);
281 result->tags_[binname.c_str()] = bincon;
292 if ( (!
data.IsA()->InheritsFrom(
"TProfile")) &&
h->GetDimension() == 1 ) {
296 std::vector<BinThresh::mask_limits> Limits;
298 Limits =
Limits1D_GetFromMap(config.getParameters(), config.getGreenThresholds(), config.getRedThresholds());
300 catch (dqm_core::Exception & ex) {
301 throw dqm_core::BadConfig( ERS_HERE, name, ex.what(), ex );
306 if ((UseValue > 0 && Limits[
bin].WarningValue > Limits[
bin].ErrorValue) ||
307 (UseValue < 0 && Limits[
bin].WarningValue < Limits[
bin].ErrorValue)) {
309 if ( !Limits[
bin].Mask ) {
310 std::string problem_message = Form(
"Incompatible Warning and Error Values in bin_%d : Warning = %e -> Error = %e",
bin + 1, Limits[
bin].WarningValue, Limits[
bin].ErrorValue);
311 ERS_INFO(problem_message.c_str());
317 double h_entries =
h->GetEntries();
320 Limits[
bin].WarningValue = Limits[
bin].WarningValue * h_entries;
321 Limits[
bin].ErrorValue = Limits[
bin].ErrorValue * h_entries;
327 double bincon =
h->GetBinContent(
bin + 1);
328 if ( !Limits[
bin].Mask ) {
330 if ((UseValue == 1 && bincon >= Limits[
bin].ErrorValue) ||
331 (UseValue > 1 && bincon > Limits[
bin].ErrorValue) ||
332 (UseValue == -1 && bincon <= Limits[
bin].ErrorValue) ||
333 (UseValue < -1 && bincon < Limits[
bin].ErrorValue) ) {
335 if ( NErrors + NWarnings + NGoodPrint <= Publish ) {
336 double binval =
h->GetXaxis()->GetBinCenter(
bin + 1);
341 std::string binname = Form(
"%s_ErrorBin(%u | %.*e)", name.c_str(),
bin, 2, binval);
343 if ( TypeValue > 0.5 ) {
344 result->tags_[binname.c_str()] = (bincon / h_entries);
346 result->tags_[binname.c_str()] = bincon;
351 else if ((UseValue == 1 && bincon >= Limits[
bin].WarningValue) ||
352 (UseValue > 1 && bincon > Limits[
bin].WarningValue) ||
353 (UseValue == -1 && bincon <= Limits[
bin].WarningValue) ||
354 (UseValue < -1 && bincon < Limits[
bin].WarningValue) ) {
356 if ( TypePublish >= 1 && NErrors + NWarnings + NGoodPrint <= Publish ) {
357 float binval =
h->GetXaxis()->GetBinCenter(
bin + 1);
361 std::string binname = Form(
"%s_WarningBin(%u | %.*e)", name.c_str(),
bin, 2, binval);
362 if ( TypeValue > 0.5 ) {
363 result->tags_[binname.c_str()] = (bincon / h_entries);
365 result->tags_[binname.c_str()] = bincon;
372 if ( TypePublish >= 2 && NErrors + NWarnings + NGoodPrint <= Publish ) {
373 float binval =
h->GetXaxis()->GetBinCenter(
bin + 1);
377 std::string binname = Form(
"%s_GoodBin(%u | %.*e)", name.c_str(),
bin, 2, binval);
378 if ( TypeValue > 0.5 ) {
379 result->tags_[binname.c_str()] = (bincon / h_entries);
381 result->tags_[binname.c_str()] = bincon;
392 if ( (!
data.IsA()->InheritsFrom(
"TProfile")) &&
h->GetDimension() == 2 ) {
397 std::vector< std::vector<BinThresh::mask_limits> > Limits;
399 Limits =
Limits2D_GetFromMap(config.getParameters(), config.getGreenThresholds(), config.getRedThresholds());
401 catch (dqm_core::Exception & ex) {
402 throw dqm_core::BadConfig( ERS_HERE, name, ex.what(), ex );
406 for(
int binX = 0; binX <
m_NbinsX; binX++) {
407 for(
int binY = 0; binY <
m_NbinsY; binY++) {
408 if ( (UseValue > 0 && Limits[binX][binY].WarningValue > Limits[binX][binY].ErrorValue) ||
409 (UseValue < 0 && Limits[binX][binY].WarningValue < Limits[binX][binY].ErrorValue)) {
411 if ( !Limits[binX][binY].Mask ) {
412 std::string problem_message = Form(
"Incompatible Warning and Error Values in bin_%d_%d : Warning = %e -> Error = %e", binX + 1, binY + 1, Limits[binX][binY].WarningValue, Limits[binX][binY].ErrorValue);
413 ERS_INFO(problem_message.c_str());
419 double h_entries =
h->GetEntries();
421 for (
int binX = 0; binX <
m_NbinsX; binX++) {
422 for (
int binY = 0; binY <
m_NbinsY; binY++) {
423 Limits[binX][binY].WarningValue = Limits[binX][binY].WarningValue * h_entries;
424 Limits[binX][binY].ErrorValue = Limits[binX][binY].ErrorValue * h_entries;
429 for (
int binX = 0; binX <
m_NbinsX; binX++) {
430 for (
int binY = 0; binY <
m_NbinsY; binY++) {
431 double bincon =
h->GetBinContent(binX + 1, binY + 1);
432 if ( !Limits[binX][binY].Mask ) {
434 if ( (UseValue == 1 && bincon >= Limits[binX][binY].ErrorValue) ||
435 (UseValue > 1 && bincon > Limits[binX][binY].ErrorValue) ||
436 (UseValue == -1 && bincon <= Limits[binX][binY].ErrorValue) ||
437 (UseValue < -1 && bincon < Limits[binX][binY].ErrorValue) ) {
439 if ( NErrors + NWarnings + NGoodPrint <= Publish ) {
440 float binvalX =
h->GetXaxis()->GetBinCenter(binX + 1);
441 float binvalY =
h->GetYaxis()->GetBinCenter(binY + 1);
442 std::string binname = Form(
"%s_ErrorBin((%u,%u) | %.*e,%.*e)", name.c_str(), binX, binY, 2, binvalX, 2, binvalY);
444 if ( TypeValue > 0.5 ) {
445 result->tags_[binname.c_str()] = (bincon / h_entries);
447 result->tags_[binname.c_str()] = bincon;
452 else if ( (UseValue == 1 && bincon >= Limits[binX][binY].WarningValue) ||
453 (UseValue > 1 && bincon > Limits[binX][binY].WarningValue) ||
454 (UseValue == -1 && bincon <= Limits[binX][binY].WarningValue) ||
455 (UseValue < -1 && bincon < Limits[binX][binY].WarningValue) ) {
457 if ( TypePublish >= 1 && NErrors + NWarnings + NGoodPrint <= Publish ) {
458 float binvalX =
h->GetXaxis()->GetBinCenter(binX + 1);
459 float binvalY =
h->GetYaxis()->GetBinCenter(binY + 1);
460 std::string binname = Form(
"%s_WarningBin((%u,%u) | %.*e,%.*e)", name.c_str(), binX, binY, 2, binvalX, 2, binvalY);
461 if ( TypeValue > 0.5 ) {
462 result->tags_[binname.c_str()] = (bincon / h_entries);
464 result->tags_[binname.c_str()] = bincon;
471 if ( TypePublish >= 2 && NErrors + NWarnings + NGoodPrint <= Publish ) {
472 float binvalX =
h->GetXaxis()->GetBinCenter(binX + 1);
473 float binvalY =
h->GetYaxis()->GetBinCenter(binY + 1);
474 std::string binname = Form(
"%s_GoodBin((%u,%u) | %.*e,%.*e)", name.c_str(), binX, binY, 2, binvalX, 2, binvalY);
475 if ( TypeValue > 0.5 ) {
476 result->tags_[binname.c_str()] = (bincon / h_entries);
478 result->tags_[binname.c_str()] = bincon;
487 if ( Publish >= 0 ) {
488 std::string pub_error = Form(
"%s_Bin_Errors", name.c_str());
489 result->tags_[pub_error.c_str()] = NErrors;
490 if ( TypePublish >= 1 ) {
491 std::string pub_warning = Form(
"%s_Bin_Warnings", name.c_str());
492 result->tags_[pub_warning.c_str()] = NWarnings;
497 if ( (NErrors == 0) && (NWarnings == 0) ) result->status_ = dqm_core::Result::Green;
498 if ( (NErrors == 0) && (NWarnings > 0) ) result->status_ = dqm_core::Result::Yellow;
499 if ( (NErrors > 0) ) result->status_ = dqm_core::Result::Red;
615 const std::map<std::string, double> & warning_params,
616 const std::map<std::string, double> & error_params )
618 std::map<std::string, double>::const_iterator warning_map_bin;
619 std::map<std::string, double>::const_iterator error_map_bin;
620 std::map<std::string, double>::const_iterator mask_map_bin;
626 default_Limits.
Mask =
true;
629 warning_map_bin = warning_params.find(valueAllStr);
630 error_map_bin = error_params.find(valueAllStr);
631 if ( warning_map_bin != warning_params.end() &&
632 error_map_bin != error_params.end() ) {
634 default_Limits.
ErrorValue = error_map_bin->second;
635 default_Limits.
Mask =
false;
639 std::vector< std::vector<BinThresh::mask_limits> > Limits(
m_NbinsX, std::vector<BinThresh::mask_limits>(
m_NbinsY, default_Limits));
642 for (
int binX = 0; binX <
m_NbinsX; binX++ ) {
643 for (
int binY = 0; binY <
m_NbinsY; binY++ ) {
644 std::string value_bin = Form(
"Value_%d_%d", binX + 1, binY + 1);
646 warning_map_bin = warning_params.find(value_bin.c_str());
647 error_map_bin = error_params.find(value_bin.c_str());
648 if ( warning_map_bin != warning_params.end() &&
649 error_map_bin != error_params.end() ) {
650 Limits[binX][binY].WarningValue = warning_map_bin->second;
651 Limits[binX][binY].ErrorValue = error_map_bin->second;
652 Limits[binX][binY].Mask =
false;
657 std::string mask_bin = Form(
"Mask_%d_%d", binX + 1, binY + 1);
658 mask_map_bin = params.find(mask_bin.c_str());
659 if ( mask_map_bin != params.end() ) {
660 if(mask_map_bin->second > 0.5) Limits[binX][binY].Mask =
true;