13 from lsst.verify
import Job, Measurement
18 from .dataIds
import PerTractCcdDataIdContainer
23 __all__ = [
"JointcalConfig",
"JointcalRunner",
"JointcalTask"]
25 Photometry = collections.namedtuple(
'Photometry', (
'fit',
'model'))
26 Astrometry = collections.namedtuple(
'Astrometry', (
'fit',
'model',
'sky_to_tan_projection'))
31 meas = Measurement(job.metrics[name], value)
32 job.measurements.insert(meas)
36 """Subclass of TaskRunner for jointcalTask 38 jointcalTask.run() takes a number of arguments, one of which is a list of dataRefs 39 extracted from the command line (whereas most CmdLineTasks' run methods take 40 single dataRef, are are called repeatedly). This class transforms the processed 41 arguments generated by the ArgumentParser into the arguments expected by 44 See pipeBase.TaskRunner for more information. 50 Return a list of tuples per tract, each containing (dataRefs, kwargs). 52 Jointcal operates on lists of dataRefs simultaneously. 54 kwargs[
'profile_jointcal'] = parsedCmd.profile_jointcal
55 kwargs[
'butler'] = parsedCmd.butler
59 for ref
in parsedCmd.id.refList:
60 refListDict.setdefault(ref.dataId[
"tract"], []).append(ref)
62 result = [(refListDict[tract], kwargs)
for tract
in sorted(refListDict.keys())]
70 Arguments for Task.run() 75 if self.doReturnResults is False: 77 - ``exitStatus``: 0 if the task completed successfully, 1 otherwise. 79 if self.doReturnResults is True: 81 - ``result``: the result of calling jointcal.run() 82 - ``exitStatus``: 0 if the task completed successfully, 1 otherwise. 87 dataRefList, kwargs = args
88 butler = kwargs.pop(
'butler')
89 task = self.TaskClass(config=self.config, log=self.log, butler=butler)
92 result = task.run(dataRefList, **kwargs)
93 exitStatus = result.exitStatus
94 job_path = butler.get(
'verify_job_filename')
95 result.job.write(job_path[0])
96 except Exception
as e:
101 eName = type(e).__name__
102 tract = dataRefList[0].dataId[
'tract']
103 task.log.fatal(
"Failed processing tract %s, %s: %s", tract, eName, e)
105 if self.doReturnResults:
106 return pipeBase.Struct(result=result, exitStatus=exitStatus)
108 return pipeBase.Struct(exitStatus=exitStatus)
112 """Config for JointcalTask""" 114 doAstrometry = pexConfig.Field(
115 doc=
"Fit astrometry and write the fitted result.",
119 doPhotometry = pexConfig.Field(
120 doc=
"Fit photometry and write the fitted result.",
124 coaddName = pexConfig.Field(
125 doc=
"Type of coadd, typically deep or goodSeeing",
129 posError = pexConfig.Field(
130 doc=
"Constant term for error on position (in pixel unit)",
135 matchCut = pexConfig.Field(
136 doc=
"Matching radius between fitted and reference stars (arcseconds)",
140 minMeasurements = pexConfig.Field(
141 doc=
"Minimum number of associated measured stars for a fitted star to be included in the fit",
145 minMeasuredStarsPerCcd = pexConfig.Field(
146 doc=
"Minimum number of measuredStars per ccdImage before printing warnings",
150 minRefStarsPerCcd = pexConfig.Field(
151 doc=
"Minimum number of measuredStars per ccdImage before printing warnings",
155 astrometrySimpleOrder = pexConfig.Field(
156 doc=
"Polynomial order for fitting the simple astrometry model.",
160 astrometryChipOrder = pexConfig.Field(
161 doc=
"Order of the per-chip transform for the constrained astrometry model.",
165 astrometryVisitOrder = pexConfig.Field(
166 doc=
"Order of the per-visit transform for the constrained astrometry model.",
170 useInputWcs = pexConfig.Field(
171 doc=
"Use the input calexp WCSs to initialize a SimpleAstrometryModel.",
175 astrometryModel = pexConfig.ChoiceField(
176 doc=
"Type of model to fit to astrometry",
179 allowed={
"simple":
"One polynomial per ccd",
180 "constrained":
"One polynomial per ccd, and one polynomial per visit"}
182 photometryModel = pexConfig.ChoiceField(
183 doc=
"Type of model to fit to photometry",
186 allowed={
"simple":
"One constant zeropoint per ccd and visit",
187 "constrained":
"Constrained zeropoint per ccd, and one polynomial per visit"}
189 photometryVisitOrder = pexConfig.Field(
190 doc=
"Order of the per-visit polynomial transform for the constrained photometry model.",
194 photometryDoRankUpdate = pexConfig.Field(
195 doc=
"Do the rank update step during minimization. " 196 "Skipping this can help deal with models that are too non-linear.",
200 astrometryDoRankUpdate = pexConfig.Field(
201 doc=
"Do the rank update step during minimization (should not change the astrometry fit). " 202 "Skipping this can help deal with models that are too non-linear.",
206 outlierRejectSigma = pexConfig.Field(
207 doc=
"How many sigma to reject outliers at during minimization.",
211 maxPhotometrySteps = pexConfig.Field(
212 doc=
"Maximum number of minimize iterations to take when fitting photometry.",
216 maxAstrometrySteps = pexConfig.Field(
217 doc=
"Maximum number of minimize iterations to take when fitting photometry.",
221 astrometryRefObjLoader = pexConfig.ConfigurableField(
222 target=LoadIndexedReferenceObjectsTask,
223 doc=
"Reference object loader for astrometric fit",
225 photometryRefObjLoader = pexConfig.ConfigurableField(
226 target=LoadIndexedReferenceObjectsTask,
227 doc=
"Reference object loader for photometric fit",
229 sourceSelector = sourceSelectorRegistry.makeField(
230 doc=
"How to select sources for cross-matching",
233 writeChi2ContributionFiles = pexConfig.Field(
235 doc=
"Write initial/final fit files containing the contributions to chi2.",
238 sourceFluxType = pexConfig.Field(
240 doc=
"Source flux field to use in source selection and to get fluxes from the catalog.",
246 sourceSelector.setDefaults()
248 sourceSelector.badFlags.extend([
"slot_Shape_flag"])
254 """Jointly astrometrically and photometrically calibrate a group of images.""" 256 ConfigClass = JointcalConfig
257 RunnerClass = JointcalRunner
258 _DefaultName =
"jointcal" 260 def __init__(self, butler=None, profile_jointcal=False, **kwargs):
262 Instantiate a JointcalTask. 266 butler : lsst.daf.persistence.Butler 267 The butler is passed to the refObjLoader constructor in case it is 268 needed. Ignored if the refObjLoader argument provides a loader directly. 269 Used to initialize the astrometry and photometry refObjLoaders. 270 profile_jointcal : bool 271 set to True to profile different stages of this jointcal run. 273 pipeBase.CmdLineTask.__init__(self, **kwargs)
275 self.makeSubtask(
"sourceSelector")
276 if self.config.doAstrometry:
277 self.makeSubtask(
'astrometryRefObjLoader', butler=butler)
278 if self.config.doPhotometry:
279 self.makeSubtask(
'photometryRefObjLoader', butler=butler)
282 self.
job = Job.load_metrics_package(subset=
'jointcal')
286 def _getConfigName(self):
289 def _getMetadataName(self):
293 def _makeArgumentParser(cls):
294 """Create an argument parser""" 296 parser.add_argument(
"--profile_jointcal", default=
False, action=
"store_true",
297 help=
"Profile steps of jointcal separately.")
298 parser.add_id_argument(
"--id",
"calexp", help=
"data ID, e.g. --id visit=6789 ccd=0..9",
299 ContainerClass=PerTractCcdDataIdContainer)
302 def _build_ccdImage(self, dataRef, associations, jointcalControl):
304 Extract the necessary things from this dataRef to add a new ccdImage. 308 dataRef : lsst.daf.persistence.ButlerDataRef 309 dataRef to extract info from. 310 associations : lsst.jointcal.Associations 311 object to add the info to, to construct a new CcdImage 312 jointcalControl : jointcal.JointcalControl 313 control object for associations management 318 wcs : lsst.afw.geom.SkyWcs 319 the TAN WCS of this image, read from the calexp 321 a key to identify this dataRef by its visit and ccd ids 325 if "visit" in dataRef.dataId.keys():
326 visit = dataRef.dataId[
"visit"]
328 visit = dataRef.getButler().queryMetadata(
"calexp", (
"visit"), dataRef.dataId)[0]
330 src = dataRef.get(
"src", flags=lsst.afw.table.SOURCE_IO_NO_FOOTPRINTS, immediate=
True)
332 visitInfo = dataRef.get(
'calexp_visitInfo')
333 detector = dataRef.get(
'calexp_detector')
334 ccdId = detector.getId()
335 calib = dataRef.get(
'calexp_calib')
336 tanWcs = dataRef.get(
'calexp_wcs')
337 bbox = dataRef.get(
'calexp_bbox')
338 filt = dataRef.get(
'calexp_filter')
339 filterName = filt.getName()
340 fluxMag0 = calib.getFluxMag0()
341 photoCalib = afwImage.PhotoCalib(1.0/fluxMag0[0], fluxMag0[1]/fluxMag0[0]**2, bbox)
343 goodSrc = self.sourceSelector.
run(src)
345 if len(goodSrc.sourceCat) == 0:
346 self.log.warn(
"No sources selected in visit %s ccd %s", visit, ccdId)
348 self.log.info(
"%d sources selected in visit %d ccd %d", len(goodSrc.sourceCat), visit, ccdId)
349 associations.createCcdImage(goodSrc.sourceCat,
360 Result = collections.namedtuple(
'Result_from_build_CcdImage', (
'wcs',
'key',
'filter'))
361 Key = collections.namedtuple(
'Key', (
'visit',
'ccd'))
362 return Result(tanWcs, Key(visit, ccdId), filterName)
365 def run(self, dataRefs, profile_jointcal=False):
367 Jointly calibrate the astrometry and photometry across a set of images. 371 dataRefs : list of lsst.daf.persistence.ButlerDataRef 372 List of data references to the exposures to be fit. 373 profile_jointcal : bool 374 Profile the individual steps of jointcal. 380 * dataRefs: the provided data references that were fit (with updated WCSs) 381 * oldWcsList: the original WCS from each dataRef 382 * metrics: dictionary of internally-computed metrics for testing/validation. 384 if len(dataRefs) == 0:
385 raise ValueError(
'Need a non-empty list of data references!')
389 sourceFluxField =
"slot_%sFlux" % (self.config.sourceFluxType,)
393 visit_ccd_to_dataRef = {}
396 load_cat_prof_file =
'jointcal_build_ccdImage.prof' if profile_jointcal
else '' 397 with pipeBase.cmdLineTask.profile(load_cat_prof_file):
400 camera = dataRefs[0].get(
'camera', immediate=
True)
404 oldWcsList.append(result.wcs)
405 visit_ccd_to_dataRef[result.key] = ref
406 filters.append(result.filter)
407 filters = collections.Counter(filters)
409 associations.computeCommonTangentPoint()
414 bbox = associations.getRaDecBBox()
416 bboxCenter = bbox.getCenter()
417 center = afwGeom.SpherePoint(bboxCenter[0], bboxCenter[1], afwGeom.degrees)
418 bboxMax = bbox.getMax()
419 corner = afwGeom.SpherePoint(bboxMax[0], bboxMax[1], afwGeom.degrees)
420 radius = center.separation(corner).asRadians()
425 raise RuntimeError(
"astrometry_net_data is not setup")
428 defaultFilter = filters.most_common(1)[0][0]
429 self.log.debug(
"Using %s band for reference flux", defaultFilter)
432 tract = dataRefs[0].dataId[
'tract']
434 if self.config.doAstrometry:
437 refObjLoader=self.astrometryRefObjLoader,
439 profile_jointcal=profile_jointcal,
445 if self.config.doPhotometry:
448 refObjLoader=self.photometryRefObjLoader,
450 profile_jointcal=profile_jointcal,
453 reject_bad_fluxes=
True)
458 return pipeBase.Struct(dataRefs=dataRefs,
459 oldWcsList=oldWcsList,
461 exitStatus=exitStatus)
463 def _do_load_refcat_and_fit(self, associations, defaultFilter, center, radius,
464 name="", refObjLoader=None, filters=[], fit_function=None,
465 tract=None, profile_jointcal=False, match_cut=3.0,
466 reject_bad_fluxes=False):
467 """Load reference catalog, perform the fit, and return the result. 471 associations : lsst.jointcal.Associations 472 The star/reference star associations to fit. 474 filter to load from reference catalog. 475 center : lsst.afw.geom.SpherePoint 476 ICRS center of field to load from reference catalog. 477 radius : lsst.afw.geom.Angle 478 On-sky radius to load from reference catalog. 480 Name of thing being fit: "Astrometry" or "Photometry". 481 refObjLoader : lsst.meas.algorithms.LoadReferenceObjectsTask 482 Reference object loader to load from for fit. 483 filters : list of str, optional 484 List of filters to load from the reference catalog. 485 fit_function : function 486 function to call to perform fit (takes associations object). 488 Name of tract currently being fit. 489 profile_jointcal : bool, optional 490 Separately profile the fitting step. 491 match_cut : float, optional 492 Radius in arcseconds to find cross-catalog matches to during 493 associations.associateCatalogs. 494 reject_bad_fluxes : bool, optional 495 Reject refCat sources with NaN/inf flux or NaN/0 fluxErr. 499 Result of `fit_function()` 501 self.log.info(
"====== Now processing %s...", name)
504 associations.associateCatalogs(match_cut)
506 associations.fittedStarListSize())
508 skyCircle = refObjLoader.loadSkyCircle(center,
509 afwGeom.Angle(radius, afwGeom.radians),
513 if not skyCircle.refCat.isContiguous():
514 refCat = skyCircle.refCat.copy(deep=
True)
516 refCat = skyCircle.refCat
523 filtKeys = lsst.meas.algorithms.getRefFluxKeys(refCat.schema, filt)
524 refFluxes[filt] = refCat.get(filtKeys[0])
525 refFluxErrs[filt] = refCat.get(filtKeys[1])
527 associations.collectRefStars(refCat, self.config.matchCut*afwGeom.arcseconds,
528 skyCircle.fluxField, refFluxes, refFluxErrs, reject_bad_fluxes)
530 associations.refStarListSize())
532 associations.prepareFittedStars(self.config.minMeasurements)
536 associations.nFittedStarsWithAssociatedRefStar())
538 associations.fittedStarListSize())
540 associations.nCcdImagesValidForFit())
542 load_cat_prof_file =
'jointcal_fit_%s.prof'%name
if profile_jointcal
else '' 543 dataName =
"{}_{}".format(tract, defaultFilter)
544 with pipeBase.cmdLineTask.profile(load_cat_prof_file):
545 result = fit_function(associations, dataName)
548 if self.config.writeChi2ContributionFiles:
549 baseName =
"{}_final_chi2-{}.csv".format(name, dataName)
550 result.fit.saveChi2Contributions(baseName)
554 def _check_star_lists(self, associations, name):
556 if associations.nCcdImagesValidForFit() == 0:
557 raise RuntimeError(
'No images in the ccdImageList!')
558 if associations.fittedStarListSize() == 0:
559 raise RuntimeError(
'No stars in the {} fittedStarList!'.format(name))
560 if associations.refStarListSize() == 0:
561 raise RuntimeError(
'No stars in the {} reference star list!'.format(name))
563 def _fit_photometry(self, associations, dataName=None):
565 Fit the photometric data. 569 associations : lsst.jointcal.Associations 570 The star/reference star associations to fit. 572 Name of the data being processed (e.g. "1234_HSC-Y"), for 573 identifying debugging files. 578 fit : lsst.jointcal.PhotometryFit 579 The photometric fitter used to perform the fit. 580 model : lsst.jointcal.PhotometryModel 581 The photometric model that was fit. 583 self.log.info(
"=== Starting photometric fitting...")
586 if self.config.photometryModel ==
"constrained":
589 visitOrder=self.config.photometryVisitOrder)
590 elif self.config.photometryModel ==
"simple":
594 chi2 = fit.computeChi2()
597 if self.config.writeChi2ContributionFiles:
598 baseName =
"photometry_initial_chi2-{}.csv".format(dataName)
599 fit.saveChi2Contributions(baseName)
601 if not np.isfinite(chi2.chi2):
602 raise FloatingPointError(
'Initial chi2 is invalid: %s'%chi2)
603 self.log.info(
"Initialized: %s", str(chi2))
606 if self.config.photometryModel ==
"constrained":
608 fit.minimize(
"ModelVisit")
609 chi2 = fit.computeChi2()
610 self.log.info(str(chi2))
611 fit.minimize(
"Model")
612 chi2 = fit.computeChi2()
613 self.log.info(str(chi2))
614 fit.minimize(
"Fluxes")
615 chi2 = fit.computeChi2()
616 self.log.info(str(chi2))
617 fit.minimize(
"Model Fluxes")
618 chi2 = fit.computeChi2()
619 if not np.isfinite(chi2.chi2):
620 raise FloatingPointError(
'Pre-iteration chi2 is invalid: %s'%chi2)
621 self.log.info(
"Fit prepared with %s", str(chi2))
623 model.freezeErrorTransform()
624 self.log.debug(
"Photometry error scales are frozen.")
629 self.config.maxPhotometrySteps,
632 doRankUpdate=self.config.photometryDoRankUpdate)
638 def _fit_astrometry(self, associations, dataName=None):
640 Fit the astrometric data. 644 associations : lsst.jointcal.Associations 645 The star/reference star associations to fit. 647 Name of the data being processed (e.g. "1234_HSC-Y"), for 648 identifying debugging files. 653 fit : lsst.jointcal.AstrometryFit 654 The astrometric fitter used to perform the fit. 655 model : lsst.jointcal.AstrometryModel 656 The astrometric model that was fit. 657 sky_to_tan_projection : lsst.jointcal.ProjectionHandler 658 The model for the sky to tangent plane projection that was used in the fit. 661 self.log.info(
"=== Starting astrometric fitting...")
663 associations.deprojectFittedStars()
670 if self.config.astrometryModel ==
"constrained":
672 sky_to_tan_projection,
673 chipOrder=self.config.astrometryChipOrder,
674 visitOrder=self.config.astrometryVisitOrder)
675 elif self.config.astrometryModel ==
"simple":
677 sky_to_tan_projection,
678 self.config.useInputWcs,
680 order=self.config.astrometrySimpleOrder)
683 chi2 = fit.computeChi2()
686 if self.config.writeChi2ContributionFiles:
687 baseName =
"astrometry_initial_chi2-{}.csv".format(dataName)
688 fit.saveChi2Contributions(baseName)
690 if not np.isfinite(chi2.chi2):
691 raise FloatingPointError(
'Initial chi2 is invalid: %s'%chi2)
692 self.log.info(
"Initialized: %s", str(chi2))
695 if self.config.astrometryModel ==
"constrained":
696 fit.minimize(
"DistortionsVisit")
697 chi2 = fit.computeChi2()
698 self.log.info(str(chi2))
699 fit.minimize(
"Distortions")
700 chi2 = fit.computeChi2()
701 self.log.info(str(chi2))
702 fit.minimize(
"Positions")
703 chi2 = fit.computeChi2()
704 self.log.info(str(chi2))
705 fit.minimize(
"Distortions Positions")
706 chi2 = fit.computeChi2()
707 self.log.info(str(chi2))
708 if not np.isfinite(chi2.chi2):
709 raise FloatingPointError(
'Pre-iteration chi2 is invalid: %s'%chi2)
710 self.log.info(
"Fit prepared with %s", str(chi2))
715 self.config.maxAstrometrySteps,
717 "Distortions Positions",
718 doRankUpdate=self.config.astrometryDoRankUpdate)
723 return Astrometry(fit, model, sky_to_tan_projection)
725 def _check_stars(self, associations):
726 """Count measured and reference stars per ccd and warn/log them.""" 727 for ccdImage
in associations.getCcdImageList():
728 nMeasuredStars, nRefStars = ccdImage.countStars()
729 self.log.debug(
"ccdImage %s has %s measured and %s reference stars",
730 ccdImage.getName(), nMeasuredStars, nRefStars)
731 if nMeasuredStars < self.config.minMeasuredStarsPerCcd:
732 self.log.warn(
"ccdImage %s has only %s measuredStars (desired %s)",
733 ccdImage.getName(), nMeasuredStars, self.config.minMeasuredStarsPerCcd)
734 if nRefStars < self.config.minRefStarsPerCcd:
735 self.log.warn(
"ccdImage %s has only %s RefStars (desired %s)",
736 ccdImage.getName(), nRefStars, self.config.minRefStarsPerCcd)
738 def _iterate_fit(self, associations, fit, model, max_steps, name, whatToFit, doRankUpdate=True):
739 """Run fit.minimize up to max_steps times, returning the final chi2.""" 741 for i
in range(max_steps):
743 r = fit.minimize(whatToFit, self.config.outlierRejectSigma, doRankUpdate=doRankUpdate)
744 chi2 = fit.computeChi2()
746 if not np.isfinite(chi2.chi2):
747 raise FloatingPointError(
'Fit iteration chi2 is invalid: %s'%chi2)
748 self.log.info(str(chi2))
749 if r == MinimizeResult.Converged:
751 self.log.debug(
"fit has converged - no more outliers - redo minimization " 752 "one more time in case we have lost accuracy in rank update.")
754 r = fit.minimize(whatToFit, 5)
755 chi2 = fit.computeChi2()
756 self.log.info(
"Fit completed with: %s", str(chi2))
758 elif r == MinimizeResult.Chi2Increased:
759 self.log.warn(
"still some ouliers but chi2 increases - retry")
760 elif r == MinimizeResult.Failed:
761 raise RuntimeError(
"Chi2 minimization failure, cannot complete fit.")
763 raise RuntimeError(
"Unxepected return code from minimize().")
765 self.log.error(
"%s failed to converge after %d steps"%(name, max_steps))
769 def _write_astrometry_results(self, associations, model, visit_ccd_to_dataRef):
771 Write the fitted astrometric results to a new 'jointcal_wcs' dataRef. 775 associations : lsst.jointcal.Associations 776 The star/reference star associations to fit. 777 model : lsst.jointcal.AstrometryModel 778 The astrometric model that was fit. 779 visit_ccd_to_dataRef : dict of Key: lsst.daf.persistence.ButlerDataRef 780 dict of ccdImage identifiers to dataRefs that were fit 783 ccdImageList = associations.getCcdImageList()
784 for ccdImage
in ccdImageList:
787 visit = ccdImage.visit
788 dataRef = visit_ccd_to_dataRef[(visit, ccd)]
789 self.log.info(
"Updating WCS for visit: %d, ccd: %d", visit, ccd)
790 skyWcs = model.makeSkyWcs(ccdImage)
792 dataRef.put(skyWcs,
'jointcal_wcs')
793 except pexExceptions.Exception
as e:
794 self.log.fatal(
'Failed to write updated Wcs: %s', str(e))
797 def _write_photometry_results(self, associations, model, visit_ccd_to_dataRef):
799 Write the fitted photometric results to a new 'jointcal_photoCalib' dataRef. 803 associations : lsst.jointcal.Associations 804 The star/reference star associations to fit. 805 model : lsst.jointcal.PhotometryModel 806 The photoometric model that was fit. 807 visit_ccd_to_dataRef : dict of Key: lsst.daf.persistence.ButlerDataRef 808 dict of ccdImage identifiers to dataRefs that were fit 811 ccdImageList = associations.getCcdImageList()
812 for ccdImage
in ccdImageList:
815 visit = ccdImage.visit
816 dataRef = visit_ccd_to_dataRef[(visit, ccd)]
817 self.log.info(
"Updating PhotoCalib for visit: %d, ccd: %d", visit, ccd)
818 photoCalib = model.toPhotoCalib(ccdImage)
820 dataRef.put(photoCalib,
'jointcal_photoCalib')
821 except pexExceptions.Exception
as e:
822 self.log.fatal(
'Failed to write updated PhotoCalib: %s', str(e))
def _build_ccdImage(self, dataRef, associations, jointcalControl)
def _fit_photometry(self, associations, dataName=None)
def getTargetList(parsedCmd, kwargs)
def _fit_astrometry(self, associations, dataName=None)
def _check_star_lists(self, associations, name)
The class that implements the relations between MeasuredStar and FittedStar.
A projection handler in which all CCDs from the same visit have the same tangent point.
std::string getPackageDir(std::string const &packageName)
this is the model used to fit independent CCDs, meaning that there is no instrument model...
def _write_photometry_results(self, associations, model, visit_ccd_to_dataRef)
def _check_stars(self, associations)
Class that handles the photometric least squares problem.
Class that handles the astrometric least squares problem.
Photometry model with constraints, .
def add_measurement(job, name, value)
def _do_load_refcat_and_fit(self, associations, defaultFilter, center, radius, name="", refObjLoader=None, filters=[], fit_function=None, tract=None, profile_jointcal=False, match_cut=3.0, reject_bad_fluxes=False)
This is the model used to fit mappings as the combination of a transformation depending on the chip n...
def _write_astrometry_results(self, associations, model, visit_ccd_to_dataRef)
def run(self, dataRefs, profile_jointcal=False)
Photometric response model which has a single photometric factor per CcdImage.
def __init__(self, butler=None, profile_jointcal=False, kwargs)
def _iterate_fit(self, associations, fit, model, max_steps, name, whatToFit, doRankUpdate=True)