Source code for lsst.sims.maf.metrics.slewMetrics

import numpy as np
from .baseMetric import BaseMetric

# Metrics for dealing with things from the SlewActivities table

__all__ = ['SlewContributionMetric', 'AveSlewFracMetric']


[docs]class SlewContributionMetric(BaseMetric): def __init__(self, col='actDelay', activity=None, activeCol='activity', inCritCol='inCriticalPath', **kwargs): """ Return the average time, multiplied by fraction of slew -- considering critical path activities only. """ self.col = col self.inCritCol = inCritCol col = [col, inCritCol] col.append(activeCol) self.activeCol = activeCol self.activity = activity super(SlewContributionMetric, self).__init__(col=col, **kwargs) self.comment = 'Average time for %s activity (in seconds) when in the critical path, ' %(activity) self.comment += 'multiplied by the percent of total slews in the critical path.'
[docs] def run(self, dataSlice, slicePoint=None): # Activities of this type, in critical path. goodInCrit = np.where((dataSlice[self.activeCol] == self.activity) & (dataSlice[self.inCritCol] == 'True'))[0] if len(goodInCrit) == 0: result = 0.0 else: # All activities in critical path. inCrit = np.where((dataSlice[self.inCritCol] == 'True'))[0] # Calculate fraction of total in-critical-path slew activities that this activity represents. result = np.sum(dataSlice[self.col][goodInCrit]) / np.sum(dataSlice[self.col][inCrit]) # and multiply by the mean time required by this activity. result *= np.mean(dataSlice[self.col][goodInCrit]) return result
[docs]class AveSlewFracMetric(BaseMetric): def __init__(self, col='actDelay', activity=None, activeCol='activity', idCol='SlewHistory_slewCount', **kwargs): """ Return the average time multiplied by fraction of slews. """ self.col = col self.idCol = idCol col = [col, idCol] col.append(activeCol) self.activeCol = activeCol self.activity = activity super(AveSlewFracMetric, self).__init__(col=col, **kwargs) self.comment = 'Average time for %s activity (in seconds), multiplied by percent of total slews.' %(activity)
[docs] def run(self, dataSlice, slicePoint=None): good = np.where(dataSlice[self.activeCol] == self.activity)[0] if len(good) == 0: result = 0.0 else: result = np.mean(dataSlice[self.col][good]) nslews = np.size(np.unique(dataSlice[self.idCol])) result = result * np.size(good)/np.float(nslews) return result