2#ifndef LSST_AFW_fitsCompression_h_INCLUDED
3#define LSST_AFW_fitsCompression_h_INCLUDED
8#include "boost/cstdfloat.hpp"
13#include "ndarray/eigen.h"
33 static int const value = 8;
37 static int const value = 16;
41 static int const value = 32;
45 static int const value = 64;
49 static int const value = 16;
53 static int const value = 32;
57 static int const value = 64;
61 static int const value = -32;
65 static int const value = -64;
105 _manager(array.getManager()) {}
110 template <
typename U>
113 _manager = mem.first;
114 _pixels = mem.second;
121 void const*
getData()
const override {
return _pixels; }
125 ndarray::Manager::Ptr _manager;
137 return std::make_shared<PixelArray<T>>(array);
139 return std::make_shared<PixelArray<std::uint8_t>>(array);
141 return std::make_shared<PixelArray<std::int16_t>>(array);
143 return std::make_shared<PixelArray<std::int32_t>>(array);
145 return std::make_shared<PixelArray<std::int64_t>>(array);
147 return std::make_shared<PixelArray<boost::float32_t>>(array);
149 return std::make_shared<PixelArray<boost::float64_t>>(array);
152 os <<
"Unrecognized bitpix: " << bitpix;
194 using Tiles = ndarray::Array<long, 1, 1>;
202 float quantizeLevel_ = 0.0)
206 float quantizeLevel_ = 0.0)
217 float quantizeLevel_ = 0.0);
223 template <
typename T>
226 template <
typename T>
279 bzero(
std::floor(bzero_ / bscale_ + 0.5) * bscale_),
292 template <
typename T>
294 ndarray::Array<T const, 2, 2>
const&
image,
bool forceNonfiniteRemoval,
bool fuzz =
true,
295 ndarray::Array<long, 1>
const& tiles = ndarray::Array<long, 1, 1>(),
int seed = 1)
const;
302 template <
typename T>
303 ndarray::Array<T, 2, 2>
fromFits(ndarray::Array<T, 2, 2>
const&
image)
const;
395 float quantizeLevel_ = 4.0,
float quantizePad_ = 5.0,
bool fuzz_ =
true,
396 double bscale_ = 1.0,
double bzero_ = 0.0);
411 template <
typename T>
418 template <
typename T>
419 [[deprecated(
"Replaced by a non-shared_ptr overload. Will be removed after v25.")]]
425 template <
typename T,
int N>
427 ndarray::Array<bool, N, N>
const& mask)
const;
432 template <
typename T>
436 if (mask &&
image.getDimensions() !=
mask->getDimensions()) {
438 os <<
"Size mismatch between image and mask: ";
441 os <<
mask->getWidth() <<
"x" <<
mask->getHeight();
444 ndarray::Array<T const, 2, 2> imageArray = ndarray::dynamic_dimension_cast<2>(
image.getArray());
445 if (imageArray.empty()) imageArray = ndarray::copy(
image.getArray());
446 ndarray::Array<bool, 2, 2> maskArray = ndarray::allocate(imageArray.getShape());
450 maskArray.deep() =
false;
461 template <
typename T,
int N>
462 ImageScale determineFromRange(ndarray::Array<T const, N, N>
const&
image,
463 ndarray::Array<bool, N, N>
const& mask,
bool isUnsigned =
false,
464 bool cfitsioPadding =
true)
const;
472 template <
typename T,
int N>
473 ImageScale determineFromStdev(ndarray::Array<T const, N, N>
const&
image,
474 ndarray::Array<bool, N, N>
const& mask,
bool isUnsigned =
false,
475 bool cfitsioPadding =
true)
const;
table::Key< std::string > name
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Options for scaling image pixels.
ImageScale determine(image::ImageBase< T > const &image, std::shared_ptr< image::Mask< image::MaskPixel > const > mask) const
ScalingAlgorithm algorithm
Scaling algorithm to use.
float quantizeLevel
Divisor of the standard deviation for STDEV_* scaling.
@ MANUAL
Scale set manually.
@ STDEV_NEGATIVE
Scale based on the standard deviation, dynamic range negative.
@ STDEV_POSITIVE
Scale based on the standard deviation. dynamic range positive.
@ STDEV_BOTH
Scale based on the standard deviation, dynamic range positive+negative.
@ RANGE
Scale to preserve dynamic range.
ImageScalingOptions(int bitpix_, double bscale_=1.0, double bzero_=0.0)
Manual scaling Ctor.
bool fuzz
Fuzz the values when quantising floating-point values?
ImageScale determine(image::ImageBase< T > const &image, image::Mask< image::MaskPixel > const *mask=nullptr) const
Determine the scaling for a particular image.
float quantizePad
Number of stdev to allow on the low/high side (for STDEV_POSITIVE/NEGATIVE)
ImageScalingOptions()
Default Ctor.
int bitpix
Bits per pixel (0, 8,16,32,64,-32,-64)
double bscale
Manually specified BSCALE (for MANUAL scaling)
ImageScale determine(ndarray::Array< T const, N, N > const &image, ndarray::Array< bool, N, N > const &mask) const
std::vector< std::string > maskPlanes
Mask planes to ignore when doing statistics.
int seed
Seed for random number generator when fuzzing.
double bzero
Manually specified BZERO (for MANUAL scaling)
Abstract base class for an array of pixel values.
PixelArrayBase(std::size_t num)
virtual ~PixelArrayBase()
std::size_t getNumElements() const
Return the number of pixels.
virtual void const * getData() const =0
Return a void* array of the pixels.
Typed array of pixel values.
void const * getData() const override
Return a void* array of the pixels.
PixelArray(PixelArray const &)=delete
PixelArray(ndarray::Array< U, 1, 1 > const &array)
Construct from an ndarray::Array of different type.
PixelArray(ndarray::Array< T, 1, 1 > const &array)
Construct from an ndarray::Array of the same type.
The base class for all image classed (Image, Mask, MaskedImage, ...)
A class to represent a 2-dimensional array of pixels.
Represent a 2-dimensional array of bitmask pixels.
Reports invalid arguments.
std::shared_ptr< PixelArrayBase > makePixelArray(int bitpix, ndarray::Array< T, 1, 1 > const &array)
Create a PixelArray suitable for an image with the nominated BITPIX.
ImageScalingOptions::ScalingAlgorithm scalingAlgorithmFromString(std::string const &name)
Interpret scaling algorithm expressed in string.
int compressionAlgorithmToCfitsio(ImageCompressionOptions::CompressionAlgorithm algorithm)
Convert ImageCompressionOptions::CompressionAlgorithm to cfitsio.
std::string scalingAlgorithmToString(ImageScalingOptions::ScalingAlgorithm algorithm)
Provide string version of compression algorithm.
ImageCompressionOptions::CompressionAlgorithm compressionAlgorithmFromCfitsio(int cfitsio)
Convert compression algorithm from cfitsio to ImageCompressionOptions::CompressionAlgorithm.
ImageCompressionOptions::CompressionAlgorithm compressionAlgorithmFromString(std::string const &name)
Interpret compression algorithm expressed in string.
Options for tile compression of image pixels.
ImageCompressionOptions(CompressionAlgorithm algorithm_, Tiles tiles_, float quantizeLevel_=0.0)
Custom compression.
float quantizeLevel
quantization level: 0.0 = none requires use of GZIP or GZIP_SHUFFLE
CompressionAlgorithm algorithm
Compresion algorithm to use.
ndarray::Array< long, 1, 1 > Tiles
ImageCompressionOptions(image::Mask< T > const &mask)
Tiles tiles
Tile size; a dimension with 0 means infinite (e.g., to specify one row: 0,1)
ImageCompressionOptions(image::Image< std::int64_t > const &image)
ImageCompressionOptions(image::Mask< std::uint64_t > const &mask)
ImageCompressionOptions(image::Image< std::uint64_t > const &image)
CompressionAlgorithm
Compression algorithms.
@ GZIP_SHUFFLE
GZIP compression with shuffle (most-significant byte first)
@ GZIP
Standard GZIP compression.
ImageCompressionOptions(image::Image< T > const &image)
Default compression for a particular style of image.
ImageCompressionOptions(image::Mask< std::int64_t > const &mask)
ImageCompressionOptions(CompressionAlgorithm algorithm_, std::vector< long > tiles_, float quantizeLevel_=0.0)
double bscale
Scale to apply when reading from FITS.
long blank
Value for integer images indicating non-finite values.
ImageScale(int bitpix_, double bscale_, double bzero_)
Constructor.
int bitpix
Bits per pixel; negative means floating-point: 8,16,32,64,-32,-64.
double bzero
Zero-point to apply when reading from FITS.
ndarray::Array< T, 2, 2 > fromFits(ndarray::Array< T, 2, 2 > const &image) const
Convert to an array.
std::shared_ptr< detail::PixelArrayBase > toFits(ndarray::Array< T const, 2, 2 > const &image, bool forceNonfiniteRemoval, bool fuzz=true, ndarray::Array< long, 1 > const &tiles=ndarray::Array< long, 1, 1 >(), int seed=1) const
Convert to an array of pixel values to write to FITS.
FITS BITPIX header value by C++ type.