LSSTApplications  10.0+286,10.0+36,10.0+46,10.0-2-g4f67435,10.1+152,10.1+37,11.0,11.0+1,11.0-1-g47edd16,11.0-1-g60db491,11.0-1-g7418c06,11.0-2-g04d2804,11.0-2-g68503cd,11.0-2-g818369d,11.0-2-gb8b8ce7
LSSTDataManagementBasePackage
Public Member Functions | Public Attributes | List of all members
lsst.ip.diffim.dipoleMeasurement.DipoleDeblender Class Reference

Functor to deblend a source as a dipole, and return a new source with deblended footprints. More...

Inheritance diagram for lsst.ip.diffim.dipoleMeasurement.DipoleDeblender:

Public Member Functions

def __init__
 
def __call__
 

Public Attributes

 psfChisqCut1
 
 psfChisqCut2
 
 psfChisqCut2b
 
 log
 
 sigma2fwhm
 

Detailed Description

Functor to deblend a source as a dipole, and return a new source with deblended footprints.

This necessarily overrides some of the functionality from meas_algorithms/python/lsst/meas/algorithms/deblend.py since we need a single source that contains the blended peaks, not multiple children sources. This directly calls the core deblending code deblendBaseline.deblend (optionally _fitPsf for debugging).

Not actively being used, but there is a unit test for it in dipoleAlgorithm.py.

Definition at line 467 of file dipoleMeasurement.py.

Constructor & Destructor Documentation

def lsst.ip.diffim.dipoleMeasurement.DipoleDeblender.__init__ (   self)

Definition at line 480 of file dipoleMeasurement.py.

481  def __init__(self):
482  # Set up defaults to send to deblender
483 
484  # Always deblend as Psf
485  self.psfChisqCut1 = self.psfChisqCut2 = self.psfChisqCut2b = np.inf
486  self.log = pexLog.Log(pexLog.Log.getDefaultLog(),
487  'lsst.ip.diffim.DipoleDeblender', pexLog.Log.INFO)
488  self.sigma2fwhm = 2. * np.sqrt(2. * np.log(2.))
a place to record messages and descriptions of the state of processing.
Definition: Log.h:154

Member Function Documentation

def lsst.ip.diffim.dipoleMeasurement.DipoleDeblender.__call__ (   self,
  source,
  exposure 
)

Definition at line 489 of file dipoleMeasurement.py.

490  def __call__(self, source, exposure):
491  fp = source.getFootprint()
492  peaks = fp.getPeaks()
493  peaksF = [pk.getF() for pk in peaks]
494  fbb = fp.getBBox()
495  fmask = afwImage.MaskU(fbb)
496  fmask.setXY0(fbb.getMinX(), fbb.getMinY())
497  afwDetect.setMaskFromFootprint(fmask, fp, 1)
498 
499  psf = exposure.getPsf()
500  psfSigPix = psf.computeShape().getDeterminantRadius()
501  psfFwhmPix = psfSigPix * self.sigma2fwhm
502  subimage = afwImage.ExposureF(exposure, fbb, True)
503  cpsf = deblendBaseline.CachingPsf(psf)
504 
505  # if fewer than 2 peaks, just return a copy of the source
506  if len(peaks) < 2:
507  return source.getTable().copyRecord(source)
508 
509  # make sure you only deblend 2 peaks; take the brighest and faintest
510  speaks = [(p.getPeakValue(), p) for p in peaks]
511  speaks.sort()
512  dpeaks = [speaks[0][1], speaks[-1][1]]
513 
514  # and only set these peaks in the footprint (peaks is mutable)
515  peaks.clear()
516  for peak in dpeaks:
517  peaks.append(peak)
518 
519  if True:
520  # Call top-level deblend task
521  fpres = deblendBaseline.deblend(fp, exposure.getMaskedImage(), psf, psfFwhmPix,
522  log = self.log,
523  psfChisqCut1 = self.psfChisqCut1,
524  psfChisqCut2 = self.psfChisqCut2,
525  psfChisqCut2b = self.psfChisqCut2b)
526  else:
527  # Call lower-level _fit_psf task
528 
529  # Prepare results structure
530  fpres = deblendBaseline.PerFootprint()
531  fpres.peaks = []
532  for pki,pk in enumerate(dpeaks):
533  pkres = deblendBaseline.PerPeak()
534  pkres.peak = pk
535  pkres.pki = pki
536  fpres.peaks.append(pkres)
537 
538  for pki,(pk,pkres,pkF) in enumerate(zip(dpeaks, fpres.peaks, peaksF)):
539  self.log.logdebug('Peak %i' % pki)
540  deblendBaseline._fitPsf(fp, fmask, pk, pkF, pkres, fbb, dpeaks, peaksF, self.log,
541  cpsf, psfFwhmPix,
542  subimage.getMaskedImage().getImage(),
543  subimage.getMaskedImage().getVariance(),
544  self.psfChisqCut1, self.psfChisqCut2, self.psfChisqCut2b)
545 
546 
547  deblendedSource = source.getTable().copyRecord(source)
548  deblendedSource.setParent(source.getId())
549  peakList = deblendedSource.getFootprint().getPeaks()
550  peakList.clear()
551 
552  for i, peak in enumerate(fpres.peaks):
553  if peak.psfFitFlux > 0:
554  suffix = "pos"
555  else:
556  suffix = "neg"
557  c = peak.psfFitCenter
558  self.log.info("deblended.centroid.dipole.psf.%s %f %f" % (
559  suffix, c[0], c[1]))
560  self.log.info("deblended.chi2dof.dipole.%s %f" % (
561  suffix, peak.psfFitChisq / peak.psfFitDof))
562  self.log.info("deblended.flux.dipole.psf.%s %f" % (
563  suffix, peak.psfFitFlux * np.sum(peak.templateImage.getArray())))
564  peakList.append(peak.peak)
565  return deblendedSource
MaskT setMaskFromFootprint(lsst::afw::image::Mask< MaskT > *mask, Footprint const &footprint, MaskT const bitmask)
OR bitmask into all the Mask&#39;s pixels that are in the Footprint.

Member Data Documentation

lsst.ip.diffim.dipoleMeasurement.DipoleDeblender.log

Definition at line 485 of file dipoleMeasurement.py.

lsst.ip.diffim.dipoleMeasurement.DipoleDeblender.psfChisqCut1

Definition at line 484 of file dipoleMeasurement.py.

lsst.ip.diffim.dipoleMeasurement.DipoleDeblender.psfChisqCut2

Definition at line 484 of file dipoleMeasurement.py.

lsst.ip.diffim.dipoleMeasurement.DipoleDeblender.psfChisqCut2b

Definition at line 484 of file dipoleMeasurement.py.

lsst.ip.diffim.dipoleMeasurement.DipoleDeblender.sigma2fwhm

Definition at line 487 of file dipoleMeasurement.py.


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