26 void operator()(SchemaItem<T>
const& item)
const {
27 std::string name = item.field.getName();
28 int n = fits->addColumn<
typename Field<T>::Element>(name, item.field.getElementCount());
29 if (!item.field.getDoc().empty()) {
33 fits->writeColumnKey(
"TDOC", n, item.field.getDoc());
38 void operator()(SchemaItem<std::string>
const& item)
const {
39 std::string name = item.field.getName();
40 std::size_t n = fits->addColumn<std::string>(name, item.field.getElementCount());
41 if (!item.field.getDoc().empty()) {
42 fits->writeColumnKey(
"TDOC", n, item.field.getDoc());
47 void operator()(SchemaItem<Flag>
const& item)
const {
48 std::string name = item.field.getName();
49 fits->writeColumnKey(
"TFLAG", nFlags, name);
50 if (!item.field.getDoc().empty()) {
54 fits->writeColumnKey(
"TFDOC", nFlags, item.field.getDoc());
60 static void apply(Fits& fits, Schema
const& schema) {
61 ProcessSchema f = {&fits, 0};
66 void specialize(SchemaItem<T>
const& item,
int n)
const {
67 if (!item.field.getUnits().empty()) fits->writeColumnKey(
"TUNIT", n, item.field.getUnits());
68 fits->writeColumnKey(
"TCCLS", n,
"Scalar",
"Field template used by lsst.afw.table");
71 void specialize(SchemaItem<lsst::geom::Angle>
const& item,
int n)
const {
74 fits->writeColumnKey(
"TUNIT", n,
"rad");
75 fits->writeColumnKey(
"TCCLS", n,
"Angle",
"Field template used by lsst.afw.table");
79 void specialize(SchemaItem<Array<T> >
const& item,
int n)
const {
80 if (!item.field.getUnits().empty()) fits->writeColumnKey(
"TUNIT", n, item.field.getUnits());
81 fits->writeColumnKey(
"TCCLS", n,
"Array",
"Field template used by lsst.afw.table");
84 void specialize(SchemaItem<std::string>
const& item, std::size_t n)
const {
85 if (!item.field.getUnits().empty()) fits->writeColumnKey(
"TUNIT", n, item.field.getUnits());
86 fits->writeColumnKey(
"TCCLS", n,
"String",
"Field template used by lsst.afw.table");
93void writeAliasMap(Fits& fits, AliasMap
const& aliases) {
94 for (
auto const &aliase : aliases) {
95 fits.writeKey(
"ALIAS", aliase.first +
":" + aliase.second);
104 _fits->createTable();
108 int n =
_fits->addColumn<
bool>(
"flags", nFlags,
"bits for all Flag fields; see also TFLAGn");
109 _fits->writeKey(
"FLAGCOL", n + 1,
"Column number for the bitflags.");
111 ProcessSchema::apply(*
_fits, schema);
119 _fits->writeMetadata(*metadata);
121 metadata->remove(
"AFW_TABLE_VERSION");
123 _fits->addRows(nRows);
136 template <
typename T>
142 template <
typename T>
144 if (item.key.isVariableLength()) {
145 ndarray::Array<T const, 1, 1> array =
record->get(item.key);
146 fits->writeTableArray(
row,
col, array.template getSize<0>(), array.getData());
148 fits->writeTableArray(
row,
col, item.key.getElementCount(),
record->getElement(item.key));
190 _processor->apply(&record);
Tag types used to declare specialized field types.
Base class for all records.
Defines the fields and offsets for a table.
std::shared_ptr< AliasMap > getAliasMap() const
Return the map of aliases.
std::size_t getFlagFieldCount() const
The number of Flag fields.
virtual void _writeRecord(BaseRecord const &source)
Write an individual record.
virtual void _writeTable(std::shared_ptr< BaseTable const > const &table, std::size_t nRows)
Write a table and its schema.
#define LSST_FITS_CHECK_STATUS(fitsObj,...)
Throw a FitsError exception if the status of the given Fits object is nonzero.
typename FieldBase< T >::Element Element
Type used to store field data in the table (a field may have multiple elements).
A simple pair-like struct for mapping a Field (name and description) with a Key (used for actual data...
void apply(BaseRecord const *r)
BaseRecord const * record
void operator()(SchemaItem< Flag > const &item) const
ProcessRecords(Fits *fits_, Schema const &schema_, int nFlags_, std::size_t const &row_)
void operator()(SchemaItem< std::string > const &item) const
void operator()(SchemaItem< T > const &item) const
void operator()(SchemaItem< Array< T > > const &item) const
std::unique_ptr< bool[]> flags