LSST Applications 29.1.1,g0fba68d861+94d977d4f8,g1fd858c14a+0a42b1a450,g21d47ad084+bae5d1592d,g35bb328faa+fcb1d3bbc8,g36ff55ed5b+4036fd6440,g4e0f332c67+abab7ee1ee,g53246c7159+fcb1d3bbc8,g60b5630c4e+4036fd6440,g67b6fd64d1+31de10a2f7,g72a202582f+7a25662ef1,g78460c75b0+2f9a1b4bcd,g786e29fd12+cf7ec2a62a,g86c591e316+1a75853d69,g8852436030+8220ab3cb6,g88f4e072da+7005418d1d,g89139ef638+31de10a2f7,g8b8da53e10+8f7b08dc1c,g9125e01d80+fcb1d3bbc8,g989de1cb63+31de10a2f7,g9f1445be69+4036fd6440,g9f33ca652e+fcef3ba435,ga9baa6287d+4036fd6440,ga9e4eb89a6+a41a34c2ba,gabe3b4be73+1e0a283bba,gb0b61e0e8e+d456af7c26,gb1101e3267+f17a9d70ea,gb58c049af0+f03b321e39,gb89ab40317+31de10a2f7,gce29eb0867+05ed69485a,gcf25f946ba+8220ab3cb6,gd6cbbdb0b4+11317e7a17,gd9a9a58781+fcb1d3bbc8,gde0f65d7ad+b4f50ea554,ge278dab8ac+50e2446c94,ge410e46f29+31de10a2f7,ge80e9994a3+32bb9bc1c9,gf5e32f922b+fcb1d3bbc8,gf67bdafdda+31de10a2f7
LSST Data Management Base Package
Loading...
Searching...
No Matches
linearsersicmixinterpolator.cc
Go to the documentation of this file.
1#include <algorithm>
2#include <stdexcept>
3#include <string>
4#include <vector>
5
8
10
11namespace lsst::gauss2d::fit {
12
14 : _order(order),
15 _knots(get_sersic_mix_knots(order)),
16 _sersicindex_min(_knots[0].sersicindex),
17 _sersicindex_max(_knots.back().sersicindex) {}
18
20
22 if (!((sersicindex >= _sersicindex_min) && (sersicindex <= _sersicindex_max))) {
23 throw std::invalid_argument("sersicindex=" + to_string_float(sersicindex)
24 + " !(>=" + to_string_float(_sersicindex_min)
25 + "&& <=" + to_string_float(_sersicindex_max));
26 }
27
28 if (sersicindex == _sersicindex_min)
29 return _knots[0].values;
30 else if (sersicindex == _sersicindex_max)
31 return _knots.back().values;
32
33 auto found = std::lower_bound(_knots.begin(), _knots.end(), sersicindex);
34 auto high = *found;
35 auto low = *(--found);
36
37 if (sersicindex == high.sersicindex) return high.values;
38 double frac_low = (high.sersicindex - sersicindex) / (high.sersicindex - low.sersicindex);
39 if (!((frac_low >= 0) && (frac_low <= 1))) {
40 throw std::logic_error("Got invalid frac_low=" + std::to_string(frac_low)
41 + " with n, lo, hi=" + to_string_float(sersicindex) + ","
42 + to_string_float(low.sersicindex) + "," + to_string_float(high.sersicindex));
43 }
44 double frac_high = 1 - frac_low;
45
47 result.reserve(_order);
48 for (size_t i = 0; i < _order; ++i) {
49 result.push_back(IntegralSize(frac_low * low.values[i].integral + frac_high * high.values[i].integral,
50 frac_low * low.values[i].sigma + frac_high * high.values[i].sigma));
51 }
52
53 return result;
54}
55
57 if (!((sersicindex >= _sersicindex_min) && (sersicindex <= _sersicindex_max))) {
58 throw std::invalid_argument("sersicindex=" + to_string_float(sersicindex)
59 + " !(>=" + to_string_float(_sersicindex_min)
60 + "&& <=" + to_string_float(_sersicindex_max));
61 }
62
63 auto found = sersicindex == _sersicindex_min
64 ? ++_knots.begin()
65 : ((sersicindex == _sersicindex_max)
66 ? --_knots.end()
67 : std::upper_bound(_knots.begin(), _knots.end(), sersicindex));
68 auto& high = *found;
69 auto& low = *(--found);
70
71 double dn_inv = 1. / (high.sersicindex - low.sersicindex);
72
74 result.reserve(_order);
75 for (size_t i = 0; i < _order; ++i) {
76 result.push_back(IntegralSize((high.values[i].integral - low.values[i].integral) * dn_inv,
77 (high.values[i].sigma - low.values[i].sigma) * dn_inv));
78 }
79
80 return result;
81}
82
84
86
87unsigned short LinearSersicMixInterpolator::get_order() const { return _order; }
88
89double LinearSersicMixInterpolator::get_sersicindex_min() const { return _sersicindex_min; }
90
91double LinearSersicMixInterpolator::get_sersicindex_max() const { return _sersicindex_max; }
92
94 std::string_view namespace_separator) const {
95 return type_name_str<LinearSersicMixInterpolator>(false, namespace_separator) + "("
96 + (name_keywords ? "order=" : "") + std::to_string(_order) + ")";
97}
98
102
103} // namespace lsst::gauss2d::fit
T back(T... args)
T begin(T... args)
A pair of integral - size values for a Gaussian (sub)Component.
Definition sersicmix.h:19
std::vector< IntegralSize > get_integralsizes(double sersicindex) const override
Get the vector of IntegralSize values for a given Sersic index.
LinearSersicMixInterpolator(unsigned short order=SERSICMIX_ORDER_DEFAULT)
const std::vector< SersicMixValues > & get_knots() const
The knot positions and values.
std::string str() const override
Return a brief, human-readable string representation of this.
std::string repr(bool name_keywords=false, std::string_view namespace_separator=Object::CC_NAMESPACE_SEPARATOR) const override
Return a full, callable string representation of this.
std::vector< IntegralSize > get_integralsizes_derivs(double sersicindex) const override
T lower_bound(T... args)
@ linear
Linear interpolation.
const std::vector< SersicMixValues > & get_sersic_mix_knots(unsigned short order)
Definition sersicmix.cc:50
std::string type_name_str(bool strip_namespace=false, std::string_view namespace_str=detail::NAMESPACE_SEPARATOR)
Get a string representation of an arbitrary C++ type, potentially modifying its namespace prefix.
Definition type_name.h:104
std::string to_string_float(const T value, const int precision=6, const bool scientific=true)
Definition to_string.h:15
T to_string(T... args)
T upper_bound(T... args)