29 constexpr auto FITTING_RANGE_RATIO = 0.9;
37 auto calculate_toffset_speed(TH1D*
histogram,
int bar_id) -> ParResult
43 auto first_fit_res = cumulative->Fit(
"pol1",
"SQC",
"", x_pos[0], x_pos[1]);
44 if (first_fit_res.Get() ==
nullptr)
46 LOGP(warn,
"First linear fitting on time_diff CFD failed for the bar with id {}", bar_id);
49 const auto slope = first_fit_res->Parameter(1);
50 const auto offset = first_fit_res->Parameter(0);
56 auto fit_fun = TF1{
"fit_fun",
"[1]*x + 0.5 - [0] * [1]", x_pos[0], x_pos[1] };
57 fit_fun.SetParameter(0, (0.5 - offset) / slope);
58 fit_fun.SetParameter(1, slope);
59 auto second_fit_res = cumulative->Fit(&fit_fun,
"SQC",
"", x_pos[0], x_pos[1]);
60 if (second_fit_res.Get() ==
nullptr)
62 LOGP(warn,
"Second fitting on time_diff CFD failed for the bar with id {}", bar_id);
66 auto par_result = ParResult();
67 par_result.t_offset.value = second_fit_res->Parameter(0);
68 par_result.t_offset.error = second_fit_res->Error(0);
69 par_result.effective_speed.value = second_fit_res->Parameter(1) * 2 *
BarLength;
70 par_result.effective_speed.error = second_fit_res->Error(1) * 2 *
BarLength;
79 static constexpr auto TIME_DIFF_MAX = 300.;
80 static constexpr auto TIME_DIFF_BIN_NUM = 600;
83 "Time differences between two adjacent PMTs",
105 for (
const auto& signal : signals)
107 if (signal.left.size() != 1 or signal.right.size() != 1)
117 const auto& left_signal = signal.
left.front();
118 const auto& right_signal = signal.
right.front();
121 const auto t_diff = right_signal.leading_time - left_signal.leading_time;
122 const auto t_sum = right_signal.leading_time + left_signal.leading_time;
137 void calibrate_t_diff(TH2D* hist_time_diff,
HitModulePar& module_par)
139 const auto module_num = module_par.
module_num;
141 auto* hist_t_diff_py = hist_time_diff->ProjectionY(
"_py", module_num, module_num);
142 const auto par_res = calculate_toffset_speed(hist_t_diff_py, module_num);
143 module_par.
t_diff = par_res.t_offset;
147 void add_default_module_pars(
Cal2HitPar& hit_par,
int module_size)
150 ranges::views::iota(1, module_size + 1) |
151 ranges::views::transform([](
int module_num)
152 {
return std::make_pair(module_num,
HitModulePar{ module_num }); }) |
153 ranges::to<std::unordered_map<int, HitModulePar>>();