lsst.ip.diffim
g174f8ebed5+ec711f8d5b
Toggle main menu visibility
Loading...
Searching...
No Matches
src
BuildSingleKernelVisitor.cc
Go to the documentation of this file.
1
// -*- lsst-c++ -*-
11
12
#include <memory>
13
#include "Eigen/Core"
14
15
#include "
lsst/afw/math.h
"
16
#include "
lsst/afw/image.h
"
17
#include "
lsst/log/Log.h
"
18
#include "
lsst/pex/exceptions/Runtime.h
"
19
#include "
lsst/daf/base/PropertySet.h
"
20
21
#include "
lsst/ip/diffim/ImageSubtract.h
"
22
#include "
lsst/ip/diffim/KernelCandidate.h
"
23
#include "
lsst/ip/diffim/BuildSingleKernelVisitor.h
"
24
25
#define DEBUG_MATRIX 0
26
27
namespace
afwMath
=
lsst::afw::math
;
28
namespace
afwImage
=
lsst::afw::image
;
29
namespace
dafBase
=
lsst::daf::base
;
30
namespace
pexExcept
=
lsst::pex::exceptions
;
31
namespace
ipDiffim
=
lsst::ip::diffim
;
32
33
namespace
lsst
{
34
namespace
ip {
35
namespace
diffim {
36
namespace
detail {
37
87
template
<
typename
PixelT>
88
BuildSingleKernelVisitor<PixelT>::BuildSingleKernelVisitor
(
89
lsst::afw::math::KernelList
const
& basisList,
91
lsst::daf::base::PropertySet
const
& ps
92
) :
93
afwMath
::
CandidateVisitor
(),
94
_basisList(basisList),
95
_ps(ps.deepCopy()),
96
_hMat(),
97
_imstats(
ImageStatistics
<
PixelT
>(ps)),
98
_skipBuilt(true),
99
_nRejected(0),
100
_nProcessed(0),
101
_useRegularization(false),
102
_useCoreStats(ps.getAsBool(
"useCoreStats"
)),
103
_coreRadius(ps.getAsInt(
"candidateCoreRadius"
))
104
{};
105
106
template
<
typename
PixelT>
107
BuildSingleKernelVisitor<PixelT>::BuildSingleKernelVisitor
(
108
lsst::afw::math::KernelList
const
& basisList,
110
lsst::daf::base::PropertySet
const
& ps,
111
Eigen::MatrixXd
const
& hMat
112
) :
113
afwMath
::
CandidateVisitor
(),
114
_basisList(basisList),
115
_ps(ps.deepCopy()),
116
_hMat(hMat),
117
_imstats(
ImageStatistics
<
PixelT
>(ps)),
118
_skipBuilt(true),
119
_nRejected(0),
120
_nProcessed(0),
121
_useRegularization(true),
122
_useCoreStats(ps.getAsBool(
"useCoreStats"
)),
123
_coreRadius(ps.getAsInt(
"candidateCoreRadius"
))
124
{};
125
126
127
template
<
typename
PixelT>
128
void
BuildSingleKernelVisitor<PixelT>::processCandidate
(
129
lsst::afw::math::SpatialCellCandidate
*candidate
130
) {
131
132
ipDiffim::KernelCandidate<PixelT>
*kCandidate =
133
dynamic_cast<
ipDiffim::KernelCandidate<PixelT>
*
>
(candidate);
134
if
(kCandidate == NULL) {
135
LOGL_DEBUG
(
"TRACE2.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
136
"Failed to cast SpatialCellCandidate to KernelCandidate %d"
,
137
kCandidate->
getId
());
138
throw
LSST_EXCEPT
(
pexExcept::LogicError
,
139
"Failed to cast SpatialCellCandidate to KernelCandidate"
);
140
}
141
142
if
(_skipBuilt and kCandidate->
isInitialized
()) {
143
return
;
144
}
145
146
LOGL_DEBUG
(
"TRACE1.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
147
"Processing candidate %d"
, kCandidate->
getId
());
148
LOGL_DEBUG
(
"TRACE4.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
149
"X = %.2f Y = %.2f"
,
150
kCandidate->
getXCenter
(),
151
kCandidate->
getYCenter
());
152
153
/* Build its kernel here */
154
try
{
155
if
(_useRegularization)
156
kCandidate->
build
(_basisList, _hMat);
157
else
158
kCandidate->
build
(_basisList);
159
160
}
catch
(
pexExcept::Exception
&e) {
161
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::BAD
);
162
LOGL_DEBUG
(
"TRACE3.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
163
"Unable to process candidate %d; exception caught (%s)"
,
164
kCandidate->
getId
(),
165
e.
what
());
166
_nRejected += 1;
167
return
;
168
}
169
170
if
(kCandidate->
getStatus
() ==
afwMath::SpatialCellCandidate::BAD
) {
171
LOGL_DEBUG
(
"TRACE3.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
172
"Candidate %d Returned BAD upon build, exiting"
,
173
kCandidate->
getId
());
174
_nRejected += 1;
175
return
;
176
}
177
178
179
/*
180
* Make diffim and set chi2 from result. Note that you need to use the
181
* most recent kernel
182
*/
183
MaskedImageT
diffim
= kCandidate->
getDifferenceImage
(
ipDiffim::KernelCandidate<PixelT>::RECENT
);
184
try
{
185
if
(_useCoreStats)
186
_imstats.apply(
diffim
, _coreRadius);
187
else
188
_imstats.apply(
diffim
);
189
}
catch
(
pexExcept::Exception
& e) {
190
LOGL_DEBUG
(
"TRACE2.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
191
"Unable to calculate imstats for Candidate %d"
, kCandidate->
getId
());
192
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::BAD
);
193
return
;
194
}
195
_nProcessed += 1;
196
197
kCandidate->
setChi2
(_imstats.getVariance());
198
199
/* When using a Pca basis, we don't reset the kernel or background,
200
so we need to evaluate these locally for the Trace */
201
double
kSum = kCandidate->
getKsum
(
ipDiffim::KernelCandidate<PixelT>::RECENT
);
202
double
background
= kCandidate->
getBackground
(
ipDiffim::KernelCandidate<PixelT>::RECENT
);
203
204
LOGL_DEBUG
(
"TRACE4.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
205
"Chi2 = %.3f"
, kCandidate->
getChi2
());
206
LOGL_DEBUG
(
"TRACE4.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
207
"Kernel Sum = %.3f"
, kSum);
208
LOGL_DEBUG
(
"TRACE4.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
209
"Background = %.3f"
,
background
);
210
LOGL_DEBUG
(
"TRACE2.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
211
"Candidate %d resids = %.3f +/- %.3f sigma (%d pix)"
,
212
kCandidate->
getId
(),
213
_imstats.getMean(),
214
_imstats.getRms(),
215
_imstats.getNpix());
216
217
bool
meanIsNan =
std::isnan
(_imstats.getMean());
218
bool
rmsIsNan =
std::isnan
(_imstats.getRms());
219
if
(meanIsNan || rmsIsNan) {
220
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::BAD
);
221
LOGL_DEBUG
(
"TRACE3.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
222
"Rejecting candidate %d, encountered NaN"
,
223
kCandidate->
getId
());
224
_nRejected += 1;
225
return
;
226
}
227
228
if
(_ps->getAsBool(
"singleKernelClipping"
)) {
229
if
(fabs(_imstats.getMean()) > _ps->getAsDouble(
"candidateResidualMeanMax"
)) {
230
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::BAD
);
231
LOGL_DEBUG
(
"TRACE3.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
232
"Rejecting candidate %d; bad mean residual : |%.3f| > %.3f"
,
233
kCandidate->
getId
(),
234
_imstats.getMean(),
235
_ps->getAsDouble(
"candidateResidualMeanMax"
));
236
_nRejected += 1;
237
}
238
else
if
(_imstats.getRms() > _ps->getAsDouble(
"candidateResidualStdMax"
)) {
239
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::BAD
);
240
LOGL_DEBUG
(
"TRACE3.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
241
"Rejecting candidate %d; bad residual rms : %.3f > %.3f"
,
242
kCandidate->
getId
(),
243
_imstats.getRms(),
244
_ps->getAsDouble(
"candidateResidualStdMax"
));
245
_nRejected += 1;
246
}
247
else
{
248
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::GOOD
);
249
LOGL_DEBUG
(
"TRACE3.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
250
"Source kernel OK"
);
251
}
252
}
253
else
{
254
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::GOOD
);
255
LOGL_DEBUG
(
"TRACE5.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
256
"Sigma clipping not enabled"
);
257
}
258
259
/* Core resids for debugging */
260
if
(!(_useCoreStats)) {
261
try
{
262
_imstats.apply(
diffim
, _coreRadius);
263
}
catch
(
pexExcept::Exception
& e) {
264
LOGL_DEBUG
(
"TRACE2.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
265
"Unable to calculate core imstats for Candidate %d"
,
266
kCandidate->
getId
());
267
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::BAD
);
268
return
;
269
}
270
LOGL_DEBUG
(
"TRACE3.ip.diffim.BuildSingleKernelVisitor.processCandidate"
,
271
"Candidate %d core resids = %.3f +/- %.3f sigma (%d pix)"
,
272
kCandidate->
getId
(),
273
_imstats.getMean(),
274
_imstats.getRms(),
275
_imstats.getNpix());
276
}
277
278
}
279
280
typedef
float
PixelT
;
281
282
template
class
BuildSingleKernelVisitor<PixelT>
;
283
284
template
std::shared_ptr<BuildSingleKernelVisitor<PixelT>
>
285
makeBuildSingleKernelVisitor<PixelT>
(
lsst::afw::math::KernelList
const
&,
286
lsst::daf::base::PropertySet
const
&);
287
288
template
std::shared_ptr<BuildSingleKernelVisitor<PixelT>
>
289
makeBuildSingleKernelVisitor<PixelT>
(
lsst::afw::math::KernelList
const
&,
290
lsst::daf::base::PropertySet
const
&,
291
Eigen::MatrixXd
const
&);
292
293
}}}}
// end of namespace lsst::ip::diffim::detail
Log.h
LOGL_DEBUG
#define LOGL_DEBUG(logger, message...)
BuildSingleKernelVisitor.h
Declaration of BuildSingleKernelVisitor.
LSST_EXCEPT
#define LSST_EXCEPT(type,...)
image.h
ImageSubtract.h
Image Subtraction helper functions.
KernelCandidate.h
Class used by SpatialModelCell for spatial Kernel fitting.
PropertySet.h
Runtime.h
lsst::afw::math::CandidateVisitor::CandidateVisitor
CandidateVisitor()=default
lsst::afw::math::SpatialCellCandidate
lsst::afw::math::SpatialCellImageCandidate::getYCenter
float getYCenter() const
lsst::afw::math::SpatialCellImageCandidate::getXCenter
float getXCenter() const
lsst::afw::math::SpatialCellImageCandidate::getId
int getId() const
lsst::afw::math::SpatialCellCandidate::BAD
BAD
lsst::afw::math::SpatialCellCandidate::GOOD
GOOD
lsst::afw::math::SpatialCellImageCandidate::setStatus
void setStatus(Status status)
lsst::afw::math::SpatialCellImageCandidate::getStatus
Status getStatus() const
lsst::afw::math::SpatialCellImageCandidate::getChi2
double getChi2() const
lsst::afw::math::SpatialCellImageCandidate::setChi2
void setChi2(double chi2)
lsst::daf::base::PropertySet
lsst::ip::diffim::ImageStatistics
Class to calculate difference image statistics.
Definition
ImageStatistics.h:59
lsst::ip::diffim::KernelCandidate
Class stored in SpatialCells for spatial Kernel fitting.
Definition
KernelCandidate.h:39
lsst::ip::diffim::KernelCandidate::isInitialized
bool isInitialized() const
Definition
KernelCandidate.h:128
lsst::ip::diffim::KernelCandidate::getDifferenceImage
afw::image::MaskedImage< PixelT > getDifferenceImage(CandidateSwitch cand)
Calculate associated difference image using internal solutions.
Definition
KernelCandidate.cc:366
lsst::ip::diffim::KernelCandidate::getBackground
double getBackground(CandidateSwitch cand) const
Definition
KernelCandidate.cc:247
lsst::ip::diffim::KernelCandidate::getKsum
double getKsum(CandidateSwitch cand) const
Definition
KernelCandidate.cc:275
lsst::ip::diffim::KernelCandidate::RECENT
@ RECENT
Definition
KernelCandidate.h:52
lsst::ip::diffim::KernelCandidate::build
void build(afw::math::KernelList const &basisList)
Core functionality of KernelCandidate, to build and fill a KernelSolution.
Definition
KernelCandidate.cc:86
lsst::ip::diffim::detail::BuildSingleKernelVisitor
Builds the convolution kernel for a given candidate.
Definition
BuildSingleKernelVisitor.h:30
lsst::ip::diffim::detail::BuildSingleKernelVisitor::processCandidate
void processCandidate(lsst::afw::math::SpatialCellCandidate *candidate)
Definition
BuildSingleKernelVisitor.cc:128
lsst::ip::diffim::detail::BuildSingleKernelVisitor::BuildSingleKernelVisitor
BuildSingleKernelVisitor(lsst::afw::math::KernelList const &basisList, lsst::daf::base::PropertySet const &ps)
Definition
BuildSingleKernelVisitor.cc:88
lsst::pex::exceptions::Exception
lsst::pex::exceptions::Exception::what
virtual char const * what(void) const noexcept
lsst::pex::exceptions::LogicError
std::isnan
T isnan(T... args)
math.h
lsst::afw::image
lsst::afw::math
lsst::afw::math::KernelList
std::vector< std::shared_ptr< Kernel > > KernelList
lsst::daf::base
lsst::ip::diffim::detail::PixelT
float PixelT
Definition
AssessSpatialKernelVisitor.cc:208
lsst::ip::diffim::detail::makeBuildSingleKernelVisitor< PixelT >
template std::shared_ptr< BuildSingleKernelVisitor< PixelT > > makeBuildSingleKernelVisitor< PixelT >(lsst::afw::math::KernelList const &, lsst::daf::base::PropertySet const &)
lsst::ip::diffim.detectAndMeasure.background
background
Definition
detectAndMeasure.py:763
lsst::ip::diffim
Definition
AssessSpatialKernelVisitor.h:22
lsst::pex::exceptions
lsst
std::shared_ptr
Generated on
for lsst.ip.diffim by
1.17.0