2 #include "boost/format.hpp"
4 #include "lsst/meas/extensions/psfex/psf.hh"
7 #define RETURN_IMAGE_FIELD(NAME, CNAME, SIZE) \
8 ndarray::Array<float,2,2> \
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]); \
14 return ndarray::external(impl->CNAME, shape, strides); \
17 namespace lsst {
namespace meas {
namespace extensions {
namespace psfex {
30 for (
int i = 0; i !=
ndim; ++i) {
31 cnames[i] = names[i].c_str();
34 impl = context_init(
const_cast<char **
>(&cnames[0]),
35 const_cast<int *
>(&
group[0]),
37 const_cast<int *
>(&
degree[0]),
38 ngroup, (pcexflag ? 1 : 0));
39 _pc_vectors.resize(impl->npc);
48 if (i < 0 || i >= impl->npc) {
50 s1 <<
"Index " << i <<
" is out of range 0.." << impl->npc - 1;
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];
59 return _pc_vectors[i];
64 void Sample::setVig(ndarray::Array<float,2,2>
const& img)
66 int const w = img.getSize<0>(), h = img.getSize<1>();
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));
74 ndarray::Array<float,1,1> flattened = ndarray::flatten<1>(img);
75 std::copy(flattened.begin(), flattened.end(), impl->vig);
85 Set::Set(Context &c) {
86 impl = init_set(c.impl);
87 impl->nsample = impl->nsamplemax = 0;
96 if (impl->nsample >= impl->nsamplemax) {
97 if (impl->nsamplemax == 0) {
98 malloc_samples(impl, LSAMPLE_DEFSIZE);
100 realloc_samples(impl, (
int)(1.62*impl->nsamplemax + 1));
103 return Sample(impl->sample[impl->nsample], _recentroid, impl->vigsize);
107 Set::trimMemory()
const
109 setstruct *mutable_impl =
const_cast<setstruct *
>(impl);
110 realloc_samples(mutable_impl, impl->nsample);
114 Set::finiSample(Sample
const& sample)
117 make_weights(impl, sample.impl);
118 if (sample._recentroid) {
119 recenter_sample(sample.impl, impl, sample._fluxrad);
126 #if 0 // we don't own impl
132 Psf::build(
double x,
double y,
135 if (!impl->contextoffset) {
136 throw std::out_of_range(
"psf.contextoffset not set (probably no valid stars) so I can't index it");
140 pos[0] =
x; pos[1] =
y;
142 pos.insert(pos.end(),
other.begin(),
other.end());
144 for (
unsigned int i = 0; i != pos.size(); ++i) {
145 pos[i] = (pos[i] - impl->contextoffset[i])/impl->contextscale[i];
148 psf_build(impl, &pos[0]);