Coverage for python/lsst/meas/modelfit/priors/priorsContinued.py: 50%

30 statements  

« prev     ^ index     » next       coverage.py v6.4.2, created at 2022-07-23 03:14 -0700

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# 

23 

24__all__ = ("fitMixture", "SemiEmpiricalPriorConfig", 

25 "SoftenedLinearPriorControl") 

26 

27import numpy as np 

28 

29from lsst.pex.config import makeConfigClass 

30from lsst.utils import continueClass 

31 

32from ..mixture import Mixture 

33from .priors import (SemiEmpiricalPriorControl, SemiEmpiricalPrior, 

34 SoftenedLinearPriorControl, SoftenedLinearPrior, 

35 MixturePrior) 

36 

37 

38SemiEmpiricalPriorConfig = makeConfigClass(SemiEmpiricalPriorControl) 

39 

40SoftenedLinearPriorConfig = makeConfigClass(SoftenedLinearPriorControl) 

41 

42 

43@continueClass # noqa: F811 (FIXME: remove for py 3.8+) 

44class SemiEmpiricalPrior: # noqa: F811 

45 

46 ConfigClass = SemiEmpiricalPriorConfig 

47 

48 

49@continueClass # noqa: F811 (FIXME: remove for py 3.8+) 

50class SoftenedLinearPrior: # noqa: F811 

51 

52 ConfigClass = SoftenedLinearPriorConfig 

53 

54 

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. 

59 

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