class RefMatchConfig(pexConfig.Config): matcher = pexConfig.ConfigurableField( target=MatchPessimisticBTask, doc="reference object/source matcher", ) matchDistanceSigma = pexConfig.RangeField( doc="the maximum match distance is set to " " mean_match_distance + matchDistanceSigma*std_dev_match_distance; " "ignored if not fitting a WCS", dtype=float, default=2, min=0, ) sourceSelector = sourceSelectorRegistry.makeField( doc="How to select sources for cross-matching.", default="science", ) referenceSelector = pexConfig.ConfigurableField( target=ReferenceSourceSelectorTask, doc="How to select reference objects for cross-matching.") sourceFluxType = pexConfig.Field( dtype=str, doc="Source flux type to use in source selection.", default='Calib') def setDefaults(self): self.sourceSelector.name = "science" self.sourceSelector['science'].fluxLimit.fluxField = \ 'slot_%sFlux_instFlux' % (self.sourceFluxType) self.sourceSelector['science'].signalToNoise.fluxField = \ 'slot_%sFlux_instFlux' % (self.sourceFluxType) self.sourceSelector['science'].signalToNoise.errField = \ 'slot_%sFlux_instFluxErr' % (self.sourceFluxType)
class FgcmBuildStarsConfig(pexConfig.Config): """Config for FgcmBuildStarsTask""" instFluxField = pexConfig.Field( doc= ("Name of the source instFlux field to use. The associated flag field " "('<name>_flag') will be implicitly included in badFlags"), dtype=str, default='slot_CalibFlux_instFlux', ) minPerBand = pexConfig.Field( doc="Minimum observations per band", dtype=int, default=2, ) matchRadius = pexConfig.Field( doc="Match radius (arcseconds)", dtype=float, default=1.0, ) isolationRadius = pexConfig.Field( doc="Isolation radius (arcseconds)", dtype=float, default=2.0, ) densityCutNside = pexConfig.Field( doc="Density cut healpix nside", dtype=int, default=128, ) densityCutMaxPerPixel = pexConfig.Field( doc="Density cut number of stars per pixel", dtype=int, default=1000, ) matchNside = pexConfig.Field( doc="Healpix Nside for matching", dtype=int, default=4096, ) coarseNside = pexConfig.Field( doc="Healpix coarse Nside for partitioning matches", dtype=int, default=8, ) filterMap = pexConfig.DictField( doc="Mapping from 'filterName' to band.", keytype=str, itemtype=str, default={}, ) requiredBands = pexConfig.ListField( doc="Bands required for each star", dtype=str, default=(), ) primaryBands = pexConfig.ListField( doc=("Bands for 'primary' star matches. " "A star must be observed in one of these bands to be considered " "as a calibration star."), dtype=str, default=None) referenceCCD = pexConfig.Field( doc="Reference CCD for scanning visits", dtype=int, default=13, ) checkAllCcds = pexConfig.Field( doc="Check all CCDs. Necessary for testing", dtype=bool, default=False, ) visitDataRefName = pexConfig.Field( doc="dataRef name for the 'visit' field", dtype=str, default="visit") ccdDataRefName = pexConfig.Field(doc="dataRef name for the 'ccd' field", dtype=str, default="ccd") applyJacobian = pexConfig.Field(doc="Apply Jacobian correction?", dtype=bool, default=False) jacobianName = pexConfig.Field( doc="Name of field with jacobian correction", dtype=str, default="base_Jacobian_value") sourceSelector = sourceSelectorRegistry.makeField( doc="How to select sources", default="science") apertureInnerInstFluxField = pexConfig.Field( doc="Field that contains inner aperture for aperture correction proxy", dtype=str, default='base_CircularApertureFlux_12_0_instFlux') apertureOuterInstFluxField = pexConfig.Field( doc="Field that contains outer aperture for aperture correction proxy", dtype=str, default='base_CircularApertureFlux_17_0_instFlux') doReferenceMatches = pexConfig.Field( doc="Match reference catalog as additional constraint on calibration", dtype=bool, default=True, ) fgcmLoadReferenceCatalog = pexConfig.ConfigurableField( target=FgcmLoadReferenceCatalogTask, doc="FGCM reference object loader", ) def setDefaults(self): sourceSelector = self.sourceSelector["science"] sourceSelector.setDefaults() fluxFlagName = self.instFluxField[0:-len('instFlux')] + 'flag' sourceSelector.flags.bad = [ 'base_PixelFlags_flag_edge', 'base_PixelFlags_flag_interpolatedCenter', 'base_PixelFlags_flag_saturatedCenter', 'base_PixelFlags_flag_crCenter', 'base_PixelFlags_flag_bad', 'base_PixelFlags_flag_interpolated', 'base_PixelFlags_flag_saturated', 'slot_Centroid_flag', fluxFlagName ] sourceSelector.doFlags = True sourceSelector.doUnresolved = True sourceSelector.doSignalToNoise = True sourceSelector.doIsolated = True sourceSelector.signalToNoise.fluxField = self.instFluxField sourceSelector.signalToNoise.errField = self.instFluxField + 'Err' sourceSelector.signalToNoise.minimum = 10.0 sourceSelector.signalToNoise.maximum = 1000.0 # FGCM operates on unresolved sources, and this setting is # appropriate for the current base_classificationExtendedness sourceSelector.unresolved.maximum = 0.5
class IsolatedStarAssociationConfig( pipeBase.PipelineTaskConfig, pipelineConnections=IsolatedStarAssociationConnections): """Configuration for IsolatedStarAssociationTask.""" inst_flux_field = pexConfig.Field( doc= ('Full name of instFlux field to use for s/n selection and persistence. ' 'The associated flag will be implicity included in bad_flags. ' 'Note that this is expected to end in ``instFlux``.'), dtype=str, default='apFlux_12_0_instFlux', ) match_radius = pexConfig.Field( doc='Match radius (arcseconds)', dtype=float, default=1.0, ) isolation_radius = pexConfig.Field( doc= ('Isolation radius (arcseconds). Any stars with average centroids ' 'within this radius of another star will be rejected from the final ' 'catalog. This radius should be at least 2x match_radius.'), dtype=float, default=2.0, ) band_order = pexConfig.ListField( doc=(('Ordered list of bands to use for matching/storage. ' 'Any bands not listed will not be matched.')), dtype=str, default=['i', 'z', 'r', 'g', 'y', 'u'], ) id_column = pexConfig.Field( doc='Name of column with source id.', dtype=str, default='sourceId', ) ra_column = pexConfig.Field( doc='Name of column with right ascension.', dtype=str, default='ra', ) dec_column = pexConfig.Field( doc='Name of column with declination.', dtype=str, default='decl', ) physical_filter_column = pexConfig.Field( doc='Name of column with physical filter name', dtype=str, default='physical_filter', ) band_column = pexConfig.Field( doc='Name of column with band name', dtype=str, default='band', ) extra_columns = pexConfig.ListField( doc= 'Extra names of columns to read and persist (beyond instFlux and error).', dtype=str, default=[ 'x', 'y', 'apFlux_17_0_instFlux', 'apFlux_17_0_instFluxErr', 'apFlux_17_0_flag', 'localBackground_instFlux', 'localBackground_flag' ]) source_selector = sourceSelectorRegistry.makeField( doc= 'How to select sources. Under normal usage this should not be changed.', default='science') def setDefaults(self): super().setDefaults() source_selector = self.source_selector['science'] source_selector.setDefaults() source_selector.doFlags = True source_selector.doUnresolved = True source_selector.doSignalToNoise = True source_selector.doIsolated = True source_selector.signalToNoise.minimum = 10.0 source_selector.signalToNoise.maximum = 1000.0 flux_flag_name = self.inst_flux_field.replace("instFlux", "flag") source_selector.flags.bad = [ 'pixelFlags_edge', 'pixelFlags_interpolatedCenter', 'pixelFlags_saturatedCenter', 'pixelFlags_crCenter', 'pixelFlags_bad', 'pixelFlags_interpolated', 'pixelFlags_saturated', 'centroid_flag', flux_flag_name ] source_selector.signalToNoise.fluxField = self.inst_flux_field source_selector.signalToNoise.errField = self.inst_flux_field + 'Err' source_selector.isolated.parentName = 'parentSourceId' source_selector.isolated.nChildName = 'deblend_nChild' source_selector.unresolved.maximum = 0.5 source_selector.unresolved.name = 'extendedness'
class MatchOptimisticBConfig(pexConfig.Config): """Configuration for MatchOptimisticBTask """ maxMatchDistArcSec = pexConfig.RangeField( doc="Maximum separation between reference objects and sources " "beyond which they will not be considered a match (arcsec)", dtype=float, default=3, min=0, ) numBrightStars = pexConfig.RangeField( doc="Number of bright stars to use", dtype=int, default=50, min=2, ) minMatchedPairs = pexConfig.RangeField( doc="Minimum number of matched pairs; see also minFracMatchedPairs", dtype=int, default=30, min=2, ) minFracMatchedPairs = pexConfig.RangeField( doc="Minimum number of matched pairs as a fraction of the smaller of " "the number of reference stars or the number of good sources; " "the actual minimum is the smaller of this value or minMatchedPairs", dtype=float, default=0.3, min=0, max=1, ) maxOffsetPix = pexConfig.RangeField( doc="Maximum allowed shift of WCS, due to matching (pixel). " "When changing this value, the LoadReferenceObjectsConfig.pixelMargin should also be updated.", dtype=int, default=300, max=4000, ) maxRotationDeg = pexConfig.RangeField( doc="Rotation angle allowed between sources and position reference objects (degrees)", dtype=float, default=1.0, max=6.0, ) allowedNonperpDeg = pexConfig.RangeField( doc="Allowed non-perpendicularity of x and y (degree)", dtype=float, default=3.0, max=45.0, ) numPointsForShape = pexConfig.Field( doc="number of points to define a shape for matching", dtype=int, default=6, ) maxDeterminant = pexConfig.Field( doc="maximum determinant of linear transformation matrix for a usable solution", dtype=float, default=0.02, ) sourceSelector = sourceSelectorRegistry.makeField( doc="How to select sources for cross-matching", default="matcher" ) def setDefaults(self): sourceSelector = self.sourceSelector["matcher"] sourceSelector.setDefaults()
class FgcmBuildStarsConfigBase(pexConfig.Config): """Base config for FgcmBuildStars tasks""" instFluxField = pexConfig.Field( doc= ("Faull name of the source instFlux field to use, including 'instFlux'. " "The associated flag will be implicitly included in badFlags"), dtype=str, default='slot_CalibFlux_instFlux', ) minPerBand = pexConfig.Field( doc="Minimum observations per band", dtype=int, default=2, ) matchRadius = pexConfig.Field( doc="Match radius (arcseconds)", dtype=float, default=1.0, ) isolationRadius = pexConfig.Field( doc="Isolation radius (arcseconds)", dtype=float, default=2.0, ) densityCutNside = pexConfig.Field( doc="Density cut healpix nside", dtype=int, default=128, ) densityCutMaxPerPixel = pexConfig.Field( doc="Density cut number of stars per pixel", dtype=int, default=1000, ) randomSeed = pexConfig.Field( doc="Random seed for high density down-sampling.", dtype=int, default=None, optional=True, ) matchNside = pexConfig.Field( doc="Healpix Nside for matching", dtype=int, default=4096, ) coarseNside = pexConfig.Field( doc="Healpix coarse Nside for partitioning matches", dtype=int, default=8, ) physicalFilterMap = pexConfig.DictField( doc="Mapping from 'physicalFilter' to band.", keytype=str, itemtype=str, default={}, ) requiredBands = pexConfig.ListField( doc="Bands required for each star", dtype=str, default=(), ) primaryBands = pexConfig.ListField( doc=("Bands for 'primary' star matches. " "A star must be observed in one of these bands to be considered " "as a calibration star."), dtype=str, default=None) visitDataRefName = pexConfig.Field( doc="dataRef name for the 'visit' field, usually 'visit'.", dtype=str, default="visit", deprecated= "The visitDataRefname was only used for gen2; this config will be removed after v24." ) ccdDataRefName = pexConfig.Field( doc="dataRef name for the 'ccd' field, usually 'ccd' or 'detector'.", dtype=str, default="ccd", deprecated= "The ccdDataRefname was only used for gen2; this config will be removed after v24." ) doApplyWcsJacobian = pexConfig.Field( doc= "Apply the jacobian of the WCS to the star observations prior to fit?", dtype=bool, default=True) doModelErrorsWithBackground = pexConfig.Field( doc="Model flux errors with background term?", dtype=bool, default=True) psfCandidateName = pexConfig.Field( doc="Name of field with psf candidate flag for propagation", dtype=str, default="calib_psf_candidate") doSubtractLocalBackground = pexConfig.Field(doc=( "Subtract the local background before performing calibration? " "This is only supported for circular aperture calibration fluxes."), dtype=bool, default=False) localBackgroundFluxField = pexConfig.Field( doc="Full name of the local background instFlux field to use.", dtype=str, default='base_LocalBackground_instFlux') sourceSelector = sourceSelectorRegistry.makeField( doc="How to select sources", default="science") apertureInnerInstFluxField = pexConfig.Field( doc=("Full name of instFlux field that contains inner aperture " "flux for aperture correction proxy"), dtype=str, default='base_CircularApertureFlux_12_0_instFlux') apertureOuterInstFluxField = pexConfig.Field( doc=("Full name of instFlux field that contains outer aperture " "flux for aperture correction proxy"), dtype=str, default='base_CircularApertureFlux_17_0_instFlux') doReferenceMatches = pexConfig.Field( doc="Match reference catalog as additional constraint on calibration", dtype=bool, default=True, ) fgcmLoadReferenceCatalog = pexConfig.ConfigurableField( target=FgcmLoadReferenceCatalogTask, doc="FGCM reference object loader", ) nVisitsPerCheckpoint = pexConfig.Field( doc="Number of visits read between checkpoints", dtype=int, default=500, ) def setDefaults(self): sourceSelector = self.sourceSelector["science"] sourceSelector.setDefaults() sourceSelector.doFlags = True sourceSelector.doUnresolved = True sourceSelector.doSignalToNoise = True sourceSelector.doIsolated = True sourceSelector.signalToNoise.minimum = 10.0 sourceSelector.signalToNoise.maximum = 1000.0 # FGCM operates on unresolved sources, and this setting is # appropriate for the current base_ClassificationExtendedness sourceSelector.unresolved.maximum = 0.5
class MatchPessimisticBConfig(pexConfig.Config): """Configuration for MatchPessimisticBTask """ numBrightStars = pexConfig.RangeField( doc="Number of bright stars to use. Sets the max number of patterns " "that can be tested.", dtype=int, default=200, min=2, ) minMatchedPairs = pexConfig.RangeField( doc="Minimum number of matched pairs; see also minFracMatchedPairs.", dtype=int, default=30, min=2, ) minFracMatchedPairs = pexConfig.RangeField( doc="Minimum number of matched pairs as a fraction of the smaller of " "the number of reference stars or the number of good sources; " "the actual minimum is the smaller of this value or " "minMatchedPairs.", dtype=float, default=0.3, min=0, max=1, ) matcherIterations = pexConfig.RangeField( doc="Number of softening iterations in matcher.", dtype=int, default=5, min=1, ) maxOffsetPix = pexConfig.RangeField( doc="Maximum allowed shift of WCS, due to matching (pixel).", dtype=int, default=300, max=4000, ) maxRotationDeg = pexConfig.RangeField( doc="Rotation angle allowed between sources and position reference " "objects (degrees).", dtype=float, default=1.0, max=6.0, ) numPointsForShape = pexConfig.Field( doc="Number of points to define a shape for matching.", dtype=int, default=6, ) numPointsForShapeAttempt = pexConfig.Field( doc="Number of points to try for creating a shape. This value should " "be greater than or equal to numPointsForShape.", dtype=int, default=7, ) numPatternConsensus = pexConfig.Field( doc="Number of implied shift/rotations from patterns that must agree " "before it a given shift/rotation is accepted. This is only used " "after the first softening iteration fails and if both the " "number of reference and source objects is greater than " "numBrightStars.", dtype=int, default=3, ) sourceSelector = sourceSelectorRegistry.makeField( doc="How to select sources for cross-matching. The default " "matcherSourceSelector removes objects with low S/N, bad " "saturated objects, edge objects, and interpolated objects.", default="matcherPessimistic") def setDefaults(self): sourceSelector = self.sourceSelector["matcherPessimistic"] sourceSelector.setDefaults() def validate(self): pexConfig.Config.validate(self) if self.numPointsForShapeAttempt < self.numPointsForShape: raise ValueError("numPointsForShapeAttempt must be greater than " "or equal to numPointsForShape.")
class FinalizeCharacterizationConfig(pipeBase.PipelineTaskConfig, pipelineConnections=FinalizeCharacterizationConnections): """Configuration for FinalizeCharacterizationTask.""" source_selector = sourceSelectorRegistry.makeField( doc="How to select sources", default="science" ) id_column = pexConfig.Field( doc='Name of column in isolated_star_sources with source id.', dtype=str, default='sourceId', ) reserve_selection = pexConfig.ConfigurableField( target=ReserveIsolatedStarsTask, doc='Task to select reserved stars', ) make_psf_candidates = pexConfig.ConfigurableField( target=measAlg.MakePsfCandidatesTask, doc='Task to make psf candidates from selected stars.', ) psf_determiner = measAlg.psfDeterminerRegistry.makeField( 'PSF Determination algorithm', default='piff' ) measurement = pexConfig.ConfigurableField( target=SingleFrameMeasurementTask, doc='Measure sources for aperture corrections' ) measure_ap_corr = pexConfig.ConfigurableField( target=MeasureApCorrTask, doc="Subtask to measure aperture corrections" ) apply_ap_corr = pexConfig.ConfigurableField( target=ApplyApCorrTask, doc="Subtask to apply aperture corrections" ) def setDefaults(self): super().setDefaults() source_selector = self.source_selector['science'] source_selector.setDefaults() # We use the source selector only to select out flagged objects # and signal-to-noise. Isolated, unresolved sources are handled # by the isolated star catalog. source_selector.doFlags = True source_selector.doSignalToNoise = True source_selector.doFluxLimit = False source_selector.doUnresolved = False source_selector.doIsolated = False source_selector.signalToNoise.minimum = 20.0 source_selector.signalToNoise.maximum = 1000.0 source_selector.signalToNoise.fluxField = 'base_GaussianFlux_instFlux' source_selector.signalToNoise.errField = 'base_GaussianFlux_instFluxErr' source_selector.flags.bad = ['base_PixelFlags_flag_edge', 'base_PixelFlags_flag_interpolatedCenter', 'base_PixelFlags_flag_saturatedCenter', 'base_PixelFlags_flag_crCenter', 'base_PixelFlags_flag_bad', 'base_PixelFlags_flag_interpolated', 'base_PixelFlags_flag_saturated', 'slot_Centroid_flag', 'base_GaussianFlux_flag'] # Configure aperture correction to select only high s/n sources (that # were used in the psf modeling) to avoid background problems when # computing the aperture correction map. self.measure_ap_corr.sourceSelector = 'science' ap_selector = self.measure_ap_corr.sourceSelector['science'] ap_selector.doFluxLimit = False ap_selector.doFlags = True ap_selector.doUnresolved = False ap_selector.doSignalToNoise = True ap_selector.doIsolated = False ap_selector.flags.good = ['calib_psf_used'] ap_selector.flags.bad = [] ap_selector.signalToNoise.minimum = 200.0 ap_selector.signalToNoise.maximum = None ap_selector.signalToNoise.fluxField = 'base_PsfFlux_instFlux' ap_selector.signalToNoise.errField = 'base_PsfFlux_instFluxErr' import lsst.meas.modelfit # noqa: F401 import lsst.meas.extensions.photometryKron # noqa: F401 import lsst.meas.extensions.convolved # noqa: F401 import lsst.meas.extensions.gaap # noqa: F401 import lsst.meas.extensions.shapeHSM # noqa: F401 # Set up measurement defaults self.measurement.plugins.names = [ 'base_PsfFlux', 'base_GaussianFlux', 'modelfit_DoubleShapeletPsfApprox', 'modelfit_CModel', 'ext_photometryKron_KronFlux', 'ext_convolved_ConvolvedFlux', 'ext_gaap_GaapFlux', 'ext_shapeHSM_HsmShapeRegauss', 'ext_shapeHSM_HsmSourceMoments', 'ext_shapeHSM_HsmPsfMoments', 'ext_shapeHSM_HsmSourceMomentsRound', ] self.measurement.slots.modelFlux = 'modelfit_CModel' self.measurement.plugins['ext_convolved_ConvolvedFlux'].seeing.append(8.0) self.measurement.plugins['ext_gaap_GaapFlux'].sigmas = [ 0.5, 0.7, 1.0, 1.5, 2.5, 3.0 ] self.measurement.plugins['ext_gaap_GaapFlux'].doPsfPhotometry = True self.measurement.slots.shape = 'ext_shapeHSM_HsmSourceMoments' self.measurement.slots.psfShape = 'ext_shapeHSM_HsmPsfMoments' self.measurement.plugins['ext_shapeHSM_HsmShapeRegauss'].deblendNChild = "" # Turn off slot setting for measurement for centroid and shape # (for which we use the input src catalog measurements) self.measurement.slots.centroid = None self.measurement.slots.apFlux = None self.measurement.slots.calibFlux = None names = self.measurement.plugins['ext_convolved_ConvolvedFlux'].getAllResultNames() self.measure_ap_corr.allowFailure += names names = self.measurement.plugins["ext_gaap_GaapFlux"].getAllGaapResultNames() self.measure_ap_corr.allowFailure += names
class MatchPessimisticBConfig(pexConfig.Config): """Configuration for MatchPessimisticBTask """ numBrightStars = pexConfig.RangeField( doc="Number of bright stars to use. Sets the max number of patterns " "that can be tested.", dtype=int, default=200, min=2, ) minMatchedPairs = pexConfig.RangeField( doc="Minimum number of matched pairs; see also minFracMatchedPairs.", dtype=int, default=30, min=2, ) minFracMatchedPairs = pexConfig.RangeField( doc="Minimum number of matched pairs as a fraction of the smaller of " "the number of reference stars or the number of good sources; " "the actual minimum is the smaller of this value or " "minMatchedPairs.", dtype=float, default=0.3, min=0, max=1, ) matcherIterations = pexConfig.RangeField( doc="Number of softening iterations in matcher.", dtype=int, default=5, min=1, ) maxOffsetPix = pexConfig.RangeField( doc="Maximum allowed shift of WCS, due to matching (pixel). " "When changing this value, the " "LoadReferenceObjectsConfig.pixelMargin should also be updated.", dtype=int, default=300, max=4000, ) maxRotationDeg = pexConfig.RangeField( doc="Rotation angle allowed between sources and position reference " "objects (degrees).", dtype=float, default=1.0, max=6.0, ) numPointsForShape = pexConfig.Field( doc="Number of points to define a shape for matching.", dtype=int, default=6, ) numPointsForShapeAttempt = pexConfig.Field( doc="Number of points to try for creating a shape. This value should " "be greater than or equal to numPointsForShape. Besides " "loosening the signal to noise cut in the matcherSourceSelector, " "increasing this number will solve CCDs where no match was found.", dtype=int, default=6, ) minMatchDistPixels = pexConfig.RangeField( doc="Distance in units of pixels to always consider a source-" "reference pair a match. This prevents the astrometric fitter " "from over-fitting and removing stars that should be matched and " "allows for inclusion of new matches as the wcs improves.", dtype=float, default=1.0, min=0.0, max=6.0, ) numPatternConsensus = pexConfig.Field( doc="Number of implied shift/rotations from patterns that must agree " "before it a given shift/rotation is accepted. This is only used " "after the first softening iteration fails and if both the " "number of reference and source objects is greater than " "numBrightStars.", dtype=int, default=3, ) sourceSelector = sourceSelectorRegistry.makeField( doc="How to select sources for cross-matching. The default " "matcherSourceSelector removes objects with low S/N, bad " "saturated objects, edge objects, and interpolated objects.", default="matcherPessimistic") def setDefaults(self): sourceSelector = self.sourceSelector["matcherPessimistic"] sourceSelector.setDefaults() def validate(self): pexConfig.Config.validate(self) if self.numPointsForShapeAttempt < self.numPointsForShape: raise ValueError("numPointsForShapeAttempt must be greater than " "or equal to numPointsForShape.")
class JointcalConfig(pexConfig.Config): """Config for JointcalTask""" doAstrometry = pexConfig.Field( doc="Fit astrometry and write the fitted result.", dtype=bool, default=True) doPhotometry = pexConfig.Field( doc="Fit photometry and write the fitted result.", dtype=bool, default=True) coaddName = pexConfig.Field( doc="Type of coadd, typically deep or goodSeeing", dtype=str, default="deep") positionErrorPedestal = pexConfig.Field( doc="Systematic term to apply to the measured position error (pixels)", dtype=float, default=0.02, ) photometryErrorPedestal = pexConfig.Field( doc= "Systematic term to apply to the measured error on flux or magnitude as a " "fraction of source flux or magnitude delta (e.g. 0.05 is 5% of flux or +50 millimag).", dtype=float, default=0.0, ) # TODO: DM-6885 matchCut should be an afw.geom.Angle matchCut = pexConfig.Field( doc="Matching radius between fitted and reference stars (arcseconds)", dtype=float, default=3.0, ) minMeasurements = pexConfig.Field( doc= "Minimum number of associated measured stars for a fitted star to be included in the fit", dtype=int, default=2, ) minMeasuredStarsPerCcd = pexConfig.Field( doc= "Minimum number of measuredStars per ccdImage before printing warnings", dtype=int, default=100, ) minRefStarsPerCcd = pexConfig.Field( doc= "Minimum number of measuredStars per ccdImage before printing warnings", dtype=int, default=30, ) allowLineSearch = pexConfig.Field( doc= "Allow a line search during minimization, if it is reasonable for the model" " (models with a significant non-linear component, e.g. constrainedPhotometry).", dtype=bool, default=False) astrometrySimpleOrder = pexConfig.Field( doc="Polynomial order for fitting the simple astrometry model.", dtype=int, default=3, ) astrometryChipOrder = pexConfig.Field( doc= "Order of the per-chip transform for the constrained astrometry model.", dtype=int, default=1, ) astrometryVisitOrder = pexConfig.Field( doc= "Order of the per-visit transform for the constrained astrometry model.", dtype=int, default=5, ) useInputWcs = pexConfig.Field( doc="Use the input calexp WCSs to initialize a SimpleAstrometryModel.", dtype=bool, default=True, ) astrometryModel = pexConfig.ChoiceField( doc="Type of model to fit to astrometry", dtype=str, default="constrained", allowed={ "simple": "One polynomial per ccd", "constrained": "One polynomial per ccd, and one polynomial per visit" }) photometryModel = pexConfig.ChoiceField( doc="Type of model to fit to photometry", dtype=str, default="constrainedMagnitude", allowed={ "simpleFlux": "One constant zeropoint per ccd and visit, fitting in flux space.", "constrainedFlux": "Constrained zeropoint per ccd, and one polynomial per visit," " fitting in flux space.", "simpleMagnitude": "One constant zeropoint per ccd and visit," " fitting in magnitude space.", "constrainedMagnitude": "Constrained zeropoint per ccd, and one polynomial per visit," " fitting in magnitude space.", }) photometryVisitOrder = pexConfig.Field( doc= "Order of the per-visit polynomial transform for the constrained photometry model.", dtype=int, default=7, ) photometryDoRankUpdate = pexConfig.Field( doc="Do the rank update step during minimization. " "Skipping this can help deal with models that are too non-linear.", dtype=bool, default=True, ) astrometryDoRankUpdate = pexConfig.Field( doc= "Do the rank update step during minimization (should not change the astrometry fit). " "Skipping this can help deal with models that are too non-linear.", dtype=bool, default=True, ) outlierRejectSigma = pexConfig.Field( doc="How many sigma to reject outliers at during minimization.", dtype=float, default=5.0, ) maxPhotometrySteps = pexConfig.Field( doc= "Maximum number of minimize iterations to take when fitting photometry.", dtype=int, default=20, ) maxAstrometrySteps = pexConfig.Field( doc= "Maximum number of minimize iterations to take when fitting photometry.", dtype=int, default=20, ) astrometryRefObjLoader = pexConfig.ConfigurableField( target=LoadIndexedReferenceObjectsTask, doc="Reference object loader for astrometric fit", ) photometryRefObjLoader = pexConfig.ConfigurableField( target=LoadIndexedReferenceObjectsTask, doc="Reference object loader for photometric fit", ) sourceSelector = sourceSelectorRegistry.makeField( doc="How to select sources for cross-matching", default="astrometry") writeInitMatrix = pexConfig.Field( dtype=bool, doc= "Write the pre/post-initialization Hessian and gradient to text files, for debugging." "The output files will be of the form 'astrometry_preinit-mat.txt', in the current directory." "Note that these files are the dense versions of the matrix, and so may be very large.", default=False) writeChi2ContributionFiles = pexConfig.Field( dtype=bool, doc= "Write initial/final fit files containing the contributions to chi2.", default=False) sourceFluxType = pexConfig.Field( dtype=str, doc= "Source flux field to use in source selection and to get fluxes from the catalog.", default='Calib') def setDefaults(self): sourceSelector = self.sourceSelector["astrometry"] sourceSelector.setDefaults() # don't want to lose existing flags, just add to them. sourceSelector.badFlags.extend(["slot_Shape_flag"]) # This should be used to set the FluxField value in jointcal::JointcalControl sourceSelector.sourceFluxType = self.sourceFluxType
class JointcalConfig(pexConfig.Config): """Config for jointcalTask""" doAstrometry = pexConfig.Field( doc="Fit astrometry and write the fitted result.", dtype=bool, default=True) doPhotometry = pexConfig.Field( doc="Fit photometry and write the fitted result.", dtype=bool, default=True) coaddName = pexConfig.Field( doc="Type of coadd, typically deep or goodSeeing", dtype=str, default="deep") posError = pexConfig.Field( doc="Constant term for error on position (in pixel unit)", dtype=float, default=0.02, ) # TODO: DM-6885 matchCut should be an afw.geom.Angle matchCut = pexConfig.Field( doc="Matching radius between fitted and reference stars (arcseconds)", dtype=float, default=3.0, ) minMeasurements = pexConfig.Field( doc= "Minimum number of associated measured stars for a fitted star to be included in the fit", dtype=int, default=2, ) polyOrder = pexConfig.Field( doc="Polynomial order for fitting distorsion", dtype=int, default=3, ) astrometryModel = pexConfig.ChoiceField( doc="Type of model to fit to astrometry", dtype=str, default="simplePoly", allowed={ "simplePoly": "One polynomial per ccd", "constrainedPoly": "One polynomial per ccd, and one polynomial per visit" }) photometryModel = pexConfig.ChoiceField( doc="Type of model to fit to photometry", dtype=str, default="simple", allowed={ "simple": "One constant zeropoint per ccd and visit", "constrained": "Constrained zeropoint per ccd, and one polynomial per visit" }) astrometryRefObjLoader = pexConfig.ConfigurableField( target=LoadAstrometryNetObjectsTask, doc="Reference object loader for astrometric fit", ) photometryRefObjLoader = pexConfig.ConfigurableField( target=LoadAstrometryNetObjectsTask, doc="Reference object loader for photometric fit", ) sourceSelector = sourceSelectorRegistry.makeField( doc="How to select sources for cross-matching", default="astrometry") def setDefaults(self): sourceSelector = self.sourceSelector["astrometry"] sourceSelector.setDefaults() # don't want to lose existing flags, just add to them. sourceSelector.badFlags.extend(["slot_Shape_flag"]) # This should be used to set the FluxField value in jointcal::JointcalControl sourceSelector.sourceFluxType = 'Calib'
class FgcmBuildStarsConfig(pexConfig.Config): """Config for FgcmBuildStarsTask""" fluxField = pexConfig.Field( doc=( "Name of the source flux field to use. The associated flag field\n" "('<name>_flag') will be implicitly included in badFlags"), dtype=str, default='slot_CalibFlux_instFlux', ) remake = pexConfig.Field( doc= "Remake visit catalog and stars even if they are already in the butler tree.", dtype=bool, default=False, ) minPerBand = pexConfig.Field( doc="Minimum observations per band", dtype=int, default=2, ) matchRadius = pexConfig.Field( doc="Match radius (arcseconds)", dtype=float, default=1.0, ) isolationRadius = pexConfig.Field( doc="Isolation radius (arcseconds)", dtype=float, default=2.0, ) densityCutNside = pexConfig.Field( doc="Density cut healpix nside", dtype=int, default=128, ) densityCutMaxPerPixel = pexConfig.Field( doc="Density cut number of stars per pixel", dtype=int, default=1000, ) matchNside = pexConfig.Field( doc="Healpix Nside for matching", dtype=int, default=4096, ) coarseNside = pexConfig.Field( doc="Healpix coarse Nside for partitioning matches", dtype=int, default=8, ) filterToBand = pexConfig.DictField( doc="filterName to band mapping", keytype=str, itemtype=str, default={}, ) requiredBands = pexConfig.ListField( doc="Bands required for each star", dtype=str, default=(), ) referenceBands = pexConfig.ListField( doc="Reference bands for primary matches", dtype=str, default=None) referenceCCD = pexConfig.Field( doc="Reference CCD for scanning visits", dtype=int, default=13, ) checkAllCcds = pexConfig.Field( doc="Check all CCDs. Necessary for testing", dtype=bool, default=False, ) visitDataRefName = pexConfig.Field( doc="dataRef name for the 'visit' field", dtype=str, default="visit") ccdDataRefName = pexConfig.Field(doc="dataRef name for the 'ccd' field", dtype=str, default="ccd") applyJacobian = pexConfig.Field(doc="Apply Jacobian correction?", dtype=bool, default=False) jacobianName = pexConfig.Field( doc="Name of field with jacobian correction", dtype=str, default="base_Jacobian_value") renormalizeFlats = pexConfig.Field( doc="Renormalize large-scale flat-field changes?", dtype=bool, default=False) sourceSelector = sourceSelectorRegistry.makeField( doc="How to select sources", default="science") apertureInnerFluxField = pexConfig.Field( doc="Field that contains inner aperture for aperture correction proxy", dtype=str, default='base_CircularApertureFlux_12_0_instFlux') apertureOuterFluxField = pexConfig.Field( doc="Field that contains outer aperture for aperture correction proxy", dtype=str, default='base_CircularApertureFlux_17_0_instFlux') def setDefaults(self): sourceSelector = self.sourceSelector["science"] sourceSelector.setDefaults() fluxFlagName = self.fluxField[0:-len('instFlux')] + 'flag' sourceSelector.flags.bad = [ 'base_PixelFlags_flag_edge', 'base_PixelFlags_flag_interpolatedCenter', 'base_PixelFlags_flag_saturatedCenter', 'base_PixelFlags_flag_crCenter', 'base_PixelFlags_flag_bad', 'base_PixelFlags_flag_interpolated', 'base_PixelFlags_flag_saturated', 'slot_Centroid_flag', fluxFlagName ] sourceSelector.doFlags = True sourceSelector.doUnresolved = True sourceSelector.doSignalToNoise = True sourceSelector.doIsolated = True sourceSelector.signalToNoise.fluxField = self.fluxField sourceSelector.signalToNoise.errField = self.fluxField + 'Err' sourceSelector.signalToNoise.minimum = 10.0 sourceSelector.signalToNoise.maximum = 1000.0 sourceSelector.unresolved.maximum = 0.5
class JointcalConfig(pexConfig.Config): """Config for JointcalTask""" doAstrometry = pexConfig.Field( doc="Fit astrometry and write the fitted result.", dtype=bool, default=True) doPhotometry = pexConfig.Field( doc="Fit photometry and write the fitted result.", dtype=bool, default=True) coaddName = pexConfig.Field( doc="Type of coadd, typically deep or goodSeeing", dtype=str, default="deep") posError = pexConfig.Field( doc="Constant term for error on position (in pixel unit)", dtype=float, default=0.02, ) # TODO: DM-6885 matchCut should be an afw.geom.Angle matchCut = pexConfig.Field( doc="Matching radius between fitted and reference stars (arcseconds)", dtype=float, default=3.0, ) minMeasurements = pexConfig.Field( doc= "Minimum number of associated measured stars for a fitted star to be included in the fit", dtype=int, default=2, ) minMeasuredStarsPerCcd = pexConfig.Field( doc= "Minimum number of measuredStars per ccdImage before printing warnings", dtype=int, default=100, ) minRefStarsPerCcd = pexConfig.Field( doc= "Minimum number of measuredStars per ccdImage before printing warnings", dtype=int, default=30, ) astrometrySimpleOrder = pexConfig.Field( doc="Polynomial order for fitting the simple astrometry model.", dtype=int, default=3, ) astrometryChipOrder = pexConfig.Field( doc= "Order of the per-chip transform for the constrained astrometry model.", dtype=int, default=1, ) astrometryVisitOrder = pexConfig.Field( doc= "Order of the per-visit transform for the constrained astrometry model.", dtype=int, default=5, ) useInputWcs = pexConfig.Field( doc="Use the input calexp WCSs to initialize a SimpleAstrometryModel.", dtype=bool, default=True, ) astrometryModel = pexConfig.ChoiceField( doc="Type of model to fit to astrometry", dtype=str, default="simple", allowed={ "simple": "One polynomial per ccd", "constrained": "One polynomial per ccd, and one polynomial per visit" }) photometryModel = pexConfig.ChoiceField( doc="Type of model to fit to photometry", dtype=str, default="simple", allowed={ "simple": "One constant zeropoint per ccd and visit", "constrained": "Constrained zeropoint per ccd, and one polynomial per visit" }) photometryVisitOrder = pexConfig.Field( doc= "Order of the per-visit polynomial transform for the constrained photometry model.", dtype=int, default=7, ) astrometryRefObjLoader = pexConfig.ConfigurableField( target=LoadIndexedReferenceObjectsTask, doc="Reference object loader for astrometric fit", ) photometryRefObjLoader = pexConfig.ConfigurableField( target=LoadIndexedReferenceObjectsTask, doc="Reference object loader for photometric fit", ) sourceSelector = sourceSelectorRegistry.makeField( doc="How to select sources for cross-matching", default="astrometry") writeChi2ContributionFiles = pexConfig.Field( dtype=bool, doc= "Write initial/final fit files containing the contributions to chi2.", default=False) sourceFluxType = pexConfig.Field( dtype=str, doc= "Source flux field to use in source selection and to get fluxes from the catalog.", default='Calib') def setDefaults(self): sourceSelector = self.sourceSelector["astrometry"] sourceSelector.setDefaults() # don't want to lose existing flags, just add to them. sourceSelector.badFlags.extend(["slot_Shape_flag"]) # This should be used to set the FluxField value in jointcal::JointcalControl sourceSelector.sourceFluxType = self.sourceFluxType