17#include <range/v3/numeric.hpp>
18#include <range/v3/view.hpp>
20namespace rng = ranges;
40 constexpr auto start_graph_data_size = 100;
42 los_count_rate_ = canvas.add<1, TGraph>(
"los_count_rate", start_graph_data_size);
43 los_count_rate_->SetTitle(
"Count rates for LOS");
44 los_count_rate_->GetXaxis()->SetTitle(
"time (min)");
45 los_count_rate_->GetYaxis()->SetTitle(
"counts per min");
47 map_count_rate_ = canvas.add<2, TGraph>(
"map_count_rate", start_graph_data_size);
48 map_count_rate_->SetTitle(
"Count rates for map level");
49 map_count_rate_->GetXaxis()->SetTitle(
"time (min)");
50 map_count_rate_->GetYaxis()->SetTitle(
"counts per min");
52 cal_count_rate_ = canvas.add<3, TGraph>(
"cal_count_rate", start_graph_data_size);
53 cal_count_rate_->SetTitle(
"Count rates for cal level");
54 cal_count_rate_->GetXaxis()->SetTitle(
"time (min)");
55 cal_count_rate_->GetYaxis()->SetTitle(
"counts per min");
57 hit_count_rate_ = canvas.add<4, TGraph>(
"hit_count_rate", start_graph_data_size);
58 hit_count_rate_->SetTitle(
"Count rates for onspill hit level");
59 hit_count_rate_->GetXaxis()->SetTitle(
"time (min)");
60 hit_count_rate_->GetYaxis()->SetTitle(
"counts per min");
74 calculate_count_rate();
77 void CountRateCanvas::los_count()
81 const auto time_start = event_header->GetTStart();
82 if (not std::isnan(time_start))
88 void CountRateCanvas::map_count()
90 map_counter_ += rng::accumulate(
93 [](
auto init,
const auto& plane_signals) ->
int
95 return init + rng::accumulate(plane_signals | rng::views::values,
97 [](
auto init_bar,
const auto bar_signals) ->
int {
99 static_cast<int>(std::min(bar_signals.left.size(),
100 bar_signals.right.size()));
106 void CountRateCanvas::cal_count()
108 cal_counter_ += rng::accumulate(
111 [](
auto init,
const auto& bar_signals)
112 { return init + static_cast<int>(std::min(bar_signals.left.size(), bar_signals.right.size())); });
115 void CountRateCanvas::hit_count()
117 auto* online_spectra = GetOnlineSpectra();
119 online_spectra->GetEventHeader()->GetTpat(),
120 online_spectra->GetBasePar()->GetOffSpillTpatPos());
121 const auto time_start = online_spectra->GetEventHeader()->GetTStart();
122 if (is_on_spill and not std::isnan(time_start))
124 hit_counter_ +=
static_cast<int>(hit_data_.size());
128 void CountRateCanvas::calculate_count_rate()
130 auto time_now = std::chrono::steady_clock::now();
131 auto time_duration = std::chrono::duration_cast<std::chrono::seconds>(time_now - timer_);
132 if ((time_duration) > counting_duration_)
134 constexpr auto minute_to_seconds = 60.;
135 auto time_passed_seconds = std::chrono::duration_cast<std::chrono::seconds>(time_now - start_time_);
136 auto time_passed_minutes =
static_cast<double>(time_passed_seconds.count()) / minute_to_seconds;
137 auto duration_minutes =
static_cast<double>(time_duration.count()) / minute_to_seconds;
138 los_count_rate_->SetPoint(los_count_rate_->GetN(), time_passed_minutes, los_counter_ / duration_minutes);
139 map_count_rate_->SetPoint(map_count_rate_->GetN(), time_passed_minutes, map_counter_ / duration_minutes);
140 cal_count_rate_->SetPoint(cal_count_rate_->GetN(), time_passed_minutes, cal_counter_ / duration_minutes);
141 hit_count_rate_->SetPoint(hit_count_rate_->GetN(), time_passed_minutes, hit_counter_ / duration_minutes);
147 inline void CountRateCanvas::set_view(
double width)
152 const auto last_x = graph->GetPointX(graph->GetN() - 1);
153 auto* x_axis = graph->GetXaxis();
154 const auto range_min = x_axis->GetBinCenter(x_axis->GetFirst());
155 const auto range_max = x_axis->GetBinCenter(x_axis->GetLast());
156 auto range_begin = range_min;
157 if (last_view_mode_ != RangeViewMode::two_hours)
159 if (last_x > width / 2.)
161 range_begin = last_x -
width / 2.;
171 if (range_max < range_begin + width)
173 x_axis->SetLimits(0., range_begin + width);
175 x_axis->SetRangeUser(range_begin, range_begin + width);
178 graph.pad()->RedrawAxis();
179 graph.pad()->Update();
183 inline void CountRateCanvas::set_two_hour_view()
185 constexpr auto range_width_minutes = 120.;
186 set_view(range_width_minutes);
193 inline void CountRateCanvas::set_four_hour_view()
195 constexpr auto range_width_minutes = 240.;
196 set_view(range_width_minutes);
199 inline void CountRateCanvas::set_full_view()
204 auto* axis = graph->GetXaxis();
206 axis->SetCanExtend(
true);
207 graph.pad()->RedrawAxis();
211 void CountRateCanvas::adjust_graph_view()
213 const auto view_mode = GetOnlineSpectra()->GetGraphViewMode();
214 if (view_mode == last_view_mode_ and last_view_mode_ == RangeViewMode::full)
220 case RangeViewMode::full:
223 case RangeViewMode::two_hours:
226 case RangeViewMode::four_hours:
227 set_four_hour_view();
230 last_view_mode_ = view_mode;
239 timer_ = std::chrono::steady_clock::now();
constexpr auto BEGIN_VIEW_RATIO
constexpr auto END_VIEW_RATIO
void CanvasFinish() override
void CanvasFill(DataMonitor &histograms) override
void CanvasInit(DataMonitor &histograms) override
auto CreateNewCanvas(DataMonitor &histograms) -> DataMonitorCanvas &
auto GetOnlineSpectra() const -> OnlineSpectra *
Simulation of NeuLAND Bar/Paddle.
auto CheckTriggerWithTpat(CalTrigger trigger, int tpat, int off_spill_bit) -> bool
std::unordered_map< unsigned int, R3B::MapBarSignal > bars