Coverage for python/lsst/pipe/tasks/transformMeasurement.py : 47%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1#
2# LSST Data Management System
3# Copyright 2008-2015 AURA/LSST.
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"""
23Tasks for transforming raw measurement outputs to calibrated quantities.
24"""
25import lsst.afw.table as afwTable
26import lsst.pex.config as pexConfig
27import lsst.pipe.base as pipeBase
30def makeContiguous(catalog):
31 """!Return a version of the input catalog which is contiguous in memory."""
32 if not catalog.isContiguous():
33 return catalog.copy(deep=True)
34 else:
35 return catalog
38class TransformConfig(pexConfig.Config):
39 """!Configuration for TransformTask."""
40 copyFields = pexConfig.ListField(
41 dtype=str,
42 doc="Fields to copy from input to output catalog without transformation",
43 default=('id', 'coord_ra', 'coord_dec')
44 )
46## \addtogroup LSST_task_documentation
47## \{
48## \page TransformTask
49## \ref TransformTask_ "TransformTask"
50## \copybrief TransformTask
51## \}
54class TransformTask(pipeBase.Task):
55 r"""!
56 \anchor TransformTask_
58 \brief Transform a SourceCatalog containing raw measurements to calibrated form.
60 \section pipe_tasks_transform_Contents Contents
62 - \ref pipe_tasks_transform_purpose
63 - \ref pipe_tasks_transform_initialize
64 - \ref pipe_tasks_transform_invoke
66 \section pipe_tasks_transform_purpose Description
68 Given a set of measurement algorithms with their associated configuration,
69 the table of source measurements they have produced, and information about
70 an associated WCS and calibration, transform the raw measurement output to
71 a calibrated form.
73 Transformations are defined on a per-measurement-plugin basis. In
74 addition, a configurable set of fields may be simply copied from the input
75 to the output catalog.
77 This task operates on an input SourceCatalog and returns a BaseCatalog
78 containing the transformed results. It requires that the caller supply
79 information on the configuration of the measurement task which produced
80 the input data as well as the world coordinate system and calibration
81 under which the transformation will take place. It provides no
82 functionality for reading or writing data from a Butler: rather,
83 per-dataset-type command line tasks are provided to obtain the appropriate
84 information from a Butler (or elsewhere) and then delegate to this task.
86 \section pipe_tasks_transform_initialize Task initialization
88 \copydoc \_\_init\_\_
90 \section pipe_tasks_transform_invoke Task invocation
92 \copydoc run
93 """
94 ConfigClass = TransformConfig
95 _DefaultName = "transform"
97 def __init__(self, measConfig, inputSchema, outputDataset, *args, **kwargs):
98 """!Initialize TransformTask.
100 @param[in] measConfig Configuration for the measurement task which
101 produced the measurments being transformed.
102 @param[in] inputSchema The schema of the input catalog.
103 @param[in] outputDataset The butler dataset type of the output catalog.
104 @param[in] *args Passed through to pipeBase.Task.__init__()
105 @param[in] *kwargs Passed through to pipeBase.Task.__init__()
106 """
107 pipeBase.Task.__init__(self, *args, **kwargs)
109 # This task can be used to generate multiple different output dataset types. We
110 # need to be able to specify the output type together with its schema.
111 self.outputDataset = outputDataset
113 # Define a mapper and add the basic fields to be copied.
114 self.mapper = afwTable.SchemaMapper(inputSchema)
115 for field in self.config.copyFields:
116 self.mapper.addMapping(inputSchema.find(field).key)
118 # Build a list of all transforms that will be applied to the input. We
119 # will iterate over this in run().
120 self.transforms = []
121 for name in measConfig.plugins.names:
122 config = measConfig.plugins.get(name)
123 transformClass = measConfig.plugins.registry.get(name).PluginClass.getTransformClass()
124 self.transforms.append(transformClass(config, name, self.mapper))
126 def getSchemaCatalogs(self):
127 """!Return a dict containing an empty catalog representative of this task's output."""
128 transformedSrc = afwTable.BaseCatalog(self.mapper.getOutputSchema())
129 return {self.outputDataset: transformedSrc}
131 def run(self, inputCat, wcs, photoCalib):
132 """!Transform raw source measurements to calibrated quantities.
134 @param[in] inputCat SourceCatalog of sources to transform.
135 @param[in] wcs The world coordinate system under which transformations will take place.
136 @param[in] photoCalib The calibration under which transformations will take place.
138 @return A BaseCatalog containing the transformed measurements.
139 """
140 outputCat = afwTable.BaseCatalog(self.mapper.getOutputSchema())
141 outputCat.extend(inputCat, mapper=self.mapper)
143 # Transforms may use a ColumnView on the input and output catalogs,
144 # which requires that the data be contiguous in memory.
145 inputCat = makeContiguous(inputCat)
146 outputCat = makeContiguous(outputCat)
148 for transform in self.transforms:
149 transform(inputCat, outputCat, wcs, photoCalib)
150 return outputCat
153class RunTransformConfig(pexConfig.Config):
154 """!Configuration for RunTransformTaskBase derivatives."""
155 transform = pexConfig.ConfigurableField(
156 doc="Subtask which performs transformations",
157 target=TransformTask
158 )
159 inputConfigType = pexConfig.Field(
160 dtype=str,
161 doc="Dataset type of measurement operation configuration",
162 )
165class RunTransformTaskBase(pipeBase.CmdLineTask):
166 r"""!
167 \anchor RunTransformTaskBase_
169 \brief Command line interface for TransformTask.
171 \section pipe_tasks_transform_Contents Contents
173 - \ref pipe_tasks_runtransform_purpose
174 - \ref pipe_tasks_runtransform_invoke
176 \section pipe_tasks_runtransform_purpose Description
178 Provides a command-line task which can be used to run TransformTask.
180 - Loads a plugin registry based on configuration;
181 - Loads configuration for the measurement task which was applied from a repository;
182 - Loads the SourceCatalog input schema from a repository;
183 - For each input dataRef, reads the SourceCatalog, WCS and calibration from the
184 repository and executes TransformTask.
186 This is not a fully-fledged command line task: it requires specialization to a particular
187 source type by defining the variables indicated below.
189 \section pipe_tasks_runtransform_invoke Task invocation
191 \copydoc run
192 """
193 RunnerClass = pipeBase.ButlerInitializedTaskRunner
194 ConfigClass = RunTransformConfig
196 # Subclasses should provide definitions for the attributes named below.
197 # Properties can be used if appropriate.
198 #
199 # Standard CmdLineTask attributes:
200 _DefaultName = None
202 # Butler dataset type of the source type to be transformed ("src", "forced_src", etc):
203 sourceType = None
205 # Butler dataset type of the calibration exposure to use when transforming ("calexp", etc):
206 calexpType = None
208 @property
209 def inputSchemaType(self):
210 """!
211 The Butler dataset type for the schema of the input source catalog.
213 By default, we append `_schema` to the input source type. Subclasses may customize
214 if required.
215 """
216 return self.sourceType + "_schema"
218 @property
219 def outputDataset(self):
220 """!
221 The Butler dataset type for the schema of the output catalog.
223 By default, we prepend `transformed_` to the input source type. Subclasses may
224 customize if required.
225 """
226 return 'transformed_' + self.sourceType
228 @property
229 def measurementConfig(self):
230 """!
231 The configuration of the measurement operation used to generate the input catalog.
233 By default we look for `measurement` under the root configuration of the
234 generating task. Subclasses may customize this (e.g. to `calibrate.measurement`)
235 if required.
236 """
237 return self.butler.get(self.config.inputConfigType).measurement.value
239 def __init__(self, *args, **kwargs):
240 pipeBase.CmdLineTask.__init__(self, *args, config=kwargs['config'], log=kwargs['log'])
241 self.butler = kwargs['butler']
242 self.makeSubtask('transform', measConfig=self.measurementConfig,
243 inputSchema=self.butler.get(self.inputSchemaType).schema,
244 outputDataset=self.outputDataset)
246 @pipeBase.timeMethod
247 def runDataRef(self, dataRef):
248 """!Transform the source catalog referred to by dataRef.
250 The result is both returned and written as dataset type "transformed_" + the input
251 source dataset type to the provided dataRef.
253 @param[in] dataRef Data reference for source catalog & calibrated exposure.
255 @returns A BaseCatalog containing the transformed measurements.
256 """
257 inputCat = dataRef.get(self.sourceType)
258 wcs = dataRef.get(self.calexpType).getWcs()
259 photoCalib = dataRef.get(self.calexpType).getPhotoCalib()
260 outputCat = self.transform.run(inputCat, wcs, photoCalib)
261 dataRef.put(outputCat, self.outputDataset)
262 return outputCat
265## \addtogroup LSST_task_documentation
266## \{
267## \page SrcTransformTask
268## \ref SrcTransformTask_ "SrcTransformTask"
269## \copybrief SrcTransformTask
270## \}
272class SrcTransformTask(RunTransformTaskBase):
273 """!
274 \anchor SrcTransformTask_
276 \brief Transform ``src`` measuremenents to calibrated form.
278 This is a specialization of \ref RunTransformTaskBase_ "RunTransformTaskBase" which
279 operates on ``src`` measurements. Refer to the parent documentation for details.
280 """
281 _DefaultName = "transformSrcMeasurement"
282 sourceType = 'src'
283 calexpType = 'calexp'
285 @property
286 def measurementConfig(self):
287 return self.butler.get(self.config.inputConfigType).calibrate.measurement.value
290## \addtogroup LSST_task_documentation
291## \{
292## \page ForcedSrcTransformTask
293## \ref ForcedSrcTransformTask_ "ForcedSrcTransformTask"
294## \copybrief ForcedSrcTransformTask
295## \}
297class ForcedSrcTransformTask(RunTransformTaskBase):
298 """!
299 \anchor ForcedSrcTransformTask_
301 \brief Transform ``forced_src`` measuremenents to calibrated form.
303 This is a specialization of \ref RunTransformTaskBase_ "RunTransformTaskBase" which
304 operates on ``forced_src`` measurements. Refer to the parent documentation for details.
305 """
306 _DefaultName = "transformForcedSrcMeasurement"
307 sourceType = 'forced_src'
308 calexpType = 'calexp'
311## \addtogroup LSST_task_documentation
312## \{
313## \page CoaddSrcTransformTask
314## \ref CoaddSrcTransformTask_ "CoaddSrcTransformTask"
315## \copybrief CoaddSrcTransformTask
316## \}
318class CoaddSrcTransformTask(RunTransformTaskBase):
319 """!
320 \anchor CoaddSrcTransformTask_
322 \brief Transform measuremenents made on coadds to calibrated form.
324 This is a specialization of \ref RunTransformTaskBase_ "RunTransformTaskBase" which
325 operates on measurements made on coadds. Refer to the parent documentation for details.
326 """
327 _DefaultName = "transformCoaddSrcMeasurement"
329 @property
330 def coaddName(self):
331 return self.butler.get(self.config.inputConfigType).coaddName
333 @property
334 def sourceType(self):
335 return self.coaddName + "Coadd_meas"
337 @property
338 def calexpType(self):
339 return self.coaddName + "Coadd_calexp"
341 def _getConfigName(self):
342 return "%s_transformCoaddSrcMeasurement_config" % (self.coaddName,)
344 def _getMetaDataName(self):
345 return "%s_transformCoaddSrcMeasurement_metadata" % (self.coaddName,)