From 183f357718e973ad3606cdaa40875f42ec6e1bf5 Mon Sep 17 00:00:00 2001 From: Charles Burton <burton@utexas.edu> Date: Tue, 7 May 2019 12:30:38 +0000 Subject: [PATCH] Update Trigger GenericMonitoringTool to match AthenaMonitoring The AthenaMonitoring backend code was expecting the name of the weight variable to appear in the coded string that is passed to HistogramDef to be parsed. This was causing a crash in unit tests. The TrigUpgradeTest/full_menu.py runs successfully with this change. --- .../AthenaMonitoring/HistogramDef.h | 1 + .../AthenaMonitoring/HistogramFiller.h | 13 ++++ .../python/ExampleMonitorAlgorithm.py | 2 +- .../python/GenericMonitoringTool.py | 5 +- Control/AthenaMonitoring/share/GenericMon.txt | 10 ++-- .../src/ExampleMonitorAlgorithm.cxx | 4 +- .../src/GenericMonitoringTool.cxx | 29 ++++++--- Control/AthenaMonitoring/src/HistogramDef.cxx | 1 + .../src/HistogramFiller/HistogramFiller1D.h | 17 +++++- .../src/HistogramFiller/HistogramFiller2D.h | 57 ++++++++++++++---- .../HistogramFiller2DProfile.h | 16 ++++- .../HistogramFiller/HistogramFillerProfile.h | 60 +++++++++++++++---- .../test/GenericMonFilling_test.cxx | 3 +- .../test/GenericMonParsing_test.cxx | 23 +++++-- .../test/test_defineHistogram.py | 28 +++++---- 15 files changed, 206 insertions(+), 63 deletions(-) diff --git a/Control/AthenaMonitoring/AthenaMonitoring/HistogramDef.h b/Control/AthenaMonitoring/AthenaMonitoring/HistogramDef.h index afe8f7f43a9..3e9ed68b767 100644 --- a/Control/AthenaMonitoring/AthenaMonitoring/HistogramDef.h +++ b/Control/AthenaMonitoring/AthenaMonitoring/HistogramDef.h @@ -25,6 +25,7 @@ namespace Monitored { std::string path; //!< booking path std::string title; //!< title of the histogram std::string opt; //!< options + std::string weight; //!< names of weights int xbins{0}; //!< number of bins in X float xmin{0}; //!< left diff --git a/Control/AthenaMonitoring/AthenaMonitoring/HistogramFiller.h b/Control/AthenaMonitoring/AthenaMonitoring/HistogramFiller.h index 255fe37833c..3d2387a8fed 100644 --- a/Control/AthenaMonitoring/AthenaMonitoring/HistogramFiller.h +++ b/Control/AthenaMonitoring/AthenaMonitoring/HistogramFiller.h @@ -61,10 +61,22 @@ namespace Monitored { void setMonitoredVariables(std::vector<std::reference_wrapper<Monitored::IMonitoredVariable>> monitoredVariables) { m_monVariables = monitoredVariables; } + + /** + * @brief Stores histogram weight + * @param monitoredWeight weight to use + */ + void setMonitoredWeight(Monitored::IMonitoredVariable* monitoredWeight) { + m_monWeight = monitoredWeight; + } std::vector<std::string> histogramVariablesNames() const { return m_histDef->name; } + + std::string histogramWeightName() { + return m_histDef->weight; + } protected: template <class H> @@ -76,6 +88,7 @@ namespace Monitored { std::shared_ptr<HistogramDef> m_histDef; std::shared_ptr<IHistogramProvider> m_histogramProvider; std::vector<std::reference_wrapper<Monitored::IMonitoredVariable>> m_monVariables; + Monitored::IMonitoredVariable* m_monWeight; private: HistogramFiller& operator=(HistogramFiller const&) = delete; diff --git a/Control/AthenaMonitoring/python/ExampleMonitorAlgorithm.py b/Control/AthenaMonitoring/python/ExampleMonitorAlgorithm.py index d525ad2db8f..4b58715f781 100644 --- a/Control/AthenaMonitoring/python/ExampleMonitorAlgorithm.py +++ b/Control/AthenaMonitoring/python/ExampleMonitorAlgorithm.py @@ -83,7 +83,7 @@ def ExampleMonitoringConfig(inputFlags): myGroup.defineHistogram('lumiPerBCID',title='Luminosity;L/BCID;Events', path='ToRuleThemAll',xbins=10,xmin=0.0,xmax=10.0) myGroup.defineHistogram('lb', title='Luminosity Block;lb;Events', - path='ToFindThem',xbins=1000,xmin=-0.5,xmax=999.5) + path='ToFindThem',xbins=1000,xmin=-0.5,xmax=999.5,weight='testweight') myGroup.defineHistogram('random', title='LB;x;Events', path='ToBringThemAll',xbins=30,xmin=0,xmax=1,opt='kLBNHistoryDepth=10') myGroup.defineHistogram('pT_passed,pT',type='TEfficiency',title='Test TEfficiency;x;Eff', diff --git a/Control/AthenaMonitoring/python/GenericMonitoringTool.py b/Control/AthenaMonitoring/python/GenericMonitoringTool.py index cab4d02d757..5c8a786f590 100644 --- a/Control/AthenaMonitoring/python/GenericMonitoringTool.py +++ b/Control/AthenaMonitoring/python/GenericMonitoringTool.py @@ -23,11 +23,12 @@ class GenericMonitoringTool(_GenericMonitoringTool): # @param varname one (1D) or two (2D) variable names separated by comma # @param type histogram type # @param path top-level histogram directory (e.g. EXPERT, SHIFT, etc.) +# @param weight Name of the variable containing the fill weight # @param title Histogram title and optional axis title (same syntax as in TH constructor) # @param opt Histrogram options (see GenericMonitoringTool) # @param labels List of bin labels (for a 2D histogram, sequential list of x- and y-axis labels) def defineHistogram(varname, type='TH1F', path=None, - title=None, + title=None,weight='', xbins=100, xmin=0, xmax=1, ybins=None, ymin=None, ymax=None, zmin=None, zmax=None, opt='', labels=None): @@ -42,7 +43,7 @@ def defineHistogram(varname, type='TH1F', path=None, log.warning('Histogram %s of type %s is not supported for online running and will not be added', varname, type) return "" - coded = "%s, %s, %s, %s, %d, %f, %f" % (path, type, varname, title, xbins, xmin, xmax) + coded = "%s, %s, %s, %s, %s, %d, %f, %f" % (path, type, weight, varname, title, xbins, xmin, xmax) if ybins is not None: coded += ", %d, %f, %f" % (ybins, ymin, ymax) if zmin is not None: diff --git a/Control/AthenaMonitoring/share/GenericMon.txt b/Control/AthenaMonitoring/share/GenericMon.txt index ec95f24e102..7678aed82c6 100644 --- a/Control/AthenaMonitoring/share/GenericMon.txt +++ b/Control/AthenaMonitoring/share/GenericMon.txt @@ -16,10 +16,10 @@ THistSvc.OutputLevel = 0; THistSvc.Output= {"EXPERT DATAFILE='expert-monitoring.root' OPT='RECREATE'" }; ToolSvc.MonTool.OutputLevel =0; ToolSvc.MonTool.HistPath="TestGroup"; -ToolSvc.MonTool.Histograms = { "EXPERT, TH1F, Eta, #eta of Clusters; #eta; number of RoIs, 2, -2.500000, 2.500000" }; -ToolSvc.MonTool.Histograms += { "EXPERT, TH1F, Phi, #phi of Clusters; #phi; number of RoIs, 2, -3.15, 3.15" }; -ToolSvc.MonTool.Histograms += { "EXPERT, TH2F, Eta,Phi, #eta vs #phi of Clusters; #eta; #phi; number of RoIs, 2, -2.500000, 2.500000, 2, -3.15, 3.15" }; -ToolSvc.MonTool.Histograms += { "EXPERT, TH1F, TIME_t1, Timing of tool 1, 100, 0., 1000." }; -ToolSvc.MonTool.Histograms += { "EXPERT, TH1F, TIME_t2, Timing of tool 2, 100, 0., 1000." }; +ToolSvc.MonTool.Histograms = { "EXPERT, TH1F, , Eta, #eta of Clusters; #eta; number of RoIs, 2, -2.500000, 2.500000" }; +ToolSvc.MonTool.Histograms += { "EXPERT, TH1F, , Phi, #phi of Clusters; #phi; number of RoIs, 2, -3.15, 3.15" }; +ToolSvc.MonTool.Histograms += { "EXPERT, TH2F, , Eta,Phi, #eta vs #phi of Clusters; #eta; #phi; number of RoIs, 2, -2.500000, 2.500000, 2, -3.15, 3.15" }; +ToolSvc.MonTool.Histograms += { "EXPERT, TH1F, , TIME_t1, Timing of tool 1, 100, 0., 1000." }; +ToolSvc.MonTool.Histograms += { "EXPERT, TH1F, , TIME_t2, Timing of tool 2, 100, 0., 1000." }; diff --git a/Control/AthenaMonitoring/src/ExampleMonitorAlgorithm.cxx b/Control/AthenaMonitoring/src/ExampleMonitorAlgorithm.cxx index 1c712557e09..619983eeb3f 100644 --- a/Control/AthenaMonitoring/src/ExampleMonitorAlgorithm.cxx +++ b/Control/AthenaMonitoring/src/ExampleMonitorAlgorithm.cxx @@ -26,6 +26,7 @@ StatusCode ExampleMonitorAlgorithm::fillHistograms( const EventContext& ctx ) co auto lb = Monitored::Scalar<int>("lb",0); auto run = Monitored::Scalar<int>("run",0); auto random = Monitored::Scalar<float>("random",0.0); + auto testweight = Monitored::Scalar<float>("testweight",1.0); // Two variables (value and passed) needed for TEfficiency auto pT = Monitored::Scalar<float>("pT",0.0); @@ -35,6 +36,7 @@ StatusCode ExampleMonitorAlgorithm::fillHistograms( const EventContext& ctx ) co lumiPerBCID = lbAverageInteractionsPerCrossing(); lb = GetEventInfo(ctx)->lumiBlock(); run = GetEventInfo(ctx)->runNumber(); + testweight = 2.0; TRandom3 r(ctx.eventID().event_number()); // Example of using flags @@ -47,7 +49,7 @@ StatusCode ExampleMonitorAlgorithm::fillHistograms( const EventContext& ctx ) co pT_passed = pT>r.Poisson(15); // Fill. First argument is the tool name, all others are the variables to be saved. - fill("ExampleMonitor",lumiPerBCID,lb,random,pT,pT_passed); + fill("ExampleMonitor",lumiPerBCID,lb,random,pT,pT_passed,testweight); // Alternative fill method. Get the group yourself, and pass it to the fill function. auto tool = getGroup("ExampleMonitor"); diff --git a/Control/AthenaMonitoring/src/GenericMonitoringTool.cxx b/Control/AthenaMonitoring/src/GenericMonitoringTool.cxx index 1d1b48a23b7..891a4ff998f 100644 --- a/Control/AthenaMonitoring/src/GenericMonitoringTool.cxx +++ b/Control/AthenaMonitoring/src/GenericMonitoringTool.cxx @@ -61,13 +61,13 @@ StatusCode GenericMonitoringTool::book() { HistogramDef def = HistogramDef::parse(item); if (def.ok) { - std::shared_ptr<HistogramFiller> filler(factory.create(def)); - - if (filler) { - m_fillers.push_back(filler); - } else { - ATH_MSG_WARNING( "The histogram filler cannot be instantiated for: " << def.name ); - } + std::shared_ptr<HistogramFiller> filler(factory.create(def)); + + if (filler) { + m_fillers.push_back(filler); + } else { + ATH_MSG_WARNING( "The histogram filler cannot be instantiated for: " << def.name ); + } } else { ATH_MSG_ERROR( "Unparsable histogram definition: " << item ); return StatusCode::FAILURE; @@ -90,7 +90,9 @@ std::vector<std::shared_ptr<HistogramFiller>> GenericMonitoringTool::getHistogra std::vector<std::shared_ptr<HistogramFiller>> result; for (auto filler : m_fillers) { + // Find the associated monitored variable for each histogram's variable(s) auto fillerVariables = filler->histogramVariablesNames(); + std::vector<std::reference_wrapper<IMonitoredVariable>> variables; for (auto fillerVariable : fillerVariables) { @@ -102,6 +104,18 @@ std::vector<std::shared_ptr<HistogramFiller>> GenericMonitoringTool::getHistogra } } + // Find the weight variable in the list of monitored variables + auto fillerWeight = filler->histogramWeightName(); + Monitored::IMonitoredVariable* weight = nullptr; + if ( fillerWeight != "" ) { + for (auto monValue : monitoredVariables) { + if (fillerWeight.compare(monValue.get().name()) == 0) { + weight = &monValue.get(); + break; + } + } + } + if (fillerVariables.size() != variables.size()) { ATH_MSG_DEBUG("Filler has different variables than monitoredVariables"); continue; @@ -109,6 +123,7 @@ std::vector<std::shared_ptr<HistogramFiller>> GenericMonitoringTool::getHistogra std::shared_ptr<HistogramFiller> fillerCopy(filler->clone()); fillerCopy->setMonitoredVariables(variables); + fillerCopy->setMonitoredWeight(weight); result.push_back(fillerCopy); } diff --git a/Control/AthenaMonitoring/src/HistogramDef.cxx b/Control/AthenaMonitoring/src/HistogramDef.cxx index 37a35e888ad..f377be46e5c 100644 --- a/Control/AthenaMonitoring/src/HistogramDef.cxx +++ b/Control/AthenaMonitoring/src/HistogramDef.cxx @@ -25,6 +25,7 @@ const HistogramDef HistogramDef::parse(const std::string &histogramDefinition) { result.path = nextProperty(propertiesIterator); result.type = nextProperty(propertiesIterator); + result.weight = nextProperty(propertiesIterator); result.name.push_back(nextProperty(propertiesIterator)); if (result.type.find("TH2") == 0 || result.type == "TProfile" || result.type == "TEfficiency") { diff --git a/Control/AthenaMonitoring/src/HistogramFiller/HistogramFiller1D.h b/Control/AthenaMonitoring/src/HistogramFiller/HistogramFiller1D.h index c89e94dec5f..dc1e310836c 100644 --- a/Control/AthenaMonitoring/src/HistogramFiller/HistogramFiller1D.h +++ b/Control/AthenaMonitoring/src/HistogramFiller/HistogramFiller1D.h @@ -8,6 +8,7 @@ #include "TH1.h" #include "AthenaMonitoring/HistogramFiller.h" +#include <boost/range/combine.hpp> namespace Monitored { /** @@ -27,10 +28,22 @@ namespace Monitored { auto histogram = this->histogram<TH1>(); auto valuesVector = m_monVariables[0].get().getVectorRepresentation(); + std::lock_guard<std::mutex> lock(*(this->m_mutex)); - for (auto value : valuesVector) { - histogram->Fill(value); + if ( m_monWeight && m_monWeight->getVectorRepresentation().size()==valuesVector.size() ) { + // When using weights, get the weight vector and fill + auto weightVector = m_monWeight->getVectorRepresentation(); + double value,weight; + for (const auto& zipped : boost::combine(valuesVector,weightVector)) { + boost::tie(value,weight) = zipped; + histogram->Fill(value,weight); + } + } else { + // Otherwise, simply loop over the values and fill + for (auto value : valuesVector) { + histogram->Fill(value); + } } return std::size(valuesVector); diff --git a/Control/AthenaMonitoring/src/HistogramFiller/HistogramFiller2D.h b/Control/AthenaMonitoring/src/HistogramFiller/HistogramFiller2D.h index 0bc820ab588..5e5014e114e 100644 --- a/Control/AthenaMonitoring/src/HistogramFiller/HistogramFiller2D.h +++ b/Control/AthenaMonitoring/src/HistogramFiller/HistogramFiller2D.h @@ -8,6 +8,7 @@ #include "TH2.h" #include "AthenaMonitoring/HistogramFiller.h" +#include <boost/range/combine.hpp> namespace Monitored { /** @@ -42,23 +43,55 @@ namespace Monitored { auto histogram = this->histogram<TH2>(); std::lock_guard<std::mutex> lock(*(this->m_mutex)); - if (areVectorsSameSize) { - for (unsigned i = 0; i < size1; ++i) { - histogram->Fill(vector1[i], vector2[i]); + if (areVectorsSameSize) { // Two equal-size vectors + if ( m_monWeight && m_monWeight->getVectorRepresentation().size()==size1 ) { + // Weighted fill + auto weightVector = m_monWeight->getVectorRepresentation(); + double value1,value2,weight; + for (const auto& zipped : boost::combine(vector1,vector2,weightVector)) { + boost::tie(value1,value2,weight) = zipped; + histogram->Fill(value1,value2,weight); + } + } else { + // Unweighted fill + for (unsigned i = 0; i < size1; ++i) { + histogram->Fill(vector1[i], vector2[i]); + } } - result = size1; - } else if (size1 == 1) { - for (auto value : vector2) { - histogram->Fill(vector1[0], value); - } - result = size2; - } else { - for (auto value : vector1) { - histogram->Fill(value, vector2[0]); + } else if (size1 == 1) { // Scalar vector1 and vector vector2 + if ( m_monWeight && m_monWeight->getVectorRepresentation().size()==size2 ) { + // Weighted fill + auto weightVector = m_monWeight->getVectorRepresentation(); + double value,weight; + for (const auto& zipped : boost::combine(vector2,weightVector)) { + boost::tie(value,weight) = zipped; + histogram->Fill(vector1[0],value,weight); + } + } else { + // Unweighted fill + for (auto value : vector2) { + histogram->Fill(vector1[0], value); + } } + result = size2; + } else { // Vector vector1 and scalar vector2 + if ( m_monWeight && m_monWeight->getVectorRepresentation().size()==size1 ) { + // Weighted fill + auto weightVector = m_monWeight->getVectorRepresentation(); + double value,weight; + for (const auto& zipped : boost::combine(vector1,weightVector)) { + boost::tie(value,weight) = zipped; + histogram->Fill(value,vector2[0],weight); + } + } else { + // Unweighted fill + for (auto value : vector1) { + histogram->Fill(value, vector2[0]); + } + } result = size1; } diff --git a/Control/AthenaMonitoring/src/HistogramFiller/HistogramFiller2DProfile.h b/Control/AthenaMonitoring/src/HistogramFiller/HistogramFiller2DProfile.h index 71e60707296..c10efafa3d4 100644 --- a/Control/AthenaMonitoring/src/HistogramFiller/HistogramFiller2DProfile.h +++ b/Control/AthenaMonitoring/src/HistogramFiller/HistogramFiller2DProfile.h @@ -37,10 +37,20 @@ namespace Monitored { }*/ //For now lets just consider the case in which all variables are of the same length - for (unsigned i = 0; i < std::size(valuesVector1); ++i) { - histogram->Fill(valuesVector1[i], valuesVector2[i], valuesVector3[i]); + if ( m_monWeight && m_monWeight->getVectorRepresentation().size()==valuesVector1.size() ) { + // Weighted fill + auto weightVector = m_monWeight->getVectorRepresentation(); + double value1,value2,value3,weight; + for (const auto& zipped : boost::combine(valuesVector1,valuesVector2,valuesVector3,weightVector)) { + boost::tie(value1,value2,value3,weight) = zipped; + histogram->Fill(value1,value2,value3,weight); + } + } else { + // Unweighted fill + for (unsigned i = 0; i < std::size(valuesVector1); ++i) { + histogram->Fill(valuesVector1[i], valuesVector2[i], valuesVector3[i]); + } } - return std::size(valuesVector1); } }; diff --git a/Control/AthenaMonitoring/src/HistogramFiller/HistogramFillerProfile.h b/Control/AthenaMonitoring/src/HistogramFiller/HistogramFillerProfile.h index d171db2efa7..9fc8fe27dd3 100644 --- a/Control/AthenaMonitoring/src/HistogramFiller/HistogramFillerProfile.h +++ b/Control/AthenaMonitoring/src/HistogramFiller/HistogramFillerProfile.h @@ -29,28 +29,66 @@ namespace Monitored { auto histogram = this->histogram<TProfile>(); auto valuesVector1 = m_monVariables[0].get().getVectorRepresentation(); auto valuesVector2 = m_monVariables[1].get().getVectorRepresentation(); + const unsigned size1 = std::size(valuesVector1); + const unsigned size2 = std::size(valuesVector2); + const bool isAnyVectorEmpty = size1 == 0 || size2 == 0; + const bool isAnyVectorScalar = size1 == 1 || size2 == 1; + const bool areVectorsSameSize = size1 == size2; + const bool areVectorsValid = !isAnyVectorEmpty && (areVectorsSameSize || isAnyVectorScalar); + if (!areVectorsValid) return 0; + std::lock_guard<std::mutex> lock(*(this->m_mutex)); - if (valuesVector1.size() != valuesVector2.size()) { - if (valuesVector1.size() == 1) { - // first variable is scalar -- loop over second + if (areVectorsSameSize) { // Two equal-size vectors + if ( m_monWeight && m_monWeight->getVectorRepresentation().size()==valuesVector1.size() ) { + // Weighted fill + auto weightVector = m_monWeight->getVectorRepresentation(); + double value1,value2,weight; + for (const auto& zipped : boost::combine(valuesVector1,valuesVector2,weightVector)) { + boost::tie(value1,value2,weight) = zipped; + histogram->Fill(value1,value2,weight); + } + } else { + // Unweighted fill + for (i = 0; i < std::size(valuesVector1); ++i) { + histogram->Fill(valuesVector1[i], valuesVector2[i]); + } + } + + } else if (size1==1) { // first variable is scalar -- loop over second + if ( m_monWeight && m_monWeight->getVectorRepresentation().size()==valuesVector2.size() ) { + // Weighted fill + auto weightVector = m_monWeight->getVectorRepresentation(); + double value2,weight; + for (const auto& zipped : boost::combine(valuesVector2,weightVector)) { + boost::tie(value2,weight) = zipped; + histogram->Fill(valuesVector1[0],value2,weight); + } + } else { + // Unweighted fill for (auto value2 : valuesVector2) { histogram->Fill(valuesVector1[0], value2); ++i; } - } else if (valuesVector2.size() == 1) { - // second variable is scalar -- loop over first + } + + } else if (size2==1) { // second variable is scalar -- loop over first + if ( m_monWeight && m_monWeight->getVectorRepresentation().size()==valuesVector1.size() ) { + // Weighted fill + auto weightVector = m_monWeight->getVectorRepresentation(); + double value1,weight; + for (const auto& zipped : boost::combine(valuesVector1,weightVector)) { + boost::tie(value1,weight) = zipped; + histogram->Fill(value1,valuesVector2[0],weight); + } + } else { + // Unweighted fill for (auto value1 : valuesVector1) { histogram->Fill(value1, valuesVector2[0]); ++i; - } - } - } else { - for (i = 0; i < std::size(valuesVector1); ++i) { - histogram->Fill(valuesVector1[i], valuesVector2[i]); + } } } - return i; } }; diff --git a/Control/AthenaMonitoring/test/GenericMonFilling_test.cxx b/Control/AthenaMonitoring/test/GenericMonFilling_test.cxx index 94200d25d4b..0562945939f 100644 --- a/Control/AthenaMonitoring/test/GenericMonFilling_test.cxx +++ b/Control/AthenaMonitoring/test/GenericMonFilling_test.cxx @@ -333,6 +333,7 @@ int main() { return -1; } MsgStream log( Athena::getMessageSvc(), "GenericMonFilling_test" ); + log.setLevel(0); ITHistSvc* histSvc; if( pSvcLoc->service( "THistSvc", histSvc, true ).isFailure() ) { @@ -344,8 +345,6 @@ int main() { ToolHandle<GenericMonitoringTool> emptyMon(""); VALUE( emptyMon.isEnabled() ) EXPECTED( false ); // self test log << MSG::DEBUG << " mon tool validity " << emptyMon.isValid() << endmsg; - - ToolHandle<GenericMonitoringTool> validMon( "GenericMonitoringTool/MonTool" ); if ( validMon.retrieve().isFailure() ) { diff --git a/Control/AthenaMonitoring/test/GenericMonParsing_test.cxx b/Control/AthenaMonitoring/test/GenericMonParsing_test.cxx index a9ff1cb7f54..b18b39cceea 100644 --- a/Control/AthenaMonitoring/test/GenericMonParsing_test.cxx +++ b/Control/AthenaMonitoring/test/GenericMonParsing_test.cxx @@ -16,7 +16,7 @@ using namespace Monitored; bool parsing1DWorks() { - auto def = HistogramDef::parse("EXPERT, TH1F, Eta, #eta of Clusters; #eta; number of RoIs, 50, -2.500000, 2.500000"); + auto def = HistogramDef::parse("EXPERT, TH1F, , Eta, #eta of Clusters; #eta; number of RoIs, 50, -2.500000, 2.500000"); VALUE ( def.ok ) EXPECTED ( true ); VALUE ( def.path ) EXPECTED ( "EXPERT" ); VALUE ( def.type ) EXPECTED ( "TH1F" ); @@ -30,7 +30,7 @@ bool parsing1DWorks() { } bool parsing2DWorks() { - auto def = HistogramDef::parse("SHIFT, TH2F, Eta,Phi, #eta vs #phi of Clusters; #eta; #phi, 50, -2.500000, 2.500000, 64, -3.200000, 3.200000"); + auto def = HistogramDef::parse("SHIFT, TH2F, , Eta,Phi, #eta vs #phi of Clusters; #eta; #phi, 50, -2.500000, 2.500000, 64, -3.200000, 3.200000"); VALUE ( def.ok ) EXPECTED ( true ) ; VALUE ( def.path ) EXPECTED ( "SHIFT" ); VALUE ( def.type ) EXPECTED ( "TH2F" ); @@ -50,7 +50,7 @@ bool parsing2DWorks() { } bool parsing3DWorks() { - auto def = HistogramDef::parse("SHIFT, TProfile2D, Eta,Phi,pt, title, 50, -2.500000, 2.500000, 64, -3.200000, 3.200000, -1.000000, 1.000000"); + auto def = HistogramDef::parse("SHIFT, TProfile2D, , Eta,Phi,pt, title, 50, -2.500000, 2.500000, 64, -3.200000, 3.200000, -1.000000, 1.000000"); VALUE ( def.ok ) EXPECTED ( true ) ; VALUE ( def.path ) EXPECTED ( "SHIFT" ); VALUE ( def.type ) EXPECTED ( "TProfile2D" ); @@ -72,7 +72,7 @@ bool parsing3DWorks() { } bool parsingLabeledWorks() { - auto def = HistogramDef::parse("SHIFT, TH1D, Cut, Cut counter, 5, 0, 5, Cut1:Cut2:Eta:Pt:R"); + auto def = HistogramDef::parse("SHIFT, TH1D, , Cut, Cut counter, 5, 0, 5, Cut1:Cut2:Eta:Pt:R"); VALUE ( def.ok ) EXPECTED ( true ) ; VALUE ( def.path ) EXPECTED ( "SHIFT" ); VALUE ( def.type ) EXPECTED ( "TH1D" ); @@ -88,9 +88,22 @@ bool parsingLabeledWorks() { return true; } +bool parsingWeightedWorks() { + auto def = HistogramDef::parse("EXPERT, TH1F, Weight, Cut, Cut counter, 5, 0, 5"); + VALUE ( def.ok ) EXPECTED ( true ) ; + VALUE ( def.path ) EXPECTED ( "EXPERT" ); + VALUE ( def.type ) EXPECTED ( "TH1F" ); + VALUE ( def.name.size() ) EXPECTED ( 1 ); + VALUE ( std::string(def.name[0]) ) EXPECTED ( "Cut"); + VALUE ( def.labels.size() )EXPECTED ( 5 ); + VALUE ( def.weight ) EXPECTED ("Weight"); + + return true; +} + bool badDefGeneratesExecption() { EXPECT_EXCEPTION( HistogramDefParseException, - HistogramDef::parse("S, TH1D, x, 2.5, 0, 45") ); //2.5 bins can not be valid + HistogramDef::parse("S, TH1D, , x, 2.5, 0, 45") ); //2.5 bins can not be valid return true; } diff --git a/Control/AthenaMonitoring/test/test_defineHistogram.py b/Control/AthenaMonitoring/test/test_defineHistogram.py index 1b691a41f89..35bf1228006 100644 --- a/Control/AthenaMonitoring/test/test_defineHistogram.py +++ b/Control/AthenaMonitoring/test/test_defineHistogram.py @@ -8,24 +8,28 @@ from AthenaMonitoring.GenericMonitoringTool import defineHistogram class Test( unittest.TestCase ): def test_1D( self ): - s = defineHistogram('var', 'TH1F', 'EXPERT', 'title', 10, 0.0, 10.0) - self.assertEqual(s, 'EXPERT, TH1F, var, title, 10, 0.000000, 10.000000') + s = defineHistogram('var', 'TH1F', 'EXPERT', 'title', '', 10, 0.0, 10.0) + self.assertEqual(s, 'EXPERT, TH1F, , var, title, 10, 0.000000, 10.000000') def test_1D_label( self ): - s = defineHistogram('var', 'TH1F', 'EXPERT', 'title', 10, 0.0, 10.0, labels=['a','b']) - self.assertEqual(s, 'EXPERT, TH1F, var, title, 10, 0.000000, 10.000000, a:b:') + s = defineHistogram('var', 'TH1F', 'EXPERT', 'title', '', 10, 0.0, 10.0, labels=['a','b']) + self.assertEqual(s, 'EXPERT, TH1F, , var, title, 10, 0.000000, 10.000000, a:b:') def test_1D_opt( self ): - s = defineHistogram('var', 'TH1F', 'EXPERT', 'title', 10, 0.0, 10.0, opt='myopt') - self.assertEqual(s, 'EXPERT, TH1F, var, title, 10, 0.000000, 10.000000, myopt') + s = defineHistogram('var', 'TH1F', 'EXPERT', 'title', '', 10, 0.0, 10.0, opt='myopt') + self.assertEqual(s, 'EXPERT, TH1F, , var, title, 10, 0.000000, 10.000000, myopt') + + def test_1D_weight( self ): + s = defineHistogram('var', 'TH1F', 'EXPERT', 'title', 'weight', 10, 0.0, 10.0) + self.assertEqual(s, 'EXPERT, TH1F, weight, var, title, 10, 0.000000, 10.000000') def test_2D( self ): - s = defineHistogram('var1,var2', 'TH2F', 'EXPERT', 'title', 10, 0.0, 10.0, 20, 0.0, 20.0) - self.assertEqual(s, 'EXPERT, TH2F, var1,var2, title, 10, 0.000000, 10.000000, 20, 0.000000, 20.000000') + s = defineHistogram('var1,var2', 'TH2F', 'EXPERT', 'title', '', 10, 0.0, 10.0, 20, 0.0, 20.0) + self.assertEqual(s, 'EXPERT, TH2F, , var1,var2, title, 10, 0.000000, 10.000000, 20, 0.000000, 20.000000') def test_3D( self ): - s = defineHistogram('var1,var2,var3', 'TProfile2D', 'EXPERT', 'title', 10, 0.0, 10.0, 20, 0.0, 20.0, -1.0, 1.0) - self.assertEqual(s, 'EXPERT, TProfile2D, var1,var2,var3, title, 10, 0.000000, 10.000000, 20, 0.000000, 20.000000, -1.000000, 1.000000') + s = defineHistogram('var1,var2,var3', 'TProfile2D', 'EXPERT', 'title', '', 10, 0.0, 10.0, 20, 0.0, 20.0, -1.0, 1.0) + self.assertEqual(s, 'EXPERT, TProfile2D, , var1,var2,var3, title, 10, 0.000000, 10.000000, 20, 0.000000, 20.000000, -1.000000, 1.000000') def test_enforcePath( self ): with self.assertRaises(AssertionError): @@ -36,8 +40,8 @@ class Test( unittest.TestCase ): defineHistogram('var', 'TH1F', path='EXPERT', labels='l1:l2') def test_efficiency( self ): - s = defineHistogram('var', 'TEfficiency', 'EXPERT', 'title', 10, 0.0, 10.0) - self.assertEqual(s, 'EXPERT, TEfficiency, var, title, 10, 0.000000, 10.000000') + s = defineHistogram('var', 'TEfficiency', 'EXPERT', 'title', '', 10, 0.0, 10.0) + self.assertEqual(s, 'EXPERT, TEfficiency, , var, title, 10, 0.000000, 10.000000') if __name__ == '__main__': unittest.main() -- GitLab