SourceXtractorPlusPlus 1.0.3
SourceXtractor++, the next generation SExtractor
Loading...
Searching...
No Matches
ErrorEllipseTask.cpp
Go to the documentation of this file.
1
17/*
18 * ErrorEllipseTask.cpp
19 *
20 * Created on: Feb 11 2022
21 * Author: mkuemmel
22 */
23
24#include <iostream>
25
32
34
35namespace SourceXtractor {
36
38 const auto& pixel_variances = source.getProperty<DetectionFramePixelValues>().getVariances();
39 const auto& centroid_x = source.getProperty<PixelCentroid>().getCentroidX();
40 const auto& centroid_y = source.getProperty<PixelCentroid>().getCentroidY();
41 const auto& coordinates = source.getProperty<PixelCoordinateList>().getCoordinateList();
42 auto total_intensity = source.getProperty<ShapeParameters>().getIntensity();
43 auto singu = source.getProperty<ShapeParameters>().getSinguFlag();
44
45 SeFloat x_2_error = 0.0;
46 SeFloat y_2_error = 0.0;
47 SeFloat x_y_error = 0.0;
48
49 SeFloat total_variance = 0;
50
51 auto j = pixel_variances.begin();
52 for (auto pixel_coord : coordinates) {
53 SeFloat variance = *j++;
54 SeFloat x_pos = pixel_coord.m_x - centroid_x;
55 SeFloat y_pos = pixel_coord.m_y - centroid_y;
56
57 x_2_error += x_pos * x_pos * variance;
58 y_2_error += y_pos * y_pos * variance;
59 x_y_error += x_pos * y_pos * variance;
60
61 total_variance += variance;
62 }
63
64 SeFloat total_intensity_2 = total_intensity * total_intensity;
65 x_2_error /= total_intensity_2;
66 y_2_error /= total_intensity_2;
67 x_y_error /= total_intensity_2;
68
69 //esum *= 0.08333/flux2; // from the original SE2 code
70 total_variance *= 0.08333/total_intensity_2;
71 // handle fully correlated x/y
72 if (singu && (x_2_error*y_2_error-x_y_error*x_y_error)<total_variance*total_variance) {
73 x_2_error += total_variance;
74 y_2_error += total_variance;
75 }
76
77 /*------------------------- Error ellipse parameters ------------------------*/
78 /* if (FLAG(obj2.poserr_a))
79 {
80 double pmx2,pmy2,temp,theta;
81
82 if (fabs(temp=obj->poserr_mx2-obj->poserr_my2) > 0.0)
83 theta = atan2(2.0 * obj->poserr_mxy,temp) / 2.0;
84 else
85 theta = PI/4.0;
86
87 temp = sqrt(0.25*temp*temp+obj->poserr_mxy*obj->poserr_mxy);
88 pmy2 = pmx2 = 0.5*(obj->poserr_mx2+obj->poserr_my2);
89 pmx2+=temp;
90 pmy2-=temp;
91
92 obj2->poserr_a = (float)sqrt(pmx2);
93 obj2->poserr_b = (float)sqrt(pmy2);
94 obj2->poserr_theta = theta*180.0/PI;
95 }
96 */
97
98 // angle of the error ellipse
99 SeFloat theta_error, a_error, b_error;
100 SeFloat temp_error = fabs(x_2_error - y_2_error);
101 if (temp_error>0.0)
102 theta_error = atan2(2.0*x_y_error, temp_error); // when dividing by 2.0 as in SE2 the range is -45 < theta_error < 45 which is smaller than in SE2
103 else
104 theta_error = M_PI /4.0;
105
106 // major/minor axis for the error ellipse
107 temp_error = sqrt(0.25*temp_error*temp_error+x_y_error*x_y_error);
108 a_error = 0.5*(x_2_error+y_2_error);
109 b_error = a_error;
110 a_error = sqrt(a_error+temp_error);
111 b_error = sqrt(b_error-temp_error);
112
113 // set the property
114 source.setProperty<ErrorEllipse>(a_error, b_error, theta_error, x_2_error, y_2_error, x_y_error);
115}
116
117
118}
T atan2(T... args)
The values of a Source's pixels in the detection image. They are returned as a vector in the same ord...
void computeProperties(SourceInterface &source) const override
Computes one or more properties for the Source.
The centroid of all the pixels in the source, weighted by their DetectionImage pixel values.
The SourceInterface is an abstract "source" that has properties attached to it.
const PropertyType & getProperty(unsigned int index=0) const
Convenience template method to call getProperty() with a more user-friendly syntax.
T fabs(T... args)
SeFloat32 SeFloat
Definition Types.h:32
T sqrt(T... args)