383 """Construct a calibration from a dictionary of properties.
384 Must be implemented by the specific calibration subclasses.
389 Dictionary of properties.
393 calib : `lsst.ip.isr.PhotonTransferCurveDataset`
394 Constructed calibration.
399 Raised if the supplied dictionary is for a different
403 if calib._OBSTYPE != dictionary[
'metadata'][
'OBSTYPE']:
404 raise RuntimeError(f
"Incorrect Photon Transfer Curve dataset supplied. "
405 f
"Expected {calib._OBSTYPE}, found {dictionary['metadata']['OBSTYPE']}")
406 calib.setMetadata(dictionary[
'metadata'])
407 calib.ptcFitType = dictionary[
'ptcFitType']
408 calib.covMatrixSide = dictionary[
'covMatrixSide']
409 calib.covMatrixSideFullCovFit = dictionary[
'covMatrixSideFullCovFit']
410 calib.badAmps = np.array(dictionary[
'badAmps'],
'str').tolist()
414 covMatrixSide = calib.covMatrixSide
415 covMatrixSideFullCovFit = calib.covMatrixSideFullCovFit
417 covDimensionsProduct = len(np.array(list(dictionary[
'covariances'].values())[0]).ravel())
418 nSignalPoints = int(covDimensionsProduct/(covMatrixSide*covMatrixSide))
420 for ampName
in dictionary[
'ampNames']:
421 calib.ampNames.append(ampName)
422 calib.inputExpIdPairs[ampName] = dictionary[
'inputExpIdPairs'][ampName]
423 calib.expIdMask[ampName] = np.array(dictionary[
'expIdMask'][ampName])
424 calib.rawExpTimes[ampName] = np.array(dictionary[
'rawExpTimes'][ampName], dtype=np.float64)
425 calib.rawMeans[ampName] = np.array(dictionary[
'rawMeans'][ampName], dtype=np.float64)
426 calib.rawVars[ampName] = np.array(dictionary[
'rawVars'][ampName], dtype=np.float64)
427 calib.rowMeanVariance[ampName] = np.array(dictionary[
'rowMeanVariance'][ampName],
429 calib.gain[ampName] = float(dictionary[
'gain'][ampName])
430 calib.gainErr[ampName] = float(dictionary[
'gainErr'][ampName])
431 calib.noiseList[ampName] = np.array(dictionary[
'noiseList'][ampName], dtype=np.float64)
432 calib.noise[ampName] = float(dictionary[
'noise'][ampName])
433 calib.noiseErr[ampName] = float(dictionary[
'noiseErr'][ampName])
434 calib.histVars[ampName] = np.array(dictionary[
'histVars'][ampName], dtype=np.float64)
435 calib.histChi2Dofs[ampName] = np.array(dictionary[
'histChi2Dofs'][ampName], dtype=np.float64)
436 calib.kspValues[ampName] = np.array(dictionary[
'kspValues'][ampName], dtype=np.float64)
437 calib.ptcFitPars[ampName] = np.array(dictionary[
'ptcFitPars'][ampName], dtype=np.float64)
438 calib.ptcFitParsError[ampName] = np.array(dictionary[
'ptcFitParsError'][ampName],
440 calib.ptcFitChiSq[ampName] = float(dictionary[
'ptcFitChiSq'][ampName])
441 calib.ptcTurnoff[ampName] = float(dictionary[
'ptcTurnoff'][ampName])
442 calib.ptcTurnoffSamplingError[ampName] = float(dictionary[
'ptcTurnoffSamplingError'][ampName])
443 if nSignalPoints > 0:
445 calib.covariances[ampName] = np.array(dictionary[
'covariances'][ampName],
446 dtype=np.float64).reshape(
447 (nSignalPoints, covMatrixSide, covMatrixSide))
448 calib.covariancesModel[ampName] = np.array(
449 dictionary[
'covariancesModel'][ampName],
450 dtype=np.float64).reshape(
451 (nSignalPoints, covMatrixSideFullCovFit, covMatrixSideFullCovFit))
452 calib.covariancesSqrtWeights[ampName] = np.array(
453 dictionary[
'covariancesSqrtWeights'][ampName],
454 dtype=np.float64).reshape(
455 (nSignalPoints, covMatrixSide, covMatrixSide))
456 calib.aMatrix[ampName] = np.array(dictionary[
'aMatrix'][ampName],
457 dtype=np.float64).reshape(
458 (covMatrixSideFullCovFit, covMatrixSideFullCovFit))
459 calib.bMatrix[ampName] = np.array(dictionary[
'bMatrix'][ampName],
460 dtype=np.float64).reshape(
461 (covMatrixSideFullCovFit, covMatrixSideFullCovFit))
462 calib.covariancesModelNoB[ampName] = np.array(
463 dictionary[
'covariancesModelNoB'][ampName], dtype=np.float64).reshape(
464 (nSignalPoints, covMatrixSideFullCovFit, covMatrixSideFullCovFit))
465 calib.aMatrixNoB[ampName] = np.array(
466 dictionary[
'aMatrixNoB'][ampName],
467 dtype=np.float64).reshape((covMatrixSideFullCovFit, covMatrixSideFullCovFit))
468 calib.noiseMatrix[ampName] = np.array(
469 dictionary[
'noiseMatrix'][ampName],
470 dtype=np.float64).reshape((covMatrixSideFullCovFit, covMatrixSideFullCovFit))
471 calib.noiseMatrixNoB[ampName] = np.array(
472 dictionary[
'noiseMatrixNoB'][ampName],
473 dtype=np.float64).reshape((covMatrixSideFullCovFit, covMatrixSideFullCovFit))
476 calib.covariances[ampName] = np.array([], dtype=np.float64)
477 calib.covariancesModel[ampName] = np.array([], dtype=np.float64)
478 calib.covariancesSqrtWeights[ampName] = np.array([], dtype=np.float64)
479 calib.aMatrix[ampName] = np.array([], dtype=np.float64)
480 calib.bMatrix[ampName] = np.array([], dtype=np.float64)
481 calib.covariancesModelNoB[ampName] = np.array([], dtype=np.float64)
482 calib.aMatrixNoB[ampName] = np.array([], dtype=np.float64)
483 calib.noiseMatrix[ampName] = np.array([], dtype=np.float64)
484 calib.noiseMatrixNoB[ampName] = np.array([], dtype=np.float64)
486 calib.finalVars[ampName] = np.array(dictionary[
'finalVars'][ampName], dtype=np.float64)
487 calib.finalModelVars[ampName] = np.array(dictionary[
'finalModelVars'][ampName], dtype=np.float64)
488 calib.finalMeans[ampName] = np.array(dictionary[
'finalMeans'][ampName], dtype=np.float64)
489 calib.photoCharges[ampName] = np.array(dictionary[
'photoCharges'][ampName], dtype=np.float64)
491 for key, value
in dictionary[
'auxValues'].
items():
492 calib.auxValues[key] = np.atleast_1d(np.array(value, dtype=np.float64))
494 calib.updateMetadata()
498 """Return a dictionary containing the calibration properties.
499 The dictionary should be able to be round-tripped through
505 Dictionary of properties.
511 outDict[
'metadata'] = metadata
513 def _dictOfArraysToDictOfLists(dictOfArrays):
515 for key, value
in dictOfArrays.items():
516 dictOfLists[key] = value.ravel().tolist()
524 outDict[
'badAmps'] = self.
badAmps
526 outDict[
'expIdMask'] = _dictOfArraysToDictOfLists(self.
expIdMask)
527 outDict[
'rawExpTimes'] = _dictOfArraysToDictOfLists(self.
rawExpTimes)
528 outDict[
'rawMeans'] = _dictOfArraysToDictOfLists(self.
rawMeans)
529 outDict[
'rawVars'] = _dictOfArraysToDictOfLists(self.
rawVars)
530 outDict[
'rowMeanVariance'] = _dictOfArraysToDictOfLists(self.
rowMeanVariance)
531 outDict[
'gain'] = self.
gain
532 outDict[
'gainErr'] = self.
gainErr
533 outDict[
'noiseList'] = _dictOfArraysToDictOfLists(self.
noiseList)
534 outDict[
'noise'] = self.
noise
539 outDict[
'ptcFitPars'] = _dictOfArraysToDictOfLists(self.
ptcFitPars)
540 outDict[
'ptcFitParsError'] = _dictOfArraysToDictOfLists(self.
ptcFitParsError)
544 outDict[
'covariances'] = _dictOfArraysToDictOfLists(self.
covariances)
545 outDict[
'covariancesModel'] = _dictOfArraysToDictOfLists(self.
covariancesModel)
547 outDict[
'aMatrix'] = _dictOfArraysToDictOfLists(self.
aMatrix)
548 outDict[
'bMatrix'] = _dictOfArraysToDictOfLists(self.
bMatrix)
549 outDict[
'noiseMatrix'] = _dictOfArraysToDictOfLists(self.
noiseMatrix)
551 outDict[
'aMatrixNoB'] = _dictOfArraysToDictOfLists(self.
aMatrixNoB)
552 outDict[
'noiseMatrixNoB'] = _dictOfArraysToDictOfLists(self.
noiseMatrixNoB)
553 outDict[
'finalVars'] = _dictOfArraysToDictOfLists(self.
finalVars)
554 outDict[
'finalModelVars'] = _dictOfArraysToDictOfLists(self.
finalModelVars)
555 outDict[
'finalMeans'] = _dictOfArraysToDictOfLists(self.
finalMeans)
556 outDict[
'photoCharges'] = _dictOfArraysToDictOfLists(self.
photoCharges)
557 outDict[
'auxValues'] = _dictOfArraysToDictOfLists(self.
auxValues)