From 8c36ddd846a0b67896535baa351e8c6380cb402e Mon Sep 17 00:00:00 2001
From: Frits Sweijen <tikk3r@users.noreply.github.com>
Date: Tue, 17 Jan 2023 12:30:10 +0100
Subject: [PATCH] Filter on infs when normalising gains

---
 rapthor/scripts/process_slow_gains.py | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)

diff --git a/rapthor/scripts/process_slow_gains.py b/rapthor/scripts/process_slow_gains.py
index 30e8c7f20..bf9185c3a 100755
--- a/rapthor/scripts/process_slow_gains.py
+++ b/rapthor/scripts/process_slow_gains.py
@@ -93,6 +93,14 @@ def normalize_direction(soltab, remove_core_gradient=True, solset=None, ref_id=0
             for s in range(len(station_names)):
                 if 'CS' in station_names[s] and s != ref_id:
                     if not np.all(np.isnan(parms[:, :, s, dir, :])):
+                        nmean = np.nanmean(parms[:, :, s, dir, :])
+                        if not np.isfinite(nmean):
+                            print('WARNING: mean is NaN or inf, attempting again using only finite values.')
+                            x = np.where(np.isfinite(parms[:, :, s, dir, :]), parms[:, :, s, dir, :], np.nan)
+                            nmean = np.nanmean(x)
+                        # Still failed, this shouldn't happen, give up.
+                        if not np.isfinite(nmean):
+                            raise ValueError('Mean value for station {:s} is NaN or infinite!'.format(station_names[s]))
                         mean_vals.append(np.nanmean(parms[:, :, s, dir, :]))
                         dist_vals.append(dist[s])
                         stat_names.append(station_names[s])
@@ -119,6 +127,15 @@ def normalize_direction(soltab, remove_core_gradient=True, solset=None, ref_id=0
     # times, frequencies, and pols
     for dir in range(len(soltab.dir[:])):
         norm_factor = np.nanmean(parms[:, :, :, dir, :][initial_unflagged_indx[:, :, :, dir, :]])
+        if not np.isfinite(norm_factor):
+            print('WARNING: mean is NaN or inf, attempting again using only finite values!')
+            parms_temp = parms[:, :, :, dir, :][initial_unflagged_indx[:, :, :, dir, :]]
+            x = np.where(np.isfinite(parms_temp), parms_temp, np.nan)
+            norm_factor = np.nanmean(x)
+        # Still failed, this shouldn't happen, give up.
+        if not np.isfinite(norm_factor):
+            raise ValueError('Normalisation factor for direction {:s} is NaN or infinite!'.format(soltab.dir[dir]))
+
         parms[:, :, :, dir, :] -= norm_factor
 
     # Convert back to non-log values and make sure flagged solutions are still flagged
-- 
GitLab