def fOBatch(colmap=None, runName='opsim', extraSql=None, extraMetadata=None, nside=64, benchmarkArea=18000, benchmarkNvisits=825, minNvisits=750):
    'Metrics for calculating fO.\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\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(None, colmap, None)
    metadata = combineMetadata(metadata, ditherMeta)
    slicer = slicers.HealpixSlicer(nside=nside, lonCol=raCol, latCol=decCol, latLonDeg=degrees)
    displayDict = {'group': 'SRD FO metrics', 'subgroup': subgroup, 'order': 0}
    metric = metrics.CountExplimMetric(col=colmap['mjd'], metricName='fO', expCol=colmap['exptime'])
    plotDict = {'xlabel': 'Number of Visits', 'Asky': benchmarkArea, 'Nvisit': benchmarkNvisits, 'xMin': 0, 'xMax': 1500}
    summaryMetrics = [metrics.fOArea(nside=nside, norm=False, metricName='fOArea', Asky=benchmarkArea, Nvisit=benchmarkNvisits), metrics.fOArea(nside=nside, norm=True, metricName='fOArea/benchmark', Asky=benchmarkArea, Nvisit=benchmarkNvisits), metrics.fONv(nside=nside, norm=False, metricName='fONv', Asky=benchmarkArea, Nvisit=benchmarkNvisits), metrics.fONv(nside=nside, norm=True, metricName='fONv/benchmark', Asky=benchmarkArea, Nvisit=benchmarkNvisits), metrics.fOArea(nside=nside, norm=False, metricName=f'fOArea_{minNvisits}', Asky=benchmarkArea, Nvisit=minNvisits)]
    caption = 'The FO metric evaluates the overall efficiency of observing. '
    caption += ('foNv: out of %.2f sq degrees, the area receives at least X and a median of Y visits (out of %d, if compared to benchmark). ' % (benchmarkArea, benchmarkNvisits))
    caption += ('fOArea: this many sq deg (out of %.2f sq deg if compared to benchmark) receives at least %d visits. ' % (benchmarkArea, benchmarkNvisits))
    displayDict['caption'] = caption
    bundle = mb.MetricBundle(metric, slicer, sql, plotDict=plotDict, stackerList=[ditherStacker], displayDict=displayDict, summaryMetrics=summaryMetrics, plotFuncs=[plots.FOPlot()], metadata=metadata)
    bundleList.append(bundle)
    for b in bundleList:
        b.setRunName(runName)
    return mb.makeBundlesDictFromList(bundleList)
Metrics for calculating fO.

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.

Returns
-------
metricBundleDict
def fOBatch(colmap=None, runName='opsim', extraSql=None, extraMetadata=None, nside=64, benchmarkArea=18000, benchmarkNvisits=825, minNvisits=750):
    'Metrics for calculating fO.\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\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(None, colmap, None)
    metadata = combineMetadata(metadata, ditherMeta)
    slicer = slicers.HealpixSlicer(nside=nside, lonCol=raCol, latCol=decCol, latLonDeg=degrees)
    displayDict = {'group': 'SRD FO metrics', 'subgroup': subgroup, 'order': 0}
    metric = metrics.CountExplimMetric(col=colmap['mjd'], metricName='fO', expCol=colmap['exptime'])
    plotDict = {'xlabel': 'Number of Visits', 'Asky': benchmarkArea, 'Nvisit': benchmarkNvisits, 'xMin': 0, 'xMax': 1500}
    summaryMetrics = [metrics.fOArea(nside=nside, norm=False, metricName='fOArea', Asky=benchmarkArea, Nvisit=benchmarkNvisits), metrics.fOArea(nside=nside, norm=True, metricName='fOArea/benchmark', Asky=benchmarkArea, Nvisit=benchmarkNvisits), metrics.fONv(nside=nside, norm=False, metricName='fONv', Asky=benchmarkArea, Nvisit=benchmarkNvisits), metrics.fONv(nside=nside, norm=True, metricName='fONv/benchmark', Asky=benchmarkArea, Nvisit=benchmarkNvisits), metrics.fOArea(nside=nside, norm=False, metricName=f'fOArea_{minNvisits}', Asky=benchmarkArea, Nvisit=minNvisits)]
    caption = 'The FO metric evaluates the overall efficiency of observing. '
    caption += ('foNv: out of %.2f sq degrees, the area receives at least X and a median of Y visits (out of %d, if compared to benchmark). ' % (benchmarkArea, benchmarkNvisits))
    caption += ('fOArea: this many sq deg (out of %.2f sq deg if compared to benchmark) receives at least %d visits. ' % (benchmarkArea, benchmarkNvisits))
    displayDict['caption'] = caption
    bundle = mb.MetricBundle(metric, slicer, sql, plotDict=plotDict, stackerList=[ditherStacker], displayDict=displayDict, summaryMetrics=summaryMetrics, plotFuncs=[plots.FOPlot()], metadata=metadata)
    bundleList.append(bundle)
    for b in bundleList:
        b.setRunName(runName)
    return mb.makeBundlesDictFromList(bundleList)