@@ -522,7 +522,11 @@ def update_background_stats(self, summary, background):
522522 Parameters
523523 ----------
524524 summary : `lsst.afw.image.ExposureSummaryStats`
525- Summary object to update in-place.
525+ Summary object to update in-place. This method adds/updates the
526+ following fields:
527+ - `skyBg`: Median sky background value across background models.
528+ - `skyBgNormRange`: Normalized range (max - min / median) of the
529+ combined sky background, used to quantify spatial variation.
526530 background : `lsst.afw.math.BackgroundList` or `None`
527531 Background model. If `None`, all fields that depend on the
528532 background will be reset (generally to NaN).
@@ -535,11 +539,37 @@ def update_background_stats(self, summary, background):
535539 as well.
536540 """
537541 if background is not None :
538- bgStats = (bg [0 ].getStatsImage ().getImage ().array
539- for bg in background )
540- summary .skyBg = float (sum (np .median (bg [np .isfinite (bg )]) for bg in bgStats ))
542+ bgStats = []
543+ for bg in background :
544+ statsImageF = bg [0 ].getStatsImage ().getImage ()
545+ bgArray = statsImageF .array
546+ bgArray [~ np .isfinite (bgArray )] = np .nan
547+ bgStats .append (bgArray )
548+ summary .skyBg = float (sum (np .nanmedian (bg ) for bg in bgStats ))
549+ shapes = [arr .shape for arr in bgStats ]
550+ if len (set (shapes )) != 1 :
551+ raise RuntimeError (
552+ f"BackgroundList images from background models have different shapes: { shapes } "
553+ f"bgStats: { bgStats } "
554+ )
555+ try :
556+ skyBgSumImage = np .sum (np .stack (bgStats ), axis = 0 )
557+ except Exception as e :
558+ raise RuntimeError (
559+ f"Failed to stack bgStats: { e } \n bgStats types: { [type (x ) for x in bgStats ]} "
560+ f"\n bgStats shapes: { [x .shape for x in bgStats ]} "
561+ )
562+
563+ median = np .nanmedian (skyBgSumImage )
564+ if median != 0 and np .isfinite (median ):
565+ summary .skyBgNormRange = float (
566+ (np .nanmax (skyBgSumImage ) - np .nanmin (skyBgSumImage )) / median
567+ )
568+ else :
569+ summary .skyBgNormRange = float ("nan" )
541570 else :
542571 summary .skyBg = float ("nan" )
572+ summary .skyBgNormRange = float ("nan" )
543573
544574 def update_masked_image_stats (self , summary , masked_image ):
545575 """Compute summary-statistic fields that depend on the masked image
0 commit comments