LSSTApplications  19.0.0-13-g16625d3+7,20.0.0+1,20.0.0+19,20.0.0+21,20.0.0+23,20.0.0+3,20.0.0+4,20.0.0+5,20.0.0+7,20.0.0+8,20.0.0-1-g10df615+18,20.0.0-1-g253301a+6,20.0.0-1-g596936a+21,20.0.0-1-g8a53f90+2,20.0.0-1-gc96f8cb+22,20.0.0-1-gd1c87d7+2,20.0.0-1-gdb27ee5+3,20.0.0-11-gda4966f+6,20.0.0-12-g2a9f6943,20.0.0-2-gec03fae+4,20.0.0-21-g52834e7+3,20.0.0-3-gd2e950e,20.0.0-4-g085c40a3+5,20.0.0-4-g4a2362f,20.0.0-4-gde602ef96+5,20.0.0-4-ge48a6ca+17,20.0.0-5-gfcb36e1+4,20.0.0-6-g20dd8cc+1,20.0.0-6-g9c77118+1,w.2020.30
LSSTDataManagementBasePackage
Public Member Functions | Public Attributes | Static Public Attributes | List of all members
lsst.ip.isr.measureCrosstalk.MeasureCrosstalkTask Class Reference
Inheritance diagram for lsst.ip.isr.measureCrosstalk.MeasureCrosstalkTask:
lsst.pipe.base.cmdLineTask.CmdLineTask lsst.pipe.base.task.Task

Public Member Functions

def __init__ (self, *args, **kwargs)
 
def parseAndRun (cls, *args, **kwargs)
 
def runDataRef (self, dataRef)
 
def run (self, exposure, dataId=None)
 
def extractCrosstalkRatios (self, exposure, threshold=None, badPixels=None)
 
def reduce (self, ratioList)
 
def measureCrosstalkCoefficients (self, ratios, rejIter=3, rejSigma=2.0)
 
def debugView (self, stepname, exposure)
 
def debugPixels (self, stepname, pixelsIn, pixelsOut, i, j)
 
def debugRatios (self, stepname, ratios, i, j)
 
def applyOverrides (cls, config)
 
def parseAndRun (cls, args=None, config=None, log=None, doReturnResults=False)
 
def writeConfig (self, butler, clobber=False, doBackup=True)
 
def writeSchemas (self, butler, clobber=False, doBackup=True)
 
def writeMetadata (self, dataRef)
 
def writePackageVersions (self, butler, clobber=False, doBackup=True, dataset="packages")
 
def emptyMetadata (self)
 
def getSchemaCatalogs (self)
 
def getAllSchemaCatalogs (self)
 
def getFullMetadata (self)
 
def getFullName (self)
 
def getName (self)
 
def getTaskDict (self)
 
def makeSubtask (self, name, **keyArgs)
 
def timer (self, name, logLevel=Log.DEBUG)
 
def makeField (cls, doc)
 
def __reduce__ (self)
 

Public Attributes

 calib
 
 metadata
 
 log
 
 config
 

Static Public Attributes

 ConfigClass = MeasureCrosstalkConfig
 
 RunnerClass = TaskRunner
 
bool canMultiprocess = True
 

Detailed Description

Measure intra-detector crosstalk.

Notes
-----
The crosstalk this method measures assumes that when a bright
pixel is found in one detector amplifier, all other detector
amplifiers may see an increase in the same pixel location
(relative to the readout amplifier) as these other pixels are read
out at the same time.

After processing each input exposure through a limited set of ISR
stages, bright unmasked pixels above the threshold are identified.
The potential CT signal is found by taking the ratio of the
appropriate background-subtracted pixel value on the other
amplifiers to the input value on the source amplifier.  If the
source amplifier has a large number of bright pixels as well, the
background level may be elevated, leading to poor ratio
measurements.

The set of ratios found between each pair of amplifiers across all
input exposures is then gathered to produce the final CT
coefficients.  The sigma-clipped mean and sigma are returned from
these sets of ratios, with the coefficient to supply to the ISR
CrosstalkTask() being the multiplicative inverse of these values.

Definition at line 103 of file measureCrosstalk.py.

Constructor & Destructor Documentation

◆ __init__()

def lsst.ip.isr.measureCrosstalk.MeasureCrosstalkTask.__init__ (   self,
args,
**  kwargs 
)

Definition at line 132 of file measureCrosstalk.py.

132  def __init__(self, *args, **kwargs):
133  CmdLineTask.__init__(self, *args, **kwargs)
134  self.makeSubtask("isr")
135  self.calib = CrosstalkCalib()
136 

Member Function Documentation

◆ __reduce__()

def lsst.pipe.base.task.Task.__reduce__ (   self)
inherited
Pickler.

Reimplemented in lsst.pipe.drivers.multiBandDriver.MultiBandDriverTask, and lsst.pipe.drivers.coaddDriver.CoaddDriverTask.

Definition at line 373 of file task.py.

373  def __reduce__(self):
374  """Pickler.
375  """
376  return self.__class__, (self.config, self._name, self._parentTask, None)

◆ applyOverrides()

def lsst.pipe.base.cmdLineTask.CmdLineTask.applyOverrides (   cls,
  config 
)
inherited
A hook to allow a task to change the values of its config *after* the camera-specific
overrides are loaded but before any command-line overrides are applied.

Parameters
----------
config : instance of task's ``ConfigClass``
    Task configuration.

Notes
-----
This is necessary in some cases because the camera-specific overrides may retarget subtasks,
wiping out changes made in ConfigClass.setDefaults. See LSST Trac ticket #2282 for more discussion.

.. warning::

   This is called by CmdLineTask.parseAndRun; other ways of constructing a config will not apply
   these overrides.

Reimplemented in lsst.pipe.drivers.constructCalibs.FringeTask, lsst.pipe.drivers.constructCalibs.FlatTask, lsst.pipe.drivers.constructCalibs.DarkTask, and lsst.pipe.drivers.constructCalibs.BiasTask.

Definition at line 527 of file cmdLineTask.py.

527  def applyOverrides(cls, config):
528  """A hook to allow a task to change the values of its config *after* the camera-specific
529  overrides are loaded but before any command-line overrides are applied.
530 
531  Parameters
532  ----------
533  config : instance of task's ``ConfigClass``
534  Task configuration.
535 
536  Notes
537  -----
538  This is necessary in some cases because the camera-specific overrides may retarget subtasks,
539  wiping out changes made in ConfigClass.setDefaults. See LSST Trac ticket #2282 for more discussion.
540 
541  .. warning::
542 
543  This is called by CmdLineTask.parseAndRun; other ways of constructing a config will not apply
544  these overrides.
545  """
546  pass
547 

◆ debugPixels()

def lsst.ip.isr.measureCrosstalk.MeasureCrosstalkTask.debugPixels (   self,
  stepname,
  pixelsIn,
  pixelsOut,
  i,
  j 
)
Utility function to examine the CT ratio pixel values.

Parameters
----------
stepname : `str`
    State of processing to view.
pixelsIn : `np.ndarray`
    Pixel values from the potential crosstalk "source".
pixelsOut : `np.ndarray`
    Pixel values from the potential crosstalk "victim".
i : `int`
    Index of the source amplifier.
j : `int`
    Index of the target amplifier.

Definition at line 504 of file measureCrosstalk.py.

504  def debugPixels(self, stepname, pixelsIn, pixelsOut, i, j):
505  """Utility function to examine the CT ratio pixel values.
506 
507  Parameters
508  ----------
509  stepname : `str`
510  State of processing to view.
511  pixelsIn : `np.ndarray`
512  Pixel values from the potential crosstalk "source".
513  pixelsOut : `np.ndarray`
514  Pixel values from the potential crosstalk "victim".
515  i : `int`
516  Index of the source amplifier.
517  j : `int`
518  Index of the target amplifier.
519  """
520  frame = getDebugFrame(self._display, stepname)
521  if frame:
522  if i == j or len(pixelsIn) == 0 or len(pixelsOut) < 1:
523  pass
524  import matplotlib.pyplot as plot
525  figure = plot.figure(1)
526  figure.clear()
527 
528  axes = figure.add_axes((0.1, 0.1, 0.8, 0.8))
529  axes.plot(pixelsIn, pixelsOut / pixelsIn, 'k+')
530  plot.xlabel("Source amplifier pixel value")
531  plot.ylabel("Measured pixel ratio")
532  plot.title("(Source %d -> Victim %d) median ratio: %f" %
533  (i, j, np.median(pixelsOut / pixelsIn)))
534  figure.show()
535 
536  prompt = "Press Enter to continue: "
537  while True:
538  ans = input(prompt).lower()
539  if ans in ("", "c",):
540  break
541  plot.close()
542 

◆ debugRatios()

def lsst.ip.isr.measureCrosstalk.MeasureCrosstalkTask.debugRatios (   self,
  stepname,
  ratios,
  i,
  j 
)
Utility function to examine the final CT ratio set.

Parameters
----------
stepname : `str`
    State of processing to view.
ratios : `List` of `List` of `np.ndarray`
    Array of measured CT ratios, indexed by source/victim
    amplifier.
i : `int`
    Index of the source amplifier.
j : `int`
    Index of the target amplifier.

Definition at line 543 of file measureCrosstalk.py.

543  def debugRatios(self, stepname, ratios, i, j):
544  """Utility function to examine the final CT ratio set.
545 
546  Parameters
547  ----------
548  stepname : `str`
549  State of processing to view.
550  ratios : `List` of `List` of `np.ndarray`
551  Array of measured CT ratios, indexed by source/victim
552  amplifier.
553  i : `int`
554  Index of the source amplifier.
555  j : `int`
556  Index of the target amplifier.
557  """
558  frame = getDebugFrame(self._display, stepname)
559  if frame:
560  if i == j or ratios is None or len(ratios) < 1:
561  pass
562 
563  RR = ratios[i][j]
564  if RR is None or len(RR) < 1:
565  pass
566 
567  value = np.mean(RR)
568 
569  import matplotlib.pyplot as plot
570  figure = plot.figure(1)
571  figure.clear()
572  plot.hist(x=RR, bins='auto', color='b', rwidth=0.9)
573  plot.xlabel("Measured pixel ratio")
574  plot.axvline(x=value, color="k")
575  plot.title("(Source %d -> Victim %d) clipped mean ratio: %f" % (i, j, value))
576  figure.show()
577 
578  prompt = "Press Enter to continue: "
579  while True:
580  ans = input(prompt).lower()
581  if ans in ("", "c",):
582  break
583  plot.close()

◆ debugView()

def lsst.ip.isr.measureCrosstalk.MeasureCrosstalkTask.debugView (   self,
  stepname,
  exposure 
)
Utility function to examine the image being processed.

Parameters
----------
stepname : `str`
    State of processing to view.
exposure : `lsst.afw.image.Exposure`
    Exposure to view.

Definition at line 482 of file measureCrosstalk.py.

482  def debugView(self, stepname, exposure):
483  """Utility function to examine the image being processed.
484 
485  Parameters
486  ----------
487  stepname : `str`
488  State of processing to view.
489  exposure : `lsst.afw.image.Exposure`
490  Exposure to view.
491  """
492  frame = getDebugFrame(self._display, stepname)
493  if frame:
494  display = getDisplay(frame)
495  display.scale('asinh', 'zscale')
496  display.mtv(exposure)
497 
498  prompt = "Press Enter to continue: "
499  while True:
500  ans = input(prompt).lower()
501  if ans in ("", "c",):
502  break
503 

◆ emptyMetadata()

def lsst.pipe.base.task.Task.emptyMetadata (   self)
inherited
Empty (clear) the metadata for this Task and all sub-Tasks.

Definition at line 153 of file task.py.

153  def emptyMetadata(self):
154  """Empty (clear) the metadata for this Task and all sub-Tasks.
155  """
156  for subtask in self._taskDict.values():
157  subtask.metadata = dafBase.PropertyList()
158 

◆ extractCrosstalkRatios()

def lsst.ip.isr.measureCrosstalk.MeasureCrosstalkTask.extractCrosstalkRatios (   self,
  exposure,
  threshold = None,
  badPixels = None 
)
Extract crosstalk ratios between different amplifiers.

For pixels above ``threshold``, we calculate the ratio between
each background-subtracted target amp and the source amp. We
return a list of ratios for each pixel for each target/source
combination, as a matrix of lists.

Parameters
----------
exposure : `lsst.afw.image.Exposure`
    Exposure for which to measure crosstalk.
threshold : `float`, optional
    Lower limit on pixels for which we measure crosstalk.
badPixels : `list` of `str`, optional
    Mask planes indicating a pixel is bad.

Returns
-------
ratios : `list` of `list` of `numpy.ndarray`
   A matrix of pixel arrays. ``ratios[i][j]`` is an array of
   the fraction of the ``j``-th amp present on the ``i``-th amp.
   The value is `None` for the diagonal elements.

Notes
-----
This has been moved into MeasureCrosstalkTask to allow for easier
debugging.

The lsstDebug.Info() method can be rewritten for __name__ =
`lsst.ip.isr.measureCrosstalk`, and supports the parameters:

debug.display['extract'] : `bool`
    Display the exposure under consideration, with the pixels used
    for crosstalk measurement indicated by the DETECTED mask plane.
debug.display['pixels'] : `bool`
    Display a plot of the ratio calculated for each pixel used in this
    exposure, split by amplifier pairs.  The median value is listed
    for reference.

Definition at line 265 of file measureCrosstalk.py.

265  def extractCrosstalkRatios(self, exposure, threshold=None, badPixels=None):
266  """Extract crosstalk ratios between different amplifiers.
267 
268  For pixels above ``threshold``, we calculate the ratio between
269  each background-subtracted target amp and the source amp. We
270  return a list of ratios for each pixel for each target/source
271  combination, as a matrix of lists.
272 
273  Parameters
274  ----------
275  exposure : `lsst.afw.image.Exposure`
276  Exposure for which to measure crosstalk.
277  threshold : `float`, optional
278  Lower limit on pixels for which we measure crosstalk.
279  badPixels : `list` of `str`, optional
280  Mask planes indicating a pixel is bad.
281 
282  Returns
283  -------
284  ratios : `list` of `list` of `numpy.ndarray`
285  A matrix of pixel arrays. ``ratios[i][j]`` is an array of
286  the fraction of the ``j``-th amp present on the ``i``-th amp.
287  The value is `None` for the diagonal elements.
288 
289  Notes
290  -----
291  This has been moved into MeasureCrosstalkTask to allow for easier
292  debugging.
293 
294  The lsstDebug.Info() method can be rewritten for __name__ =
295  `lsst.ip.isr.measureCrosstalk`, and supports the parameters:
296 
297  debug.display['extract'] : `bool`
298  Display the exposure under consideration, with the pixels used
299  for crosstalk measurement indicated by the DETECTED mask plane.
300  debug.display['pixels'] : `bool`
301  Display a plot of the ratio calculated for each pixel used in this
302  exposure, split by amplifier pairs. The median value is listed
303  for reference.
304  """
305  if threshold is None:
306  threshold = self.config.threshold
307  if badPixels is None:
308  badPixels = list(self.config.badMask)
309 
310  mi = exposure.getMaskedImage()
311  FootprintSet(mi, Threshold(threshold), "DETECTED")
312  detected = mi.getMask().getPlaneBitMask("DETECTED")
313  bad = mi.getMask().getPlaneBitMask(badPixels)
314  bg = self.calib.calculateBackground(mi, badPixels + ["DETECTED"])
315 
316  self.debugView('extract', exposure)
317 
318  ccd = exposure.getDetector()
319  ratios = [[None for iAmp in ccd] for jAmp in ccd]
320 
321  for ii, iAmp in enumerate(ccd):
322  iImage = mi[iAmp.getBBox()]
323  iMask = iImage.mask.array
324  select = (iMask & detected > 0) & (iMask & bad == 0) & np.isfinite(iImage.image.array)
325  for jj, jAmp in enumerate(ccd):
326  if ii == jj:
327  continue
328  jImage = self.calib.extractAmp(mi.image, jAmp, iAmp, isTrimmed=self.config.isTrimmed)
329  ratios[jj][ii] = (jImage.array[select] - bg)/iImage.image.array[select]
330  self.debugPixels('pixels', iImage.image.array[select], jImage.array[select] - bg, ii, jj)
331  return ratios
332 

◆ getAllSchemaCatalogs()

def lsst.pipe.base.task.Task.getAllSchemaCatalogs (   self)
inherited
Get schema catalogs for all tasks in the hierarchy, combining the results into a single dict.

Returns
-------
schemacatalogs : `dict`
    Keys are butler dataset type, values are a empty catalog (an instance of the appropriate
    lsst.afw.table Catalog type) for all tasks in the hierarchy, from the top-level task down
    through all subtasks.

Notes
-----
This method may be called on any task in the hierarchy; it will return the same answer, regardless.

The default implementation should always suffice. If your subtask uses schemas the override
`Task.getSchemaCatalogs`, not this method.

Definition at line 188 of file task.py.

188  def getAllSchemaCatalogs(self):
189  """Get schema catalogs for all tasks in the hierarchy, combining the results into a single dict.
190 
191  Returns
192  -------
193  schemacatalogs : `dict`
194  Keys are butler dataset type, values are a empty catalog (an instance of the appropriate
195  lsst.afw.table Catalog type) for all tasks in the hierarchy, from the top-level task down
196  through all subtasks.
197 
198  Notes
199  -----
200  This method may be called on any task in the hierarchy; it will return the same answer, regardless.
201 
202  The default implementation should always suffice. If your subtask uses schemas the override
203  `Task.getSchemaCatalogs`, not this method.
204  """
205  schemaDict = self.getSchemaCatalogs()
206  for subtask in self._taskDict.values():
207  schemaDict.update(subtask.getSchemaCatalogs())
208  return schemaDict
209 

◆ getFullMetadata()

def lsst.pipe.base.task.Task.getFullMetadata (   self)
inherited
Get metadata for all tasks.

Returns
-------
metadata : `lsst.daf.base.PropertySet`
    The `~lsst.daf.base.PropertySet` keys are the full task name. Values are metadata
    for the top-level task and all subtasks, sub-subtasks, etc..

Notes
-----
The returned metadata includes timing information (if ``@timer.timeMethod`` is used)
and any metadata set by the task. The name of each item consists of the full task name
with ``.`` replaced by ``:``, followed by ``.`` and the name of the item, e.g.::

    topLevelTaskName:subtaskName:subsubtaskName.itemName

using ``:`` in the full task name disambiguates the rare situation that a task has a subtask
and a metadata item with the same name.

Definition at line 210 of file task.py.

210  def getFullMetadata(self):
211  """Get metadata for all tasks.
212 
213  Returns
214  -------
215  metadata : `lsst.daf.base.PropertySet`
216  The `~lsst.daf.base.PropertySet` keys are the full task name. Values are metadata
217  for the top-level task and all subtasks, sub-subtasks, etc..
218 
219  Notes
220  -----
221  The returned metadata includes timing information (if ``@timer.timeMethod`` is used)
222  and any metadata set by the task. The name of each item consists of the full task name
223  with ``.`` replaced by ``:``, followed by ``.`` and the name of the item, e.g.::
224 
225  topLevelTaskName:subtaskName:subsubtaskName.itemName
226 
227  using ``:`` in the full task name disambiguates the rare situation that a task has a subtask
228  and a metadata item with the same name.
229  """
230  fullMetadata = dafBase.PropertySet()
231  for fullName, task in self.getTaskDict().items():
232  fullMetadata.set(fullName.replace(".", ":"), task.metadata)
233  return fullMetadata
234 

◆ getFullName()

def lsst.pipe.base.task.Task.getFullName (   self)
inherited
Get the task name as a hierarchical name including parent task names.

Returns
-------
fullName : `str`
    The full name consists of the name of the parent task and each subtask separated by periods.
    For example:

    - The full name of top-level task "top" is simply "top".
    - The full name of subtask "sub" of top-level task "top" is "top.sub".
    - The full name of subtask "sub2" of subtask "sub" of top-level task "top" is "top.sub.sub2".

Definition at line 235 of file task.py.

235  def getFullName(self):
236  """Get the task name as a hierarchical name including parent task names.
237 
238  Returns
239  -------
240  fullName : `str`
241  The full name consists of the name of the parent task and each subtask separated by periods.
242  For example:
243 
244  - The full name of top-level task "top" is simply "top".
245  - The full name of subtask "sub" of top-level task "top" is "top.sub".
246  - The full name of subtask "sub2" of subtask "sub" of top-level task "top" is "top.sub.sub2".
247  """
248  return self._fullName
249 

◆ getName()

def lsst.pipe.base.task.Task.getName (   self)
inherited
Get the name of the task.

Returns
-------
taskName : `str`
    Name of the task.

See also
--------
getFullName

Definition at line 250 of file task.py.

250  def getName(self):
251  """Get the name of the task.
252 
253  Returns
254  -------
255  taskName : `str`
256  Name of the task.
257 
258  See also
259  --------
260  getFullName
261  """
262  return self._name
263 

◆ getSchemaCatalogs()

def lsst.pipe.base.task.Task.getSchemaCatalogs (   self)
inherited
Get the schemas generated by this task.

Returns
-------
schemaCatalogs : `dict`
    Keys are butler dataset type, values are an empty catalog (an instance of the appropriate
    `lsst.afw.table` Catalog type) for this task.

Notes
-----

.. warning::

   Subclasses that use schemas must override this method. The default implemenation returns
   an empty dict.

This method may be called at any time after the Task is constructed, which means that all task
schemas should be computed at construction time, *not* when data is actually processed. This
reflects the philosophy that the schema should not depend on the data.

Returning catalogs rather than just schemas allows us to save e.g. slots for SourceCatalog as well.

See also
--------
Task.getAllSchemaCatalogs

Definition at line 159 of file task.py.

159  def getSchemaCatalogs(self):
160  """Get the schemas generated by this task.
161 
162  Returns
163  -------
164  schemaCatalogs : `dict`
165  Keys are butler dataset type, values are an empty catalog (an instance of the appropriate
166  `lsst.afw.table` Catalog type) for this task.
167 
168  Notes
169  -----
170 
171  .. warning::
172 
173  Subclasses that use schemas must override this method. The default implemenation returns
174  an empty dict.
175 
176  This method may be called at any time after the Task is constructed, which means that all task
177  schemas should be computed at construction time, *not* when data is actually processed. This
178  reflects the philosophy that the schema should not depend on the data.
179 
180  Returning catalogs rather than just schemas allows us to save e.g. slots for SourceCatalog as well.
181 
182  See also
183  --------
184  Task.getAllSchemaCatalogs
185  """
186  return {}
187 

◆ getTaskDict()

def lsst.pipe.base.task.Task.getTaskDict (   self)
inherited
Get a dictionary of all tasks as a shallow copy.

Returns
-------
taskDict : `dict`
    Dictionary containing full task name: task object for the top-level task and all subtasks,
    sub-subtasks, etc..

Definition at line 264 of file task.py.

264  def getTaskDict(self):
265  """Get a dictionary of all tasks as a shallow copy.
266 
267  Returns
268  -------
269  taskDict : `dict`
270  Dictionary containing full task name: task object for the top-level task and all subtasks,
271  sub-subtasks, etc..
272  """
273  return self._taskDict.copy()
274 

◆ makeField()

def lsst.pipe.base.task.Task.makeField (   cls,
  doc 
)
inherited
Make a `lsst.pex.config.ConfigurableField` for this task.

Parameters
----------
doc : `str`
    Help text for the field.

Returns
-------
configurableField : `lsst.pex.config.ConfigurableField`
    A `~ConfigurableField` for this task.

Examples
--------
Provides a convenient way to specify this task is a subtask of another task.

Here is an example of use::

    class OtherTaskConfig(lsst.pex.config.Config)
aSubtask = ATaskClass.makeField("a brief description of what this task does")

Definition at line 329 of file task.py.

329  def makeField(cls, doc):
330  """Make a `lsst.pex.config.ConfigurableField` for this task.
331 
332  Parameters
333  ----------
334  doc : `str`
335  Help text for the field.
336 
337  Returns
338  -------
339  configurableField : `lsst.pex.config.ConfigurableField`
340  A `~ConfigurableField` for this task.
341 
342  Examples
343  --------
344  Provides a convenient way to specify this task is a subtask of another task.
345 
346  Here is an example of use::
347 
348  class OtherTaskConfig(lsst.pex.config.Config)
349  aSubtask = ATaskClass.makeField("a brief description of what this task does")
350  """
351  return ConfigurableField(doc=doc, target=cls)
352 

◆ makeSubtask()

def lsst.pipe.base.task.Task.makeSubtask (   self,
  name,
**  keyArgs 
)
inherited
Create a subtask as a new instance as the ``name`` attribute of this task.

Parameters
----------
name : `str`
    Brief name of the subtask.
keyArgs
    Extra keyword arguments used to construct the task. The following arguments are automatically
    provided and cannot be overridden:

    - "config".
    - "parentTask".

Notes
-----
The subtask must be defined by ``Task.config.name``, an instance of pex_config ConfigurableField
or RegistryField.

Definition at line 275 of file task.py.

275  def makeSubtask(self, name, **keyArgs):
276  """Create a subtask as a new instance as the ``name`` attribute of this task.
277 
278  Parameters
279  ----------
280  name : `str`
281  Brief name of the subtask.
282  keyArgs
283  Extra keyword arguments used to construct the task. The following arguments are automatically
284  provided and cannot be overridden:
285 
286  - "config".
287  - "parentTask".
288 
289  Notes
290  -----
291  The subtask must be defined by ``Task.config.name``, an instance of pex_config ConfigurableField
292  or RegistryField.
293  """
294  taskField = getattr(self.config, name, None)
295  if taskField is None:
296  raise KeyError(f"{self.getFullName()}'s config does not have field {name!r}")
297  subtask = taskField.apply(name=name, parentTask=self, **keyArgs)
298  setattr(self, name, subtask)
299 

◆ measureCrosstalkCoefficients()

def lsst.ip.isr.measureCrosstalk.MeasureCrosstalkTask.measureCrosstalkCoefficients (   self,
  ratios,
  rejIter = 3,
  rejSigma = 2.0 
)
Measure crosstalk coefficients from the ratios.

Given a list of ratios for each target/source amp combination,
we measure a sigma clipped mean and error.

The coefficient errors returned are the standard deviation of
the final set of clipped input ratios.

Parameters
----------
ratios : `list` of `list` of `numpy.ndarray`
   Matrix of arrays of ratios.
rejIter : `int`
   Number of rejection iterations.
rejSigma : `float`
   Rejection threshold (sigma).

Returns
-------
coeff : `numpy.ndarray`
    Crosstalk coefficients.
coeffErr : `numpy.ndarray`
    Crosstalk coefficient errors.
coeffNum : `numpy.ndarray`
    Number of pixels for each measurement.

Notes
-----
This has been moved into MeasureCrosstalkTask to allow for easier
debugging.

The lsstDebug.Info() method can be rewritten for __name__ =
`lsst.ip.isr.measureCrosstalk`, and supports the parameters:

debug.display['measure'] : `bool`
    Display a histogram of the combined ratio measurements for
    a pair of source/target amplifiers from the final set of
    clipped input ratios.

Definition at line 401 of file measureCrosstalk.py.

401  def measureCrosstalkCoefficients(self, ratios, rejIter=3, rejSigma=2.0):
402  """Measure crosstalk coefficients from the ratios.
403 
404  Given a list of ratios for each target/source amp combination,
405  we measure a sigma clipped mean and error.
406 
407  The coefficient errors returned are the standard deviation of
408  the final set of clipped input ratios.
409 
410  Parameters
411  ----------
412  ratios : `list` of `list` of `numpy.ndarray`
413  Matrix of arrays of ratios.
414  rejIter : `int`
415  Number of rejection iterations.
416  rejSigma : `float`
417  Rejection threshold (sigma).
418 
419  Returns
420  -------
421  coeff : `numpy.ndarray`
422  Crosstalk coefficients.
423  coeffErr : `numpy.ndarray`
424  Crosstalk coefficient errors.
425  coeffNum : `numpy.ndarray`
426  Number of pixels for each measurement.
427 
428  Notes
429  -----
430  This has been moved into MeasureCrosstalkTask to allow for easier
431  debugging.
432 
433  The lsstDebug.Info() method can be rewritten for __name__ =
434  `lsst.ip.isr.measureCrosstalk`, and supports the parameters:
435 
436  debug.display['measure'] : `bool`
437  Display a histogram of the combined ratio measurements for
438  a pair of source/target amplifiers from the final set of
439  clipped input ratios.
440  """
441  if rejIter is None:
442  rejIter = self.config.rejIter
443  if rejSigma is None:
444  rejSigma = self.config.rejSigma
445 
446  numAmps = len(ratios)
447  assert all(len(rr) == numAmps for rr in ratios)
448 
449  coeff = np.zeros((numAmps, numAmps))
450  coeffErr = np.zeros((numAmps, numAmps))
451  coeffNum = np.zeros((numAmps, numAmps), dtype=int)
452 
453  for ii, jj in itertools.product(range(numAmps), range(numAmps)):
454  if ii == jj:
455  values = [0.0]
456  else:
457  values = np.array(ratios[ii][jj])
458  values = values[np.abs(values) < 1.0] # Discard unreasonable values
459 
460  coeffNum[ii][jj] = len(values)
461 
462  if len(values) == 0:
463  self.log.warn("No values for matrix element %d,%d" % (ii, jj))
464  coeff[ii][jj] = np.nan
465  coeffErr[ii][jj] = np.nan
466  else:
467  if ii != jj:
468  for rej in range(rejIter):
469  lo, med, hi = np.percentile(values, [25.0, 50.0, 75.0])
470  sigma = 0.741*(hi - lo)
471  good = np.abs(values - med) < rejSigma*sigma
472  if good.sum() == len(good):
473  break
474  values = values[good]
475 
476  coeff[ii][jj] = np.mean(values)
477  coeffErr[ii][jj] = np.nan if coeffNum[ii][jj] == 1 else np.std(values)
478  self.debugRatios('measure', ratios, ii, jj)
479 
480  return coeff, coeffErr, coeffNum
481 

◆ parseAndRun() [1/2]

def lsst.ip.isr.measureCrosstalk.MeasureCrosstalkTask.parseAndRun (   cls,
args,
**  kwargs 
)
Collate crosstalk results from multiple exposures.

Process all input exposures through runDataRef, construct
final measurements from the final list of results from each
input, and persist the output calibration.

This method will be deprecated as part of DM-24760.

Returns
-------
coeff : `numpy.ndarray`
    Crosstalk coefficients.
coeffErr : `numpy.ndarray`
    Crosstalk coefficient errors.
coeffNum : `numpy.ndarray`
    Number of pixels used for crosstalk measurement.
calib : `lsst.ip.isr.CrosstalkCalib`
    Crosstalk object created from the measurements.

Definition at line 149 of file measureCrosstalk.py.

149  def parseAndRun(cls, *args, **kwargs):
150  """Collate crosstalk results from multiple exposures.
151 
152  Process all input exposures through runDataRef, construct
153  final measurements from the final list of results from each
154  input, and persist the output calibration.
155 
156  This method will be deprecated as part of DM-24760.
157 
158  Returns
159  -------
160  coeff : `numpy.ndarray`
161  Crosstalk coefficients.
162  coeffErr : `numpy.ndarray`
163  Crosstalk coefficient errors.
164  coeffNum : `numpy.ndarray`
165  Number of pixels used for crosstalk measurement.
166  calib : `lsst.ip.isr.CrosstalkCalib`
167  Crosstalk object created from the measurements.
168 
169  """
170  kwargs["doReturnResults"] = True
171  results = super(MeasureCrosstalkTask, cls).parseAndRun(*args, **kwargs)
172  task = cls(config=results.parsedCmd.config, log=results.parsedCmd.log)
173  resultList = [rr.result for rr in results.resultList]
174  if results.parsedCmd.dumpRatios:
175  import pickle
176  pickle.dump(resultList, open(results.parsedCmd.dumpRatios, "wb"))
177  coeff, coeffErr, coeffNum = task.reduce(resultList)
178 
179  calib = CrosstalkCalib()
180  provenance = IsrProvenance()
181 
182  calib.coeffs = coeff
183  calib.coeffErr = coeffErr
184  calib.coeffNum = coeffNum
185 
186  outputFileName = results.parsedCmd.outputFileName
187  if outputFileName is not None:
188  butler = results.parsedCmd.butler
189  dataId = results.parsedCmd.id.idList[0]
190 
191  # Rework to use lsst.ip.isr.CrosstalkCalib.
192  det = butler.get('raw', dataId).getDetector()
193  calib._detectorName = det.getName()
194  calib._detectorSerial = det.getSerial()
195  calib.nAmp = len(det)
196  calib.hasCrosstalk = True
197  calib.writeText(outputFileName + ".yaml")
198 
199  provenance.calibType = 'CROSSTALK'
200  provenance._detectorName = det.getName()
201  provenance.fromDataIds(results.parsedCmd.id.idList)
202  provenance.writeText(outputFileName + '_prov.yaml')
203 
204  return Struct(
205  coeff=coeff,
206  coeffErr=coeffErr,
207  coeffNum=coeffNum,
208  calib=calib,
209  )
210 

◆ parseAndRun() [2/2]

def lsst.pipe.base.cmdLineTask.CmdLineTask.parseAndRun (   cls,
  args = None,
  config = None,
  log = None,
  doReturnResults = False 
)
inherited
Parse an argument list and run the command.

Parameters
----------
args : `list`, optional
    List of command-line arguments; if `None` use `sys.argv`.
config : `lsst.pex.config.Config`-type, optional
    Config for task. If `None` use `Task.ConfigClass`.
log : `lsst.log.Log`-type, optional
    Log. If `None` use the default log.
doReturnResults : `bool`, optional
    If `True`, return the results of this task. Default is `False`. This is only intended for
    unit tests and similar use. It can easily exhaust memory (if the task returns enough data and you
    call it enough times) and it will fail when using multiprocessing if the returned data cannot be
    pickled.

Returns
-------
struct : `lsst.pipe.base.Struct`
    Fields are:

    ``argumentParser``
the argument parser (`lsst.pipe.base.ArgumentParser`).
    ``parsedCmd``
the parsed command returned by the argument parser's
`~lsst.pipe.base.ArgumentParser.parse_args` method
(`argparse.Namespace`).
    ``taskRunner``
the task runner used to run the task (an instance of `Task.RunnerClass`).
    ``resultList``
results returned by the task runner's ``run`` method, one entry
per invocation (`list`). This will typically be a list of
`Struct`, each containing at least an ``exitStatus`` integer
(0 or 1); see `Task.RunnerClass` (`TaskRunner` by default) for
more details.

Notes
-----
Calling this method with no arguments specified is the standard way to run a command-line task
from the command-line. For an example see ``pipe_tasks`` ``bin/makeSkyMap.py`` or almost any other
file in that directory.

If one or more of the dataIds fails then this routine will exit (with a status giving the
number of failed dataIds) rather than returning this struct;  this behaviour can be
overridden by specifying the ``--noExit`` command-line option.

Definition at line 549 of file cmdLineTask.py.

549  def parseAndRun(cls, args=None, config=None, log=None, doReturnResults=False):
550  """Parse an argument list and run the command.
551 
552  Parameters
553  ----------
554  args : `list`, optional
555  List of command-line arguments; if `None` use `sys.argv`.
556  config : `lsst.pex.config.Config`-type, optional
557  Config for task. If `None` use `Task.ConfigClass`.
558  log : `lsst.log.Log`-type, optional
559  Log. If `None` use the default log.
560  doReturnResults : `bool`, optional
561  If `True`, return the results of this task. Default is `False`. This is only intended for
562  unit tests and similar use. It can easily exhaust memory (if the task returns enough data and you
563  call it enough times) and it will fail when using multiprocessing if the returned data cannot be
564  pickled.
565 
566  Returns
567  -------
568  struct : `lsst.pipe.base.Struct`
569  Fields are:
570 
571  ``argumentParser``
572  the argument parser (`lsst.pipe.base.ArgumentParser`).
573  ``parsedCmd``
574  the parsed command returned by the argument parser's
575  `~lsst.pipe.base.ArgumentParser.parse_args` method
576  (`argparse.Namespace`).
577  ``taskRunner``
578  the task runner used to run the task (an instance of `Task.RunnerClass`).
579  ``resultList``
580  results returned by the task runner's ``run`` method, one entry
581  per invocation (`list`). This will typically be a list of
582  `Struct`, each containing at least an ``exitStatus`` integer
583  (0 or 1); see `Task.RunnerClass` (`TaskRunner` by default) for
584  more details.
585 
586  Notes
587  -----
588  Calling this method with no arguments specified is the standard way to run a command-line task
589  from the command-line. For an example see ``pipe_tasks`` ``bin/makeSkyMap.py`` or almost any other
590  file in that directory.
591 
592  If one or more of the dataIds fails then this routine will exit (with a status giving the
593  number of failed dataIds) rather than returning this struct; this behaviour can be
594  overridden by specifying the ``--noExit`` command-line option.
595  """
596  if args is None:
597  commandAsStr = " ".join(sys.argv)
598  args = sys.argv[1:]
599  else:
600  commandAsStr = "{}{}".format(lsst.utils.get_caller_name(skip=1), tuple(args))
601 
602  argumentParser = cls._makeArgumentParser()
603  if config is None:
604  config = cls.ConfigClass()
605  parsedCmd = argumentParser.parse_args(config=config, args=args, log=log, override=cls.applyOverrides)
606  # print this message after parsing the command so the log is fully configured
607  parsedCmd.log.info("Running: %s", commandAsStr)
608 
609  taskRunner = cls.RunnerClass(TaskClass=cls, parsedCmd=parsedCmd, doReturnResults=doReturnResults)
610  resultList = taskRunner.run(parsedCmd)
611 
612  try:
613  nFailed = sum(((res.exitStatus != 0) for res in resultList))
614  except (TypeError, AttributeError) as e:
615  # NOTE: TypeError if resultList is None, AttributeError if it doesn't have exitStatus.
616  parsedCmd.log.warn("Unable to retrieve exit status (%s); assuming success", e)
617  nFailed = 0
618 
619  if nFailed > 0:
620  if parsedCmd.noExit:
621  parsedCmd.log.error("%d dataRefs failed; not exiting as --noExit was set", nFailed)
622  else:
623  sys.exit(nFailed)
624 
625  return Struct(
626  argumentParser=argumentParser,
627  parsedCmd=parsedCmd,
628  taskRunner=taskRunner,
629  resultList=resultList,
630  )
631 

◆ reduce()

def lsst.ip.isr.measureCrosstalk.MeasureCrosstalkTask.reduce (   self,
  ratioList 
)
Combine ratios to produce crosstalk coefficients.

Parameters
----------
ratioList : `list` of `list` of `list` of `numpy.ndarray`
    A list of matrices of arrays; a list of results from
    `extractCrosstalkRatios`.

Returns
-------
coeff : `numpy.ndarray`
    Crosstalk coefficients.
coeffErr : `numpy.ndarray`
    Crosstalk coefficient errors.
coeffNum : `numpy.ndarray`
    Number of pixels used for crosstalk measurement.

Raises
------
RuntimeError
    Raised if there is no crosstalk data available.

Notes
-----
The lsstDebug.Info() method can be rewritten for __name__ =
`lsst.ip.isr.measureCrosstalk`, and supports the parameters:

debug.display['reduce'] : `bool`
    Display a histogram of the combined ratio measurements for
    a pair of source/target amplifiers from all input
    exposures/detectors.

Definition at line 333 of file measureCrosstalk.py.

333  def reduce(self, ratioList):
334  """Combine ratios to produce crosstalk coefficients.
335 
336  Parameters
337  ----------
338  ratioList : `list` of `list` of `list` of `numpy.ndarray`
339  A list of matrices of arrays; a list of results from
340  `extractCrosstalkRatios`.
341 
342  Returns
343  -------
344  coeff : `numpy.ndarray`
345  Crosstalk coefficients.
346  coeffErr : `numpy.ndarray`
347  Crosstalk coefficient errors.
348  coeffNum : `numpy.ndarray`
349  Number of pixels used for crosstalk measurement.
350 
351  Raises
352  ------
353  RuntimeError
354  Raised if there is no crosstalk data available.
355 
356  Notes
357  -----
358  The lsstDebug.Info() method can be rewritten for __name__ =
359  `lsst.ip.isr.measureCrosstalk`, and supports the parameters:
360 
361  debug.display['reduce'] : `bool`
362  Display a histogram of the combined ratio measurements for
363  a pair of source/target amplifiers from all input
364  exposures/detectors.
365  """
366  numAmps = None
367  for rr in ratioList:
368  if rr is None:
369  continue
370 
371  if numAmps is None:
372  numAmps = len(rr)
373 
374  assert len(rr) == numAmps
375  assert all(len(xx) == numAmps for xx in rr)
376 
377  if numAmps is None:
378  raise RuntimeError("Unable to measure crosstalk signal for any amplifier")
379 
380  ratios = [[None for jj in range(numAmps)] for ii in range(numAmps)]
381  for ii, jj in itertools.product(range(numAmps), range(numAmps)):
382  if ii == jj:
383  result = []
384  else:
385  values = [rr[ii][jj] for rr in ratioList]
386  num = sum(len(vv) for vv in values)
387  if num == 0:
388  self.log.warn("No values for matrix element %d,%d" % (ii, jj))
389  result = np.nan
390  else:
391  result = np.concatenate([vv for vv in values if len(vv) > 0])
392  ratios[ii][jj] = result
393  self.debugRatios('reduce', ratios, ii, jj)
394  coeff, coeffErr, coeffNum = self.measureCrosstalkCoefficients(ratios, self.config.rejIter,
395  self.config.rejSigma)
396  self.log.info("Coefficients:\n%s\n", coeff)
397  self.log.info("Errors:\n%s\n", coeffErr)
398  self.log.info("Numbers:\n%s\n", coeffNum)
399  return coeff, coeffErr, coeffNum
400 

◆ run()

def lsst.ip.isr.measureCrosstalk.MeasureCrosstalkTask.run (   self,
  exposure,
  dataId = None 
)
Extract and return cross talk ratios for an exposure.

Parameters
----------
exposure : `lsst.afw.image.Exposure`
    Image data to measure crosstalk ratios from.
dataId   :
    Optional data ID for the exposure to process; used for logging.

Returns
-------
ratios : `list` of `list` of `numpy.ndarray`
    A matrix of pixel arrays.

Definition at line 245 of file measureCrosstalk.py.

245  def run(self, exposure, dataId=None):
246  """Extract and return cross talk ratios for an exposure.
247 
248  Parameters
249  ----------
250  exposure : `lsst.afw.image.Exposure`
251  Image data to measure crosstalk ratios from.
252  dataId :
253  Optional data ID for the exposure to process; used for logging.
254 
255  Returns
256  -------
257  ratios : `list` of `list` of `numpy.ndarray`
258  A matrix of pixel arrays.
259  """
260  ratios = self.extractCrosstalkRatios(exposure)
261  self.log.info("Extracted %d pixels from %s",
262  sum(len(jj) for ii in ratios for jj in ii if jj is not None), dataId)
263  return ratios
264 

◆ runDataRef()

def lsst.ip.isr.measureCrosstalk.MeasureCrosstalkTask.runDataRef (   self,
  dataRef 
)
Get crosstalk ratios for detector.

Parameters
----------
dataRef : `lsst.daf.peristence.ButlerDataRef`
    Data references for detectors to process.

Returns
-------
ratios : `list` of `list` of `numpy.ndarray`
    A matrix of pixel arrays.

Definition at line 219 of file measureCrosstalk.py.

219  def runDataRef(self, dataRef):
220  """Get crosstalk ratios for detector.
221 
222  Parameters
223  ----------
224  dataRef : `lsst.daf.peristence.ButlerDataRef`
225  Data references for detectors to process.
226 
227  Returns
228  -------
229  ratios : `list` of `list` of `numpy.ndarray`
230  A matrix of pixel arrays.
231  """
232  exposure = None
233  if not self.config.doRerunIsr:
234  try:
235  exposure = dataRef.get("postISRCCD")
236  except NoResults:
237  pass
238 
239  if exposure is None:
240  exposure = self.isr.runDataRef(dataRef).exposure
241 
242  dataId = dataRef.dataId
243  return self.run(exposure, dataId=dataId)
244 

◆ timer()

def lsst.pipe.base.task.Task.timer (   self,
  name,
  logLevel = Log.DEBUG 
)
inherited
Context manager to log performance data for an arbitrary block of code.

Parameters
----------
name : `str`
    Name of code being timed; data will be logged using item name: ``Start`` and ``End``.
logLevel
    A `lsst.log` level constant.

Examples
--------
Creating a timer context::

    with self.timer("someCodeToTime"):
pass  # code to time

See also
--------
timer.logInfo

Definition at line 301 of file task.py.

301  def timer(self, name, logLevel=Log.DEBUG):
302  """Context manager to log performance data for an arbitrary block of code.
303 
304  Parameters
305  ----------
306  name : `str`
307  Name of code being timed; data will be logged using item name: ``Start`` and ``End``.
308  logLevel
309  A `lsst.log` level constant.
310 
311  Examples
312  --------
313  Creating a timer context::
314 
315  with self.timer("someCodeToTime"):
316  pass # code to time
317 
318  See also
319  --------
320  timer.logInfo
321  """
322  logInfo(obj=self, prefix=name + "Start", logLevel=logLevel)
323  try:
324  yield
325  finally:
326  logInfo(obj=self, prefix=name + "End", logLevel=logLevel)
327 

◆ writeConfig()

def lsst.pipe.base.cmdLineTask.CmdLineTask.writeConfig (   self,
  butler,
  clobber = False,
  doBackup = True 
)
inherited
Write the configuration used for processing the data, or check that an existing
one is equal to the new one if present.

Parameters
----------
butler : `lsst.daf.persistence.Butler`
    Data butler used to write the config. The config is written to dataset type
    `CmdLineTask._getConfigName`.
clobber : `bool`, optional
    A boolean flag that controls what happens if a config already has been saved:
    - `True`: overwrite or rename the existing config, depending on ``doBackup``.
    - `False`: raise `TaskError` if this config does not match the existing config.
doBackup : bool, optional
    Set to `True` to backup the config files if clobbering.

Reimplemented in lsst.pipe.tasks.postprocess.ConsolidateSourceTableTask.

Definition at line 656 of file cmdLineTask.py.

656  def writeConfig(self, butler, clobber=False, doBackup=True):
657  """Write the configuration used for processing the data, or check that an existing
658  one is equal to the new one if present.
659 
660  Parameters
661  ----------
662  butler : `lsst.daf.persistence.Butler`
663  Data butler used to write the config. The config is written to dataset type
664  `CmdLineTask._getConfigName`.
665  clobber : `bool`, optional
666  A boolean flag that controls what happens if a config already has been saved:
667  - `True`: overwrite or rename the existing config, depending on ``doBackup``.
668  - `False`: raise `TaskError` if this config does not match the existing config.
669  doBackup : bool, optional
670  Set to `True` to backup the config files if clobbering.
671  """
672  configName = self._getConfigName()
673  if configName is None:
674  return
675  if clobber:
676  butler.put(self.config, configName, doBackup=doBackup)
677  elif butler.datasetExists(configName, write=True):
678  # this may be subject to a race condition; see #2789
679  try:
680  oldConfig = butler.get(configName, immediate=True)
681  except Exception as exc:
682  raise type(exc)(f"Unable to read stored config file {configName} (exc); "
683  "consider using --clobber-config")
684 
685  def logConfigMismatch(msg):
686  self.log.fatal("Comparing configuration: %s", msg)
687 
688  if not self.config.compare(oldConfig, shortcut=False, output=logConfigMismatch):
689  raise TaskError(
690  f"Config does not match existing task config {configName!r} on disk; "
691  "tasks configurations must be consistent within the same output repo "
692  "(override with --clobber-config)")
693  else:
694  butler.put(self.config, configName)
695 

◆ writeMetadata()

def lsst.pipe.base.cmdLineTask.CmdLineTask.writeMetadata (   self,
  dataRef 
)
inherited
Write the metadata produced from processing the data.

Parameters
----------
dataRef
    Butler data reference used to write the metadata.
    The metadata is written to dataset type `CmdLineTask._getMetadataName`.

Reimplemented in lsst.pipe.tasks.postprocess.WriteObjectTableTask, lsst.pipe.tasks.postprocess.ConsolidateSourceTableTask, lsst.pipe.tasks.postprocess.TransformSourceTableTask, lsst.pipe.tasks.postprocess.ConsolidateObjectTableTask, lsst.pipe.tasks.postprocess.TransformCatalogBaseTask, lsst.pipe.drivers.multiBandDriver.MultiBandDriverTask, lsst.pipe.drivers.coaddDriver.CoaddDriverTask, and lsst.pipe.tasks.postprocess.WriteSourceTableTask.

Definition at line 731 of file cmdLineTask.py.

731  def writeMetadata(self, dataRef):
732  """Write the metadata produced from processing the data.
733 
734  Parameters
735  ----------
736  dataRef
737  Butler data reference used to write the metadata.
738  The metadata is written to dataset type `CmdLineTask._getMetadataName`.
739  """
740  try:
741  metadataName = self._getMetadataName()
742  if metadataName is not None:
743  dataRef.put(self.getFullMetadata(), metadataName)
744  except Exception as e:
745  self.log.warn("Could not persist metadata for dataId=%s: %s", dataRef.dataId, e)
746 

◆ writePackageVersions()

def lsst.pipe.base.cmdLineTask.CmdLineTask.writePackageVersions (   self,
  butler,
  clobber = False,
  doBackup = True,
  dataset = "packages" 
)
inherited
Compare and write package versions.

Parameters
----------
butler : `lsst.daf.persistence.Butler`
    Data butler used to read/write the package versions.
clobber : `bool`, optional
    A boolean flag that controls what happens if versions already have been saved:
    - `True`: overwrite or rename the existing version info, depending on ``doBackup``.
    - `False`: raise `TaskError` if this version info does not match the existing.
doBackup : `bool`, optional
    If `True` and clobbering, old package version files are backed up.
dataset : `str`, optional
    Name of dataset to read/write.

Raises
------
TaskError
    Raised if there is a version mismatch with current and persisted lists of package versions.

Notes
-----
Note that this operation is subject to a race condition.

Definition at line 747 of file cmdLineTask.py.

747  def writePackageVersions(self, butler, clobber=False, doBackup=True, dataset="packages"):
748  """Compare and write package versions.
749 
750  Parameters
751  ----------
752  butler : `lsst.daf.persistence.Butler`
753  Data butler used to read/write the package versions.
754  clobber : `bool`, optional
755  A boolean flag that controls what happens if versions already have been saved:
756  - `True`: overwrite or rename the existing version info, depending on ``doBackup``.
757  - `False`: raise `TaskError` if this version info does not match the existing.
758  doBackup : `bool`, optional
759  If `True` and clobbering, old package version files are backed up.
760  dataset : `str`, optional
761  Name of dataset to read/write.
762 
763  Raises
764  ------
765  TaskError
766  Raised if there is a version mismatch with current and persisted lists of package versions.
767 
768  Notes
769  -----
770  Note that this operation is subject to a race condition.
771  """
772  packages = Packages.fromSystem()
773 
774  if clobber:
775  return butler.put(packages, dataset, doBackup=doBackup)
776  if not butler.datasetExists(dataset, write=True):
777  return butler.put(packages, dataset)
778 
779  try:
780  old = butler.get(dataset, immediate=True)
781  except Exception as exc:
782  raise type(exc)(f"Unable to read stored version dataset {dataset} ({exc}); "
783  "consider using --clobber-versions or --no-versions")
784  # Note that because we can only detect python modules that have been imported, the stored
785  # list of products may be more or less complete than what we have now. What's important is
786  # that the products that are in common have the same version.
787  diff = packages.difference(old)
788  if diff:
789  versions_str = "; ".join(f"{pkg}: {diff[pkg][1]} vs {diff[pkg][0]}" for pkg in diff)
790  raise TaskError(
791  f"Version mismatch ({versions_str}); consider using --clobber-versions or --no-versions")
792  # Update the old set of packages in case we have more packages that haven't been persisted.
793  extra = packages.extra(old)
794  if extra:
795  old.update(packages)
796  butler.put(old, dataset, doBackup=doBackup)
797 

◆ writeSchemas()

def lsst.pipe.base.cmdLineTask.CmdLineTask.writeSchemas (   self,
  butler,
  clobber = False,
  doBackup = True 
)
inherited
Write the schemas returned by `lsst.pipe.base.Task.getAllSchemaCatalogs`.

Parameters
----------
butler : `lsst.daf.persistence.Butler`
    Data butler used to write the schema. Each schema is written to the dataset type specified as the
    key in the dict returned by `~lsst.pipe.base.Task.getAllSchemaCatalogs`.
clobber : `bool`, optional
    A boolean flag that controls what happens if a schema already has been saved:
    - `True`: overwrite or rename the existing schema, depending on ``doBackup``.
    - `False`: raise `TaskError` if this schema does not match the existing schema.
doBackup : `bool`, optional
    Set to `True` to backup the schema files if clobbering.

Notes
-----
If ``clobber`` is `False` and an existing schema does not match a current schema,
then some schemas may have been saved successfully and others may not, and there is no easy way to
tell which is which.

Definition at line 696 of file cmdLineTask.py.

696  def writeSchemas(self, butler, clobber=False, doBackup=True):
697  """Write the schemas returned by `lsst.pipe.base.Task.getAllSchemaCatalogs`.
698 
699  Parameters
700  ----------
701  butler : `lsst.daf.persistence.Butler`
702  Data butler used to write the schema. Each schema is written to the dataset type specified as the
703  key in the dict returned by `~lsst.pipe.base.Task.getAllSchemaCatalogs`.
704  clobber : `bool`, optional
705  A boolean flag that controls what happens if a schema already has been saved:
706  - `True`: overwrite or rename the existing schema, depending on ``doBackup``.
707  - `False`: raise `TaskError` if this schema does not match the existing schema.
708  doBackup : `bool`, optional
709  Set to `True` to backup the schema files if clobbering.
710 
711  Notes
712  -----
713  If ``clobber`` is `False` and an existing schema does not match a current schema,
714  then some schemas may have been saved successfully and others may not, and there is no easy way to
715  tell which is which.
716  """
717  for dataset, catalog in self.getAllSchemaCatalogs().items():
718  schemaDataset = dataset + "_schema"
719  if clobber:
720  butler.put(catalog, schemaDataset, doBackup=doBackup)
721  elif butler.datasetExists(schemaDataset, write=True):
722  oldSchema = butler.get(schemaDataset, immediate=True).getSchema()
723  if not oldSchema.compare(catalog.getSchema(), afwTable.Schema.IDENTICAL):
724  raise TaskError(
725  f"New schema does not match schema {dataset!r} on disk; "
726  "schemas must be consistent within the same output repo "
727  "(override with --clobber-config)")
728  else:
729  butler.put(catalog, schemaDataset)
730 

Member Data Documentation

◆ calib

lsst.ip.isr.measureCrosstalk.MeasureCrosstalkTask.calib

Definition at line 135 of file measureCrosstalk.py.

◆ canMultiprocess

bool lsst.pipe.base.cmdLineTask.CmdLineTask.canMultiprocess = True
staticinherited

Definition at line 524 of file cmdLineTask.py.

◆ config

lsst.pipe.base.task.Task.config
inherited

Definition at line 149 of file task.py.

◆ ConfigClass

lsst.ip.isr.measureCrosstalk.MeasureCrosstalkTask.ConfigClass = MeasureCrosstalkConfig
static

Definition at line 129 of file measureCrosstalk.py.

◆ log

lsst.pipe.base.task.Task.log
inherited

Definition at line 148 of file task.py.

◆ metadata

lsst.pipe.base.task.Task.metadata
inherited

Definition at line 121 of file task.py.

◆ RunnerClass

lsst.pipe.base.cmdLineTask.CmdLineTask.RunnerClass = TaskRunner
staticinherited

Definition at line 523 of file cmdLineTask.py.


The documentation for this class was generated from the following file:
lsst::log.log.logContinued.warn
def warn(fmt, *args)
Definition: logContinued.py:205
lsst::log.log.logContinued.info
def info(fmt, *args)
Definition: logContinued.py:201
lsst::afw.display.ds9.getDisplay
getDisplay
Definition: ds9.py:34
lsst::utils.get_caller_name
Definition: get_caller_name.py:1
lsstDebug.getDebugFrame
def getDebugFrame(debugDisplay, name)
Definition: lsstDebug.py:90
pex.config.history.format
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
Definition: history.py:174
lsst::daf::base::PropertyList
Class for storing ordered metadata with comments.
Definition: PropertyList.h:68
lsst::afw::geom.transform.transformContinued.cls
cls
Definition: transformContinued.py:33
lsst::geom::all
bool all(CoordinateExpr< N > const &expr) noexcept
Return true if all elements are true.
Definition: CoordinateExpr.h:81
lsst.pipe.base.argumentParser.getTaskDict
def getTaskDict(config, taskDict=None, baseName="")
Definition: argumentParser.py:921
lsst::log.log.logContinued.fatal
def fatal(fmt, *args)
Definition: logContinued.py:217
lsst.pipe.tasks.assembleCoadd.run
def run(self, skyInfo, tempExpRefList, imageScalerList, weightList, altMaskList=None, mask=None, supplementaryData=None)
Definition: assembleCoadd.py:712
lsst.pipe.base.timer.logInfo
def logInfo(obj, prefix, logLevel=Log.DEBUG)
Definition: timer.py:62
items
std::vector< SchemaItem< Flag > > * items
Definition: BaseColumnView.cc:142
list
daf::base::PropertyList * list
Definition: fits.cc:913
type
table::Key< int > type
Definition: Detector.cc:163
lsst::daf::base::PropertySet
Class for storing generic metadata.
Definition: PropertySet.h:67
lsst.pipe.tasks.mergeDetections.writeMetadata
def writeMetadata(self, dataRefList)
No metadata to write, and not sure how to write it for a list of dataRefs.
Definition: mergeDetections.py:405