Calibration Smoothing¶
by Josh Dillon, last updated March 29, 2023
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 also plots the results for a couple of antennas.
Here's a set of links to skip to particular figures and tables:
• Figure 1: Full-Day Gain Amplitudes Before and After smooth_cal
¶
• Figure 2: Full-Day Gain Phases Before and After smooth_cal
¶
• Figure 3: Full-Day $\chi^2$ / DoF Waterfall from Redundant-Baseline Calibration¶
• Figure 4: Average $\chi^2$ per Antenna vs. Time and Frequency¶
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 = '/users/jsdillon/lustre/H6C/abscal/2459853/zen.2459853.25518.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", 10.0)) # MHz
TIME_SMOOTHING_SCALE = float(os.environ.get("TIME_SMOOTHING_SCALE", 6e5)) # seconds
EIGENVAL_CUTOFF = float(os.environ.get("EIGENVAL_CUTOFF", 1e-12))
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']:
print(f'{setting} = {eval(setting)}')
SUM_FILE = /mnt/sn1/data2/2460448/zen.2460448.16889.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
Load files¶
In [4]:
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 1572 *.sum.omni.calfits files starting with /mnt/sn1/data2/2460448/zen.2460448.16889.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 1572 *.sum.flag_waterfall.h5 files starting with /mnt/sn1/data2/2460448/zen.2460448.16889.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 1572 *.sum.antenna_flags.h5 files starting with /mnt/sn1/data2/2460448/zen.2460448.16889.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=True, propagate_refant_flags=True, load_chisq=True, load_cspa=True)
for pol in cs.refant:
print(f'Reference antenna {cs.refant[pol][0]} selected for {pol}.')
Mean of empty slice
Reference antenna 124 selected for Jnn. Reference antenna 123 selected for Jee.
In [8]:
# 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]
refant_nums = [ant[0] for ant in cs.refant.values()]
candidate_ants = [ant for ant, nflags in zip(antnums, flags_per_antnum) if (ant not in refant_nums) and (nflags <= np.percentile(flags_per_antnum, 25))
and not np.all(cs.flag_grids[ant, 'Jee']) and not np.all(cs.flag_grids[ant, 'Jnn'])]
ants_to_plot = [func(candidate_ants) for func in (np.min, np.max)]
abscal_gains = {(ant, pol): np.array(cs.gain_grids[(ant, pol)]) for ant in ants_to_plot for pol in ['Jee', 'Jnn']}
Perform smoothing¶
In [9]:
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, flag_phase_flip_ints=True)
9 phase flips detected on antenna (94, 'Jnn'). A total of 101 integrations were phase-flipped relative to the 0th integration between 2460448.5044381786 and 2460448.520432459.
1 phase flips detected on antenna (101, 'Jnn'). A total of 141 integrations were phase-flipped relative to the 0th integration between 2460448.504773723 and 2460448.520432459.
23 phase flips detected on antenna (79, 'Jnn'). A total of 72 integrations were phase-flipped relative to the 0th integration between 2460448.5044381786 and 2460448.520432459.
13 phase flips detected on antenna (95, 'Jnn'). A total of 93 integrations were phase-flipped relative to the 0th integration between 2460448.5044381786 and 2460448.520432459.
26 phase flips detected on antenna (4, 'Jnn'). A total of 72 integrations were phase-flipped relative to the 0th integration between 2460448.5044381786 and 2460448.5187547375.
46 phase flips detected on antenna (295, 'Jnn'). A total of 78 integrations were phase-flipped relative to the 0th integration between 2460448.502089368 and 2460448.520320611.
2 phase flips detected on antenna (151, 'Jnn'). A total of 26 integrations were phase-flipped relative to the 0th integration between 2460448.504997419 and 2460448.507793622.
1 phase flips detected on antenna (111, 'Jnn'). A total of 141 integrations were phase-flipped relative to the 0th integration between 2460448.504773723 and 2460448.520432459.
3 phase flips detected on antenna (66, 'Jnn'). A total of 76 integrations were phase-flipped relative to the 0th integration between 2460448.504773723 and 2460448.520432459.
33 phase flips detected on antenna (5, 'Jnn'). A total of 55 integrations were phase-flipped relative to the 0th integration between 2460448.5044381786 and 2460448.520432459.
45 phase flips detected on antenna (20, 'Jnn'). A total of 69 integrations were phase-flipped relative to the 0th integration between 2460448.5022012163 and 2460448.520432459.
5 phase flips detected on antenna (50, 'Jnn'). A total of 76 integrations were phase-flipped relative to the 0th integration between 2460448.504773723 and 2460448.520432459.
1 phase flips detected on antenna (53, 'Jnn'). A total of 75 integrations were phase-flipped relative to the 0th integration between 2460448.5121556986 and 2460448.520432459.
26 phase flips detected on antenna (283, 'Jnn'). A total of 79 integrations were phase-flipped relative to the 0th integration between 2460448.5045500267 and 2460448.5187547375.
1 phase flips detected on antenna (52, 'Jnn'). A total of 75 integrations were phase-flipped relative to the 0th integration between 2460448.5121556986 and 2460448.520432459.
1 phase flips detected on antenna (38, 'Jnn'). A total of 75 integrations were phase-flipped relative to the 0th integration between 2460448.5121556986 and 2460448.520432459.
10 phase flips detected on antenna (137, 'Jnn'). A total of 23 integrations were phase-flipped relative to the 0th integration between 2460448.504661875 and 2460448.5099187363.
3 phase flips detected on antenna (112, 'Jnn'). A total of 134 integrations were phase-flipped relative to the 0th integration between 2460448.504773723 and 2460448.520432459.
11 phase flips detected on antenna (113, 'Jnn'). A total of 110 integrations were phase-flipped relative to the 0th integration between 2460448.504997419 and 2460448.520432459.
5 phase flips detected on antenna (65, 'Jnn'). A total of 106 integrations were phase-flipped relative to the 0th integration between 2460448.504773723 and 2460448.520432459.
4 phase flips detected on antenna (285, 'Jnn'). A total of 66 integrations were phase-flipped relative to the 0th integration between 2460448.504773723 and 2460448.512379395.
1 phase flips detected on antenna (192, 'Jnn'). A total of 141 integrations were phase-flipped relative to the 0th integration between 2460448.504773723 and 2460448.520432459.
21 phase flips detected on antenna (16, 'Jnn'). A total of 87 integrations were phase-flipped relative to the 0th integration between 2460448.5044381786 and 2460448.520432459.
37 phase flips detected on antenna (19, 'Jnn'). A total of 75 integrations were phase-flipped relative to the 0th integration between 2460448.5022012163 and 2460448.520432459.
5 phase flips detected on antenna (179, 'Jnn'). A total of 110 integrations were phase-flipped relative to the 0th integration between 2460448.504661875 and 2460448.520432459.
3 phase flips detected on antenna (36, 'Jnn'). A total of 140 integrations were phase-flipped relative to the 0th integration between 2460448.504773723 and 2460448.520432459.
2 phase flips detected on antenna (51, 'Jnn'). A total of 66 integrations were phase-flipped relative to the 0th integration between 2460448.504773723 and 2460448.5120438505.
15 phase flips detected on antenna (30, 'Jnn'). A total of 56 integrations were phase-flipped relative to the 0th integration between 2460448.5044381786 and 2460448.520432459.
9 phase flips detected on antenna (214, 'Jnn'). A total of 125 integrations were phase-flipped relative to the 0th integration between 2460448.504661875 and 2460448.520432459.
34 phase flips detected on antenna (266, 'Jnn'). A total of 43 integrations were phase-flipped relative to the 0th integration between 2460448.502089368 and 2460448.5179718006.
11 phase flips detected on antenna (15, 'Jnn'). A total of 114 integrations were phase-flipped relative to the 0th integration between 2460448.5045500267 and 2460448.520432459.
28 phase flips detected on antenna (33, 'Jnn'). A total of 42 integrations were phase-flipped relative to the 0th integration between 2460448.5044381786 and 2460448.5137215722.
32 phase flips detected on antenna (281, 'Jnn'). A total of 120 integrations were phase-flipped relative to the 0th integration between 2460448.502089368 and 2460448.519090282.
25 phase flips detected on antenna (96, 'Jnn'). A total of 92 integrations were phase-flipped relative to the 0th integration between 2460448.5022012163 and 2460448.520432459.
9 phase flips detected on antenna (152, 'Jnn'). A total of 108 integrations were phase-flipped relative to the 0th integration between 2460448.504885571 and 2460448.520432459.
3 phase flips detected on antenna (67, 'Jnn'). A total of 140 integrations were phase-flipped relative to the 0th integration between 2460448.504773723 and 2460448.520432459.
30 phase flips detected on antenna (80, 'Jnn'). A total of 83 integrations were phase-flipped relative to the 0th integration between 2460448.502089368 and 2460448.5179718006.
10 phase flips detected on antenna (217, 'Jnn'). A total of 47 integrations were phase-flipped relative to the 0th integration between 2460448.5022012163 and 2460448.508576559.
4 phase flips detected on antenna (193, 'Jnn'). A total of 9 integrations were phase-flipped relative to the 0th integration between 2460448.504773723 and 2460448.507569926.
8 phase flips detected on antenna (133, 'Jnn'). A total of 39 integrations were phase-flipped relative to the 0th integration between 2460448.5022012163 and 2460448.507569926.
16 phase flips detected on antenna (114, 'Jnn'). A total of 45 integrations were phase-flipped relative to the 0th integration between 2460448.5022012163 and 2460448.5099187363.
45 phase flips detected on antenna (7, 'Jnn'). A total of 92 integrations were phase-flipped relative to the 0th integration between 2460448.5022012163 and 2460448.520432459.
19 phase flips detected on antenna (49, 'Jnn'). A total of 117 integrations were phase-flipped relative to the 0th integration between 2460448.503990786 and 2460448.520432459.
6 phase flips detected on antenna (269, 'Jnn'). A total of 26 integrations were phase-flipped relative to the 0th integration between 2460448.504661875 and 2460448.511708306.
4 phase flips detected on antenna (118, 'Jnn'). A total of 14 integrations were phase-flipped relative to the 0th integration between 2460448.5060040522 and 2460448.507569926.
1 phase flips detected on antenna (98, 'Jnn'). A total of 123 integrations were phase-flipped relative to the 0th integration between 2460448.506786989 and 2460448.520432459.
19 phase flips detected on antenna (155, 'Jnn'). A total of 141 integrations were phase-flipped relative to the 0th integration between 2460448.5022012163 and 2460448.520432459.
8 phase flips detected on antenna (45, 'Jnn'). A total of 11 integrations were phase-flipped relative to the 0th integration between 2460448.5044381786 and 2460448.50790547.
7 phase flips detected on antenna (216, 'Jnn'). A total of 90 integrations were phase-flipped relative to the 0th integration between 2460448.504661875 and 2460448.520432459.
9 phase flips detected on antenna (48, 'Jnn'). A total of 131 integrations were phase-flipped relative to the 0th integration between 2460448.5044381786 and 2460448.520432459.
36 phase flips detected on antenna (8, 'Jnn'). A total of 68 integrations were phase-flipped relative to the 0th integration between 2460448.5022012163 and 2460448.520208763.
19 phase flips detected on antenna (34, 'Jnn'). A total of 120 integrations were phase-flipped relative to the 0th integration between 2460448.5032078493 and 2460448.520432459.
5 phase flips detected on antenna (62, 'Jnn'). A total of 142 integrations were phase-flipped relative to the 0th integration between 2460448.5044381786 and 2460448.520432459.
2 phase flips detected on antenna (132, 'Jnn'). A total of 71 integrations were phase-flipped relative to the 0th integration between 2460448.504997419 and 2460448.5128267873.
3 phase flips detected on antenna (172, 'Jnn'). A total of 137 integrations were phase-flipped relative to the 0th integration between 2460448.5051092673 and 2460448.520432459.
16 phase flips detected on antenna (250, 'Jnn'). A total of 47 integrations were phase-flipped relative to the 0th integration between 2460448.502089368 and 2460448.511596458.
2 phase flips detected on antenna (213, 'Jnn'). A total of 1 integrations were phase-flipped relative to the 0th integration between 2460448.504773723 and 2460448.504773723.
1 phase flips detected on antenna (138, 'Jnn'). A total of 139 integrations were phase-flipped relative to the 0th integration between 2460448.504997419 and 2460448.520432459.
2 phase flips detected on antenna (215, 'Jnn'). A total of 16 integrations were phase-flipped relative to the 0th integration between 2460448.5022012163 and 2460448.503878938.
11 phase flips detected on antenna (251, 'Jnn'). A total of 125 integrations were phase-flipped relative to the 0th integration between 2460448.502089368 and 2460448.520432459.
1 phase flips detected on antenna (233, 'Jnn'). A total of 191 integrations were phase-flipped relative to the 0th integration between 2460448.499181317 and 2460448.520432459.
23 phase flips detected on antenna (17, 'Jnn'). A total of 65 integrations were phase-flipped relative to the 0th integration between 2460448.5044381786 and 2460448.520432459.
1 phase flips detected on antenna (144, 'Jnn'). A total of 2871 integrations were phase-flipped relative to the 0th integration between 2460448.1994283665 and 2460448.520432459.
1 phase flips detected on antenna (100, 'Jnn'). A total of 123 integrations were phase-flipped relative to the 0th integration between 2460448.506786989 and 2460448.520432459.
Plot results¶
In [10]:
lst_grid = utils.JD2LST(cs.time_grid) * 12 / np.pi
lst_grid[lst_grid > lst_grid[-1]] -= 24
In [11]:
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 [12]:
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)
ax.set_title(f'Smoothcal Gain Phase of Ant {ant[0]} / Ant {cs.refant[pol][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 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)
ax.set_title(f'Abscal Gain Phase of Ant {ant[0]} / Ant {cs.refant[pol][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 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)')
ax.set_ylabel(f'Phase of g$_{{{ant[0]}}}$ / g$_{{{cs.refant[pol][0]}}}$')
ax.set_title(f'Median Infrequently-Flagged Gain Phase of Ant {ant[0]} / Ant {cs.refant[pol][0]}: {pol[-1]}-polarized')
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)')
ax.set_ylabel(f'Phase of g$_{{{ant[0]}}}$ / g$_{{{cs.refant[pol][0]}}}$')
ax.set_title(f'Mean Infrequently-Flagged Gain Phase of Ant {ant[0]} / Ant {cs.refant[pol][0]}: {pol[-1]}-polarized')
ax.set_xticklabels(ax.get_xticks() % 24)
ax.legend(loc='upper left')
plt.tight_layout()
plt.show()
Figure 1: 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 [13]:
for ant_to_plot in ants_to_plot:
amplitude_plot(ant_to_plot)