19#ifndef MATHUTILS_DISTANCES_H
20#define MATHUTILS_DISTANCES_H
43 template <
typename Scale,
typename Iterator>
44 static auto distance(Scale scale, Iterator ref_begin, Iterator ref_end, Iterator target_begin)
45 ->
decltype(ref_begin->getFlux()) {
46 decltype(ref_begin->getFlux()) acc = 0.;
48 for (
auto ri = ref_begin, ti = target_begin; ri != ref_end; ++ri, ++ti) {
49 auto ref_val = scale * ri->getFlux();
50 auto ref_err = scale * ri->getError();
51 auto tar_val = ti->getFlux();
52 auto tar_err = ti->getError();
53 auto nom = (ref_val - tar_val) * (ref_val - tar_val);
54 auto den = ref_err * ref_err + tar_err * tar_err;
69 template <
typename Iterator>
70 static auto guessScale(Iterator ref_begin, Iterator ref_end, Iterator target_begin) ->
decltype(ref_begin->getFlux()) {
71 decltype(ref_begin->getFlux()) nom = 0., den = 0.;
73 for (
auto ri = ref_begin, ti = target_begin; ri != ref_end; ++ri, ++ti) {
74 auto err_sqr = (ti->getError() * ti->getError());
75 nom += (ri->getFlux() * ti->getFlux()) / err_sqr;
76 den += (ri->getFlux() * ri->getFlux()) / err_sqr;
88 template <
typename Scale,
typename Iterator>
89 static auto daDistance(Scale scale, Iterator ref_begin, Iterator ref_end, Iterator target_begin)
90 ->
decltype(ref_begin->getFlux()) {
91 decltype(ref_begin->getFlux()) acc = 0.;
93 for (
auto ri = ref_begin, ti = target_begin; ri != ref_end; ++ri, ++ti) {
94 auto ref_val = ri->getFlux();
95 auto ref_err = ri->getError();
96 auto tar_val = ti->getFlux();
97 auto tar_err = ti->getError();
99 auto ref_err_sq = ref_err * ref_err;
100 auto tar_err_sq = tar_err * tar_err;
102 auto nom = 2 * (scale * ref_val - tar_val) * (ref_err_sq * scale * tar_val + ref_val * tar_err_sq);
103 auto den = ref_err_sq * scale * scale + tar_err_sq;
104 acc += nom / (den * den);
116 template <
typename Scale,
typename Iterator>
117 static auto distance(Scale scale, Iterator ref_begin, Iterator ref_end, Iterator target_begin)
118 ->
decltype(ref_begin->getFlux()) {
119 decltype(ref_begin->getFlux()) acc = 0.;
121 for (
auto ri = ref_begin, ti = target_begin; ri != ref_end; ++ri, ++ti) {
122 auto d = (scale * ri->getFlux()) - (ti->getFlux());
137 template <
typename Iterator>
138 static auto guessScale(Iterator ref_begin, Iterator ref_end, Iterator target_begin) ->
decltype(ref_begin->getFlux()) {
139 decltype(ref_begin->getFlux()) nom = 0., den = 0.;
141 for (
auto ri = ref_begin, ti = target_begin; ri != ref_end; ++ri, ++ti) {
142 nom += (ti->getFlux() * ti->getFlux());
143 den += (ri->getFlux() * ri->getFlux());
155 template <
typename Scale,
typename Iterator>
156 static auto daDistance(Scale scale, Iterator ref_begin, Iterator ref_end, Iterator target_begin)
157 ->
decltype(ref_begin->getFlux()) {
158 decltype(ref_begin->getFlux()) den = 0., nom_sum_sqr = 0., nom_sum_prod = 0.;
160 for (
auto ri = ref_begin, ti = target_begin; ri != ref_end; ++ri, ++ti) {
161 nom_sum_sqr += ri->getFlux() * ri->getFlux();
162 nom_sum_prod += ri->getFlux() * ti->getFlux();
163 den += (ti->getFlux() - scale * ri->getFlux()) * (ti->getFlux() - scale * ri->getFlux());
166 return (scale * nom_sum_sqr - nom_sum_prod) /
std::sqrt(den);
static auto daDistance(Scale scale, Iterator ref_begin, Iterator ref_end, Iterator target_begin) -> decltype(ref_begin->getFlux())
static auto guessScale(Iterator ref_begin, Iterator ref_end, Iterator target_begin) -> decltype(ref_begin->getFlux())
static auto distance(Scale scale, Iterator ref_begin, Iterator ref_end, Iterator target_begin) -> decltype(ref_begin->getFlux())
static auto guessScale(Iterator ref_begin, Iterator ref_end, Iterator target_begin) -> decltype(ref_begin->getFlux())
static auto daDistance(Scale scale, Iterator ref_begin, Iterator ref_end, Iterator target_begin) -> decltype(ref_begin->getFlux())
static auto distance(Scale scale, Iterator ref_begin, Iterator ref_end, Iterator target_begin) -> decltype(ref_begin->getFlux())