LSST Applications g0b6bd0c080+a72a5dd7e6,g1182afd7b4+2a019aa3bb,g17e5ecfddb+2b8207f7de,g1d67935e3f+06cf436103,g38293774b4+ac198e9f13,g396055baef+6a2097e274,g3b44f30a73+6611e0205b,g480783c3b1+98f8679e14,g48ccf36440+89c08d0516,g4b93dc025c+98f8679e14,g5c4744a4d9+a302e8c7f0,g613e996a0d+e1c447f2e0,g6c8d09e9e7+25247a063c,g7271f0639c+98f8679e14,g7a9cd813b8+124095ede6,g9d27549199+a302e8c7f0,ga1cf026fa3+ac198e9f13,ga32aa97882+7403ac30ac,ga786bb30fb+7a139211af,gaa63f70f4e+9994eb9896,gabf319e997+ade567573c,gba47b54d5d+94dc90c3ea,gbec6a3398f+06cf436103,gc6308e37c7+07dd123edb,gc655b1545f+ade567573c,gcc9029db3c+ab229f5caf,gd01420fc67+06cf436103,gd877ba84e5+06cf436103,gdb4cecd868+6f279b5b48,ge2d134c3d5+cc4dbb2e3f,ge448b5faa6+86d1ceac1d,gecc7e12556+98f8679e14,gf3ee170dca+25247a063c,gf4ac96e456+ade567573c,gf9f5ea5b4d+ac198e9f13,gff490e6085+8c2580be5c,w.2022.27
LSST Data Management Base Package
modelFitAdapters.py
Go to the documentation of this file.
2# LSST Data Management System
3# Copyright 2008-2013 LSST Corporation.
4#
5# This product includes software developed by the
6# LSST Project (http://www.lsst.org/).
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the LSST License Statement and
19# the GNU General Public License along with this program. If not,
20# see <http://www.lsstcorp.org/LegalNotices/>.
21#
22
23import numpy
24from .densityPlot import mergeDefaults
25from .. import modelfitLib
26
27__all__ = ("SamplingDataAdapter", "OptimizerTrackLayer", "OptimizerDataAdapter",)
28
29
31
32 def __init__(self, record):
33 self.recordrecord = record
34 self.pdfpdf = record.getPdf()
35 self.dimensionsdimensions = list(record.getInterpreter().getParameterNames())
36
37 def eval1d(self, dim, x):
38 i = self.dimensionsdimensions.index(dim)
39 z = numpy.zeros(x.shape, dtype=float)
40 if i >= self.pdfpdf.getDimension():
41 return None
42 projection = self.pdfpdf.project(i)
43 projection.evaluate(x.reshape(x.shape + (1,)), z)
44 return z
45
46 def eval2d(self, xDim, yDim, x, y):
47 i = self.dimensionsdimensions.index(yDim)
48 j = self.dimensionsdimensions.index(xDim)
49 z = numpy.zeros(x.size, dtype=float)
50 if i >= self.pdfpdf.getDimension() or j >= self.pdfpdf.getDimension():
51 return None
52 projection = self.pdfpdf.project(j, i)
53 xy = numpy.zeros((x.size, 2), dtype=float)
54 xy[:, 0] = x.flatten()
55 xy[:, 1] = y.flatten()
56 projection.evaluate(xy, z)
57 return z.reshape(x.shape)
58
59
61
62 def __init__(self, record):
63 ModelFitDataAdapter.__init__(self, record)
64 self.samplessamples = record.getSamples().copy(deep=True)
65 self.valuesvalues = self.samplessamples["parameters"]
66 self.weightsweights = self.samplessamples["weight"]
67 self.setRangesFromQuantilessetRangesFromQuantiles(0.001, 0.999)
68 assert self.valuesvalues.shape[1] == len(self.dimensionsdimensions)
69
70 def setRangesFromQuantiles(self, lower, upper):
71 fractions = numpy.array([lower, upper], dtype=float)
72 ranges = self.recordrecord.getInterpreter().computeParameterQuantiles(self.recordrecord, fractions)
73 self.lowerlower = {dim: ranges[i, 0] for i, dim in enumerate(self.dimensionsdimensions)}
74 self.upperupper = {dim: ranges[i, 1] for i, dim in enumerate(self.dimensionsdimensions)}
75
76
78
79 defaults = dict(
80 accepted=dict(
81 marker='.', linestyle='-', color='c',
82 markevery=(1, 1), # (start, stride): don't put a marker on the first point
83 ),
84 rejected=dict(
85 marker='.', linestyle='-', color='k', alpha=0.5,
86 markevery=3, # marker at every third point, so we only mark the rejected points
87 ),
88 )
89
90 def __init__(self, tag, accepted=None, rejected=None):
91 self.tag = tag
92 self.accepted = mergeDefaults(accepted, self.defaults['accepted'])
93 self.rejected = mergeDefaults(rejected, self.defaults['rejected'])
94
95 def plotX(self, axes, data, dim):
96 pass
97
98 def plotY(self, axes, data, dim):
99 pass
100
101 def plotXY(self, axes, data, xDim, yDim):
102 i = data.dimensions.index(yDim)
103 j = data.dimensions.index(xDim)
104 artists = []
105 artists.extend(axes.plot(data.rejected[:, j], data.rejected[:, i], **self.rejected))
106 artists.extend(axes.plot(data.accepted[:, j], data.accepted[:, i], **self.accepted))
107 return artists
108
109
111
112 def __init__(self, record):
113 ModelFitDataAdapter.__init__(self, record)
114 self.samplessamples = record.getSamples().copy(deep=True)
115 self.parametersparameters = self.samplessamples["parameters"]
116 self.statestate = self.samplessamples["state"]
117 # The first point is neither accepted nor rejected, so we test on rejected and !rejected so
118 # as to include the first point with the accepted points
119 mask = (self.statestate & modelfitLib.Optimizer.STATUS_STEP_REJECTED).astype(bool)
120 self.acceptedaccepted = self.parametersparameters[numpy.logical_not(mask)]
121 # For each rejected point, we have three path points: the rejected point, the last accepted point,
122 # and a NaN to tell matplotlib not to connect to the next one.
123 # Note that the defaults for OptimizerTrackLayer use markevery=3 to only put markers on
124 # the rejected points
125 rejected = []
126 current = self.parametersparameters[0]
127 nans = numpy.array([numpy.nan] * self.parametersparameters.shape[1], dtype=float)
128 for parameters, isRejected in zip(self.parametersparameters, mask):
129 if isRejected:
130 rejected.extend([parameters, current, nans])
131 else:
132 current = parameters
133 self.rejectedrejected = numpy.array(rejected)
134 self.lowerlower = {}
135 self.upperupper = {}
136 for i, dim in enumerate(self.dimensionsdimensions):
137 projected = self.pdfpdf[0].project(i)
138 mu = projected.getMu()
139 sigma = projected.getSigma()**0.5
140 self.lowerlower[dim] = min(self.acceptedaccepted[:, i].min(), mu - 3*sigma)
141 self.upperupper[dim] = max(self.acceptedaccepted[:, i].max(), mu + 3*sigma)
142 # Now we setup some special points for a CrossPointsLayer
143 self.pointspoints = numpy.zeros((2, self.parametersparameters.shape[1]), dtype=float)
144 record.getInterpreter().packParameters(
145 self.recordrecord['initial.nonlinear'], self.recordrecord['initial.amplitudes'],
146 self.pointspoints[0, :]
147 )
148 record.getInterpreter().packParameters(
149 self.recordrecord['fit.nonlinear'], self.recordrecord['fit.amplitudes'],
150 self.pointspoints[1, :]
151 )
int min
int max
daf::base::PropertyList * list
Definition: fits.cc:913
string project
Definition: conf.py:10