15#include <FairRootFileSink.h>
16#include <FairRunOnline.h>
17#include <FairRuntimeDb.h>
18#include <fmt/chrono.h>
19#include <fmt/format.h>
23 auto create_datatime_rootfile(std::string_view base_filename) -> std::unique_ptr<TFile>
25 auto time = std::chrono::system_clock::now();
26 const auto file_name = fmt::format(
"{}-{:%Y-%m-%d-%Hh-%Mm-%Ss}.root", base_filename, time);
27 auto* root_file = TFile::Open(file_name.data(),
"RECREATE");
28 return std::unique_ptr<TFile>{ root_file };
37 if (
auto hist = histograms_.find(histName); hist != histograms_.end())
39 return hist->second.get();
41 throw R3B::logic_error(fmt::format(
"Histogram with the name {} doesn't exist!", histName));
46 if (
auto canvas = canvases_.find(histName); canvas != canvases_.end())
48 return canvas->second;
50 throw R3B::logic_error(fmt::format(
"Canvas with the name {} doesn't exist!", histName));
55 auto* hist_dir = get_hist_dir(sinkFile);
56 auto* new_dir = folderName.empty() ? hist_dir : hist_dir->mkdir(folderName.data(),
"",
true);
57 if (new_dir ==
nullptr)
60 fmt::format(
"Failed to create a sub directory {} for the histrogams!", folderName));
63 fmt::format(
"Saving figures to the directory {:?} in the root file {:?}",
65 new_dir->GetFile()->GetName()));
71 auto DataMonitor::get_hist_dir(FairSink* sinkFile) -> TDirectory*
73 auto* rootSinkFile =
dynamic_cast<FairRootFileSink*
>(sinkFile);
74 if (rootSinkFile ==
nullptr)
76 throw R3B::logic_error(
"Cannot save the histograms as the output file is not a root file!");
78 auto* rootFile = rootSinkFile->GetRootFile();
80 if (hist_dir ==
nullptr)
89 for (
auto& [canvas_name, canvas] : canvases_)
97 if (
auto* run_online =
dynamic_cast<FairRunOnline*
>(run); run_online !=
nullptr)
99 for (
auto& [name, canvas] : canvases_)
101 run_online->AddObject(canvas.get_canvas());
108 for (
auto& [name, hist] : histograms_)
116 if (filename.empty())
118 filename = save_filename_;
120 auto rootfile = create_datatime_rootfile(filename);
121 R3BLOG(info, fmt::format(
"Saving histograms to {}", rootfile->GetName()));
122 write_all(rootfile.get());
125 void DataMonitor::write_all(TDirectory* dir)
127 for (
auto& [name, hist] : histograms_)
129 if (hist->GetEntries() == 0)
131 R3BLOG(warn, fmt::format(
"Histogram {} is empty while written to the file!", hist->GetName()));
133 dir->WriteObject(hist.get(), hist->GetName());
135 for (
auto& [name, graph] : graphs_)
137 dir->WriteObject(graph.get(), graph->GetName(),
"overwrite");
#define R3BLOG(severity, x)
void save_to_sink(std::string_view folderName="", FairSink *sinkFile=FairRun::Instance() ->GetSink())
void register_canvases(FairRun *run)
void save_to_file(std::string_view filename="")
auto get_canvas(const std::string &histName) -> DataMonitorCanvas &
auto get(const std::string &histName) -> TH1 *
constexpr auto DEFAULT_HIST_MONITOR_DIR