LSST Applications  21.0.0+04719a4bac,21.0.0-1-ga51b5d4+f5e6047307,21.0.0-11-g2b59f77+a9c1acf22d,21.0.0-11-ga42c5b2+86977b0b17,21.0.0-12-gf4ce030+76814010d2,21.0.0-13-g1721dae+760e7a6536,21.0.0-13-g3a573fe+768d78a30a,21.0.0-15-g5a7caf0+f21cbc5713,21.0.0-16-g0fb55c1+b60e2d390c,21.0.0-19-g4cded4ca+71a93a33c0,21.0.0-2-g103fe59+bb20972958,21.0.0-2-g45278ab+04719a4bac,21.0.0-2-g5242d73+3ad5d60fb1,21.0.0-2-g7f82c8f+8babb168e8,21.0.0-2-g8f08a60+06509c8b61,21.0.0-2-g8faa9b5+616205b9df,21.0.0-2-ga326454+8babb168e8,21.0.0-2-gde069b7+5e4aea9c2f,21.0.0-2-gecfae73+1d3a86e577,21.0.0-2-gfc62afb+3ad5d60fb1,21.0.0-25-g1d57be3cd+e73869a214,21.0.0-3-g357aad2+ed88757d29,21.0.0-3-g4a4ce7f+3ad5d60fb1,21.0.0-3-g4be5c26+3ad5d60fb1,21.0.0-3-g65f322c+e0b24896a3,21.0.0-3-g7d9da8d+616205b9df,21.0.0-3-ge02ed75+a9c1acf22d,21.0.0-4-g591bb35+a9c1acf22d,21.0.0-4-g65b4814+b60e2d390c,21.0.0-4-gccdca77+0de219a2bc,21.0.0-4-ge8a399c+6c55c39e83,21.0.0-5-gd00fb1e+05fce91b99,21.0.0-6-gc675373+3ad5d60fb1,21.0.0-64-g1122c245+4fb2b8f86e,21.0.0-7-g04766d7+cd19d05db2,21.0.0-7-gdf92d54+04719a4bac,21.0.0-8-g5674e7b+d1bd76f71f,master-gac4afde19b+a9c1acf22d,w.2021.13
LSST Data Management Base Package
Classes | Functions
lsst.meas.extensions.piff.piffPsfDeterminer Namespace Reference

Classes

class  PiffPsfDeterminerConfig
 
class  PiffPsfDeterminerTask
 

Functions

def computeWeight (maskedImage, maxSNR)
 
def applyMaxSNR (imArr, weightArr, good, maxSNR)
 

Function Documentation

◆ applyMaxSNR()

def lsst.meas.extensions.piff.piffPsfDeterminer.applyMaxSNR (   imArr,
  weightArr,
  good,
  maxSNR 
)
Rescale weight of bright stars to cap the computed SNR.

Parameters
----------
imArr : `ndarray`
    Signal (image) array of stamp.
weightArr : `ndarray`
    Weight map array.  May be rescaled in place.
good : `ndarray`
    Index array of pixels to use when computing SNR.
maxSNR : `float`
    Threshold for adjusting variance plane implementing maximum SNR.

Definition at line 103 of file piffPsfDeterminer.py.

103 def applyMaxSNR(imArr, weightArr, good, maxSNR):
104  """Rescale weight of bright stars to cap the computed SNR.
105 
106  Parameters
107  ----------
108  imArr : `ndarray`
109  Signal (image) array of stamp.
110  weightArr : `ndarray`
111  Weight map array. May be rescaled in place.
112  good : `ndarray`
113  Index array of pixels to use when computing SNR.
114  maxSNR : `float`
115  Threshold for adjusting variance plane implementing maximum SNR.
116  """
117  # We define the SNR value following Piff. Here's the comment from that
118  # code base explaining the calculation.
119  #
120  # The S/N value that we use will be the weighted total flux where the
121  # weight function is the star's profile itself. This is the maximum S/N
122  # value that any flux measurement can possibly produce, which will be
123  # closer to an in-practice S/N than using all the pixels equally.
124  #
125  # F = Sum_i w_i I_i^2
126  # var(F) = Sum_i w_i^2 I_i^2 var(I_i)
127  # = Sum_i w_i I_i^2 <--- Assumes var(I_i) = 1/w_i
128  #
129  # S/N = F / sqrt(var(F))
130  #
131  # Note that if the image is pure noise, this will produce a "signal" of
132  #
133  # F_noise = Sum_i w_i 1/w_i = Npix
134  #
135  # So for a more accurate estimate of the S/N of the actual star itself, one
136  # should subtract off Npix from the measured F.
137  #
138  # The final formula then is:
139  #
140  # F = Sum_i w_i I_i^2
141  # S/N = (F-Npix) / sqrt(F)
142  F = np.sum(weightArr[good]*imArr[good]**2, dtype=float)
143  Npix = np.sum(good)
144  SNR = 0.0 if F < Npix else (F-Npix)/np.sqrt(F)
145  # rescale weight of bright stars. Essentially makes an error floor.
146  if SNR > maxSNR:
147  factor = (maxSNR / SNR)**2
148  weightArr[good] *= factor
149 
150 
def applyMaxSNR(imArr, weightArr, good, maxSNR)

◆ computeWeight()

def lsst.meas.extensions.piff.piffPsfDeterminer.computeWeight (   maskedImage,
  maxSNR 
)
Derive a weight map without Poisson variance component due to signal.

Parameters
----------
maskedImage : `afw.image.MaskedImage`
    PSF candidate postage stamp
maxSNR : `float`
    Maximum SNR applying variance floor.

Returns
-------
weightArr : `ndarry`
    Array to use for weight.

Definition at line 72 of file piffPsfDeterminer.py.

72 def computeWeight(maskedImage, maxSNR):
73  """Derive a weight map without Poisson variance component due to signal.
74 
75  Parameters
76  ----------
77  maskedImage : `afw.image.MaskedImage`
78  PSF candidate postage stamp
79  maxSNR : `float`
80  Maximum SNR applying variance floor.
81 
82  Returns
83  -------
84  weightArr : `ndarry`
85  Array to use for weight.
86  """
87  imArr = maskedImage.image.array
88  varArr = maskedImage.variance.array
89  good = (varArr != 0) & np.isfinite(varArr) & np.isfinite(imArr)
90 
91  # Fit a straight line to variance vs (sky-subtracted) signal.
92  # The evaluate that line at zero signal to get an estimate of the
93  # signal-free variance.
94  fit = np.polyfit(imArr[good], varArr[good], deg=1)
95  # fit is [1/gain, sky_var]
96  weightArr = np.zeros_like(imArr, dtype=float)
97  weightArr[good] = 1./fit[1]
98 
99  applyMaxSNR(imArr, weightArr, good, maxSNR)
100  return weightArr
101 
102