lsst.ip.diffim
g174f8ebed5+050ac6bd62
Toggle main menu visibility
Loading...
Searching...
No Matches
src
AssessSpatialKernelVisitor.cc
Go to the documentation of this file.
1
// -*- lsst-c++ -*-
11
12
#include "
lsst/afw/math.h
"
13
#include "
lsst/afw/image.h
"
14
#include "
lsst/log/Log.h
"
15
#include "
lsst/daf/base/PropertySet.h
"
16
#include "
lsst/pex/exceptions/Runtime.h
"
17
18
#include "
lsst/ip/diffim/ImageSubtract.h
"
19
#include "
lsst/ip/diffim/KernelCandidate.h
"
20
#include "
lsst/ip/diffim/AssessSpatialKernelVisitor.h
"
21
22
#define DEBUG_IMAGES 0
23
24
namespace
afwMath
=
lsst::afw::math
;
25
namespace
afwImage
=
lsst::afw::image
;
26
namespace
dafBase
=
lsst::daf::base
;
27
namespace
pexExcept
=
lsst::pex::exceptions
;
28
29
namespace
lsst
{
30
namespace
ip {
31
namespace
diffim {
32
namespace
detail {
53
template
<
typename
PixelT>
54
AssessSpatialKernelVisitor<PixelT>::AssessSpatialKernelVisitor
(
55
std::shared_ptr<lsst::afw::math::LinearCombinationKernel>
spatialKernel,
56
lsst::afw::math::Kernel::SpatialFunctionPtr
spatialBackground,
57
lsst::daf::base::PropertySet
const
& ps
58
) :
59
afwMath
::
CandidateVisitor
(),
60
_spatialKernel(spatialKernel),
61
_spatialBackground(spatialBackground),
62
_ps(ps.deepCopy()),
63
_imstats(
ImageStatistics
<
PixelT
>(ps)),
64
_nGood(0),
65
_nRejected(0),
66
_nProcessed(0),
67
_useCoreStats(ps.getAsBool(
"useCoreStats"
)),
68
_coreRadius(ps.getAsInt(
"candidateCoreRadius"
))
69
{};
70
71
template
<
typename
PixelT>
72
void
AssessSpatialKernelVisitor<PixelT>::processCandidate
(
73
lsst::afw::math::SpatialCellCandidate
*candidate
74
) {
75
76
KernelCandidate<PixelT>
*kCandidate =
dynamic_cast<
KernelCandidate<PixelT>
*
>
(candidate);
77
if
(kCandidate == NULL) {
78
throw
LSST_EXCEPT
(
pexExcept::LogicError
,
79
"Failed to cast SpatialCellCandidate to KernelCandidate"
);
80
}
81
if
(!(kCandidate->
isInitialized
())) {
82
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::BAD
);
83
LOGL_DEBUG
(
"TRACE2.ip.diffim.AssessSpatialKernelVisitor.processCandidate"
,
84
"Cannot process candidate %d, continuing"
, kCandidate->
getId
());
85
return
;
86
}
87
88
LOGL_DEBUG
(
"TRACE1.ip.diffim.AssessSpatialKernelVisitor.processCandidate"
,
89
"Processing candidate %d"
, kCandidate->
getId
());
90
91
/*
92
Note - this is a hack until the Kernel API is upgraded by the
93
Davis crew. I need a "local" version of the spatially varying
94
Kernel
95
*/
96
afwImage::Image<double>
kImage(_spatialKernel->getDimensions());
97
double
kSum = _spatialKernel->computeImage(kImage,
false
,
98
kCandidate->
getXCenter
(), kCandidate->
getYCenter
());
99
std::shared_ptr<afwMath::Kernel>
100
kernelPtr(
new
afwMath::FixedKernel
(kImage));
101
/* </hack> */
102
103
double
background
= (*_spatialBackground)(kCandidate->
getXCenter
(), kCandidate->
getYCenter
());
104
105
MaskedImageT
diffim
= kCandidate->
getDifferenceImage
(kernelPtr,
background
);
106
107
if
(
DEBUG_IMAGES
) {
108
kImage.
writeFits
(str(boost::format(
"askv_k%d.fits"
) % kCandidate->
getId
()));
109
diffim
.writeFits(str(boost::format(
"askv_d%d.fits"
) % kCandidate->
getId
()));
110
}
111
112
/* Official resids */
113
try
{
114
if
(_useCoreStats)
115
_imstats.apply(
diffim
, _coreRadius);
116
else
117
_imstats.apply(
diffim
);
118
}
catch
(
pexExcept::Exception
& e) {
119
LOGL_DEBUG
(
"TRACE2.ip.diffim.AssessSpatialKernelVisitor.processCandidate"
,
120
"Unable to calculate imstats for Candidate %d"
, kCandidate->
getId
());
121
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::BAD
);
122
return
;
123
}
124
125
_nProcessed += 1;
126
127
LOGL_DEBUG
(
"TRACE4.ip.diffim.AssessSpatialKernelVisitor.processCandidate"
,
128
"Chi2 = %.3f"
, _imstats.getVariance());
129
LOGL_DEBUG
(
"TRACE4.ip.diffim.AssessSpatialKernelVisitor.processCandidate"
,
130
"X = %.2f Y = %.2f"
,
131
kCandidate->
getXCenter
(),
132
kCandidate->
getYCenter
());
133
LOGL_DEBUG
(
"TRACE4.ip.diffim.AssessSpatialKernelVisitor.processCandidate"
,
134
"Kernel Sum = %.3f"
, kSum);
135
LOGL_DEBUG
(
"TRACE4.ip.diffim.AssessSpatialKernelVisitor.processCandidate"
,
136
"Background = %.3f"
,
background
);
137
LOGL_DEBUG
(
"TRACE2.ip.diffim.AssessSpatialKernelVisitor.processCandidate"
,
138
"Candidate %d resids = %.3f +/- %.3f sigma (%d pix)"
,
139
kCandidate->
getId
(),
140
_imstats.getMean(),
141
_imstats.getRms(),
142
_imstats.getNpix());
143
144
bool
meanIsNan =
std::isnan
(_imstats.getMean());
145
bool
rmsIsNan =
std::isnan
(_imstats.getRms());
146
if
(meanIsNan || rmsIsNan) {
147
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::BAD
);
148
LOGL_DEBUG
(
"TRACE3.ip.diffim.AssessSpatialKernelVisitor.processCandidate"
,
149
"Rejecting candidate %d, encountered NaN"
,
150
kCandidate->
getId
());
151
_nRejected += 1;
152
return
;
153
}
154
155
if
(_ps->getAsBool(
"spatialKernelClipping"
)) {
156
if
(fabs(_imstats.getMean()) > _ps->getAsDouble(
"candidateResidualMeanMax"
)) {
157
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::BAD
);
158
LOGL_DEBUG
(
"TRACE3.ip.diffim.AssessSpatialKernelVisitor.processCandidate"
,
159
"Rejecting candidate %d; bad mean residual : |%.3f| > %.3f"
,
160
kCandidate->
getId
(),
161
_imstats.getMean(),
162
_ps->getAsDouble(
"candidateResidualMeanMax"
));
163
_nRejected += 1;
164
}
165
else
if
(_imstats.getRms() > _ps->getAsDouble(
"candidateResidualStdMax"
)) {
166
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::BAD
);
167
LOGL_DEBUG
(
"TRACE3.ip.diffim.AssessSpatialKernelVisitor.processCandidate"
,
168
"Rejecting candidate %d; bad residual rms : %.3f > %.3f"
,
169
kCandidate->
getId
(),
170
_imstats.getRms(),
171
_ps->getAsDouble(
"candidateResidualStdMax"
));
172
_nRejected += 1;
173
}
174
else
{
175
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::GOOD
);
176
LOGL_DEBUG
(
"TRACE3.ip.diffim.AssessSpatialKernelVisitor.processCandidate"
,
177
"Spatial kernel OK"
);
178
_nGood += 1;
179
}
180
}
181
else
{
182
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::GOOD
);
183
LOGL_DEBUG
(
"TRACE5.ip.diffim.AssessSpatialKernelVisitor.processCandidate"
,
184
"Sigma clipping not enabled"
);
185
_nGood += 1;
186
}
187
188
/* Core resids for debugging */
189
if
(!(_useCoreStats)) {
190
try
{
191
_imstats.apply(
diffim
, _coreRadius);
192
}
catch
(
pexExcept::Exception
& e) {
193
LOGL_DEBUG
(
"TRACE2.ip.diffim.AssessSpatialKernelVisitor.processCandidate"
,
194
"Unable to calculate core imstats for Candidate %d"
,
195
kCandidate->
getId
());
196
kCandidate->
setStatus
(
afwMath::SpatialCellCandidate::BAD
);
197
return
;
198
}
199
LOGL_DEBUG
(
"TRACE3.ip.diffim.AssessSpatialKernelVisitor.processCandidate"
,
200
"Candidate %d core resids = %.3f +/- %.3f sigma (%d pix)"
,
201
kCandidate->
getId
(),
202
_imstats.getMean(),
203
_imstats.getRms(),
204
_imstats.getNpix());
205
}
206
}
207
208
typedef
float
PixelT
;
209
template
class
AssessSpatialKernelVisitor<PixelT>
;
210
211
}}}}
// end of namespace lsst::ip::diffim::detail
Log.h
LOGL_DEBUG
#define LOGL_DEBUG(logger, message...)
DEBUG_IMAGES
#define DEBUG_IMAGES
Definition
AssessSpatialKernelVisitor.cc:22
AssessSpatialKernelVisitor.h
Declaration of AssessSpatialKernelVisitor.
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::image::Image
lsst::afw::image::Image::writeFits
void writeFits(std::string const &fileName, daf::base::PropertySet const *metadata=nullptr, std::string const &mode="w") const
lsst::afw::math::CandidateVisitor::CandidateVisitor
CandidateVisitor()=default
lsst::afw::math::FixedKernel
lsst::afw::math::Kernel::SpatialFunctionPtr
std::shared_ptr< lsst::afw::math::Function2< double > > SpatialFunctionPtr
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::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::detail::AssessSpatialKernelVisitor
Asseses the quality of a candidate given a spatial kernel and background model.
Definition
AssessSpatialKernelVisitor.h:26
lsst::ip::diffim::detail::AssessSpatialKernelVisitor::AssessSpatialKernelVisitor
AssessSpatialKernelVisitor(std::shared_ptr< lsst::afw::math::LinearCombinationKernel > spatialKernel, lsst::afw::math::Kernel::SpatialFunctionPtr spatialBackground, lsst::daf::base::PropertySet const &ps)
Definition
AssessSpatialKernelVisitor.cc:54
lsst::ip::diffim::detail::AssessSpatialKernelVisitor::processCandidate
void processCandidate(lsst::afw::math::SpatialCellCandidate *candidate)
Definition
AssessSpatialKernelVisitor.cc:72
lsst::pex::exceptions::Exception
lsst::pex::exceptions::LogicError
std::isnan
T isnan(T... args)
math.h
lsst::afw::image
lsst::afw::math
lsst::daf::base
lsst::ip::diffim::detail::PixelT
float PixelT
Definition
AssessSpatialKernelVisitor.cc:208
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