LSST Applications g013ef56533+d2224463a4,g199a45376c+0ba108daf9,g19c4beb06c+9f335b2115,g1fd858c14a+2459ca3e43,g210f2d0738+2d3d333a78,g262e1987ae+abbb004f04,g2825c19fe3+eedc38578d,g29ae962dfc+0cb55f06ef,g2cef7863aa+aef1011c0b,g35bb328faa+8c5ae1fdc5,g3fd5ace14f+19c3a54948,g47891489e3+501a489530,g4cdb532a89+a047e97985,g511e8cfd20+ce1f47b6d6,g53246c7159+8c5ae1fdc5,g54cd7ddccb+890c8e1e5d,g5fd55ab2c7+951cc3f256,g64539dfbff+2d3d333a78,g67b6fd64d1+501a489530,g67fd3c3899+2d3d333a78,g74acd417e5+0ea5dee12c,g786e29fd12+668abc6043,g87389fa792+8856018cbb,g89139ef638+501a489530,g8d7436a09f+5ea4c44d25,g8ea07a8fe4+81eaaadc04,g90f42f885a+34c0557caf,g9486f8a5af+165c016931,g97be763408+d5e351dcc8,gbf99507273+8c5ae1fdc5,gc2a301910b+2d3d333a78,gca7fc764a6+501a489530,gce8aa8abaa+8c5ae1fdc5,gd7ef33dd92+501a489530,gdab6d2f7ff+0ea5dee12c,ge410e46f29+501a489530,geaed405ab2+e3b4b2a692,gf9a733ac38+8c5ae1fdc5,w.2025.41
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)