LSST Applications g180d380827+6621f76652,g2079a07aa2+86d27d4dc4,g2305ad1205+f5a9e323a1,g2bbee38e9b+c6a8a0fb72,g337abbeb29+c6a8a0fb72,g33d1c0ed96+c6a8a0fb72,g3a166c0a6a+c6a8a0fb72,g3ddfee87b4+9a10e1fe7b,g48712c4677+c9a099281a,g487adcacf7+f2e03ea30b,g50ff169b8f+96c6868917,g52b1c1532d+585e252eca,g591dd9f2cf+aead732c78,g64a986408d+eddffb812c,g858d7b2824+eddffb812c,g864b0138d7+aa38e45daa,g974c55ee3d+f37bf00e57,g99cad8db69+119519a52d,g9c22b2923f+e2510deafe,g9ddcbc5298+9a081db1e4,ga1e77700b3+03d07e1c1f,gb0e22166c9+60f28cb32d,gb23b769143+eddffb812c,gba4ed39666+c2a2e4ac27,gbb8dafda3b+27317ec8e9,gbd998247f1+585e252eca,gc120e1dc64+5817c176a8,gc28159a63d+c6a8a0fb72,gc3e9b769f7+6707aea8b4,gcf0d15dbbd+9a10e1fe7b,gdaeeff99f8+f9a426f77a,ge6526c86ff+6a2e01d432,ge79ae78c31+c6a8a0fb72,gee10cc3b42+585e252eca,gff1a9f87cc+eddffb812c,v27.0.0.rc1
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