LSST Applications  21.0.0-172-gfb10e10a+18fedfabac,22.0.0+297cba6710,22.0.0+80564b0ff1,22.0.0+8d77f4f51a,22.0.0+a28f4c53b1,22.0.0+dcf3732eb2,22.0.1-1-g7d6de66+2a20fdde0d,22.0.1-1-g8e32f31+297cba6710,22.0.1-1-geca5380+7fa3b7d9b6,22.0.1-12-g44dc1dc+2a20fdde0d,22.0.1-15-g6a90155+515f58c32b,22.0.1-16-g9282f48+790f5f2caa,22.0.1-2-g92698f7+dcf3732eb2,22.0.1-2-ga9b0f51+7fa3b7d9b6,22.0.1-2-gd1925c9+bf4f0e694f,22.0.1-24-g1ad7a390+a9625a72a8,22.0.1-25-g5bf6245+3ad8ecd50b,22.0.1-25-gb120d7b+8b5510f75f,22.0.1-27-g97737f7+2a20fdde0d,22.0.1-32-gf62ce7b1+aa4237961e,22.0.1-4-g0b3f228+2a20fdde0d,22.0.1-4-g243d05b+871c1b8305,22.0.1-4-g3a563be+32dcf1063f,22.0.1-4-g44f2e3d+9e4ab0f4fa,22.0.1-42-gca6935d93+ba5e5ca3eb,22.0.1-5-g15c806e+85460ae5f3,22.0.1-5-g58711c4+611d128589,22.0.1-5-g75bb458+99c117b92f,22.0.1-6-g1c63a23+7fa3b7d9b6,22.0.1-6-g50866e6+84ff5a128b,22.0.1-6-g8d3140d+720564cf76,22.0.1-6-gd805d02+cc5644f571,22.0.1-8-ge5750ce+85460ae5f3,master-g6e05de7fdc+babf819c66,master-g99da0e417a+8d77f4f51a,w.2021.48
LSST Data Management Base Package
Public Member Functions | Static Public Attributes | List of all members
lsst.meas.extensions.piff.piffPsfDeterminer.PiffPsfDeterminerTask Class Reference
Inheritance diagram for lsst.meas.extensions.piff.piffPsfDeterminer.PiffPsfDeterminerTask:
lsst.meas.algorithms.psfDeterminer.BasePsfDeterminerTask

Public Member Functions

def determinePsf (self, exposure, psfCandidateList, metadata=None, flagKey=None)
 
def determinePsf (self, exposure, psfCandidateList, metadata=None)
 

Static Public Attributes

 ConfigClass = PiffPsfDeterminerConfig
 
bool usesMatches = False
 

Detailed Description

A measurePsfTask PSF estimator using Piff as the implementation.

Definition at line 171 of file piffPsfDeterminer.py.

Member Function Documentation

◆ determinePsf() [1/2]

def lsst.meas.algorithms.psfDeterminer.BasePsfDeterminerTask.determinePsf (   self,
  exposure,
  psfCandidateList,
  metadata = None 
)
inherited
Determine a PSF model.

Parameters
----------
exposure : `lsst.afw.Exposure`
    Exposure containing the psf candidates.
psdCandidateList : `list` [`lsst.meas.algorithms.PsfCandidate`]
    A sequence of PSF candidates; typically obtained by
    detecting sources and then running them through a star
    selector.
metadata : `str`
    A place to save interesting items.

Returns
-------
psf : `lsst.afw.detection.Psf`
    The fit PSF.
cellSet : `lsst.afw.math.SpatialCellSet`
    The spatial cell set used to determine the PSF

Definition at line 78 of file psfDeterminer.py.

78  def determinePsf(self, exposure, psfCandidateList, metadata=None):
79  """Determine a PSF model.
80 
81  Parameters
82  ----------
83  exposure : `lsst.afw.Exposure`
84  Exposure containing the psf candidates.
85  psdCandidateList : `list` [`lsst.meas.algorithms.PsfCandidate`]
86  A sequence of PSF candidates; typically obtained by
87  detecting sources and then running them through a star
88  selector.
89  metadata : `str`
90  A place to save interesting items.
91 
92  Returns
93  -------
94  psf : `lsst.afw.detection.Psf`
95  The fit PSF.
96  cellSet : `lsst.afw.math.SpatialCellSet`
97  The spatial cell set used to determine the PSF
98  """
99  raise NotImplementedError("BasePsfDeterminerTask is abstract, subclasses must override this method")
100 
101 

◆ determinePsf() [2/2]

def lsst.meas.extensions.piff.piffPsfDeterminer.PiffPsfDeterminerTask.determinePsf (   self,
  exposure,
  psfCandidateList,
  metadata = None,
  flagKey = None 
)
Determine a Piff PSF model for an exposure given a list of PSF
candidates.

Parameters
----------
exposure : `lsst.afw.image.Exposure`
   Exposure containing the PSF candidates.
psfCandidateList : `list` of `lsst.meas.algorithms.PsfCandidate`
   A sequence of PSF candidates typically obtained by detecting sources
   and then running them through a star selector.
metadata : `lsst.daf.base import PropertyList` or `None`, optional
   A home for interesting tidbits of information.
flagKey : `str` or `None`, optional
   Schema key used to mark sources actually used in PSF determination.

Returns
-------
psf : `lsst.meas.extensions.piff.PiffPsf`
   The measured PSF model.
psfCellSet : `None`
   Unused by this PsfDeterminer.

Definition at line 177 of file piffPsfDeterminer.py.

179  ):
180  """Determine a Piff PSF model for an exposure given a list of PSF
181  candidates.
182 
183  Parameters
184  ----------
185  exposure : `lsst.afw.image.Exposure`
186  Exposure containing the PSF candidates.
187  psfCandidateList : `list` of `lsst.meas.algorithms.PsfCandidate`
188  A sequence of PSF candidates typically obtained by detecting sources
189  and then running them through a star selector.
190  metadata : `lsst.daf.base import PropertyList` or `None`, optional
191  A home for interesting tidbits of information.
192  flagKey : `str` or `None`, optional
193  Schema key used to mark sources actually used in PSF determination.
194 
195  Returns
196  -------
197  psf : `lsst.meas.extensions.piff.PiffPsf`
198  The measured PSF model.
199  psfCellSet : `None`
200  Unused by this PsfDeterminer.
201  """
202  stars = []
203  for candidate in psfCandidateList:
204  cmi = candidate.getMaskedImage()
205  weight = computeWeight(cmi, self.config.maxSNR)
206 
207  bbox = cmi.getBBox()
208  bds = galsim.BoundsI(
209  galsim.PositionI(*bbox.getMin()),
210  galsim.PositionI(*bbox.getMax())
211  )
212  gsImage = galsim.Image(bds, scale=1.0, dtype=float)
213  gsImage.array[:] = cmi.image.array
214  gsWeight = galsim.Image(bds, scale=1.0, dtype=float)
215  gsWeight.array[:] = weight
216 
217  source = candidate.getSource()
218  image_pos = galsim.PositionD(source.getX(), source.getY())
219 
220  data = piff.StarData(
221  gsImage,
222  image_pos,
223  weight=gsWeight
224  )
225  stars.append(piff.Star(data, None))
226 
227  kernelSize = int(np.clip(
228  self.config.kernelSize,
229  self.config.kernelSizeMin,
230  self.config.kernelSizeMax
231  ))
232 
233  piffConfig = {
234  'type': "Simple",
235  'model': {
236  'type': 'PixelGrid',
237  'scale': self.config.samplingSize,
238  'size': kernelSize
239  },
240  'interp': {
241  'type': 'BasisPolynomial',
242  'order': self.config.spatialOrder
243  },
244  'outliers': {
245  'type': 'Chisq',
246  'nsigma': self.config.outlierNSigma,
247  'max_remove': self.config.outlierMaxRemove
248  }
249  }
250 
251  piffResult = piff.PSF.process(piffConfig)
252  # Run on a single CCD, and in image coords rather than sky coords.
253  wcs = {0: galsim.PixelScale(1.0)}
254  pointing = None
255 
256  piffResult.fit(stars, wcs, pointing, logger=self.log)
257  psf = PiffPsf(kernelSize, kernelSize, piffResult)
258 
259  used_image_pos = [s.image_pos for s in piffResult.stars]
260  if flagKey:
261  for candidate in psfCandidateList:
262  source = candidate.getSource()
263  posd = galsim.PositionD(source.getX(), source.getY())
264  if posd in used_image_pos:
265  source.set(flagKey, True)
266 
267  if metadata is not None:
268  metadata["spatialFitChi2"] = piffResult.chisq
269  metadata["numAvailStars"] = len(stars)
270  metadata["numGoodStars"] = len(piffResult.stars)
271  metadata["avgX"] = np.mean([p.x for p in piffResult.stars])
272  metadata["avgY"] = np.mean([p.y for p in piffResult.stars])
273 
274  return psf, None
275 
276 
277 measAlg.psfDeterminerRegistry.register("piff", PiffPsfDeterminerTask)

Member Data Documentation

◆ ConfigClass

lsst.meas.extensions.piff.piffPsfDeterminer.PiffPsfDeterminerTask.ConfigClass = PiffPsfDeterminerConfig
static

Definition at line 174 of file piffPsfDeterminer.py.

◆ usesMatches

bool lsst.meas.algorithms.psfDeterminer.BasePsfDeterminerTask.usesMatches = False
staticinherited

Definition at line 70 of file psfDeterminer.py.


The documentation for this class was generated from the following file: