SourceXtractorPlusPlus
0.22
SourceXtractor++, the next generation SExtractor
Loading...
Searching...
No Matches
ModelFitting
ModelFitting
Models
_impl
CircularlySymmetricModelComponent.icpp
Go to the documentation of this file.
1
22
23
#include <utility>
// for std::forward
24
#include <cmath>
// for std::sqrt, std::cos, std::sin
25
#include <tuple>
// for std::tie
26
#include <functional>
// for std::ref
27
28
namespace
ModelFitting
{
29
30
template
<
typename
Profile>
31
template
<
typename
... ProfileParameters>
32
CircularlySymmetricModelComponent<Profile>::CircularlySymmetricModelComponent
(
33
std::unique_ptr<SharpRegionManager>
sharp_manager,
34
ProfileParameters&&... proj_parameters)
35
:
m_sharp_manager
{
std
::
move
(sharp_manager)},
36
m_profile
(
std
::
forward
<ProfileParameters>(proj_parameters)...) {
37
}
38
39
template
<
typename
Profile>
40
CircularlySymmetricModelComponent<Profile>::~CircularlySymmetricModelComponent
() =
default
;
41
42
template
<
typename
Profile>
43
double
CircularlySymmetricModelComponent<Profile>::getValue
(
double
x,
double
y) {
44
return
m_profile
(
std::sqrt
(x*x + y*y));
45
}
46
47
template
<
typename
Profile>
48
void
CircularlySymmetricModelComponent<Profile>::updateRasterizationInfo
(
49
double
scale,
double
r_max) {
50
m_sharp_manager
->updateRasterizationInfo(scale, r_max,
std::ref
(
m_profile
));
51
}
52
53
template
<
typename
Profile>
54
auto
CircularlySymmetricModelComponent<Profile>::getSharpSampling
()
55
->
std::vector<ModelSample>
{
56
std::vector<ModelSample>
result {};
57
double
r1 {0.};
58
for
(
double
r2=0.;
m_sharp_manager
->insideSharpRegion(r2); r1=r2) {
59
int
angle_no {0};
60
std::tie
(r2, angle_no) =
m_sharp_manager
->nextRadiusAndAngleNo(r1);
61
double
r_half = (r1 + r2) / 2.;
62
double
area = M_PI * (r2*r2 - r1*r1);
63
double
integral =
m_profile
(r_half) * area / angle_no;
64
double
angle_step = 2 * M_PI / angle_no;
65
for
(
double
angle=0.; angle_no!=0; --angle_no, angle+=angle_step) {
66
double
x = r_half *
std::cos
(angle);
67
double
y = r_half *
std::sin
(angle);
68
result.emplace_back(x, y, integral);
69
}
70
}
71
return
result;
72
}
73
74
template
<
typename
Profile>
75
bool
CircularlySymmetricModelComponent<Profile>:: insideSharpRegion
(
double
x,
double
y) {
76
return
m_sharp_manager
->insideSharpRegion(
std::sqrt
(x*x + y*y));
77
}
78
79
}
// end of namespace ModelFitting
ModelFitting::CircularlySymmetricModelComponent::m_sharp_manager
std::unique_ptr< SharpRegionManager > m_sharp_manager
Definition
CircularlySymmetricModelComponent.h:68
ModelFitting::CircularlySymmetricModelComponent::getSharpSampling
virtual std::vector< ModelSample > getSharpSampling()
Definition
CircularlySymmetricModelComponent.icpp:54
ModelFitting::CircularlySymmetricModelComponent::insideSharpRegion
virtual bool insideSharpRegion(double x, double y)
Definition
CircularlySymmetricModelComponent.icpp:75
ModelFitting::CircularlySymmetricModelComponent::~CircularlySymmetricModelComponent
virtual ~CircularlySymmetricModelComponent()
ModelFitting::CircularlySymmetricModelComponent::updateRasterizationInfo
virtual void updateRasterizationInfo(double scale, double r_max)
Definition
CircularlySymmetricModelComponent.icpp:48
ModelFitting::CircularlySymmetricModelComponent::CircularlySymmetricModelComponent
CircularlySymmetricModelComponent(std::unique_ptr< SharpRegionManager > sharp_manager, ProfileParameters &&... proj_parameters)
Definition
CircularlySymmetricModelComponent.icpp:32
ModelFitting::CircularlySymmetricModelComponent::m_profile
Profile m_profile
Definition
CircularlySymmetricModelComponent.h:69
ModelFitting::CircularlySymmetricModelComponent::getValue
virtual double getValue(double x, double y)
Definition
CircularlySymmetricModelComponent.icpp:43
std::cos
T cos(T... args)
std::forward
T forward(T... args)
std::move
T move(T... args)
ModelFitting
Definition
DataVsModelResiduals.icpp:23
std
STL namespace.
std::ref
T ref(T... args)
std::sin
T sin(T... args)
std::sqrt
T sqrt(T... args)
std::tie
T tie(T... args)
std::unique_ptr
std::vector
Generated by
1.13.2