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
SkyWcs.h
Go to the documentation of this file.
1// -*- lsst-c++ -*-
2/*
3 * LSST Data Management System
4 * Copyright 2017 AURA/LSST.
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_SKYWCS_H
25#define LSST_AFW_GEOM_SKYWCS_H
26
27#include <memory>
28#include <utility>
29#include <vector>
30
31#include "Eigen/Core"
32#include "astshim.h"
33#include "ndarray.h"
34
37#include "lsst/geom/Angle.h"
38#include "lsst/geom/Point.h"
43
44namespace lsst {
45namespace afw {
46namespace geom {
47
61Eigen::Matrix2d makeCdMatrix(lsst::geom::Angle const &scale,
62 lsst::geom::Angle const &orientation = 0 * lsst::geom::degrees,
63 bool flipX = false);
64
117class SkyWcs final : public table::io::PersistableFacade<SkyWcs>, public typehandling::Storable {
118public:
119 SkyWcs(SkyWcs const &) = default;
120 SkyWcs(SkyWcs &&) = default;
121 SkyWcs &operator=(SkyWcs const &) = delete;
122 SkyWcs &operator=(SkyWcs &&) = delete;
123 ~SkyWcs() override = default;
124
135 bool operator==(SkyWcs const &other) const;
136 bool operator!=(SkyWcs const &other) const { return !(*this == other); }
137
149 explicit SkyWcs(daf::base::PropertySet &metadata, bool strip = false);
150
163 explicit SkyWcs(ast::FrameDict const &frameDict);
164
173
191
200
208 lsst::geom::Angle getPixelScale() const { return _pixelScaleAtOrigin; };
209
215 lsst::geom::Point2D getPixelOrigin() const { return _pixelOrigin; };
216
223
229 Eigen::Matrix2d getCdMatrix(lsst::geom::Point2D const &pixel) const;
230
236 Eigen::Matrix2d getCdMatrix() const;
237
242
252
258
266 bool isFlipped() const;
267
268 bool isPersistable() const noexcept override { return true; }
269
283 lsst::geom::AngleUnit const &skyUnit) const;
284
298 lsst::geom::AngleUnit const &skyUnit) const;
299
313 lsst::geom::AngleUnit const &skyUnit) const;
314
328 lsst::geom::AngleUnit const &skyUnit) const;
329
335 return _transform->applyForward(pixel);
336 }
337 lsst::geom::SpherePoint pixelToSky(double x, double y) const {
339 }
341 return _transform->applyForward(pixels);
342 }
344
350 return _transform->applyInverse(sky);
351 }
353 return _transform->applyInverse(sky);
354 }
356
358
364 bool hasFitsApproximation() const { return false; }
365
371 bool isFits() const;
372
379
382
400 void writeStream(std::ostream &os) const;
401
403 std::string writeString() const;
404
405 // Override methods required by afw::typehandling::Storable
406
409
420 std::string toString() const override;
421
427 bool equals(typehandling::Storable const &other) const noexcept override;
428
429protected:
430 // Override methods required by afw::table::io::Persistable
431 std::string getPersistenceName() const override;
432 std::string getPythonModule() const override;
433 void write(OutputArchiveHandle &handle) const override;
434
435private:
436 /*
437 * Construct a SkyWcs from a shared pointer to an ast::FrameDict
438 *
439 * The frameDict may be modified.
440 */
441 explicit SkyWcs(std::shared_ptr<ast::FrameDict> frameDict);
442
443 /*
444 * Check a FrameDict to see if it can safely be used for a SkyWcs
445 * Return a copy so that it can be used as an argument to the SkyWcs(shared_ptr<FrameDict>) constructor
446 */
447 std::shared_ptr<ast::FrameDict> _checkFrameDict(ast::FrameDict const &frameDict) const;
448
449 // the full FrameDict, for operations that need intermediate frames
451 // cached transform from _frameDict, for fast computation of pixels<->sky
453 lsst::geom::Point2D _pixelOrigin; // cached pixel origin
454 lsst::geom::Angle _pixelScaleAtOrigin; // cached pixel scale at pixel origin
455
456 /*
457 * Implementation for the overloaded public linearizePixelToSky methods, requiring both a pixel coordinate
458 * and the corresponding sky coordinate.
459 */
460 lsst::geom::AffineTransform _linearizePixelToSky(lsst::geom::Point2D const &pix,
461 lsst::geom::SpherePoint const &coord,
462 lsst::geom::AngleUnit const &skyUnit) const;
463
464 /*
465 * Implementation for the overloaded public linearizeSkyToPixel methods, requiring both a pixel coordinate
466 * and the corresponding sky coordinate.
467 */
468 lsst::geom::AffineTransform _linearizeSkyToPixel(lsst::geom::Point2D const &pix,
469 lsst::geom::SpherePoint const &coord,
470 lsst::geom::AngleUnit const &skyUnit) const;
471
473 void _computeCache() {
474 _transform = std::make_shared<TransformPoint2ToSpherePoint>(*_frameDict->getMapping(), true);
475 _pixelOrigin = skyToPixel(getSkyOrigin());
476 _pixelScaleAtOrigin = getPixelScale(_pixelOrigin);
477 }
478};
479
488std::shared_ptr<SkyWcs> makeFlippedWcs(SkyWcs const &wcs, bool flipLR, bool flipTB,
489 lsst::geom::Point2D const &center);
490
517std::shared_ptr<SkyWcs> makeModifiedWcs(TransformPoint2ToPoint2 const &pixelTransform, SkyWcs const &wcs,
518 bool modifyActualPixels);
519
535std::shared_ptr<SkyWcs> makeSkyWcs(daf::base::PropertySet &metadata, bool strip = false);
536
548 Eigen::Matrix2d const &cdMatrix, std::string const &projection = "TAN");
549
566std::shared_ptr<SkyWcs> makeSkyWcs(TransformPoint2ToPoint2 const &pixelsToFieldAngle,
567 lsst::geom::Angle const &orientation, bool flipX,
568 lsst::geom::SpherePoint const &boresight,
569 std::string const &projection = "TAN");
570
583 Eigen::Matrix2d const &cdMatrix, Eigen::MatrixXd const &sipA,
584 Eigen::MatrixXd const &sipB);
585
600 Eigen::Matrix2d const &cdMatrix, Eigen::MatrixXd const &sipA,
601 Eigen::MatrixXd const &sipB, Eigen::MatrixXd const &sipAp,
602 Eigen::MatrixXd const &sipBp);
614std::shared_ptr<TransformPoint2ToPoint2> makeWcsPairTransform(SkyWcs const &src, SkyWcs const &dst);
615
619std::shared_ptr<TransformPoint2ToSpherePoint> getIntermediateWorldCoordsToSky(SkyWcs const &wcs,
620 bool simplify = true);
621
627std::shared_ptr<TransformPoint2ToPoint2> getPixelToIntermediateWorldCoords(SkyWcs const &wcs,
628 bool simplify = true);
629
633std::ostream &operator<<(std::ostream &os, SkyWcs const &wcs);
634
635} // namespace geom
636} // namespace afw
637} // namespace lsst
638
639#endif
double x
table::PointKey< int > pixel
std::shared_ptr< RecordT > src
Definition: Match.cc:48
table::PointKey< double > crpix
Definition: OldWcs.cc:129
table::PointKey< double > crval
Definition: OldWcs.cc:128
table::Key< table::Array< std::uint8_t > > wcs
Definition: SkyWcs.cc:66
int y
Definition: SpanSet.cc:48
A FrameSet whose frames can be referenced by domain name.
Definition: FrameDict.h:67
A 2-dimensional celestial WCS that transform pixels to ICRS RA/Dec, using the LSST standard for pixel...
Definition: SkyWcs.h:117
Eigen::Matrix2d getCdMatrix() const
Get the 2x2 CD matrix at the pixel origin.
Definition: SkyWcs.cc:199
std::string writeString() const
Serialize this SkyWcs to a string, using the same format as writeStream.
Definition: SkyWcs.cc:342
SkyWcs & operator=(SkyWcs const &)=delete
lsst::geom::SpherePoint pixelToSky(lsst::geom::Point2D const &pixel) const
Compute sky position(s) from pixel position(s)
Definition: SkyWcs.h:334
std::shared_ptr< SkyWcs > copyAtShiftedPixelOrigin(lsst::geom::Extent2D const &shift) const
Return a copy of this SkyWcs with the pixel origin shifted by the specified amount.
Definition: SkyWcs.cc:208
static std::shared_ptr< SkyWcs > readStream(std::istream &is)
Deserialize a SkyWcs from an input stream.
Definition: SkyWcs.cc:304
std::shared_ptr< SkyWcs > getTanWcs(lsst::geom::Point2D const &pixel) const
Get a local TAN WCS approximation to this WCS at the specified pixel position.
Definition: SkyWcs.cc:201
lsst::geom::Angle getPixelScale() const
Get the pixel scale at the pixel origin.
Definition: SkyWcs.h:208
bool isPersistable() const noexcept override
Return true if this particular object can be persisted using afw::table::io.
Definition: SkyWcs.h:268
static std::shared_ptr< SkyWcs > readString(std::string &str)
Deserialize a SkyWcs from a string, using the same format as readStream.
Definition: SkyWcs.cc:332
lsst::geom::SpherePoint getSkyOrigin() const
Get the sky origin, the celestial fiducial point.
Definition: SkyWcs.cc:182
std::string toString() const override
Create a string representation of this object.
Definition: SkyWcs.cc:352
lsst::geom::Point2D getPixelOrigin() const
Get the pixel origin, in pixels, using the LSST convention.
Definition: SkyWcs.h:215
lsst::geom::AffineTransform linearizePixelToSky(lsst::geom::SpherePoint const &coord, lsst::geom::AngleUnit const &skyUnit) const
Return the local linear approximation to pixelToSky at a point given in sky coordinates.
Definition: SkyWcs.cc:275
bool operator==(SkyWcs const &other) const
Equality is based on the string representations being equal.
Definition: SkyWcs.cc:156
lsst::geom::AffineTransform linearizeSkyToPixel(lsst::geom::SpherePoint const &coord, lsst::geom::AngleUnit const &skyUnit) const
Return the local linear approximation to skyToPixel at a point given in sky coordinates.
Definition: SkyWcs.cc:284
SkyWcs(SkyWcs const &)=default
std::shared_ptr< const TransformPoint2ToSpherePoint > getTransform() const
Get a TransformPoint2ToSpherePoint that transforms pixels to sky in the forward direction and sky to ...
Definition: SkyWcs.h:257
bool operator!=(SkyWcs const &other) const
Definition: SkyWcs.h:136
lsst::geom::Point2D skyToPixel(lsst::geom::SpherePoint const &sky) const
Compute pixel position(s) from sky position(s)
Definition: SkyWcs.h:349
lsst::geom::SpherePoint pixelToSky(double x, double y) const
Definition: SkyWcs.h:337
std::string getPythonModule() const override
Return the fully-qualified Python module that should be imported to guarantee that its factory is reg...
Definition: SkyWcs.cc:379
bool isFlipped() const
Does the WCS follow the convention of North=Up, East=Left?
Definition: SkyWcs.cc:296
std::shared_ptr< daf::base::PropertyList > getFitsMetadata(bool precise=false) const
Return the WCS as FITS WCS metadata.
Definition: SkyWcs.cc:213
std::string getPersistenceName() const override
Return the unique name used to persist this object and look up its factory.
Definition: SkyWcs.cc:377
bool hasFitsApproximation() const
Does this SkyWcs have an approximate SkyWcs that can be represented as standard FITS WCS?
Definition: SkyWcs.h:364
void write(OutputArchiveHandle &handle) const override
Write the object to one or more catalogs.
Definition: SkyWcs.cc:381
SkyWcs & operator=(SkyWcs &&)=delete
SkyWcs(SkyWcs &&)=default
bool equals(typehandling::Storable const &other) const noexcept override
Compare this object to another Storable.
Definition: SkyWcs.cc:373
~SkyWcs() override=default
void writeStream(std::ostream &os) const
Serialize this SkyWcs to an output stream.
Definition: SkyWcs.cc:337
std::shared_ptr< typehandling::Storable > cloneStorable() const override
Create a new SkyWcs that is a copy of this one.
Definition: SkyWcs.cc:348
static std::string getShortClassName()
Definition: SkyWcs.cc:294
std::shared_ptr< const ast::FrameDict > getFrameDict() const
Get the contained FrameDict.
Definition: SkyWcs.cc:262
bool isFits() const
Return true getFitsMetadata(true) will succeed, false if not.
Definition: SkyWcs.cc:264
std::vector< lsst::geom::SpherePoint > pixelToSky(std::vector< lsst::geom::Point2D > const &pixels) const
Definition: SkyWcs.h:340
std::vector< lsst::geom::Point2D > skyToPixel(std::vector< lsst::geom::SpherePoint > const &sky) const
Definition: SkyWcs.h:352
A CRTP facade class for subclasses of Persistable.
Definition: Persistable.h:176
io::OutputArchiveHandle OutputArchiveHandle
Definition: Persistable.h:108
Interface supporting iteration over heterogenous containers.
Definition: Storable.h:58
Class for storing generic metadata.
Definition: PropertySet.h:66
An affine coordinate transformation consisting of a linear transformation and an offset.
A class representing an angle.
Definition: Angle.h:128
A class used to convert scalar POD types such as double to Angle.
Definition: Angle.h:71
Point in an unspecified spherical coordinate system.
Definition: SpherePoint.h:57
bool strip
Definition: fits.cc:926
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
Eigen::Matrix2d makeCdMatrix(lsst::geom::Angle const &scale, lsst::geom::Angle const &orientation=0 *lsst::geom::degrees, bool flipX=false)
Make a WCS CD matrix.
Definition: SkyWcs.cc:133
Transform< Point2Endpoint, Point2Endpoint > TransformPoint2ToPoint2
Definition: Transform.h:300
AngleUnit constexpr degrees
constant with units of degrees
Definition: Angle.h:110