LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
Public Member Functions | Public Attributes | List of all members
lsst.ip.isr.linearize.Linearizer Class Reference
Inheritance diagram for lsst.ip.isr.linearize.Linearizer:
lsst.ip.isr.calibType.IsrCalib

Public Member Functions

def __init__ (self, table=None, **kwargs)
 
def updateMetadata (self, setDate=False, **kwargs)
 
def fromDetector (self, detector)
 
def fromDict (cls, dictionary)
 
def toDict (self)
 
def fromTable (cls, tableList)
 
def toTable (self)
 
def getLinearityTypeByName (self, linearityTypeName)
 
def validate (self, detector=None, amplifier=None)
 
def applyLinearity (self, image, detector=None, log=None)
 
def requiredAttributes (self)
 
def requiredAttributes (self, value)
 
def __str__ (self)
 
def __eq__ (self, other)
 
def getMetadata (self)
 
def setMetadata (self, metadata)
 
def updateMetadata (self, camera=None, detector=None, filterName=None, setCalibId=False, setCalibInfo=False, setDate=False, **kwargs)
 
def calibInfoFromDict (self, dictionary)
 
def determineCalibClass (cls, metadata, message)
 
def readText (cls, filename, **kwargs)
 
def writeText (self, filename, format="auto")
 
def readFits (cls, filename, **kwargs)
 
def writeFits (self, filename)
 
def fromDict (cls, dictionary, **kwargs)
 
def fromTable (cls, tableList, **kwargs)
 
def validate (self, other=None)
 
def apply (self, target)
 

Public Attributes

 hasLinearity
 
 override
 
 ampNames
 
 linearityCoeffs
 
 linearityType
 
 linearityBBox
 
 fitParams
 
 fitParamsErr
 
 fitChiSq
 
 tableData
 
 requiredAttributes
 
 log
 

Detailed Description

Parameter set for linearization.

These parameters are included in cameraGeom.Amplifier, but
should be accessible externally to allow for testing.

Parameters
----------
table : `numpy.array`, optional
    Lookup table; a 2-dimensional array of floats:
        - one row for each row index (value of coef[0] in the amplifier)
        - one column for each image value
    To avoid copying the table the last index should vary fastest
    (numpy default "C" order)
detector : `lsst.afw.cameraGeom.Detector`, optional
    Detector object.  Passed to self.fromDetector() on init.
log : `logging.Logger`, optional
    Logger to handle messages.
kwargs : `dict`, optional
    Other keyword arguments to pass to the parent init.

Raises
------
RuntimeError :
    Raised if the supplied table is not 2D, or if the table has fewer
    columns than rows (indicating that the indices are swapped).

Notes
-----
The linearizer attributes stored are:

hasLinearity : `bool`
    Whether a linearity correction is defined for this detector.
override : `bool`
    Whether the detector parameters should be overridden.
ampNames : `list` [`str`]
    List of amplifier names to correct.
linearityCoeffs : `dict` [`str`, `numpy.array`]
    Coefficients to use in correction.  Indexed by amplifier
    names.  The format of the array depends on the type of
    correction to apply.
linearityType : `dict` [`str`, `str`]
    Type of correction to use, indexed by amplifier names.
linearityBBox : `dict` [`str`, `lsst.geom.Box2I`]
    Bounding box the correction is valid over, indexed by
    amplifier names.
fitParams : `dict` [`str`, `numpy.array`], optional
    Linearity fit parameters used to construct the correction
    coefficients, indexed as above.
fitParamsErr : `dict` [`str`, `numpy.array`], optional
    Uncertainty values of the linearity fit parameters used to
    construct the correction coefficients, indexed as above.
fitChiSq : `dict` [`str`, `float`], optional
    Chi-squared value of the linearity fit, indexed as above.
tableData : `numpy.array`, optional
    Lookup table data for the linearity correction.

Definition at line 38 of file linearize.py.

Constructor & Destructor Documentation

◆ __init__()

def lsst.ip.isr.linearize.Linearizer.__init__ (   self,
  table = None,
**  kwargs 
)

Definition at line 99 of file linearize.py.

99  def __init__(self, table=None, **kwargs):
100  self.hasLinearity = False
101  self.override = False
102 
103  self.ampNames = list()
104  self.linearityCoeffs = dict()
105  self.linearityType = dict()
106  self.linearityBBox = dict()
107 
108  self.fitParams = dict()
109  self.fitParamsErr = dict()
110  self.fitChiSq = dict()
111 
112  self.tableData = None
113  if table is not None:
114  if len(table.shape) != 2:
115  raise RuntimeError("table shape = %s; must have two dimensions" % (table.shape,))
116  if table.shape[1] < table.shape[0]:
117  raise RuntimeError("table shape = %s; indices are switched" % (table.shape,))
118  self.tableData = np.array(table, order="C")
119 
120  super().__init__(**kwargs)
121  self.requiredAttributes.update(['hasLinearity', 'override',
122  'ampNames',
123  'linearityCoeffs', 'linearityType', 'linearityBBox',
124  'fitParams', 'fitParamsErr', 'fitChiSq',
125  'tableData'])
126 
daf::base::PropertyList * list
Definition: fits.cc:913

Member Function Documentation

◆ __eq__()

def lsst.ip.isr.calibType.IsrCalib.__eq__ (   self,
  other 
)
inherited
Calibration equivalence.

Running ``calib.log.setLevel(0)`` enables debug statements to
identify problematic fields.

Reimplemented in lsst.ip.isr.defects.Defects, and lsst.ip.isr.calibType.IsrProvenance.

Definition at line 95 of file calibType.py.

95  def __eq__(self, other):
96  """Calibration equivalence.
97 
98  Running ``calib.log.setLevel(0)`` enables debug statements to
99  identify problematic fields.
100  """
101  if not isinstance(other, self.__class__):
102  self.log.debug("Incorrect class type: %s %s", self.__class__, other.__class__)
103  return False
104 
105  for attr in self._requiredAttributes:
106  attrSelf = getattr(self, attr)
107  attrOther = getattr(other, attr)
108 
109  if isinstance(attrSelf, dict):
110  # Dictionary of arrays.
111  if attrSelf.keys() != attrOther.keys():
112  self.log.debug("Dict Key Failure: %s %s %s", attr, attrSelf.keys(), attrOther.keys())
113  return False
114  for key in attrSelf:
115  if not np.allclose(attrSelf[key], attrOther[key], equal_nan=True):
116  self.log.debug("Array Failure: %s %s %s", key, attrSelf[key], attrOther[key])
117  return False
118  elif isinstance(attrSelf, np.ndarray):
119  # Bare array.
120  if not np.allclose(attrSelf, attrOther, equal_nan=True):
121  self.log.debug("Array Failure: %s %s %s", attr, attrSelf, attrOther)
122  return False
123  elif type(attrSelf) != type(attrOther):
124  if set([attrSelf, attrOther]) == set([None, ""]):
125  # Fits converts None to "", but None is not "".
126  continue
127  self.log.debug("Type Failure: %s %s %s %s %s", attr, type(attrSelf), type(attrOther),
128  attrSelf, attrOther)
129  return False
130  else:
131  if attrSelf != attrOther:
132  self.log.debug("Value Failure: %s %s %s", attr, attrSelf, attrOther)
133  return False
134 
135  return True
136 
table::Key< int > type
Definition: Detector.cc:163
daf::base::PropertySet * set
Definition: fits.cc:912

◆ __str__()

def lsst.ip.isr.calibType.IsrCalib.__str__ (   self)
inherited

Reimplemented in lsst.ip.isr.defects.Defects, and lsst.ip.isr.calibType.IsrProvenance.

Definition at line 92 of file calibType.py.

92  def __str__(self):
93  return f"{self.__class__.__name__}(obstype={self._OBSTYPE}, detector={self._detectorName}, )"
94 

◆ apply()

def lsst.ip.isr.calibType.IsrCalib.apply (   self,
  target 
)
inherited
Method to apply the calibration to the target object.

Parameters
----------
target : `object`
    Thing to validate against.

Returns
-------
valid : `bool`
    Returns true if the calibration was applied correctly.

Raises
------
NotImplementedError :
    Raised if not implemented.

Definition at line 612 of file calibType.py.

612  def apply(self, target):
613  """Method to apply the calibration to the target object.
614 
615  Parameters
616  ----------
617  target : `object`
618  Thing to validate against.
619 
620  Returns
621  -------
622  valid : `bool`
623  Returns true if the calibration was applied correctly.
624 
625  Raises
626  ------
627  NotImplementedError :
628  Raised if not implemented.
629  """
630  raise NotImplementedError("Must be implemented by subclass.")
631 
632 

◆ applyLinearity()

def lsst.ip.isr.linearize.Linearizer.applyLinearity (   self,
  image,
  detector = None,
  log = None 
)
Apply the linearity to an image.

If the linearity parameters are populated, use those,
otherwise use the values from the detector.

Parameters
----------
image : `~lsst.afw.image.image`
    Image to correct.
detector : `~lsst.afw.cameraGeom.detector`
    Detector to use for linearity parameters if not already
    populated.
log : `~logging.Logger`, optional
    Log object to use for logging.

Definition at line 428 of file linearize.py.

428  def applyLinearity(self, image, detector=None, log=None):
429  """Apply the linearity to an image.
430 
431  If the linearity parameters are populated, use those,
432  otherwise use the values from the detector.
433 
434  Parameters
435  ----------
436  image : `~lsst.afw.image.image`
437  Image to correct.
438  detector : `~lsst.afw.cameraGeom.detector`
439  Detector to use for linearity parameters if not already
440  populated.
441  log : `~logging.Logger`, optional
442  Log object to use for logging.
443  """
444  if log is None:
445  log = self.log
446  if detector and not self.hasLinearity:
447  self.fromDetector(detector)
448 
449  self.validate(detector)
450 
451  numAmps = 0
452  numLinearized = 0
453  numOutOfRange = 0
454  for ampName in self.linearityType.keys():
455  linearizer = self.getLinearityTypeByName(self.linearityType[ampName])
456  numAmps += 1
457  if linearizer is not None:
458  ampView = image.Factory(image, self.linearityBBox[ampName])
459  success, outOfRange = linearizer()(ampView, **{'coeffs': self.linearityCoeffs[ampName],
460  'table': self.tableData,
461  'log': self.log})
462  numOutOfRange += outOfRange
463  if success:
464  numLinearized += 1
465  elif log is not None:
466  log.warning("Amplifier %s did not linearize.",
467  ampName)
468  return Struct(
469  numAmps=numAmps,
470  numLinearized=numLinearized,
471  numOutOfRange=numOutOfRange
472  )
473 
474 

◆ calibInfoFromDict()

def lsst.ip.isr.calibType.IsrCalib.calibInfoFromDict (   self,
  dictionary 
)
inherited
Handle common keywords.

This isn't an ideal solution, but until all calibrations
expect to find everything in the metadata, they still need to
search through dictionaries.

Parameters
----------
dictionary : `dict` or `lsst.daf.base.PropertyList`
    Source for the common keywords.

Raises
------
RuntimeError :
    Raised if the dictionary does not match the expected OBSTYPE.

Definition at line 261 of file calibType.py.

261  def calibInfoFromDict(self, dictionary):
262  """Handle common keywords.
263 
264  This isn't an ideal solution, but until all calibrations
265  expect to find everything in the metadata, they still need to
266  search through dictionaries.
267 
268  Parameters
269  ----------
270  dictionary : `dict` or `lsst.daf.base.PropertyList`
271  Source for the common keywords.
272 
273  Raises
274  ------
275  RuntimeError :
276  Raised if the dictionary does not match the expected OBSTYPE.
277 
278  """
279 
280  def search(haystack, needles):
281  """Search dictionary 'haystack' for an entry in 'needles'
282  """
283  test = [haystack.get(x) for x in needles]
284  test = set([x for x in test if x is not None])
285  if len(test) == 0:
286  if "metadata" in haystack:
287  return search(haystack["metadata"], needles)
288  else:
289  return None
290  elif len(test) == 1:
291  value = list(test)[0]
292  if value == "":
293  return None
294  else:
295  return value
296  else:
297  raise ValueError(f"Too many values found: {len(test)} {test} {needles}")
298 
299  if "metadata" in dictionary:
300  metadata = dictionary["metadata"]
301 
302  if self._OBSTYPE != metadata["OBSTYPE"]:
303  raise RuntimeError(f"Incorrect calibration supplied. Expected {self._OBSTYPE}, "
304  f"found {metadata['OBSTYPE']}")
305 
306  self._instrument = search(dictionary, ["INSTRUME", "instrument"])
307  self._raftName = search(dictionary, ["RAFTNAME"])
308  self._slotName = search(dictionary, ["SLOTNAME"])
309  self._detectorId = search(dictionary, ["DETECTOR", "detectorId"])
310  self._detectorName = search(dictionary, ["DET_NAME", "DETECTOR_NAME", "detectorName"])
311  self._detectorSerial = search(dictionary, ["DET_SER", "DETECTOR_SERIAL", "detectorSerial"])
312  self._filter = search(dictionary, ["FILTER", "filterName"])
313  self._calibId = search(dictionary, ["CALIB_ID"])
314 

◆ determineCalibClass()

def lsst.ip.isr.calibType.IsrCalib.determineCalibClass (   cls,
  metadata,
  message 
)
inherited
Attempt to find calibration class in metadata.

Parameters
----------
metadata : `dict` or `lsst.daf.base.PropertyList`
    Metadata possibly containing a calibration class entry.
message : `str`
    Message to include in any errors.

Returns
-------
calibClass : `object`
    The class to use to read the file contents.  Should be an
    `lsst.ip.isr.IsrCalib` subclass.

Raises
------
ValueError :
    Raised if the resulting calibClass is the base
    `lsst.ip.isr.IsrClass` (which does not implement the
    content methods).

Definition at line 316 of file calibType.py.

316  def determineCalibClass(cls, metadata, message):
317  """Attempt to find calibration class in metadata.
318 
319  Parameters
320  ----------
321  metadata : `dict` or `lsst.daf.base.PropertyList`
322  Metadata possibly containing a calibration class entry.
323  message : `str`
324  Message to include in any errors.
325 
326  Returns
327  -------
328  calibClass : `object`
329  The class to use to read the file contents. Should be an
330  `lsst.ip.isr.IsrCalib` subclass.
331 
332  Raises
333  ------
334  ValueError :
335  Raised if the resulting calibClass is the base
336  `lsst.ip.isr.IsrClass` (which does not implement the
337  content methods).
338  """
339  calibClassName = metadata.get("CALIBCLS")
340  calibClass = doImport(calibClassName) if calibClassName is not None else cls
341  if calibClass is IsrCalib:
342  raise ValueError(f"Cannot use base class to read calibration data: {msg}")
343  return calibClass
344 

◆ fromDetector()

def lsst.ip.isr.linearize.Linearizer.fromDetector (   self,
  detector 
)
Read linearity parameters from a detector.

Parameters
----------
detector : `lsst.afw.cameraGeom.detector`
    Input detector with parameters to use.

Returns
-------
calib : `lsst.ip.isr.Linearizer`
    The calibration constructed from the detector.

Reimplemented from lsst.ip.isr.calibType.IsrCalib.

Definition at line 147 of file linearize.py.

147  def fromDetector(self, detector):
148  """Read linearity parameters from a detector.
149 
150  Parameters
151  ----------
152  detector : `lsst.afw.cameraGeom.detector`
153  Input detector with parameters to use.
154 
155  Returns
156  -------
157  calib : `lsst.ip.isr.Linearizer`
158  The calibration constructed from the detector.
159  """
160  self._detectorName = detector.getName()
161  self._detectorSerial = detector.getSerial()
162  self._detectorId = detector.getId()
163  self.hasLinearity = True
164 
165  # Do not translate Threshold, Maximum, Units.
166  for amp in detector.getAmplifiers():
167  ampName = amp.getName()
168  self.ampNames.append(ampName)
169  self.linearityType[ampName] = amp.getLinearityType()
170  self.linearityCoeffs[ampName] = amp.getLinearityCoeffs()
171  self.linearityBBox[ampName] = amp.getBBox()
172 
173  return self
174 
std::shared_ptr< FrameSet > append(FrameSet const &first, FrameSet const &second)
Construct a FrameSet that performs two transformations in series.
Definition: functional.cc:33

◆ fromDict() [1/2]

def lsst.ip.isr.linearize.Linearizer.fromDict (   cls,
  dictionary 
)
Construct a calibration from a dictionary of properties

Parameters
----------
dictionary : `dict`
    Dictionary of properties

Returns
-------
calib : `lsst.ip.isr.Linearity`
    Constructed calibration.

Raises
------
RuntimeError
    Raised if the supplied dictionary is for a different
    calibration.

Definition at line 176 of file linearize.py.

176  def fromDict(cls, dictionary):
177  """Construct a calibration from a dictionary of properties
178 
179  Parameters
180  ----------
181  dictionary : `dict`
182  Dictionary of properties
183 
184  Returns
185  -------
186  calib : `lsst.ip.isr.Linearity`
187  Constructed calibration.
188 
189  Raises
190  ------
191  RuntimeError
192  Raised if the supplied dictionary is for a different
193  calibration.
194  """
195 
196  calib = cls()
197 
198  if calib._OBSTYPE != dictionary['metadata']['OBSTYPE']:
199  raise RuntimeError(f"Incorrect linearity supplied. Expected {calib._OBSTYPE}, "
200  f"found {dictionary['metadata']['OBSTYPE']}")
201 
202  calib.setMetadata(dictionary['metadata'])
203 
204  calib.hasLinearity = dictionary.get('hasLinearity',
205  dictionary['metadata'].get('HAS_LINEARITY', False))
206  calib.override = dictionary.get('override', True)
207 
208  if calib.hasLinearity:
209  for ampName in dictionary['amplifiers']:
210  amp = dictionary['amplifiers'][ampName]
211  calib.ampNames.append(ampName)
212  calib.linearityCoeffs[ampName] = np.array(amp.get('linearityCoeffs', [0.0]))
213  calib.linearityType[ampName] = amp.get('linearityType', 'None')
214  calib.linearityBBox[ampName] = amp.get('linearityBBox', None)
215 
216  calib.fitParams[ampName] = np.array(amp.get('fitParams', [0.0]))
217  calib.fitParamsErr[ampName] = np.array(amp.get('fitParamsErr', [0.0]))
218  calib.fitChiSq[ampName] = amp.get('fitChiSq', np.nan)
219 
220  calib.tableData = dictionary.get('tableData', None)
221  if calib.tableData:
222  calib.tableData = np.array(calib.tableData)
223 
224  return calib
225 

◆ fromDict() [2/2]

def lsst.ip.isr.calibType.IsrCalib.fromDict (   cls,
  dictionary,
**  kwargs 
)
inherited
Construct a calibration from a dictionary of properties.

Must be implemented by the specific calibration subclasses.

Parameters
----------
dictionary : `dict`
    Dictionary of properties.
kwargs : `dict` or collections.abc.Mapping`, optional
    Set of key=value options.

Returns
------
calib : `lsst.ip.isr.CalibType`
    Constructed calibration.

Raises
------
NotImplementedError :
    Raised if not implemented.

Definition at line 512 of file calibType.py.

512  def fromDict(cls, dictionary, **kwargs):
513  """Construct a calibration from a dictionary of properties.
514 
515  Must be implemented by the specific calibration subclasses.
516 
517  Parameters
518  ----------
519  dictionary : `dict`
520  Dictionary of properties.
521  kwargs : `dict` or collections.abc.Mapping`, optional
522  Set of key=value options.
523 
524  Returns
525  ------
526  calib : `lsst.ip.isr.CalibType`
527  Constructed calibration.
528 
529  Raises
530  ------
531  NotImplementedError :
532  Raised if not implemented.
533  """
534  raise NotImplementedError("Must be implemented by subclass.")
535 

◆ fromTable() [1/2]

def lsst.ip.isr.linearize.Linearizer.fromTable (   cls,
  tableList 
)
Read linearity from a FITS file.

This method uses the `fromDict` method to create the
calibration, after constructing an appropriate dictionary from
the input tables.

Parameters
----------
tableList : `list` [`astropy.table.Table`]
    afwTable read from input file name.

Returns
-------
linearity : `~lsst.ip.isr.linearize.Linearizer``
    Linearity parameters.

Notes
-----
The method reads a FITS file with 1 or 2 extensions. The metadata is read from the header of
extension 1, which must exist.  Then the table is loaded, and  the ['AMPLIFIER_NAME', 'TYPE',
'COEFFS', 'BBOX_X0', 'BBOX_Y0', 'BBOX_DX', 'BBOX_DY'] columns are read and used to
set each dictionary by looping over rows.
Eextension 2 is then attempted to read in the try block (which only exists for lookup tables).
It has a column named 'LOOKUP_VALUES' that contains a vector of the lookup entries in each row.

Definition at line 255 of file linearize.py.

255  def fromTable(cls, tableList):
256  """Read linearity from a FITS file.
257 
258  This method uses the `fromDict` method to create the
259  calibration, after constructing an appropriate dictionary from
260  the input tables.
261 
262  Parameters
263  ----------
264  tableList : `list` [`astropy.table.Table`]
265  afwTable read from input file name.
266 
267  Returns
268  -------
269  linearity : `~lsst.ip.isr.linearize.Linearizer``
270  Linearity parameters.
271 
272  Notes
273  -----
274  The method reads a FITS file with 1 or 2 extensions. The metadata is read from the header of
275  extension 1, which must exist. Then the table is loaded, and the ['AMPLIFIER_NAME', 'TYPE',
276  'COEFFS', 'BBOX_X0', 'BBOX_Y0', 'BBOX_DX', 'BBOX_DY'] columns are read and used to
277  set each dictionary by looping over rows.
278  Eextension 2 is then attempted to read in the try block (which only exists for lookup tables).
279  It has a column named 'LOOKUP_VALUES' that contains a vector of the lookup entries in each row.
280 
281  """
282  coeffTable = tableList[0]
283 
284  metadata = coeffTable.meta
285  inDict = dict()
286  inDict['metadata'] = metadata
287  inDict['hasLinearity'] = metadata.get('HAS_LINEARITY', False)
288  inDict['amplifiers'] = dict()
289 
290  for record in coeffTable:
291  ampName = record['AMPLIFIER_NAME']
292 
293  fitParams = record['FIT_PARAMS'] if 'FIT_PARAMS' in record.columns else np.array([0.0])
294  fitParamsErr = record['FIT_PARAMS_ERR'] if 'FIT_PARAMS_ERR' in record.columns else np.array([0.0])
295  fitChiSq = record['RED_CHI_SQ'] if 'RED_CHI_SQ' in record.columns else np.nan
296 
297  inDict['amplifiers'][ampName] = {
298  'linearityType': record['TYPE'],
299  'linearityCoeffs': record['COEFFS'],
300  'linearityBBox': Box2I(Point2I(record['BBOX_X0'], record['BBOX_Y0']),
301  Extent2I(record['BBOX_DX'], record['BBOX_DY'])),
302  'fitParams': fitParams,
303  'fitParamsErr': fitParamsErr,
304  'fitChiSq': fitChiSq,
305  }
306 
307  if len(tableList) > 1:
308  tableData = tableList[1]
309  inDict['tableData'] = [record['LOOKUP_VALUES'] for record in tableData]
310 
311  return cls().fromDict(inDict)
312 
Extent< int, 2 > Extent2I
Definition: Extent.h:397
Point< int, 2 > Point2I
Definition: Point.h:321

◆ fromTable() [2/2]

def lsst.ip.isr.calibType.IsrCalib.fromTable (   cls,
  tableList,
**  kwargs 
)
inherited
Construct a calibration from a dictionary of properties.

Must be implemented by the specific calibration subclasses.

Parameters
----------
tableList : `list` [`lsst.afw.table.Table`]
    List of tables of properties.
kwargs : `dict` or collections.abc.Mapping`, optional
    Set of key=value options.

Returns
------
calib : `lsst.ip.isr.CalibType`
    Constructed calibration.

Raises
------
NotImplementedError :
    Raised if not implemented.

Definition at line 555 of file calibType.py.

555  def fromTable(cls, tableList, **kwargs):
556  """Construct a calibration from a dictionary of properties.
557 
558  Must be implemented by the specific calibration subclasses.
559 
560  Parameters
561  ----------
562  tableList : `list` [`lsst.afw.table.Table`]
563  List of tables of properties.
564  kwargs : `dict` or collections.abc.Mapping`, optional
565  Set of key=value options.
566 
567  Returns
568  ------
569  calib : `lsst.ip.isr.CalibType`
570  Constructed calibration.
571 
572  Raises
573  ------
574  NotImplementedError :
575  Raised if not implemented.
576  """
577  raise NotImplementedError("Must be implemented by subclass.")
578 

◆ getLinearityTypeByName()

def lsst.ip.isr.linearize.Linearizer.getLinearityTypeByName (   self,
  linearityTypeName 
)
Determine the linearity class to use from the type name.

Parameters
----------
linearityTypeName : str
    String name of the linearity type that is needed.

Returns
-------
linearityType : `~lsst.ip.isr.linearize.LinearizeBase`
    The appropriate linearity class to use.  If no matching class
    is found, `None` is returned.

Definition at line 347 of file linearize.py.

347  def getLinearityTypeByName(self, linearityTypeName):
348  """Determine the linearity class to use from the type name.
349 
350  Parameters
351  ----------
352  linearityTypeName : str
353  String name of the linearity type that is needed.
354 
355  Returns
356  -------
357  linearityType : `~lsst.ip.isr.linearize.LinearizeBase`
358  The appropriate linearity class to use. If no matching class
359  is found, `None` is returned.
360  """
361  for t in [LinearizeLookupTable,
362  LinearizeSquared,
363  LinearizePolynomial,
364  LinearizeProportional,
365  LinearizeSpline,
366  LinearizeNone]:
367  if t.LinearityType == linearityTypeName:
368  return t
369  return None
370 

◆ getMetadata()

def lsst.ip.isr.calibType.IsrCalib.getMetadata (   self)
inherited
Retrieve metadata associated with this calibration.

Returns
-------
meta : `lsst.daf.base.PropertyList`
    Metadata. The returned `~lsst.daf.base.PropertyList` can be
    modified by the caller and the changes will be written to
    external files.

Definition at line 145 of file calibType.py.

145  def getMetadata(self):
146  """Retrieve metadata associated with this calibration.
147 
148  Returns
149  -------
150  meta : `lsst.daf.base.PropertyList`
151  Metadata. The returned `~lsst.daf.base.PropertyList` can be
152  modified by the caller and the changes will be written to
153  external files.
154  """
155  return self._metadata
156 

◆ readFits()

def lsst.ip.isr.calibType.IsrCalib.readFits (   cls,
  filename,
**  kwargs 
)
inherited
Read calibration data from a FITS file.

Parameters
----------
filename : `str`
    Filename to read data from.
kwargs : `dict` or collections.abc.Mapping`, optional
    Set of key=value pairs to pass to the ``fromTable``
    method.

Returns
-------
calib : `lsst.ip.isr.IsrCalib`
    Calibration contained within the file.

Definition at line 432 of file calibType.py.

432  def readFits(cls, filename, **kwargs):
433  """Read calibration data from a FITS file.
434 
435  Parameters
436  ----------
437  filename : `str`
438  Filename to read data from.
439  kwargs : `dict` or collections.abc.Mapping`, optional
440  Set of key=value pairs to pass to the ``fromTable``
441  method.
442 
443  Returns
444  -------
445  calib : `lsst.ip.isr.IsrCalib`
446  Calibration contained within the file.
447  """
448  tableList = []
449  tableList.append(Table.read(filename, hdu=1))
450  extNum = 2 # Fits indices start at 1, we've read one already.
451  keepTrying = True
452 
453  while keepTrying:
454  with warnings.catch_warnings():
455  warnings.simplefilter("error")
456  try:
457  newTable = Table.read(filename, hdu=extNum)
458  tableList.append(newTable)
459  extNum += 1
460  except Exception:
461  keepTrying = False
462 
463  for table in tableList:
464  for k, v in table.meta.items():
465  if isinstance(v, fits.card.Undefined):
466  table.meta[k] = None
467 
468  calibClass = cls.determineCalibClass(tableList[0].meta, "readFits")
469  return calibClass.fromTable(tableList, **kwargs)
470 

◆ readText()

def lsst.ip.isr.calibType.IsrCalib.readText (   cls,
  filename,
**  kwargs 
)
inherited
Read calibration representation from a yaml/ecsv file.

Parameters
----------
filename : `str`
    Name of the file containing the calibration definition.
kwargs : `dict` or collections.abc.Mapping`, optional
    Set of key=value pairs to pass to the ``fromDict`` or
    ``fromTable`` methods.

Returns
-------
calib : `~lsst.ip.isr.IsrCalibType`
    Calibration class.

Raises
------
RuntimeError :
    Raised if the filename does not end in ".ecsv" or ".yaml".

Definition at line 346 of file calibType.py.

346  def readText(cls, filename, **kwargs):
347  """Read calibration representation from a yaml/ecsv file.
348 
349  Parameters
350  ----------
351  filename : `str`
352  Name of the file containing the calibration definition.
353  kwargs : `dict` or collections.abc.Mapping`, optional
354  Set of key=value pairs to pass to the ``fromDict`` or
355  ``fromTable`` methods.
356 
357  Returns
358  -------
359  calib : `~lsst.ip.isr.IsrCalibType`
360  Calibration class.
361 
362  Raises
363  ------
364  RuntimeError :
365  Raised if the filename does not end in ".ecsv" or ".yaml".
366  """
367  if filename.endswith((".ecsv", ".ECSV")):
368  data = Table.read(filename, format="ascii.ecsv")
369  calibClass = cls.determineCalibClass(data.meta, "readText/ECSV")
370  return calibClass.fromTable([data], **kwargs)
371  elif filename.endswith((".yaml", ".YAML")):
372  with open(filename, "r") as f:
373  data = yaml.load(f, Loader=yaml.CLoader)
374  calibClass = cls.determineCalibClass(data["metadata"], "readText/YAML")
375  return calibClass.fromDict(data, **kwargs)
376  else:
377  raise RuntimeError(f"Unknown filename extension: {filename}")
378 

◆ requiredAttributes() [1/2]

def lsst.ip.isr.calibType.IsrCalib.requiredAttributes (   self)
inherited

Definition at line 138 of file calibType.py.

138  def requiredAttributes(self):
139  return self._requiredAttributes
140 

◆ requiredAttributes() [2/2]

def lsst.ip.isr.calibType.IsrCalib.requiredAttributes (   self,
  value 
)
inherited

Definition at line 142 of file calibType.py.

142  def requiredAttributes(self, value):
143  self._requiredAttributes = value
144 

◆ setMetadata()

def lsst.ip.isr.calibType.IsrCalib.setMetadata (   self,
  metadata 
)
inherited
Store a copy of the supplied metadata with this calibration.

Parameters
----------
metadata : `lsst.daf.base.PropertyList`
    Metadata to associate with the calibration.  Will be copied and
    overwrite existing metadata.

Definition at line 157 of file calibType.py.

157  def setMetadata(self, metadata):
158  """Store a copy of the supplied metadata with this calibration.
159 
160  Parameters
161  ----------
162  metadata : `lsst.daf.base.PropertyList`
163  Metadata to associate with the calibration. Will be copied and
164  overwrite existing metadata.
165  """
166  if metadata is not None:
167  self._metadata.update(metadata)
168 
169  # Ensure that we have the obs type required by calibration ingest
170  self._metadata["OBSTYPE"] = self._OBSTYPE
171  self._metadata[self._OBSTYPE + "_SCHEMA"] = self._SCHEMA
172  self._metadata[self._OBSTYPE + "_VERSION"] = self._VERSION
173 
174  if isinstance(metadata, dict):
175  self.calibInfoFromDict(metadata)
176  elif isinstance(metadata, PropertyList):
177  self.calibInfoFromDict(metadata.toDict())
178 

◆ toDict()

def lsst.ip.isr.linearize.Linearizer.toDict (   self)
Return linearity parameters as a dict.

Returns
-------
outDict : `dict`:

Reimplemented from lsst.ip.isr.calibType.IsrCalib.

Definition at line 226 of file linearize.py.

226  def toDict(self):
227  """Return linearity parameters as a dict.
228 
229  Returns
230  -------
231  outDict : `dict`:
232  """
233  self.updateMetadata()
234 
235  outDict = {'metadata': self.getMetadata(),
236  'detectorName': self._detectorName,
237  'detectorSerial': self._detectorSerial,
238  'detectorId': self._detectorId,
239  'hasTable': self.tableData is not None,
240  'amplifiers': dict(),
241  }
242  for ampName in self.linearityType:
243  outDict['amplifiers'][ampName] = {'linearityType': self.linearityType[ampName],
244  'linearityCoeffs': self.linearityCoeffs[ampName].tolist(),
245  'linearityBBox': self.linearityBBox[ampName],
246  'fitParams': self.fitParams[ampName].tolist(),
247  'fitParamsErr': self.fitParamsErr[ampName].tolist(),
248  'fitChiSq': self.fitChiSq[ampName]}
249  if self.tableData is not None:
250  outDict['tableData'] = self.tableData.tolist()
251 
252  return outDict
253 

◆ toTable()

def lsst.ip.isr.linearize.Linearizer.toTable (   self)
Construct a list of tables containing the information in this calibration

The list of tables should create an identical calibration
after being passed to this class's fromTable method.

Returns
-------
tableList : `list` [`astropy.table.Table`]
    List of tables containing the linearity calibration
    information.

Reimplemented from lsst.ip.isr.calibType.IsrCalib.

Definition at line 313 of file linearize.py.

313  def toTable(self):
314  """Construct a list of tables containing the information in this calibration
315 
316  The list of tables should create an identical calibration
317  after being passed to this class's fromTable method.
318 
319  Returns
320  -------
321  tableList : `list` [`astropy.table.Table`]
322  List of tables containing the linearity calibration
323  information.
324  """
325 
326  tableList = []
327  self.updateMetadata()
328  catalog = Table([{'AMPLIFIER_NAME': ampName,
329  'TYPE': self.linearityType[ampName],
330  'COEFFS': self.linearityCoeffs[ampName],
331  'BBOX_X0': self.linearityBBox[ampName].getMinX(),
332  'BBOX_Y0': self.linearityBBox[ampName].getMinY(),
333  'BBOX_DX': self.linearityBBox[ampName].getWidth(),
334  'BBOX_DY': self.linearityBBox[ampName].getHeight(),
335  'FIT_PARAMS': self.fitParams[ampName],
336  'FIT_PARAMS_ERR': self.fitParamsErr[ampName],
337  'RED_CHI_SQ': self.fitChiSq[ampName],
338  } for ampName in self.ampNames])
339  catalog.meta = self.getMetadata().toDict()
340  tableList.append(catalog)
341 
342  if self.tableData is not None:
343  catalog = Table([{'LOOKUP_VALUES': value} for value in self.tableData])
344  tableList.append(catalog)
345  return(tableList)
346 

◆ updateMetadata() [1/2]

def lsst.ip.isr.calibType.IsrCalib.updateMetadata (   self,
  camera = None,
  detector = None,
  filterName = None,
  setCalibId = False,
  setCalibInfo = False,
  setDate = False,
**  kwargs 
)
inherited
Update metadata keywords with new values.

Parameters
----------
camera : `lsst.afw.cameraGeom.Camera`, optional
    Reference camera to use to set _instrument field.
detector : `lsst.afw.cameraGeom.Detector`, optional
    Reference detector to use to set _detector* fields.
filterName : `str`, optional
    Filter name to assign to this calibration.
setCalibId : `bool`, optional
    Construct the _calibId field from other fields.
setCalibInfo : `bool`, optional
    Set calibration parameters from metadata.
setDate : `bool`, optional
    Ensure the metadata CALIBDATE fields are set to the current datetime.
kwargs : `dict` or `collections.abc.Mapping`, optional
    Set of key=value pairs to assign to the metadata.

Definition at line 179 of file calibType.py.

181  **kwargs):
182  """Update metadata keywords with new values.
183 
184  Parameters
185  ----------
186  camera : `lsst.afw.cameraGeom.Camera`, optional
187  Reference camera to use to set _instrument field.
188  detector : `lsst.afw.cameraGeom.Detector`, optional
189  Reference detector to use to set _detector* fields.
190  filterName : `str`, optional
191  Filter name to assign to this calibration.
192  setCalibId : `bool`, optional
193  Construct the _calibId field from other fields.
194  setCalibInfo : `bool`, optional
195  Set calibration parameters from metadata.
196  setDate : `bool`, optional
197  Ensure the metadata CALIBDATE fields are set to the current datetime.
198  kwargs : `dict` or `collections.abc.Mapping`, optional
199  Set of key=value pairs to assign to the metadata.
200  """
201  mdOriginal = self.getMetadata()
202  mdSupplemental = dict()
203 
204  for k, v in kwargs.items():
205  if isinstance(v, fits.card.Undefined):
206  kwargs[k] = None
207 
208  if setCalibInfo:
209  self.calibInfoFromDict(kwargs)
210 
211  if camera:
212  self._instrument = camera.getName()
213 
214  if detector:
215  self._detectorName = detector.getName()
216  self._detectorSerial = detector.getSerial()
217  self._detectorId = detector.getId()
218  if "_" in self._detectorName:
219  (self._raftName, self._slotName) = self._detectorName.split("_")
220 
221  if filterName:
222  # TOD0 DM-28093: I think this whole comment can go away, if we
223  # always use physicalLabel everywhere in ip_isr.
224  # If set via:
225  # exposure.getInfo().getFilter().getName()
226  # then this will hold the abstract filter.
227  self._filter = filterName
228 
229  if setDate:
230  date = datetime.datetime.now()
231  mdSupplemental["CALIBDATE"] = date.isoformat()
232  mdSupplemental["CALIB_CREATION_DATE"] = date.date().isoformat()
233  mdSupplemental["CALIB_CREATION_TIME"] = date.time().isoformat()
234 
235  if setCalibId:
236  values = []
237  values.append(f"instrument={self._instrument}") if self._instrument else None
238  values.append(f"raftName={self._raftName}") if self._raftName else None
239  values.append(f"detectorName={self._detectorName}") if self._detectorName else None
240  values.append(f"detector={self._detectorId}") if self._detectorId else None
241  values.append(f"filter={self._filter}") if self._filter else None
242 
243  calibDate = mdOriginal.get("CALIBDATE", mdSupplemental.get("CALIBDATE", None))
244  values.append(f"calibDate={calibDate}") if calibDate else None
245 
246  self._calibId = " ".join(values)
247 
248  self._metadata["INSTRUME"] = self._instrument if self._instrument else None
249  self._metadata["RAFTNAME"] = self._raftName if self._raftName else None
250  self._metadata["SLOTNAME"] = self._slotName if self._slotName else None
251  self._metadata["DETECTOR"] = self._detectorId
252  self._metadata["DET_NAME"] = self._detectorName if self._detectorName else None
253  self._metadata["DET_SER"] = self._detectorSerial if self._detectorSerial else None
254  self._metadata["FILTER"] = self._filter if self._filter else None
255  self._metadata["CALIB_ID"] = self._calibId if self._calibId else None
256  self._metadata["CALIBCLS"] = get_full_type_name(self)
257 
258  mdSupplemental.update(kwargs)
259  mdOriginal.update(mdSupplemental)
260 

◆ updateMetadata() [2/2]

def lsst.ip.isr.linearize.Linearizer.updateMetadata (   self,
  setDate = False,
**  kwargs 
)
Update metadata keywords with new values.

This calls the base class's method after ensuring the required
calibration keywords will be saved.

Parameters
----------
setDate : `bool`, optional
    Update the CALIBDATE fields in the metadata to the current
    time. Defaults to False.
kwargs :
    Other keyword parameters to set in the metadata.

Definition at line 127 of file linearize.py.

127  def updateMetadata(self, setDate=False, **kwargs):
128  """Update metadata keywords with new values.
129 
130  This calls the base class's method after ensuring the required
131  calibration keywords will be saved.
132 
133  Parameters
134  ----------
135  setDate : `bool`, optional
136  Update the CALIBDATE fields in the metadata to the current
137  time. Defaults to False.
138  kwargs :
139  Other keyword parameters to set in the metadata.
140  """
141  kwargs['HAS_LINEARITY'] = self.hasLinearity
142  kwargs['OVERRIDE'] = self.override
143  kwargs['HAS_TABLE'] = self.tableData is not None
144 
145  super().updateMetadata(setDate=setDate, **kwargs)
146 

◆ validate() [1/2]

def lsst.ip.isr.linearize.Linearizer.validate (   self,
  detector = None,
  amplifier = None 
)
Validate linearity for a detector/amplifier.

Parameters
----------
detector : `lsst.afw.cameraGeom.Detector`, optional
    Detector to validate, along with its amplifiers.
amplifier : `lsst.afw.cameraGeom.Amplifier`, optional
    Single amplifier to validate.

Raises
------
RuntimeError :
    Raised if there is a mismatch in linearity parameters, and
    the cameraGeom parameters are not being overridden.

Definition at line 371 of file linearize.py.

371  def validate(self, detector=None, amplifier=None):
372  """Validate linearity for a detector/amplifier.
373 
374  Parameters
375  ----------
376  detector : `lsst.afw.cameraGeom.Detector`, optional
377  Detector to validate, along with its amplifiers.
378  amplifier : `lsst.afw.cameraGeom.Amplifier`, optional
379  Single amplifier to validate.
380 
381  Raises
382  ------
383  RuntimeError :
384  Raised if there is a mismatch in linearity parameters, and
385  the cameraGeom parameters are not being overridden.
386  """
387  amplifiersToCheck = []
388  if detector:
389  if self._detectorName != detector.getName():
390  raise RuntimeError("Detector names don't match: %s != %s" %
391  (self._detectorName, detector.getName()))
392  if int(self._detectorId) != int(detector.getId()):
393  raise RuntimeError("Detector IDs don't match: %s != %s" %
394  (int(self._detectorId), int(detector.getId())))
395  if self._detectorSerial != detector.getSerial():
396  raise RuntimeError("Detector serial numbers don't match: %s != %s" %
397  (self._detectorSerial, detector.getSerial()))
398  if len(detector.getAmplifiers()) != len(self.linearityCoeffs.keys()):
399  raise RuntimeError("Detector number of amps = %s does not match saved value %s" %
400  (len(detector.getAmplifiers()),
401  len(self.linearityCoeffs.keys())))
402  amplifiersToCheck.extend(detector.getAmplifiers())
403 
404  if amplifier:
405  amplifiersToCheck.extend(amplifier)
406 
407  for amp in amplifiersToCheck:
408  ampName = amp.getName()
409  if ampName not in self.linearityCoeffs.keys():
410  raise RuntimeError("Amplifier %s is not in linearity data" %
411  (ampName, ))
412  if amp.getLinearityType() != self.linearityType[ampName]:
413  if self.override:
414  self.log.warning("Overriding amplifier defined linearityType (%s) for %s",
415  self.linearityType[ampName], ampName)
416  else:
417  raise RuntimeError("Amplifier %s type %s does not match saved value %s" %
418  (ampName, amp.getLinearityType(), self.linearityType[ampName]))
419  if (amp.getLinearityCoeffs().shape != self.linearityCoeffs[ampName].shape or not
420  np.allclose(amp.getLinearityCoeffs(), self.linearityCoeffs[ampName], equal_nan=True)):
421  if self.override:
422  self.log.warning("Overriding amplifier defined linearityCoeffs (%s) for %s",
423  self.linearityCoeffs[ampName], ampName)
424  else:
425  raise RuntimeError("Amplifier %s coeffs %s does not match saved value %s" %
426  (ampName, amp.getLinearityCoeffs(), self.linearityCoeffs[ampName]))
427 

◆ validate() [2/2]

def lsst.ip.isr.calibType.IsrCalib.validate (   self,
  other = None 
)
inherited
Validate that this calibration is defined and can be used.

Parameters
----------
other : `object`, optional
    Thing to validate against.

Returns
-------
valid : `bool`
    Returns true if the calibration is valid and appropriate.

Definition at line 597 of file calibType.py.

597  def validate(self, other=None):
598  """Validate that this calibration is defined and can be used.
599 
600  Parameters
601  ----------
602  other : `object`, optional
603  Thing to validate against.
604 
605  Returns
606  -------
607  valid : `bool`
608  Returns true if the calibration is valid and appropriate.
609  """
610  return False
611 

◆ writeFits()

def lsst.ip.isr.calibType.IsrCalib.writeFits (   self,
  filename 
)
inherited
Write calibration data to a FITS file.

Parameters
----------
filename : `str`
    Filename to write data to.

Returns
-------
used : `str`
    The name of the file used to write the data.

Definition at line 471 of file calibType.py.

471  def writeFits(self, filename):
472  """Write calibration data to a FITS file.
473 
474  Parameters
475  ----------
476  filename : `str`
477  Filename to write data to.
478 
479  Returns
480  -------
481  used : `str`
482  The name of the file used to write the data.
483 
484  """
485  tableList = self.toTable()
486  with warnings.catch_warnings():
487  warnings.filterwarnings("ignore", category=Warning, module="astropy.io")
488  astropyList = [fits.table_to_hdu(table) for table in tableList]
489  astropyList.insert(0, fits.PrimaryHDU())
490 
491  writer = fits.HDUList(astropyList)
492  writer.writeto(filename, overwrite=True)
493  return filename
494 
def writeFits(filename, stamps, metadata, type_name, write_mask, write_variance, write_archive=False)
Definition: stamps.py:42

◆ writeText()

def lsst.ip.isr.calibType.IsrCalib.writeText (   self,
  filename,
  format = "auto" 
)
inherited
Write the calibration data to a text file.

Parameters
----------
filename : `str`
    Name of the file to write.
format : `str`
    Format to write the file as.  Supported values are:
        ``"auto"`` : Determine filetype from filename.
        ``"yaml"`` : Write as yaml.
        ``"ecsv"`` : Write as ecsv.
Returns
-------
used : `str`
    The name of the file used to write the data.  This may
    differ from the input if the format is explicitly chosen.

Raises
------
RuntimeError :
    Raised if filename does not end in a known extension, or
    if all information cannot be written.

Notes
-----
The file is written to YAML/ECSV format and will include any
associated metadata.

Definition at line 379 of file calibType.py.

379  def writeText(self, filename, format="auto"):
380  """Write the calibration data to a text file.
381 
382  Parameters
383  ----------
384  filename : `str`
385  Name of the file to write.
386  format : `str`
387  Format to write the file as. Supported values are:
388  ``"auto"`` : Determine filetype from filename.
389  ``"yaml"`` : Write as yaml.
390  ``"ecsv"`` : Write as ecsv.
391  Returns
392  -------
393  used : `str`
394  The name of the file used to write the data. This may
395  differ from the input if the format is explicitly chosen.
396 
397  Raises
398  ------
399  RuntimeError :
400  Raised if filename does not end in a known extension, or
401  if all information cannot be written.
402 
403  Notes
404  -----
405  The file is written to YAML/ECSV format and will include any
406  associated metadata.
407  """
408  if format == "yaml" or (format == "auto" and filename.lower().endswith((".yaml", ".YAML"))):
409  outDict = self.toDict()
410  path, ext = os.path.splitext(filename)
411  filename = path + ".yaml"
412  with open(filename, "w") as f:
413  yaml.dump(outDict, f)
414  elif format == "ecsv" or (format == "auto" and filename.lower().endswith((".ecsv", ".ECSV"))):
415  tableList = self.toTable()
416  if len(tableList) > 1:
417  # ECSV doesn't support multiple tables per file, so we
418  # can only write the first table.
419  raise RuntimeError(f"Unable to persist {len(tableList)}tables in ECSV format.")
420 
421  table = tableList[0]
422  path, ext = os.path.splitext(filename)
423  filename = path + ".ecsv"
424  table.write(filename, format="ascii.ecsv")
425  else:
426  raise RuntimeError(f"Attempt to write to a file {filename} "
427  "that does not end in '.yaml' or '.ecsv'")
428 
429  return filename
430 

Member Data Documentation

◆ ampNames

lsst.ip.isr.linearize.Linearizer.ampNames

Definition at line 103 of file linearize.py.

◆ fitChiSq

lsst.ip.isr.linearize.Linearizer.fitChiSq

Definition at line 110 of file linearize.py.

◆ fitParams

lsst.ip.isr.linearize.Linearizer.fitParams

Definition at line 108 of file linearize.py.

◆ fitParamsErr

lsst.ip.isr.linearize.Linearizer.fitParamsErr

Definition at line 109 of file linearize.py.

◆ hasLinearity

lsst.ip.isr.linearize.Linearizer.hasLinearity

Definition at line 100 of file linearize.py.

◆ linearityBBox

lsst.ip.isr.linearize.Linearizer.linearityBBox

Definition at line 106 of file linearize.py.

◆ linearityCoeffs

lsst.ip.isr.linearize.Linearizer.linearityCoeffs

Definition at line 104 of file linearize.py.

◆ linearityType

lsst.ip.isr.linearize.Linearizer.linearityType

Definition at line 105 of file linearize.py.

◆ log

lsst.ip.isr.calibType.IsrCalib.log
inherited

Definition at line 86 of file calibType.py.

◆ override

lsst.ip.isr.linearize.Linearizer.override

Definition at line 101 of file linearize.py.

◆ requiredAttributes

lsst.ip.isr.calibType.IsrCalib.requiredAttributes
inherited

Definition at line 81 of file calibType.py.

◆ tableData

lsst.ip.isr.linearize.Linearizer.tableData

Definition at line 112 of file linearize.py.


The documentation for this class was generated from the following file: