File indexing completed on 2026-08-30 08:14:26
0001 #ifndef TPCCALIB_GLOBALFIELDFITTER_H
0002 #define TPCCALIB_GLOBALFIELDFITTER_H
0003
0004 #include <array>
0005 #include <vector>
0006
0007
0008
0009 inline constexpr int observation_phi = 0;
0010 inline constexpr int observation_r = 1;
0011 inline constexpr int observation_delta_r = 2;
0012 inline constexpr int observation_r_delta_phi = 3;
0013 inline constexpr int observation_sigma_delta_r = 4;
0014 inline constexpr int observation_sigma_r_delta_phi = 5;
0015
0016
0017
0018
0019 inline constexpr int control_point_phi = 0;
0020 inline constexpr int control_point_r = 1;
0021 inline constexpr int control_point_delta_r = 2;
0022 inline constexpr int control_point_r_delta_phi = 3;
0023 inline constexpr int control_point_delta_phi = 4;
0024 inline constexpr int control_point_support = 5;
0025 inline constexpr int control_point_active = 6;
0026
0027 class GlobalFieldFitter {
0028 public:
0029
0030
0031 explicit GlobalFieldFitter(const std::vector<std::array<double, 6>> &observations, const std::vector<double> &control_r_positions = {});
0032
0033
0034 bool fit();
0035
0036
0037 bool is_valid() const;
0038
0039
0040 double evaluate_delta_r(double phi, double r) const;
0041 double evaluate_r_delta_phi(double phi, double r) const;
0042 double evaluate_delta_phi(double phi, double r) const;
0043
0044
0045 double predictive_sigma_delta_r(double phi, double r) const;
0046 double predictive_sigma_r_delta_phi(double phi, double r) const;
0047
0048
0049 std::vector<std::array<double, 7>> control_points() const;
0050
0051 private:
0052
0053 void initialize_grid();
0054
0055
0056 int control_index(int phi_index, int r_index) const;
0057
0058
0059 void accumulate_bilinear_weights(double phi, double r, std::vector<int> &indices, std::vector<double> &weights) const;
0060
0061
0062 void add_smoothness_penalty(std::vector<std::vector<double>> &normal_matrix, const std::vector<int> &full_to_fit_index) const;
0063
0064
0065 bool solve_linear_system(std::vector<std::vector<double>> matrix, std::vector<double> rhs, std::vector<double> &solution) const;
0066
0067
0068 double evaluate_component(const std::vector<double> &coefficients, double phi, double r) const;
0069
0070
0071 void compute_control_support();
0072
0073
0074 void select_active_controls(std::vector<int> &full_to_fit_index);
0075
0076
0077 void build_dense_evaluation_grid();
0078
0079
0080 double control_phi(int phi_index) const;
0081 double control_r(int r_index) const;
0082
0083
0084 double interpolate_active_value(const std::vector<double> &coefficients, double phi, double r) const;
0085
0086
0087 double estimate_global_residual_sigma(bool fit_delta_r) const;
0088
0089
0090 std::vector<std::array<double, 6>> m_observations;
0091
0092
0093 std::vector<double> m_coefficients_delta_r;
0094 std::vector<double> m_coefficients_r_delta_phi;
0095
0096
0097 std::vector<double> m_evaluation_coefficients_delta_r;
0098 std::vector<double> m_evaluation_coefficients_r_delta_phi;
0099
0100
0101 std::vector<double> m_controlSupport;
0102 std::vector<bool> m_activeControl;
0103
0104
0105 int m_nControlPhi = 0;
0106 int m_nControlR = 0;
0107 double m_phiMin = 0.0;
0108 double m_phiMax = 0.0;
0109 double m_phiStep = 0.0;
0110 double m_rMin = 0.0;
0111 double m_rMax = 0.0;
0112 double m_rStep = 0.0;
0113
0114
0115 std::vector<double> m_requestedControlRPositions;
0116 std::vector<double> m_controlRPositions;
0117
0118
0119 bool m_isValid = false;
0120 };
0121
0122 #endif