SourceXtractorPlusPlus 1.0.3
SourceXtractor++, the next generation SExtractor
Loading...
Searching...
No Matches
CompactSersicModel.icpp
Go to the documentation of this file.
1/*
2 * CompactSersicModel.icpp
3 *
4 * Created on: Jul 25, 2019
5 * Author: mschefer
6 */
7
8#include <math.h>
9
10namespace ModelFitting {
11
12template<typename ImageType>
25
26template<typename ImageType>
27double CompactSersicModel<ImageType>::getValue(double x, double y) const {
28 SersicModelEvaluator model_eval;
29 model_eval.transform = getCombinedTransform(1.0);
30 model_eval.i0 = m_i0->getValue();
31 model_eval.k = m_k->getValue();
32 model_eval.n = m_n->getValue();
33 model_eval.max_r_sqr = 1e30;
34
35 auto area_correction = (1.0 / fabs(m_jacobian[0] * m_jacobian[3] - m_jacobian[1] * m_jacobian[2]));
36 return model_eval.evaluateModel(x, y) * area_correction;
37}
38
39
40template<typename ImageType>
42 using Traits = ImageTraits<ImageType>;
43
44 if (size_x % 2 == 0 || size_y % 2 == 0) {
45 throw Elements::Exception() << "Rasterized image dimensions must be odd numbers "
46 << "but got (" << size_x << ',' << size_y << ")";
47 }
48
49 // Add a 4 pixels border to prevent cropping from Lanczos resize
50 ImageType image = Traits::factory(size_x+8, size_y+8);
51
52 auto combined_tranform = getCombinedTransform(pixel_scale);
53
54 SersicModelEvaluator model_eval;
55 model_eval.transform = combined_tranform;
56 model_eval.i0 = m_i0->getValue();
57 model_eval.k = m_k->getValue();
58 model_eval.n = m_n->getValue();
59 model_eval.max_r_sqr = getMaxRadiusSqr(size_x, size_y, combined_tranform);
60
61 float area_correction = (1.0 / fabs(m_jacobian[0] * m_jacobian[3] - m_jacobian[1] * m_jacobian[2])) * pixel_scale * pixel_scale;
62
63 for (int y = 0; y < (int)size_y; ++y) {
64 int dy = y - size_y / 2;
65 for (int x = 0; x < (int)size_x; ++x) {
66 int dx = x - size_x / 2;
67 if (dx * dx + dy * dy < m_sharp_radius_squared) {
68 Traits::at(image, x+4, y+4) = adaptiveSamplePixel(model_eval, dx, dy, 7, 0.01) * area_correction;
69 } else {
70 Traits::at(image, x+4, y+4) = model_eval.evaluateModel(dx, dy) * area_correction;
71 }
72 }
73 }
74
75 renormalize(image, m_flux->getValue());
76
77 return image;
78}
79
80}
81
const double pixel_scale
Definition TestImage.cpp:74
CompactModelBase(std::shared_ptr< BasicParameter > x_scale, std::shared_ptr< BasicParameter > y_scale, std::shared_ptr< BasicParameter > rotation, double width, double height, std::shared_ptr< BasicParameter > x, std::shared_ptr< BasicParameter > y, std::tuple< double, double, double, double > transform)
void renormalize(ImageType &image, double flux) const
double getMaxRadiusSqr(std::size_t size_x, std::size_t size_y, const Mat22 &transform) const
Mat22 getCombinedTransform(double pixel_scale) const
float adaptiveSamplePixel(const ModelEvaluator &model_eval, int x, int y, unsigned int max_subsampling, float threshold=1.1) const
std::shared_ptr< BasicParameter > m_n
ImageType getRasterizedImage(double pixel_scale, std::size_t size_x, std::size_t size_y) const override
std::shared_ptr< BasicParameter > m_k
CompactSersicModel(double sharp_radius, std::shared_ptr< BasicParameter > i0, std::shared_ptr< BasicParameter > k, std::shared_ptr< BasicParameter > n, std::shared_ptr< BasicParameter > x_scale, std::shared_ptr< BasicParameter > y_scale, std::shared_ptr< BasicParameter > rotation, double width, double height, std::shared_ptr< BasicParameter > x, std::shared_ptr< BasicParameter > y, std::shared_ptr< BasicParameter > flux, std::tuple< double, double, double, double > transform)
double getValue(double x, double y) const override
std::shared_ptr< BasicParameter > m_flux
std::shared_ptr< BasicParameter > m_i0
T fabs(T... args)
T transform(T... args)