LSST Applications g070148d5b3+33e5256705,g0d53e28543+25c8b88941,g0da5cf3356+2dd1178308,g1081da9e2a+62d12e78cb,g17e5ecfddb+7e422d6136,g1c76d35bf8+ede3a706f7,g295839609d+225697d880,g2e2c1a68ba+cc1f6f037e,g2ffcdf413f+853cd4dcde,g38293774b4+62d12e78cb,g3b44f30a73+d953f1ac34,g48ccf36440+885b902d19,g4b2f1765b6+7dedbde6d2,g5320a0a9f6+0c5d6105b6,g56b687f8c9+ede3a706f7,g5c4744a4d9+ef6ac23297,g5ffd174ac0+0c5d6105b6,g6075d09f38+66af417445,g667d525e37+2ced63db88,g670421136f+2ced63db88,g71f27ac40c+2ced63db88,g774830318a+463cbe8d1f,g7876bc68e5+1d137996f1,g7985c39107+62d12e78cb,g7fdac2220c+0fd8241c05,g96f01af41f+368e6903a7,g9ca82378b8+2ced63db88,g9d27549199+ef6ac23297,gabe93b2c52+e3573e3735,gb065e2a02a+3dfbe639da,gbc3249ced9+0c5d6105b6,gbec6a3398f+0c5d6105b6,gc9534b9d65+35b9f25267,gd01420fc67+0c5d6105b6,geee7ff78d7+a14128c129,gf63283c776+ede3a706f7,gfed783d017+0c5d6105b6,w.2022.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 }
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 {
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
156std::shared_ptr<afw::table::io::FitsWriter> PeakTable::makeFitsWriter(fits::Fits* fitsfile, int flags) const {
157 return std::make_shared<PeakFitsWriter>(fitsfile, flags);
158}
159
161 return std::shared_ptr<PeakTable>(new PeakTable(*this));
162}
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
std::ostream * os
Definition: Schema.cc:557
SchemaMapper * mapper
Definition: SchemaMapper.cc:71
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
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
static bool checkSchema(afw::table::Schema const &other)
Return true if the given schema is a valid PeakTable schema.
Definition: Peak.h:145
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
virtual void _writeTable(std::shared_ptr< BaseTable const > const &table, std::size_t nRows)
Write a table and its schema.
Definition: FitsWriter.cc:103
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