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.
165 auxValues : `dict`, [`str`, `np.ndarray`]
166 Dictionary of per-detector auxiliary header values that can be used
167 for PTC, linearity computation.
169 Version 1.1 adds the `ptcTurnoff` attribute.
170 Version 1.2 adds the `histVars`, `histChi2Dofs`,
and `kspValues`
172 Version 1.3 adds the `noiseMatrix`
and `noiseMatrixNoB` attributes.
173 Version 1.4 adds the `auxValues` attribute.
177 _SCHEMA =
'Gen3 Photon Transfer Curve'
180 def __init__(self, ampNames=[], ptcFitType=None, covMatrixSide=1, **kwargs):
188 self.
expIdMask = {ampName: np.array([], dtype=bool)
for ampName
in ampNames}
189 self.
rawExpTimes = {ampName: np.array([])
for ampName
in ampNames}
190 self.
rawMeans = {ampName: np.array([])
for ampName
in ampNames}
191 self.
rawVars = {ampName: np.array([])
for ampName
in ampNames}
194 self.
gain = {ampName: np.nan
for ampName
in ampNames}
195 self.
gainErr = {ampName: np.nan
for ampName
in ampNames}
196 self.
noise = {ampName: np.nan
for ampName
in ampNames}
197 self.
noiseErr = {ampName: np.nan
for ampName
in ampNames}
199 self.
histVars = {ampName: np.array([])
for ampName
in ampNames}
201 self.
kspValues = {ampName: np.array([])
for ampName
in ampNames}
203 self.
ptcFitPars = {ampName: np.array([])
for ampName
in ampNames}
208 self.
covariances = {ampName: np.array([])
for ampName
in ampNames}
211 self.
aMatrix = {ampName: np.array([])
for ampName
in ampNames}
212 self.
bMatrix = {ampName: np.array([])
for ampName
in ampNames}
213 self.
noiseMatrix = {ampName: np.array([])
for ampName
in ampNames}
215 self.
aMatrixNoB = {ampName: np.array([])
for ampName
in ampNames}
218 self.
finalVars = {ampName: np.array([])
for ampName
in ampNames}
220 self.
finalMeans = {ampName: np.array([])
for ampName
in ampNames}
227 'rawMeans',
'rawVars',
'gain',
'gainErr',
'noise',
'noiseErr',
228 'ptcFitPars',
'ptcFitParsError',
'ptcFitChiSq',
'ptcTurnoff',
229 'aMatrixNoB',
'covariances',
'covariancesModel',
230 'covariancesSqrtWeights',
'covariancesModelNoB',
231 'aMatrix',
'bMatrix',
'noiseMatrix',
'noiseMatrixNoB',
'finalVars',
232 'finalModelVars',
'finalMeans',
'photoCharges',
'histVars',
233 'histChi2Dofs',
'kspValues',
'auxValues'])
240 inputExpIdPair=(-1, -1),
256 Set the amp values for a partial PTC Dataset (
from cpExtractPtcTask).
261 Name of the amp to set the values.
262 inputExpIdPair : `tuple` [`int`]
263 Exposure IDs of input pair.
264 rawExpTime : `float`, optional
265 Exposure time
for this exposure pair.
266 rawMean : `float`, optional
267 Average of the means of the exposures
in this pair.
268 rawVar : `float`, optional
269 Variance of the difference of the exposures
in this pair.
270 photoCharge : `float`, optional
271 Integrated photocharge
for flat pair
for linearity calibration.
272 expIdMask : `bool`, optional
273 Flag setting
if this exposure pair should be used (
True)
275 covariance : `np.ndarray`
or None, optional
276 Measured covariance
for this exposure pair.
277 covSqrtWeights : `np.ndarray`
or None, optional
278 Measured sqrt of covariance weights
in this exposure pair.
279 gain : `float`, optional
280 Estimated gain
for this exposure pair.
281 noise : `float`, optional
282 Estimated read noise
for this exposure pair.
283 histVar : `float`, optional
284 Variance estimated
from fitting a histogram
with a Gaussian model.
285 histChi2Dof : `float`, optional
286 Chi-squared per degree of freedom
from Gaussian histogram fit.
287 kspValue : `float`, optional
288 KS test p-value
from the Gaussian histogram fit.
291 if covariance
is None:
292 covariance = nanMatrix
293 if covSqrtWeights
is None:
294 covSqrtWeights = nanMatrix
298 self.
rawMeans[ampName] = np.array([rawMean])
299 self.
rawVars[ampName] = np.array([rawVar])
301 self.
expIdMask[ampName] = np.array([expIdMask])
304 self.
gain[ampName] = gain
305 self.
noise[ampName] = noise
306 self.
histVars[ampName] = np.array([histVar])
308 self.
kspValues[ampName] = np.array([kspValue])
312 self.
aMatrix[ampName] = nanMatrix
313 self.
bMatrix[ampName] = nanMatrix
320 Set a dictionary of auxiliary values for a partial dataset.
324 auxDict : `dict` [`str`, `float`]
325 Dictionary of float values.
327 for key, value
in auxDict.items():
328 self.
auxValues[key] = np.atleast_1d(np.array(value, dtype=np.float64))
331 """Update calibration metadata.
332 This calls the base class's method after ensuring the required
333 calibration keywords will be saved.
337 setDate : `bool`, optional
338 Update the CALIBDATE fields in the metadata to the current
339 time. Defaults to
False.
341 Other keyword parameters to set
in the metadata.
347 """Construct a calibration from a dictionary of properties.
348 Must be implemented by the specific calibration subclasses.
353 Dictionary of properties.
358 Constructed calibration.
363 Raised if the supplied dictionary
is for a different
367 if calib._OBSTYPE != dictionary[
'metadata'][
'OBSTYPE']:
368 raise RuntimeError(f
"Incorrect Photon Transfer Curve dataset supplied. "
369 f
"Expected {calib._OBSTYPE}, found {dictionary['metadata']['OBSTYPE']}")
370 calib.setMetadata(dictionary[
'metadata'])
371 calib.ptcFitType = dictionary[
'ptcFitType']
372 calib.covMatrixSide = dictionary[
'covMatrixSide']
373 calib.badAmps = np.array(dictionary[
'badAmps'],
'str').tolist()
377 covMatrixSide = calib.covMatrixSide
379 covDimensionsProduct = len(np.array(list(dictionary[
'covariances'].values())[0]).ravel())
380 nSignalPoints = int(covDimensionsProduct/(covMatrixSide*covMatrixSide))
382 for ampName
in dictionary[
'ampNames']:
383 calib.ampNames.append(ampName)
384 calib.inputExpIdPairs[ampName] = dictionary[
'inputExpIdPairs'][ampName]
385 calib.expIdMask[ampName] = np.array(dictionary[
'expIdMask'][ampName])
386 calib.rawExpTimes[ampName] = np.array(dictionary[
'rawExpTimes'][ampName], dtype=np.float64)
387 calib.rawMeans[ampName] = np.array(dictionary[
'rawMeans'][ampName], dtype=np.float64)
388 calib.rawVars[ampName] = np.array(dictionary[
'rawVars'][ampName], dtype=np.float64)
389 calib.gain[ampName] = float(dictionary[
'gain'][ampName])
390 calib.gainErr[ampName] = float(dictionary[
'gainErr'][ampName])
391 calib.noise[ampName] = float(dictionary[
'noise'][ampName])
392 calib.noiseErr[ampName] = float(dictionary[
'noiseErr'][ampName])
393 calib.histVars[ampName] = np.array(dictionary[
'histVars'][ampName], dtype=np.float64)
394 calib.histChi2Dofs[ampName] = np.array(dictionary[
'histChi2Dofs'][ampName], dtype=np.float64)
395 calib.kspValues[ampName] = np.array(dictionary[
'kspValues'][ampName], dtype=np.float64)
396 calib.ptcFitPars[ampName] = np.array(dictionary[
'ptcFitPars'][ampName], dtype=np.float64)
397 calib.ptcFitParsError[ampName] = np.array(dictionary[
'ptcFitParsError'][ampName],
399 calib.ptcFitChiSq[ampName] = float(dictionary[
'ptcFitChiSq'][ampName])
400 calib.ptcTurnoff[ampName] = float(dictionary[
'ptcTurnoff'][ampName])
401 if nSignalPoints > 0:
403 calib.covariances[ampName] = np.array(dictionary[
'covariances'][ampName],
404 dtype=np.float64).reshape(
405 (nSignalPoints, covMatrixSide, covMatrixSide))
406 calib.covariancesModel[ampName] = np.array(
407 dictionary[
'covariancesModel'][ampName],
408 dtype=np.float64).reshape(
409 (nSignalPoints, covMatrixSide, covMatrixSide))
410 calib.covariancesSqrtWeights[ampName] = np.array(
411 dictionary[
'covariancesSqrtWeights'][ampName],
412 dtype=np.float64).reshape(
413 (nSignalPoints, covMatrixSide, covMatrixSide))
414 calib.aMatrix[ampName] = np.array(dictionary[
'aMatrix'][ampName],
415 dtype=np.float64).reshape(
416 (covMatrixSide, covMatrixSide))
417 calib.bMatrix[ampName] = np.array(dictionary[
'bMatrix'][ampName],
418 dtype=np.float64).reshape(
419 (covMatrixSide, covMatrixSide))
420 calib.covariancesModelNoB[ampName] = np.array(
421 dictionary[
'covariancesModelNoB'][ampName], dtype=np.float64).reshape(
422 (nSignalPoints, covMatrixSide, covMatrixSide))
423 calib.aMatrixNoB[ampName] = np.array(
424 dictionary[
'aMatrixNoB'][ampName],
425 dtype=np.float64).reshape((covMatrixSide, covMatrixSide))
426 calib.noiseMatrix[ampName] = np.array(
427 dictionary[
'noiseMatrix'][ampName],
428 dtype=np.float64).reshape((covMatrixSide, covMatrixSide))
429 calib.noiseMatrixNoB[ampName] = np.array(
430 dictionary[
'noiseMatrixNoB'][ampName],
431 dtype=np.float64).reshape((covMatrixSide, covMatrixSide))
434 calib.covariances[ampName] = np.array([], dtype=np.float64)
435 calib.covariancesModel[ampName] = np.array([], dtype=np.float64)
436 calib.covariancesSqrtWeights[ampName] = np.array([], dtype=np.float64)
437 calib.aMatrix[ampName] = np.array([], dtype=np.float64)
438 calib.bMatrix[ampName] = np.array([], dtype=np.float64)
439 calib.covariancesModelNoB[ampName] = np.array([], dtype=np.float64)
440 calib.aMatrixNoB[ampName] = np.array([], dtype=np.float64)
441 calib.noiseMatrix[ampName] = np.array([], dtype=np.float64)
442 calib.noiseMatrixNoB[ampName] = np.array([], dtype=np.float64)
444 calib.finalVars[ampName] = np.array(dictionary[
'finalVars'][ampName], dtype=np.float64)
445 calib.finalModelVars[ampName] = np.array(dictionary[
'finalModelVars'][ampName], dtype=np.float64)
446 calib.finalMeans[ampName] = np.array(dictionary[
'finalMeans'][ampName], dtype=np.float64)
447 calib.photoCharges[ampName] = np.array(dictionary[
'photoCharges'][ampName], dtype=np.float64)
449 for key, value
in dictionary[
'auxValues'].items():
450 calib.auxValues[key] = np.atleast_1d(np.array(value, dtype=np.float64))
452 calib.updateMetadata()
456 """Return a dictionary containing the calibration properties.
457 The dictionary should be able to be round-tripped through
463 Dictionary of properties.
469 outDict['metadata'] = metadata
471 def _dictOfArraysToDictOfLists(dictOfArrays):
473 for key, value
in dictOfArrays.items():
474 dictOfLists[key] = value.ravel().tolist()
481 outDict[
'badAmps'] = self.
badAmps
483 outDict[
'expIdMask'] = _dictOfArraysToDictOfLists(self.
expIdMask)
484 outDict[
'rawExpTimes'] = _dictOfArraysToDictOfLists(self.
rawExpTimes)
485 outDict[
'rawMeans'] = _dictOfArraysToDictOfLists(self.
rawMeans)
486 outDict[
'rawVars'] = _dictOfArraysToDictOfLists(self.
rawVars)
487 outDict[
'gain'] = self.
gain
488 outDict[
'gainErr'] = self.
gainErr
489 outDict[
'noise'] = self.
noise
494 outDict[
'ptcFitPars'] = _dictOfArraysToDictOfLists(self.
ptcFitPars)
495 outDict[
'ptcFitParsError'] = _dictOfArraysToDictOfLists(self.
ptcFitParsError)
498 outDict[
'covariances'] = _dictOfArraysToDictOfLists(self.
covariances)
499 outDict[
'covariancesModel'] = _dictOfArraysToDictOfLists(self.
covariancesModel)
501 outDict[
'aMatrix'] = _dictOfArraysToDictOfLists(self.
aMatrix)
502 outDict[
'bMatrix'] = _dictOfArraysToDictOfLists(self.
bMatrix)
503 outDict[
'noiseMatrix'] = _dictOfArraysToDictOfLists(self.
noiseMatrix)
505 outDict[
'aMatrixNoB'] = _dictOfArraysToDictOfLists(self.
aMatrixNoB)
506 outDict[
'noiseMatrixNoB'] = _dictOfArraysToDictOfLists(self.
noiseMatrixNoB)
507 outDict[
'finalVars'] = _dictOfArraysToDictOfLists(self.
finalVars)
508 outDict[
'finalModelVars'] = _dictOfArraysToDictOfLists(self.
finalModelVars)
509 outDict[
'finalMeans'] = _dictOfArraysToDictOfLists(self.
finalMeans)
510 outDict[
'photoCharges'] = _dictOfArraysToDictOfLists(self.
photoCharges)
511 outDict[
'auxValues'] = _dictOfArraysToDictOfLists(self.
auxValues)
517 """Construct calibration from a list of tables.
518 This method uses the `fromDict` method to create the
519 calibration, after constructing an appropriate dictionary from
524 tableList : `list` [`lsst.afw.table.Table`]
525 List of tables to use to construct the datasetPtc.
530 The calibration defined
in the tables.
532 ptcTable = tableList[0]
534 metadata = ptcTable.meta
536 inDict['metadata'] = metadata
537 inDict[
'ampNames'] = []
538 inDict[
'ptcFitType'] = []
539 inDict[
'covMatrixSide'] = []
540 inDict[
'inputExpIdPairs'] = dict()
541 inDict[
'expIdMask'] = dict()
542 inDict[
'rawExpTimes'] = dict()
543 inDict[
'rawMeans'] = dict()
544 inDict[
'rawVars'] = dict()
545 inDict[
'gain'] = dict()
546 inDict[
'gainErr'] = dict()
547 inDict[
'noise'] = dict()
548 inDict[
'noiseErr'] = dict()
549 inDict[
'histVars'] = dict()
550 inDict[
'histChi2Dofs'] = dict()
551 inDict[
'kspValues'] = dict()
552 inDict[
'ptcFitPars'] = dict()
553 inDict[
'ptcFitParsError'] = dict()
554 inDict[
'ptcFitChiSq'] = dict()
555 inDict[
'ptcTurnoff'] = dict()
556 inDict[
'covariances'] = dict()
557 inDict[
'covariancesModel'] = dict()
558 inDict[
'covariancesSqrtWeights'] = dict()
559 inDict[
'aMatrix'] = dict()
560 inDict[
'bMatrix'] = dict()
561 inDict[
'noiseMatrix'] = dict()
562 inDict[
'covariancesModelNoB'] = dict()
563 inDict[
'aMatrixNoB'] = dict()
564 inDict[
'noiseMatrixNoB'] = dict()
565 inDict[
'finalVars'] = dict()
566 inDict[
'finalModelVars'] = dict()
567 inDict[
'finalMeans'] = dict()
568 inDict[
'badAmps'] = []
569 inDict[
'photoCharges'] = dict()
571 calibVersion = metadata[
'PTC_VERSION']
572 if calibVersion == 1.0:
573 cls().log.warning(f
"Previous version found for PTC dataset: {calibVersion}. "
574 f
"Setting 'ptcTurnoff' in all amps to last value in 'finalMeans'.")
575 for record
in ptcTable:
576 ampName = record[
'AMPLIFIER_NAME']
578 inDict[
'ptcFitType'] = record[
'PTC_FIT_TYPE']
579 inDict[
'covMatrixSide'] = record[
'COV_MATRIX_SIDE']
580 inDict[
'ampNames'].append(ampName)
581 inDict[
'inputExpIdPairs'][ampName] = record[
'INPUT_EXP_ID_PAIRS'].tolist()
582 inDict[
'expIdMask'][ampName] = record[
'EXP_ID_MASK']
583 inDict[
'rawExpTimes'][ampName] = record[
'RAW_EXP_TIMES']
584 inDict[
'rawMeans'][ampName] = record[
'RAW_MEANS']
585 inDict[
'rawVars'][ampName] = record[
'RAW_VARS']
586 inDict[
'gain'][ampName] = record[
'GAIN']
587 inDict[
'gainErr'][ampName] = record[
'GAIN_ERR']
588 inDict[
'noise'][ampName] = record[
'NOISE']
589 inDict[
'noiseErr'][ampName] = record[
'NOISE_ERR']
590 inDict[
'ptcFitPars'][ampName] = record[
'PTC_FIT_PARS']
591 inDict[
'ptcFitParsError'][ampName] = record[
'PTC_FIT_PARS_ERROR']
592 inDict[
'ptcFitChiSq'][ampName] = record[
'PTC_FIT_CHI_SQ']
593 inDict[
'covariances'][ampName] = record[
'COVARIANCES']
594 inDict[
'covariancesModel'][ampName] = record[
'COVARIANCES_MODEL']
595 inDict[
'covariancesSqrtWeights'][ampName] = record[
'COVARIANCES_SQRT_WEIGHTS']
596 inDict[
'aMatrix'][ampName] = record[
'A_MATRIX']
597 inDict[
'bMatrix'][ampName] = record[
'B_MATRIX']
598 inDict[
'noiseMatrix'][ampName] = record[
'NOISE_MATRIX']
599 inDict[
'covariancesModelNoB'][ampName] = record[
'COVARIANCES_MODEL_NO_B']
600 inDict[
'aMatrixNoB'][ampName] = record[
'A_MATRIX_NO_B']
601 inDict[
'noiseMatrixNoB'][ampName] = record[
'NOISE_MATRIX_NO_B']
602 inDict[
'finalVars'][ampName] = record[
'FINAL_VARS']
603 inDict[
'finalModelVars'][ampName] = record[
'FINAL_MODEL_VARS']
604 inDict[
'finalMeans'][ampName] = record[
'FINAL_MEANS']
605 inDict[
'badAmps'] = record[
'BAD_AMPS'].tolist()
606 inDict[
'photoCharges'][ampName] = record[
'PHOTO_CHARGE']
607 if calibVersion == 1.0:
608 mask = record[
'FINAL_MEANS'].mask
609 array = record[
'FINAL_MEANS'][~mask]
611 inDict[
'ptcTurnoff'][ampName] = record[
'FINAL_MEANS'][~mask][-1]
613 inDict[
'ptcTurnoff'][ampName] = np.nan
615 inDict[
'ptcTurnoff'][ampName] = record[
'PTC_TURNOFF']
616 if calibVersion < 1.2:
617 inDict[
'histVars'][ampName] = np.array([np.nan])
618 inDict[
'histChi2Dofs'][ampName] = np.array([np.nan])
619 inDict[
'kspValues'][ampName] = np.array([0.0])
621 inDict[
'histVars'][ampName] = record[
'HIST_VARS']
622 inDict[
'histChi2Dofs'][ampName] = record[
'HIST_CHI2_DOFS']
623 inDict[
'kspValues'][ampName] = record[
'KS_PVALUES']
624 if calibVersion < 1.3:
625 nanMatrix = np.full_like(inDict[
'aMatrix'][ampName], np.nan)
626 inDict[
'noiseMatrix'][ampName] = nanMatrix
627 inDict[
'noiseMatrixNoB'][ampName] = nanMatrix
629 inDict[
'noiseMatrix'][ampName] = record[
'NOISE_MATRIX']
630 inDict[
'noiseMatrixNoB'][ampName] = record[
'NOISE_MATRIX_NO_B']
632 inDict[
'auxValues'] = {}
634 for col
in record.columns.keys():
635 if col.startswith(
'PTCAUX_'):
636 parts = col.split(
'PTCAUX_')
637 inDict[
'auxValues'][parts[1]] = record[col]
642 """Construct a list of tables containing the information in this
645 The list of tables should create an identical calibration
646 after being passed to this class's fromTable method.
650 tableList : `list` [`astropy.table.Table`]
651 List of tables containing the linearity calibration
657 badAmps = np.array(self.badAmps) if len(self.
badAmps)
else np.array([], dtype=
"U3")
662 'AMPLIFIER_NAME': ampName,
668 'RAW_MEANS': self.
rawMeans[ampName],
669 'RAW_VARS': self.
rawVars[ampName],
670 'GAIN': self.
gain[ampName],
671 'GAIN_ERR': self.
gainErr[ampName],
672 'NOISE': self.
noise[ampName],
673 'NOISE_ERR': self.
noiseErr[ampName],
674 'HIST_VARS': self.
histVars[ampName],
677 'PTC_FIT_PARS': np.array(self.
ptcFitPars[ampName]),
681 'A_MATRIX': self.
aMatrix[ampName].ravel(),
682 'B_MATRIX': self.
bMatrix[ampName].ravel(),
683 'A_MATRIX_NO_B': self.
aMatrixNoB[ampName].ravel(),
698 for key, value
in self.
auxValues.items():
699 ampDict[f
"PTCAUX_{key}"] = value
701 catalogList.append(ampDict)
703 catalog = Table(catalogList)
706 outMeta = {k: v
for k, v
in inMeta.items()
if v
is not None}
707 outMeta.update({k:
"" for k, v
in inMeta.items()
if v
is None})
708 catalog.meta = outMeta
709 tableList.append(catalog)
714 """Read metadata parameters from a detector.
718 detector : `lsst.afw.cameraGeom.detector`
719 Input detector with parameters to use.
724 The calibration constructed
from the detector.
730 """Get the exposures used, i.e. not discarded, for a given amp.
731 If no mask has been created yet, all exposures are returned.
739 expIdsUsed : `list` [`tuple`]
740 List of pairs of exposure ids used in PTC.
752 expIdsUsed = [(exp1, exp2)
for ((exp1, exp2), m)
in zip(pairs, mask)
if m]
754 warnings.warn(
"The PTC file was written incorrectly; you should rerun the "
755 "PTC solve task if possible.", RuntimeWarning)
757 for pairList, m
in zip(pairs, mask):
759 expIdsUsed.append(pairList[0])
764 """Get the good amps from this PTC."""
768 """Get the good points used for a given amp in the PTC.
776 goodPoints : `np.ndarray`
777 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 getExpIdsUsed(self, ampName)
def fromDict(cls, dictionary)
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, auxValues=None)
def fromDetector(self, detector)
def updateMetadata(self, **kwargs)
def fromTable(cls, tableList)
def getGoodPoints(self, ampName)
def setAuxValuesPartialDataset(self, auxDict)