Hide keyboard shortcuts

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 

6 

7from lsst.faro.utils.matcher import mergeCatalogs 

8 

9__all__ = ('NumSourcesTask', 'NumSourcesMergeTask', 

10 'NumpySummaryTaskConfig', 'NumpySummaryTask') 

11 

12 

13class NumSourcesTask(Task): 

14 

15 ConfigClass = Config 

16 _DefaultName = "numSourcesTask" 

17 

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) 

23 

24 

25class NumSourcesMergeTask(Task): 

26 

27 ConfigClass = Config 

28 _DefaultName = "numSourcesMergeTask" 

29 

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) 

36 

37 

38class NumpySummaryTaskConfig(Config): 

39 summary = Field(dtype=str, default="median", 

40 doc="Aggregation to use for summary metrics") 

41 

42 

43class NumpySummaryTask(Task): 

44 

45 ConfigClass = NumpySummaryTaskConfig 

46 _DefaultName = "numpySummaryTask" 

47 

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") 

53 

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))