|
63 | 63 | from plotpy.styles import BaseImageParam |
64 | 64 |
|
65 | 65 |
|
66 | | -def fwhm_info(x, y): |
67 | | - """Return FWHM information string""" |
68 | | - try: |
69 | | - with warnings.catch_warnings(record=True) as w: |
70 | | - x0, _y0, x1, _y1 = fwhm((x, y), "zero-crossing") |
71 | | - wstr = " ⚠️" if w else "" |
72 | | - except ValueError: |
73 | | - return "🛑" |
74 | | - return f"{x1 - x0:g}{wstr}" |
75 | | - |
76 | | - |
77 | | -CURVESTATSTOOL_LABELFUNCS = ( |
78 | | - ("%g < x < %g", lambda *args: (np.nanmin(args[0]), np.nanmax(args[0]))), |
79 | | - ("%g < y < %g", lambda *args: (np.nanmin(args[1]), np.nanmax(args[1]))), |
80 | | - ("<y>=%g", lambda *args: np.nanmean(args[1])), |
81 | | - ("σ(y)=%g", lambda *args: np.nanstd(args[1])), |
82 | | - ("∑(y)=%g", lambda *args: spt.trapezoid(args[1])), |
83 | | - ("∫ydx=%g<br>", lambda *args: spt.trapezoid(args[1], args[0])), |
84 | | - ("FWHM = %s", fwhm_info), |
85 | | -) |
| 66 | +class CurveStatsToolFunctions: |
| 67 | + """Statistical functions for CurveStatsTool""" |
| 68 | + |
| 69 | + @classmethod |
| 70 | + def set_labelfuncs(cls, statstool: CurveStatsTool) -> None: |
| 71 | + """Set label functions for CurveStatsTool""" |
| 72 | + labelfuncs = ( |
| 73 | + ("%g < x < %g", lambda *args: cls.nan_min_max(args[0])), |
| 74 | + ("%g < y < %g", lambda *args: cls.nan_min_max(args[1])), |
| 75 | + ("<y>=%g", lambda *args: cls.nan_mean(args[1])), |
| 76 | + ("σ(y)=%g", lambda *args: cls.nan_std(args[1])), |
| 77 | + ("∑(y)=%g", lambda *args: spt.trapezoid(args[1])), |
| 78 | + ("∫ydx=%g<br>", lambda *args: spt.trapezoid(args[1], args[0])), |
| 79 | + ("FWHM = %s", cls.fwhm_info), |
| 80 | + ) |
| 81 | + statstool.set_labelfuncs(labelfuncs) |
| 82 | + |
| 83 | + @staticmethod |
| 84 | + def nan_min_max(arr: np.ndarray) -> tuple[float, float]: |
| 85 | + """Return min/max tuple""" |
| 86 | + with warnings.catch_warnings(): |
| 87 | + warnings.simplefilter("ignore", RuntimeWarning) |
| 88 | + min_val = np.nanmin(arr) |
| 89 | + max_val = np.nanmax(arr) |
| 90 | + return (min_val, max_val) |
| 91 | + |
| 92 | + @staticmethod |
| 93 | + def nan_mean(arr: np.ndarray) -> float: |
| 94 | + """Return mean value, ignoring NaNs""" |
| 95 | + with warnings.catch_warnings(): |
| 96 | + warnings.simplefilter("ignore", RuntimeWarning) |
| 97 | + mean_val = np.nanmean(arr) |
| 98 | + return mean_val |
| 99 | + |
| 100 | + @staticmethod |
| 101 | + def nan_std(arr: np.ndarray) -> float: |
| 102 | + """Return standard deviation, ignoring NaNs""" |
| 103 | + with warnings.catch_warnings(): |
| 104 | + warnings.simplefilter("ignore", RuntimeWarning) |
| 105 | + std_val = np.nanstd(arr) |
| 106 | + return std_val |
| 107 | + |
| 108 | + @staticmethod |
| 109 | + def fwhm_info(x, y): |
| 110 | + """Return FWHM information string""" |
| 111 | + try: |
| 112 | + with warnings.catch_warnings(record=True) as w: |
| 113 | + x0, _y0, x1, _y1 = fwhm((x, y), "zero-crossing") |
| 114 | + wstr = " ⚠️" if w else "" |
| 115 | + except (ValueError, ZeroDivisionError): |
| 116 | + return "🛑" |
| 117 | + return f"{x1 - x0:g}{wstr}" |
86 | 118 |
|
87 | 119 |
|
88 | 120 | def get_more_image_stats( |
@@ -245,7 +277,7 @@ def __register_other_tools(self) -> None: |
245 | 277 | if self.options.type == PlotType.CURVE: |
246 | 278 | mgr.register_curve_tools() |
247 | 279 | statstool = mgr.get_tool(CurveStatsTool) |
248 | | - statstool.set_labelfuncs(CURVESTATSTOOL_LABELFUNCS) |
| 280 | + CurveStatsToolFunctions.set_labelfuncs(statstool) |
249 | 281 | else: |
250 | 282 | mgr.register_image_tools() |
251 | 283 | # Customizing the ImageStatsTool |
|
0 commit comments