24 from lsstDebug
import getDebugFrame
27 from lsst.pipe.base import (InitInputDatasetField, InitOutputDatasetField, InputDatasetField,
28 OutputDatasetField, PipelineTaskConfig, PipelineTask)
30 from lsst.meas.astrom import AstrometryTask, displayAstrometry, denormalizeMatches
37 from lsst.meas.base import (SingleFrameMeasurementTask, ApplyApCorrTask,
38 CatalogCalculationTask)
40 from .fakes
import BaseFakeSourcesTask
41 from .photoCal
import PhotoCalTask
43 __all__ = [
"CalibrateConfig",
"CalibrateTask"]
47 """Config for CalibrateTask""" 48 doWrite = pexConfig.Field(
51 doc=
"Save calibration results?",
53 doWriteHeavyFootprintsInSources = pexConfig.Field(
56 doc=
"Include HeavyFootprint data in source table? If false then heavy " 57 "footprints are saved as normal footprints, which saves some space" 59 doWriteMatches = pexConfig.Field(
62 doc=
"Write reference matches (ignored if doWrite false)?",
64 doWriteMatchesDenormalized = pexConfig.Field(
67 doc=(
"Write reference matches in denormalized format? " 68 "This format uses more disk space, but is more convenient to " 69 "read. Ignored if doWriteMatches=False or doWrite=False."),
71 doAstrometry = pexConfig.Field(
74 doc=
"Perform astrometric calibration?",
76 astromRefObjLoader = pexConfig.ConfigurableField(
77 target=LoadAstrometryNetObjectsTask,
78 doc=
"reference object loader for astrometric calibration",
80 photoRefObjLoader = pexConfig.ConfigurableField(
81 target=LoadAstrometryNetObjectsTask,
82 doc=
"reference object loader for photometric calibration",
84 astrometry = pexConfig.ConfigurableField(
85 target=AstrometryTask,
86 doc=
"Perform astrometric calibration to refine the WCS",
88 requireAstrometry = pexConfig.Field(
91 doc=(
"Raise an exception if astrometry fails? Ignored if doAstrometry " 94 doPhotoCal = pexConfig.Field(
97 doc=
"Perform phometric calibration?",
99 requirePhotoCal = pexConfig.Field(
102 doc=(
"Raise an exception if photoCal fails? Ignored if doPhotoCal " 105 photoCal = pexConfig.ConfigurableField(
107 doc=
"Perform photometric calibration",
109 icSourceFieldsToCopy = pexConfig.ListField(
111 default=(
"calib_psf_candidate",
"calib_psf_used",
"calib_psf_reserved"),
112 doc=(
"Fields to copy from the icSource catalog to the output catalog " 113 "for matching sources Any missing fields will trigger a " 114 "RuntimeError exception. Ignored if icSourceCat is not provided.")
116 matchRadiusPix = pexConfig.Field(
119 doc=(
"Match radius for matching icSourceCat objects to sourceCat " 122 checkUnitsParseStrict = pexConfig.Field(
123 doc=(
"Strictness of Astropy unit compatibility check, can be 'raise', " 124 "'warn' or 'silent'"),
128 detection = pexConfig.ConfigurableField(
129 target=SourceDetectionTask,
132 doDeblend = pexConfig.Field(
135 doc=
"Run deblender input exposure" 137 deblend = pexConfig.ConfigurableField(
138 target=SourceDeblendTask,
139 doc=
"Split blended sources into their components" 141 measurement = pexConfig.ConfigurableField(
142 target=SingleFrameMeasurementTask,
143 doc=
"Measure sources" 145 doApCorr = pexConfig.Field(
148 doc=
"Run subtask to apply aperture correction" 150 applyApCorr = pexConfig.ConfigurableField(
151 target=ApplyApCorrTask,
152 doc=
"Subtask to apply aperture corrections" 157 catalogCalculation = pexConfig.ConfigurableField(
158 target=CatalogCalculationTask,
159 doc=
"Subtask to run catalogCalculation plugins on catalog" 161 doInsertFakes = pexConfig.Field(
164 doc=
"Run fake sources injection task" 166 insertFakes = pexConfig.ConfigurableField(
167 target=BaseFakeSourcesTask,
168 doc=
"Injection of fake sources for testing purposes (must be " 172 doc=
"Schema produced by characterize image task, used to initialize this task",
174 storageClass=
"SourceCatalog",
177 doc=
"Schema after CalibrateTask has been initialized",
179 storageClass=
"SourceCatalog",
182 doc=
"Input image to calibrate",
184 storageClass=
"ExposureF",
185 dimensions=(
"Instrument",
"Visit",
"Detector"),
189 doc=
"Backgrounds determined by characterize task",
190 name=
"icExpBackground",
191 storageClass=
"Background",
192 dimensions=(
"Instrument",
"Visit",
"Detector"),
196 doc=
"Source catalog created by characterize task",
198 storageClass=
"SourceCatalog",
199 dimensions=(
"Instrument",
"Visit",
"Detector"),
203 doc=
"Reference catalog to use for astrometry",
205 storageClass=
"SimpleCatalog",
206 dimensions=(
"SkyPix",),
210 doc=
"Reference catalog to use for photometric calibration",
212 storageClass=
"SimpleCatalog",
213 dimensions=(
"SkyPix",),
217 doc=
"Exposure after running calibration task",
219 storageClass=
"ExposureF",
220 dimensions=(
"Instrument",
"Visit",
"Detector"),
224 doc=
"Source catalog produced in calibrate task",
226 storageClass=
"SourceCatalog",
227 dimensions=(
"Instrument",
"Visit",
"Detector"),
231 doc=
"Background models estimated in calibration task",
232 name=
"calexpBackground",
233 storageClass=
"Background",
234 dimensions=(
"Instrument",
"Visit",
"Detector"),
238 doc=
"Source/refObj matches from the astrometry solver",
240 storageClass=
"Catalog",
241 dimensions=(
"Instrument",
"Visit",
"Detector"),
245 doc=
"Denormalized matches from astrometry solver",
247 storageClass=
"Catalog",
248 dimensions=(
"Instrument",
"Visit",
"Detector"),
254 self.quantum.dimensions = (
"Instrument",
"Visit",
"Detector")
266 r"""!Calibrate an exposure: measure sources and perform astrometric and 267 photometric calibration 269 @anchor CalibrateTask_ 271 @section pipe_tasks_calibrate_Contents Contents 273 - @ref pipe_tasks_calibrate_Purpose 274 - @ref pipe_tasks_calibrate_Initialize 275 - @ref pipe_tasks_calibrate_IO 276 - @ref pipe_tasks_calibrate_Config 277 - @ref pipe_tasks_calibrate_Metadata 278 - @ref pipe_tasks_calibrate_Debug 281 @section pipe_tasks_calibrate_Purpose Description 283 Given an exposure with a good PSF model and aperture correction map 284 (e.g. as provided by @ref CharacterizeImageTask), perform the following 286 - Run detection and measurement 287 - Run astrometry subtask to fit an improved WCS 288 - Run photoCal subtask to fit the exposure's photometric zero-point 290 @section pipe_tasks_calibrate_Initialize Task initialisation 292 @copydoc \_\_init\_\_ 294 @section pipe_tasks_calibrate_IO Invoking the Task 296 If you want this task to unpersist inputs or persist outputs, then call 297 the `runDataRef` method (a wrapper around the `run` method). 299 If you already have the inputs unpersisted and do not want to persist the 300 output then it is more direct to call the `run` method: 302 @section pipe_tasks_calibrate_Config Configuration parameters 304 See @ref CalibrateConfig 306 @section pipe_tasks_calibrate_Metadata Quantities set in exposure Metadata 310 <dt>MAGZERO_RMS <dd>MAGZERO's RMS == sigma reported by photoCal task 311 <dt>MAGZERO_NOBJ <dd>Number of stars used == ngood reported by photoCal 313 <dt>COLORTERM1 <dd>?? (always 0.0) 314 <dt>COLORTERM2 <dd>?? (always 0.0) 315 <dt>COLORTERM3 <dd>?? (always 0.0) 318 @section pipe_tasks_calibrate_Debug Debug variables 320 The @link lsst.pipe.base.cmdLineTask.CmdLineTask command line task@endlink 321 interface supports a flag 322 `--debug` to import `debug.py` from your `$PYTHONPATH`; see @ref baseDebug 323 for more about `debug.py`. 325 CalibrateTask has a debug dictionary containing one key: 328 <dd>frame (an int; <= 0 to not display) in which to display the exposure, 329 sources and matches. See @ref lsst.meas.astrom.displayAstrometry for 330 the meaning of the various symbols. 333 For example, put something like: 337 di = lsstDebug.getInfo(name) # N.b. lsstDebug.Info(name) would 338 # call us recursively 339 if name == "lsst.pipe.tasks.calibrate": 346 lsstDebug.Info = DebugInfo 348 into your `debug.py` file and run `calibrateTask.py` with the `--debug` 351 Some subtasks may have their own debug variables; see individual Task 358 ConfigClass = CalibrateConfig
359 _DefaultName =
"calibrate" 360 RunnerClass = pipeBase.ButlerInitializedTaskRunner
362 def __init__(self, butler=None, astromRefObjLoader=None,
363 photoRefObjLoader=None, icSourceSchema=None,
364 initInputs=None, **kwargs):
365 """!Construct a CalibrateTask 367 @param[in] butler The butler is passed to the refObjLoader constructor 368 in case it is needed. Ignored if the refObjLoader argument 369 provides a loader directly. 370 @param[in] astromRefObjLoader An instance of LoadReferenceObjectsTasks 371 that supplies an external reference catalog for astrometric 372 calibration. May be None if the desired loader can be constructed 373 from the butler argument or all steps requiring a reference catalog 375 @param[in] photoRefObjLoader An instance of LoadReferenceObjectsTasks 376 that supplies an external reference catalog for photometric 377 calibration. May be None if the desired loader can be constructed 378 from the butler argument or all steps requiring a reference catalog 380 @param[in] icSourceSchema schema for icSource catalog, or None. 381 Schema values specified in config.icSourceFieldsToCopy will be 382 taken from this schema. If set to None, no values will be 383 propagated from the icSourceCatalog 384 @param[in,out] kwargs other keyword arguments for 385 lsst.pipe.base.CmdLineTask 389 if icSourceSchema
is None and butler
is not None:
391 icSourceSchema = butler.get(
"icSrc_schema", immediate=
True).schema
393 if icSourceSchema
is None and butler
is None and initInputs
is not None:
394 icSourceSchema = initInputs[
'icSourceSchema'].schema
396 if icSourceSchema
is not None:
399 minimumSchema = afwTable.SourceTable.makeMinimalSchema()
400 self.
schemaMapper.addMinimalSchema(minimumSchema,
False)
409 "Source was detected as an icSource"))
410 missingFieldNames = []
411 for fieldName
in self.config.icSourceFieldsToCopy:
413 schemaItem = icSourceSchema.find(fieldName)
415 missingFieldNames.append(fieldName)
420 if missingFieldNames:
421 raise RuntimeError(
"isSourceCat is missing fields {} " 422 "specified in icSourceFieldsToCopy" 423 .
format(missingFieldNames))
430 self.
schema = afwTable.SourceTable.makeMinimalSchema()
431 self.makeSubtask(
'detection', schema=self.
schema)
438 if self.config.doInsertFakes:
439 self.makeSubtask(
"insertFakes")
441 if self.config.doDeblend:
442 self.makeSubtask(
"deblend", schema=self.
schema)
443 self.makeSubtask(
'measurement', schema=self.
schema,
445 if self.config.doApCorr:
446 self.makeSubtask(
'applyApCorr', schema=self.
schema)
447 self.makeSubtask(
'catalogCalculation', schema=self.
schema)
449 if self.config.doAstrometry:
450 if astromRefObjLoader
is None and butler
is not None:
451 self.makeSubtask(
'astromRefObjLoader', butler=butler)
452 astromRefObjLoader = self.astromRefObjLoader
454 self.makeSubtask(
"astrometry", refObjLoader=astromRefObjLoader,
456 if self.config.doPhotoCal:
457 if photoRefObjLoader
is None and butler
is not None:
458 self.makeSubtask(
'photoRefObjLoader', butler=butler)
459 photoRefObjLoader = self.photoRefObjLoader
460 self.
pixelMargin = photoRefObjLoader.config.pixelMargin
467 if initInputs
is not None and photoRefObjLoader
is LoadAstrometryNetObjectsTask:
468 raise RuntimeError(
"Astrometry Net tasks are not compatible with gen 3 middleware")
469 self.makeSubtask(
"photoCal", refObjLoader=photoRefObjLoader,
475 self.
schema.checkUnits(parse_strict=self.config.checkUnitsParseStrict)
480 return {
'outputSchema': sourceCatSchema}
485 if config.doWriteMatches
is False:
486 outputTypesDict.pop(
"matches")
487 if config.doWriteMatchesDenormalized
is False:
488 outputTypesDict.pop(
"matchesDenormalized")
489 return outputTypesDict
492 def runDataRef(self, dataRef, exposure=None, background=None, icSourceCat=None,
494 """!Calibrate an exposure, optionally unpersisting inputs and 497 This is a wrapper around the `run` method that unpersists inputs 498 (if `doUnpersist` true) and persists outputs (if `config.doWrite` true) 500 @param[in] dataRef butler data reference corresponding to a science 502 @param[in,out] exposure characterized exposure (an 503 lsst.afw.image.ExposureF or similar), or None to unpersist existing 504 icExp and icBackground. See `run` method for details of what is 506 @param[in,out] background initial model of background already 507 subtracted from exposure (an lsst.afw.math.BackgroundList). May be 508 None if no background has been subtracted, though that is unusual 509 for calibration. A refined background model is output. Ignored if 511 @param[in] icSourceCat catalog from which to copy the fields specified 512 by icSourceKeys, or None; 513 @param[in] doUnpersist unpersist data: 514 - if True, exposure, background and icSourceCat are read from 515 dataRef and those three arguments must all be None; 516 - if False the exposure must be provided; background and 517 icSourceCat are optional. True is intended for running as a 518 command-line task, False for running as a subtask 519 @return same data as the calibrate method 521 self.log.
info(
"Processing %s" % (dataRef.dataId))
524 if any(item
is not None for item
in (exposure, background,
526 raise RuntimeError(
"doUnpersist true; exposure, background " 527 "and icSourceCat must all be None")
528 exposure = dataRef.get(
"icExp", immediate=
True)
529 background = dataRef.get(
"icExpBackground", immediate=
True)
530 icSourceCat = dataRef.get(
"icSrc", immediate=
True)
531 elif exposure
is None:
532 raise RuntimeError(
"doUnpersist false; exposure must be provided")
534 exposureIdInfo = dataRef.get(
"expIdInfo")
538 exposureIdInfo=exposureIdInfo,
539 background=background,
540 icSourceCat=icSourceCat,
543 if self.config.doWrite:
546 exposure=calRes.exposure,
547 background=calRes.background,
548 sourceCat=calRes.sourceCat,
549 astromMatches=calRes.astromMatches,
550 matchMeta=calRes.matchMeta,
556 expId, expBits = butler.registry.packDataId(
"VisitDetector",
557 inputDataIds[
'exposure'],
561 if self.config.doAstrometry:
564 config=self.config.astromRefObjLoader,
567 self.astrometry.setRefObjLoader(refObjLoader)
569 if self.config.doPhotoCal:
572 self.config.photoRefObjLoader,
574 self.
pixelMargin = photoRefObjLoader.config.pixelMargin
575 self.photoCal.match.setRefObjLoader(photoRefObjLoader)
577 results = self.
run(**inputData)
579 if self.config.doWriteMatches:
581 normalizedMatches.table.setMetadata(results.matchMeta)
582 if self.config.doWriteMatchesDenormalized:
584 results.matchesDenormalized = denormMatches
585 results.matches = normalizedMatches
588 def run(self, exposure, exposureIdInfo=None, background=None,
590 """!Calibrate an exposure (science image or coadd) 592 @param[in,out] exposure exposure to calibrate (an 593 lsst.afw.image.ExposureF or similar); 598 - MaskedImage has background subtracted 600 - Calib zero-point is set 601 @param[in] exposureIdInfo ID info for exposure (an 602 lsst.obs.base.ExposureIdInfo) If not provided, returned 603 SourceCatalog IDs will not be globally unique. 604 @param[in,out] background background model already subtracted from 605 exposure (an lsst.afw.math.BackgroundList). May be None if no 606 background has been subtracted, though that is unusual for 607 calibration. A refined background model is output. 608 @param[in] icSourceCat A SourceCatalog from CharacterizeImageTask 609 from which we can copy some fields. 611 @return pipe_base Struct containing these fields: 612 - exposure calibrate science exposure with refined WCS and Calib 613 - background model of background subtracted from exposure (an 614 lsst.afw.math.BackgroundList) 615 - sourceCat catalog of measured sources 616 - astromMatches list of source/refObj matches from the astrometry 620 if exposureIdInfo
is None:
623 if background
is None:
625 sourceIdFactory = IdFactory.makeSource(exposureIdInfo.expId,
626 exposureIdInfo.unusedBits)
627 table = SourceTable.make(self.
schema, sourceIdFactory)
630 detRes = self.detection.
run(table=table, exposure=exposure,
632 sourceCat = detRes.sources
633 if detRes.fpSets.background:
634 for bg
in detRes.fpSets.background:
635 background.append(bg)
636 if self.config.doDeblend:
637 self.deblend.
run(exposure=exposure, sources=sourceCat)
638 self.measurement.
run(
641 exposureId=exposureIdInfo.expId
643 if self.config.doApCorr:
644 self.applyApCorr.
run(
646 apCorrMap=exposure.getInfo().getApCorrMap()
648 self.catalogCalculation.
run(sourceCat)
650 if icSourceCat
is not None and \
651 len(self.config.icSourceFieldsToCopy) > 0:
659 if not sourceCat.isContiguous():
660 sourceCat = sourceCat.copy(deep=
True)
666 if self.config.doAstrometry:
668 astromRes = self.astrometry.
run(
672 astromMatches = astromRes.matches
673 matchMeta = astromRes.matchMeta
674 except Exception
as e:
675 if self.config.requireAstrometry:
677 self.log.
warn(
"Unable to perform astrometric calibration " 678 "(%s): attempting to proceed" % e)
681 if self.config.doPhotoCal:
683 photoRes = self.photoCal.
run(exposure, sourceCat=sourceCat, expId=exposureIdInfo.expId)
684 exposure.getCalib().setFluxMag0(photoRes.calib.getFluxMag0())
685 self.log.
info(
"Photometric zero-point: %f" %
686 photoRes.calib.getMagnitude(1.0))
687 self.
setMetadata(exposure=exposure, photoRes=photoRes)
688 except Exception
as e:
689 if self.config.requirePhotoCal:
691 self.log.
warn(
"Unable to perform photometric calibration " 692 "(%s): attempting to proceed" % e)
695 if self.config.doInsertFakes:
696 self.insertFakes.
run(exposure, background=background)
698 table = SourceTable.make(self.
schema, sourceIdFactory)
701 detRes = self.detection.
run(table=table, exposure=exposure,
703 sourceCat = detRes.sources
704 if detRes.fpSets.background:
705 for bg
in detRes.fpSets.background:
706 background.append(bg)
707 if self.config.doDeblend:
708 self.deblend.
run(exposure=exposure, sources=sourceCat)
709 self.measurement.
run(
712 exposureId=exposureIdInfo.expId
714 if self.config.doApCorr:
715 self.applyApCorr.
run(
717 apCorrMap=exposure.getInfo().getApCorrMap()
719 self.catalogCalculation.
run(sourceCat)
721 if icSourceCat
is not None and \
722 len(self.config.icSourceFieldsToCopy) > 0:
731 matches=astromMatches,
736 return pipeBase.Struct(
738 background=background,
740 astromMatches=astromMatches,
744 outputExposure=exposure,
746 outputBackground=background,
749 def writeOutputs(self, dataRef, exposure, background, sourceCat,
750 astromMatches, matchMeta):
751 """Write output data to the output repository 753 @param[in] dataRef butler data reference corresponding to a science 755 @param[in] exposure exposure to write 756 @param[in] background background model for exposure 757 @param[in] sourceCat catalog of measured sources 758 @param[in] astromMatches list of source/refObj matches from the 761 dataRef.put(sourceCat,
"src")
762 if self.config.doWriteMatches
and astromMatches
is not None:
764 normalizedMatches.table.setMetadata(matchMeta)
765 dataRef.put(normalizedMatches,
"srcMatch")
766 if self.config.doWriteMatchesDenormalized:
768 dataRef.put(denormMatches,
"srcMatchFull")
769 dataRef.put(exposure,
"calexp")
770 dataRef.put(background,
"calexpBackground")
773 """Return a dict of empty catalogs for each catalog dataset produced 778 return {
"src": sourceCat}
781 """!Set task and exposure metadata 783 Logs a warning and continues if needed data is missing. 785 @param[in,out] exposure exposure whose metadata is to be set 786 @param[in] photoRes results of running photoCal; if None then it was 794 exposureTime = exposure.getInfo().getVisitInfo().getExposureTime()
795 magZero = photoRes.zp - 2.5*math.log10(exposureTime)
796 self.metadata.
set(
'MAGZERO', magZero)
798 self.log.
warn(
"Could not set normalized MAGZERO in header: no " 802 metadata = exposure.getMetadata()
803 metadata.set(
'MAGZERO_RMS', photoRes.sigma)
804 metadata.set(
'MAGZERO_NOBJ', photoRes.ngood)
805 metadata.set(
'COLORTERM1', 0.0)
806 metadata.set(
'COLORTERM2', 0.0)
807 metadata.set(
'COLORTERM3', 0.0)
808 except Exception
as e:
809 self.log.
warn(
"Could not set exposure metadata: %s" % (e,))
812 """!Match sources in icSourceCat and sourceCat and copy the specified fields 814 @param[in] icSourceCat catalog from which to copy fields 815 @param[in,out] sourceCat catalog to which to copy fields 817 The fields copied are those specified by `config.icSourceFieldsToCopy` 818 that actually exist in the schema. This was set up by the constructor 819 using self.schemaMapper. 822 raise RuntimeError(
"To copy icSource fields you must specify " 823 "icSourceSchema nd icSourceKeys when " 824 "constructing this task")
825 if icSourceCat
is None or sourceCat
is None:
826 raise RuntimeError(
"icSourceCat and sourceCat must both be " 828 if len(self.config.icSourceFieldsToCopy) == 0:
829 self.log.
warn(
"copyIcSourceFields doing nothing because " 830 "icSourceFieldsToCopy is empty")
834 mc.findOnlyClosest =
False 836 self.config.matchRadiusPix, mc)
837 if self.config.doDeblend:
838 deblendKey = sourceCat.schema[
"deblend_nChild"].asKey()
840 matches = [m
for m
in matches
if m[1].get(deblendKey) == 0]
847 for m0, m1, d
in matches:
849 match = bestMatches.get(id0)
850 if match
is None or d <= match[2]:
851 bestMatches[id0] = (m0, m1, d)
852 matches =
list(bestMatches.values())
857 numMatches = len(matches)
858 numUniqueSources = len(
set(m[1].getId()
for m
in matches))
859 if numUniqueSources != numMatches:
860 self.log.
warn(
"{} icSourceCat sources matched only {} sourceCat " 861 "sources".
format(numMatches, numUniqueSources))
863 self.log.
info(
"Copying flags from icSourceCat to sourceCat for " 864 "%s sources" % (numMatches,))
868 for icSrc, src, d
in matches:
874 icSrcFootprint = icSrc.getFootprint()
876 icSrc.setFootprint(src.getFootprint())
879 icSrc.setFootprint(icSrcFootprint)
def copyIcSourceFields(self, icSourceCat, sourceCat)
Match sources in icSourceCat and sourceCat and copy the specified fields.
def __init__(self, butler=None, astromRefObjLoader=None, photoRefObjLoader=None, icSourceSchema=None, initInputs=None, kwargs)
Construct a CalibrateTask.
def InitOutputDatasetField
def run(self, exposure, exposureIdInfo=None, background=None, icSourceCat=None)
Calibrate an exposure (science image or coadd)
Class for storing ordered metadata with comments.
A mapping between the keys of two Schemas, used to copy data between them.
def denormalizeMatches(matches, matchMeta=None)
Fit spatial kernel using approximate fluxes for candidates, and solving a linear system of equations...
daf::base::PropertySet * set
def writeOutputs(self, dataRef, exposure, background, sourceCat, astromMatches, matchMeta)
bool any(CoordinateExpr< N > const &expr) noexcept
Return true if any elements are true.
def adaptArgsAndRun(self, inputData, inputDataIds, outputDataIds, butler)
Pass parameters to algorithms that match list of sources.
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
template BaseCatalog packMatches(SourceMatchVector const &)
A description of a field in a table.
def setMetadata(self, exposure, photoRes=None)
Set task and exposure metadata.
def displayAstrometry(refCat=None, sourceCat=None, distortedCentroidKey=None, bbox=None, exposure=None, matches=None, frame=1, title="", pause=True)
def getDebugFrame(debugDisplay, name)
def getSchemaCatalogs(self)
def getInitOutputDatasets(self)
def InitInputDatasetField
SourceMatchVector matchXy(SourceCatalog const &cat, double radius, bool symmetric)
Compute all tuples (s1,s2,d) where s1 != s2, s1 and s2 both belong to cat, and d, the distance betwee...
def getOutputDatasetTypes(cls, config)
def runDataRef(self, dataRef, exposure=None, background=None, icSourceCat=None, doUnpersist=True)
Calibrate an exposure, optionally unpersisting inputs and persisting outputs.
daf::base::PropertyList * list
Calibrate an exposure: measure sources and perform astrometric and photometric calibration.