LSST Applications g0fba68d861+5616995c1c,g1ebb85f214+2420ccdea7,g1fd858c14a+44c57a1f81,g21d47ad084+8e51fce9ac,g262e1987ae+1a7d68eb3b,g2cef7863aa+3bd8df3d95,g35bb328faa+fcb1d3bbc8,g36ff55ed5b+2420ccdea7,g47891489e3+5c6313fe9a,g53246c7159+fcb1d3bbc8,g646c943bdb+dbb9921566,g67b6fd64d1+5c6313fe9a,g6bd32b75b5+2420ccdea7,g74acd417e5+37fc0c974d,g786e29fd12+cf7ec2a62a,g86c591e316+6e13bcb9e9,g87389fa792+1e0a283bba,g89139ef638+5c6313fe9a,g90f42f885a+fce05a46d3,g9125e01d80+fcb1d3bbc8,g93e38de9ac+5345a64125,g95a1e89356+47d08a1cc6,g97be763408+bba861c665,ga9e4eb89a6+85210110a1,gb0b61e0e8e+1f27f70249,gb58c049af0+f03b321e39,gb89ab40317+5c6313fe9a,gc4e39d7843+4e09c98c3d,gd16ba4ae74+5402bcf54a,gd8ff7fe66e+2420ccdea7,gd9a9a58781+fcb1d3bbc8,gdab6d2f7ff+37fc0c974d,gde280f09ee+604b327636,ge278dab8ac+50e2446c94,ge410e46f29+5c6313fe9a,gef3c2e6661+6b480e0fb7,gf67bdafdda+5c6313fe9a,gffca2db377+fcb1d3bbc8,v29.2.0.rc1
LSST Data Management Base Package
Loading...
Searching...
No Matches
frameDict.cc
Go to the documentation of this file.
1/*
2 * LSST Data Management System
3 *
4 * This product includes software developed by the
5 * LSST Project (http://www.lsst.org/).
6 * See the COPYRIGHT file
7 *
8 * This program is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation, either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the LSST License Statement and
19 * the GNU General Public License along with this program. If not,
20 * see <https://www.lsstcorp.org/LegalNotices/>.
21 */
22#include <memory>
23
24#include <pybind11/pybind11.h>
26#include <pybind11/stl.h>
27
28namespace py = pybind11;
29using namespace pybind11::literals;
30
31#include "astshim/Channel.h"
32#include "astshim/Frame.h"
33#include "astshim/FrameSet.h"
34#include "astshim/FrameDict.h"
35#include "astshim/Mapping.h"
36#include "astshim/Stream.h"
37
38namespace ast {
39namespace {
40
41/*
42Make a FrameDict from a string output by Object.show()
43
44Use this instead of the standard ObjectMaker for FrameDict
45because ObjectMaker would return a FrameSet (since the serialization
46is the same for both).
47*/
48class FrameDictMaker {
49public:
50 FrameDictMaker() = default;
51 ~FrameDictMaker() = default;
52 std::shared_ptr<Object> operator()(std::string const &state) {
53 ast::StringStream stream(state);
54 ast::Channel chan(stream);
55 auto objPtr = chan.read();
56 auto frameSetPtr = std::dynamic_pointer_cast<ast::FrameSet>(objPtr);
57 if (!frameSetPtr) {
58 throw std::runtime_error("Object being unpickled is a " + objPtr->getClassName() +
59 " not a FrameSet");
60 }
61 return std::make_shared<ast::FrameDict>(*frameSetPtr);
62 }
63};
64}
65
67 using PyFrameDictMaker = py::classh<FrameDictMaker>;
68 static auto clsMaker = wrappers.wrapType(PyFrameDictMaker(wrappers.module, "FrameDictMaker"), [](auto &mod, auto &cls) {
69 cls.def(py::init<>());
70 cls.def("__call__", &FrameDictMaker::operator());
71 cls.def("__reduce__",
72 [cls](FrameDictMaker const &self) { return py::make_tuple(cls, py::tuple()); });
73 });
74
75 using PyFrameDict = py::classh<FrameDict, FrameSet>;
76 wrappers.wrapType(PyFrameDict(wrappers.module, "FrameDict"), [](auto &mod, auto &cls) {
77
78 cls.def(py::init<Frame const &, std::string const &>(), "frame"_a, "options"_a = "");
79 cls.def(py::init<Frame const &, Mapping const &, Frame const &, std::string const &>(), "baseFrame"_a,
80 "mapping"_a, "currentFrame"_a, "options"_a = "");
81 cls.def(py::init<FrameSet const &>(), "frameSet"_a);
82 cls.def(py::init<FrameDict const &>());
83
84 cls.def("copy", &FrameDict::copy);
85
86 cls.def("addFrame", py::overload_cast<int, Mapping const &, Frame const &>(&FrameDict::addFrame),
87 "iframe"_a, "map"_a, "frame"_a);
88 cls.def("addFrame",
89 py::overload_cast<std::string const &, Mapping const &, Frame const &>(&FrameDict::addFrame),
90 "domain"_a, "map"_a, "frame"_a);
91 cls.def("getAllDomains", &FrameDict::getAllDomains);
92 cls.def("getFrame", py::overload_cast<int, bool>(&FrameDict::getFrame, py::const_), "index"_a,
93 "copy"_a = true);
94 cls.def("getFrame", py::overload_cast<std::string const &, bool>(&FrameDict::getFrame, py::const_),
95 "domain"_a, "copy"_a = true);
96 cls.def("getMapping", py::overload_cast<int, int>(&FrameDict::getMapping, py::const_),
97 "from"_a = FrameDict::BASE, "to"_a = FrameDict::CURRENT);
98 cls.def("getMapping", py::overload_cast<int, std::string const &>(&FrameDict::getMapping, py::const_),
99 "from"_a = FrameDict::BASE, "to"_a = FrameDict::CURRENT);
100 cls.def("getMapping", py::overload_cast<std::string const &, int>(&FrameDict::getMapping, py::const_),
101 "from"_a = FrameDict::BASE, "to"_a = FrameDict::CURRENT);
102 cls.def("getMapping",
103 py::overload_cast<std::string const &, std::string const &>(&FrameDict::getMapping, py::const_),
104 "from"_a = FrameDict::BASE, "to"_a = FrameDict::CURRENT);
105 cls.def("getIndex", &FrameDict::getIndex, "domain"_a);
106 cls.def("hasDomain", &FrameDict::hasDomain, "domain"_a);
107 cls.def("mirrorVariants", py::overload_cast<int>(&FrameDict::mirrorVariants), "index"_a);
108 cls.def("mirrorVariants", py::overload_cast<std::string const &>(&FrameDict::mirrorVariants), "domain"_a);
109 cls.def("remapFrame", py::overload_cast<int, Mapping &>(&FrameDict::remapFrame), "index"_a, "map"_a);
110 cls.def("remapFrame", py::overload_cast<std::string const &, Mapping &>(&FrameDict::remapFrame),
111 "domain"_a, "map"_a);
112 cls.def("removeFrame", py::overload_cast<int>(&FrameDict::removeFrame), "index"_a);
113 cls.def("removeFrame", py::overload_cast<std::string const &>(&FrameDict::removeFrame), "domain"_a);
114 cls.def("setBase", py::overload_cast<int>(&FrameDict::setBase), "index"_a);
115 cls.def("setBase", py::overload_cast<std::string const &>(&FrameDict::setBase), "domain"_a);
116 cls.def("setCurrent", py::overload_cast<int>(&FrameDict::setCurrent), "index"_a);
117 cls.def("setCurrent", py::overload_cast<std::string const &>(&FrameDict::setCurrent), "domain"_a);
118 cls.def("setDomain", &FrameDict::setDomain, "domain"_a);
119
121 cls.def("__reduce__", [](Object const &self) {
122 std::string state = self.show(false);
123 auto unpickleArgs = py::make_tuple(state);
124 return py::make_tuple(clsMaker(), unpickleArgs);
125 });
126 });
127}
128
129} // namespace ast
void addFrame(int iframe, Mapping const &map, Frame const &frame) override
Add a new Frame and an associated Mapping to this FrameSet so as to define a new coordinate system,...
Definition FrameDict.cc:32
void mirrorVariants(std::string const &domain)
Variant of mirrorVariants(int) with the frame specified by domain.
Definition FrameDict.h:210
bool hasDomain(std::string const &domain) const
Return True if a frame in this FrameDict has the specified domain.
Definition FrameDict.h:201
std::shared_ptr< Mapping > getMapping(int from, std::string const &to) const
Variant of FrameSet::getMapping with the second frame specified by domain.
Definition FrameDict.h:162
std::shared_ptr< FrameDict > copy() const
Return a deep copy of this object.
Definition FrameDict.h:123
void setCurrent(std::string const &domain)
Variant of setCurrent(int) with the frame specified by domain.
Definition FrameDict.h:247
std::set< std::string > getAllDomains() const
Get the domain names for all contained Frames (excluding frames with empty or defaulted domain names)...
Definition FrameDict.cc:45
void removeFrame(int iframe) override
Remove a Frame from a FrameSet.
Definition FrameDict.cc:53
void remapFrame(std::string const &domain, Mapping &map)
Variant of remapFrame(int, Mapping&) with the frame specified by domain.
Definition FrameDict.h:219
std::shared_ptr< Frame > getFrame(std::string const &domain, bool copy=true) const
Variant of getFrame(int, bool) where the frame is specified by domain name.
Definition FrameDict.h:151
int getIndex(std::string const &domain) const
Get the index of a frame specified by domain.
Definition FrameDict.h:189
void setBase(std::string const &domain)
Variant of setBase(int) with the frame specified by domain.
Definition FrameDict.h:238
void setDomain(std::string const &domain) override
Set the domain of the current frame (and update the internal dict).
Definition FrameDict.cc:61
static int constexpr CURRENT
index of current frame
Definition FrameSet.h:105
static int constexpr BASE
index of base frame
Definition FrameSet.h:104
A helper class for subdividing pybind11 module across multiple translation units (i....
Definition python.h:242
PyType wrapType(PyType cls, ClassWrapperCallback function, bool setModuleName=true)
Add a type (class or enum) wrapper, deferring method and other attribute definitions until finish() i...
Definition python.h:391
pybind11::module module
The module object passed to the PYBIND11_MODULE block that contains this WrapperCollection.
Definition python.h:448
T make_shared(T... args)
AST wrapper classes and functions.
void wrapFrameDict(WrapperCollection &)
Definition frameDict.cc:66
T dynamic_pointer_cast(T... args)