LSSTApplications  19.0.0-14-gb0260a2+72efe9b372,20.0.0+7927753e06,20.0.0+8829bf0056,20.0.0+995114c5d2,20.0.0+b6f4b2abd1,20.0.0+bddc4f4cbe,20.0.0-1-g253301a+8829bf0056,20.0.0-1-g2b7511a+0d71a2d77f,20.0.0-1-g5b95a8c+7461dd0434,20.0.0-12-g321c96ea+23efe4bbff,20.0.0-16-gfab17e72e+fdf35455f6,20.0.0-2-g0070d88+ba3ffc8f0b,20.0.0-2-g4dae9ad+ee58a624b3,20.0.0-2-g61b8584+5d3db074ba,20.0.0-2-gb780d76+d529cf1a41,20.0.0-2-ged6426c+226a441f5f,20.0.0-2-gf072044+8829bf0056,20.0.0-2-gf1f7952+ee58a624b3,20.0.0-20-geae50cf+e37fec0aee,20.0.0-25-g3dcad98+544a109665,20.0.0-25-g5eafb0f+ee58a624b3,20.0.0-27-g64178ef+f1f297b00a,20.0.0-3-g4cc78c6+e0676b0dc8,20.0.0-3-g8f21e14+4fd2c12c9a,20.0.0-3-gbd60e8c+187b78b4b8,20.0.0-3-gbecbe05+48431fa087,20.0.0-38-ge4adf513+a12e1f8e37,20.0.0-4-g97dc21a+544a109665,20.0.0-4-gb4befbc+087873070b,20.0.0-4-gf910f65+5d3db074ba,20.0.0-5-gdfe0fee+199202a608,20.0.0-5-gfbfe500+d529cf1a41,20.0.0-6-g64f541c+d529cf1a41,20.0.0-6-g9a5b7a1+a1cd37312e,20.0.0-68-ga3f3dda+5fca18c6a4,20.0.0-9-g4aef684+e18322736b,w.2020.45
LSSTDataManagementBasePackage
KernelPca.cc
Go to the documentation of this file.
1 // -*- lsst-c++ -*-
12 #include "lsst/afw/math.h"
13 #include "lsst/afw/image.h"
14 #include "lsst/log/Log.h"
16 
19 
20 namespace afwMath = lsst::afw::math;
21 namespace afwImage = lsst::afw::image;
23 
24 namespace lsst {
25 namespace ip {
26 namespace diffim {
27 namespace detail {
28 
55  template<typename PixelT>
58  ) :
59  afwMath::CandidateVisitor(),
60  _imagePca(imagePca),
61  _mean()
62  {};
63 
64  template<typename PixelT>
66  afwMath::KernelList kernelList;
67 
68  std::vector<std::shared_ptr<ImageT>> eigenImages = _imagePca->getEigenImages();
69  int ncomp = eigenImages.size();
70 
71  if (_mean) {
75  (*_mean, true))));
76  }
77  for (int i = 0; i < ncomp; i++) {
79  afwImage::Image<afwMath::Kernel::Pixel>(*eigenImages[i], true);
81  new afwMath::FixedKernel(img)
82  ));
83  }
84 
85  return kernelList;
86  }
87 
88  template<typename PixelT>
90 
91  KernelCandidate<PixelT> *kCandidate = dynamic_cast<KernelCandidate<PixelT> *>(candidate);
92  if (kCandidate == NULL) {
94  "Failed to cast SpatialCellCandidate to KernelCandidate");
95  }
96  LOGL_DEBUG("TRACE5.ip.diffim.SetPcaImageVisitor.processCandidate",
97  "Processing candidate %d", kCandidate->getId());
98 
99  try {
100  /* Normalize to unit sum */
101  PTR(ImageT) kImage = kCandidate->getKernelSolution(
102  KernelCandidate<PixelT>::ORIG)->makeKernelImage();
103  *kImage /= kCandidate->getKernelSolution(
104  KernelCandidate<PixelT>::ORIG)->getKsum();
105  /* Tell imagePca they have the same weighting in the Pca */
106  _imagePca->addImage(kImage, 1.0);
107  } catch(pexExcept::Exception &e) {
108  return;
109  }
110  }
111 
112  template<typename PixelT>
114  /*
115  If we don't subtract off the mean before we do the Pca, the
116  subsequent terms carry less of the power than if you do subtract
117  off the mean. Explicit example:
118 
119  With mean subtraction:
120  DEBUG: Eigenvalue 0 : 0.010953 (0.373870 %)
121  DEBUG: Eigenvalue 1 : 0.007927 (0.270604 %)
122  DEBUG: Eigenvalue 2 : 0.001393 (0.047542 %)
123  DEBUG: Eigenvalue 3 : 0.001092 (0.037261 %)
124  DEBUG: Eigenvalue 4 : 0.000829 (0.028283 %)
125 
126  Without mean subtraction:
127  DEBUG: Eigenvalue 0 : 0.168627 (0.876046 %)
128  DEBUG: Eigenvalue 1 : 0.007935 (0.041223 %)
129  DEBUG: Eigenvalue 2 : 0.006049 (0.031424 %)
130  DEBUG: Eigenvalue 3 : 0.001188 (0.006173 %)
131  DEBUG: Eigenvalue 4 : 0.001050 (0.005452 %)
132 
133  After the first term above, which basically represents the mean,
134  the remaining terms carry less of the power than if you do
135  subtract off the mean. (0.041223/(1-0.876046) < 0.373870).
136  */
137  LOGL_DEBUG("TRACE5.ip.diffim.KernelPcaVisitor.subtractMean",
138  "Subtracting mean feature before Pca");
139 
140  _mean = _imagePca->getMean();
141  KernelPca<ImageT>::ImageList imageList = _imagePca->getImageList();
142  for (typename KernelPca<ImageT>::ImageList::const_iterator ptr = imageList.begin(),
143  end = imageList.end(); ptr != end; ++ptr) {
144  **ptr -= *_mean;
145  }
146  }
147 
162  template <typename ImageT>
164  {
165  Super::analyze();
166 
167  typename Super::ImageList const &eImageList = this->getEigenImages();
168  typename Super::ImageList::const_iterator iter = eImageList.begin(), end = eImageList.end();
169  for (size_t i = 0; iter != end; ++i, ++iter) {
170  PTR(ImageT) eImage = *iter;
171 
172  /*
173  * Normalise eigenImages to have a maximum of 1.0. For n > 0 they
174  * (should) have mean == 0, so we can't use that to normalize
175  */
177  double const min = stats.getValue(afwMath::MIN);
178  double const max = stats.getValue(afwMath::MAX);
179 
180  double const extreme = (fabs(min) > max) ? min :max;
181  if (extreme != 0.0) {
182  *eImage /= extreme;
183  }
184  }
185  }
186 
187 
188  typedef float PixelT;
189  template class KernelPcaVisitor<PixelT>;
191 
192 }}}} // end of namespace lsst::ip::diffim::detail
lsst::afw::image
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects.
Definition: imageAlgorithm.dox:1
lsst::afw::math::SpatialCellCandidate
Base class for candidate objects in a SpatialCell.
Definition: SpatialCell.h:70
std::shared_ptr
STL class.
lsst::ip::diffim::detail::KernelPca
Overrides the analyze method of base class afwImage::ImagePca.
Definition: KernelPca.h:24
std::vector< std::shared_ptr< Kernel > >
std::vector::size
T size(T... args)
lsst::ip::diffim::KernelCandidate
Class stored in SpatialCells for spatial Kernel fitting.
Definition: KernelCandidate.h:39
lsst::ip::diffim::detail::KernelPca::analyze
virtual void analyze()
Generate eigenimages that are normalised.
Definition: KernelPca.cc:163
lsst::afw::math::FixedKernel
A kernel created from an Image.
Definition: Kernel.h:472
lsst::ip::diffim::detail::PixelT
float PixelT
Definition: AssessSpatialKernelVisitor.cc:208
lsst::ip::diffim::detail::KernelPcaVisitor::processCandidate
void processCandidate(lsst::afw::math::SpatialCellCandidate *candidate)
Definition: KernelPca.cc:89
PTR
#define PTR(...)
Definition: base.h:41
lsst::afw::math::Statistics::getValue
double getValue(Property const prop=NOTHING) const
Return the value of the desired property (if specified in the constructor)
Definition: Statistics.cc:1056
end
int end
Definition: BoundedField.cc:105
std::vector::push_back
T push_back(T... args)
lsst::afw::math::makeStatistics
Statistics makeStatistics(lsst::afw::image::Image< Pixel > const &img, lsst::afw::image::Mask< image::MaskPixel > const &msk, int const flags, StatisticsControl const &sctrl=StatisticsControl())
Handle a watered-down front-end to the constructor (no variance)
Definition: Statistics.h:354
math.h
lsst::ip::diffim::detail::KernelPcaVisitor
A class to run a PCA on all candidate kernels (represented as Images).
Definition: KernelPca.h:40
lsst::ip::diffim::detail::KernelPcaVisitor::KernelPcaVisitor
KernelPcaVisitor(std::shared_ptr< KernelPca< ImageT > > imagePca)
Definition: KernelPca.cc:56
image
afw::table::Key< afw::table::Array< ImagePixelT > > image
Definition: HeavyFootprint.cc:216
lsst.pex::exceptions::LogicError
Reports errors in the logical structure of the program.
Definition: Runtime.h:46
lsst::ip::diffim::detail::KernelPcaVisitor::getEigenKernels
lsst::afw::math::KernelList getEigenKernels()
Definition: KernelPca.cc:65
lsst::afw::math::SpatialCellCandidate::getId
int getId() const
Return the candidate's unique ID.
Definition: SpatialCell.h:104
ptr
uint64_t * ptr
Definition: RangeSet.cc:88
max
int max
Definition: BoundedField.cc:104
image.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::ip::diffim::KernelCandidate::getKernelSolution
std::shared_ptr< StaticKernelSolution< PixelT > > getKernelSolution(CandidateSwitch cand) const
Definition: KernelCandidate.cc:322
Runtime.h
KernelPca.h
Declaration of KernelPca and KernelPcaVisitor.
lsst::ip::diffim::detail::KernelPcaVisitor::subtractMean
void subtractMean()
Definition: KernelPca.cc:113
LOGL_DEBUG
#define LOGL_DEBUG(logger, message...)
Definition: Log.h:504
std::vector::begin
T begin(T... args)
lsst::afw::math::MIN
@ MIN
estimate sample minimum
Definition: Statistics.h:76
min
int min
Definition: BoundedField.cc:103
lsst::afw::math
Definition: statistics.dox:6
KernelCandidate.h
Class used by SpatialModelCell for spatial Kernel fitting.
lsst::afw::math::Statistics
Definition: Statistics.h:215
lsst::afw::math::MAX
@ MAX
estimate sample maximum
Definition: Statistics.h:77
lsst.pex::exceptions
Definition: Exception.h:37
lsst.pex::exceptions::Exception
Provides consistent interface for LSST exceptions.
Definition: Exception.h:107
std::vector::end
T end(T... args)
lsst::afw::image::Image
A class to represent a 2-dimensional array of pixels.
Definition: Image.h:58
astshim.fitsChanContinued.iter
def iter(self)
Definition: fitsChanContinued.py:88
Log.h
LSST DM logging module built on log4cxx.