LSST Applications g180d380827+78227d2bc4,g2079a07aa2+86d27d4dc4,g2305ad1205+bdd7851fe3,g2bbee38e9b+c6a8a0fb72,g337abbeb29+c6a8a0fb72,g33d1c0ed96+c6a8a0fb72,g3a166c0a6a+c6a8a0fb72,g3d1719c13e+260d7c3927,g3ddfee87b4+723a6db5f3,g487adcacf7+29e55ea757,g50ff169b8f+96c6868917,g52b1c1532d+585e252eca,g591dd9f2cf+9443c4b912,g62aa8f1a4b+7e2ea9cd42,g858d7b2824+260d7c3927,g864b0138d7+8498d97249,g95921f966b+dffe86973d,g991b906543+260d7c3927,g99cad8db69+4809d78dd9,g9c22b2923f+e2510deafe,g9ddcbc5298+9a081db1e4,ga1e77700b3+03d07e1c1f,gb0e22166c9+60f28cb32d,gb23b769143+260d7c3927,gba4ed39666+c2a2e4ac27,gbb8dafda3b+e22341fd87,gbd998247f1+585e252eca,gc120e1dc64+713f94b854,gc28159a63d+c6a8a0fb72,gc3e9b769f7+385ea95214,gcf0d15dbbd+723a6db5f3,gdaeeff99f8+f9a426f77a,ge6526c86ff+fde82a80b9,ge79ae78c31+c6a8a0fb72,gee10cc3b42+585e252eca,w.2024.18
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
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
@ 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