33 # include "Minuit2/FCNBase.h" 34 # include "Minuit2/FunctionMinimum.h" 35 # include "Minuit2/MnMigrad.h" 36 # include "Minuit2/MnMinos.h" 37 # include "Minuit2/MnPrint.h" 48 #include "ndarray/eigen.h" 56 namespace lsst {
namespace ip {
namespace diffim {
59 meas::base::FlagDefinitionList dipoleFluxFlagDefinitions;
62 meas::base::FlagDefinition
const DipoleFluxAlgorithm::FAILURE = dipoleFluxFlagDefinitions.addFailureFlag(
"general failure flag, set if anything went wrong");
63 meas::base::FlagDefinition
const DipoleFluxAlgorithm::POS_FLAG = dipoleFluxFlagDefinitions.add(
"pos_flag",
"failure flag for positive, set if anything went wrong");
64 meas::base::FlagDefinition
const DipoleFluxAlgorithm::NEG_FLAG = dipoleFluxFlagDefinitions.add(
"neg_flag",
"failure flag for negative, set if anything went wrong");
67 return dipoleFluxFlagDefinitions;
79 return dipoleCentroidFlagDefinitions;
102 source.
set(keys.
getX(), center.getX());
103 source.
set(keys.
getY(), center.getY());
105 int x = center.getX() - image.getX0();
106 int y = center.getY() - image.getY0();
108 if (x < 1 || x >= image.getWidth() - 1 || y < 1 || y >= image.getHeight() - 1) {
110 (
boost::format(
"Object at (%d, %d) is too close to the edge")
114 ImageT::xy_locator im = image.xy_at(x, y);
117 (im(-1, 1) + im( 0, 1) + im( 1, 1) +
118 im(-1, 0) + im( 0, 0) + im( 1, 0) +
119 im(-1, -1) + im( 0, -1) + im( 1, -1));
129 -im(-1, 1) + im( 1, 1) +
130 -im(-1, 0) + im( 1, 0) +
131 -im(-1, -1) + im( 1, -1);
133 (im(-1, 1) + im( 0, 1) + im( 1, 1)) -
134 (im(-1, -1) + im( 0, -1) + im( 1, -1));
163 double posValue = peaks[posInd].getPeakValue(), negValue = 0;
165 posInd = peaks.
size() - 1;
166 posValue = peaks[posInd].getPeakValue();
171 if (posValue > 0. && posInd == 0 && peaks.
size() > 1) {
172 int negInd = peaks.
size() - 1;
173 negValue = peaks[negInd].getPeakValue();
174 if (posValue > 0. && negValue < 0.) {
185 double posValue,
double negValue)
const {
187 double pos_x, pos_y, pos_f;
188 double neg_x, neg_y, neg_f;
200 source.
set(
getCenterKeys().getX(), (pos_x * pos_f + neg_x * neg_f) / (pos_f + neg_f));
201 source.
set(
getCenterKeys().getY(), (pos_y * pos_f + neg_y * neg_f) / (pos_f + neg_f));
219 class NaiveDipoleFootprinter {
221 explicit NaiveDipoleFootprinter() : _sumPositive(0.0), _sumNegative(0.0), _numPositive(0),
226 _sumPositive = _sumNegative = 0.0;
227 _numPositive = _numNegative = 0;
236 _sumPositive += ival;
237 _varPositive += vval;
240 _sumNegative += ival;
241 _varPositive += vval;
246 double getSumPositive()
const {
return _sumPositive; }
247 double getSumNegative()
const {
return _sumNegative; }
248 double getVarPositive()
const {
return _sumPositive; }
249 double getVarNegative()
const {
return _sumNegative; }
250 int getNumPositive()
const {
return _numPositive; }
251 int getNumNegative()
const {
return _numNegative; }
274 NaiveDipoleFootprinter functor;
280 source.
set(_numPositiveKey, functor.getNumPositive());
284 source.
set(_numNegativeKey, functor.getNumNegative());
289 _flagHandler.handleFailure(measRecord, error);
305 _psfDipoleFlux(psfDipoleFlux),
309 double Up()
const {
return _errorDef; }
325 if ((negFlux > 0.0) || (posFlux < 0.0)) {
330 posCenterX, posCenterY, posFlux);
331 double chi2 = fit.first;
332 int nPix = fit.second;
333 if (nPix > _maxPix) {
355 double negCenterX,
double negCenterY,
double negFlux,
356 double posCenterX,
double posCenterY,
double posFlux
391 negModelSubim += negSubim;
402 posModelSubim += posSubim;
407 residuals += posModel;
409 residuals *= residuals;
432 if (peakCatalog.size() == 0) {
436 else if (peakCatalog.size() == 1) {
448 ROOT::Minuit2::MnUserParameters fitPar;
465 ROOT::Minuit2::MnMigrad migrad(minimizerFunc, fitPar);
470 ROOT::Minuit2::FunctionMinimum
min = migrad(_ctrl.maxFnCalls);
472 float minChi2 = min.Fval();
475 if (
true || isValid) {
483 min.UserState().Value(NEGCENTXPAR),
484 min.UserState().Value(NEGCENTYPAR),
485 min.UserState().Value(NEGFLUXPAR),
486 min.UserState().Value(POSCENTXPAR),
487 min.UserState().Value(POSCENTYPAR),
488 min.UserState().Value(POSFLUXPAR));
489 double evalChi2 = fit.first;
490 int nPix = fit.second;
493 min.UserState().Value(NEGCENTYPAR)));
498 min.UserState().Value(POSCENTYPAR)));
502 source.
set(_chi2dofKey, evalChi2 / (nPix - minimizerFunc.
getNpar()));
503 source.
set(_negCentroid.getX(), minNegCentroid->getX());
504 source.
set(_negCentroid.getY(), minNegCentroid->getY());
505 source.
set(_posCentroid.getX(), minPosCentroid->getX());
506 source.
set(_posCentroid.getY(), minPosCentroid->getY());
507 source.
set(_avgCentroid.getX(), 0.5*(minNegCentroid->getX() + minPosCentroid->getX()));
508 source.
set(_avgCentroid.getY(), 0.5*(minNegCentroid->getY() + minPosCentroid->getY()));
514 _flagHandler.handleFailure(measRecord, error);
Defines the fields and offsets for a table.
VariancePtr getVariance() const
Return a (shared_ptr to) the MaskedImage's variance.
DipoleFluxControl Control
A typedef to the Control object for this algorithm, defined above.
Implementation of Psf dipole flux.
double indexToPosition(double ind)
Convert image index to image position.
RecordId getId() const
Convenience accessors for the keys in the minimal reference schema.
#define CONST_PTR(...)
A shared pointer to a const object.
Simple class used to define and document flags The name and doc constitute the identity of the FlagDe...
Reports attempts to exceed implementation-defined length limits for some classes. ...
PixelT Pixel
A pixel in this ImageBase.
std::shared_ptr< Footprint > getFootprint() const
MinimizeDipoleChi2(PsfDipoleFlux const &psfDipoleFlux, afw::table::SourceRecord &source, afw::image::Exposure< float > const &exposure)
afw::table::Key< CentroidElement > getY() const
Return a Key for the y coordinate.
static meas::base::FlagDefinition const FAILURE
void fail(afw::table::SourceRecord &measRecord, meas::base::MeasurementError *error=NULL) const
Handle an exception thrown by the current algorithm by setting flags in the given record...
Exception to be thrown when a measurement algorithm experiences a known failure mode.
Field< T >::Value get(Key< T > const &key) const
Return the value of a field for the given key.
ResultKey const & getCenterKeys() const
Return the standard centroid keys registered by this algorithm.
static meas::base::FlagDefinition const POS_FLAG
float getPeakValue() const
Convenience accessors for the keys in the minimal schema.
A class to evaluate image statistics.
ImagePtr getImage() const
Return a (shared_ptr to) the MaskedImage's image.
void setErrorDef(double def)
static meas::base::FlagDefinitionList const & getFlagDefinitions()
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...
A base class for image defects.
afw::table::CatalogT< PeakRecord > PeakCatalog
MaskedImageT getMaskedImage()
Return the MaskedImage.
void fail(afw::table::SourceRecord &measRecord, meas::base::MeasurementError *error=NULL) const
Handle an exception thrown by the current algorithm by setting flags in the given record...
ResultKey const & getNegativeKeys() const
Class to minimize PsfDipoleFlux; this is the object that Minuit minimizes.
int getMaxY() const noexcept
Statistics makeStatistics(lsst::afw::image::Image< Pixel > const &img, lsst::afw::image::Mask< image::MaskPixel > const &msk, int const flags, StatisticsControl const &sctrl=StatisticsControl())
Handle a watered-down front-end to the constructor (no variance)
void fail(afw::table::SourceRecord &measRecord, meas::base::MeasurementError *error=NULL) const
Handle an exception thrown by the current algorithm by setting flags in the given record...
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
virtual double operator()(std::vector< double > const ¶ms) const
NaiveDipoleCentroid(Control const &ctrl, std::string const &name, afw::table::Schema &schema)
static meas::base::FlagDefinition const POS_FLAG
static meas::base::FlagDefinition const FAILURE
const char * source()
Source function that allows astChannel to source from a Stream.
void setMaxPix(int maxPix)
int getMaxX() const noexcept
double getValue(Property const prop=NOTHING) const
Return the value of the desired property (if specified in the constructor)
Intermediate base class for algorithms that compute a centroid.
int getMinX() const noexcept
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
afw::table::Key< CentroidElement > getX() const
Return a Key for the x coordinate.
void measure(afw::table::SourceRecord &measRecord, afw::image::Exposure< float > const &exposure) const
Called to measure a single child source in an image.
std::shared_ptr< lsst::afw::detection::Psf > getPsf()
Return the Exposure's Psf object.
void handleFailure(afw::table::BaseRecord &record, MeasurementError const *error=nullptr) const
Handle an expected or unexpected Exception thrown by a measurement algorithm.
ResultKey const & getPositiveKeys() const
A FunctorKey for CentroidResult.
void set(Key< T > const &key, U const &value)
Set value of a field for the given key.
size_type size() const
Return the number of elements in the catalog.
Record class that contains measurements made on a single exposure.
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...
find sum of pixels in the image
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects...
vector-type utility class to build a collection of FlagDefinitions
A polymorphic base class for representing an image's Point Spread Function.
Record class that represents a peak in a Footprint.
static meas::base::FlagDefinition const NEG_FLAG
An integer coordinate rectangle.
A class to represent a 2-dimensional array of pixels.
float getFy() const
Convenience accessors for the keys in the minimal schema.
int getMinY() const noexcept
static meas::base::FlagDefinition const NEG_FLAG
T Value
The data type for get and set.
static meas::base::FlagDefinitionList const & getFlagDefinitions()
Reports errors that are due to events beyond the control of the program.
void mergeCentroids(afw::table::SourceRecord &source, double posValue, double negValue) const
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
float getFx() const
Convenience accessors for the keys in the minimal schema.