23Insert fake sources into calexps
26__all__ = [
"ProcessCcdWithFakesConfig",
"ProcessCcdWithFakesTask",
27 "ProcessCcdWithVariableFakesConfig",
"ProcessCcdWithVariableFakesTask"]
35from .insertFakes
import InsertFakesTask
37from lsst.obs.base
import ExposureIdInfo
38from lsst.pipe.base import PipelineTask, PipelineTaskConfig, PipelineTaskConnections
39import lsst.pipe.base.connectionTypes
as cT
46 dimensions=(
"instrument",
"visit",
"detector"),
47 defaultTemplates={
"coaddName":
"deep",
48 "wcsName":
"jointcal",
49 "photoCalibName":
"jointcal",
50 "fakesType":
"fakes_"}):
52 doc=
"Input definition of geometry/bbox and projection/wcs for "
53 "template exposures. Needed to test which tract to generate ",
54 name=BaseSkyMap.SKYMAP_DATASET_TYPE_NAME,
55 dimensions=(
"skymap",),
56 storageClass=
"SkyMap",
60 doc=
"Exposure into which fakes are to be added.",
62 storageClass=
"ExposureF",
63 dimensions=(
"instrument",
"visit",
"detector")
67 doc=
"Set of catalogs of fake sources to draw inputs from. We "
68 "concatenate the tract catalogs for detectorVisits that cover "
70 name=
"{fakesType}fakeSourceCat",
71 storageClass=
"DataFrame",
72 dimensions=(
"tract",
"skymap"),
77 externalSkyWcsTractCatalog = cT.Input(
78 doc=(
"Per-tract, per-visit wcs calibrations. These catalogs use the detector "
79 "id for the catalog id, sorted on id for fast lookup."),
80 name=
"{wcsName}SkyWcsCatalog",
81 storageClass=
"ExposureCatalog",
82 dimensions=(
"instrument",
"visit",
"tract",
"skymap"),
87 externalSkyWcsGlobalCatalog = cT.Input(
88 doc=(
"Per-visit wcs calibrations computed globally (with no tract information). "
89 "These catalogs use the detector id for the catalog id, sorted on id for "
91 name=
"{wcsName}SkyWcsCatalog",
92 storageClass=
"ExposureCatalog",
93 dimensions=(
"instrument",
"visit"),
96 externalPhotoCalibTractCatalog = cT.Input(
97 doc=(
"Per-tract, per-visit photometric calibrations. These catalogs use the "
98 "detector id for the catalog id, sorted on id for fast lookup."),
99 name=
"{photoCalibName}PhotoCalibCatalog",
100 storageClass=
"ExposureCatalog",
101 dimensions=(
"instrument",
"visit",
"tract"),
106 externalPhotoCalibGlobalCatalog = cT.Input(
107 doc=(
"Per-visit photometric calibrations. These catalogs use the "
108 "detector id for the catalog id, sorted on id for fast lookup."),
109 name=
"{photoCalibName}PhotoCalibCatalog",
110 storageClass=
"ExposureCatalog",
111 dimensions=(
"instrument",
"visit"),
114 icSourceCat = cT.Input(
115 doc=
"Catalog of calibration sources",
117 storageClass=
"SourceCatalog",
118 dimensions=(
"instrument",
"visit",
"detector")
121 sfdSourceCat = cT.Input(
122 doc=
"Catalog of calibration sources",
124 storageClass=
"SourceCatalog",
125 dimensions=(
"instrument",
"visit",
"detector")
128 outputExposure = cT.Output(
129 doc=
"Exposure with fake sources added.",
130 name=
"{fakesType}calexp",
131 storageClass=
"ExposureF",
132 dimensions=(
"instrument",
"visit",
"detector")
135 outputCat = cT.Output(
136 doc=
"Source catalog produced in calibrate task with fakes also measured.",
137 name=
"{fakesType}src",
138 storageClass=
"SourceCatalog",
139 dimensions=(
"instrument",
"visit",
"detector"),
142 def __init__(self, *, config=None):
143 super().__init__(config=config)
145 if not config.doApplyExternalGlobalPhotoCalib:
146 self.inputs.remove(
"externalPhotoCalibGlobalCatalog")
147 if not config.doApplyExternalTractPhotoCalib:
148 self.inputs.remove(
"externalPhotoCalibTractCatalog")
150 if not config.doApplyExternalGlobalSkyWcs:
151 self.inputs.remove(
"externalSkyWcsGlobalCatalog")
152 if not config.doApplyExternalTractSkyWcs:
153 self.inputs.remove(
"externalSkyWcsTractCatalog")
156class ProcessCcdWithFakesConfig(PipelineTaskConfig,
157 pipelineConnections=ProcessCcdWithFakesConnections):
158 """Config for inserting fake sources
162 The default column names are those from the UW sims database.
165 doApplyExternalGlobalPhotoCalib = pexConfig.Field(
168 doc=
"Whether to apply an external photometric calibration via an "
169 "`lsst.afw.image.PhotoCalib` object. Uses the "
170 "`externalPhotoCalibName` config option to determine which "
171 "calibration to use. Uses a global calibration."
174 doApplyExternalTractPhotoCalib = pexConfig.Field(
177 doc=
"Whether to apply an external photometric calibration via an "
178 "`lsst.afw.image.PhotoCalib` object. Uses the "
179 "`externalPhotoCalibName` config option to determine which "
180 "calibration to use. Uses a per tract calibration."
183 externalPhotoCalibName = pexConfig.ChoiceField(
184 doc=
"What type of external photo calib to use.",
187 allowed={
"jointcal":
"Use jointcal_photoCalib",
188 "fgcm":
"Use fgcm_photoCalib",
189 "fgcm_tract":
"Use fgcm_tract_photoCalib"}
192 doApplyExternalGlobalSkyWcs = pexConfig.Field(
195 doc=
"Whether to apply an external astrometric calibration via an "
196 "`lsst.afw.geom.SkyWcs` object. Uses the "
197 "`externalSkyWcsName` config option to determine which "
198 "calibration to use. Uses a global calibration."
201 doApplyExternalTractSkyWcs = pexConfig.Field(
204 doc=
"Whether to apply an external astrometric calibration via an "
205 "`lsst.afw.geom.SkyWcs` object. Uses the "
206 "`externalSkyWcsName` config option to determine which "
207 "calibration to use. Uses a per tract calibration."
210 externalSkyWcsName = pexConfig.ChoiceField(
211 doc=
"What type of updated WCS calib to use.",
214 allowed={
"jointcal":
"Use jointcal_wcs"}
217 coaddName = pexConfig.Field(
218 doc=
"The name of the type of coadd used",
223 srcFieldsToCopy = pexConfig.ListField(
225 default=(
"calib_photometry_reserved",
"calib_photometry_used",
"calib_astrometry_used",
226 "calib_psf_candidate",
"calib_psf_used",
"calib_psf_reserved"),
227 doc=(
"Fields to copy from the `src` catalog to the output catalog "
228 "for matching sources Any missing fields will trigger a "
229 "RuntimeError exception.")
232 matchRadiusPix = pexConfig.Field(
235 doc=(
"Match radius for matching icSourceCat objects to sourceCat objects (pixels)"),
238 doMatchVisit = pexConfig.Field(
241 doc=
"Match visit to trim the fakeCat"
244 calibrate = pexConfig.ConfigurableField(target=CalibrateTask,
245 doc=
"The calibration task to use.")
247 insertFakes = pexConfig.ConfigurableField(target=InsertFakesTask,
248 doc=
"Configuration for the fake sources")
250 def setDefaults(self):
251 super().setDefaults()
252 self.calibrate.measurement.plugins[
"base_PixelFlags"].masksFpAnywhere.append(
"FAKE")
253 self.calibrate.measurement.plugins[
"base_PixelFlags"].masksFpCenter.append(
"FAKE")
254 self.calibrate.doAstrometry =
False
255 self.calibrate.doWriteMatches =
False
256 self.calibrate.doPhotoCal =
False
257 self.calibrate.detection.reEstimateBackground =
False
260class ProcessCcdWithFakesTask(PipelineTask):
261 """Insert fake objects into calexps.
263 Add fake stars and galaxies to the given calexp, specified
in the dataRef. Galaxy parameters are read
in
264 from the specified file
and then modelled using galsim. Re-runs characterize image
and calibrate image to
265 give a new background estimation
and measurement of the calexp.
267 `ProcessFakeSourcesTask` inherits six functions
from insertFakesTask that make images of the fake
268 sources
and then add them to the calexp.
271 Use the WCS information to add the pixel coordinates of each source
272 Adds an ``x``
and ``y`` column to the catalog of fake sources.
274 Trim the fake cat to about the size of the input image.
275 `mkFakeGalsimGalaxies`
276 Use Galsim to make fake double sersic galaxies
for each set of galaxy parameters
in the input file.
278 Use the PSF information
from the calexp to make a fake star using the magnitude information
from the
281 Remove rows of the input fake catalog which have half light radius, of either the bulge
or the disk,
284 Add the fake sources to the calexp.
288 The ``calexp``
with fake souces added to it
is written out
as the datatype ``calexp_fakes``.
291 _DefaultName = "processCcdWithFakes"
292 ConfigClass = ProcessCcdWithFakesConfig
294 def __init__(self, schema=None, butler=None, **kwargs):
295 """Initalize things! This should go above in the class docstring
298 super().__init__(**kwargs)
301 schema = SourceTable.makeMinimalSchema()
303 self.makeSubtask(
"insertFakes")
304 self.makeSubtask(
"calibrate")
306 def runQuantum(self, butlerQC, inputRefs, outputRefs):
307 inputs = butlerQC.get(inputRefs)
308 detectorId = inputs[
"exposure"].getInfo().getDetector().getId()
310 if 'exposureIdInfo' not in inputs.keys():
311 expId, expBits = butlerQC.quantum.dataId.pack(
"visit_detector", returnMaxBits=
True)
312 inputs[
'exposureIdInfo'] = ExposureIdInfo(expId, expBits)
314 expWcs = inputs[
"exposure"].getWcs()
316 if not self.config.doApplyExternalGlobalSkyWcs
and not self.config.doApplyExternalTractSkyWcs:
318 self.log.info(
"No WCS for exposure %s so cannot insert fake sources. Skipping detector.",
319 butlerQC.quantum.dataId)
322 inputs[
"wcs"] = expWcs
323 elif self.config.doApplyExternalGlobalSkyWcs:
324 externalSkyWcsCatalog = inputs[
"externalSkyWcsGlobalCatalog"]
325 row = externalSkyWcsCatalog.find(detectorId)
327 self.log.info(
"No %s external global sky WCS for exposure %s so cannot insert fake "
328 "sources. Skipping detector.", self.config.externalSkyWcsName,
329 butlerQC.quantum.dataId)
331 inputs[
"wcs"] = row.getWcs()
332 elif self.config.doApplyExternalTractSkyWcs:
333 externalSkyWcsCatalogList = inputs[
"externalSkyWcsTractCatalog"]
335 tractId = externalSkyWcsCatalogList[0].dataId[
"tract"]
336 externalSkyWcsCatalog =
None
337 for externalSkyWcsCatalogRef
in externalSkyWcsCatalogList:
338 if externalSkyWcsCatalogRef.dataId[
"tract"] == tractId:
339 externalSkyWcsCatalog = externalSkyWcsCatalogRef.get(
340 datasetType=self.config.connections.externalSkyWcsTractCatalog)
342 if externalSkyWcsCatalog
is None:
343 usedTract = externalSkyWcsCatalogList[-1].dataId[
"tract"]
345 f
"Warning, external SkyWcs for tract {tractId} not found. Using tract {usedTract} "
347 externalSkyWcsCatalog = externalSkyWcsCatalogList[-1].get(
348 datasetType=self.config.connections.externalSkyWcsTractCatalog)
349 row = externalSkyWcsCatalog.find(detectorId)
351 self.log.info(
"No %s external tract sky WCS for exposure %s so cannot insert fake "
352 "sources. Skipping detector.", self.config.externalSkyWcsName,
353 butlerQC.quantum.dataId)
355 inputs[
"wcs"] = row.getWcs()
357 if not self.config.doApplyExternalGlobalPhotoCalib
and not self.config.doApplyExternalTractPhotoCalib:
358 inputs[
"photoCalib"] = inputs[
"exposure"].getPhotoCalib()
359 elif self.config.doApplyExternalGlobalPhotoCalib:
360 externalPhotoCalibCatalog = inputs[
"externalPhotoCalibGlobalCatalog"]
361 row = externalPhotoCalibCatalog.find(detectorId)
363 self.log.info(
"No %s external global photoCalib for exposure %s so cannot insert fake "
364 "sources. Skipping detector.", self.config.externalPhotoCalibName,
365 butlerQC.quantum.dataId)
367 inputs[
"photoCalib"] = row.getPhotoCalib()
368 elif self.config.doApplyExternalTractPhotoCalib:
369 externalPhotoCalibCatalogList = inputs[
"externalPhotoCalibTractCatalog"]
371 tractId = externalPhotoCalibCatalogList[0].dataId[
"tract"]
372 externalPhotoCalibCatalog =
None
373 for externalPhotoCalibCatalogRef
in externalPhotoCalibCatalogList:
374 if externalPhotoCalibCatalogRef.dataId[
"tract"] == tractId:
375 externalPhotoCalibCatalog = externalPhotoCalibCatalogRef.get(
376 datasetType=self.config.connections.externalPhotoCalibTractCatalog)
378 if externalPhotoCalibCatalog
is None:
379 usedTract = externalPhotoCalibCatalogList[-1].dataId[
"tract"]
381 f
"Warning, external PhotoCalib for tract {tractId} not found. Using tract {usedTract} "
383 externalPhotoCalibCatalog = externalPhotoCalibCatalogList[-1].get(
384 datasetType=self.config.connections.externalPhotoCalibTractCatalog)
385 row = externalPhotoCalibCatalog.find(detectorId)
387 self.log.info(
"No %s external tract photoCalib for exposure %s so cannot insert fake "
388 "sources. Skipping detector.", self.config.externalPhotoCalibName,
389 butlerQC.quantum.dataId)
391 inputs[
"photoCalib"] = row.getPhotoCalib()
393 outputs = self.run(**inputs)
394 butlerQC.put(outputs, outputRefs)
396 def run(self, fakeCats, exposure, skyMap, wcs=None, photoCalib=None, exposureIdInfo=None,
397 icSourceCat=None, sfdSourceCat=None, externalSkyWcsGlobalCatalog=None,
398 externalSkyWcsTractCatalog=None, externalPhotoCalibGlobalCatalog=None,
399 externalPhotoCalibTractCatalog=None):
400 """Add fake sources to a calexp and then run detection, deblending and measurement.
404 fakeCats : `list` of `lsst.daf.butler.DeferredDatasetHandle`
405 Set of tract level fake catalogs that potentially cover
407 exposure : `lsst.afw.image.exposure.exposure.ExposureF`
408 The exposure to add the fake sources to
409 skyMap : `lsst.skymap.SkyMap`
410 SkyMap defining the tracts and patches the fakes are stored over.
412 WCS to use to add fake sources
413 photoCalib : `lsst.afw.image.photoCalib.PhotoCalib`
414 Photometric calibration to be used to calibrate the fake sources
415 exposureIdInfo : `lsst.obs.base.ExposureIdInfo`
418 Catalog to take the information about which sources were used
for calibration
from.
421 Catalog produced by singleFrameDriver, needed to copy some calibration flags
from.
425 resultStruct : `lsst.pipe.base.struct.Struct`
426 contains : outputExposure : `lsst.afw.image.exposure.exposure.ExposureF`
427 outputCat : `lsst.afw.table.source.source.SourceCatalog`
431 Adds pixel coordinates
for each source to the fakeCat
and removes objects
with bulge
or disk half
432 light radius = 0 (
if ``config.cleanCat =
True``). These columns are called ``x``
and ``y``
and are
in
435 Adds the ``Fake`` mask plane to the exposure which
is then set by `addFakeSources` to mark where fake
436 sources have been added. Uses the information
in the ``fakeCat`` to make fake galaxies (using galsim)
437 and fake stars, using the PSF models
from the PSF information
for the calexp. These are then added to
438 the calexp
and the calexp
with fakes included returned.
440 The galsim galaxies are made using a double sersic profile, one
for the bulge
and one
for the disk,
441 this
is then convolved
with the PSF at that point.
443 If exposureIdInfo
is not provided then the SourceCatalog IDs will
not be globally unique.
445 fakeCat = self.composeFakeCat(fakeCats, skyMap)
448 wcs = exposure.getWcs()
450 if photoCalib
is None:
451 photoCalib = exposure.getPhotoCalib()
453 if self.config.doMatchVisit:
454 fakeCat = self.getVisitMatchedFakeCat(fakeCat, exposure)
456 self.insertFakes.run(fakeCat, exposure, wcs, photoCalib)
459 if exposureIdInfo
is None:
460 exposureIdInfo = ExposureIdInfo()
461 returnedStruct = self.calibrate.run(exposure, exposureIdInfo=exposureIdInfo)
462 sourceCat = returnedStruct.sourceCat
464 sourceCat = self.copyCalibrationFields(sfdSourceCat, sourceCat, self.config.srcFieldsToCopy)
466 resultStruct = pipeBase.Struct(outputExposure=exposure, outputCat=sourceCat)
469 def composeFakeCat(self, fakeCats, skyMap):
470 """Concatenate the fakeCats from tracts that may cover the exposure.
474 fakeCats : `list` of `lst.daf.butler.DeferredDatasetHandle`
475 Set of fake cats to concatenate.
476 skyMap : `lsst.skymap.SkyMap`
477 SkyMap defining the geometry of the tracts and patches.
481 combinedFakeCat : `pandas.DataFrame`
482 All fakes that cover the inner polygon of the tracts
in this
485 if len(fakeCats) == 1:
486 return fakeCats[0].get(
487 datasetType=self.config.connections.fakeCats)
489 for fakeCatRef
in fakeCats:
490 cat = fakeCatRef.get(
491 datasetType=self.config.connections.fakeCats)
492 tractId = fakeCatRef.dataId[
"tract"]
494 outputCat.append(cat[
495 skyMap.findTractIdArray(cat[self.config.insertFakes.ra_col],
496 cat[self.config.insertFakes.dec_col],
500 return pd.concat(outputCat)
502 def getVisitMatchedFakeCat(self, fakeCat, exposure):
503 """Trim the fakeCat to select particular visit
507 fakeCat : `pandas.core.frame.DataFrame`
508 The catalog of fake sources to add to the exposure
509 exposure : `lsst.afw.image.exposure.exposure.ExposureF`
510 The exposure to add the fake sources to
514 movingFakeCat : `pandas.DataFrame`
515 All fakes that belong to the visit
517 selected = exposure.getInfo().getVisitInfo().getId() == fakeCat["visit"]
519 return fakeCat[selected]
521 def copyCalibrationFields(self, calibCat, sourceCat, fieldsToCopy):
522 """Match sources in calibCat and sourceCat and copy the specified fields
527 Catalog from which to copy fields.
529 Catalog to which to copy fields.
531 Fields to copy
from calibCat to SoourceCat.
536 Catalog which includes the copied fields.
538 The fields copied are those specified by `fieldsToCopy` that actually exist
539 in the schema of `calibCat`.
541 This version was based on
and adapted
from the one
in calibrateTask.
546 sourceSchemaMapper.addMinimalSchema(sourceCat.schema,
True)
551 missingFieldNames = []
552 for fieldName
in fieldsToCopy:
553 if fieldName
in calibCat.schema:
554 schemaItem = calibCat.schema.find(fieldName)
555 calibSchemaMapper.editOutputSchema().addField(schemaItem.getField())
556 schema = calibSchemaMapper.editOutputSchema()
557 calibSchemaMapper.addMapping(schemaItem.getKey(), schema.find(fieldName).getField())
559 missingFieldNames.append(fieldName)
560 if missingFieldNames:
561 raise RuntimeError(f
"calibCat is missing fields {missingFieldNames} specified in "
564 if "calib_detected" not in calibSchemaMapper.getOutputSchema():
565 self.calibSourceKey = calibSchemaMapper.addOutputField(
afwTable.Field[
"Flag"](
"calib_detected",
566 "Source was detected as an icSource"))
568 self.calibSourceKey =
None
570 schema = calibSchemaMapper.getOutputSchema()
572 newCat.reserve(len(sourceCat))
573 newCat.extend(sourceCat, sourceSchemaMapper)
576 for k, v
in sourceCat.schema.getAliasMap().
items():
577 newCat.schema.getAliasMap().
set(k, v)
579 select = newCat[
"deblend_nChild"] == 0
580 matches =
afwTable.matchXy(newCat[select], calibCat, self.config.matchRadiusPix)
584 numMatches = len(matches)
585 numUniqueSources = len(
set(m[1].getId()
for m
in matches))
586 if numUniqueSources != numMatches:
587 self.log.warning(
"%d calibCat sources matched only %d sourceCat sources", numMatches,
590 self.log.info(
"Copying flags from calibCat to sourceCat for %s sources", numMatches)
594 for src, calibSrc, d
in matches:
595 if self.calibSourceKey:
596 src.setFlag(self.calibSourceKey,
True)
601 calibSrcFootprint = calibSrc.getFootprint()
603 calibSrc.setFootprint(src.getFootprint())
604 src.assign(calibSrc, calibSchemaMapper)
606 calibSrc.setFootprint(calibSrcFootprint)
612 ccdVisitFakeMagnitudes = cT.Output(
613 doc=
"Catalog of fakes with magnitudes scattered for this ccdVisit.",
614 name=
"{fakesType}ccdVisitFakeMagnitudes",
615 storageClass=
"DataFrame",
616 dimensions=(
"instrument",
"visit",
"detector"),
620class ProcessCcdWithVariableFakesConfig(ProcessCcdWithFakesConfig,
621 pipelineConnections=ProcessCcdWithVariableFakesConnections):
622 scatterSize = pexConfig.RangeField(
627 doc=
"Amount of scatter to add to the visit magnitude for variable "
632class ProcessCcdWithVariableFakesTask(ProcessCcdWithFakesTask):
633 """As ProcessCcdWithFakes except add variablity to the fakes catalog
634 magnitude in the observed band
for this ccdVisit.
636 Additionally, write out the modified magnitudes to the Butler.
639 _DefaultName = "processCcdWithVariableFakes"
640 ConfigClass = ProcessCcdWithVariableFakesConfig
642 def run(self, fakeCats, exposure, skyMap, wcs=None, photoCalib=None, exposureIdInfo=None,
643 icSourceCat=None, sfdSourceCat=None):
644 """Add fake sources to a calexp and then run detection, deblending and measurement.
648 fakeCat : `pandas.core.frame.DataFrame`
649 The catalog of fake sources to add to the exposure
650 exposure : `lsst.afw.image.exposure.exposure.ExposureF`
651 The exposure to add the fake sources to
652 skyMap : `lsst.skymap.SkyMap`
653 SkyMap defining the tracts and patches the fakes are stored over.
655 WCS to use to add fake sources
656 photoCalib : `lsst.afw.image.photoCalib.PhotoCalib`
657 Photometric calibration to be used to calibrate the fake sources
658 exposureIdInfo : `lsst.obs.base.ExposureIdInfo`
661 Catalog to take the information about which sources were used
for calibration
from.
664 Catalog produced by singleFrameDriver, needed to copy some calibration flags
from.
668 resultStruct : `lsst.pipe.base.struct.Struct`
669 Results Strcut containing:
671 - outputExposure : Exposure
with added fakes
672 (`lsst.afw.image.exposure.exposure.ExposureF`)
673 - outputCat : Catalog
with detected fakes
674 (`lsst.afw.table.source.source.SourceCatalog`)
675 - ccdVisitFakeMagnitudes : Magnitudes that these fakes were
676 inserted
with after being scattered (`pandas.DataFrame`)
680 Adds pixel coordinates
for each source to the fakeCat
and removes objects
with bulge
or disk half
681 light radius = 0 (
if ``config.cleanCat =
True``). These columns are called ``x``
and ``y``
and are
in
684 Adds the ``Fake`` mask plane to the exposure which
is then set by `addFakeSources` to mark where fake
685 sources have been added. Uses the information
in the ``fakeCat`` to make fake galaxies (using galsim)
686 and fake stars, using the PSF models
from the PSF information
for the calexp. These are then added to
687 the calexp
and the calexp
with fakes included returned.
689 The galsim galaxies are made using a double sersic profile, one
for the bulge
and one
for the disk,
690 this
is then convolved
with the PSF at that point.
692 If exposureIdInfo
is not provided then the SourceCatalog IDs will
not be globally unique.
694 fakeCat = self.composeFakeCat(fakeCats, skyMap)
697 wcs = exposure.getWcs()
699 if photoCalib
is None:
700 photoCalib = exposure.getPhotoCalib()
702 if exposureIdInfo
is None:
703 exposureIdInfo = ExposureIdInfo()
705 band = exposure.getFilter().bandLabel
706 ccdVisitMagnitudes = self.addVariablity(fakeCat, band, exposure, photoCalib, exposureIdInfo)
708 self.insertFakes.run(fakeCat, exposure, wcs, photoCalib)
711 returnedStruct = self.calibrate.run(exposure, exposureIdInfo=exposureIdInfo)
712 sourceCat = returnedStruct.sourceCat
714 sourceCat = self.copyCalibrationFields(sfdSourceCat, sourceCat, self.config.srcFieldsToCopy)
716 resultStruct = pipeBase.Struct(outputExposure=exposure,
718 ccdVisitFakeMagnitudes=ccdVisitMagnitudes)
721 def addVariablity(self, fakeCat, band, exposure, photoCalib, exposureIdInfo):
722 """Add scatter to the fake catalog visit magnitudes.
724 Currently just adds a simple Gaussian scatter around the static fake
725 magnitude. This function could be modified to return any number of
730 fakeCat : `pandas.DataFrame`
731 Catalog of fakes to modify magnitudes of.
733 Current observing band to modify.
734 exposure : `lsst.afw.image.ExposureF`
735 Exposure fakes will be added to.
737 Photometric calibration object of ``exposure``.
738 exposureIdInfo : `lsst.obs.base.ExposureIdInfo`
739 Exposure id information
and metadata.
743 dataFrame : `pandas.DataFrame`
744 DataFrame containing the values of the magnitudes to that will
745 be inserted into this ccdVisit.
747 expId = exposureIdInfo.expId
748 rng = np.random.default_rng(expId)
749 magScatter = rng.normal(loc=0,
750 scale=self.config.scatterSize,
752 visitMagnitudes = fakeCat[self.insertFakes.config.mag_col % band] + magScatter
753 fakeCat.loc[:, self.insertFakes.config.mag_col % band] = visitMagnitudes
754 return pd.DataFrame(data={
"variableMag": visitMagnitudes})
std::vector< SchemaItem< Flag > > * items
A 2-dimensional celestial WCS that transform pixels to ICRS RA/Dec, using the LSST standard for pixel...
The photometric calibration of an exposure.
A mapping between the keys of two Schemas, used to copy data between them.
daf::base::PropertySet * set
SourceMatchVector matchXy(SourceCatalog const &cat1, SourceCatalog const &cat2, double radius, MatchControl const &mc=MatchControl())
Compute all tuples (s1,s2,d) where s1 belings to cat1, s2 belongs to cat2 and d, the distance between...
A description of a field in a table.