LSST Applications g063fba187b+fee0456c91,g0f08755f38+ea96e5a5a3,g1653933729+a8ce1bb630,g168dd56ebc+a8ce1bb630,g1a2382251a+90257ff92a,g20f6ffc8e0+ea96e5a5a3,g217e2c1bcf+937a289c59,g28da252d5a+daa7da44eb,g2bbee38e9b+253935c60e,g2bc492864f+253935c60e,g3156d2b45e+6e55a43351,g32e5bea42b+31359a2a7a,g347aa1857d+253935c60e,g35bb328faa+a8ce1bb630,g3a166c0a6a+253935c60e,g3b1af351f3+a8ce1bb630,g3e281a1b8c+c5dd892a6c,g414038480c+416496e02f,g41af890bb2+afe91b1188,g599934f4f4+0db33f7991,g7af13505b9+e36de7bce6,g80478fca09+da231ba887,g82479be7b0+a4516e59e3,g858d7b2824+ea96e5a5a3,g89c8672015+f4add4ffd5,g9125e01d80+a8ce1bb630,ga5288a1d22+bc6ab8dfbd,gb58c049af0+d64f4d3760,gc28159a63d+253935c60e,gcab2d0539d+3f2b72788c,gcf0d15dbbd+4ea9c45075,gda6a2b7d83+4ea9c45075,gdaeeff99f8+1711a396fd,ge79ae78c31+253935c60e,gef2f8181fd+3031e3cf99,gf0baf85859+c1f95f4921,gfa517265be+ea96e5a5a3,gfa999e8aa5+17cd334064,w.2024.50
LSST Data Management Base Package
Loading...
Searching...
No Matches
Peak.cc
Go to the documentation of this file.
1// -*- lsst-c++ -*-
2/*
3 * LSST Data Management System
4 * Copyright 2008-2014 LSST Corporation.
5 *
6 * This product includes software developed by the
7 * LSST Project (http://www.lsst.org/).
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 LSST License Statement and
20 * the GNU General Public License along with this program. If not,
21 * see <http://www.lsstcorp.org/LegalNotices/>.
22 */
26
27namespace lsst {
28namespace afw {
29namespace detection {
30
31//-----------------------------------------------------------------------------------------------------------
32//----- PeakFitsWriter ---------------------------------------------------------------------------------
33//-----------------------------------------------------------------------------------------------------------
34
35// A custom FitsWriter for Peak - this just sets the AFW_TYPE key to PEAK, which should ensure
36// we use PeakFitsReader to read it.
37
38namespace {
39
40class PeakFitsWriter : public afw::table::io::FitsWriter {
41public:
42 explicit PeakFitsWriter(Fits* fits, int flags) : afw::table::io::FitsWriter(fits, flags) {}
43
44protected:
45 void _writeTable(std::shared_ptr<afw::table::BaseTable const> const& table, std::size_t nRows) override;
46};
47
48void PeakFitsWriter::_writeTable(std::shared_ptr<afw::table::BaseTable const> const& t, std::size_t nRows) {
49 std::shared_ptr<PeakTable const> table = std::dynamic_pointer_cast<PeakTable const>(t);
50 if (!table) {
52 "Cannot use a PeakFitsWriter on a non-Peak table.");
53 }
54 afw::table::io::FitsWriter::_writeTable(table, nRows);
55 _fits->writeKey("AFW_TYPE", "PEAK", "Tells lsst::afw to load this as a Peak table.");
56}
57
58} // namespace
59
60//-----------------------------------------------------------------------------------------------------------
61//----- PeakFitsReader ---------------------------------------------------------------------------------
62//-----------------------------------------------------------------------------------------------------------
63
64// A custom FitsReader for PeakTable/Record - this gets registered with name SIMPLE, so it should get used
65// whenever we read a table with AFW_TYPE set to that value.
66
67namespace {
68
69class PeakFitsReader : public afw::table::io::FitsReader {
70public:
71 PeakFitsReader() : afw::table::io::FitsReader("PEAK") {}
72
73 std::shared_ptr<afw::table::BaseTable> makeTable(afw::table::io::FitsSchemaInputMapper& mapper,
75 int ioFlags, bool stripMetadata) const override {
76 std::shared_ptr<PeakTable> table = PeakTable::make(mapper.finalize());
77 table->setMetadata(metadata);
78 return table;
79 }
80};
81
82// registers the reader so FitsReader::make can use it.
83static PeakFitsReader const peakFitsReader;
84
85} // namespace
86
87//-----------------------------------------------------------------------------------------------------------
88//----- PeakTable/Record member function implementations -----------------------------------------------
89//-----------------------------------------------------------------------------------------------------------
90
92 return os << (boost::format("%d: (%d,%d) (%.3f,%.3f)") % record.getId() % record.getIx() %
93 record.getIy() % record.getFx() % record.getFy());
94}
95
97 using CachedTableList = std::list<std::weak_ptr<PeakTable>>;
98 static CachedTableList cache;
99 if (!checkSchema(schema)) {
101 "Schema for Peak must contain at least the keys defined by makeMinimalSchema().");
102 }
103 if (forceNewTable) {
105 }
106 CachedTableList::iterator iter = cache.begin();
107 while (iter != cache.end()) {
108 std::shared_ptr<PeakTable> p = iter->lock();
109 if (!p) {
110 iter = cache.erase(iter);
111 } else {
112 if (p->getSchema().compare(schema, afw::table::Schema::IDENTICAL) ==
114 // Move the one we found to the front of the list, so it's easier to find
115 // the same thing repeatedly
116 if (iter != cache.begin()) {
117 cache.splice(cache.begin(), cache, iter);
118 }
119 return p;
120 }
121 ++iter;
122 }
123 }
124 // No match: we create a new table and put it in the cache
126 cache.push_front(newTable);
127 return newTable;
128}
129
132 : afw::table::BaseTable(schema), _idFactory(idFactory) {}
133
135 : afw::table::BaseTable(other),
136 _idFactory(other._idFactory ? other._idFactory->clone() : other._idFactory) {}
137// Delegate to copy-constructor for backwards-compatibility
139
140PeakTable::~PeakTable() = default;
141
142PeakTable::MinimalSchema::MinimalSchema() {
143 id = schema.addField<afw::table::RecordId>("id", "unique ID");
144 fx = schema.addField<float>("f_x", "subpixel column position", "pixel");
145 fy = schema.addField<float>("f_y", "subpixel row position", "pixel");
146 ix = schema.addField<int>("i_x", "column position of highest pixel", "pixel");
147 iy = schema.addField<int>("i_y", "row position of highest pixel", "pixel");
148 peakValue = schema.addField<float>("peakValue", "value of [smoothed] image at peak position", "count");
149}
150
151PeakTable::MinimalSchema& PeakTable::getMinimalSchema() {
152 static MinimalSchema it;
153 return it;
154}
155
157 return std::make_shared<PeakFitsWriter>(fitsfile, flags);
158}
159
163
165 auto record = constructRecord<PeakRecord>();
166 if (getIdFactory()) record->setId((*getIdFactory())());
167 return record;
168}
169
170} // namespace detection
171
172namespace table {
173
174template class CatalogT<afw::detection::PeakRecord>;
175template class CatalogT<afw::detection::PeakRecord const>;
176} // namespace table
177} // namespace afw
178} // namespace lsst
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition Exception.h:48
SchemaMapper * mapper
table::Schema schema
Definition python.h:134
Record class that represents a peak in a Footprint.
Definition Peak.h:42
afw::table::RecordId getId() const
Convenience accessors for the keys in the minimal schema.
Definition Peak.h:227
Table class for Peaks in Footprints.
Definition Peak.h:102
std::shared_ptr< afw::table::BaseTable > _clone() const override
Clone implementation with noncovariant return types.
Definition Peak.cc:160
PeakTable(afw::table::Schema const &schema, std::shared_ptr< afw::table::IdFactory > const &idFactory)
Definition Peak.cc:130
std::shared_ptr< afw::table::BaseRecord > _makeRecord() override
Default-construct an associated record (protected implementation).
Definition Peak.cc:164
std::shared_ptr< afw::table::IdFactory > getIdFactory()
Return the object that generates IDs for the table (may be null).
Definition Peak.h:150
std::shared_ptr< afw::table::io::FitsWriter > makeFitsWriter(fits::Fits *fitsfile, int flags) const override
Definition Peak.cc:156
static std::shared_ptr< PeakTable > make(afw::table::Schema const &schema, bool forceNew=false)
Obtain a table that can be used to create records with given schema.
Definition Peak.cc:96
A simple struct that combines the two arguments that must be passed to most cfitsio routines and cont...
Definition fits.h:308
static std::shared_ptr< IdFactory > makeSimple()
Return a simple IdFactory that simply counts from 1.
Definition IdFactory.cc:70
Defines the fields and offsets for a table.
Definition Schema.h:51
Key< T > addField(Field< T > const &field, bool doReplace=false)
Add a new field to the Schema, and return the associated Key.
Definition Schema.cc:479
@ IDENTICAL
Everything is the same.
Definition Schema.h:72
Reports invalid arguments.
Definition Runtime.h:66
Reports errors in the logical structure of the program.
Definition Runtime.h:46
std::ostream & operator<<(std::ostream &os, Footprint const &rhs)
Print a Footprint to the stream.
Definition Footprint.cc:443