LSST Applications g0f08755f38+82efc23009,g12f32b3c4e+e7bdf1200e,g1653933729+a8ce1bb630,g1a0ca8cf93+50eff2b06f,g28da252d5a+52db39f6a5,g2bbee38e9b+37c5a29d61,g2bc492864f+37c5a29d61,g2cdde0e794+c05ff076ad,g3156d2b45e+41e33cbcdc,g347aa1857d+37c5a29d61,g35bb328faa+a8ce1bb630,g3a166c0a6a+37c5a29d61,g3e281a1b8c+fb992f5633,g414038480c+7f03dfc1b0,g41af890bb2+11b950c980,g5fbc88fb19+17cd334064,g6b1c1869cb+12dd639c9a,g781aacb6e4+a8ce1bb630,g80478fca09+72e9651da0,g82479be7b0+04c31367b4,g858d7b2824+82efc23009,g9125e01d80+a8ce1bb630,g9726552aa6+8047e3811d,ga5288a1d22+e532dc0a0b,gae0086650b+a8ce1bb630,gb58c049af0+d64f4d3760,gc28159a63d+37c5a29d61,gcf0d15dbbd+2acd6d4d48,gd7358e8bfb+778a810b6e,gda3e153d99+82efc23009,gda6a2b7d83+2acd6d4d48,gdaeeff99f8+1711a396fd,ge2409df99d+6b12de1076,ge79ae78c31+37c5a29d61,gf0baf85859+d0a5978c5a,gf3967379c6+4954f8c433,gfb92a5be7c+82efc23009,gfec2e1e490+2aaed99252,w.2024.46
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
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:
218};
219
226class GenericEndpoint : public BaseEndpoint<std::vector<double>, ndarray::Array<double, 2, 2>> {
227public:
232
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
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
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
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
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