34 namespace SourceXtractor {
51 int nb_of_pixels_above_half = 0;
52 int nb_of_pixels = coordinates.size();
54 auto i = pixel_values.begin();
55 for (
auto pixel_coord : coordinates) {
58 if (value > half_peak_threshold) {
59 nb_of_pixels_above_half++;
62 x_2 += (pixel_coord.m_x - centroid_x) * (pixel_coord.m_x - centroid_x) * value;
63 y_2 += (pixel_coord.m_y - centroid_y) * (pixel_coord.m_y - centroid_y) * value;
64 x_y += (pixel_coord.m_x - centroid_x) * (pixel_coord.m_y - centroid_y) * value;
66 total_intensity += value;
69 x_2 /= total_intensity;
70 y_2 /= total_intensity;
71 x_y /= total_intensity;
74 if (
fabs(x_2 - y_2) > 0.0) {
75 theta =
atan2(2.0 * x_y, x_2 - y_2) / 2.0;
80 float temp = x_2 - y_2;
81 temp =
sqrt(0.25 * temp * temp + x_y * x_y);
83 SeFloat b = ((x_2 + y_2) / 2) > temp ?
sqrt((x_2 + y_2) / 2 - temp) : 0;
86 SeFloat tmp = x_2 * y_2 - x_y * x_y;
91 tmp = x_2 * y_2 - x_y * x_y;
98 SeFloat area_under_half = (double) pixel_values.size() - nb_of_pixels_above_half;
99 SeFloat t1t2 = min_value / half_peak_threshold;
105 abcor = (area_under_half > 0.0 ? area_under_half : 1.0) / (2 * M_PI * -
log(t1t2 < 1.0 ? t1t2 : 0.99) * a * b);