def astrometryBatch(colmap=None, runName='opsim', extraSql=None, extraMetadata=None, nside=64, ditherStacker=None, ditherkwargs=None):
    'Metrics for evaluating proper motion and parallax.\n\n    Parameters\n    ----------\n    colmap : dict or None, optional\n        A dictionary with a mapping of column names. Default will use OpsimV4 column names.\n    runName : str, optional\n        The name of the simulated survey. Default is "opsim".\n    nside : int, optional\n        Nside for the healpix slicer. Default 64.\n    extraSql : str or None, optional\n        Additional sql constraint to apply to all metrics.\n    extraMetadata : str or None, optional\n        Additional metadata to apply to all results.\n    ditherStacker: str or rubin_sim.maf.stackers.BaseDitherStacker\n        Optional dither stacker to use to define ra/dec columns.\n    ditherkwargs: dict, optional\n        Optional dictionary of kwargs for the dither stacker.\n\n    Returns\n    -------\n    metricBundleDict\n    '
    if (colmap is None):
        colmap = ColMapDict('fbs')
    bundleList = []
    sql = ''
    metadata = 'All visits'
    if ((extraSql is not None) and (len(extraSql) > 0)):
        sql = extraSql
        if (extraMetadata is None):
            metadata = extraSql.replace('filter =', '').replace('filter=', '')
            metadata = metadata.replace('"', '').replace("'", '')
    if (extraMetadata is not None):
        metadata = extraMetadata
    subgroup = metadata
    (raCol, decCol, degrees, ditherStacker, ditherMeta) = radecCols(ditherStacker, colmap, ditherkwargs)
    metadata = combineMetadata(metadata, ditherMeta)
    rmags_para = [22.4, 24.0]
    rmags_pm = [20.5, 24.0]
    parallaxStacker = stackers.ParallaxFactorStacker(raCol=raCol, decCol=decCol, dateCol=colmap['mjd'], degrees=degrees)
    dcrStacker = stackers.DcrStacker(filterCol=colmap['filter'], altCol=colmap['alt'], degrees=degrees, raCol=raCol, decCol=decCol, lstCol=colmap['lst'], site='LSST', mjdCol=colmap['mjd'])
    slicer = slicers.HealpixSlicer(nside=nside, lonCol=raCol, latCol=decCol, latLonDeg=degrees)
    subsetPlots = [plots.HealpixSkyMap(), plots.HealpixHistogram()]
    displayDict = {'group': 'SRD Parallax', 'subgroup': subgroup, 'order': 0, 'caption': None}
    plotmaxVals = (2.0, 15.0)
    summary = [metrics.AreaSummaryMetric(area=18000, reduce_func=np.median, decreasing=False, metricName='Median Parallax Error (18k)')]
    summary.append(metrics.PercentileMetric(percentile=95, metricName='95th Percentile Parallax Error'))
    summary.extend(standardSummary())
    for (rmag, plotmax) in zip(rmags_para, plotmaxVals):
        plotDict = {'xMin': 0, 'xMax': plotmax, 'colorMin': 0, 'colorMax': plotmax}
        metric = metrics.ParallaxMetric(metricName=('Parallax Error @ %.1f' % rmag), rmag=rmag, seeingCol=colmap['seeingGeom'], filterCol=colmap['filter'], m5Col=colmap['fiveSigmaDepth'], normalize=False)
        bundle = mb.MetricBundle(metric, slicer, sql, metadata=metadata, stackerList=[parallaxStacker, ditherStacker], displayDict=displayDict, plotDict=plotDict, summaryMetrics=summary, plotFuncs=subsetPlots)
        bundleList.append(bundle)
        displayDict['order'] += 1
    for rmag in rmags_para:
        metric = metrics.ParallaxMetric(metricName=('Normalized Parallax @ %.1f' % rmag), rmag=rmag, seeingCol=colmap['seeingGeom'], filterCol=colmap['filter'], m5Col=colmap['fiveSigmaDepth'], normalize=True)
        bundle = mb.MetricBundle(metric, slicer, sql, metadata=metadata, stackerList=[parallaxStacker, ditherStacker], displayDict=displayDict, summaryMetrics=standardSummary(), plotFuncs=subsetPlots)
        bundleList.append(bundle)
        displayDict['order'] += 1
    for rmag in rmags_para:
        metric = metrics.ParallaxCoverageMetric(metricName=('Parallax Coverage @ %.1f' % rmag), rmag=rmag, m5Col=colmap['fiveSigmaDepth'], mjdCol=colmap['mjd'], filterCol=colmap['filter'], seeingCol=colmap['seeingGeom'])
        bundle = mb.MetricBundle(metric, slicer, sql, metadata=metadata, stackerList=[parallaxStacker, ditherStacker], displayDict=displayDict, summaryMetrics=standardSummary(), plotFuncs=subsetPlots)
        bundleList.append(bundle)
        displayDict['order'] += 1
    for rmag in rmags_para:
        metric = metrics.ParallaxDcrDegenMetric(metricName=('Parallax-DCR degeneracy @ %.1f' % rmag), rmag=rmag, seeingCol=colmap['seeingEff'], filterCol=colmap['filter'], m5Col=colmap['fiveSigmaDepth'])
        caption = ('Correlation between parallax offset magnitude and hour angle for a r=%.1f star.' % rmag)
        caption += ' (0 is good, near -1 or 1 is bad).'
        bundle = mb.MetricBundle(metric, slicer, sql, metadata=metadata, stackerList=[dcrStacker, parallaxStacker, ditherStacker], displayDict=displayDict, summaryMetrics=standardSummary(), plotFuncs=subsetPlots)
        bundleList.append(bundle)
        displayDict['order'] += 1
    displayDict = {'group': 'SRD Proper Motion', 'subgroup': subgroup, 'order': 0, 'caption': None}
    plotmaxVals = (1.0, 5.0)
    summary = [metrics.AreaSummaryMetric(area=18000, reduce_func=np.median, decreasing=False, metricName='Median Proper Motion Error (18k)')]
    summary.append(metrics.PercentileMetric(metricName='95th Percentile Proper Motion Error'))
    summary.extend(standardSummary())
    for (rmag, plotmax) in zip(rmags_pm, plotmaxVals):
        plotDict = {'xMin': 0, 'xMax': plotmax, 'colorMin': 0, 'colorMax': plotmax}
        metric = metrics.ProperMotionMetric(metricName=('Proper Motion Error @ %.1f' % rmag), rmag=rmag, m5Col=colmap['fiveSigmaDepth'], mjdCol=colmap['mjd'], filterCol=colmap['filter'], seeingCol=colmap['seeingGeom'], normalize=False)
        bundle = mb.MetricBundle(metric, slicer, sql, metadata=metadata, stackerList=[ditherStacker], displayDict=displayDict, plotDict=plotDict, summaryMetrics=summary, plotFuncs=subsetPlots)
        bundleList.append(bundle)
        displayDict['order'] += 1
    for rmag in rmags_pm:
        metric = metrics.ProperMotionMetric(metricName=('Normalized Proper Motion @ %.1f' % rmag), rmag=rmag, m5Col=colmap['fiveSigmaDepth'], mjdCol=colmap['mjd'], filterCol=colmap['filter'], seeingCol=colmap['seeingGeom'], normalize=True)
        bundle = mb.MetricBundle(metric, slicer, sql, metadata=metadata, stackerList=[ditherStacker], displayDict=displayDict, summaryMetrics=standardSummary(), plotFuncs=subsetPlots)
        bundleList.append(bundle)
        displayDict['order'] += 1
    for b in bundleList:
        b.setRunName(runName)
    return mb.makeBundlesDictFromList(bundleList)
Metrics for evaluating proper motion and parallax.

Parameters
----------
colmap : dict or None, optional
    A dictionary with a mapping of column names. Default will use OpsimV4 column names.
runName : str, optional
    The name of the simulated survey. Default is "opsim".
nside : int, optional
    Nside for the healpix slicer. Default 64.
extraSql : str or None, optional
    Additional sql constraint to apply to all metrics.
extraMetadata : str or None, optional
    Additional metadata to apply to all results.
ditherStacker: str or rubin_sim.maf.stackers.BaseDitherStacker
    Optional dither stacker to use to define ra/dec columns.
ditherkwargs: dict, optional
    Optional dictionary of kwargs for the dither stacker.

Returns
-------
metricBundleDict
def astrometryBatch(colmap=None, runName='opsim', extraSql=None, extraMetadata=None, nside=64, ditherStacker=None, ditherkwargs=None):
    'Metrics for evaluating proper motion and parallax.\n\n    Parameters\n    ----------\n    colmap : dict or None, optional\n        A dictionary with a mapping of column names. Default will use OpsimV4 column names.\n    runName : str, optional\n        The name of the simulated survey. Default is "opsim".\n    nside : int, optional\n        Nside for the healpix slicer. Default 64.\n    extraSql : str or None, optional\n        Additional sql constraint to apply to all metrics.\n    extraMetadata : str or None, optional\n        Additional metadata to apply to all results.\n    ditherStacker: str or rubin_sim.maf.stackers.BaseDitherStacker\n        Optional dither stacker to use to define ra/dec columns.\n    ditherkwargs: dict, optional\n        Optional dictionary of kwargs for the dither stacker.\n\n    Returns\n    -------\n    metricBundleDict\n    '
    if (colmap is None):
        colmap = ColMapDict('fbs')
    bundleList = []
    sql = 
    metadata = 'All visits'
    if ((extraSql is not None) and (len(extraSql) > 0)):
        sql = extraSql
        if (extraMetadata is None):
            metadata = extraSql.replace('filter =', ).replace('filter=', )
            metadata = metadata.replace('"', ).replace("'", )
    if (extraMetadata is not None):
        metadata = extraMetadata
    subgroup = metadata
    (raCol, decCol, degrees, ditherStacker, ditherMeta) = radecCols(ditherStacker, colmap, ditherkwargs)
    metadata = combineMetadata(metadata, ditherMeta)
    rmags_para = [22.4, 24.0]
    rmags_pm = [20.5, 24.0]
    parallaxStacker = stackers.ParallaxFactorStacker(raCol=raCol, decCol=decCol, dateCol=colmap['mjd'], degrees=degrees)
    dcrStacker = stackers.DcrStacker(filterCol=colmap['filter'], altCol=colmap['alt'], degrees=degrees, raCol=raCol, decCol=decCol, lstCol=colmap['lst'], site='LSST', mjdCol=colmap['mjd'])
    slicer = slicers.HealpixSlicer(nside=nside, lonCol=raCol, latCol=decCol, latLonDeg=degrees)
    subsetPlots = [plots.HealpixSkyMap(), plots.HealpixHistogram()]
    displayDict = {'group': 'SRD Parallax', 'subgroup': subgroup, 'order': 0, 'caption': None}
    plotmaxVals = (2.0, 15.0)
    summary = [metrics.AreaSummaryMetric(area=18000, reduce_func=np.median, decreasing=False, metricName='Median Parallax Error (18k)')]
    summary.append(metrics.PercentileMetric(percentile=95, metricName='95th Percentile Parallax Error'))
    summary.extend(standardSummary())
    for (rmag, plotmax) in zip(rmags_para, plotmaxVals):
        plotDict = {'xMin': 0, 'xMax': plotmax, 'colorMin': 0, 'colorMax': plotmax}
        metric = metrics.ParallaxMetric(metricName=('Parallax Error @ %.1f' % rmag), rmag=rmag, seeingCol=colmap['seeingGeom'], filterCol=colmap['filter'], m5Col=colmap['fiveSigmaDepth'], normalize=False)
        bundle = mb.MetricBundle(metric, slicer, sql, metadata=metadata, stackerList=[parallaxStacker, ditherStacker], displayDict=displayDict, plotDict=plotDict, summaryMetrics=summary, plotFuncs=subsetPlots)
        bundleList.append(bundle)
        displayDict['order'] += 1
    for rmag in rmags_para:
        metric = metrics.ParallaxMetric(metricName=('Normalized Parallax @ %.1f' % rmag), rmag=rmag, seeingCol=colmap['seeingGeom'], filterCol=colmap['filter'], m5Col=colmap['fiveSigmaDepth'], normalize=True)
        bundle = mb.MetricBundle(metric, slicer, sql, metadata=metadata, stackerList=[parallaxStacker, ditherStacker], displayDict=displayDict, summaryMetrics=standardSummary(), plotFuncs=subsetPlots)
        bundleList.append(bundle)
        displayDict['order'] += 1
    for rmag in rmags_para:
        metric = metrics.ParallaxCoverageMetric(metricName=('Parallax Coverage @ %.1f' % rmag), rmag=rmag, m5Col=colmap['fiveSigmaDepth'], mjdCol=colmap['mjd'], filterCol=colmap['filter'], seeingCol=colmap['seeingGeom'])
        bundle = mb.MetricBundle(metric, slicer, sql, metadata=metadata, stackerList=[parallaxStacker, ditherStacker], displayDict=displayDict, summaryMetrics=standardSummary(), plotFuncs=subsetPlots)
        bundleList.append(bundle)
        displayDict['order'] += 1
    for rmag in rmags_para:
        metric = metrics.ParallaxDcrDegenMetric(metricName=('Parallax-DCR degeneracy @ %.1f' % rmag), rmag=rmag, seeingCol=colmap['seeingEff'], filterCol=colmap['filter'], m5Col=colmap['fiveSigmaDepth'])
        caption = ('Correlation between parallax offset magnitude and hour angle for a r=%.1f star.' % rmag)
        caption += ' (0 is good, near -1 or 1 is bad).'
        bundle = mb.MetricBundle(metric, slicer, sql, metadata=metadata, stackerList=[dcrStacker, parallaxStacker, ditherStacker], displayDict=displayDict, summaryMetrics=standardSummary(), plotFuncs=subsetPlots)
        bundleList.append(bundle)
        displayDict['order'] += 1
    displayDict = {'group': 'SRD Proper Motion', 'subgroup': subgroup, 'order': 0, 'caption': None}
    plotmaxVals = (1.0, 5.0)
    summary = [metrics.AreaSummaryMetric(area=18000, reduce_func=np.median, decreasing=False, metricName='Median Proper Motion Error (18k)')]
    summary.append(metrics.PercentileMetric(metricName='95th Percentile Proper Motion Error'))
    summary.extend(standardSummary())
    for (rmag, plotmax) in zip(rmags_pm, plotmaxVals):
        plotDict = {'xMin': 0, 'xMax': plotmax, 'colorMin': 0, 'colorMax': plotmax}
        metric = metrics.ProperMotionMetric(metricName=('Proper Motion Error @ %.1f' % rmag), rmag=rmag, m5Col=colmap['fiveSigmaDepth'], mjdCol=colmap['mjd'], filterCol=colmap['filter'], seeingCol=colmap['seeingGeom'], normalize=False)
        bundle = mb.MetricBundle(metric, slicer, sql, metadata=metadata, stackerList=[ditherStacker], displayDict=displayDict, plotDict=plotDict, summaryMetrics=summary, plotFuncs=subsetPlots)
        bundleList.append(bundle)
        displayDict['order'] += 1
    for rmag in rmags_pm:
        metric = metrics.ProperMotionMetric(metricName=('Normalized Proper Motion @ %.1f' % rmag), rmag=rmag, m5Col=colmap['fiveSigmaDepth'], mjdCol=colmap['mjd'], filterCol=colmap['filter'], seeingCol=colmap['seeingGeom'], normalize=True)
        bundle = mb.MetricBundle(metric, slicer, sql, metadata=metadata, stackerList=[ditherStacker], displayDict=displayDict, summaryMetrics=standardSummary(), plotFuncs=subsetPlots)
        bundleList.append(bundle)
        displayDict['order'] += 1
    for b in bundleList:
        b.setRunName(runName)
    return mb.makeBundlesDictFromList(bundleList)