diff --git a/reco/app/cbmreco_fairrun/Application.cxx b/reco/app/cbmreco_fairrun/Application.cxx index 24ca7f6e443a6cc7cd3d107c3fcc3c40140df525..eb4cc41101c5bacd1f17939250a0bda57db02c2d 100644 --- a/reco/app/cbmreco_fairrun/Application.cxx +++ b/reco/app/cbmreco_fairrun/Application.cxx @@ -16,8 +16,8 @@ Application::Application(ProgramOptions const& opt) : fOpt(opt) config.LoadYaml(fOpt.ConfigYamlFile()); if (!fOpt.SaveConfigYamlFile().empty()) { config.SaveYaml(fOpt.SaveConfigYamlFile()); } - fCbmReco = - std::make_unique<CbmReco>(fOpt.InputUri(), fOpt.OutputRootFile(), fOpt.MaxNumTs(), config, fOpt.HttpServerPort()); + fCbmReco = std::make_unique<CbmReco>(fOpt.InputUri(), fOpt.OutputRootFile(), fOpt.MaxNumTs(), config, + fOpt.HttpServerPort(), fMonitor.get()); } void Application::Run() { fCbmReco->Run(); } diff --git a/reco/app/cbmreco_fairrun/ProgramOptions.cxx b/reco/app/cbmreco_fairrun/ProgramOptions.cxx index 5b09ef245b49a8b40ef868e5495e3f2cf42d9db8..970485daa0c91b73f77d17a035a89c4b631d8451 100644 --- a/reco/app/cbmreco_fairrun/ProgramOptions.cxx +++ b/reco/app/cbmreco_fairrun/ProgramOptions.cxx @@ -32,7 +32,7 @@ void ProgramOptions::ParseOptions(int argc, char* argv[]) "enable logging to syslog at given log level"); generic_add( "monitor,m", - po::value<std::string>(&fMonitorUri)->value_name("<uri>")->implicit_value("influx1:login:8086:tsclient_status"), + po::value<std::string>(&fMonitorUri)->value_name("<uri>")->implicit_value("influx1:login:8086:cbmreco_status"), "publish program status to InfluxDB (or \"file:cout\" for " "console output)"); generic_add("help,h", "display this help and exit"); diff --git a/reco/tasks/CMakeLists.txt b/reco/tasks/CMakeLists.txt index fe504a8d3721cc9b75b783e0f92815e93f43b29a..4743544232b5b10e28bb4d63ff4421a13bdbc5a6 100644 --- a/reco/tasks/CMakeLists.txt +++ b/reco/tasks/CMakeLists.txt @@ -40,6 +40,8 @@ set(PRIVATE_DEPENDENCIES CbmTrdBase FairLogger::FairLogger FairRoot::Online + external::fles_monitoring + external::fles_logging external::yaml-cpp ROOT::Hist ROOT::RHTTP diff --git a/reco/tasks/CbmReco.cxx b/reco/tasks/CbmReco.cxx index 7c77a76f94b3ca85fe15202347a861a1986bb041..8be25218f2688651f96707478ab5df68a49b9011 100644 --- a/reco/tasks/CbmReco.cxx +++ b/reco/tasks/CbmReco.cxx @@ -108,12 +108,14 @@ void CbmRecoConfig::SaveYaml(const std::string& filename) // ----- Constructor from single source ----------------------------------- -CbmReco::CbmReco(string source, TString outFile, int32_t numTs, const CbmRecoConfig& config, uint16_t port) +CbmReco::CbmReco(string source, TString outFile, int32_t numTs, const CbmRecoConfig& config, uint16_t port, + cbm::Monitor* monitor) : fSourceNames {source} , fOutputFileName(outFile) , fNumTs(numTs) , fConfig(config) , fHttpServerPort(port) + , fMonitor(monitor) { } // ---------------------------------------------------------------------------- @@ -121,12 +123,13 @@ CbmReco::CbmReco(string source, TString outFile, int32_t numTs, const CbmRecoCon // ----- Constructor from multiple sources -------------------------------- CbmReco::CbmReco(std::vector<string> sources, TString outFile, int32_t numTs, const CbmRecoConfig& config, - uint16_t port) + uint16_t port, cbm::Monitor* monitor) : fSourceNames(sources) , fOutputFileName(outFile) , fNumTs(numTs) , fConfig(config) , fHttpServerPort(port) + , fMonitor(monitor) { } // ---------------------------------------------------------------------------- @@ -196,6 +199,7 @@ int32_t CbmReco::Run() // --- Unpacking if (!isRootInput) { auto unpack = make_unique<CbmTaskUnpack>(); + unpack->SetMonitor(fMonitor); unpack->SetOutputBranchPersistent("DigiTimeslice.", fConfig.fStoreTimeslice); run.AddTask(unpack.release()); } diff --git a/reco/tasks/CbmReco.h b/reco/tasks/CbmReco.h index a031d0c968186b3cffc1eef2dce3a6dfbf4ac50b..3b82f88cadc4cc6f6e20471537afdbd21a2d87ab 100644 --- a/reco/tasks/CbmReco.h +++ b/reco/tasks/CbmReco.h @@ -7,6 +7,18 @@ #include "CbmDefs.h" +// Hide the Monitor class from ROOT to not confuse it. +// A similar issue with ROOT and gcc9 was already discovered by ALICE O2: +// https://github.com/AliceO2Group/AliceO2/pull/4858 +#if !defined(__CLING__) && !defined(__ROOTCLING__) +#include "Monitor.hpp" +#else +namespace cbm +{ + class Monitor; +} +#endif + #include <TString.h> #include <map> @@ -75,7 +87,8 @@ public: ** @param config Configuration ** @param port Port number for the http server. If 0, server will not be activated. **/ - CbmReco(std::string source, TString outFile, int32_t numTs, const CbmRecoConfig& config, uint16_t port = 0); + CbmReco(std::string source, TString outFile, int32_t numTs, const CbmRecoConfig& config, uint16_t port = 0, + cbm::Monitor* monitor = nullptr); /** @brief Standard constructor for list of sources @@ -86,7 +99,7 @@ public: ** @param port Port number for the http server **/ CbmReco(std::vector<std::string> sources, TString outFile, int32_t numTs, const CbmRecoConfig& config, - uint16_t port = 0); + uint16_t port = 0, cbm::Monitor* monitor = nullptr); /** @brief Destructor **/ @@ -111,6 +124,7 @@ private: int32_t fNumTs = 0; ///< Number of timeslices to process CbmRecoConfig fConfig = {}; ///< Configuration parameters uint16_t fHttpServerPort = 0; + cbm::Monitor* fMonitor = nullptr; ClassDef(CbmReco, 1); }; diff --git a/reco/tasks/CbmRecoConfigExample.yaml b/reco/tasks/CbmRecoConfigExample.yaml index 56d05361d774fd32b388aa202122780cf4805c80..a5ec384b217c4e84890fab6a28293b0748f5d147 100644 --- a/reco/tasks/CbmRecoConfigExample.yaml +++ b/reco/tasks/CbmRecoConfigExample.yaml @@ -6,6 +6,10 @@ trigger: eventbuilder: windows: STS: [-20, 30] +selector: + minStationsSts: 0 + minStationsTof: 0 + minDigisBmon: 0 store: timeslice: false triggers: false diff --git a/reco/tasks/CbmTaskUnpack.cxx b/reco/tasks/CbmTaskUnpack.cxx index 74560df88cd6cca7f8ee6ec956526c6b36e6f751..0858e427eb17134c8e837603f1237c2fa4b10c26 100644 --- a/reco/tasks/CbmTaskUnpack.cxx +++ b/reco/tasks/CbmTaskUnpack.cxx @@ -19,6 +19,7 @@ #include "CbmTrdParSpadic.h" #include "MicrosliceDescriptor.hpp" +#include "System.hpp" #include <FairParAsciiFileIo.h> #include <FairParamList.h> @@ -82,6 +83,17 @@ void CbmTaskUnpack::Exec(Option_t*) logOut << ", digis " << result.second.fNumDigis; LOG(info) << logOut.str(); +#if !defined(__CLING__) && !defined(__ROOTCLING__) + if (fMonitor) { + fMonitor->QueueMetric(GetName(), {{"host", fHostname}}, + {{"realtime", timer.RealTime()}, + {"cputime", timer.CpuTime()}, + {"input_size", result.second.fNumBytes}, + {"input_rate", double(result.second.fNumBytes) / timer.RealTime()}, + {"digis", result.second.fNumDigis}}); + } +#endif + // --- Run statistics fNumTs++; fNumMs += result.second.fNumMs; @@ -112,10 +124,12 @@ void CbmTaskUnpack::Finish() // ----- Initialisation --------------------------------------------------- InitStatus CbmTaskUnpack::Init() { - LOG(info) << "=================================================="; LOG(info) << GetName() << ": Initialising..."; + // --- Get hostname + fHostname = fles::system::current_hostname(); + // --- Get source instance fSource = dynamic_cast<CbmSourceTs*>(FairRunOnline::Instance()->GetSource()); if (fSource == nullptr) { diff --git a/reco/tasks/CbmTaskUnpack.h b/reco/tasks/CbmTaskUnpack.h index 697b517c8c7d9b7930aa4676ce4d04bc10ce3785..57b799c7fc2736f482b66eec7220655fd41433e3 100644 --- a/reco/tasks/CbmTaskUnpack.h +++ b/reco/tasks/CbmTaskUnpack.h @@ -9,6 +9,16 @@ #include "CbmDefs.h" #include "CbmDigiTimeslice.h" +// Hide the Monitor class from ROOT to not confuse it +#if !defined(__CLING__) && !defined(__ROOTCLING__) +#include "Monitor.hpp" +#else +namespace cbm +{ + class Monitor; +} +#endif + #include <FairTask.h> #include "tof/TofReadoutConfig.h" @@ -73,6 +83,10 @@ public: CbmTaskUnpack& operator=(const CbmTaskUnpack&) = delete; + /** @brief Set the monitor object **/ + void SetMonitor(cbm::Monitor* monitor) { fMonitor = monitor; } + + private: // methods /** @brief Task initialisation **/ virtual InitStatus Init(); @@ -86,7 +100,9 @@ private: // methods cbm::algo::Trd2dReadoutConfig InitTrd2dReadoutConfig(); private: // members - CbmSourceTs* fSource = nullptr; + CbmSourceTs* fSource = nullptr; + cbm::Monitor* fMonitor = nullptr; + std::string fHostname; /** @brief Unpacker algorithm **/ cbm::algo::Unpack fUnpack;