LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
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;
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 
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;
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;
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:
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 
360 std::ostream &operator<<(std::ostream &os, GenericEndpoint const &endpoint);
361 
363 std::ostream &operator<<(std::ostream &os, Point2Endpoint const &endpoint);
364 
366 std::ostream &operator<<(std::ostream &os, SpherePointEndpoint const &endpoint);
367 
368 } // namespace geom
369 } // namespace afw
370 } // namespace lsst
371 
372 #endif
char * data
Definition: BaseRecord.cc:61
std::ostream * os
Definition: Schema.cc:557
Virtual base class for endpoints, which are helper classes for Transform.
Definition: Endpoint.h:67
int _getNPoints(ndarray::Array< double, 2, 2 > const &data) const
Definition: Endpoint.h:183
virtual ndarray::Array< double, 2, 2 > dataFromArray(Array const &arr) const =0
Get raw data from an array of points.
BaseEndpoint(BaseEndpoint &&)=default
virtual void normalizeFrame(std::shared_ptr< ast::Frame > framePtr) const
Adjust and check the frame as needed.
Definition: Endpoint.h:163
bool operator!=(BaseEndpoint const &other) const noexcept
Determine whether two endpoints do not represent the same conversion.
Definition: Endpoint.h:109
BaseEndpoint & operator=(BaseEndpoint const &)=delete
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:68
virtual Point pointFromData(std::vector< double > const &data) const =0
Get a single point from raw data.
BaseEndpoint(BaseEndpoint const &)=default
int _getNAxes(ndarray::Array< double, 1, 1 > const &data) const
Definition: Endpoint.h:179
virtual bool operator==(BaseEndpoint const &other) const noexcept
Determine whether two endpoints represent the same conversion.
Definition: Endpoint.cc:63
int _getNAxes(std::vector< double > const &data) const
Definition: Endpoint.h:181
virtual int getNPoints(Array const &arr) const =0
Return the number of points in an array.
BaseEndpoint & operator=(BaseEndpoint &&)=delete
void _assertNAxes(int nAxes) const
Definition: Endpoint.cc:73
int _getNAxes(ndarray::Array< double, 2, 2 > const &data) const
Definition: Endpoint.h:177
virtual Array arrayFromData(ndarray::Array< double, 2, 2 > const &data) const =0
Get an array of points from raw data.
virtual std::vector< double > dataFromPoint(Point const &point) const =0
Get raw data from a single point.
virtual ~BaseEndpoint()=default
Base class for endpoints with Array = std::vector<Point> where Point has 2 dimensions.
Definition: Endpoint.h:195
BaseVectorEndpoint(BaseVectorEndpoint &&)=default
BaseVectorEndpoint(int nAxes)
Construct a BaseVectorEndpoint.
Definition: Endpoint.h:217
BaseVectorEndpoint & operator=(BaseVectorEndpoint &&)=delete
BaseVectorEndpoint & operator=(BaseVectorEndpoint const &)=delete
BaseVectorEndpoint(BaseVectorEndpoint const &)=default
int getNPoints(Array const &arr) const override
Return the number of points in an array.
Definition: Endpoint.cc:82
~BaseVectorEndpoint() override=default
A generic endpoint for data in the format used by ast::Mapping.
Definition: Endpoint.h:226
GenericEndpoint(int nAxes)
Construct a GenericEndpoint with the specified number of axes.
Definition: Endpoint.h:240
std::vector< double > dataFromPoint(Point const &point) const override
Definition: Endpoint.cc:86
Array arrayFromData(ndarray::Array< double, 2, 2 > const &data) const override
Get an array of points from raw data.
Definition: Endpoint.cc:101
GenericEndpoint(GenericEndpoint &&)=default
GenericEndpoint & operator=(GenericEndpoint const &)=delete
GenericEndpoint(GenericEndpoint const &)=default
Point pointFromData(std::vector< double > const &data) const override
Get a single point from raw data.
Definition: Endpoint.cc:96
int getNPoints(Array const &arr) const override
Return the number of points in an array.
Definition: Endpoint.h:244
ndarray::Array< double, 2, 2 > dataFromArray(Array const &arr) const override
Definition: Endpoint.cc:91
GenericEndpoint & operator=(GenericEndpoint &&)=delete
static std::string getClassPrefix()
Get the class name prefix, e.g. "Point2" for "Point2Endpoint".
Definition: Endpoint.h:255
~GenericEndpoint() override=default
An endpoint for lsst::geom::Point2D.
Definition: Endpoint.h:261
Point2Endpoint()
Construct a Point2Endpoint.
Definition: Endpoint.h:271
ndarray::Array< double, 2, 2 > dataFromArray(Array const &arr) const override
Get raw data from an array of points.
Definition: Endpoint.cc:123
Point2Endpoint & operator=(Point2Endpoint const &)=delete
~Point2Endpoint() override=default
std::vector< double > dataFromPoint(Point const &point) const override
Get raw data from a single point.
Definition: Endpoint.cc:114
Point2Endpoint(Point2Endpoint const &)=default
static std::string getClassPrefix()
Get the class name prefix, e.g. "Point2" for "Point2Endpoint".
Definition: Endpoint.h:307
Point pointFromData(std::vector< double > const &data) const override
Get a single point from raw data.
Definition: Endpoint.cc:137
Point2Endpoint(Point2Endpoint &&)=default
Array arrayFromData(ndarray::Array< double, 2, 2 > const &data) const override
Get an array of points from raw data.
Definition: Endpoint.cc:147
Point2Endpoint & operator=(Point2Endpoint &&)=delete
void normalizeFrame(std::shared_ptr< ast::Frame > framePtr) const override
Check that framePtr points to a Frame, not a subclass.
Definition: Endpoint.cc:159
An endpoint for lsst::geom::SpherePoint.
Definition: Endpoint.h:315
ndarray::Array< double, 2, 2 > dataFromArray(Array const &arr) const override
Get raw data from an array of points.
Definition: Endpoint.cc:186
std::vector< double > dataFromPoint(Point const &point) const override
Get raw data from a single point.
Definition: Endpoint.cc:177
SpherePointEndpoint()
Construct a SpherePointEndpoint.
Definition: Endpoint.h:325
SpherePointEndpoint & operator=(SpherePointEndpoint const &)=delete
SpherePointEndpoint(SpherePointEndpoint &&)=default
Array arrayFromData(ndarray::Array< double, 2, 2 > const &data) const override
Get an array of points from raw data.
Definition: Endpoint.cc:205
std::shared_ptr< ast::Frame > makeFrame() const override
Create a Frame that can be used with this end point in a Transform.
Definition: Endpoint.cc:217
static std::string getClassPrefix()
Get the class name prefix, e.g. "Point2" for "Point2Endpoint".
Definition: Endpoint.h:356
SpherePointEndpoint(SpherePointEndpoint const &)=default
SpherePointEndpoint & operator=(SpherePointEndpoint &&)=delete
Point pointFromData(std::vector< double > const &data) const override
Get a single point from raw data.
Definition: Endpoint.cc:200
void normalizeFrame(std::shared_ptr< ast::Frame > framePtr) const override
Check that framePtr points to a SkyFrame and set longitude axis to 0, latitude to 1.
Definition: Endpoint.cc:221
~SpherePointEndpoint() override=default
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:239
Point< double, 2 > Point2D
Definition: Point.h:324
A base class for image defects.