lsst.meas.modelfit  13.0-9-g2ccb577+7
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Pages
DoubleShapeletPsfApprox.h
Go to the documentation of this file.
1 // -*- lsst-c++ -*-
2 /*
3  * LSST Data Management System
4  * Copyright 2008-2016 LSST/AURA.
5  *
6  * This product includes software developed by the
7  * LSST Project (http://www.lsst.org/).
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the LSST License Statement and
20  * the GNU General Public License along with this program. If not,
21  * see <http://www.lsstcorp.org/LegalNotices/>.
22  */
23 
24 #ifndef LSST_MEAS_MODELFIT_DoubleShapeletPsfApprox_h_INCLUDED
25 #define LSST_MEAS_MODELFIT_DoubleShapeletPsfApprox_h_INCLUDED
26 
27 #include "lsst/shapelet/FunctorKeys.h"
28 #include "lsst/meas/base/Algorithm.h"
29 #include "lsst/meas/base/InputUtilities.h"
31 
32 namespace lsst { namespace meas { namespace modelfit {
33 
38 public:
39 
41  innerOrder(2), outerOrder(1),
42  radiusRatio(2.0), peakRatio(0.1),
44  {}
45 
46  LSST_CONTROL_FIELD(innerOrder, int, "Shapelet order of inner expansion (0 == Gaussian)");
47 
48  LSST_CONTROL_FIELD(outerOrder, int, "Shapelet order of outer expansion (0 == Gaussian)");
49 
50  LSST_CONTROL_FIELD(radiusRatio, double, "Initial outer radius divided by inner radius");
51 
52  LSST_CONTROL_FIELD(
53  peakRatio, double,
54  "Initial outer Gaussian peak height divided by inner Gaussian peak height"
55  );
56 
57  LSST_CONTROL_FIELD(
58  minRadius, double,
59  "Don't allow the semi-minor radius of any component to drop below this value (pixels)"
60  );
61 
62  LSST_CONTROL_FIELD(
63  minRadiusDiff, double,
64  "Don't allow the determinant radii of the two components to differ by less than this (pixels)"
65  );
66 
67  LSST_CONTROL_FIELD(
68  maxRadiusBoxFraction, double,
69  "Don't allow the semi-major radius of any component to go above this fraction of the PSF image width"
70  );
71 
72  LSST_NESTED_CONTROL_FIELD(
73  optimizer, lsst.meas.modelfit.optimizer, OptimizerControl,
74  "Configuration of the optimizer used by DoubleShapeletPsfsApproxAlgorithm::fitProfile()."
75  );
76 
77 };
78 
79 
95 class DoubleShapeletPsfApproxAlgorithm : public meas::base::SimpleAlgorithm {
96 public:
97 
98  // Structures and routines to manage flaghandler
99  static base::FlagDefinitionList const & getFlagDefinitions();
100  static base::FlagDefinition const FAILURE;
101  static base::FlagDefinition const INVALID_POINT_FOR_PSF;
102  static base::FlagDefinition const INVALID_MOMENTS;
103  static base::FlagDefinition const MAX_ITERATIONS;
104 
106 
108 
124  Control const & ctrl,
125  std::string const & name,
126  afw::table::Schema & schema
127  );
128 
136  static shapelet::MultiShapeletFunction initializeResult(Control const & ctrl);
137 
161  static void fitMoments(
162  shapelet::MultiShapeletFunction & result,
163  Control const & ctrl,
164  afw::image::Image<Scalar> const & psfImage
165  );
166 
194  static PTR(OptimizerObjective) makeObjective(
195  afw::geom::ellipses::Ellipse const & moments,
196  Control const & ctrl,
197  afw::image::Image<Scalar> const & psfImage
198  );
199 
200 
217  static void fitProfile(
218  shapelet::MultiShapeletFunction & result,
219  Control const & ctrl,
220  afw::image::Image<Scalar> const & psfImage
221  );
222 
237  static void fitShapelets(
238  shapelet::MultiShapeletFunction & result,
239  Control const & ctrl,
240  afw::image::Image<Scalar> const & psfImage
241  );
242 
248  void measure(
249  afw::table::SourceRecord & measRecord,
250  afw::image::Exposure<float> const & exposure
251  ) const;
252 
256  void fail(
257  afw::table::SourceRecord & measRecord,
258  lsst::meas::base::MeasurementError * error=nullptr
259  ) const;
260 
261 private:
262  Control _ctrl;
263  meas::base::SafeCentroidExtractor _centroidExtractor;
264  shapelet::MultiShapeletFunctionKey _key;
265  lsst::meas::base::FlagHandler _flagHandler;
266 };
267 
268 }}} // namespace lsst::meas::modelfit
269 
270 #endif // !LSST_MEAS_MODELFIT_DoubleShapeletPsfApprox_h_INCLUDED
DoubleShapeletPsfApproxAlgorithm(Control const &ctrl, std::string const &name, afw::table::Schema &schema)
Failure modes passed by MeasurementErrors thrown by this class.
void measure(afw::table::SourceRecord &measRecord, afw::image::Exposure< float > const &exposure) const
Run all fitting stages on the Psf attached to the given Exposure, saving the results in measRecord...
OptimizerControl optimizer
&quot;Configuration of the optimizer used by DoubleShapeletPsfsApproxAlgorithm::fitProfile().&quot; ;
Control object used to configure a 2-shapelet fit to a PSF model; see DoubleShapeletPsfApproxAlgorith...
static boost::shared_ptr< OptimizerObjective > makeObjective(afw::geom::ellipses::Ellipse const &moments, Control const &ctrl, afw::image::Image< Scalar > const &psfImage)
Return an Objective object that can be used to fit the profile of the model.
An algorithm that fits a 2-component shapelet approximation to the PSF model.
double Scalar
Typedefs to be used for probability and parameter values.
Definition: common.h:44
static void fitMoments(shapelet::MultiShapeletFunction &result, Control const &ctrl, afw::image::Image< Scalar > const &psfImage)
Update a MultiShapeletFunction&#39;s ellipses to match the first and second moments of a PSF image...
double radiusRatio
&quot;Initial outer radius divided by inner radius&quot; ;
static void fitShapelets(shapelet::MultiShapeletFunction &result, Control const &ctrl, afw::image::Image< Scalar > const &psfImage)
Update a MultiShapeletFunction&#39;s higher-order shapelet terms, holding everything else fixed...
double minRadius
&quot;Don&#39;t allow the semi-minor radius of any component to drop below this value (pixels)&quot; ; ...
static shapelet::MultiShapeletFunction initializeResult(Control const &ctrl)
Create a MultiShapeletFunction with orders and radii and amplitude ratios from the control object...
int innerOrder
&quot;Shapelet order of inner expansion (0 == Gaussian)&quot; ;
static base::FlagDefinitionList const & getFlagDefinitions()
Configuration object for Optimizer.
Definition: optimizer.h:187
int outerOrder
&quot;Shapelet order of outer expansion (0 == Gaussian)&quot; ;
double minRadiusDiff
&quot;Don&#39;t allow the determinant radii of the two components to differ by less than this (pixels)&quot; ; ...
void fail(afw::table::SourceRecord &measRecord, lsst::meas::base::MeasurementError *error=nullptr) const
Handle failures caught by the measurement plugin system, setting failure flags as appropriate...
Base class for objective functions for Optimizer.
Definition: optimizer.h:44
static void fitProfile(shapelet::MultiShapeletFunction &result, Control const &ctrl, afw::image::Image< Scalar > const &psfImage)
Update a MultiShapeletFunction&#39;s zeroth-order profile by fitting radii and amplitudes.
double maxRadiusBoxFraction
&quot;Don&#39;t allow the semi-major radius of any component to go above this fraction of the PSF image width...
double peakRatio
&quot;Initial outer Gaussian peak height divided by inner Gaussian peak height&quot; ;