LSST Applications g0b6bd0c080+a72a5dd7e6,g1182afd7b4+2a019aa3bb,g17e5ecfddb+2b8207f7de,g1d67935e3f+06cf436103,g38293774b4+ac198e9f13,g396055baef+6a2097e274,g3b44f30a73+6611e0205b,g480783c3b1+98f8679e14,g48ccf36440+89c08d0516,g4b93dc025c+98f8679e14,g5c4744a4d9+a302e8c7f0,g613e996a0d+e1c447f2e0,g6c8d09e9e7+25247a063c,g7271f0639c+98f8679e14,g7a9cd813b8+124095ede6,g9d27549199+a302e8c7f0,ga1cf026fa3+ac198e9f13,ga32aa97882+7403ac30ac,ga786bb30fb+7a139211af,gaa63f70f4e+9994eb9896,gabf319e997+ade567573c,gba47b54d5d+94dc90c3ea,gbec6a3398f+06cf436103,gc6308e37c7+07dd123edb,gc655b1545f+ade567573c,gcc9029db3c+ab229f5caf,gd01420fc67+06cf436103,gd877ba84e5+06cf436103,gdb4cecd868+6f279b5b48,ge2d134c3d5+cc4dbb2e3f,ge448b5faa6+86d1ceac1d,gecc7e12556+98f8679e14,gf3ee170dca+25247a063c,gf4ac96e456+ade567573c,gf9f5ea5b4d+ac198e9f13,gff490e6085+8c2580be5c,w.2022.27
LSST Data Management Base Package
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
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
std::ostream * os
Definition: Schema.cc:557
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
Point< double, 2 > Point2D
Definition: Point.h:324
A base class for image defects.