LSST Applications g044012fb7c+6976b5ec80,g04a91732dc+88a5fc122b,g07dc498a13+7e3c5f68a2,g114c6a66ad+09472d7a76,g1409bbee79+7e3c5f68a2,g1a7e361dbc+7e3c5f68a2,g1fd858c14a+3a43eabc0e,g35bb328faa+fcb1d3bbc8,g3bd4b5ce2c+2647bb081c,g4e0f332c67+5d362be553,g53246c7159+fcb1d3bbc8,g5477a8d5ce+b19c77c7ae,g58d0cdf3ff+4a2e102ff8,g60b5630c4e+09472d7a76,g623d845a50+09472d7a76,g6f0c2978f1+fcf1c0bcd6,g71fabbc107+09472d7a76,g75b6c65c88+d0b1dc44cc,g78460c75b0+2f9a1b4bcd,g786e29fd12+cf7ec2a62a,g7b71ed6315+fcb1d3bbc8,g8852436030+349c7e81d4,g89139ef638+7e3c5f68a2,g9125e01d80+fcb1d3bbc8,g95236ca021+f7a31438ed,g989de1cb63+7e3c5f68a2,g9f33ca652e+f17d666fbc,gaaedd4e678+7e3c5f68a2,gabe3b4be73+1e0a283bba,gb1101e3267+f870f33517,gb58c049af0+f03b321e39,gc99c83e5f0+76d20ab76d,gcf25f946ba+349c7e81d4,gd0fa69b896+f3a65fa83c,gd6cbbdb0b4+c8606af20c,gde0f65d7ad+5bd27d919f,ge278dab8ac+932305ba37,gfba249425e+fcb1d3bbc8,w.2025.07
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
65
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
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
BaseVectorEndpoint(BaseVectorEndpoint &&)=default
BaseVectorEndpoint(int nAxes)
Construct a BaseVectorEndpoint.
Definition Endpoint.h:217
std::vector< PointT > Array
Definition Endpoint.h:197
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
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
Point2Endpoint & operator=(Point2Endpoint const &)=delete
Point2Endpoint()
Construct a Point2Endpoint.
Definition Endpoint.h:271
ndarray::Array< double, 2, 2 > dataFromArray(Array const &arr) const override
Definition Endpoint.cc:123
~Point2Endpoint() override=default
std::vector< double > dataFromPoint(Point const &point) const override
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
ndarray::Array< double, 2, 2 > dataFromArray(Array const &arr) const override
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