22 #include "pybind11/pybind11.h" 
   24 #include "ndarray/pybind11.h" 
   44 using namespace pybind11::literals;
 
   46 namespace lsst { 
namespace afw { 
namespace image { 
namespace {
 
   51 using PyImageFitsReader = py::class_<ImageFitsReader, std::shared_ptr<ImageFitsReader>>;
 
   52 using PyMaskFitsReader = py::class_<MaskFitsReader, std::shared_ptr<MaskFitsReader>>;
 
   53 using PyMaskedImageFitsReader = py::class_<MaskedImageFitsReader, std::shared_ptr<MaskedImageFitsReader>>;
 
   54 using PyExposureFitsReader = py::class_<ExposureFitsReader, std::shared_ptr<ExposureFitsReader>>;
 
   58 template <
typename Class, 
typename ...Args>
 
   59 void declareCommonMethods(py::class_<Class, Args...> & 
cls) {
 
   60     cls.def(
"readBBox", &Class::readBBox, 
"origin"_a=
PARENT);
 
   62     cls.def(
"getFileName", &Class::getFileName);
 
   63     cls.def_property_readonly(
"fileName", &Class::getFileName);
 
   67 template <
typename Class, 
typename ...Args>
 
   68 void declareSinglePlaneMethods(py::class_<Class, Args...> & 
cls) {
 
   72     cls.def(
"readDType", [](Class & 
self) { 
return py::dtype(
self.readDType()); });
 
   73     cls.def(
"getHdu", &Class::getHdu);
 
   74     cls.def_property_readonly(
"hdu", &Class::getHdu);
 
   79             if (dtype.is(py::none())) {
 
   80                 dtype = py::dtype(
self.readDType());
 
   82             return utils::python::TemplateInvoker().apply(
 
   84                     return self.template readArray<decltype(t)>(
bbox, origin, allowUnsafe);
 
   87                 utils::python::TemplateInvoker::Tag<std::uint16_t, int, float, double, std::uint64_t>()
 
   95 template <
typename Class, 
typename ...Args>
 
   96 void declareMultiPlaneMethods(py::class_<Class, Args...> & 
cls) {
 
   97     cls.def(
"readImageDType", [](Class & 
self) { 
return py::dtype(
self.readImageDType()); } );
 
   98     cls.def(
"readMaskDType", [](Class & 
self) { 
return py::dtype(
self.readMaskDType()); });
 
   99     cls.def(
"readVarianceDType", [](Class & 
self) { 
return py::dtype(
self.readVarianceDType()); });
 
  104             if (dtype.is(py::none())) {
 
  105                 dtype = py::dtype(
self.readImageDType());
 
  107             return utils::python::TemplateInvoker().apply(
 
  109                     return self.template readImage<decltype(t)>(
bbox, origin, allowUnsafe);
 
  112                 utils::python::TemplateInvoker::Tag<std::uint16_t, int, float, double, std::uint64_t>()
 
  121             if (dtype.is(py::none())) {
 
  122                 dtype = py::dtype(
self.readImageDType());
 
  124             return utils::python::TemplateInvoker().apply(
 
  126                     return self.template readImageArray<decltype(t)>(
bbox, origin, allowUnsafe);
 
  129                 utils::python::TemplateInvoker::Tag<std::uint16_t, int, float, double, std::uint64_t>()
 
  137            bool allowUnsafe, py::object dtype) {
 
  138             if (dtype.is(py::none())) {
 
  139                 dtype = py::dtype(
self.readMaskDType());
 
  141             return utils::python::TemplateInvoker().apply(
 
  143                     return self.template readMask<decltype(t)>(
bbox, origin, conformMasks, allowUnsafe);
 
  146                 utils::python::TemplateInvoker::Tag<MaskPixel>()
 
  156             if (dtype.is(py::none())) {
 
  157                 dtype = py::dtype(
self.readMaskDType());
 
  159             return utils::python::TemplateInvoker().apply(
 
  161                     return self.template readMaskArray<decltype(t)>(
bbox, origin, allowUnsafe);
 
  164                 utils::python::TemplateInvoker::Tag<MaskPixel>()
 
  173             if (dtype.is(py::none())) {
 
  174                 dtype = py::dtype(
self.readVarianceDType());
 
  176             return utils::python::TemplateInvoker().apply(
 
  178                     return self.template readVariance<decltype(t)>(
bbox, origin, allowUnsafe);
 
  181                 utils::python::TemplateInvoker::Tag<VariancePixel>()
 
  190             if (dtype.is(py::none())) {
 
  191                 dtype = py::dtype(
self.readVarianceDType());
 
  193             return utils::python::TemplateInvoker().apply(
 
  195                     return self.template readVarianceArray<decltype(t)>(
bbox, origin, allowUnsafe);
 
  198                 utils::python::TemplateInvoker::Tag<VariancePixel>()
 
  205 void declareImageFitsReader(
py::module & mod) {
 
  206     PyImageFitsReader 
cls(mod, 
"ImageFitsReader");
 
  207     declareCommonMethods(
cls);
 
  208     declareSinglePlaneMethods(
cls);
 
  213             if (dtype.is(py::none())) {
 
  214                 dtype = py::dtype(self.readDType());
 
  216             return utils::python::TemplateInvoker().apply(
 
  218                     return self.read<decltype(t)>(bbox, origin, allowUnsafe);
 
  221                 utils::python::TemplateInvoker::Tag<std::uint16_t, int, float, double, std::uint64_t>()
 
  228 void declareMaskFitsReader(
py::module & mod) {
 
  229     PyMaskFitsReader 
cls(mod, 
"MaskFitsReader");
 
  230     declareCommonMethods(
cls);
 
  231     declareSinglePlaneMethods(
cls);
 
  235            bool conformMasks, 
bool allowUnsafe, py::object dtype) {
 
  236             if (dtype.is(py::none())) {
 
  237                 dtype = py::dtype(self.readDType());
 
  239             return utils::python::TemplateInvoker().apply(
 
  241                     return self.read<decltype(t)>(bbox, origin, conformMasks, allowUnsafe);
 
  244                 utils::python::TemplateInvoker::Tag<MaskPixel>()
 
  253 void declareMaskedImageFitsReader(
py::module & mod) {
 
  254     PyMaskedImageFitsReader 
cls(mod, 
"MaskedImageFitsReader");
 
  257     declareCommonMethods(
cls);
 
  258     declareMultiPlaneMethods(
cls);
 
  259     cls.def(
"readPrimaryMetadata", &MaskedImageFitsReader::readPrimaryMetadata);
 
  260     cls.def(
"readImageMetadata", &MaskedImageFitsReader::readImageMetadata);
 
  261     cls.def(
"readMaskMetadata", &MaskedImageFitsReader::readMaskMetadata);
 
  262     cls.def(
"readVarianceMetadata", &MaskedImageFitsReader::readVarianceMetadata);
 
  266            bool conformMasks, 
bool needAllHdus, 
bool allowUnsafe, py::object dtype) {
 
  267             if (dtype.is(py::none())) {
 
  268                 dtype = py::dtype(self.readImageDType());
 
  270             return utils::python::TemplateInvoker().apply(
 
  272                     return self.read<decltype(t)>(bbox, origin, conformMasks, allowUnsafe);
 
  275                 utils::python::TemplateInvoker::Tag<std::uint16_t, int, float, double, std::uint64_t>()
 
  279         "allowUnsafe"_a=
false, 
"dtype"_a=py::none()
 
  283 void declareExposureFitsReader(
py::module & mod) {
 
  284     PyExposureFitsReader 
cls(mod, 
"ExposureFitsReader");
 
  285     cls.def(py::init<std::string const &>(), 
"fileName"_a);
 
  286     cls.def(py::init<fits::MemFileManager&>(), 
"manager"_a);
 
  287     declareCommonMethods(
cls);
 
  288     declareMultiPlaneMethods(
cls);
 
  290     cls.def(
"readWcs", &ExposureFitsReader::readWcs);
 
  291     cls.def(
"readFilter", &ExposureFitsReader::readFilter);
 
  292     cls.def(
"readPhotoCalib", &ExposureFitsReader::readPhotoCalib);
 
  293     cls.def(
"readPsf", &ExposureFitsReader::readPsf);
 
  294     cls.def(
"readValidPolygon", &ExposureFitsReader::readValidPolygon);
 
  295     cls.def(
"readApCorrMap", &ExposureFitsReader::readApCorrMap);
 
  296     cls.def(
"readCoaddInputs", &ExposureFitsReader::readCoaddInputs);
 
  297     cls.def(
"readVisitInfo", &ExposureFitsReader::readVisitInfo);
 
  298     cls.def(
"readTransmissionCurve", &ExposureFitsReader::readTransmissionCurve);
 
  299     cls.def(
"readDetector", &ExposureFitsReader::readDetector);
 
  300     cls.def(
"readExposureInfo", &ExposureFitsReader::readExposureInfo);
 
  304            bool conformMasks, 
bool allowUnsafe, py::object dtype) {
 
  305             if (dtype.is(py::none())) {
 
  306                 dtype = py::dtype(self.readImageDType());
 
  308             return utils::python::TemplateInvoker().apply(
 
  310                     return self.readMaskedImage<decltype(t)>(bbox, origin, conformMasks, allowUnsafe);
 
  313                 utils::python::TemplateInvoker::Tag<std::uint16_t, int, float, double, std::uint64_t>()
 
  322            bool conformMasks, 
bool allowUnsafe, py::object dtype) {
 
  323             if (dtype.is(py::none())) {
 
  324                 dtype = py::dtype(
self.readImageDType());
 
  326             return utils::python::TemplateInvoker().apply(
 
  328                     return self.read<decltype(t)>(
bbox, origin, conformMasks, allowUnsafe);
 
  331                 utils::python::TemplateInvoker::Tag<std::uint16_t, int, float, double, std::uint64_t>()
 
  341     py::module::import(
"lsst.daf.base");
 
  342     py::module::import(
"lsst.geom");
 
  343     py::module::import(
"lsst.afw.image.image");
 
  344     py::module::import(
"lsst.afw.image.maskedImage");
 
  345     py::module::import(
"lsst.afw.image.exposure");
 
  346     declareImageFitsReader(mod);
 
  347     declareMaskFitsReader(mod);
 
  348     declareMaskedImageFitsReader(mod);
 
  349     declareExposureFitsReader(mod);