LSST Applications  21.0.0-147-g0e635eb1+1acddb5be5,22.0.0+052faf71bd,22.0.0+1ea9a8b2b2,22.0.0+6312710a6c,22.0.0+729191ecac,22.0.0+7589c3a021,22.0.0+9f079a9461,22.0.1-1-g7d6de66+b8044ec9de,22.0.1-1-g87000a6+536b1ee016,22.0.1-1-g8e32f31+6312710a6c,22.0.1-10-gd060f87+016f7cdc03,22.0.1-12-g9c3108e+df145f6f68,22.0.1-16-g314fa6d+c825727ab8,22.0.1-19-g93a5c75+d23f2fb6d8,22.0.1-19-gb93eaa13+aab3ef7709,22.0.1-2-g8ef0a89+b8044ec9de,22.0.1-2-g92698f7+9f079a9461,22.0.1-2-ga9b0f51+052faf71bd,22.0.1-2-gac51dbf+052faf71bd,22.0.1-2-gb66926d+6312710a6c,22.0.1-2-gcb770ba+09e3807989,22.0.1-20-g32debb5+b8044ec9de,22.0.1-23-gc2439a9a+fb0756638e,22.0.1-3-g496fd5d+09117f784f,22.0.1-3-g59f966b+1e6ba2c031,22.0.1-3-g849a1b8+f8b568069f,22.0.1-3-gaaec9c0+c5c846a8b1,22.0.1-32-g5ddfab5d3+60ce4897b0,22.0.1-4-g037fbe1+64e601228d,22.0.1-4-g8623105+b8044ec9de,22.0.1-5-g096abc9+d18c45d440,22.0.1-5-g15c806e+57f5c03693,22.0.1-7-gba73697+57f5c03693,master-g6e05de7fdc+c1283a92b8,master-g72cdda8301+729191ecac,w.2021.39
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 
37 namespace lsst {
38 namespace afw {
39 namespace cameraGeom {
40 
44 enum class DetectorType {
45  SCIENCE,
46  FOCUS,
47  GUIDER,
48  WAVEFRONT,
49 };
50 
51 
56 class DetectorBase {
57 public:
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 
85  lsst::geom::Box2I getBBox() const { return getFields().bbox; }
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 
125 protected:
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;
150  DetectorBase(DetectorBase &&) = default;
151  DetectorBase & operator=(DetectorBase const &) = default;
154 
160  virtual Fields const & getFields() const = 0;
161 
162 };
163 
164 
182  public DetectorBase,
183  public table::io::PersistableFacade<Detector>,
185 {
186 public:
187 
188  class Builder;
189  class PartialRebuilder;
190  class InCameraBuilder;
191 
198 
200  std::vector<lsst::geom::Point2D> getCorners(CameraSys const &cameraSys) const;
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 
304 protected:
305 
306  Fields const & getFields() const override { return _fields; }
307 
308 private:
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 
363 public:
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 
403  void unsetCrosstalk() { _fields.crosstalk = CrosstalkMatrix(); }
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 
453 protected:
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 
501 private:
502  Fields _fields;
504 };
505 
506 
521 public:
522 
528 
533 
534 private:
536 };
537 
556 public:
557 
562 
567 
578  CameraSysPrefix const & toSys,
580  );
581 
595  CameraSys const & toSys,
597  );
598 
606  bool discardTransformFromPixelsTo(CameraSysPrefix const & toSys);
607 
618  bool discardTransformFromPixelsTo(CameraSys const & toSys);
619 
623  void clearTransforms() { _connections.clear(); }
624 
625 private:
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
Fields const & getFields() const override
Return a reference to a Fields struct.
Definition: Detector.h:476
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
auto begin()
An iterator range over amplifers.
Definition: Detector.h:426
Builder & operator=(Builder const &)=delete
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
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
void setCrosstalk(CrosstalkMatrix const &crosstalk)
Set the crosstalk coefficients.
Definition: Detector.h:400
void setType(DetectorType type)
Set the purpose of this detector.
Definition: Detector.h:378
std::vector< std::shared_ptr< Amplifier::Builder > > const & getAmplifiers() const
Return the sequence of Amplifier::Builders directly.
Definition: Detector.h:418
void unsetCrosstalk()
Remove the crosstalk coefficient matrix.
Definition: Detector.h:403
std::shared_ptr< Amplifier::Builder > operator[](size_t i) const
Get the amplifier builder specified by index.
Definition: Detector.h:435
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
void clear()
Remove all amplifiers.
Definition: Detector.h:448
Builder & operator=(Builder &&)=delete
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 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
DetectorBase & operator=(DetectorBase &&)=default
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
auto begin() const
An iterator range over amplifers.
Definition: Detector.h:278
Fields const & getFields() const override
Return a reference to a Fields struct.
Definition: Detector.h:306
bool hasTransform(CameraSys const &cameraSys) const
Can this object convert between PIXELS and the specified camera coordinate system?
Definition: Detector.cc:82
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< TransformMap const > getTransformMap() const
Get the transform registry.
Definition: Detector.h:267
std::vector< std::shared_ptr< Amplifier const > > const & getAmplifiers() const
Return the sequence of Amplifiers directly.
Definition: Detector.h:270
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
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,...
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
std::shared_ptr< Amplifier const > operator[](size_t i) const
Get the amplifier specified by index.
Definition: Detector.h:287
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
std::string getPythonModule() const override
class[[deprecated("Removed with no replacement (but see lsst::afw::image::TransmissionCurve). Will be " "removed after v22.")]] FilterProperty final
Describe the properties of a Filter (e.g.
Definition: Filter.h:53
std::string getPersistenceName() const override
void write(OutputArchiveHandle &handle) const override
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.