From 6a063d861347e1b27ed82449e98d383a25bdd909 Mon Sep 17 00:00:00 2001 From: jrmullaney Date: Fri, 20 Feb 2026 08:42:23 -0800 Subject: [PATCH 1/2] Exclude subParents from ParentObjectSelector --- python/lsst/analysis/tools/actions/vector/selectors.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/python/lsst/analysis/tools/actions/vector/selectors.py b/python/lsst/analysis/tools/actions/vector/selectors.py index 47cedfac4..eb2b4dfa4 100644 --- a/python/lsst/analysis/tools/actions/vector/selectors.py +++ b/python/lsst/analysis/tools/actions/vector/selectors.py @@ -616,8 +616,11 @@ class ParentObjectSelector(FlagSelector): def setDefaults(self): # This selects all of the parents + # parentObjectId excludes subParents. + # This works because FlagSelector identifies False as 0. self.selectWhenFalse = [ "sky_object", + "parentObjectId", ] From 6800efff772729c8fe736abfe16fdea127edb94b Mon Sep 17 00:00:00 2001 From: jrmullaney Date: Fri, 20 Feb 2026 08:43:19 -0800 Subject: [PATCH 2/2] Add PeakDropouts to deblender metrics --- .../analysis/tools/atools/deblenderMetric.py | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/python/lsst/analysis/tools/atools/deblenderMetric.py b/python/lsst/analysis/tools/atools/deblenderMetric.py index 98e45c40e..3df151188 100644 --- a/python/lsst/analysis/tools/atools/deblenderMetric.py +++ b/python/lsst/analysis/tools/atools/deblenderMetric.py @@ -22,13 +22,15 @@ __all__ = ("ParentDeblenderMetrics", "SkippedDeblenderMetrics", "BlendMetrics", "IsolatedDeblenderMetrics") -from ..actions.scalar.scalarActions import CountAction, MeanAction, SumAction +from ..actions.scalar.scalarActions import CountAction, DivideScalar, MeanAction, SumAction +from ..actions.vector.mathActions import AddVector, SubtractVector from ..actions.vector.selectors import ( ChildObjectSelector, FlagSelector, ParentObjectSelector, ThresholdSelector, ) +from ..actions.vector.vectorActions import LoadVector from ..interfaces import AnalysisTool @@ -41,6 +43,15 @@ def setDefaults(self): # Only select parents self.prep.selectors.parentSelector = ParentObjectSelector() + # Subtract the number of children+isolated from the number of peaks + # to get the number of peakDropouts. Ideally, this should be zero. + self.process.buildActions.peakDropouts = SubtractVector() + self.process.buildActions.peakDropouts.actionA = LoadVector(vectorKey="deblend_nPeaks") + self.process.buildActions.peakDropouts.actionB = AddVector( + actionA=LoadVector(vectorKey="deblend_nChild"), + actionB=LoadVector(vectorKey="deblend_skipped_isolatedParent"), + ) + # Statistics for parent blends self.process.calculateActions.numParents = CountAction(vectorKey="parentObjectId") self.process.calculateActions.numDeblendFailed = SumAction(vectorKey="deblend_failed") @@ -48,15 +59,26 @@ def setDefaults(self): # Total number of detected peaks self.process.calculateActions.numDetectedPeaks = SumAction(vectorKey="deblend_nPeaks") + # Total number of deblended children self.process.calculateActions.numDeblendedChildren = SumAction(vectorKey="deblend_nChild") + # Total number of peak dropouts + self.process.calculateActions.numPeakDropouts = SumAction(vectorKey="peakDropouts") + + # Total number of peak dropouts as proportion of total number of peaks + self.process.calculateActions.propPeakDropouts = DivideScalar() + self.process.calculateActions.propPeakDropouts.actionA = SumAction(vectorKey="peakDropouts") + self.process.calculateActions.propPeakDropouts.actionB = SumAction(vectorKey="deblend_nPeaks") + self.produce.metric.units = { "numParents": "", "numDeblendFailed": "", "numIncompleteData": "", "numDetectedPeaks": "", "numDeblendedChildren": "", + "numPeakDropouts": "", + "propPeakDropouts": "", }