LSSTApplications  16.0-10-g9d3e444,16.0-10-gb7df26b,16.0-11-g09ed895+3,16.0-11-g12e47bd+6,16.0-12-g5c924a4+15,16.0-12-g71e5ef5+4,16.0-15-g7af1f30,16.0-15-gdd5ca33+2,16.0-16-gf0259e2+1,16.0-17-g5cf0468+8,16.0-18-ga4d4bcb+9,16.0-18-gcf94535+7,16.0-18-geff7d6b+4,16.0-19-g9d290d5+7,16.0-2-g0febb12+22,16.0-2-g9d5294e+73,16.0-2-ga8830df+7,16.0-21-gdae7b8c+1,16.0-23-g11577836+1,16.0-28-gfc9ea6c+14,16.0-29-ge8801f9+6,16.0-30-g6787e8a,16.0-4-g18f3627+17,16.0-4-g5f3a788+21,16.0-4-ga3eb747+11,16.0-4-gabf74b7+37,16.0-4-gb13d127+7,16.0-5-g27fb78a+15,16.0-5-g6a53317+42,16.0-5-gb3f8a4b+95,16.0-56-g24625975,16.0-6-g9321be7+5,16.0-6-gcbc7b31+52,16.0-6-gf49912c+38,16.0-75-gbf7a9a820,16.0-8-g21fd5fe+39,16.0-8-g3a9f023+24,16.0-8-gc11f1cf+5,16.0-9-gf3bc169+4,master-gc237143d49+1,w.2019.03
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.
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.