12 return "left_leading";
14 return "right_leading";
16 return "left_trailing";
18 return "right_trailing";
30 InitAllDistributions(initHist.get());
46 InitAllDistributions(initHist.get());
52 constexpr unsigned int uniform_err_divider = 12;
53 constexpr auto uniform_err_divider_sqrt =
SQRT_12;
54 const auto sqrt_3 = std::sqrt(3);
63 auto calculate_meanerror_exact(
const InputInfo& input) -> ValueError<double>
65 const auto base_vairance = input.bin_entry * input.bin_entry / uniform_err_divider;
66 const auto sum_term = input.previous_sum + input.bin_entry / 3;
67 const auto bin_prob = input.bin_entry / input.total_entry;
68 const auto pre_prob = input.previous_sum / input.total_entry;
69 const auto residual = (1 - bin_prob) * sum_term - input.previous_sum * pre_prob;
71 const auto mean = input.previous_sum + input.bin_entry / 2;
72 return ValueError<double>{ mean, std::sqrt(base_vairance + residual) };
75 auto calculate_meanerror_approx(
const InputInfo& input) -> ValueError<double>
77 const auto mean = input.previous_sum + input.bin_entry / 2;
79 const auto base_error = input.bin_entry / uniform_err_divider_sqrt;
80 const auto bin_prob = input.bin_entry / input.total_entry;
81 const auto pre_prob = input.previous_sum / input.total_entry;
82 const auto residual_main = -(pre_prob - 0.5) * (pre_prob - 0.5) + 0.25;
83 const auto residual_factor = (bin_prob == 0.) ? 0. : sqrt_3 / bin_prob;
85 return ValueError<double>{ mean, base_error + residual_main * residual_factor };
88 auto calculate_meanerror_uniform_only(
const InputInfo& input) -> ValueError<double>
90 const auto mean = input.previous_sum + input.bin_entry / 2;
91 const auto base_error = input.bin_entry / uniform_err_divider_sqrt;
92 return ValueError<double>{ mean, base_error };
95 auto calculate_meanerror_none(
const InputInfo& input) -> ValueError<double>
97 const auto mean = input.previous_sum + input.bin_entry / 2;
98 return ValueError<double>{ mean, 0. };
106 return +[](
const InputInfo& input) {
return calculate_meanerror_exact(input); };
108 return +[](
const InputInfo& input) {
return calculate_meanerror_approx(input); };
110 return +[](
const InputInfo& input) {
return calculate_meanerror_uniform_only(input); };
112 return +[](
const InputInfo& input) {
return calculate_meanerror_none(input); };
114 throw R3B::logic_error(
"undefined enumerator for method type!");
118 auto extract_bin_data(TH1* hist,
unsigned int max_bin) -> ValueErrors
120 auto output = ValueErrors{};
121 output.reserve(max_bin);
123 for (
size_t index{ 1 }; index < max_bin + 1; ++index)
125 output.emplace_back(hist->GetBinContent(
static_cast<int>(index)), 0.);
130 void scale_to_real_ns(ValueErrors& value_errors,
double period,
double total_entry)
132 ranges::for_each(value_errors,
133 [&](ValueError<double>& value_error)
135 value_error.value = value_error.value / total_entry * period;
136 value_error.error = value_error.error / total_entry * period;
142 unsigned int max_bin,
146 auto output = extract_bin_data(hist, max_bin);
148 auto method = use_method(methodtype);
149 auto previous_sum = 0.;
150 for (
auto& value_error : output)
152 auto& value = value_error.value;
153 auto& error = value_error.error;
154 const auto inputInfo =
155 InputInfo{ .previous_sum = previous_sum, .bin_entry = value, .total_entry = total_entry };
156 previous_sum += value;
157 auto new_value_error = method(inputInfo);
158 value = new_value_error.value;
159 error = new_value_error.error;
161 const auto overflow = total_entry - previous_sum;
162 return std::make_pair(output, overflow);
167 const auto total_entry = hist->GetEntries();
169 auto bin_num = hist->GetNbinsX();
170 auto max_bin = (max_bin_number_ == 0) ? bin_num : max_bin_number_;
171 max_bin = (bin_num > max_bin) ? max_bin : bin_num;
175 scale_to_real_ns(value_errors, cycle_period_, total_entry);
179 calRelation.hist_overflow = overflow;