LSSTApplications  12.1-5-gbdcc3ab+2,15.0+13,15.0+26,15.0-1-g19261fa+17,15.0-1-g60afb23+26,15.0-1-g615e0bb+18,15.0-1-g788a293+26,15.0-1-ga91101e+26,15.0-1-gae1598d+12,15.0-1-gd076f1f+24,15.0-1-gdf18595+5,15.0-1-gf4f1c34+12,15.0-11-g7db6e543+4,15.0-12-g3681e7a+4,15.0-15-gc15de322,15.0-16-g83b84f4,15.0-2-g100d730+19,15.0-2-g1f9c9cf+4,15.0-2-g8aea5f4+1,15.0-2-gf38729e+21,15.0-29-ga12a2b06e,15.0-3-g11fe1a0+14,15.0-3-g707930d+3,15.0-3-g9103c06+12,15.0-3-gd3cbb57+3,15.0-4-g2d82b59,15.0-4-g535e784+10,15.0-4-g92ca6c3+4,15.0-4-gf906033+2,15.0-5-g23e394c+14,15.0-5-g4be42a9,15.0-6-g69628aa,15.0-6-g86e3f3d+1,15.0-6-gfa9b38f+4,15.0-7-g949993c+3,15.0-8-g67a62d3+1,15.0-8-gcf05001+1,15.0-9-g1e7c341+1,w.2018.21
LSSTDataManagementBasePackage
Psf.cc
Go to the documentation of this file.
1 // -*- LSST-C++ -*-
2 #include <limits>
3 #include <typeinfo>
4 #include <cmath>
5 #include <memory>
6 
7 #include "lsst/utils/Cache.h"
11 
12 namespace lsst {
13 namespace afw {
14 namespace detection {
15 namespace detail {
16 
17 // Key for caching PSFs with lsst::utils::Cache
18 //
19 // We cache PSFs by their x,y position. Although there are placeholders
20 // in the `Psf` class and here for `image::Color`, these are not used
21 // in the cache because `image::Color` is not currently well-defined
22 // or used.
23 struct PsfCacheKey {
26 
27  PsfCacheKey(geom::Point2D const &position_, image::Color color_ = image::Color())
28  : position(position_), color(color_) {}
29 
30  bool operator==(PsfCacheKey const &other) const {
31  return position == other.position; // Currently don't care about color
32  }
33 
34  friend std::ostream &operator<<(std::ostream &os, PsfCacheKey const &key) { return os << key.position; }
35 };
36 
37 } // namespace detail
38 } // namespace detection
39 } // namespace afw
40 } // namespace lsst
41 
42 namespace std {
43 
44 // Template specialisation for hashing PsfCacheKey
45 //
46 // We currently ignore the color.
47 template <>
48 struct hash<lsst::afw::detection::detail::PsfCacheKey> {
50  std::size_t seed = 0;
51  return lsst::utils::hashCombine(seed, key.position.getX(), key.position.getY());
52  }
53 };
54 
55 } // namespace std
56 
57 namespace lsst {
58 namespace afw {
59 namespace detection {
60 
61 namespace {
62 
63 bool isPointNull(geom::Point2D const &p) { return std::isnan(p.getX()) && std::isnan(p.getY()); }
64 
65 } // namespace
66 
67 Psf::Psf(bool isFixed, std::size_t capacity) : daf::base::Citizen(typeid(this)), _isFixed(isFixed) {
68  _imageCache = std::make_unique<PsfCache>(capacity);
69  _kernelImageCache = std::make_unique<PsfCache>(capacity);
70 }
71 
72 Psf::~Psf() = default;
73 
74 Psf::Psf(Psf const &other) : Psf(other._isFixed, other.getCacheCapacity()) {}
75 
77  : daf::base::Citizen(std::move(other)),
78  _isFixed(other._isFixed),
79  _imageCache(std::move(other._imageCache)),
80  _kernelImageCache(std::move(other._kernelImageCache)) {}
81 
83  geom::Point2D const &position,
84  std::string const &warpAlgorithm,
85  unsigned int warpBuffer) {
86  // "ir" : (integer, residual)
87  std::pair<int, double> const irX = image::positionToIndex(position.getX(), true);
88  std::pair<int, double> const irY = image::positionToIndex(position.getY(), true);
89 
90  if (irX.second != 0.0 || irY.second != 0.0) {
91  im = math::offsetImage(*im, irX.second, irY.second, warpAlgorithm, warpBuffer);
92  }
93 
94  im->setXY0(irX.first + im->getX0(), irY.first + im->getY0());
95  return im;
96 }
97 
99  ImageOwnerEnum owner) const {
100  if (isPointNull(position)) position = getAveragePosition();
101  if (color.isIndeterminate()) color = getAverageColor();
102  std::shared_ptr<Psf::Image> result = (*_imageCache)(
103  detail::PsfCacheKey(position, color),
104  [this](detail::PsfCacheKey const &key) { return doComputeImage(key.position, key.color); });
105  if (owner == COPY) {
106  result = std::make_shared<Image>(*result, true);
107  }
108  return result;
109 }
110 
112  ImageOwnerEnum owner) const {
113  if (_isFixed || isPointNull(position)) position = getAveragePosition();
114  if (_isFixed || color.isIndeterminate()) color = getAverageColor();
115  std::shared_ptr<Psf::Image> result = (*_kernelImageCache)(
116  detail::PsfCacheKey(position, color),
117  [this](detail::PsfCacheKey const &key) { return doComputeKernelImage(key.position, key.color); });
118  if (owner == COPY) {
119  result = std::make_shared<Image>(*result, true);
120  }
121  return result;
122 }
123 
125  if (isPointNull(position)) position = getAveragePosition();
126  if (color.isIndeterminate()) color = getAverageColor();
127  return doComputeBBox(position, color);
128 }
129 
131  if (isPointNull(position)) position = getAveragePosition();
132  if (color.isIndeterminate()) color = getAverageColor();
133  // FixedKernel ctor will deep copy image, so we can use INTERNAL.
135  return std::make_shared<math::FixedKernel>(*image);
136 }
137 
139  if (isPointNull(position)) position = getAveragePosition();
140  if (color.isIndeterminate()) color = getAverageColor();
142  return (*image)(-image->getX0(), -image->getY0());
143 }
144 
145 double Psf::computeApertureFlux(double radius, geom::Point2D position, image::Color color) const {
146  if (isPointNull(position)) position = getAveragePosition();
147  if (color.isIndeterminate()) color = getAverageColor();
148  return doComputeApertureFlux(radius, position, color);
149 }
150 
152  if (isPointNull(position)) position = getAveragePosition();
153  if (color.isIndeterminate()) color = getAverageColor();
154  return doComputeShape(position, color);
155 }
156 
157 std::shared_ptr<Psf::Image> Psf::doComputeImage(geom::Point2D const &position,
158  image::Color const &color) const {
159  std::shared_ptr<Psf::Image> im = computeKernelImage(position, color, COPY);
160  return recenterKernelImage(im, position);
161 }
162 
164 
165 std::size_t Psf::getCacheCapacity() const { return _kernelImageCache->capacity(); }
166 
168  _imageCache->reserve(capacity);
169  _kernelImageCache->reserve(capacity);
170 }
171 
172 } // namespace detection
173 } // namespace afw
174 } // namespace lsst
An ellipse core with quadrupole moments as parameters.
Definition: Quadrupole.h:47
Psf(Psf const &)
Definition: Psf.cc:74
int positionToIndex(double pos)
Convert image position to nearest integer index.
Definition: ImageUtils.h:69
std::size_t getCacheCapacity() const
Return the capacity of the caches.
Definition: Psf.cc:165
PsfCacheKey(geom::Point2D const &position_, image::Color color_=image::Color())
Definition: Psf.cc:27
std::size_t operator()(lsst::afw::detection::detail::PsfCacheKey const &key) const
Definition: Psf.cc:49
py::object result
Definition: schema.cc:284
STL namespace.
ImageOwnerEnum
Enum passed to computeImage and computeKernelImage to determine image ownership.
Definition: Psf.h:88
double computePeak(geom::Point2D position=makeNullPoint(), image::Color color=image::Color()) const
Return the peak value of the PSF image.
Definition: Psf.cc:138
image::Color getAverageColor() const
Return the average Color of the stars used to construct the Psf.
Definition: Psf.h:226
An integer coordinate rectangle.
Definition: Box.h:55
STL class.
std::shared_ptr< Image > computeKernelImage(geom::Point2D position=makeNullPoint(), image::Color color=image::Color(), ImageOwnerEnum owner=COPY) const
Return an Image of the PSF, in a form suitable for convolution.
Definition: Psf.cc:111
friend std::ostream & operator<<(std::ostream &os, PsfCacheKey const &key)
Definition: Psf.cc:34
std::shared_ptr< math::Kernel const > getLocalKernel(geom::Point2D position=makeNullPoint(), image::Color color=image::Color()) const
Return a FixedKernel corresponding to the Psf image at the given point.
Definition: Psf.cc:130
A base class for image defects.
Definition: cameraGeom.dox:3
Point< double, 2 > Point2D
Definition: Point.h:304
bool operator==(PsfCacheKey const &other) const
Definition: Psf.cc:30
double computeApertureFlux(double radius, geom::Point2D position=makeNullPoint(), image::Color color=image::Color()) const
Compute the "flux" of the Psf model within a circular aperture of the given radius.
Definition: Psf.cc:145
std::shared_ptr< Image > computeImage(geom::Point2D position=makeNullPoint(), image::Color color=image::Color(), ImageOwnerEnum owner=COPY) const
Return an Image of the PSF, in a form that can be compared directly with star images.
Definition: Psf.cc:98
void setCacheCapacity(std::size_t capacity)
Set the capacity of the caches.
Definition: Psf.cc:167
geom::Point2D const position
Definition: Psf.cc:24
geom::ellipses::Quadrupole computeShape(geom::Point2D position=makeNullPoint(), image::Color color=image::Color()) const
Compute the ellipse corresponding to the second moments of the Psf.
Definition: Psf.cc:151
std::shared_ptr< ImageT > offsetImage(ImageT const &image, float dx, float dy, std::string const &algorithmName="lanczos5", unsigned int buffer=0)
Return an image offset by (dx, dy) using the specified algorithm.
Definition: offsetImage.cc:43
Citizen(const std::type_info &)
Definition: Citizen.cc:168
Key< U > key
Definition: Schema.cc:280
std::size_t hashCombine(std::size_t seed)
Combine hashes.
Definition: hashCombine.h:24
T isnan(T... args)
ItemVariant const * other
Definition: Schema.cc:55
static std::shared_ptr< Image > recenterKernelImage(std::shared_ptr< Image > im, geom::Point2D const &position, std::string const &warpAlgorithm="lanczos5", unsigned int warpBuffer=5)
Helper function for Psf::doComputeImage(): converts a kernel image (centered at (0,0) when xy0 is taken into account) to an image centered at position when xy0 is taken into account.
Definition: Psf.cc:82
An internal image will be returned without copying.
Definition: Psf.h:90
geom::Box2I computeBBox(geom::Point2D position=makeNullPoint(), image::Color color=image::Color()) const
Return the bounding box of the image returned by computeKernelImage()
Definition: Psf.cc:124
Describe the colour of a source.
Definition: Color.h:26
A polymorphic base class for representing an image&#39;s Point Spread Function.
Definition: Psf.h:77
virtual geom::Point2D getAveragePosition() const
Return the average position of the stars used to construct the Psf.
Definition: Psf.cc:163
STL class.
bool isIndeterminate() const
Whether the color is the special value that indicates that it is unspecified.
Definition: Color.h:37
std::ostream * os
Definition: Schema.cc:736
The image will be copied before returning; caller will own it.
Definition: Psf.h:89