Antenna Classification Daily Summary¶
by Josh Dillon last updated June 19, 2023
This notebook parses and summarizes the output of the file_calibration notebook to produce a report on per-antenna malfunctions on a daily basis.
Quick links:
⢠Summary of Per Antenna Issues¶
⢠Figure 1: Per File Overall Antenna Classification Summary¶
⢠Figure 2: Per Classifier Antenna Flagging Summary¶
⢠Figure 3: Array Visualization of Overall Daily Classification¶
import os
os.environ['HDF5_USE_FILE_LOCKING'] = 'FALSE'
import h5py
import hdf5plugin # REQUIRED to have the compression plugins available
import numpy as np
import pandas as pd
import glob
import os
import matplotlib.pyplot as plt
from hera_cal import io, utils
from hera_qm import ant_class
from uvtools.plot import plot_antpos, plot_antclass
%matplotlib inline
from IPython.display import display, HTML
display(HTML("<style>.container { width:100% !important; }</style>"))
_ = np.seterr(all='ignore') # get rid of red warnings
%config InlineBackend.figure_format = 'retina'
Settings¶
# Parse settings from environment
ANT_CLASS_FOLDER = os.environ.get("ANT_CLASS_FOLDER", "./")
SUM_FILE = os.environ.get("SUM_FILE", None)
# ANT_CLASS_FOLDER = "/mnt/sn1/2460330"
# SUM_FILE = "/mnt/sn1/2460330/zen.2460330.25463.sum.uvh5"
OC_SKIP_OUTRIGGERS = os.environ.get("OC_SKIP_OUTRIGGERS", "TRUE").upper() == "TRUE"
for param in ['ANT_CLASS_FOLDER', 'SUM_FILE', 'OC_SKIP_OUTRIGGERS']:
print(f"{param} = '{eval(param)}'")
ANT_CLASS_FOLDER = '/mnt/sn1/data2/2460996' SUM_FILE = '/mnt/sn1/data2/2460996/zen.2460996.29134.sum.uvh5' OC_SKIP_OUTRIGGERS = 'True'
if SUM_FILE is not None:
from astropy.time import Time, TimeDelta
utc = Time(float(SUM_FILE.split('zen.')[-1].split('.sum.uvh5')[0]), format='jd').datetime
print(f'Date: {utc.month}-{utc.day}-{utc.year}')
Date: 11-16-2025
# set thresholds for fraction of the day
overall_thresh = .1
all_zero_thresh = .1
eo_zeros_thresh = .1
xengine_diff_thresh = .1
cross_pol_thresh = .5
bad_fem_thresh = .1
high_power_thresh = .1
low_power_thresh = .1
low_corr_thresh = .1
bad_shape_thresh = .5
excess_rfi_thresh = .1
chisq_thresh = .25
Load classifications and other metadata¶
# Load csvs
csv_files = sorted(glob.glob(os.path.join(ANT_CLASS_FOLDER, '*.ant_class.csv')))
jds = [float(f.split('/')[-1].split('zen.')[-1].split('.sum')[0]) for f in csv_files]
tables = [pd.read_csv(f).dropna(axis=0, how='all') for f in csv_files]
table_cols = tables[0].columns[1::2]
class_cols = tables[0].columns[2::2]
print(f'Found {len(csv_files)} csv files starting with {csv_files[0]}')
Found 534 csv files starting with /mnt/sn1/data2/2460996/zen.2460996.23161.sum.ant_class.csv
# parse ant_strings
ap_strs = np.array(tables[0]['Antenna'])
ants = sorted(set(int(a[:-1]) for a in ap_strs))
translator = ''.maketrans('e', 'n') | ''.maketrans('n', 'e')
# get node numbers
node_dict = {ant: 'Unknown' for ant in ants}
try:
from hera_mc import cm_hookup
hookup = cm_hookup.get_hookup('default')
for ant_name in hookup:
ant = int("".join(filter(str.isdigit, ant_name)))
if ant in node_dict:
if hookup[ant_name].get_part_from_type('node')['E<ground'] is not None:
node_dict[ant] = int(hookup[ant_name].get_part_from_type('node')['E<ground'][1:])
except:
pass
nodes = sorted(set(node_dict.values()))
def classification_array(col):
class_array = np.vstack([t[col] for t in tables])
class_array[class_array == 'good'] = 1.7
class_array[class_array == 'suspect'] = 1
class_array[class_array == 'bad'] = 0
return class_array.astype(float)
if SUM_FILE is not None:
hd = io.HERADataFastReader(SUM_FILE)
ap_tuples = [(int(ap[:-1]), {'e': 'Jee', 'n': 'Jnn'}[ap[-1]]) for ap in ap_strs]
bad_bools = np.mean(classification_array('Antenna Class') == 0, axis=0) > overall_thresh
bad_aps = [ap_tuples[i] for i in np.arange(len(ap_tuples))[bad_bools]]
suspect_bools = np.mean(classification_array('Antenna Class') == 1, axis=0) > overall_thresh
suspect_aps = [ap_tuples[i] for i in np.arange(len(ap_tuples))[suspect_bools] if ap_tuples[i] not in bad_aps]
good_aps = [ap for ap in ap_tuples if ap not in bad_aps and ap not in suspect_aps]
overall_class = ant_class.AntennaClassification(bad=bad_aps, suspect=suspect_aps, good=good_aps)
autos, _, _ = hd.read(bls=[bl for bl in hd.bls if utils.split_bl(bl)[0] == utils.split_bl(bl)[1]], read_flags=False, read_nsamples=False)
avg_unflagged_auto = {}
for pol in ['ee', 'nn']:
unflagged_autos = [autos[bl] for bl in autos if bl[2] == pol and overall_class[utils.split_bl(bl)[0]] != 'bad']
if len(unflagged_autos) > 0:
avg_unflagged_auto[pol] = np.mean(unflagged_autos, axis=(0, 1))
else:
avg_unflagged_auto[pol] = np.zeros(len(hd.freqs), dtype=complex)
Figure out and summarize per-antenna issues¶
def print_issue_summary(bad_ant_strs, title, notes='', plot=False):
'''Print report for list of bad antenna polarizations strings'''
unique_bad_antnums = [int(ap[:-1]) for ap in bad_ant_strs]
display(HTML(f'<h2>{title}: ({len(bad_ant_strs)} antpols across {len(set([ba[:-1] for ba in bad_ant_strs]))} antennas)</h2>'))
if len(notes) > 0:
display(HTML(f'<h4>{notes}</h4>'))
if len(bad_ant_strs) > 0:
print(f'All Bad Antpols: {", ".join(bad_ant_strs)}\n')
for node in nodes:
if np.any([node == node_dict[a] for a in unique_bad_antnums]):
aps = [ap for ap in bad_ant_strs if node_dict[int(ap[:-1])] == node]
whole_ants = [str(wa) for wa in set([int(ap[:-1]) for ap in aps if ap.translate(translator) in bad_ant_strs])]
single_pols = [ap for ap in aps if ap.translate(translator) not in bad_ant_strs]
print(f'Node {node}:')
print(f'\tAntpols ({len(aps)} total): {", ".join(aps)}')
print(f'\tWhole Ants ({len(whole_ants)} total): {", ".join(whole_ants)}')
print(f'\tSingle Pols ({len(single_pols)} total): {", ".join(single_pols)}')
if plot and SUM_FILE is not None:
fig, axes = plt.subplots(1, 2, figsize=(12,4), dpi=70, sharey=True, gridspec_kw={'wspace': 0})
for ax, pol in zip(axes, ['ee', 'nn']):
ax.semilogy(autos.freqs / 1e6, avg_unflagged_auto[pol], 'k--', label='Average\nUnflagged\nAuto')
for ap in aps:
ant = int(ap[:-1]), utils.comply_pol(ap[-1])
auto_bl = utils.join_bl(ant, ant)
if auto_bl[2] == pol:
ax.semilogy(autos.freqs / 1e6, np.mean(autos[auto_bl], axis=0), label=ap)
ax.legend()
ax.set_xlim([40, 299])
ax.set_title(f'{title} on Node {node} ({pol}-antennas)')
ax.set_xlabel('Frequency (MHz)')
axes[0].set_ylabel('Single File Raw Autocorrelation')
plt.tight_layout()
plt.show()
# precompute various helpful quantities
all_slopes = np.vstack([t['Autocorr Slope'] for t in tables])
median_slope = np.median(all_slopes)
bad_slopes = np.vstack([t['Autocorr Slope Class'] for t in tables]) == 'bad'
suspect_slopes = np.vstack([t['Autocorr Slope Class'] for t in tables]) == 'suspect'
bad_shapes = np.vstack([t['Autocorr Shape Class'] for t in tables]) == 'bad'
suspect_shapes = np.vstack([t['Autocorr Shape Class'] for t in tables]) == 'suspect'
all_powers = np.vstack([t['Autocorr Power'] for t in tables])
median_power = np.median(all_powers)
bad_powers = np.vstack([t['Autocorr Power Class'] for t in tables]) == 'bad'
suspect_powers = np.vstack([t['Autocorr Power Class'] for t in tables]) == 'suspect'
bad_rfi = np.vstack([t['Auto RFI RMS Class'] for t in tables]) == 'bad'
suspect_rfi = np.vstack([t['Auto RFI RMS Class'] for t in tables]) == 'suspect'
# find all zeros
all_zeros_strs = ap_strs[np.mean(np.vstack([t['Dead? Class'] for t in tables]) == 'bad', axis=0) > all_zero_thresh]
# find even/odd zeros
eo_zeros_strs = ap_strs[np.mean(np.vstack([t['Even/Odd Zeros Class'] for t in tables]) == 'bad', axis=0) > eo_zeros_thresh]
eo_zeros_strs = [ap for ap in eo_zeros_strs if ap not in all_zeros_strs]
# find cross-polarized antennas
cross_pol_strs = ap_strs[np.mean(np.vstack([t['Cross-Polarized Class'] for t in tables]) == 'bad', axis=0) > cross_pol_thresh]
cross_pol_strs = [ap for ap in cross_pol_strs if ap not in all_zeros_strs]
# find FEM power issues: must be low power, high slope, and bad or suspect in power, slope, rfi, and shape
fem_off_prod = (bad_powers + .5 * suspect_powers) * (bad_slopes + .5 * suspect_slopes)
fem_off_prod *= (bad_rfi + .5 * suspect_rfi) * (bad_shapes + .5 * suspect_shapes)
fem_off_strs = ap_strs[np.mean(fem_off_prod * (all_powers < median_power) * (all_slopes > median_slope), axis=0) > .1]
# find high power issues
high_power_strs = ap_strs[np.mean(bad_powers & (all_powers > median_power), axis=0) > high_power_thresh]
# find other low power issues
low_power_strs = ap_strs[np.mean(bad_powers & (all_powers < median_power), axis=0) > low_power_thresh]
low_power_strs = [ap for ap in low_power_strs if ap not in all_zeros_strs and ap not in fem_off_strs]
# find low correlation (but not low power)
low_corr_strs = ap_strs[np.mean(np.vstack([t['Low Correlation Class'] for t in tables]) == 'bad', axis=0) > low_corr_thresh]
low_corr_strs = [ap for ap in low_corr_strs if ap not in (set(low_power_strs) | set(all_zeros_strs) | set(fem_off_strs))]
# find bad bandpasses
bad_bandpass_strs = ap_strs[np.mean(bad_shapes, axis=0) > bad_shape_thresh]
bad_bandpass_strs = [ap for ap in bad_bandpass_strs if ap not in (set(low_power_strs) | set(all_zeros_strs) | set(high_power_strs) | set(fem_off_strs))]
# find antennas with excess RFI
excess_rfi_strs = ap_strs[np.mean(np.vstack([t['Auto RFI RMS Class'] for t in tables]) == 'bad', axis=0) > excess_rfi_thresh]
excess_rfi_strs = [ap for ap in excess_rfi_strs if ap not in (set(low_power_strs) | set(all_zeros_strs) | set(fem_off_strs) |
set(bad_bandpass_strs) | set(high_power_strs))]
# find bad x-engine diffs
xengine_diff_strs = ap_strs[np.mean(np.vstack([t['Bad Diff X-Engines Class'] for t in tables]) == 'bad', axis=0) > xengine_diff_thresh]
xengine_diff_strs = [ap for ap in xengine_diff_strs if ap not in (set(bad_bandpass_strs) | set(low_power_strs) | set(excess_rfi_strs) | set(low_corr_strs) |
set(all_zeros_strs) | set(high_power_strs) | set(fem_off_strs) | set(eo_zeros_strs))]
# find antennas with high redcal chi^2
chisq_strs = ap_strs[np.mean(np.vstack([t['Redcal chi^2 Class'] for t in tables]) == 'bad', axis=0) > chisq_thresh]
chisq_strs = [ap for ap in chisq_strs if ap not in (set(bad_bandpass_strs) | set(low_power_strs) | set(excess_rfi_strs) | set(low_corr_strs) |
set(all_zeros_strs) | set(high_power_strs) | set(fem_off_strs) | set(eo_zeros_strs) | set(xengine_diff_strs))]
if OC_SKIP_OUTRIGGERS:
chisq_strs = [ap for ap in chisq_strs if int(ap[:-1]) < 320]
# collect all results
to_print = [(all_zeros_strs, 'All-Zeros', 'These antennas have visibilities that are more than half zeros.'),
(eo_zeros_strs, 'Excess Zeros in Either Even or Odd Spectra',
'These antennas are showing evidence of packet loss or X-engine failure.', True),
(xengine_diff_strs, 'Excess Power in X-Engine Diffs',
'These antennas are showing evidence of mis-written packets in either the evens or the odds.', True),
(cross_pol_strs, 'Cross-Polarized', 'These antennas have their east and north cables swapped.'),
(fem_off_strs, 'Likely FEM Power Issue', 'These antennas have low power and anomolously high slopes.', True),
(high_power_strs, 'High Power', 'These antennas have high median power.', True),
(low_power_strs, 'Other Low Power Issues', 'These antennas have low power, but are not all-zeros and not FEM off.', True),
(low_corr_strs, 'Low Correlation, But Not Low Power', 'These antennas are low correlation, but their autocorrelation power levels look OK.'),
(bad_bandpass_strs, 'Bad Bandpass Shapes, But Not Bad Power',
'These antennas have unusual bandpass shapes, but are not all-zeros, high power, low power, or FEM off.', True),
(excess_rfi_strs, 'Excess RFI', 'These antennas have excess RMS after DPSS filtering (likely RFI), but not low or high power or a bad bandpass.', True),
(chisq_strs, 'Redcal chi^2', 'These antennas have been idenfied as not redundantly calibrating well, even after passing the above checks.')]
def print_high_level_summary():
for tp in sorted(to_print, key=lambda x: len(x[0]), reverse=True):
print(f'{len(tp[0])} antpols (on {len(set([ap[:-1] for ap in tp[0]]))} antennas) frequently flagged for {tp[1]}.')
def print_all_issue_summaries():
for tp in to_print:
print_issue_summary(*tp)
Summary of Per-Antenna Issues¶
print_high_level_summary()
440 antpols (on 221 antennas) frequently flagged for Excess Zeros in Either Even or Odd Spectra. 309 antpols (on 180 antennas) frequently flagged for Low Correlation, But Not Low Power. 182 antpols (on 123 antennas) frequently flagged for High Power. 158 antpols (on 80 antennas) frequently flagged for All-Zeros. 130 antpols (on 85 antennas) frequently flagged for Bad Bandpass Shapes, But Not Bad Power. 124 antpols (on 87 antennas) frequently flagged for Other Low Power Issues. 6 antpols (on 6 antennas) frequently flagged for Likely FEM Power Issue. 2 antpols (on 2 antennas) frequently flagged for Cross-Polarized. 0 antpols (on 0 antennas) frequently flagged for Excess Power in X-Engine Diffs. 0 antpols (on 0 antennas) frequently flagged for Excess RFI. 0 antpols (on 0 antennas) frequently flagged for Redcal chi^2.
print_all_issue_summaries()
All-Zeros: (158 antpols across 80 antennas)
These antennas have visibilities that are more than half zeros.
All Bad Antpols: 22e, 22n, 34e, 34n, 35e, 35n, 44e, 44n, 47e, 47n, 48e, 48n, 49e, 49n, 58n, 59n, 61e, 61n, 62e, 62n, 63e, 63n, 64e, 64n, 77e, 77n, 78e, 78n, 88e, 88n, 89e, 89n, 90e, 90n, 91e, 91n, 92e, 92n, 93e, 93n, 94e, 94n, 105e, 105n, 106e, 106n, 107e, 107n, 108e, 108n, 109e, 109n, 110e, 110n, 111e, 111n, 112e, 112n, 124e, 124n, 125e, 125n, 126e, 126n, 127e, 127n, 128e, 128n, 129e, 129n, 130e, 130n, 143e, 143n, 144e, 144n, 145e, 145n, 146e, 146n, 163e, 163n, 164e, 164n, 165e, 165n, 166e, 166n, 184e, 184n, 185e, 185n, 186e, 186n, 187e, 187n, 246e, 246n, 257e, 257n, 261e, 261n, 262e, 262n, 270e, 270n, 271e, 271n, 272e, 272n, 273e, 273n, 284e, 284n, 285e, 285n, 286e, 286n, 287e, 287n, 299e, 299n, 300e, 300n, 301e, 301n, 302e, 302n, 303e, 303n, 304e, 304n, 305e, 305n, 311e, 311n, 312e, 312n, 313e, 313n, 314e, 314n, 325e, 325n, 328e, 328n, 339e, 339n, 342e, 342n, 343e, 343n, 345e, 345n, 346e, 346n, 347e, 347n Node 5: Antpols (4 total): 44e, 44n, 58n, 59n Whole Ants (1 total): 44 Single Pols (2 total): 58n, 59n Node 6: Antpols (24 total): 22e, 22n, 34e, 34n, 35e, 35n, 47e, 47n, 48e, 48n, 49e, 49n, 61e, 61n, 62e, 62n, 63e, 63n, 64e, 64n, 77e, 77n, 78e, 78n Whole Ants (12 total): 64, 34, 35, 77, 78, 47, 48, 49, 22, 61, 62, 63 Single Pols (0 total): Node 9: Antpols (24 total): 88e, 88n, 89e, 89n, 90e, 90n, 91e, 91n, 105e, 105n, 106e, 106n, 107e, 107n, 108e, 108n, 124e, 124n, 125e, 125n, 126e, 126n, 325e, 325n Whole Ants (12 total): 325, 105, 106, 107, 108, 88, 89, 90, 91, 124, 125, 126 Single Pols (0 total): Node 10: Antpols (24 total): 92e, 92n, 93e, 93n, 94e, 94n, 109e, 109n, 110e, 110n, 111e, 111n, 112e, 112n, 127e, 127n, 128e, 128n, 129e, 129n, 130e, 130n, 328e, 328n Whole Ants (12 total): 128, 129, 130, 328, 109, 110, 111, 112, 92, 93, 94, 127 Single Pols (0 total): Node 14: Antpols (24 total): 143e, 143n, 144e, 144n, 145e, 145n, 146e, 146n, 163e, 163n, 164e, 164n, 165e, 165n, 166e, 166n, 184e, 184n, 185e, 185n, 186e, 186n, 187e, 187n Whole Ants (12 total): 163, 164, 165, 166, 143, 144, 145, 146, 184, 185, 186, 187 Single Pols (0 total): Node 20: Antpols (6 total): 246e, 246n, 261e, 261n, 262e, 262n Whole Ants (3 total): 261, 246, 262 Single Pols (0 total): Node 23: Antpols (18 total): 257e, 257n, 270e, 270n, 271e, 271n, 272e, 272n, 273e, 273n, 284e, 284n, 285e, 285n, 286e, 286n, 287e, 287n Whole Ants (9 total): 257, 270, 271, 272, 273, 284, 285, 286, 287 Single Pols (0 total): Node 27: Antpols (24 total): 299e, 299n, 300e, 300n, 301e, 301n, 302e, 302n, 311e, 311n, 312e, 312n, 313e, 313n, 314e, 314n, 342e, 342n, 343e, 343n, 346e, 346n, 347e, 347n Whole Ants (12 total): 299, 300, 301, 302, 346, 342, 311, 312, 313, 314, 347, 343 Single Pols (0 total): Node 28: Antpols (6 total): 303e, 303n, 304e, 304n, 305e, 305n Whole Ants (3 total): 304, 305, 303 Single Pols (0 total): Node 29: Antpols (4 total): 339e, 339n, 345e, 345n Whole Ants (2 total): 345, 339 Single Pols (0 total):
Excess Zeros in Either Even or Odd Spectra: (440 antpols across 221 antennas)
These antennas are showing evidence of packet loss or X-engine failure.
All Bad Antpols: 3e, 3n, 4e, 4n, 5e, 5n, 7e, 7n, 8e, 8n, 9e, 9n, 10e, 10n, 15e, 15n, 16e, 16n, 17e, 17n, 18e, 18n, 19e, 19n, 20e, 20n, 21e, 21n, 27e, 27n, 28e, 28n, 29e, 29n, 30e, 30n, 31e, 31n, 32e, 32n, 33e, 33n, 36e, 36n, 37e, 37n, 38e, 38n, 40e, 40n, 41e, 41n, 42e, 42n, 43e, 43n, 45e, 45n, 46e, 46n, 50e, 50n, 51e, 51n, 52e, 52n, 53e, 53n, 54e, 54n, 55e, 55n, 56e, 56n, 57e, 57n, 58e, 59e, 60e, 60n, 65e, 65n, 66e, 66n, 67e, 67n, 68e, 68n, 69e, 69n, 70e, 70n, 71e, 71n, 72e, 72n, 73e, 73n, 74e, 74n, 75e, 75n, 76e, 76n, 79e, 79n, 80e, 80n, 81e, 81n, 82e, 82n, 83e, 83n, 84e, 84n, 85e, 85n, 86e, 86n, 87e, 87n, 95e, 95n, 96e, 96n, 97e, 97n, 98e, 98n, 99e, 99n, 100e, 100n, 101e, 101n, 102e, 102n, 103e, 103n, 104e, 104n, 113e, 113n, 114e, 114n, 115e, 115n, 116e, 116n, 117e, 117n, 118e, 118n, 119e, 119n, 120e, 120n, 121e, 121n, 122e, 122n, 123e, 123n, 131e, 131n, 132e, 132n, 133e, 133n, 134e, 134n, 135e, 135n, 136e, 136n, 137e, 137n, 138e, 138n, 139e, 139n, 140e, 140n, 141e, 141n, 142e, 142n, 147e, 147n, 148e, 148n, 149e, 149n, 150e, 150n, 152e, 152n, 153e, 153n, 154e, 154n, 155e, 155n, 156e, 156n, 157e, 157n, 158e, 158n, 159e, 159n, 160e, 160n, 161e, 161n, 162e, 162n, 167e, 167n, 168e, 168n, 169e, 169n, 170e, 170n, 173e, 173n, 174e, 174n, 175e, 175n, 176e, 176n, 177e, 177n, 178e, 178n, 179e, 179n, 180e, 180n, 181e, 181n, 182e, 182n, 183e, 183n, 188e, 188n, 189e, 189n, 190e, 190n, 191e, 191n, 192e, 192n, 193e, 193n, 194e, 194n, 195e, 195n, 196e, 196n, 197e, 197n, 198e, 198n, 200e, 200n, 201e, 201n, 202e, 202n, 203e, 203n, 204e, 204n, 205e, 205n, 206e, 206n, 207e, 207n, 208e, 208n, 209e, 209n, 210e, 210n, 211e, 211n, 212e, 212n, 213e, 213n, 214e, 214n, 215e, 215n, 216e, 216n, 217e, 217n, 218e, 218n, 219e, 219n, 220e, 220n, 221e, 221n, 222e, 222n, 223e, 223n, 224e, 224n, 225e, 225n, 226e, 226n, 227e, 227n, 228e, 228n, 229e, 229n, 231e, 231n, 232e, 232n, 233e, 233n, 234e, 234n, 237e, 237n, 238e, 238n, 239e, 239n, 240e, 240n, 241e, 241n, 242e, 242n, 243e, 243n, 244e, 244n, 245e, 245n, 250e, 250n, 251e, 251n, 252e, 252n, 253e, 253n, 254e, 254n, 255e, 255n, 256e, 256n, 266e, 266n, 267e, 267n, 268e, 268n, 269e, 269n, 277e, 277n, 278e, 278n, 281e, 281n, 282e, 282n, 283e, 283n, 290e, 290n, 291e, 291n, 292e, 292n, 293e, 293n, 294e, 294n, 295e, 295n, 306e, 306n, 307e, 307n, 315e, 315n, 316e, 316n, 317e, 317n, 318e, 318n, 319e, 319n, 320e, 320n, 321e, 321n, 322e, 322n, 323e, 323n, 324e, 324n, 326e, 326n, 327e, 327n, 329e, 329n, 331e, 331n, 332e, 332n, 333e, 333n, 336e, 336n, 340e, 340n Node 1: Antpols (22 total): 3e, 3n, 4e, 4n, 5e, 5n, 15e, 15n, 16e, 16n, 17e, 17n, 18e, 18n, 27e, 27n, 28e, 28n, 29e, 29n, 30e, 30n Whole Ants (11 total): 3, 4, 5, 15, 16, 17, 18, 27, 28, 29, 30 Single Pols (0 total):
Casting complex values to real discards the imaginary part Casting complex values to real discards the imaginary part
Node 2: Antpols (24 total): 7e, 7n, 8e, 8n, 9e, 9n, 10e, 10n, 19e, 19n, 20e, 20n, 21e, 21n, 31e, 31n, 32e, 32n, 33e, 33n, 321e, 321n, 323e, 323n Whole Ants (12 total): 32, 33, 321, 323, 7, 8, 9, 10, 19, 20, 21, 31 Single Pols (0 total):
Node 3: Antpols (24 total): 36e, 36n, 37e, 37n, 38e, 38n, 50e, 50n, 51e, 51n, 52e, 52n, 53e, 53n, 65e, 65n, 66e, 66n, 67e, 67n, 68e, 68n, 320e, 320n Whole Ants (12 total): 320, 65, 66, 67, 36, 37, 38, 68, 50, 51, 52, 53 Single Pols (0 total):
Node 4: Antpols (24 total): 40e, 40n, 41e, 41n, 42e, 42n, 54e, 54n, 55e, 55n, 56e, 56n, 57e, 57n, 69e, 69n, 70e, 70n, 71e, 71n, 72e, 72n, 324e, 324n Whole Ants (12 total): 324, 69, 70, 71, 40, 41, 42, 72, 54, 55, 56, 57 Single Pols (0 total):
Node 5: Antpols (20 total): 43e, 43n, 45e, 45n, 46e, 46n, 58e, 59e, 60e, 60n, 73e, 73n, 74e, 74n, 75e, 75n, 76e, 76n, 322e, 322n Whole Ants (9 total): 322, 73, 74, 43, 75, 45, 46, 76, 60 Single Pols (2 total): 58e, 59e
Node 7: Antpols (24 total): 81e, 81n, 82e, 82n, 83e, 83n, 98e, 98n, 99e, 99n, 100e, 100n, 116e, 116n, 117e, 117n, 118e, 118n, 119e, 119n, 137e, 137n, 138e, 138n Whole Ants (12 total): 98, 99, 100, 137, 138, 81, 82, 83, 116, 117, 118, 119 Single Pols (0 total):
Node 8: Antpols (24 total): 84e, 84n, 85e, 85n, 86e, 86n, 87e, 87n, 101e, 101n, 102e, 102n, 103e, 103n, 104e, 104n, 120e, 120n, 121e, 121n, 122e, 122n, 123e, 123n Whole Ants (12 total): 101, 102, 103, 104, 84, 85, 86, 87, 120, 121, 122, 123 Single Pols (0 total):
Node 11: Antpols (24 total): 79e, 79n, 80e, 80n, 95e, 95n, 96e, 96n, 97e, 97n, 113e, 113n, 114e, 114n, 115e, 115n, 131e, 131n, 132e, 132n, 133e, 133n, 134e, 134n Whole Ants (12 total): 96, 97, 131, 132, 133, 134, 79, 80, 113, 114, 115, 95 Single Pols (0 total):
Node 12: Antpols (24 total): 135e, 135n, 136e, 136n, 155e, 155n, 156e, 156n, 157e, 157n, 158e, 158n, 176e, 176n, 177e, 177n, 178e, 178n, 179e, 179n, 329e, 329n, 333e, 333n Whole Ants (12 total): 135, 136, 329, 333, 176, 177, 178, 179, 155, 156, 157, 158 Single Pols (0 total):
Node 13: Antpols (24 total): 139e, 139n, 140e, 140n, 141e, 141n, 142e, 142n, 159e, 159n, 160e, 160n, 161e, 161n, 162e, 162n, 180e, 180n, 181e, 181n, 182e, 182n, 183e, 183n Whole Ants (12 total): 160, 161, 162, 139, 140, 141, 142, 180, 181, 182, 183, 159 Single Pols (0 total):
Node 15: Antpols (24 total): 147e, 147n, 148e, 148n, 149e, 149n, 150e, 150n, 167e, 167n, 168e, 168n, 169e, 169n, 170e, 170n, 188e, 188n, 189e, 189n, 190e, 190n, 191e, 191n Whole Ants (12 total): 167, 168, 169, 170, 147, 148, 149, 150, 188, 189, 190, 191 Single Pols (0 total):
Node 16: Antpols (18 total): 152e, 152n, 153e, 153n, 154e, 154n, 173e, 173n, 174e, 174n, 192e, 192n, 193e, 193n, 194e, 194n, 213e, 213n Whole Ants (9 total): 192, 193, 194, 173, 174, 213, 152, 153, 154 Single Pols (0 total):
Node 17: Antpols (18 total): 196e, 196n, 197e, 197n, 198e, 198n, 215e, 215n, 216e, 216n, 217e, 217n, 218e, 218n, 233e, 233n, 234e, 234n Whole Ants (9 total): 196, 197, 198, 233, 234, 215, 216, 217, 218 Single Pols (0 total):
Node 18: Antpols (22 total): 200e, 200n, 201e, 201n, 202e, 202n, 203e, 203n, 219e, 219n, 220e, 220n, 221e, 221n, 222e, 222n, 237e, 237n, 238e, 238n, 239e, 239n Whole Ants (11 total): 200, 201, 202, 203, 237, 238, 239, 219, 220, 221, 222 Single Pols (0 total):
Node 19: Antpols (24 total): 204e, 204n, 205e, 205n, 206e, 206n, 207e, 207n, 223e, 223n, 224e, 224n, 225e, 225n, 226e, 226n, 240e, 240n, 241e, 241n, 242e, 242n, 243e, 243n Whole Ants (12 total): 224, 225, 226, 204, 205, 206, 207, 240, 241, 242, 243, 223 Single Pols (0 total):
Node 20: Antpols (18 total): 208e, 208n, 209e, 209n, 210e, 210n, 211e, 211n, 227e, 227n, 228e, 228n, 229e, 229n, 244e, 244n, 245e, 245n Whole Ants (9 total): 227, 228, 229, 208, 209, 210, 211, 244, 245 Single Pols (0 total):
Node 21: Antpols (24 total): 175e, 175n, 195e, 195n, 212e, 212n, 214e, 214n, 231e, 231n, 232e, 232n, 326e, 326n, 327e, 327n, 331e, 331n, 332e, 332n, 336e, 336n, 340e, 340n Whole Ants (12 total): 195, 326, 231, 232, 327, 331, 332, 175, 336, 212, 340, 214 Single Pols (0 total):
Node 22: Antpols (24 total): 250e, 250n, 251e, 251n, 252e, 252n, 253e, 253n, 266e, 266n, 267e, 267n, 268e, 268n, 269e, 269n, 281e, 281n, 282e, 282n, 283e, 283n, 295e, 295n Whole Ants (12 total): 295, 266, 267, 268, 269, 282, 283, 281, 250, 251, 252, 253 Single Pols (0 total):
Node 23: Antpols (6 total): 254e, 254n, 255e, 255n, 256e, 256n Whole Ants (3 total): 256, 254, 255 Single Pols (0 total):
Node 28: Antpols (12 total): 290e, 290n, 291e, 291n, 315e, 315n, 316e, 316n, 317e, 317n, 318e, 318n Whole Ants (6 total): 290, 291, 315, 316, 317, 318 Single Pols (0 total):
Node 29: Antpols (16 total): 277e, 277n, 278e, 278n, 292e, 292n, 293e, 293n, 294e, 294n, 306e, 306n, 307e, 307n, 319e, 319n Whole Ants (8 total): 292, 293, 294, 306, 307, 277, 278, 319 Single Pols (0 total):
Excess Power in X-Engine Diffs: (0 antpols across 0 antennas)
These antennas are showing evidence of mis-written packets in either the evens or the odds.
Cross-Polarized: (2 antpols across 2 antennas)
These antennas have their east and north cables swapped.
All Bad Antpols: 58e, 59e Node 5: Antpols (2 total): 58e, 59e Whole Ants (0 total): Single Pols (2 total): 58e, 59e
Likely FEM Power Issue: (6 antpols across 6 antennas)
These antennas have low power and anomolously high slopes.
All Bad Antpols: 27n, 44e, 59n, 161n, 180n, 182e Node 1: Antpols (1 total): 27n Whole Ants (0 total): Single Pols (1 total): 27n
Data has no positive values, and therefore cannot be log-scaled.
Node 5: Antpols (2 total): 44e, 59n Whole Ants (0 total): Single Pols (2 total): 44e, 59n
Node 13: Antpols (3 total): 161n, 180n, 182e Whole Ants (0 total): Single Pols (3 total): 161n, 180n, 182e
High Power: (182 antpols across 123 antennas)
These antennas have high median power.
All Bad Antpols: 4e, 5n, 7e, 7n, 9e, 9n, 15e, 15n, 16e, 17e, 17n, 21n, 29e, 31e, 32e, 33e, 33n, 41e, 41n, 54n, 55n, 69e, 69n, 70e, 72e, 79e, 79n, 80e, 82n, 83n, 84n, 85n, 86e, 86n, 87e, 87n, 95e, 95n, 97e, 100e, 100n, 102e, 102n, 103n, 113e, 113n, 114e, 114n, 115e, 116e, 117e, 118e, 118n, 119e, 119n, 121n, 132e, 132n, 133e, 133n, 134e, 134n, 138e, 138n, 139n, 140e, 140n, 141n, 142e, 142n, 147n, 148e, 148n, 149n, 150e, 152n, 153n, 154e, 154n, 156e, 156n, 157e, 157n, 158e, 158n, 159n, 160n, 161e, 162e, 162n, 168e, 168n, 169n, 173n, 174e, 175e, 175n, 180e, 181e, 183e, 183n, 188e, 189n, 190e, 190n, 191e, 191n, 192e, 192n, 194e, 194n, 195e, 195n, 200n, 202n, 203e, 203n, 205e, 205n, 206e, 206n, 207e, 207n, 212e, 213n, 214e, 214n, 219e, 219n, 220e, 220n, 222n, 223n, 224e, 224n, 225e, 225n, 226e, 231n, 237e, 237n, 238e, 238n, 239e, 239n, 240n, 241e, 241n, 242e, 243n, 250e, 250n, 251n, 253e, 254n, 256e, 268n, 269e, 269n, 277e, 282e, 283e, 283n, 292e, 306e, 306n, 307e, 317e, 319e, 319n, 320e, 320n, 323e, 324e, 324n, 327e, 327n, 331e, 331n, 332e, 336n, 340n Node 1: Antpols (8 total): 4e, 5n, 15e, 15n, 16e, 17e, 17n, 29e Whole Ants (2 total): 17, 15 Single Pols (4 total): 4e, 5n, 16e, 29e
Node 2: Antpols (10 total): 7e, 7n, 9e, 9n, 21n, 31e, 32e, 33e, 33n, 323e Whole Ants (3 total): 9, 33, 7 Single Pols (4 total): 21n, 31e, 32e, 323e
Node 3: Antpols (2 total): 320e, 320n Whole Ants (1 total): 320 Single Pols (0 total):
Node 4: Antpols (10 total): 41e, 41n, 54n, 55n, 69e, 69n, 70e, 72e, 324e, 324n Whole Ants (3 total): 41, 324, 69 Single Pols (4 total): 54n, 55n, 70e, 72e
Node 7: Antpols (12 total): 82n, 83n, 100e, 100n, 116e, 117e, 118e, 118n, 119e, 119n, 138e, 138n Whole Ants (4 total): 138, 100, 118, 119 Single Pols (4 total): 82n, 83n, 116e, 117e
Node 8: Antpols (10 total): 84n, 85n, 86e, 86n, 87e, 87n, 102e, 102n, 103n, 121n Whole Ants (3 total): 102, 86, 87 Single Pols (4 total): 84n, 85n, 103n, 121n
Node 11: Antpols (17 total): 79e, 79n, 80e, 95e, 95n, 97e, 113e, 113n, 114e, 114n, 115e, 132e, 132n, 133e, 133n, 134e, 134n Whole Ants (7 total): 132, 133, 134, 79, 113, 114, 95 Single Pols (3 total): 80e, 97e, 115e
Node 12: Antpols (6 total): 156e, 156n, 157e, 157n, 158e, 158n Whole Ants (3 total): 156, 157, 158 Single Pols (0 total):
Node 13: Antpols (15 total): 139n, 140e, 140n, 141n, 142e, 142n, 159n, 160n, 161e, 162e, 162n, 180e, 181e, 183e, 183n Whole Ants (4 total): 162, 140, 142, 183 Single Pols (7 total): 139n, 141n, 159n, 160n, 161e, 180e, 181e
Node 15: Antpols (14 total): 147n, 148e, 148n, 149n, 150e, 168e, 168n, 169n, 188e, 189n, 190e, 190n, 191e, 191n Whole Ants (4 total): 168, 148, 190, 191 Single Pols (6 total): 147n, 149n, 150e, 169n, 188e, 189n
Node 16: Antpols (11 total): 152n, 153n, 154e, 154n, 173n, 174e, 192e, 192n, 194e, 194n, 213n Whole Ants (3 total): 192, 194, 154 Single Pols (5 total): 152n, 153n, 173n, 174e, 213n
Node 18: Antpols (15 total): 200n, 202n, 203e, 203n, 219e, 219n, 220e, 220n, 222n, 237e, 237n, 238e, 238n, 239e, 239n Whole Ants (6 total): 203, 237, 238, 239, 219, 220 Single Pols (3 total): 200n, 202n, 222n
Node 19: Antpols (17 total): 205e, 205n, 206e, 206n, 207e, 207n, 223n, 224e, 224n, 225e, 225n, 226e, 240n, 241e, 241n, 242e, 243n Whole Ants (6 total): 224, 225, 205, 206, 207, 241 Single Pols (5 total): 223n, 226e, 240n, 242e, 243n
Node 21: Antpols (15 total): 175e, 175n, 195e, 195n, 212e, 214e, 214n, 231n, 327e, 327n, 331e, 331n, 332e, 336n, 340n Whole Ants (5 total): 195, 327, 331, 175, 214 Single Pols (5 total): 212e, 231n, 332e, 336n, 340n
Node 22: Antpols (10 total): 250e, 250n, 251n, 253e, 268n, 269e, 269n, 282e, 283e, 283n Whole Ants (3 total): 250, 283, 269 Single Pols (4 total): 251n, 253e, 268n, 282e
Node 23: Antpols (2 total): 254n, 256e Whole Ants (0 total): Single Pols (2 total): 254n, 256e
Node 28: Antpols (1 total): 317e Whole Ants (0 total): Single Pols (1 total): 317e
Node 29: Antpols (7 total): 277e, 292e, 306e, 306n, 307e, 319e, 319n Whole Ants (2 total): 306, 319 Single Pols (3 total): 277e, 292e, 307e
Other Low Power Issues: (124 antpols across 87 antennas)
These antennas have low power, but are not all-zeros and not FEM off.
All Bad Antpols: 3e, 3n, 4n, 5e, 8n, 18e, 18n, 21e, 27e, 28e, 28n, 30e, 30n, 32n, 40e, 40n, 42e, 42n, 43e, 43n, 45e, 45n, 46e, 46n, 54e, 57e, 57n, 58e, 59e, 60e, 60n, 71e, 71n, 72n, 73e, 73n, 74e, 74n, 75e, 75n, 76e, 76n, 80n, 81e, 81n, 82e, 83e, 84e, 85e, 96e, 96n, 97n, 98e, 98n, 99e, 99n, 101n, 103e, 104e, 104n, 115n, 120e, 120n, 121e, 122e, 122n, 123e, 131e, 131n, 137e, 137n, 147e, 159e, 160e, 167e, 169e, 170e, 170n, 179e, 179n, 181n, 182n, 189e, 193e, 193n, 200e, 204e, 204n, 212n, 213e, 218n, 221e, 222e, 223e, 232n, 240e, 242n, 251e, 252e, 253n, 255e, 256n, 266e, 266n, 267e, 267n, 268e, 278e, 278n, 281n, 291n, 293n, 295e, 295n, 317n, 322e, 322n, 326e, 326n, 329e, 329n, 332n, 333e, 333n Node 1: Antpols (11 total): 3e, 3n, 4n, 5e, 18e, 18n, 27e, 28e, 28n, 30e, 30n Whole Ants (4 total): 18, 3, 28, 30 Single Pols (3 total): 4n, 5e, 27e
Node 2: Antpols (3 total): 8n, 21e, 32n Whole Ants (0 total): Single Pols (3 total): 8n, 21e, 32n
Node 4: Antpols (10 total): 40e, 40n, 42e, 42n, 54e, 57e, 57n, 71e, 71n, 72n Whole Ants (4 total): 40, 57, 42, 71 Single Pols (2 total): 54e, 72n
Node 5: Antpols (20 total): 43e, 43n, 45e, 45n, 46e, 46n, 58e, 59e, 60e, 60n, 73e, 73n, 74e, 74n, 75e, 75n, 76e, 76n, 322e, 322n Whole Ants (9 total): 322, 73, 74, 43, 75, 45, 46, 76, 60 Single Pols (2 total): 58e, 59e
Node 7: Antpols (10 total): 81e, 81n, 82e, 83e, 98e, 98n, 99e, 99n, 137e, 137n Whole Ants (4 total): 137, 81, 98, 99 Single Pols (2 total): 82e, 83e
Node 8: Antpols (12 total): 84e, 85e, 101n, 103e, 104e, 104n, 120e, 120n, 121e, 122e, 122n, 123e Whole Ants (3 total): 104, 122, 120 Single Pols (6 total): 84e, 85e, 101n, 103e, 121e, 123e
Node 11: Antpols (7 total): 80n, 96e, 96n, 97n, 115n, 131e, 131n Whole Ants (2 total): 96, 131 Single Pols (3 total): 80n, 97n, 115n
Node 12: Antpols (6 total): 179e, 179n, 329e, 329n, 333e, 333n Whole Ants (3 total): 329, 179, 333 Single Pols (0 total):
Node 13: Antpols (4 total): 159e, 160e, 181n, 182n Whole Ants (0 total): Single Pols (4 total): 159e, 160e, 181n, 182n
Node 15: Antpols (6 total): 147e, 167e, 169e, 170e, 170n, 189e Whole Ants (1 total): 170 Single Pols (4 total): 147e, 167e, 169e, 189e
Node 16: Antpols (3 total): 193e, 193n, 213e Whole Ants (1 total): 193 Single Pols (1 total): 213e
Node 17: Antpols (1 total): 218n Whole Ants (0 total): Single Pols (1 total): 218n
Node 18: Antpols (3 total): 200e, 221e, 222e Whole Ants (0 total): Single Pols (3 total): 200e, 221e, 222e
Node 19: Antpols (5 total): 204e, 204n, 223e, 240e, 242n Whole Ants (1 total): 204 Single Pols (3 total): 223e, 240e, 242n
Node 21: Antpols (5 total): 212n, 232n, 326e, 326n, 332n Whole Ants (1 total): 326 Single Pols (3 total): 212n, 232n, 332n
Node 22: Antpols (11 total): 251e, 252e, 253n, 266e, 266n, 267e, 267n, 268e, 281n, 295e, 295n Whole Ants (3 total): 266, 267, 295 Single Pols (5 total): 251e, 252e, 253n, 268e, 281n
Node 23: Antpols (2 total): 255e, 256n Whole Ants (0 total): Single Pols (2 total): 255e, 256n
Node 28: Antpols (2 total): 291n, 317n Whole Ants (0 total): Single Pols (2 total): 291n, 317n
Node 29: Antpols (3 total): 278e, 278n, 293n Whole Ants (1 total): 278 Single Pols (1 total): 293n
Low Correlation, But Not Low Power: (309 antpols across 180 antennas)
These antennas are low correlation, but their autocorrelation power levels look OK.
All Bad Antpols: 4e, 5n, 7e, 7n, 8e, 9e, 9n, 10e, 10n, 15e, 15n, 16e, 16n, 17e, 17n, 19e, 19n, 20e, 20n, 21n, 29e, 29n, 31e, 31n, 32e, 33e, 33n, 36e, 36n, 37e, 37n, 38e, 38n, 41e, 41n, 50e, 50n, 51e, 51n, 52e, 52n, 53e, 53n, 54n, 55e, 55n, 56e, 56n, 65e, 65n, 66e, 66n, 67e, 67n, 68e, 68n, 69e, 69n, 70e, 70n, 72e, 79e, 79n, 80e, 82n, 83n, 84n, 85n, 86e, 86n, 87e, 87n, 95e, 95n, 97e, 100e, 100n, 101e, 102e, 102n, 103n, 113e, 113n, 114e, 114n, 115e, 116e, 116n, 117e, 117n, 118e, 118n, 119e, 119n, 121n, 123n, 132e, 132n, 133e, 133n, 134e, 134n, 135e, 135n, 136e, 136n, 138e, 138n, 139e, 139n, 140e, 140n, 141e, 141n, 142e, 142n, 147n, 148e, 148n, 149e, 149n, 150e, 150n, 152e, 152n, 153e, 153n, 154e, 154n, 155e, 155n, 156e, 156n, 157e, 157n, 158e, 158n, 159n, 160n, 161e, 162e, 162n, 167n, 168e, 168n, 169n, 173e, 173n, 174e, 174n, 175e, 175n, 176e, 177e, 178e, 180e, 181e, 183e, 183n, 188e, 188n, 189n, 190e, 190n, 191e, 191n, 192e, 192n, 194e, 194n, 195e, 195n, 196e, 196n, 197e, 197n, 198e, 198n, 200n, 201e, 201n, 202e, 202n, 203e, 203n, 205e, 205n, 206e, 206n, 207e, 207n, 208e, 208n, 209e, 209n, 210e, 210n, 211e, 211n, 212e, 213n, 214e, 214n, 215e, 215n, 216e, 216n, 217e, 217n, 218e, 219e, 219n, 220e, 220n, 221n, 222n, 223n, 224e, 224n, 225e, 225n, 226e, 226n, 227e, 227n, 228e, 228n, 229e, 229n, 231e, 231n, 232e, 233e, 233n, 234e, 234n, 237e, 237n, 238e, 238n, 239e, 239n, 240n, 241e, 241n, 242e, 243e, 243n, 244e, 244n, 245e, 245n, 250e, 250n, 251n, 252n, 253e, 254e, 254n, 255n, 256e, 268n, 269e, 269n, 277e, 277n, 281e, 282e, 282n, 283e, 283n, 290e, 290n, 291e, 292e, 292n, 293e, 294e, 294n, 306e, 306n, 307e, 307n, 315e, 315n, 316e, 316n, 317e, 318e, 318n, 319e, 319n, 320e, 320n, 321e, 321n, 323e, 323n, 324e, 324n, 327e, 327n, 331e, 331n, 332e, 336e, 336n, 340e, 340n Node 1: Antpols (10 total): 4e, 5n, 15e, 15n, 16e, 16n, 17e, 17n, 29e, 29n Whole Ants (4 total): 16, 17, 29, 15 Single Pols (2 total): 4e, 5n Node 2: Antpols (21 total): 7e, 7n, 8e, 9e, 9n, 10e, 10n, 19e, 19n, 20e, 20n, 21n, 31e, 31n, 32e, 33e, 33n, 321e, 321n, 323e, 323n Whole Ants (9 total): 33, 321, 323, 7, 9, 10, 19, 20, 31 Single Pols (3 total): 8e, 21n, 32e Node 3: Antpols (24 total): 36e, 36n, 37e, 37n, 38e, 38n, 50e, 50n, 51e, 51n, 52e, 52n, 53e, 53n, 65e, 65n, 66e, 66n, 67e, 67n, 68e, 68n, 320e, 320n Whole Ants (12 total): 320, 65, 66, 67, 36, 37, 38, 68, 50, 51, 52, 53 Single Pols (0 total): Node 4: Antpols (14 total): 41e, 41n, 54n, 55e, 55n, 56e, 56n, 69e, 69n, 70e, 70n, 72e, 324e, 324n Whole Ants (6 total): 324, 69, 70, 41, 55, 56 Single Pols (2 total): 54n, 72e Node 7: Antpols (14 total): 82n, 83n, 100e, 100n, 116e, 116n, 117e, 117n, 118e, 118n, 119e, 119n, 138e, 138n Whole Ants (6 total): 100, 138, 116, 117, 118, 119 Single Pols (2 total): 82n, 83n Node 8: Antpols (12 total): 84n, 85n, 86e, 86n, 87e, 87n, 101e, 102e, 102n, 103n, 121n, 123n Whole Ants (3 total): 102, 86, 87 Single Pols (6 total): 84n, 85n, 101e, 103n, 121n, 123n Node 11: Antpols (17 total): 79e, 79n, 80e, 95e, 95n, 97e, 113e, 113n, 114e, 114n, 115e, 132e, 132n, 133e, 133n, 134e, 134n Whole Ants (7 total): 132, 133, 134, 79, 113, 114, 95 Single Pols (3 total): 80e, 97e, 115e Node 12: Antpols (15 total): 135e, 135n, 136e, 136n, 155e, 155n, 156e, 156n, 157e, 157n, 158e, 158n, 176e, 177e, 178e Whole Ants (6 total): 135, 136, 155, 156, 157, 158 Single Pols (3 total): 176e, 177e, 178e Node 13: Antpols (17 total): 139e, 139n, 140e, 140n, 141e, 141n, 142e, 142n, 159n, 160n, 161e, 162e, 162n, 180e, 181e, 183e, 183n Whole Ants (6 total): 162, 139, 140, 141, 142, 183 Single Pols (5 total): 159n, 160n, 161e, 180e, 181e Node 15: Antpols (18 total): 147n, 148e, 148n, 149e, 149n, 150e, 150n, 167n, 168e, 168n, 169n, 188e, 188n, 189n, 190e, 190n, 191e, 191n Whole Ants (7 total): 168, 148, 149, 150, 188, 190, 191 Single Pols (4 total): 147n, 167n, 169n, 189n Node 16: Antpols (15 total): 152e, 152n, 153e, 153n, 154e, 154n, 173e, 173n, 174e, 174n, 192e, 192n, 194e, 194n, 213n Whole Ants (7 total): 192, 194, 173, 174, 152, 153, 154 Single Pols (1 total): 213n Node 17: Antpols (17 total): 196e, 196n, 197e, 197n, 198e, 198n, 215e, 215n, 216e, 216n, 217e, 217n, 218e, 233e, 233n, 234e, 234n Whole Ants (8 total): 196, 197, 198, 233, 234, 215, 216, 217 Single Pols (1 total): 218e Node 18: Antpols (19 total): 200n, 201e, 201n, 202e, 202n, 203e, 203n, 219e, 219n, 220e, 220n, 221n, 222n, 237e, 237n, 238e, 238n, 239e, 239n Whole Ants (8 total): 201, 202, 203, 237, 238, 239, 219, 220 Single Pols (3 total): 200n, 221n, 222n Node 19: Antpols (19 total): 205e, 205n, 206e, 206n, 207e, 207n, 223n, 224e, 224n, 225e, 225n, 226e, 226n, 240n, 241e, 241n, 242e, 243e, 243n Whole Ants (8 total): 224, 225, 226, 205, 206, 207, 241, 243 Single Pols (3 total): 223n, 240n, 242e Node 20: Antpols (18 total): 208e, 208n, 209e, 209n, 210e, 210n, 211e, 211n, 227e, 227n, 228e, 228n, 229e, 229n, 244e, 244n, 245e, 245n Whole Ants (9 total): 227, 228, 229, 208, 209, 210, 211, 244, 245 Single Pols (0 total): Node 21: Antpols (19 total): 175e, 175n, 195e, 195n, 212e, 214e, 214n, 231e, 231n, 232e, 327e, 327n, 331e, 331n, 332e, 336e, 336n, 340e, 340n Whole Ants (8 total): 195, 231, 327, 331, 175, 336, 340, 214 Single Pols (3 total): 212e, 232e, 332e Node 22: Antpols (13 total): 250e, 250n, 251n, 252n, 253e, 268n, 269e, 269n, 281e, 282e, 282n, 283e, 283n Whole Ants (4 total): 283, 250, 282, 269 Single Pols (5 total): 251n, 252n, 253e, 268n, 281e Node 23: Antpols (4 total): 254e, 254n, 255n, 256e Whole Ants (1 total): 254 Single Pols (2 total): 255n, 256e Node 28: Antpols (10 total): 290e, 290n, 291e, 315e, 315n, 316e, 316n, 317e, 318e, 318n Whole Ants (4 total): 290, 315, 316, 318 Single Pols (2 total): 291e, 317e Node 29: Antpols (13 total): 277e, 277n, 292e, 292n, 293e, 294e, 294n, 306e, 306n, 307e, 307n, 319e, 319n Whole Ants (6 total): 292, 294, 306, 307, 277, 319 Single Pols (1 total): 293e
Bad Bandpass Shapes, But Not Bad Power: (130 antpols across 85 antennas)
These antennas have unusual bandpass shapes, but are not all-zeros, high power, low power, or FEM off.
All Bad Antpols: 8e, 10e, 10n, 16n, 19e, 19n, 20e, 20n, 29n, 31n, 36e, 36n, 37e, 37n, 38e, 38n, 50e, 50n, 51e, 51n, 52e, 52n, 53e, 53n, 55e, 56e, 56n, 65e, 65n, 66e, 66n, 67e, 67n, 68e, 68n, 70n, 101e, 116n, 117n, 123n, 135e, 135n, 136e, 136n, 139e, 141e, 149e, 150n, 152e, 153e, 155e, 155n, 167n, 173e, 174n, 176e, 176n, 177e, 177n, 178e, 178n, 188n, 196e, 196n, 197e, 197n, 198e, 198n, 201e, 201n, 202e, 208e, 208n, 209e, 209n, 210e, 210n, 211e, 211n, 215e, 215n, 216e, 216n, 217e, 217n, 218e, 221n, 226n, 227e, 227n, 228e, 228n, 229e, 229n, 231e, 232e, 233e, 233n, 234e, 234n, 243e, 244e, 244n, 245e, 245n, 252n, 254e, 255n, 277n, 281e, 282n, 290e, 290n, 291e, 292n, 293e, 294e, 294n, 307n, 315e, 315n, 316e, 316n, 318e, 318n, 321e, 321n, 323n, 336e, 340e Node 1: Antpols (2 total): 16n, 29n Whole Ants (0 total): Single Pols (2 total): 16n, 29n
Node 2: Antpols (11 total): 8e, 10e, 10n, 19e, 19n, 20e, 20n, 31n, 321e, 321n, 323n Whole Ants (4 total): 321, 10, 19, 20 Single Pols (3 total): 8e, 31n, 323n
Node 3: Antpols (22 total): 36e, 36n, 37e, 37n, 38e, 38n, 50e, 50n, 51e, 51n, 52e, 52n, 53e, 53n, 65e, 65n, 66e, 66n, 67e, 67n, 68e, 68n Whole Ants (11 total): 65, 66, 67, 36, 37, 38, 68, 50, 51, 52, 53 Single Pols (0 total):
Node 4: Antpols (4 total): 55e, 56e, 56n, 70n Whole Ants (1 total): 56 Single Pols (2 total): 55e, 70n
Node 7: Antpols (2 total): 116n, 117n Whole Ants (0 total): Single Pols (2 total): 116n, 117n
Node 8: Antpols (2 total): 101e, 123n Whole Ants (0 total): Single Pols (2 total): 101e, 123n
Node 12: Antpols (12 total): 135e, 135n, 136e, 136n, 155e, 155n, 176e, 176n, 177e, 177n, 178e, 178n Whole Ants (6 total): 135, 136, 176, 177, 178, 155 Single Pols (0 total):
Node 13: Antpols (2 total): 139e, 141e Whole Ants (0 total): Single Pols (2 total): 139e, 141e
Node 15: Antpols (4 total): 149e, 150n, 167n, 188n Whole Ants (0 total): Single Pols (4 total): 149e, 150n, 167n, 188n
Node 16: Antpols (4 total): 152e, 153e, 173e, 174n Whole Ants (0 total): Single Pols (4 total): 152e, 153e, 173e, 174n
Node 17: Antpols (17 total): 196e, 196n, 197e, 197n, 198e, 198n, 215e, 215n, 216e, 216n, 217e, 217n, 218e, 233e, 233n, 234e, 234n Whole Ants (8 total): 196, 197, 198, 233, 234, 215, 216, 217 Single Pols (1 total): 218e
Node 18: Antpols (4 total): 201e, 201n, 202e, 221n Whole Ants (1 total): 201 Single Pols (2 total): 202e, 221n
Node 19: Antpols (2 total): 226n, 243e Whole Ants (0 total): Single Pols (2 total): 226n, 243e
Node 20: Antpols (18 total): 208e, 208n, 209e, 209n, 210e, 210n, 211e, 211n, 227e, 227n, 228e, 228n, 229e, 229n, 244e, 244n, 245e, 245n Whole Ants (9 total): 227, 228, 229, 208, 209, 210, 211, 244, 245 Single Pols (0 total):
Node 21: Antpols (4 total): 231e, 232e, 336e, 340e Whole Ants (0 total): Single Pols (4 total): 231e, 232e, 336e, 340e
Node 22: Antpols (3 total): 252n, 281e, 282n Whole Ants (0 total): Single Pols (3 total): 252n, 281e, 282n
Node 23: Antpols (2 total): 254e, 255n Whole Ants (0 total): Single Pols (2 total): 254e, 255n
Node 28: Antpols (9 total): 290e, 290n, 291e, 315e, 315n, 316e, 316n, 318e, 318n Whole Ants (4 total): 290, 315, 316, 318 Single Pols (1 total): 291e
Node 29: Antpols (6 total): 277n, 292n, 293e, 294e, 294n, 307n Whole Ants (1 total): 294 Single Pols (4 total): 277n, 292n, 293e, 307n
Excess RFI: (0 antpols across 0 antennas)
These antennas have excess RMS after DPSS filtering (likely RFI), but not low or high power or a bad bandpass.
Redcal chi^2: (0 antpols across 0 antennas)
These antennas have been idenfied as not redundantly calibrating well, even after passing the above checks.
Full-Day Visualizations¶
def classification_plot(col):
class_array = classification_array(col)
plt.figure(figsize=(12, len(ants) / 10), dpi=100)
plt.imshow(class_array.T, aspect='auto', interpolation='none', cmap='RdYlGn', vmin=0, vmax=2,
extent=[jds[0] - np.floor(jds[0]), jds[-1] - np.floor(jds[0]), len(ants), 0])
plt.xlabel(f'JD - {int(jds[0])}')
plt.yticks(ticks=np.arange(.5, len(ants)+.5), labels=[ant for ant in ants], fontsize=6)
plt.ylabel('Antenna Number (East First, Then North)')
plt.gca().tick_params(right=True, top=True, labelright=True, labeltop=True)
plt.tight_layout()
plt.title(f'{col}: Green is "good", Yellow is "suspect", Red is "bad"')
Figure 1: Per-File Overall Antenna Classification Summary¶
This "big green board" shows the overall (i.e. after redundant calibration) classification of antennas on a per-file basis. This is useful for looking at time-dependent effects across the array. While only antenna numbers are labeled, both polarizations are shown, first East then North going down, above and below the antenna's tick mark.
classification_plot('Antenna Class')
# compute flag fractions for all classifiers and antennas
frac_flagged = []
for col in class_cols[1:]:
class_array = np.vstack([t[col] for t in tables])
class_array[class_array == 'good'] = False
class_array[class_array == 'suspect'] = False
class_array[class_array == 'bad'] = True
frac_flagged.append(np.sum(class_array, axis=0))
def plot_flag_frac_all_classifiers():
ticks = []
for i, col in enumerate(list(class_cols[1:])):
ticks.append(f'{col} ({np.nanmean(np.array(frac_flagged).astype(float)[i]) / len(csv_files):.2%})')
plt.figure(figsize=(8, len(ants) / 10), dpi=100)
plt.imshow(np.array(frac_flagged).astype(float).T, aspect='auto', interpolation='none', cmap='viridis')
plt.xticks(ticks=np.arange(len(list(class_cols[1:]))), labels=ticks, rotation=-45, ha='left')
plt.yticks(ticks=np.arange(.5, len(ap_strs)+.5, 2), labels=[ant for ant in ants], fontsize=6)
plt.ylabel('Antenna Number (East First, Then North)')
plt.gca().tick_params(right=True, labelright=True,)
ax2 = plt.gca().twiny()
ax2.set_xticks(ticks=np.arange(len(list(class_cols[1:]))), labels=ticks, rotation=45, ha='left')
plt.colorbar(ax=plt.gca(), label=f'Number of Files Flagged Out of {len(csv_files)}', aspect=50)
plt.tight_layout()
Figure 2: Per-Classifier Antenna Flagging Summary¶
This plot shows the fraction of files flagged for each reason for each antenna. It's useful for seeing which problems are transitory and which ones are more common. Note that not all flags are independent and in particular redcal chi^2 takes an OR of other classifications as an input. Also note that only antenna numbers are labeled, both polarizations are shown, first East then North going down, above and below the antenna's tick mark.
plot_flag_frac_all_classifiers()
def array_class_plot():
fig, axes = plt.subplots(1, 2, figsize=(14, 6), dpi=100, gridspec_kw={'width_ratios': [2, 1]})
if len([ant for ant in hd.data_ants if ant < 320]) > 0:
plot_antclass(hd.antpos, overall_class, ax=axes[0], ants=[ant for ant in hd.data_ants if ant < 320], legend=False,
title=f'HERA Core: Overall Flagging Based on {overall_thresh:.1%} Daily Threshold')
if len([ant for ant in hd.data_ants if ant >= 320]) > 0:
plot_antclass(hd.antpos, overall_class, ax=axes[1], ants=[ant for ant in hd.data_ants if ant >= 320], radius=50, title='Outriggers')
Figure 3: Array Visualization of Overall Daily Classification¶
Overall classification of antenna-polarizations shown on the array layout. If any antenna is marked bad for any reason more than the threshold (default 10%), it is marked bad here. Likewise, if any antenna is marked suspect for more than 10% of the night (but not bad), it's suspect here.
if SUM_FILE is not None: array_class_plot()
WARNING:matplotlib.axes._base:Ignoring fixed x limits to fulfill fixed data aspect with adjustable data limits.
WARNING:matplotlib.axes._base:Ignoring fixed x limits to fulfill fixed data aspect with adjustable data limits.
WARNING:matplotlib.axes._base:Ignoring fixed y limits to fulfill fixed data aspect with adjustable data limits.
WARNING:matplotlib.axes._base:Ignoring fixed x limits to fulfill fixed data aspect with adjustable data limits.
WARNING:matplotlib.axes._base:Ignoring fixed x limits to fulfill fixed data aspect with adjustable data limits.
for repo in ['pyuvdata', 'hera_cal', 'hera_qm', 'hera_notebook_templates']:
exec(f'from {repo} import __version__')
print(f'{repo}: {__version__}')
pyuvdata: 3.2.5.dev1+g5a985ae31 hera_cal: 3.7.7.dev68+g3286222d3 hera_qm: 2.2.1.dev4+gf6d02113b
hera_notebook_templates: 0.1.dev989+gee0995d