23"""Class for running fgcmcal on a single tract using sourceTable_visit tables.
27import lsst.pipe.base
as pipeBase
28from lsst.pipe.base
import connectionTypes
29from lsst.meas.algorithms
import ReferenceObjectLoader, LoadReferenceObjectsConfig
30import lsst.afw.table
as afwTable
32from .fgcmBuildStarsTable
import FgcmBuildStarsTableTask
33from .fgcmCalibrateTractBase
import (FgcmCalibrateTractConfigBase,
34 FgcmCalibrateTractBaseTask)
36__all__ = [
'FgcmCalibrateTractTableConfig',
'FgcmCalibrateTractTableTask']
40 dimensions=(
"instrument",
42 camera = connectionTypes.PrerequisiteInput(
43 doc=
"Camera instrument",
45 storageClass=
"Camera",
46 dimensions=(
"instrument",),
50 fgcmLookUpTable = connectionTypes.PrerequisiteInput(
51 doc=(
"Atmosphere + instrument look-up-table for FGCM throughput and "
52 "chromatic corrections."),
53 name=
"fgcmLookUpTable",
54 storageClass=
"Catalog",
55 dimensions=(
"instrument",),
59 sourceSchema = connectionTypes.InitInput(
60 doc=
"Schema for source catalogs",
62 storageClass=
"SourceCatalog",
65 refCat = connectionTypes.PrerequisiteInput(
66 doc=
"Reference catalog to use for photometric calibration",
68 storageClass=
"SimpleCatalog",
69 dimensions=(
"skypix",),
74 source_catalogs = connectionTypes.Input(
75 doc=
"Source table in parquet format, per visit",
76 name=
"sourceTable_visit",
77 storageClass=
"DataFrame",
78 dimensions=(
"instrument",
"visit"),
83 visitSummary = connectionTypes.Input(
84 doc=
"Per-visit summary statistics table",
86 storageClass=
"ExposureCatalog",
87 dimensions=(
"instrument",
"visit"),
92 background = connectionTypes.Input(
93 doc=
"Calexp background model",
94 name=
"calexpBackground",
95 storageClass=
"Background",
96 dimensions=(
"instrument",
"visit",
"detector"),
101 fgcmPhotoCalib = connectionTypes.Output(
102 doc=
"Per-tract, per-visit photoCalib exposure catalogs produced from fgcm calibration",
103 name=
"fgcmPhotoCalibTractCatalog",
104 storageClass=
"ExposureCatalog",
105 dimensions=(
"instrument",
"tract",
"visit",),
109 fgcmTransmissionAtmosphere = connectionTypes.Output(
110 doc=
"Per-visit atmosphere transmission files produced from fgcm calibration",
111 name=
"transmission_atmosphere_fgcm_tract",
112 storageClass=
"TransmissionCurve",
113 dimensions=(
"instrument",
"tract",
"visit",),
117 fgcmRepeatability = connectionTypes.Output(
118 doc=
"Per-band raw repeatability numbers in the fgcm tract calibration",
119 name=
"fgcmRawRepeatability",
120 storageClass=
"Catalog",
121 dimensions=(
"instrument",
"tract",),
128 if not config.fgcmBuildStars.doModelErrorsWithBackground:
129 self.inputs.remove(
"background")
131 if not config.fgcmOutputProducts.doAtmosphereOutput:
132 self.prerequisiteInputs.remove(
"fgcmAtmosphereParameters")
133 if not config.fgcmOutputProducts.doZeropointOutput:
134 self.prerequisiteInputs.remove(
"fgcmZeropoints")
137 return (
"visitSummary",)
141 pipelineConnections=FgcmCalibrateTractTableConnections):
142 """Config for FgcmCalibrateTractTable task"""
155 Calibrate a single tract using fgcmcal, using sourceTable_visit (parquet)
158 ConfigClass = FgcmCalibrateTractTableConfig
159 _DefaultName = "fgcmCalibrateTractTable"
161 canMultiprocess =
False
164 super().
__init__(initInputs=initInputs, **kwargs)
165 if initInputs
is not None:
169 handleDict = butlerQC.get(inputRefs)
171 self.log.info(
"Running with %d sourceTable_visit handles", (len(handleDict[
'source_catalogs'])))
174 tract = butlerQC.quantum.dataId[
'tract']
178 sourceTableHandles = handleDict[
'source_catalogs']
179 sourceTableHandleDict = {sourceTableHandle.dataId[
'visit']: sourceTableHandle
for
180 sourceTableHandle
in sourceTableHandles}
182 visitSummaryHandles = handleDict[
'visitSummary']
183 visitSummaryHandleDict = {visitSummaryHandle.dataId[
'visit']: visitSummaryHandle
for
184 visitSummaryHandle
in visitSummaryHandles}
186 handleDict[
'sourceTableHandleDict'] = sourceTableHandleDict
187 handleDict[
'visitSummaryHandleDict'] = visitSummaryHandleDict
190 if self.config.fgcmOutputProducts.doZeropointOutput:
191 photoCalibRefDict = {photoCalibRef.dataId.byName()[
'visit']:
192 photoCalibRef
for photoCalibRef
in outputRefs.fgcmPhotoCalib}
193 handleDict[
'fgcmPhotoCalibs'] = photoCalibRefDict
195 if self.config.fgcmOutputProducts.doAtmosphereOutput:
196 atmRefDict = {atmRef.dataId.byName()[
'visit']: atmRef
for
197 atmRef
in outputRefs.fgcmTransmissionAtmosphere}
198 handleDict[
'fgcmTransmissionAtmospheres'] = atmRefDict
200 if self.config.fgcmBuildStars.doReferenceMatches:
201 refConfig = LoadReferenceObjectsConfig()
202 refConfig.filterMap = self.config.fgcmBuildStars.fgcmLoadReferenceCatalog.filterMap
203 loader = ReferenceObjectLoader(dataIds=[ref.datasetRef.dataId
204 for ref
in inputRefs.refCat],
205 refCats=butlerQC.get(inputRefs.refCat),
206 name=self.config.connections.refCat,
209 buildStarsRefObjLoader = loader
211 buildStarsRefObjLoader =
None
213 if self.config.fgcmOutputProducts.doReferenceCalibration:
214 refConfig = self.config.fgcmOutputProducts.refObjLoader
215 loader = ReferenceObjectLoader(dataIds=[ref.datasetRef.dataId
216 for ref
in inputRefs.refCat],
217 refCats=butlerQC.get(inputRefs.refCat),
218 name=self.config.connections.refCat,
221 self.fgcmOutputProducts.refObjLoader = loader
223 struct = self.
run(handleDict, tract,
224 buildStarsRefObjLoader=buildStarsRefObjLoader)
226 if struct.photoCalibCatalogs
is not None:
227 self.log.info(
"Outputting photoCalib catalogs.")
228 for visit, expCatalog
in struct.photoCalibCatalogs:
229 butlerQC.put(expCatalog, photoCalibRefDict[visit])
230 self.log.info(
"Done outputting photoCalib catalogs.")
232 if struct.atmospheres
is not None:
233 self.log.info(
"Outputting atmosphere transmission files.")
234 for visit, atm
in struct.atmospheres:
235 butlerQC.put(atm, atmRefDict[visit])
236 self.log.info(
"Done outputting atmosphere files.")
239 schema = afwTable.Schema()
240 schema.addField(
'rawRepeatability', type=np.float64,
241 doc=
"Per-band raw repeatability in FGCM calibration.")
242 repeatabilityCat = afwTable.BaseCatalog(schema)
243 repeatabilityCat.resize(len(struct.repeatability))
244 repeatabilityCat[
'rawRepeatability'][:] = struct.repeatability
246 butlerQC.put(repeatabilityCat, outputRefs.fgcmRepeatability)
run(self, handleDict, tract, buildStarsRefObjLoader=None, returnCatalogs=True)
getSpatialBoundsConnections(self)
__init__(self, *config=None)
runQuantum(self, butlerQC, inputRefs, outputRefs)
__init__(self, initInputs=None, **kwargs)