LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
Typedefs | Functions
lsst::afw::table::python Namespace Reference

Typedefs

template<typename Record >
using PyCatalog = pybind11::class_< CatalogT< Record >, std::shared_ptr< CatalogT< Record > >>
 
template<typename Record >
using PyColumnView = pybind11::class_< ColumnViewT< Record >, std::shared_ptr< ColumnViewT< Record > >, BaseColumnView >
 
template<typename Record >
using PySortedCatalog = pybind11::class_< SortedCatalogT< Record >, std::shared_ptr< SortedCatalogT< Record > >, CatalogT< Record > >
 

Functions

template<typename T , typename Record >
ndarray::Array< typename Field< T >::Value const, 1, 1 > _getArrayFromCatalog (CatalogT< Record > const &catalog, Key< T > const &key)
 Extract a column from a potentially non-contiguous Catalog. More...
 
template<typename Record >
ndarray::Array< double const, 1, 1 > _getArrayFromCatalog (CatalogT< Record > const &catalog, Key< lsst::geom::Angle > const &key)
 
template<typename Record >
void _setFlagColumnToArray (CatalogT< Record > &catalog, Key< Flag > const &key, ndarray::Array< bool const, 1 > const &array)
 
template<typename Record >
void _setFlagColumnToScalar (CatalogT< Record > &catalog, Key< Flag > const &key, bool value)
 
template<typename T , typename Record >
void declareCatalogOverloads (PyCatalog< Record > &cls)
 Declare field-type-specific overloaded catalog member functions for one field type. More...
 
template<typename Record >
PyCatalog< Record > declareCatalog (utils::python::WrapperCollection &wrappers, std::string const &name, bool isBase=false)
 Wrap an instantiation of lsst::afw::table::CatalogT<Record>. More...
 
template<typename Record >
PyColumnView< Record > declareColumnView (utils::python::WrapperCollection &wrappers, std::string const &name, bool isBase=false)
 Declare member and static functions for a given instantiation of lsst::afw::table::ColumnViewT<RecordT>. More...
 
template<typename Record >
PySortedCatalog< Record > declareSortedCatalog (utils::python::WrapperCollection &wrappers, std::string const &name, bool isBase=false)
 Wrap an instantiation of lsst::afw::table::SortedCatalogT<Record>. More...
 

Typedef Documentation

◆ PyCatalog

template<typename Record >
using lsst::afw::table::python::PyCatalog = typedef pybind11::class_<CatalogT<Record>, std::shared_ptr<CatalogT<Record> >>

Definition at line 38 of file catalog.h.

◆ PyColumnView

template<typename Record >
using lsst::afw::table::python::PyColumnView = typedef pybind11::class_<ColumnViewT<Record>, std::shared_ptr<ColumnViewT<Record> >, BaseColumnView>

Definition at line 38 of file columnView.h.

◆ PySortedCatalog

template<typename Record >
using lsst::afw::table::python::PySortedCatalog = typedef pybind11::class_<SortedCatalogT<Record>, std::shared_ptr<SortedCatalogT<Record> >, CatalogT<Record> >

Definition at line 39 of file sortedCatalog.h.

Function Documentation

◆ _getArrayFromCatalog() [1/2]

template<typename Record >
ndarray::Array<double const, 1, 1> lsst::afw::table::python::_getArrayFromCatalog ( CatalogT< Record > const &  catalog,
Key< lsst::geom::Angle > const &  key 
)
Parameters
catalogCatalog
keyKey to column to extract

Definition at line 58 of file catalog.h.

61  {
62  ndarray::Array<double, 1, 1> out = ndarray::allocate(catalog.size());
63  auto outIter = out.begin();
64  auto inIter = catalog.begin();
65  for (; inIter != catalog.end(); ++inIter, ++outIter) {
66  *outIter = inIter->get(key).asRadians();
67  }
68  return out;
69 }

◆ _getArrayFromCatalog() [2/2]

template<typename T , typename Record >
ndarray::Array<typename Field<T>::Value const, 1, 1> lsst::afw::table::python::_getArrayFromCatalog ( CatalogT< Record > const &  catalog,
Key< T > const &  key 
)

Extract a column from a potentially non-contiguous Catalog.

Parameters
catalogCatalog
keyKey to column to extract

Definition at line 42 of file catalog.h.

45  {
46  ndarray::Array<typename Field<T>::Value, 1, 1> out = ndarray::allocate(catalog.size());
47  auto outIter = out.begin();
48  auto inIter = catalog.begin();
49  for (; inIter != catalog.end(); ++inIter, ++outIter) {
50  *outIter = inIter->get(key);
51  }
52  return out;
53 }

◆ _setFlagColumnToArray()

template<typename Record >
void lsst::afw::table::python::_setFlagColumnToArray ( CatalogT< Record > &  catalog,
Key< Flag > const &  key,
ndarray::Array< bool const, 1 > const &  array 
)

Definition at line 72 of file catalog.h.

76  {
77  if (array.size() != catalog.size()) {
78  throw LSST_EXCEPT(
79  pex::exceptions::LengthError,
80  (boost::format("Catalog has %d rows, while array has %d elements.")
81  % catalog.size() % array.size()).str()
82  );
83  }
84  auto catIter = catalog.begin();
85  auto arrayIter = array.begin();
86  for (; catIter != catalog.end(); ++catIter, ++arrayIter) {
87  catIter->set(key, *arrayIter);
88  }
89 }
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition: Exception.h:48
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
Definition: history.py:174

◆ _setFlagColumnToScalar()

template<typename Record >
void lsst::afw::table::python::_setFlagColumnToScalar ( CatalogT< Record > &  catalog,
Key< Flag > const &  key,
bool  value 
)

Definition at line 92 of file catalog.h.

96  {
97  for (auto catIter = catalog.begin(); catIter != catalog.end(); ++catIter) {
98  catIter->set(key, value);
99  }
100 }

◆ declareCatalog()

template<typename Record >
PyCatalog<Record> lsst::afw::table::python::declareCatalog ( utils::python::WrapperCollection &  wrappers,
std::string const &  name,
bool  isBase = false 
)

Wrap an instantiation of lsst::afw::table::CatalogT<Record>.

In addition to calling this method you must call addCatalogMethods on the class object in Python.

Template Parameters
RecordRecord type, e.g. BaseRecord or SimpleRecord.
Parameters
[in]wrappersPackage manager class will be added to.
[in]nameName prefix of the record type, e.g. "Base" or "Simple".
[in]isBaseWhether this instantiation is only being used as a base class (used to set the class name).

Definition at line 173 of file catalog.h.

174  {
175  namespace py = pybind11;
176  using namespace pybind11::literals;
177 
178  using Catalog = CatalogT<Record>;
179  using Table = typename Record::Table;
180 
181  std::string fullName;
182  if (isBase) {
183  fullName = "_" + name + "CatalogBase";
184  } else {
185  fullName = name + "Catalog";
186  }
187 
188  // We need py::dynamic_attr() in the class definition to support our Python-side caching
189  // of the associated ColumnView.
190  return wrappers.wrapType(
191  PyCatalog<Record>(wrappers.module, fullName.c_str(), py::dynamic_attr()),
192  [](auto &mod, auto &cls) {
193  /* Constructors */
194  cls.def(py::init<Schema const &>(), "schema"_a);
195  cls.def(py::init<std::shared_ptr<Table> const &>(), "table"_a);
196  cls.def(py::init<Catalog const &>(), "other"_a);
197 
198  /* Static Methods */
199  cls.def_static("readFits", (Catalog(*)(std::string const &, int, int)) & Catalog::readFits,
200  "filename"_a, "hdu"_a = fits::DEFAULT_HDU, "flags"_a = 0);
201  cls.def_static("readFits", (Catalog(*)(fits::MemFileManager &, int, int)) & Catalog::readFits,
202  "manager"_a, "hdu"_a = fits::DEFAULT_HDU, "flags"_a = 0);
203  // readFits taking Fits objects not wrapped, because Fits objects are not wrapped.
204 
205  /* Methods */
206  cls.def("getTable", &Catalog::getTable);
207  cls.def_property_readonly("table", &Catalog::getTable);
208  cls.def("getSchema", &Catalog::getSchema);
209  cls.def_property_readonly("schema", &Catalog::getSchema);
210  cls.def("capacity", &Catalog::capacity);
211  cls.def("__len__", &Catalog::size);
212  cls.def("resize", &Catalog::resize);
213 
214  // Use private names for the following so the public Python method
215  // can manage the _column cache
216  cls.def("_getColumnView", &Catalog::getColumnView);
217  cls.def("_addNew", &Catalog::addNew);
218  cls.def("_extend", [](Catalog &self, Catalog const &other, bool deep) {
219  self.insert(self.end(), other.begin(), other.end(), deep);
220  });
221  cls.def("_extend", [](Catalog &self, Catalog const &other, SchemaMapper const &mapper) {
222  self.insert(mapper, self.end(), other.begin(), other.end());
223  });
224  cls.def("_append",
225  [](Catalog &self, std::shared_ptr<Record> const &rec) { self.push_back(rec); });
226  cls.def("_delitem_", [](Catalog &self, std::ptrdiff_t i) {
227  self.erase(self.begin() + utils::python::cppIndex(self.size(), i));
228  });
229  cls.def("_delslice_", [](Catalog &self, py::slice const &s) {
230  Py_ssize_t start = 0, stop = 0, step = 0, length = 0;
231  if (PySlice_GetIndicesEx(s.ptr(), self.size(), &start, &stop, &step, &length) != 0) {
232  throw py::error_already_set();
233  }
234  if (step != 1) {
235  throw py::index_error("Slice step must not exactly 1");
236  }
237  self.erase(self.begin() + start, self.begin() + stop);
238  });
239  cls.def("_clear", &Catalog::clear);
240 
241  cls.def("set", &Catalog::set);
242  cls.def("_getitem_", [](Catalog &self, int i) {
243  return self.get(utils::python::cppIndex(self.size(), i));
244  });
245  cls.def("isContiguous", &Catalog::isContiguous);
246  cls.def("writeFits",
247  (void (Catalog::*)(std::string const &, std::string const &, int) const) &
249  "filename"_a, "mode"_a = "w", "flags"_a = 0);
250  cls.def("writeFits",
251  (void (Catalog::*)(fits::MemFileManager &, std::string const &, int) const) &
253  "manager"_a, "mode"_a = "w", "flags"_a = 0);
254  cls.def("reserve", &Catalog::reserve);
255  cls.def("subset",
256  (Catalog(Catalog::*)(ndarray::Array<bool const, 1> const &) const) & Catalog::subset);
257  cls.def("subset",
258  (Catalog(Catalog::*)(std::ptrdiff_t, std::ptrdiff_t, std::ptrdiff_t) const) &
259  Catalog::subset);
260 
261  declareCatalogOverloads<std::int32_t>(cls);
262  declareCatalogOverloads<std::int64_t>(cls);
263  declareCatalogOverloads<float>(cls);
264  declareCatalogOverloads<double>(cls);
265  declareCatalogOverloads<lsst::geom::Angle>(cls);
266 
267  cls.def("_getitem_",
268  [](Catalog const &self, Key<Flag> const &key) -> ndarray::Array<bool const, 1, 0> {
269  return _getArrayFromCatalog(self, key);
270  });
271 
272  });
273 }
table::Key< std::string > name
Definition: Amplifier.cc:116
int const step
int end
SchemaMapper * mapper
Definition: SchemaMapper.cc:71
T begin(T... args)
T c_str(T... args)
daf::base::PropertySet * set
Definition: fits.cc:912
ndarray::Array< double const, 1, 1 > _getArrayFromCatalog(CatalogT< Record > const &catalog, Key< lsst::geom::Angle > const &key)
Definition: catalog.h:58
std::size_t cppIndex(std::ptrdiff_t size, std::ptrdiff_t i)
Compute a C++ index from a Python index (negative values count from the end) and range-check.
Definition: python.h:124
def writeFits(filename, stamps, metadata, type_name, write_mask, write_variance, write_archive=False)
Definition: stamps.py:42

◆ declareCatalogOverloads()

template<typename T , typename Record >
void lsst::afw::table::python::declareCatalogOverloads ( PyCatalog< Record > &  cls)

Declare field-type-specific overloaded catalog member functions for one field type.

Template Parameters
TField type.
RecordRecord type, e.g. BaseRecord or SimpleRecord.
Parameters
[in]clsCatalog pybind11 class.

Definition at line 111 of file catalog.h.

111  {
112  namespace py = pybind11;
113  using namespace pybind11::literals;
114 
115  using Catalog = CatalogT<Record>;
116  using Value = typename Field<T>::Value;
117 
118  cls.def("isSorted", (bool (Catalog::*)(Key<T> const &) const) & Catalog::isSorted);
119  cls.def("sort", (void (Catalog::*)(Key<T> const &)) & Catalog::sort);
120  cls.def("find", [](Catalog &self, Value const &value, Key<T> const &key) -> std::shared_ptr<Record> {
121  auto iter = self.find(value, key);
122  if (iter == self.end()) {
123  return nullptr;
124  };
125  return iter;
126  });
127  cls.def("upper_bound", [](Catalog &self, Value const &value, Key<T> const &key) -> std::ptrdiff_t {
128  return self.upper_bound(value, key) - self.begin();
129  });
130  cls.def("lower_bound", [](Catalog &self, Value const &value, Key<T> const &key) -> std::ptrdiff_t {
131  return self.lower_bound(value, key) - self.begin();
132  });
133  cls.def("equal_range", [](Catalog &self, Value const &value, Key<T> const &key) {
134  auto p = self.equal_range(value, key);
135  return py::slice(p.first - self.begin(), p.second - self.begin(), 1);
136  });
137  cls.def("between", [](Catalog &self, Value const &lower, Value const &upper, Key<T> const &key) {
138  std::ptrdiff_t a = self.lower_bound(lower, key) - self.begin();
139  std::ptrdiff_t b = self.upper_bound(upper, key) - self.begin();
140  return py::slice(a, b, 1);
141  });
142 
143  cls.def("_getitem_",
144  [](Catalog const &self, Key<T> const &key) { return _getArrayFromCatalog(self, key); });
145  cls.def(
146  "_set_flag",
147  [](Catalog &self, Key<Flag> const & key, ndarray::Array<bool const, 1> const & array) {
148  _setFlagColumnToArray(self, key, array);
149  }
150  );
151  cls.def(
152  "_set_flag",
153  [](Catalog &self, Key<Flag> const & key, bool value) {
154  _setFlagColumnToScalar(self, key, value);
155  }
156  );
157 }
table::Key< int > b
table::Key< int > a
void _setFlagColumnToArray(CatalogT< Record > &catalog, Key< Flag > const &key, ndarray::Array< bool const, 1 > const &array)
Definition: catalog.h:72
void _setFlagColumnToScalar(CatalogT< Record > &catalog, Key< Flag > const &key, bool value)
Definition: catalog.h:92

◆ declareColumnView()

template<typename Record >
PyColumnView<Record> lsst::afw::table::python::declareColumnView ( utils::python::WrapperCollection &  wrappers,
std::string const &  name,
bool  isBase = false 
)

Declare member and static functions for a given instantiation of lsst::afw::table::ColumnViewT<RecordT>.

Template Parameters
RecordRecord type, e.g. BaseRecord or SimpleRecord.
Parameters
[in]wrappersPackage manager class will be added to.
[in]nameName prefix of the record type, e.g. "Base" or "Simple".
[in]isBaseWhether this instantiation is only being used as a base class (used to set the class name).

Definition at line 52 of file columnView.h.

53  {
54  std::string fullName;
55  if (isBase) {
56  fullName = "_" + name + "ColumnViewBase";
57  } else {
58  fullName = name + "ColumnView";
59  }
60  return wrappers.wrapType(PyColumnView<Record>(wrappers.module, fullName.c_str()),
61  [](auto& mod, auto& cls) {
62  cls.def("getTable", &ColumnViewT<Record>::getTable);
63  cls.def_property_readonly("table", &ColumnViewT<Record>::getTable);
64  });
65 };

◆ declareSortedCatalog()

template<typename Record >
PySortedCatalog<Record> lsst::afw::table::python::declareSortedCatalog ( utils::python::WrapperCollection &  wrappers,
std::string const &  name,
bool  isBase = false 
)

Wrap an instantiation of lsst::afw::table::SortedCatalogT<Record>.

In addition to calling this method (which also instantiates and wraps the CatalogT base class), you must call addCatalogMethods on the class object in Python.

Template Parameters
RecordRecord type, e.g. BaseRecord or SimpleRecord.
Parameters
[in]wrappersPackage manager class will be added to.
[in]nameName prefix of the record type, e.g. "Base" or "Simple".
[in]isBaseWhether this instantiation is only being used as a base class (used to set the class name).

Definition at line 57 of file sortedCatalog.h.

58  {
59  namespace py = pybind11;
60  using namespace pybind11::literals;
61 
62  using Catalog = SortedCatalogT<Record>;
63  using Table = typename Record::Table;
64 
65  auto clsBase = declareCatalog<Record>(wrappers, name, true);
66 
67  std::string fullName;
68  if (isBase) {
69  fullName = "_" + name + "SortedCatalogBase";
70  } else {
71  fullName = name + "Catalog";
72  }
73 
74  // We need py::dynamic_attr() in the class definition to support our Python-side caching
75  // of the associated ColumnView.
76  return wrappers.wrapType(
77  PySortedCatalog<Record>(wrappers.module, fullName.c_str(), py::dynamic_attr()),
78  [clsBase](auto &mod, auto &cls) {
79  /* Constructors */
80  cls.def(pybind11::init<Schema const &>());
81  cls.def(pybind11::init<std::shared_ptr<Table> const &>(),
82  "table"_a = std::shared_ptr<Table>());
83  cls.def(pybind11::init<Catalog const &>());
84 
85  /* Overridden and Variant Methods */
86  cls.def_static("readFits", (Catalog(*)(std::string const &, int, int)) & Catalog::readFits,
87  "filename"_a, "hdu"_a = fits::DEFAULT_HDU, "flags"_a = 0);
88  cls.def_static("readFits", (Catalog(*)(fits::MemFileManager &, int, int)) & Catalog::readFits,
89  "manager"_a, "hdu"_a = fits::DEFAULT_HDU, "flags"_a = 0);
90  // readFits taking Fits objects not wrapped, because Fits objects are not wrapped.
91 
92  cls.def("subset",
93  (Catalog(Catalog::*)(ndarray::Array<bool const, 1> const &) const) & Catalog::subset);
94  cls.def("subset",
95  (Catalog(Catalog::*)(std::ptrdiff_t, std::ptrdiff_t, std::ptrdiff_t) const) &
96  Catalog::subset);
97 
98  // The following three methods shadow those in the base class in C++ (unlike the base class
99  // versions, they do not require a key argument because we assume it's the ID key). In
100  // Python, we make that appear as though the key argument is available but has a default
101  // value. If that key is not None, we delegate to the base class.
102  cls.def("isSorted",
103  [clsBase](py::object const &self, py::object key) -> py::object {
104  if (key.is(py::none())) {
105  key = self.attr("table").attr("getIdKey")();
106  }
107  return clsBase.attr("isSorted")(self, key);
108  },
109  "key"_a = py::none());
110  cls.def("sort",
111  [clsBase](py::object const &self, py::object key) -> py::object {
112  if (key.is(py::none())) {
113  key = self.attr("table").attr("getIdKey")();
114  }
115  return clsBase.attr("sort")(self, key);
116  },
117  "key"_a = py::none());
118  cls.def("find",
119  [clsBase](py::object const &self, py::object const &value,
120  py::object key) -> py::object {
121  if (key.is(py::none())) {
122  key = self.attr("table").attr("getIdKey")();
123  }
124  return clsBase.attr("find")(self, value, key);
125  },
126  "value"_a, "key"_a = py::none());
127 
128  });
129 }