Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tickets/DM-42672: Create FocalPlaneGeometryPlots for biasMean, biasNoise, biasCRNoise, biasShiftCount #213

Merged
merged 9 commits into from
Feb 28, 2024
36 changes: 31 additions & 5 deletions pipelines/exposureCore.yaml
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
description: |
Core-level plots and metrics for exposure-level data.
Tier1 plots to assess validity of calibration exposures.
tasks:
VerifyBias:
class: lsst.analysis.tools.tasks.VerifyBiasAnalysisTask
analyseBiasCore:
class: lsst.analysis.tools.tasks.VerifyCalibAnalysisTask
config:
connections.outputName: VerifyBias
atools.ReadNoisePerAmp: MedReadNoiseFocalPlanePlot
connections.outputName: biasCore
connections.data: verifyBiasResults
atools.biasReadNoisePerAmp: CalibStatisticFocalPlanePlot
atools.biasReadNoisePerAmp.quantityKey: biasReadNoise
atools.meanBiasPerAmp: CalibStatisticFocalPlanePlot
atools.meanBiasPerAmp.quantityKey: biasMean
atools.biasNoisePerAmp: CalibStatisticFocalPlanePlot
atools.biasNoisePerAmp.quantityKey: biasNoise
atools.biasCrNoisePerAmp: CalibStatisticFocalPlanePlot
atools.biasCrNoisePerAmp.quantityKey: biasCrNoise
atools.biasShiftCountPerAmp: CalibStatisticFocalPlanePlot
atools.biasShiftCountPerAmp.quantityKey: biasShiftCount
atools.biasShiftCountPerAmp.unit: count
atools.ampBiasProfileScatter: CPVerifyQuantityAmpProfileScatterTool
atools.ampBiasProfileScatter.prep.quantityKey: biasSerialProfile
atools.ampBiasProfileScatter.produce.plot.suptitle:
Expand All @@ -17,3 +28,18 @@ tasks:
python: |
from lsst.analysis.tools.atools import *
from lsst.analysis.tools.actions.plot.elements import *
analyseDarkCore:
class: lsst.analysis.tools.tasks.VerifyCalibAnalysisTask
config:
connections.outputName: darkCore
connections.data: verifyDarkResults
atools.readNoisePerAmp: CalibStatisticFocalPlanePlot
atools.readNoisePerAmp.quantityKey: darkReadNoise
atools.meanDarkPerAmp: CalibStatisticFocalPlanePlot
atools.meanDarkPerAmp.quantityKey: darkMean
atools.darkNoisePerAmp: CalibStatisticFocalPlanePlot
atools.darkNoisePerAmp.quantityKey: darkNoise
atools.darkCrNoisePerAmp: CalibStatisticFocalPlanePlot
atools.darkCrNoisePerAmp.quantityKey: darkCrNoise
python: |
from lsst.analysis.tools.atools import *
30 changes: 18 additions & 12 deletions python/lsst/analysis/tools/atools/calibration.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
from __future__ import annotations

__all__ = (
"MedReadNoiseFocalPlanePlot",
"CalibStatisticFocalPlanePlot",
"PtcGainFP",
"PtcNoiseFP",
"PtcA00FP",
Expand All @@ -30,6 +30,8 @@
"PtcRowMeanVarianceSlopeFP",
)

from lsst.pex.config import Field

from ..actions.plot.focalPlanePlot import FocalPlaneGeometryPlot
from ..actions.vector import LoadVector
from ..interfaces import AnalysisTool
Expand All @@ -53,25 +55,29 @@ def setDefaults(self):
self.produce.plot.statistic = "median"


class MedReadNoiseFocalPlanePlot(AnalysisTool):
class CalibStatisticFocalPlanePlot(CalibrationTool):
"""Generates a plot of the focal plane, color-coded according to the
median bias read noise on a per-amp basis. The median is across
multiple bias exposures.
median of a given measurement (default: "biasMean") on a per-amp basis.
The median is across multiple bias exposures.
"""

quantityKey = Field[str](
default="biasMean", doc="VectorKey to perform the statistic on and to plot per amp and per detector."
)
unit = Field[str](default="ADU", doc="Unit of quantity for including on z-axis label.")

def setDefaults(self):
super().setDefaults()

self.process.buildActions.z = LoadVector()
self.process.buildActions.z.vectorKey = "biasReadNoise"
self.process.buildActions.detector = LoadVector()
self.process.buildActions.detector.vectorKey = "detector"
self.process.buildActions.amplifier = LoadVector()
self.process.buildActions.amplifier.vectorKey = "amplifier"
self.process.buildActions.z.vectorKey = "biasMean"

self.produce.plot = FocalPlaneGeometryPlot()
self.produce.plot.zAxisLabel = "Med. Readnoise"
self.produce.plot.statistic = "median"
self.produce.plot.zAxisLabel = "Median of biasMean"

def finalize(self):
self.process.buildActions.z.vectorKey = self.quantityKey
zAxislabel = f"{self.produce.plot.statistic} of {self.quantityKey} ({self.unit})"
self.produce.plot.zAxisLabel = zAxislabel.capitalize()


class PtcGainFP(CalibrationTool):
Expand Down
14 changes: 7 additions & 7 deletions python/lsst/analysis/tools/tasks/calibrationAnalysis.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,18 +21,18 @@
from __future__ import annotations

__all__ = (
"VerifyCalibAnalysisConfig",
"VerifyCalibAnalysisTask",
"VerifyPtcAnalysisConfig",
"VerifyPtcAnalysisTask",
"VerifyBiasAnalysisConfig",
"VerifyBiasAnalysisTask",
)

from lsst.pipe.base import connectionTypes as cT

from ..interfaces import AnalysisBaseConfig, AnalysisBaseConnections, AnalysisPipelineTask


class VerifyBiasAnalysisConnections(
class VerifyCalibAnalysisConnections(
AnalysisBaseConnections,
dimensions=("instrument",),
defaultTemplates={"inputName": "verifyBiasResults"},
Expand All @@ -54,13 +54,13 @@ class VerifyBiasAnalysisConnections(
)


class VerifyBiasAnalysisConfig(AnalysisBaseConfig, pipelineConnections=VerifyBiasAnalysisConnections):
class VerifyCalibAnalysisConfig(AnalysisBaseConfig, pipelineConnections=VerifyCalibAnalysisConnections):
pass


class VerifyBiasAnalysisTask(AnalysisPipelineTask):
ConfigClass = VerifyBiasAnalysisConfig
_DefaultName = "verifyBiasAnalysis"
class VerifyCalibAnalysisTask(AnalysisPipelineTask):
ConfigClass = VerifyCalibAnalysisConfig
_DefaultName = "verifyCalibAnalysis"

def runQuantum(self, butlerQC, inputRefs, outputRefs):
# Docs inherited from base class.
Expand Down