23 #include "pybind11/pybind11.h"
24 #include "pybind11/stl.h"
31 using namespace pybind11::literals;
39 template <
typename ImagePixelT>
50 template <
typename FromPixelT,
typename ToPixelT>
51 void declareCastConstructor(PyMaskedImage<ToPixelT> &cls) {
52 cls.def(
py::init<MaskedImage<FromPixelT>
const &,
bool const>(),
"src"_a,
"deep"_a);
55 template <
typename ImagePixelT>
58 using MI = MaskedImage<ImagePixelT>;
61 PyMaskedImage<ImagePixelT>(wrappers.
module, (
"MaskedImage" + suffix).c_str()),
62 [](
auto &mod,
auto &cls) {
63 mod.def(
"makeMaskedImage", &makeMaskedImage<ImagePixelT, MaskPixel, VariancePixel>,
"image"_a,
64 "mask"_a = nullptr,
"variance"_a = nullptr);
69 cls.def(py::init<unsigned int, unsigned int, typename MI::MaskPlaneDict const &>(),
"width"_a,
70 "height"_a,
"planeDict"_a = typename MI::MaskPlaneDict());
71 cls.def(py::init<lsst::geom::Extent2I, typename MI::MaskPlaneDict const &>(),
"dimensions"_a,
72 "planeDict"_a = typename MI::MaskPlaneDict());
73 cls.def(py::init<typename MI::ImagePtr, typename MI::MaskPtr, typename MI::VariancePtr>(),
74 "image"_a,
"mask"_a = nullptr,
"variance"_a = nullptr);
75 cls.def(py::init<lsst::geom::Box2I const &, typename MI::MaskPlaneDict const &>(),
"bbox"_a,
76 "planeDict"_a = typename MI::MaskPlaneDict());
77 cls.def(py::init<std::string const &, std::shared_ptr<daf::base::PropertySet>,
78 lsst::geom::Box2I const &, ImageOrigin, bool, bool,
79 std::shared_ptr<daf::base::PropertySet>,
80 std::shared_ptr<daf::base::PropertySet>,
81 std::shared_ptr<daf::base::PropertySet>, bool>(),
82 "fileName"_a,
"metadata"_a = nullptr,
"bbox"_a = lsst::geom::Box2I(),
83 "origin"_a = PARENT,
"conformMasks"_a = false,
"needAllHdus"_a = false,
84 "imageMetadata"_a = nullptr,
"maskMetadata"_a = nullptr,
85 "varianceMetadata"_a = nullptr,
"allowUnsafe"_a = false);
86 cls.def(py::init<fits::MemFileManager &, std::shared_ptr<daf::base::PropertySet>,
87 lsst::geom::Box2I const &, ImageOrigin, bool, bool,
88 std::shared_ptr<daf::base::PropertySet>,
89 std::shared_ptr<daf::base::PropertySet>,
90 std::shared_ptr<daf::base::PropertySet>, bool>(),
91 "manager"_a,
"metadata"_a = nullptr,
"bbox"_a = lsst::geom::Box2I(),
92 "origin"_a = PARENT,
"conformMasks"_a = false,
"needAllHdus"_a = false,
93 "imageMetadata"_a = nullptr,
"maskMetadata"_a = nullptr,
94 "varianceMetadata"_a = nullptr,
"allowUnsafe"_a = false);
95 cls.def(py::init<MI const &, bool>(),
"rhs"_a,
"deep"_a = false);
96 cls.def(py::init<MI const &, lsst::geom::Box2I const &, ImageOrigin, bool>(),
"rhs"_a,
97 "bbox"_a,
"origin"_a = PARENT,
"deep"_a = false);
100 cls.def(
"swap", &MI::swap);
101 cls.def(
"assign", &MI::assign,
"rhs"_a,
"bbox"_a = lsst::geom::Box2I(),
"origin"_a = PARENT,
106 cls.def(
"subset", &MI::subset,
"bbox"_a,
"origin"_a = PARENT);
108 cls.def(
"__iadd__", (MI & (MI::*)(ImagePixelT const)) & MI::operator+=);
109 cls.def(
"__iadd__", (MI & (MI::*)(MI const &)) & MI::operator+=);
110 cls.def(
"__iadd__", (MI & (MI::*)(Image<ImagePixelT> const &)) & MI::operator+=);
111 cls.def(
"__iadd__", (MI & (MI::*)(math::Function2<double> const &)) & MI::operator+=);
112 cls.def(
"scaledPlus", &MI::scaledPlus);
113 cls.def(
"__isub__", (MI & (MI::*)(ImagePixelT const)) & MI::operator-=);
114 cls.def(
"__isub__", (MI & (MI::*)(MI const &)) & MI::operator-=);
115 cls.def(
"__isub__", (MI & (MI::*)(Image<ImagePixelT> const &)) & MI::operator-=);
116 cls.def(
"__isub__", (MI & (MI::*)(math::Function2<double> const &)) & MI::operator-=);
117 cls.def(
"scaledMinus", &MI::scaledMinus);
118 cls.def(
"__imul__", (MI & (MI::*)(ImagePixelT const)) & MI::operator*=);
119 cls.def(
"__imul__", (MI & (MI::*)(MI const &)) & MI::operator*=);
120 cls.def(
"__imul__", (MI & (MI::*)(Image<ImagePixelT> const &)) & MI::operator*=);
121 cls.def(
"scaledMultiplies", &MI::scaledMultiplies);
122 cls.def(
"__itruediv__", (MI & (MI::*)(ImagePixelT const)) & MI::operator/=);
123 cls.def(
"__itruediv__", (MI & (MI::*)(MI const &)) & MI::operator/=);
124 cls.def(
"__itruediv__", (MI & (MI::*)(Image<ImagePixelT> const &)) & MI::operator/=);
125 cls.def(
"scaledDivides", &MI::scaledDivides);
129 (void (MI::*)(std::string const &, std::shared_ptr<daf::base::PropertySet const>,
130 std::shared_ptr<daf::base::PropertySet const>,
131 std::shared_ptr<daf::base::PropertySet const>,
132 std::shared_ptr<daf::base::PropertySet const>) const) &
134 "fileName"_a,
"metadata"_a = std::shared_ptr<daf::base::PropertySet const>(),
135 "imageMetadata"_a = std::shared_ptr<daf::base::PropertySet const>(),
136 "maskMetadata"_a = std::shared_ptr<daf::base::PropertySet const>(),
137 "varianceMetadata"_a = std::shared_ptr<daf::base::PropertySet const>());
139 (void (MI::*)(fits::MemFileManager &, std::shared_ptr<daf::base::PropertySet const>,
140 std::shared_ptr<daf::base::PropertySet const>,
141 std::shared_ptr<daf::base::PropertySet const>,
142 std::shared_ptr<daf::base::PropertySet const>) const) &
144 "manager"_a,
"metadata"_a = std::shared_ptr<daf::base::PropertySet const>(),
145 "imageMetadata"_a = std::shared_ptr<daf::base::PropertySet const>(),
146 "maskMetadata"_a = std::shared_ptr<daf::base::PropertySet const>(),
147 "varianceMetadata"_a = std::shared_ptr<daf::base::PropertySet const>());
149 (void (MI::*)(fits::Fits &, std::shared_ptr<daf::base::PropertySet const>,
150 std::shared_ptr<daf::base::PropertySet const>,
151 std::shared_ptr<daf::base::PropertySet const>,
152 std::shared_ptr<daf::base::PropertySet const>) const) &
154 "fitsfile"_a,
"metadata"_a = std::shared_ptr<daf::base::PropertySet const>(),
155 "imageMetadata"_a = std::shared_ptr<daf::base::PropertySet const>(),
156 "maskMetadata"_a = std::shared_ptr<daf::base::PropertySet const>(),
157 "varianceMetadata"_a = std::shared_ptr<daf::base::PropertySet const>());
161 [](MI &self, std::string const &filename, fits::ImageWriteOptions const &imageOptions,
162 fits::ImageWriteOptions const &maskOptions,
163 fits::ImageWriteOptions const &varianceOptions,
164 std::shared_ptr<daf::base::PropertySet const> header) {
165 self.writeFits(filename, imageOptions, maskOptions, varianceOptions, header);
167 "filename"_a,
"imageOptions"_a,
"maskOptions"_a,
"varianceOptions"_a,
171 [](MI &
self, fits::MemFileManager &manager,
172 fits::ImageWriteOptions
const &imageOptions,
173 fits::ImageWriteOptions
const &maskOptions,
174 fits::ImageWriteOptions
const &varianceOptions,
176 self.writeFits(manager, imageOptions, maskOptions, varianceOptions, header);
178 "manager"_a,
"imageOptions"_a,
"maskOptions"_a,
"varianceOptions"_a,
182 [](MI &
self, fits::Fits &
fits, fits::ImageWriteOptions
const &imageOptions,
183 fits::ImageWriteOptions
const &maskOptions,
184 fits::ImageWriteOptions
const &varianceOptions,
186 self.writeFits(
fits, imageOptions, maskOptions, varianceOptions, header);
188 "fits"_a,
"imageOptions"_a,
"maskOptions"_a,
"varianceOptions"_a,
191 cls.def_static(
"readFits", (MI(*)(
std::string const &))MI::readFits,
"filename"_a);
192 cls.def_static(
"readFits", (MI(*)(fits::MemFileManager &))MI::readFits,
"manager"_a);
193 cls.def(
"getImage", &MI::getImage);
194 cls.def(
"setImage", &MI::setImage);
195 cls.def_property(
"image", &MI::getImage, &MI::setImage);
196 cls.def(
"getMask", &MI::getMask);
197 cls.def(
"setMask", &MI::setMask);
198 cls.def_property(
"mask", &MI::getMask, &MI::setMask);
199 cls.def(
"getVariance", &MI::getVariance);
200 cls.def(
"setVariance", &MI::setVariance);
201 cls.def_property(
"variance", &MI::getVariance, &MI::setVariance);
202 cls.def(
"getWidth", &MI::getWidth);
203 cls.def(
"getHeight", &MI::getHeight);
204 cls.def(
"getDimensions", &MI::getDimensions);
205 cls.def(
"getBBox", &MI::getBBox,
"origin"_a =
PARENT);
206 cls.def(
"getX0", &MI::getX0);
207 cls.def(
"getY0", &MI::getY0);
208 cls.def(
"getXY0", &MI::getXY0);
209 cls.def(
"setXY0", (
void (MI::*)(
int const,
int const)) & MI::setXY0,
"x0"_a,
"y0"_a);
216 template <
typename ImagePixelT>
218 wrappers.
wrap([](
auto &mod) {
219 mod.def(
"makeMaskedImage", makeMaskedImage<ImagePixelT, MaskPixel, VariancePixel>,
"image"_a,
220 "mask"_a =
nullptr,
"variance"_a =
nullptr);
224 template <
typename ImagePixelT1,
typename ImagePixelT2>
228 wrappers.
wrap([](
auto &mod) {
229 mod.def(
"imagesOverlap",
230 py::overload_cast<ImageBase<ImagePixelT1>
const &, ImageBase<ImagePixelT2>
const &>(
231 &imagesOverlap<ImagePixelT1, ImagePixelT2>),
232 "image1"_a,
"image2"_a);
234 mod.def(
"imagesOverlap",
235 py::overload_cast<MaskedImage<ImagePixelT1>
const &, MaskedImage<ImagePixelT2>
const &>(
236 &imagesOverlap<ImagePixelT1, ImagePixelT2>),
237 "image1"_a,
"image2"_a);
248 auto clsMaskedImageF = declareMaskedImage<float>(wrappers,
"F");
249 auto clsMaskedImageD = declareMaskedImage<double>(wrappers,
"D");
250 auto clsMaskedImageI = declareMaskedImage<int>(wrappers,
"I");
251 auto clsMaskedImageU = declareMaskedImage<std::uint16_t>(wrappers,
"U");
252 auto clsMaskedImageL = declareMaskedImage<std::uint64_t>(wrappers,
"L");
256 declareCastConstructor<int, float>(clsMaskedImageF);
257 declareCastConstructor<int, double>(clsMaskedImageD);
258 declareCastConstructor<float, double>(clsMaskedImageD);
259 declareCastConstructor<double, float>(clsMaskedImageF);
260 declareCastConstructor<std::uint16_t, float>(clsMaskedImageF);
261 declareCastConstructor<std::uint16_t, double>(clsMaskedImageD);
262 declareCastConstructor<std::uint64_t, float>(clsMaskedImageF);
263 declareCastConstructor<std::uint64_t, double>(clsMaskedImageD);
266 declareMakeMaskedImage<int>(wrappers);
267 declareMakeMaskedImage<float>(wrappers);
268 declareMakeMaskedImage<double>(wrappers);
269 declareMakeMaskedImage<std::uint16_t>(wrappers);
270 declareMakeMaskedImage<std::uint64_t>(wrappers);
272 declareImagesOverlap<int, int>(wrappers);
273 declareImagesOverlap<int, float>(wrappers);
274 declareImagesOverlap<int, double>(wrappers);
275 declareImagesOverlap<int, std::uint16_t>(wrappers);
276 declareImagesOverlap<int, std::uint64_t>(wrappers);
278 declareImagesOverlap<float, int>(wrappers);
279 declareImagesOverlap<float, float>(wrappers);
280 declareImagesOverlap<float, double>(wrappers);
281 declareImagesOverlap<float, std::uint16_t>(wrappers);
282 declareImagesOverlap<float, std::uint64_t>(wrappers);
284 declareImagesOverlap<double, int>(wrappers);
285 declareImagesOverlap<double, float>(wrappers);
286 declareImagesOverlap<double, double>(wrappers);
287 declareImagesOverlap<double, std::uint16_t>(wrappers);
288 declareImagesOverlap<double, std::uint64_t>(wrappers);
290 declareImagesOverlap<std::uint16_t, int>(wrappers);
291 declareImagesOverlap<std::uint16_t, float>(wrappers);
292 declareImagesOverlap<std::uint16_t, double>(wrappers);
293 declareImagesOverlap<std::uint16_t, std::uint16_t>(wrappers);
294 declareImagesOverlap<std::uint16_t, std::uint64_t>(wrappers);
296 declareImagesOverlap<std::uint64_t, int>(wrappers);
297 declareImagesOverlap<std::uint64_t, float>(wrappers);
298 declareImagesOverlap<std::uint64_t, double>(wrappers);
299 declareImagesOverlap<std::uint64_t, std::uint16_t>(wrappers);
300 declareImagesOverlap<std::uint64_t, std::uint64_t>(wrappers);
A helper class for subdividing pybind11 module across multiple translation units (i....
pybind11::module module
The module object passed to the PYBIND11_MODULE block that contains this WrapperCollection.
void finish()
Invoke all deferred wrapper-declaring callables.
PyType wrapType(PyType cls, ClassWrapperCallback function, bool setModuleName=true)
Add a type (class or enum) wrapper, deferring method and other attribute definitions until finish() i...
void addInheritanceDependency(std::string const &name)
Indicate an external module that provides a base class for a subsequent addType call.
void wrap(WrapperCallback function)
Add a set of wrappers without defining a class.
void addSignatureDependency(std::string const &name)
Indicate an external module that provides a type used in function/method signatures.
PYBIND11_MODULE(imageUtils, mod)
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects.
double indexToPosition(double ind)
Convert image index to image position.
int positionToIndex(double pos)
Convert image position to nearest integer index.
A base class for image defects.