SourceXtractorPlusPlus  0.19
SourceXtractor++, the next generation SExtractor
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 
35 namespace 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 }
const PropertyType & getProperty(unsigned int index=0) const
Convenience template method to call getProperty() with a more user-friendly syntax.
SeFloat32 SeFloat
Definition: Types.h:32
The centroid of all the pixels in the source, weighted by their DetectionImage pixel values...
Definition: PixelCentroid.h:37
T atan2(T...args)
T fabs(T...args)
The values of a Source&#39;s pixels in the detection image. They are returned as a vector in the same ord...
T sqrt(T...args)
The SourceInterface is an abstract &quot;source&quot; that has properties attached to it.
void computeProperties(SourceInterface &source) const override
Computes one or more properties for the Source.