LSSTApplications  16.0-10-g4f78f78+16,16.0-10-gc1446dd+42,16.0-11-g09ed895+1,16.0-13-g7649090,16.0-14-g0a28612+1,16.0-14-g6c7ed55+16,16.0-15-ga29f190+1,16.0-16-g89065d4+14,16.0-16-gd8e3590+16,16.0-16-ge6a35c8+6,16.0-17-g7e0e4ff+10,16.0-17-ga3d2e9f,16.0-19-gb830ed4e+16,16.0-2-g0febb12+21,16.0-2-g9d5294e+61,16.0-2-ga8830df+5,16.0-24-gc1c7f52+9,16.0-25-g07af9f2+1,16.0-3-ge00e371+21,16.0-36-g07840cb1,16.0-4-g18f3627+5,16.0-4-g5f3a788+20,16.0-4-ga3eb747+10,16.0-4-gabf74b7+16,16.0-4-gade8416+9,16.0-4-gb13d127+5,16.0-5-g6a53317+21,16.0-5-gb3f8a4b+74,16.0-5-gef99c9f+12,16.0-6-g9321be7+4,16.0-6-gcbc7b31+22,16.0-6-gf49912c+16,16.0-63-gae20905ba,16.0-7-gd2eeba5+31,16.0-8-g21fd5fe+16,16.0-8-g3a9f023+12,16.0-8-g4734f7a,16.0-9-g85d1a16+16,16.0-9-gf5c1f43,master-g07ce7b41a7,w.2018.48
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:169
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)
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:171
T sin(T... args)
A base class for image defects.
Definition: cameraGeom.dox:3
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:172
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:168
table::Key< lsst::geom::Angle > yaw
Definition: Detector.cc:170
EigenVector const & asEigen() const noexcept(IS_ELEMENT_NOTHROW_COPYABLE)
Return a fixed-size Eigen representation of the coordinate object.
ItemVariant const * other
Definition: Schema.cc:56
std::shared_ptr< TransformPoint2ToPoint2 > makeTransform(lsst::geom::AffineTransform const &affine)
Wrap an lsst::geom::AffineTransform as a Transform.