LSST Applications  21.0.0+04719a4bac,21.0.0-1-ga51b5d4+f5e6047307,21.0.0-11-g2b59f77+a9c1acf22d,21.0.0-11-ga42c5b2+86977b0b17,21.0.0-12-gf4ce030+76814010d2,21.0.0-13-g1721dae+760e7a6536,21.0.0-13-g3a573fe+768d78a30a,21.0.0-15-g5a7caf0+f21cbc5713,21.0.0-16-g0fb55c1+b60e2d390c,21.0.0-19-g4cded4ca+71a93a33c0,21.0.0-2-g103fe59+bb20972958,21.0.0-2-g45278ab+04719a4bac,21.0.0-2-g5242d73+3ad5d60fb1,21.0.0-2-g7f82c8f+8babb168e8,21.0.0-2-g8f08a60+06509c8b61,21.0.0-2-g8faa9b5+616205b9df,21.0.0-2-ga326454+8babb168e8,21.0.0-2-gde069b7+5e4aea9c2f,21.0.0-2-gecfae73+1d3a86e577,21.0.0-2-gfc62afb+3ad5d60fb1,21.0.0-25-g1d57be3cd+e73869a214,21.0.0-3-g357aad2+ed88757d29,21.0.0-3-g4a4ce7f+3ad5d60fb1,21.0.0-3-g4be5c26+3ad5d60fb1,21.0.0-3-g65f322c+e0b24896a3,21.0.0-3-g7d9da8d+616205b9df,21.0.0-3-ge02ed75+a9c1acf22d,21.0.0-4-g591bb35+a9c1acf22d,21.0.0-4-g65b4814+b60e2d390c,21.0.0-4-gccdca77+0de219a2bc,21.0.0-4-ge8a399c+6c55c39e83,21.0.0-5-gd00fb1e+05fce91b99,21.0.0-6-gc675373+3ad5d60fb1,21.0.0-64-g1122c245+4fb2b8f86e,21.0.0-7-g04766d7+cd19d05db2,21.0.0-7-gdf92d54+04719a4bac,21.0.0-8-g5674e7b+d1bd76f71f,master-gac4afde19b+a9c1acf22d,w.2021.13
LSST Data Management Base Package
psfImpl.cc
Go to the documentation of this file.
1 // -*- lsst-C++ -*-
2 #include "boost/format.hpp"
3 #include "lsst/pex/exceptions.h"
4 #include "lsst/meas/extensions/psfex/psf.hh"
5 #include "ndarray.h"
6 
7 #define RETURN_IMAGE_FIELD(NAME, CNAME, SIZE) \
8  ndarray::Array<float,2,2> \
9  NAME() const \
10  { \
11  ndarray::Array<float,2,2>::Index shape = ndarray::makeVector(SIZE[0], SIZE[1]); \
12  ndarray::Array<float,2,2>::Index strides = ndarray::makeVector(1, SIZE[0]); \
13  \
14  return ndarray::external(impl->CNAME, shape, strides); \
15  }
16 
17 namespace lsst { namespace meas { namespace extensions { namespace psfex {
18 
19 Context::Context(std::vector<std::string> const& names,
20  std::vector<int> const& group,
21  std::vector<int> const& degree,
22  bool pcexflag
23  )
24 {
25  _names = names;
26  int const ndim = names.size();
27  int const ngroup = group.size();
28 
30  for (int i = 0; i != ndim; ++i) {
31  cnames[i] = names[i].c_str();
32  }
33 
34  impl = context_init(const_cast<char **>(&cnames[0]),
35  const_cast<int *>(&group[0]),
36  ndim,
37  const_cast<int *>(&degree[0]),
38  ngroup, (pcexflag ? 1 : 0));
39  _pc_vectors.resize(impl->npc);
40 }
41 
42 Context::~Context() {
43  context_end(impl);
44 }
45 
46 std::vector<double> & Context::getPc(int const i) const
47 {
48  if (i < 0 || i >= impl->npc) {
50  s1 << "Index " << i << " is out of range 0.." << impl->npc - 1;
51  throw std::out_of_range(s1.str());
52  }
53  if (_pc_vectors[i].empty()) {
54  _pc_vectors[i].reserve(impl->npc);
55  for (int j = 0; j != impl->npc; ++j) {
56  _pc_vectors[i][j] = impl->pc[i*impl->npc + j];
57  }
58  }
59  return _pc_vectors[i];
60 }
61 
62 /************************************************************************************************************/
63 
64 void Sample::setVig(ndarray::Array<float,2,2> const& img)
65 {
66  int const w = img.getSize<0>(), h = img.getSize<1>();
67 
68  if (_vigsize[0]*_vigsize[1] != w*h) {
70  str(boost::format("Expected %dx%d array, but was passed %dx%d")
71  % _vigsize[0] % _vigsize[1] % w % h));
72  }
73 
74  ndarray::Array<float,1,1> flattened = ndarray::flatten<1>(img);
75  std::copy(flattened.begin(), flattened.end(), impl->vig);
76 }
77 
78 RETURN_IMAGE_FIELD(Sample::getVig, vig, _vigsize)
79 RETURN_IMAGE_FIELD(Sample::getVigResi, vigresi, _vigsize)
80 RETURN_IMAGE_FIELD(Sample::getVigChi, vigchi, _vigsize)
81 RETURN_IMAGE_FIELD(Sample::getVigWeight, vigweight, _vigsize)
82 
83 /************************************************************************************************************/
84 
85 Set::Set(Context &c) {
86  impl = init_set(c.impl);
87  impl->nsample = impl->nsamplemax = 0;
88 }
89 Set::~Set() {
90  end_set(impl);
91 }
92 
93 Sample
94 Set::newSample()
95 {
96  if (impl->nsample >= impl->nsamplemax) {
97  if (impl->nsamplemax == 0) {
98  malloc_samples(impl, LSAMPLE_DEFSIZE);
99  } else {
100  realloc_samples(impl, (int)(1.62*impl->nsamplemax + 1));
101  }
102  }
103  return Sample(impl->sample[impl->nsample], _recentroid, impl->vigsize);
104 }
105 
106 void
107 Set::trimMemory() const
108 {
109  setstruct *mutable_impl = const_cast<setstruct *>(impl);
110  realloc_samples(mutable_impl, impl->nsample);
111 }
112 
113 void
114 Set::finiSample(Sample const& sample)
115 {
116  ++impl->nsample;
117  make_weights(impl, sample.impl);
118  if (sample._recentroid) {
119  recenter_sample(sample.impl, impl, sample._fluxrad);
120  }
121 }
122 
123 /************************************************************************************************************/
124 
125 Psf::~Psf() {
126 #if 0 // we don't own impl
127  psf_end(impl);
128 #endif
129 }
130 
131 void
132 Psf::build(double x, double y,
133  std::vector<double> const& other)
134 {
135  if (!impl->contextoffset) { // we never set context{offset,scale}
136  throw std::out_of_range("psf.contextoffset not set (probably no valid stars) so I can't index it");
137  }
138 
139  std::vector<double> pos(2);
140  pos[0] = x; pos[1] = y;
141 
142  pos.insert(pos.end(), other.begin(), other.end());
143 
144  for (unsigned int i = 0; i != pos.size(); ++i) {
145  pos[i] = (pos[i] - impl->contextoffset[i])/impl->contextscale[i];
146  }
147 
148  psf_build(impl, &pos[0]);
149 }
150 
151 RETURN_IMAGE_FIELD(Psf::getLoc, loc, impl->size)
152 RETURN_IMAGE_FIELD(Psf::getResi, resi, impl->size)
153 
154 }}}}
double x
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition: Exception.h:48
ItemVariant const * other
Definition: Schema.cc:56
int y
Definition: SpanSet.cc:49
Reports attempts to exceed implementation-defined length limits for some classes.
Definition: Runtime.h:76
T copy(T... args)
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
Definition: history.py:174
A base class for image defects.
#define RETURN_IMAGE_FIELD(NAME, CNAME, SIZE)
Definition: psfImpl.cc:7
T size(T... args)
double w
Definition: CoaddPsf.cc:69
table::Key< int > ndim
Definition: PsfexPsf.cc:325
table::Key< int > ngroup
Definition: PsfexPsf.cc:326
table::Key< table::Array< int > > degree
Definition: PsfexPsf.cc:360
table::Key< table::Array< int > > group
Definition: PsfexPsf.cc:359
T str(T... args)