49 int bitcount(
unsigned int x) {
51 for (b = 0; x != 0; x >>= 1) {
62 void checkOnlyOneFlag(
unsigned int flags) {
63 if (bitcount(flags & ~
ERRORS) != 1) {
65 "Requested more than one type of statistic to make the image stack.");
72 template <
typename ObjectVectorT,
typename WeightVectorT>
73 void checkObjectsAndWeights(ObjectVectorT
const &objects, WeightVectorT
const &wvector) {
74 if (objects.size() == 0) {
78 if (!wvector.empty() && wvector.size() != objects.size()) {
81 "from number of objects to be stacked: %d v. %d") %
82 wvector.size() % objects.size()));
86 template <
typename ImageT>
89 for (
unsigned int i = 0; i < images.size(); ++i) {
90 if (images[i]->getDimensions() != dim) {
92 (
boost::format(
"Bad dimensions for image %d: %dx%d vs %dx%d") % i %
93 images[i]->getDimensions().getX() % images[i]->getDimensions().getY() %
94 dim.getX() % dim.getY())
115 template <
typename PixelT,
bool isWeighted,
bool useVariance>
120 WeightVector
const &wvector = WeightVector()) {
126 MaskedVector<PixelT> pixelSet(images.size());
127 WeightVector weights;
129 StatisticsControl sctrlTmp(sctrl);
133 assert(wvector.empty());
135 weights.resize(images.size());
137 sctrlTmp.setWeighted(
true);
138 }
else if (isWeighted) {
139 weights.assign(wvector.begin(), wvector.end());
141 sctrlTmp.setWeighted(
true);
143 assert(weights.empty() || weights.size() == images.size());
148 for (
unsigned int i = 0; i < images.size(); ++i) {
149 x_iterator
ptr = images[i]->row_begin(
y);
159 WeightVector::iterator wtPtr = weights.begin();
160 for (
unsigned int i = 0; i < images.size(); ++rows[i], ++i, ++psPtr, ++wtPtr) {
163 *wtPtr = 1.0 / rows[i].variance();
168 Statistics stat = isWeighted ?
makeStatistics(pixelSet, weights, eflags, sctrlTmp)
169 : makeStatistics(pixelSet, eflags, sctrlTmp);
173 int const npoint = stat.getValue(
NPOINT);
175 msk = sctrlTmp.getNoGoodPixelsMask();
176 }
else if (npoint == 1) {
188 if (stat.getValue(
NMASKED) > 0) {
189 for (
auto const &pair : maskMap) {
190 for (
auto pp = pixelSet.begin(); pp != pixelSet.end(); ++pp) {
191 if ((*pp).mask() & pair.first) {
203 template <
typename PixelT,
bool isWeighted,
bool useVariance>
207 image::MaskPixel const excuse, WeightVector
const &wvector = WeightVector()) {
210 computeMaskedImageStack<PixelT, isWeighted, useVariance>(imgStack, images, flags, sctrl, clipped, maskMap,
217 template <
typename PixelT>
222 if (images.size() == 0) {
231 template <
typename PixelT>
236 if (images.size() == 0) {
241 statisticsStack(*out, images, flags, sctrl, wvector, clipped, maskMap);
245 template <
typename PixelT>
250 checkObjectsAndWeights(images, wvector);
251 checkOnlyOneFlag(flags);
252 checkImageSizes(out, images);
255 if (wvector.empty()) {
256 return computeMaskedImageStack<PixelT, true, true>(out, images, flags, sctrl, clipped,
259 return computeMaskedImageStack<PixelT, true, false>(out, images, flags, sctrl, clipped, excuse,
263 return computeMaskedImageStack<PixelT, false, false>(out, images, flags, sctrl, clipped, excuse);
267 template <
typename PixelT>
272 checkObjectsAndWeights(images, wvector);
273 checkOnlyOneFlag(flags);
274 checkImageSizes(out, images);
277 if (wvector.empty()) {
278 return computeMaskedImageStack<PixelT, true, true>(out, images, flags, sctrl, clipped,
281 return computeMaskedImageStack<PixelT, true, false>(out, images, flags, sctrl, clipped, maskMap,
285 return computeMaskedImageStack<PixelT, false, false>(out, images, flags, sctrl, clipped, maskMap);
305 template <
typename PixelT,
bool isWeighted>
315 if (!weights.empty()) {
316 sctrlTmp.setWeighted(
true);
321 for (
int x = 0; x != imgStack.
getWidth(); ++
x) {
322 for (
unsigned int i = 0; i != images.size(); ++i) {
323 (*pixelSet.getImage())(i, 0) = (*images[i])(x,
y);
337 template <
typename PixelT>
341 if (images.size() == 0) {
349 template <
typename PixelT>
352 checkObjectsAndWeights(images, wvector);
353 checkOnlyOneFlag(flags);
354 checkImageSizes(out, images);
356 if (wvector.empty()) {
357 return computeImageStack<PixelT, false>(out, images, flags, sctrl);
359 return computeImageStack<PixelT, true>(out, images, flags, sctrl, wvector);
377 template <
typename PixelT,
bool isWeighted>
383 Vect vecStack(vectors[0].size(), 0.0);
391 if (!wvector.empty()) {
392 sctrlTmp.setWeighted(
true);
396 for (
unsigned int x = 0; x < vectors[0].size(); ++
x) {
398 for (
unsigned int i = 0; i < vectors.size(); ++i, ++psPtr) {
399 psPtr.
value() = (vectors[i])[x];
414 template <
typename PixelT>
418 checkObjectsAndWeights(vectors, wvector);
419 checkOnlyOneFlag(flags);
421 if (wvector.empty()) {
422 return computeVectorStack<PixelT, false>(vectors, flags, sctrl);
424 return computeVectorStack<PixelT, true>(vectors, flags, sctrl, wvector);
434 template <
typename PixelT>
437 int x0 = image.
getX0();
438 int y0 = image.
getY0();
444 if (dimension ==
'x') {
447 typename MImage::y_iterator oEnd = imgOut->col_end(0);
448 for (
typename MImage::y_iterator oPtr = imgOut->col_begin(0); oPtr != oEnd; ++oPtr, ++
y) {
457 }
else if (dimension ==
'y') {
460 typename MImage::x_iterator oEnd = imgOut->row_end(0);
461 for (
typename MImage::x_iterator oPtr = imgOut->row_begin(0); oPtr != oEnd; ++oPtr, ++
x) {
471 "Can only run statisticsStack in x or y for single image.");
477 template <
typename PixelT>
481 int const x0 = image.
getX0();
482 int const y0 = image.
getY0();
488 if (dimension ==
'x') {
491 typename MImage::y_iterator oEnd = imgOut->col_end(0);
492 for (
typename MImage::y_iterator oPtr = imgOut->col_begin(0); oPtr != oEnd; ++oPtr, ++
y) {
501 }
else if (dimension ==
'y') {
504 typename MImage::x_iterator oEnd = imgOut->row_end(0);
505 for (
typename MImage::x_iterator oPtr = imgOut->row_begin(0); oPtr != oEnd; ++oPtr, ++
x) {
515 "Can only run statisticsStack in x or y for single image.");
526 #define INSTANTIATE_STACKS(TYPE) \ 527 template std::shared_ptr<image::Image<TYPE>> statisticsStack<TYPE>( \ 528 std::vector<std::shared_ptr<image::Image<TYPE>>> & images, Property flags, \ 529 StatisticsControl const &sctrl, WeightVector const &wvector); \ 530 template void statisticsStack<TYPE>( \ 531 image::Image<TYPE> & out, std::vector<std::shared_ptr<image::Image<TYPE>>> & images, \ 532 Property flags, StatisticsControl const &sctrl, WeightVector const &wvector); \ 533 template std::shared_ptr<image::MaskedImage<TYPE>> statisticsStack<TYPE>( \ 534 std::vector<std::shared_ptr<image::MaskedImage<TYPE>>> & images, Property flags, \ 535 StatisticsControl const &sctrl, WeightVector const &wvector, image::MaskPixel, \ 537 template std::shared_ptr<image::MaskedImage<TYPE>> statisticsStack<TYPE>( \ 538 std::vector<std::shared_ptr<image::MaskedImage<TYPE>>> & images, Property flags, \ 539 StatisticsControl const &sctrl, WeightVector const &wvector, image::MaskPixel, \ 540 std::vector<std::pair<image::MaskPixel, image::MaskPixel>> const &); \ 541 template void statisticsStack<TYPE>(image::MaskedImage<TYPE> & out, \ 542 std::vector<std::shared_ptr<image::MaskedImage<TYPE>>> & images, \ 543 Property flags, StatisticsControl const &sctrl, \ 544 WeightVector const &wvector, image::MaskPixel, image::MaskPixel); \ 545 template void statisticsStack<TYPE>( \ 546 image::MaskedImage<TYPE> & out, std::vector<std::shared_ptr<image::MaskedImage<TYPE>>> & images, \ 547 Property flags, StatisticsControl const &sctrl, WeightVector const &wvector, image::MaskPixel, \ 548 std::vector<std::pair<image::MaskPixel, image::MaskPixel>> const &); \ 549 template std::vector<TYPE> statisticsStack<TYPE>( \ 550 std::vector<std::vector<TYPE>> & vectors, Property flags, \ 551 StatisticsControl const &sctrl, WeightVector const &wvector); \ 552 template std::shared_ptr<image::MaskedImage<TYPE>> statisticsStack(image::Image<TYPE> const &image, \ 553 Property flags, char dimension, \ 554 StatisticsControl const &sctrl); \ 555 template std::shared_ptr<image::MaskedImage<TYPE>> statisticsStack( \ 556 image::MaskedImage<TYPE> const &image, Property flags, char dimension, \ 557 StatisticsControl const &sctrl); 559 INSTANTIATE_STACKS(
double)
560 INSTANTIATE_STACKS(
float)
lsst::afw::image::pixel::Pixel< ImagePixelT, MaskPixelT, VariancePixelT > Pixel
A Pixel in the MaskedImage.
lsst::afw::image::MaskedImage< EntryT >::Image::Pixel & value()
double getError(Property const prop=NOTHING) const
Return the error in the desired property (if specified in the constructor)
int getHeight() const
Return the number of rows in the image.
Reports attempts to exceed implementation-defined length limits for some classes. ...
int getX0() const
Return the image's column-origin.
Include errors of requested quantities.
A class to evaluate image statistics.
MaskedImageIterator< typename Image::iterator, typename Mask::iterator, typename Variance::iterator > iterator
std::shared_ptr< lsst::afw::image::Image< PixelT > > statisticsStack(std::vector< std::shared_ptr< lsst::afw::image::Image< PixelT >>> &images, Property flags, StatisticsControl const &sctrl=StatisticsControl(), std::vector< lsst::afw::image::VariancePixel > const &wvector=std::vector< lsst::afw::image::VariancePixel >(0))
A function to compute some statistics of a stack of Images.
int getHeight() const
Return the number of rows in the image.
Pass parameters to a Statistics object.
A base class for image defects.
int getX0() const
Return the image's column-origin.
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)
A Mask wrapper to provide an infinite_iterator for Mask::row_begin().
x_iterator row_begin(int y) const
Return an x_iterator to the start of the image.
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
A class to manipulate images, masks, and variance as a single object.
double getValue(Property const prop=NOTHING) const
Return the value of the desired property (if specified in the constructor)
x_iterator row_end(int y) const
Return an x_iterator to the end of the image.
int getY0() const
Return the image's row-origin.
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
int getY0() const
Return the image's row-origin.
int getWidth() const
Return the number of columns in the image.
Reports invalid arguments.
int getWidth() const
Return the number of columns in the image.
bool getWeighted() const noexcept
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects...
Property
control what is calculated
An integer coordinate rectangle.
A class to represent a 2-dimensional array of pixels.