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"]
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 nameTemplate=
"{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 """Config for inserting fake sources 96 The default column names are those from the UW sims database. 99 useUpdatedCalibs = pexConfig.Field(
100 doc=
"Use updated calibs and wcs from jointcal?",
105 coaddName = pexConfig.Field(
106 doc=
"The name of the type of coadd used",
111 insertFakes = pexConfig.ConfigurableField(target=InsertFakesTask,
112 doc=
"Configuration for the fake sources")
114 detection = pexConfig.ConfigurableField(target=SourceDetectionTask,
115 doc=
"The detection task to use.")
117 deblend = pexConfig.ConfigurableField(target=SourceDeblendTask, doc=
"The deblending task to use.")
119 measurement = pexConfig.ConfigurableField(target=SingleFrameMeasurementTask,
120 doc=
"The measurement task to use")
122 applyApCorr = pexConfig.ConfigurableField(target=ApplyApCorrTask,
123 doc=
"The apply aperture correction task to use.")
125 catalogCalculation = pexConfig.ConfigurableField(target=CatalogCalculationTask,
126 doc=
"The catalog calculation ask to use.")
129 self.
detection.reEstimateBackground =
False 131 self.
measurement.plugins[
"base_PixelFlags"].masksFpAnywhere.append(
"FAKE")
132 self.
measurement.plugins[
"base_PixelFlags"].masksFpCenter.append(
"FAKE")
136 """Insert fake objects into calexps. 138 Add fake stars and galaxies to the given calexp, specified in the dataRef. Galaxy parameters are read in 139 from the specified file and then modelled using galsim. Re-runs characterize image and calibrate image to 140 give a new background estimation and measurement of the calexp. 142 `ProcessFakeSourcesTask` inherits six functions from insertFakesTask that make images of the fake 143 sources and then add them to the calexp. 146 Use the WCS information to add the pixel coordinates of each source 147 Adds an ``x`` and ``y`` column to the catalog of fake sources. 149 Trim the fake cat to about the size of the input image. 150 `mkFakeGalsimGalaxies` 151 Use Galsim to make fake double sersic galaxies for each set of galaxy parameters in the input file. 153 Use the PSF information from the calexp to make a fake star using the magnitude information from the 156 Remove rows of the input fake catalog which have half light radius, of either the bulge or the disk, 159 Add the fake sources to the calexp. 163 The ``calexp`` with fake souces added to it is written out as the datatype ``calexp_fakes``. 166 _DefaultName =
"processCcdWithFakes" 167 ConfigClass = ProcessCcdWithFakesConfig
170 """Initalize tings! This should go above in the class docstring 176 schema = SourceTable.makeMinimalSchema()
187 """Read in/write out the required data products and add fake sources to the calexp. 191 dataRef : `lsst.daf.persistence.butlerSubset.ButlerDataRef` 192 Data reference defining the ccd to have fakes added to it. 193 Used to access the following data products: 200 Uses the calibration and WCS information attached to the calexp for the posistioning and calibration 201 of the sources unless the config option config.useUpdatedCalibs is set then it uses the 202 meas_mosaic/jointCal outputs. The config defualts for the column names in the catalog of fakes are 203 taken from the University of Washington simulations database. Operates on one ccd at a time. 205 exposureIdInfo = dataRef.get(
"expIdInfo")
207 if self.
config.insertFakes.fakeType ==
"snapshot":
208 fakeCat = dataRef.get(
"fakeSourceCat").toDataFrame()
209 elif self.
config.insertFakes.fakeType ==
"static":
210 fakeCat = dataRef.get(
"deepCoadd_fakeSourceCat").toDataFrame()
212 fakeCat = Table.read(self.
config.insertFakes.fakeType).to_pandas()
214 calexp = dataRef.get(
"calexp")
215 if self.
config.useUpdatedCalibs:
216 self.
log.
info(
"Using updated calibs from meas_mosaic/jointCal")
217 wcs = dataRef.get(
"jointcal_wcs")
218 photoCalib = dataRef.get(
"jointcal_photoCalib")
220 wcs = calexp.getWcs()
221 photoCalib = calexp.getPhotoCalib()
223 resultStruct = self.
run(fakeCat, calexp, wcs=wcs, photoCalib=photoCalib,
224 exposureIdInfo=exposureIdInfo)
226 dataRef.put(resultStruct.outputExposure,
"fakes_calexp")
227 dataRef.put(resultStruct.outputCat,
"fakes_src")
230 inputs = butlerQC.get(inputRefs)
231 if 'exposureIdInfo' not in inputs.keys():
232 expId, expBits = butlerQC.quantum.dataId.pack(
"visit_detector", returnMaxBits=
True)
235 if inputs[
"wcs"]
is None:
236 inputs[
"wcs"] = inputs[
"image"].getWcs()
237 if inputs[
"photoCalib"]
is None:
238 inputs[
"photoCalib"] = inputs[
"image"].getPhotoCalib()
240 outputs = self.
run(**inputs)
241 butlerQC.put(outputs, outputRefs)
244 def _makeArgumentParser(cls):
246 parser.add_id_argument(
"--id",
"fakes_calexp", help=
"data ID with raw CCD keys [+ tract optionally], " 247 "e.g. --id visit=12345 ccd=1,2 [tract=0]",
248 ContainerClass=PerTractCcdDataIdContainer)
251 def run(self, fakeCat, exposure, wcs=None, photoCalib=None, exposureIdInfo=None):
252 """Add fake sources to a calexp and then run detection, deblending and measurement. 256 fakeCat : `pandas.core.frame.DataFrame` 257 The catalog of fake sources to add to the exposure 258 exposure : `lsst.afw.image.exposure.exposure.ExposureF` 259 The exposure to add the fake sources to 260 wcs : `lsst.afw.geom.SkyWcs` 261 WCS to use to add fake sources 262 photoCalib : `lsst.afw.image.photoCalib.PhotoCalib` 263 Photometric calibration to be used to calibrate the fake sources 264 exposureIdInfo : `lsst.obs.base.ExposureIdInfo` 268 resultStruct : `lsst.pipe.base.struct.Struct` 269 contains : outputExposure : `lsst.afw.image.exposure.exposure.ExposureF` 270 outputCat : `lsst.afw.table.source.source.SourceCatalog` 274 Adds pixel coordinates for each source to the fakeCat and removes objects with bulge or disk half 275 light radius = 0 (if ``config.cleanCat = True``). These columns are called ``x`` and ``y`` and are in 278 Adds the ``Fake`` mask plane to the exposure which is then set by `addFakeSources` to mark where fake 279 sources have been added. Uses the information in the ``fakeCat`` to make fake galaxies (using galsim) 280 and fake stars, using the PSF models from the PSF information for the calexp. These are then added to 281 the calexp and the calexp with fakes included returned. 283 The galsim galaxies are made using a double sersic profile, one for the bulge and one for the disk, 284 this is then convolved with the PSF at that point. 286 If exposureIdInfo is not provided then the SourceCatalog IDs will not be globally unique. 290 wcs = exposure.getWcs()
292 if photoCalib
is None:
293 photoCalib = exposure.getPhotoCalib()
295 self.insertFakes.
run(fakeCat, exposure, wcs, photoCalib)
298 if exposureIdInfo
is None:
301 sourceIdFactory = IdFactory.makeSource(exposureIdInfo.expId, exposureIdInfo.unusedBits)
302 table = SourceTable.make(self.
schema, sourceIdFactory)
305 detRes = self.detection.
run(table=table, exposure=exposure, doSmooth=
True)
306 sourceCat = detRes.sources
307 self.deblend.
run(exposure=exposure, sources=sourceCat)
308 self.measurement.
run(measCat=sourceCat, exposure=exposure, exposureId=exposureIdInfo.expId)
309 self.applyApCorr.
run(catalog=sourceCat, apCorrMap=exposure.getInfo().getApCorrMap())
310 self.catalogCalculation.
run(sourceCat)
312 resultStruct = pipeBase.Struct(outputExposure=exposure, outputCat=sourceCat)
def makeSubtask(self, name, keyArgs)
Class for storing ordered metadata with comments.
def run(self, fakeCat, exposure, wcs=None, photoCalib=None, exposureIdInfo=None)
def runDataRef(self, dataRef)
Fit spatial kernel using approximate fluxes for candidates, and solving a linear system of equations...
afw::table::PointKey< int > dimensions
def runQuantum(self, butlerQC, inputRefs, outputRefs)
def __init__(self, schema=None, kwargs)