R3BROOT
R3B analysis software
Loading...
Searching...
No Matches
R3BNeulandMilleCalDataProcessor.h
Go to the documentation of this file.
1#pragma once
2
3#include <Fit/Fitter.h>
5#include <R3BNeulandCommon.h>
6#include <TF1.h>
7#include <fmt/core.h>
8#include <unordered_map>
9#include <vector>
10
12{
14 {
15 public:
16 MilleCalData() = default;
17 explicit MilleCalData(const BarCalData& bar_cal_data)
18 : module_num{ bar_cal_data.module_num }
19 , left{ bar_cal_data.left.front() }
20 , right{ bar_cal_data.right.front() }
21 {
22 }
23 unsigned int module_num = 0; // 1 based bar num
26 };
27
29 {
30 public:
31 struct FitPar
32 {
33 double offset = 0.;
34 double slope = 0.;
35 };
36 struct FitResult
37 {
40 };
41 struct FitData
42 {
43 std::vector<double> z_vals;
44 std::vector<double> z_errs;
45 std::vector<double> vals;
46 std::vector<double> errs;
47
48 void clear()
49 {
50 z_vals.clear();
51 z_errs.clear();
52 vals.clear();
53 errs.clear();
54 }
55 [[nodiscard]] auto size() const { return z_vals.size(); }
56 };
57
58 explicit MilleDataProcessor(int num_of_modules);
59 auto filter(const std::vector<BarCalData>& signals) -> bool;
60 [[nodiscard]] auto get_data() const -> const auto& { return data_regsiters_; }
61 [[nodiscard]] auto get_fit() const -> const auto& { return fit_result_; }
62 [[nodiscard]] auto calculate_residual(double val, int module_num) const -> double;
63 void reset();
64
65 void set_p_value_cut(double val) { p_value_cut_ = val; }
66
67 private:
68 double p_value_cut_ = DEFAULT_CALIBRATION_P_VALUE_CUT;
69 std::unordered_map<int, std::vector<MilleCalData>> data_regsiters_;
70 FitResult fit_result_;
71 FitData x_z_vals_;
72 FitData y_z_vals_;
73
74 ROOT::Fit::Fitter fitter_;
75 TF1 fit_function_{ "mille_fitting", "[0] * x + [1]" };
76
77 void init_data_registers(int num_of_modules);
78 void remove_isolated_bar_signal();
79 void fill_fit_data();
80 void reset_fitpars();
81 auto fit_planes() -> bool;
82 auto fit_plane_data() -> bool;
83 auto linear_fit(const FitData& data, FitPar& fit_par) -> bool;
84 };
85} // namespace R3B::Neuland::Calibration
86
87template <>
89{
90 public:
91 static constexpr auto parse(format_parse_context& ctx) { return ctx.end(); }
92 template <typename FmtContent>
93 constexpr auto format(const R3B::Neuland::Calibration::MilleCalData& signal, FmtContent& ctn) const
94 {
95 return format_to(
96 ctn.out(), "ModuleNum: {}, left bar: {}, right bar: {}", signal.module_num, signal.left, signal.right);
97 }
98};
auto calculate_residual(double val, int module_num) const -> double
auto filter(const std::vector< BarCalData > &signals) -> bool
constexpr auto format(const R3B::Neuland::Calibration::MilleCalData &signal, FmtContent &ctn) const
constexpr auto DEFAULT_CALIBRATION_P_VALUE_CUT