347 """Construct a calibration from a dictionary of properties.
348 Must be implemented by the specific calibration subclasses.
353 Dictionary of properties.
357 calib : `lsst.ip.isr.PhotonTransferCurveDataset`
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)