LSSTApplications  19.0.0+10,19.0.0+80,19.0.0-1-g20d9b18+31,19.0.0-1-g49a97f9+4,19.0.0-1-g8c57eb9+31,19.0.0-1-g9a028c0+13,19.0.0-1-ga72da6b+3,19.0.0-1-gb77924a+15,19.0.0-1-gbfe0924+66,19.0.0-1-gc3516c3,19.0.0-1-gefe1d0d+49,19.0.0-1-gf8cb8b4+3,19.0.0-14-g7511ce4+6,19.0.0-16-g3dc1a33c+6,19.0.0-17-g59f0e8a+4,19.0.0-17-g9c22e3c+9,19.0.0-18-g35bb99870+2,19.0.0-19-g2772d4a+9,19.0.0-2-g260436e+53,19.0.0-2-g31cdcee,19.0.0-2-g9675b69+3,19.0.0-2-gaa2795f,19.0.0-2-gbcc4de1,19.0.0-2-gd6f004e+6,19.0.0-2-gde8e5e3+5,19.0.0-2-gff6972b+15,19.0.0-21-ge306cd8,19.0.0-21-gf122e69+2,19.0.0-3-g2d43a51+2,19.0.0-3-gf3b1435+6,19.0.0-4-g56feb96,19.0.0-4-gac56cce+17,19.0.0-49-gce872c1+1,19.0.0-5-g66946eb+6,19.0.0-5-gd8897ba+6,19.0.0-51-gfc4a647e,19.0.0-7-g686a884+5,19.0.0-7-g886f805+5,19.0.0-8-g305ff64,w.2020.17
LSSTDataManagementBasePackage
Orientation.cc
Go to the documentation of this file.
1 /*
2  * LSST Data Management System
3  * Copyright 2008, 2009, 2010, 2011, 2012, 2013, 2014 LSST Corporation.
4  *
5  * This product includes software developed by the
6  * LSST Project (http://www.lsst.org/).
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the LSST License Statement and
19  * the GNU General Public License along with this program. If not,
20  * see <http://www.lsstcorp.org/LegalNotices/>.
21  */
22 
25 
26 namespace lsst {
27 namespace afw {
28 namespace cameraGeom {
29 
32  lsst::geom::Angle const roll)
33  : _fpPosition(fpPosition), _refPoint(refPoint), _yaw(yaw), _pitch(pitch), _roll(roll), _rotMat() {
34  double cosYaw = std::cos(_yaw);
35  double sinYaw = std::sin(_yaw);
36  double cosPitch = std::cos(_pitch);
37  double sinPitch = std::sin(_pitch);
38  double cosRoll = std::cos(_roll);
39  double sinRoll = std::sin(_roll);
40 
41  // This comes from the rotation matrix written down here:
42  // http://en.wikipedia.org/wiki/Euler_angles
43  // for Tait-Bryan angles Z_1Y_2X_3
44  // _rotMat = coeffA coeffB
45  // coeffD coeffE
46  _rotMat << cosYaw * cosPitch, cosYaw * sinPitch * sinRoll - cosRoll * sinYaw, cosPitch * sinYaw,
47  cosYaw * cosRoll + sinYaw * sinPitch * sinRoll;
48 }
49 
50 Orientation::~Orientation() noexcept = default;
51 // Can't combine noexcept and =default until Eigen::Matrix supports noexcept
53  : _fpPosition(other._fpPosition),
54  _refPoint(other._refPoint),
55  _yaw(other._yaw),
56  _pitch(other._pitch),
57  _roll(other._roll),
58  _rotMat(other._rotMat) {}
60  : _fpPosition(std::move(other._fpPosition)),
61  _refPoint(std::move(other._refPoint)),
62  _yaw(std::move(other._yaw)),
63  _pitch(std::move(other._pitch)),
64  _roll(std::move(other._roll)),
65  _rotMat(std::move(other._rotMat)) {}
67  _fpPosition = other._fpPosition;
68  _refPoint = other._refPoint;
69  _yaw = other._yaw;
70  _pitch = other._pitch;
71  _roll = other._roll;
72  _rotMat = other._rotMat;
73  return *this;
74 }
76  _fpPosition = std::move(other._fpPosition);
77  _refPoint = std::move(other._refPoint);
78  _yaw = std::move(other._yaw);
79  _pitch = std::move(other._pitch);
80  _roll = std::move(other._roll);
81  _rotMat = std::move(other._rotMat);
82  return *this;
83 }
84 
85 int Orientation::getNQuarter() const noexcept {
86  float yawDeg = _yaw.asDegrees();
87  while (yawDeg < 0.) {
88  yawDeg += 360.;
89  }
90  return std::floor((yawDeg + 45.) / 90.);
91 }
92 
94  lsst::geom::Extent2D const pixelSizeMm) const {
95  // jacobian = coeffA*pixelSizeMmX, coeffB*pixelSizeMmY,
96  // coeffD*pixelSizeMmX, coeffE*pixelSizeMmY
97  Eigen::Matrix2d jacobian =
98  _rotMat.array() * (Eigen::Vector2d::Ones() * pixelSizeMm.asEigen().transpose()).array();
99 
100  Eigen::Vector2d refMm = pixelSizeMm.asEigen().array() * _refPoint.asEigen().array();
101  Eigen::Vector2d translation = _fpPosition.asEigen() - (_rotMat * refMm);
102 
103  lsst::geom::AffineTransform affineTransform = lsst::geom::AffineTransform(jacobian, translation);
104  return afw::geom::makeTransform(affineTransform);
105 }
106 
108  lsst::geom::Extent2D const pixelSizeMm) const {
109  return makePixelFpTransform(pixelSizeMm)->inverted();
110 }
111 
112 } // namespace cameraGeom
113 } // namespace afw
114 } // namespace lsst
constexpr double asDegrees() const noexcept
Return an Angle&#39;s value in degrees.
Definition: Angle.h:169
An affine coordinate transformation consisting of a linear transformation and an offset.
std::shared_ptr< geom::TransformPoint2ToPoint2 > makePixelFpTransform(lsst::geom::Extent2D const pixelSizeMm) const
Generate a Transform from pixel to focal plane coordinates.
Definition: Orientation.cc:93
table::Point2DKey refPoint
Definition: Detector.cc:168
std::shared_ptr< geom::TransformPoint2ToPoint2 > makeFpPixelTransform(lsst::geom::Extent2D const pixelSizeMm) const
Generate a Transform from focal plane to pixel coordinates.
Definition: Orientation.cc:107
T floor(T... args)
ItemVariant const * other
Definition: Schema.cc:56
A class representing an angle.
Definition: Angle.h:127
Describe a detector&#39;s orientation in the focal plane.
Definition: Orientation.h:52
table::Key< lsst::geom::Angle > pitch
Definition: Detector.cc:170
T sin(T... args)
A base class for image defects.
int getNQuarter() const noexcept
Return the number of quarter turns (rounded to the closest quarter)
Definition: Orientation.cc:85
table::Key< lsst::geom::Angle > roll
Definition: Detector.cc:171
Orientation(lsst::geom::Point2D const fpPosition=lsst::geom::Point2D(0, 0), lsst::geom::Point2D const refPoint=lsst::geom::Point2D(-0.5, -0.5), lsst::geom::Angle const yaw=lsst::geom::Angle(0), lsst::geom::Angle const pitch=lsst::geom::Angle(0), lsst::geom::Angle const roll=lsst::geom::Angle(0))
Definition: Orientation.cc:30
Orientation & operator=(Orientation const &) noexcept
Definition: Orientation.cc:66
T cos(T... args)
T move(T... args)
table::Point2DKey fpPosition
Definition: Detector.cc:167
table::Key< lsst::geom::Angle > yaw
Definition: Detector.cc:169
EigenVector const & asEigen() const noexcept(IS_ELEMENT_NOTHROW_COPYABLE)
Return a fixed-size Eigen representation of the coordinate object.
std::shared_ptr< TransformPoint2ToPoint2 > makeTransform(lsst::geom::AffineTransform const &affine)
Wrap an lsst::geom::AffineTransform as a Transform.