32# include "Minuit2/FCNBase.h"
33# include "Minuit2/FunctionMinimum.h"
34# include "Minuit2/MnMigrad.h"
35# include "Minuit2/MnMinos.h"
36# include "Minuit2/MnPrint.h"
47#include "ndarray/eigen.h"
55namespace lsst {
namespace ip {
namespace diffim {
58meas::base::FlagDefinitionList dipoleFluxFlagDefinitions;
61meas::base::FlagDefinition
const DipoleFluxAlgorithm::FAILURE = dipoleFluxFlagDefinitions.addFailureFlag(
"general failure flag, set if anything went wrong");
62meas::base::FlagDefinition
const DipoleFluxAlgorithm::POS_FLAG = dipoleFluxFlagDefinitions.add(
"pos_flag",
"failure flag for positive, set if anything went wrong");
63meas::base::FlagDefinition
const DipoleFluxAlgorithm::NEG_FLAG = dipoleFluxFlagDefinitions.add(
"neg_flag",
"failure flag for negative, set if anything went wrong");
99 ImageT
const& image = *exposure.getMaskedImage().getImage();
101 source.set(keys.getX(), center.getX());
102 source.set(keys.getY(), center.getY());
104 int x = center.getX() - image.getX0();
105 int y = center.getY() - image.getY0();
109 (boost::format(
"Object at (%d, %d) is too close to the edge")
113 ImageT::xy_locator im = image.xy_at(x, y);
116 (im(-1, 1) + im( 0, 1) + im( 1, 1) +
117 im(-1, 0) + im( 0, 0) + im( 1, 0) +
118 im(-1, -1) + im( 0, -1) + im( 1, -1));
123 (boost::format(
"Object at (%d, %d) has no counts") %
128 -im(-1, 1) + im( 1, 1) +
129 -im(-1, 0) + im( 1, 0) +
130 -im(-1, -1) + im( 1, -1);
132 (im(-1, 1) + im( 0, 1) + im( 1, 1)) -
133 (im(-1, -1) + im( 0, -1) + im( 1, -1));
137 source.set(keys.getX(), xx);
138 source.set(keys.getY(), yy);
218class NaiveDipoleFootprinter {
220 explicit NaiveDipoleFootprinter() : _sumPositive(0.0), _sumNegative(0.0), _numPositive(0),
225 _sumPositive = _sumNegative = 0.0;
226 _numPositive = _numNegative = 0;
235 _sumPositive += ival;
236 _varPositive += vval;
239 _sumNegative += ival;
240 _varPositive += vval;
245 double getSumPositive()
const {
return _sumPositive; }
246 double getSumNegative()
const {
return _sumNegative; }
247 double getVarPositive()
const {
return _sumPositive; }
248 double getVarNegative()
const {
return _sumNegative; }
249 int getNumPositive()
const {
return _numPositive; }
250 int getNumNegative()
const {
return _numNegative; }
273 NaiveDipoleFootprinter
functor;
274 source.getFootprint()->getSpans()->applyFunctor(
functor, *(exposure.getMaskedImage().getImage()),
275 *(exposure.getMaskedImage().getVariance()));
279 source.set(_numPositiveKey,
functor.getNumPositive());
283 source.set(_numNegativeKey,
functor.getNumNegative());
308 double Up()
const {
return _errorDef; }
330 double chi2 = fit.first;
331 int nPix = fit.second;
332 if (
nPix > _maxPix) {
374 footprint->getBBox());
426 (boost::format(
"No footprint for source %d") % source.getId()).str());
433 (boost::format(
"No peak for source %d") % source.getId()).str());
447 ROOT::Minuit2::MnUserParameters
fitPar;
489 int nPix = fit.second;
table::Key< std::string > name
#define LSST_EXCEPT(type,...)
Intermediate base class for algorithms that compute a centroid.
static meas::base::FlagDefinition const FAILURE
static meas::base::FlagDefinition const POS_FLAG
static meas::base::FlagDefinition const NEG_FLAG
static meas::base::FlagDefinitionList const & getFlagDefinitions()
static meas::base::FlagDefinitionList const & getFlagDefinitions()
ResultKey const & getPositiveKeys() const
Return the standard flux keys registered by this algorithm.
static meas::base::FlagDefinition const POS_FLAG
static meas::base::FlagDefinition const NEG_FLAG
ResultKey const & getNegativeKeys() const
meas::base::FlagHandler _flagHandler
static meas::base::FlagDefinition const FAILURE
Class to minimize PsfDipoleFlux; this is the object that Minuit minimizes.
void setMaxPix(int maxPix)
void setErrorDef(double def)
virtual double operator()(std::vector< double > const ¶ms) const
MinimizeDipoleChi2(PsfDipoleFlux const &psfDipoleFlux, afw::table::SourceRecord &source, afw::image::Exposure< float > const &exposure)
ResultKey const & getPositiveKeys() const
ResultKey const & getNegativeKeys() const
NaiveDipoleCentroid(Control const &ctrl, std::string const &name, afw::table::Schema &schema)
void measure(afw::table::SourceRecord &measRecord, afw::image::Exposure< float > const &exposure) const
Given an image and a pixel position, return a Centroid using a naive 3x3 weighted moment.
void mergeCentroids(afw::table::SourceRecord &source, double posValue, double negValue) const
void fail(afw::table::SourceRecord &measRecord, meas::base::MeasurementError *error=NULL) const
ResultKey const & getCenterKeys() const
Return the standard centroid keys registered by this algorithm.
void measure(afw::table::SourceRecord &measRecord, afw::image::Exposure< float > const &exposure) const
Given an image and a pixel position, return a Centroid using a naive 3x3 weighted moment.
void fail(afw::table::SourceRecord &measRecord, meas::base::MeasurementError *error=NULL) const
float stepSizeCoord
"Default initial step size for coordinates in non-linear fitter" ;
double errorDef
"How many sigma the error bars of the non-linear fitter represent" ;
float stepSizeFlux
"Default initial step size for flux in non-linear fitter" ;
int maxFnCalls
"Maximum function calls for non-linear fitter; 0 = unlimited" ;
Implementation of Psf dipole flux.
std::pair< double, int > chi2(afw::table::SourceRecord &source, afw::image::Exposure< float > const &exposure, double negCenterX, double negCenterY, double negFlux, double posCenterX, double poCenterY, double posFlux) const
void measure(afw::table::SourceRecord &measRecord, afw::image::Exposure< float > const &exposure) const
void fail(afw::table::SourceRecord &measRecord, meas::base::MeasurementError *error=NULL) const
Asseses the quality of a candidate given a spatial kernel and background model.
afw::table::Key< CentroidElement > getX() const
afw::table::Key< CentroidElement > getY() const
void handleFailure(afw::table::BaseRecord &record, MeasurementError const *error=nullptr) const
afw::table::CatalogT< PeakRecord > PeakCatalog
double indexToPosition(double ind)
Statistics makeStatistics(lsst::afw::image::Image< Pixel > const &img, lsst::afw::image::Mask< image::MaskPixel > const &msk, int const flags, StatisticsControl const &sctrl=StatisticsControl())