LSST Applications g0b6bd0c080+a72a5dd7e6,g1182afd7b4+2a019aa3bb,g17e5ecfddb+2b8207f7de,g1d67935e3f+06cf436103,g38293774b4+ac198e9f13,g396055baef+6a2097e274,g3b44f30a73+6611e0205b,g480783c3b1+98f8679e14,g48ccf36440+89c08d0516,g4b93dc025c+98f8679e14,g5c4744a4d9+a302e8c7f0,g613e996a0d+e1c447f2e0,g6c8d09e9e7+25247a063c,g7271f0639c+98f8679e14,g7a9cd813b8+124095ede6,g9d27549199+a302e8c7f0,ga1cf026fa3+ac198e9f13,ga32aa97882+7403ac30ac,ga786bb30fb+7a139211af,gaa63f70f4e+9994eb9896,gabf319e997+ade567573c,gba47b54d5d+94dc90c3ea,gbec6a3398f+06cf436103,gc6308e37c7+07dd123edb,gc655b1545f+ade567573c,gcc9029db3c+ab229f5caf,gd01420fc67+06cf436103,gd877ba84e5+06cf436103,gdb4cecd868+6f279b5b48,ge2d134c3d5+cc4dbb2e3f,ge448b5faa6+86d1ceac1d,gecc7e12556+98f8679e14,gf3ee170dca+25247a063c,gf4ac96e456+ade567573c,gf9f5ea5b4d+ac198e9f13,gff490e6085+8c2580be5c,w.2022.27
LSST Data Management Base Package
wcsUtils.cc
Go to the documentation of this file.
1// -*- lsst-c++ -*-
2
3/*
4 * LSST Data Management System
5 * Copyright 2018 LSST Corporation.
6 *
7 * This product includes software developed by the
8 * LSST Project (http://www.lsst.org/).
9 *
10 * This program is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the LSST License Statement and
21 * the GNU General Public License along with this program. If not,
22 * see <http://www.lsstcorp.org/LegalNotices/>.
23 */
24
25#include <memory>
26#include <vector>
27
28#include "lsst/afw/table/fwd.h"
33
34namespace lsst {
35namespace afw {
36namespace table {
37namespace {
38
39// Get the schema from a record
40Schema getSchema(BaseRecord const &record) { return record.getSchema(); }
41
42// Get the schema from a shared pointer to a record
43Schema getSchema(std::shared_ptr<const BaseRecord> const record) { return record->getSchema(); }
44
45// Get a value from a record
46template <typename Key>
47inline typename Key::Value getValue(BaseRecord const &record, Key const &key) {
48 return record.get(key);
49}
50
51// Get a value from a shared pointer to a record
52template <typename Key>
53inline typename Key::Value getValue(std::shared_ptr<const BaseRecord> const record, Key const &key) {
54 return record->get(key);
55}
56
57// Set a value in a record
58template <typename Key>
59inline void setValue(SimpleRecord &record, Key const &key, typename Key::Value const &value) {
60 record.set(key, value);
61}
62
63// Set a value in a shared pointer to a record
64template <typename Key>
65inline void setValue(std::shared_ptr<SimpleRecord> record, Key const &key, typename Key::Value const &value) {
66 record->set(key, value);
67}
68
69} // namespace
70
71template <typename ReferenceCollection>
72void updateRefCentroids(geom::SkyWcs const &wcs, ReferenceCollection &refList) {
73 if (refList.empty()) {
74 return;
75 }
76 auto const schema = getSchema(refList[0]);
77 CoordKey const coordKey(schema["coord"]);
78 Point2DKey const centroidKey(schema["centroid"]);
79 Key<Flag> const hasCentroidKey(schema["hasCentroid"]);
81 skyList.reserve(refList.size());
82 for (auto const &record : refList) {
83 skyList.emplace_back(getValue(record, coordKey));
84 }
85 std::vector<lsst::geom::Point2D> const pixelList = wcs.skyToPixel(skyList);
86 auto pixelPos = pixelList.cbegin();
87 for (auto &refObj : refList) {
88 setValue(refObj, centroidKey, *pixelPos);
89 setValue(refObj, hasCentroidKey, true);
90 ++pixelPos;
91 }
92}
93
94template <typename SourceCollection>
95void updateSourceCoords(geom::SkyWcs const &wcs, SourceCollection &sourceList) {
96 if (sourceList.empty()) {
97 return;
98 }
99 auto const schema = getSchema(sourceList[0]);
100 Point2DKey const centroidKey(schema["slot_Centroid"]);
101 CoordKey const coordKey(schema["coord"]);
103 pixelList.reserve(sourceList.size());
104 for (auto const &source : sourceList) {
105 pixelList.emplace_back(getValue(source, centroidKey));
106 }
107 std::vector<lsst::geom::SpherePoint> const skyList = wcs.pixelToSky(pixelList);
108 auto skyCoord = skyList.cbegin();
109 for (auto &source : sourceList) {
110 setValue(source, coordKey, *skyCoord);
111 ++skyCoord;
112 }
113}
114
116template void updateRefCentroids(geom::SkyWcs const &, std::vector<std::shared_ptr<SimpleRecord>> &);
117template void updateRefCentroids(geom::SkyWcs const &, SimpleCatalog &);
118
119template void updateSourceCoords(geom::SkyWcs const &, std::vector<std::shared_ptr<SourceRecord>> &);
120template void updateSourceCoords(geom::SkyWcs const &, SourceCatalog &);
122
123} // namespace table
124} // namespace afw
125} // namespace lsst
table::Key< table::Array< std::uint8_t > > wcs
Definition: SkyWcs.cc:66
table::Schema schema
Definition: python.h:134
T cbegin(T... args)
A FunctorKey used to get or set celestial coordinates from a pair of lsst::geom::Angle keys.
Definition: aggregates.h:210
Key specialization for Flag.
Definition: Flag.h:94
T emplace_back(T... args)
T get(T... args)
const char * source()
Source function that allows astChannel to source from a Stream.
Definition: Stream.h:224
void updateRefCentroids(geom::SkyWcs const &wcs, ReferenceCollection &refList)
Update centroids in a collection of reference objects.
Definition: wcsUtils.cc:72
void updateSourceCoords(geom::SkyWcs const &wcs, SourceCollection &sourceList)
Update sky coordinates in a collection of source objects.
Definition: wcsUtils.cc:95
SortedCatalogT< SourceRecord > SourceCatalog
Definition: fwd.h:85
SortedCatalogT< SimpleRecord > SimpleCatalog
Definition: fwd.h:79
A base class for image defects.
T reserve(T... args)
T Value
the type returned by BaseRecord::get
Definition: FieldBase.h:42