"""Evaluate the open shutter fraction.
"""
import lsst.sims.maf.metrics as metrics
import lsst.sims.maf.slicers as slicers
import lsst.sims.maf.metricBundles as mb
from .colMapDict import ColMapDict
from .common import standardSummary
__all__ = ['openshutterFractions']
[docs]def openshutterFractions(colmap=None, runName='opsim', extraSql=None, extraMetadata=None):
    """Evaluate open shutter fraction over whole survey and per night.
    Parameters
    ----------
    colmap : dict, opt
        A dictionary with a mapping of column names. Default will use OpsimV4 column names.
    runName : str, opt
        The name of the simulated survey. Default is "opsim".
    extraSql : str, opt
        Additional constraint to add to any sql constraints (e.g. 'night<365')
        Default None, for no additional constraints.
    extraMetadata : str, opt
        Additional metadata to add before any below (i.e. "WFD").  Default is None.
    """
    if colmap is None:
        colmap = ColMapDict('opsimV4')
    bundleList = []
    group = 'Open Shutter Fraction'
    subgroup = 'All visits'
    if extraMetadata is not None:
        subgroup = extraMetadata + ' ' + subgroup.lower()
    elif extraSql is not None and extraMetadata is None:
        subgroup = subgroup + ' ' + extraSql
    # Open Shutter fraction over whole survey.
    displayDict = {'group': group, 'subgroup': subgroup, 'order': 0}
    displayDict['caption'] = 'Total open shutter fraction over %s. ' % subgroup.lower()
    displayDict['caption'] += 'Does not include downtime due to weather.'
    metric = metrics.OpenShutterFractionMetric(slewTimeCol=colmap['slewtime'],
                                               expTimeCol=colmap['exptime'],
                                               visitTimeCol=colmap['visittime'])
    slicer = slicers.UniSlicer()
    bundle = mb.MetricBundle(metric, slicer, extraSql, metadata=subgroup,
                             displayDict=displayDict)
    bundleList.append(bundle)
    # Count the number of nights on-sky in the survey.
    displayDict['caption'] = 'Number of nights on the sky during the survey, %s.' % subgroup.lower()
    metric = metrics.CountUniqueMetric(colmap['night'])
    slicer = slicers.UniSlicer()
    bundle = mb.MetricBundle(metric, slicer, extraSql, metadata=subgroup,
                             displayDict=displayDict)
    bundleList.append(bundle)
    # Count the number of nights total in the survey (start to finish of observations).
    displayDict['caption'] = 'Number of nights from start to finish of survey, %s.' % subgroup.lower()
    metric = metrics.FullRangeMetric(colmap['night'])
    slicer = slicers.UniSlicer()
    bundle = mb.MetricBundle(metric, slicer, extraSql, metadata=subgroup,
                             displayDict=displayDict)
    bundleList.append(bundle)
    # Open shutter fraction per night.
    subgroup = 'Per night'
    if extraMetadata is not None:
        subgroup = extraMetadata + ' ' + subgroup.lower()
    elif extraSql is not None and extraMetadata is None:
        subgroup = subgroup + ' ' + extraSql
    displayDict = {'group': group, 'subgroup': subgroup, 'order': 0}
    displayDict['caption'] = 'Open shutter fraction %s.' % (subgroup.lower())
    displayDict['caption'] += ' This compares on-sky image time against on-sky time + slews + filter ' \
                              
'changes + readout, but does not include downtime due to weather.'
    metric = metrics.OpenShutterFractionMetric(slewTimeCol=colmap['slewtime'],
                                               expTimeCol=colmap['exptime'],
                                               visitTimeCol=colmap['visittime'])
    slicer = slicers.OneDSlicer(sliceColName=colmap['night'], binsize=1)
    bundle = mb.MetricBundle(metric, slicer, extraSql, metadata=subgroup,
                             summaryMetrics=standardSummary(), displayDict=displayDict)
    bundleList.append(bundle)
    # Set the runName for all bundles and return the bundleDict.
    for b in bundleList:
        b.setRunName(runName)
    return mb.makeBundlesDictFromList(bundleList)