LSSTApplications  18.0.0+106,18.0.0+50,19.0.0,19.0.0+1,19.0.0+10,19.0.0+11,19.0.0+13,19.0.0+17,19.0.0+2,19.0.0-1-g20d9b18+6,19.0.0-1-g425ff20,19.0.0-1-g5549ca4,19.0.0-1-g580fafe+6,19.0.0-1-g6fe20d0+1,19.0.0-1-g7011481+9,19.0.0-1-g8c57eb9+6,19.0.0-1-gb5175dc+11,19.0.0-1-gdc0e4a7+9,19.0.0-1-ge272bc4+6,19.0.0-1-ge3aa853,19.0.0-10-g448f008b,19.0.0-12-g6990b2c,19.0.0-2-g0d9f9cd+11,19.0.0-2-g3d9e4fb2+11,19.0.0-2-g5037de4,19.0.0-2-gb96a1c4+3,19.0.0-2-gd955cfd+15,19.0.0-3-g2d13df8,19.0.0-3-g6f3c7dc,19.0.0-4-g725f80e+11,19.0.0-4-ga671dab3b+1,19.0.0-4-gad373c5+3,19.0.0-5-ga2acb9c+2,19.0.0-5-gfe96e6c+2,w.2020.01
LSSTDataManagementBasePackage
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 
82  std::string getPhysicalType() const { return getFields().physicalType; }
83 
85  lsst::geom::Box2I getBBox() const { return getFields().bbox; }
86 
88  Orientation getOrientation() const { return getFields().orientation; }
89 
91  lsst::geom::Extent2D getPixelSize() const { return getFields().pixelSize; }
92 
94  bool hasCrosstalk() const {
95  return !(getFields().crosstalk.isEmpty() ||
96  getFields().crosstalk.getShape() == ndarray::makeVector(0, 0));
97  }
98 
100  CrosstalkMatrix getCrosstalk() const { return getFields().crosstalk; }
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 
123  CameraSys getNativeCoordSys() const { return CameraSys(PIXELS, getName()); }
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;
152  DetectorBase & operator=(DetectorBase &&) = default;
154 
160  virtual Fields const & getFields() const = 0;
161 
162 };
163 
164 
181 class Detector final :
182  public DetectorBase,
183  public table::io::PersistableFacade<Detector>,
185 {
186 public:
187 
188  class Builder;
189  class PartialRebuilder;
190  class InCameraBuilder;
191 
197  std::shared_ptr<PartialRebuilder> rebuild() const;
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>
230  std::shared_ptr<afw::geom::TransformPoint2ToPoint2> getTransform(FromSysT const &fromSys,
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 
294  std::shared_ptr<Amplifier const> operator[](std::string const &name) const;
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 
388  void setPhysicalType(std::string const & physicalType) { _fields.physicalType = physicalType; }
389 
400  void setCrosstalk(CrosstalkMatrix const & crosstalk) { _fields.crosstalk = crosstalk; }
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 
442  std::shared_ptr<Amplifier::Builder> operator[](std::string const &name) const;
443 
446 
448  void clear() { _amplifiers.clear(); }
449 
451  std::size_t size() const { return _amplifiers.size(); }
452 
453 protected:
454 
459  static std::vector<std::shared_ptr<Amplifier::Builder>> rebuildAmplifiers(Detector const & detector);
460 
465  Builder(std::string const & name, int id);
466 
471  Builder(Fields fields, std::vector<std::shared_ptr<Amplifier::Builder>> && amplifiers) :
472  _fields(std::move(fields)),
473  _amplifiers(std::move(amplifiers))
474  {}
475 
476  Fields const & getFields() const override { return _fields; }
477 
481  std::vector<std::shared_ptr<Amplifier const>> finishAmplifiers() const;
482 
490  void setOrientation(Orientation const & orientation) { _fields.orientation = orientation; }
491 
499  void setPixelSize(lsst::geom::Extent2D const & pixelSize) { _fields.pixelSize = pixelSize; }
500 
501 private:
502  Fields _fields;
504 };
505 
506 
521 public:
522 
528 
532  std::shared_ptr<Detector const> finish() const;
533 
534 private:
536 };
537 
556 public:
557 
562 
567 
577  void setTransformFromPixelsTo(
578  CameraSysPrefix const & toSys,
580  );
581 
594  void setTransformFromPixelsTo(
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
AmpInfoBoxKey bbox
Definition: Amplifier.cc:117
A helper class that allows the properties of a single detector to be modified in isolation.
Definition: Detector.h:520
Orientation getOrientation() const
Get detector&#39;s orientation in the focal plane.
Definition: Detector.h:88
void setPixelSize(lsst::geom::Extent2D const &pixelSize)
Set the pixel size (in mm).
Definition: Detector.h:499
def write(self, patchRef, catalog)
Write the output.
lsst::geom::Box2I getBBox() const
Get the bounding box.
Definition: Detector.h:85
Camera coordinate system; used as a key in in TransformMap.
Definition: CameraSys.h:83
void setCrosstalk(CrosstalkMatrix const &crosstalk)
Set the crosstalk coefficients.
Definition: Detector.h:400
Basic LSST definitions.
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
An object passed to Persistable::write to allow it to persist itself.
lsst::geom::Extent2D getPixelSize() const
Get size of pixel along (mm)
Definition: Detector.h:91
auto end()
An iterator range over amplifers.
Definition: Detector.h:427
std::shared_ptr< Amplifier::Builder > operator[](size_t i) const
Get the amplifier builder specified by index.
Definition: Detector.h:435
Fields const & getFields() const override
An iterator range over amplifers.
Definition: Detector.h:306
CameraSysPrefix const PIXELS
Pixel coordinates: Nominal position on the entry surface of a given detector (x, y unbinned pixels)...
Definition: CameraSys.cc:34
Interface supporting iteration over heterogenous containers.
Definition: Storable.h:58
Fields const & getFields() const override
Return a reference to a Fields struct.
Definition: Detector.h:476
An immutable representation of a camera.
Definition: Camera.h:43
DetectorType getType() const
Return the purpose of this detector.
Definition: Detector.h:70
CameraSys makeCameraSys(CameraSys const &cameraSys) const
Get a coordinate system from a coordinate system (return input unchanged and untested) ...
Definition: Detector.h:110
STL namespace.
A helper class that allows the properties of a detector to be modified in the course of modifying a f...
Definition: Detector.h:555
CameraSys makeCameraSys(CameraSysPrefix const &cameraSysPrefix) const
Get a coordinate system from a detector system prefix (add detector name)
Definition: Detector.h:118
void clear()
Remove all amplifiers.
Definition: Detector.h:448
void setOrientation(Orientation const &orientation)
Set the orientation of the detector in the focal plane.
Definition: Detector.h:490
std::shared_ptr< FrameSet > append(FrameSet const &first, FrameSet const &second)
Construct a FrameSet that performs two transformations in series.
Definition: functional.cc:33
int getId() const
Get the detector ID.
Definition: Detector.h:67
std::string getPhysicalType() const
Get the detector&#39;s physical type.
Definition: Detector.h:82
Describe a detector&#39;s orientation in the focal plane.
Definition: Orientation.h:52
STL class.
std::string getSerial() const
Get the detector serial "number".
Definition: Detector.h:73
A helper class for Detector that allows amplifiers and most fields to be modified.
Definition: Detector.h:362
A base class for image defects.
CrosstalkMatrix getCrosstalk() const
Get the crosstalk coefficients.
Definition: Detector.h:100
table::Key< int > type
Definition: Detector.cc:163
std::shared_ptr< TransformMap const > getTransformMap() const
Get the transform registry.
Definition: Detector.h:267
void clearTransforms()
Remove all coordinate transforms.
Definition: Detector.h:623
void setType(DetectorType type)
Set the purpose of this detector.
Definition: Detector.h:378
table::Key< int > detector
void setPixelSize(lsst::geom::Extent2D const &pixelSize)
Set the pixel size (in mm).
Definition: Detector.h:566
table::Point2DKey pixelSize
Definition: Detector.cc:166
void setBBox(lsst::geom::Box2I const &bbox)
Set the bounding box.
Definition: Detector.h:375
auto begin()
An iterator range over amplifers.
Definition: Detector.h:426
std::size_t size() const
Return the number of amplifiers (renamed to len in Python).
Definition: Detector.h:451
Camera coordinate system prefix.
Definition: CameraSys.h:44
void setSerial(std::string const &serial)
Set the detector serial "number".
Definition: Detector.h:381
table::Key< std::string > physicalType
Definition: Detector.cc:174
STL class.
A representation of a detector in a mosaic camera.
Definition: Detector.h:181
An abstract base class that provides common accessors for Detector and Detector::Builder.
Definition: Detector.h:56
std::vector< std::shared_ptr< Amplifier::Builder > > const & getAmplifiers() const
Return the sequence of Amplifier::Builders directly.
Definition: Detector.h:418
std::size_t size() const
Get the number of amplifiers.
Definition: Detector.h:299
void unsetCrosstalk()
Remove the crosstalk coefficient matrix.
Definition: Detector.h:403
bool hasCrosstalk() const
Have we got crosstalk coefficients?
Definition: Detector.h:94
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() const
An iterator range over amplifers.
Definition: Detector.h:278
CameraSys getNativeCoordSys() const
The "native" coordinate system of this detector.
Definition: Detector.h:123
std::shared_ptr< Amplifier const > operator[](size_t i) const
Get the amplifier specified by index.
Definition: Detector.h:287
table::Key< int > transform
table::Key< std::string > serial
Definition: Detector.cc:164
std::vector< std::shared_ptr< Amplifier const > > const & getAmplifiers() const
Return the sequence of Amplifiers directly.
Definition: Detector.h:270
bool isPersistable() const noexcept override
Detector is always persistable.
Definition: Detector.h:302
table::Key< table::Array< float > > crosstalk
Definition: Detector.cc:173
DetectorType
Type of imaging detector.
Definition: Detector.h:44
A CRTP facade class for subclasses of Persistable.
Definition: Persistable.h:176
An integer coordinate rectangle.
Definition: Box.h:55
ndarray::Array< float const, 2 > CrosstalkMatrix
Definition: Detector.h:59
void setOrientation(Orientation const &orientation)
Set the orientation of the detector in the focal plane.
Definition: Detector.h:561
void setPhysicalType(std::string const &physicalType)
Set the detector&#39;s physical type.
Definition: Detector.h:388
auto end() const
An iterator range over amplifers.
Definition: Detector.h:279