diff --git a/DQMServices/Core/interface/DQMStore.h b/DQMServices/Core/interface/DQMStore.h index 7413255a48f58..c5f1afd70a69c 100644 --- a/DQMServices/Core/interface/DQMStore.h +++ b/DQMServices/Core/interface/DQMStore.h @@ -251,6 +251,20 @@ namespace dqm { /* forceReplace */ true); } template ::value, int> = 0> + MonitorElement* book2DPoly(TString const& name, + TString const& title, + double lowX, + double highX, + double lowY, + double highY, + FUNC onbooking = NOOP()) { + return bookME(name, MonitorElementData::Kind::TH2Poly, [=]() { + auto th2poly = new TH2Poly(name, title, lowX, highX, lowY, highY); + onbooking(th2poly); + return th2poly; + }); + } + template ::value, int> = 0> MonitorElement* book2S(TString const& name, TString const& title, int nchX, diff --git a/DQMServices/Core/interface/MonitorElement.h b/DQMServices/Core/interface/MonitorElement.h index 72ffebb8721db..34b1a74f03512 100644 --- a/DQMServices/Core/interface/MonitorElement.h +++ b/DQMServices/Core/interface/MonitorElement.h @@ -21,11 +21,13 @@ #include "TH2S.h" #include "TH2I.h" #include "TH2D.h" +#include "TH2Poly.h" #include "TH3F.h" #include "TProfile.h" #include "TProfile2D.h" #include "TObjString.h" #include "TAxis.h" +#include "TGraph.h" #include #include @@ -398,6 +400,7 @@ namespace dqm::impl { virtual const std::string &getStringValue() const; // non-const -- thread safety and semantical issues + virtual void addBin(TGraph *graph); virtual void setBinContent(int binx, double content); virtual void setBinContent(int binx, int biny, double content); virtual void setBinContent(int binx, int biny, int binz, double content); @@ -443,6 +446,7 @@ namespace dqm::impl { virtual TH2S *getTH2S(); virtual TH2I *getTH2I(); virtual TH2D *getTH2D(); + virtual TH2Poly *getTH2Poly(); virtual TH3F *getTH3F(); virtual TProfile *getTProfile(); virtual TProfile2D *getTProfile2D(); @@ -511,6 +515,10 @@ namespace dqm::legacy { virtual TH2D *getTH2D() const { return const_cast(this)->dqm::reco::MonitorElement::getTH2D(); }; + using dqm::reco::MonitorElement::getTH2Poly; + virtual TH2Poly *getTH2Poly() const { + return const_cast(this)->dqm::reco::MonitorElement::getTH2Poly(); + }; using dqm::reco::MonitorElement::getTH3F; virtual TH3F *getTH3F() const { return const_cast(this)->dqm::reco::MonitorElement::getTH3F(); diff --git a/DQMServices/Core/src/MonitorElement.cc b/DQMServices/Core/src/MonitorElement.cc index a26e063af8e99..b4ea425eb8ee4 100644 --- a/DQMServices/Core/src/MonitorElement.cc +++ b/DQMServices/Core/src/MonitorElement.cc @@ -243,6 +243,8 @@ namespace dqm::impl { static_cast(accessRootObject(access, __PRETTY_FUNCTION__, 2))->Fill(x, yw, 1); else if (kind() == Kind::TH2I) static_cast(accessRootObject(access, __PRETTY_FUNCTION__, 2))->Fill(x, yw, 1); + else if (kind() == Kind::TH2Poly) + static_cast(accessRootObject(access, __PRETTY_FUNCTION__, 2))->Fill(x, yw, 1); else if (kind() == Kind::TPROFILE) static_cast(accessRootObject(access, __PRETTY_FUNCTION__, 1))->Fill(x, yw, 1); else @@ -329,6 +331,8 @@ namespace dqm::impl { static_cast(accessRootObject(access, __PRETTY_FUNCTION__, 2))->Fill(x, y, zw); else if (kind() == Kind::TH2I) static_cast(accessRootObject(access, __PRETTY_FUNCTION__, 2))->Fill(x, y, zw); + else if (kind() == Kind::TH2Poly) + static_cast(accessRootObject(access, __PRETTY_FUNCTION__, 2))->Fill(x, y, zw); else if (kind() == Kind::TH3F) static_cast(accessRootObject(access, __PRETTY_FUNCTION__, 2))->Fill(x, y, zw, 1); else if (kind() == Kind::TPROFILE) @@ -688,6 +692,16 @@ namespace dqm::impl { /*** setter methods (wrapper around ROOT methods) ****/ // + /// set polygon bin (TH2Poly) + void MonitorElement::addBin(TGraph *graph) { + auto access = this->accessMut(); + if (kind() == Kind::TH2Poly) { + static_cast(accessRootObject(access, __PRETTY_FUNCTION__, 2))->AddBin(graph); + } else { + incompatible(__PRETTY_FUNCTION__); + } + } + /// set content of bin (1-D) void MonitorElement::setBinContent(int binx, double content) { auto access = this->accessMut(); @@ -1032,6 +1046,12 @@ namespace dqm::impl { return static_cast(accessRootObject(access, __PRETTY_FUNCTION__, 2)); } + TH2Poly *MonitorElement::getTH2Poly() { + auto access = this->accessMut(); + assert(kind() == Kind::TH2Poly); + return static_cast(accessRootObject(access, __PRETTY_FUNCTION__, 2)); + } + TH3F *MonitorElement::getTH3F() { auto access = this->accessMut(); assert(kind() == Kind::TH3F); diff --git a/DataFormats/Histograms/interface/MEtoEDMFormat.h b/DataFormats/Histograms/interface/MEtoEDMFormat.h index 0f20e6ea460fa..3e0033f51ca09 100644 --- a/DataFormats/Histograms/interface/MEtoEDMFormat.h +++ b/DataFormats/Histograms/interface/MEtoEDMFormat.h @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include diff --git a/DataFormats/Histograms/interface/MonitorElementCollection.h b/DataFormats/Histograms/interface/MonitorElementCollection.h index acb31584394d8..2607eecb0579c 100644 --- a/DataFormats/Histograms/interface/MonitorElementCollection.h +++ b/DataFormats/Histograms/interface/MonitorElementCollection.h @@ -138,6 +138,7 @@ struct MonitorElementData { TH2S = 0x21, TH2D = 0x22, TH2I = 0x23, + TH2Poly = 0x24, TH3F = 0x30, TPROFILE = 0x40, TPROFILE2D = 0x41