LSSTApplications  10.0+286,10.0+36,10.0+46,10.0-2-g4f67435,10.1+152,10.1+37,11.0,11.0+1,11.0-1-g47edd16,11.0-1-g60db491,11.0-1-g7418c06,11.0-2-g04d2804,11.0-2-g68503cd,11.0-2-g818369d,11.0-2-gb8b8ce7
LSSTDataManagementBasePackage
Public Member Functions | Private Member Functions | Private Attributes | List of all members
lsst::meas::algorithms::shapelet::Polynomial2D Class Reference

#include <Function2D.h>

Inheritance diagram for lsst::meas::algorithms::shapelet::Polynomial2D:
lsst::meas::algorithms::shapelet::Function2D

Public Member Functions

 Polynomial2D (double scale=1.)
 
 Polynomial2D (const Polynomial2D &rhs)
 
 Polynomial2D (const DMatrix &a, double scale=1.)
 
 Polynomial2D (std::istream &fin)
 
 Polynomial2D (int xo, int yo, double scale=1.)
 
virtual ~Polynomial2D ()
 
virtual void write (std::ostream &fout) const
 
virtual std::auto_ptr< Function2DdFdX () const
 
virtual std::auto_ptr< Function2DdFdY () const
 
std::auto_ptr< Function2Dcopy () const
 
virtual void addLinear (double a, double b, double c)
 
virtual void linearPreTransform (double a, double b, double c, double d, double e, double f)
 
virtual void operator+= (const Function2D &rhs)
 
void makeProductOf (const Polynomial2D &f, const Polynomial2D &g)
 
virtual void setFunction (int xOrder, int yOrder, const DVector &fVect)
 
- Public Member Functions inherited from lsst::meas::algorithms::shapelet::Function2D
 Function2D ()
 
 Function2D (int xo, int yo)
 
 Function2D (int xo, int yo, const DMatrix &c)
 
 Function2D (const Function2D &rhs)
 
virtual ~Function2D ()
 
virtual std::auto_ptr< Function2Dconj () const
 
virtual void operator*= (double scale)
 
virtual double operator() (double x, double y) const
 
double operator() (const Position &p) const
 
virtual void setTo (double value)
 
bool isNonZero () const
 
int getXOrder () const
 
int getYOrder () const
 
const DMatrixgetCoeffs () const
 
virtual void simpleFit (int order, const std::vector< Position > &pos, const std::vector< double > &v, const std::vector< bool > &shouldUse, const std::vector< double > *sigList=0, double *chisqOut=0, int *dofOut=0, DMatrix *cov=0)
 
virtual void outlierFit (int order, double nsig, const std::vector< Position > &pos, const std::vector< double > &v, std::vector< bool > *shouldUse, const std::vector< double > *sigList=0, double *chisqout=0, int *dofout=0, DMatrix *cov=0)
 
virtual void orderFit (int maxOrder, double equivProb, const std::vector< Position > &pos, const std::vector< double > &v, const std::vector< bool > &shouldUse, const std::vector< double > *sigList=0, double *chisqout=0, int *dofout=0, DMatrix *cov=0)
 
virtual void linearTransform (double a, double b, double c, const Function2D &f, const Function2D &g)
 
virtual void linearTransform (double a, double b, const Function2D &f)
 

Private Member Functions

virtual DVector definePX (int order, double x) const
 
virtual DVector definePY (int order, double y) const
 

Private Attributes

double _scale
 

Additional Inherited Members

- Static Public Member Functions inherited from lsst::meas::algorithms::shapelet::Function2D
static std::auto_ptr< Function2Dread (std::istream &fin)
 
- Protected Attributes inherited from lsst::meas::algorithms::shapelet::Function2D
int _xOrder
 
int _yOrder
 
std::auto_ptr< DMatrix_coeffs
 

Detailed Description

Definition at line 234 of file Function2D.h.

Constructor & Destructor Documentation

lsst::meas::algorithms::shapelet::Polynomial2D::Polynomial2D ( double  scale = 1.)
inline
lsst::meas::algorithms::shapelet::Polynomial2D::Polynomial2D ( const Polynomial2D rhs)
inline

Definition at line 241 of file Function2D.h.

lsst::meas::algorithms::shapelet::Polynomial2D::Polynomial2D ( const DMatrix a,
double  scale = 1. 
)
inline

Definition at line 244 of file Function2D.h.

244  :
245  Function2D(a.TMV_colsize()-1,a.TMV_rowsize()-1,a), _scale(scale) {}
lsst::meas::algorithms::shapelet::Polynomial2D::Polynomial2D ( std::istream &  fin)

Definition at line 90 of file Function2D.cc.

90  :
91  Function2D()
92  {
93  // Order of parameters: (example is for xorder = 2, yorder = 3
94  // xorder(2) yorder(3) a00 a10 a01 a20 a11 a02 a21 a12 a03
95  // where f = a00 + a10 x + a01 y + a20 x^2 + a11 xy + a02 y^2
96  // + a21 x^2 y + a12 xy^2 + a03 y^3
97  // Note that total order doesn't go past the max of xorder and yorder.
98  // Also note that a30 is not listed since xorder is only 2.
99  // Note that aij are complex numbers so each is listed as
100  // real_part imag_part.
101  int xo,yo;
102  if (!(fin >> xo >> yo >> _scale))
103  throw std::runtime_error("reading xorder,yorder,scale");
104  _xOrder = xo;
105  _yOrder = yo;
106  _coeffs.reset(new DMatrix(xo+1,yo+1));
107  _coeffs->setZero();
108  int maxOrder = std::max(xo,yo);
109  for(int m=0;m<=maxOrder;++m) {
110  int i0 = std::min(xo,m);
111  int len = std::min(yo,i0)+1;
112 #ifdef USE_TMV
113  DVectorView coeffDiag = _coeffs->subVector(i0,m-i0,-1,1,len);
114  for(int i=0;i<len;++i) fin >> coeffDiag(i);
115 #else
116  for(int i=0;i<len;++i) fin >> (*_coeffs)(i0-i,m-i0+i);
117 #endif
118  }
119  if (!fin) throw std::runtime_error("reading (polynomial)");
120  }
Eigen::Block< DVector, Eigen::Dynamic, 1 > DVectorView
Definition: MyMatrix.h:130
tuple m
Definition: lsstimport.py:48
lsst::meas::algorithms::shapelet::Polynomial2D::Polynomial2D ( int  xo,
int  yo,
double  scale = 1. 
)
inline
virtual lsst::meas::algorithms::shapelet::Polynomial2D::~Polynomial2D ( )
inlinevirtual

Definition at line 252 of file Function2D.h.

252 {}

Member Function Documentation

void lsst::meas::algorithms::shapelet::Polynomial2D::addLinear ( double  a,
double  b,
double  c 
)
virtual

Implements lsst::meas::algorithms::shapelet::Function2D.

Definition at line 149 of file Function2D.cc.

150  {
151  (*_coeffs)(0,0) += a;
152  (*_coeffs)(1,0) += b*_scale;
153  (*_coeffs)(0,1) += c*_scale;
154  }
afw::table::Key< double > b
std::auto_ptr<Function2D> lsst::meas::algorithms::shapelet::Polynomial2D::copy ( ) const
inlinevirtual

Implements lsst::meas::algorithms::shapelet::Function2D.

Definition at line 260 of file Function2D.h.

261  { return std::auto_ptr<Function2D>(new Polynomial2D(*this)); }
virtual DVector lsst::meas::algorithms::shapelet::Polynomial2D::definePX ( int  order,
double  x 
) const
inlineprivatevirtual

Implements lsst::meas::algorithms::shapelet::Function2D.

Definition at line 279 of file Function2D.h.

280  {
281  DVector temp(order+1);
282  temp(0) = 1.0;
283  for(int i=1;i<=order;++i) temp(i) = temp(i-1)*x/_scale;
284  return temp;
285  }
double x
virtual DVector lsst::meas::algorithms::shapelet::Polynomial2D::definePY ( int  order,
double  y 
) const
inlineprivatevirtual

Implements lsst::meas::algorithms::shapelet::Function2D.

Definition at line 286 of file Function2D.h.

287  { return definePX(order,y); }
int y
virtual DVector definePX(int order, double x) const
Definition: Function2D.h:279
std::auto_ptr< Function2D > lsst::meas::algorithms::shapelet::Polynomial2D::dFdX ( ) const
virtual

Implements lsst::meas::algorithms::shapelet::Function2D.

Definition at line 260 of file Function2D.cc.

261  {
262  if (_xOrder == 0) {
263  return std::auto_ptr<Function2D>(new Constant2D());
264  }
265  if (_xOrder == 1 && _yOrder == 0) {
266  return std::auto_ptr<Function2D>(
267  new Constant2D((*_coeffs)(1,0)));
268  }
269 
270  int newXOrder = _xOrder-1;
271  int newYOrder = _xOrder > _yOrder ? _yOrder : _yOrder-1;
272 
273  std::auto_ptr<Polynomial2D> temp(
274  new Polynomial2D(newXOrder,newYOrder));
275 
276  int maxOrder = std::max(newXOrder,newYOrder);
277  for(int i=newXOrder;i>=0;--i) {
278  for(int j=std::min(maxOrder-i,newYOrder);j>=0;--j) {
279  Assert(i+1<=_xOrder);
280  Assert(j<=_yOrder);
281  Assert(i+1+j<=std::max(_xOrder,_yOrder));
282  (*temp->_coeffs)(i,j) = (*_coeffs)(i+1,j)*(i+1.)/_scale;
283  }
284  }
285  return std::auto_ptr<Function2D>(temp);
286  }
#define Assert(x)
Definition: dbg.h:73
std::auto_ptr< Function2D > lsst::meas::algorithms::shapelet::Polynomial2D::dFdY ( ) const
virtual

Implements lsst::meas::algorithms::shapelet::Function2D.

Definition at line 288 of file Function2D.cc.

289  {
290  if (_yOrder == 0) {
291  return std::auto_ptr<Function2D>(new Constant2D());
292  }
293  if (_yOrder == 1 && _xOrder == 0) {
294  return std::auto_ptr<Function2D>(
295  new Constant2D((*_coeffs)(0,1)));
296  }
297 
298  int newXOrder = _yOrder > _xOrder ? _xOrder : _xOrder-1;
299  int newYOrder = _yOrder-1;
300 
301  std::auto_ptr<Polynomial2D> temp(
302  new Polynomial2D(newXOrder,newYOrder));
303 
304  int maxOrder = std::max(newXOrder,newYOrder);
305  for(int i=newXOrder;i>=0;--i)
306  for(int j=std::min(maxOrder-i,newYOrder);j>=0;--j) {
307  Assert(i<=_xOrder);
308  Assert(j+1<=_yOrder);
309  Assert(i+j+1<=std::max(_xOrder,_yOrder));
310  (*temp->_coeffs)(i,j) = (*_coeffs)(i,j+1)*(j+1.)/_scale;
311  }
312  return std::auto_ptr<Function2D>(temp);
313  }
#define Assert(x)
Definition: dbg.h:73
void lsst::meas::algorithms::shapelet::Polynomial2D::linearPreTransform ( double  a,
double  b,
double  c,
double  d,
double  e,
double  f 
)
virtual

Implements lsst::meas::algorithms::shapelet::Function2D.

Definition at line 156 of file Function2D.cc.

158  {
159  // F(x,y) = Sum_i,j a(i,j) x^i y^j
160  // F'(x,y) = F(a+bx+cy,d+ex+fy)
161  // = Sum_i,j a(i,j) (a+bx+cy)^i (d+ex+fy)^j
162  // = Sum_i,j a(i,j) (Sum_kl iCk kCl a^i-k (bx)^k-l (cy)^l) *
163  // Sum_mn jCm mCn d^j-m (ex)^m-n (fy)^n
164  int maxOrder = std::max(_xOrder,_yOrder);
165  std::vector<double> scaleToThe(maxOrder+1);
166  scaleToThe[0] = 1.0; scaleToThe[1] = _scale;
167  for(int i=2;i<=maxOrder;++i) scaleToThe[i] = scaleToThe[i-1]*_scale;
168  std::vector<double> aToThe(maxOrder+1);
169  std::vector<double> bToThe(maxOrder+1);
170  std::vector<double> cToThe(maxOrder+1);
171  std::vector<double> dToThe(maxOrder+1);
172  std::vector<double> eToThe(maxOrder+1);
173  std::vector<double> fToThe(maxOrder+1);
174  aToThe[0] = 1.; aToThe[1] = a;
175  bToThe[0] = 1.; bToThe[1] = b;
176  cToThe[0] = 1.; cToThe[1] = c;
177  dToThe[0] = 1.; dToThe[1] = d;
178  eToThe[0] = 1.; eToThe[1] = e;
179  fToThe[0] = 1.; fToThe[1] = f;
180  for(int i=2;i<=maxOrder;++i) aToThe[i] = aToThe[i-1]*a;
181  for(int i=2;i<=maxOrder;++i) bToThe[i] = bToThe[i-1]*b;
182  for(int i=2;i<=maxOrder;++i) cToThe[i] = cToThe[i-1]*c;
183  for(int i=2;i<=maxOrder;++i) dToThe[i] = dToThe[i-1]*d;
184  for(int i=2;i<=maxOrder;++i) eToThe[i] = eToThe[i-1]*e;
185  for(int i=2;i<=maxOrder;++i) fToThe[i] = fToThe[i-1]*f;
186  _xOrder = maxOrder; _yOrder = maxOrder;
187 
188  DMatrix binom(maxOrder+1,maxOrder+1);
189  binom(0,0) = 1.0;
190  for(int n=1;n<=maxOrder;++n) {
191  binom(n,0) = 1.0;
192  binom(n,n) = 1.0;
193  for(int m=1;m<n;++m) {
194  binom(n,m) = binom(n-1,m-1) + binom(n-1,m);
195  }
196  }
197 
198  std::auto_ptr<DMatrix> oldCoeffs = _coeffs;
199  _coeffs.reset(new DMatrix(_xOrder+1,_yOrder+1));
200  _coeffs->setZero();
201  for(int i=0;i<=_xOrder;++i) for(int j=0;j<=_yOrder&&i+j<=maxOrder;++j) {
202  for(int k=0;k<=i;++k) for(int l=0;l<=k;++l) {
203  for(int m=0;m<=j;++m) for(int n=0;n<=m;++n) {
204  (*_coeffs)(k-l+m-n,l+n) +=
205  binom(i,k)*binom(k,l)*binom(j,m)*binom(m,n)*
206  aToThe[i-k]*bToThe[k-l]*cToThe[l]*
207  dToThe[j-m]*eToThe[m-n]*fToThe[n]*
208  (*oldCoeffs)(i,j)/scaleToThe[i+j-k-m];
209  }
210  }
211  }
212  }
tuple m
Definition: lsstimport.py:48
afw::table::Key< double > b
void lsst::meas::algorithms::shapelet::Polynomial2D::makeProductOf ( const Polynomial2D f,
const Polynomial2D g 
)

Definition at line 236 of file Function2D.cc.

238  {
239  // h(x,y) = f(x,y) * g(x,y)
240  // = (Sum_ij f_ij x^i y^j) (Sum_mn g_mn x^m y^n)
241  // = Sum_ijmj f_ij g_mn x^(i+m) y^(j+n)
242  Assert(_scale == f._scale);
243  Assert(_scale == g._scale);
244  int newXOrder = f.getXOrder() + g.getXOrder();
245  int newYOrder = f.getYOrder() + g.getYOrder();
246  if (_xOrder != newXOrder || _yOrder != newYOrder) {
247  _xOrder = newXOrder;
248  _yOrder = newYOrder;
249  _coeffs.reset(new DMatrix(_xOrder+1,_yOrder+1));
250  }
251  _coeffs->setZero();
252  for(int i=0;i<=f.getXOrder();++i) for(int j=0;j<=f.getYOrder();++j) {
253  for(int m=0;m<=g.getXOrder();++m) for(int n=0;n<=g.getYOrder();++n) {
254  Assert (i+m <= _xOrder && j+n <= _yOrder);
255  (*_coeffs)(i+m,j+n) += (*f._coeffs)(i,j) * (*g._coeffs)(m,n);
256  }
257  }
258  }
tuple m
Definition: lsstimport.py:48
#define Assert(x)
Definition: dbg.h:73
void lsst::meas::algorithms::shapelet::Polynomial2D::operator+= ( const Function2D rhs)
virtual

Implements lsst::meas::algorithms::shapelet::Function2D.

Definition at line 214 of file Function2D.cc.

215  {
216  const Polynomial2D* prhs = dynamic_cast<const Polynomial2D*>(&rhs);
217  Assert(prhs);
218  Assert(_scale == prhs->_scale);
219  if (_xOrder == prhs->_xOrder && _yOrder == prhs->_yOrder) {
220  *_coeffs += *prhs->_coeffs;
221  } else {
222  int newXOrder = std::max(_xOrder,prhs->_xOrder);
223  int newYOrder = std::max(_yOrder,prhs->_yOrder);
224  std::auto_ptr<DMatrix > newCoeffs(
225  new DMatrix(newXOrder+1,newYOrder+1));
226  newCoeffs->setZero();
227  newCoeffs->TMV_subMatrix(0,_xOrder+1,0,_yOrder+1) = *_coeffs;
228  newCoeffs->TMV_subMatrix(0,prhs->_xOrder+1,0,prhs->_yOrder+1) +=
229  *prhs->_coeffs;
230  _coeffs = newCoeffs;
231  _xOrder = newXOrder;
232  _yOrder = newYOrder;
233  }
234  }
#define Assert(x)
Definition: dbg.h:73
void lsst::meas::algorithms::shapelet::Polynomial2D::setFunction ( int  xOrder,
int  yOrder,
const DVector fVect 
)
virtual

Implements lsst::meas::algorithms::shapelet::Function2D.

Definition at line 63 of file Function2D.cc.

64  {
65  if(_xOrder != xo || _yOrder != yo) {
66  _xOrder = xo; _yOrder = yo;
67  _coeffs.reset(new DMatrix(xo+1,yo+1));
68  _coeffs->setZero();
69  }
70  int k=0;
71 
72  int maxOrder = std::max(xo,yo);
73  for(int m=0;m<=maxOrder;++m) {
74  int i0 = std::min(xo,m);
75  int len = std::min(yo,i0)+1;
76 #ifdef USE_TMV
77  DVectorView coeffDiag = _coeffs->subVector(i0,m-i0,-1,1,len);
78  tmv::ConstVectorView<double> subf = fVect.subVector(k,k+len);
79  coeffDiag = subf;
80 #else
81  for(int i=0;i<len;++i)
82  (*_coeffs)(i0-i,m-i0+i) = fVect(k+i);
83 #endif
84  k += len;
85  }
86 
87  Assert(k==(int)fVect.size());
88  }
Eigen::Block< DVector, Eigen::Dynamic, 1 > DVectorView
Definition: MyMatrix.h:130
tuple m
Definition: lsstimport.py:48
#define Assert(x)
Definition: dbg.h:73
void lsst::meas::algorithms::shapelet::Polynomial2D::write ( std::ostream &  fout) const
virtual

Implements lsst::meas::algorithms::shapelet::Function2D.

Definition at line 122 of file Function2D.cc.

123  {
124  int oldPrec = fout.precision(6);
125  std::ios_base::fmtflags oldf =
126  fout.setf(std::ios_base::scientific,std::ios_base::floatfield);
127  int maxOrder = std::max(_xOrder,_yOrder);
128  if (maxOrder == 0) {
129  fout << "C " << (*_coeffs)(0,0) << std::endl;
130  } else {
131  fout << "P " << _xOrder << ' ' << _yOrder << ' ' << _scale << ' ';
132  for(int m=0;m<=maxOrder;++m) {
133  int i0 = std::min(_xOrder,m);
134  int len = std::min(_yOrder,i0)+1;
135 #ifdef USE_TMV
136  DVectorView coeffDiag = _coeffs->subVector(i0,m-i0,-1,1,len);
137  for(int i=0;i<len;++i) fout << coeffDiag(i) << ' ';
138 #else
139  for(int i=0;i<len;++i) fout << (*_coeffs)(i0-i,m-i0+i);
140 #endif
141  }
142  }
143  fout << std::endl;
144  if (!fout) throw std::runtime_error("writing (polynomial) function");
145  fout.flags(oldf);
146  fout.precision(oldPrec);
147  }
Eigen::Block< DVector, Eigen::Dynamic, 1 > DVectorView
Definition: MyMatrix.h:130
tuple m
Definition: lsstimport.py:48

Member Data Documentation

double lsst::meas::algorithms::shapelet::Polynomial2D::_scale
private

Definition at line 277 of file Function2D.h.


The documentation for this class was generated from the following files: