Coverage for python/lsst/faro/base/BaseSubTasks.py : 45%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1import astropy.units as u
2import numpy as np
3from lsst.pipe.base import Struct, Task
4from lsst.pex.config import Config, Field
5from lsst.verify import Measurement
7from lsst.faro.utils.matcher import mergeCatalogs
9__all__ = ('NumSourcesTask', 'NumSourcesMergeTask',
10 'NumpySummaryTaskConfig', 'NumpySummaryTask')
13class NumSourcesTask(Task):
15 ConfigClass = Config
16 _DefaultName = "numSourcesTask"
18 def run(self, catalog, metric_name, vIds=None):
19 self.log.info(f"Measuring {metric_name}")
20 nSources = len(catalog)
21 meas = Measurement("nsrcMeas", nSources * u.count)
22 return Struct(measurement=meas)
25class NumSourcesMergeTask(Task):
27 ConfigClass = Config
28 _DefaultName = "numSourcesMergeTask"
30 def run(self, metricName, catalogs, photoCalibs, astromCalibs, dataIds):
31 self.log.info(f"Measuring {metricName}")
32 catalog = mergeCatalogs(catalogs, photoCalibs, astromCalibs)
33 nSources = len(catalog)
34 meas = Measurement("nsrcMeas", nSources * u.count)
35 return Struct(measurement=meas)
38class NumpySummaryTaskConfig(Config):
39 summary = Field(dtype=str, default="median",
40 doc="Aggregation to use for summary metrics")
43class NumpySummaryTask(Task):
45 ConfigClass = NumpySummaryTaskConfig
46 _DefaultName = "numpySummaryTask"
48 def run(self, measurements, agg_name, package, metric):
49 agg = agg_name.lower()
50 if agg == "summary":
51 agg = self.config.summary
52 self.log.info(f"Computing the {agg} of {package}_{metric} values")
54 if len(measurements) == 0:
55 self.log.info('Recieved zero length measurments list. Returning NaN.')
56 # In the case of an empty list, there is nothing we can do other than
57 # to return a NaN
58 value = u.Quantity(np.nan)
59 else:
60 unit = measurements[0].quantity.unit
61 value = getattr(np, agg)(u.Quantity([x.quantity for x in measurements
62 if np.isfinite(x.quantity)]))
63 # Make sure return has same unit as inputs
64 # In some cases numpy can return a NaN and the unit gets dropped
65 value = value.value*unit
66 return Struct(measurement=Measurement(f"metricvalue_{agg_name.lower()}_{package}_{metric}", value))