50 lutFilterNames, tract=None, nCore=1, doPlots=False):
51 """
52 Make the FGCM fit cycle configuration dict
53
54 Parameters
55 ----------
56 config : `lsst.fgcmcal.FgcmFitCycleConfig`
57 Configuration object
58 log : `logging.Logger`
59 Log object.
60 camera : `lsst.afw.cameraGeom.Camera`
61 Camera from the butler
62 maxIter : `int`
63 Maximum number of iterations
64 resetFitParameters: `bool`
65 Reset fit parameters before fitting?
66 outputZeropoints : `bool`
67 Compute zeropoints for output?
68 lutFilterNames : array-like, `str`
69 Array of physical filter names in the LUT.
70 tract : `int`, optional
71 Tract number for extending the output file name for debugging.
72 Default is None.
73 nCore : `int`, optional
74 Number of cores to use.
75 doPlots : `bool`, optional
76 Make FGCM QA plots?
77
78 Returns
79 -------
80 configDict : `dict`
81 Configuration dictionary for fgcm
82 """
83
84 notFitBands = [b for b in config.bands if b not in config.fitBands]
85
86
87 starColorCutList = []
88 for ccut in config.starColorCuts:
89 if ccut == 'NO_DATA':
90
91 break
92 parts = ccut.split(',')
93 starColorCutList.append([parts[0], parts[1], float(parts[2]), float(parts[3])])
94
95
96 refStarColorCutList = []
97 for ccut in config.refStarColorCuts:
98 if ccut == 'NO_DATA':
99
100 break
101 parts = ccut.split(',')
102 refStarColorCutList.append([parts[0], parts[1], float(parts[2]), float(parts[3])])
103
104
105
106
107 if config.mirrorArea is None:
108 mirrorArea = np.pi*(camera.telescopeDiameter*100./2.)**2.
109 else:
110
111 mirrorArea = config.mirrorArea * 100.**2.
112
113 if config.cameraGain is None:
114
115 gains = [amp.getGain() for detector in camera for amp in detector.getAmplifiers()]
116 cameraGain = float(np.median(gains))
117 else:
118 cameraGain = config.cameraGain
119
120
121 filterToBand = {filterName: config.physicalFilterMap[filterName] for
122 filterName in lutFilterNames}
123
124 if tract is None:
125 outfileBase = config.outfileBase
126 else:
127 outfileBase = '%s-%06d' % (config.outfileBase, tract)
128
129 if config.aperCorrPerCcd:
130 seeingField = 'DELTA_APER_DETECTOR'
131 else:
132 seeingField = 'DELTA_APER'
133
134
135 configDict = {'outfileBase': outfileBase,
136 'logger': log,
137 'exposureFile': None,
138 'obsFile': None,
139 'indexFile': None,
140 'lutFile': None,
141 'mirrorArea': mirrorArea,
142 'cameraGain': cameraGain,
143 'ccdStartIndex': camera[0].getId(),
144 'expField': FGCM_EXP_FIELD,
145 'ccdField': FGCM_CCD_FIELD,
146 'seeingField': seeingField,
147 'fwhmField': 'PSFFWHM',
148 'skyBrightnessField': 'SKYBACKGROUND',
149 'deepFlag': 'DEEPFLAG',
150 'bands': list(config.bands),
151 'fitBands': list(config.fitBands),
152 'notFitBands': notFitBands,
153 'requiredBands': list(config.requiredBands),
154 'filterToBand': filterToBand,
155 'logLevel': 'INFO',
156 'nCore': nCore,
157 'nStarPerRun': config.nStarPerRun,
158 'nExpPerRun': config.nExpPerRun,
159 'reserveFraction': config.reserveFraction,
160 'freezeStdAtmosphere': config.freezeStdAtmosphere,
161 'precomputeSuperStarInitialCycle': config.precomputeSuperStarInitialCycle,
162 'superStarSubCCDDict': dict(config.superStarSubCcdDict),
163 'superStarSubCCDChebyshevOrder': config.superStarSubCcdChebyshevOrder,
164 'superStarSubCCDTriangular': config.superStarSubCcdTriangular,
165 'superStarSigmaClip': config.superStarSigmaClip,
166 'superStarPlotCCDResiduals': config.superStarPlotCcdResiduals,
167 'superStarForceZeroMean': config.superStarForceZeroMean,
168 'focalPlaneSigmaClip': config.focalPlaneSigmaClip,
169 'ccdGraySubCCDDict': dict(config.ccdGraySubCcdDict),
170 'ccdGraySubCCDChebyshevOrder': config.ccdGraySubCcdChebyshevOrder,
171 'ccdGraySubCCDTriangular': config.ccdGraySubCcdTriangular,
172 'ccdGrayFocalPlaneDict': dict(config.ccdGrayFocalPlaneDict),
173 'ccdGrayFocalPlaneChebyshevOrder': config.ccdGrayFocalPlaneChebyshevOrder,
174 'ccdGrayFocalPlaneFitMinCcd': config.ccdGrayFocalPlaneFitMinCcd,
175 'ccdGrayFocalPlaneMaxStars': config.ccdGrayFocalPlaneMaxStars,
176 'cycleNumber': config.cycleNumber,
177 'maxIter': maxIter,
178 'deltaMagBkgOffsetPercentile': config.deltaMagBkgOffsetPercentile,
179 'deltaMagBkgPerCcd': config.deltaMagBkgPerCcd,
180 'UTBoundary': config.utBoundary,
181 'washMJDs': config.washMjds,
182 'epochMJDs': config.epochMjds,
183 'coatingMJDs': config.coatingMjds,
184 'minObsPerBand': config.minObsPerBand,
185 'latitude': config.latitude,
186 'defaultCameraOrientation': config.defaultCameraOrientation,
187 'brightObsGrayMax': config.brightObsGrayMax,
188 'minStarPerCCD': config.minStarPerCcd,
189 'minCCDPerExp': config.minCcdPerExp,
190 'maxCCDGrayErr': config.maxCcdGrayErr,
191 'minStarPerExp': config.minStarPerExp,
192 'minExpPerNight': config.minExpPerNight,
193 'expGrayInitialCut': config.expGrayInitialCut,
194 'expFwhmCutDict': dict(config.expFwhmCutDict),
195 'expGrayPhotometricCutDict': dict(config.expGrayPhotometricCutDict),
196 'expGrayHighCutDict': dict(config.expGrayHighCutDict),
197 'expGrayRecoverCut': config.expGrayRecoverCut,
198 'expVarGrayPhotometricCutDict': dict(config.expVarGrayPhotometricCutDict),
199 'expGrayErrRecoverCut': config.expGrayErrRecoverCut,
200 'refStarSnMin': config.refStarSnMin,
201 'refStarOutlierNSig': config.refStarOutlierNSig,
202 'applyRefStarColorCuts': config.applyRefStarColorCuts,
203 'refStarMaxFracUse': config.refStarMaxFracUse,
204 'useExposureReferenceOffset': config.useExposureReferenceOffset,
205 'illegalValue': FGCM_ILLEGAL_VALUE,
206 'starColorCuts': starColorCutList,
207 'refStarColorCuts': refStarColorCutList,
208 'aperCorrFitNBins': config.aperCorrFitNBins,
209 'aperCorrInputSlopeDict': dict(config.aperCorrInputSlopeDict),
210 'sedBoundaryTermDict': config.sedboundaryterms.toDict()['data'],
211 'sedTermDict': config.sedterms.toDict()['data'],
212 'colorSplitBands': list(config.colorSplitBands),
213 'sigFgcmMaxErr': config.sigFgcmMaxErr,
214 'sigFgcmMaxEGrayDict': dict(config.sigFgcmMaxEGrayDict),
215 'ccdGrayMaxStarErr': config.ccdGrayMaxStarErr,
216 'approxThroughputDict': dict(config.approxThroughputDict),
217 'sigmaCalRange': list(config.sigmaCalRange),
218 'sigmaCalFitPercentile': list(config.sigmaCalFitPercentile),
219 'sigmaCalPlotPercentile': list(config.sigmaCalPlotPercentile),
220 'sigma0Phot': config.sigma0Phot,
221 'mapLongitudeRef': config.mapLongitudeRef,
222 'mapNSide': config.mapNSide,
223 'varNSig': 100.0,
224 'varMinBand': 2,
225 'useRetrievedPwv': False,
226 'useNightlyRetrievedPwv': False,
227 'pwvRetrievalSmoothBlock': 25,
228 'useQuadraticPwv': config.useQuadraticPwv,
229 'useRetrievedTauInit': False,
230 'tauRetrievalMinCCDPerNight': 500,
231 'modelMagErrors': config.modelMagErrors,
232 'instrumentParsPerBand': config.instrumentParsPerBand,
233 'instrumentSlopeMinDeltaT': config.instrumentSlopeMinDeltaT,
234 'fitMirrorChromaticity': config.fitMirrorChromaticity,
235 'fitCCDChromaticityDict': dict(config.fitCcdChromaticityDict),
236 'useRepeatabilityForExpGrayCutsDict': dict(config.useRepeatabilityForExpGrayCutsDict),
237 'autoPhotometricCutNSig': config.autoPhotometricCutNSig,
238 'autoHighCutNSig': config.autoHighCutNSig,
239 'deltaAperInnerRadiusArcsec': config.deltaAperInnerRadiusArcsec,
240 'deltaAperOuterRadiusArcsec': config.deltaAperOuterRadiusArcsec,
241 'deltaAperFitMinNgoodObs': config.deltaAperFitMinNgoodObs,
242 'deltaAperFitPerCcdNx': config.deltaAperFitPerCcdNx,
243 'deltaAperFitPerCcdNy': config.deltaAperFitPerCcdNy,
244 'deltaAperFitSpatialNside': config.deltaAperFitSpatialNside,
245 'doComputeDeltaAperExposures': config.doComputeDeltaAperPerVisit,
246 'doComputeDeltaAperStars': config.doComputeDeltaAperPerStar,
247 'doComputeDeltaAperMap': config.doComputeDeltaAperMap,
248 'doComputeDeltaAperPerCcd': config.doComputeDeltaAperPerCcd,
249 'printOnly': False,
250 'quietMode': config.quietMode,
251 'randomSeed': config.randomSeed,
252 'outputStars': False,
253 'outputPath': os.path.abspath('.'),
254 'clobber': True,
255 'useSedLUT': False,
256 'resetParameters': resetFitParameters,
257 'doPlots': doPlots,
258 'outputFgcmcalZpts': True,
259 'outputZeropoints': outputZeropoints}
260
261 return configDict
262
263