33 #include "boost/ref.hpp"
34 #include "boost/type_traits/is_integral.hpp"
35 #include "boost/type_traits/is_same.hpp"
52 using lsst::afw::table::Flag;
60 namespace lsst {
namespace ap {
namespace utils {
64 typedef std::vector<std::string>::const_iterator StringIter;
66 uint8_t
const SKIP_FIELD = 0x1;
67 uint8_t
const NULLABLE_INT = 0x2;
68 uint8_t
const RAD2 = 0x4;
69 uint8_t
const RAD4 = 0x8;
72 double const ARCSEC2_PER_RAD2 = 4.25451702961521995803707621197e10;
73 double const ARCSEC4_PER_RAD4 = 1.81009151552859144174773079111e21;
75 int nFlagInts(
int count) {
76 return (count + 62) / 63;
80 class CsvConverterInit {
82 CsvConverterInit(CsvConversionControl
const & control, uint8_t * fieldFlags) :
85 ~CsvConverterInit() { }
89 std::string
const name = item.
field.getName();
90 StringIter i =
_control.ignoreFields.begin();
91 StringIter e =
_control.ignoreFields.end();
93 if (std::find(i, e, name) != e) {
95 }
else if (boost::is_integral<T>::value) {
96 i =
_control.nullableIntegers.begin();
98 if (std::find(i, e, name) != e) {
101 }
else if (item.
field.getUnits() ==
"rad^2" &&
102 (boost::is_same<T, Covariance<Point<float> > >::value ||
103 boost::is_same<T, Covariance<Point<float> > >::value ||
104 boost::is_same<T, Moments<float> >::value ||
105 boost::is_same<T, Moments<double> >::value)) {
109 }
else if (item.
field.getUnits() ==
"rad^4" &&
110 (boost::is_same<T, Covariance<Moments<float> > >::value ||
111 boost::is_same<T, Covariance<Moments<double> > >::value)) {
129 CsvConverter(CsvWriter & writer,
131 CsvConversionControl
const & control) :
146 for (StringIter i = control.canonicalFlags.begin(),
147 e = control.canonicalFlags.end(); i != e; ++i) {
155 void startRecord(boost::shared_ptr<BaseRecord const>
const &record) {
159 std::memset(
_flagInts.get(), 0, _nFlagInts *
sizeof(int64_t));
167 typedef std::vector<Key<Flag > >::const_iterator FlagIter;
179 f |=
static_cast<int64_t
>(1) << b;
199 template <
typename T>
202 if ((c & SKIP_FIELD) != 0) {
206 if (boost::is_integral<T>::value && (c & NULLABLE_INT) != 0 &&
207 val == static_cast<T>(0)) {
228 _writer->appendField(c.getLongitude().asDegrees());
229 _writer->appendField(c.getLatitude().asDegrees());
233 template <
typename T>
239 for (
int i = 0, e = item.
field.getSize(); i != e; ++i) {
245 template <
typename T>
251 _writer->appendField(p.getX());
252 _writer->appendField(p.getY());
256 template <
typename T>
259 if ((c & SKIP_FIELD) != 0) {
263 double const scale = ((c & RAD2) == 0 ? 1.0 : ARCSEC2_PER_RAD2);
264 _writer->appendField(scale * p.getIxx());
265 _writer->appendField(scale * p.getIyy());
266 _writer->appendField(scale * p.getIxy());
270 template <
typename T>
273 if ((c & SKIP_FIELD) != 0) {
277 int const sz = item.
field.getSize();
279 if ((c & RAD2) != 0) {
280 scale = ARCSEC2_PER_RAD2;
281 }
else if ((c & RAD4) != 0) {
282 scale = ARCSEC4_PER_RAD4;
284 for (
int i = 0; i < sz; ++i) {
285 for (
int j = i; j < sz; ++j) {
286 _writer->appendField(scale * cov(i, j));
308 CsvConverter(CsvConverter
const &);
309 CsvConverter& operator=(CsvConverter
const &);
338 std::string
const & csvFile,
342 CsvWriter writer(csvFile, csvControl, truncate, append);
343 Schema schema = catalog.getSchema();
344 CsvConverter cnv(writer, schema, cnvControl);
345 boost::reference_wrapper<CsvConverter> cnvRef = boost::ref(cnv);
346 for (BaseCatalog::const_iterator i = catalog.begin(), e = catalog.end(); i != e; ++i) {
Extent< int, N > truncate(Extent< double, N > const &input)
Defines the fields and offsets for a table.
lsst::afw::coord::Coord Coord
CsvConversionControl const & _control
Parameters that define a Character-Separated-Value dialect.
CatalogT< BaseRecord > BaseCatalog
An include file to include the header files for lsst::afw::coord.
boost::scoped_array< int64_t > _flagInts
lsst::afw::coord::IcrsCoord IcrsCoord
Catalog to CSV conversion parameters.
std::vector< Key< Flag > > _canonicalFlags
A description of a field in a table.
SchemaItem< T > find(std::string const &name) const
Find a SchemaItem in the Schema by name.
Base class for all records.
A class used as a handle to a particular field in a table.
lsst::afw::geom::Angle Angle
void writeCsv(BaseCatalog const &catalog, CsvConversionControl const &cnvControl, CsvControl const &csvControl, std::string const &csvFile, bool truncate, bool append)
afw::table::Key< double > b
int getFieldCount() const
The total number of fields.
int getFlagFieldCount() const
The number of Flag fields.
Tag types used to declare specialized field types.
void forEach(F func) const
Apply a functor to each SchemaItem in the Schema.
A simple pair-like struct for mapping a Field (name and description) with a Key (used for actual data...