21#include <TDirectory.h>
42 template <
typename... Args>
44 std::string_view canvas_title,
50 template <
typename Hist,
typename... Args>
51 auto add_hist(std::string_view histName, std::string_view histTitle, Args&&... args) -> Hist*;
53 template <
typename GraphType>
54 auto add_graph(std::string_view graph_name, std::unique_ptr<GraphType> graph) -> GraphType*
56 graph->SetName(graph_name.data());
60 template <
typename... Args>
61 auto add_graph(std::string_view graph_name, Args&&... args) -> TGraph*
63 return add_graph(graph_name, std::make_unique<TGraph>(std::forward<Args>(args)...));
66 auto get(
const std::string& histName) -> TH1*;
71 void save_to_sink(std::string_view folderName =
"", FairSink* sinkFile = FairRun::Instance()->GetSink());
83 std::map<std::string, std::unique_ptr<TGraph>>
graphs_;
85 static auto get_hist_dir(FairSink* sinkFile) -> TDirectory*;
88 template <
typename ElementType,
typename ContainerType>
89 static auto add_to_map(std::unique_ptr<ElementType> element, ContainerType& container) -> ElementType*;
90 template <
typename ElementType,
typename ContainerType>
91 static auto add_to_vector(std::unique_ptr<ElementType> element, ContainerType& container) -> ElementType*
93 auto* ptr = element.get();
94 container.emplace_back(std::move(element));
99 template <
typename ElementType,
typename ContainerType>
102 const auto* element_name = element->GetName();
103 auto* element_ptr = element.get();
104 const auto [it, is_success] = container.emplace(std::string{ element_name }, std::move(element));
108 "Element with the name {} has been already added. Please use different name!", element_name));
113 template <
typename Hist,
typename... Args>
116 auto hist =
R3B::make_hist<Hist>(histName.data(), histTitle.data(), std::forward<Args>(args)...);
117 return static_cast<Hist*
>(
add_hist(std::move(hist)));
120 template <
typename... Args>
122 std::string_view canvas_title,
128 "A canvas with the name {} has been already added. Please use different name!", canvas_name));
130 const auto [it, is_success] =
canvases_.insert(
131 { std::string{ canvas_name },
132 DataMonitorCanvas(
this, canvas_name.data(), canvas_title.data(), std::forward<Args>(args)...) });
136 template <
typename... Args>
139 ,
canvas_(std::make_unique<TCanvas>(std::forward<Args>(args)...))
143 template <
int div_num,
typename ElementType,
typename... Args>
146 static_assert(div_num > 0,
"Division number of the histogram must be larger than 0!");
150 template <
typename ElementType,
typename... Args>
153 ElementType* figure =
nullptr;
154 if constexpr (std::is_same_v<TGraph, ElementType>)
156 figure =
monitor_->add_graph<ElementType>(std::forward<Args>(args)...);
160 figure =
monitor_->add_hist<ElementType>(std::forward<Args>(args)...);
165 figures_[div_num].emplace_back(figure);
169 figures_.emplace(div_num, std::vector<DrawableElementPtr>{ figure });
171 if constexpr (std::is_base_of_v<TH2, ElementType>)
173 const auto* option = figure->GetOption();
174 figure->SetOption(fmt::format(
"{} COLZ", option).c_str());
176 auto* pad =
canvas_->GetPad(div_num);
DataMonitorCanvas(DataMonitor *monitor)
constexpr auto add(Args &&... args) -> CanvasElement< ElementType >
std::map< int, std::vector< DrawableElementPtr > > figures_
std::unique_ptr< TCanvas > canvas_
void write_all(TDirectory *dir)
std::map< std::string, std::unique_ptr< TH1 > > histograms_
std::string save_filename_
auto add_hist(std::unique_ptr< TH1 > hist) -> TH1 *
void save_to_sink(std::string_view folderName="", FairSink *sinkFile=FairRun::Instance() ->GetSink())
void register_canvases(FairRun *run)
static auto add_to_vector(std::unique_ptr< ElementType > element, ContainerType &container) -> ElementType *
auto add_graph(std::string_view graph_name, Args &&... args) -> TGraph *
auto add_graph(std::string_view graph_name, std::unique_ptr< GraphType > graph) -> GraphType *
std::map< std::string, DataMonitorCanvas > canvases_
static auto add_to_map(std::unique_ptr< ElementType > element, ContainerType &container) -> ElementType *
std::map< std::string, std::unique_ptr< TGraph > > graphs_
auto create_canvas(std::string_view canvas_name, std::string_view canvas_title, Args &&... args) -> DataMonitorCanvas &
static auto get_hist_dir(FairSink *sinkFile) -> TDirectory *
void save_to_file(std::string_view filename="")
auto get_canvas(const std::string &histName) -> DataMonitorCanvas &
auto get(const std::string &histName) -> TH1 *
auto make_hist(Args &&... args)
constexpr auto DEFAULT_HIST_MONITOR_DIR