LSSTApplications  18.0.0+106,18.0.0+50,19.0.0,19.0.0+1,19.0.0+10,19.0.0+11,19.0.0+13,19.0.0+17,19.0.0+2,19.0.0-1-g20d9b18+6,19.0.0-1-g425ff20,19.0.0-1-g5549ca4,19.0.0-1-g580fafe+6,19.0.0-1-g6fe20d0+1,19.0.0-1-g7011481+9,19.0.0-1-g8c57eb9+6,19.0.0-1-gb5175dc+11,19.0.0-1-gdc0e4a7+9,19.0.0-1-ge272bc4+6,19.0.0-1-ge3aa853,19.0.0-10-g448f008b,19.0.0-12-g6990b2c,19.0.0-2-g0d9f9cd+11,19.0.0-2-g3d9e4fb2+11,19.0.0-2-g5037de4,19.0.0-2-gb96a1c4+3,19.0.0-2-gd955cfd+15,19.0.0-3-g2d13df8,19.0.0-3-g6f3c7dc,19.0.0-4-g725f80e+11,19.0.0-4-ga671dab3b+1,19.0.0-4-gad373c5+3,19.0.0-5-ga2acb9c+2,19.0.0-5-gfe96e6c+2,w.2020.01
LSSTDataManagementBasePackage
camera.cc
Go to the documentation of this file.
1 /*
2  * Developed for the LSST Data Management System.
3  * This product includes software developed by the LSST Project
4  * (https://www.lsst.org).
5  * See the COPYRIGHT file at the top-level directory of this distribution
6  * for details of code ownership.
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program. If not, see <https://www.gnu.org/licenses/>.
20  */
21 
22 #include "pybind11/pybind11.h"
23 #include "pybind11/stl.h"
24 
25 #include "lsst/utils/python.h"
28 
29 namespace py = pybind11;
30 using namespace py::literals;
31 
32 namespace lsst {
33 namespace afw {
34 namespace cameraGeom {
35 
36 using PyCamera = py::class_<Camera, DetectorCollection, std::shared_ptr<Camera>>;
37 using PyCameraBuilder = py::class_<Camera::Builder, DetectorCollectionBase<Detector::InCameraBuilder>,
39 
40 // Bindings here are ordered to match the order of the declarations in
41 // Camera.h to the greatest extent possible; modifications to this file should
42 // attempt to preserve this.
43 
44 void declareCameraBuilder(PyCamera & parent);
45 
47  PyCamera cls(mod, "Camera");
49  cls.def("rebuild", &Camera::rebuild);
50  cls.def("getName", &Camera::getName);
51  cls.def("getPupilFactoryName", &Camera::getPupilFactoryName);
52  cls.def("findDetectors", &Camera::findDetectors, "point"_a, "cameraSys"_a);
53  cls.def("findDetectorsList", &Camera::findDetectorsList, "pointList"_a, "cameraSys"_a);
54  // transform methods are wrapped with lambdas that translate exceptions for backwards compatibility
55  cls.def(
56  "getTransform",
57  [](Camera const & self, CameraSys const & fromSys, CameraSys const & toSys) {
58  try {
59  return self.getTransform(fromSys, toSys);
60  } catch (pex::exceptions::NotFoundError & err) {
61  PyErr_SetString(PyExc_KeyError, err.what());
62  throw py::error_already_set();
63  }
64  },
65  "fromSys"_a, "toSys"_a
66  );
67  cls.def("getTransformMap", &Camera::getTransformMap);
68  cls.def(
69  "transform",
70  [](
71  Camera const & self,
72  lsst::geom::Point2D const & point,
73  CameraSys const & fromSys,
74  CameraSys const & toSys
75  ) {
76  try {
77  return self.transform(point, fromSys, toSys);
78  } catch (pex::exceptions::NotFoundError & err) {
79  PyErr_SetString(PyExc_KeyError, err.what());
80  throw py::error_already_set();
81  }
82  },
83  "point"_a, "fromSys"_a, "toSys"_a
84  );
85  cls.def(
86  "transform",
87  [](
88  Camera const & self,
89  std::vector<lsst::geom::Point2D> const & points,
90  CameraSys const & fromSys,
91  CameraSys const & toSys
92  ) {
93  try {
94  return self.transform(points, fromSys, toSys);
95  } catch (pex::exceptions::NotFoundError & err) {
96  PyErr_SetString(PyExc_KeyError, err.what());
97  throw py::error_already_set();
98  }
99  },
100  "points"_a, "fromSys"_a, "toSys"_a
101  );
103 }
104 
106  PyCameraBuilder cls(parent, "Builder");
107  cls.def(py::init<std::string const &>(), "name"_a);
108  cls.def(py::init<Camera const &>(), "camera"_a);
109  cls.def("finish", &Camera::Builder::finish);
110  cls.def("getName", &Camera::Builder::getName);
111  cls.def("setName", &Camera::Builder::setName);
112  cls.def("getPupilFactoryName", &Camera::Builder::getPupilFactoryName);
113  cls.def("setPupilFactoryName", &Camera::Builder::setPupilFactoryName);
114  cls.def("setPupilFactoryClass",
115  [](Camera::Builder & self, py::object pupilFactoryClass) {
116  std::string pupilFactoryName = "lsst.afw.cameraGeom.pupil.PupilFactory";
117  if (!pupilFactoryClass.is(py::none())) {
118  pupilFactoryName = py::str("{}.{}").format(
119  pupilFactoryClass.attr("__module__"),
120  pupilFactoryClass.attr("__name__")
121  );
122  }
123  self.setPupilFactoryName(pupilFactoryName);
124  });
125  cls.def("setTransformFromFocalPlaneTo", &Camera::Builder::setTransformFromFocalPlaneTo,
126  "toSys"_a, "transform"_a);
127  cls.def("discardTransformFromFocalPlaneTo",&Camera::Builder::discardTransformFromFocalPlaneTo);
128  cls.def("add", &Camera::Builder::add);
129  cls.def("__delitem__", py::overload_cast<int>(&Camera::Builder::remove));
130  cls.def("__delitem__", py::overload_cast<std::string const &>(&Camera::Builder::remove));
131 }
132 
133 PYBIND11_MODULE(camera, mod){
134  py::module::import("lsst.afw.cameraGeom.detectorCollection");
135  py::module::import("lsst.afw.cameraGeom.detector");
136  py::module::import("lsst.afw.cameraGeom.transformMap");
137 
138  declareCamera(mod);
139 }
140 
141 } // cameraGeom
142 } // afw
143 } // lsst
Camera coordinate system; used as a key in in TransformMap.
Definition: CameraSys.h:83
PYBIND11_MODULE(camera, mod)
Definition: camera.cc:133
An immutable representation of a camera.
Definition: Camera.h:43
void addPersistableMethods(pybind11::class_< Class, Args... > &cls)
Add table::io::Persistable and PersistableFacade methods to the pybind11 wrapper for a class...
Definition: python.h:90
void declareCameraBuilder(PyCamera &parent)
Definition: camera.cc:105
STL class.
Reports attempts to access elements using an invalid key.
Definition: Runtime.h:151
virtual char const * what(void) const noexcept
Return a character string summarizing this exception.
Definition: Exception.cc:99
A base class for image defects.
STL class.
A helper class for creating and modifying cameras.
Definition: Camera.h:208
table::Key< std::string > pupilFactoryName
Definition: Camera.cc:124
void declareCamera(py::module &mod)
Definition: camera.cc:46
py::class_< Camera::Builder, DetectorCollectionBase< Detector::InCameraBuilder >, std::shared_ptr< Camera::Builder > > PyCameraBuilder
Definition: camera.cc:38
py::class_< Camera, DetectorCollection, std::shared_ptr< Camera > > PyCamera
Definition: camera.cc:36