LSST Applications g0f08755f38+9c285cab97,g1635faa6d4+13f3999e92,g1653933729+a8ce1bb630,g1a0ca8cf93+bf6eb00ceb,g28da252d5a+0829b12dee,g29321ee8c0+5700dc9eac,g2bbee38e9b+9634bc57db,g2bc492864f+9634bc57db,g2cdde0e794+c2c89b37c4,g3156d2b45e+41e33cbcdc,g347aa1857d+9634bc57db,g35bb328faa+a8ce1bb630,g3a166c0a6a+9634bc57db,g3e281a1b8c+9f2c4e2fc3,g414038480c+077ccc18e7,g41af890bb2+fde0dd39b6,g5fbc88fb19+17cd334064,g781aacb6e4+a8ce1bb630,g80478fca09+55a9465950,g82479be7b0+d730eedb7d,g858d7b2824+9c285cab97,g9125e01d80+a8ce1bb630,g9726552aa6+10f999ec6a,ga5288a1d22+2a84bb7594,gacf8899fa4+c69c5206e8,gae0086650b+a8ce1bb630,gb58c049af0+d64f4d3760,gc28159a63d+9634bc57db,gcf0d15dbbd+4b7d09cae4,gda3e153d99+9c285cab97,gda6a2b7d83+4b7d09cae4,gdaeeff99f8+1711a396fd,ge2409df99d+5e831397f4,ge79ae78c31+9634bc57db,gf0baf85859+147a0692ba,gf3967379c6+41c94011de,gf3fb38a9a8+8f07a9901b,gfb92a5be7c+9c285cab97,w.2024.46
LSST Data Management Base Package
Loading...
Searching...
No Matches
Classes | Functions | Variables
lsst.meas.base.forcedPhotCcd Namespace Reference

Classes

class  for
 
class  ForcedPhotCcdConnections
 
class  may
 

Functions

 runQuantum (self, butlerQC, inputRefs, outputRefs)
 
 df2RefCat (self, dfList, exposureBBox, exposureWcs)
 
 df2SourceCat (self, df)
 

Variables

 footprintSource
 
 refSchema : `lsst.afw.table.Schema`, optional
 
 initInputs : `dict`
 
 exposure : `lsst.afw.image.exposure.Exposure`
 
 skyCorr : `lsst.afw.math.backgroundList`, optional
 
 doApplySkyCorr
 
 visitSummary : `lsst.afw.table.ExposureCatalog`, optional
 
sequence refCats of `lsst.daf.butler.DeferredDatasetHandle`
 
 refWcs : `lsst.afw.image.SkyWcs`
 
 refSources : `lsst.afw.table.SourceCatalog`
 
 dataId : `lsst.daf.butler.DataCoordinate`
 
 refCat : `lsst.afw.table.SourceCatalog`
 
 measCat : `lsst.afw.table.SourceCatalog`
 
 expId : `int`
 
 exposureId : `int`
 
 result : `lsst.pipe.base.Struct`
 
 schema
 
 outputSchema
 

Function Documentation

◆ df2RefCat()

lsst.meas.base.forcedPhotCcd.df2RefCat ( self,
dfList,
exposureBBox,
exposureWcs )
Convert list of DataFrames to reference catalog

Concatenate list of DataFrames presumably from multiple patches and
downselect rows that overlap the exposureBBox using the exposureWcs.

Parameters
----------
dfList : `list` of `pandas.DataFrame`
    Each element containst diaObjects with ra/dec position in degrees
    Columns 'diaObjectId', 'ra', 'dec' are expected
exposureBBox :   `lsst.geom.Box2I`
    Bounding box on which to select rows that overlap
exposureWcs : `lsst.afw.geom.SkyWcs`
    World coordinate system to convert sky coords in ref cat to
    pixel coords with which to compare with exposureBBox

Returns
-------
refCat : `lsst.afw.table.SourceTable`
    Source Catalog with minimal schema that overlaps exposureBBox

Definition at line 599 of file forcedPhotCcd.py.

599 def df2RefCat(self, dfList, exposureBBox, exposureWcs):
600 """Convert list of DataFrames to reference catalog
601
602 Concatenate list of DataFrames presumably from multiple patches and
603 downselect rows that overlap the exposureBBox using the exposureWcs.
604
605 Parameters
606 ----------
607 dfList : `list` of `pandas.DataFrame`
608 Each element containst diaObjects with ra/dec position in degrees
609 Columns 'diaObjectId', 'ra', 'dec' are expected
610 exposureBBox : `lsst.geom.Box2I`
611 Bounding box on which to select rows that overlap
612 exposureWcs : `lsst.afw.geom.SkyWcs`
613 World coordinate system to convert sky coords in ref cat to
614 pixel coords with which to compare with exposureBBox
615
616 Returns
617 -------
618 refCat : `lsst.afw.table.SourceTable`
619 Source Catalog with minimal schema that overlaps exposureBBox
620 """
621 df = pd.concat(dfList)
622 # translate ra/dec coords in dataframe to detector pixel coords
623 # to down select rows that overlap the detector bbox
624 mapping = exposureWcs.getTransform().getMapping()
625 x, y = mapping.applyInverse(np.array(df[['ra', 'dec']].values*2*np.pi/360).T)
626 inBBox = lsst.geom.Box2D(exposureBBox).contains(x, y)
627 refCat = self.df2SourceCat(df[inBBox])
628 return refCat
629
A floating-point coordinate rectangle geometry.
Definition Box.h:413

◆ df2SourceCat()

lsst.meas.base.forcedPhotCcd.df2SourceCat ( self,
df )
Create minimal schema SourceCatalog from a pandas DataFrame.

The forced measurement subtask expects this as input.

Parameters
----------
df : `pandas.DataFrame`
    DiaObjects with locations and ids.

Returns
-------
outputCatalog : `lsst.afw.table.SourceTable`
    Output catalog with minimal schema.

Definition at line 630 of file forcedPhotCcd.py.

630 def df2SourceCat(self, df):
631 """Create minimal schema SourceCatalog from a pandas DataFrame.
632
633 The forced measurement subtask expects this as input.
634
635 Parameters
636 ----------
637 df : `pandas.DataFrame`
638 DiaObjects with locations and ids.
639
640 Returns
641 -------
642 outputCatalog : `lsst.afw.table.SourceTable`
643 Output catalog with minimal schema.
644 """
646 outputCatalog = lsst.afw.table.SourceCatalog(schema)
647 outputCatalog.reserve(len(df))
648
649 for diaObjectId, ra, dec in df[['ra', 'dec']].itertuples():
650 outputRecord = outputCatalog.addNew()
651 outputRecord.setId(diaObjectId)
652 outputRecord.setCoord(lsst.geom.SpherePoint(ra, dec, lsst.geom.degrees))
653 return outputCatalog
static Schema makeMinimalSchema()
Return a minimal schema for Source tables and records.
Definition Source.h:258
Point in an unspecified spherical coordinate system.
Definition SpherePoint.h:57

◆ runQuantum()

lsst.meas.base.forcedPhotCcd.runQuantum ( self,
butlerQC,
inputRefs,
outputRefs )

Definition at line 563 of file forcedPhotCcd.py.

563 def runQuantum(self, butlerQC, inputRefs, outputRefs):
564 inputs = butlerQC.get(inputRefs)
565
566 tract = butlerQC.quantum.dataId["tract"]
567 skyMap = inputs.pop("skyMap")
568 inputs["refWcs"] = skyMap[tract].getWcs()
569
570 # Connections only exist if they are configured to be used.
571 skyCorr = inputs.pop('skyCorr', None)
572
573 inputs['exposure'] = self.prepareCalibratedExposure(
574 inputs['exposure'],
575 skyCorr=skyCorr,
576 visitSummary=inputs.pop("visitSummary", None),
577 )
578
579 self.log.info("Filtering ref cats: %s", ','.join([str(i.dataId) for i in inputs['refCat']]))
580 if inputs["exposure"].getWcs() is not None:
581 refCat = self.df2RefCat([i.get(parameters={"columns": ['diaObjectId', 'ra', 'dec']})
582 for i in inputs['refCat']],
583 inputs['exposure'].getBBox(), inputs['exposure'].getWcs())
584 inputs['refCat'] = refCat
585 # generateMeasCat does not use the refWcs.
586 inputs['measCat'], inputs['exposureId'] = self.generateMeasCat(
587 inputRefs.exposure.dataId, inputs['exposure'], inputs['refCat'], inputs['refWcs']
588 )
589 # attachFootprints only uses refWcs in ``transformed`` mode, which is not
590 # supported in the DataFrame-backed task.
591 self.attachFootprints(inputs["measCat"], inputs["refCat"], inputs["exposure"], inputs["refWcs"])
592 outputs = self.run(**inputs)
593
594 butlerQC.put(outputs, outputRefs)
595 else:
596 self.log.info("No WCS for %s. Skipping and no %s catalog will be written.",
597 butlerQC.quantum.dataId, outputRefs.measCat.datasetType.name)
598

Variable Documentation

◆ dataId

lsst.meas.base.forcedPhotCcd.dataId : `lsst.daf.butler.DataCoordinate`
mergedRefCat = None

# Step 1: Determine bounds of the exposure photometry will
# be performed on.
expWcs = exposure.getWcs()
if expWcs is None:
    self.log.info("Exposure has no WCS.  Returning None for mergedRefCat.")
else:
    expRegion = exposure.getBBox(lsst.afw.image.PARENT)
    expBBox = lsst.geom.Box2D(expRegion)
    expBoxCorners = expBBox.getCorners()
    expSkyCorners = [expWcs.pixelToSky(corner).getVector() for
                     corner in expBoxCorners]
    expPolygon = lsst.sphgeom.ConvexPolygon(expSkyCorners)

    # Step 2: Filter out reference catalog sources that are
    # not contained within the exposure boundaries, or whose
    # parents are not within the exposure boundaries.  Note
    # that within a single input refCat, the parents always
    # appear before the children.
    for refCat in refCats:
        refCat = refCat.get()
        if mergedRefCat is None:
            mergedRefCat = lsst.afw.table.SourceCatalog(refCat.table)
            containedIds = {0}  # zero as a parent ID means "this is a parent"
        for record in refCat:
            if (expPolygon.contains(record.getCoord().getVector()) and record.getParent()
                    in containedIds):
                record.setFootprint(record.getFootprint())
                mergedRefCat.append(record)
                containedIds.add(record.getId())
    if mergedRefCat is None:
        raise RuntimeError("No reference objects for forced photometry.")
    mergedRefCat.sort(lsst.afw.table.SourceTable.getParentKey())
return mergedRefCat

def generateMeasCat(self, dataId, exposure, refCat, refWcs):

Definition at line 368 of file forcedPhotCcd.py.

◆ doApplySkyCorr

lsst.meas.base.forcedPhotCcd.doApplySkyCorr

Definition at line 271 of file forcedPhotCcd.py.

◆ expId

lsst.meas.base.forcedPhotCcd.expId : `int`

Definition at line 382 of file forcedPhotCcd.py.

◆ exposure

lsst.meas.base.forcedPhotCcd.exposure : `lsst.afw.image.exposure.Exposure`
ConfigClass = ForcedPhotCcdConfig
_DefaultName = "forcedPhotCcd"
dataPrefix = ""

def __init__(self, refSchema=None, initInputs=None, **kwargs):
    super().__init__(**kwargs)

    if initInputs is not None:
        refSchema = initInputs['inputSchema'].schema

    if refSchema is None:
        raise ValueError("No reference schema provided.")

    self.makeSubtask("measurement", refSchema=refSchema)
    # It is necessary to get the schema internal to the forced measurement
    # task until such a time that the schema is not owned by the
    # measurement task, but is passed in by an external caller.
    if self.config.doApCorr:
        self.makeSubtask("applyApCorr", schema=self.measurement.schema)
    self.makeSubtask('catalogCalculation', schema=self.measurement.schema)
    self.outputSchema = lsst.afw.table.SourceCatalog(self.measurement.schema)

def runQuantum(self, butlerQC, inputRefs, outputRefs):
    inputs = butlerQC.get(inputRefs)

    tract = butlerQC.quantum.dataId['tract']
    skyMap = inputs.pop('skyMap')
    inputs['refWcs'] = skyMap[tract].getWcs()

    # Connections only exist if they are configured to be used.
    skyCorr = inputs.pop('skyCorr', None)

    inputs['exposure'] = self.prepareCalibratedExposure(
        inputs['exposure'],
        skyCorr=skyCorr,
        visitSummary=inputs.pop("visitSummary", None),
    )

    inputs['refCat'] = self.mergeAndFilterReferences(inputs['exposure'], inputs['refCat'],
                                                     inputs['refWcs'])

    if inputs['refCat'] is None:
        self.log.info("No WCS for exposure %s.  No %s catalog will be written.",
                      butlerQC.quantum.dataId, outputRefs.measCat.datasetType.name)
    else:
        inputs['measCat'], inputs['exposureId'] = self.generateMeasCat(inputRefs.exposure.dataId,
                                                                       inputs['exposure'],
                                                                       inputs['refCat'], inputs['refWcs'])
        self.attachFootprints(inputs['measCat'], inputs['refCat'], inputs['exposure'], inputs['refWcs'])
        outputs = self.run(**inputs)
        butlerQC.put(outputs, outputRefs)

def prepareCalibratedExposure(self, exposure, skyCorr=None, visitSummary=None):
detectorId = exposure.getInfo().getDetector().getId()

if visitSummary is not None:
    row = visitSummary.find(detectorId)
    if row is None:
        raise RuntimeError(f"Detector id {detectorId} not found in visitSummary.")
    if (photoCalib := row.getPhotoCalib()) is not None:
        exposure.setPhotoCalib(photoCalib)
    if (skyWcs := row.getWcs()) is not None:
        exposure.setWcs(skyWcs)
    if (psf := row.getPsf()) is not None:
        exposure.setPsf(psf)
    if (apCorrMap := row.getApCorrMap()) is not None:
        exposure.info.setApCorrMap(apCorrMap)

if skyCorr is not None:
    exposure.maskedImage -= skyCorr.getImage()

return exposure

def mergeAndFilterReferences(self, exposure, refCats, refWcs):

Definition at line 268 of file forcedPhotCcd.py.

◆ exposureId

lsst.meas.base.forcedPhotCcd.exposureId : `int`

Definition at line 404 of file forcedPhotCcd.py.

◆ footprintSource

lsst.meas.base.forcedPhotCcd.footprintSource

Definition at line 168 of file forcedPhotCcd.py.

◆ initInputs

lsst.meas.base.forcedPhotCcd.initInputs : `dict`

Definition at line 203 of file forcedPhotCcd.py.

◆ measCat

lsst.meas.base.forcedPhotCcd.measCat : `lsst.afw.table.SourceCatalog`
id_generator = self.config.idGenerator.apply(dataId)
measCat = self.measurement.generateMeasCat(exposure, refCat, refWcs,
                                           idFactory=id_generator.make_table_id_factory())
return measCat, id_generator.catalog_id

def run(self, measCat, exposure, refCat, refWcs, exposureId=None):

Definition at line 380 of file forcedPhotCcd.py.

◆ outputSchema

lsst.meas.base.forcedPhotCcd.outputSchema

Definition at line 561 of file forcedPhotCcd.py.

◆ refCat

lsst.meas.base.forcedPhotCcd.refCat : `lsst.afw.table.SourceCatalog`

Definition at line 372 of file forcedPhotCcd.py.

◆ refCats

sequence lsst.meas.base.forcedPhotCcd.refCats of `lsst.daf.butler.DeferredDatasetHandle`

Definition at line 310 of file forcedPhotCcd.py.

◆ refSchema

lsst.meas.base.forcedPhotCcd.refSchema : `lsst.afw.table.Schema`, optional

Definition at line 199 of file forcedPhotCcd.py.

◆ refSources

lsst.meas.base.forcedPhotCcd.refSources : `lsst.afw.table.SourceCatalog`

Definition at line 318 of file forcedPhotCcd.py.

◆ refWcs

lsst.meas.base.forcedPhotCcd.refWcs : `lsst.afw.image.SkyWcs`

Definition at line 313 of file forcedPhotCcd.py.

◆ result

lsst.meas.base.forcedPhotCcd.result : `lsst.pipe.base.Struct`

Definition at line 410 of file forcedPhotCcd.py.

◆ schema

lsst.meas.base.forcedPhotCcd.schema

Definition at line 560 of file forcedPhotCcd.py.

◆ skyCorr

lsst.meas.base.forcedPhotCcd.skyCorr : `lsst.afw.math.backgroundList`, optional

Definition at line 270 of file forcedPhotCcd.py.

◆ visitSummary

lsst.meas.base.forcedPhotCcd.visitSummary : `lsst.afw.table.ExposureCatalog`, optional

Definition at line 272 of file forcedPhotCcd.py.