LSST Applications g00274db5b6+edbf708997,g00d0e8bbd7+edbf708997,g199a45376c+5137f08352,g1fd858c14a+1d4b6db739,g262e1987ae+f4d9505c4f,g29ae962dfc+7156fb1a53,g2cef7863aa+73c82f25e4,g35bb328faa+edbf708997,g3e17d7035e+5b3adc59f5,g3fd5ace14f+852fa6fbcb,g47891489e3+6dc8069a4c,g53246c7159+edbf708997,g64539dfbff+9f17e571f4,g67b6fd64d1+6dc8069a4c,g74acd417e5+ae494d68d9,g786e29fd12+af89c03590,g7ae74a0b1c+a25e60b391,g7aefaa3e3d+536efcc10a,g7cc15d900a+d121454f8d,g87389fa792+a4172ec7da,g89139ef638+6dc8069a4c,g8d7436a09f+28c28d8d6d,g8ea07a8fe4+db21c37724,g92c671f44c+9f17e571f4,g98df359435+b2e6376b13,g99af87f6a8+b0f4ad7b8d,gac66b60396+966efe6077,gb88ae4c679+7dec8f19df,gbaa8f7a6c5+38b34f4976,gbf99507273+edbf708997,gc24b5d6ed1+9f17e571f4,gca7fc764a6+6dc8069a4c,gcc769fe2a4+97d0256649,gd7ef33dd92+6dc8069a4c,gdab6d2f7ff+ae494d68d9,gdbb4c4dda9+9f17e571f4,ge410e46f29+6dc8069a4c,geaed405ab2+e194be0d2b,w.2025.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) {
51 throw LSST_EXCEPT(lsst::pex::exceptions::LogicError,
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,
74 std::shared_ptr<daf::base::PropertyList> metadata,
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
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
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
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< PeakTable > clone() const
Return a polymorphic deep copy of the table.
Definition Peak.h:173
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
static bool checkSchema(afw::table::Schema const &other)
Return true if the given schema is a valid PeakTable schema.
Definition Peak.h:145
A simple struct that combines the two arguments that must be passed to most cfitsio routines and cont...
Definition fits.h:242
std::shared_ptr< RecordT > constructRecord(Args &&... args)
Helper function that must be used by all _makeRecord overrides to actually construct records.
Definition BaseRecord.h:227
BaseTable(Schema const &schema, std::shared_ptr< daf::base::PropertyList > metadata=nullptr)
Construct from a schema.
Definition BaseTable.cc:152
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
T make_shared(T... args)
std::ostream & operator<<(std::ostream &os, Footprint const &rhs)
Print a Footprint to the stream.
Definition Footprint.cc:443
std::int64_t RecordId
Type used for unique IDs for records.
Definition misc.h:21
decltype(sizeof(void *)) size_t
Definition doctest.h:524
T dynamic_pointer_cast(T... args)