1 from past.builtins
import basestring
2 from builtins
import object
34 from ..measureCcd
import MeasureCcdTask
35 from ..measureCoadd
import MeasureCoaddTask
36 from ..measureMulti
import MeasureMultiTask
37 from ..
import modelfitLib
39 from .densityPlot
import CrossPointsLayer, DensityPlot, HistogramLayer, SurfaceLayer
40 from .modelFitAdapters
import OptimizerDataAdapter, OptimizerTrackLayer, SamplingDataAdapter
41 from .optimizerDisplay
import OptimizerDisplay
43 __all__ = (
"Interactive", )
47 """Interactive analysis helper class 49 This class manages a butler, calexp, modelfits catalog, and an instance 50 of a Measure*Task, allowing individual objects to be re-fit and plotted. 53 def __init__(self, root, tag=None, config=None, dataId=None, mode="ccd"):
54 """Construct an interactive analysis object. 56 @param[in] rerun Output directory, relative to $S13_DATA_DIR/output. 57 measureCcd.py (or measureCoadd.py if mode='coadd') must 58 have been run (possibly with prepOnly=True) previously 59 with this output directory. 60 @param[in] tag Tag associated with the run; see BaseMeasureConfig.tag. 61 If None, config must not be (and config.tag will be used). 62 @param[in] config ConfigClass instance; if None, it will be loaded from disk. 63 @param[in] dataId Butler data ID of the image to analyze. 64 @param[in] mode One of "ccd", "coadd", or "multi", indicating whether 65 to use MeasureCcdTask, MeasureCoaddTask, or MeasureMultiTask. 68 self.
butler = lsst.daf.persistence.Butler(root)
71 if self.
mode ==
"ccd":
73 dataId = dict(visit=100, raft=
"2,2", sensor=
"1,1")
75 configName =
"measureCcd_config" 76 TaskClass = MeasureCcdTask
77 elif self.
mode ==
"coadd":
79 dataId = dict(tract=0, patch=
"2,2", filter=
"i")
81 configName =
"deep_measureCoadd_config" 82 TaskClass = MeasureCoaddTask
83 elif self.
mode.startswith(
"multi"):
85 dataId = dict(tract=0, patch=
"2,2", filter=
"i")
87 configName =
"deep_measureMulti_config" 88 TaskClass = MeasureMultiTask
90 config = self.
butler.get(configName, tag=tag, immediate=
True)
94 raise ValueError(
"tag and config arguments cannot both be None")
97 config.tag =
"intermediate" 102 """Re-fit the object indicated by the given record sequential index or source ID, 103 returning the record. 105 likelihood = self.
task.makeLikelihood(self.
inputs, outRecord)
106 self.
task.fitter.run(likelihood, outRecord)
110 """Plot a representation of the posterior distribution from a ModelFitRecord. 113 recordId = records[0].getId()
114 figure = matplotlib.pyplot.figure(recordId, figsize=(10, 10))
117 for record
in records:
118 assert record.getId() == recordId
119 if modelfitLib.MarginalSamplingInterpreter.cast(record.getInterpreter()):
123 elif modelfitLib.DirectSamplingInterpreter.cast(record.getInterpreter()):
127 elif modelfitLib.OptimizerInterpreter.cast(record.getInterpreter()):
131 kwds1d=dict(color=
'g'),
132 kwds2d=dict(cmap=matplotlib.cm.Greens))
135 raise ValueError(
"Unknown or missing interpreter")
137 p.layers.update(layers)
142 likelihood = self.
task.makeLikelihood(self.
inputs, record)
143 objective = modelfitLib.OptimizerObjective.makeFromLikelihood(likelihood, self.
task.prior)
146 def displayResiduals(self, record, nonlinear="fit", amplitudes="fit", doApplyWeights=False):
147 """Display the data postage stamp along with the model image and residuals in ds9. 149 @param[in] record ModelFitRecord defining the object to display 150 @param[in] nonlinear Vector of nonlinear parameters, or a string prefix (see below) 151 @param[in] amplitudes Vector of linear parameters, or a string prefix (see below) 152 @param[in] doApplyWeights Whether to show the weighted images used directly in the fit 153 or the original unweighted data. 155 String prefixes are used to extract the parameters from the record. Usually the following 157 fit ------- use record.get("fit.*"); the best-fit parameters 158 initial --- use record.get("initial.*"); the initial parameters 160 likelihood = self.
task.makeLikelihood(self.
inputs, record)
162 if isinstance(nonlinear, basestring):
163 nonlinear = record.get(nonlinear +
".nonlinear")
165 assert nonlinear.shape == (likelihood.getNonlinearDim(),)
167 matrix = numpy.zeros((likelihood.getAmplitudeDim(), likelihood.getDataDim()),
168 dtype=modelfitLib.Pixel).transpose()
169 likelihood.computeModelMatrix(matrix, nonlinear, doApplyWeights)
171 if isinstance(amplitudes, basestring):
172 amplitudes = record.get(amplitudes +
".amplitudes")
174 assert amplitudes.shape == (likelihood.getAmplitudeDim(),)
176 bbox = record.getFootprint().getBBox()
178 flatModel = numpy.zeros(likelihood.getDataDim(), dtype=modelfitLib.Pixel)
179 flatModel[:] = numpy.dot(matrix, amplitudes)
181 imgData = lsst.afw.image.MaskedImageF(self.
inputs.exposure.getMaskedImage(), bbox,
182 lsst.afw.image.PARENT,
True)
183 bitmask = imgData.getMask().addMaskPlane(
"FIT_REGION")
184 regionMask = lsst.afw.image.MaskU(bbox)
185 lsst.afw.detection.setMaskFromFootprint(regionMask, record.getFootprint(), bitmask)
186 dataMask = imgData.getMask()
187 dataMask |= regionMask
189 imgData.getImage().set(0.0)
190 imgData.getVariance().set(0.0)
191 flatData = likelihood.getData()
192 lsst.afw.detection.expandArray(record.getFootprint(), flatData, imgData.getImage().getArray(),
194 imgModel = lsst.afw.image.MaskedImageF(lsst.afw.image.ImageF(bbox), regionMask)
195 lsst.afw.detection.expandArray(record.getFootprint(), flatModel, imgModel.getImage().getArray(),
197 imgResiduals = lsst.afw.image.MaskedImageF(imgData,
True)
198 imgResiduals -= imgModel
201 mosaic.append(imgData,
"data")
202 mosaic.append(imgModel,
"model")
203 mosaic.append(imgResiduals,
"data-model")
204 grid = mosaic.makeMosaic()
def plotDistribution(self, records)
def setMaskTransparency(name, frame=None)
def displayOptimizer(self, record, kwds)
def __init__(self, root, tag=None, config=None, dataId=None, mode="ccd")
def mtv(data, frame=None, title="", wcs=None, args, kwargs)
def displayResiduals(self, record, nonlinear="fit", amplitudes="fit", doApplyWeights=False)