LSSTApplications  18.1.0
LSSTDataManagementBasePackage
TransformMap.h
Go to the documentation of this file.
1 /*
2  * LSST Data Management System
3  * Copyright 2014 LSST Corporation.
4  *
5  * This product includes software developed by the
6  * LSST Project (http://www.lsst.org/).
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 LSST License Statement and
19  * the GNU General Public License along with this program. If not,
20  * see <http://www.lsstcorp.org/LegalNotices/>.
21  */
22 
23 #if !defined(LSST_AFW_CAMERAGEOM_TRANSFORMMAP_H)
24 #define LSST_AFW_CAMERAGEOM_TRANSFORMMAP_H
25 
26 #include <vector>
27 #include <unordered_map>
28 #include <memory>
29 
30 #include "boost/iterator/transform_iterator.hpp"
31 #include "astshim/FrameSet.h"
32 
35 #include "lsst/geom/Point.h"
37 
38 namespace lsst {
39 namespace afw {
40 namespace cameraGeom {
41 
64 class TransformMap final : public table::io::PersistableFacade<TransformMap>, public table::io::Persistable {
65 private:
66 
67  // Functor for boost::transform_iterator: given an entry in a std::map or unordered_map, return the key
68  struct GetKey {
69  CameraSys const &operator()(std::pair<const CameraSys, int> const &p) const { return p.first; };
70  };
71 
73 
74 public:
75 
77  using CameraSysIterator = boost::transform_iterator<GetKey, CameraSysFrameIdMap::const_iterator>;
78 
79  class Builder;
80 
93  CameraSys const &reference,
94  Transforms const &transforms
95  );
96 
101  TransformMap(TransformMap const &other) = delete;
102  TransformMap(TransformMap &&other) = delete;
103  TransformMap &operator=(TransformMap const &) = delete;
104  TransformMap &operator=(TransformMap &&) = delete;
106 
107  ~TransformMap() noexcept;
108 
120  lsst::geom::Point2D transform(lsst::geom::Point2D const &point, CameraSys const &fromSys,
121  CameraSys const &toSys) const;
122 
128  std::vector<lsst::geom::Point2D> transform(std::vector<lsst::geom::Point2D> const &pointList,
129  CameraSys const &fromSys, CameraSys const &toSys) const;
130 
131  CameraSysIterator begin() const { return boost::make_transform_iterator(_frameIds.begin(), GetKey()); }
132 
133  CameraSysIterator end() const { return boost::make_transform_iterator(_frameIds.end(), GetKey()); }
134 
143  bool contains(CameraSys const &system) const noexcept;
144 
156  CameraSys const &toSys) const;
157 
163  size_t size() const noexcept;
164 
165 
169  bool isPersistable() const noexcept override { return true; }
170 
171 private:
172 
173  // Helper class used in persistence.
174  class Factory;
175 
176  static Factory const registration;
177 
178  // Private ctor, only called by Builder::build() and Factory.
180  CameraSysFrameIdMap && frameIds,
181  std::vector<std::pair<int, int>> && canonicalConnections);
182 
194  int _getFrame(CameraSys const &system) const;
195 
205  std::shared_ptr<ast::Mapping const> _getMapping(CameraSys const &fromSys, CameraSys const &toSys) const;
206 
207  std::string getPersistenceName() const override;
208 
209  std::string getPythonModule() const override;
210 
211  void write(OutputArchiveHandle& handle) const override;
212 
213 
215  static lsst::afw::geom::Point2Endpoint _pointConverter;
216 
218  std::unique_ptr<ast::FrameSet const> const _transforms;
219 
225  CameraSysFrameIdMap const _frameIds;
226 
232  std::vector<std::pair<int, int>> const _canonicalConnections;
233 };
234 
235 
240 public:
241 
246  explicit Builder(CameraSys const & reference);
247 
250  Builder(Builder const &);
251  Builder(Builder &&); // std::vector move construct is not noexcept until C++17
252  Builder & operator=(Builder const &);
253  Builder & operator=(Builder &&); // std::vector move assignment is not noexcept until C++17
255 
256  ~Builder() noexcept;
257 
275  Builder & connect(CameraSys const & fromSys, CameraSys const & toSys,
277 
297  Builder & connect(CameraSys const & fromSys, Transforms const &transforms);
298 
317  Builder & connect(Transforms const &transforms) {
318  return connect(_reference, transforms);
319  }
320 
332 
333 private:
334 
335  struct Connection {
336  mutable bool processed;
338  CameraSys fromSys;
339  CameraSys toSys;
340  };
341 
342  CameraSys _reference;
343  std::vector<Connection> _connections;
344 };
345 
346 
347 } // namespace cameraGeom
348 } // namespace afw
349 } // namespace lsst
350 
351 #endif
A registry of 2-dimensional coordinate transforms for a specific camera.
Definition: TransformMap.h:64
Camera coordinate system; used as a key in in TransformMap.
Definition: CameraSys.h:83
An object passed to Persistable::write to allow it to persist itself.
STL namespace.
lsst::geom::Point2D transform(lsst::geom::Point2D const &point, CameraSys const &fromSys, CameraSys const &toSys) const
Convert a point from one camera coordinate system to another.
Definition: TransformMap.cc:54
CameraSysIterator end() const
Definition: TransformMap.h:133
Point< double, 2 > Point2D
Definition: Point.h:324
STL class.
A base class for objects that can be persisted via afw::table::io Archive classes.
Definition: Persistable.h:74
Helper class used to incrementally construct TransformMap instances.
Definition: TransformMap.h:239
TransformMap & operator=(TransformMap const &)=delete
bool isPersistable() const noexcept override
TransformMaps should always be Persistable.
Definition: TransformMap.h:169
A base class for image defects.
bool contains(CameraSys const &system) const noexcept
Can this transform to and from the specified coordinate system?
Definition: TransformMap.cc:67
boost::transform_iterator< GetKey, CameraSysFrameIdMap::const_iterator > CameraSysIterator
Definition: TransformMap.h:77
static std::shared_ptr< TransformMap const > make(CameraSys const &reference, Transforms const &transforms)
Construct a TransformMap with all transforms relative to a single reference CameraSys.
Definition: TransformMap.cc:42
TransformMap(TransformMap const &other)=delete
STL class.
STL class.
size_t size() const noexcept
Get the number of supported coordinate systems.
Definition: TransformMap.cc:89
An endpoint for lsst::geom::Point2D.
Definition: Endpoint.h:261
ItemVariant const * other
Definition: Schema.cc:56
A CRTP facade class for subclasses of Persistable.
Definition: Persistable.h:176
Builder & connect(Transforms const &transforms)
Add multiple connections relative to a single reference CameraSys.
Definition: TransformMap.h:317
CameraSysIterator begin() const
Definition: TransformMap.h:131
std::shared_ptr< geom::TransformPoint2ToPoint2 > getTransform(CameraSys const &fromSys, CameraSys const &toSys) const
Get a Transform from one camera coordinate system to another.
Definition: TransformMap.cc:69