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

29 statements  

« prev     ^ index     » next       coverage.py v7.5.0, created at 2024-05-01 16:48 -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 .._modelfitLib import (Mixture, SemiEmpiricalPriorControl, SemiEmpiricalPrior, 

33 SoftenedLinearPriorControl, SoftenedLinearPrior, 

34 MixturePrior) 

35 

36 

37SemiEmpiricalPriorConfig = makeConfigClass(SemiEmpiricalPriorControl) 

38 

39SoftenedLinearPriorConfig = makeConfigClass(SoftenedLinearPriorControl) 

40 

41 

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

43class SemiEmpiricalPrior: # noqa: F811 

44 

45 ConfigClass = SemiEmpiricalPriorConfig 

46 

47 

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

49class SoftenedLinearPrior: # noqa: F811 

50 

51 ConfigClass = SoftenedLinearPriorConfig 

52 

53 

54def fitMixture(data, nComponents, minFactor=0.25, maxFactor=4.0, 

55 nIterations=20, df=float("inf")): 

56 """Fit a ``Mixture`` distribution to a set of (e1, e2, r) data points, 

57 returing a ``MixturePrior`` object. 

58 

59 Parameters 

60 ---------- 

61 data : numpy.ndarray 

62 array of data points to fit; shape=(N,3) 

63 nComponents : int 

64 number of components in the mixture distribution 

65 minFactor : float 

66 ellipticity variance of the smallest component in the initial mixture, 

67 relative to the measured variance 

68 maxFactor : float 

69 ellipticity variance of the largest component in the initial mixture, 

70 relative to the measured variance 

71 nIterations : int 

72 number of expectation-maximization update iterations 

73 df : float 

74 number of degrees of freedom for component Student's T distributions 

75 (inf=Gaussian). 

76 """ 

77 components = Mixture.ComponentList() 

78 rMu = data[:, 2].mean() 

79 rSigma = data[:, 2].var() 

80 eSigma = 0.5*(data[:, 0].var() + data[:, 1].var()) 

81 mu = np.array([0.0, 0.0, rMu], dtype=float) 

82 baseSigma = np.array([[eSigma, 0.0, 0.0], 

83 [0.0, eSigma, 0.0], 

84 [0.0, 0.0, rSigma]]) 

85 for factor in np.linspace(minFactor, maxFactor, nComponents): 

86 sigma = baseSigma.copy() 

87 sigma[:2, :2] *= factor 

88 components.append(Mixture.Component(1.0, mu, sigma)) 

89 mixture = Mixture(3, components, df) 

90 restriction = MixturePrior.getUpdateRestriction() 

91 for i in range(nIterations): 

92 mixture.updateEM(data, restriction) 

93 return mixture