SourceXtractorPlusPlus
0.21
SourceXtractor++, the next generation SExtractor
Loading...
Searching...
No Matches
ModelFitting
src
lib
Models
TransformModelComponent.cpp
Go to the documentation of this file.
1
17
/*
18
* TransformModelComponent.cpp
19
*
20
* Created on: Jun 22, 2018
21
* Author: mschefer
22
*/
23
24
#include <cmath>
25
#include <assert.h>
26
#include "
ModelFitting/Models/TransformModelComponent.h
"
27
28
namespace
ModelFitting
{
29
30
TransformModelComponent::TransformModelComponent
(
31
std::unique_ptr<ModelComponent>
component
,
std::tuple<double, double, double, double>
transform
)
32
: m_component(
std
::
move
(
component
)) {
33
34
m_transform
[0] =
std::get<0>
(
transform
);
35
m_transform
[1] =
std::get<1>
(
transform
);
36
m_transform
[2] =
std::get<2>
(
transform
);
37
m_transform
[3] =
std::get<3>
(
transform
);
38
39
double
inv_det
= 1. / (
m_transform
[0] *
m_transform
[3] -
m_transform
[2] *
m_transform
[1]);
40
m_inv_transform
[0] =
m_transform
[3] *
inv_det
;
m_inv_transform
[1] = -
m_transform
[1] *
inv_det
;
41
m_inv_transform
[2] = -
m_transform
[2] *
inv_det
;
m_inv_transform
[3] =
m_transform
[0] *
inv_det
;
42
43
assert
(
m_transform
[0] *
m_inv_transform
[0] +
m_transform
[1] *
m_inv_transform
[2] >= 1 - 1e-8);
44
assert
(
m_transform
[0] *
m_inv_transform
[1] +
m_transform
[1] *
m_inv_transform
[3] <= 1e-8);
45
assert
(
m_transform
[2] *
m_inv_transform
[0] +
m_transform
[3] *
m_inv_transform
[2] <= 1e-8);
46
assert
(
m_transform
[2] *
m_inv_transform
[1] +
m_transform
[3] *
m_inv_transform
[3] >= 1 - 1e-8);
47
}
48
49
TransformModelComponent::TransformModelComponent
(
TransformModelComponent
&&
other
) {
50
for
(
int
i
= 0;
i
< 4;
i
++) {
51
m_transform
[
i
] =
other
.m_transform[
i
];
52
m_inv_transform
[
i
] =
other
.m_inv_transform[
i
];
53
}
54
}
55
56
TransformModelComponent::~TransformModelComponent
() {
57
}
58
59
double
TransformModelComponent::getValue
(
double
x
,
double
y
) {
60
auto
area_correction
=
fabs
(
m_transform
[0] *
m_transform
[3] -
m_transform
[1] *
m_transform
[2]);
61
62
double
new_x
=
x
*
m_inv_transform
[0] +
y
*
m_inv_transform
[2];
63
double
new_y
=
x
*
m_inv_transform
[1] +
y
*
m_inv_transform
[3];
64
return
m_component
->getValue(
new_x
,
new_y
) /
area_correction
;
65
}
66
67
void
TransformModelComponent::updateRasterizationInfo
(
double
scale,
double
r_max
) {
68
double
x_scale
=
std::sqrt
(
m_transform
[0] *
m_transform
[0] +
m_transform
[1] *
m_transform
[1]);
69
double
y_scale
=
std::sqrt
(
m_transform
[2] *
m_transform
[2] +
m_transform
[3] *
m_transform
[3]);
70
double
new_scale
= scale /
std::min
(
x_scale
,
y_scale
);
71
double
new_r_max
=
r_max
/
std::min
(
x_scale
,
y_scale
);
72
m_component
->updateRasterizationInfo(
new_scale
,
new_r_max
);
73
}
74
75
std::vector<TransformModelComponent::ModelSample>
TransformModelComponent::getSharpSampling
() {
76
std::vector<ModelSample>
result
=
m_component
->getSharpSampling();
77
for
(
auto
&
sample
:
result
) {
78
double
new_x
=
std::get<0>
(
sample
) *
m_transform
[0] +
std::get<1>
(
sample
) *
m_transform
[2];
79
double
new_y
=
std::get<0>
(
sample
) *
m_transform
[1] +
std::get<1>
(
sample
) *
m_transform
[3];
80
std::get<0>
(
sample
) =
new_x
;
81
std::get<1>
(
sample
) =
new_y
;
82
}
83
return
result
;
84
}
85
86
bool
TransformModelComponent::insideSharpRegion
(
double
x
,
double
y
) {
87
double
new_x
=
x
*
m_inv_transform
[0] +
y
*
m_inv_transform
[2];
88
double
new_y
=
x
*
m_inv_transform
[1] +
y
*
m_inv_transform
[3];
89
return
m_component
->insideSharpRegion(
new_x
,
new_y
);
90
}
91
92
}
x
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > x
Definition
MoffatModelFittingTask.cpp:94
y
std::shared_ptr< DependentParameter< std::shared_ptr< EngineParameter > > > y
Definition
MoffatModelFittingTask.cpp:94
TransformModelComponent.h
ModelFitting::TransformModelComponent
Definition
TransformModelComponent.h:39
ModelFitting::TransformModelComponent::m_transform
double m_transform[4]
Definition
TransformModelComponent.h:68
ModelFitting::TransformModelComponent::updateRasterizationInfo
void updateRasterizationInfo(double scale, double r_max) override
Definition
TransformModelComponent.cpp:67
ModelFitting::TransformModelComponent::~TransformModelComponent
virtual ~TransformModelComponent()
Definition
TransformModelComponent.cpp:56
ModelFitting::TransformModelComponent::m_inv_transform
double m_inv_transform[4]
Definition
TransformModelComponent.h:69
ModelFitting::TransformModelComponent::insideSharpRegion
bool insideSharpRegion(double x, double y) override
Definition
TransformModelComponent.cpp:86
ModelFitting::TransformModelComponent::getValue
double getValue(double x, double y) override
Definition
TransformModelComponent.cpp:59
ModelFitting::TransformModelComponent::m_component
std::unique_ptr< ModelComponent > m_component
Definition
TransformModelComponent.h:66
ModelFitting::TransformModelComponent::getSharpSampling
std::vector< ModelSample > getSharpSampling() override
Definition
TransformModelComponent.cpp:75
ModelFitting::TransformModelComponent::TransformModelComponent
TransformModelComponent(std::unique_ptr< ModelComponent > component, std::tuple< double, double, double, double > transform)
Definition
TransformModelComponent.cpp:30
std::fabs
T fabs(T... args)
std::function
std::min
T min(T... args)
std::move
T move(T... args)
ModelFitting
Definition
AsinhChiSquareComparator.h:30
std
STL namespace.
std::sqrt
T sqrt(T... args)
std::transform
T transform(T... args)
Generated by
1.10.0