Calibration Smoothing¶

by Josh Dillon, last updated December 20, 2025

This notebook runs calibration smoothing to the gains coming out of file_calibration notebook. It removes any flags founds on by that notebook and replaces them with flags generated from full_day_rfi and full_day_antenna_flagging. It flags antennas with high relative difference between the original gains and smoothed gains. It also plots the results for a couple of antennas.

Here's a set of links to skip to particular figures and tables:

• Figure 1: Identifying and Blacklisting abscal Failures¶

• Figure 2: Antenna Phases with Identified Phase Flips¶

• Figure 3: Full-Day Gain Amplitudes Before and After smooth_cal¶

• Figure 4: Full-Day Gain Phases Before and After smooth_cal¶

• Figure 5: Full-Day $\chi^2$ / DoF Waterfall from Redundant-Baseline Calibration¶

• Figure 6: Average $\chi^2$ per Antenna¶

• Figure 7: Relative Difference Before and After Smoothing¶

In [1]:
import time
tstart = time.time()
In [2]:
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 glob
import copy
import warnings
import matplotlib
import matplotlib.pyplot as plt
from hera_cal import io, utils, smooth_cal
from hera_qm.time_series_metrics import true_stretches
%matplotlib inline
from IPython.display import display, HTML

Parse inputs¶

In [3]:
# get files
SUM_FILE = os.environ.get("SUM_FILE", None)
# SUM_FILE = "/lustre/aoc/projects/hera/h6c-analysis/IDR3/2459893/zen.2459893.25258.sum.uvh5"
SUM_SUFFIX = os.environ.get("SUM_SUFFIX", 'sum.uvh5')
CAL_SUFFIX = os.environ.get("CAL_SUFFIX", 'sum.omni.calfits')
SMOOTH_CAL_SUFFIX = os.environ.get("SMOOTH_CAL_SUFFIX", 'sum.smooth.calfits')
ANT_FLAG_SUFFIX = os.environ.get("ANT_FLAG_SUFFIX", 'sum.antenna_flags.h5')
RFI_FLAG_SUFFIX = os.environ.get("RFI_FLAG_SUFFIX", 'sum.flag_waterfall.h5')
FREQ_SMOOTHING_SCALE = float(os.environ.get("FREQ_SMOOTHING_SCALE", 30.0)) # MHz
TIME_SMOOTHING_SCALE = float(os.environ.get("TIME_SMOOTHING_SCALE", 1e4)) # seconds
EIGENVAL_CUTOFF = float(os.environ.get("EIGENVAL_CUTOFF", 1e-12))
PER_POL_REFANT = os.environ.get("PER_POL_REFANT", "False").upper() == "TRUE"
BLACKLIST_TIMESCALE_FACTOR = float(os.environ.get("BLACKLIST_TIMESCALE_FACTOR", 4.0))
BLACKLIST_RELATIVE_ERROR_THRESH = float(os.environ.get("BLACKLIST_RELATIVE_ERROR_THRESH", 1))
BLACKLIST_RELATIVE_WEIGHT = float(os.environ.get("BLACKLIST_RELATIVE_WEIGHT", 0.1))
FM_LOW_FREQ = float(os.environ.get("FM_LOW_FREQ", 87.5)) # in MHz
FM_HIGH_FREQ = float(os.environ.get("FM_HIGH_FREQ", 108.0)) # in MHz
SC_RELATIVE_DIFF_CUTOFF = float(os.environ.get("SC_RELATIVE_DIFF_CUTOFF", 0.2))

for setting in ['SUM_FILE', 'SUM_SUFFIX', 'CAL_SUFFIX', 'SMOOTH_CAL_SUFFIX', 'ANT_FLAG_SUFFIX',
                'RFI_FLAG_SUFFIX', 'FREQ_SMOOTHING_SCALE', 'TIME_SMOOTHING_SCALE', 'EIGENVAL_CUTOFF', 
                'PER_POL_REFANT', 'BLACKLIST_TIMESCALE_FACTOR', 'BLACKLIST_RELATIVE_ERROR_THRESH', 
                'BLACKLIST_RELATIVE_WEIGHT', 'FM_LOW_FREQ', 'FM_HIGH_FREQ', 'SC_RELATIVE_DIFF_CUTOFF']:
    if issubclass(type(eval(setting)), str):
        print(f'{setting} = "{eval(setting)}"')
    else:
        print(f'{setting} = {eval(setting)}')
SUM_FILE = "/mnt/sn1/data2/2461092/zen.2461092.25245.sum.uvh5"
SUM_SUFFIX = "sum.uvh5"
CAL_SUFFIX = "sum.omni.calfits"
SMOOTH_CAL_SUFFIX = "sum.smooth.calfits"
ANT_FLAG_SUFFIX = "sum.antenna_flags.h5"
RFI_FLAG_SUFFIX = "sum.flag_waterfall.h5"
FREQ_SMOOTHING_SCALE = 10.0
TIME_SMOOTHING_SCALE = 600000.0
EIGENVAL_CUTOFF = 1e-12
PER_POL_REFANT = False
BLACKLIST_TIMESCALE_FACTOR = 4.0
BLACKLIST_RELATIVE_ERROR_THRESH = 1.0
BLACKLIST_RELATIVE_WEIGHT = 0.1
FM_LOW_FREQ = 87.5
FM_HIGH_FREQ = 108.0
SC_RELATIVE_DIFF_CUTOFF = 0.2

Load files and select reference antenna(s)¶

In [4]:
hd = io.HERAData(SUM_FILE)
sum_glob = '.'.join(SUM_FILE.split('.')[:-3]) + '.*.' + SUM_SUFFIX
cal_files_glob = sum_glob.replace(SUM_SUFFIX, CAL_SUFFIX)
cal_files = sorted(glob.glob(cal_files_glob))
print(f'Found {len(cal_files)} *.{CAL_SUFFIX} files starting with {cal_files[0]}.')
Found 1851 *.sum.omni.calfits files starting with /mnt/sn1/data2/2461092/zen.2461092.25245.sum.omni.calfits.
In [5]:
rfi_flag_files_glob = sum_glob.replace(SUM_SUFFIX, RFI_FLAG_SUFFIX)
rfi_flag_files = sorted(glob.glob(rfi_flag_files_glob))
print(f'Found {len(rfi_flag_files)} *.{RFI_FLAG_SUFFIX} files starting with {rfi_flag_files[0]}.')
Found 1851 *.sum.flag_waterfall.h5 files starting with /mnt/sn1/data2/2461092/zen.2461092.25245.sum.flag_waterfall.h5.
In [6]:
ant_flag_files_glob = sum_glob.replace(SUM_SUFFIX, ANT_FLAG_SUFFIX)
ant_flag_files = sorted(glob.glob(ant_flag_files_glob))
print(f'Found {len(ant_flag_files)} *.{ANT_FLAG_SUFFIX} files starting with {ant_flag_files[0]}.')
Found 1851 *.sum.antenna_flags.h5 files starting with /mnt/sn1/data2/2461092/zen.2461092.25245.sum.antenna_flags.h5.
In [7]:
cs = smooth_cal.CalibrationSmoother(cal_files, flag_file_list=(ant_flag_files + rfi_flag_files),
                                    ignore_calflags=True, pick_refant=False, load_chisq=True, load_cspa=True)
invalid value encountered in multiply
In [8]:
# Pick reference antenna(s) but don't let ants known to flip phases get picked as reference antennas
banned_refants = [(144, 'Jnn'), (121, 'Jee'), (71, 'Jnn')]
cs.refant = smooth_cal.pick_reference_antenna({ant: cs.gain_grids[ant] for ant in cs.gain_grids if ant not in banned_refants},
                                              {ant: cs.flag_grids[ant] for ant in cs.gain_grids if ant not in banned_refants},
                                              cs.freqs, per_pol=True, acceptable_candidate_frac=0.25, antpos=hd.antpos)
for pol in cs.refant:
    print(f'Reference antenna {cs.refant[pol][0]} selected for smoothing {pol} gains.')

if not PER_POL_REFANT:
    # in this case, rephase both pols separately before smoothing, but also smooth the relative polarization calibration phasor
    overall_refant = smooth_cal.pick_reference_antenna({ant: cs.gain_grids[ant] for ant in cs.refant.values()}, 
                                                       {ant: cs.flag_grids[ant] for ant in cs.refant.values()}, 
                                                       cs.freqs, per_pol=False)
    print(f'Overall reference antenna {overall_refant} selected.')
    other_refant = [ant for ant in cs.refant.values() if ant != overall_refant][0]

    relative_pol_phasor = cs.gain_grids[overall_refant] * cs.gain_grids[other_refant].conj() # TODO: is this conjugation right?
    relative_pol_phasor /= np.abs(relative_pol_phasor)

abscal_refants = {cs.refant[pol]: cs.gain_grids[cs.refant[pol]] for pol in ['Jee', 'Jnn']}
Reference antenna 162 selected for smoothing Jee gains.
Reference antenna 162 selected for smoothing Jnn gains.
Overall reference antenna (np.int64(162), 'Jnn') selected.
In [9]:
cs.rephase_to_refant(propagate_refant_flags=True)
In [10]:
lst_grid = utils.JD2LST(cs.time_grid) * 12 / np.pi
lst_grid[lst_grid > lst_grid[-1]] -= 24

Find consistent outliers in relative error after a coarse smoothing¶

These are typically a sign of failures of abscal.

In [11]:
relative_error_samples = {pol: np.zeros_like(cs.gain_grids[cs.refant[pol]], dtype=float) for pol in ['Jee', 'Jnn']}
sum_relative_error = {pol: np.zeros_like(cs.gain_grids[cs.refant[pol]], dtype=float) for pol in ['Jee', 'Jnn']}
per_ant_avg_relative_error = {} 

# perform a 2D DPSS filter with a BLACKLIST_TIMESCALE_FACTOR longer timescale, averaging the results per-pol
for ant in cs.gain_grids:
    if np.all(cs.flag_grids[ant]):
        continue
    filtered, _ = smooth_cal.time_freq_2D_filter(gains=cs.gain_grids[ant], 
                                                 wgts=(~cs.flag_grids[ant]).astype(float),
                                                 freqs=cs.freqs,
                                                 times=cs.time_grid,
                                                 freq_scale=FREQ_SMOOTHING_SCALE,
                                                 time_scale=TIME_SMOOTHING_SCALE * BLACKLIST_TIMESCALE_FACTOR,
                                                 eigenval_cutoff=EIGENVAL_CUTOFF,
                                                 method='DPSS', 
                                                 fit_method='lu_solve', 
                                                 fix_phase_flips=True, 
                                                 phase_flip_time_scale = TIME_SMOOTHING_SCALE / 2,
                                                 flag_phase_flip_ints=True,
                                                 skip_flagged_edges=True, 
                                                 freq_cuts=[(FM_LOW_FREQ + FM_HIGH_FREQ) * .5e6],
                                                ) 
    relative_error = np.where(cs.flag_grids[ant], 0, np.abs(cs.gain_grids[ant] - filtered) / np.abs(filtered))
    per_ant_avg_relative_error[ant] = np.nanmean(np.where(cs.flag_grids[ant], np.nan, relative_error))
    relative_error_samples[ant[1]] += (~cs.flag_grids[ant]).astype(float)
    sum_relative_error[ant[1]] += relative_error

# figure out per-antpol cuts for where to set weights to 0 for the main smooth_cal (but not necessarily flags)
cs.blacklist_wgt = BLACKLIST_RELATIVE_WEIGHT
for pol in ['Jee', 'Jnn']:
    avg_rel_error = sum_relative_error[pol] / relative_error_samples[pol]
    to_blacklist = np.where(relative_error_samples[pol] > 0, avg_rel_error > BLACKLIST_RELATIVE_ERROR_THRESH, False)
    for ant in cs.ants:
        if ant[1] == pol:
            cs.waterfall_blacklist[ant] = to_blacklist
invalid value encountered in divide
In [12]:
def plot_relative_error():
    with warnings.catch_warnings():
        warnings.simplefilter("ignore")

        fig, axes = plt.subplots(1, 3, figsize=(14, 7))
        extent = [cs.freqs[0] / 1e6, cs.freqs[-1] / 1e6, lst_grid[-1], lst_grid[0]]
        cmap = plt.get_cmap('Greys', 256)
        cmap.set_over('red')
        for ax, pol in zip(axes[0:2], ['Jee', 'Jnn']):
            to_plot = sum_relative_error[pol] / relative_error_samples[pol]
            im = ax.imshow(np.where(np.isfinite(to_plot), to_plot, np.nan), aspect='auto', interpolation='none', 
                           vmin=0, vmax=BLACKLIST_RELATIVE_ERROR_THRESH, extent=extent, cmap=cmap)
            ax.set_title(pol)
            ax.set_yticklabels(ax.get_yticks() % 24)
            ax.set_ylabel('LST (hours)')
            ax.set_xlabel('Frequency (MHz)')
        plt.colorbar(im, ax=axes[0:2], location='top', extend='max', label='Average Relative Error on Initial Smoothing')
        
        for pol in ['Jee', 'Jnn']:
            axes[2].hist((sum_relative_error[pol] / relative_error_samples[pol]).ravel(), bins=np.arange(0,2,.01), alpha=.5, label=pol)
        axes[2].set_yscale('log')
        axes[2].set_ylabel('Number of Waterfall Pixels')
        axes[2].set_xlabel('Relative Error')
        axes[2].axvline(BLACKLIST_RELATIVE_ERROR_THRESH, ls='--', c='r', label='Blacklist Threshold')
        axes[2].legend()

Figure 1: Identifying and Blacklisting abscal Failures¶

This plot highlights regions of the waterfall that are per-polarization blacklisted (i.e. given 0 weight in the main smooth_cal fit, but not necessarily flagged). This is usually a sign of problems with abscal and often occurs because

In [13]:
plot_relative_error()
No description has been provided for this image
In [14]:
# duplicate a small number of abscal gains for plotting
antnums = set([ant[0] for ant in cs.ants])
flags_per_antnum = [np.sum(cs.flag_grids[ant, 'Jnn']) + np.sum(cs.flag_grids[ant, 'Jee']) for ant in antnums]
larger_relative_error = np.array([np.max([per_ant_avg_relative_error.get((ant, pol), np.inf) for pol in ['Jee', 'Jnn']]) for ant in antnums])
refant_nums = [ant[0] for ant in cs.refant.values()]

# pick candidates that don't exhibit too many flags or non-smooth structure on first pass
candidate_ants = []
rel_error_factor = 1
while len(candidate_ants) < 6:  # Select more candidates to ensure we have enough after potential flagging
    candidate_ants = [ant for ant, nflags, rel_err in zip(antnums, flags_per_antnum, larger_relative_error) 
                      if (ant not in refant_nums) and (nflags <= np.percentile(flags_per_antnum, 25))
                      and (rel_err <= SC_RELATIVE_DIFF_CUTOFF * rel_error_factor)
                      and not np.all(cs.flag_grids[ant, 'Jee']) and not np.all(cs.flag_grids[ant, 'Jnn'])]
    rel_error_factor += .1

# choose antennas to plot: select up to 6 candidates, prioritizing diversity across antenna numbers
candidate_ants_sorted = sorted(candidate_ants)
step = max(1, len(candidate_ants_sorted) // 6)  # spread them out
_candidates = sorted(candidate_ants_sorted[::step][:6])
ants_to_plot_candidates = [_candidates[i//2] if i % 2 == 0 else _candidates[-(i//2)-1] for i in range(len(_candidates))]

# Store abscal gains for all candidates
abscal_gains = {}
for pol in ['Jee', 'Jnn']:
    for antnum in ants_to_plot_candidates:
        if PER_POL_REFANT:
            abscal_gains[antnum, pol] = cs.gain_grids[(antnum, pol)] * np.abs(abscal_refants[cs.refant[pol]]) / abscal_refants[cs.refant[pol]]
        else:
            abscal_gains[antnum, pol] = cs.gain_grids[(antnum, pol)] / np.abs(abscal_refants[cs.refant[pol]]) * abscal_refants[cs.refant[pol]]
            abscal_gains[antnum, pol] *= np.abs(abscal_refants[overall_refant]) / abscal_refants[overall_refant]

Perform smoothing¶

In [15]:
if not PER_POL_REFANT:
    # treat the relative_pol_phasor as if it were antenna -1
    cs.gain_grids[(-1, other_refant[1])] = relative_pol_phasor
    cs.flag_grids[(-1, other_refant[1])] = cs.flag_grids[overall_refant] | cs.flag_grids[other_refant]
    cs.waterfall_blacklist[(-1, other_refant[1])] = cs.waterfall_blacklist[cs.ants[0][0], 'Jee'] | cs.waterfall_blacklist[cs.ants[0][0], 'Jnn'] 
In [16]:
meta = cs.time_freq_2D_filter(freq_scale=FREQ_SMOOTHING_SCALE,
                              time_scale=TIME_SMOOTHING_SCALE,
                              eigenval_cutoff=EIGENVAL_CUTOFF,
                              method='DPSS', 
                              fit_method='lu_solve',
                              fix_phase_flips=True,
                              phase_flip_time_scale = TIME_SMOOTHING_SCALE / 2,
                              flag_phase_flip_ints=True,
                              skip_flagged_edges=True,
                              freq_cuts=[(FM_LOW_FREQ + FM_HIGH_FREQ) * .5e6],)
2 phase flips detected on antenna (np.int64(32), 'Jee'). A total of 1 integrations were phase-flipped relative to the 0th integration between 2461092.353893121 and 2461092.353893121.
22 phase flips detected on antenna (np.int64(33), 'Jee'). A total of 109 integrations were phase-flipped relative to the 0th integration between 2461092.353893121 and 2461092.3720125156.
2 phase flips detected on antenna (np.int64(215), 'Jee'). A total of 1 integrations were phase-flipped relative to the 0th integration between 2461092.3621698814 and 2461092.3621698814.
6 phase flips detected on antenna (np.int64(193), 'Jee'). A total of 401 integrations were phase-flipped relative to the 0th integration between 2461092.341589828 and 2461092.4759194152.
8 phase flips detected on antenna (np.int64(193), 'Jnn'). A total of 359 integrations were phase-flipped relative to the 0th integration between 2461092.342484613 and 2461092.383868416.
6 phase flips detected on antenna (np.int64(192), 'Jnn'). A total of 298 integrations were phase-flipped relative to the 0th integration between 2461092.348412563 and 2461092.3818551498.
8 phase flips detected on antenna (np.int64(192), 'Jee'). A total of 351 integrations were phase-flipped relative to the 0th integration between 2461092.3438267903 and 2461092.3835328715.
6 phase flips detected on antenna (np.int64(168), 'Jee'). A total of 3 integrations were phase-flipped relative to the 0th integration between 2461092.3613869445 and 2461092.362952818.
8 phase flips detected on antenna (np.int64(173), 'Jee'). A total of 564 integrations were phase-flipped relative to the 0th integration between 2461092.342372765 and 2461092.4869923787.
2 phase flips detected on antenna (np.int64(19), 'Jee'). A total of 1 integrations were phase-flipped relative to the 0th integration between 2461092.353893121 and 2461092.353893121.
2 phase flips detected on antenna (np.int64(8), 'Jee'). A total of 1 integrations were phase-flipped relative to the 0th integration between 2461092.353893121 and 2461092.353893121.
18 phase flips detected on antenna (np.int64(9), 'Jee'). A total of 101 integrations were phase-flipped relative to the 0th integration between 2461092.353893121 and 2461092.3719006674.
24 phase flips detected on antenna (np.int64(152), 'Jnn'). A total of 467 integrations were phase-flipped relative to the 0th integration between 2461092.342484613 and 2461092.485202809.
22 phase flips detected on antenna (np.int64(152), 'Jee'). A total of 534 integrations were phase-flipped relative to the 0th integration between 2461092.342372765 and 2461092.4850909607.
4 phase flips detected on antenna (np.int64(96), 'Jee'). A total of 374 integrations were phase-flipped relative to the 0th integration between 2461092.342484613 and 2461092.3864409225.
4 phase flips detected on antenna (np.int64(96), 'Jnn'). A total of 338 integrations were phase-flipped relative to the 0th integration between 2461092.3451689677 and 2461092.3836447196.
2 phase flips detected on antenna (np.int64(150), 'Jnn'). A total of 260 integrations were phase-flipped relative to the 0th integration between 2461092.3509850698 and 2461092.379953732.
6 phase flips detected on antenna (np.int64(150), 'Jee'). A total of 290 integrations were phase-flipped relative to the 0th integration between 2461092.348524411 and 2461092.3815196054.
4 phase flips detected on antenna (np.int64(149), 'Jee'). A total of 228 integrations were phase-flipped relative to the 0th integration between 2461092.352998336 and 2461092.3784997063.
2 phase flips detected on antenna (np.int64(149), 'Jnn'). A total of 198 integrations were phase-flipped relative to the 0th integration between 2461092.355011602 and 2461092.377045681.
10 phase flips detected on antenna (np.int64(148), 'Jnn'). A total of 10 integrations were phase-flipped relative to the 0th integration between 2461092.3610514 and 2461092.362952818.
6 phase flips detected on antenna (np.int64(132), 'Jee'). A total of 372 integrations were phase-flipped relative to the 0th integration between 2461092.342484613 and 2461092.386105378.
2 phase flips detected on antenna (np.int64(132), 'Jnn'). A total of 329 integrations were phase-flipped relative to the 0th integration between 2461092.346175601 and 2461092.382861783.
16 phase flips detected on antenna (np.int64(80), 'Jee'). A total of 406 integrations were phase-flipped relative to the 0th integration between 2461092.342484613 and 2461092.482518454.
12 phase flips detected on antenna (np.int64(97), 'Jee'). A total of 552 integrations were phase-flipped relative to the 0th integration between 2461092.342484613 and 2461092.4848672645.
12 phase flips detected on antenna (np.int64(115), 'Jee'). A total of 584 integrations were phase-flipped relative to the 0th integration between 2461092.342484613 and 2461092.4858738976.
6 phase flips detected on antenna (np.int64(93), 'Jnn'). A total of 91 integrations were phase-flipped relative to the 0th integration between 2461092.3566893237 and 2461092.3672030466.
8 phase flips detected on antenna (np.int64(153), 'Jee'). A total of 565 integrations were phase-flipped relative to the 0th integration between 2461092.341589828 and 2461092.485426505.
6 phase flips detected on antenna (np.int64(154), 'Jee'). A total of 617 integrations were phase-flipped relative to the 0th integration between 2461092.34147798 and 2461092.486097594.
8 phase flips detected on antenna (np.int64(211), 'Jee'). A total of 314 integrations were phase-flipped relative to the 0th integration between 2461092.346287449 and 2461092.382190694.
2 phase flips detected on antenna (np.int64(217), 'Jee'). A total of 18 integrations were phase-flipped relative to the 0th integration between 2461092.5796026187 and 2461092.5815040367.
6 phase flips detected on antenna (np.int64(134), 'Jee'). A total of 597 integrations were phase-flipped relative to the 0th integration between 2461092.342372765 and 2461092.4867686825.
18 phase flips detected on antenna (np.int64(133), 'Jee'). A total of 513 integrations were phase-flipped relative to the 0th integration between 2461092.342484613 and 2461092.483413239.
6 phase flips detected on antenna (np.int64(93), 'Jee'). A total of 203 integrations were phase-flipped relative to the 0th integration between 2461092.352998336 and 2461092.3765982883.
4 phase flips detected on antenna (np.int64(190), 'Jnn'). A total of 199 integrations were phase-flipped relative to the 0th integration between 2461092.35512345 and 2461092.377381225.
10 phase flips detected on antenna (np.int64(190), 'Jee'). A total of 221 integrations were phase-flipped relative to the 0th integration between 2461092.352998336 and 2461092.3784997063.
2 phase flips detected on antenna (np.int64(60), 'Jee'). A total of 1 integrations were phase-flipped relative to the 0th integration between 2461092.353893121 and 2461092.353893121.
4 phase flips detected on antenna (np.int64(79), 'Jee'). A total of 348 integrations were phase-flipped relative to the 0th integration between 2461092.346287449 and 2461092.385210593.
2 phase flips detected on antenna (np.int64(79), 'Jnn'). A total of 314 integrations were phase-flipped relative to the 0th integration between 2461092.347182234 and 2461092.382190694.
6 phase flips detected on antenna (np.int64(131), 'Jee'). A total of 326 integrations were phase-flipped relative to the 0th integration between 2461092.3470703857 and 2461092.3837565677.
4 phase flips detected on antenna (np.int64(131), 'Jnn'). A total of 275 integrations were phase-flipped relative to the 0th integration between 2461092.3499784367 and 2461092.3807366686.
6 phase flips detected on antenna (np.int64(95), 'Jnn'). A total of 290 integrations were phase-flipped relative to the 0th integration between 2461092.348524411 and 2461092.381072213.
10 phase flips detected on antenna (np.int64(189), 'Jee'). A total of 97 integrations were phase-flipped relative to the 0th integration between 2461092.358143349 and 2461092.3736902373.
12 phase flips detected on antenna (np.int64(189), 'Jnn'). A total of 52 integrations were phase-flipped relative to the 0th integration between 2461092.359821071 and 2461092.3678741353.
2 phase flips detected on antenna (np.int64(130), 'Jee'). A total of 268 integrations were phase-flipped relative to the 0th integration between 2461092.350202133 and 2461092.38006558.
14 phase flips detected on antenna (np.int64(110), 'Jnn'). A total of 13 integrations were phase-flipped relative to the 0th integration between 2461092.359821071 and 2461092.362952818.
18 phase flips detected on antenna (np.int64(110), 'Jee'). A total of 141 integrations were phase-flipped relative to the 0th integration between 2461092.3557945387 and 2461092.3730191486.
14 phase flips detected on antenna (np.int64(245), 'Jee'). A total of 157 integrations were phase-flipped relative to the 0th integration between 2461092.356241931 and 2461092.3749205666.
18 phase flips detected on antenna (np.int64(245), 'Jnn'). A total of 158 integrations were phase-flipped relative to the 0th integration between 2461092.35691302 and 2461092.375367959.
16 phase flips detected on antenna (np.int64(209), 'Jee'). A total of 122 integrations were phase-flipped relative to the 0th integration between 2461092.358031501 and 2461092.3736902373.
8 phase flips detected on antenna (np.int64(133), 'Jnn'). A total of 583 integrations were phase-flipped relative to the 0th integration between 2461092.342484613 and 2461092.4894530373.
12 phase flips detected on antenna (np.int64(10), 'Jee'). A total of 228 integrations were phase-flipped relative to the 0th integration between 2461092.352998336 and 2461092.38006558.
6 phase flips detected on antenna (np.int64(191), 'Jee'). A total of 272 integrations were phase-flipped relative to the 0th integration between 2461092.350202133 and 2461092.3807366686.
6 phase flips detected on antenna (np.int64(169), 'Jnn'). A total of 104 integrations were phase-flipped relative to the 0th integration between 2461092.357024868 and 2461092.3729073005.
6 phase flips detected on antenna (np.int64(262), 'Jee'). A total of 195 integrations were phase-flipped relative to the 0th integration between 2461092.355011602 and 2461092.3784997063.
12 phase flips detected on antenna (np.int64(261), 'Jnn'). A total of 85 integrations were phase-flipped relative to the 0th integration between 2461092.3595973747 and 2461092.3738020854.
10 phase flips detected on antenna (np.int64(261), 'Jee'). A total of 61 integrations were phase-flipped relative to the 0th integration between 2461092.360827704 and 2461092.3736902373.
2 phase flips detected on antenna (np.int64(136), 'Jee'). A total of 1 integrations were phase-flipped relative to the 0th integration between 2461092.3649660842 and 2461092.3649660842.
4 phase flips detected on antenna (np.int64(156), 'Jee'). A total of 2 integrations were phase-flipped relative to the 0th integration between 2461092.353893121 and 2461092.3649660842.
20 phase flips detected on antenna (np.int64(114), 'Jee'). A total of 495 integrations were phase-flipped relative to the 0th integration between 2461092.342484613 and 2461092.4827421503.
16 phase flips detected on antenna (np.int64(155), 'Jee'). A total of 150 integrations were phase-flipped relative to the 0th integration between 2461092.353893121 and 2461092.373466541.
6 phase flips detected on antenna (np.int64(129), 'Jee'). A total of 206 integrations were phase-flipped relative to the 0th integration between 2461092.352998336 and 2461092.3765982883.
6 phase flips detected on antenna (np.int64(129), 'Jnn'). A total of 114 integrations were phase-flipped relative to the 0th integration between 2461092.356018235 and 2461092.3720125156.
2 phase flips detected on antenna (np.int64(130), 'Jnn'). A total of 239 integrations were phase-flipped relative to the 0th integration between 2461092.351991703 and 2461092.3786115544.
8 phase flips detected on antenna (np.int64(210), 'Jee'). A total of 230 integrations were phase-flipped relative to the 0th integration between 2461092.352998336 and 2461092.379170795.
26 phase flips detected on antenna (np.int64(316), 'Jnn'). A total of 26 integrations were phase-flipped relative to the 0th integration between 2461092.361610641 and 2461092.3729073005.
8 phase flips detected on antenna (np.int64(113), 'Jee'). A total of 358 integrations were phase-flipped relative to the 0th integration between 2461092.3449452715 and 2461092.3853224413.
4 phase flips detected on antenna (np.int64(113), 'Jnn'). A total of 285 integrations were phase-flipped relative to the 0th integration between 2461092.3499784367 and 2461092.3818551498.
4 phase flips detected on antenna (np.int64(98), 'Jee'). A total of 2 integrations were phase-flipped relative to the 0th integration between 2461092.3621698814 and 2461092.3649660842.
8 phase flips detected on antenna (np.int64(94), 'Jee'). A total of 261 integrations were phase-flipped relative to the 0th integration between 2461092.3505376773 and 2461092.379953732.
6 phase flips detected on antenna (np.int64(111), 'Jee'). A total of 240 integrations were phase-flipped relative to the 0th integration between 2461092.3517680066 and 2461092.3787234025.
6 phase flips detected on antenna (np.int64(111), 'Jnn'). A total of 200 integrations were phase-flipped relative to the 0th integration between 2461092.352998336 and 2461092.37648644.
6 phase flips detected on antenna (np.int64(246), 'Jnn'). A total of 230 integrations were phase-flipped relative to the 0th integration between 2461092.352998336 and 2461092.3789470987.
8 phase flips detected on antenna (np.int64(155), 'Jnn'). A total of 97 integrations were phase-flipped relative to the 0th integration between 2461092.357024868 and 2461092.368545224.
20 phase flips detected on antenna (np.int64(214), 'Jnn'). A total of 575 integrations were phase-flipped relative to the 0th integration between 2461092.336892207 and 2461092.485202809.
8 phase flips detected on antenna (np.int64(214), 'Jee'). A total of 610 integrations were phase-flipped relative to the 0th integration between 2461092.3399121063 and 2461092.484419872.
16 phase flips detected on antenna (np.int64(317), 'Jee'). A total of 77 integrations were phase-flipped relative to the 0th integration between 2461092.353893121 and 2461092.3736902373.
2 phase flips detected on antenna (np.int64(174), 'Jee'). A total of 429 integrations were phase-flipped relative to the 0th integration between 2461092.3412542837 and 2461092.3891252773.
8 phase flips detected on antenna (np.int64(194), 'Jee'). A total of 572 integrations were phase-flipped relative to the 0th integration between 2461092.3412542837 and 2461092.4848672645.
22 phase flips detected on antenna (np.int64(128), 'Jee'). A total of 12 integrations were phase-flipped relative to the 0th integration between 2461092.359821071 and 2461092.3673148947.
16 phase flips detected on antenna (np.int64(116), 'Jee'). A total of 82 integrations were phase-flipped relative to the 0th integration between 2461092.353893121 and 2461092.370670338.
8 phase flips detected on antenna (np.int64(294), 'Jnn'). A total of 338 integrations were phase-flipped relative to the 0th integration between 2461092.343714942 and 2461092.3818551498.
10 phase flips detected on antenna (np.int64(292), 'Jee'). A total of 198 integrations were phase-flipped relative to the 0th integration between 2461092.3547879057 and 2461092.3784997063.
12 phase flips detected on antenna (np.int64(194), 'Jnn'). A total of 549 integrations were phase-flipped relative to the 0th integration between 2461092.3403594987 and 2461092.486097594.
4 phase flips detected on antenna (np.int64(112), 'Jee'). A total of 303 integrations were phase-flipped relative to the 0th integration between 2461092.348300715 and 2461092.382190694.
2 phase flips detected on antenna (np.int64(112), 'Jnn'). A total of 261 integrations were phase-flipped relative to the 0th integration between 2461092.3506495254 and 2461092.3797300356.
6 phase flips detected on antenna (np.int64(306), 'Jee'). A total of 241 integrations were phase-flipped relative to the 0th integration between 2461092.352327247 and 2461092.3795063393.
4 phase flips detected on antenna (np.int64(319), 'Jee'). A total of 260 integrations were phase-flipped relative to the 0th integration between 2461092.3509850698 and 2461092.38006558.
10 phase flips detected on antenna (np.int64(307), 'Jnn'). A total of 315 integrations were phase-flipped relative to the 0th integration between 2461092.3451689677 and 2461092.381966998.
12 phase flips detected on antenna (np.int64(277), 'Jnn'). A total of 182 integrations were phase-flipped relative to the 0th integration between 2461092.356241931 and 2461092.377381225.
8 phase flips detected on antenna (np.int64(153), 'Jnn'). A total of 648 integrations were phase-flipped relative to the 0th integration between 2461092.3403594987 and 2461092.4907952147.
4 phase flips detected on antenna (np.int64(319), 'Jnn'). A total of 291 integrations were phase-flipped relative to the 0th integration between 2461092.348412563 and 2461092.381295909.
14 phase flips detected on antenna (np.int64(317), 'Jnn'). A total of 183 integrations were phase-flipped relative to the 0th integration between 2461092.356241931 and 2461092.377381225.
1 phase flips detected on antenna (np.int64(233), 'Jnn'). A total of 2180 integrations were phase-flipped relative to the 0th integration between 2461092.422679712 and 2461092.6663967567.
8 phase flips detected on antenna (np.int64(278), 'Jnn'). A total of 240 integrations were phase-flipped relative to the 0th integration between 2461092.3515443103 and 2461092.379282643.
14 phase flips detected on antenna (np.int64(116), 'Jnn'). A total of 19 integrations were phase-flipped relative to the 0th integration between 2461092.3611632483 and 2461092.365749021.
18 phase flips detected on antenna (np.int64(135), 'Jnn'). A total of 104 integrations were phase-flipped relative to the 0th integration between 2461092.3576959567 and 2461092.3738020854.
6 phase flips detected on antenna (np.int64(213), 'Jnn'). A total of 386 integrations were phase-flipped relative to the 0th integration between 2461092.340471347 and 2461092.383980264.
22 phase flips detected on antenna (np.int64(211), 'Jnn'). A total of 104 integrations were phase-flipped relative to the 0th integration between 2461092.3611632483 and 2461092.37648644.
2 phase flips detected on antenna (np.int64(210), 'Jnn'). A total of 254 integrations were phase-flipped relative to the 0th integration between 2461092.351096918 and 2461092.379394491.
2 phase flips detected on antenna (np.int64(228), 'Jnn'). A total of 212 integrations were phase-flipped relative to the 0th integration between 2461092.354228665 and 2461092.3778286176.
8 phase flips detected on antenna (np.int64(228), 'Jee'). A total of 229 integrations were phase-flipped relative to the 0th integration between 2461092.352998336 and 2461092.379170795.
8 phase flips detected on antenna (np.int64(229), 'Jee'). A total of 295 integrations were phase-flipped relative to the 0th integration between 2461092.348524411 and 2461092.3817433016.
2 phase flips detected on antenna (np.int64(229), 'Jnn'). A total of 302 integrations were phase-flipped relative to the 0th integration between 2461092.3477414744 and 2461092.3814077573.
13 phase flips detected on antenna (np.int64(175), 'Jee'). A total of 2300 integrations were phase-flipped relative to the 0th integration between 2461092.342484613 and 2461092.6663967567.
9 phase flips detected on antenna (np.int64(195), 'Jee'). A total of 2292 integrations were phase-flipped relative to the 0th integration between 2461092.342372765 and 2461092.6663967567.
9 phase flips detected on antenna (np.int64(195), 'Jnn'). A total of 1360 integrations were phase-flipped relative to the 0th integration between 2461092.390691151 and 2461092.6663967567.
6 phase flips detected on antenna (np.int64(173), 'Jnn'). A total of 372 integrations were phase-flipped relative to the 0th integration between 2461092.342484613 and 2461092.3844276564.
6 phase flips detected on antenna (np.int64(114), 'Jnn'). A total of 343 integrations were phase-flipped relative to the 0th integration between 2461092.3451689677 and 2461092.3845395045.
2 phase flips detected on antenna (np.int64(175), 'Jnn'). A total of 410 integrations were phase-flipped relative to the 0th integration between 2461092.3400239544 and 2461092.385769834.
2 phase flips detected on antenna (np.int64(80), 'Jnn'). A total of 311 integrations were phase-flipped relative to the 0th integration between 2461092.3506495254 and 2461092.3853224413.
6 phase flips detected on antenna (np.int64(94), 'Jnn'). A total of 191 integrations were phase-flipped relative to the 0th integration between 2461092.3553471463 and 2461092.3769338327.
2 phase flips detected on antenna (np.int64(115), 'Jnn'). A total of 350 integrations were phase-flipped relative to the 0th integration between 2461092.3477414744 and 2461092.386776467.
In [17]:
# calculate average chi^2 per antenna before additional flagging
avg_cspa_vs_time = {ant: np.nanmean(np.where(cs.flag_grids[ant], np.nan, cs.cspa_grids[ant]), axis=1) for ant in cs.ants}
avg_cspa_vs_freq = {ant: np.nanmean(np.where(cs.flag_grids[ant], np.nan, cs.cspa_grids[ant]), axis=0) for ant in cs.ants}
avg_cspa = {ant: np.nanmean(np.where(cs.flag_grids[ant], np.nan, cs.cspa_grids[ant])) for ant in cs.ants}
Mean of empty slice
Mean of empty slice
Mean of empty slice
In [18]:
# Pick out antennas with too high relative differences before and after smoothing and flag them.
avg_relative_diffs = {ant: np.nanmean(rel_diff) for ant, rel_diff in meta['freq_avg_rel_diff'].items()}
to_cut = sorted([ant for ant, diff in avg_relative_diffs.items() if ant[0] >= 0 and diff > SC_RELATIVE_DIFF_CUTOFF])
if len(to_cut) > 0:
    for ant in to_cut:
        print(f'Flagging antenna {ant[0]}{ant[1][-1]} with a relative difference before and after smoothing of {avg_relative_diffs[ant]:.2%} '
              f'(compared to the {SC_RELATIVE_DIFF_CUTOFF:.2%} cutoff).')
        cs.flag_grids[ant] |= True
else:
    print(f'No antennas have a relative difference above the {SC_RELATIVE_DIFF_CUTOFF:.2%} cutoff.')
Flagging antenna 3n with a relative difference before and after smoothing of 25.56% (compared to the 20.00% cutoff).
Flagging antenna 5e with a relative difference before and after smoothing of 22.59% (compared to the 20.00% cutoff).
Flagging antenna 5n with a relative difference before and after smoothing of 23.55% (compared to the 20.00% cutoff).
Flagging antenna 7e with a relative difference before and after smoothing of 28.49% (compared to the 20.00% cutoff).
Flagging antenna 8e with a relative difference before and after smoothing of 30.69% (compared to the 20.00% cutoff).
Flagging antenna 9e with a relative difference before and after smoothing of 41.08% (compared to the 20.00% cutoff).
Flagging antenna 9n with a relative difference before and after smoothing of 33.01% (compared to the 20.00% cutoff).
Flagging antenna 10e with a relative difference before and after smoothing of 57.34% (compared to the 20.00% cutoff).
Flagging antenna 15n with a relative difference before and after smoothing of 21.19% (compared to the 20.00% cutoff).
Flagging antenna 16n with a relative difference before and after smoothing of 21.47% (compared to the 20.00% cutoff).
Flagging antenna 17e with a relative difference before and after smoothing of 21.12% (compared to the 20.00% cutoff).
Flagging antenna 17n with a relative difference before and after smoothing of 22.54% (compared to the 20.00% cutoff).
Flagging antenna 19e with a relative difference before and after smoothing of 27.64% (compared to the 20.00% cutoff).
Flagging antenna 19n with a relative difference before and after smoothing of 28.00% (compared to the 20.00% cutoff).
Flagging antenna 20n with a relative difference before and after smoothing of 30.48% (compared to the 20.00% cutoff).
Flagging antenna 30e with a relative difference before and after smoothing of 21.31% (compared to the 20.00% cutoff).
Flagging antenna 31e with a relative difference before and after smoothing of 24.32% (compared to the 20.00% cutoff).
Flagging antenna 32e with a relative difference before and after smoothing of 28.44% (compared to the 20.00% cutoff).
Flagging antenna 33e with a relative difference before and after smoothing of 38.85% (compared to the 20.00% cutoff).
Flagging antenna 36e with a relative difference before and after smoothing of 21.79% (compared to the 20.00% cutoff).
Flagging antenna 36n with a relative difference before and after smoothing of 32.06% (compared to the 20.00% cutoff).
Flagging antenna 45e with a relative difference before and after smoothing of 24.38% (compared to the 20.00% cutoff).
Flagging antenna 45n with a relative difference before and after smoothing of 24.59% (compared to the 20.00% cutoff).
Flagging antenna 46n with a relative difference before and after smoothing of 27.99% (compared to the 20.00% cutoff).
Flagging antenna 50e with a relative difference before and after smoothing of 20.23% (compared to the 20.00% cutoff).
Flagging antenna 50n with a relative difference before and after smoothing of 28.49% (compared to the 20.00% cutoff).
Flagging antenna 51n with a relative difference before and after smoothing of 23.44% (compared to the 20.00% cutoff).
Flagging antenna 52n with a relative difference before and after smoothing of 20.28% (compared to the 20.00% cutoff).
Flagging antenna 59n with a relative difference before and after smoothing of 21.55% (compared to the 20.00% cutoff).
Flagging antenna 60e with a relative difference before and after smoothing of 25.16% (compared to the 20.00% cutoff).
Flagging antenna 60n with a relative difference before and after smoothing of 23.57% (compared to the 20.00% cutoff).
Flagging antenna 65e with a relative difference before and after smoothing of 20.34% (compared to the 20.00% cutoff).
Flagging antenna 65n with a relative difference before and after smoothing of 26.92% (compared to the 20.00% cutoff).
Flagging antenna 66n with a relative difference before and after smoothing of 24.49% (compared to the 20.00% cutoff).
Flagging antenna 79e with a relative difference before and after smoothing of 74.35% (compared to the 20.00% cutoff).
Flagging antenna 79n with a relative difference before and after smoothing of 72.89% (compared to the 20.00% cutoff).
Flagging antenna 80e with a relative difference before and after smoothing of 84.00% (compared to the 20.00% cutoff).
Flagging antenna 80n with a relative difference before and after smoothing of 109.85% (compared to the 20.00% cutoff).
Flagging antenna 82n with a relative difference before and after smoothing of 23.82% (compared to the 20.00% cutoff).
Flagging antenna 91e with a relative difference before and after smoothing of 21.11% (compared to the 20.00% cutoff).
Flagging antenna 91n with a relative difference before and after smoothing of 21.36% (compared to the 20.00% cutoff).
Flagging antenna 92n with a relative difference before and after smoothing of 25.77% (compared to the 20.00% cutoff).
Flagging antenna 93e with a relative difference before and after smoothing of 48.03% (compared to the 20.00% cutoff).
Flagging antenna 93n with a relative difference before and after smoothing of 36.43% (compared to the 20.00% cutoff).
Flagging antenna 94e with a relative difference before and after smoothing of 56.85% (compared to the 20.00% cutoff).
Flagging antenna 94n with a relative difference before and after smoothing of 73.37% (compared to the 20.00% cutoff).
Flagging antenna 95n with a relative difference before and after smoothing of 64.03% (compared to the 20.00% cutoff).
Flagging antenna 96e with a relative difference before and after smoothing of 81.05% (compared to the 20.00% cutoff).
Flagging antenna 96n with a relative difference before and after smoothing of 81.06% (compared to the 20.00% cutoff).
Flagging antenna 97e with a relative difference before and after smoothing of 103.01% (compared to the 20.00% cutoff).
Flagging antenna 98e with a relative difference before and after smoothing of 21.66% (compared to the 20.00% cutoff).
Flagging antenna 109e with a relative difference before and after smoothing of 22.31% (compared to the 20.00% cutoff).
Flagging antenna 109n with a relative difference before and after smoothing of 22.95% (compared to the 20.00% cutoff).
Flagging antenna 110e with a relative difference before and after smoothing of 37.25% (compared to the 20.00% cutoff).
Flagging antenna 110n with a relative difference before and after smoothing of 27.32% (compared to the 20.00% cutoff).
Flagging antenna 111e with a relative difference before and after smoothing of 52.37% (compared to the 20.00% cutoff).
Flagging antenna 111n with a relative difference before and after smoothing of 47.09% (compared to the 20.00% cutoff).
Flagging antenna 112e with a relative difference before and after smoothing of 63.52% (compared to the 20.00% cutoff).
Flagging antenna 112n with a relative difference before and after smoothing of 56.48% (compared to the 20.00% cutoff).
Flagging antenna 113e with a relative difference before and after smoothing of 75.77% (compared to the 20.00% cutoff).
Flagging antenna 113n with a relative difference before and after smoothing of 59.75% (compared to the 20.00% cutoff).
Flagging antenna 114e with a relative difference before and after smoothing of 92.94% (compared to the 20.00% cutoff).
Flagging antenna 114n with a relative difference before and after smoothing of 107.26% (compared to the 20.00% cutoff).
Flagging antenna 115e with a relative difference before and after smoothing of 108.80% (compared to the 20.00% cutoff).
Flagging antenna 115n with a relative difference before and after smoothing of 121.96% (compared to the 20.00% cutoff).
Flagging antenna 116e with a relative difference before and after smoothing of 27.75% (compared to the 20.00% cutoff).
Flagging antenna 116n with a relative difference before and after smoothing of 28.62% (compared to the 20.00% cutoff).
Flagging antenna 117n with a relative difference before and after smoothing of 24.92% (compared to the 20.00% cutoff).
Flagging antenna 118n with a relative difference before and after smoothing of 20.94% (compared to the 20.00% cutoff).
Flagging antenna 128e with a relative difference before and after smoothing of 23.20% (compared to the 20.00% cutoff).
Flagging antenna 128n with a relative difference before and after smoothing of 23.82% (compared to the 20.00% cutoff).
Flagging antenna 129e with a relative difference before and after smoothing of 45.34% (compared to the 20.00% cutoff).
Flagging antenna 129n with a relative difference before and after smoothing of 36.66% (compared to the 20.00% cutoff).
Flagging antenna 130e with a relative difference before and after smoothing of 57.15% (compared to the 20.00% cutoff).
Flagging antenna 130n with a relative difference before and after smoothing of 52.81% (compared to the 20.00% cutoff).
Flagging antenna 131e with a relative difference before and after smoothing of 68.01% (compared to the 20.00% cutoff).
Flagging antenna 131n with a relative difference before and after smoothing of 58.87% (compared to the 20.00% cutoff).
Flagging antenna 132e with a relative difference before and after smoothing of 78.15% (compared to the 20.00% cutoff).
Flagging antenna 132n with a relative difference before and after smoothing of 70.66% (compared to the 20.00% cutoff).
Flagging antenna 133e with a relative difference before and after smoothing of 96.82% (compared to the 20.00% cutoff).
Flagging antenna 133n with a relative difference before and after smoothing of 113.40% (compared to the 20.00% cutoff).
Flagging antenna 134e with a relative difference before and after smoothing of 111.41% (compared to the 20.00% cutoff).
Flagging antenna 135n with a relative difference before and after smoothing of 34.07% (compared to the 20.00% cutoff).
Flagging antenna 136e with a relative difference before and after smoothing of 21.92% (compared to the 20.00% cutoff).
Flagging antenna 137n with a relative difference before and after smoothing of 24.97% (compared to the 20.00% cutoff).
Flagging antenna 147e with a relative difference before and after smoothing of 21.37% (compared to the 20.00% cutoff).
Flagging antenna 147n with a relative difference before and after smoothing of 21.69% (compared to the 20.00% cutoff).
Flagging antenna 148n with a relative difference before and after smoothing of 26.28% (compared to the 20.00% cutoff).
Flagging antenna 149e with a relative difference before and after smoothing of 49.18% (compared to the 20.00% cutoff).
Flagging antenna 149n with a relative difference before and after smoothing of 45.75% (compared to the 20.00% cutoff).
Flagging antenna 150e with a relative difference before and after smoothing of 58.77% (compared to the 20.00% cutoff).
Flagging antenna 150n with a relative difference before and after smoothing of 53.61% (compared to the 20.00% cutoff).
Flagging antenna 152e with a relative difference before and after smoothing of 102.88% (compared to the 20.00% cutoff).
Flagging antenna 152n with a relative difference before and after smoothing of 90.89% (compared to the 20.00% cutoff).
Flagging antenna 153e with a relative difference before and after smoothing of 106.07% (compared to the 20.00% cutoff).
Flagging antenna 153n with a relative difference before and after smoothing of 132.02% (compared to the 20.00% cutoff).
Flagging antenna 154e with a relative difference before and after smoothing of 118.13% (compared to the 20.00% cutoff).
Flagging antenna 155e with a relative difference before and after smoothing of 36.98% (compared to the 20.00% cutoff).
Flagging antenna 155n with a relative difference before and after smoothing of 35.46% (compared to the 20.00% cutoff).
Flagging antenna 156e with a relative difference before and after smoothing of 21.84% (compared to the 20.00% cutoff).
Flagging antenna 167n with a relative difference before and after smoothing of 20.14% (compared to the 20.00% cutoff).
Flagging antenna 168e with a relative difference before and after smoothing of 22.43% (compared to the 20.00% cutoff).
Flagging antenna 168n with a relative difference before and after smoothing of 23.60% (compared to the 20.00% cutoff).
Flagging antenna 169n with a relative difference before and after smoothing of 35.05% (compared to the 20.00% cutoff).
Flagging antenna 173e with a relative difference before and after smoothing of 108.92% (compared to the 20.00% cutoff).
Flagging antenna 173n with a relative difference before and after smoothing of 95.61% (compared to the 20.00% cutoff).
Flagging antenna 174e with a relative difference before and after smoothing of 92.70% (compared to the 20.00% cutoff).
Flagging antenna 175e with a relative difference before and after smoothing of 133.66% (compared to the 20.00% cutoff).
Flagging antenna 175n with a relative difference before and after smoothing of 131.54% (compared to the 20.00% cutoff).
Flagging antenna 176n with a relative difference before and after smoothing of 28.97% (compared to the 20.00% cutoff).
Flagging antenna 177e with a relative difference before and after smoothing of 21.10% (compared to the 20.00% cutoff).
Flagging antenna 177n with a relative difference before and after smoothing of 23.46% (compared to the 20.00% cutoff).
Flagging antenna 188e with a relative difference before and after smoothing of 21.94% (compared to the 20.00% cutoff).
Flagging antenna 189e with a relative difference before and after smoothing of 30.71% (compared to the 20.00% cutoff).
Flagging antenna 189n with a relative difference before and after smoothing of 28.70% (compared to the 20.00% cutoff).
Flagging antenna 190e with a relative difference before and after smoothing of 45.72% (compared to the 20.00% cutoff).
Flagging antenna 190n with a relative difference before and after smoothing of 44.34% (compared to the 20.00% cutoff).
Flagging antenna 191e with a relative difference before and after smoothing of 55.89% (compared to the 20.00% cutoff).
Flagging antenna 192e with a relative difference before and after smoothing of 76.22% (compared to the 20.00% cutoff).
Flagging antenna 192n with a relative difference before and after smoothing of 59.07% (compared to the 20.00% cutoff).
Flagging antenna 193e with a relative difference before and after smoothing of 89.44% (compared to the 20.00% cutoff).
Flagging antenna 193n with a relative difference before and after smoothing of 71.71% (compared to the 20.00% cutoff).
Flagging antenna 194e with a relative difference before and after smoothing of 118.29% (compared to the 20.00% cutoff).
Flagging antenna 194n with a relative difference before and after smoothing of 110.47% (compared to the 20.00% cutoff).
Flagging antenna 195e with a relative difference before and after smoothing of 129.84% (compared to the 20.00% cutoff).
Flagging antenna 195n with a relative difference before and after smoothing of 318.06% (compared to the 20.00% cutoff).
Flagging antenna 196n with a relative difference before and after smoothing of 24.63% (compared to the 20.00% cutoff).
Flagging antenna 207e with a relative difference before and after smoothing of 20.20% (compared to the 20.00% cutoff).
Flagging antenna 208e with a relative difference before and after smoothing of 22.74% (compared to the 20.00% cutoff).
Flagging antenna 208n with a relative difference before and after smoothing of 26.23% (compared to the 20.00% cutoff).
Flagging antenna 209e with a relative difference before and after smoothing of 34.79% (compared to the 20.00% cutoff).
Flagging antenna 210e with a relative difference before and after smoothing of 48.55% (compared to the 20.00% cutoff).
Flagging antenna 210n with a relative difference before and after smoothing of 56.79% (compared to the 20.00% cutoff).
Flagging antenna 211e with a relative difference before and after smoothing of 67.33% (compared to the 20.00% cutoff).
Flagging antenna 211n with a relative difference before and after smoothing of 45.73% (compared to the 20.00% cutoff).
Flagging antenna 213n with a relative difference before and after smoothing of 74.88% (compared to the 20.00% cutoff).
Flagging antenna 214e with a relative difference before and after smoothing of 128.27% (compared to the 20.00% cutoff).
Flagging antenna 214n with a relative difference before and after smoothing of 116.36% (compared to the 20.00% cutoff).
Flagging antenna 215e with a relative difference before and after smoothing of 22.25% (compared to the 20.00% cutoff).
Flagging antenna 215n with a relative difference before and after smoothing of 22.79% (compared to the 20.00% cutoff).
Flagging antenna 225n with a relative difference before and after smoothing of 21.02% (compared to the 20.00% cutoff).
Flagging antenna 226e with a relative difference before and after smoothing of 21.41% (compared to the 20.00% cutoff).
Flagging antenna 226n with a relative difference before and after smoothing of 23.10% (compared to the 20.00% cutoff).
Flagging antenna 228e with a relative difference before and after smoothing of 54.76% (compared to the 20.00% cutoff).
Flagging antenna 228n with a relative difference before and after smoothing of 53.83% (compared to the 20.00% cutoff).
Flagging antenna 229e with a relative difference before and after smoothing of 71.48% (compared to the 20.00% cutoff).
Flagging antenna 229n with a relative difference before and after smoothing of 68.43% (compared to the 20.00% cutoff).
Flagging antenna 233e with a relative difference before and after smoothing of 20.86% (compared to the 20.00% cutoff).
Flagging antenna 233n with a relative difference before and after smoothing of 21.60% (compared to the 20.00% cutoff).
Flagging antenna 243e with a relative difference before and after smoothing of 21.07% (compared to the 20.00% cutoff).
Flagging antenna 243n with a relative difference before and after smoothing of 23.89% (compared to the 20.00% cutoff).
Flagging antenna 244e with a relative difference before and after smoothing of 23.55% (compared to the 20.00% cutoff).
Flagging antenna 244n with a relative difference before and after smoothing of 26.27% (compared to the 20.00% cutoff).
Flagging antenna 245e with a relative difference before and after smoothing of 37.23% (compared to the 20.00% cutoff).
Flagging antenna 245n with a relative difference before and after smoothing of 39.87% (compared to the 20.00% cutoff).
Flagging antenna 246n with a relative difference before and after smoothing of 49.27% (compared to the 20.00% cutoff).
Flagging antenna 250n with a relative difference before and after smoothing of 20.04% (compared to the 20.00% cutoff).
Flagging antenna 261e with a relative difference before and after smoothing of 28.57% (compared to the 20.00% cutoff).
Flagging antenna 261n with a relative difference before and after smoothing of 34.27% (compared to the 20.00% cutoff).
Flagging antenna 262e with a relative difference before and after smoothing of 44.02% (compared to the 20.00% cutoff).
Flagging antenna 277n with a relative difference before and after smoothing of 45.63% (compared to the 20.00% cutoff).
Flagging antenna 278n with a relative difference before and after smoothing of 55.10% (compared to the 20.00% cutoff).
Flagging antenna 292e with a relative difference before and after smoothing of 45.23% (compared to the 20.00% cutoff).
Flagging antenna 294n with a relative difference before and after smoothing of 70.07% (compared to the 20.00% cutoff).
Flagging antenna 299n with a relative difference before and after smoothing of 21.42% (compared to the 20.00% cutoff).
Flagging antenna 301n with a relative difference before and after smoothing of 27.09% (compared to the 20.00% cutoff).
Flagging antenna 302n with a relative difference before and after smoothing of 28.20% (compared to the 20.00% cutoff).
Flagging antenna 306e with a relative difference before and after smoothing of 52.17% (compared to the 20.00% cutoff).
Flagging antenna 307n with a relative difference before and after smoothing of 66.29% (compared to the 20.00% cutoff).
Flagging antenna 313n with a relative difference before and after smoothing of 26.26% (compared to the 20.00% cutoff).
Flagging antenna 314e with a relative difference before and after smoothing of 21.68% (compared to the 20.00% cutoff).
Flagging antenna 315e with a relative difference before and after smoothing of 24.06% (compared to the 20.00% cutoff).
Flagging antenna 316e with a relative difference before and after smoothing of 26.44% (compared to the 20.00% cutoff).
Flagging antenna 316n with a relative difference before and after smoothing of 34.23% (compared to the 20.00% cutoff).
Flagging antenna 317e with a relative difference before and after smoothing of 34.00% (compared to the 20.00% cutoff).
Flagging antenna 317n with a relative difference before and after smoothing of 50.84% (compared to the 20.00% cutoff).
Flagging antenna 319e with a relative difference before and after smoothing of 56.72% (compared to the 20.00% cutoff).
Flagging antenna 319n with a relative difference before and after smoothing of 65.04% (compared to the 20.00% cutoff).
In [19]:
if not PER_POL_REFANT:
    # put back in the smoothed phasor, ensuring the amplitude is 1 and that data are flagged anywhere either polarization's refant is flagged
    smoothed_relative_pol_phasor = cs.gain_grids[(-1, other_refant[-1])] / np.abs(cs.gain_grids[(-1, other_refant[-1])])
    for ant in cs.gain_grids:
        if ant[0] >= 0 and ant[1] == other_refant[1]:
            cs.gain_grids[ant] /= smoothed_relative_pol_phasor
        cs.flag_grids[ant] |= (cs.flag_grids[(-1, other_refant[1])])
    cs.refant = overall_refant
In [20]:
def phase_flip_diagnostic_plot():
    '''Shows time-smoothed antenna avg phases after taking out a delay and filtering in time.'''
    if not np.any([np.any(meta['phase_flipped'][ant]) for ant in meta['phase_flipped']]):
        print("No antennas have phase flips identified. Nothing to plot.")
        return
    
    plt.figure(figsize=(14,4))
    for ant in meta['phase_flipped']:
        if np.any(meta['phase_flipped'][ant]):
            to_plot = np.angle(np.exp(1.0j * (meta['phases'][ant] - meta['time_smoothed_phases'][ant])))
            to_plot[to_plot < -np.pi / 2] += 2 * np.pi
            plt.plot(cs.time_grid - int(cs.time_grid[0]), to_plot, label=f'{ant[0]}{ant[1][-1]}')
    plt.legend(title='Antennas with Identified Phase Flips', ncol=4)
    plt.xlabel(f'JD - {int(cs.time_grid[0])}')
    plt.ylabel('Average Phase After Filtering (radians)')
    plt.tight_layout()

Figure 2: Antenna Phases with Identified Phase Flips¶

In [21]:
phase_flip_diagnostic_plot()
No description has been provided for this image

Plot results¶

In [22]:
def amplitude_plot(ant_to_plot):
    with warnings.catch_warnings():
        warnings.simplefilter("ignore")
        # Pick vmax to not saturate 90% of the abscal gains
        vmax = np.max([np.percentile(np.abs(cs.gain_grids[ant_to_plot, pol][~cs.flag_grids[ant_to_plot, pol]]), 99) for pol in ['Jee', 'Jnn']])

        display(HTML(f'<h2>Antenna {ant_to_plot} Amplitude Waterfalls</h2>'))    

        # Plot abscal gain amplitude waterfalls for a single antenna
        fig, axes = plt.subplots(4, 2, figsize=(14,14), gridspec_kw={'height_ratios': [1, 1, .4, .4]})
        for ax, pol in zip(axes[0], ['Jee', 'Jnn']):
            ant = (ant_to_plot, pol)
            extent=[cs.freqs[0]/1e6, cs.freqs[-1]/1e6, lst_grid[-1], lst_grid[0]]
            im = ax.imshow(np.where(cs.flag_grids[ant], np.nan, np.abs(cs.gain_grids[ant])), aspect='auto', cmap='inferno', 
                           interpolation='nearest', vmin=0, vmax=vmax, extent=extent)
            ax.set_title(f'Smoothcal Gain Amplitude of Antenna {ant[0]}: {pol[-1]}-polarized' )
            ax.set_xlabel('Frequency (MHz)')
            ax.set_ylabel('LST (Hours)')
            ax.set_xlim([cs.freqs[0]/1e6, cs.freqs[-1]/1e6])
            ax.set_yticklabels(ax.get_yticks() % 24)
            plt.colorbar(im, ax=ax,  orientation='horizontal', pad=.15)

        # Now flagged plot abscal waterfall    
        for ax, pol in zip(axes[1], ['Jee', 'Jnn']):
            ant = (ant_to_plot, pol)
            extent=[cs.freqs[0]/1e6, cs.freqs[-1]/1e6, lst_grid[-1], lst_grid[0]]
            im = ax.imshow(np.where(cs.flag_grids[ant], np.nan, np.abs(abscal_gains[ant])), aspect='auto', cmap='inferno', 
                           interpolation='nearest', vmin=0, vmax=vmax, extent=extent)
            ax.set_title(f'Abscal Gain Amplitude of Antenna {ant[0]}: {pol[-1]}-polarized' )
            ax.set_xlabel('Frequency (MHz)')
            ax.set_ylabel('LST (Hours)')
            ax.set_xlim([cs.freqs[0]/1e6, cs.freqs[-1]/1e6])
            ax.set_yticklabels(ax.get_yticks() % 24)
            plt.colorbar(im, ax=ax,  orientation='horizontal', pad=.15)
            
        # Now plot mean gain spectra 
        for ax, pol in zip(axes[2], ['Jee', 'Jnn']):
            ant = (ant_to_plot, pol)   
            nflags_spectrum = np.sum(cs.flag_grids[ant], axis=0)
            to_plot = nflags_spectrum <= np.percentile(nflags_spectrum, 75)
            ax.plot(cs.freqs[to_plot] / 1e6, np.nanmean(np.where(cs.flag_grids[ant], np.nan, np.abs(abscal_gains[ant])), axis=0)[to_plot], 'r.', label='Abscal')        
            ax.plot(cs.freqs[to_plot] / 1e6, np.nanmean(np.where(cs.flag_grids[ant], np.nan, np.abs(cs.gain_grids[ant])), axis=0)[to_plot], 'k.', ms=2, label='Smoothed')        
            ax.set_ylim([0, vmax])
            ax.set_xlim([cs.freqs[0]/1e6, cs.freqs[-1]/1e6])    
            ax.set_xlabel('Frequency (MHz)')
            ax.set_ylabel('|g| (unitless)')
            ax.set_title(f'Mean Infrequently-Flagged Gain Amplitude of Antenna {ant[0]}: {pol[-1]}-polarized')
            ax.legend(loc='upper left')

        # Now plot mean gain time series
        for ax, pol in zip(axes[3], ['Jee', 'Jnn']):
            ant = (ant_to_plot, pol)
            nflags_series = np.sum(cs.flag_grids[ant], axis=1)
            to_plot = nflags_series <= np.percentile(nflags_series, 75)
            ax.plot(lst_grid[to_plot], np.nanmean(np.where(cs.flag_grids[ant], np.nan, np.abs(abscal_gains[ant])), axis=1)[to_plot], 'r.', label='Abscal')        
            ax.plot(lst_grid[to_plot], np.nanmean(np.where(cs.flag_grids[ant], np.nan, np.abs(cs.gain_grids[ant])), axis=1)[to_plot], 'k.', ms=2, label='Smoothed')        
            ax.set_ylim([0, vmax])
            ax.set_xlabel('LST (hours)')
            ax.set_ylabel('|g| (unitless)')
            ax.set_title(f'Mean Infrequently-Flagged Gain Amplitude of Antenna {ant[0]}: {pol[-1]}-polarized')
            ax.set_xticklabels(ax.get_xticks() % 24)
            ax.legend(loc='upper left')

        plt.tight_layout()
        plt.show()    
In [23]:
def phase_plot(ant_to_plot):
    with warnings.catch_warnings():
        warnings.simplefilter("ignore")    
        display(HTML(f'<h2>Antenna {ant_to_plot} Phase Waterfalls</h2>'))
        fig, axes = plt.subplots(4, 2, figsize=(14,14), gridspec_kw={'height_ratios': [1, 1, .4, .4]})
        
        # Plot phase waterfalls for a single antenna    
        for ax, pol in zip(axes[0], ['Jee', 'Jnn']):
            ant = (ant_to_plot, pol)
            extent=[cs.freqs[0]/1e6, cs.freqs[-1]/1e6, lst_grid[-1], lst_grid[0]]
            im = ax.imshow(np.where(cs.flag_grids[ant], np.nan, np.angle(cs.gain_grids[ant])), aspect='auto', cmap='inferno', 
                           interpolation='nearest', vmin=-np.pi, vmax=np.pi, extent=extent)

            refant = (cs.refant[pol] if isinstance(cs.refant, dict) else cs.refant)
            ax.set_title(f'Smoothcal Gain Phase of Ant {ant[0]}{pol[-1]} / Ant {refant[0]}{refant[1][-1]}')
            ax.set_xlabel('Frequency (MHz)')
            ax.set_ylabel('LST (Hours)')
            ax.set_xlim([cs.freqs[0]/1e6, cs.freqs[-1]/1e6])
            ax.set_yticklabels(ax.get_yticks() % 24)
            plt.colorbar(im, ax=ax,  orientation='horizontal', pad=.15)

        # Now plot abscal phase waterfall    
        for ax, pol in zip(axes[1], ['Jee', 'Jnn']):
            ant = (ant_to_plot, pol)
            extent=[cs.freqs[0]/1e6, cs.freqs[-1]/1e6, lst_grid[-1], lst_grid[0]]
            im = ax.imshow(np.where(cs.flag_grids[ant], np.nan, np.angle(abscal_gains[ant])), aspect='auto', cmap='inferno', 
                           interpolation='nearest', vmin=-np.pi, vmax=np.pi, extent=extent)
            refant = (cs.refant[pol] if isinstance(cs.refant, dict) else cs.refant)
            ax.set_title(f'Abscal Gain Phase of Ant {ant[0]}{pol[-1]} / Ant {refant[0]}{refant[1][-1]}')
            ax.set_xlabel('Frequency (MHz)')
            ax.set_ylabel('LST (Hours)')
            ax.set_xlim([cs.freqs[0]/1e6, cs.freqs[-1]/1e6])
            ax.set_yticklabels(ax.get_yticks() % 24)
            plt.colorbar(im, ax=ax,  orientation='horizontal', pad=.15)
            
        # Now plot median gain spectra 
        for ax, pol in zip(axes[2], ['Jee', 'Jnn']):
            ant = (ant_to_plot, pol)   
            nflags_spectrum = np.sum(cs.flag_grids[ant], axis=0)
            to_plot = nflags_spectrum <= np.percentile(nflags_spectrum, 75)
            ax.plot(cs.freqs[to_plot] / 1e6, np.nanmedian(np.where(cs.flag_grids[ant], np.nan, np.angle(abscal_gains[ant])), axis=0)[to_plot], 'r.', label='Abscal')        
            ax.plot(cs.freqs[to_plot] / 1e6, np.nanmedian(np.where(cs.flag_grids[ant], np.nan, np.angle(cs.gain_grids[ant])), axis=0)[to_plot], 'k.', ms=2, label='Smoothed')        
            ax.set_ylim([-np.pi, np.pi])
            ax.set_xlim([cs.freqs[0]/1e6, cs.freqs[-1]/1e6])    
            ax.set_xlabel('Frequency (MHz)')
            refant = (cs.refant[pol] if isinstance(cs.refant, dict) else cs.refant)
            ax.set_ylabel(f'Phase of g$_{{{ant[0]}{pol[-1]}}}$ / g$_{{{refant[0]}{refant[1][-1]}}}$')
            ax.set_title(f'Median Infrequently-Flagged Gain Phase of Ant {ant[0]}{pol[-1]} / Ant {refant[0]}{refant[1][-1]}')
            ax.legend(loc='upper left')

        # # Now plot median gain time series
        for ax, pol in zip(axes[3], ['Jee', 'Jnn']):
            ant = (ant_to_plot, pol)
            nflags_series = np.sum(cs.flag_grids[ant], axis=1)
            to_plot = nflags_series <= np.percentile(nflags_series, 75)
            ax.plot(lst_grid[to_plot], np.nanmean(np.where(cs.flag_grids[ant], np.nan, np.angle(abscal_gains[ant])), axis=1)[to_plot], 'r.', label='Abscal')        
            ax.plot(lst_grid[to_plot], np.nanmean(np.where(cs.flag_grids[ant], np.nan, np.angle(cs.gain_grids[ant])), axis=1)[to_plot], 'k.', ms=2, label='Smoothed')        
            ax.set_ylim([-np.pi, np.pi])    
            ax.set_xlabel('LST (hours)')
            refant = (cs.refant[pol] if isinstance(cs.refant, dict) else cs.refant)
            ax.set_ylabel(f'Phase of g$_{{{ant[0]}{pol[-1]}}}$ / g$_{{{refant[0]}{refant[1][-1]}}}$')
            ax.set_title(f'Mean Infrequently-Flagged Gain Phase of Ant {ant[0]}{pol[-1]} / Ant {refant[0]}{refant[1][-1]}')
            ax.set_xticklabels(ax.get_xticks() % 24)    
            ax.legend(loc='upper left')

        plt.tight_layout()
        plt.show()
In [24]:
# Select first 2 unflagged antennas from candidates for amplitude plotting
ants_to_plot = []
for ant_candidate in ants_to_plot_candidates:
    if not (np.all(cs.flag_grids[ant_candidate, 'Jee']) and np.all(cs.flag_grids[ant_candidate, 'Jnn'])):
        ants_to_plot.append(ant_candidate)
        if len(ants_to_plot) >= 2:
            break

Figure 3: Full-Day Gain Amplitudes Before and After smooth_cal¶

Here we plot abscal and smooth_cal gain amplitudes for both of the sample antennas. We also show means across time/frequency, excluding frequencies/times that are frequently flagged.

In [25]:
if len(ants_to_plot) == 0:
    print("Warning: No unflagged antennas available for plotting.")
else:
    for ant_to_plot in ants_to_plot:
        amplitude_plot(ant_to_plot)

Antenna 41 Amplitude Waterfalls

No description has been provided for this image

Antenna 219 Amplitude Waterfalls

No description has been provided for this image

Figure 4: Full-Day Gain Phases Before and After smooth_cal¶

Here we plot abscal and smooth_cal phases relative to each polarization's reference antenna for both of the sample antennas. We also show medians across time/frequency, excluding frequencies/times that are frequently flagged.

In [26]:
# Use the same selected unflagged antennas for phase plotting
if len(ants_to_plot) == 0:
    print("Warning: No unflagged antennas available for plotting.")
else:
    for ant_to_plot in ants_to_plot:
        phase_plot(ant_to_plot)

Antenna 41 Phase Waterfalls

No description has been provided for this image

Antenna 219 Phase Waterfalls

No description has been provided for this image

Examine $\chi^2$¶

In [27]:
def chisq_plot():
    fig, axes = plt.subplots(1, 2, figsize=(14, 10), sharex=True, sharey=True)
    extent = [cs.freqs[0]/1e6, cs.freqs[-1]/1e6, lst_grid[-1], lst_grid[0]]
    for ax, pol in zip(axes, ['Jee', 'Jnn']):
        refant = (cs.refant[pol] if isinstance(cs.refant, dict) else cs.refant)
        im = ax.imshow(np.where(cs.flag_grids[refant], np.nan, cs.chisq_grids[pol]), vmin=1, vmax=5, 
                       aspect='auto', cmap='turbo', interpolation='none', extent=extent)
        ax.set_yticklabels(ax.get_yticks() % 24)
        ax.set_title(f'{pol[1:]}-Polarized $\\chi^2$ / DoF')
        ax.set_xlabel('Frequency (MHz)')

    axes[0].set_ylabel('LST (hours)')
    plt.tight_layout()
    fig.colorbar(im, ax=axes, pad=.07, label='$\\chi^2$ / DoF', orientation='horizontal', extend='both', aspect=50)

Figure 5: Full-Day $\chi^2$ / DoF Waterfall from Redundant-Baseline Calibration¶

Here we plot $\chi^2$ per degree of freedom from redundant-baseline calibration for both polarizations separately. While this plot is a little out of place, as it was not produced by this notebook, it is a convenient place where all the necessary components are readily available. If the array were perfectly redundant and any non-redundancies in the calibrated visibilities were explicable by thermal noise alone, this waterfall should be all 1.

In [28]:
chisq_plot()
set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
No description has been provided for this image
In [29]:
def cspa_vs_time_plot():
    fig, axes = plt.subplots(2, 1, figsize=(14, 6), sharex=True, sharey=True, gridspec_kw={'hspace': 0})
    for ax, pol in zip(axes, ['Jee', 'Jnn']):
        detail_cutoff = np.percentile([np.nanmean(m) for ant, m in avg_cspa_vs_time.items() 
                                       if ant[1] == pol and np.isfinite(np.nanmean(m))], 95)
        for ant in avg_cspa_vs_time:
            if ant[1] == pol and not np.all(cs.flag_grids[ant]):
                if np.nanmean(avg_cspa_vs_time[ant]) > detail_cutoff:
                    ax.plot(lst_grid, avg_cspa_vs_time[ant], label=str((int(ant[0]), ant[1])), zorder=100)
                else:
                    ax.plot(lst_grid, avg_cspa_vs_time[ant], c='grey', alpha=.2, lw=.5)
        ax.legend(title=f'{pol[1:]}-Polarized', ncol=2)
        ax.set_ylabel('Mean Unflagged $\\chi^2$ per Antenna')
        ax.set_xlabel('LST (hours)')
        ax.set_xticklabels(ax.get_xticks() % 24)

    plt.ylim([1, 5.4])
    plt.tight_layout()
In [30]:
def cspa_vs_freq_plot():
    fig, axes = plt.subplots(2, 1, figsize=(14, 6), sharex=True, sharey=True, gridspec_kw={'hspace': 0})
    for ax, pol in zip(axes, ['Jee', 'Jnn']):
        detail_cutoff = np.percentile([np.nanmean(m) for ant, m in avg_cspa_vs_freq.items() 
                                       if ant[1] == pol and np.isfinite(np.nanmean(m))], 95)
        for ant in avg_cspa_vs_freq:
            if ant[1] == pol and not np.all(cs.flag_grids[ant]):
                if np.nanmean(avg_cspa_vs_freq[ant]) > detail_cutoff:
                    ax.plot(cs.freqs / 1e6, avg_cspa_vs_freq[ant], label=str((int(ant[0]), ant[1])), zorder=100)
                else:
                    ax.plot(cs.freqs / 1e6, avg_cspa_vs_freq[ant], c='grey', alpha=.2, lw=.5)
        ax.legend(title=f'{pol[1:]}-Polarized', ncol=2)
        ax.set_ylabel('Mean Unflagged $\\chi^2$ per Antenna')
        ax.set_xlabel('Frequency (MHz)')

    plt.ylim([1, 5.4])
    plt.tight_layout()
In [31]:
def avg_cspa_array_plot():
    hd = io.HERAData(SUM_FILE)
    
    fig, axes = plt.subplots(1, 2, figsize=(14, 8), sharex=True, sharey=True, gridspec_kw={'wspace': 0})
    for pol, ax in zip(['Jee', 'Jnn'], axes):

        ants_here = [ant for ant in avg_cspa if np.isfinite(avg_cspa[ant]) and ant[1] == pol if ant[0] in hd.antpos]
        avg_chisqs = [avg_cspa[ant] for ant in ants_here]
        xs = [hd.antpos[ant[0]][0] for ant in ants_here]
        ys = [hd.antpos[ant[0]][1] for ant in ants_here]
        names = [ant[0] for ant in ants_here]
        
        im = ax.scatter(x=xs, y=ys, c=avg_chisqs, s=200, vmin=1, vmax=3, cmap='turbo')
        ax.set_aspect('equal')
        for x,y,n in zip(xs, ys, names):
            ax.text(x, y, str(n), va='center', ha='center', fontsize=8)
        ax.set_title(pol)
        ax.set_xlabel('East-West Antenna Position (m)')
    
    axes[0].set_ylabel('North-South Antenna Position (m)')

    plt.tight_layout()
    plt.colorbar(im, ax=axes, location='top', aspect=60, pad=.04, label='Mean Unflagged $\\chi^2$ per Antenna', extend='both')

Figure 6: Average $\chi^2$ per Antenna¶

Here we plot $\chi^2$ per antenna from redundant-baseline calibration, separating polarizations and averaging the unflagged pixels in the waterfalls over frequency or time. The worst 5% of antennas are shown in color and highlighted in the legends, the rest are shown in grey. We also show time- and frequency-averaged $\chi^2$ for each antennas as a scatter plot with array position.

In [32]:
cspa_vs_freq_plot()
cspa_vs_time_plot()
avg_cspa_array_plot()
Mean of empty slice
set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
Mean of empty slice
set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

Examine relative differences before and after smoothing¶

In [33]:
def time_avg_diff_plot():
    fig, axes = plt.subplots(2, 1, figsize=(14, 6), sharex=True, sharey=True, gridspec_kw={'hspace': 0})
    for ax, pol in zip(axes, ['Jee', 'Jnn']):
        detail_cutoff = np.percentile([np.nanmean(diff) for ant, diff in meta['time_avg_rel_diff'].items() 
                                       if ant[1] == pol and np.isfinite(np.nanmean(diff))], 95)    
        for ant, rel_diff in meta['time_avg_rel_diff'].items():
            if ant[0] >= 0 and ant[1] == pol and np.any(np.isfinite(rel_diff)):
                if np.nanmean(rel_diff) > detail_cutoff:
                    if np.all(cs.flag_grids[ant]):
                        ax.plot(cs.freqs / 1e6, rel_diff, label=str((int(ant[0]), ant[1])), zorder=99, ls='--', c='r', lw=.5)    
                    else:
                        ax.plot(cs.freqs / 1e6, rel_diff, label=str((int(ant[0]), ant[1])), zorder=100)
                else:
                    ax.plot(cs.freqs / 1e6, rel_diff, c='grey', alpha=.2, lw=.5)
        med_rel_diff = np.nanmedian([diff for ant, diff in meta['time_avg_rel_diff'].items() if ant[1] == pol], axis=0)
        ax.plot(cs.freqs / 1e6, med_rel_diff, 'k--', label='Median')
        ax.set_ylim([0, 1.05])
        ax.legend(title=f'{pol[1:]}-Polarized', ncol=2)
        ax.set_ylabel('Time-Averaged Relative Difference\nBefore and After Smoothing')
        ax.set_xlabel('Frequency (MHz)')
    plt.tight_layout()
In [34]:
def freq_avg_diff_plot():
    fig, axes = plt.subplots(2, 1, figsize=(14, 6), sharex=True, sharey=True, gridspec_kw={'hspace': 0})
    for ax, pol in zip(axes, ['Jee', 'Jnn']):
        detail_cutoff = np.percentile([np.nanmean(m) for ant, m in meta['freq_avg_rel_diff'].items() 
                                       if ant[1] == pol and np.isfinite(np.nanmean(m))], 95)    
        for ant, rel_diff in meta['freq_avg_rel_diff'].items():
            if ant[0] >= 0 and ant[1] == pol and np.any(np.isfinite(rel_diff)):
                if np.nanmean(rel_diff) > detail_cutoff:
                    if np.all(cs.flag_grids[ant]):
                        ax.plot(lst_grid, rel_diff, label=str((int(ant[0]), ant[1])), zorder=99, ls='--', c='r', lw=.5)    
                    else:
                        ax.plot(lst_grid, rel_diff, label=str((int(ant[0]), ant[1])), zorder=100)
                else:
                    ax.plot(lst_grid, rel_diff, c='grey', alpha=.2, lw=.5)
        
        med_rel_diff = np.nanmedian([diff for ant, diff in meta['freq_avg_rel_diff'].items() if ant[1] == pol], axis=0)
        ax.plot(lst_grid, med_rel_diff, 'k--', label='Median', zorder=101)
        ax.set_ylim([0, 1.05])
        ax.legend(title=f'{pol[1:]}-Polarized', ncol=2)
        ax.set_ylabel('Frequency-Averaged Relative Difference\nBefore and After Smoothing')
        ax.set_xlabel('LST (hours)')
        ax.set_xticklabels(ax.get_xticks() % 24)
    plt.tight_layout()
In [35]:
def avg_difference_array_plot():
    hd = io.HERAData(SUM_FILE)
    
    fig, axes = plt.subplots(1, 2, figsize=(14, 8), sharex=True, sharey=True, gridspec_kw={'wspace': 0})
    for pol, ax in zip(['Jee', 'Jnn'], axes):
    
        avg_diffs = [np.nanmean(meta['time_avg_rel_diff'][ant]) for ant in meta['time_avg_rel_diff'] if ant[1] == pol if ant[0] in hd.antpos]
        xs = [hd.antpos[ant[0]][0] for ant in meta['time_avg_rel_diff'] if ant[1] == pol if ant[0] in hd.antpos]
        ys = [hd.antpos[ant[0]][1] for ant in meta['time_avg_rel_diff'] if ant[1] == pol if ant[0] in hd.antpos]
        names = [ant[0] for ant in meta['time_avg_rel_diff'] if ant[1] == pol if ant[0] in hd.antpos]
        
        im = ax.scatter(x=xs, y=ys, c=avg_diffs, s=200, vmin=0, vmax=.25, cmap='turbo')
        ax.set_aspect('equal')
        for x,y,n in zip(xs, ys, names):
            color = ('w' if np.all(cs.flag_grids[n, pol]) else 'k')
            ax.text(x, y, str(n), va='center', ha='center', fontsize=8, c=color)
        ax.set_title(pol)
        ax.set_xlabel('East-West Antenna Position (m)')
    
    axes[0].set_ylabel('North-South Antenna Position (m)')

    plt.tight_layout()
    plt.colorbar(im, ax=axes, location='top', aspect=60, pad=.04, label='Average Relative Difference Before and After Smoothing', extend='max')

Figure 7: Relative Difference Before and After Smoothing¶

Similar to the above plots, here we show the relative difference before and after smoothing, compared to the magnitude of the smoothed calibration solution. Totally flagged antennas (because they are above the SC_RELATIVE_DIFF_CUTOFF) are red in the first two plots, and their numbers are white in the last plot.

In [36]:
time_avg_diff_plot()
freq_avg_diff_plot()
avg_difference_array_plot()
All-NaN slice encountered
All-NaN slice encountered
set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
All-NaN slice encountered
set_ticklabels() should only be used with a fixed number of ticks, i.e. after set_ticks() or using a FixedLocator.
No description has been provided for this image
No description has been provided for this image
No description has been provided for this image

Save Results¶

In [37]:
add_to_history = 'Produced by calibration_smoothing notebook with the following environment:\n' + '=' * 65 + '\n' + os.popen('conda env export').read() + '=' * 65
In [38]:
cs.write_smoothed_cal(output_replace=(CAL_SUFFIX, SMOOTH_CAL_SUFFIX), add_to_history=add_to_history, clobber=True)
Mean of empty slice
invalid value encountered in multiply
invalid value encountered in divide

Metadata¶

In [39]:
for repo in ['hera_cal', 'hera_qm', 'hera_filters', 'hera_notebook_templates', 'pyuvdata']:
    exec(f'from {repo} import __version__')
    print(f'{repo}: {__version__}')
hera_cal: 3.7.7.dev97+gc2668d3f7
hera_qm: 2.2.1.dev4+gf6d02113b
hera_filters: 0.1.7
hera_notebook_templates: 0.0.1.dev1313+g92178a09c
pyuvdata: 3.2.5.dev1+g5a985ae31
In [40]:
print(f'Finished execution in {(time.time() - tstart) / 60:.2f} minutes.')
Finished execution in 55.71 minutes.