23Define dataset class for MeasurePhotonTransferCurve task
26__all__ = [
'PhotonTransferCurveDataset']
29from astropy.table
import Table
36 """A simple class to hold the output data from the PTC task.
38 The dataset is made up of a dictionary
for each item, keyed by the
39 amplifiers
' names, which much be supplied at construction time.
40 New items cannot be added to the class to save accidentally saving to the
41 wrong property,
and the
class can be frozen if desired.
42 inputExpIdPairs records the exposures used to produce the data.
43 When fitPtc()
or fitCovariancesAstier()
is run, a mask
is built up, which
44 is by definition always the same length
as inputExpIdPairs, rawExpTimes,
45 rawMeans
and rawVars,
and is a list of bools, which are incrementally set
46 to
False as points are discarded
from the fits.
47 PTC fit parameters
for polynomials are stored
in a list
in ascending order
48 of polynomial term, i.e. par[0]*x^0 + par[1]*x + par[2]*x^2 etc
49 with the length of the list corresponding to the order of the polynomial
55 List
with the names of the amplifiers of the detector at hand.
57 Type of model fitted to the PTC:
"POLYNOMIAL",
"EXPAPPROXIMATION",
60 Maximum lag of covariances (size of square covariance matrices).
61 kwargs : `dict`, optional
62 Other keyword arguments to
pass to the parent init.
66 The stored attributes are:
68 badAmps : `list` [`str`]
69 List
with bad amplifiers names.
70 inputExpIdPairs : `dict`, [`str`, `list`]
71 Dictionary keyed by amp names containing the input exposures IDs.
72 expIdMask : `dict`, [`str`, `np.ndarray`]
73 Dictionary keyed by amp names containing the mask produced after
74 outlier rejection. The mask produced by the
"FULLCOVARIANCE"
75 option may differ
from the one produced
in the other two PTC
77 rawExpTimes : `dict`, [`str`, `np.ndarray`]
78 Dictionary keyed by amp names containing the unmasked exposure times.
79 rawMeans : `dict`, [`str`, `np.ndarray`]
80 Dictionary keyed by amp names containing the unmasked average of the
81 means of the exposures
in each flat pair.
82 rawVars : `dict`, [`str`, `np.ndarray`]
83 Dictionary keyed by amp names containing the variance of the
84 difference image of the exposures
in each flat pair.
85 histVars : `dict`, [`str`, `np.ndarray`]
86 Dictionary keyed by amp names containing the variance of the
87 difference image of the exposures
in each flat pair estimated
88 by fitting a Gaussian model.
89 histChi2Dofs : `dict`, [`str`, `np.ndarray`]
90 Dictionary keyed by amp names containing the chi-squared per degree
91 of freedom fitting the difference image to a Gaussian model.
92 kspValues : `dict`, [`str`, `np.ndarray`]
93 Dictionary keyed by amp names containing the KS test p-value
from
94 fitting the difference image to a Gaussian model.
95 gain : `dict`, [`str`, `float`]
96 Dictionary keyed by amp names containing the fitted gains.
97 gainErr : `dict`, [`str`, `float`]
98 Dictionary keyed by amp names containing the errors on the
100 noise : `dict`, [`str`, `float`]
101 Dictionary keyed by amp names containing the fitted noise.
102 noiseErr : `dict`, [`str`, `float`]
103 Dictionary keyed by amp names containing the errors on the fitted
105 ptcFitPars : `dict`, [`str`, `np.ndarray`]
106 Dictionary keyed by amp names containing the fitted parameters of the
107 PTC model
for ptcFitTye
in [
"POLYNOMIAL",
"EXPAPPROXIMATION"].
108 ptcFitParsError : `dict`, [`str`, `np.ndarray`]
109 Dictionary keyed by amp names containing the errors on the fitted
110 parameters of the PTC model
for ptcFitTye
in
111 [
"POLYNOMIAL",
"EXPAPPROXIMATION"].
112 ptcFitChiSq : `dict`, [`str`, `float`]
113 Dictionary keyed by amp names containing the reduced chi squared
114 of the fit
for ptcFitTye
in [
"POLYNOMIAL",
"EXPAPPROXIMATION"].
115 ptcTurnoff : `dict` [`str, `float`]
116 Flux value (
in ADU) where the variance of the PTC curve starts
117 decreasing consistently.
118 covariances : `dict`, [`str`, `np.ndarray`]
119 Dictionary keyed by amp names containing a list of measured
120 covariances per mean flux.
121 covariancesModel : `dict`, [`str`, `np.ndarray`]
122 Dictionary keyed by amp names containinging covariances model
123 (Eq. 20 of Astier+19) per mean flux.
124 covariancesSqrtWeights : `dict`, [`str`, `np.ndarray`]
125 Dictionary keyed by amp names containinging sqrt. of covariances
127 aMatrix : `dict`, [`str`, `np.ndarray`]
128 Dictionary keyed by amp names containing the
"a" parameters
from
129 the model
in Eq. 20 of Astier+19.
130 bMatrix : `dict`, [`str`, `np.ndarray`]
131 Dictionary keyed by amp names containing the
"b" parameters
from
132 the model
in Eq. 20 of Astier+19.
133 noiseMatrix : `dict`, [`str`, `np.ndarray`]
134 Dictionary keyed by amp names containing the
"noise" parameters
from
135 the model
in Eq. 20 of Astier+19.
136 covariancesModelNoB : `dict`, [`str`, `np.ndarray`]
137 Dictionary keyed by amp names containing covariances model
138 (
with 'b'=0
in Eq. 20 of Astier+19)
140 aMatrixNoB : `dict`, [`str`, `np.ndarray`]
141 Dictionary keyed by amp names containing the
"a" parameters
from the
142 model
in Eq. 20 of Astier+19
144 noiseMatrixNoB : `dict`, [`str`, `np.ndarray`]
145 Dictionary keyed by amp names containing the
"noise" parameters
from
146 the model
in Eq. 20 of Astier+19,
with 'b' = 0.
147 finalVars : `dict`, [`str`, `np.ndarray`]
148 Dictionary keyed by amp names containing the masked variance of the
149 difference image of each flat
150 pair. If needed, each array will be right-padded
with
151 np.nan to match the length of rawExpTimes.
152 finalModelVars : `dict`, [`str`, `np.ndarray`]
153 Dictionary keyed by amp names containing the masked modeled
154 variance of the difference image of each flat pair. If needed, each
155 array will be right-padded
with np.nan to match the length of
157 finalMeans : `dict`, [`str`, `np.ndarray`]
158 Dictionary keyed by amp names containing the masked average of the
159 means of the exposures
in each flat pair. If needed, each array
160 will be right-padded
with np.nan to match the length of
162 photoCharges : `dict`, [`str`, `np.ndarray`]
163 Dictionary keyed by amp names containing the integrated photocharge
164 for linearity calibration.
166 Version 1.1 adds the `ptcTurnoff` attribute.
167 Version 1.2 adds the `histVars`, `histChi2Dofs`,
and `kspValues`
169 Version 1.3 adds the `noiseMatrix`
and `noiseMatrixNoB` attributes.
173 _SCHEMA =
'Gen3 Photon Transfer Curve'
176 def __init__(self, ampNames=[], ptcFitType=None, covMatrixSide=1, **kwargs):
184 self.
expIdMask = {ampName: np.array([], dtype=bool)
for ampName
in ampNames}
185 self.
rawExpTimes = {ampName: np.array([])
for ampName
in ampNames}
186 self.
rawMeans = {ampName: np.array([])
for ampName
in ampNames}
187 self.
rawVars = {ampName: np.array([])
for ampName
in ampNames}
190 self.
gain = {ampName: np.nan
for ampName
in ampNames}
191 self.
gainErr = {ampName: np.nan
for ampName
in ampNames}
192 self.
noise = {ampName: np.nan
for ampName
in ampNames}
193 self.
noiseErr = {ampName: np.nan
for ampName
in ampNames}
195 self.
histVars = {ampName: np.array([])
for ampName
in ampNames}
197 self.
kspValues = {ampName: np.array([])
for ampName
in ampNames}
199 self.
ptcFitPars = {ampName: np.array([])
for ampName
in ampNames}
204 self.
covariances = {ampName: np.array([])
for ampName
in ampNames}
207 self.
aMatrix = {ampName: np.array([])
for ampName
in ampNames}
208 self.
bMatrix = {ampName: np.array([])
for ampName
in ampNames}
209 self.
noiseMatrix = {ampName: np.array([])
for ampName
in ampNames}
211 self.
aMatrixNoB = {ampName: np.array([])
for ampName
in ampNames}
214 self.
finalVars = {ampName: np.array([])
for ampName
in ampNames}
216 self.
finalMeans = {ampName: np.array([])
for ampName
in ampNames}
220 'rawMeans',
'rawVars',
'gain',
'gainErr',
'noise',
'noiseErr',
221 'ptcFitPars',
'ptcFitParsError',
'ptcFitChiSq',
'ptcTurnoff',
222 'aMatrixNoB',
'covariances',
'covariancesModel',
223 'covariancesSqrtWeights',
'covariancesModelNoB',
224 'aMatrix',
'bMatrix',
'noiseMatrix',
'noiseMatrixNoB',
'finalVars',
225 'finalModelVars',
'finalMeans',
'photoCharges',
'histVars',
226 'histChi2Dofs',
'kspValues'])
233 inputExpIdPair=(-1, -1),
248 Set the amp values for a partial PTC Dataset (
from cpExtractPtcTask).
253 Name of the amp to set the values.
254 inputExpIdPair : `tuple` [`int`]
255 Exposure IDs of input pair.
256 rawExpTime : `float`, optional
257 Exposure time
for this exposure pair.
258 rawMean : `float`, optional
259 Average of the means of the exposures
in this pair.
260 rawVar : `float`, optional
261 Variance of the difference of the exposures
in this pair.
262 photoCharge : `float`, optional
263 Integrated photocharge
for flat pair
for linearity calibration.
264 expIdMask : `bool`, optional
265 Flag setting
if this exposure pair should be used (
True)
267 covariance : `np.ndarray`
or None, optional
268 Measured covariance
for this exposure pair.
269 covSqrtWeights : `np.ndarray`
or None, optional
270 Measured sqrt of covariance weights
in this exposure pair.
271 gain : `float`, optional
272 Estimated gain
for this exposure pair.
273 noise : `float`, optional
274 Estimated read noise
for this exposure pair.
275 histVar : `float`, optional
276 Variance estimated
from fitting a histogram
with a Gaussian model.
277 histChi2Dof : `float`, optional
278 Chi-squared per degree of freedom
from Gaussian histogram fit.
279 kspValue : `float`, optional
280 KS test p-value
from the Gaussian histogram fit.
283 if covariance
is None:
284 covariance = nanMatrix
285 if covSqrtWeights
is None:
286 covSqrtWeights = nanMatrix
290 self.
rawMeans[ampName] = np.array([rawMean])
291 self.
rawVars[ampName] = np.array([rawVar])
293 self.
expIdMask[ampName] = np.array([expIdMask])
296 self.
gain[ampName] = gain
297 self.
noise[ampName] = noise
298 self.
histVars[ampName] = np.array([histVar])
300 self.
kspValues[ampName] = np.array([kspValue])
304 self.
aMatrix[ampName] = nanMatrix
305 self.
bMatrix[ampName] = nanMatrix
311 """Update calibration metadata.
312 This calls the base class's method after ensuring the required
313 calibration keywords will be saved.
317 setDate : `bool`, optional
318 Update the CALIBDATE fields in the metadata to the current
319 time. Defaults to
False.
321 Other keyword parameters to set
in the metadata.
327 """Construct a calibration from a dictionary of properties.
328 Must be implemented by the specific calibration subclasses.
333 Dictionary of properties.
338 Constructed calibration.
343 Raised if the supplied dictionary
is for a different
347 if calib._OBSTYPE != dictionary[
'metadata'][
'OBSTYPE']:
348 raise RuntimeError(f
"Incorrect Photon Transfer Curve dataset supplied. "
349 f
"Expected {calib._OBSTYPE}, found {dictionary['metadata']['OBSTYPE']}")
350 calib.setMetadata(dictionary[
'metadata'])
351 calib.ptcFitType = dictionary[
'ptcFitType']
352 calib.covMatrixSide = dictionary[
'covMatrixSide']
353 calib.badAmps = np.array(dictionary[
'badAmps'],
'str').tolist()
357 covMatrixSide = calib.covMatrixSide
359 covDimensionsProduct = len(np.array(list(dictionary[
'covariances'].values())[0]).ravel())
360 nSignalPoints = int(covDimensionsProduct/(covMatrixSide*covMatrixSide))
362 for ampName
in dictionary[
'ampNames']:
363 calib.ampNames.append(ampName)
364 calib.inputExpIdPairs[ampName] = dictionary[
'inputExpIdPairs'][ampName]
365 calib.expIdMask[ampName] = np.array(dictionary[
'expIdMask'][ampName])
366 calib.rawExpTimes[ampName] = np.array(dictionary[
'rawExpTimes'][ampName], dtype=np.float64)
367 calib.rawMeans[ampName] = np.array(dictionary[
'rawMeans'][ampName], dtype=np.float64)
368 calib.rawVars[ampName] = np.array(dictionary[
'rawVars'][ampName], dtype=np.float64)
369 calib.gain[ampName] = float(dictionary[
'gain'][ampName])
370 calib.gainErr[ampName] = float(dictionary[
'gainErr'][ampName])
371 calib.noise[ampName] = float(dictionary[
'noise'][ampName])
372 calib.noiseErr[ampName] = float(dictionary[
'noiseErr'][ampName])
373 calib.histVars[ampName] = np.array(dictionary[
'histVars'][ampName], dtype=np.float64)
374 calib.histChi2Dofs[ampName] = np.array(dictionary[
'histChi2Dofs'][ampName], dtype=np.float64)
375 calib.kspValues[ampName] = np.array(dictionary[
'kspValues'][ampName], dtype=np.float64)
376 calib.ptcFitPars[ampName] = np.array(dictionary[
'ptcFitPars'][ampName], dtype=np.float64)
377 calib.ptcFitParsError[ampName] = np.array(dictionary[
'ptcFitParsError'][ampName],
379 calib.ptcFitChiSq[ampName] = float(dictionary[
'ptcFitChiSq'][ampName])
380 calib.ptcTurnoff[ampName] = float(dictionary[
'ptcTurnoff'][ampName])
381 if nSignalPoints > 0:
383 calib.covariances[ampName] = np.array(dictionary[
'covariances'][ampName],
384 dtype=np.float64).reshape(
385 (nSignalPoints, covMatrixSide, covMatrixSide))
386 calib.covariancesModel[ampName] = np.array(
387 dictionary[
'covariancesModel'][ampName],
388 dtype=np.float64).reshape(
389 (nSignalPoints, covMatrixSide, covMatrixSide))
390 calib.covariancesSqrtWeights[ampName] = np.array(
391 dictionary[
'covariancesSqrtWeights'][ampName],
392 dtype=np.float64).reshape(
393 (nSignalPoints, covMatrixSide, covMatrixSide))
394 calib.aMatrix[ampName] = np.array(dictionary[
'aMatrix'][ampName],
395 dtype=np.float64).reshape(
396 (covMatrixSide, covMatrixSide))
397 calib.bMatrix[ampName] = np.array(dictionary[
'bMatrix'][ampName],
398 dtype=np.float64).reshape(
399 (covMatrixSide, covMatrixSide))
400 calib.covariancesModelNoB[ampName] = np.array(
401 dictionary[
'covariancesModelNoB'][ampName], dtype=np.float64).reshape(
402 (nSignalPoints, covMatrixSide, covMatrixSide))
403 calib.aMatrixNoB[ampName] = np.array(
404 dictionary[
'aMatrixNoB'][ampName],
405 dtype=np.float64).reshape((covMatrixSide, covMatrixSide))
406 calib.noiseMatrix[ampName] = np.array(
407 dictionary[
'noiseMatrix'][ampName],
408 dtype=np.float64).reshape((covMatrixSide, covMatrixSide))
409 calib.noiseMatrixNoB[ampName] = np.array(
410 dictionary[
'noiseMatrixNoB'][ampName],
411 dtype=np.float64).reshape((covMatrixSide, covMatrixSide))
414 calib.covariances[ampName] = np.array([], dtype=np.float64)
415 calib.covariancesModel[ampName] = np.array([], dtype=np.float64)
416 calib.covariancesSqrtWeights[ampName] = np.array([], dtype=np.float64)
417 calib.aMatrix[ampName] = np.array([], dtype=np.float64)
418 calib.bMatrix[ampName] = np.array([], dtype=np.float64)
419 calib.covariancesModelNoB[ampName] = np.array([], dtype=np.float64)
420 calib.aMatrixNoB[ampName] = np.array([], dtype=np.float64)
421 calib.noiseMatrix[ampName] = np.array([], dtype=np.float64)
422 calib.noiseMatrixNoB[ampName] = np.array([], dtype=np.float64)
424 calib.finalVars[ampName] = np.array(dictionary[
'finalVars'][ampName], dtype=np.float64)
425 calib.finalModelVars[ampName] = np.array(dictionary[
'finalModelVars'][ampName], dtype=np.float64)
426 calib.finalMeans[ampName] = np.array(dictionary[
'finalMeans'][ampName], dtype=np.float64)
427 calib.photoCharges[ampName] = np.array(dictionary[
'photoCharges'][ampName], dtype=np.float64)
429 calib.updateMetadata()
433 """Return a dictionary containing the calibration properties.
434 The dictionary should be able to be round-tripped through
440 Dictionary of properties.
446 outDict['metadata'] = metadata
448 def _dictOfArraysToDictOfLists(dictOfArrays):
450 for key, value
in dictOfArrays.items():
451 dictOfLists[key] = value.ravel().tolist()
458 outDict[
'badAmps'] = self.
badAmps
460 outDict[
'expIdMask'] = _dictOfArraysToDictOfLists(self.
expIdMask)
461 outDict[
'rawExpTimes'] = _dictOfArraysToDictOfLists(self.
rawExpTimes)
462 outDict[
'rawMeans'] = _dictOfArraysToDictOfLists(self.
rawMeans)
463 outDict[
'rawVars'] = _dictOfArraysToDictOfLists(self.
rawVars)
464 outDict[
'gain'] = self.
gain
465 outDict[
'gainErr'] = self.
gainErr
466 outDict[
'noise'] = self.
noise
471 outDict[
'ptcFitPars'] = _dictOfArraysToDictOfLists(self.
ptcFitPars)
472 outDict[
'ptcFitParsError'] = _dictOfArraysToDictOfLists(self.
ptcFitParsError)
475 outDict[
'covariances'] = _dictOfArraysToDictOfLists(self.
covariances)
476 outDict[
'covariancesModel'] = _dictOfArraysToDictOfLists(self.
covariancesModel)
478 outDict[
'aMatrix'] = _dictOfArraysToDictOfLists(self.
aMatrix)
479 outDict[
'bMatrix'] = _dictOfArraysToDictOfLists(self.
bMatrix)
480 outDict[
'noiseMatrix'] = _dictOfArraysToDictOfLists(self.
noiseMatrix)
482 outDict[
'aMatrixNoB'] = _dictOfArraysToDictOfLists(self.
aMatrixNoB)
483 outDict[
'noiseMatrixNoB'] = _dictOfArraysToDictOfLists(self.
noiseMatrixNoB)
484 outDict[
'finalVars'] = _dictOfArraysToDictOfLists(self.
finalVars)
485 outDict[
'finalModelVars'] = _dictOfArraysToDictOfLists(self.
finalModelVars)
486 outDict[
'finalMeans'] = _dictOfArraysToDictOfLists(self.
finalMeans)
487 outDict[
'photoCharges'] = _dictOfArraysToDictOfLists(self.
photoCharges)
493 """Construct calibration from a list of tables.
494 This method uses the `fromDict` method to create the
495 calibration, after constructing an appropriate dictionary from
500 tableList : `list` [`lsst.afw.table.Table`]
501 List of tables to use to construct the datasetPtc.
506 The calibration defined
in the tables.
508 ptcTable = tableList[0]
510 metadata = ptcTable.meta
512 inDict['metadata'] = metadata
513 inDict[
'ampNames'] = []
514 inDict[
'ptcFitType'] = []
515 inDict[
'covMatrixSide'] = []
516 inDict[
'inputExpIdPairs'] = dict()
517 inDict[
'expIdMask'] = dict()
518 inDict[
'rawExpTimes'] = dict()
519 inDict[
'rawMeans'] = dict()
520 inDict[
'rawVars'] = dict()
521 inDict[
'gain'] = dict()
522 inDict[
'gainErr'] = dict()
523 inDict[
'noise'] = dict()
524 inDict[
'noiseErr'] = dict()
525 inDict[
'histVars'] = dict()
526 inDict[
'histChi2Dofs'] = dict()
527 inDict[
'kspValues'] = dict()
528 inDict[
'ptcFitPars'] = dict()
529 inDict[
'ptcFitParsError'] = dict()
530 inDict[
'ptcFitChiSq'] = dict()
531 inDict[
'ptcTurnoff'] = dict()
532 inDict[
'covariances'] = dict()
533 inDict[
'covariancesModel'] = dict()
534 inDict[
'covariancesSqrtWeights'] = dict()
535 inDict[
'aMatrix'] = dict()
536 inDict[
'bMatrix'] = dict()
537 inDict[
'noiseMatrix'] = dict()
538 inDict[
'covariancesModelNoB'] = dict()
539 inDict[
'aMatrixNoB'] = dict()
540 inDict[
'noiseMatrixNoB'] = dict()
541 inDict[
'finalVars'] = dict()
542 inDict[
'finalModelVars'] = dict()
543 inDict[
'finalMeans'] = dict()
544 inDict[
'badAmps'] = []
545 inDict[
'photoCharges'] = dict()
547 calibVersion = metadata[
'PTC_VERSION']
548 if calibVersion == 1.0:
549 cls().log.warning(f
"Previous version found for PTC dataset: {calibVersion}. "
550 f
"Setting 'ptcTurnoff' in all amps to last value in 'finalMeans'.")
551 for record
in ptcTable:
552 ampName = record[
'AMPLIFIER_NAME']
554 inDict[
'ptcFitType'] = record[
'PTC_FIT_TYPE']
555 inDict[
'covMatrixSide'] = record[
'COV_MATRIX_SIDE']
556 inDict[
'ampNames'].append(ampName)
557 inDict[
'inputExpIdPairs'][ampName] = record[
'INPUT_EXP_ID_PAIRS'].tolist()
558 inDict[
'expIdMask'][ampName] = record[
'EXP_ID_MASK']
559 inDict[
'rawExpTimes'][ampName] = record[
'RAW_EXP_TIMES']
560 inDict[
'rawMeans'][ampName] = record[
'RAW_MEANS']
561 inDict[
'rawVars'][ampName] = record[
'RAW_VARS']
562 inDict[
'gain'][ampName] = record[
'GAIN']
563 inDict[
'gainErr'][ampName] = record[
'GAIN_ERR']
564 inDict[
'noise'][ampName] = record[
'NOISE']
565 inDict[
'noiseErr'][ampName] = record[
'NOISE_ERR']
566 inDict[
'ptcFitPars'][ampName] = record[
'PTC_FIT_PARS']
567 inDict[
'ptcFitParsError'][ampName] = record[
'PTC_FIT_PARS_ERROR']
568 inDict[
'ptcFitChiSq'][ampName] = record[
'PTC_FIT_CHI_SQ']
569 inDict[
'covariances'][ampName] = record[
'COVARIANCES']
570 inDict[
'covariancesModel'][ampName] = record[
'COVARIANCES_MODEL']
571 inDict[
'covariancesSqrtWeights'][ampName] = record[
'COVARIANCES_SQRT_WEIGHTS']
572 inDict[
'aMatrix'][ampName] = record[
'A_MATRIX']
573 inDict[
'bMatrix'][ampName] = record[
'B_MATRIX']
574 inDict[
'noiseMatrix'][ampName] = record[
'NOISE_MATRIX']
575 inDict[
'covariancesModelNoB'][ampName] = record[
'COVARIANCES_MODEL_NO_B']
576 inDict[
'aMatrixNoB'][ampName] = record[
'A_MATRIX_NO_B']
577 inDict[
'noiseMatrixNoB'][ampName] = record[
'NOISE_MATRIX_NO_B']
578 inDict[
'finalVars'][ampName] = record[
'FINAL_VARS']
579 inDict[
'finalModelVars'][ampName] = record[
'FINAL_MODEL_VARS']
580 inDict[
'finalMeans'][ampName] = record[
'FINAL_MEANS']
581 inDict[
'badAmps'] = record[
'BAD_AMPS'].tolist()
582 inDict[
'photoCharges'][ampName] = record[
'PHOTO_CHARGE']
583 if calibVersion == 1.0:
584 mask = record[
'FINAL_MEANS'].mask
585 array = record[
'FINAL_MEANS'][~mask]
587 inDict[
'ptcTurnoff'][ampName] = record[
'FINAL_MEANS'][~mask][-1]
589 inDict[
'ptcTurnoff'][ampName] = np.nan
591 inDict[
'ptcTurnoff'][ampName] = record[
'PTC_TURNOFF']
592 if calibVersion < 1.2:
593 inDict[
'histVars'][ampName] = np.array([np.nan])
594 inDict[
'histChi2Dofs'][ampName] = np.array([np.nan])
595 inDict[
'kspValues'][ampName] = np.array([0.0])
597 inDict[
'histVars'][ampName] = record[
'HIST_VARS']
598 inDict[
'histChi2Dofs'][ampName] = record[
'HIST_CHI2_DOFS']
599 inDict[
'kspValues'][ampName] = record[
'KS_PVALUES']
600 if calibVersion < 1.3:
601 nanMatrix = np.full_like(inDict[
'aMatrix'][ampName], np.nan)
602 inDict[
'noiseMatrix'][ampName] = nanMatrix
603 inDict[
'noiseMatrixNoB'][ampName] = nanMatrix
605 inDict[
'noiseMatrix'][ampName] = record[
'NOISE_MATRIX']
606 inDict[
'noiseMatrixNoB'][ampName] = record[
'NOISE_MATRIX_NO_B']
611 """Construct a list of tables containing the information in this
614 The list of tables should create an identical calibration
615 after being passed to this class's fromTable method.
619 tableList : `list` [`astropy.table.Table`]
620 List of tables containing the linearity calibration
626 badAmps = np.array(self.badAmps) if len(self.
badAmps)
else np.array([], dtype=
"U3")
631 'AMPLIFIER_NAME': ampName,
637 'RAW_MEANS': self.
rawMeans[ampName],
638 'RAW_VARS': self.
rawVars[ampName],
639 'GAIN': self.
gain[ampName],
640 'GAIN_ERR': self.
gainErr[ampName],
641 'NOISE': self.
noise[ampName],
642 'NOISE_ERR': self.
noiseErr[ampName],
643 'HIST_VARS': self.
histVars[ampName],
646 'PTC_FIT_PARS': np.array(self.
ptcFitPars[ampName]),
650 'A_MATRIX': self.
aMatrix[ampName].ravel(),
651 'B_MATRIX': self.
bMatrix[ampName].ravel(),
652 'A_MATRIX_NO_B': self.
aMatrixNoB[ampName].ravel(),
665 catalogList.append(ampDict)
667 catalog = Table(catalogList)
670 outMeta = {k: v
for k, v
in inMeta.items()
if v
is not None}
671 outMeta.update({k:
"" for k, v
in inMeta.items()
if v
is None})
672 catalog.meta = outMeta
673 tableList.append(catalog)
678 """Read metadata parameters from a detector.
682 detector : `lsst.afw.cameraGeom.detector`
683 Input detector with parameters to use.
688 The calibration constructed
from the detector.
694 """Get the exposures used, i.e. not discarded, for a given amp.
695 If no mask has been created yet, all exposures are returned.
703 expIdsUsed : `list` [`tuple`]
704 List of pairs of exposure ids used in PTC.
716 expIdsUsed = [(exp1, exp2)
for ((exp1, exp2), m)
in zip(pairs, mask)
if m]
718 warnings.warn(
"The PTC file was written incorrectly; you should rerun the "
719 "PTC solve task if possible.", RuntimeWarning)
721 for pairList, m
in zip(pairs, mask):
723 expIdsUsed.append(pairList[0])
728 """Get the good amps from this PTC."""
732 """Get the good points used for a given amp in the PTC.
740 goodPoints : `np.ndarray`
741 Boolean array of good points used in PTC.
def requiredAttributes(self, value)
def updateMetadata(self, camera=None, detector=None, filterName=None, setCalibId=False, setCalibInfo=False, setDate=False, **kwargs)
def requiredAttributes(self)
def __init__(self, ampNames=[], ptcFitType=None, covMatrixSide=1, **kwargs)
def setAmpValuesPartialDataset(self, ampName, inputExpIdPair=(-1, -1), rawExpTime=np.nan, rawMean=np.nan, rawVar=np.nan, photoCharge=np.nan, expIdMask=False, covariance=None, covSqrtWeights=None, gain=np.nan, noise=np.nan, histVar=np.nan, histChi2Dof=np.nan, kspValue=0.0)
def getExpIdsUsed(self, ampName)
def fromDict(cls, dictionary)
def fromDetector(self, detector)
def updateMetadata(self, **kwargs)
def fromTable(cls, tableList)
def getGoodPoints(self, ampName)