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
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
int y
Definition: SpanSet.cc:48
T begin(T... args)
Reports attempts to exceed implementation-defined length limits for some classes.
Definition: Runtime.h:76
T copy(T... args)
T end(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)