30 namespace cameraGeom {
35 CameraSys
const getNativeCameraSys() {
return FOCAL_PLANE; }
47 auto nativePoint =
transform(point, cameraSys, getNativeCameraSys());
50 for (
auto const &item :
getIdMap()) {
52 auto pointPixels =
detector->transform(nativePoint, getNativeCameraSys(),
PIXELS);
63 auto nativePointList =
transform(pointList, cameraSys, getNativeCameraSys());
67 auto pointPixelsList =
detector->transform(nativePointList, getNativeCameraSys(),
PIXELS);
68 for (
std::size_t i = 0; i < pointPixelsList.size(); ++i) {
69 auto const &pointPixels = pointPixelsList[i];
71 detectorListList[i].push_back(
detector);
75 return detectorListList;
108 return detector._connections;
114 class PersistenceHelper {
117 static PersistenceHelper
const &
get() {
118 static PersistenceHelper
const instance;
129 PersistenceHelper() :
131 name(schema.addField<
std::string>(
"name",
"Camera name",
"", 0)),
132 pupilFactoryName(schema.addField<
std::string>(
"pupilFactoryName",
133 "Fully-qualified name of a Python PupilFactory class",
135 transformMap(schema.addField<int>(
"transformMap",
"archive ID for Camera's TransformMap"))
139 PersistenceHelper(PersistenceHelper
const &) =
delete;
140 PersistenceHelper(PersistenceHelper &&) =
delete;
142 PersistenceHelper &
operator=(PersistenceHelper
const &) =
delete;
143 PersistenceHelper &
operator=(PersistenceHelper &&) =
delete;
151 auto const &
keys = PersistenceHelper::get();
153 auto record = cat.
addNew();
163 Factory() : table::io::PersistableFactory(
"Camera") {}
181 _pupilFactoryName(pupilFactoryName),
182 _transformMap(
std::move(transformMap))
190 auto const &
keys = PersistenceHelper::get();
192 auto const & cat = catalogs[1];
195 auto const & record = cat.front();
196 _name = record.get(
keys.name);
197 _pupilFactoryName = record.get(
keys.pupilFactoryName);
201 std::string Camera::getPersistenceName()
const {
return "Camera"; }
212 for (
auto const & pair : camera.
getIdMap()) {
217 for (
auto const & connection : camera.
getTransformMap()->getConnections()) {
226 if (connection.fromSys.hasDetectorName()) {
227 assert(connection.toSys.getDetectorName() == connection.fromSys.getDetectorName());
228 auto detector = (*this)[connection.fromSys.getDetectorName()];
229 assert(connection.fromSys == detector->getNativeCoordSys());
231 connection.transform);
233 assert(connection.fromSys == getNativeCameraSys());
234 if (!connection.toSys.hasDetectorName()) {
235 _connections.push_back(connection);
253 for (
auto const & pair :
getIdMap()) {
254 auto const & detectorBuilder = *pair.second;
257 detectorBuilder.getOrientation().makeFpPixelTransform(detectorBuilder.getPixelSize()),
258 getNativeCameraSys(),
259 detectorBuilder.getNativeCoordSys()
263 getDetectorBuilderConnections(detectorBuilder).begin(),
264 getDetectorBuilderConnections(detectorBuilder).end());
270 detectors.reserve(
size());
271 for (
auto const & pair :
getIdMap()) {
272 auto const & detectorBuilder = *pair.second;
273 detectors.push_back(detectorBuilder.finish(
transformMap));
287 template <
typename Iter>
288 Iter findConnection(Iter
first, Iter last,
CameraSys const & toSys) {
291 [&toSys](
auto const & connection) {
292 return connection.toSys == toSys;
306 (
boost::format(
"%s should be added to Detector %s, not Camera") %
310 auto iter = findConnection(_connections.begin(), _connections.end(), toSys);
311 if (iter == _connections.end()) {
312 _connections.push_back(
321 auto iter = findConnection(_connections.begin(), _connections.end(), toSys);
322 if (
iter != _connections.end()) {
323 _connections.erase(
iter);
330 auto detector = makeDetectorBuilder(name,
id);
340 template class PersistableFacade<cameraGeom::Camera>;
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
void add(std::shared_ptr< Detector::InCameraBuilder > detector)
Add a detector to the collection.
Camera coordinate system; used as a key in in TransformMap.
int put(Persistable const *obj, bool permissive=false)
Save an object to the archive and return a unique ID that can be used to retrieve it from an InputArc...
std::shared_ptr< TransformMap const > getTransformMap() const noexcept
Obtain the transform registry.
std::string getPupilFactoryName() const
Return the fully-qualified name of the Python class that provides this Camera's PupilFactory.
A floating-point coordinate rectangle geometry.
An object passed to Persistable::write to allow it to persist itself.
DetectorList findDetectors(lsst::geom::Point2D const &point, CameraSys const &cameraSys) const
Find the detectors that cover a point in any camera system.
std::size_t size() const noexcept
Get the number of detectors.
virtual ~Camera() noexcept
#define LSST_ARCHIVE_ASSERT(EXPR)
An assertion macro used to validate the structure of an InputArchive.
CameraSysPrefix const PIXELS
Pixel coordinates: Nominal position on the entry surface of a given detector (x, y unbinned pixels)...
A base class for factory classes used to reconstruct objects from records.
DetectorCollection(List const &list)
DetectorCollection::List DetectorList
An immutable representation of a camera.
std::shared_ptr< Detector::InCameraBuilder > add(std::string const &name, int id)
Add a new Detector with the given name and ID.
A helper class that allows the properties of a detector to be modified in the course of modifying a f...
std::string getName() const
Return the name of the camera.
Builder(std::string const &name)
Construct a Builder for a completely new Camera with the given name.
std::string getName() const
Return the name of the camera.
std::vector< DetectorList > findDetectorsList(std::vector< lsst::geom::Point2D > const &pointList, CameraSys const &cameraSys) const
Find the detectors that cover a list of points in any camera system.
std::string getSysName() const
Get coordinate system name.
A base class for image defects.
std::string getDetectorName() const
Get detector name, or "" if not a detector-specific coordinate system.
std::shared_ptr< Persistable > read(InputArchive const &archive, CatalogVector const &catalogs) const override
Construct a new object from the given InputArchive and vector of catalogs.
void setTransformFromFocalPlaneTo(CameraSys const &toSys, std::shared_ptr< afw::geom::TransformPoint2ToPoint2 const > transform)
Set the transformation from FOCAL_PLANE to the given coordinate system.
static Factory const registration
IdMap const & getIdMap() const noexcept
Get an unordered map keyed by ID.
std::shared_ptr< afw::geom::TransformPoint2ToPoint2 > getTransform(CameraSys const &fromSys, CameraSys const &toSys) const
Get a transform from one CameraSys to another.
std::shared_ptr< Camera const > finish() const
Construct a new Camera from the state of the Builder.
table::Key< std::string > name
lsst::geom::Point2D transform(lsst::geom::Point2D const &point, CameraSys const &fromSys, CameraSys const &toSys) const
Transform a point from one camera coordinate system to another.
table::Key< int > detector
Reports errors in the logical structure of the program.
bool discardTransformFromFocalPlaneTo(CameraSys const &toSys)
Remove any transformation from FOCAL_PLANE to the given coordinate system.
BaseCatalog makeCatalog(Schema const &schema)
Return a new, empty catalog with the given schema.
An immutable collection of Detectors that can be accessed by name or ID.
table::Key< int > transformMap
Camera coordinate system prefix.
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
A vector of catalogs used by Persistable.
A representation of a detector in a mosaic camera.
bool hasDetectorName() const noexcept
Does this have a non-blank detector name?
A helper class for creating and modifying cameras.
void write(OutputArchiveHandle &handle) const override
Write the object to one or more catalogs.
table::Key< std::string > pupilFactoryName
Camera & operator=(Camera const &)=delete
void saveCatalog(BaseCatalog const &catalog)
Save a catalog in the archive.
void write(OutputArchiveHandle &handle) const override
Write the object to one or more catalogs.
CameraSys const FOCAL_PLANE
Focal plane coordinates: Position on a 2-d planar approximation to the focal plane (x...
virtual ~Builder() noexcept
void setTransformFromPixelsTo(CameraSysPrefix const &toSys, std::shared_ptr< afw::geom::TransformPoint2ToPoint2 const > transform)
Set the transformation from PIXELS to the given coordinate system.
Camera(Camera const &)=delete
std::shared_ptr< RecordT > addNew()
Create a new record, add it to the end of the catalog, and return a pointer to it.
std::string getPupilFactoryName() const
Return the fully-qualified name of the Python class that provides this Camera's PupilFactory.