23 return "left_leading";
25 return "right_leading";
27 return "left_trailing";
29 return "right_trailing";
41 InitAllDistributions(initHist.get());
57 InitAllDistributions(initHist.get());
63 constexpr int uniform_err_divider = 12;
64 constexpr auto uniform_err_divider_sqrt =
SQRT_12;
65 const auto sqrt_3 = std::numbers::sqrt3;
74 auto calculate_meanerror_exact(
const InputInfo& input) -> ValueError<double>
76 const auto base_variance = input.bin_entry * input.bin_entry / uniform_err_divider;
77 const auto sum_term = input.previous_sum + (input.bin_entry / 3);
78 const auto bin_prob = input.bin_entry / input.total_entry;
79 const auto pre_prob = input.previous_sum / input.total_entry;
80 const auto residual = ((1 - bin_prob) * sum_term) - (input.previous_sum * pre_prob);
82 const auto mean = input.previous_sum + (input.bin_entry / 2);
83 return ValueError<double>{ mean, std::sqrt(base_variance + residual) };
86 auto calculate_meanerror_approx(
const InputInfo& input) -> ValueError<double>
88 const auto mean = input.previous_sum + (input.bin_entry / 2);
90 const auto base_error = input.bin_entry / uniform_err_divider_sqrt;
91 const auto bin_prob = input.bin_entry / input.total_entry;
92 const auto pre_prob = input.previous_sum / input.total_entry;
93 const auto residual_main = (-(pre_prob - 0.5) * (pre_prob - 0.5)) + 0.25;
94 const auto residual_factor = (bin_prob == 0.) ? 0. : sqrt_3 / bin_prob;
96 return ValueError<double>{ mean, base_error + (residual_main * residual_factor) };
99 auto calculate_meanerror_uniform_only(
const InputInfo& input) -> ValueError<double>
101 const auto mean = input.previous_sum + (input.bin_entry / 2);
102 const auto base_error = input.bin_entry / uniform_err_divider_sqrt;
103 return ValueError<double>{ mean, base_error };
106 auto calculate_meanerror_none(
const InputInfo& input) -> ValueError<double>
108 const auto mean = input.previous_sum + (input.bin_entry / 2);
109 return ValueError<double>{ mean, 0. };
117 return +[](
const InputInfo& input) -> ValueError<double>
118 {
return calculate_meanerror_exact(input); };
120 return +[](
const InputInfo& input) -> ValueError<double>
121 {
return calculate_meanerror_approx(input); };
123 return +[](
const InputInfo& input) -> ValueError<double>
124 {
return calculate_meanerror_uniform_only(input); };
126 return +[](
const InputInfo& input) -> ValueError<double>
127 {
return calculate_meanerror_none(input); };
129 throw R3B::logic_error(
"undefined enumerator for method type!");
133 auto extract_bin_data(TH1* hist,
int max_bin) -> ValueErrors
135 auto output = ValueErrors{};
136 output.reserve(max_bin);
138 for (
size_t index{ 1 }; index < max_bin + 1; ++index)
140 output.emplace_back(hist->GetBinContent(
static_cast<int>(index)), 0.);
145 void scale_to_real_ns(ValueErrors& value_errors,
double period,
double total_entry)
147 ranges::for_each(value_errors,
148 [&](ValueError<double>& value_error) ->
void
150 value_error.value = value_error.value / total_entry * period;
151 value_error.error = value_error.error / total_entry * period;
155 auto calculate_value_errors(TH1* hist,
int max_bin,
double total_entry,
FTCalErrorMethod methodtype)
156 -> std::pair<ValueErrors, int>
158 auto output = extract_bin_data(hist, max_bin);
160 auto method = use_method(methodtype);
161 auto previous_sum = 0.;
162 for (
auto& value_error : output)
164 auto& value = value_error.value;
165 auto& error = value_error.error;
166 const auto inputInfo =
167 InputInfo{ .previous_sum = previous_sum, .bin_entry = value, .total_entry = total_entry };
168 previous_sum += value;
169 auto new_value_error = method(inputInfo);
170 value = new_value_error.value;
171 error = new_value_error.error;
173 const auto overflow = total_entry - previous_sum;
174 return std::make_pair(output, overflow);
180 const auto total_entry = hist->GetEntries();
182 auto bin_num = hist->GetNbinsX();
184 max_bin = (bin_num > max_bin) ? max_bin : bin_num;
186 auto [value_errors, overflow] = calculate_value_errors(hist, max_bin, total_entry,
error_method_);
192 calRelation.hist_overflow = overflow;