LSST Applications g070148d5b3+33e5256705,g0d53e28543+25c8b88941,g0da5cf3356+2dd1178308,g1081da9e2a+62d12e78cb,g17e5ecfddb+7e422d6136,g1c76d35bf8+ede3a706f7,g295839609d+225697d880,g2e2c1a68ba+cc1f6f037e,g2ffcdf413f+853cd4dcde,g38293774b4+62d12e78cb,g3b44f30a73+d953f1ac34,g48ccf36440+885b902d19,g4b2f1765b6+7dedbde6d2,g5320a0a9f6+0c5d6105b6,g56b687f8c9+ede3a706f7,g5c4744a4d9+ef6ac23297,g5ffd174ac0+0c5d6105b6,g6075d09f38+66af417445,g667d525e37+2ced63db88,g670421136f+2ced63db88,g71f27ac40c+2ced63db88,g774830318a+463cbe8d1f,g7876bc68e5+1d137996f1,g7985c39107+62d12e78cb,g7fdac2220c+0fd8241c05,g96f01af41f+368e6903a7,g9ca82378b8+2ced63db88,g9d27549199+ef6ac23297,gabe93b2c52+e3573e3735,gb065e2a02a+3dfbe639da,gbc3249ced9+0c5d6105b6,gbec6a3398f+0c5d6105b6,gc9534b9d65+35b9f25267,gd01420fc67+0c5d6105b6,geee7ff78d7+a14128c129,gf63283c776+ede3a706f7,gfed783d017+0c5d6105b6,w.2022.47
LSST Data Management Base Package
Loading...
Searching...
No Matches
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"
35
36namespace lsst {
37namespace afw {
38namespace geom {
39
66template <typename PointT, typename ArrayT>
68public:
69 using Point = PointT;
70 using Array = ArrayT;
71
72 BaseEndpoint(BaseEndpoint const &) = default;
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
155
163 virtual void normalizeFrame(std::shared_ptr<ast::Frame> framePtr) const {};
164
165protected:
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
185private:
186 int _nAxes;
187};
188
194template <typename PointT>
195class BaseVectorEndpoint : public BaseEndpoint<PointT, std::vector<PointT>> {
196public:
198 using Point = PointT;
199
204
205 ~BaseVectorEndpoint() override = default;
206
207 int getNPoints(Array const &arr) const override;
208
209protected:
217 explicit BaseVectorEndpoint(int nAxes) : BaseEndpoint<Point, Array>(nAxes){};
218};
219
226class GenericEndpoint : public BaseEndpoint<std::vector<double>, ndarray::Array<double, 2, 2>> {
227public:
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
261class Point2Endpoint : public BaseVectorEndpoint<lsst::geom::Point2D> {
262public:
263 Point2Endpoint(Point2Endpoint const &) = default;
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
315class SpherePointEndpoint : public BaseVectorEndpoint<lsst::geom::SpherePoint> {
316public:
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
360std::ostream &operator<<(std::ostream &os, GenericEndpoint const &endpoint);
361
363std::ostream &operator<<(std::ostream &os, Point2Endpoint const &endpoint);
364
366std::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
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
BaseEndpoint(BaseEndpoint &&)=default
BaseEndpoint & operator=(BaseEndpoint &&)=delete
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
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.
virtual ndarray::Array< double, 2, 2 > dataFromArray(Array const &arr) const =0
Get raw data from an array of points.
virtual std::vector< double > dataFromPoint(Point const &point) const =0
Get raw data from a single point.
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.
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.
BaseEndpoint & operator=(BaseEndpoint const &)=delete
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 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 & operator=(BaseVectorEndpoint &&)=delete
~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
Get raw data from a single point.
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(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
Get raw data from an array of points.
Definition: Endpoint.cc:91
GenericEndpoint & operator=(GenericEndpoint const &)=delete
static std::string getClassPrefix()
Get the class name prefix, e.g. "Point2" for "Point2Endpoint".
Definition: Endpoint.h:255
~GenericEndpoint() override=default
GenericEndpoint & operator=(GenericEndpoint &&)=delete
An endpoint for lsst::geom::Point2D.
Definition: Endpoint.h:261
Point2Endpoint & operator=(Point2Endpoint const &)=delete
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() 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
Point2Endpoint & operator=(Point2Endpoint &&)=delete
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
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(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 & operator=(SpherePointEndpoint &&)=delete
SpherePointEndpoint(SpherePointEndpoint const &)=default
SpherePointEndpoint & operator=(SpherePointEndpoint const &)=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