LSST Applications g180d380827+0f66a164bb,g2079a07aa2+86d27d4dc4,g2305ad1205+7d304bc7a0,g29320951ab+500695df56,g2bbee38e9b+0e5473021a,g337abbeb29+0e5473021a,g33d1c0ed96+0e5473021a,g3a166c0a6a+0e5473021a,g3ddfee87b4+e42ea45bea,g48712c4677+36a86eeaa5,g487adcacf7+2dd8f347ac,g50ff169b8f+96c6868917,g52b1c1532d+585e252eca,g591dd9f2cf+c70619cc9d,g5a732f18d5+53520f316c,g5ea96fc03c+341ea1ce94,g64a986408d+f7cd9c7162,g858d7b2824+f7cd9c7162,g8a8a8dda67+585e252eca,g99cad8db69+469ab8c039,g9ddcbc5298+9a081db1e4,ga1e77700b3+15fc3df1f7,gb0e22166c9+60f28cb32d,gba4ed39666+c2a2e4ac27,gbb8dafda3b+c92fc63c7e,gbd866b1f37+f7cd9c7162,gc120e1dc64+02c66aa596,gc28159a63d+0e5473021a,gc3e9b769f7+b0068a2d9f,gcf0d15dbbd+e42ea45bea,gdaeeff99f8+f9a426f77a,ge6526c86ff+84383d05b3,ge79ae78c31+0e5473021a,gee10cc3b42+585e252eca,gff1a9f87cc+f7cd9c7162,w.2024.17
LSST Data Management Base Package
Loading...
Searching...
No Matches
KernelImagesForRegion.cc
Go to the documentation of this file.
1// -*- LSST-C++ -*-
2
3/*
4 * LSST Data Management System
5 * Copyright 2008, 2009, 2010 LSST Corporation.
6 *
7 * This product includes software developed by the
8 * LSST Project (http://www.lsst.org/).
9 *
10 * This program is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the LSST License Statement and
21 * the GNU General Public License along with this program. If not,
22 * see <http://www.lsstcorp.org/LegalNotices/>.
23 */
24
25/*
26 * Definition of KernelImagesForRegion class declared in detail/ConvolveImage.h
27 */
28#include <sstream>
29#include <vector>
30
31
32#include "lsst/pex/exceptions.h"
33#include "lsst/log/Log.h"
34#include "lsst/geom.h"
37
39
40namespace lsst {
41namespace afw {
42namespace math {
43namespace detail {
44
46 lsst::geom::Point2I const &xy0, bool doNormalize)
47 : _kernelPtr(kernelPtr), _bbox(bbox), _xy0(xy0), _doNormalize(doNormalize), _imagePtrList(4) {
48 if (!_kernelPtr) {
49 throw LSST_EXCEPT(pexExcept::InvalidParameterError, "kernelPtr is null");
50 }
51 LOGL_DEBUG("TRACE5.lsst.afw.math.convolve.KernelImagesForRegion",
52 "KernelImagesForRegion(bbox(minimum=(%d, %d), extent=(%d, %d)), xy0=(%d, %d), doNormalize=%d, "
53 "images...)",
54 _bbox.getMinX(), _bbox.getMinY(), _bbox.getWidth(), _bbox.getHeight(), _xy0[0], _xy0[1],
55 _doNormalize);
56}
57
59 lsst::geom::Point2I const &xy0, bool doNormalize,
60 ImagePtr bottomLeftImagePtr, ImagePtr bottomRightImagePtr,
61 ImagePtr topLeftImagePtr, ImagePtr topRightImagePtr)
62 : _kernelPtr(kernelPtr), _bbox(bbox), _xy0(xy0), _doNormalize(doNormalize), _imagePtrList(4) {
63 if (!_kernelPtr) {
64 throw LSST_EXCEPT(pexExcept::InvalidParameterError, "kernelPtr is null");
65 }
66 _insertImage(BOTTOM_LEFT, bottomLeftImagePtr);
67 _insertImage(BOTTOM_RIGHT, bottomRightImagePtr);
68 _insertImage(TOP_LEFT, topLeftImagePtr);
69 _insertImage(TOP_RIGHT, topRightImagePtr);
70 LOGL_DEBUG("TRACE5.lsst.afw.math.convolve.KernelImagesForRegion",
71 "KernelImagesForRegion(bbox(minimum=(%d, %d), extent=(%d, %d)), xy0=(%d, %d), doNormalize=%d, "
72 "images...)",
73 _bbox.getMinX(), _bbox.getMinY(), _bbox.getWidth(), _bbox.getHeight(), _xy0[0], _xy0[1],
74 _doNormalize);
75}
76
78 if (_imagePtrList[location]) {
79 return _imagePtrList[location];
80 }
81
82 ImagePtr imagePtr(new Image(_kernelPtr->getDimensions()));
83 _imagePtrList[location] = imagePtr;
84 _computeImage(location);
85 return imagePtr;
86}
87
89 switch (location) {
90 case BOTTOM_LEFT:
91 return _bbox.getMin();
92 break; // paranoia
93 case BOTTOM_RIGHT:
94 return lsst::geom::Point2I(_bbox.getMaxX() + 1, _bbox.getMinY());
95 break; // paranoia
96 case TOP_LEFT:
97 return lsst::geom::Point2I(_bbox.getMinX(), _bbox.getMaxY() + 1);
98 break; // paranoia
99 case TOP_RIGHT:
100 return lsst::geom::Point2I(_bbox.getMaxX() + 1, _bbox.getMaxY() + 1);
101 break; // paranoia
102 default: {
104 os << "Bug: unhandled location = " << location;
106 }
107 }
108}
109
111 if (regionRow.isLastRow()) {
112 return false;
113 }
114
115 bool hasData = regionRow.hasData();
116 int startY;
117 if (hasData) {
118 startY = regionRow.front()->getBBox().getMaxY() + 1;
119 } else {
120 startY = this->_bbox.getMinY();
121 }
122
123 int yInd = regionRow.incrYInd();
124 int remHeight = 1 + this->_bbox.getMaxY() - startY;
125 int remYDiv = regionRow.getNY() - yInd;
126 int height = _computeNextSubregionLength(remHeight, remYDiv);
127
128 if (hasData) {
129 // Move each region up one segment
130 bool isFirst = true;
131 for (auto & rgnIter : regionRow) {
132 rgnIter->_moveUp(isFirst, height);
133 isFirst = false;
134 }
135
136 } else {
137 ImagePtr blImagePtr = getImage(BOTTOM_LEFT);
138 ImagePtr brImagePtr;
139 ImagePtr tlImagePtr;
140 ImagePtr const trImageNullPtr;
141
142 lsst::geom::Point2I blCorner = lsst::geom::Point2I(this->_bbox.getMinX(), startY);
143
144 int remWidth = this->_bbox.getWidth();
145 int remXDiv = regionRow.getNX();
146 for (auto & rgnIter : regionRow) {
147 int width = _computeNextSubregionLength(remWidth, remXDiv);
148 --remXDiv;
149 remWidth -= width;
150
152 _kernelPtr, lsst::geom::Box2I(blCorner, lsst::geom::Extent2I(width, height)), _xy0,
153 _doNormalize, blImagePtr, brImagePtr, tlImagePtr, trImageNullPtr));
154 rgnIter = regionPtr;
155
156 if (!tlImagePtr) {
157 regionPtr->getImage(TOP_LEFT);
158 }
159
160 blCorner += lsst::geom::Extent2I(width, 0);
161 blImagePtr = regionPtr->getImage(BOTTOM_RIGHT);
162 tlImagePtr = regionPtr->getImage(TOP_RIGHT);
163 }
164 }
165 return true;
166}
167
168void KernelImagesForRegion::_computeImage(Location location) const {
169 ImagePtr imagePtr = _imagePtrList[location];
170 if (!imagePtr) {
172 os << "Null imagePtr at location " << location;
173 throw LSST_EXCEPT(pexExcept::NotFoundError, os.str());
174 }
175
176 lsst::geom::Point2I pixelIndex = getPixelIndex(location);
177 _kernelPtr->computeImage(*imagePtr, _doNormalize, image::indexToPosition(pixelIndex.getX() + _xy0[0]),
178 image::indexToPosition(pixelIndex.getY() + _xy0[1]));
179}
180
181std::vector<int> KernelImagesForRegion::_computeSubregionLengths(int length, int nDivisions) {
182 if ((nDivisions > length) || (nDivisions < 1)) {
184 os << "nDivisions = " << nDivisions << " not in range [1, " << length << " = length]";
186 }
187 std::vector<int> regionLengths;
188 int remLength = length;
189 for (int remNDiv = nDivisions; remNDiv > 0; --remNDiv) {
190 int subLength = _computeNextSubregionLength(remLength, remNDiv);
191 if (subLength < 1) {
193 os << "Bug! _computeSubregionLengths(length=" << length << ", nDivisions=" << nDivisions
194 << ") computed sublength = " << subLength << " < 0; remLength = " << remLength;
195 throw LSST_EXCEPT(pexExcept::RuntimeError, os.str());
196 }
197 regionLengths.push_back(subLength);
198 remLength -= subLength;
199 }
200 return regionLengths;
201}
202
203void KernelImagesForRegion::_moveUp(bool isFirst, int newHeight) {
204 // move bbox up (this must be done before recomputing the top kernel images)
205 _bbox = lsst::geom::Box2I(lsst::geom::Point2I(_bbox.getMinX(), _bbox.getMaxY() + 1),
206 lsst::geom::Extent2I(_bbox.getWidth(), newHeight));
207
208 // swap top and bottom image pointers
209 _imagePtrList[BOTTOM_RIGHT].swap(_imagePtrList[TOP_RIGHT]);
210 _imagePtrList[BOTTOM_LEFT].swap(_imagePtrList[TOP_LEFT]);
211
212 // recompute top right, and if the first image also recompute top left
213 _computeImage(TOP_RIGHT);
214 if (isFirst) {
215 _computeImage(TOP_LEFT);
216 }
217}
218
219int const KernelImagesForRegion::_MinInterpolationSize = 10;
220
222 : _nx(nx), _ny(ny), _yInd(-1), _regionList(nx) {
223 if ((nx < 1) || (ny < 1)) {
225 os << "nx = " << nx << " and/or ny = " << ny << " < 1";
227 };
228}
229} // namespace detail
230} // namespace math
231} // namespace afw
232} // namespace lsst
AmpInfoBoxKey bbox
Definition Amplifier.cc:117
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition Exception.h:48
LSST DM logging module built on log4cxx.
#define LOGL_DEBUG(logger, message...)
Log a debug-level message using a varargs/printf style interface.
Definition Log.h:515
std::ostream * os
Definition Schema.cc:557
lsst::geom::Extent2I const getDimensions() const
Return the Kernel's dimensions (width, height)
Definition Kernel.h:212
double computeImage(lsst::afw::image::Image< Pixel > &image, bool doNormalize, double x=0.0, double y=0.0) const
Compute an image (pixellized representation of the kernel) in place.
Definition Kernel.cc:76
Location
locations of various points in the region
Definition Convolve.h:192
KernelImagesForRegion(KernelConstPtr kernelPtr, lsst::geom::Box2I const &bbox, lsst::geom::Point2I const &xy0, bool doNormalize)
Construct a KernelImagesForRegion.
bool computeNextRow(RowOfKernelImagesForRegion &regionRow) const
Compute next row of subregions.
lsst::geom::Point2I getPixelIndex(Location location) const
Compute pixel index of a given location, relative to the parent image (thus offset by bottom left cor...
ImagePtr getImage(Location location) const
Return the image and sum at the specified location.
lsst::afw::image::Image< lsst::afw::math::Kernel::Pixel > Image
Definition Convolve.h:175
RowOfKernelImagesForRegion(int nx, int ny)
Construct a RowOfKernelImagesForRegion.
std::shared_ptr< KernelImagesForRegion > front()
Return the first region in the list.
Definition Convolve.h:366
An integer coordinate rectangle.
Definition Box.h:55
int getMinY() const noexcept
Definition Box.h:158
int getHeight() const noexcept
Definition Box.h:188
Point2I const getMin() const noexcept
Definition Box.h:156
int getMinX() const noexcept
Definition Box.h:157
int getWidth() const noexcept
Definition Box.h:187
int getMaxX() const noexcept
Definition Box.h:161
int getMaxY() const noexcept
Definition Box.h:162
Reports invalid arguments.
Definition Runtime.h:66
Reports attempts to access elements using an invalid key.
Definition Runtime.h:151
Reports errors that are due to events beyond the control of the program.
Definition Runtime.h:104
double indexToPosition(double ind)
Convert image index to image position.
Definition ImageUtils.h:55
Extent< int, 2 > Extent2I
Definition Extent.h:397
Point< int, 2 > Point2I
Definition Point.h:321
T push_back(T... args)