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
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,
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
536
548 Eigen::Matrix2d const &cdMatrix, std::string const &projection = "TAN");
549
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);
615
620 bool simplify = true);
621
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
std::ostream * os
Definition: Schema.cc:557
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:911
def scale(algorithm, min, max=None, frame=None)
Definition: ds9.py:108
std::shared_ptr< SkyWcs > makeSkyWcs(daf::base::PropertySet &metadata, bool strip=false)
Construct a SkyWcs from FITS keywords.
Definition: SkyWcs.cc:521
std::shared_ptr< TransformPoint2ToPoint2 > getPixelToIntermediateWorldCoords(SkyWcs const &wcs, bool simplify=true)
Return a transform from pixel coordinates to intermediate world coordinates.
Definition: SkyWcs.cc:559
std::shared_ptr< SkyWcs > makeTanSipWcs(lsst::geom::Point2D const &crpix, lsst::geom::SpherePoint const &crval, Eigen::Matrix2d const &cdMatrix, Eigen::MatrixXd const &sipA, Eigen::MatrixXd const &sipB)
Construct a TAN-SIP SkyWcs with forward SIP distortion terms and an iterative inverse.
Definition: SkyWcs.cc:538
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
std::shared_ptr< TransformPoint2ToSpherePoint > getIntermediateWorldCoordsToSky(SkyWcs const &wcs, bool simplify=true)
Return a transform from intermediate world coordinates to sky.
Definition: SkyWcs.cc:553
std::shared_ptr< SkyWcs > makeModifiedWcs(TransformPoint2ToPoint2 const &pixelTransform, SkyWcs const &wcs, bool modifyActualPixels)
Create a new SkyWcs whose pixels are transformed by pixelTransform, as described below.
Definition: SkyWcs.cc:486
std::shared_ptr< TransformPoint2ToPoint2 > makeWcsPairTransform(SkyWcs const &src, SkyWcs const &dst)
A Transform obtained by putting two SkyWcs objects "back to back".
Definition: SkyWcs.cc:146
Transform< Point2Endpoint, Point2Endpoint > TransformPoint2ToPoint2
Definition: Transform.h:300
std::shared_ptr< SkyWcs > makeFlippedWcs(SkyWcs const &wcs, bool flipLR, bool flipTB, lsst::geom::Point2D const &center)
Return a copy of a FITS-WCS with pixel positions flipped around a specified center.
Definition: SkyWcs.cc:467
constexpr AngleUnit degrees
constant with units of degrees
Definition: Angle.h:110
int orientation(UnitVector3d const &a, UnitVector3d const &b, UnitVector3d const &c)
orientation computes and returns the orientations of 3 unit vectors a, b and c.
Definition: orientation.cc:135
A base class for image defects.