LSSTApplications
20.0.0
LSSTDataManagementBasePackage
stack
1a1d771
Linux64
meas_base
20.0.0
src
InputUtilities.cc
Go to the documentation of this file.
1
// -*- lsst-c++ -*-
2
/*
3
* LSST Data Management System
4
* Copyright 2008-2014 LSST Corporation.
5
*
6
* This product includes software developed by the
7
* LSST Project (http://www.lsst.org/).
8
*
9
* This program is free software: you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation, either version 3 of the License, or
12
* (at your option) any later version.
13
*
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
18
*
19
* You should have received a copy of the LSST License Statement and
20
* the GNU General Public License along with this program. If not,
21
* see <http://www.lsstcorp.org/LegalNotices/>.
22
*/
23
24
#include <cmath>
25
26
#include "
lsst/afw/table/Source.h
"
27
#include "
lsst/afw/detection/Footprint.h
"
28
#include "
lsst/meas/base/exceptions.h
"
29
#include "
lsst/meas/base/InputUtilities.h
"
30
31
namespace
lsst
{
32
namespace
meas {
33
namespace
base
{
34
35
SafeCentroidExtractor::SafeCentroidExtractor
(
afw::table::Schema
&
schema
,
std::string
const
&
name
,
36
bool
isCentroider)
37
: _name(
name
), _isCentroider(isCentroider) {
38
// Instead of aliasing e.g. MyAlgorithm_flag_badCentroid->slot_Centroid_flag, we actually
39
// look up the target of slot_Centroid_flag, and alias that to MyAlgorithm_flag_badCentroid.
40
// That way, if someone changes the slots later, after we've already done the measurement,
41
// this alias still points to the right thing.
42
std::string
aliasedFlagName =
schema
.join(
"slot"
,
"Centroid"
,
"flag"
);
43
std::string
slotFlagName =
schema
.getAliasMap()->apply(aliasedFlagName);
44
if
(_isCentroider) {
45
if
(slotFlagName !=
schema
.join(
name
,
"flag"
)) {
46
// only setup the alias if this isn't the slot algorithm itself (otherwise it'd be circular)
47
schema
.getAliasMap()->set(
schema
.join(
name
,
"flag"
,
"badInitialCentroid"
), slotFlagName);
48
}
49
}
else
{
50
if
(aliasedFlagName == slotFlagName) {
51
throw
LSST_EXCEPT
(
52
pex::exceptions::LogicError
,
53
(
boost::format
(
"Alias for '%s' must be defined before initializing '%s' plugin."
) %
54
aliasedFlagName %
name
)
55
.str());
56
}
57
schema
.getAliasMap()->set(
schema
.join(
name
,
"flag"
,
"badCentroid"
), slotFlagName);
58
}
59
}
60
61
namespace
{
62
63
geom::Point2D
extractPeak(
afw::table::SourceRecord
const
& record,
std::string
const
&
name
) {
64
geom::Point2D
result
;
65
PTR
(
afw::detection::Footprint
) footprint = record.
getFootprint
();
66
if
(!footprint) {
67
throw
LSST_EXCEPT
(
68
pex::exceptions::RuntimeError
,
69
(
boost::format
(
"%s: Centroid slot value is NaN, but no Footprint attached to record"
) %
name
)
70
.str());
71
}
72
if
(footprint->getPeaks().empty()) {
73
throw
LSST_EXCEPT
(
74
pex::exceptions::RuntimeError
,
75
(
boost::format
(
"%s: Centroid slot value is NaN, but Footprint has no Peaks"
) %
name
).str());
76
}
77
result
.setX(footprint->getPeaks().front().getFx());
78
result
.setY(footprint->getPeaks().front().getFy());
79
return
result
;
80
}
81
82
}
// namespace
83
84
geom::Point2D
SafeCentroidExtractor::operator()
(
afw::table::SourceRecord
& record,
85
FlagHandler
const
& flags)
const
{
86
if
(!record.
getTable
()->getCentroidKey().isValid()) {
87
if
(_isCentroider) {
88
return
extractPeak(record, _name);
89
}
else
{
90
throw
LSST_EXCEPT
(
91
FatalAlgorithmError
,
92
(
boost::format
(
"%s requires a centroid, but the centroid slot is not defined"
) % _name)
93
.str());
94
}
95
}
96
geom::Point2D
result
= record.
getCentroid
();
97
if
(
std::isnan
(
result
.getX()) ||
std::isnan
(
result
.getY())) {
98
if
(!record.
getTable
()->getCentroidFlagKey().isValid()) {
99
if
(_isCentroider) {
100
return
extractPeak(record, _name);
101
}
else
{
102
throw
LSST_EXCEPT
(
103
pex::exceptions::RuntimeError
,
104
(
boost::format
(
105
"%s: Centroid slot value is NaN, but there is no Centroid slot flag "
106
"(is the executionOrder for %s lower than that of the slot Centroid?)"
) %
107
_name % _name)
108
.str());
109
}
110
}
111
if
(!record.
getCentroidFlag
() && !_isCentroider) {
112
throw
LSST_EXCEPT
(
113
pex::exceptions::RuntimeError
,
114
(
boost::format
(
"%s: Centroid slot value is NaN, but the Centroid slot flag is not set "
115
"(is the executionOrder for %s lower than that of the slot Centroid?)"
) %
116
_name % _name)
117
.str());
118
}
119
result
= extractPeak(record, _name);
120
if
(!_isCentroider) {
121
// set the general flag, because using the Peak might affect the current measurement
122
flags.
setValue
(record, flags.
getFailureFlagNumber
(),
true
);
123
}
124
}
else
if
(!_isCentroider && record.
getTable
()->getCentroidFlagKey().isValid() &&
125
record.
getCentroidFlag
()) {
126
// we got a usable value, but the centroid flag is still be set, and that might affect
127
// the current measurement
128
flags.
setValue
(record, flags.
getFailureFlagNumber
(),
true
);
129
}
130
return
result
;
131
}
132
133
SafeShapeExtractor::SafeShapeExtractor
(
afw::table::Schema
&
schema
,
std::string
const
&
name
) : _name(
name
) {
134
// Instead of aliasing e.g. MyAlgorithm_flag_badShape->slot_Shape_flag, we actually
135
// look up the target of slot_Shape_flag, and alias that to MyAlgorithm_flag_badCentroid.
136
// That way, if someone changes the slots later, after we've already done the measurement,
137
// this alias still points to the right thing.
138
std::string
aliasedFlagName =
schema
.join(
"slot"
,
"Shape"
,
"flag"
);
139
std::string
slotFlagName =
schema
.getAliasMap()->apply(aliasedFlagName);
140
if
(aliasedFlagName == slotFlagName) {
141
throw
LSST_EXCEPT
(
pex::exceptions::LogicError
,
142
(
boost::format
(
"Alias for '%s' must be defined before initializing '%s' plugin."
) %
143
aliasedFlagName %
name
)
144
.str());
145
}
146
schema
.getAliasMap()->set(
schema
.join(
name
,
"flag"
,
"badShape"
), slotFlagName);
147
}
148
149
afw::geom::ellipses::Quadrupole
SafeShapeExtractor::operator()
(
afw::table::SourceRecord
& record,
150
FlagHandler
const
& flags)
const
{
151
if
(!record.
getTable
()->getShapeKey().isValid()) {
152
throw
LSST_EXCEPT
(
153
FatalAlgorithmError
,
154
(
boost::format
(
"%s requires a shape, but the shape slot is not defined"
) % _name).str());
155
}
156
afw::geom::ellipses::Quadrupole
result
= record.
getShape
();
157
if
(
std::isnan
(
result
.getIxx()) ||
std::isnan
(
result
.getIyy()) ||
std::isnan
(
result
.getIxy()) ||
158
result
.getIxx() *
result
.getIyy() < (1.0 + 1.0e-6) *
result
.getIxy() *
result
.getIxy()
159
// We are checking that Ixx*Iyy > (1 + epsilon)*Ixy*Ixy where epsilon is suitably small. The
160
// value of epsilon used here is a magic number. DM-5801 is supposed to figure out if we are
161
// to keep this value.
162
) {
163
if
(!record.
getTable
()->getShapeFlagKey().isValid()) {
164
throw
LSST_EXCEPT
(
165
pex::exceptions::RuntimeError
,
166
(
boost::format
(
"%s: Shape slot value is NaN, but there is no Shape slot flag "
167
"(is the executionOrder for %s lower than that of the slot Shape?)"
) %
168
_name % _name)
169
.str());
170
}
171
if
(!record.
getShapeFlag
()) {
172
throw
LSST_EXCEPT
(
173
pex::exceptions::RuntimeError
,
174
(
boost::format
(
"%s: Shape slot value is NaN, but the Shape slot flag is not set "
175
"(is the executionOrder for %s lower than that of the slot Shape?)"
) %
176
_name % _name)
177
.str());
178
}
179
throw
LSST_EXCEPT
(
180
MeasurementError
,
181
(
boost::format
(
"%s: Shape needed, and Shape slot measurement failed."
) % _name).str(),
182
flags.
getFailureFlagNumber
());
183
}
else
if
(record.
getTable
()->getShapeFlagKey().isValid() && record.
getShapeFlag
()) {
184
// we got a usable value, but the shape flag might still be set, and that might affect
185
// the current measurement
186
flags.
setValue
(record, flags.
getFailureFlagNumber
(),
true
);
187
}
188
return
result
;
189
}
190
191
}
// namespace base
192
}
// namespace meas
193
}
// namespace lsst
schema
table::Schema schema
Definition:
Amplifier.cc:115
std::string
STL class.
lsst::afw::table::SourceRecord
Record class that contains measurements made on a single exposure.
Definition:
Source.h:80
lsst::afw::table::SourceRecord::getCentroid
CentroidSlotDefinition::MeasValue getCentroid() const
Get the value of the Centroid slot measurement.
Definition:
Source.h:698
base
Definition:
__init__.py:1
pex.config.history.format
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
Definition:
history.py:174
lsst::meas::base::MeasurementError
Exception to be thrown when a measurement algorithm experiences a known failure mode.
Definition:
exceptions.h:48
exceptions.h
lsst::meas::base::FatalAlgorithmError
Exception to be thrown when a measurement algorithm experiences a fatal error.
Definition:
exceptions.h:76
lsst::afw::table::Schema
Defines the fields and offsets for a table.
Definition:
Schema.h:50
InputUtilities.h
lsst::afw::geom.transform.transformContinued.name
string name
Definition:
transformContinued.py:32
lsst::meas::base::SafeShapeExtractor::operator()
afw::geom::ellipses::Quadrupole operator()(afw::table::SourceRecord &record, FlagHandler const &flags) const
Extract a shape from the given record.
Definition:
InputUtilities.cc:149
lsst::afw::table::SourceRecord::getFootprint
std::shared_ptr< Footprint > getFootprint() const
Definition:
Source.h:100
lsst::meas::base::FlagHandler::setValue
void setValue(afw::table::BaseRecord &record, std::size_t i, bool value) const
Set the flag field corresponding to the given flag index.
Definition:
FlagHandler.h:262
std::isnan
T isnan(T... args)
lsst::afw::table::SourceRecord::getShape
ShapeSlotDefinition::MeasValue getShape() const
Get the value of the Shape slot measurement.
Definition:
Source.h:710
lsst::meas::base::FlagHandler
Utility class for handling flag fields that indicate the failure modes of an algorithm.
Definition:
FlagHandler.h:148
lsst::pex::exceptions::LogicError
Reports errors in the logical structure of the program.
Definition:
Runtime.h:46
Footprint.h
result
py::object result
Definition:
_schema.cc:429
lsst::afw::table::SourceRecord::getCentroidFlag
bool getCentroidFlag() const
Return true if the measurement in the Centroid slot failed.
Definition:
Source.h:706
Source.h
lsst
A base class for image defects.
Definition:
imageAlgorithm.dox:1
LSST_EXCEPT
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition:
Exception.h:48
lsst::afw::table::SourceRecord::getTable
std::shared_ptr< SourceTable const > getTable() const
Definition:
Source.h:104
lsst::afw::geom::ellipses::Quadrupole
An ellipse core with quadrupole moments as parameters.
Definition:
Quadrupole.h:47
PTR
#define PTR(...)
Definition:
base.h:41
lsst::geom::Point< double, 2 >
lsst::afw::table::SourceRecord::getShapeFlag
bool getShapeFlag() const
Return true if the measurement in the Shape slot failed.
Definition:
Source.h:718
lsst::meas::base::FlagHandler::getFailureFlagNumber
std::size_t getFailureFlagNumber() const
Get the index of the General Failure flag, if one is defined.
Definition:
FlagHandler.h:286
lsst::meas::base::SafeCentroidExtractor::operator()
geom::Point2D operator()(afw::table::SourceRecord &record, FlagHandler const &flags) const
Extract a position from the given record.
Definition:
InputUtilities.cc:84
lsst::afw::detection::Footprint
Class to describe the properties of a detected object from an image.
Definition:
Footprint.h:63
lsst::meas::base::SafeCentroidExtractor::SafeCentroidExtractor
SafeCentroidExtractor(afw::table::Schema &schema, std::string const &name, bool isCentroider=false)
Construct the extractor, creating a flag alias that indicates failure in the input centroid by linkin...
Definition:
InputUtilities.cc:35
lsst::pex::exceptions::RuntimeError
Reports errors that are due to events beyond the control of the program.
Definition:
Runtime.h:104
lsst::meas::base::SafeShapeExtractor::SafeShapeExtractor
SafeShapeExtractor(afw::table::Schema &schema, std::string const &name)
Construct the extractor, creating a flag alias that indicates failure in the input centroid by linkin...
Definition:
InputUtilities.cc:133
Generated on Wed Jun 24 2020 18:10:09 for LSSTApplications by
1.8.18