Single File Calibration¶
by Josh Dillon, Aaron Parsons, Tyler Cox, and Zachary Martinot, last updated May 27, 2024
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. Calibration includes redundant-baseline calibration, RFI-based calibration of delay slopes, model-based calibration of overall amplitudes, and a full per-frequency phase gradient absolute calibration if abscal model files are available.
Here's a set of links to skip to particular figures and tables:
• Figure 1: RFI Flagging¶
• Figure 2: Plot of autocorrelations with classifications¶
• Figure 3: Summary of antenna classifications prior to calibration¶
• Figure 4: Redundant calibration of a single baseline group¶
• Figure 5: Absolute calibration of redcal degeneracies¶
• Figure 6: chi^2 per antenna across the array¶
• Figure 7: Summary of antenna classifications after redundant calibration¶
• Table 1: Complete summary of per antenna classifications¶
import time
tstart = time.time()
!hostname
bigmem2.rtp.pvt
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 glob
import re
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_filters import dspec
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
Parse inputs and outputs¶
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"
SAVE_OMNIVIS_FILE = os.environ.get("SAVE_OMNIVIS_FILE", "FALSE").upper() == "TRUE"
# get infile names
SUM_FILE = os.environ.get("SUM_FILE", None)
# SUM_FILE = '/lustre/aoc/projects/hera/h6c-analysis/IDR2/2459866/zen.2459866.33010.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', 'SAVE_RESULTS', 'SAVE_OMNIVIS_FILE']:
print(f"{fname} = '{eval(fname)}'")
SUM_FILE = '/mnt/sn1/data2/2460458/zen.2460458.34464.sum.uvh5' DIFF_FILE = '/mnt/sn1/data2/2460458/zen.2460458.34464.diff.uvh5' AM_FILE = '/mnt/sn1/data2/2460458/zen.2460458.34464.sum.ant_metrics.hdf5' ANTCLASS_FILE = '/mnt/sn1/data2/2460458/zen.2460458.34464.sum.ant_class.csv' OMNICAL_FILE = '/mnt/sn1/data2/2460458/zen.2460458.34464.sum.omni.calfits' OMNIVIS_FILE = '/mnt/sn1/data2/2460458/zen.2460458.34464.sum.omni_vis.uvh5' SAVE_RESULTS = 'True' SAVE_OMNIVIS_FILE = 'False'
Parse settings¶
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", "FALSE").upper() == "TRUE"
OC_MIN_BL_LEN = float(os.environ.get("OC_MIN_BL_LEN", 1))
OC_MAX_BL_LEN = float(os.environ.get("OC_MAX_BL_LEN", 1e100))
OC_MAXITER = int(os.environ.get("OC_MAXITER", 50))
OC_MAX_RERUN = int(os.environ.get("OC_MAX_RERUN", 4))
OC_RERUN_MAXITER = int(os.environ.get("OC_MAXITER", 25))
OC_MAX_CHISQ_FLAGGING_DYNAMIC_RANGE = float(os.environ.get("OC_MAX_CHISQ_FLAGGING_DYNAMIC_RANGE", 1))
OC_USE_PRIOR_SOL = os.environ.get("OC_USE_PRIOR_SOL", "FALSE").upper() == "TRUE"
OC_PRIOR_SOL_FLAG_THRESH = float(os.environ.get("OC_PRIOR_SOL_FLAG_THRESH", .95))
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", 4))
# parse abscal settings
ABSCAL_MODEL_FILES_GLOB = os.environ.get("ABSCAL_MODEL_FILES_GLOB", None)
ABSCAL_MIN_BL_LEN = float(os.environ.get("ABSCAL_MIN_BL_LEN", 1.0))
ABSCAL_MAX_BL_LEN = float(os.environ.get("ABSCAL_MAX_BL_LEN", 140.0))
# print settings
for setting in ['PLOT', 'SAVE_RESULTS', 'OC_MAX_DIMS', 'OC_MIN_DIM_SIZE', 'OC_SKIP_OUTRIGGERS',
'OC_MIN_BL_LEN', 'OC_MAX_BL_LEN', 'OC_MAXITER', 'OC_MAX_RERUN', 'OC_RERUN_MAXITER',
'OC_MAX_CHISQ_FLAGGING_DYNAMIC_RANGE', 'OC_USE_PRIOR_SOL', 'OC_PRIOR_SOL_FLAG_THRESH',
'OC_USE_GPU', 'RFI_DPSS_HALFWIDTH', 'RFI_NSIG', 'ABSCAL_MODEL_FILES_GLOB',
'ABSCAL_MIN_BL_LEN', 'ABSCAL_MAX_BL_LEN']:
print(f'{setting} = {eval(setting)}')
PLOT = True SAVE_RESULTS = True OC_MAX_DIMS = 4 OC_MIN_DIM_SIZE = 8 OC_SKIP_OUTRIGGERS = True OC_MIN_BL_LEN = 1.0 OC_MAX_BL_LEN = 140.0 OC_MAXITER = 40 OC_MAX_RERUN = 5 OC_RERUN_MAXITER = 40 OC_MAX_CHISQ_FLAGGING_DYNAMIC_RANGE = 1.5 OC_USE_PRIOR_SOL = True OC_PRIOR_SOL_FLAG_THRESH = 0.95 OC_USE_GPU = False RFI_DPSS_HALFWIDTH = 3e-07 RFI_NSIG = 4.0 ABSCAL_MODEL_FILES_GLOB = None ABSCAL_MIN_BL_LEN = 1.0 ABSCAL_MAX_BL_LEN = 140.0
Parse bounds¶
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", 60)))
# 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", 1.5)))
auto_rfi_suspect = (0, float(os.environ.get("AUTO_RFI_SUSPECT", 2)))
# bounds on autocorrelation shape
auto_shape_good = (0, float(os.environ.get("AUTO_SHAPE_GOOD", 0.1)))
auto_shape_suspect = (0, float(os.environ.get("AUTO_SHAPE_SUSPECT", 0.2)))
# bound on per-xengine non-noiselike power in diff
bad_xengine_zcut = float(os.environ.get("BAD_XENGINE_ZCUT", 10.0))
# bounds on chi^2 per antenna in omnical
oc_cspa_good = (0, float(os.environ.get("OC_CSPA_GOOD", 2)))
oc_cspa_suspect = (0, float(os.environ.get("OC_CSPA_SUSPECT", 3)))
# 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',
'bad_xengine_zcut', '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, 60.0) auto_slope_good = (-0.4, 0.4) auto_slope_suspect = (-0.6, 0.6) auto_rfi_good = (0, 1.5) auto_rfi_suspect = (0, 2.0) auto_shape_good = (0, 0.1) auto_shape_suspect = (0, 0.2) bad_xengine_zcut = 10.0 oc_cspa_good = (0, 2.0) oc_cspa_suspect = (0, 3.0)
Load sum and diff data¶
read_start = time.time()
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, dtype=np.complex64, fix_autos_func=np.real)
print(f'Finished loading data in {(time.time() - read_start) / 60:.2f} minutes.')
Finished loading data in 0.41 minutes.
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/data2/2460458/zen.2460458.34464.sum.uvh5 JDs: [2460458.34458242 2460458.34469427] (9.66364 s integrations) LSTS: [14.0901335 14.0928252] hours Frequencies: 1536 0.12207 MHz channels from 46.92078 to 234.29871 MHz Antennas: 252 Polarizations: ['nn', 'ee', 'ne', 'en']
Classify good, suspect, and bad antpols¶
Run 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
if np.all([ant_metrics_class[utils.split_bl(bl)[0]] == 'bad' for bl in auto_bls]):
raise ValueError('All antennas are flagged for ant_metrics.')
Mark sun-up (or high solar altitude) data as suspect¶
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])
Classify antennas responsible for 0s in visibilities as bad:¶
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)
if np.all([zeros_class[utils.split_bl(bl)[0]] == 'bad' for bl in auto_bls]):
raise ValueError('All antennas are flagged for too many even/odd zeros.')
Examine and classify autocorrelation power and slope¶
These classifiers look for antennas with too high or low power or to steep a slope.
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)
if np.all([(auto_power_class + auto_slope_class)[utils.split_bl(bl)[0]] == 'bad' for bl in auto_bls]):
raise ValueError('All antennas are flagged for bad autocorrelation power/slope.')
overall_class = auto_power_class + auto_slope_class + zeros_class + ant_metrics_class + solar_class
Find starting set of array flags¶
antenna_flags, array_flags = xrfi.flag_autos(data, flag_method="channel_diff_flagger", nsig=RFI_NSIG * 5,
antenna_class=overall_class, flag_broadcast_thresh=.5)
for key in antenna_flags:
antenna_flags[key] = array_flags
cache = {}
_, array_flags = xrfi.flag_autos(data, freqs=data.freqs, flag_method="dpss_flagger",
nsig=RFI_NSIG, antenna_class=overall_class,
filter_centers=[0], filter_half_widths=[RFI_DPSS_HALFWIDTH],
eigenval_cutoff=[1e-9], flags=antenna_flags, mode='dpss_matrix',
cache=cache, flag_broadcast_thresh=.5)
Classify antennas based on non-noiselike diffs¶
xengine_diff_class = ant_class.non_noiselike_diff_by_xengine_checker(data, diff_data, flag_waterfall=array_flags,
antenna_class=overall_class,
xengine_chans=96, bad_xengine_zcut=bad_xengine_zcut)
overall_class += xengine_diff_class
if np.all([overall_class[utils.split_bl(bl)[0]] == 'bad' for bl in auto_bls]):
raise ValueError('All antennas are flagged after flagging non-noiselike diffs.')
Examine and classify autocorrelation excess RFI and shape, finding consensus RFI mask along the way¶
This classifier iteratively identifies antennas for excess RFI (characterized by RMS of DPSS-filtered autocorrelations after RFI flagging) and bad shape, as determined by a discrepancy with the mean good normalized autocorrelation's shape. Along the way, it iteratively discovers a conensus array-wide RFI mask.
def auto_bl_zscores(data, flag_array, cache={}):
'''This function computes z-score arrays for each delay-filtered autocorrelation, normalized by the expected noise.
Flagged times/channels for the whole array are given 0 weight in filtering and are np.nan in the z-score.'''
zscores = {}
for bl in auto_bls:
wgts = np.array(np.logical_not(flag_array), dtype=np.float64)
model, _, _ = dspec.fourier_filter(hd.freqs, data[bl], wgts, filter_centers=[0], filter_half_widths=[RFI_DPSS_HALFWIDTH], mode='dpss_solve',
suppression_factors=[1e-9], eigenval_cutoff=[1e-9], cache=cache)
res = data[bl] - model
int_time = 24 * 3600 * np.median(np.diff(data.times))
chan_res = np.median(np.diff(data.freqs))
int_count = int(int_time * chan_res)
sigma = np.abs(model) / np.sqrt(int_count / 2)
zscores[bl] = res / sigma
zscores[bl][flag_array] = np.nan
return zscores
def rfi_from_avg_autos(data, auto_bls_to_use, prior_flags=None, nsig=RFI_NSIG):
'''Average together all baselines in auto_bls_to_use, then find an RFI mask by looking for outliers after DPSS filtering.'''
# 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))
int_count = int(int_time * chan_res) * len(auto_bls_to_use)
avg_auto = {(-1, -1, 'ee'): np.mean([data[bl] for bl in auto_bls_to_use], 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))
if prior_flags is not None:
antenna_flags[(-1, -1, 'ee')] = prior_flags
_, 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=nsig)
return rfi_flags
# Iteratively develop RFI mask, excess RFI classification, and autocorrelation shape classification
stage = 1
rfi_flags = np.array(array_flags)
prior_end_states = set()
while True:
# compute DPSS-filtered z-scores with current array-wide RFI mask
zscores = auto_bl_zscores(data, rfi_flags)
rms = {bl: np.nanmean(zscores[bl]**2)**.5 if np.any(np.isfinite(zscores[bl])) else np.inf for bl in zscores}
# figure out which autos to use for finding new set of flags
candidate_autos = [bl for bl in auto_bls if overall_class[utils.split_bl(bl)[0]] != 'bad']
if stage == 1:
# use best half of the unflagged antennas
med_rms = np.nanmedian([rms[bl] for bl in candidate_autos])
autos_to_use = [bl for bl in candidate_autos if rms[bl] <= med_rms]
elif stage == 2:
# use all unflagged antennas which are auto RFI good, or the best half, whichever is larger
med_rms = np.nanmedian([rms[bl] for bl in candidate_autos])
best_half_autos = [bl for bl in candidate_autos if rms[bl] <= med_rms]
good_autos = [bl for bl in candidate_autos if (overall_class[utils.split_bl(bl)[0]] != 'bad')
and (auto_rfi_class[utils.split_bl(bl)[0]] == 'good')]
autos_to_use = (best_half_autos if len(best_half_autos) > len(good_autos) else good_autos)
elif stage == 3:
# use all unflagged antennas which are auto RFI good or suspect
autos_to_use = [bl for bl in candidate_autos if (overall_class[utils.split_bl(bl)[0]] != 'bad')]
# compute new RFI flags
rfi_flags = rfi_from_avg_autos(data, autos_to_use)
# perform auto shape and RFI classification
overall_class = auto_power_class + auto_slope_class + zeros_class + ant_metrics_class + solar_class + xengine_diff_class
auto_rfi_class = ant_class.antenna_bounds_checker(rms, good=auto_rfi_good, suspect=auto_rfi_suspect, bad=(0, np.inf))
overall_class += auto_rfi_class
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=overall_class)
overall_class += auto_shape_class
# check for convergence by seeing whether we've previously gotten to this number of flagged antennas and channels
if stage == 3:
if (len(overall_class.bad_ants), np.sum(rfi_flags)) in prior_end_states:
break
prior_end_states.add((len(overall_class.bad_ants), np.sum(rfi_flags)))
else:
stage += 1
auto_class = auto_power_class + auto_slope_class + auto_rfi_class + auto_shape_class
if np.all([overall_class[utils.split_bl(bl)[0]] == 'bad' for bl in auto_bls]):
raise ValueError('All antennas are flagged after flagging for bad autos power/slope/rfi/shape.')
def rfi_plot(cls, flags=rfi_flags):
avg_auto = {(-1, -1, 'ee'): np.mean([data[bl] for bl in auto_bls if not cls[utils.split_bl(bl)[0]] == 'bad'], axis=0)}
plt.figure(figsize=(12, 5), dpi=100)
plt.semilogy(hd.freqs / 1e6, np.where(flags, np.nan, avg_auto[(-1, -1, 'ee')])[0], label = 'Average Good or Suspect Autocorrelation', zorder=100)
plt.semilogy(hd.freqs / 1e6, np.where(False, np.nan, avg_auto[(-1, -1, 'ee')])[0], 'r', lw=.5, label=f'{np.sum(flags[0])} Channels Flagged for RFI')
plt.legend()
plt.xlabel('Frequency (MHz)')
plt.ylabel('Uncalibrated Autocorrelation')
plt.tight_layout()
Figure 1: RFI Flagging¶
This figure shows RFI identified using the average of all autocorrelations---excluding bad antennas---for the first integration in the file.
if PLOT: rfi_plot(overall_class)
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],
[cl.capitalize() for cl in cls.quality_classes], ncol=1, fontsize=12, loc='upper right', framealpha=1)
plt.tight_layout()
Figure 2: Plot of autocorrelations with classifications¶
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)
Summarize antenna classification prior to redundant-baseline calibration¶
def array_class_plot(cls, extra_label=""):
outriggers = [ant for ant in hd.data_ants if ant >= 320]
if len(outriggers) > 0:
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=f'HERA Core{extra_label}')
plot_antclass(hd.antpos, cls, ax=axes[1], ants=outriggers, radius=50, title='Outriggers')
else:
fig, axes = plt.subplots(1, 1, figsize=(9, 6), dpi=100)
plot_antclass(hd.antpos, cls, ax=axes, ants=[ant for ant in hd.data_ants if ant < 320], legend=False, title=f'HERA Core{extra_label}')
Figure 3: Summary of antenna classifications prior to calibration¶
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(overall_class)
# delete diffs to save memory
del diff_data, hd_diff, cache
malloc_trim()
Perform redundant-baseline calibration¶
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)
def per_pol_filter_reds(reds, pols=['nn', 'ee'], **kwargs):
'''Performs redcal filtering separately on polarizations (which might have different min_dim_size issues).'''
return [red for pol in pols for red in redcal.filter_reds(copy.deepcopy(reds), pols=[pol], **kwargs)]
def check_if_whole_pol_flagged(redcal_class, pols=['Jee', 'Jnn']):
'''Checks if an entire polarization is flagged. If it is, returns True and marks all antennas as bad in redcal_class.'''
if np.logical_or(*[np.all([redcal_class[ant] == 'bad' for ant in redcal_class.ants if ant[1] == pol]) for pol in pols]):
print('An entire polarization has been flagged. Stopping redcal.')
for ant in redcal_class:
redcal_class[ant] = 'bad'
return True
return False
def recheck_chisq(cspa, sol, cutoff, avg_alg):
'''Recompute chisq per ant without apparently bad antennas to see if any antennas get better.'''
avg_cspa = {ant: avg_alg(np.where(rfi_flags, np.nan, cspa[ant])) for ant in cspa}
sol2 = redcal.RedSol(sol.reds, gains={ant: sol[ant] for ant in avg_cspa if avg_cspa[ant] <= cutoff}, vis=sol.vis)
new_chisq_per_ant = {ant: np.array(cspa[ant]) for ant in sol2.gains}
if len(set([bl[2] for red in per_pol_filter_reds(sol2.reds, ants=sol2.gains.keys(), antpos=hd.data_antpos, **fr_settings) for bl in red])) >= 2:
redcal.expand_omni_gains(sol2, sol2.reds, data, chisq_per_ant=new_chisq_per_ant)
for ant in avg_cspa:
if ant in new_chisq_per_ant:
if np.any(np.isfinite(new_chisq_per_ant[ant])):
if not np.all(np.isclose(new_chisq_per_ant[ant], 0)):
new_avg_cspa = avg_alg(np.where(rfi_flags, np.nan, cspa[ant]))
if new_avg_cspa > 0:
avg_cspa[ant] = np.min([avg_cspa[ant], new_avg_cspa])
return avg_cspa
Perform iterative redcal
¶
# figure out and filter reds and classify antennas based on whether or not they are on the main grid
fr_settings = {'max_dims': OC_MAX_DIMS, 'min_dim_size': OC_MIN_DIM_SIZE, 'min_bl_cut': OC_MIN_BL_LEN, 'max_bl_cut': OC_MAX_BL_LEN}
reds = redcal.get_reds(hd.data_antpos, pols=['ee', 'nn'], pol_mode='2pol')
reds = per_pol_filter_reds(reds, ex_ants=overall_class.bad_ants, antpos=hd.data_antpos, **fr_settings)
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)
if OC_USE_PRIOR_SOL:
# Find closest omnical file
omnical_files = sorted(glob.glob('.'.join(OMNICAL_FILE.split('.')[:-5]) + '.*.' + '.'.join(OMNICAL_FILE.split('.')[-3:])))
if len(omnical_files) == 0:
OC_USE_PRIOR_SOL = False
else:
omnical_jds = np.array([float(re.findall("\d+\.\d+", ocf)[-1]) for ocf in omnical_files])
closest_omnical = omnical_files[np.argmin(np.abs(omnical_jds - data.times[0]))]
# Load closest omnical file and use it if the antenna flagging is not too dissimilar
hc = io.HERACal(closest_omnical)
prior_gains, prior_flags, _, _ = hc.read()
not_bad_not_prior_flagged = [ant for ant in overall_class if not ant in redcal_class.bad_ants and not np.all(prior_flags[ant])]
if (len(redcal_class.bad_ants) == len(redcal_class.ants)):
OC_USE_PRIOR_SOL = False # all antennas flagged
elif (len(not_bad_not_prior_flagged) / (len(redcal_class.ants) - len(redcal_class.bad_ants))) < OC_PRIOR_SOL_FLAG_THRESH:
OC_USE_PRIOR_SOL = False # too many antennas unflaged that were flagged in the prior sol
else:
print(f'Using {closest_omnical} as a starting point for redcal.')
Using /mnt/sn1/data2/2460458/zen.2460458.35448.sum.omni.calfits as a starting point for redcal.
redcal_start = time.time()
rc_settings = {'max_dims': OC_MAX_DIMS, 'oc_conv_crit': 1e-10, 'gain': 0.4, 'run_logcal': False,
'oc_maxiter': OC_MAXITER, 'check_after': OC_MAXITER, 'use_gpu': OC_USE_GPU}
if check_if_whole_pol_flagged(redcal_class):
# skip redcal, initialize empty sol and meta
sol = redcal.RedSol(reds)
meta = {'chisq': None, 'chisq_per_ant': None}
else:
if OC_USE_PRIOR_SOL:
# use prior unflagged gains and data to create starting point for next step
ants_in_reds = set([ant for red in reds for bl in red for ant in utils.split_bl(bl)])
sol = redcal.RedSol(reds=reds, gains={ant: prior_gains[ant] for ant in not_bad_not_prior_flagged})
reds_to_update = [[bl for bl in red if (utils.split_bl(bl)[0] in sol.gains) and (utils.split_bl(bl)[1] in sol.gains)] for red in reds]
reds_to_update = [red for red in reds_to_update if len(red) > 0]
sol.update_vis_from_data(data, reds_to_update=reds_to_update)
redcal.expand_omni_gains(sol, reds, data)
sol.update_vis_from_data(data)
else:
# perform first stage of redundant calibration
meta, sol = redcal.redundantly_calibrate(data, reds, **rc_settings)
max_dly = np.max(np.abs(list(meta['fc_meta']['dlys'].values()))) # Needed for RFI delay-slope cal
median_cspa = recheck_chisq(meta['chisq_per_ant'], sol, oc_cspa_suspect[1] * 5, np.nanmedian)
# remove particularly bad antennas (5x the bound on median, not mean)
cspa_class = ant_class.antenna_bounds_checker(median_cspa, good=(oc_cspa_good[0], oc_cspa_suspect[1] * 5), bad=[(-np.inf, np.inf)])
redcal_class += cspa_class
print(f'Removing {cspa_class.bad_ants} for >5x high median chi^2.')
for ant in cspa_class.bad_ants:
print(f'\t{ant}: {median_cspa[ant]:.3f}')
malloc_trim()
# iteratively rerun redundant calibration
redcal_done = False
rc_settings['oc_maxiter'] = rc_settings['check_after'] = OC_RERUN_MAXITER
for i in range(OC_MAX_RERUN + 1):
# refilter reds and update classification to reflect new off-grid ants, if any
reds = per_pol_filter_reds(reds, ex_ants=(overall_class + redcal_class).bad_ants, antpos=hd.data_antpos, **fr_settings)
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)])
# check to see whether we're done
if check_if_whole_pol_flagged(redcal_class) or redcal_done or (i == OC_MAX_RERUN):
break
# re-run redundant calibration using previous solution, updating bad and suspicious antennas
meta, sol = redcal.redundantly_calibrate(data, reds, sol0=sol, **rc_settings)
malloc_trim()
# recompute chi^2 for bad antennas without bad antennas to make sure they are actually bad
mean_cspa = recheck_chisq(meta['chisq_per_ant'], sol, oc_cspa_suspect[1], np.nanmean)
# remove bad antennas
cspa_class = ant_class.antenna_bounds_checker(mean_cspa, good=oc_cspa_good, suspect=oc_cspa_suspect, bad=[(-np.inf, np.inf)])
for ant in cspa_class.bad_ants:
if mean_cspa[ant] < np.max(list(mean_cspa.values())) / OC_MAX_CHISQ_FLAGGING_DYNAMIC_RANGE:
cspa_class[ant] = 'suspect' # reclassify as suspect if they are much better than the worst antennas
redcal_class += cspa_class
print(f'Removing {cspa_class.bad_ants} for high mean unflagged chi^2.')
for ant in cspa_class.bad_ants:
print(f'\t{ant}: {mean_cspa[ant]:.3f}')
if len(cspa_class.bad_ants) == 0:
redcal_done = True # no new antennas to flag
print(f'Finished redcal in {(time.time() - redcal_start) / 60:.2f} minutes.')
Removing {(130, 'Jee'), (188, 'Jnn'), (200, 'Jnn'), (97, 'Jnn'), (115, 'Jnn'), (134, 'Jnn'), (28, 'Jnn'), (83, 'Jnn')} for high mean unflagged chi^2. (130, 'Jee'): 3.749 (188, 'Jnn'): 3.653 (200, 'Jnn'): 3.203 (97, 'Jnn'): 3.057 (115, 'Jnn'): 3.107 (134, 'Jnn'): 3.288 (28, 'Jnn'): 3.549 (83, 'Jnn'): 3.301
Removing set() for high mean unflagged chi^2.
Finished redcal in 3.52 minutes.
overall_class += redcal_class
Expand solution to include calibratable baselines excluded from redcal (e.g. because they were too long)¶
expanded_reds = redcal.get_reds(hd.data_antpos, pols=['ee', 'nn'], pol_mode='2pol')
expanded_reds = per_pol_filter_reds(expanded_reds, ex_ants=(ant_metrics_class + solar_class + zeros_class + auto_class + xengine_diff_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])
if len(sol.gains) > 0:
redcal.expand_omni_vis(sol, expanded_reds, data, chisq=meta['chisq'], chisq_per_ant=meta['chisq_per_ant'])
# now figure out flags, nsamples etc.
omni_flags = {ant: (~np.isfinite(g)) | (ant in overall_class.bad_ants) for ant, g in sol.gains.items()}
vissol_flags = datacontainer.RedDataContainer({bl: ~np.isfinite(v) for bl, v in sol.vis.items()}, reds=sol.vis.reds)
single_nsamples_array = np.ones((len(hd.times), len(hd.freqs)), dtype=float)
nsamples = datacontainer.DataContainer({bl: single_nsamples_array for bl in data})
vissol_nsamples = redcal.count_redundant_nsamples(nsamples, [red for red in expanded_reds if red[0] in vissol_flags],
good_ants=[ant for ant in overall_class if ant not in overall_class.bad_ants])
for bl in vissol_flags:
vissol_flags[bl][vissol_nsamples[bl] == 0] = True
sol.make_sol_finite()
Fix the firstcal
delay slope degeneracy using RFI transmitters¶
if not OC_USE_PRIOR_SOL:
# find channels clearly contaminated by RFI
not_bad_ants = [ant for ant in overall_class.ants if overall_class[ant] != 'bad']
if len(not_bad_ants) > 0:
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)}
if not np.isclose(hd.freqs[0], 46920776.3671875, atol=0.001) or len(hd.freqs) != 1536:
# We have less frequencies than usual (maybe testing)
phs_sol = {np.argmin(np.abs(hd.freqs - freq)): (freq, heading, chisq) for chan, (freq, heading, chisq) in phs_sol.items() if hd.freqs[0] <= freq <= hd.freqs[-1]}
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])
# resolve firstcal degeneracy with delay slopes set by RFI transmitters, update cal
RFI_dly_slope_gains = abscal.RFI_delay_slope_cal([red for red in expanded_reds if red[0] in sol.vis], hd.antpos, sol.vis, 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=sol.gains.keys())
sol.gains = {ant: g * RFI_dly_slope_gains[ant] for ant, g in sol.gains.items()}
apply_cal.calibrate_in_place(sol.vis, RFI_dly_slope_gains)
malloc_trim()
Perform absolute amplitude calibration using a model of autocorrelations¶
# 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 overall_class.bad_ants}
# Run abscal and update omnical gains with abscal gains
if len(model) > 0:
redcaled_autos = {bl: sol.calibrate_bl(bl, data[bl]) for bl in auto_bls if utils.split_bl(bl)[0] not in overall_class.bad_ants}
g_abscal = abscal.abs_amp_logcal(model, redcaled_autos, verbose=False, return_gains=True, gain_ants=sol.gains)
sol.gains = {ant: g * g_abscal[ant] for ant, g in sol.gains.items()}
apply_cal.calibrate_in_place(sol.vis, g_abscal)
del redcaled_autos, g_abscal
del hd_model, model
malloc_trim()
Full absolute calibration of phase gradients¶
If an ABSCAL_MODEL_FILES_GLOB
is provided, try to perform a full absolute calibration of tip-tilt phase gradients across the array using that those model files. Specifically, this step calibrates omnical visbility solutions using unique baselines simulated with a model of the sky and HERA's beam.
if ABSCAL_MODEL_FILES_GLOB is not None:
abscal_model_files = sorted(glob.glob(ABSCAL_MODEL_FILES_GLOB))
else:
# try to find files on site
abscal_model_files = sorted(glob.glob('/mnt/sn1/data1/abscal_models/H4C_1/abscal_files_unique_baselines/zen.2458894.?????.uvh5'))
if len(abscal_model_files) == 0:
# try to find files at NRAO
abscal_model_files = sorted(glob.glob('/lustre/aoc/projects/hera/zmartino/hera_calib_model/H4C_1/abscal_files_unique_baselines/zen.2458894.?????.uvh5'))
print(f'Found {len(abscal_model_files)} abscal model files{" in " + os.path.dirname(abscal_model_files[0]) if len(abscal_model_files) > 0 else ""}.')
Found 425 abscal model files in /mnt/sn1/data1/abscal_models/H4C_1/abscal_files_unique_baselines.
# Try to perform a full abscal of phase
if len(abscal_model_files) == 0:
DO_FULL_ABSCAL = False
print('No model files found... not performing full absolute calibration of phase gradients.')
elif np.all([ant in overall_class.bad_ants for ant in ants]):
DO_FULL_ABSCAL = False
print('All antennas classified as bad... skipping absolute calibration of phase gradients.')
else:
abscal_start = time.time()
# figure out which model files match the LSTs of the data
matched_model_files = sorted(set(abscal.match_times(SUM_FILE, abscal_model_files, filetype='uvh5')))
if len(matched_model_files) == 0:
DO_FULL_ABSCAL = False
print(f'No model files found matching the LSTs of this file after searching for {(time.time() - abscal_start) / 60:.2f} minutes. '
'Not performing full absolute calibration of phase gradients.')
else:
DO_FULL_ABSCAL = True
# figure out appropriate model times to load
hdm = io.HERAData(matched_model_files)
all_model_times, all_model_lsts = abscal.get_all_times_and_lsts(hdm, unwrap=True)
d2m_time_map = abscal.get_d2m_time_map(data.times, np.unwrap(data.lsts), all_model_times, all_model_lsts, extrap_limit=.5)
if DO_FULL_ABSCAL:
abscal_meta = {}
for pol in ['ee', 'nn']:
print(f'Performing absolute phase gradient calibration of {pol}-polarized visibility solutions...')
# load matching times and baselines
unflagged_data_bls = [bl for bl in vissol_flags if not np.all(vissol_flags[bl]) and bl[2] == pol]
model_bls = copy.deepcopy(hdm.bls)
model_antpos = hdm.data_antpos
if len(matched_model_files) > 1: # in this case, it's a dictionary
model_bls = list(set([bl for bls in list(hdm.bls.values()) for bl in bls]))
model_antpos = {ant: pos for antpos in hdm.data_antpos.values() for ant, pos in antpos.items()}
data_bls, model_bls, data_to_model_bl_map = abscal.match_baselines(unflagged_data_bls, model_bls, data.antpos, model_antpos=model_antpos,
pols=[pol], data_is_redsol=True, model_is_redundant=True, tol=1.0,
min_bl_cut=ABSCAL_MIN_BL_LEN, max_bl_cut=ABSCAL_MAX_BL_LEN, verbose=True)
model, model_flags, _ = io.partial_time_io(hdm, np.unique([d2m_time_map[time] for time in data.times]), bls=model_bls)
model_bls = [data_to_model_bl_map[bl] for bl in data_bls]
# rephase model to match in lsts
model_blvecs = {bl: model.antpos[bl[0]] - model.antpos[bl[1]] for bl in model.keys()}
utils.lst_rephase(model, model_blvecs, model.freqs, data.lsts - model.lsts,
lat=hdm.telescope_location_lat_lon_alt_degrees[0], inplace=True)
# run abscal and apply
abscal_meta[pol], delta_gains = abscal.complex_phase_abscal(sol.vis, model, sol.reds, data_bls, model_bls)
# apply gains
sol.gains = {antpol : g * delta_gains.get(antpol, 1) for antpol, g in sol.gains.items()}
apply_cal.calibrate_in_place(sol.vis, delta_gains)
del hdm, model, model_flags, delta_gains
malloc_trim()
print(f'Finished absolute calibration of tip-tilt phase slopes in {(time.time() - abscal_start) / 60:.2f} minutes.')
Performing absolute phase gradient calibration of ee-polarized visibility solutions...
Selected 474 data baselines and 474 model baselines to load.
Performing absolute phase gradient calibration of nn-polarized visibility solutions...
Selected 477 data baselines and 477 model baselines to load.
Finished absolute calibration of tip-tilt phase slopes in 0.40 minutes.
def redundant_group_plot():
if np.all([ant in overall_class.bad_ants for ant in ants]):
print('All antennas classified as bad. Nothing to plot.')
return
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=overall_class.bad_ants), key=len, reverse=True)[0]
rc_data = {bl: sol.calibrate_bl(bl, data[bl]) for bl in red}
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(sol.vis[red[0]][0]), lw=1, c='k')
axes[1, i].semilogy(hd.freqs / 1e6, np.abs(sol.vis[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()
def abscal_degen_plot():
if DO_FULL_ABSCAL:
fig, axes = plt.subplots(3, 1, figsize=(14, 6), dpi=100, sharex=True, gridspec_kw={'hspace': .05})
for ax, pol in zip(axes[:2], ['ee', 'nn']):
for kk in range(abscal_meta[pol]['Lambda_sol'].shape[-1]):
ax.plot(hd.freqs[~rfi_flags[0]] * 1e-6, abscal_meta[pol]['Lambda_sol'][0, ~rfi_flags[0], kk], '.', ms=1, label=f"Component {kk}")
ax.set_ylim(-np.pi-0.5, np.pi+0.5)
ax.set_xlabel('Frequency (MHz)')
ax.set_ylabel('Phase Gradient\nVector Component')
ax.legend(markerscale=20, title=f'{pol}-polarization', loc='lower right')
ax.grid()
for pol, color in zip(['ee', 'nn'], ['b', 'r']):
axes[2].plot(hd.freqs[~rfi_flags[0]]*1e-6, abscal_meta[pol]['Z_sol'].real[0, ~rfi_flags[0]], '.', ms=1, label=pol, color=color)
axes[2].set_ylim(-.25, 1.05)
axes[2].set_ylabel('Re[Z($\\nu$)]')
axes[2].legend(markerscale=20, loc='lower right')
axes[2].grid()
plt.tight_layout()
Figure 4: Redundant calibration of a single baseline group¶
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()
Figure 5: Absolute calibration of redcal
degeneracies¶
This figure shows the per-frequency phase gradient solutions across the array for both polarizations and all components of the degenerate subspace of redundant-baseline calibraton. While full HERA only has two such tip-tilt degeneracies, a subset of HERA can have up to OC_MAX_DIMS
(depending on antenna flagging). In addition to the absolute amplitude, this is the full set of the calibration degrees of freedom not constrainted by redcal
. This figure also includes a plot of $Re[Z(\nu)]$, the complex objective function which varies from -1 to 1 and indicates how well the data and the absolute calibration model have been made to agree. Perfect agreement is 1.0 and good agreement is anything above $\sim$0.5 Decorrelation yields values closer to 0, where anything below $\sim$0.3 is suspect.
if PLOT: abscal_degen_plot()
Attempt to calibrate some flagged antennas¶
This attempts to calibrate bad antennas using information from good or suspect antennas without allowing bad antennas to affect their calibration. However, introducing 0s in gains or infs/nans in gains or visibilities can create problems down the line, so those are removed.
expand_start = time.time()
expanded_reds = redcal.get_reds(hd.data_antpos, pols=['ee', 'nn'], pol_mode='2pol')
sol.vis.build_red_keys(expanded_reds)
redcal.expand_omni_gains(sol, expanded_reds, data, chisq_per_ant=meta['chisq_per_ant'])
if not np.all([ant in overall_class.bad_ants for ant in ants]):
redcal.expand_omni_vis(sol, expanded_reds, data)
# Replace near-zeros in gains and infs/nans in gains/sols
for ant in sol.gains:
zeros_in_gains = np.isclose(sol.gains[ant], 0)
if ant in omni_flags:
omni_flags[ant][zeros_in_gains] = True
sol.gains[ant][zeros_in_gains] = 1.0 + 0.0j
sol.make_sol_finite()
malloc_trim()
print(f'Finished expanding gain solution in {(time.time() - expand_start) / 60:.2f} minutes.')
Finished expanding gain solution in 0.66 minutes.
def array_chisq_plot(include_outriggers=True):
if np.all([ant in overall_class.bad_ants for ant in ants]):
print('All antennas classified as bad. Nothing to plot.')
return
def _chisq_subplot(ants, size=250):
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 meta['chisq_per_ant'] if utils.join_pol(ant[1], ant[1]) == pol and (ant[0] in ants)])
cspas = np.array([np.nanmean(np.where(rfi_flags, np.nan, meta['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=size, c=cspas, lw=.25, edgecolors=np.where(np.isfinite(cspas) & (cspas > 0), 'none', 'k'),
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=8,
c=('r' if ant in overall_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()
_chisq_subplot([ant for ant in hd.data_ants if ant < 320])
outriggers = [ant for ant in hd.data_ants if ant >= 320]
if include_outriggers & (len(outriggers) > 0):
_chisq_subplot([ant for ant in hd.data_ants if ant >= 320], size=400)
Figure 6: chi^2 per antenna across the array¶
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(include_outriggers=(not OC_SKIP_OUTRIGGERS))
Figure 7: Summary of antenna classifications after redundant calibration¶
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_plot(overall_class, extra_label=", Post-Redcal")
to_show = {'Antenna': [f'{ant[0]}{ant[1][-1]}' for ant in ants]}
classes = {'Antenna': [overall_class[ant] if ant in overall_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),
('Auto RFI RMS', auto_rfi_class),
('Autocorr Shape', auto_shape_class),
('Bad Diff X-Engines', xengine_diff_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 'bad' for ant in ants]
to_show['Redcal chi^2'] = [f'{np.nanmean(np.where(rfi_flags, np.nan, meta["chisq_per_ant"][ant])):.3G}' \
if (meta['chisq_per_ant'] is not None and ant in meta['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() \
.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'})
Table 1: Complete summary of per-antenna classifications¶
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.to_html())
Antenna | Dead? | Low Correlation | Cross-Polarized | Solar Alt | Even/Odd Zeros | Autocorr Power | Autocorr Slope | Auto RFI RMS | Autocorr Shape | Bad Diff X-Engines | Redcal chi^2 |
---|---|---|---|---|---|---|---|---|---|---|---|
3e | No | 0.63 | 0.56 | -58 | 0 | 18 | 0.13 | 1 | 0.047 | 0 | 1.35 |
3n | No | 0.034 | 0.56 | -58 | 0 | 0.6 | 0.6 | 9.3 | 0.18 | 1.14 | |
4e | No | 0.63 | 0.45 | -58 | 0 | 19 | 0.092 | 0.67 | 0.037 | 0 | 1.35 |
4n | No | 0.6 | 0.45 | -58 | 0 | 23 | 0.1 | 0.66 | 0.04 | 0 | 1.45 |
5e | No | 0.63 | 0.44 | -58 | 0 | 22 | 0.056 | 0.61 | 0.026 | 0 | 1.44 |
5n | No | 0.6 | 0.44 | -58 | 0 | 26 | -0.051 | 0.6 | 0.024 | 0 | 1.58 |
7e | No | 0.64 | 0.43 | -58 | 0 | 21 | 0.12 | 1.1 | 0.03 | 0 | 1.56 |
7n | No | 0.62 | 0.43 | -58 | 0 | 22 | -0.014 | 0.67 | 0.035 | 0 | 1.59 |
8e | No | 0.64 | 0.42 | -58 | 0 | 20 | 0.12 | 0.67 | 0.035 | 0 | 1.68 |
8n | No | 0.61 | 0.42 | -58 | 0 | 23 | -0.017 | 0.77 | 0.019 | 0 | 1.61 |
9e | No | 0.59 | 0.44 | -58 | 0 | 2.7 | 0.2 | 1.5 | 0.043 | 0 | 1.55 |
9n | No | 0.62 | 0.44 | -58 | 0 | 21 | -0.02 | 0.64 | 0.025 | 0 | 1.72 |
10e | No | 0.64 | 0.44 | -58 | 0 | 10 | 0.14 | 0.73 | 0.048 | 0 | 1.42 |
10n | No | 0.6 | 0.44 | -58 | 0 | 23 | 0.029 | 0.61 | 0.021 | 0 | 1.86 |
15e | No | 0.64 | 0.44 | -58 | 0 | 13 | 0.14 | 0.71 | 0.031 | 0 | 1.33 |
15n | No | 0.62 | 0.44 | -58 | 0 | 20 | -0.048 | 0.67 | 0.03 | 0 | 1.44 |
16e | No | 0.65 | 0.43 | -58 | 0 | 19 | 0.099 | 0.68 | 0.042 | 0 | 1.36 |
16n | No | 0.63 | 0.43 | -58 | 0 | 27 | 0.0089 | 0.61 | 0.014 | 0 | 1.46 |
17e | No | 0.64 | 0.43 | -58 | 0 | 19 | 0.084 | 0.66 | 0.028 | 0 | 1.35 |
17n | No | 0.62 | 0.43 | -58 | 0 | 12 | 0.032 | 0.78 | 0.049 | 0 | 1.41 |
18e | No | 0.61 | 0.48 | -58 | 0 | 19 | 0.093 | 38 | 0.13 | 0 | 1.54 |
18n | No | 0.39 | 0.48 | -58 | 0 | 13 | 0.23 | 23 | 0.11 | 0 | 1.32 |
19e | No | 0.65 | 0.43 | -58 | 0 | 21 | 0.1 | 0.68 | 0.029 | 0 | 1.45 |
19n | No | 0.63 | 0.43 | -58 | 0 | 24 | 0.0084 | 0.62 | 0.012 | 0 | 1.56 |
20e | No | 0.64 | 0.43 | -58 | 0 | 25 | 0.11 | 0.81 | 0.14 | 0 | 1.53 |
20n | No | 0.64 | 0.43 | -58 | 0 | 25 | -0.029 | 0.76 | 0.024 | 0 | 1.67 |
21e | No | 0.64 | 0.43 | -58 | 0 | 14 | 0.099 | 1.6 | 0.046 | 0 | 1.48 |
21n | No | 0.62 | 0.43 | -58 | 0 | 23 | 0.033 | 0.65 | 0.027 | 0 | 1.8 |
22e | No | 0.56 | 0.43 | -58 | 0 | 9.1 | 0.24 | 0.8 | 0.046 | 0 | 1.4 |
22n | No | 0.6 | 0.43 | -58 | 0 | 23 | -0.0004 | 0.72 | 0.014 | 0 | 1.96 |
27e | No | 0.08 | 0.32 | -58 | 0 | 1.4 | 0.82 | 1.3E+02 | 0.49 | 1.12 | |
27n | No | 0.38 | 0.32 | -58 | 0 | 16 | 0.29 | 20 | 0.13 | 0 | 1.23 |
28e | No | 0.11 | -0.075 | -58 | 0 | 9.5 | 0.69 | 27 | 0.2 | 1.4 | |
28n | No | 0.23 | -0.075 | -58 | 0 | 29 | 0.051 | 0.79 | 0.035 | 0 | 2.84 |
29e | No | 0.65 | 0.43 | -58 | 0 | 23 | 0.091 | 0.65 | 0.02 | 0 | 1.38 |
29n | No | 0.62 | 0.43 | -58 | 0 | 25 | 0.072 | 0.67 | 0.043 | 0 | 1.45 |
30e | No | 0.66 | 0.43 | -58 | 1 | 16 | 0.079 | 0.67 | 0.039 | 0 | 1.31 |
30n | No | 0.63 | 0.43 | -58 | 0 | 28 | 0.0099 | 0.62 | 0.0086 | 0 | 1.43 |
31e | No | 0.67 | 0.52 | -58 | 0 | 16 | 0.051 | 0.71 | 0.049 | 0 | 1.36 |
31n | No | 0.39 | 0.52 | -58 | 0 | 0.91 | 0.37 | 6.4 | 0.12 | 1.27 | |
32e | No | 0.65 | 0.42 | -58 | 0 | 36 | 0.042 | 0.51 | 0.019 | 0 | 1.44 |
32n | No | 0.57 | 0.42 | -58 | 0 | 18 | 0.59 | 0.78 | 0.19 | 0 | 1.88 |
33e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
33n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
34e | No | 0.037 | 0.49 | -58 | 0 | 2.9 | 0.56 | 4.6 | 0.16 | 1.18 | |
34n | No | 0.59 | 0.49 | -58 | 0 | 16 | 0.06 | 0.85 | 0.022 | 0 | 1.78 |
35e | No | 0.62 | 0.5 | -58 | 0 | 28 | 0.07 | 0.62 | 0.011 | 0 | 1.4 |
35n | No | 0.035 | 0.5 | -58 | 0 | 2.8 | 0.58 | 1.2 | 0.18 | 1.19 | |
36e | No | 0.63 | 0.43 | -58 | 0 | 3.5 | -0.16 | 0.8 | 0.083 | 0 | 1.45 |
36n | No | 0.62 | 0.43 | -58 | 0 | 14 | -0.33 | 0.82 | 0.1 | 0 | 1.53 |
37e | No | 0.64 | 0.43 | -58 | 0 | 3.4 | -0.3 | 1.4 | 0.14 | 0 | 1.39 |
37n | No | 0.61 | 0.43 | -58 | 0 | 2.7 | -0.41 | 2.4 | 0.15 | 0 | 1.76 |
38e | No | 0.66 | 0.44 | -58 | 0 | 19 | 0.11 | 0.86 | 0.047 | 0 | 1.39 |
38n | No | 0.63 | 0.44 | -58 | 0 | 16 | -0.033 | 0.93 | 0.04 | 0 | 1.36 |
40e | No | 0.65 | 0.43 | -58 | 0 | 18 | 0.12 | 0.71 | 0.04 | 0 | 1.35 |
40n | No | 0.63 | 0.43 | -58 | 0 | 18 | 0.0075 | 4.8 | 0.038 | 0 | 1.59 |
41e | No | 0.67 | 0.43 | -58 | 0 | 23 | 0.024 | 0.63 | 0.026 | 0 | 1.46 |
41n | No | 0.63 | 0.43 | -58 | 0 | 10 | -0.051 | 0.75 | 0.044 | 0 | 1.67 |
42e | No | 0.66 | 0.44 | -58 | 0 | 18 | 0.094 | 0.69 | 0.05 | 0 | 1.38 |
42n | No | 0.6 | 0.44 | -58 | 0 | 2.7 | 0.035 | 1.4 | 0.048 | 0 | 1.64 |
45e | No | 0.65 | 0.42 | -58 | 0 | 53 | 0.021 | 2.2 | 0.054 | 0 | 1.49 |
45n | No | 0.62 | 0.42 | -58 | 0 | 42 | 0.0012 | 1 | 0.049 | 0 | 1.38 |
46e | No | 0.62 | 0.42 | -58 | 0 | 67 | 0.041 | 7.1 | 0.087 | 1.53 | |
46n | No | 0.62 | 0.42 | -58 | 0 | 49 | 0.00012 | 0.43 | 0.039 | 0 | 1.5 |
47e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
47n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
48e | No | 0.62 | 0.41 | -58 | 0 | 15 | 0.24 | 1 | 0.044 | 0 | 1.36 |
48n | No | 0.61 | 0.41 | -58 | 0 | 22 | 0.074 | 0.66 | 0.025 | 0 | 1.47 |
49e | No | 0.61 | 0.42 | -58 | 0 | 17 | 0.13 | 0.71 | 0.022 | 0 | 1.37 |
49n | No | 0.6 | 0.42 | -58 | 0 | 31 | 0.039 | 0.57 | 0.023 | 0 | 1.65 |
50e | No | 0.63 | 0.42 | -58 | 0 | 13 | 0.091 | 0.71 | 0.05 | 0 | 1.56 |
50n | No | 0.61 | 0.42 | -58 | 0 | 25 | -0.073 | 0.59 | 0.045 | 0 | 1.64 |
51e | No | 0.65 | 0.43 | -58 | 0 | 14 | 0.18 | 17 | 0.076 | 0 | 1.6 |
51n | No | 0.62 | 0.43 | -58 | 1 | 18 | -0.075 | 0.72 | 0.046 | 0 | 1.48 |
52e | No | 0.66 | 0.43 | -58 | 0 | 21 | -0.12 | 0.7 | 0.08 | 0 | 1.41 |
52n | No | 0.63 | 0.43 | -58 | 0 | 25 | -0.24 | 0.66 | 0.076 | 0 | 1.49 |
53e | No | 0.66 | 0.43 | -58 | 0 | 26 | 0.062 | 1.2 | 0.036 | 0 | 1.48 |
53n | No | 0.64 | 0.43 | -58 | 0 | 22 | -0.14 | 0.8 | 0.061 | 0 | 1.47 |
54e | No | 0.66 | 0.42 | -58 | 0 | 31 | 0.084 | 0.66 | 0.013 | 0 | 1.36 |
54n | No | 0.64 | 0.42 | -58 | 0 | 18 | -0.0039 | 0.78 | 0.03 | 0 | 1.46 |
55e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
55n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
56e | No | 0.66 | 0.43 | -58 | 0 | 21 | 0.05 | 0.65 | 0.048 | 0 | 1.41 |
56n | No | 0.64 | 0.43 | -58 | 0 | 23 | -0.016 | 0.62 | 0.035 | 0 | 1.46 |
57e | No | 0.67 | 0.44 | -58 | 0 | 21 | 0.08 | 0.76 | 0.029 | 0 | 1.39 |
57n | No | 0.64 | 0.44 | -58 | 0 | 18 | 0.032 | 0.78 | 0.046 | 0 | 1.38 |
61e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
61n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
62e | No | 0.59 | 0.42 | -58 | 0 | 9.4 | 0.22 | 1.7 | 0.041 | 0 | 1.32 |
62n | No | 0.61 | 0.42 | -58 | 0 | 43 | -0.019 | 0.46 | 0.043 | 0 | 1.46 |
63e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
63n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
64e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
64n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
65e | No | 0.64 | 0.43 | -58 | 0 | 21 | 0.084 | 0.66 | 0.058 | 0 | 1.65 |
65n | No | 0.62 | 0.43 | -58 | 0 | 27 | -0.06 | 0.99 | 0.034 | 0 | 1.65 |
66e | No | 0.65 | 0.42 | -58 | 0 | 21 | 0.096 | 0.63 | 0.047 | 0 | 1.62 |
66n | No | 0.62 | 0.42 | -58 | 0 | 32 | -0.0088 | 0.55 | 0.019 | 0 | 1.71 |
67e | No | 0.64 | 0.4 | -58 | 0 | 23 | 0.053 | 0.66 | 0.037 | 0 | 1.64 |
67n | No | 0.62 | 0.4 | -58 | 0 | 12 | 0.004 | 0.81 | 0.04 | 0 | 1.77 |
68e | No | 0.65 | 0.4 | -58 | 0 | 16 | 0.11 | 0.82 | 0.053 | 0 | 1.54 |
68n | No | 0.64 | 0.4 | -58 | 0 | 24 | -0.068 | 0.75 | 0.034 | 0 | 1.74 |
69e | No | 0.66 | 0.43 | -58 | 0 | 18 | 0.13 | 1.8 | 0.04 | 0 | 1.46 |
69n | No | 0.65 | 0.43 | -58 | 0 | 23 | 0.0082 | 0.62 | 0.022 | 0 | 1.49 |
70e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
70n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
71e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
71n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
72e | No | 0.68 | 0.43 | -58 | 0 | 21 | 0.19 | 0.7 | 0.035 | 0 | 1.43 |
72n | No | 0.65 | 0.43 | -58 | 0 | 22 | -0.047 | 0.63 | 0.031 | 0 | 1.42 |
73e | No | 0.66 | 0.44 | -58 | 0 | 57 | 0.066 | 0.65 | 0.062 | 0 | 1.31 |
73n | No | 0.62 | 0.44 | -58 | 0 | 65 | 0.0045 | 0.31 | 0.075 | 1.49 | |
77e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
77n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
78e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
78n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
79e | No | 0.63 | 0.42 | -58 | 0 | 31 | 0.14 | 0.58 | 0.019 | 0 | 1.46 |
79n | No | 0.61 | 0.42 | -58 | 0 | 25 | 0.035 | 0.62 | 0.017 | 0 | 1.4 |
80e | No | 0.63 | 0.41 | -58 | 0 | 29 | 0.17 | 1.1 | 0.03 | 0 | 1.44 |
80n | No | 0.61 | 0.41 | -58 | 0 | 25 | 0.064 | 0.74 | 0.021 | 0 | 1.62 |
81e | No | 0.62 | 0.4 | -58 | 0 | 2.1 | -0.27 | 0.76 | 0.12 | 0 | 1.6 |
81n | No | 0.62 | 0.4 | -58 | 0 | 3.8 | -0.51 | 0.72 | 0.15 | 0 | 1.88 |
82e | No | 0.65 | 0.41 | -58 | 0 | 4 | -0.23 | 0.73 | 0.13 | 0 | 2.05 |
82n | No | 0.62 | 0.41 | -58 | 0 | 2.7 | -0.52 | 0.7 | 0.15 | 0 | 1.65 |
83e | No | 0.66 | 0.4 | -58 | 0 | 4.7 | -0.28 | 0.73 | 0.12 | 0 | 1.54 |
83n | No | 0.59 | 0.4 | -58 | 0 | 3.5 | 0.34 | 0.82 | 0.17 | 0 | 2.98 |
84e | No | 0.66 | 0.41 | -58 | 0 | 26 | 0.063 | 0.68 | 0.021 | 0 | 1.58 |
84n | No | 0.62 | 0.41 | -58 | 0 | 28 | 0.0043 | 0.92 | 0.018 | 0 | 1.73 |
85e | No | 0.67 | 0.42 | -58 | 0 | 24 | -0.0085 | 0.62 | 0.034 | 0 | 1.45 |
85n | No | 0.64 | 0.42 | -58 | 0 | 25 | -0.071 | 0.68 | 0.03 | 0 | 1.52 |
86e | No | 0.26 | -0.13 | -58 | 0 | 21 | 0.032 | 0.91 | 0.046 | 2.95 | |
86n | No | 0.11 | -0.13 | -58 | 0 | 1.1 | 0.5 | 3.1 | 0.16 | 1.35 | |
87e | No | 0.53 | 0.38 | -58 | 0 | 14 | 1.2 | 18 | 0.32 | 2.26 | |
87n | No | 0.65 | 0.38 | -58 | 0 | 24 | -0.021 | 0.76 | 0.023 | 0 | 1.4 |
88e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
88n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
89e | No | 0.67 | 0.42 | -58 | 0 | 20 | 0.018 | 0.9 | 0.046 | 0 | 1.47 |
89n | No | 0.64 | 0.42 | -58 | 0 | 23 | -0.07 | 0.71 | 0.035 | 0 | 1.48 |
90e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
90n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
91e | No | 0.67 | 0.43 | -58 | 0 | 23 | 0.021 | 0.66 | 0.039 | 0 | 1.51 |
91n | No | 0.65 | 0.43 | -58 | 0 | 22 | -0.039 | 0.64 | 0.03 | 0 | 1.63 |
92e | No | 0.65 | 0.41 | -58 | 0 | 15 | 0.12 | 2.9 | 0.041 | 0 | 1.6 |
92n | No | 0.63 | 0.41 | -58 | 0 | 19 | -0.036 | 0.64 | 0.028 | 0 | 1.51 |
93e | No | 0.67 | 0.42 | -58 | 0 | 22 | 0.078 | 0.87 | 0.026 | 0 | 1.43 |
93n | No | 0.65 | 0.42 | -58 | 0 | 31 | -0.014 | 0.56 | 0.01 | 0 | 1.48 |
94e | No | 0.66 | 0.43 | -58 | 0 | 22 | 0.11 | 0.67 | 0.028 | 0 | 1.46 |
94n | No | 0.64 | 0.43 | -58 | 0 | 25 | 0.0069 | 0.69 | 0.016 | 0 | 1.43 |
95e | No | 0.62 | 0.4 | -58 | 0 | 21 | 0.17 | 0.72 | 0.026 | 0 | 1.72 |
95n | No | 0.62 | 0.4 | -58 | 0 | 38 | 0.019 | 0.5 | 0.026 | 0 | 1.51 |
96e | No | 0.64 | 0.5 | -58 | 0 | 41 | 0.093 | 0.48 | 0.033 | 0 | 1.6 |
96n | No | 0.11 | 0.5 | -58 | 0 | 2.9 | 0.59 | 1.9 | 0.18 | 1.14 | |
97e | No | 0.62 | 0.42 | -58 | 0 | 25 | 0.12 | 0.65 | 0.015 | 0 | 1.54 |
97n | No | 0.6 | 0.42 | -58 | 0 | 31 | 0.066 | 1.1 | 0.028 | 0 | 2.19 |
98e | No | 0.61 | 0.41 | -58 | 0 | 2.1 | -0.32 | 0.74 | 0.13 | 0 | 1.57 |
98n | No | 0.6 | 0.41 | -58 | 0 | 3 | -0.47 | 0.72 | 0.15 | 0 | 1.76 |
99e | No | 0.62 | 0.4 | -58 | 0 | 1.9 | -0.23 | 0.71 | 0.11 | 0 | 1.55 |
99n | No | 0.61 | 0.4 | -58 | 0 | 2.6 | -0.43 | 0.77 | 0.13 | 0 | 1.66 |
100e | No | 0.65 | 0.42 | -58 | 0 | 4.3 | -0.21 | 0.77 | 0.11 | 0 | 1.61 |
100n | No | 0.6 | 0.42 | -58 | 0 | 1.2 | -0.38 | 0.74 | 0.12 | 0 | 1.5 |
101e | No | 0.66 | 0.42 | -58 | 0 | 19 | 0.059 | 0.66 | 0.03 | 0 | 1.49 |
101n | No | 0.64 | 0.42 | -58 | 0 | 22 | -0.074 | 0.63 | 0.028 | 0 | 1.54 |
102e | No | 0.66 | 0.41 | -58 | 0 | 26 | 0.068 | 0.62 | 0.024 | 0 | 1.42 |
102n | No | 0.63 | 0.41 | -58 | 0 | 21 | 0.018 | 0.66 | 0.034 | 0 | 1.51 |
103e | No | 0.66 | 0.4 | -58 | 0 | 22 | 0.16 | 0.67 | 0.031 | 0 | 1.47 |
103n | No | 0.65 | 0.4 | -58 | 0 | 28 | -0.018 | 0.99 | 0.028 | 0 | 1.52 |
104e | No | 0.67 | 0.48 | -58 | 0 | 17 | 0.049 | 0.72 | 0.033 | 0 | 1.34 |
104n | No | 0.46 | 0.48 | -58 | 1 | 0.55 | 2.2 | 3.7 | 0.58 | 1.29 | |
105e | No | 0.68 | 0.42 | -58 | 0 | 23 | 0.056 | 0.63 | 0.037 | 0 | 1.43 |
105n | No | 0.66 | 0.42 | -58 | 0 | 22 | -0.088 | 0.63 | 0.038 | 0 | 1.56 |
106e | No | 0.67 | 0.42 | -58 | 0 | 21 | -0.0032 | 0.72 | 0.037 | 0 | 1.52 |
106n | No | 0.65 | 0.42 | -58 | 0 | 21 | -0.12 | 0.66 | 0.048 | 0 | 1.56 |
107e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
107n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
108e | No | 0.66 | 0.41 | -58 | 0 | 45 | 0.04 | 0.44 | 0.038 | 0 | 1.44 |
108n | No | 0.65 | 0.41 | -58 | 0 | 23 | -0.1 | 0.64 | 0.052 | 0 | 1.62 |
109e | No | 0.67 | 0.51 | -58 | 0 | 21 | 0.097 | 0.84 | 0.029 | 0 | 1.48 |
109n | No | 0.033 | 0.51 | -58 | 0 | 0.66 | 0.57 | 6.8 | 0.17 | 1.12 | |
110e | No | 0.68 | 0.42 | -58 | 0 | 32 | 0.09 | 0.55 | 0.015 | 0 | 1.44 |
110n | No | 0.66 | 0.42 | -58 | 0 | 27 | 0.024 | 0.58 | 0.014 | 0 | 1.55 |
111e | No | 0.67 | 0.41 | -58 | 0 | 21 | 0.25 | 0.71 | 0.047 | 0 | 1.53 |
111n | No | 0.66 | 0.41 | -58 | 0 | 25 | -0.016 | 0.68 | 0.017 | 0 | 1.51 |
112e | No | 0.67 | 0.42 | -58 | 0 | 17 | 0.12 | 0.67 | 0.048 | 0 | 1.69 |
112n | No | 0.64 | 0.42 | -58 | 0 | 22 | -0.027 | 0.64 | 0.026 | 0 | 1.55 |
113e | No | 0.66 | 0.41 | -58 | 0 | 32 | 0.11 | 0.58 | 0.017 | 0 | 1.63 |
113n | No | 0.63 | 0.41 | -58 | 0 | 32 | 0.065 | 0.67 | 0.023 | 0 | 1.52 |
114e | No | 0.62 | 0.4 | -58 | 0 | 22 | 0.14 | 0.75 | 0.019 | 0 | 1.63 |
114n | No | 0.61 | 0.4 | -58 | 0 | 26 | 0.013 | 0.59 | 0.025 | 0 | 1.49 |
115e | No | 0.64 | 0.42 | -58 | 0 | 40 | 0.072 | 0.53 | 0.032 | 0 | 1.46 |
115n | No | 0.6 | 0.42 | -58 | 0 | 25 | 0.025 | 0.62 | 0.017 | 0 | 1.87 |
116e | No | 0.6 | 0.4 | -58 | 0 | 1.8 | -0.23 | 0.74 | 0.1 | 0 | 1.73 |
116n | No | 0.61 | 0.4 | -58 | 0 | 4.2 | -0.48 | 0.74 | 0.14 | 0 | 1.92 |
117e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
117n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
118e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
118n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
119e | No | 0.67 | 0.43 | -58 | 0 | 7.2 | -0.32 | 0.72 | 0.13 | 0 | 1.65 |
119n | No | 0.65 | 0.43 | -58 | 0 | 4 | -0.47 | 1 | 0.14 | 0 | 1.6 |
120e | No | 0.67 | 0.42 | -58 | 0 | 20 | 0.073 | 0.67 | 0.045 | 0 | 1.46 |
120n | No | 0.65 | 0.42 | -58 | 0 | 26 | -0.021 | 0.61 | 0.023 | 0 | 1.52 |
121e | No | 0.67 | 0.41 | -58 | 0 | 13 | 0.054 | 1.5 | 0.048 | 0 | 1.39 |
121n | No | 0.66 | 0.41 | -58 | 0 | 17 | -0.094 | 0.82 | 0.044 | 0 | 1.51 |
122e | No | 0.68 | 0.43 | -58 | 0 | 19 | 0.021 | 0.69 | 0.038 | 0 | 1.4 |
122n | No | 0.66 | 0.43 | -58 | 0 | 24 | -0.063 | 0.62 | 0.038 | 0 | 1.46 |
123e | No | 0.68 | 0.42 | -58 | 0 | 22 | 0.038 | 0.63 | 0.031 | 0 | 1.43 |
123n | No | 0.66 | 0.42 | -58 | 0 | 23 | -0.1 | 0.68 | 0.04 | 0 | 1.45 |
124e | No | 0.69 | 0.43 | -58 | 0 | 27 | 0.049 | 0.59 | 0.027 | 0 | 1.47 |
124n | No | 0.66 | 0.43 | -58 | 0 | 27 | -0.0074 | 0.6 | 0.025 | 0 | 1.51 |
125e | No | 0.67 | 0.39 | -58 | 0 | 20 | 0.35 | 7.2 | 0.13 | 0 | 1.68 |
125n | No | 0.65 | 0.39 | -58 | 0 | 32 | -0.27 | 3.7 | 0.13 | 0 | 1.99 |
126e | No | 0.67 | 0.42 | -58 | 0 | 15 | 0.0036 | 0.71 | 0.042 | 0 | 1.47 |
126n | No | 0.66 | 0.42 | -58 | 0 | 21 | -0.1 | 0.65 | 0.044 | 0 | 1.72 |
127e | No | 0.67 | 0.4 | -58 | 0 | 21 | 0.049 | 0.79 | 0.041 | 0 | 1.69 |
127n | No | 0.65 | 0.4 | -58 | 0 | 15 | -0.04 | 0.96 | 0.039 | 0 | 1.67 |
128e | No | 0.68 | 0.41 | -58 | 0 | 20 | 0.066 | 0.86 | 0.033 | 0 | 1.61 |
128n | No | 0.65 | 0.41 | -58 | 0 | 25 | 0.016 | 0.68 | 0.027 | 0 | 1.61 |
129e | No | 0.66 | 0.41 | -58 | 0 | 16 | 0.083 | 0.76 | 0.045 | 0 | 1.59 |
129n | No | 0.65 | 0.41 | -58 | 0 | 22 | -0.021 | 0.67 | 0.029 | 0 | 1.66 |
130e | No | 0.55 | 0.19 | -58 | 0 | 28 | 0.56 | 1.1 | 0.18 | 0 | 3.23 |
130n | No | 0.52 | 0.19 | -58 | 0 | 21 | 0.63 | 1.7 | 0.23 | 3 | |
131e | No | 0.66 | 0.45 | -58 | 0 | 30 | 0.1 | 0.67 | 0.011 | 0 | 1.89 |
131n | No | 0.49 | 0.45 | -58 | 0 | 4.2 | 0.37 | 2.1 | 0.11 | 0 | 1.58 |
132e | No | 0.64 | 0.4 | -58 | 0 | 31 | 0.086 | 0.81 | 0.013 | 0 | 1.6 |
132n | No | 0.61 | 0.4 | -58 | 0 | 21 | 0.063 | 0.72 | 0.025 | 0 | 1.55 |
133e | No | 0.63 | 0.4 | -58 | 0 | 19 | 0.15 | 1.1 | 0.028 | 0 | 1.55 |
133n | No | 0.61 | 0.4 | -58 | 0 | 20 | 0.052 | 0.79 | 0.024 | 0 | 1.6 |
134e | No | 0.58 | 0.4 | -58 | 0 | 8.4 | 0.27 | 1.5 | 0.062 | 0 | 1.48 |
134n | No | 0.59 | 0.4 | -58 | 0 | 20 | 0.087 | 0.68 | 0.03 | 0 | 2.22 |
135e | No | 0.61 | 0.41 | -58 | 0 | 19 | 0.39 | 1.1 | 0.12 | 0 | 1.7 |
135n | No | 0.61 | 0.41 | -58 | 0 | 21 | 0.01 | 0.79 | 0.027 | 0 | 1.79 |
136e | No | 0.65 | 0.43 | -58 | 0 | 22 | 0.03 | 0.7 | 0.025 | 0 | 1.66 |
136n | No | 0.62 | 0.43 | -58 | 0 | 26 | 0.025 | 0.78 | 0.023 | 0 | 1.77 |
137e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
137n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
138e | No | 0.66 | 0.42 | -58 | 0 | 27 | 0.057 | 0.64 | 0.046 | 0 | 1.62 |
138n | No | 0.64 | 0.42 | -58 | 0 | 25 | -0.016 | 0.59 | 0.041 | 0 | 1.64 |
139e | No | 0.65 | 0.41 | -58 | 0 | 41 | 0.059 | 0.52 | 0.04 | 0 | 1.55 |
139n | No | 0.62 | 0.41 | -58 | 0 | 26 | 0.01 | 0.74 | 0.012 | 0 | 1.51 |
140e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
140n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
141e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
141n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
142e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
142n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
143e | No | 0.68 | 0.42 | -58 | 0 | 24 | 0.11 | 0.62 | 0.022 | 0 | 1.51 |
143n | No | 0.66 | 0.42 | -58 | 0 | 25 | -0.015 | 0.62 | 0.019 | 0 | 1.58 |
144e | No | 0.68 | 0.42 | -58 | 0 | 19 | 0.068 | 0.7 | 0.034 | 0 | 1.58 |
144n | No | 0.64 | 0.42 | -58 | 0 | 8.3 | -0.021 | 0.8 | 0.039 | 0 | 1.78 |
145e | No | 0.66 | 0.41 | -58 | 0 | 18 | 0.044 | 0.85 | 0.035 | 0 | 1.66 |
145n | No | 0.63 | 0.41 | -58 | 0 | 5.8 | 0.06 | 1.1 | 0.047 | 0 | 1.76 |
146e | No | 0.65 | 0.4 | -58 | 0 | 16 | 0.2 | 0.78 | 0.033 | 0 | 1.6 |
146n | No | 0.65 | 0.4 | -58 | 0 | 33 | 0.044 | 0.56 | 0.021 | 0 | 2 |
147e | No | 0.68 | 0.42 | -58 | 0 | 16 | 0.086 | 0.72 | 0.04 | 0 | 1.49 |
147n | No | 0.66 | 0.42 | -58 | 0 | 23 | -0.0092 | 0.6 | 0.015 | 0 | 1.69 |
148e | No | 0.67 | 0.41 | -58 | 0 | 22 | 0.081 | 0.62 | 0.027 | 0 | 1.55 |
148n | No | 0.66 | 0.41 | -58 | 0 | 25 | -0.041 | 0.61 | 0.025 | 0 | 1.66 |
149e | No | 0.68 | 0.43 | -58 | 0 | 22 | 0.094 | 0.65 | 0.031 | 0 | 1.59 |
149n | No | 0.65 | 0.43 | -58 | 0 | 23 | -0.0088 | 0.65 | 0.02 | 0 | 1.68 |
150e | No | 0.66 | 0.41 | -58 | 0 | 17 | 0.063 | 0.67 | 0.038 | 0 | 1.62 |
150n | No | 0.63 | 0.41 | -58 | 0 | 23 | -0.0053 | 0.64 | 0.029 | 0 | 1.73 |
151e | No | 0.65 | 0.42 | -58 | 0 | 43 | 0.065 | 0.46 | 0.038 | 0 | 1.55 |
151n | No | 0.62 | 0.42 | -58 | 0 | 23 | -0.021 | 0.64 | 0.015 | 0 | 1.56 |
152e | No | 0.65 | 0.42 | -58 | 0 | 24 | 0.091 | 0.68 | 0.017 | 0 | 1.62 |
152n | No | 0.62 | 0.42 | -58 | 0 | 25 | 0.02 | 0.64 | 0.014 | 0 | 1.61 |
153e | No | 0.61 | 0.43 | -58 | 0 | 19 | 0.12 | 0.68 | 0.017 | 0 | 1.56 |
153n | No | 0.52 | 0.43 | -58 | 0 | 6.2 | 0.27 | 1.2 | 0.078 | 0 | 1.51 |
154e | No | 0.62 | 0.42 | -58 | 0 | 32 | 0.088 | 0.56 | 0.015 | 0 | 1.45 |
154n | No | 0.59 | 0.42 | -58 | 0 | 28 | 0.048 | 0.64 | 0.02 | 0 | 1.91 |
155e | No | 0.63 | 0.43 | -58 | 0 | 22 | 0.11 | 2 | 0.025 | 0 | 2.25 |
155n | No | 0.61 | 0.43 | -58 | 0 | 30 | -0.013 | 0.58 | 0.015 | 0 | 1.48 |
159e | No | 0.61 | 0.4 | -58 | 0 | 12 | 0.2 | 0.84 | 0.034 | 0 | 1.56 |
159n | No | 0.62 | 0.4 | -58 | 0 | 23 | 0.067 | 0.67 | 0.022 | 0 | 1.57 |
160e | No | 0.65 | 0.4 | -58 | 0 | 19 | 0.042 | 0.66 | 0.03 | 0 | 1.65 |
160n | No | 0.64 | 0.4 | -58 | 0 | 28 | 0.021 | 0.58 | 0.022 | 0 | 1.59 |
161e | No | 0.66 | 0.36 | -58 | 0 | 22 | 0.1 | 0.65 | 0.026 | 0 | 1.69 |
161n | No | 0.52 | 0.36 | -58 | 0 | 20 | 1 | 1.1 | 0.28 | 2.97 | |
162e | No | 0.69 | 0.41 | -58 | 0 | 22 | 0.14 | 0.76 | 0.025 | 0 | 1.63 |
162n | No | 0.67 | 0.41 | -58 | 0 | 25 | 0.0031 | 0.61 | 0.02 | 0 | 1.68 |
163e | No | 0.67 | 0.41 | -58 | 0 | 19 | 0.0035 | 0.7 | 0.033 | 0 | 1.63 |
163n | No | 0.66 | 0.41 | -58 | 0 | 22 | -0.094 | 0.64 | 0.037 | 0 | 1.64 |
164e | No | 0.67 | 0.39 | -58 | 0 | 11 | 0.13 | 0.78 | 0.035 | 0 | 1.65 |
164n | No | 0.67 | 0.39 | -58 | 0 | 28 | -0.04 | 0.57 | 0.021 | 0 | 1.88 |
165e | No | 0.67 | 0.41 | -58 | 0 | 19 | 0.0079 | 0.64 | 0.045 | 0 | 1.6 |
165n | No | 0.65 | 0.41 | -58 | 0 | 24 | -0.077 | 0.64 | 0.027 | 0 | 1.93 |
166e | No | 0.69 | 0.39 | -58 | 0 | 22 | 0.041 | 0.66 | 0.026 | 0 | 1.8 |
166n | No | 0.66 | 0.39 | -58 | 0 | 23 | -0.059 | 0.64 | 0.027 | 0 | 2.15 |
167e | No | 0.68 | 0.42 | -58 | 0 | 23 | 0.1 | 0.62 | 0.024 | 0 | 1.62 |
167n | No | 0.66 | 0.42 | -58 | 0 | 21 | -0.00018 | 0.63 | 0.024 | 0 | 1.92 |
168e | No | 0.69 | 0.43 | -58 | 0 | 23 | 0.11 | 0.73 | 0.018 | 0 | 1.57 |
168n | No | 0.66 | 0.43 | -58 | 0 | 26 | -0.024 | 0.66 | 0.023 | 0 | 1.73 |
169e | No | 0.68 | 0.42 | -58 | 0 | 21 | 0.064 | 0.68 | 0.028 | 0 | 1.5 |
169n | No | 0.66 | 0.42 | -58 | 0 | 25 | -0.034 | 0.66 | 0.019 | 0 | 1.68 |
170e | No | 0.042 | 0.51 | -58 | 0 | 0.65 | 0.54 | 9.1 | 0.15 | 1.1 | |
170n | No | 0.64 | 0.51 | -58 | 0 | 23 | 0.089 | 0.65 | 0.05 | 0 | 1.63 |
171e | No | 0.64 | 0.52 | -58 | 0 | 20 | 0.12 | 0.67 | 0.016 | 0 | 1.55 |
171n | No | 0.038 | 0.52 | -58 | 0 | 3.6 | 0.63 | 1.5 | 0.19 | 1.12 | |
172e | No | 0.64 | 0.41 | -58 | 0 | 35 | 0.072 | 0.51 | 0.023 | 0 | 2 |
172n | No | 0.61 | 0.41 | -58 | 0 | 25 | 0.054 | 0.7 | 0.025 | 0 | 2.24 |
173e | No | 0.62 | 0.4 | -58 | 0 | 21 | 0.13 | 0.71 | 0.024 | 0 | 1.93 |
173n | No | 0.6 | 0.4 | -58 | 0 | 27 | 0.024 | 0.8 | 0.024 | 0 | 2.14 |
174e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
174n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
175e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
175n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
176e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
176n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
177e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
177n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
178e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
178n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
179e | No | 0.66 | 0.42 | -58 | 0 | 13 | 0.15 | 0.71 | 0.04 | 0 | 1.6 |
179n | No | 0.63 | 0.42 | -58 | 0 | 24 | 0.017 | 0.62 | 0.021 | 0 | 1.58 |
180e | No | 0.67 | 0.41 | -58 | 0 | 16 | 0.15 | 1.1 | 0.043 | 0 | 1.51 |
180n | No | 0.55 | 0.41 | -58 | 0 | 25 | 0.86 | 0.73 | 0.24 | 2.73 | |
181e | No | 0.69 | 0.42 | -58 | 0 | 13 | 0.096 | 0.71 | 0.053 | 0 | 1.59 |
181n | No | 0.66 | 0.42 | -58 | 0 | 12 | 0.057 | 1.1 | 0.051 | 0 | 1.69 |
182e | No | 0.66 | 0.41 | -58 | 0 | 11 | 0.15 | 0.74 | 0.034 | 0 | 1.59 |
182n | No | 0.65 | 0.41 | -58 | 0 | 19 | -0.033 | 0.65 | 0.033 | 0 | 1.96 |
183e | No | 0.68 | 0.4 | -58 | 0 | 32 | 0.047 | 0.73 | 0.024 | 0 | 2.4 |
183n | No | 0.67 | 0.4 | -58 | 0 | 21 | -0.026 | 0.63 | 0.032 | 0 | 2.52 |
184e | No | 0.68 | 0.41 | -58 | 0 | 11 | 0.12 | 0.81 | 0.041 | 0 | 1.53 |
184n | No | 0.65 | 0.41 | -58 | 0 | 32 | -0.004 | 0.54 | 0.012 | 0 | 1.68 |
185e | No | 0.67 | 0.41 | -58 | 0 | 19 | 0.088 | 0.65 | 0.029 | 0 | 1.53 |
185n | No | 0.66 | 0.41 | -58 | 0 | 23 | 0.0033 | 0.61 | 0.026 | 0 | 1.73 |
186e | No | 0.69 | 0.42 | -58 | 0 | 20 | 0.043 | 0.65 | 0.029 | 0 | 1.64 |
186n | No | 0.67 | 0.42 | -58 | 0 | 21 | -0.047 | 0.68 | 0.027 | 0 | 2.02 |
187e | No | 0.66 | 0.4 | -58 | 0 | 12 | 0.22 | 0.79 | 0.055 | 0 | 1.63 |
187n | No | 0.65 | 0.4 | -58 | 0 | 27 | -0.0019 | 0.63 | 0.016 | 0 | 1.79 |
188e | No | 0.65 | 0.38 | -58 | 0 | 23 | 0.11 | 0.67 | 0.031 | 0 | 1.94 |
188n | No | 0.56 | 0.38 | -58 | 0 | 41 | 0.4 | 0.71 | 0.14 | 0 | 3.65 |
189e | No | 0.67 | 0.42 | -58 | 0 | 21 | 0.04 | 0.65 | 0.031 | 0 | 1.49 |
189n | No | 0.64 | 0.42 | -58 | 0 | 24 | -0.017 | 0.68 | 0.022 | 0 | 1.59 |
190e | No | 0.66 | 0.42 | -58 | 0 | 21 | 0.12 | 0.81 | 0.027 | 0 | 1.58 |
190n | No | 0.64 | 0.42 | -58 | 0 | 23 | 0.003 | 0.69 | 0.022 | 0 | 1.7 |
191e | No | 0.65 | 0.41 | -58 | 0 | 23 | 0.1 | 0.86 | 0.022 | 0 | 1.58 |
191n | No | 0.63 | 0.41 | -58 | 0 | 23 | 0.053 | 0.61 | 0.032 | 0 | 1.64 |
192e | No | 0.58 | 0.4 | -58 | 0 | 12 | 0.2 | 0.8 | 0.044 | 0 | 1.66 |
192n | No | 0.61 | 0.4 | -58 | 0 | 36 | 0.0059 | 0.54 | 0.022 | 0 | 1.75 |
193e | No | 0.62 | 0.42 | -58 | 0 | 33 | 0.11 | 0.54 | 0.028 | 0 | 1.95 |
193n | No | 0.58 | 0.42 | -58 | 0 | 24 | 0.066 | 0.63 | 0.023 | 0 | 1.74 |
194e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
194n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
195e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
195n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
196e | No | 0.21 | -0.36 | -58 | 0 | 32 | 0.062 | 0.53 | 0.039 | 2.1 | |
196n | No | 0.21 | -0.36 | -58 | 0 | 34 | -0.016 | 0.53 | 0.025 | 2.02 | |
197e | No | 0.6 | 0.39 | -58 | 0 | 18 | 0.15 | 0.71 | 0.029 | 0 | 1.8 |
197n | No | 0.61 | 0.39 | -58 | 0 | 29 | -0.0087 | 0.58 | 0.026 | 0 | 1.86 |
198e | No | 0.65 | 0.43 | -58 | 0 | 37 | 0.074 | 0.52 | 0.024 | 0 | 1.76 |
198n | No | 0.62 | 0.43 | -58 | 0 | 23 | 0.014 | 1 | 0.024 | 0 | 1.65 |
199e | No | 0.64 | 0.42 | -58 | 0 | 41 | 0.16 | 0.48 | 0.048 | 0 | 1.49 |
199n | No | 0.63 | 0.42 | -58 | 0 | 13 | 2.3 | 0.73 | 0.59 | 1.62 | |
200e | No | 0.041 | 0.091 | -58 | 0 | 3.1 | 0.56 | 7.3 | 0.16 | 1.12 | |
200n | No | 0.26 | 0.091 | -58 | 0 | 20 | 0.11 | 0.69 | 0.045 | 0 | 2.63 |
201e | No | 0.64 | 0.4 | -58 | 0 | 17 | 0.19 | 0.89 | 0.034 | 0 | 1.5 |
201n | No | 0.63 | 0.4 | -58 | 0 | 23 | 0.019 | 0.64 | 0.02 | 0 | 1.52 |
202e | No | 0.66 | 0.41 | -58 | 0 | 42 | 0.078 | 0.57 | 0.037 | 0 | 1.71 |
202n | No | 0.64 | 0.41 | -58 | 0 | 25 | 0.053 | 1.9 | 0.017 | 0 | 1.71 |
204e | No | 0.67 | 0.41 | -58 | 0 | 18 | -0.24 | 0.72 | 0.11 | 0 | 2.14 |
204n | No | 0.65 | 0.41 | -58 | 0 | 20 | -0.41 | 0.9 | 0.13 | 0 | 2.53 |
205e | No | 0.66 | 0.41 | -58 | 0 | 35 | 0.053 | 0.57 | 0.027 | 0 | 1.48 |
205n | No | 0.64 | 0.41 | -58 | 0 | 29 | -0.00055 | 1.6 | 0.0098 | 0 | 1.83 |
206e | No | 0.57 | 0.4 | -58 | 0 | 10 | 0.29 | 1.5 | 0.057 | 0 | 1.6 |
206n | No | 0.61 | 0.4 | -58 | 0 | 21 | 0.059 | 0.75 | 0.024 | 0 | 2 |
207e | No | 0.65 | 0.41 | -58 | 0 | 35 | 0.15 | 0.89 | 0.036 | 0 | 1.53 |
207n | No | 0.62 | 0.41 | -58 | 0 | 23 | 0.11 | 0.94 | 0.033 | 0 | 1.78 |
208e | No | 0.66 | 0.43 | -58 | 0 | 10 | -0.23 | 1.1 | 0.1 | 0 | 1.52 |
208n | No | 0.61 | 0.43 | -58 | 0 | 2.7 | -0.33 | 0.77 | 0.14 | 0 | 2.16 |
209e | No | 0.65 | 0.41 | -58 | 0 | 7 | -0.27 | 0.76 | 0.12 | 0 | 1.51 |
209n | No | 0.63 | 0.41 | -58 | 0 | 13 | -0.32 | 0.72 | 0.16 | 0 | 2.39 |
210e | No | 0.65 | 0.42 | -58 | 0 | 19 | -0.29 | 1.1 | 0.11 | 0 | 1.49 |
210n | No | 0.62 | 0.42 | -58 | 0 | 22 | -0.32 | 0.61 | 0.11 | 0 | 1.84 |
211e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
211n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
212e | No | 0.62 | 0.42 | -58 | 0 | 36 | 0.073 | 0.81 | 0.036 | 0 | 2.01 |
212n | No | 0.58 | 0.42 | -58 | 0 | 19 | 0.037 | 4.2 | 0.036 | 0 | 2.12 |
213e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
213n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
214e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
214n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
215e | No | 0.62 | 0.42 | -58 | 0 | 45 | 0.065 | 0.52 | 0.044 | 0 | 1.79 |
215n | No | 0.56 | 0.42 | -58 | 0 | 9.5 | 0.2 | 1.3 | 0.098 | 0 | 2.15 |
216e | No | 0.55 | 0.4 | -58 | 0 | 34 | 0.51 | 1.1 | 0.12 | 0 | 2.38 |
216n | No | 0.62 | 0.4 | -58 | 0 | 31 | 0.04 | 0.61 | 0.02 | 0 | 1.94 |
217e | No | 0.65 | 0.42 | -58 | 0 | 62 | 0.055 | 0.35 | 0.08 | 1.72 | |
217n | No | 0.62 | 0.42 | -58 | 0 | 26 | 0.097 | 0.72 | 0.028 | 0 | 1.65 |
218e | No | 0.65 | 0.51 | -58 | 0 | 35 | 0.072 | 0.53 | 0.024 | 0 | 1.49 |
218n | No | 0.25 | 0.51 | -58 | 0 | 0.57 | 0.41 | 15 | 0.17 | 1.18 | |
220e | No | 0.66 | 0.42 | -58 | 0 | 30 | 0.1 | 0.63 | 0.011 | 0 | 1.53 |
220n | No | 0.63 | 0.42 | -58 | 0 | 27 | -0.021 | 0.57 | 0.016 | 0 | 1.75 |
221e | No | 0.64 | 0.41 | -58 | 0 | 26 | 0.1 | 0.8 | 0.018 | 0 | 1.42 |
221n | No | 0.63 | 0.41 | -58 | 0 | 29 | 0.046 | 0.58 | 0.016 | 0 | 1.62 |
222e | No | 0.65 | 0.42 | -58 | 0 | 27 | 0.14 | 0.68 | 0.021 | 0 | 1.52 |
222n | No | 0.62 | 0.42 | -58 | 0 | 33 | 0.033 | 0.61 | 0.028 | 0 | 1.64 |
223e | No | 0.64 | 0.41 | -58 | 0 | 20 | 0.099 | 0.77 | 0.014 | 0 | 1.42 |
223n | No | 0.63 | 0.41 | -58 | 0 | 44 | -0.037 | 0.53 | 0.032 | 0 | 1.53 |
224e | No | 0.64 | 0.41 | -58 | 0 | 46 | 0.077 | 0.43 | 0.049 | 0 | 1.49 |
224n | No | 0.63 | 0.41 | -58 | 0 | 32 | 0.014 | 0.55 | 0.018 | 0 | 1.73 |
225e | No | 0.64 | 0.42 | -58 | 0 | 36 | 0.088 | 0.62 | 0.024 | 0 | 1.44 |
225n | No | 0.63 | 0.42 | -58 | 0 | 31 | 0.02 | 0.58 | 0.018 | 0 | 1.74 |
226e | No | 0.65 | 0.41 | -58 | 0 | 28 | 0.11 | 0.61 | 0.014 | 0 | 1.52 |
226n | No | 0.62 | 0.41 | -58 | 0 | 42 | -0.0057 | 0.51 | 0.035 | 0 | 1.72 |
227e | No | 0.63 | 0.41 | -58 | 0 | 21 | 0.12 | 0.96 | 0.024 | 0 | 1.49 |
227n | No | 0.62 | 0.41 | -58 | 0 | 31 | 0.012 | 0.79 | 0.015 | 0 | 1.89 |
228e | No | 0.64 | 0.42 | -58 | 0 | 33 | 0.086 | 0.7 | 0.022 | 0 | 1.43 |
228n | No | 0.61 | 0.42 | -58 | 0 | 23 | 0.028 | 0.64 | 0.021 | 0 | 1.64 |
229e | No | 0.033 | 0.52 | -58 | 0 | 3.2 | 0.52 | 1.8 | 0.16 | 1.14 | |
229n | No | 0.6 | 0.52 | -58 | 0 | 46 | -0.023 | 0.44 | 0.04 | 0 | 1.72 |
231e | No | 0.59 | 0.39 | -58 | 0 | 31 | 0.077 | 0.55 | 0.038 | 0 | 2.09 |
231n | No | 0.57 | 0.39 | -58 | 0 | 34 | -0.046 | 0.63 | 0.046 | 0 | 2.6 |
232e | No | 0.57 | 0.41 | -58 | 0 | 87 | 0.0067 | 0.19 | 0.13 | 1.66 | |
232n | No | 0.57 | 0.41 | -58 | 0 | 22 | 0.042 | 0.87 | 0.023 | 0 | 1.64 |
233e | No | 0.63 | 0.42 | -58 | 0 | 27 | 0.086 | 0.61 | 0.026 | 0 | 1.64 |
233n | No | 0.6 | 0.42 | -58 | 0 | 46 | -0.0016 | 0.43 | 0.056 | 0 | 1.79 |
234e | No | 0.65 | 0.43 | -58 | 0 | 27 | 0.15 | 0.78 | 0.028 | 0 | 1.69 |
234n | No | 0.61 | 0.43 | -58 | 0 | 25 | 0.15 | 0.88 | 0.047 | 0 | 1.72 |
235e | No | 0.63 | 0.41 | -58 | 0 | 22 | 0.14 | 1 | 0.025 | 0 | 1.61 |
235n | No | 0.62 | 0.41 | -58 | 0 | 22 | 0.014 | 0.79 | 0.024 | 0 | 1.81 |
237e | No | 0.64 | 0.42 | -58 | 0 | 21 | 0.12 | 0.7 | 0.019 | 0 | 1.49 |
237n | No | 0.63 | 0.42 | -58 | 0 | 25 | 0.025 | 0.63 | 0.017 | 0 | 1.7 |
238e | No | 0.65 | 0.43 | -58 | 0 | 39 | 0.054 | 0.49 | 0.039 | 0 | 1.41 |
238n | No | 0.63 | 0.43 | -58 | 0 | 40 | 0.025 | 0.46 | 0.026 | 0 | 1.52 |
239e | No | 0.64 | 0.41 | -58 | 0 | 24 | 0.11 | 1.1 | 0.019 | 0 | 1.4 |
239n | No | 0.62 | 0.41 | -58 | 0 | 35 | -0.0076 | 0.53 | 0.02 | 0 | 1.46 |
240e | No | 0.63 | 0.42 | -58 | 0 | 32 | 0.12 | 0.63 | 0.015 | 0 | 1.39 |
240n | No | 0.62 | 0.42 | -58 | 0 | 31 | 0.048 | 0.54 | 0.019 | 0 | 1.4 |
241e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
241n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
242e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
242n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
243e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
243n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
244e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
244n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
245e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
245n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
246e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
246n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
250e | No | 0.63 | 0.41 | -58 | 0 | 26 | 0.11 | 1.5 | 0.023 | 0 | 1.61 |
250n | No | 0.61 | 0.41 | -58 | 0 | 32 | 0.0028 | 0.56 | 0.025 | 0 | 1.9 |
251e | No | 0.035 | 0.56 | -58 | 0 | 0.84 | 0.13 | 5 | 0.14 | 1.12 | |
251n | No | 0.61 | 0.56 | -58 | 0 | 4.3 | -0.39 | 0.76 | 0.13 | 0 | 2.1 |
252e | No | 0.62 | 0.41 | -58 | 0 | 29 | 0.09 | 0.66 | 0.028 | 0 | 2.08 |
252n | No | 0.6 | 0.41 | -58 | 0 | 23 | -0.012 | 0.64 | 0.033 | 0 | 2.68 |
253e | No | 0.63 | 0.44 | -58 | 0 | 24 | 0.13 | 0.64 | 0.029 | 0 | 2.03 |
253n | No | 0.54 | 0.44 | -58 | 0 | 6.7 | 0.25 | 1.7 | 0.078 | 0 | 2.07 |
255e | No | 0.2 | -0.35 | -58 | 0 | 74 | -0.012 | 0.24 | 0.11 | 2.43 | |
255n | No | 0.22 | -0.35 | -58 | 0 | 37 | 0.046 | 0.51 | 0.027 | 2.59 | |
256e | No | 0.62 | 0.42 | -58 | 0 | 27 | 0.1 | 0.96 | 0.024 | 0 | 1.4 |
256n | No | 0.57 | 0.42 | -58 | 0 | 10 | 0.15 | 2.5 | 0.047 | 0 | 1.52 |
261e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
261n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
262e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
262n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
266e | No | 0.53 | 0.41 | -58 | 0 | 16 | 0.61 | 0.75 | 0.2 | 2.15 | |
266n | No | 0.61 | 0.41 | -58 | 0 | 26 | -0.39 | 0.66 | 0.12 | 0 | 2.05 |
267e | No | 0.6 | 0.39 | -58 | 0 | 13 | 0.13 | 0.77 | 0.036 | 0 | 1.89 |
267n | No | 0.59 | 0.39 | -58 | 0 | 21 | -0.022 | 0.64 | 0.034 | 0 | 2.62 |
268e | No | 0.6 | 0.39 | -58 | 0 | 15 | 0.16 | 0.92 | 0.037 | 0 | 2.04 |
268n | No | 0.56 | 0.39 | -58 | 0 | 10 | 0.14 | 1.9 | 0.052 | 0 | 2.78 |
269e | No | 0.62 | 0.41 | -58 | 0 | 39 | 0.088 | 0.49 | 0.038 | 0 | 1.89 |
269n | No | 0.6 | 0.41 | -58 | 0 | 35 | -0.024 | 0.6 | 0.034 | 0 | 2.4 |
270e | No | 0.62 | 0.43 | -58 | 0 | 47 | 0.059 | 0.45 | 0.042 | 0 | 1.55 |
270n | No | 0.6 | 0.43 | -58 | 0 | 43 | 0.011 | 0.45 | 0.034 | 0 | 1.71 |
272e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
272n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
281e | No | 0.032 | 0.52 | -58 | 0 | 3.1 | 0.55 | 1.4 | 0.16 | 1.15 | |
281n | No | 0.58 | 0.52 | -58 | 0 | 19 | 0.034 | 0.73 | 0.029 | 0 | 2.18 |
282e | No | 0.63 | 0.43 | -58 | 0 | 28 | 0.092 | 0.74 | 0.022 | 0 | 1.72 |
282n | No | 0.6 | 0.43 | -58 | 0 | 47 | -0.0045 | 0.43 | 0.05 | 0 | 2.01 |
283e | No | 0.62 | 0.43 | -58 | 0 | 31 | 0.053 | 0.61 | 0.016 | 0 | 1.6 |
283n | No | 0.58 | 0.43 | -58 | 0 | 18 | 0.043 | 0.8 | 0.022 | 0 | 1.88 |
285e | No | 0.61 | 0.42 | -58 | 0 | 31 | 0.077 | 0.65 | 0.037 | 0 | 1.68 |
285n | No | 0.58 | 0.42 | -58 | 0 | 25 | -0.0066 | 0.69 | 0.038 | 0 | 1.72 |
295e | No | 0.63 | 0.44 | -58 | 0 | 5.4 | -0.33 | 0.74 | 0.13 | 0 | 1.54 |
295n | No | 0.6 | 0.44 | -58 | 0 | 7.7 | -0.47 | 0.71 | 0.15 | 0 | 1.76 |
320e | No | 0.5 | 0.38 | -58 | 0 | 22 | 0.056 | 0.72 | 0.035 | 0 | 0 |
320n | No | 0.48 | 0.38 | -58 | 0 | 26 | -0.067 | 0.63 | 0.048 | 0 | 0 |
321e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
321n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | 0 | |||
323e | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | ||||
323n | Yes | -58 | 1.5E+03 | 0 | 0 | INF | INF | ||||
324e | No | 0.49 | 0.36 | -58 | 0 | 41 | 0.071 | 1.3 | 0.053 | 0 | 2.05E-15 |
324n | No | 0.47 | 0.36 | -58 | 0 | 46 | -0.0065 | 0.46 | 0.055 | 0 | -5.85E-17 |
325e | No | 0.53 | 0.4 | -58 | 0 | 41 | 0.072 | 0.5 | 0.034 | 0 | -3.45E-16 |
325n | No | 0.5 | 0.4 | -58 | 0 | 26 | 0.03 | 0.61 | 0.019 | 0 | 6.86E-17 |
326e | No | 0.55 | 0.39 | -58 | 0 | 26 | 0.11 | 0.62 | 0.036 | 0 | 2.54 |
326n | No | 0.51 | 0.39 | -58 | 0 | 27 | 0.046 | 0.59 | 0.042 | 0 | 2.24 |
327e | No | 0.57 | 0.38 | -58 | 0 | 34 | 0.075 | 0.55 | 0.045 | 0 | 5.43 |
327n | No | 0.54 | 0.38 | -58 | 0 | 40 | -0.0076 | 0.48 | 0.053 | 0 | 5.07 |
328e | No | 0.037 | 0.0024 | -58 | 0 | 3.3 | 0.54 | 1.3 | 0.16 | 1.72E-18 | |
328n | No | 0.038 | 0.0024 | -58 | 0 | 3.1 | 0.6 | 1.5 | 0.19 | 2.3E-18 | |
329e | No | 0.5 | 0.38 | -58 | 0 | 28 | 0.16 | 0.6 | 0.023 | 0 | |
329n | No | 0.36 | 0.38 | -58 | 0 | 26 | 0.58 | 1.1 | 0.18 | 0 | |
331e | No | 0.04 | 0.47 | -58 | 0 | 3.5 | 0.55 | 1.5 | 0.16 | 1.27 | |
331n | No | 0.53 | 0.47 | -58 | 0 | 33 | 0.064 | 0.76 | 0.041 | 0 | 4.34 |
332e | No | 0.035 | -0.00013 | -58 | 0 | 3.3 | 0.56 | 4.3 | 0.15 | 1.46E-18 | |
332n | No | 0.035 | -0.00013 | -58 | 0 | 2.9 | 0.57 | 9.2 | 0.17 | 1.73E-18 | |
333e | No | 0.47 | 0.34 | -58 | 0 | 12 | 0.1 | 1.5 | 0.038 | 0 | |
333n | No | 0.46 | 0.34 | -58 | 0 | 13 | -0.043 | 0.87 | 0.055 | 0 | |
336e | No | 0.48 | 0.33 | -58 | 0 | 21 | 0.19 | 0.94 | 0.045 | 0 | 1.31E-16 |
336n | No | 0.48 | 0.33 | -58 | 0 | 39 | 0.0034 | 0.56 | 0.043 | 0 | 3.85E-17 |
340e | No | 0.48 | 0.36 | -58 | 0 | 49 | 0.015 | 0.42 | 0.067 | 0 | 2.45 |
340n | No | 0.46 | 0.36 | -58 | 0 | 45 | -0.036 | 0.43 | 0.058 | 0 | 2.36 |
# 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', overall_class)
Final Ant-Pol Classification: Jee: ---------- good (114 antpols): 3, 4, 5, 7, 8, 10, 15, 16, 17, 19, 22, 29, 30, 31, 35, 38, 40, 41, 42, 48, 49, 50, 52, 53, 56, 57, 65, 66, 67, 68, 72, 80, 84, 85, 89, 91, 93, 94, 95, 97, 101, 102, 103, 104, 105, 106, 109, 111, 112, 114, 120, 121, 122, 123, 124, 126, 127, 128, 129, 133, 134, 136, 138, 143, 144, 145, 146, 147, 148, 149, 152, 153, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 171, 173, 179, 180, 181, 182, 184, 185, 186, 187, 188, 189, 190, 191, 192, 197, 201, 220, 221, 222, 223, 226, 227, 233, 234, 235, 237, 239, 256, 267, 282 suspect (63 antpols): 9, 20, 21, 32, 36, 37, 54, 62, 69, 73, 79, 81, 82, 83, 96, 98, 99, 100, 108, 110, 113, 115, 116, 119, 131, 132, 135, 139, 150, 151, 154, 172, 183, 193, 198, 199, 202, 204, 205, 206, 207, 208, 209, 210, 212, 215, 216, 218, 224, 225, 228, 231, 238, 240, 250, 252, 253, 268, 269, 270, 283, 285, 295 bad (75 antpols): 18, 27, 28, 33, 34, 45, 46, 47, 51, 55, 61, 63, 64, 70, 71, 77, 78, 86, 87, 88, 90, 92, 107, 117, 118, 125, 130, 137, 140, 141, 142, 155, 170, 174, 175, 176, 177, 178, 194, 195, 196, 200, 211, 213, 214, 217, 229, 232, 241, 242, 243, 244, 245, 246, 251, 255, 261, 262, 266, 272, 281, 320, 321, 323, 324, 325, 326, 327, 328, 329, 331, 332, 333, 336, 340 Jnn: ---------- good (103 antpols): 4, 5, 7, 8, 9, 10, 15, 16, 17, 19, 20, 21, 22, 29, 30, 34, 38, 48, 50, 51, 52, 53, 54, 56, 57, 65, 67, 68, 69, 72, 79, 85, 87, 89, 91, 92, 94, 101, 102, 103, 105, 106, 108, 110, 111, 112, 114, 120, 121, 122, 123, 124, 126, 127, 128, 129, 132, 133, 135, 136, 138, 139, 143, 144, 145, 147, 148, 149, 150, 151, 152, 153, 155, 159, 160, 162, 163, 164, 165, 167, 168, 169, 170, 179, 185, 189, 190, 191, 193, 197, 198, 201, 207, 217, 220, 221, 228, 232, 234, 235, 237, 283, 285 suspect (66 antpols): 32, 36, 41, 42, 45, 46, 49, 62, 66, 80, 81, 82, 84, 93, 95, 98, 99, 100, 113, 116, 119, 146, 154, 166, 172, 173, 181, 182, 183, 184, 186, 187, 192, 202, 204, 205, 206, 208, 209, 210, 215, 216, 222, 223, 224, 225, 226, 227, 229, 231, 233, 238, 239, 240, 250, 251, 252, 253, 266, 267, 268, 269, 270, 281, 282, 295 bad (83 antpols): 3, 18, 27, 28, 31, 33, 35, 37, 40, 47, 55, 61, 63, 64, 70, 71, 73, 77, 78, 83, 86, 88, 90, 96, 97, 104, 107, 109, 115, 117, 118, 125, 130, 131, 134, 137, 140, 141, 142, 161, 171, 174, 175, 176, 177, 178, 180, 188, 194, 195, 196, 199, 200, 211, 212, 213, 214, 218, 241, 242, 243, 244, 245, 246, 255, 256, 261, 262, 272, 320, 321, 323, 324, 325, 326, 327, 328, 329, 331, 332, 333, 336, 340
Save calibration solutions¶
# update flags in omnical gains and visibility solutions
for ant in omni_flags:
omni_flags[ant] |= rfi_flags
for bl in vissol_flags:
vissol_flags[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_vissol = io.HERAData(SUM_FILE)
hc_omni = hd_vissol.init_HERACal(gain_convention='divide', cal_style='redundant')
hc_omni.update(gains=sol.gains, flags=omni_flags, quals=meta['chisq_per_ant'], total_qual=meta['chisq'])
hc_omni.history += add_to_history
hc_omni.write_calfits(OMNICAL_FILE, clobber=True)
del hc_omni
malloc_trim()
if SAVE_OMNIVIS_FILE:
# output results, harmonizing keys over polarizations
all_reds = redcal.get_reds(hd.data_antpos, pols=['ee', 'nn'], pol_mode='2pol')
bl_to_red_map = {bl: red[0] for red in all_reds for bl in red}
hd_vissol.read(bls=[bl_to_red_map[bl] for bl in sol.vis], return_data=False)
hd_vissol.empty_arrays()
hd_vissol.history += add_to_history
hd_vissol.update(data={bl_to_red_map[bl]: sol.vis[bl] for bl in sol.vis},
flags={bl_to_red_map[bl]: vissol_flags[bl] for bl in vissol_flags},
nsamples={bl_to_red_map[bl]: vissol_nsamples[bl] for bl in vissol_nsamples})
hd_vissol.write_uvh5(OMNIVIS_FILE, clobber=True)
if SAVE_RESULTS:
del hd_vissol
malloc_trim()
Output fully flagged calibration file if 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)))
Output empty visibility file if OMNIVIS_FILE
is not written¶
if SAVE_RESULTS and not os.path.exists(OMNIVIS_FILE):
print(f'WARNING: No omnivis file produced at {OMNIVIS_FILE}. Creating an empty visibility solution file.')
hd_writer = io.HERAData(SUM_FILE)
hd_writer.initialize_uvh5_file(OMNIVIS_FILE, clobber=True)
WARNING: No omnivis file produced at /mnt/sn1/data2/2460458/zen.2460458.34464.sum.omni_vis.uvh5. Creating an empty visibility solution file.
Metadata¶
for repo in ['pyuvdata', 'hera_cal', 'hera_filters', 'hera_qm', 'hera_notebook_templates']:
exec(f'from {repo} import __version__')
print(f'{repo}: {__version__}')
pyuvdata: 2.4.2 hera_cal: 3.6.dev110+gcc0a13d hera_filters: 0.1.5 hera_qm: 2.1.5.dev6+g23b7cf7 hera_notebook_templates: 0.1.dev734+g90f16f4
print(f'Finished execution in {(time.time() - tstart) / 60:.2f} minutes.')
Finished execution in 6.96 minutes.