LSST Applications g0f08755f38+f106ab12ff,g12f32b3c4e+379379c50c,g1653933729+a8ce1bb630,g168dd56ebc+a8ce1bb630,g1a0ca8cf93+eaabd3c39c,g28da252d5a+0daa941822,g2bbee38e9b+c076ca1133,g2bc492864f+c076ca1133,g3156d2b45e+41e33cbcdc,g347aa1857d+c076ca1133,g35bb328faa+a8ce1bb630,g3a166c0a6a+c076ca1133,g3e281a1b8c+b162652f75,g414038480c+6cfc39b08c,g41af890bb2+c487125eda,g5fbc88fb19+17cd334064,g6b1c1869cb+eff3e9fdae,g781aacb6e4+a8ce1bb630,g80478fca09+a0d7f63753,g82479be7b0+052d678814,g858d7b2824+f106ab12ff,g89c8672015+ff349045bf,g9125e01d80+a8ce1bb630,g9726552aa6+3a8748fa0c,ga5288a1d22+d836312400,gb58c049af0+d64f4d3760,gc28159a63d+c076ca1133,gcf0d15dbbd+3012552f84,gd7358e8bfb+8e90b07072,gda3e153d99+f106ab12ff,gda6a2b7d83+3012552f84,gdaeeff99f8+1711a396fd,ge2409df99d+e4ed96189f,ge79ae78c31+c076ca1133,gf0baf85859+50e8a91c63,gf3967379c6+f3639e9197,gfb92a5be7c+f106ab12ff,gfec2e1e490+bdc87d04ab,w.2024.47
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