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
Detector.h
Go to the documentation of this file.
1// -*- lsst-c++ -*-
2/*
3 * Developed for the LSST Data Management System.
4 * This product includes software developed by the LSST Project
5 * (https://www.lsst.org).
6 * See the COPYRIGHT file at the top-level directory of this distribution
7 * for details of code ownership.
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 GNU General Public License
20 * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 */
22
23#if !defined(LSST_AFW_CAMERAGEOM_DETECTOR_H)
24#define LSST_AFW_CAMERAGEOM_DETECTOR_H
25
26#include <string>
27#include <vector>
28#include <unordered_map>
29#include "lsst/base.h"
36
37namespace lsst {
38namespace afw {
39namespace cameraGeom {
40
44enum class DetectorType {
45 SCIENCE,
46 FOCUS,
47 GUIDER,
49};
50
51
57public:
58
59 using CrosstalkMatrix = ndarray::Array<float const, 2>;
60
61 virtual ~DetectorBase() noexcept = default;
62
64 std::string getName() const { return getFields().name; }
65
67 int getId() const { return getFields().id; }
68
70 DetectorType getType() const { return getFields().type; }
71
73 std::string getSerial() const { return getFields().serial; }
74
83
86
89
92
94 bool hasCrosstalk() const {
95 return !(getFields().crosstalk.isEmpty() ||
96 getFields().crosstalk.getShape() == ndarray::makeVector(0, 0));
97 }
98
101
110 CameraSys makeCameraSys(CameraSys const &cameraSys) const { return cameraSys; }
111
118 CameraSys makeCameraSys(CameraSysPrefix const &cameraSysPrefix) const {
119 return CameraSys(cameraSysPrefix, getFields().name);
120 }
121
124
125protected:
126
127 // Simple struct containing all simple fields (everything not related
128 // to coordinate systems/transforms or associated with an Amplifier).
129 // See docs for corresponding getters (each field has one) for
130 // descriptions.
131 struct Fields {
133 int id = 0;
141 };
142
144
148 DetectorBase() = default;
149 DetectorBase(DetectorBase const &) = default;
151 DetectorBase & operator=(DetectorBase const &) = default;
154
160 virtual Fields const & getFields() const = 0;
161
162};
163
164
181class Detector final :
182 public DetectorBase,
183 public table::io::PersistableFacade<Detector>,
185{
186public:
187
188 class Builder;
189 class PartialRebuilder;
190 class InCameraBuilder;
191
198
201
203 std::vector<lsst::geom::Point2D> getCorners(CameraSysPrefix const &cameraSysPrefix) const;
204
206 lsst::geom::Point2D getCenter(CameraSys const &cameraSys) const;
207
209 lsst::geom::Point2D getCenter(CameraSysPrefix const &cameraSysPrefix) const;
210
212 bool hasTransform(CameraSys const &cameraSys) const;
213
215 bool hasTransform(CameraSysPrefix const &cameraSysPrefix) const;
216
229 template <typename FromSysT, typename ToSysT>
231 ToSysT const &toSys) const;
232
245 template <typename FromSysT, typename ToSysT>
246 lsst::geom::Point2D transform(lsst::geom::Point2D const &point, FromSysT const &fromSys,
247 ToSysT const &toSys) const;
248
261 template <typename FromSysT, typename ToSysT>
263 FromSysT const &fromSys, ToSysT const &toSys) const;
264
265
267 std::shared_ptr<TransformMap const> getTransformMap() const { return _transformMap; }
268
270 std::vector<std::shared_ptr<Amplifier const>> const & getAmplifiers() const { return _amplifiers; }
271
273
278 auto begin() const { return _amplifiers.begin(); }
279 auto end() const { return _amplifiers.end(); }
280 //}
281
287 std::shared_ptr<Amplifier const> operator[](size_t i) const { return _amplifiers.at(i); }
288
295
299 std::size_t size() const { return _amplifiers.size(); }
300
302 bool isPersistable() const noexcept override { return true; }
303
304protected:
305
306 Fields const & getFields() const override { return _fields; }
307
308private:
309
310 class Factory;
311
312 // Pass fields by value to move when we can and copy when we can't;
313 // pass amplifiers by rvalue ref because we always move those.
316
317 std::string getPersistenceName() const override;
318
319 std::string getPythonModule() const override;
320
321 void write(OutputArchiveHandle& handle) const override;
322
323 Fields const _fields;
325 // Given that the number of amplifiers in a detector is generally quite
326 // small (even LSST only has 16), we just use a vector and do linear
327 // searches for name lookups, as adding a map of some kind is definitely
328 // more storage and code complexity, without necessarily being any faster.
330};
331
332
363public:
364
365 // Builder's current subclasses have no need for copy or assignment, and
366 // the hierarchy should be considered closed.
367 Builder(Builder const &) = delete;
368 Builder(Builder &&) = delete;
369 Builder & operator=(Builder const &) = delete;
370 Builder & operator=(Builder &&) = delete;
371
372 ~Builder() noexcept override = 0;
373
375 void setBBox(lsst::geom::Box2I const & bbox) { _fields.bbox = bbox; }
376
378 void setType(DetectorType type) { _fields.type = type; }
379
381 void setSerial(std::string const & serial) { _fields.serial = serial; }
382
389
401
404
405 // We return non-const Amplifier::Builder objects by shared_ptr, via const
406 // methods. That's a bit counterintuitive, but there's no solution to the
407 // problem of constness in containers of pointers in C++ that *is*
408 // intuitive. The alternative would be to have const methods that return
409 // pointer-to-const and non-const methods that return
410 // pointer-to-not-const. The only gain from that would be that it'd be
411 // possible to have a const reference to a Detector::Builder that would
412 // prevent modifications to its amplifiers. That's a lot more code
413 // (writing the iterators would be especially unpleasant) for essentially
414 // no gain, because users who want to prevent changes to the amplifiers
415 // essentially always Detector itself, not Detector::Builder.
416
418 std::vector<std::shared_ptr<Amplifier::Builder>> const & getAmplifiers() const { return _amplifiers; }
419
421
426 auto begin() { return _amplifiers.begin(); }
427 auto end() { return _amplifiers.end(); }
429
435 std::shared_ptr<Amplifier::Builder> operator[](size_t i) const { return _amplifiers.at(i); }
436
443
446
448 void clear() { _amplifiers.clear(); }
449
451 std::size_t size() const { return _amplifiers.size(); }
452
453protected:
454
460
465 Builder(std::string const & name, int id);
466
472 _fields(std::move(fields)),
473 _amplifiers(std::move(amplifiers))
474 {}
475
476 Fields const & getFields() const override { return _fields; }
477
482
491
500
501private:
502 Fields _fields;
504};
505
506
521public:
522
528
533
534private:
536};
537
556public:
557
562
567
578 CameraSysPrefix const & toSys,
580 );
581
595 CameraSys const & toSys,
597 );
598
607
618 bool discardTransformFromPixelsTo(CameraSys const & toSys);
619
623 void clearTransforms() { _connections.clear(); }
624
625private:
626
627 // We'd really like to friend Camera::Builder, but can't forward declare
628 // an inner class. So instead we friend Camera, and it has static members
629 // that make the needed functionality accessible to Camera::Builder.
630 friend class Camera;
631
632 // Construct from an existing Detector. For use only by Camera.
634
635 // Construct a completely new detector. For use only by Camera.
636 InCameraBuilder(std::string const & name, int id);
637
638 // Construct a Detector from the builder. For use only by Camera.
639 //
640 // @param[in] transformMap All transforms known to the entire Camera.
641 //
643
644 // Transforms and coordinate systems that are specific to this detector.
645 // This does not include the FOCAL_PLANE<->PIXELS connection, as that's
646 // derived from the orientation and pixel size.
648};
649
650} // namespace cameraGeom
651} // namespace afw
652} // namespace lsst
653
654#endif
table::Key< std::string > name
Definition: Amplifier.cc:116
AmpInfoBoxKey bbox
Definition: Amplifier.cc:117
table::Key< int > transformMap
Definition: Camera.cc:125
table::Key< std::string > physicalType
Definition: Detector.cc:174
table::Key< int > type
Definition: Detector.cc:163
table::Point2DKey pixelSize
Definition: Detector.cc:166
table::Key< std::string > serial
Definition: Detector.cc:164
table::Key< table::Array< float > > crosstalk
Definition: Detector.cc:173
table::Key< int > detector
Basic LSST definitions.
An immutable representation of a camera.
Definition: Camera.h:43
Camera coordinate system; used as a key in in TransformMap.
Definition: CameraSys.h:83
Camera coordinate system prefix.
Definition: CameraSys.h:44
A helper class for Detector that allows amplifiers and most fields to be modified.
Definition: Detector.h:362
Builder & operator=(Builder const &)=delete
auto begin()
An iterator range over amplifers.
Definition: Detector.h:426
void setSerial(std::string const &serial)
Set the detector serial "number".
Definition: Detector.h:381
void setBBox(lsst::geom::Box2I const &bbox)
Set the bounding box.
Definition: Detector.h:375
void setPhysicalType(std::string const &physicalType)
Set the detector's physical type.
Definition: Detector.h:388
Builder & operator=(Builder &&)=delete
std::vector< std::shared_ptr< Amplifier const > > finishAmplifiers() const
Create a vector of Amplifiers from the Amplifier::Builder sequence.
Definition: Detector.cc:373
void setPixelSize(lsst::geom::Extent2D const &pixelSize)
Set the pixel size (in mm).
Definition: Detector.h:499
static std::vector< std::shared_ptr< Amplifier::Builder > > rebuildAmplifiers(Detector const &detector)
Create a vector of Amplifier::Builders from the Amplifiers in a Detector.
Definition: Detector.cc:355
Builder(Fields fields, std::vector< std::shared_ptr< Amplifier::Builder > > &&amplifiers)
Construct a Detector::Builder with the given field values and amplifiers.
Definition: Detector.h:471
void setCrosstalk(CrosstalkMatrix const &crosstalk)
Set the crosstalk coefficients.
Definition: Detector.h:400
std::vector< std::shared_ptr< Amplifier::Builder > > const & getAmplifiers() const
Return the sequence of Amplifier::Builders directly.
Definition: Detector.h:418
void setType(DetectorType type)
Set the purpose of this detector.
Definition: Detector.h:378
Fields const & getFields() const override
Return a reference to a Fields struct.
Definition: Detector.h:476
void unsetCrosstalk()
Remove the crosstalk coefficient matrix.
Definition: Detector.h:403
void setOrientation(Orientation const &orientation)
Set the orientation of the detector in the focal plane.
Definition: Detector.h:490
void append(std::shared_ptr< Amplifier::Builder > builder)
Append a new amplifier.
Definition: Detector.cc:351
std::size_t size() const
Return the number of amplifiers (renamed to len in Python).
Definition: Detector.h:451
std::shared_ptr< Amplifier::Builder > operator[](size_t i) const
Get the amplifier builder specified by index.
Definition: Detector.h:435
void clear()
Remove all amplifiers.
Definition: Detector.h:448
A helper class that allows the properties of a detector to be modified in the course of modifying a f...
Definition: Detector.h:555
void setOrientation(Orientation const &orientation)
Set the orientation of the detector in the focal plane.
Definition: Detector.h:561
void setTransformFromPixelsTo(CameraSysPrefix const &toSys, std::shared_ptr< afw::geom::TransformPoint2ToPoint2 const > transform)
Set the transformation from PIXELS to the given coordinate system.
Definition: Detector.cc:413
bool discardTransformFromPixelsTo(CameraSysPrefix const &toSys)
Remove any transformation from PIXELS to the given coordinate system.
Definition: Detector.cc:441
void setPixelSize(lsst::geom::Extent2D const &pixelSize)
Set the pixel size (in mm).
Definition: Detector.h:566
void clearTransforms()
Remove all coordinate transforms.
Definition: Detector.h:623
A helper class that allows the properties of a single detector to be modified in isolation.
Definition: Detector.h:520
PartialRebuilder(Detector const &detector)
Construct a PartialRebuilder initialized to the state of the given Detector.
Definition: Detector.cc:383
std::shared_ptr< Detector const > finish() const
Construct a new Detector from the current state of the Builder.
Definition: Detector.cc:388
An abstract base class that provides common accessors for Detector and Detector::Builder.
Definition: Detector.h:56
DetectorBase(DetectorBase const &)=default
lsst::geom::Box2I getBBox() const
Get the bounding box.
Definition: Detector.h:85
DetectorBase(DetectorBase &&)=default
virtual ~DetectorBase() noexcept=default
DetectorBase & operator=(DetectorBase &&)=default
DetectorBase & operator=(DetectorBase const &)=default
DetectorBase()=default
DetectorBase has no state, and is hence default-constructable, copyable, and movable.
lsst::geom::Extent2D getPixelSize() const
Get size of pixel along (mm)
Definition: Detector.h:91
CameraSys makeCameraSys(CameraSysPrefix const &cameraSysPrefix) const
Get a coordinate system from a detector system prefix (add detector name)
Definition: Detector.h:118
std::string getName() const
Get the detector name.
Definition: Detector.h:64
CameraSys getNativeCoordSys() const
The "native" coordinate system of this detector.
Definition: Detector.h:123
virtual Fields const & getFields() const =0
Return a reference to a Fields struct.
bool hasCrosstalk() const
Have we got crosstalk coefficients?
Definition: Detector.h:94
int getId() const
Get the detector ID.
Definition: Detector.h:67
std::string getPhysicalType() const
Get the detector's physical type.
Definition: Detector.h:82
Orientation getOrientation() const
Get detector's orientation in the focal plane.
Definition: Detector.h:88
std::string getSerial() const
Get the detector serial "number".
Definition: Detector.h:73
CameraSys makeCameraSys(CameraSys const &cameraSys) const
Get a coordinate system from a coordinate system (return input unchanged and untested)
Definition: Detector.h:110
CrosstalkMatrix getCrosstalk() const
Get the crosstalk coefficients.
Definition: Detector.h:100
ndarray::Array< float const, 2 > CrosstalkMatrix
Definition: Detector.h:59
DetectorType getType() const
Return the purpose of this detector.
Definition: Detector.h:70
A representation of a detector in a mosaic camera.
Definition: Detector.h:185
std::vector< std::shared_ptr< Amplifier const > > const & getAmplifiers() const
Return the sequence of Amplifiers directly.
Definition: Detector.h:270
auto begin() const
An iterator range over amplifers.
Definition: Detector.h:278
bool hasTransform(CameraSys const &cameraSys) const
Can this object convert between PIXELS and the specified camera coordinate system?
Definition: Detector.cc:82
std::shared_ptr< afw::geom::TransformPoint2ToPoint2 > getTransform(FromSysT const &fromSys, ToSysT const &toSys) const
Get a Transform from one camera coordinate system, or camera coordinate system prefix,...
std::size_t size() const
Get the number of amplifiers.
Definition: Detector.h:299
bool isPersistable() const noexcept override
Detector is always persistable.
Definition: Detector.h:302
std::shared_ptr< Amplifier const > operator[](size_t i) const
Get the amplifier specified by index.
Definition: Detector.h:287
std::shared_ptr< TransformMap const > getTransformMap() const
Get the transform registry.
Definition: Detector.h:267
Fields const & getFields() const override
Return a reference to a Fields struct.
Definition: Detector.h:306
lsst::geom::Point2D transform(lsst::geom::Point2D const &point, FromSysT const &fromSys, ToSysT const &toSys) const
Transform a point from one camera system to another.
Definition: Detector.cc:95
std::vector< lsst::geom::Point2D > getCorners(CameraSys const &cameraSys) const
Get the corners of the detector in the specified camera coordinate system.
Definition: Detector.cc:62
lsst::geom::Point2D getCenter(CameraSys const &cameraSys) const
Get the center of the detector in the specified camera coordinate system.
Definition: Detector.cc:72
std::shared_ptr< PartialRebuilder > rebuild() const
Return a Builder object initialized with the state of this Detector.
Definition: Detector.cc:58
Describe a detector's orientation in the focal plane.
Definition: Orientation.h:51
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
An integer coordinate rectangle.
Definition: Box.h:55
CameraSysPrefix const PIXELS
Pixel coordinates: Nominal position on the entry surface of a given detector (x, y unbinned pixels).
Definition: CameraSys.cc:34
DetectorType
Type of imaging detector.
Definition: Detector.h:44
def write(self, patchRef, catalog)
Write the output.
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.
STL namespace.