SourceXtractorPlusPlus
0.21
SourceXtractor++, the next generation SExtractor
Loading...
Searching...
No Matches
SEImplementation
src
lib
Plugin
FluxRadius
FluxRadiusTask.cpp
Go to the documentation of this file.
1
18
#include <algorithm>
19
#include <functional>
20
21
#include <NdArray/NdArray.h>
22
#include <
SEFramework/Image/Image.h
>
23
#include "
SEImplementation/Plugin/FluxRadius/FluxRadius.h
"
24
#include "
SEImplementation/Plugin/FluxRadius/FluxRadiusTask.h
"
25
#include "
SEImplementation/Plugin/GrowthCurve/GrowthCurve.h
"
26
27
using namespace
Euclid::NdArray
;
28
29
namespace
SourceXtractor
{
30
31
FluxRadiusTask::FluxRadiusTask
(
const
std::vector<unsigned>
&
instances
,
const
std::vector<SeFloat>
&
flux_frac
)
32
: m_instances{
instances
}, m_flux_fraction{
flux_frac
} {
33
}
34
35
void
FluxRadiusTask::computeProperties
(
SourceInterface
&
source
)
const
{
36
NdArray<SeFloat>
radii
{
m_instances
.
size
(),
m_flux_fraction
.
size
()};
37
38
for
(
size_t
i
= 0;
i
<
m_instances
.
size
(); ++
i
) {
39
auto
&
growth_curve_prop
=
source
.getProperty<
GrowthCurve
>(
m_instances
[
i
]);
40
auto
&
growth_curve
=
growth_curve_prop
.getCurve();
41
auto
step_size
=
growth_curve_prop
.getStepSize();
42
43
std::vector<double>
steps
(
growth_curve
.size());
44
for
(
size_t
s = 0; s <
steps
.size(); ++s) {
45
steps
[s] = (s + 1) *
step_size
;
46
}
47
48
for
(
size_t
j
= 0;
j
<
m_flux_fraction
.
size
(); ++
j
) {
49
auto
target_flux
=
std::max
(0.,
growth_curve
.back() *
m_flux_fraction
[
j
]);
50
51
// We can not use Alexandria's interpolation because the accumulated flux is not
52
// strictly increasing, so we search for the first bin where the accumulated flux is
53
// >= the target flux, and interpolate with the previous one
54
auto
next
=
std::find_if
(
std::begin
(
growth_curve
),
std::end
(
growth_curve
),
55
std::bind
(
std::greater_equal<double>
(), std::placeholders::_1,
target_flux
));
56
if
(
next
==
std::end
(
growth_curve
)) {
57
--
next
;
58
}
59
size_t
next_i
=
std::distance
(
std::begin
(
growth_curve
),
next
);
60
61
SeFloat
y0
,
y1
;
62
DetectionImage::PixelType
x0
,
x1
;
63
64
x1
= *
next
;
65
y1
=
steps
[
next_i
];
66
if
(
next_i
> 0) {
67
x0
= *(
next
- 1);
68
y0
=
steps
[
next_i
- 1];
69
}
70
else
{
71
x0
= 0;
72
y0
= 0;
73
}
74
75
SeFloat
slope
= (
y1
-
y0
) / (
x1
-
x0
);
76
SeFloat
target_radius
=
y0
+ (
target_flux
-
x0
) *
slope
;
77
radii
.at(
i
,
j
) =
std::min
(
target_radius
,
static_cast<
SeFloat
>
(
steps
.back()));
78
}
79
}
80
source
.setProperty<
FluxRadius
>(
std::move
(
radii
));
81
}
82
83
}
// end of namespace SourceXtractor
FluxRadiusTask.h
FluxRadius.h
GrowthCurve.h
Image.h
std::begin
T begin(T... args)
std::bind
T bind(T... args)
SourceXtractor::FluxRadiusTask::m_flux_fraction
std::vector< SeFloat > m_flux_fraction
Definition
FluxRadiusTask.h:37
SourceXtractor::FluxRadiusTask::computeProperties
void computeProperties(SourceInterface &source) const override
Computes one or more properties for the Source.
Definition
FluxRadiusTask.cpp:35
SourceXtractor::FluxRadiusTask::FluxRadiusTask
FluxRadiusTask(const std::vector< unsigned > &instances, const std::vector< SeFloat > &flux_frac)
Definition
FluxRadiusTask.cpp:31
SourceXtractor::FluxRadiusTask::m_instances
std::vector< unsigned > m_instances
Definition
FluxRadiusTask.h:36
SourceXtractor::FluxRadius
Definition
FluxRadius.h:27
SourceXtractor::GrowthCurve
Definition
GrowthCurve.h:30
SourceXtractor::SourceInterface
The SourceInterface is an abstract "source" that has properties attached to it.
Definition
SourceInterface.h:46
std::distance
T distance(T... args)
std::end
T end(T... args)
std::find_if
T find_if(T... args)
std::function
std::max
T max(T... args)
std::min
T min(T... args)
std::move
T move(T... args)
Euclid::NdArray
SourceXtractor
Definition
Aperture.h:30
SourceXtractor::SeFloat
SeFloat32 SeFloat
Definition
Types.h:32
std::next
T next(T... args)
std::vector::size
T size(T... args)
Generated by
1.10.0