24 #include <pybind11/pybind11.h> 
   25 #include <pybind11/stl.h> 
   29 #include "ndarray/pybind11.h" 
   41 using namespace pybind11::literals;
 
   46 void declareImageCompression(lsst::utils::python::WrapperCollection &wrappers) {
 
   47     auto options = wrappers.wrapType(
 
   48             py::class_<ImageCompressionOptions>(wrappers.module, 
"ImageCompressionOptions"),
 
   49             [](
auto &mod, 
auto &cls) {
 
   50                 cls.def(py::init<ImageCompressionOptions::CompressionAlgorithm,
 
   51                                  ImageCompressionOptions::Tiles, float>(),
 
   52                         "algorithm"_a, 
"tiles"_a, 
"quantizeLevel"_a = 0.0);
 
   53                 cls.def(py::init<ImageCompressionOptions::CompressionAlgorithm, int, float>(), 
"algorithm"_a,
 
   54                         "rows"_a = 1, 
"quantizeLevel"_a = 0.0);
 
   56                 cls.def(py::init<lsst::afw::image::Image<unsigned char> const &>());
 
   57                 cls.def(py::init<lsst::afw::image::Image<unsigned short> const &>());
 
   58                 cls.def(py::init<lsst::afw::image::Image<short> const &>());
 
   59                 cls.def(py::init<lsst::afw::image::Image<int> const &>());
 
   60                 cls.def(py::init<lsst::afw::image::Image<unsigned int> const &>());
 
   61                 cls.def(py::init<lsst::afw::image::Image<float> const &>());
 
   62                 cls.def(py::init<lsst::afw::image::Image<double> const &>());
 
   63                 cls.def(py::init<lsst::afw::image::Image<std::uint64_t> const &>());
 
   65                 cls.def(py::init<lsst::afw::image::Mask<unsigned char> const &>());
 
   66                 cls.def(py::init<lsst::afw::image::Mask<unsigned short> const &>());
 
   67                 cls.def(py::init<lsst::afw::image::Mask<short> const &>());
 
   68                 cls.def(py::init<lsst::afw::image::Mask<std::int32_t> const &>());
 
   70                 cls.def_readonly(
"algorithm", &ImageCompressionOptions::algorithm);
 
   71                 cls.def_readonly(
"tiles", &ImageCompressionOptions::tiles);
 
   72                 cls.def_readonly(
"quantizeLevel", &ImageCompressionOptions::quantizeLevel);
 
   75             py::enum_<ImageCompressionOptions::CompressionAlgorithm>(options, 
"CompressionAlgorithm"),
 
   76             [](
auto &mod, 
auto &enm) {
 
   77                 enm.value(
"NONE", ImageCompressionOptions::CompressionAlgorithm::NONE);
 
   78                 enm.value(
"GZIP", ImageCompressionOptions::CompressionAlgorithm::GZIP);
 
   79                 enm.value(
"GZIP_SHUFFLE", ImageCompressionOptions::CompressionAlgorithm::GZIP_SHUFFLE);
 
   80                 enm.value(
"RICE", ImageCompressionOptions::CompressionAlgorithm::RICE);
 
   81                 enm.value(
"PLIO", ImageCompressionOptions::CompressionAlgorithm::PLIO);
 
   87 void declareImageScalingOptionsTemplates(py::class_<ImageScalingOptions> &cls) {
 
   88     cls.def(
"determine", &ImageScalingOptions::determine<T>);
 
   91 void declareImageScalingOptions(lsst::utils::python::WrapperCollection &wrappers) {
 
   92     auto options = wrappers.wrapType(
 
   93             py::class_<ImageScalingOptions>(wrappers.module, 
"ImageScalingOptions"),
 
   94             [](
auto &mod, 
auto &cls) {
 
   95                 cls.def(py::init<>());
 
   96                 cls.def(py::init<ImageScalingOptions::ScalingAlgorithm, int, std::vector<std::string> const &,
 
   97                                  unsigned long, float, float, bool, double, double>(),
 
   98                         "algorithm"_a, 
"bitpix"_a, 
"maskPlanes"_a = std::vector<std::string>(), 
"seed"_a = 1,
 
   99                         "quantizeLevel"_a = 4.0, 
"quantizePad"_a = 5.0, 
"fuzz"_a = true, 
"bscale"_a = 1.0,
 
  102                 cls.def_readonly(
"algorithm", &ImageScalingOptions::algorithm);
 
  103                 cls.def_readonly(
"bitpix", &ImageScalingOptions::bitpix);
 
  104                 cls.def_readonly(
"maskPlanes", &ImageScalingOptions::maskPlanes);
 
  105                 cls.def_readonly(
"seed", &ImageScalingOptions::seed);
 
  106                 cls.def_readonly(
"quantizeLevel", &ImageScalingOptions::quantizeLevel);
 
  107                 cls.def_readonly(
"quantizePad", &ImageScalingOptions::quantizePad);
 
  108                 cls.def_readonly(
"fuzz", &ImageScalingOptions::fuzz);
 
  109                 cls.def_readonly(
"bscale", &ImageScalingOptions::bscale);
 
  110                 cls.def_readonly(
"bzero", &ImageScalingOptions::bzero);
 
  112                 declareImageScalingOptionsTemplates<float>(cls);
 
  113                 declareImageScalingOptionsTemplates<double>(cls);
 
  115     wrappers.wrapType(py::enum_<ImageScalingOptions::ScalingAlgorithm>(options, 
"ScalingAlgorithm"),
 
  116                       [](
auto &mod, 
auto &enm) {
 
  117                           enm.value(
"NONE", ImageScalingOptions::ScalingAlgorithm::NONE);
 
  118                           enm.value(
"RANGE", ImageScalingOptions::ScalingAlgorithm::RANGE);
 
  119                           enm.value(
"STDEV_POSITIVE", ImageScalingOptions::ScalingAlgorithm::STDEV_POSITIVE);
 
  120                           enm.value(
"STDEV_NEGATIVE", ImageScalingOptions::ScalingAlgorithm::STDEV_NEGATIVE);
 
  121                           enm.value(
"STDEV_BOTH", ImageScalingOptions::ScalingAlgorithm::STDEV_BOTH);
 
  122                           enm.value(
"MANUAL", ImageScalingOptions::ScalingAlgorithm::MANUAL);
 
  127 template <
typename T>
 
  128 void declareImageScaleTemplates(py::class_<ImageScale> &cls, 
std::string const &suffix) {
 
  129     cls.def(
"toFits", &ImageScale::toFits<T>, 
"image"_a, 
"forceNonfiniteRemoval"_a = 
false, 
"fuzz"_a = 
true,
 
  130             "tiles"_a = ndarray::Array<long, 1, 1>(), 
"seed"_a = 1);
 
  131     cls.def(
"fromFits", &ImageScale::fromFits<T>);
 
  134 void declareImageScale(lsst::utils::python::WrapperCollection &wrappers) {
 
  135     wrappers.wrapType(py::class_<ImageScale>(wrappers.module, 
"ImageScale"), [](
auto &mod, 
auto &cls) {
 
  136         cls.def(py::init<int, double, double>(), 
"bitpix"_a, 
"bscale"_a, 
"bzero"_a);
 
  137         cls.def_readonly(
"bitpix", &ImageScale::bitpix);
 
  138         cls.def_readonly(
"bscale", &ImageScale::bscale);
 
  139         cls.def_readonly(
"bzero", &ImageScale::bzero);
 
  140         cls.def_readonly(
"blank", &ImageScale::blank);
 
  142         declareImageScaleTemplates<float>(cls, 
"F");
 
  143         declareImageScaleTemplates<double>(cls, 
"D");
 
  147 void declareImageWriteOptions(lsst::utils::python::WrapperCollection &wrappers) {
 
  148     wrappers.wrapType(py::class_<ImageWriteOptions>(wrappers.module, 
"ImageWriteOptions"),
 
  149                       [](
auto &mod, 
auto &cls) {
 
  150                           cls.def(py::init<lsst::afw::image::Image<std::uint16_t>>());
 
  151                           cls.def(py::init<lsst::afw::image::Image<std::int32_t>>());
 
  152                           cls.def(py::init<lsst::afw::image::Image<std::uint64_t>>());
 
  153                           cls.def(py::init<lsst::afw::image::Image<float>>());
 
  154                           cls.def(py::init<lsst::afw::image::Image<double>>());
 
  156                           cls.def(py::init<lsst::afw::image::Mask<lsst::afw::image::MaskPixel>>());
 
  158                           cls.def(py::init<ImageCompressionOptions const &, ImageScalingOptions const &>(),
 
  159                                   "compression"_a, 
"scaling"_a = ImageScalingOptions());
 
  160                           cls.def(py::init<ImageScalingOptions const &>());
 
  162                           cls.def(py::init<lsst::daf::base::PropertySet const &>());
 
  164                           cls.def_readonly(
"compression", &ImageWriteOptions::compression);
 
  165                           cls.def_readonly(
"scaling", &ImageWriteOptions::scaling);
 
  167                           cls.def_static(
"validate", &ImageWriteOptions::validate);
 
  175 void declareFits(lsst::utils::python::WrapperCollection &wrappers) {
 
  176     wrappers.wrapType(py::class_<Fits>(wrappers.module, 
"Fits"), [](
auto &mod, 
auto &cls) {
 
  177         cls.def(py::init<std::string const &, std::string const &, int>(), 
"filename"_a, 
"mode"_a,
 
  178                 "behavior"_a = Fits::AUTO_CLOSE | Fits::AUTO_CHECK);
 
  179         cls.def(py::init<MemFileManager &, std::string const &, int>(), 
"manager"_a, 
"mode"_a,
 
  180                 "behavior"_a = Fits::AUTO_CLOSE | Fits::AUTO_CHECK);
 
  182         cls.def(
"closeFile", &Fits::closeFile);
 
  183         cls.def(
"getFileName", &Fits::getFileName);
 
  184         cls.def(
"getHdu", &Fits::getHdu);
 
  185         cls.def(
"setHdu", &Fits::setHdu, 
"hdu"_a, 
"relative"_a = false);
 
  186         cls.def(
"countHdus", &Fits::countHdus);
 
  188         cls.def(
"writeMetadata", &Fits::writeMetadata);
 
  190                 "readMetadata", [](Fits &self, bool strip = false) { return readMetadata(self, strip); },
 
  192         cls.def(
"createEmpty", &Fits::createEmpty);
 
  194         cls.def(
"readImageI", [](Fits &
self) {
 
  195             ndarray::Vector<int, 2> 
const offset;  
 
  196             ndarray::Vector<ndarray::Size, 2> shape = 
self.getImageShape<2>();
 
  197             ndarray::Array<int, 2, 2> 
result = ndarray::allocate(shape[0], shape[1]);
 
  198             self.readImage(
result, offset);
 
  202         cls.def(
"gotoFirstHdu", [](Fits &
self) { 
self.setHdu(
DEFAULT_HDU); });
 
  204         cls.def(
"setImageCompression", &Fits::setImageCompression);
 
  205         cls.def(
"getImageCompression", &Fits::getImageCompression);
 
  206         cls.def(
"checkCompressedImagePhu", &Fits::checkCompressedImagePhu);
 
  208         cls.def_readonly(
"status", &Fits::status);
 
  212 void declareFitsModule(lsst::utils::python::WrapperCollection &wrappers) {
 
  213     wrappers.wrap([](
auto &mod) {
 
  214         py::class_<MemFileManager> clsMemFileManager(mod, 
"MemFileManager");
 
  216         clsMemFileManager.def(py::init<>());
 
  217         clsMemFileManager.def(py::init<size_t>());
 
  222         clsMemFileManager.def(
"getLength", &MemFileManager::getLength);
 
  223         clsMemFileManager.def(
"getData", [](MemFileManager &
m) {
 
  224             return py::bytes(
static_cast<char *
>(
m.getData()), 
m.getLength());
 
  226         clsMemFileManager.def(
"setData", [](MemFileManager &
m, 
py::bytes const &d, 
size_t size) {
 
  227             memcpy(
m.getData(), PyBytes_AsString(d.ptr()), size);
 
  229         clsMemFileManager.def(
 
  244                 "fileName"_a, 
"hdu"_a = 
DEFAULT_HDU, 
"strip"_a = 
false);
 
  256     lsst::utils::python::WrapperCollection wrappers(mod, 
"lsst.afw.fits");
 
  257     wrappers.addSignatureDependency(
"lsst.pex.exceptions");
 
  258     wrappers.addSignatureDependency(
"lsst.daf.base");
 
  262     declareImageCompression(wrappers);
 
  263     declareImageScalingOptions(wrappers);
 
  264     declareImageScale(wrappers);
 
  265     declareImageWriteOptions(wrappers);
 
  266     declareFits(wrappers);
 
  267     declareFitsModule(wrappers);
 
table::Key< table::Array< std::uint8_t > > bytes
An exception thrown when problems are found when reading or writing FITS files.
Reports errors in external input/output operations.
const int DEFAULT_HDU
Specify that the default HDU should be read.
std::shared_ptr< daf::base::PropertyList > combineMetadata(std::shared_ptr< const daf::base::PropertyList > first, std::shared_ptr< const daf::base::PropertyList > second)
Combine two sets of metadata in a FITS-appropriate fashion.
std::string compressionAlgorithmToString(ImageCompressionOptions::CompressionAlgorithm algorithm)
Provide string version of compression algorithm.
std::shared_ptr< daf::base::PropertyList > readMetadata(std::string const &fileName, int hdu=DEFAULT_HDU, bool strip=false)
Read FITS header.
ImageScalingOptions::ScalingAlgorithm scalingAlgorithmFromString(std::string const &name)
Interpret scaling algorithm expressed in string.
PYBIND11_MODULE(_fits, mod)
void setAllowImageCompression(bool allow)
bool getAllowImageCompression()
std::string scalingAlgorithmToString(ImageScalingOptions::ScalingAlgorithm algorithm)
Provide string version of compression algorithm.
std::string makeLimitedFitsHeader(lsst::daf::base::PropertySet const &metadata, std::set< std::string > const &excludeNames={})
Format a PropertySet into an FITS header string in a simplistic fashion.
ImageCompressionOptions::CompressionAlgorithm compressionAlgorithmFromString(std::string const &name)
Interpret compression algorithm expressed in string.
A base class for image defects.