4#include <Fit/BinData.h>
5#include <Math/WrappedMultiTF1.h>
11#include <range/v3/algorithm/find_if.hpp>
15#include <fmt/ranges.h>
24 fitter_.Config().SetMinimizer(
"Linear");
29 const auto num_of_planes = num_of_modules /
BarsPerPlane;
30 for (
int plane_id{}; plane_id < num_of_planes; ++plane_id)
32 auto data_iter =
data_regsiters_.insert_or_assign(plane_id, std::vector<MilleCalData>{}).first;
39 fitter_.Config().ParSettings(0).SetValue(0.);
40 fitter_.Config().ParSettings(1).SetValue(0.);
59 for (
const auto& signal : signals)
61 if (signal.left.size() == 1 && signal.right.size() == 1)
63 const auto bar_num =
static_cast<int>(signal.module_num);
76 namespace rng = ranges;
79 if (bar_data.size() < 2)
84 const auto& bar_signals = bar_data;
85 auto check_if_isolated = [&bar_signals](
const auto& signal) ->
bool
87 const auto module_num =
static_cast<int>(signal.module_num);
88 return (rng::find_if(bar_signals,
89 [module_num](
const auto& bar_signal)
90 {
return bar_signal.module_num == module_num - 1; }) == bar_signals.end()) and
91 (rng::find_if(bar_signals,
92 [module_num](
const auto& bar_signal)
93 {
return bar_signal.module_num == module_num + 1; }) == bar_signals.end());
96 bar_data.erase(std::remove_if(bar_data.begin(), bar_data.end(), check_if_isolated), bar_data.end());
111 if (bar_data.empty())
119 const auto displacement =
120 std::accumulate(bar_data.begin(),
124 { return sum + GetBarVerticalDisplacement(static_cast<int>(signal.module_num)); }) /
125 static_cast<double>(bar_data.size());
126 fit_data.z_vals.push_back(z_val);
127 fit_data.z_errs.push_back(
BarSize_Z / 2.);
129 fit_data.vals.push_back(displacement);
143 const auto diff = val - (fit_result.slope * z_val) - fit_result.offset;
150 const auto bin_data = ROOT::Fit::BinData{
static_cast<unsigned int>(data.size()),
158 auto old_var = gErrorIgnoreLevel;
159 gErrorIgnoreLevel = kFatal;
160 auto res =
fitter_.Fit(bin_data);
161 gErrorIgnoreLevel = old_var;
165 R3BLOG(debug,
"Linear fitting on x_z data failed");
168 fit_par.slope =
fitter_.Result().Parameter(0);
169 fit_par.offset =
fitter_.Result().Parameter(1);
173 fmt::format(
"p-value ({}) is too small from the fit.\n\
175 x_err = np.array({}) \n\
177 y_err = np.array({})",
#define R3BLOG(severity, x)
void remove_isolated_bar_signal()
auto fit_plane_data() -> bool
MilleDataProcessor(int num_of_modules)
void init_data_registers(int num_of_modules)
auto linear_fit(const FitData &data, FitPar &fit_par) -> bool
std::unordered_map< int, std::vector< MilleCalData > > data_regsiters_
auto calculate_residual(double val, int module_num) const -> double
auto fit_planes() -> bool
auto filter(const std::vector< BarCalData > &signals) -> bool
ROOT::Fit::Fitter fitter_
constexpr auto BarsPerPlane
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