22 return "left_leading";
24 return "right_leading";
26 return "left_trailing";
28 return "right_trailing";
40 InitAllDistributions(initHist.get());
56 InitAllDistributions(initHist.get());
62 constexpr unsigned int uniform_err_divider = 12;
63 constexpr auto uniform_err_divider_sqrt =
SQRT_12;
64 const auto sqrt_3 = std::sqrt(3);
73 auto calculate_meanerror_exact(
const InputInfo& input) -> ValueError<double>
75 const auto base_vairance = input.bin_entry * input.bin_entry / uniform_err_divider;
76 const auto sum_term = input.previous_sum + (input.bin_entry / 3);
77 const auto bin_prob = input.bin_entry / input.total_entry;
78 const auto pre_prob = input.previous_sum / input.total_entry;
79 const auto residual = ((1 - bin_prob) * sum_term) - (input.previous_sum * pre_prob);
81 const auto mean = input.previous_sum + (input.bin_entry / 2);
82 return ValueError<double>{ mean, std::sqrt(base_vairance + residual) };
85 auto calculate_meanerror_approx(
const InputInfo& input) -> ValueError<double>
87 const auto mean = input.previous_sum + (input.bin_entry / 2);
89 const auto base_error = input.bin_entry / uniform_err_divider_sqrt;
90 const auto bin_prob = input.bin_entry / input.total_entry;
91 const auto pre_prob = input.previous_sum / input.total_entry;
92 const auto residual_main = (-(pre_prob - 0.5) * (pre_prob - 0.5)) + 0.25;
93 const auto residual_factor = (bin_prob == 0.) ? 0. : sqrt_3 / bin_prob;
95 return ValueError<double>{ mean, base_error + (residual_main * residual_factor) };
98 auto calculate_meanerror_uniform_only(
const InputInfo& input) -> ValueError<double>
100 const auto mean = input.previous_sum + (input.bin_entry / 2);
101 const auto base_error = input.bin_entry / uniform_err_divider_sqrt;
102 return ValueError<double>{ mean, base_error };
105 auto calculate_meanerror_none(
const InputInfo& input) -> ValueError<double>
107 const auto mean = input.previous_sum + (input.bin_entry / 2);
108 return ValueError<double>{ mean, 0. };
116 return +[](
const InputInfo& input) {
return calculate_meanerror_exact(input); };
118 return +[](
const InputInfo& input) {
return calculate_meanerror_approx(input); };
120 return +[](
const InputInfo& input) {
return calculate_meanerror_uniform_only(input); };
122 return +[](
const InputInfo& input) {
return calculate_meanerror_none(input); };
124 throw R3B::logic_error(
"undefined enumerator for method type!");
128 auto extract_bin_data(TH1* hist,
unsigned int max_bin) -> ValueErrors
130 auto output = ValueErrors{};
131 output.reserve(max_bin);
133 for (
size_t index{ 1 }; index < max_bin + 1; ++index)
135 output.emplace_back(hist->GetBinContent(
static_cast<int>(index)), 0.);
140 void scale_to_real_ns(ValueErrors& value_errors,
double period,
double total_entry)
142 ranges::for_each(value_errors,
143 [&](ValueError<double>& value_error)
145 value_error.value = value_error.value / total_entry * period;
146 value_error.error = value_error.error / total_entry * period;
150 auto calculate_value_errors(TH1* hist,
151 unsigned int max_bin,
155 auto output = extract_bin_data(hist, max_bin);
157 auto method = use_method(methodtype);
158 auto previous_sum = 0.;
159 for (
auto& value_error : output)
161 auto& value = value_error.value;
162 auto& error = value_error.error;
163 const auto inputInfo =
164 InputInfo{ .previous_sum = previous_sum, .bin_entry = value, .total_entry = total_entry };
165 previous_sum += value;
166 auto new_value_error = method(inputInfo);
167 value = new_value_error.value;
168 error = new_value_error.error;
170 const auto overflow = total_entry - previous_sum;
171 return std::make_pair(output, overflow);
177 const auto total_entry = hist->GetEntries();
179 auto bin_num = hist->GetNbinsX();
181 max_bin = (bin_num > max_bin) ? max_bin : bin_num;
183 auto [value_errors, overflow] = calculate_value_errors(hist, max_bin, total_entry,
error_method_);
189 calRelation.hist_overflow = overflow;