Skip to content

Commit 12bf768

Browse files
authored
Restrict model fitting window to a disk (#596)
* test: restrict fitting area to a disk * revert change in residual block * you can't fix stupid * fitting window with checkimage WIP * Fix python configuration problem * Implement all window types * fix code factor problem * wip: add extra parameter to store x and y source size * add configuration for width and height of sources in no detect mode * minor style fixes * Added rotated ellipse * added ellipse_scale config option, fixed windows on the borders
1 parent 4b294b7 commit 12bf768

File tree

20 files changed

+523
-120
lines changed

20 files changed

+523
-120
lines changed

SEImplementation/SEImplementation/CheckImages/CheckImages.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ class CheckImages : public Configurable {
117117

118118
std::shared_ptr<WriteableImage<MeasurementImage::PixelType>> getModelFittingImage(unsigned int frame_number);
119119

120+
std::shared_ptr<WriteableImage<int>> getFittingWindowImage(unsigned int frame_number);
121+
120122
std::shared_ptr<WriteableImage<MeasurementImage::PixelType>> getPsfImage(unsigned int frame_number);
121123

122124
std::shared_ptr<WriteableImage<float>> getMLDetectionImage(unsigned int plane_number, size_t index);
@@ -186,6 +188,7 @@ class CheckImages : public Configurable {
186188
std::map<unsigned int, std::shared_ptr<WriteableImage<int>>> m_measurement_aperture_images;
187189
std::map<unsigned int, std::shared_ptr<WriteableImage<int>>> m_measurement_auto_aperture_images;
188190
std::map<unsigned int, std::shared_ptr<WriteableImage<MeasurementImage::PixelType>>> m_check_image_model_fitting, m_check_image_psf;
191+
std::map<unsigned int, std::shared_ptr<WriteableImage<int>>> m_check_image_fitting_window;
189192
std::vector<std::map<unsigned int, std::shared_ptr<WriteableImage<float>>>> m_check_image_ml_detection;
190193

191194
std::vector<std::shared_ptr<DetectionImage>> m_detection_images;
@@ -202,6 +205,7 @@ class CheckImages : public Configurable {
202205
std::vector<std::shared_ptr<CoordinateSystem>> m_coordinate_systems;
203206

204207
boost::filesystem::path m_model_fitting_image_filename;
208+
boost::filesystem::path m_fitting_window_image_filename;
205209
boost::filesystem::path m_residual_filename;
206210
boost::filesystem::path m_background_filename;
207211
boost::filesystem::path m_variance_filename;

SEImplementation/SEImplementation/Configuration/CheckImagesConfig.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ class CheckImagesConfig : public Euclid::Configuration::Configuration {
4545
return m_model_fitting_filename;
4646
}
4747

48+
const std::string& getFittingWindowImageFilename() const {
49+
return m_fitting_window_filename;
50+
}
51+
4852
const std::string& getModelFittingResidualFilename() const {
4953
return m_model_fitting_residual_filename;
5054
}
@@ -112,6 +116,7 @@ class CheckImagesConfig : public Euclid::Configuration::Configuration {
112116
private:
113117

114118
std::string m_model_fitting_filename;
119+
std::string m_fitting_window_filename;
115120
std::string m_model_fitting_residual_filename;
116121
std::string m_background_filename;
117122
std::string m_variance_filename;

SEImplementation/SEImplementation/Configuration/ModelFittingConfig.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,14 @@
2323
#define _SEIMPLEMENTATION_CONFIGURATION_MODELFITTINGCONFIG_H
2424

2525
#include <vector>
26+
2627
#include <SEImplementation/Plugin/FlexibleModelFitting/FlexibleModelFittingParameter.h>
2728
#include <SEImplementation/Plugin/FlexibleModelFitting/FlexibleModelFittingModel.h>
2829
#include <SEImplementation/Plugin/FlexibleModelFitting/FlexibleModelFittingFrame.h>
2930
#include <SEImplementation/Plugin/FlexibleModelFitting/FlexibleModelFittingPrior.h>
31+
32+
#include <SEImplementation/Plugin/FlexibleModelFitting/FlexibleModelFittingIterativeTask.h>
33+
3034
#include <Configuration/Configuration.h>
3135

3236
namespace SourceXtractor {
@@ -60,6 +64,8 @@ class ModelFittingConfig : public Euclid::Configuration::Configuration {
6064
int getMetaIterations() const { return m_meta_iterations; }
6165
double getDeblendFactor() const { return m_deblend_factor; }
6266
double getMetaIterationStop() const { return m_meta_iteration_stop; }
67+
FlexibleModelFittingIterativeTask::WindowType getWindowType() const { return m_window_type; }
68+
double getEllipseScale() const { return m_ellipse_scale; }
6369

6470
private:
6571
std::string m_least_squares_engine;
@@ -69,6 +75,9 @@ class ModelFittingConfig : public Euclid::Configuration::Configuration {
6975
int m_meta_iterations { 3 };
7076
double m_deblend_factor { 1.0 };
7177
double m_meta_iteration_stop { 0.0001 };
78+
FlexibleModelFittingIterativeTask::WindowType m_window_type
79+
{ FlexibleModelFittingIterativeTask::WindowType::RECTANGLE };
80+
double m_ellipse_scale { 3.0 };
7281

7382
std::map<int, std::shared_ptr<FlexibleModelFittingParameter>> m_parameters;
7483
std::map<int, std::shared_ptr<FlexibleModelFittingModel>> m_models;

SEImplementation/SEImplementation/Plugin/AssocMode/AssocMode.h

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,15 @@ class AssocMode : public Property {
4040
*/
4141
virtual ~AssocMode() = default;
4242

43-
AssocMode() : m_has_assoc(false), m_assoc_data(std::vector<size_t>({0})), m_ref_frame_pixel_radius(1), m_group_id(0) {
43+
AssocMode() : m_has_assoc(false), m_assoc_data(std::vector<size_t>({0})),
44+
m_ref_frame_pixel_width(1), m_ref_frame_pixel_height(1), m_group_id(0) {
4445
}
4546

4647
AssocMode(bool has_assoc, const std::vector<double>& assoc_data,
47-
double ref_frame_pixel_radius=0.0, unsigned int group_id=0) :
48+
double ref_frame_pixel_width=0.0, double ref_frame_pixel_height=0.0, unsigned int group_id=0) :
4849
m_has_assoc(has_assoc), m_assoc_data(std::vector<size_t>({assoc_data.size()})),
49-
m_ref_frame_pixel_radius(ref_frame_pixel_radius), m_group_id(group_id) {
50+
m_ref_frame_pixel_width(ref_frame_pixel_width), m_ref_frame_pixel_height(ref_frame_pixel_height),
51+
m_group_id(group_id) {
5052
for (size_t i=0; i<assoc_data.size(); i++) {
5153
m_assoc_data.at(i) = assoc_data[i];
5254
}
@@ -60,8 +62,12 @@ class AssocMode : public Property {
6062
return m_assoc_data;
6163
}
6264

63-
double getRefFramePixelRadius() const {
64-
return m_ref_frame_pixel_radius;
65+
double getRefFramePixelWidth() const {
66+
return m_ref_frame_pixel_width;
67+
}
68+
69+
double getRefFramePixelHeight() const {
70+
return m_ref_frame_pixel_height;
6571
}
6672

6773
unsigned int getGroupId() const {
@@ -72,7 +78,9 @@ class AssocMode : public Property {
7278
bool m_has_assoc;
7379

7480
NdArray<SeFloat> m_assoc_data;
75-
double m_ref_frame_pixel_radius;
81+
//double m_ref_frame_pixel_radius;
82+
double m_ref_frame_pixel_width;
83+
double m_ref_frame_pixel_height;
7684
unsigned int m_group_id;
7785
};
7886

SEImplementation/SEImplementation/Plugin/AssocMode/AssocModeConfig.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,10 @@ class AssocModeConfig : public Euclid::Configuration::Configuration {
6060
WorldCoordinate world_coord;
6161
double weight;
6262
std::vector<double> assoc_columns;
63-
double source_radius_pixels;
63+
64+
double source_pixel_width;
65+
double source_pixel_height;
66+
6467
unsigned int group_id;
6568
};
6669

@@ -107,7 +110,8 @@ class AssocModeConfig : public Euclid::Configuration::Configuration {
107110
AssocMode m_assoc_mode;
108111
double m_assoc_radius;
109112
double m_default_pixel_size;
110-
int m_pixel_size_column;
113+
int m_pixel_width_column;
114+
int m_pixel_height_column;
111115
int m_group_id_column;
112116

113117
std::vector<std::vector<CatalogEntry>> m_catalogs;

SEImplementation/SEImplementation/Plugin/FlexibleModelFitting/FlexibleModelFittingIterativeTask.h

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@
2626

2727
#include "SEFramework/Image/VectorImage.h"
2828
#include "SEFramework/Task/GroupTask.h"
29-
30-
//#include "SEImplementation/Configuration/SamplingConfig.h"
29+
#include "SEFramework/Source/SourceFlags.h"
3130

3231
#include "SEImplementation/Plugin/FlexibleModelFitting/FlexibleModelFittingParameter.h"
3332
#include "SEImplementation/Plugin/FlexibleModelFitting/FlexibleModelFittingFrame.h"
@@ -38,6 +37,18 @@ namespace SourceXtractor {
3837
class FlexibleModelFittingIterativeTask : public GroupTask {
3938

4039
public:
40+
enum class WindowType {
41+
RECTANGLE = 1,
42+
SQUARE_MIN = 2,
43+
SQUARE_MAX = 3,
44+
SQUARE_AREA = 4,
45+
DISK_MIN = 5,
46+
DISK_MAX = 6,
47+
DISK_AREA = 7,
48+
ALIGNED_ELLIPSE = 8,
49+
ROTATED_ELLIPSE = 9
50+
};
51+
4152
FlexibleModelFittingIterativeTask(const std::string &least_squares_engine,
4253
unsigned int max_iterations, double modified_chi_squared_scale,
4354
std::vector<std::shared_ptr<FlexibleModelFittingParameter>> parameters,
@@ -47,7 +58,9 @@ class FlexibleModelFittingIterativeTask : public GroupTask {
4758
int meta_iterations=3,
4859
double deblend_factor=1.0,
4960
double meta_iteration_stop=0.0001,
50-
size_t max_fit_size=100
61+
size_t max_fit_size=100,
62+
WindowType window_type = WindowType::RECTANGLE,
63+
double ellipse_scale=3.0
5164
);
5265

5366
virtual ~FlexibleModelFittingIterativeTask();
@@ -75,9 +88,21 @@ class FlexibleModelFittingIterativeTask : public GroupTask {
7588
std::vector<SourceState> source_states;
7689
};
7790

91+
struct FittingEllipse {
92+
double m_x;
93+
double m_y;
94+
double m_a;
95+
double m_b;
96+
double m_theta;
97+
};
98+
99+
PixelRectangle getFittingRect(SourceInterface& source, int frame_index) const;
78100
std::shared_ptr<VectorImage<SeFloat>> createDeblendImage(
79101
SourceGroupInterface& group, SourceInterface& source, int source_index,
80102
std::shared_ptr<FlexibleModelFittingFrame> frame, FittingState& state) const;
103+
std::shared_ptr<VectorImage<SeFloat>> createWeightImage(SourceInterface& source, int frame_index) const;
104+
bool isFrameValid(SourceInterface& source, int frame_index) const;
105+
std::shared_ptr<VectorImage<SeFloat>> createImageCopy(SourceInterface& source, int frame_index) const;
81106

82107
void fitSource(SourceGroupInterface& group, SourceInterface& source, int index, FittingState& state) const;
83108
void updateCheckImages(SourceGroupInterface& group, double pixel_scale, FittingState& state) const;
@@ -97,6 +122,12 @@ class FlexibleModelFittingIterativeTask : public GroupTask {
97122
SeFloat avg_reduced_chi_squared, SeFloat duration, unsigned int iterations, unsigned int stop_reason, Flags flags,
98123
ModelFitting::LeastSquareSummary solution,
99124
int index, FittingState& state) const;
125+
FlexibleModelFittingIterativeTask::FittingEllipse getFittingEllipse(SourceInterface& source, int frame_index) const;
126+
PixelRectangle getEllipseRect(FittingEllipse ellipse) const;
127+
FlexibleModelFittingIterativeTask::FittingEllipse transformEllipse(
128+
FittingEllipse ellipse, SourceInterface& source, int frame_index) const;
129+
PixelRectangle clipFittingRect(PixelRectangle fitting_rect, SourceInterface& source, int frame_index) const;
130+
PixelRectangle getUnclippedFittingRect(SourceInterface& source, int frame_index) const;
100131

101132
// Task configuration
102133
std::string m_least_squares_engine;
@@ -111,6 +142,9 @@ class FlexibleModelFittingIterativeTask : public GroupTask {
111142
std::vector<std::shared_ptr<FlexibleModelFittingParameter>> m_parameters;
112143
std::vector<std::shared_ptr<FlexibleModelFittingFrame>> m_frames;
113144
std::vector<std::shared_ptr<FlexibleModelFittingPrior>> m_priors;
145+
146+
WindowType m_window_type { WindowType::RECTANGLE };
147+
double m_ellipse_scale = 3.0;
114148
};
115149

116150
}

SEImplementation/SEImplementation/Plugin/FlexibleModelFitting/FlexibleModelFittingTaskFactory.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626

2727
#include "SEFramework/Task/TaskFactory.h"
2828

29-
#include "SEImplementation/Plugin/FlexibleModelFitting/FlexibleModelFittingTask.h"
29+
#include "SEImplementation/Plugin/FlexibleModelFitting/FlexibleModelFittingIterativeTask.h"
3030

3131
namespace SourceXtractor {
3232

@@ -52,6 +52,8 @@ class FlexibleModelFittingTaskFactory : public TaskFactory {
5252
int m_meta_iterations { 3 };
5353
double m_deblend_factor { 1.0 };
5454
double m_meta_iteration_stop { 0.0001 };
55+
FlexibleModelFittingIterativeTask::WindowType m_window_type { FlexibleModelFittingIterativeTask::WindowType::RECTANGLE };
56+
double m_ellipse_scale { 3.0 };
5557

5658
std::vector<std::shared_ptr<FlexibleModelFittingParameter>> m_parameters;
5759
std::vector<std::shared_ptr<FlexibleModelFittingFrame>> m_frames;

SEImplementation/python/sourcextractor/config/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,4 @@
2626
get_flux_parameter, get_pos_parameters, get_position_angle,
2727
get_separation_angle, get_world_parameters,
2828
get_world_position_parameters, pixel_to_world_coordinate,
29-
print_model_fitting_info, radius_to_wc_angle, ModelFitting)
29+
print_model_fitting_info, radius_to_wc_angle, ModelFitting, WindowType)

SEImplementation/python/sourcextractor/config/compat.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,3 +119,14 @@ def set_modified_chi_squared_scale(scale):
119119
@_compat_doc_helper(copy_doc_from=ModelFitting.use_iterative_fitting)
120120
def use_iterative_fitting(use):
121121
global_measurement_config.model_fitting.use_iterative_fitting(use)
122+
123+
124+
@_compat_doc_helper(copy_doc_from=ModelFitting.set_window_type)
125+
def set_window_type(window_type):
126+
global_measurement_config.model_fitting.set_window_type(window_type)
127+
128+
@_compat_doc_helper(copy_doc_from=ModelFitting.set_ellipse_scale)
129+
def set_ellipse_scale(ellipse_scale):
130+
global_measurement_config.model_fitting.set_ellipse_scale(ellipse_scale)
131+
132+

SEImplementation/python/sourcextractor/config/model_fitting.py

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1034,6 +1034,16 @@ def wc_ratio_func(x, y, radius, angle, ratio):
10341034

10351035
return ra, dec, wc_rad, wc_angle, wc_ratio
10361036

1037+
class WindowType(Enum):
1038+
RECTANGLE = 1
1039+
SQUARE_MIN = 2
1040+
SQUARE_MAX = 3
1041+
SQUARE_AREA = 4
1042+
DISK_MIN = 5
1043+
DISK_MAX = 6
1044+
DISK_AREA = 7
1045+
ALIGNED_ELLIPSE = 8
1046+
ROTATED_ELLIPSE = 9
10371047

10381048
class ModelFitting:
10391049
def __init__(self):
@@ -1050,7 +1060,9 @@ def __init__(self):
10501060
self.onnx_model_dict = {}
10511061
self.params_dict = {"max_iterations": 200, "modified_chi_squared_scale": 10, "engine": "",
10521062
"use_iterative_fitting": True, "meta_iterations": 5,
1053-
"deblend_factor": 0.95, "meta_iteration_stop": 0.0001}
1063+
"deblend_factor": 0.95, "meta_iteration_stop": 0.0001,
1064+
"window_type": WindowType.RECTANGLE, "ellipse_scale": 3.0
1065+
}
10541066

10551067
def _set_model_to_frames(self, group, model):
10561068
for x in group:
@@ -1217,6 +1229,31 @@ def set_meta_iteration_stop(self, meta_iteration_stop):
12171229
12181230
"""
12191231
self.params_dict["meta_iteration_stop"] = meta_iteration_stop
1232+
1233+
def set_window_type(self, window_type):
1234+
"""
1235+
Parameters
1236+
----------
1237+
1238+
window_type : WindowType
1239+
specify the type of model fitting window
1240+
1241+
"""
1242+
if type(window_type) != WindowType:
1243+
raise TypeError("Window type must be a WindowType enum value!")
1244+
1245+
self.params_dict["window_type"] = window_type
1246+
1247+
def set_ellipse_scale(self, ellipse_scale):
1248+
"""
1249+
Parameters
1250+
----------
1251+
1252+
ellipse_scale : double
1253+
specify scaling of elliptic footprints
1254+
1255+
"""
1256+
self.params_dict["ellipse_scale"] = ellipse_scale
12201257

12211258

12221259
def print_model_fitting_info(group, show_params=False, prefix='', file=sys.stderr):

0 commit comments

Comments
 (0)