23 Insert fake sources into calexps 25 from astropy.table
import Table
27 import lsst.pex.config
as pexConfig
31 from .insertFakes
import InsertFakesTask
33 from lsst.meas.base import (SingleFrameMeasurementTask, ApplyApCorrTask, CatalogCalculationTask,
34 PerTractCcdDataIdContainer)
38 from lsst.pipe.base import PipelineTask, PipelineTaskConfig, CmdLineTask, PipelineTaskConnections
42 __all__ = [
"ProcessCcdWithFakesConfig",
"ProcessCcdWithFakesTask"]
46 defaultTemplates={
"CoaddName":
"deep"}):
49 doc=
"Exposure into which fakes are to be added.",
51 storageClass=
"ExposureF",
52 dimensions=(
"instrument",
"visit",
"detector")
56 doc=
"Catalog of fake sources to draw inputs from.",
57 name=
"{CoaddName}Coadd_fakeSourceCat",
58 storageClass=
"Parquet",
59 dimensions=(
"tract",
"skymap")
63 doc=
"WCS information for the input exposure.",
66 dimensions=(
"Tract",
"SkyMap",
"Instrument",
"Visit",
"Detector")
69 photoCalib = cT.Input(
70 doc=
"Calib information for the input exposure.",
71 name=
"jointcal_photoCalib",
72 storageClass=
"PhotoCalib",
73 dimensions=(
"Tract",
"SkyMap",
"Instrument",
"Visit",
"Detector")
76 outputExposure = cT.Output(
77 doc=
"Exposure with fake sources added.",
79 storageClass=
"ExposureF",
80 dimensions=(
"instrument",
"visit",
"detector")
83 outputCat = cT.Output(
84 doc=
"Source catalog produced in calibrate task with fakes also measured.",
86 storageClass=
"SourceCatalog",
87 dimensions=(
"instrument",
"visit",
"detector"),
92 pipelineConnections=ProcessCcdWithFakesConnections):
93 """Config for inserting fake sources 97 The default column names are those from the UW sims database. 100 useUpdatedCalibs = pexConfig.Field(
101 doc=
"Use updated calibs and wcs from jointcal?",
106 coaddName = pexConfig.Field(
107 doc=
"The name of the type of coadd used",
112 insertFakes = pexConfig.ConfigurableField(target=InsertFakesTask,
113 doc=
"Configuration for the fake sources")
115 detection = pexConfig.ConfigurableField(target=SourceDetectionTask,
116 doc=
"The detection task to use.")
118 deblend = pexConfig.ConfigurableField(target=SourceDeblendTask, doc=
"The deblending task to use.")
120 measurement = pexConfig.ConfigurableField(target=SingleFrameMeasurementTask,
121 doc=
"The measurement task to use")
123 applyApCorr = pexConfig.ConfigurableField(target=ApplyApCorrTask,
124 doc=
"The apply aperture correction task to use.")
126 catalogCalculation = pexConfig.ConfigurableField(target=CatalogCalculationTask,
127 doc=
"The catalog calculation ask to use.")
130 self.detection.reEstimateBackground =
False 132 self.measurement.plugins[
"base_PixelFlags"].masksFpAnywhere.append(
"FAKE")
133 self.measurement.plugins[
"base_PixelFlags"].masksFpCenter.append(
"FAKE")
137 """Insert fake objects into calexps. 139 Add fake stars and galaxies to the given calexp, specified in the dataRef. Galaxy parameters are read in 140 from the specified file and then modelled using galsim. Re-runs characterize image and calibrate image to 141 give a new background estimation and measurement of the calexp. 143 `ProcessFakeSourcesTask` inherits six functions from insertFakesTask that make images of the fake 144 sources and then add them to the calexp. 147 Use the WCS information to add the pixel coordinates of each source 148 Adds an ``x`` and ``y`` column to the catalog of fake sources. 150 Trim the fake cat to about the size of the input image. 151 `mkFakeGalsimGalaxies` 152 Use Galsim to make fake double sersic galaxies for each set of galaxy parameters in the input file. 154 Use the PSF information from the calexp to make a fake star using the magnitude information from the 157 Remove rows of the input fake catalog which have half light radius, of either the bulge or the disk, 160 Add the fake sources to the calexp. 164 The ``calexp`` with fake souces added to it is written out as the datatype ``calexp_fakes``. 167 _DefaultName =
"processCcdWithFakes" 168 ConfigClass = ProcessCcdWithFakesConfig
170 def __init__(self, schema=None, **kwargs):
171 """Initalize tings! This should go above in the class docstring 177 schema = SourceTable.makeMinimalSchema()
179 self.makeSubtask(
"insertFakes")
181 self.makeSubtask(
"detection", schema=self.
schema)
182 self.makeSubtask(
"deblend", schema=self.
schema)
183 self.makeSubtask(
"measurement", schema=self.
schema, algMetadata=self.
algMetadata)
184 self.makeSubtask(
"applyApCorr", schema=self.
schema)
185 self.makeSubtask(
"catalogCalculation", schema=self.
schema)
188 """Read in/write out the required data products and add fake sources to the calexp. 192 dataRef : `lsst.daf.persistence.butlerSubset.ButlerDataRef` 193 Data reference defining the ccd to have fakes added to it. 194 Used to access the following data products: 201 Uses the calibration and WCS information attached to the calexp for the posistioning and calibration 202 of the sources unless the config option config.useUpdatedCalibs is set then it uses the 203 meas_mosaic/jointCal outputs. The config defualts for the column names in the catalog of fakes are 204 taken from the University of Washington simulations database. Operates on one ccd at a time. 206 exposureIdInfo = dataRef.get(
"expIdInfo")
208 if self.config.insertFakes.fakeType ==
"snapshot":
209 fakeCat = dataRef.get(
"fakeSourceCat").toDataFrame()
210 elif self.config.insertFakes.fakeType ==
"static":
211 fakeCat = dataRef.get(
"deepCoadd_fakeSourceCat").toDataFrame()
213 fakeCat = Table.read(self.config.insertFakes.fakeType).to_pandas()
215 calexp = dataRef.get(
"calexp")
216 if self.config.useUpdatedCalibs:
217 self.log.
info(
"Using updated calibs from meas_mosaic/jointCal")
218 wcs = dataRef.get(
"jointcal_wcs")
219 photoCalib = dataRef.get(
"jointcal_photoCalib")
221 wcs = calexp.getWcs()
222 photoCalib = calexp.getPhotoCalib()
224 resultStruct = self.
run(fakeCat, calexp, wcs=wcs, photoCalib=photoCalib,
225 exposureIdInfo=exposureIdInfo)
227 dataRef.put(resultStruct.outputExposure,
"fakes_calexp")
228 dataRef.put(resultStruct.outputCat,
"fakes_src")
231 inputs = butlerQC.get(inputRefs)
232 if 'exposureIdInfo' not in inputs.keys():
233 expId, expBits = butlerQC.quantum.dataId.pack(
"visit_detector", returnMaxBits=
True)
236 if inputs[
"wcs"]
is None:
237 inputs[
"wcs"] = inputs[
"image"].getWcs()
238 if inputs[
"photoCalib"]
is None:
239 inputs[
"photoCalib"] = inputs[
"image"].getPhotoCalib()
241 outputs = self.
run(**inputs)
242 butlerQC.put(outputs, outputRefs)
245 def _makeArgumentParser(cls):
246 parser = pipeBase.ArgumentParser(name=cls._DefaultName)
247 parser.add_id_argument(
"--id",
"fakes_calexp", help=
"data ID with raw CCD keys [+ tract optionally], " 248 "e.g. --id visit=12345 ccd=1,2 [tract=0]",
249 ContainerClass=PerTractCcdDataIdContainer)
252 def run(self, fakeCat, exposure, wcs=None, photoCalib=None, exposureIdInfo=None):
253 """Add fake sources to a calexp and then run detection, deblending and measurement. 257 fakeCat : `pandas.core.frame.DataFrame` 258 The catalog of fake sources to add to the exposure 259 exposure : `lsst.afw.image.exposure.exposure.ExposureF` 260 The exposure to add the fake sources to 261 wcs : `lsst.afw.geom.SkyWcs` 262 WCS to use to add fake sources 263 photoCalib : `lsst.afw.image.photoCalib.PhotoCalib` 264 Photometric calibration to be used to calibrate the fake sources 265 exposureIdInfo : `lsst.obs.base.ExposureIdInfo` 269 resultStruct : `lsst.pipe.base.struct.Struct` 270 contains : outputExposure : `lsst.afw.image.exposure.exposure.ExposureF` 271 outputCat : `lsst.afw.table.source.source.SourceCatalog` 275 Adds pixel coordinates for each source to the fakeCat and removes objects with bulge or disk half 276 light radius = 0 (if ``config.cleanCat = True``). These columns are called ``x`` and ``y`` and are in 279 Adds the ``Fake`` mask plane to the exposure which is then set by `addFakeSources` to mark where fake 280 sources have been added. Uses the information in the ``fakeCat`` to make fake galaxies (using galsim) 281 and fake stars, using the PSF models from the PSF information for the calexp. These are then added to 282 the calexp and the calexp with fakes included returned. 284 The galsim galaxies are made using a double sersic profile, one for the bulge and one for the disk, 285 this is then convolved with the PSF at that point. 287 If exposureIdInfo is not provided then the SourceCatalog IDs will not be globally unique. 291 wcs = exposure.getWcs()
293 if photoCalib
is None:
294 photoCalib = exposure.getPhotoCalib()
296 self.insertFakes.
run(fakeCat, exposure, wcs, photoCalib)
299 if exposureIdInfo
is None:
302 sourceIdFactory = IdFactory.makeSource(exposureIdInfo.expId, exposureIdInfo.unusedBits)
303 table = SourceTable.make(self.
schema, sourceIdFactory)
306 detRes = self.detection.
run(table=table, exposure=exposure, doSmooth=
True)
307 sourceCat = detRes.sources
308 self.deblend.
run(exposure=exposure, sources=sourceCat)
309 self.measurement.
run(measCat=sourceCat, exposure=exposure, exposureId=exposureIdInfo.expId)
310 self.applyApCorr.
run(catalog=sourceCat, apCorrMap=exposure.getInfo().getApCorrMap())
311 self.catalogCalculation.
run(sourceCat)
313 resultStruct = pipeBase.Struct(outputExposure=exposure, outputCat=sourceCat)
Class for storing ordered metadata with comments.
def run(self, fakeCat, exposure, wcs=None, photoCalib=None, exposureIdInfo=None)
Fit spatial kernel using approximate fluxes for candidates, and solving a linear system of equations...
afw::table::PointKey< int > dimensions
def runDataRef(self, dataRef)
def runQuantum(self, butlerQC, inputRefs, outputRefs)