LSST Applications  21.0.0-147-g0e635eb1+1acddb5be5,22.0.0+052faf71bd,22.0.0+1ea9a8b2b2,22.0.0+6312710a6c,22.0.0+729191ecac,22.0.0+7589c3a021,22.0.0+9f079a9461,22.0.1-1-g7d6de66+b8044ec9de,22.0.1-1-g87000a6+536b1ee016,22.0.1-1-g8e32f31+6312710a6c,22.0.1-10-gd060f87+016f7cdc03,22.0.1-12-g9c3108e+df145f6f68,22.0.1-16-g314fa6d+c825727ab8,22.0.1-19-g93a5c75+d23f2fb6d8,22.0.1-19-gb93eaa13+aab3ef7709,22.0.1-2-g8ef0a89+b8044ec9de,22.0.1-2-g92698f7+9f079a9461,22.0.1-2-ga9b0f51+052faf71bd,22.0.1-2-gac51dbf+052faf71bd,22.0.1-2-gb66926d+6312710a6c,22.0.1-2-gcb770ba+09e3807989,22.0.1-20-g32debb5+b8044ec9de,22.0.1-23-gc2439a9a+fb0756638e,22.0.1-3-g496fd5d+09117f784f,22.0.1-3-g59f966b+1e6ba2c031,22.0.1-3-g849a1b8+f8b568069f,22.0.1-3-gaaec9c0+c5c846a8b1,22.0.1-32-g5ddfab5d3+60ce4897b0,22.0.1-4-g037fbe1+64e601228d,22.0.1-4-g8623105+b8044ec9de,22.0.1-5-g096abc9+d18c45d440,22.0.1-5-g15c806e+57f5c03693,22.0.1-7-gba73697+57f5c03693,master-g6e05de7fdc+c1283a92b8,master-g72cdda8301+729191ecac,w.2021.39
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)