Coverage for python/lsst/meas/modelfit/priors/priorsContinued.py: 50%
30 statements
« prev ^ index » next coverage.py v6.5.0, created at 2023-01-18 02:34 -0800
« prev ^ index » next coverage.py v6.5.0, created at 2023-01-18 02:34 -0800
1#!/usr/bin/env python
2#
3# LSST Data Management System
4# Copyright 2008-2013 LSST Corporation.
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#
24__all__ = ("fitMixture", "SemiEmpiricalPriorConfig",
25 "SoftenedLinearPriorControl")
27import numpy as np
29from lsst.pex.config import makeConfigClass
30from lsst.utils import continueClass
32from ..mixture import Mixture
33from .priors import (SemiEmpiricalPriorControl, SemiEmpiricalPrior,
34 SoftenedLinearPriorControl, SoftenedLinearPrior,
35 MixturePrior)
38SemiEmpiricalPriorConfig = makeConfigClass(SemiEmpiricalPriorControl)
40SoftenedLinearPriorConfig = makeConfigClass(SoftenedLinearPriorControl)
43@continueClass # noqa: F811 (FIXME: remove for py 3.8+)
44class SemiEmpiricalPrior: # noqa: F811
46 ConfigClass = SemiEmpiricalPriorConfig
49@continueClass # noqa: F811 (FIXME: remove for py 3.8+)
50class SoftenedLinearPrior: # noqa: F811
52 ConfigClass = SoftenedLinearPriorConfig
55def fitMixture(data, nComponents, minFactor=0.25, maxFactor=4.0,
56 nIterations=20, df=float("inf")):
57 """Fit a ``Mixture`` distribution to a set of (e1, e2, r) data points,
58 returing a ``MixturePrior`` object.
60 Parameters
61 ----------
62 data : numpy.ndarray
63 array of data points to fit; shape=(N,3)
64 nComponents : int
65 number of components in the mixture distribution
66 minFactor : float
67 ellipticity variance of the smallest component in the initial mixture,
68 relative to the measured variance
69 maxFactor : float
70 ellipticity variance of the largest component in the initial mixture,
71 relative to the measured variance
72 nIterations : int
73 number of expectation-maximization update iterations
74 df : float
75 number of degrees of freedom for component Student's T distributions
76 (inf=Gaussian).
77 """
78 components = Mixture.ComponentList()
79 rMu = data[:, 2].mean()
80 rSigma = data[:, 2].var()
81 eSigma = 0.5*(data[:, 0].var() + data[:, 1].var())
82 mu = np.array([0.0, 0.0, rMu], dtype=float)
83 baseSigma = np.array([[eSigma, 0.0, 0.0],
84 [0.0, eSigma, 0.0],
85 [0.0, 0.0, rSigma]])
86 for factor in np.linspace(minFactor, maxFactor, nComponents):
87 sigma = baseSigma.copy()
88 sigma[:2, :2] *= factor
89 components.append(Mixture.Component(1.0, mu, sigma))
90 mixture = Mixture(3, components, df)
91 restriction = MixturePrior.getUpdateRestriction()
92 for i in range(nIterations):
93 mixture.updateEM(data, restriction)
94 return mixture