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"
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");
66 return dipoleFluxFlagDefinitions;
78 return dipoleCentroidFlagDefinitions;
101 _psfDipoleFlux(psfDipoleFlux),
105 double Up()
const {
return _errorDef; }
121 if ((negFlux > 0.0) || (posFlux < 0.0)) {
126 posCenterX, posCenterY, posFlux);
127 double chi2 = fit.first;
128 int nPix = fit.second;
129 if (nPix > _maxPix) {
151 double negCenterX,
double negCenterY,
double negFlux,
152 double posCenterX,
double posCenterY,
double posFlux
171 footprint->getBBox());
187 negModelSubim += negSubim;
198 posModelSubim += posSubim;
203 residuals += posModel;
205 residuals *= residuals;
223 (boost::format(
"No footprint for source %d") % source.getId()).str());
228 if (peakCatalog.
size() == 0) {
230 (boost::format(
"No peak for source %d") % source.getId()).str());
232 else if (peakCatalog.
size() == 1) {
244 ROOT::Minuit2::MnUserParameters fitPar;
246 fitPar.Add((boost::format(
"P%d")%
NEGCENTXPAR).str(), negativePeak.
getFx(), _ctrl.stepSizeCoord);
247 fitPar.Add((boost::format(
"P%d")%
NEGCENTYPAR).str(), negativePeak.
getFy(), _ctrl.stepSizeCoord);
249 fitPar.Add((boost::format(
"P%d")%
POSCENTXPAR).str(), positivePeak.
getFx(), _ctrl.stepSizeCoord);
250 fitPar.Add((boost::format(
"P%d")%
POSCENTYPAR).str(), positivePeak.
getFy(), _ctrl.stepSizeCoord);
261 ROOT::Minuit2::MnMigrad migrad(minimizerFunc, fitPar);
266 ROOT::Minuit2::FunctionMinimum min = migrad(_ctrl.maxFnCalls);
268 float minChi2 = min.Fval();
269 bool const isValid = min.IsValid() &&
std::isfinite(minChi2);
271 if (
true || isValid) {
285 double evalChi2 = fit.first;
286 int nPix = fit.second;
298 source.set(_chi2dofKey, evalChi2 / (nPix - minimizerFunc.
getNpar()));
299 source.set(_negCentroid.getX(), minNegCentroid->getX());
300 source.set(_negCentroid.getY(), minNegCentroid->getY());
301 source.set(_posCentroid.getX(), minPosCentroid->getX());
302 source.set(_posCentroid.getY(), minPosCentroid->getY());
303 source.set(_avgCentroid.getX(), 0.5*(minNegCentroid->getX() + minPosCentroid->getX()));
304 source.set(_avgCentroid.getY(), 0.5*(minNegCentroid->getY() + minPosCentroid->getY()));
#define LSST_EXCEPT(type,...)
float getPeakValue() const
MaskedImageT getMaskedImage()
std::shared_ptr< lsst::afw::detection::Psf const > getPsf() const
MaskedImage< ImageT, MaskT, VarianceT > MaskedImageT
lsst::geom::Box2I getBBox(ImageOrigin origin=PARENT) const
VariancePtr getVariance() const
ImagePtr getImage() const
double getValue(Property const prop=NOTHING) const
int getMinY() const noexcept
int getMinX() const noexcept
int getMaxX() const noexcept
int getMaxY() const noexcept
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)
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
afw::table::CatalogT< PeakRecord > PeakCatalog
Statistics makeStatistics(lsst::afw::image::Image< Pixel > const &img, lsst::afw::image::Mask< image::MaskPixel > const &msk, int const flags, StatisticsControl const &sctrl=StatisticsControl())
Point< double, 2 > Point2D