by Josh Dillon, Aaron Parsons, and Tyler Cox, last updated December 13, 2022
This notebook is designed to infer as much information about the array from a single file, including pushing the calibration and RFI mitigation as far as possible
Here's a set of links to skip to particular figures and tables:
import time
tstart = time.time()
import os
os.environ['HDF5_USE_FILE_LOCKING'] = 'FALSE'
import h5py
import hdf5plugin # REQUIRED to have the compression plugins available
import numpy as np
from scipy import constants, interpolate
import copy
import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
pd.set_option('display.max_rows', 1000)
from uvtools.plot import plot_antpos, plot_antclass
from hera_qm import ant_metrics, ant_class, xrfi
from hera_cal import io, utils, redcal, apply_cal, datacontainer, abscal
from hera_notebook_templates.data import DATA_PATH as HNBT_DATA
from IPython.display import display, HTML
import linsolve
display(HTML("<style>.container { width:100% !important; }</style>"))
_ = np.seterr(all='ignore') # get rid of red warnings
%config InlineBackend.figure_format = 'retina'
# this enables better memory management on linux
import ctypes
def malloc_trim():
try:
ctypes.CDLL('libc.so.6').malloc_trim(0)
except OSError:
pass
To use this notebook interactively, you will have to provide a sum filename path if none exists as an environment variable. All other parameters have reasonable default values.
# figure out whether to save results
SAVE_RESULTS = os.environ.get("SAVE_RESULTS", "TRUE").upper() == "TRUE"
# get infile names
SUM_FILE = os.environ.get("SUM_FILE", None)
# SUM_FILE = '/mnt/sn1/zen.2459797.30001.sum.uvh5' # If sum_file is not defined in the environment variables, define it here.
DIFF_FILE = SUM_FILE.replace('sum', 'diff')
# get outfilenames
AM_FILE = (SUM_FILE.replace('.uvh5', '.ant_metrics.hdf5') if SAVE_RESULTS else None)
ANTCLASS_FILE = (SUM_FILE.replace('.uvh5', '.ant_class.csv') if SAVE_RESULTS else None)
OMNICAL_FILE = (SUM_FILE.replace('.uvh5', '.omni.calfits') if SAVE_RESULTS else None)
OMNIVIS_FILE = (SUM_FILE.replace('.uvh5', '.omni_vis.uvh5') if SAVE_RESULTS else None)
for fname in ['SUM_FILE', 'DIFF_FILE', 'AM_FILE', 'ANTCLASS_FILE', 'OMNICAL_FILE', 'OMNIVIS_FILE']:
print(f"{fname} = '{eval(fname)}'")
SUM_FILE = '/mnt/sn1/2459949/zen.2459949.43938.sum.uvh5' DIFF_FILE = '/mnt/sn1/2459949/zen.2459949.43938.diff.uvh5' AM_FILE = '/mnt/sn1/2459949/zen.2459949.43938.sum.ant_metrics.hdf5' ANTCLASS_FILE = '/mnt/sn1/2459949/zen.2459949.43938.sum.ant_class.csv' OMNICAL_FILE = '/mnt/sn1/2459949/zen.2459949.43938.sum.omni.calfits' OMNIVIS_FILE = '/mnt/sn1/2459949/zen.2459949.43938.sum.omni_vis.uvh5'
Load settings relating to the operation of the notebook, then print what was loaded (or default).
# parse plotting settings
PLOT = os.environ.get("PLOT", "TRUE").upper() == "TRUE"
if PLOT:
%matplotlib inline
# parse omnical settings
OC_MAX_DIMS = int(os.environ.get("OC_MAX_DIMS", 4))
OC_MIN_DIM_SIZE = int(os.environ.get("OC_MIN_DIM_SIZE", 8))
OC_SKIP_OUTRIGGERS = os.environ.get("OC_SKIP_OUTRIGGERS", "TRUE").upper() == "TRUE"
OC_MAXITER = int(os.environ.get("OC_MAXITER", 50))
OC_MAX_RERUN = int(os.environ.get("OC_MAX_RERUN", 4))
OC_USE_GPU = os.environ.get("SAVE_RESULTS", "FALSE").upper() == "TRUE"
# parse RFI settings
RFI_DPSS_HALFWIDTH = float(os.environ.get("RFI_DPSS_HALFWIDTH", 300e-9))
RFI_NSIG = float(os.environ.get("RFI_NSIG", 6))
# print settings
for setting in ['PLOT', 'SAVE_RESULTS', 'OC_MAX_DIMS', 'OC_MIN_DIM_SIZE', 'OC_SKIP_OUTRIGGERS', 'OC_MAXITER', 'OC_MAX_RERUN',
'OC_USE_GPU', 'RFI_DPSS_HALFWIDTH', 'RFI_NSIG']:
print(f'{setting} = {eval(setting)}')
PLOT = True SAVE_RESULTS = True OC_MAX_DIMS = 4 OC_MIN_DIM_SIZE = 8 OC_SKIP_OUTRIGGERS = True OC_MAXITER = 50 OC_MAX_RERUN = 4 OC_USE_GPU = False RFI_DPSS_HALFWIDTH = 3e-07 RFI_NSIG = 6.0
Load settings related to classifying antennas as good, suspect, or bad, then print what was loaded (or default).
# ant_metrics bounds for low correlation / dead antennas
am_corr_bad = (0, float(os.environ.get("AM_CORR_BAD", 0.3)))
am_corr_suspect = (float(os.environ.get("AM_CORR_BAD", 0.3)), float(os.environ.get("AM_CORR_SUSPECT", 0.5)))
# ant_metrics bounds for cross-polarized antennas
am_xpol_bad = (-1, float(os.environ.get("AM_XPOL_BAD", -0.1)))
am_xpol_suspect = (float(os.environ.get("AM_XPOL_BAD", -0.1)), float(os.environ.get("AM_XPOL_SUSPECT", 0)))
# bounds on solar altitude (in degrees)
good_solar_altitude = (-90, float(os.environ.get("SUSPECT_SOLAR_ALTITUDE", 0)))
suspect_solar_altitude = (float(os.environ.get("SUSPECT_SOLAR_ALTITUDE", 0)), 90)
# bounds on zeros in spectra
good_zeros_per_eo_spectrum = (0, int(os.environ.get("MAX_ZEROS_PER_EO_SPEC_GOOD", 2)))
suspect_zeros_per_eo_spectrum = (0, int(os.environ.get("MAX_ZEROS_PER_EO_SPEC_SUSPECT", 8)))
# bounds on autocorrelation power
auto_power_good = (float(os.environ.get("AUTO_POWER_GOOD_LOW", 5)), float(os.environ.get("AUTO_POWER_GOOD_HIGH", 30)))
auto_power_suspect = (float(os.environ.get("AUTO_POWER_SUSPECT_LOW", 1)), float(os.environ.get("AUTO_POWER_SUSPECT_HIGH", 50)))
# bounds on autocorrelation slope
auto_slope_good = (float(os.environ.get("AUTO_SLOPE_GOOD_LOW", -0.4)), float(os.environ.get("AUTO_SLOPE_GOOD_HIGH", 0.4)))
auto_slope_suspect = (float(os.environ.get("AUTO_SLOPE_SUSPECT_LOW", -0.6)), float(os.environ.get("AUTO_SLOPE_SUSPECT_HIGH", 0.6)))
# bounds on autocorrelation RFI
auto_rfi_good = (0, float(os.environ.get("AUTO_RFI_GOOD", 0.01)))
auto_rfi_suspect = (0, float(os.environ.get("AUTO_RFI_SUSPECT", 0.02)))
# bounds on autocorrelation shape
auto_shape_good = (0, float(os.environ.get("AUTO_SHAPE_GOOD", 0.0625)))
auto_shape_suspect = (0, float(os.environ.get("AUTO_SHAPE_SUSPECT", 0.125)))
# bounds on chi^2 per antenna in omnical
oc_cspa_good = (0, float(os.environ.get("OC_CSPA_GOOD", 3)))
oc_cspa_suspect = (float(os.environ.get("OC_CSPA_GOOD", 3)), float(os.environ.get("OC_CSPA_SUSPECT", 6)))
# print bounds
for bound in ['am_corr_bad', 'am_corr_suspect', 'am_xpol_bad', 'am_xpol_suspect',
'good_solar_altitude', 'suspect_solar_altitude',
'good_zeros_per_eo_spectrum', 'suspect_zeros_per_eo_spectrum',
'auto_power_good', 'auto_power_suspect', 'auto_slope_good', 'auto_slope_suspect',
'auto_rfi_good', 'auto_rfi_suspect', 'auto_shape_good', 'auto_shape_suspect',
'oc_cspa_good', 'oc_cspa_suspect']:
print(f'{bound} = {eval(bound)}')
am_corr_bad = (0, 0.2) am_corr_suspect = (0.2, 0.4) am_xpol_bad = (-1, -0.1) am_xpol_suspect = (-0.1, 0.0) good_solar_altitude = (-90, 0.0) suspect_solar_altitude = (0.0, 90) good_zeros_per_eo_spectrum = (0, 2) suspect_zeros_per_eo_spectrum = (0, 8) auto_power_good = (5.0, 30.0) auto_power_suspect = (1.0, 50.0) auto_slope_good = (-0.4, 0.4) auto_slope_suspect = (-0.6, 0.6) auto_rfi_good = (0, 0.01) auto_rfi_suspect = (0, 0.02) auto_shape_good = (0, 0.0625) auto_shape_suspect = (0, 0.125) oc_cspa_good = (0, 3.0) oc_cspa_suspect = (3.0, 6.0)
hd = io.HERADataFastReader(SUM_FILE)
data, _, _ = hd.read(read_flags=False, read_nsamples=False)
hd_diff = io.HERADataFastReader(DIFF_FILE)
diff_data, _, _ = hd_diff.read(read_flags=False, read_nsamples=False)
ants = sorted(set([ant for bl in hd.bls for ant in utils.split_bl(bl)]))
auto_bls = [bl for bl in data if (bl[0] == bl[1]) and (utils.split_pol(bl[2])[0] == utils.split_pol(bl[2])[1])]
antpols = sorted(set([ant[1] for ant in ants]))
# print basic information about the file
print(f'File: {SUM_FILE}')
print(f'JDs: {hd.times} ({np.median(np.diff(hd.times)) * 24 * 3600:.5f} s integrations)')
print(f'LSTS: {hd.lsts * 12 / np.pi } hours')
print(f'Frequencies: {len(hd.freqs)} {np.median(np.diff(hd.freqs)) / 1e6:.5f} MHz channels from {hd.freqs[0] / 1e6:.5f} to {hd.freqs[-1] / 1e6:.5f} MHz')
print(f'Antennas: {len(hd.data_ants)}')
print(f'Polarizations: {hd.pols}')
File: /mnt/sn1/2459949/zen.2459949.43938.sum.uvh5 JDs: [2459949.43932713 2459949.43943897] (9.66368 s integrations) LSTS: [6.92383279 6.92652449] hours Frequencies: 1536 0.12207 MHz channels from 46.92078 to 234.29871 MHz Antennas: 196 Polarizations: ['nn', 'ee', 'ne', 'en']
ant_metrics
¶This classifies antennas as cross-polarized, low-correlation, or dead. Such antennas are excluded from any calibration.
am = ant_metrics.AntennaMetrics(SUM_FILE, DIFF_FILE, sum_data=data, diff_data=diff_data)
am.iterative_antenna_metrics_and_flagging(crossCut=am_xpol_bad[1], deadCut=am_corr_bad[1])
am.all_metrics = {} # this saves time and disk by getting rid of per-iteration information we never use
if SAVE_RESULTS:
am.save_antenna_metrics(AM_FILE, overwrite=True)
# Turn ant metrics into classifications
totally_dead_ants = [ant for ant, i in am.xants.items() if i == -1]
am_totally_dead = ant_class.AntennaClassification(good=[ant for ant in ants if ant not in totally_dead_ants], bad=totally_dead_ants)
am_corr = ant_class.antenna_bounds_checker(am.final_metrics['corr'], bad=[am_corr_bad], suspect=[am_corr_suspect], good=[(0, 1)])
am_xpol = ant_class.antenna_bounds_checker(am.final_metrics['corrXPol'], bad=[am_xpol_bad], suspect=[am_xpol_suspect], good=[(-1, 1)])
ant_metrics_class = am_totally_dead + am_corr + am_xpol
min_sun_alt = np.min(utils.get_sun_alt(hd.times))
solar_class = ant_class.antenna_bounds_checker({ant: min_sun_alt for ant in ants}, good=[good_solar_altitude], suspect=[suspect_solar_altitude])
This classifier looks for X-engine failure or packet loss specific to an antenna which causes either the even visibilities (or the odd ones, or both) to be 0s.
zeros_class = ant_class.even_odd_zeros_checker(data, diff_data, good=good_zeros_per_eo_spectrum, suspect=suspect_zeros_per_eo_spectrum)
# delete diffs to save memory
del diff_data, hd_diff
malloc_trim()
These classifiers look for antennas with too high or low power, to steep a slope, or too much excess RFI.
auto_power_class = ant_class.auto_power_checker(data, good=auto_power_good, suspect=auto_power_suspect)
auto_slope_class = ant_class.auto_slope_checker(data, good=auto_slope_good, suspect=auto_slope_suspect, edge_cut=100, filt_size=17)
cache = {}
auto_rfi_class = ant_class.auto_rfi_checker(data, good=auto_rfi_good, suspect=auto_rfi_suspect,
filter_half_widths=[RFI_DPSS_HALFWIDTH], nsig=RFI_NSIG, cache=cache)
auto_class = auto_power_class + auto_slope_class + auto_rfi_class
del cache
malloc_trim()
# Compute int_count for all unflagged autocorrelations averaged together
int_time = 24 * 3600 * np.median(np.diff(data.times_by_bl[auto_bls[0][0:2]]))
chan_res = np.median(np.diff(data.freqs))
final_class = ant_metrics_class + zeros_class + auto_class
int_count = int(int_time * chan_res) * (len(final_class.good_ants) + len(final_class.suspect_ants))
avg_auto = {(-1, -1, 'ee'): np.mean([data[bl] for bl in auto_bls if final_class[utils.split_bl(bl)[0]] != 'bad'], axis=0)}
# Flag RFI first with channel differences and then with DPSS
antenna_flags, _ = xrfi.flag_autos(avg_auto, int_count=int_count, nsig=(RFI_NSIG * 5))
_, rfi_flags = xrfi.flag_autos(avg_auto, int_count=int_count, flag_method='dpss_flagger',
flags=antenna_flags, freqs=data.freqs, filter_centers=[0],
filter_half_widths=[RFI_DPSS_HALFWIDTH], eigenval_cutoff=[1e-9], nsig=RFI_NSIG)
malloc_trim()
def rfi_plot():
plt.figure(figsize=(12, 5), dpi=100)
plt.semilogy(hd.freqs / 1e6, np.where(rfi_flags, np.nan, avg_auto[(-1, -1, 'ee')])[1], label = 'Average Good or Suspect Autocorrelation', zorder=100)
plt.semilogy(hd.freqs / 1e6, np.where(False, np.nan, avg_auto[(-1, -1, 'ee')])[1], 'r', lw=.5, label=f'{np.sum(rfi_flags[0])} Channels Flagged for RFI')
plt.legend()
plt.xlabel('Frequency (MHz)')
plt.ylabel('Uncalibrated Autocorrelation')
plt.tight_layout()
This figure shows RFI identified using the average of all autocorrelations---excluding bad antennas---for the first integration in the file.
rfi_plot()
def autocorr_plot(cls):
fig, axes = plt.subplots(1, 2, figsize=(14, 5), dpi=100, sharey=True, gridspec_kw={'wspace': 0})
labels = []
colors = ['darkgreen', 'goldenrod', 'maroon']
for ax, pol in zip(axes, antpols):
for ant in cls.ants:
if ant[1] == pol:
color = colors[cls.quality_classes.index(cls[ant])]
ax.semilogy(np.mean(data[utils.join_bl(ant, ant)], axis=0), color=color, lw=.5)
ax.set_xlabel('Channel', fontsize=12)
ax.set_title(f'{utils.join_pol(pol, pol)}-Polarized Autos')
axes[0].set_ylabel('Raw Autocorrelation', fontsize=12)
axes[1].legend([matplotlib.lines.Line2D([0], [0], color=color) for color in colors],
[cls.capitalize() for cls in auto_class.quality_classes], ncol=1, fontsize=12, loc='upper right', framealpha=1)
plt.tight_layout()
auto_shape_class = ant_class.auto_shape_checker(data, good=auto_shape_good, suspect=auto_shape_suspect,
flag_spectrum=np.sum(rfi_flags, axis=0).astype(bool), antenna_class=final_class)
auto_class += auto_shape_class
This figure shows a plot of all autocorrelations in the array, split by polarization. Antennas are classified based on their autocorrelations into good, suspect, and bad, by examining power, slope, and RFI-occupancy.
if PLOT: autocorr_plot(auto_class)
final_class = ant_metrics_class + solar_class + zeros_class + auto_class
def array_class_plot(cls):
fig, axes = plt.subplots(1, 2, figsize=(14, 6), dpi=100, gridspec_kw={'width_ratios': [2, 1]})
plot_antclass(hd.antpos, cls, ax=axes[0], ants=[ant for ant in hd.data_ants if ant < 320], legend=False, title='HERA Core')
plot_antclass(hd.antpos, cls, ax=axes[1], ants=[ant for ant in hd.data_ants if ant >= 320], radius=50, title='Outriggers')
This figure shows the location and classification of all antennas prior to calibration.
Antennas are split along the diagonal, with ee-polarized antpols represented by the southeast half of each antenna and nn-polarized antpols represented by the northwest half.
Outriggers are split from the core and shown at exaggerated size in the right-hand panel. This classification includes ant_metrics
, a count of the zeros in the even or odd visibilities, and autocorrelation power, slope, and RFI occupancy.
An antenna classified as bad in any classification will be considered bad.
An antenna marked as suspect any in any classification will be considered suspect unless it is also classified as bad elsewhere.
if PLOT: array_class_plot(final_class)
def classify_off_grid(reds, all_ants):
'''Returns AntennaClassification of all_ants where good ants are in reds while bad ants are not.'''
ants_in_reds = set([ant for red in reds for bl in red for ant in utils.split_bl(bl)])
on_grid = [ant for ant in all_ants if ant in ants_in_reds]
off_grid = [ant for ant in all_ants if ant not in ants_in_reds]
return ant_class.AntennaClassification(good=on_grid, bad=off_grid)
redcal
¶redcal_start = time.time()
rc_settings = {'max_dims': OC_MAX_DIMS, 'oc_conv_crit': 1e-10, 'gain': 0.4,
'oc_maxiter': OC_MAXITER, 'check_after': OC_MAXITER, 'use_gpu': OC_USE_GPU}
# figure out and filter reds and classify antennas based on whether or not they are on the main grid
reds = redcal.get_reds(hd.data_antpos, pols=['ee', 'nn'], pol_mode='2pol')
reds = redcal.filter_reds(reds, ex_ants=final_class.bad_ants, max_dims=OC_MAX_DIMS, min_dim_size=OC_MIN_DIM_SIZE)
if OC_SKIP_OUTRIGGERS:
reds = redcal.filter_reds(reds, ex_ants=[ant for ant in ants if ant[0] >= 320])
redcal_class = classify_off_grid(reds, ants)
# perform first stage of redundant calibration,
cal = redcal.redundantly_calibrate(data, reds, **rc_settings)
malloc_trim()
max_dly = np.max(np.abs(list(cal['fc_meta']['dlys'].values())))
med_cspa = {ant: np.median(cal['chisq_per_ant'][ant]) for ant in cal['chisq_per_ant']}
cspa_class = ant_class.antenna_bounds_checker(med_cspa, good=np.array(oc_cspa_good)*5, suspect=np.array(oc_cspa_suspect)*5, bad=(0, np.inf))
redcal_class += cspa_class
print(f'Removing {cspa_class.bad_ants} for high chi^2.')
# iteratively rerun redundant calibration
for i in range(OC_MAX_RERUN):
# build RedDataContainer of old visibility solution
prior_vis = datacontainer.RedDataContainer(cal['v_omnical'], reds)
# refilter reds and update classification to reflect new off-grid ants, if any
reds = redcal.filter_reds(reds, ex_ants=(final_class + redcal_class).bad_ants, max_dims=OC_MAX_DIMS, min_dim_size=OC_MIN_DIM_SIZE)
reds = sorted(reds, key=len, reverse=True)
redcal_class += classify_off_grid(reds, ants)
ants_in_reds = set([ant for red in reds for bl in red for ant in utils.split_bl(bl)])
# re-run redundant calibration using previous solution, updating bad and suspicious antennas
prior_sol = redcal.RedSol(reds, gains={ant: cal['g_omnical'][ant] for ant in ants_in_reds},
vis={red[0]: prior_vis[red[0]] for red in reds})
cal = redcal.redundantly_calibrate(data, reds, prior_firstcal=prior_sol.gains, prior_sol=prior_sol, **rc_settings)
malloc_trim()
med_cspa = {ant: np.median(cal['chisq_per_ant'][ant]) for ant in cal['chisq_per_ant']}
cspa_class = ant_class.antenna_bounds_checker(med_cspa, good=oc_cspa_good, suspect=oc_cspa_suspect, bad=(0, np.inf))
redcal_class += cspa_class
print(f'Removing {cspa_class.bad_ants} for high chi^2.')
if len(cspa_class.bad_ants) == 0:
break # no new antennas to flag
final_class += redcal_class
print(f'Finished redcal in {(time.time() - redcal_start) / 60:.2f} minutes.')
Removing set() for high chi^2. Removing {(185, 'Jnn'), (184, 'Jee'), (184, 'Jnn'), (166, 'Jee'), (166, 'Jnn')} for high chi^2. Removing set() for high chi^2. Finished redcal in 6.65 minutes.
firstcal
delay slope degeneracy using RFI transmitters¶# find channels clearly contaminated by RFI
not_bad_ants = [ant for ant in final_class.ants if final_class[ant] != 'bad']
chan_flags = np.mean([xrfi.detrend_medfilt(data[utils.join_bl(ant, ant)], Kf=8, Kt=2) for ant in not_bad_ants], axis=(0, 1)) > 5
# hardcoded RFI transmitters and their headings
# channel: frequency (Hz), heading (rad), chi^2
phs_sol = {359: ( 90744018.5546875, 0.7853981, 23.3),
360: ( 90866088.8671875, 0.7853981, 10.8),
385: ( 93917846.6796875, 0.7853981, 27.3),
386: ( 94039916.9921875, 0.7853981, 18.1),
400: ( 95748901.3671875, 6.0632738, 24.0),
441: (100753784.1796875, 0.7853981, 21.7),
442: (100875854.4921875, 0.7853981, 19.4),
455: (102462768.5546875, 6.0632738, 18.8),
456: (102584838.8671875, 6.0632738, 8.8),
471: (104415893.5546875, 0.7853981, 13.3),
484: (106002807.6171875, 6.0632738, 21.2),
485: (106124877.9296875, 6.0632738, 4.0),
1181: (191085815.4296875, 0.7853981, 26.3),
1182: (191207885.7421875, 0.7853981, 27.0),
1183: (191329956.0546875, 0.7853981, 25.6),
1448: (223678588.8671875, 2.6075219, 25.7),
1449: (223800659.1796875, 2.6075219, 22.6),
1450: (223922729.4921875, 2.6075219, 11.6),
1451: (224044799.8046875, 2.6075219, 5.9),
1452: (224166870.1171875, 2.6075219, 22.6),
1510: (231246948.2421875, 0.1068141, 23.9)}
rfi_chans = [chan for chan in phs_sol if chan_flags[chan]]
print('Channels used for delay-slope calibration with RFI:', rfi_chans)
rfi_angles = np.array([phs_sol[chan][1] for chan in rfi_chans])
rfi_headings = np.array([np.cos(rfi_angles), np.sin(rfi_angles), np.zeros_like(rfi_angles)])
rfi_chisqs = np.array([phs_sol[chan][2] for chan in rfi_chans])
Channels used for delay-slope calibration with RFI: [359, 360, 385, 386, 400, 441, 442, 455, 456, 471, 484, 485, 1182]
# resolve firstcal degeneracy with delay slopes set by RFI transmitters, update cal
RFI_dly_slope_gains = abscal.RFI_delay_slope_cal(reds, hd.antpos, cal['v_omnical'], hd.freqs, rfi_chans, rfi_headings, rfi_wgts=rfi_chisqs**-1,
min_tau=-max_dly, max_tau=max_dly, delta_tau=0.1e-9, return_gains=True, gain_ants=cal['g_omnical'].keys())
cal['g_omnical'] = {ant: g * RFI_dly_slope_gains[ant] for ant, g in cal['g_omnical'].items()}
apply_cal.calibrate_in_place(cal['v_omnical'], RFI_dly_slope_gains)
malloc_trim()
# Load simulated and then downsampled model of autocorrelations that includes receiver noise, then interpolate to upsample
hd_model = io.HERADataFastReader(f'{HNBT_DATA}/SSM_autocorrelations_downsampled.uvh5')
model, _, _ = hd_model.read(read_flags=False, read_nsamples=False)
per_pol_interpolated_model = {}
for bl in model:
sorted_lsts, lst_indices = np.unique(model.lsts, return_index=True)
periodic_model = np.vstack([model[bl][lst_indices, :], model[bl][lst_indices[0], :]])
periodic_lsts = np.append(sorted_lsts, sorted_lsts[0] + 2 * np.pi)
lst_interpolated = interpolate.CubicSpline(periodic_lsts, periodic_model, axis=0, bc_type='periodic')(data.lsts)
per_pol_interpolated_model[bl[2]] = interpolate.CubicSpline(model.freqs, lst_interpolated, axis=1)(data.freqs)
model = {bl: per_pol_interpolated_model[bl[2]] for bl in auto_bls if utils.split_bl(bl)[0] not in final_class.bad_ants}
# Run abscal and update omnical gains with abscal gains
redcaled_autos = datacontainer.DataContainer({bl: np.array(data[bl]) for bl in auto_bls if utils.split_bl(bl)[0] not in final_class.bad_ants})
apply_cal.calibrate_in_place(redcaled_autos, cal['g_omnical'])
g_abscal = abscal.abs_amp_lincal(model, redcaled_autos, verbose=False, return_gains=True, gain_ants=cal['g_omnical'])
cal['g_omnical'] = {ant: g * g_abscal[ant] for ant, g in cal['g_omnical'].items()}
apply_cal.calibrate_in_place(cal['v_omnical'], g_abscal)
del hd_model, model, redcaled_autos
malloc_trim()
def redundant_group_plot():
fig, axes = plt.subplots(2, 2, figsize=(14, 6), dpi=100, sharex='col', sharey='row', gridspec_kw={'hspace': 0, 'wspace': 0})
for i, pol in enumerate(['ee', 'nn']):
reds_here = redcal.get_reds(hd.data_antpos, pols=[pol], pol_mode='1pol')
red = sorted(redcal.filter_reds(reds_here, ex_ants=final_class.bad_ants), key=len, reverse=True)[0]
rc_data = {bl: np.array(data[bl]) for bl in red}
apply_cal.calibrate_in_place(rc_data, cal['g_omnical'])
for bl in red:
axes[0, i].plot(hd.freqs/1e6, np.angle(rc_data[bl][0]), alpha=.5, lw=.5)
axes[1, i].semilogy(hd.freqs/1e6, np.abs(rc_data[bl][0]), alpha=.5, lw=.5)
axes[0, i].plot(hd.freqs / 1e6, np.angle(cal['v_omnical'][red[0]][0]), lw=1, c='k')
axes[1, i].semilogy(hd.freqs / 1e6, np.abs(cal['v_omnical'][red[0]][0]), lw=1, c='k', label=f'Baseline Group:\n{red[0]}')
axes[1, i].set_xlabel('Frequency (MHz)')
axes[1, i].legend(loc='upper right')
axes[0, 0].set_ylabel('Visibility Phase (radians)')
axes[1, 0].set_ylabel('Visibility Amplitude (Jy)')
plt.tight_layout()
The results of a redundant-baseline calibration of a single integration and a single group, the one with the highest redundancy in each polarization after antenna classification and excision based on the above, plus the removal of antennas with high chi^2 per antenna. The black line is the redundant visibility solution. Each thin colored line is a different baseline group. Phases are shown in the top row, amplitudes in the bottom, ee-polarized visibilities in the left column, and nn-polarized visibilities in the right.
if PLOT: redundant_group_plot()
This attempts to calibrate bad antennas using information from good or suspect antennas without allowing bad antennas to affect their calibration.
However antennas flagged for ant_metrics
or lots of zeros in the even or odd visibilities are considered beyond saving.
Likewise, some antennas would add extra degeneracies (controlled by OC_MAX_DIMS
, OC_MIN_DIM_SIZE
, and OC_SKIP_OUTRIGGERS
) are excluded.
expand_start = time.time()
expanded_reds = redcal.get_reds(hd.data_antpos, pols=['ee', 'nn'], pol_mode='2pol')
expanded_reds = redcal.filter_reds(expanded_reds, ex_ants=(ant_metrics_class + zeros_class).bad_ants, max_dims=OC_MAX_DIMS, min_dim_size=OC_MIN_DIM_SIZE)
if OC_SKIP_OUTRIGGERS:
expanded_reds = redcal.filter_reds(expanded_reds, ex_ants=[ant for ant in ants if ant[0] >= 320])
nsamples = datacontainer.DataContainer({bl: np.ones_like(data[bl], dtype=float) for bl in data})
redcal.expand_omni_sol(cal, expanded_reds, data, nsamples)
malloc_trim()
print(f'Finished expanding omni_sol in {(time.time() - expand_start) / 60:.2f} minutes.')
Finished expanding omni_sol in 0.93 minutes.
def array_chisq_plot():
fig, axes = plt.subplots(1, 2, figsize=(14, 5), dpi=100)
for ax, pol in zip(axes, ['ee', 'nn']):
ants_to_plot = set([ant for ant in cal['chisq_per_ant'] if utils.join_pol(ant[1], ant[1]) == pol])
cspas = [np.median(cal['chisq_per_ant'][ant]) for ant in ants_to_plot]
xpos = [hd.antpos[ant[0]][0] for ant in ants_to_plot]
ypos = [hd.antpos[ant[0]][1] for ant in ants_to_plot]
scatter = ax.scatter(xpos, ypos, s=300, c=cspas, norm=matplotlib.colors.LogNorm(vmin=1, vmax=oc_cspa_suspect[1]))
for ant in ants_to_plot:
ax.text(hd.antpos[ant[0]][0], hd.antpos[ant[0]][1], ant[0], va='center', ha='center', fontsize=9,
c=('r' if ant in final_class.bad_ants else 'w'))
plt.colorbar(scatter, ax=ax, extend='both')
ax.axis('equal')
ax.set_xlabel('East-West Position (meters)')
ax.set_ylabel('North-South Position (meters)')
ax.set_title(f'{pol}-pol $\\chi^2$ / Antenna (Red is Flagged)')
plt.tight_layout()
This plot shows median (taken over time and frequency) of the normalized chi^2 per antenna. The expectation value for this quantity when the array is perfectly redundant is 1.0. Antennas that are classified as bad for any reason have their numbers shown in red. Some of those antennas were classified as bad during redundant calibration for high chi^2. Some of those antennas were originally excluded from redundant calibration because they were classified as bad earlier for some reason. See here for more details. Note that the color scale saturates at below 1 and above 10.
if PLOT: array_chisq_plot()
def array_class_after_redcal_plot():
fig, axes = plt.subplots(1, 2, figsize=(14, 6), dpi=100, gridspec_kw={'width_ratios': [2, 1]})
plot_antclass(hd.antpos, final_class, ax=axes[0], ants=[ant for ant in hd.data_ants if ant < 320], legend=False, title='HERA Core, Post-Redcal')
plot_antclass(hd.antpos, final_class, ax=axes[1], ants=[ant for ant in hd.data_ants if ant >= 320], radius=50, title='Outriggers')
This figure is the same as Figure 2, except that it now includes additional suspect or bad antennas based on redundant calibration. This can include antennas with high chi^2, but it can also include antennas classified as "bad" because they would add extra degeneracies to calibration.
if PLOT: array_class_after_redcal_plot()
to_show = {'Antenna': [f'{ant[0]}{ant[1][-1]}' for ant in ants]}
classes = {'Antenna': [final_class[ant] if ant in final_class else '-' for ant in ants]}
to_show['Dead?'] = [{'good': 'No', 'bad': 'Yes'}[am_totally_dead[ant]] if (ant in am_totally_dead) else '' for ant in ants]
classes['Dead?'] = [am_totally_dead[ant] if (ant in am_totally_dead) else '' for ant in ants]
for title, ac in [('Low Correlation', am_corr),
('Cross-Polarized', am_xpol),
('Solar Alt', solar_class),
('Even/Odd Zeros', zeros_class),
('Autocorr Power', auto_power_class),
('Autocorr Slope', auto_slope_class),
('RFI in Autos', auto_rfi_class),
('Autocorr Shape', auto_shape_class)]:
to_show[title] = [f'{ac._data[ant]:.2G}' if (ant in ac._data) else '' for ant in ants]
classes[title] = [ac[ant] if ant in ac else '' for ant in ants]
to_show['Redcal chi^2'] = [f'{np.median(cal["chisq_per_ant"][ant]):.3G}' if (ant in cal['chisq_per_ant']) else '-' for ant in ants]
classes['Redcal chi^2'] = [redcal_class[ant] if ant in redcal_class else '' for ant in ants]
df = pd.DataFrame(to_show)
df_classes = pd.DataFrame(classes)
colors = {'good': 'darkgreen', 'suspect': 'goldenrod', 'bad': 'maroon'}
df_colors = df_classes.applymap(lambda x: f'background-color: {colors.get(x, None)}')
table = df.style.hide_index() \
.apply(lambda x: pd.DataFrame(df_colors.values, columns=x.columns), axis=None) \
.set_properties(subset=['Antenna'], **{'font-weight': 'bold', 'border-right': "3pt solid black"}) \
.set_properties(subset=df.columns[1:], **{'border-left': "1pt solid black"}) \
.set_properties(**{'text-align': 'center', 'color': 'white'})
This table summarizes the results of the various classifications schemes detailed above.
As before, green is good, yellow is suspect, and red is bad. The color for each antenna (first column) is the final summary of all other classifications.
Antennas missing from redcal $\chi^2$ were excluded redundant-baseline calibration, either because they were flagged by ant_metrics
or the even/odd zeros check, or because they would add unwanted extra degeneracies.
HTML(table.render())
Antenna | Dead? | Low Correlation | Cross-Polarized | Solar Alt | Even/Odd Zeros | Autocorr Power | Autocorr Slope | RFI in Autos | Autocorr Shape | Redcal chi^2 |
---|---|---|---|---|---|---|---|---|---|---|
3e | No | 0.033 | 0.2 | -37 | 0 | 0.69 | 0.51 | 0.024 | 0.14 | - |
3n | No | 0.26 | 0.2 | -37 | 0 | 16 | 0.64 | 0.00065 | 0.13 | 1.94 |
4e | No | 0.45 | 0.36 | -37 | 0 | 1.9 | 0.2 | 0.01 | 0.037 | 1.32 |
4n | No | 0.55 | 0.36 | -37 | 0 | 12 | 0.3 | 0.0016 | 0.08 | 1.37 |
5e | No | 0.53 | 0.33 | -37 | 0 | 9.9 | 0.11 | 0.0026 | 0.028 | 1.4 |
5n | No | 0.56 | 0.33 | -37 | 1 | 10 | 0.11 | 0.0013 | 0.029 | 1.39 |
7e | No | 0.54 | 0.33 | -37 | 0 | 14 | 0.13 | 0.0055 | 0.022 | 1.53 |
7n | No | 0.57 | 0.33 | -37 | 0 | 11 | 0.15 | 0.0023 | 0.035 | 1.43 |
8e | No | 0.54 | 0.32 | -37 | 0 | 12 | 0.13 | 0.0036 | 0.032 | 1.49 |
8n | No | 0.56 | 0.32 | -37 | 0 | 11 | 0.17 | 0.002 | 0.022 | 1.43 |
9e | No | 0.37 | 0.39 | -37 | 0 | 1.1 | 0.33 | 0.011 | 0.078 | 1.4 |
9n | No | 0.56 | 0.39 | -37 | 0 | 12 | 0.15 | 0.002 | 0.025 | 1.44 |
10e | No | 0.54 | 0.33 | -37 | 0 | 17 | 0.15 | 0.0023 | 0.039 | 1.4 |
10n | No | 0.57 | 0.33 | -37 | 0 | 15 | 0.11 | 0.0026 | 0.021 | 1.36 |
15e | No | 0.035 | 0.19 | -37 | 0 | 0.8 | 0.51 | 0.017 | 0.14 | - |
15n | No | 0.27 | 0.19 | -37 | 0 | 17 | 0.77 | 0.00033 | 0.17 | 2.15 |
16e | No | 0.034 | 0.44 | -37 | 0 | 0.69 | 0.52 | 0.02 | 0.14 | - |
16n | No | 0.56 | 0.44 | -37 | 0 | 9.1 | 0.18 | 0.00033 | 0.024 | 1.44 |
17e | No | 0.54 | 0.35 | -37 | 0 | 9 | 0.1 | 0 | 0.032 | 1.54 |
17n | No | 0.57 | 0.35 | -37 | 0 | 9.5 | 0.17 | 0.00033 | 0.044 | 1.52 |
18e | No | 0.029 | 0.12 | -37 | 1 | 0.7 | 0.55 | 0.031 | 0.15 | - |
18n | No | 0.16 | 0.12 | -37 | 0 | 12 | 0.72 | 0.32 | 0.22 | - |
19e | No | 0.55 | 0.33 | -37 | 0 | 14 | 0.14 | 0.0023 | 0.021 | 1.4 |
19n | No | 0.58 | 0.33 | -37 | 0 | 13 | 0.13 | 0.00065 | 0.023 | 1.44 |
20e | No | 0.53 | 0.33 | -37 | 0 | 5.6 | 0.18 | 0.0033 | 0.037 | 1.43 |
20n | No | 0.57 | 0.33 | -37 | 0 | 12 | 0.13 | 0.00033 | 0.022 | 1.44 |
21e | No | 0.54 | 0.33 | -37 | 0 | 12 | 0.22 | 0.00098 | 0.04 | 1.43 |
21n | No | 0.56 | 0.33 | -37 | 0 | 11 | 0.2 | 0.00098 | 0.032 | 1.41 |
22e | No | 0.5 | 0.31 | -37 | 0 | 24 | 0.12 | 0.0016 | 0.016 | 1.46 |
22n | No | 0.53 | 0.31 | -37 | 0 | 23 | 0.14 | 0.0026 | 0.018 | 1.38 |
27e | No | 0.036 | 0.0093 | -37 | 0 | 0.69 | 0.5 | 0.08 | 0.13 | - |
27n | No | 0.042 | 0.0093 | -37 | 0 | 0.65 | 0.55 | 0.052 | 0.14 | - |
28e | No | 0.27 | 0.19 | -37 | 0 | 18 | 0.61 | 0 | 0.12 | 1.86 |
28n | No | 0.12 | 0.19 | -37 | 0 | 8.6 | 0.93 | 0.31 | 0.27 | - |
29e | No | 0.031 | 0.0072 | -37 | 0 | 0.75 | 0.51 | 0.032 | 0.14 | - |
29n | No | 0.036 | 0.0072 | -37 | 0 | 0.72 | 0.56 | 0.017 | 0.15 | - |
30e | No | 0.54 | 0.33 | -37 | 0 | 10 | 0.16 | 0.0016 | 0.03 | 1.51 |
30n | No | 0.56 | 0.33 | -37 | 0 | 9 | 0.11 | 0 | 0.029 | 1.47 |
31e | No | 0.56 | 0.32 | -37 | 0 | 7.6 | 0.067 | 0.00033 | 0.029 | 1.44 |
31n | No | 0.56 | 0.32 | -37 | 0 | 7.2 | 0.23 | 0.00065 | 0.03 | 1.44 |
32e | No | 0.46 | 0.25 | -37 | 0 | 9.8 | 0.74 | 0 | 0.18 | 1.97 |
32n | No | 0.48 | 0.25 | -37 | 1 | 6.4 | 0.7 | 0 | 0.17 | 1.94 |
34e | No | 0.034 | 0.011 | -37 | 0 | 2.9 | 0.58 | 0.033 | 0.15 | - |
34n | No | 0.05 | 0.011 | -37 | 0 | 2.9 | 0.61 | 0.023 | 0.15 | - |
35e | No | 0.52 | 0.3 | -37 | 0 | 29 | 0.085 | 0.0016 | 0.025 | 1.54 |
35n | No | 0.52 | 0.3 | -37 | 0 | 15 | 0.22 | 0.0013 | 0.023 | 1.39 |
36e | No | 0.51 | 0.33 | -37 | 0 | 8.9 | -0.22 | 0.00098 | 0.1 | 1.54 |
36n | No | 0.53 | 0.33 | -37 | 0 | 9.3 | -0.17 | 0.0013 | 0.095 | 1.76 |
37e | No | 0.53 | 0.34 | -37 | 0 | 14 | 0.066 | 0.00033 | 0.052 | 1.5 |
37n | No | 0.54 | 0.34 | -37 | 0 | 7.2 | 0.14 | 0.00098 | 0.045 | 1.62 |
38e | No | 0.53 | 0.35 | -37 | 0 | 9.5 | 0.12 | 0.00065 | 0.055 | 1.4 |
38n | No | 0.56 | 0.35 | -37 | 0 | 8.8 | 0.091 | 0.00033 | 0.039 | 1.55 |
40e | No | 0.04 | 0.43 | -37 | 0 | 0.72 | 0.63 | 0.24 | 0.25 | - |
40n | No | 0.55 | 0.43 | -37 | 0 | 8.8 | 0.28 | 0.24 | 0.21 | 1.76 |
41e | No | 0.54 | 0.33 | -37 | 0 | 11 | 0.054 | 0.0016 | 0.039 | 1.59 |
41n | No | 0.56 | 0.33 | -37 | 0 | 10 | 0.12 | 0.00033 | 0.029 | 1.41 |
42e | No | 0.027 | 0.00065 | -37 | 0 | 0.65 | 0.55 | 0.015 | 0.14 | - |
42n | No | 0.025 | 0.00065 | -37 | 1 | 0.58 | 0.59 | 0.022 | 0.15 | - |
43e | No | 0.55 | 0.33 | -37 | 0 | 10 | 0.093 | 0.00065 | 0.037 | 1.38 |
43n | No | 0.57 | 0.33 | -37 | 0 | 9.1 | 0.24 | 0.00033 | 0.037 | 1.37 |
44e | No | 0.55 | 0.32 | -37 | 0 | 19 | 0.12 | 0 | 0.011 | 1.44 |
44n | No | 0.57 | 0.32 | -37 | 0 | 12 | 0.15 | 0.00065 | 0.027 | 1.39 |
45e | No | 0.55 | 0.31 | -37 | 0 | 9.3 | 0.091 | 0.0013 | 0.029 | 1.38 |
45n | No | 0.55 | 0.31 | -37 | 0 | 9.4 | 0.16 | 0.011 | 0.12 | 1.4 |
46e | No | 0.54 | 0.34 | -37 | 0 | 12 | 0.13 | 0.00065 | 0.019 | 1.44 |
46n | No | 0.57 | 0.34 | -37 | 0 | 19 | 0.068 | 0.00033 | 0.032 | 1.4 |
47e | No | 0.03 | 0.014 | -37 | 0 | 3.1 | 0.55 | 0.032 | 0.15 | - |
47n | No | 0.051 | 0.014 | -37 | 0 | 3.2 | 0.59 | 0.011 | 0.16 | - |
48e | No | 0.52 | 0.32 | -37 | 0 | 27 | 0.19 | 0.00065 | 0.027 | 1.5 |
48n | No | 0.54 | 0.32 | -37 | 0 | 37 | 0.12 | 0.00033 | 0.035 | 1.38 |
49e | No | 0.48 | 0.32 | -37 | 0 | 13 | 0.22 | 0.0016 | 0.03 | 1.53 |
49n | No | 0.53 | 0.32 | -37 | 0 | 24 | 0.19 | 0.00065 | 0.024 | 1.38 |
50e | No | 0.5 | 0.3 | -37 | 0 | 9 | 0.15 | 0.00065 | 0.04 | 1.48 |
50n | No | 0.44 | 0.3 | -37 | 0 | 7.3 | 0.85 | 0.00098 | 0.21 | 2.72 |
51e | No | 0.038 | 0.29 | -37 | 1 | 0.35 | 0.99 | 0.22 | 0.22 | - |
51n | No | 0.4 | 0.29 | -37 | 0 | 12 | 0.069 | 0 | 0.084 | 3.42 |
52e | No | 0.54 | 0.34 | -37 | 0 | 11 | -0.2 | 0.00098 | 0.099 | 1.48 |
52n | No | 0.56 | 0.34 | -37 | 0 | 8.9 | -0.13 | 0.00033 | 0.086 | 2.08 |
53e | No | 0.55 | 0.35 | -37 | 0 | 10 | 0.095 | 0.00033 | 0.042 | 1.51 |
53n | No | 0.57 | 0.35 | -37 | 0 | 10 | -0.013 | 0.00033 | 0.063 | 1.63 |
54e | No | 0.025 | -0.00068 | -37 | 0 | 0.69 | 0.51 | 0.057 | 0.14 | - |
54n | No | 0.026 | -0.00068 | -37 | 1 | 0.62 | 0.57 | 0.019 | 0.15 | - |
55e | No | 0.028 | 0.0014 | -37 | 0 | 0.68 | 0.53 | 0.031 | 0.14 | - |
55n | No | 0.031 | 0.0014 | -37 | 0 | 0.63 | 0.6 | 0.075 | 0.15 | - |
56e | No | 0.55 | 0.45 | -37 | 0 | 8.6 | 0.19 | 0 | 0.029 | 1.7 |
56n | No | 0.039 | 0.45 | -37 | 0 | 0.6 | 0.61 | 0.016 | 0.15 | - |
57e | No | 0.33 | 0.35 | -37 | 0 | 1.4 | 0.89 | 0.02 | 0.22 | 1.87 |
57n | No | 0.57 | 0.35 | -37 | 0 | 7.6 | 0.2 | 0.00065 | 0.028 | 1.4 |
58e | No | 0.037 | 0.0034 | -37 | 0 | 0.7 | 0.49 | 0.033 | 0.14 | - |
58n | No | 0.039 | 0.0034 | -37 | 1 | 0.64 | 0.56 | 0.021 | 0.15 | - |
59e | No | 0.05 | 0.44 | -37 | 0 | 0.8 | 0.53 | 0.018 | 0.14 | - |
59n | No | 0.56 | 0.44 | -37 | 0 | 7.1 | 0.25 | 0.00033 | 0.039 | 1.35 |
60e | No | 0.55 | 0.44 | -37 | 0 | 11 | 0.23 | 0.0029 | 0.034 | 1.39 |
60n | No | 0.061 | 0.44 | -37 | 0 | 0.63 | 0.56 | 0.07 | 0.14 | - |
61e | No | 0.48 | 0.32 | -37 | 0 | 11 | 0.31 | 0 | 0.051 | 1.4 |
61n | No | 0.53 | 0.32 | -37 | 0 | 15 | 0.22 | 0 | 0.024 | 1.37 |
62e | No | 0.48 | 0.33 | -37 | 0 | 12 | 0.22 | 0.0016 | 0.032 | 1.36 |
62n | No | 0.54 | 0.33 | -37 | 0 | 33 | 0.11 | 0 | 0.039 | 1.35 |
63e | No | 0.51 | 0.4 | -37 | 0 | 21 | 0.15 | 0.0016 | 0.032 | 1.45 |
63n | No | 0.046 | 0.4 | -37 | 0 | 2.9 | 0.57 | 0.086 | 0.14 | - |
64e | No | 0.5 | 0.28 | -37 | 0 | 20 | 0.18 | 0.002 | 0.032 | 1.61 |
64n | No | 0.5 | 0.28 | -37 | 0 | 13 | 0.23 | 0.00065 | 0.029 | 1.37 |
65e | No | 0.52 | 0.35 | -37 | 0 | 8.6 | 0.13 | 0.00065 | 0.05 | 1.45 |
65n | No | 0.55 | 0.35 | -37 | 0 | 7.9 | 0.054 | 0.0013 | 0.042 | 1.44 |
66e | No | 0.54 | 0.35 | -37 | 0 | 16 | 0.072 | 0.00098 | 0.046 | 1.48 |
66n | No | 0.57 | 0.35 | -37 | 0 | 14 | 0.057 | 0.0013 | 0.039 | 1.73 |
67e | No | 0.55 | 0.34 | -37 | 0 | 11 | 0.13 | 0 | 0.028 | 1.53 |
67n | No | 0.57 | 0.34 | -37 | 0 | 7.5 | 0.17 | 0.00098 | 0.026 | 1.73 |
68e | No | 0.29 | 0.21 | -37 | 0 | 7.2 | 0.98 | 0.00065 | 0.21 | 2.24 |
68n | No | 0.03 | 0.21 | -37 | 1 | 0.27 | 1 | 0.18 | 0.25 | - |
69e | No | 0.51 | 0.3 | -37 | 0 | 8.6 | 0.14 | 0 | 0.031 | 1.81 |
69n | No | 0.53 | 0.3 | -37 | 0 | 8.7 | 0.2 | 0 | 0.033 | 1.74 |
70e | No | 0.56 | 0.33 | -37 | 0 | 11 | 0.18 | 0.00033 | 0.032 | 1.52 |
70n | No | 0.58 | 0.33 | -37 | 0 | 11 | 0.2 | 0 | 0.029 | 1.46 |
71e | No | 0.56 | 0.32 | -37 | 0 | 8.6 | -0.2 | 0.00033 | 0.11 | 1.53 |
71n | No | 0.57 | 0.32 | -37 | 0 | 7.7 | 0.23 | 0 | 0.031 | 1.45 |
72e | No | 0.027 | 0.0029 | -37 | 1 | 0.63 | 0.52 | 0.022 | 0.14 | - |
72n | No | 0.026 | 0.0029 | -37 | 1 | 0.58 | 0.61 | 0.014 | 0.15 | - |
73e | No | 0.56 | 0.32 | -37 | 0 | 15 | 0.12 | 0 | 0.025 | 1.43 |
73n | No | 0.57 | 0.32 | -37 | 0 | 11 | 0.05 | 0 | 0.036 | 1.39 |
74e | No | 0.57 | 0.32 | -37 | 0 | 23 | 0.1 | 0 | 0.025 | 1.39 |
74n | No | 0.58 | 0.32 | -37 | 0 | 12 | 0.17 | 0 | 0.036 | 1.41 |
77e | No | 0.31 | 0.35 | -37 | 0 | 22 | 1.7 | 0.0013 | 0.39 | 1.75 |
77n | No | 0.54 | 0.35 | -37 | 0 | 23 | 0.11 | 0 | 0.034 | 1.33 |
78e | No | 0.35 | 0.32 | -37 | 0 | 17 | 1.1 | 0.0033 | 0.33 | 2.79 |
78n | No | 0.54 | 0.32 | -37 | 0 | 32 | 0.11 | 0.00033 | 0.027 | 1.32 |
79e | No | 0.51 | 0.33 | -37 | 0 | 16 | 0.26 | 0.0016 | 0.035 | 1.46 |
79n | No | 0.54 | 0.33 | -37 | 0 | 24 | 0.18 | 0.00065 | 0.023 | 1.35 |
80e | No | 0.5 | 0.37 | -37 | 0 | 23 | 0.16 | 0.0046 | 0.025 | 1.5 |
80n | No | 0.05 | 0.37 | -37 | 0 | 2.9 | 0.61 | 0.043 | 0.15 | - |
81e | No | 0.49 | 0.38 | -37 | 0 | 10 | 0.099 | 0 | 0.027 | 1.37 |
81n | No | 0.039 | 0.38 | -37 | 1 | 0.92 | 0.6 | 0.061 | 0.15 | - |
82e | No | 0.52 | 0.34 | -37 | 0 | 9.4 | 0.11 | 0.00033 | 0.072 | 1.43 |
82n | No | 0.39 | 0.34 | -37 | 0 | 1.6 | 0.34 | 0 | 0.077 | 1.33 |
83e | No | 0.53 | 0.33 | -37 | 0 | 9.8 | 0.11 | 0 | 0.023 | 1.44 |
83n | No | 0.55 | 0.33 | -37 | 0 | 9.4 | 0.17 | 0.00065 | 0.034 | 1.47 |
84e | No | 0.17 | 0.097 | -37 | 0 | 0.33 | 0.82 | 0.058 | 0.24 | - |
84n | No | 0.036 | 0.097 | -37 | 1 | 0.28 | 0.93 | 0.11 | 0.26 | - |
85e | No | 0.55 | 0.34 | -37 | 0 | 9.9 | 0.079 | 0 | 0.027 | 1.51 |
85n | No | 0.58 | 0.34 | -37 | 0 | 8.7 | 0.11 | 0.0016 | 0.027 | 1.46 |
86e | No | 0.54 | 0.32 | -37 | 0 | 5.9 | 0.12 | 0.0013 | 0.04 | 1.63 |
86n | No | 0.56 | 0.32 | -37 | 0 | 6.8 | 0.19 | 0.0013 | 0.03 | 1.47 |
87e | No | 0.56 | 0.32 | -37 | 0 | 11 | -0.18 | 0.0016 | 0.11 | 1.67 |
87n | No | 0.58 | 0.32 | -37 | 0 | 11 | -0.16 | 0.00065 | 0.11 | 1.57 |
88e | No | 0.56 | 0.32 | -37 | 0 | 9.2 | 0.099 | 0.0013 | 0.041 | 1.53 |
88n | No | 0.58 | 0.32 | -37 | 0 | 8 | 0.075 | 0 | 0.033 | 1.48 |
89e | No | 0.57 | 0.33 | -37 | 0 | 9.6 | 0.085 | 0 | 0.039 | 1.63 |
89n | No | 0.59 | 0.33 | -37 | 0 | 8.2 | 0.11 | 0 | 0.034 | 1.53 |
90e | No | 0.56 | 0.32 | -37 | 0 | 8 | 0.095 | 0.0013 | 0.029 | 1.41 |
90n | No | 0.57 | 0.32 | -37 | 0 | 7.1 | 0.18 | 0.00065 | 0.022 | 1.38 |
91e | No | 0.55 | 0.33 | -37 | 0 | 9.1 | 0.11 | 0.00033 | 0.031 | 1.41 |
91n | No | 0.57 | 0.33 | -37 | 0 | 9.5 | 0.13 | 0 | 0.031 | 1.41 |
92e | No | 0.23 | 0.058 | -37 | 0 | 9.5 | 1.5 | 0.00033 | 0.35 | 1.6 |
92n | No | 0.19 | 0.058 | -37 | 0 | 8.6 | 1.7 | 0.00098 | 0.4 | - |
93e | No | 0.54 | 0.34 | -37 | 0 | 5.4 | 0.27 | 0.0085 | 0.05 | 1.37 |
93n | No | 0.57 | 0.34 | -37 | 0 | 12 | 0.25 | 0 | 0.043 | 1.36 |
94e | No | 0.033 | 0.0033 | -37 | 1 | 0.66 | 0.56 | 0.02 | 0.15 | - |
94n | No | 0.026 | 0.0033 | -37 | 1 | 0.65 | 0.58 | 0.023 | 0.15 | - |
95e | No | 0.51 | 0.33 | -37 | 0 | 19 | 0.26 | 0.00033 | 0.032 | 1.44 |
95n | No | 0.54 | 0.33 | -37 | 0 | 30 | 0.17 | 0 | 0.02 | 1.33 |
96e | No | 0.032 | 0.0029 | -37 | 0 | 3.1 | 0.56 | 0.043 | 0.15 | - |
96n | No | 0.041 | 0.0029 | -37 | 0 | 2.8 | 0.6 | 0.028 | 0.15 | - |
97e | No | 0.5 | 0.32 | -37 | 0 | 17 | 0.18 | 0.0052 | 0.016 | 1.54 |
97n | No | 0.37 | 0.32 | -37 | 0 | 4.7 | 0.48 | 0.024 | 0.1 | 1.51 |
101e | No | 0.54 | 0.33 | -37 | 0 | 11 | -0.22 | 0 | 0.1 | 1.48 |
101n | No | 0.56 | 0.33 | -37 | 0 | 7.6 | -0.19 | 0.00098 | 0.1 | 1.4 |
102e | No | 0.56 | 0.33 | -37 | 0 | 19 | 0.12 | 0 | 0.024 | 1.52 |
102n | No | 0.58 | 0.33 | -37 | 0 | 16 | 0.22 | 0 | 0.045 | 1.45 |
103e | No | 0.51 | 0.35 | -37 | 0 | 1.8 | 0.3 | 0.041 | 0.058 | 1.63 |
103n | No | 0.59 | 0.35 | -37 | 0 | 13 | -0.086 | 0.0039 | 0.089 | 1.47 |
104e | No | 0.57 | 0.32 | -37 | 0 | 12 | -0.17 | 0.00065 | 0.087 | 1.58 |
104n | No | 0.55 | 0.32 | -37 | 1 | 1.7 | 2 | 0.0059 | 0.51 | 1.57 |
105e | No | 0.57 | 0.32 | -37 | 0 | 9.7 | 0.11 | 0.00033 | 0.034 | 1.58 |
105n | No | 0.58 | 0.32 | -37 | 0 | 8 | 0.11 | 0 | 0.03 | 1.51 |
106e | No | 0.56 | 0.32 | -37 | 0 | 7.4 | 0.071 | 0.0042 | 0.029 | 1.58 |
106n | No | 0.58 | 0.32 | -37 | 0 | 7.5 | 0.059 | 0.00065 | 0.036 | 1.56 |
107e | No | 0.57 | 0.32 | -37 | 0 | 13 | 0.25 | 0.0078 | 0.065 | 1.59 |
107n | No | 0.59 | 0.32 | -37 | 0 | 13 | 0.16 | 0.0039 | 0.059 | 1.53 |
108e | No | 0.038 | 0.13 | -37 | 0 | 0.7 | 0.52 | 0.05 | 0.14 | - |
108n | No | 0.23 | 0.13 | -37 | 0 | 10 | 1.4 | 0.0023 | 0.37 | 1.91 |
109e | No | 0.025 | 0.002 | -37 | 0 | 0.69 | 0.51 | 0.018 | 0.14 | - |
109n | No | 0.027 | 0.002 | -37 | 0 | 0.67 | 0.56 | 0.054 | 0.14 | - |
110e | No | 0.023 | 0.0027 | -37 | 1 | 0.3 | 1.1 | 0.041 | 0.24 | - |
110n | No | 0.027 | 0.0027 | -37 | 1 | 0.29 | 1 | 0.052 | 0.24 | - |
111e | No | 0.54 | 0.39 | -37 | 0 | 8.7 | 0.12 | 0.00033 | 0.03 | 1.34 |
111n | No | 0.035 | 0.39 | -37 | 0 | 0.65 | 0.56 | 0.05 | 0.15 | - |
112e | No | 0.54 | 0.33 | -37 | 0 | 9.4 | 0.13 | 0.00033 | 0.06 | 1.39 |
112n | No | 0.56 | 0.33 | -37 | 0 | 10 | 0.18 | 0.00033 | 0.028 | 1.33 |
113e | No | 0.035 | 0.0032 | -37 | 0 | 3.2 | 0.59 | 0.031 | 0.15 | - |
113n | No | 0.031 | 0.0032 | -37 | 0 | 2.9 | 0.6 | 0.024 | 0.15 | - |
114e | No | 0.49 | 0.33 | -37 | 0 | 17 | 0.23 | 0.0023 | 0.031 | 1.44 |
114n | No | 0.53 | 0.33 | -37 | 0 | 23 | 0.17 | 0 | 0.036 | 1.39 |
115e | No | 0.48 | 0.32 | -37 | 0 | 18 | 0.18 | 0.0023 | 0.02 | 1.38 |
115n | No | 0.52 | 0.32 | -37 | 0 | 21 | 0.2 | 0.00033 | 0.024 | 1.37 |
117e | No | 0.027 | 0.0048 | -37 | 0 | 0.68 | 0.55 | 0.029 | 0.14 | - |
117n | No | 0.034 | 0.0048 | -37 | 0 | 0.58 | 0.63 | 0.092 | 0.15 | - |
118e | No | 0.52 | 0.35 | -37 | 0 | 10 | 0.24 | 0.00033 | 0.041 | 1.42 |
118n | No | 0.55 | 0.35 | -37 | 0 | 8.9 | 0.18 | 0.00033 | 0.047 | 1.34 |
120e | No | 0.54 | 0.34 | -37 | 0 | 5.1 | 0.18 | 0.00065 | 0.08 | 1.5 |
120n | No | 0.58 | 0.34 | -37 | 0 | 14 | 0.1 | 0 | 0.053 | 1.43 |
121e | No | 0.57 | 0.31 | -37 | 0 | 14 | 0.18 | 0.0033 | 0.059 | 1.47 |
121n | No | 0.55 | 0.31 | -37 | 0 | 2.1 | 0.0025 | 0.0081 | 0.06 | 1.39 |
122e | No | 0.57 | 0.33 | -37 | 0 | 8.6 | -0.21 | 0.0016 | 0.11 | 1.53 |
122n | No | 0.59 | 0.33 | -37 | 1 | 8.3 | -0.14 | 0.00033 | 0.093 | 1.44 |
123e | No | 0.57 | 0.33 | -37 | 0 | 8.4 | -0.17 | 0 | 0.096 | 1.51 |
123n | No | 0.58 | 0.33 | -37 | 0 | 7.6 | -0.19 | 0.0016 | 0.1 | 1.45 |
124e | No | 0.58 | 0.33 | -37 | 0 | 9.8 | 0.11 | 0 | 0.028 | 1.53 |
124n | No | 0.59 | 0.33 | -37 | 0 | 8.7 | 0.22 | 0 | 0.034 | 1.46 |
125e | No | 0.57 | 0.33 | -37 | 0 | 11 | 0.1 | 0.00033 | 0.028 | 1.59 |
125n | No | 0.59 | 0.33 | -37 | 0 | 8.1 | 0.14 | 0 | 0.027 | 1.5 |
126e | No | 0.46 | 0.33 | -37 | 0 | 10 | 0.97 | 0 | 0.25 | 2.09 |
126n | No | 0.58 | 0.33 | -37 | 1 | 6.7 | -0.12 | 0.00065 | 0.075 | 1.46 |
127e | No | 0.56 | 0.34 | -37 | 0 | 9.3 | 0.12 | 0.0013 | 0.03 | 1.47 |
127n | No | 0.58 | 0.34 | -37 | 0 | 9.5 | 0.13 | 0 | 0.031 | 1.46 |
128e | No | 0.032 | 0.0029 | -37 | 0 | 0.68 | 0.48 | 0.0081 | 0.14 | - |
128n | No | 0.029 | 0.0029 | -37 | 1 | 0.64 | 0.55 | 0.02 | 0.14 | - |
131e | No | 0.53 | 0.37 | -37 | 0 | 24 | 0.17 | 0.0013 | 0.02 | 1.45 |
131n | No | 0.18 | 0.37 | -37 | 0 | 3 | 0.58 | 0 | 0.14 | - |
132e | No | 0.51 | 0.32 | -37 | 0 | 22 | 0.18 | 0.00033 | 0.019 | 1.48 |
132n | No | 0.53 | 0.32 | -37 | 0 | 16 | 0.27 | 0.00065 | 0.037 | 1.35 |
133e | No | 0.054 | 0.38 | -37 | 0 | 3.3 | 0.57 | 0.045 | 0.15 | - |
133n | No | 0.51 | 0.38 | -37 | 0 | 15 | 0.22 | 0.0052 | 0.021 | 1.34 |
135e | Yes | -37 | 1.5E+03 | 0 | 0 | 0 | INF | - | ||
135n | Yes | -37 | 1.5E+03 | 0 | 0 | 0 | INF | - | ||
136e | Yes | -37 | 1.5E+03 | 0 | 0 | 0 | INF | - | ||
136n | Yes | -37 | 1.5E+03 | 0 | 0 | 0 | INF | - | ||
137e | No | 0.5 | 0.34 | -37 | 0 | 10 | 0.2 | 0.0016 | 0.032 | 1.43 |
137n | No | 0.54 | 0.34 | -37 | 0 | 15 | 0.13 | 0.00065 | 0.022 | 1.31 |
139e | No | 0.53 | 0.32 | -37 | 0 | 34 | 0.12 | 0.00033 | 0.043 | 1.56 |
139n | No | 0.55 | 0.32 | -37 | 0 | 19 | 0.2 | 0 | 0.026 | 1.45 |
140e | No | 0.56 | 0.34 | -37 | 0 | 13 | 0.14 | 0.0029 | 0.039 | 1.55 |
140n | No | 0.59 | 0.34 | -37 | 0 | 22 | 0.11 | 0 | 0.021 | 1.43 |
141e | No | 0.56 | 0.34 | -37 | 0 | 12 | 0.16 | 0.00033 | 0.02 | 1.51 |
141n | No | 0.59 | 0.34 | -37 | 0 | 29 | 0.11 | 0 | 0.015 | 1.4 |
142e | No | 0.57 | 0.46 | -37 | 0 | 13 | 0.16 | 0.00033 | 0.038 | 1.57 |
142n | No | 0.047 | 0.46 | -37 | 1 | 0.63 | 0.56 | 0.035 | 0.14 | - |
143e | No | 0.57 | 0.47 | -37 | 0 | 8.3 | 0.2 | 0 | 0.023 | 1.54 |
143n | No | 0.04 | 0.47 | -37 | 0 | 0.62 | 0.58 | 0.057 | 0.14 | - |
144e | No | 0.58 | 0.34 | -37 | 0 | 14 | 0.12 | 0 | 0.03 | 1.59 |
144n | No | 0.6 | 0.34 | -37 | 0 | 9.5 | 0.14 | 0.00033 | 0.037 | 1.45 |
145e | No | 0.58 | 0.35 | -37 | 0 | 13 | 0.12 | 0 | 0.029 | 1.64 |
145n | No | 0.54 | 0.35 | -37 | 1 | 2.2 | 0.26 | 0.016 | 0.04 | 1.45 |
146e | No | 0.039 | 0.43 | -37 | 0 | 3.2 | 0.56 | 0.021 | 0.15 | - |
146n | No | 0.57 | 0.43 | -37 | 0 | 24 | 0.17 | 0 | 0.022 | 1.57 |
147e | No | 0.54 | 0.32 | -37 | 0 | 7.1 | 0.17 | 0.00033 | 0.023 | 1.42 |
147n | No | 0.56 | 0.32 | -37 | 0 | 5.7 | 0.17 | 0 | 0.017 | 1.41 |
148e | No | 0.55 | 0.33 | -37 | 0 | 12 | 0.12 | 0 | 0.021 | 1.45 |
148n | No | 0.57 | 0.33 | -37 | 0 | 12 | 0.082 | 0 | 0.03 | 1.42 |
149e | No | 0.54 | 0.34 | -37 | 0 | 14 | 0.18 | 0 | 0.033 | 1.44 |
149n | No | 0.57 | 0.34 | -37 | 0 | 18 | 0.13 | 0.00033 | 0.02 | 1.41 |
150e | No | 0.53 | 0.34 | -37 | 0 | 18 | 0.094 | 0.00033 | 0.026 | 1.42 |
150n | No | 0.56 | 0.34 | -37 | 0 | 18 | 0.13 | 0.00033 | 0.024 | 1.4 |
151e | No | 0.39 | 0.3 | -37 | 0 | 22 | 0.9 | 0.0016 | 0.23 | 2.4 |
151n | No | 0.5 | 0.3 | -37 | 0 | 9.5 | 0.23 | 0 | 0.031 | 1.36 |
155e | Yes | -37 | 1.5E+03 | 0 | 0 | 0 | INF | - | ||
155n | Yes | -37 | 1.5E+03 | 0 | 0 | 0 | INF | - | ||
156e | No | 0.27 | 0.2 | -37 | 0 | 0.92 | 0.36 | 0.027 | 0.095 | 1.67 |
156n | No | 0.04 | 0.2 | -37 | 1 | 0.66 | 0.55 | 0.057 | 0.15 | - |
157e | No | 0.52 | 0.33 | -37 | 0 | 10 | 0.09 | 0.0029 | 0.03 | 1.39 |
157n | No | 0.54 | 0.33 | -37 | 0 | 8.6 | 0.16 | 0.00098 | 0.027 | 1.37 |
158e | No | 0.54 | 0.34 | -37 | 0 | 11 | 0.12 | 0.0039 | 0.033 | 1.41 |
158n | No | 0.56 | 0.34 | -37 | 0 | 12 | 0.18 | 0.0036 | 0.031 | 1.37 |
159e | No | 0.51 | 0.29 | -37 | 0 | 15 | 0.2 | 0.00033 | 0.03 | 1.47 |
159n | No | 0.41 | 0.29 | -37 | 0 | 15 | 1 | 0.0023 | 0.26 | 2.42 |
160e | No | 0.56 | 0.34 | -37 | 0 | 11 | 0.1 | 0.0026 | 0.024 | 1.55 |
160n | No | 0.58 | 0.34 | -37 | 0 | 13 | 0.17 | 0.00033 | 0.028 | 1.39 |
161e | No | 0.57 | 0.3 | -37 | 0 | 10 | 0.16 | 0.00033 | 0.027 | 1.57 |
161n | No | 0.46 | 0.3 | -37 | 1 | 14 | 1 | 0.00033 | 0.26 | 2.93 |
162e | No | 0.57 | 0.34 | -37 | 0 | 20 | 0.19 | 0.00033 | 0.034 | 1.76 |
162n | No | 0.59 | 0.34 | -37 | 0 | 18 | 0.15 | 0 | 0.026 | 1.49 |
163e | No | 0.57 | 0.33 | -37 | 0 | 11 | 0.053 | 0.00065 | 0.029 | 1.61 |
163n | No | 0.59 | 0.33 | -37 | 0 | 9.4 | 0.065 | 0 | 0.038 | 1.46 |
164e | No | 0.56 | 0.32 | -37 | 0 | 6.7 | 0.17 | 0.00033 | 0.021 | 1.69 |
164n | No | 0.58 | 0.32 | -37 | 0 | 11 | 0.096 | 0 | 0.033 | 1.55 |
165e | No | 0.41 | 0.33 | -37 | 0 | 5.5 | 1.1 | 0 | 0.28 | 2.41 |
165n | No | 0.58 | 0.33 | -37 | 0 | 8.8 | 0.11 | 0.00033 | 0.027 | 1.59 |
166e | No | 0.56 | 0.32 | -37 | 0 | 8.6 | 0.085 | 0.0016 | 0.025 | 9.7 |
166n | No | 0.57 | 0.32 | -37 | 0 | 4.7 | 0.088 | 0.00033 | 0.028 | 8.02 |
167e | No | 0.55 | 0.33 | -37 | 0 | 15 | 0.094 | 0.00065 | 0.027 | 1.44 |
167n | No | 0.57 | 0.33 | -37 | 0 | 10 | 0.14 | 0.00033 | 0.023 | 1.43 |
168e | No | 0.54 | 0.34 | -37 | 0 | 9.8 | 0.14 | 0 | 0.02 | 1.46 |
168n | No | 0.57 | 0.34 | -37 | 0 | 11 | 0.14 | 0.00033 | 0.026 | 1.43 |
169e | No | 0.55 | 0.34 | -37 | 0 | 13 | 0.086 | 0.00065 | 0.021 | 1.44 |
169n | No | 0.57 | 0.34 | -37 | 0 | 17 | 0.11 | 0 | 0.023 | 1.42 |
170e | No | 0.039 | 0.43 | -37 | 0 | 0.66 | 0.55 | 0.022 | 0.14 | - |
170n | No | 0.56 | 0.43 | -37 | 0 | 14 | 0.19 | 0.00033 | 0.03 | 1.4 |
171e | No | 0.49 | 0.3 | -37 | 0 | 14 | 0.19 | 0.00033 | 0.031 | 1.44 |
171n | No | 0.48 | 0.3 | -37 | 0 | 8.2 | 0.3 | 0.00033 | 0.051 | 1.42 |
173e | No | 0.04 | 0.0055 | -37 | 0 | 3.5 | 0.6 | 0.13 | 0.15 | - |
173n | No | 0.048 | 0.0055 | -37 | 0 | 3.2 | 0.59 | 0.042 | 0.15 | - |
179e | No | 0.53 | 0.33 | -37 | 0 | 11 | 0.21 | 0.00098 | 0.03 | 1.48 |
179n | No | 0.55 | 0.33 | -37 | 0 | 6 | 0.22 | 0.00033 | 0.031 | 1.35 |
180e | No | 0.55 | 0.45 | -37 | 0 | 11 | 0.18 | 0.051 | 0.033 | 1.99 |
180n | No | 0.056 | 0.45 | -37 | 0 | 0.61 | 0.59 | 0.053 | 0.15 | - |
181e | No | 0.56 | 0.33 | -37 | 0 | 9.8 | 0.13 | 0.00098 | 0.033 | 1.66 |
181n | No | 0.57 | 0.33 | -37 | 0 | 9.2 | 0.19 | 0 | 0.031 | 1.41 |
182e | No | 0.58 | 0.44 | -37 | 0 | 16 | 0.14 | 0.002 | 0.034 | 1.74 |
182n | No | 0.049 | 0.44 | -37 | 0 | 0.67 | 0.55 | 0.029 | 0.14 | - |
183e | No | 0.56 | 0.33 | -37 | 0 | 11 | 0.058 | 0 | 0.033 | 1.78 |
183n | No | 0.58 | 0.33 | -37 | 0 | 8.2 | 0.14 | 0 | 0.039 | 1.44 |
184e | No | 0.56 | 0.32 | -37 | 0 | 12 | 0.12 | 0.00098 | 0.022 | 9.5 |
184n | No | 0.58 | 0.32 | -37 | 0 | 11 | 0.18 | 0.00098 | 0.027 | 10.2 |
185e | No | 0.41 | 0.34 | -37 | 0 | 3.9 | 1.1 | 0.0065 | 0.29 | 6.27 |
185n | No | 0.58 | 0.34 | -37 | 0 | 9.9 | 0.12 | 0 | 0.027 | 7.95 |
186e | No | 0.57 | 0.34 | -37 | 0 | 16 | 0.12 | 0.00033 | 0.023 | 2.02 |
186n | No | 0.59 | 0.34 | -37 | 0 | 22 | 0.12 | 0 | 0.015 | 1.61 |
187e | No | 0.57 | 0.34 | -37 | 0 | 14 | 0.088 | 0 | 0.026 | 1.6 |
187n | No | 0.59 | 0.34 | -37 | 0 | 12 | 0.14 | 0.00033 | 0.031 | 1.51 |
189e | No | 0.028 | 0.00081 | -37 | 0 | 0.8 | 0.44 | 0.024 | 0.13 | - |
189n | No | 0.031 | 0.00081 | -37 | 0 | 0.66 | 0.54 | 0.032 | 0.15 | - |
190e | No | 0.54 | 0.34 | -37 | 0 | 12 | 0.18 | 0.00033 | 0.023 | 1.53 |
190n | No | 0.57 | 0.34 | -37 | 0 | 26 | 0.13 | 0.00033 | 0.011 | 1.46 |
191e | No | 0.53 | 0.33 | -37 | 0 | 7.3 | 0.15 | 0.00033 | 0.02 | 1.49 |
191n | No | 0.56 | 0.33 | -37 | 0 | 12 | 0.23 | 0.00033 | 0.039 | 1.47 |
192e | No | 0.48 | 0.32 | -37 | 0 | 77 | 0.033 | 0 | 0.11 | 2.26 |
192n | No | 0.51 | 0.32 | -37 | 0 | 79 | 0.029 | 0 | 0.12 | 2.18 |
193e | No | 0.47 | 0.36 | -37 | 0 | 78 | 0.026 | 0 | 0.12 | 1.69 |
193n | No | 0.53 | 0.36 | -37 | 0 | 32 | 0.17 | 0 | 0.027 | 1.32 |
200e | No | 0.043 | 0.11 | -37 | 0 | 3.1 | 0.58 | 0.066 | 0.15 | - |
200n | No | 0.17 | 0.11 | -37 | 0 | 32 | 1.3 | 0.00033 | 0.34 | - |
201e | No | 0.54 | 0.32 | -37 | 0 | 50 | 0.096 | 0 | 0.058 | 1.83 |
201n | No | 0.54 | 0.32 | -37 | 0 | 69 | 0.041 | 0 | 0.099 | 1.66 |
202e | No | 0.55 | 0.32 | -37 | 0 | 36 | 0.15 | 0 | 0.032 | 1.66 |
202n | No | 0.55 | 0.32 | -37 | 0 | 15 | 0.27 | 0.025 | 0.033 | 1.7 |
205e | No | 0.54 | 0.31 | -37 | 0 | 24 | 0.12 | 0.00033 | 0.041 | 1.98 |
205n | No | 0.53 | 0.31 | -37 | 0 | 12 | 0.24 | 0.022 | 0.049 | 2.42 |
206e | No | 0.54 | 0.32 | -37 | 0 | 31 | 0.12 | 0 | 0.035 | 1.91 |
206n | No | 0.55 | 0.32 | -37 | 0 | 19 | 0.18 | 0 | 0.037 | 1.62 |
207e | No | 0.52 | 0.31 | -37 | 0 | 32 | 0.17 | 0.0026 | 0.048 | 1.8 |
207n | No | 0.54 | 0.31 | -37 | 0 | 25 | 0.29 | 0.00033 | 0.054 | 1.6 |
208e | No | 0.033 | -0.0009 | -37 | 0 | 0.82 | 0.11 | 0.063 | 0.13 | - |
208n | No | 0.036 | -0.0009 | -37 | 1 | 0.46 | 0.015 | 0.14 | 0.16 | - |
209e | No | 0.042 | 0.0009 | -37 | 0 | 0.87 | 0.11 | 0.034 | 0.13 | - |
209n | No | 0.042 | 0.0009 | -37 | 0 | 0.84 | 0.076 | 0.04 | 0.14 | - |
210e | No | 0.54 | 0.34 | -37 | 0 | 12 | -0.29 | 0.00033 | 0.13 | 2.08 |
210n | No | 0.56 | 0.34 | -37 | 0 | 13 | -0.2 | 0.00033 | 0.12 | 1.42 |
211e | No | 0.5 | 0.34 | -37 | 0 | 18 | 0.25 | 0.0013 | 0.029 | 1.44 |
211n | No | 0.54 | 0.34 | -37 | 0 | 25 | 0.15 | 0 | 0.015 | 1.39 |
220e | No | 0.54 | 0.33 | -37 | 0 | 26 | 0.17 | 0.0039 | 0.016 | 1.49 |
220n | No | 0.55 | 0.33 | -37 | 0 | 22 | 0.14 | 0 | 0.016 | 1.44 |
221e | No | 0.52 | 0.33 | -37 | 0 | 17 | 0.22 | 0.0029 | 0.032 | 1.53 |
221n | No | 0.56 | 0.33 | -37 | 0 | 20 | 0.22 | 0 | 0.021 | 1.41 |
222e | No | 0.53 | 0.33 | -37 | 0 | 23 | 0.23 | 0.0013 | 0.029 | 1.55 |
222n | No | 0.57 | 0.33 | -37 | 0 | 25 | 0.19 | 0 | 0.028 | 1.39 |
223e | No | 0.51 | 0.33 | -37 | 0 | 15 | 0.18 | 0.00065 | 0.033 | 1.6 |
223n | No | 0.55 | 0.33 | -37 | 0 | 23 | 0.1 | 0 | 0.037 | 1.52 |
224e | No | 0.5 | 0.31 | -37 | 0 | 83 | 0.018 | 0 | 0.12 | 2.19 |
224n | No | 0.53 | 0.31 | -37 | 0 | 81 | 0.024 | 0 | 0.12 | 1.98 |
225e | No | 0.53 | 0.43 | -37 | 0 | 30 | 0.12 | 0.00033 | 0.035 | 1.7 |
225n | No | 0.088 | 0.43 | -37 | 0 | 3.1 | 0.58 | 0.035 | 0.14 | - |
226e | No | 0.53 | 0.33 | -37 | 0 | 24 | 0.12 | 0 | 0.024 | 1.56 |
226n | No | 0.56 | 0.33 | -37 | 0 | 33 | 0.12 | 0 | 0.033 | 1.45 |
227e | No | 0.49 | 0.31 | -37 | 0 | 16 | 0.25 | 0.00065 | 0.048 | 1.6 |
227n | No | 0.53 | 0.31 | -37 | 0 | 24 | 0.2 | 0.00033 | 0.029 | 1.54 |
228e | No | 0.44 | 0.24 | -37 | 0 | 12 | 0.49 | 0.00033 | 0.1 | 1.64 |
228n | No | 0.41 | 0.24 | -37 | 0 | 23 | 0.82 | 0.00033 | 0.18 | 2.36 |
229e | No | 0.5 | 0.33 | -37 | 0 | 35 | 0.15 | 0 | 0.039 | 1.55 |
229n | No | 0.53 | 0.33 | -37 | 0 | 34 | 0.11 | 0 | 0.03 | 1.6 |
237e | No | 0.47 | 0.34 | -37 | 0 | 11 | 0.27 | 0.0016 | 0.038 | 1.41 |
237n | No | 0.53 | 0.34 | -37 | 0 | 16 | 0.22 | 0 | 0.025 | 1.38 |
238e | No | 0.53 | 0.33 | -37 | 0 | 30 | 0.12 | 0.00065 | 0.034 | 1.45 |
238n | No | 0.56 | 0.33 | -37 | 0 | 28 | 0.2 | 0 | 0.018 | 1.43 |
239e | No | 0.52 | 0.33 | -37 | 0 | 23 | 0.15 | 0.00033 | 0.017 | 1.46 |
239n | No | 0.55 | 0.33 | -37 | 0 | 27 | 0.13 | 0 | 0.017 | 1.38 |
240e | No | 0.4 | 0.19 | -37 | 0 | 28 | 0.92 | 0.0023 | 0.23 | 2.8 |
240n | No | 0.34 | 0.19 | -37 | 0 | 42 | 1.6 | 0.0026 | 0.36 | 2.61 |
241e | No | 0.52 | 0.32 | -37 | 0 | 19 | 0.14 | 0.00098 | 0.039 | 1.66 |
241n | No | 0.5 | 0.32 | -37 | 0 | 8.8 | 0.28 | 0 | 0.055 | 1.63 |
242e | No | 0.39 | 0.34 | -37 | 0 | 27 | 0.94 | 0.00065 | 0.24 | 2.67 |
242n | No | 0.56 | 0.34 | -37 | 0 | 36 | 0.1 | 0 | 0.044 | 1.6 |
243e | No | 0.21 | 0.42 | -37 | 0 | 25 | 2.1 | 0.0046 | 0.48 | 1.66 |
243n | No | 0.54 | 0.42 | -37 | 0 | 17 | 0.21 | 0.00033 | 0.044 | 1.64 |
244e | No | 0.41 | 0.32 | -37 | 0 | 6.9 | 0.36 | 0.015 | 0.071 | 1.52 |
244n | No | 0.5 | 0.32 | -37 | 0 | 12 | 0.29 | 0.00065 | 0.041 | 1.46 |
245e | No | 0.51 | 0.32 | -37 | 0 | 25 | 0.17 | 0.00033 | 0.027 | 1.55 |
245n | No | 0.52 | 0.32 | -37 | 0 | 19 | 0.29 | 0.00065 | 0.041 | 1.42 |
246e | No | 0.25 | 0.1 | -37 | 0 | 19 | 0.53 | 0 | 0.11 | 2 |
246n | No | 0.26 | 0.1 | -37 | 0 | 24 | 0.45 | 0 | 0.094 | 2 |
261e | No | 0.5 | 0.32 | -37 | 0 | 29 | 0.11 | 0 | 0.038 | 1.57 |
261n | No | 0.52 | 0.32 | -37 | 0 | 22 | 0.18 | 0.00033 | 0.033 | 1.42 |
262e | No | 0.034 | 0.0055 | -37 | 0 | 0.84 | 0.13 | 0.021 | 0.13 | - |
262n | No | 0.029 | 0.0055 | -37 | 0 | 0.72 | 0.088 | 0.032 | 0.14 | - |
320e | No | 0.25 | 0.17 | -37 | 0 | 2.5 | 0.52 | 0.065 | 0.12 | - |
320n | No | 0.047 | 0.17 | -37 | 0 | 1.6 | 0.58 | 0.12 | 0.15 | - |
324e | No | 0.44 | 0.33 | -37 | 0 | 31 | 0.12 | 0.0016 | 0.035 | - |
324n | No | 0.48 | 0.33 | -37 | 0 | 36 | 0.12 | 0.00098 | 0.048 | - |
325e | No | 0.45 | 0.31 | -37 | 0 | 32 | 0.1 | 0.0023 | 0.029 | - |
325n | No | 0.47 | 0.31 | -37 | 0 | 17 | 0.2 | 0.00098 | 0.021 | - |
329e | No | 0.37 | 0.34 | -37 | 0 | 7.9 | 0.36 | 0.0068 | 0.066 | - |
329n | No | 0.47 | 0.34 | -37 | 0 | 19 | 0.19 | 0.0026 | 0.021 | - |
333e | No | 0.39 | 0.31 | -37 | 0 | 12 | 0.3 | 0.015 | 0.054 | - |
333n | No | 0.45 | 0.31 | -37 | 0 | 16 | 0.32 | 0.0033 | 0.051 | - |
# Save antenna classification table as a csv
if SAVE_RESULTS:
for ind, col in zip(np.arange(len(df.columns), 0, -1), df_classes.columns[::-1]):
df.insert(int(ind), col + ' Class', df_classes[col])
df.to_csv(ANTCLASS_FILE)
print('Final Ant-Pol Classification:\n\n', final_class)
Final Ant-Pol Classification: Jee: ---------- good (104 antpols): 5, 7, 8, 10, 17, 19, 20, 21, 22, 30, 31, 35, 37, 38, 41, 43, 44, 45, 46, 48, 49, 50, 53, 56, 60, 61, 62, 63, 64, 65, 66, 67, 69, 70, 73, 74, 79, 80, 81, 83, 85, 86, 88, 89, 90, 91, 93, 95, 97, 102, 105, 106, 111, 112, 114, 115, 118, 121, 124, 125, 127, 131, 132, 137, 140, 141, 142, 143, 144, 145, 147, 148, 149, 150, 157, 158, 159, 160, 161, 162, 163, 164, 167, 168, 169, 171, 179, 181, 182, 183, 187, 190, 191, 211, 220, 221, 223, 226, 227, 237, 239, 241, 245, 261 suspect (26 antpols): 4, 9, 36, 52, 71, 82, 87, 101, 104, 107, 120, 122, 123, 139, 186, 202, 205, 206, 207, 222, 225, 228, 229, 238, 244, 246 bad (66 antpols): 3, 15, 16, 18, 27, 28, 29, 32, 34, 40, 42, 47, 51, 54, 55, 57, 58, 59, 68, 72, 77, 78, 84, 92, 94, 96, 103, 108, 109, 110, 113, 117, 126, 128, 133, 135, 136, 146, 151, 155, 156, 165, 166, 170, 173, 180, 184, 185, 189, 192, 193, 200, 201, 208, 209, 210, 224, 240, 242, 243, 262, 320, 324, 325, 329, 333 Jnn: ---------- good (101 antpols): 5, 7, 8, 9, 10, 16, 17, 19, 20, 21, 22, 30, 31, 35, 37, 38, 41, 43, 44, 46, 49, 57, 59, 61, 64, 65, 66, 67, 69, 70, 71, 73, 74, 77, 79, 83, 85, 86, 88, 89, 90, 91, 93, 95, 102, 105, 106, 107, 112, 114, 115, 118, 120, 124, 125, 127, 132, 133, 137, 139, 140, 141, 144, 146, 147, 148, 149, 150, 151, 157, 158, 160, 162, 163, 165, 167, 168, 169, 170, 171, 179, 181, 187, 190, 191, 206, 207, 211, 220, 221, 222, 223, 227, 237, 238, 239, 241, 243, 244, 245, 261 suspect (27 antpols): 4, 36, 45, 48, 51, 52, 53, 62, 78, 82, 87, 101, 103, 121, 122, 123, 126, 145, 164, 183, 186, 193, 210, 226, 229, 242, 246 bad (68 antpols): 3, 15, 18, 27, 28, 29, 32, 34, 40, 42, 47, 50, 54, 55, 56, 58, 60, 63, 68, 72, 80, 81, 84, 92, 94, 96, 97, 104, 108, 109, 110, 111, 113, 117, 128, 131, 135, 136, 142, 143, 155, 156, 159, 161, 166, 173, 180, 182, 184, 185, 189, 192, 200, 201, 202, 205, 208, 209, 224, 225, 228, 240, 262, 320, 324, 325, 329, 333
# update flags in omnical gains and visibility solutions
for ant in cal['gf_omnical']:
cal['gf_omnical'][ant] |= rfi_flags
for bl in cal['vf_omnical']:
cal['vf_omnical'][bl] |= rfi_flags
if SAVE_RESULTS:
add_to_history = 'Produced by file_calibration notebook with the following environment:\n' + '=' * 65 + '\n' + os.popen('conda env export').read() + '=' * 65
hd_writer = io.HERAData(SUM_FILE)
redcal._redcal_run_write_results(cal, hd_writer, None, OMNICAL_FILE, OMNIVIS_FILE, None, '', vispols=['ee', 'nn'],
clobber=True, verbose=True, add_to_history=add_to_history)
del hd_writer
malloc_trim()
Now saving omnical gains to /mnt/sn1/2459949/zen.2459949.43938.sum.omni.calfits Now saving omnical visibilities to /mnt/sn1/2459949/zen.2459949.43938.sum.omni_vis.uvh5 File exists; clobbering
OMNICAL_FILE
is not written.¶if SAVE_RESULTS and not os.path.exists(OMNICAL_FILE):
print(f'WARNING: No calibration file produced at {OMNICAL_FILE}. Creating a fully-flagged placeholder calibration file.')
hd_writer = io.HERAData(SUM_FILE)
io.write_cal(OMNICAL_FILE, freqs=hd_writer.freqs, times=hd_writer.times,
gains={ant: np.ones((hd_writer.Ntimes, hd_writer.Nfreqs), dtype=np.complex64) for ant in ants},
flags={ant: np.ones((len(data.times), len(data.freqs)), dtype=bool) for ant in ants},
quality=None, total_qual=None, outdir='', overwrite=True, history=utils.history_string(add_to_history),
x_orientation=hd_writer.x_orientation, telescope_location=hd_writer.telescope_location, lst_array=np.unique(hd_writer.lsts),
antenna_positions=np.array([hd_writer.antenna_positions[hd_writer.antenna_numbers == antnum].flatten() for antnum in set(ant[0] for ant in ants)]),
antnums2antnames=dict(zip(hd_writer.antenna_numbers, hd_writer.antenna_names)))
if SAVE_RESULTS and not os.path.exists(OMNIVIS_FILE):
print(f'WARNING: No omnivis file produced at {OMNIVIS_FILE}.')
for repo in ['hera_cal', 'hera_qm', 'hera_notebook_templates']:
exec(f'from {repo} import __version__')
print(f'{repo}: {__version__}')
hera_cal: 3.1.5.dev215+gd2b157e hera_qm: 2.0.5.dev13+gd6c757c hera_notebook_templates: 0.1
print(f'Finished execution in {(time.time() - tstart) / 60:.2f} minutes.')
Finished execution in 9.53 minutes.