LSSTApplications  17.0+124,17.0+14,17.0+73,18.0.0+37,18.0.0+80,18.0.0-4-g68ffd23+4,18.1.0-1-g0001055+12,18.1.0-1-g03d53ef+5,18.1.0-1-g1349e88+55,18.1.0-1-g2505f39+44,18.1.0-1-g5315e5e+4,18.1.0-1-g5e4b7ea+14,18.1.0-1-g7e8fceb+4,18.1.0-1-g85f8cd4+48,18.1.0-1-g8ff0b9f+4,18.1.0-1-ga2c679d+1,18.1.0-1-gd55f500+35,18.1.0-10-gb58edde+2,18.1.0-11-g0997b02+4,18.1.0-13-gfe4edf0b+12,18.1.0-14-g259bd21+21,18.1.0-19-gdb69f3f+2,18.1.0-2-g5f9922c+24,18.1.0-2-gd3b74e5+11,18.1.0-2-gfbf3545+32,18.1.0-26-g728bddb4+5,18.1.0-27-g6ff7ca9+2,18.1.0-3-g52aa583+25,18.1.0-3-g8ea57af+9,18.1.0-3-gb69f684+42,18.1.0-3-gfcaddf3+6,18.1.0-32-gd8786685a,18.1.0-4-gf3f9b77+6,18.1.0-5-g1dd662b+2,18.1.0-5-g6dbcb01+41,18.1.0-6-gae77429+3,18.1.0-7-g9d75d83+9,18.1.0-7-gae09a6d+30,18.1.0-9-gc381ef5+4,w.2019.45
LSSTDataManagementBasePackage
Endpoint.h
Go to the documentation of this file.
1 // -*- lsst-c++ -*-
2 /*
3  * LSST Data Management System
4  * Copyright 2008-2017 LSST Corporation.
5  *
6  * This product includes software developed by the
7  * LSST Project (http://www.lsst.org/).
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the LSST License Statement and
20  * the GNU General Public License along with this program. If not,
21  * see <http://www.lsstcorp.org/LegalNotices/>.
22  */
23 
24 #ifndef LSST_AFW_GEOM_ENDPOINT_H
25 #define LSST_AFW_GEOM_ENDPOINT_H
26 
27 #include <memory>
28 #include <vector>
29 
30 #include "astshim.h"
31 #include "ndarray.h"
32 
33 #include "lsst/geom/Point.h"
34 #include "lsst/geom/SpherePoint.h"
35 
36 namespace lsst {
37 namespace afw {
38 namespace geom {
39 
66 template <typename PointT, typename ArrayT>
67 class BaseEndpoint {
68 public:
69  using Point = PointT;
70  using Array = ArrayT;
71 
72  BaseEndpoint(BaseEndpoint const &) = default;
73  BaseEndpoint(BaseEndpoint &&) = default;
74  BaseEndpoint &operator=(BaseEndpoint const &) = delete;
75  BaseEndpoint &operator=(BaseEndpoint &&) = delete;
76 
77  virtual ~BaseEndpoint() = default;
78 
79  int getNAxes() const { return _nAxes; }
80 
84  virtual int getNPoints(Array const &arr) const = 0;
85 
99  // Note: while defining operator==(BaseEndpoint<OtherPoint, OtherArray> const &)
100  // would be more Pythonic, it's very hard to get such a method template to play well with pybind11
101  virtual bool operator==(BaseEndpoint const &other) const noexcept;
102 
109  bool operator!=(BaseEndpoint const &other) const noexcept { return !(*this == other); }
110 
119  virtual std::vector<double> dataFromPoint(Point const &point) const = 0;
120 
130  virtual ndarray::Array<double, 2, 2> dataFromArray(Array const &arr) const = 0;
131 
138  virtual Point pointFromData(std::vector<double> const &data) const = 0;
139 
149  virtual Array arrayFromData(ndarray::Array<double, 2, 2> const &data) const = 0;
150 
154  virtual std::shared_ptr<ast::Frame> makeFrame() const;
155 
163  virtual void normalizeFrame(std::shared_ptr<ast::Frame> framePtr) const {};
164 
165 protected:
173  explicit BaseEndpoint(int nAxes);
174 
175  void _assertNAxes(int nAxes) const;
176 
177  int _getNAxes(ndarray::Array<double, 2, 2> const &data) const { return data.getSize<0>(); }
178 
179  int _getNAxes(ndarray::Array<double, 1, 1> const &data) const { return data.getSize<0>(); }
180 
181  int _getNAxes(std::vector<double> const &data) const { return data.size(); }
182 
183  int _getNPoints(ndarray::Array<double, 2, 2> const &data) const { return data.getSize<1>(); }
184 
185 private:
186  int _nAxes;
187 };
188 
194 template <typename PointT>
195 class BaseVectorEndpoint : public BaseEndpoint<PointT, std::vector<PointT>> {
196 public:
198  using Point = PointT;
199 
200  BaseVectorEndpoint(BaseVectorEndpoint const &) = default;
204 
205  ~BaseVectorEndpoint() override = default;
206 
207  int getNPoints(Array const &arr) const override;
208 
209 protected:
217  explicit BaseVectorEndpoint(int nAxes) : BaseEndpoint<Point, Array>(nAxes){};
218 };
219 
226 class GenericEndpoint : public BaseEndpoint<std::vector<double>, ndarray::Array<double, 2, 2>> {
227 public:
228  GenericEndpoint(GenericEndpoint const &) = default;
229  GenericEndpoint(GenericEndpoint &&) = default;
230  GenericEndpoint &operator=(GenericEndpoint const &) = delete;
232 
240  explicit GenericEndpoint(int nAxes) : BaseEndpoint(nAxes){};
241 
242  ~GenericEndpoint() override = default;
243 
244  int getNPoints(Array const &arr) const override { return arr.getSize<1>(); }
245 
246  std::vector<double> dataFromPoint(Point const &point) const override;
247 
248  ndarray::Array<double, 2, 2> dataFromArray(Array const &arr) const override;
249 
250  Point pointFromData(std::vector<double> const &data) const override;
251 
252  Array arrayFromData(ndarray::Array<double, 2, 2> const &data) const override;
253 
255  static std::string getClassPrefix() { return "Generic"; };
256 };
257 
261 class Point2Endpoint : public BaseVectorEndpoint<lsst::geom::Point2D> {
262 public:
263  Point2Endpoint(Point2Endpoint const &) = default;
264  Point2Endpoint(Point2Endpoint &&) = default;
265  Point2Endpoint &operator=(Point2Endpoint const &) = delete;
267 
272 
283  explicit Point2Endpoint(int nAxes);
284 
285  ~Point2Endpoint() override = default;
286 
287  std::vector<double> dataFromPoint(Point const &point) const override;
288 
289  ndarray::Array<double, 2, 2> dataFromArray(Array const &arr) const override;
290 
291  Point pointFromData(std::vector<double> const &data) const override;
292 
293  Array arrayFromData(ndarray::Array<double, 2, 2> const &data) const override;
294 
304  void normalizeFrame(std::shared_ptr<ast::Frame> framePtr) const override;
305 
307  static std::string getClassPrefix() { return "Point2"; };
308 };
309 
315 class SpherePointEndpoint : public BaseVectorEndpoint<lsst::geom::SpherePoint> {
316 public:
317  SpherePointEndpoint(SpherePointEndpoint const &) = default;
321 
326 
337  explicit SpherePointEndpoint(int nAxes);
338 
339  ~SpherePointEndpoint() override = default;
340 
341  std::vector<double> dataFromPoint(Point const &point) const override;
342 
343  ndarray::Array<double, 2, 2> dataFromArray(Array const &arr) const override;
344 
345  Point pointFromData(std::vector<double> const &data) const override;
346 
347  Array arrayFromData(ndarray::Array<double, 2, 2> const &data) const override;
348 
350  std::shared_ptr<ast::Frame> makeFrame() const override;
351 
353  void normalizeFrame(std::shared_ptr<ast::Frame> framePtr) const override;
354 
356  static std::string getClassPrefix() { return "SpherePoint"; };
357 };
358 
361 
363 std::ostream &operator<<(std::ostream &os, Point2Endpoint const &endpoint);
364 
367 
368 } // namespace geom
369 } // namespace afw
370 } // namespace lsst
371 
372 #endif
virtual bool operator==(BaseEndpoint const &other) const noexcept
Determine whether two endpoints represent the same conversion.
Definition: Endpoint.cc:64
static std::string getClassPrefix()
Get the class name prefix, e.g. "Point2" for "Point2Endpoint".
Definition: Endpoint.h:255
int _getNPoints(ndarray::Array< double, 2, 2 > const &data) const
Definition: Endpoint.h:183
Point2Endpoint()
Construct a Point2Endpoint.
Definition: Endpoint.h:271
virtual void normalizeFrame(std::shared_ptr< ast::Frame > framePtr) const
Adjust and check the frame as needed.
Definition: Endpoint.h:163
std::ostream & operator<<(std::ostream &os, GenericEndpoint const &endpoint)
Print "GenericEndpoint(_n_)" to the ostream where _n_ is the number of axes, e.g. "GenericAxes(4)"...
Definition: Endpoint.cc:240
Base class for endpoints with Array = std::vector<Point> where Point has 2 dimensions.
Definition: Endpoint.h:195
virtual Point pointFromData(std::vector< double > const &data) const =0
Get a single point from raw data.
ItemVariant const * other
Definition: Schema.cc:56
virtual Array arrayFromData(ndarray::Array< double, 2, 2 > const &data) const =0
Get an array of points from raw data.
void _assertNAxes(int nAxes) const
Definition: Endpoint.cc:74
BaseVectorEndpoint(int nAxes)
Construct a BaseVectorEndpoint.
Definition: Endpoint.h:217
STL class.
int _getNAxes(ndarray::Array< double, 1, 1 > const &data) const
Definition: Endpoint.h:179
virtual int getNPoints(Array const &arr) const =0
Return the number of points in an array.
virtual std::vector< double > dataFromPoint(Point const &point) const =0
Get raw data from a single point.
A base class for image defects.
char * data
Definition: BaseRecord.cc:62
static std::string getClassPrefix()
Get the class name prefix, e.g. "Point2" for "Point2Endpoint".
Definition: Endpoint.h:356
A generic endpoint for data in the format used by ast::Mapping.
Definition: Endpoint.h:226
virtual ~BaseEndpoint()=default
int getNPoints(Array const &arr) const override
Return the number of points in an array.
Definition: Endpoint.h:244
An endpoint for lsst::geom::SpherePoint.
Definition: Endpoint.h:315
virtual ndarray::Array< double, 2, 2 > dataFromArray(Array const &arr) const =0
Get raw data from an array of points.
SpherePointEndpoint()
Construct a SpherePointEndpoint.
Definition: Endpoint.h:325
bool operator!=(BaseEndpoint const &other) const noexcept
Determine whether two endpoints do not represent the same conversion.
Definition: Endpoint.h:109
int _getNAxes(ndarray::Array< double, 2, 2 > const &data) const
Definition: Endpoint.h:177
T size(T... args)
STL class.
virtual std::shared_ptr< ast::Frame > makeFrame() const
Create a Frame that can be used with this end point in a Transform.
Definition: Endpoint.cc:69
Point in an unspecified spherical coordinate system.
Definition: SpherePoint.h:57
static std::string getClassPrefix()
Get the class name prefix, e.g. "Point2" for "Point2Endpoint".
Definition: Endpoint.h:307
An endpoint for lsst::geom::Point2D.
Definition: Endpoint.h:261
std::ostream * os
Definition: Schema.cc:746
int _getNAxes(std::vector< double > const &data) const
Definition: Endpoint.h:181
STL class.
BaseEndpoint(BaseEndpoint const &)=default
GenericEndpoint(int nAxes)
Construct a GenericEndpoint with the specified number of axes.
Definition: Endpoint.h:240
Virtual base class for endpoints, which are helper classes for Transform.
Definition: Endpoint.h:67
BaseEndpoint & operator=(BaseEndpoint const &)=delete