LSST Applications g00d0e8bbd7+edbf708997,g03191d30f7+9ce8016dbd,g1955dfad08+0bd186d245,g199a45376c+5137f08352,g1fd858c14a+a888a50aa2,g262e1987ae+45f9aba685,g29ae962dfc+1c7d47a24f,g2cef7863aa+73c82f25e4,g35bb328faa+edbf708997,g3fd5ace14f+eed17d2c67,g47891489e3+6dc8069a4c,g53246c7159+edbf708997,g64539dfbff+c4107e45b5,g67b6fd64d1+6dc8069a4c,g74acd417e5+f452e9c21a,g786e29fd12+af89c03590,g7ae74a0b1c+a25e60b391,g7aefaa3e3d+2025e9ce17,g7cc15d900a+2d158402f9,g87389fa792+a4172ec7da,g89139ef638+6dc8069a4c,g8d4809ba88+c4107e45b5,g8d7436a09f+e96c132b44,g8ea07a8fe4+db21c37724,g98df359435+aae6d409c1,ga2180abaac+edbf708997,gac66b60396+966efe6077,gb632fb1845+88945a90f8,gbaa8f7a6c5+38b34f4976,gbf99507273+edbf708997,gca7fc764a6+6dc8069a4c,gd7ef33dd92+6dc8069a4c,gda68eeecaf+7d1e613a8d,gdab6d2f7ff+f452e9c21a,gdbb4c4dda9+c4107e45b5,ge410e46f29+6dc8069a4c,ge41e95a9f2+c4107e45b5,geaed405ab2+e194be0d2b,w.2025.47
LSST Data Management Base Package
Loading...
Searching...
No Matches
gslsersicmixinterpolator.cc
Go to the documentation of this file.
1#ifdef LSST_GAUSS2D_FIT_HAS_GSL
2
3#include <algorithm>
4#include <stdexcept>
5#include <string>
6#include <vector>
7
10
13
14namespace lsst::gauss2d::fit {
15
16GSLSersicMixInterpolator::GSLSersicMixInterpolator(unsigned short order, const InterpType interp_type_)
17 : _interp_type(interp_type_),
18 _order(order),
20 _sersicindex_min(_knots[0].sersicindex),
21 _sersicindex_max(_knots.back().sersicindex) {
22 _interps.reserve(order);
23 std::vector<double> sersics;
26 const size_t n_knots = _knots.size();
27 sersics.reserve(n_knots);
28 integrals.resize(order);
29 sigmas.resize(order);
30 for (size_t iord = 0; iord < _order; ++iord) {
31 integrals[iord].reserve(n_knots);
32 sigmas[iord].reserve(n_knots);
33 }
34 for (const auto& knot : _knots) {
35 sersics.push_back(knot.sersicindex);
36 for (size_t iord = 0; iord < _order; ++iord) {
37 const auto& integralsize = knot.values[iord];
38 integrals[iord].push_back(integralsize.integral);
39 sigmas[iord].push_back(integralsize.sigma);
40 }
41 }
42 for (size_t iord = 0; iord < _order; ++iord) {
43 _interps.push_back({std::make_unique<GSLInterpolator>(sersics, integrals[iord], _interp_type),
44 std::make_unique<GSLInterpolator>(sersics, sigmas[iord], _interp_type)});
45 }
46}
47
48GSLSersicMixInterpolator::~GSLSersicMixInterpolator() {}
49
50double GSLSersicMixInterpolator::get_final_correction() const { return _final_correction; }
51
52std::vector<IntegralSize> GSLSersicMixInterpolator::get_integralsizes(double sersicindex) const {
53 if (!((sersicindex >= _sersicindex_min) && (sersicindex <= _sersicindex_max))) {
54 throw std::invalid_argument("sersicindex=" + to_string_float(sersicindex)
55 + " not between min=" + to_string_float(_sersicindex_min)
56 + " and max=" + to_string_float(_sersicindex_max));
57 }
58
60 result.reserve(_order);
61 double sum = 0;
62 size_t max_ord = _order - correct_final_integral;
63 for (size_t i = 0; i < max_ord; ++i) {
64 const auto& interp = _interps[i];
65 double integral = interp.first->eval(sersicindex);
66 sum += integral;
67 result.push_back(IntegralSize(integral, interp.second->eval(sersicindex)));
68 }
69 if (correct_final_integral) {
70 const auto& interp = _interps[_order - 1];
71 double integral = 1.0 - sum;
72 double integral_interp = interp.first->eval(sersicindex);
73 bool interp_eq_zero = integral_interp == 0;
74 _final_correction = integral * (!interp_eq_zero) / (integral_interp + interp_eq_zero);
75 if (!(integral >= 0)) {
76 throw std::logic_error(this->str() + ".get_integralsizes(" + to_string_float(sersicindex)
77 + ") got correction=" + to_string_float(_final_correction)
78 + " from integral=" + to_string_float(integral) + " !>=0)");
79 }
80 result.push_back(IntegralSize(integral, interp.second->eval(sersicindex)));
81 } else {
82 // An overly cautious reset of the value since the option is mutable.
83 _final_correction = 1.;
84 }
85
86 return result;
87}
88
89std::vector<IntegralSize> GSLSersicMixInterpolator::get_integralsizes_derivs(double sersicindex) const {
90 if (!((sersicindex >= _sersicindex_min) && (sersicindex <= _sersicindex_max))) {
91 throw std::invalid_argument("sersicindex=" + to_string_float(sersicindex)
92 + " not between min=" + to_string_float(_sersicindex_min)
93 + " and max=" + to_string_float(_sersicindex_max));
94 }
95
97 result.reserve(_order);
98 size_t max_ord = _order - correct_final_integral;
99 for (size_t i = 0; i < max_ord; ++i) {
100 const auto& interp = _interps[i];
101 result.push_back(
102 IntegralSize(interp.first->eval_deriv(sersicindex), interp.second->eval_deriv(sersicindex)));
103 }
104 if (correct_final_integral) {
105 const auto& interp = _interps[max_ord];
106 result.push_back(IntegralSize(correct_final_integral * interp.first->eval_deriv(sersicindex),
107 interp.second->eval_deriv(sersicindex)));
108 } else {
109 _final_correction = 1.;
110 }
111
112 return result;
113}
114
115InterpType GSLSersicMixInterpolator::get_interptype() const { return _interp_type; }
116
117const std::vector<SersicMixValues>& GSLSersicMixInterpolator::get_knots() const { return _knots; }
118
119unsigned short GSLSersicMixInterpolator::get_order() const { return _order; }
120
121double GSLSersicMixInterpolator::get_sersicindex_min() const { return _sersicindex_min; }
122double GSLSersicMixInterpolator::get_sersicindex_max() const { return _sersicindex_max; }
123
124std::string GSLSersicMixInterpolator::repr(bool name_keywords, std::string_view namespace_separator) const {
125 return std::string("GSLSersicMixInterpolator(") + (name_keywords ? "order=" : "") + std::to_string(_order)
126 + ")";
127}
128
129std::string GSLSersicMixInterpolator::str() const {
130 return "GSLSersicMixInterpolator(order=" + std::to_string(_order) + ")";
131}
132} // namespace lsst::gauss2d::fit
133
134#endif // #ifdef LSST_GAUSS2D_FIT_HAS_GSL
const std::vector< SersicMixValues > & get_sersic_mix_knots(unsigned short order)
Definition sersicmix.cc:50
std::string to_string_float(const T value, const int precision=6, const bool scientific=true)
Definition to_string.h:15
T push_back(T... args)
T reserve(T... args)
T resize(T... args)
T size(T... args)
T to_string(T... args)