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 writeInitMatrix = pexConfig.Field(
235 doc=
"Write the pre/post-initialization Hessian and gradient to text files, for debugging." 236 "The output files will be of the form 'astrometry_preinit-mat.txt', in the current directory." 237 "Note that these files are the dense versions of the matrix, and so may be very large.",
240 writeChi2ContributionFiles = pexConfig.Field(
242 doc=
"Write initial/final fit files containing the contributions to chi2.",
245 sourceFluxType = pexConfig.Field(
247 doc=
"Source flux field to use in source selection and to get fluxes from the catalog.",
253 sourceSelector.setDefaults()
255 sourceSelector.badFlags.extend([
"slot_Shape_flag"])
261 """Jointly astrometrically and photometrically calibrate a group of images.""" 263 ConfigClass = JointcalConfig
264 RunnerClass = JointcalRunner
265 _DefaultName =
"jointcal" 267 def __init__(self, butler=None, profile_jointcal=False, **kwargs):
269 Instantiate a JointcalTask. 273 butler : lsst.daf.persistence.Butler 274 The butler is passed to the refObjLoader constructor in case it is 275 needed. Ignored if the refObjLoader argument provides a loader directly. 276 Used to initialize the astrometry and photometry refObjLoaders. 277 profile_jointcal : bool 278 set to True to profile different stages of this jointcal run. 280 pipeBase.CmdLineTask.__init__(self, **kwargs)
282 self.makeSubtask(
"sourceSelector")
283 if self.config.doAstrometry:
284 self.makeSubtask(
'astrometryRefObjLoader', butler=butler)
285 if self.config.doPhotometry:
286 self.makeSubtask(
'photometryRefObjLoader', butler=butler)
289 self.
job = Job.load_metrics_package(subset=
'jointcal')
293 def _getConfigName(self):
296 def _getMetadataName(self):
300 def _makeArgumentParser(cls):
301 """Create an argument parser""" 303 parser.add_argument(
"--profile_jointcal", default=
False, action=
"store_true",
304 help=
"Profile steps of jointcal separately.")
305 parser.add_id_argument(
"--id",
"calexp", help=
"data ID, e.g. --id visit=6789 ccd=0..9",
306 ContainerClass=PerTractCcdDataIdContainer)
309 def _build_ccdImage(self, dataRef, associations, jointcalControl):
311 Extract the necessary things from this dataRef to add a new ccdImage. 315 dataRef : lsst.daf.persistence.ButlerDataRef 316 dataRef to extract info from. 317 associations : lsst.jointcal.Associations 318 object to add the info to, to construct a new CcdImage 319 jointcalControl : jointcal.JointcalControl 320 control object for associations management 325 wcs : lsst.afw.geom.SkyWcs 326 the TAN WCS of this image, read from the calexp 328 a key to identify this dataRef by its visit and ccd ids 332 if "visit" in dataRef.dataId.keys():
333 visit = dataRef.dataId[
"visit"]
335 visit = dataRef.getButler().queryMetadata(
"calexp", (
"visit"), dataRef.dataId)[0]
337 src = dataRef.get(
"src", flags=lsst.afw.table.SOURCE_IO_NO_FOOTPRINTS, immediate=
True)
339 visitInfo = dataRef.get(
'calexp_visitInfo')
340 detector = dataRef.get(
'calexp_detector')
341 ccdId = detector.getId()
342 calib = dataRef.get(
'calexp_calib')
343 tanWcs = dataRef.get(
'calexp_wcs')
344 bbox = dataRef.get(
'calexp_bbox')
345 filt = dataRef.get(
'calexp_filter')
346 filterName = filt.getName()
347 fluxMag0 = calib.getFluxMag0()
348 photoCalib = afwImage.PhotoCalib(1.0/fluxMag0[0], fluxMag0[1]/fluxMag0[0]**2, bbox)
350 goodSrc = self.sourceSelector.
run(src)
352 if len(goodSrc.sourceCat) == 0:
353 self.log.warn(
"No sources selected in visit %s ccd %s", visit, ccdId)
355 self.log.info(
"%d sources selected in visit %d ccd %d", len(goodSrc.sourceCat), visit, ccdId)
356 associations.createCcdImage(goodSrc.sourceCat,
367 Result = collections.namedtuple(
'Result_from_build_CcdImage', (
'wcs',
'key',
'filter'))
368 Key = collections.namedtuple(
'Key', (
'visit',
'ccd'))
369 return Result(tanWcs, Key(visit, ccdId), filterName)
372 def run(self, dataRefs, profile_jointcal=False):
374 Jointly calibrate the astrometry and photometry across a set of images. 378 dataRefs : list of lsst.daf.persistence.ButlerDataRef 379 List of data references to the exposures to be fit. 380 profile_jointcal : bool 381 Profile the individual steps of jointcal. 387 * dataRefs: the provided data references that were fit (with updated WCSs) 388 * oldWcsList: the original WCS from each dataRef 389 * metrics: dictionary of internally-computed metrics for testing/validation. 391 if len(dataRefs) == 0:
392 raise ValueError(
'Need a non-empty list of data references!')
396 sourceFluxField =
"slot_%sFlux" % (self.config.sourceFluxType,)
400 visit_ccd_to_dataRef = {}
403 load_cat_prof_file =
'jointcal_build_ccdImage.prof' if profile_jointcal
else '' 404 with pipeBase.cmdLineTask.profile(load_cat_prof_file):
407 camera = dataRefs[0].get(
'camera', immediate=
True)
411 oldWcsList.append(result.wcs)
412 visit_ccd_to_dataRef[result.key] = ref
413 filters.append(result.filter)
414 filters = collections.Counter(filters)
416 associations.computeCommonTangentPoint()
421 bbox = associations.getRaDecBBox()
423 bboxCenter = bbox.getCenter()
424 center = afwGeom.SpherePoint(bboxCenter[0], bboxCenter[1], afwGeom.degrees)
425 bboxMax = bbox.getMax()
426 corner = afwGeom.SpherePoint(bboxMax[0], bboxMax[1], afwGeom.degrees)
427 radius = center.separation(corner).asRadians()
432 raise RuntimeError(
"astrometry_net_data is not setup")
435 defaultFilter = filters.most_common(1)[0][0]
436 self.log.debug(
"Using %s band for reference flux", defaultFilter)
439 tract = dataRefs[0].dataId[
'tract']
441 if self.config.doAstrometry:
444 refObjLoader=self.astrometryRefObjLoader,
446 profile_jointcal=profile_jointcal,
452 if self.config.doPhotometry:
455 refObjLoader=self.photometryRefObjLoader,
457 profile_jointcal=profile_jointcal,
460 reject_bad_fluxes=
True)
465 return pipeBase.Struct(dataRefs=dataRefs,
466 oldWcsList=oldWcsList,
468 exitStatus=exitStatus)
470 def _do_load_refcat_and_fit(self, associations, defaultFilter, center, radius,
471 name="", refObjLoader=None, filters=[], fit_function=None,
472 tract=None, profile_jointcal=False, match_cut=3.0,
473 reject_bad_fluxes=False):
474 """Load reference catalog, perform the fit, and return the result. 478 associations : lsst.jointcal.Associations 479 The star/reference star associations to fit. 481 filter to load from reference catalog. 482 center : lsst.afw.geom.SpherePoint 483 ICRS center of field to load from reference catalog. 484 radius : lsst.afw.geom.Angle 485 On-sky radius to load from reference catalog. 487 Name of thing being fit: "Astrometry" or "Photometry". 488 refObjLoader : lsst.meas.algorithms.LoadReferenceObjectsTask 489 Reference object loader to load from for fit. 490 filters : list of str, optional 491 List of filters to load from the reference catalog. 492 fit_function : function 493 function to call to perform fit (takes associations object). 495 Name of tract currently being fit. 496 profile_jointcal : bool, optional 497 Separately profile the fitting step. 498 match_cut : float, optional 499 Radius in arcseconds to find cross-catalog matches to during 500 associations.associateCatalogs. 501 reject_bad_fluxes : bool, optional 502 Reject refCat sources with NaN/inf flux or NaN/0 fluxErr. 506 Result of `fit_function()` 508 self.log.info(
"====== Now processing %s...", name)
511 associations.associateCatalogs(match_cut)
513 associations.fittedStarListSize())
515 skyCircle = refObjLoader.loadSkyCircle(center,
516 afwGeom.Angle(radius, afwGeom.radians),
520 if not skyCircle.refCat.isContiguous():
521 refCat = skyCircle.refCat.copy(deep=
True)
523 refCat = skyCircle.refCat
530 filtKeys = lsst.meas.algorithms.getRefFluxKeys(refCat.schema, filt)
531 refFluxes[filt] = refCat.get(filtKeys[0])
532 refFluxErrs[filt] = refCat.get(filtKeys[1])
534 associations.collectRefStars(refCat, self.config.matchCut*afwGeom.arcseconds,
535 skyCircle.fluxField, refFluxes, refFluxErrs, reject_bad_fluxes)
537 associations.refStarListSize())
539 associations.prepareFittedStars(self.config.minMeasurements)
543 associations.nFittedStarsWithAssociatedRefStar())
545 associations.fittedStarListSize())
547 associations.nCcdImagesValidForFit())
549 load_cat_prof_file =
'jointcal_fit_%s.prof'%name
if profile_jointcal
else '' 550 dataName =
"{}_{}".format(tract, defaultFilter)
551 with pipeBase.cmdLineTask.profile(load_cat_prof_file):
552 result = fit_function(associations, dataName)
555 if self.config.writeChi2ContributionFiles:
556 baseName =
"{}_final_chi2-{}.csv".format(name, dataName)
557 result.fit.saveChi2Contributions(baseName)
561 def _check_star_lists(self, associations, name):
563 if associations.nCcdImagesValidForFit() == 0:
564 raise RuntimeError(
'No images in the ccdImageList!')
565 if associations.fittedStarListSize() == 0:
566 raise RuntimeError(
'No stars in the {} fittedStarList!'.format(name))
567 if associations.refStarListSize() == 0:
568 raise RuntimeError(
'No stars in the {} reference star list!'.format(name))
570 def _fit_photometry(self, associations, dataName=None):
572 Fit the photometric data. 576 associations : lsst.jointcal.Associations 577 The star/reference star associations to fit. 579 Name of the data being processed (e.g. "1234_HSC-Y"), for 580 identifying debugging files. 585 fit : lsst.jointcal.PhotometryFit 586 The photometric fitter used to perform the fit. 587 model : lsst.jointcal.PhotometryModel 588 The photometric model that was fit. 590 self.log.info(
"=== Starting photometric fitting...")
593 if self.config.photometryModel ==
"constrained":
596 visitOrder=self.config.photometryVisitOrder)
597 elif self.config.photometryModel ==
"simple":
601 chi2 = fit.computeChi2()
604 if self.config.writeChi2ContributionFiles:
605 baseName =
"photometry_initial_chi2-{}.csv".format(dataName)
606 fit.saveChi2Contributions(baseName)
608 if not np.isfinite(chi2.chi2):
609 raise FloatingPointError(
'Initial chi2 is invalid: %s'%chi2)
610 self.log.info(
"Initialized: %s", str(chi2))
613 dumpMatrixFile =
"photometry_preinit" if self.config.writeInitMatrix
else "" 614 if self.config.photometryModel ==
"constrained":
616 fit.minimize(
"ModelVisit", dumpMatrixFile=dumpMatrixFile)
617 chi2 = fit.computeChi2()
618 self.log.info(str(chi2))
620 fit.minimize(
"Model", dumpMatrixFile=dumpMatrixFile)
621 chi2 = fit.computeChi2()
622 self.log.info(str(chi2))
623 fit.minimize(
"Fluxes")
624 chi2 = fit.computeChi2()
625 self.log.info(str(chi2))
626 fit.minimize(
"Model Fluxes")
627 chi2 = fit.computeChi2()
628 if not np.isfinite(chi2.chi2):
629 raise FloatingPointError(
'Pre-iteration chi2 is invalid: %s'%chi2)
630 self.log.info(
"Fit prepared with %s", str(chi2))
632 model.freezeErrorTransform()
633 self.log.debug(
"Photometry error scales are frozen.")
638 self.config.maxPhotometrySteps,
641 doRankUpdate=self.config.photometryDoRankUpdate)
647 def _fit_astrometry(self, associations, dataName=None):
649 Fit the astrometric data. 653 associations : lsst.jointcal.Associations 654 The star/reference star associations to fit. 656 Name of the data being processed (e.g. "1234_HSC-Y"), for 657 identifying debugging files. 662 fit : lsst.jointcal.AstrometryFit 663 The astrometric fitter used to perform the fit. 664 model : lsst.jointcal.AstrometryModel 665 The astrometric model that was fit. 666 sky_to_tan_projection : lsst.jointcal.ProjectionHandler 667 The model for the sky to tangent plane projection that was used in the fit. 670 self.log.info(
"=== Starting astrometric fitting...")
672 associations.deprojectFittedStars()
679 if self.config.astrometryModel ==
"constrained":
681 sky_to_tan_projection,
682 chipOrder=self.config.astrometryChipOrder,
683 visitOrder=self.config.astrometryVisitOrder)
684 elif self.config.astrometryModel ==
"simple":
686 sky_to_tan_projection,
687 self.config.useInputWcs,
689 order=self.config.astrometrySimpleOrder)
692 chi2 = fit.computeChi2()
695 if self.config.writeChi2ContributionFiles:
696 baseName =
"astrometry_initial_chi2-{}.csv".format(dataName)
697 fit.saveChi2Contributions(baseName)
699 if not np.isfinite(chi2.chi2):
700 raise FloatingPointError(
'Initial chi2 is invalid: %s'%chi2)
701 self.log.info(
"Initialized: %s", str(chi2))
702 dumpMatrixFile =
"astrometry_preinit" if self.config.writeInitMatrix
else "" 705 if self.config.astrometryModel ==
"constrained":
706 fit.minimize(
"DistortionsVisit", dumpMatrixFile=dumpMatrixFile)
707 chi2 = fit.computeChi2()
708 self.log.info(str(chi2))
710 fit.minimize(
"Distortions", dumpMatrixFile=dumpMatrixFile)
711 chi2 = fit.computeChi2()
712 self.log.info(str(chi2))
713 fit.minimize(
"Positions")
714 chi2 = fit.computeChi2()
715 self.log.info(str(chi2))
716 fit.minimize(
"Distortions Positions")
717 chi2 = fit.computeChi2()
718 self.log.info(str(chi2))
719 if not np.isfinite(chi2.chi2):
720 raise FloatingPointError(
'Pre-iteration chi2 is invalid: %s'%chi2)
721 self.log.info(
"Fit prepared with %s", str(chi2))
726 self.config.maxAstrometrySteps,
728 "Distortions Positions",
729 doRankUpdate=self.config.astrometryDoRankUpdate)
734 return Astrometry(fit, model, sky_to_tan_projection)
736 def _check_stars(self, associations):
737 """Count measured and reference stars per ccd and warn/log them.""" 738 for ccdImage
in associations.getCcdImageList():
739 nMeasuredStars, nRefStars = ccdImage.countStars()
740 self.log.debug(
"ccdImage %s has %s measured and %s reference stars",
741 ccdImage.getName(), nMeasuredStars, nRefStars)
742 if nMeasuredStars < self.config.minMeasuredStarsPerCcd:
743 self.log.warn(
"ccdImage %s has only %s measuredStars (desired %s)",
744 ccdImage.getName(), nMeasuredStars, self.config.minMeasuredStarsPerCcd)
745 if nRefStars < self.config.minRefStarsPerCcd:
746 self.log.warn(
"ccdImage %s has only %s RefStars (desired %s)",
747 ccdImage.getName(), nRefStars, self.config.minRefStarsPerCcd)
749 def _iterate_fit(self, associations, fit, model, max_steps, name, whatToFit, doRankUpdate=True):
750 """Run fit.minimize up to max_steps times, returning the final chi2.""" 752 dumpMatrixFile =
"%s_postinit" % name
if self.config.writeInitMatrix
else "" 753 for i
in range(max_steps):
755 r = fit.minimize(whatToFit,
756 self.config.outlierRejectSigma,
757 doRankUpdate=doRankUpdate,
758 dumpMatrixFile=dumpMatrixFile)
760 chi2 = fit.computeChi2()
762 if not np.isfinite(chi2.chi2):
763 raise FloatingPointError(
'Fit iteration chi2 is invalid: %s'%chi2)
764 self.log.info(str(chi2))
765 if r == MinimizeResult.Converged:
767 self.log.debug(
"fit has converged - no more outliers - redo minimization " 768 "one more time in case we have lost accuracy in rank update.")
770 r = fit.minimize(whatToFit, 5)
771 chi2 = fit.computeChi2()
772 self.log.info(
"Fit completed with: %s", str(chi2))
774 elif r == MinimizeResult.Chi2Increased:
775 self.log.warn(
"still some ouliers but chi2 increases - retry")
776 elif r == MinimizeResult.Failed:
777 raise RuntimeError(
"Chi2 minimization failure, cannot complete fit.")
779 raise RuntimeError(
"Unxepected return code from minimize().")
781 self.log.error(
"%s failed to converge after %d steps"%(name, max_steps))
785 def _write_astrometry_results(self, associations, model, visit_ccd_to_dataRef):
787 Write the fitted astrometric results to a new 'jointcal_wcs' dataRef. 791 associations : lsst.jointcal.Associations 792 The star/reference star associations to fit. 793 model : lsst.jointcal.AstrometryModel 794 The astrometric model that was fit. 795 visit_ccd_to_dataRef : dict of Key: lsst.daf.persistence.ButlerDataRef 796 dict of ccdImage identifiers to dataRefs that were fit 799 ccdImageList = associations.getCcdImageList()
800 for ccdImage
in ccdImageList:
803 visit = ccdImage.visit
804 dataRef = visit_ccd_to_dataRef[(visit, ccd)]
805 self.log.info(
"Updating WCS for visit: %d, ccd: %d", visit, ccd)
806 skyWcs = model.makeSkyWcs(ccdImage)
808 dataRef.put(skyWcs,
'jointcal_wcs')
809 except pexExceptions.Exception
as e:
810 self.log.fatal(
'Failed to write updated Wcs: %s', str(e))
813 def _write_photometry_results(self, associations, model, visit_ccd_to_dataRef):
815 Write the fitted photometric results to a new 'jointcal_photoCalib' dataRef. 819 associations : lsst.jointcal.Associations 820 The star/reference star associations to fit. 821 model : lsst.jointcal.PhotometryModel 822 The photoometric model that was fit. 823 visit_ccd_to_dataRef : dict of Key: lsst.daf.persistence.ButlerDataRef 824 dict of ccdImage identifiers to dataRefs that were fit 827 ccdImageList = associations.getCcdImageList()
828 for ccdImage
in ccdImageList:
831 visit = ccdImage.visit
832 dataRef = visit_ccd_to_dataRef[(visit, ccd)]
833 self.log.info(
"Updating PhotoCalib for visit: %d, ccd: %d", visit, ccd)
834 photoCalib = model.toPhotoCalib(ccdImage)
836 dataRef.put(photoCalib,
'jointcal_photoCalib')
837 except pexExceptions.Exception
as e:
838 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)