37 int const EXPOSURE_TABLE_CURRENT_VERSION = 4;
38 std::string const EXPOSURE_TABLE_VERSION_KEY =
"EXPTABLE_VER";
46 std::string const VISIT_INFO_FIELD_NAME =
"visitInfo";
47 std::string const AP_CORR_MAP_FIELD_NAME =
"apCorrMap";
48 std::string const VALID_POLYGON_FIELD_NAME =
"validPolygon";
49 std::string const TRANSMISSION_CURVE_FIELD_NAME =
"transmissionCurve";
52 int getTableVersion(daf::base::PropertySet &metadata) {
53 return metadata.exists(EXPOSURE_TABLE_VERSION_KEY) ? metadata.get<
int>(EXPOSURE_TABLE_VERSION_KEY) : 1;
61 struct PersistenceHelper {
73 SchemaMapper makeWriteMapper(Schema
const &inputSchema)
const {
75 inSchemas.
push_back(PersistenceHelper().schema);
79 result.editOutputSchema().setAliasMap(inputSchema.getAliasMap());
84 SchemaMapper makeReadMapper(Schema
const &inputSchema)
const {
86 result.editOutputSchema().setAliasMap(inputSchema.getAliasMap());
91 template <
typename OutputArchiveIsh>
92 void writeRecord(ExposureRecord
const &input, BaseRecord &
output, SchemaMapper
const &
mapper,
93 OutputArchiveIsh &archive,
bool permissive)
const {
94 output.assign(input, mapper);
95 output.set(psf, archive.put(input.getPsf(), permissive));
96 output.set(wcs, archive.put(input.getWcs(), permissive));
97 output.set(calib, archive.put(input.getCalib(), permissive));
98 output.set(apCorrMap, archive.put(input.getApCorrMap(), permissive));
99 output.set(validPolygon, archive.put(input.getValidPolygon(), permissive));
100 output.set(visitInfo, archive.put(input.getVisitInfo(), permissive));
101 output.set(transmissionCurve, archive.put(input.getTransmissionCurve(), permissive));
102 output.set(detector, archive.put(input.getDetector(), permissive));
106 void readRecord(BaseRecord
const &input, ExposureRecord &output, SchemaMapper
const &mapper,
107 io::InputArchive
const &archive)
const {
108 output.assign(input, mapper);
110 output.setPsf(archive.get<detection::Psf>(input.get(psf)));
113 output.setWcs(archive.get<geom::SkyWcs>(input.get(wcs)));
115 if (calib.isValid()) {
116 output.setCalib(archive.get<
image::Calib>(input.get(calib)));
118 if (apCorrMap.isValid()) {
121 if (validPolygon.isValid()) {
122 output.setValidPolygon(archive.get<geom::polygon::Polygon>(input.get(validPolygon)));
124 if (visitInfo.isValid()) {
127 if (transmissionCurve.isValid()) {
130 if (detector.isValid()) {
131 output.setDetector(archive.get<cameraGeom::Detector>(input.get(detector)));
136 PersistenceHelper(
const PersistenceHelper &) =
delete;
137 PersistenceHelper &operator=(
const PersistenceHelper &) =
delete;
140 PersistenceHelper(PersistenceHelper &&) =
delete;
141 PersistenceHelper &operator=(PersistenceHelper &&) =
delete;
146 wcs(schema.addField<
int>(WCS_FIELD_NAME,
"archive ID for Wcs object")),
147 psf(schema.addField<
int>(PSF_FIELD_NAME,
"archive ID for Psf object")),
148 calib(schema.addField<
int>(CALIB_FIELD_NAME,
"archive ID for Calib object")),
149 apCorrMap(schema.addField<
int>(AP_CORR_MAP_FIELD_NAME,
"archive ID for ApCorrMap object")),
150 validPolygon(schema.addField<
int>(VALID_POLYGON_FIELD_NAME,
"archive ID for Polygon object")),
151 visitInfo(schema.addField<
int>(VISIT_INFO_FIELD_NAME,
"archive ID for VisitInfo object")),
153 "archive ID for TransmissionCurve object")),
154 detector(schema.addField<
int>(DETECTOR_FIELD_NAME,
"archive ID for Detector object")) {}
159 auto item = oldSchema.find<
int>(
name);
160 key = schema.addField(item.field);
161 }
catch (pex::exceptions::NotFoundError &) {
166 PersistenceHelper(Schema
const &oldSchema) {
167 addIfPresent(oldSchema, wcs, WCS_FIELD_NAME);
168 addIfPresent(oldSchema, psf, PSF_FIELD_NAME);
169 addIfPresent(oldSchema, calib, CALIB_FIELD_NAME);
170 addIfPresent(oldSchema, apCorrMap, AP_CORR_MAP_FIELD_NAME);
171 addIfPresent(oldSchema, validPolygon, VALID_POLYGON_FIELD_NAME);
172 addIfPresent(oldSchema, visitInfo, VISIT_INFO_FIELD_NAME);
173 addIfPresent(oldSchema, transmissionCurve, TRANSMISSION_CURVE_FIELD_NAME);
174 addIfPresent(oldSchema, detector, DETECTOR_FIELD_NAME);
175 assert(oldSchema.contains(schema));
191 class ExposureFitsWriter :
public io::FitsWriter {
197 _archive.reset(
new io::OutputArchive());
204 void _writeRecord(BaseRecord
const &r)
override;
206 void _finish()
override {
221 "Cannot use a ExposureFitsWriter on a non-Exposure table.");
226 _fits->writeKey(
"AFW_TYPE",
"EXPOSURE",
"Tells lsst::afw to load this as an Exposure table.");
227 _fits->writeKey(EXPOSURE_TABLE_VERSION_KEY, EXPOSURE_TABLE_CURRENT_VERSION,
"Exposure table version");
228 _record = outTable->makeRecord();
231 void ExposureFitsWriter::_writeRecord(BaseRecord
const &r) {
232 ExposureRecord
const &record =
static_cast<ExposureRecord
const &
>(r);
246 template <
typename T,
void (ExposureRecord::*Setter)(std::shared_ptr<T const>)>
250 auto item = mapper.
find(name);
283 bool stripMetadata)
const override {
289 auto tableVersion = getTableVersion(*metadata);
296 "validPolygon", mapper);
297 if (tableVersion > 1) {
301 if (tableVersion > 2) {
306 if (tableVersion > 3) {
311 table->setMetadata(metadata);
315 bool usesArchive(
int ioFlags)
const override {
return true; }
318 static ExposureFitsReader
const exposureFitsReader;
335 "ExposureRecord does not have a Wcs; cannot call contains()");
339 if (includeValidPolygon && !getValidPolygon()) {
340 includeValidPolygon =
false;
345 if (includeValidPolygon)
356 bool includeValidPolygon)
const {
370 _apCorrMap = s._apCorrMap;
371 _validPolygon = s._validPolygon;
372 _visitInfo = s._visitInfo;
373 _transmissionCurve = s._transmissionCurve;
374 _detector = s._detector;
380 if (!checkSchema(schema)) {
383 "Schema for Exposure must contain at least the keys defined by makeMinimalSchema().");
396 ExposureTable::MinimalSchema::MinimalSchema() {
399 schema.getCitizen().markPersistent();
402 ExposureTable::MinimalSchema &ExposureTable::getMinimalSchema() {
403 static MinimalSchema it;
414 return std::make_shared<ExposureFitsWriter>(fitsfile, archive, flags);
429 template <
typename RecordT>
431 PersistenceHelper helper{};
434 outputCat.
reserve(this->size());
436 helper.writeRecord(*i, *outputCat.
addNew(),
mapper, handle, permissive);
441 template <
typename RecordT>
446 PersistenceHelper helper{catalog.
getSchema()};
451 helper.readRecord(*i, *
result.addNew(),
mapper, archive);
456 template <
typename RecordT>
458 bool includeValidPolygon)
const {
461 if (i->contains(coord, includeValidPolygon)) {
468 template <
typename RecordT>
471 bool includeValidPolygon)
const {
474 if (i->contains(point, wcs, includeValidPolygon)) {
Defines the fields and offsets for a table.
friend class ExposureTable
A 2-dimensional celestial WCS that transform pixels to ICRS RA/Dec, using the LSST standard for pixel...
A spatially-varying transmission curve as a function of wavelength.
~ExposureTable() override
bool contains(VertexIterator const begin, VertexIterator const end, UnitVector3d const &v)
A utility class for reading FITS binary tables.
A floating-point coordinate rectangle geometry.
An object passed to Persistable::write to allow it to persist itself.
Table class used to store exposure metadata.
std::shared_ptr< BaseTable > _clone() const override
Clone implementation with noncovariant return types.
ExposureCatalogT subsetContaining(lsst::geom::SpherePoint const &coord, bool includeValidPolygon=false) const
Return a shallow subset of the catalog with only those records that contain the given point...
A thin wrapper around std::map to allow aperture corrections to be attached to Exposures.
bool contains(lsst::geom::SpherePoint const &coord, bool includeValidPolygon=false) const
Return true if the bounding box contains the given celestial coordinate point, taking into account th...
lsst::geom::SpherePoint pixelToSky(lsst::geom::Point2D const &pixel) const
Compute sky position(s) from pixel position(s)
A mapping between the keys of two Schemas, used to copy data between them.
Schema getSchema() const
Return the table's schema.
static void setup(std::string const &name, io::FitsSchemaInputMapper &mapper)
Information about a single exposure of an imaging camera.
static Box2IKey getBBoxKey()
Key for the full bbox.
Schema const getOutputSchema() const
Return the output schema (copy-on-write).
void readTableScalar(std::size_t row, int col, T &value)
Read an array scalar from a binary table.
ExposureTable(Schema const &schema)
std::shared_ptr< BaseRecord > _record
void setDetector(std::shared_ptr< cameraGeom::Detector const > detector)
Get/Set the the attached Wcs, Psf, Calib, or ApCorrMap. No copies are made.
Reports arguments outside the domain of an operation.
Schema getSchema() const
Return the schema associated with the catalog's table.
A simple struct that combines the two arguments that must be passed to most cfitsio routines and cont...
std::shared_ptr< BaseRecord > _makeRecord() override
Default-construct an associated record (protected implementation).
void setBBox(lsst::geom::Box2I const &bbox)
Describe an exposure's calibration.
static SchemaMapper removeMinimalSchema(Schema const &input, Schema const &minimal)
Create a mapper by removing fields from the front of a schema.
void push_back(Record const &r)
Add a copy of the given record to the end of the catalog.
PersistenceHelper _helper
static std::vector< SchemaMapper > join(std::vector< Schema > const &inputs, std::vector< std::string > const &prefixes=std::vector< std::string >())
Combine a sequence of schemas into one, creating a SchemaMapper for each.
A base class for image defects.
Custom catalog class for record/table subclasses that are guaranteed to have an ID, and should generally be sorted by that ID.
iterator end()
Iterator access.
bool contains(Point2D const &point) const noexcept
Return true if the box contains the point.
Iterator class for CatalogT.
Key< int > transmissionCurve
~ExposureRecord() override
T dynamic_pointer_cast(T... args)
Reports errors in the logical structure of the program.
virtual void _writeTable(std::shared_ptr< BaseTable const > const &table, std::size_t nRows)
Write a table and its schema.
std::shared_ptr< io::OutputArchive > _archive
BaseCatalog makeCatalog(Schema const &schema)
Return a new, empty catalog with the given schema.
void reserve(size_type n)
Increase the capacity of the catalog to the given size.
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Information about a CCD or other imaging detector.
static std::shared_ptr< ExposureTable > make(Schema const &schema)
Construct a new table.
Base class for all records.
static std::shared_ptr< BaseTable > make(Schema const &schema)
Construct a new table.
Point in an unspecified spherical coordinate system.
static ExposureCatalogT readFromArchive(io::InputArchive const &archive, BaseCatalog const &catalog)
Convenience input function for Persistables that contain an ExposureCatalog.
Custom catalog class for ExposureRecord/Table.
void writeToArchive(io::OutputArchiveHandle &handle, bool ignoreUnpersistable=true) const
Convenience output function for Persistables that contain an ExposureCatalog.
void setTransmissionCurve(std::shared_ptr< image::TransmissionCurve const > transmissionCurve)
Get/Set the the attached Wcs, Psf, Calib, or ApCorrMap. No copies are made.
virtual void _writeRecord(BaseRecord const &source)
Write an individual record.
Reports invalid arguments.
Record class used to store exposure metadata.
size_type size() const
Return the number of elements in the catalog.
ItemVariant const * other
PersistableObjectColumnReader(int column)
void saveCatalog(BaseCatalog const &catalog)
Save a catalog in the archive.
iterator begin()
Iterator access.
void _assign(BaseRecord const &other) override
Called by assign() after transferring fields to allow subclass data members to be copied...
An integer coordinate rectangle.
void readCell(BaseRecord &record, std::size_t row, fits::Fits &fits, std::shared_ptr< io::InputArchive > const &archive) const override
lsst::geom::Box2I getBBox() const
static BoxKey addFields(Schema &schema, std::string const &name, std::string const &doc, std::string const &unit)
Add _min_x, _min_y, _max_x, _max_y fields to a Schema, and return a BoxKey that points to them...
Base class for all tables.
ExposureRecord(ExposureRecord 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.