LSSTApplications  16.0-10-g0ee56ad+5,16.0-11-ga33d1f2+5,16.0-12-g3ef5c14+3,16.0-12-g71e5ef5+18,16.0-12-gbdf3636+3,16.0-13-g118c103+3,16.0-13-g8f68b0a+3,16.0-15-gbf5c1cb+4,16.0-16-gfd17674+3,16.0-17-g7c01f5c+3,16.0-18-g0a50484+1,16.0-20-ga20f992+8,16.0-21-g0e05fd4+6,16.0-21-g15e2d33+4,16.0-22-g62d8060+4,16.0-22-g847a80f+4,16.0-25-gf00d9b8+1,16.0-28-g3990c221+4,16.0-3-gf928089+3,16.0-32-g88a4f23+5,16.0-34-gd7987ad+3,16.0-37-gc7333cb+2,16.0-4-g10fc685+2,16.0-4-g18f3627+26,16.0-4-g5f3a788+26,16.0-5-gaf5c3d7+4,16.0-5-gcc1f4bb+1,16.0-6-g3b92700+4,16.0-6-g4412fcd+3,16.0-6-g7235603+4,16.0-69-g2562ce1b+2,16.0-8-g14ebd58+4,16.0-8-g2df868b+1,16.0-8-g4cec79c+6,16.0-8-gadf6c7a+1,16.0-8-gfc7ad86,16.0-82-g59ec2a54a+1,16.0-9-g5400cdc+2,16.0-9-ge6233d7+5,master-g2880f2d8cf+3,v17.0.rc1
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 
271  explicit Point2Endpoint() : BaseVectorEndpoint<lsst::geom::Point2D>(2) {}
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
char * data
Definition: BaseTable.cc:205
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.
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.
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
ItemVariant const * other
Definition: Schema.cc:56
int _getNAxes(std::vector< double > const &data) const
Definition: Endpoint.h:181
STL class.
BaseEndpoint(BaseEndpoint const &)=default
std::ostream * os
Definition: Schema.cc:746
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