26#include <TGraphErrors.h>
30#include <fairlogger/Logger.h>
33#include <fmt/format.h>
38#include <range/v3/algorithm/all_of.hpp>
39#include <range/v3/algorithm/copy.hpp>
40#include <range/v3/algorithm/min_element.hpp>
41#include <range/v3/iterator/operations.hpp>
42#include <range/v3/numeric/accumulate.hpp>
43#include <range/v3/view/all.hpp>
44#include <range/v3/view/filter.hpp>
45#include <range/v3/view/sliding.hpp>
46#include <range/v3/view/transform.hpp>
53namespace rng = ranges;
66 for (
auto& [module_num, module_par] : module_pars)
68 if (module_par.effective_speed.value != 0)
70 module_par.t_diff = module_par.t_diff / module_par.effective_speed;
78 for (
auto& [module_num, module_par] : module_pars)
80 module_par.t_diff = module_par.t_diff * module_par.effective_speed;
96 if (
const auto* r3b_dir = std::getenv(
"R3BROOTPATH"); r3b_dir !=
nullptr)
105 "Environment variable R3BROOTPATH is not defined! Did you forget to source the \"config.sh\" file?");
118 auto filename = FairRun::Instance()->GetSink()->GetFileName();
119 auto output_dir_str = filename.View();
120 auto output_path = fs::path{ output_dir_str };
121 auto output_dir = output_path.parent_path();
122 auto output_filename = output_path.filename();
124 LOGP(debug,
"Working dir has set to be: {}",
working_dir_);
131 auto res = std::pair<int, GlobalLabel>{};
132 const auto factor = (par_num - 1) / num_of_module;
133 res.first = (par_num - 1) % num_of_module + 1;
153 throw R3B::logic_error(fmt::format(
"An error occured with unrecognized global par id: {}", par_num));
173 return module_num + num_of_module;
182 change_time_offset(cal_to_hit_par);
183 const auto& pars = result.
get_pars();
184 for (
const auto& [par_id, par] : pars)
189 auto& par_ref = module_pars.emplace(module_num,
HitModulePar{}).first->second;
190 switch (global_label)
202 par_ref.effective_speed.value += par.value;
203 par_ref.effective_speed.error += par.error;
206 throw std::runtime_error(
"An error occured with unrecognized global tag");
210 calculate_time_offset(cal_to_hit_par);
216 auto filtered_signals = rng::filter_view(
217 signals | rng::views::all,
218 [](
const auto& bar_signal) {
return bar_signal.left.size() == 1 and bar_signal.right.size() == 1; });
219 if (filtered_signals.empty())
226 auto t_sum_view = filtered_signals | rng::views::transform(
227 [](
const auto& bar_signal)
229 const auto& left_signal = bar_signal.left.front();
230 const auto& right_signal = bar_signal.right.front();
231 return (left_signal.leading_time - left_signal.trigger_time +
232 right_signal.leading_time - right_signal.trigger_time)
235 auto sum = rng::accumulate(t_sum_view, 0.F);
236 average_t_sum_ = sum /
static_cast<float>(rng::distance(t_sum_view.begin(), t_sum_view.end()));
237 LOGP(info,
"Average t_sum is calculated to be {}",
average_t_sum_.value());
251 if (rng::all_of(signals |
252 rng::views::transform([](
const auto& bar_signal)
254 rng::views::sliding(2),
255 [](
const auto&
pair) {
return pair.front() ==
pair.back(); }))
271 const auto module_num =
static_cast<int>(signal.
module_num);
274 auto init_effective_c =
cal_to_hit_par_->GetModuleParAt(module_num).effective_speed.value;
276 const auto& left_signal = signal.
left;
277 const auto& right_signal = signal.
right;
278 const auto t_sum = (left_signal.leading_time - left_signal.trigger_time) +
279 (right_signal.leading_time - right_signal.trigger_time) -
average_t_sum_.value_or(0.F);
285 const auto local_derivs_t = std::array{ 0.F, 0.F, pos_z /
SCALE_FACTOR, 0.F, 0.F, 1.F };
287 std::copy(local_derivs_t.begin(), local_derivs_t.end(), std::back_inserter(
input_data_buffer_.locals));
304 const auto pos_bar_vert_disp = std::accumulate(plane_signals.begin(),
307 [](
double sum,
const auto& signal) {
308 return sum + GetBarVerticalDisplacement(signal.module_num);
310 static_cast<double>(plane_signals.size());
311 const auto local_derivs = is_horizontal ? std::array{ 0.F, pos_z /
SCALE_FACTOR, 0.F, 1.F }
327 std::copy(local_derivs.begin(), local_derivs.end(), std::back_inserter(
input_data_buffer_.locals));
337 const auto module_num =
static_cast<int>(signal.
module_num);
341 auto init_effective_c = module_par.effective_speed.value;
342 auto init_t_offset = module_par.t_diff.value;
343 const auto pos_z =
static_cast<float>(
PlaneID2ZPos(plane_id));
345 const auto& left_signal = signal.
left;
346 const auto& right_signal = signal.
right;
347 const auto t_diff = (right_signal.leading_time - right_signal.trigger_time) -
348 (left_signal.leading_time - left_signal.trigger_time);
350 const auto t_error = t_diff.error == 0 ?
DEFAULT_T_ERROR : t_diff.error;
355 const auto local_derivs = is_horizontal ? std::array{ pos_z /
SCALE_FACTOR, 0.F, 1.F, 0.F }
360 std::copy(local_derivs.begin(), local_derivs.end(), std::back_inserter(
input_data_buffer_.locals));
379 "Writting Mille data to binary file with meas = {} and z = {}",
386 if (plane_data.empty())
388 return plane_data.end();
390 auto calculate_residual = [
this](
const MilleCalData& signal) ->
double
392 const auto t_diff = (signal.right.leading_time - signal.right.trigger_time) -
393 (signal.left.leading_time - signal.left.trigger_time);
394 const auto& module_par =
cal_to_hit_par_->GetModuleParAt(signal.module_num);
395 const auto position = (-t_diff + module_par.t_diff) / 2 * module_par.effective_speed;
397 data_preprocessor_->calculate_residual(position.value,
static_cast<int>(signal.module_num));
400 auto iter = ranges::min_element(plane_data,
401 [calculate_residual](
const auto& first,
const auto& second)
402 {
return calculate_residual(first) < calculate_residual(second); });
403 if (iter != plane_data.end())
405 auto residual = calculate_residual(*iter);
409 return plane_data.end();
425 for (
const auto& [plane_id, plane_signals] :
427 rng::views::filter([](
const auto& planeid_signals) {
return not planeid_signals.second.empty(); }))
431 if (iter == plane_signals.end())
448 LOGP(info,
"Launching pede algorithm..");
460 for (
const auto& [module_num, par] : pars)
462 graph_time_offset_->SetPoint(
static_cast<int>(module_num), module_num, par.t_diff.value);
463 graph_time_offset_->SetPointError(
static_cast<int>(module_num), 0., par.t_diff.error);
464 graph_time_sync_->SetPoint(
static_cast<int>(module_num), module_num, par.t_sync.value);
465 graph_time_sync_->SetPointError(
static_cast<int>(module_num), 0., par.t_sync.error);
466 graph_effective_c_->SetPoint(
static_cast<int>(module_num), module_num, par.effective_speed.value);
467 graph_effective_c_->SetPointError(
static_cast<int>(module_num), 0., par.effective_speed.error);
493 static constexpr auto RESIDUAL_BIN_NUM = 500;
495 "t_diff_residual",
"Residual values of the positios calculated from t_dff", RESIDUAL_BIN_NUM, 0., 1000.);
529 static constexpr auto NUMBER_OF_ITERARTION = 3.F;
530 static constexpr auto CONVERGENCE_RECOGNITION = 0.001F;
532 std::make_pair(NUMBER_OF_ITERARTION, CONVERGENCE_RECOGNITION));
533 steer_writer.add_other_options(std::vector<std::string>{
"hugecut",
"50000" });
534 steer_writer.add_other_options(std::vector<std::string>{
"outlierdownweighting",
"4" });
552 steer_writer.write();
constexpr auto SCALE_FACTOR
constexpr auto DEFAULT_T_ERROR
constexpr auto DEFAULT_RES_FILENAME
constexpr auto MILLE_BUFFER_SIZE
auto add_hist(std::unique_ptr< TH1 > hist) -> TH1 *
auto add_graph(std::string_view graph_name, std::unique_ptr< GraphType > graph) -> GraphType *
auto get_pars() const -> const auto &
auto GetListOfModulePar() const -> const std::unordered_map< int, ::R3B::Neuland::HitModulePar > &
auto GetListOfModuleParRef() -> auto &
auto GetTask() -> Cal2HitParTask *
auto GetModuleSize() const -> auto
TGraphErrors * graph_time_offset_
auto to_module_num_label(int par_num) -> std::pair< int, GlobalLabel >
MilleDataPoint input_data_buffer_
void Calibrate(Cal2HitPar &hit_par) override
void add_spacial_local_constraint(int plane_id, const std::vector< MilleCalData > &plane_signals)
auto set_minimum_values(const std::vector< R3B::Neuland::BarCalData > &signals) -> bool
void EndOfEvent(unsigned int event_num=0) override
auto select_t_diff_signal(const std::vector< MilleCalData > &plane_data)
static constexpr std::string_view DEFAULT_SUB_DIR
double t_diff_residual_cut_
void fill_module_parameters(const Millepede::ResultReader &result, Neuland::Cal2HitPar &cal_to_hit_par)
std::unique_ptr< Mille > binary_data_writer_
void EndOfTask() override
std::unique_ptr< MilleDataProcessor > data_preprocessor_
void fill_data_to_figure(Cal2HitPar &hit_par)
void add_signal_t_sum(const MilleCalData &signal)
TH1D * hist_t_offset_residual_
Cal2HitPar * cal_to_hit_par_
void add_signal_t_diff(const MilleCalData &signal)
auto SignalFilter(const std::vector< BarCalData > &signals) -> bool override
void AddSignals(const std::vector< BarCalData > &signals) override
TGraphErrors * graph_time_sync_
auto get_global_label_id(int module_num, GlobalLabel label) -> int
void EventReset() override
std::string input_data_filename_
TGraphErrors * graph_effective_c_
float error_scale_factor_
void HistInit(DataMonitor &histograms) override
std::string pede_steer_filename_
std::optional< float > average_t_sum_
std::string parameter_filename_
Millepede::Launcher pede_launcher_
Millepede::ResultReader par_result_
void set_working_dir(std::string_view dir)
constexpr auto ModuleID2PlaneID(int moduleID) -> int
constexpr auto BarSize_XY
constexpr auto ModuleNum2ZPos(int module_num) -> T
constexpr auto IsPlaneIDHorizontal(int plane_id) -> bool
constexpr auto PlaneID2ZPos(int plane_id) -> T