Nightly Per-Antenna Quality Summary Notebook¶

Josh Dillon, Last Revised February 2021

This notebooks brings together as much information as possible from ant_metrics, auto_metrics and redcal to help figure out which antennas are working properly and summarizes it in a single giant table. It is meant to be lightweight and re-run as often as necessary over the night, so it can be run when any of those is done and then be updated when another one completes.

In [1]:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
import pandas as pd
pd.set_option('display.max_rows', 1000)
from hera_qm.metrics_io import load_metric_file
from hera_cal import utils, io, redcal
import glob
import os
import h5py
from copy import deepcopy
from IPython.display import display, HTML
from hera_notebook_templates.utils import status_colors

%matplotlib inline
%config InlineBackend.figure_format = 'retina'
display(HTML("<style>.container { width:100% !important; }</style>"))
In [2]:
# If you want to run this notebook locally, copy the output of the next cell into the first few lines of this cell.

# JD = "2459122"
# data_path = '/lustre/aoc/projects/hera/H4C/2459122'
# ant_metrics_ext = ".ant_metrics.hdf5"
# redcal_ext = ".maybe_good.omni.calfits"
# nb_outdir = '/lustre/aoc/projects/hera/H4C/h4c_software/H4C_Notebooks/_rtp_summary_'
# os.environ["JULIANDATE"] = JD
# os.environ["DATA_PATH"] = data_path
# os.environ["ANT_METRICS_EXT"] = ant_metrics_ext
# os.environ["REDCAL_EXT"] = redcal_ext
# os.environ["NB_OUTDIR"] = nb_outdir
In [3]:
# Use environment variables to figure out path to data
JD = os.environ['JULIANDATE']
data_path = os.environ['DATA_PATH']
ant_metrics_ext = os.environ['ANT_METRICS_EXT']
redcal_ext = os.environ['REDCAL_EXT']
nb_outdir = os.environ['NB_OUTDIR']
print(f'JD = "{JD}"')
print(f'data_path = "{data_path}"')
print(f'ant_metrics_ext = "{ant_metrics_ext}"')
print(f'redcal_ext = "{redcal_ext}"')
print(f'nb_outdir = "{nb_outdir}"')
JD = "2459760"
data_path = "/mnt/sn1/2459760"
ant_metrics_ext = ".ant_metrics.hdf5"
redcal_ext = ".known_good.omni.calfits"
nb_outdir = "/home/obs/src/H5C_Notebooks/_rtp_summary_"
In [4]:
from astropy.time import Time
utc = Time(JD, format='jd').datetime
print(f'Date: {utc.month}-{utc.day}-{utc.year}')
Date: 6-29-2022
In [5]:
# Per-season options
def ant_to_report_url(ant):
    return f'https://htmlpreview.github.io/?https://github.com/HERA-Team/H5C_Notebooks/blob/main/antenna_report/antenna_{ant}_report.html'

Load Auto Metrics¶

In [6]:
use_auto_metrics = False

# find the auto_metrics file
glob_str = os.path.join(data_path, f'zen.{JD}*.auto_metrics.h5')
auto_metrics_file = sorted(glob.glob(glob_str))

# if it exists, load and extract relevant information
if len(auto_metrics_file) > 0:
    auto_metrics_file = auto_metrics_file[0]
    print(f'Found auto_metrics results file at {auto_metrics_file}.')
    
    auto_metrics = load_metric_file(auto_metrics_file)
    mean_round_modz_cut = auto_metrics['parameters']['mean_round_modz_cut']
    auto_ex_ants = auto_metrics['ex_ants']['r2_ex_ants']
    
    use_auto_metrics = True
else:
    print(f'No files found matching glob {glob_str}. Skipping auto_metrics.')
Found auto_metrics results file at /mnt/sn1/2459760/zen.2459760.25301.sum.auto_metrics.h5.

Load Ant Metrics¶

In [7]:
use_ant_metrics = False

# get a list of all ant_metrics files
glob_str = os.path.join(data_path, f'zen.{JD}.?????.sum{ant_metrics_ext}')
ant_metrics_files = sorted(glob.glob(glob_str))

# if they exist, load as many of them as possible
if len(ant_metrics_files) > 0:
    print(f'Found {len(ant_metrics_files)} ant_metrics files matching glob {glob_str}')
    ant_metrics_apriori_exants = {}
    ant_metrics_xants_dict = {}
    ant_metrics_dead_ants_dict = {}
    ant_metrics_crossed_ants_dict = {}
    ant_metrics_dead_metrics = {}
    ant_metrics_crossed_metrics = {}
    dead_cuts = {}
    crossed_cuts = {}
    for amf in ant_metrics_files:
        with h5py.File(amf, "r") as infile: # use h5py directly since it's much faster than load_metric_file
            # get out results for this file
            dead_cuts[amf] = infile['Metrics']['dead_ant_cut'][()]
            crossed_cuts[amf] = infile['Metrics']['cross_pol_cut'][()]
            xants = infile['Metrics']['xants'][:]
            dead_ants = infile['Metrics']['dead_ants'][:]
            crossed_ants = infile['Metrics']['crossed_ants'][:]        
            try:
                # look for ex_ants in history
                ex_ants_string = infile['Header']['history'][()].decode()
                ex_ants_string = ex_ants_string.split('--apriori_xants')[1]
                ex_ants_string = ex_ants_string.split('--')[0].strip()
            except:
                ex_ants_string = ''
                    
            # This only works for the new correlation-matrix-based ant_metrics
            if 'corr' in infile['Metrics']['final_metrics'] and 'corrXPol' in infile['Metrics']['final_metrics']:
                ant_metrics_dead_metrics[amf] = {eval(ant): infile['Metrics']['final_metrics']['corr'][ant][()]
                                                 for ant in infile['Metrics']['final_metrics']['corr']}
                ant_metrics_crossed_metrics[amf] = {eval(ant): infile['Metrics']['final_metrics']['corrXPol'][ant][()]
                                                    for ant in infile['Metrics']['final_metrics']['corrXPol']}                       
            else:
                raise(KeywordError)
        
        # organize results by file
        ant_metrics_xants_dict[amf] = [(int(ant[0]), ant[1].decode()) for ant in xants]
        ant_metrics_dead_ants_dict[amf] = [(int(ant[0]), ant[1].decode()) for ant in dead_ants]
        ant_metrics_crossed_ants_dict[amf] = [(int(ant[0]), ant[1].decode()) for ant in crossed_ants]
        ant_metrics_apriori_exants[amf] = [int(ant) for ant in ex_ants_string.split()]
    
    dead_cut = np.median(list(dead_cuts.values()))
    crossed_cut = np.median(list(crossed_cuts.values()))
        
    use_ant_metrics = True
else:
    print(f'No files found matching glob {glob_str}. Skipping ant_metrics.')
Found 372 ant_metrics files matching glob /mnt/sn1/2459760/zen.2459760.?????.sum.ant_metrics.hdf5

Load chi^2 info from redcal¶

In [8]:
use_redcal = False
glob_str = os.path.join(data_path, f'zen.{JD}.?????.sum{redcal_ext}')

redcal_files = sorted(glob.glob(glob_str))
if len(redcal_files) > 0:
    print(f'Found {len(redcal_files)} ant_metrics files matching glob {glob_str}')
    post_redcal_ant_flags_dict = {}
    flagged_by_redcal_dict = {}
    cspa_med_dict = {}
    for cal in redcal_files:
        hc = io.HERACal(cal)
        _, flags, cspa, chisq = hc.read()
        cspa_med_dict[cal] = {ant: np.nanmedian(cspa[ant], axis=1) for ant in cspa}

        post_redcal_ant_flags_dict[cal] = {ant: np.all(flags[ant]) for ant in flags}
        # check history to distinguish antennas flagged going into redcal from ones flagged during redcal
        tossed_antenna_lines =  hc.history.replace('\n','').split('Throwing out antenna ')[1:]
        flagged_by_redcal_dict[cal] = sorted([int(line.split(' ')[0]) for line in tossed_antenna_lines])
        
    use_redcal = True
else:
    print(f'No files found matching glob {glob_str}. Skipping redcal chisq.')
Found 38 ant_metrics files matching glob /mnt/sn1/2459760/zen.2459760.?????.sum.known_good.omni.calfits

Figure out some general properties¶

In [9]:
# Parse some general array properties, taking into account the fact that we might be missing some of the metrics
ants = []
pols = []
antpol_pairs = []

if use_auto_metrics:
    ants = sorted(set(bl[0] for bl in auto_metrics['modzs']['r2_shape_modzs']))
    pols = sorted(set(bl[2] for bl in auto_metrics['modzs']['r2_shape_modzs']))
if use_ant_metrics:
    antpol_pairs = sorted(set([antpol for dms in ant_metrics_dead_metrics.values() for antpol in dms.keys()]))
    antpols = sorted(set(antpol[1] for antpol in antpol_pairs))
    ants = sorted(set(antpol[0] for antpol in antpol_pairs) | set(ants))
    pols = sorted(set(utils.join_pol(ap, ap) for ap in antpols) | set(pols))
if use_redcal:
    antpol_pairs = sorted(set([ant for cspa in cspa_med_dict.values() for ant in cspa.keys()]) | set(antpol_pairs))
    antpols = sorted(set(antpol[1] for antpol in antpol_pairs))
    ants = sorted(set(antpol[0] for antpol in antpol_pairs) | set(ants))
    pols = sorted(set(utils.join_pol(ap, ap) for ap in antpols) | set(pols))

# Figure out remaining antennas not in data
hd = io.HERAData(sorted(glob.glob(os.path.join(data_path, 'zen.*.sum.uvh5')))[0])
unused_ants = [ant for ant in hd.antpos if ant not in ants]    

Load a priori antenna statuses and node numbers¶

In [10]:
# try to load a priori antenna statusesm but fail gracefully if this doesn't work.
a_priori_statuses = {ant: 'Not Found' for ant in ants}
nodes = {ant: np.nan for ant in ants + unused_ants}
try:
    from hera_mc import cm_hookup

    # get node numbers
    hookup = cm_hookup.get_hookup('default')
    for ant_name in hookup:
        ant = int("".join(filter(str.isdigit, ant_name)))
        if ant in nodes:
            if hookup[ant_name].get_part_from_type('node')['E<ground'] is not None:
                nodes[ant] = int(hookup[ant_name].get_part_from_type('node')['E<ground'][1:])
    
    # get apriori antenna status
    for ant_name, data in hookup.items():
        ant = int("".join(filter(str.isdigit, ant_name)))
        if ant in a_priori_statuses:
            a_priori_statuses[ant] = data.apriori

except Exception as err:
    print(f'Could not load node numbers and a priori antenna statuses.\nEncountered {type(err)} with message: {err}')

Summarize auto metrics¶

In [11]:
if use_auto_metrics:
    # Parse modzs
    modzs_to_check = {'Shape': 'r2_shape_modzs', 'Power': 'r2_power_modzs', 
                      'Temporal Variability': 'r2_temp_var_modzs', 'Temporal Discontinuties': 'r2_temp_diff_modzs'}
    worst_metrics = []
    worst_zs = []
    all_modzs = {}
    binary_flags = {rationale: [] for rationale in modzs_to_check}

    for ant in ants:
        # parse modzs and figure out flag counts
        modzs = {f'{pol} {rationale}': auto_metrics['modzs'][dict_name][(ant, ant, pol)] 
                 for rationale, dict_name in modzs_to_check.items() for pol in pols}
        for pol in pols:
            for rationale, dict_name in modzs_to_check.items():
                binary_flags[rationale].append(auto_metrics['modzs'][dict_name][(ant, ant, pol)] > mean_round_modz_cut)

        # parse out all metrics for dataframe
        for k in modzs:
            col_label = k + ' Modified Z-Score'
            if col_label in all_modzs:
                all_modzs[col_label].append(modzs[k])
            else:
                all_modzs[col_label] = [modzs[k]]
                
    mean_round_modz_cut = auto_metrics['parameters']['mean_round_modz_cut']
else:
    mean_round_modz_cut = 0

Summarize ant metrics¶

In [12]:
if use_ant_metrics:
    a_priori_flag_frac = {ant: np.mean([ant in apxa for apxa in ant_metrics_apriori_exants.values()]) for ant in ants}
    dead_ant_frac = {ap: {ant: np.mean([(ant, ap) in das for das in ant_metrics_dead_ants_dict.values()])
                                 for ant in ants} for ap in antpols}
    crossed_ant_frac = {ant: np.mean([np.any([(ant, ap) in cas for ap in antpols])
                                      for cas in ant_metrics_crossed_ants_dict.values()]) for ant in ants}
    ant_metrics_xants_frac_by_antpol = {antpol: np.mean([antpol in amx for amx in ant_metrics_xants_dict.values()]) for antpol in antpol_pairs}
    ant_metrics_xants_frac_by_ant = {ant: np.mean([np.any([(ant, ap) in amx for ap in antpols])
                                     for amx in ant_metrics_xants_dict.values()]) for ant in ants}
    average_dead_metrics = {ap: {ant: np.nanmean([dm.get((ant, ap), np.nan) for dm in ant_metrics_dead_metrics.values()]) 
                                 for ant in ants} for ap in antpols}
    average_crossed_metrics = {ant: np.nanmean([cm.get((ant, ap), np.nan) for ap in antpols 
                                                for cm in ant_metrics_crossed_metrics.values()]) for ant in ants}
else:
    dead_cut = 0.4
    crossed_cut = 0.0

Summarize redcal chi^2 metrics¶

In [13]:
if use_redcal:
    cspa = {ant: np.nanmedian(np.hstack([cspa_med_dict[cal][ant] for cal in redcal_files])) for ant in antpol_pairs}
    redcal_prior_flag_frac = {ant: np.mean([np.any([afd[ant, ap] and not ant in flagged_by_redcal_dict[cal] for ap in antpols])
                                            for cal, afd in post_redcal_ant_flags_dict.items()]) for ant in ants}
    redcal_flagged_frac = {ant: np.mean([ant in fbr for fbr in flagged_by_redcal_dict.values()]) for ant in ants}

Build DataFrame¶

In [14]:
# build dataframe
to_show = {'Ant': [f'<a href="{ant_to_report_url(ant)}" target="_blank">{ant}</a>' for ant in ants],
           'Node': [nodes[ant] for ant in ants], 
           'A Priori Status': [a_priori_statuses[ant] for ant in ants]}
           #'Worst Metric': worst_metrics, 'Worst Modified Z-Score': worst_zs}
df = pd.DataFrame(to_show)

# create bar chart columns for flagging percentages:
bar_cols = {}
if use_auto_metrics:
    bar_cols['Auto Metrics Flags'] = [float(ant in auto_ex_ants) for ant in ants]
if use_ant_metrics:
    if np.sum(list(a_priori_flag_frac.values())) > 0:  # only include this col if there are any a priori flags
        bar_cols['A Priori Flag Fraction in Ant Metrics'] = [a_priori_flag_frac[ant] for ant in ants]
    for ap in antpols:
        bar_cols[f'Dead Fraction in Ant Metrics ({ap})'] = [dead_ant_frac[ap][ant] for ant in ants]
    bar_cols['Crossed Fraction in Ant Metrics'] = [crossed_ant_frac[ant] for ant in ants]
if use_redcal:
    bar_cols['Flag Fraction Before Redcal'] = [redcal_prior_flag_frac[ant] for ant in ants]
    bar_cols['Flagged By Redcal chi^2 Fraction'] = [redcal_flagged_frac[ant] for ant in ants]  
for col in bar_cols:
    df[col] = bar_cols[col]

# add auto_metrics
if use_auto_metrics:
    for label, modz in all_modzs.items():
        df[label] = modz
z_score_cols = [col for col in df.columns if 'Modified Z-Score' in col]        
        
# add ant_metrics
ant_metrics_cols = {}
if use_ant_metrics:
    for ap in antpols:
        ant_metrics_cols[f'Average Dead Ant Metric ({ap})'] = [average_dead_metrics[ap][ant] for ant in ants]
    ant_metrics_cols['Average Crossed Ant Metric'] = [average_crossed_metrics[ant] for ant in ants]
    for col in ant_metrics_cols:
        df[col] = ant_metrics_cols[col]   

# add redcal chisq
redcal_cols = []
if use_redcal:
    for ap in antpols:
        col_title = f'Median chi^2 Per Antenna ({ap})'
        df[col_title] = [cspa[ant, ap] for ant in ants]
        redcal_cols.append(col_title)

# sort by node number and then by antenna number within nodes
df.sort_values(['Node', 'Ant'], ascending=True)

# style dataframe
table = df.style.hide_index()\
          .applymap(lambda val: f'background-color: {status_colors[val]}' if val in status_colors else '', subset=['A Priori Status']) \
          .background_gradient(cmap='viridis', vmax=mean_round_modz_cut * 3, vmin=0, axis=None, subset=z_score_cols) \
          .background_gradient(cmap='bwr_r', vmin=dead_cut-.25, vmax=dead_cut+.25, axis=0, subset=list([col for col in ant_metrics_cols if 'dead' in col.lower()])) \
          .background_gradient(cmap='bwr_r', vmin=crossed_cut-.25, vmax=crossed_cut+.25, axis=0, subset=list([col for col in ant_metrics_cols if 'crossed' in col.lower()])) \
          .background_gradient(cmap='plasma', vmax=4, vmin=1, axis=None, subset=redcal_cols) \
          .applymap(lambda val: 'font-weight: bold' if val < dead_cut else '', subset=list([col for col in ant_metrics_cols if 'dead' in col.lower()])) \
          .applymap(lambda val: 'font-weight: bold' if val < crossed_cut else '', subset=list([col for col in ant_metrics_cols if 'crossed' in col.lower()])) \
          .applymap(lambda val: 'font-weight: bold' if val > mean_round_modz_cut else '', subset=z_score_cols) \
          .applymap(lambda val: 'color: red' if val > mean_round_modz_cut else '', subset=z_score_cols) \
          .bar(subset=list(bar_cols.keys()), vmin=0, vmax=1) \
          .format({col: '{:,.4f}'.format for col in z_score_cols}) \
          .format({col: '{:,.4f}'.format for col in ant_metrics_cols}) \
          .format({col: '{:,.2%}'.format for col in bar_cols}) \
          .applymap(lambda val: 'font-weight: bold', subset=['Ant']) \
          .set_table_styles([dict(selector="th",props=[('max-width', f'70pt')])]) \

Table 1: RTP Per-Antenna Metrics Summary Table¶

This admittedly very busy table incorporates summary information about all antennas in the array. Its columns depend on what information is available when the notebook is run (i.e. whether auto_metrics, ant_metrics, and/or redcal is done). These can be divided into 5 sections:

Basic Antenna Info: antenna number, node, and its a priori status.

Flag Fractions: Fraction of the night that an antenna was flagged for various reasons. Note that auto_metrics flags antennas for the whole night, so it'll be 0% or 100%.

auto_metrics Details: If auto_metrics is included, this section shows the modified Z-score signifying how much of an outlier each antenna and polarization is in each of four categories: bandpass shape, overall power, temporal variability, and temporal discontinuities. Bold red text indicates that this is a reason for flagging the antenna. It is reproduced from the auto_metrics_inspect.ipynb nightly notebook, so check that out for more details on the precise metrics.

ant_metrics Details: If ant_metrics is included, this section shows the average correlation-based metrics for antennas over the whole night. Low "dead ant" metrics (nominally below 0.4) indicate antennas not correlating with the rest of the array. Negative "crossed ant" metrics indicate antennas that show stronger correlations in their cross-pols than their same-pols, indicating that the two polarizations are probably swapped. Bold text indicates that the average is below the threshold for flagging.

redcal chi^2 Details: If redcal is included, this shows the median chi^2 per antenna. This would be 1 in an ideal array. Antennas are thrown out when they they are outliers in their median chi^2, usually greater than 4-sigma outliers in modified Z-score.

In [15]:
HTML(table.render())
Out[15]:
Ant Node A Priori Status Auto Metrics Flags Dead Fraction in Ant Metrics (Jee) Dead Fraction in Ant Metrics (Jnn) Crossed Fraction in Ant Metrics Flag Fraction Before Redcal Flagged By Redcal chi^2 Fraction ee Shape Modified Z-Score nn Shape Modified Z-Score ee Power Modified Z-Score nn Power Modified Z-Score ee Temporal Variability Modified Z-Score nn Temporal Variability Modified Z-Score ee Temporal Discontinuties Modified Z-Score nn Temporal Discontinuties Modified Z-Score Average Dead Ant Metric (Jee) Average Dead Ant Metric (Jnn) Average Crossed Ant Metric Median chi^2 Per Antenna (Jee) Median chi^2 Per Antenna (Jnn)
0 0 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 16.661397 8.055609 118.517806 115.412002 13375.907190 16695.179699 26586.079530 28865.841583 0.017310 0.016166 0.001022 0.905200 0.894796
1 0 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 110.632102 101.746100 180.674542 152.170880 327.343835 195.219406 4166.055905 2945.852977 0.016111 0.016243 0.000267 0.000000 0.000000
2 0 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 79.733668 108.251557 161.289355 161.931333 208.883449 212.704489 3014.861641 2967.119996 0.016273 0.016131 0.000267 inf inf
3 1 RF_maintenance 0.00% 0.00% 0.00% 0.00% 100.00% 0.00% 2.472006 0.182314 0.808742 1.438668 0.150612 1.133602 0.527342 3.889046 0.542754 0.544332 0.343772 5.769403 6.793634
4 1 RF_maintenance 0.00% 0.00% 0.00% 0.00% 100.00% 0.00% -0.394457 3.365693 0.568259 0.032298 -0.221537 0.172392 -0.107386 -1.113120 0.556452 0.544466 0.340382 9.652411 11.280785
5 1 digital_ok 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% -0.063869 0.497460 -0.126506 2.479326 -0.611106 1.780499 -0.040648 -3.108104 0.566586 0.549849 0.341651 1.350182 1.368525
7 2 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% -0.264256 -0.591093 -0.548945 -0.409349 0.810927 1.496894 4.286666 63.790520 0.564419 0.556589 0.343094 4.211074 5.746181
8 2 RF_maintenance 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 4.118912 4.532404 8.302115 9.099746 39.329241 37.582759 80.858669 71.006649 0.539202 0.524360 0.327287 2.873456 3.255084
9 2 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% -0.784468 -0.761048 -0.533831 -0.322751 -0.941970 1.728213 1.143840 5.843741 0.541940 0.532648 0.333112 6.755973 9.274962
10 2 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 1.489700 -0.412113 2.615008 -0.713916 7.525742 11.681805 0.354976 3.212021 0.517901 0.513778 0.329772 3.546467 4.280153
11 0 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
12 0 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
13 0 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
14 0 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 156.613639 88.940560 178.883071 153.755013 313.638457 205.923709 3979.276104 2481.728793 0.017549 0.016610 0.000661 1.052745 1.051252
15 1 digital_ok 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.308509 1.366508 0.517521 -0.335912 1.457668 1.145488 1.077191 3.324134 0.575184 0.561496 0.338939 1.681919 1.916170
16 1 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% -1.090102 0.239963 -0.792848 0.899847 0.286356 -0.003305 11.149532 3.076704 0.587386 0.574571 0.342432 16.565422 18.192918
17 1 digital_ok 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% -0.772392 -0.074963 -0.581014 -0.238440 0.290637 0.549778 1.408298 2.073125 0.573794 0.570264 0.330052 1.304731 1.543696
18 1 RF_maintenance 100.00% 0.00% 75.81% 0.00% 100.00% 0.00% 3.450468 17.570749 2.215282 14.708824 67.029164 62.405302 429.551084 366.305702 0.554023 0.340360 0.349224 5.486189 3.374297
19 2 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% -0.692424 0.414419 -0.873990 3.317660 1.807201 111.904802 32.495656 36.477678 0.577038 0.572496 0.338151 3.371216 4.215736
20 2 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 0.362688 2.135739 1.340720 0.365601 8.016638 0.864799 2.064919 -0.386811 0.563287 0.541543 0.333395 9.395285 9.682247
21 2 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 0.864956 5.176154 0.470723 18.946478 35.521153 203.360650 77.173948 95.796815 0.544235 0.533583 0.332139 5.201306 6.066842
23 0 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 63.453392 51.951440 156.157746 131.098852 253.599171 108.705921 2836.557690 1325.689222 0.016692 0.016739 0.000558 0.000000 0.000000
24 0 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 63.647732 96.241622 151.193853 139.839268 246.114426 129.893218 2532.800701 1803.067335 0.016567 0.016526 0.000388 0.000000 0.000000
25 0 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 382.653048 388.258451 285.829686 349.363912 117.335499 185.966861 1661.922807 2648.393199 0.020252 0.009640 0.008588 0.980829 0.000000
26 0 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 391.648841 391.540090 329.800372 328.956965 289.193281 125.039530 3615.051482 1732.159592 0.015514 0.019190 0.007669 0.000000 0.904415
27 1 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 24.192865 28.774562 75.939952 77.860843 38.797502 29.275821 24.293213 20.839277 0.053533 0.056540 0.004628 1.287502 1.307240
28 1 RF_maintenance 100.00% 54.30% 100.00% 0.00% 100.00% 0.00% 9.511531 37.468903 11.568193 42.522335 29.020363 47.480595 -2.324679 281.639151 0.400494 0.209831 0.211472 19.959439 7.773309
29 1 digital_ok 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% -0.861294 -1.118732 -0.791824 -0.924817 -0.024958 -0.808776 0.475435 1.027638 0.588769 0.586385 0.333547 1.644377 2.232131
30 1 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% -0.458934 -0.719678 -0.825480 -0.862889 8.483731 0.822578 12.254913 1.159316 0.584434 0.584707 0.327798 9.464055 11.211859
31 2 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 0.749422 0.678736 0.007279 0.929450 -0.766795 2.481735 13.653004 6.038798 0.591914 0.580437 0.339311 4.080593 5.083032
32 2 RF_maintenance 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 39.984694 0.026460 5.508118 -0.393967 15.267176 11.949256 46.460585 28.538677 0.484536 0.561449 0.323701 0.000000 0.000000
33 2 RF_maintenance 100.00% 0.00% 65.05% 0.00% 100.00% 0.00% -0.356911 6.881107 -0.778066 -0.137718 34.163770 38.098237 76.281685 134.349544 0.558692 0.376599 0.393541 6.506449 3.342846
36 3 RF_maintenance 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 7.662615 8.647693 0.247732 5.611653 0.700603 4.694400 2.036255 6.983990 0.570429 0.559727 0.345288 0.000000 0.000000
37 3 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 2.985601 3.307033 4.623954 6.855368 7.374912 8.724405 4.143753 16.846456 0.577588 0.564461 0.337401 0.000000 0.000000
38 3 RF_maintenance 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 2.530443 4.679409 4.659052 7.988587 4.573373 13.833041 24.579442 -1.565014 0.585584 0.574518 0.345086 4.135853 4.681384
39 0 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan 382.095136 inf 290.720374 nan 126.329183 nan 1494.222454 nan 0.018767 nan 0.000000 1.059377
40 4 digital_ok 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 1.106321 0.662001 1.574035 1.323466 1.875243 -0.610419 2.767907 1.299354 0.588349 0.598612 0.341248 1.927216 2.262864
41 4 digital_ok 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% -0.371430 -0.591055 1.046960 -0.856778 0.676136 1.011247 -1.483525 -0.668146 0.592443 0.600384 0.339509 2.118802 2.298694
42 4 digital_ok 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% -0.981986 0.065318 0.326437 -0.523369 -0.380599 -0.709750 -1.094384 -0.684830 0.599518 0.601365 0.342827 1.772289 2.144211
45 5 RF_maintenance 100.00% 0.00% 100.00% 0.00% 100.00% 0.00% 0.467534 29.711109 -0.093807 76.933031 -1.243323 29.147260 1.139266 17.341557 0.575321 0.080281 0.396928 0.000000 0.000000
46 5 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% -0.852090 -0.926677 0.043904 -0.566354 1.245195 2.567647 0.383823 5.974464 0.552629 0.541450 0.341016 0.000000 0.000000
50 3 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 1.439771 1.663312 3.151075 -0.655802 4.372883 0.374154 5.153651 0.505612 0.557341 0.557208 0.323170 0.000000 0.000000
51 3 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 0.937807 3.932716 -0.653038 6.152214 -1.290978 8.496405 2.070518 -2.131126 0.589101 0.579334 0.337411 0.000000 0.000000
52 3 RF_maintenance 100.00% 0.00% 100.00% 0.00% 100.00% 0.00% 8.241556 51.860101 0.689349 94.154090 2.485926 28.551632 7.636510 37.219188 0.571715 0.044877 0.368877 3.846897 1.172486
53 3 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 1.010830 1.404766 2.682756 1.613590 4.013449 3.312485 5.145475 16.453313 0.592068 0.603789 0.339431 5.171243 7.082868
54 4 digital_ok 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% -0.740846 -0.317998 0.764521 -0.389643 -0.595348 0.876373 -0.680836 -0.330697 0.588988 0.604635 0.331364 1.754562 2.078117
55 4 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 7.328175 7.120055 33.140640 11.825129 6.632910 20.079864 23.666312 -5.721817 0.579251 0.569595 0.324826 10.952200 11.453391
56 4 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% -0.908665 1.180645 -0.320074 0.876953 -0.162528 -0.130455 -0.073775 7.431814 0.601030 0.606577 0.343662 10.927776 10.413299
57 4 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 6.423792 1.365713 15.234814 4.683498 18.792021 3.377771 8.517455 -0.584527 0.595487 0.588168 0.343917 7.558327 6.355281
65 3 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 2.313705 3.258326 4.892185 5.014290 9.447893 9.067088 -3.057245 -0.779540 0.553443 0.554017 0.331431 3.160814 0.000000
66 3 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 3.184395 1.972597 7.868093 2.253527 14.729193 4.273967 -4.269480 4.315844 0.575672 0.585735 0.331691 0.000000 0.000000
67 3 RF_maintenance 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 0.575359 3.257106 2.299617 13.098066 0.165798 24.846904 6.418769 18.406576 0.600306 0.610366 0.338116 3.064704 3.805821
68 3 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 1.768799 0.686587 3.184482 2.014941 7.211217 1.347250 -1.080072 2.035407 0.589627 0.612714 0.332393 3.991023 5.238514
69 4 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% -0.986026 -0.105817 0.408905 -0.766662 3.703724 8.798730 1.931043 1.957754 0.594515 0.608688 0.333778 6.655273 6.558110
70 4 RF_maintenance 100.00% 0.00% 0.00% 100.00% 100.00% 0.00% 6.239824 9.666087 5.271037 24.194878 15.733954 35.881238 -0.626121 16.122314 0.259944 0.266305 -0.294148 3.704082 3.533253
71 4 digital_ok 100.00% 0.00% 0.00% 100.00% 100.00% 0.00% 2.363530 2.065361 4.278747 4.507924 9.513967 3.686993 3.620792 -2.394925 0.259574 0.256908 -0.292821 4.565363 4.717287
72 4 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 4.542619 -0.685435 0.838264 -0.067279 10.523075 1.938648 4.901853 -0.472218 0.590199 0.595289 0.337265 8.351479 6.218251
73 5 RF_maintenance 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 1.469417 1.156711 1.324259 3.854083 10.764257 6.109089 5.148602 3.749807 0.586101 0.573696 0.346948 12.135365 10.053387
81 7 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 0.762175 1.229229 6.826491 -0.212047 8.984628 0.385408 6.807909 0.398210 0.550195 0.554865 0.332493 3.211678 4.326989
82 7 RF_maintenance 0.00% 0.00% 0.00% 0.00% 100.00% 0.00% 0.702617 1.096492 0.167438 0.679956 -0.672845 -1.047944 0.163796 0.068981 0.565832 0.582809 0.339113 0.000000 0.000000
83 7 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 3.960804 7.874876 7.564435 13.215379 19.264345 20.874208 -3.803825 -4.616215 0.577221 0.563915 0.336540 2.850989 2.952270
84 8 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 8.728415 9.186898 0.265408 1.038849 0.145045 0.998337 0.784326 1.504251 0.599081 0.609197 0.332761 3.517163 4.258688
85 8 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
86 8 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
87 8 RF_maintenance 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 6.014805 4.289394 4.002516 9.041781 6.665549 15.464694 -2.318024 -5.613896 0.590975 0.586700 0.343104 4.555031 3.474762
88 9 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 29.794608 32.668716 67.766880 70.031135 38.897002 29.294784 29.465232 19.658415 0.043530 0.044741 -0.000534 1.201566 1.206128
89 9 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
90 9 RF_maintenance 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 3.365752 0.103265 5.097005 -0.665272 7.694450 -1.262394 10.962083 -0.132508 0.570220 0.561977 0.351785 6.890834 6.918907
91 9 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 24.427076 28.448189 67.758537 71.019295 37.899429 28.835751 22.906462 21.822044 0.039836 0.043340 0.001812 1.314443 1.827007
92 10 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
93 10 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
94 10 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
98 7 digital_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 25.604191 30.688867 66.464648 68.322595 38.225673 28.786166 19.001124 16.940522 0.044918 0.051074 0.006946 1.715165 1.669424
99 7 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 0.093191 3.472332 2.961130 13.869526 2.215516 10.628553 3.159492 7.538876 0.558165 0.567357 0.343432 4.635582 7.701701
100 7 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 23.786664 29.107984 67.140315 71.286708 37.933066 28.767494 26.252046 22.666631 0.052595 0.057790 0.005430 -0.000000 -0.000000
101 8 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 7.844278 9.921585 0.046635 2.895592 0.188682 2.934736 16.713467 5.587599 0.590367 0.602408 0.348158 2.875170 2.921538
102 8 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
103 8 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 3.819027 8.787514 1.574228 2.761861 2.855626 1.692130 2.807933 3.150177 0.589165 0.596714 0.343413 2.974276 2.642156
104 8 RF_maintenance 100.00% 0.00% 0.00% 100.00% 100.00% 0.00% 9.663274 89.652721 4.848451 67.857649 5.085408 28.053267 7.306501 11.617146 0.240777 0.201676 -0.268569 1.581134 1.424994
105 9 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 27.583446 36.058068 64.799820 67.991504 37.437877 27.906253 16.766626 16.242113 0.039812 0.042804 0.003000 1.139282 1.145228
106 9 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 2.358676 1.893868 5.323900 2.956957 2.267032 0.942279 7.394212 3.614163 0.578426 0.571477 0.348637 5.593835 5.375326
107 9 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 24.606839 26.396073 67.924330 70.197955 37.771250 28.441970 14.023986 15.482667 0.044589 0.047031 0.003922 1.215041 1.222771
108 9 digital_ok 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.542978 2.633211 0.809829 0.880508 -0.412061 0.340196 0.606582 -2.007150 0.554858 0.542107 0.352201 0.857246 0.836126
109 10 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 54.120982 140.366389 133.690612 194.968628 120.092039 260.823999 1943.667351 4732.059238 0.017848 0.016126 0.001922 0.000000 0.000000
110 10 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 57.048822 63.200260 143.687635 152.028856 149.561279 293.849467 2496.637830 2900.548390 0.017241 0.016163 0.000642 0.000000 0.000000
111 10 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 46.226854 113.487112 123.229255 151.752433 60.840668 236.623957 1074.038012 2816.625326 0.017409 0.016256 0.000819 0.000000 0.000000
112 10 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 55.189107 111.539613 138.168411 152.613770 128.030307 191.398835 2065.299470 2926.042844 0.017497 0.016319 0.000993 0.000000 0.000000
116 7 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 27.103168 31.873433 68.186329 70.321328 37.685428 28.299168 15.972490 20.085016 0.048072 0.048193 0.001581 1.116330 1.218868
119 7 RF_maintenance 100.00% 100.00% 0.00% 0.00% 100.00% 0.00% 25.519161 0.929678 66.949051 2.797609 37.598860 3.516984 19.186149 -2.103090 0.047959 0.575220 0.384847 inf inf
120 8 RF_maintenance 100.00% 67.74% 100.00% 0.00% 100.00% 0.00% 14.658978 44.819166 6.985837 84.342651 13.177143 28.486381 6.136781 26.935237 0.384142 0.044386 0.269020 0.000000 0.000000
121 8 RF_maintenance 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 3.157473 9.407907 0.836531 13.164590 5.126384 5.420262 99.166824 87.756148 0.575731 0.586743 0.339439 0.000000 0.000000
122 8 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 10.305390 6.785822 3.995519 0.735790 4.984595 1.124963 5.656196 3.667446 0.578136 0.579750 0.340718 3.325173 3.107201
123 8 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 6.907126 5.549360 2.212068 3.938156 0.954006 6.089315 -1.453908 -2.912125 0.574512 0.571764 0.340396 11.330161 8.911694
124 9 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
125 9 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 24.924888 28.560575 68.571175 71.280577 37.924961 28.816414 13.802727 24.174176 0.029820 0.031865 0.001520 1.445151 1.456530
126 9 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 25.347714 29.257216 67.890441 71.743622 37.842791 28.659847 19.663334 23.397874 0.034372 0.031554 -0.000611 1.242209 1.234861
127 10 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 89.030686 119.771369 173.580920 182.833979 288.640862 349.922845 4350.702661 4643.922272 0.016251 0.016109 0.000280 0.000000 0.000000
128 10 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 91.528315 84.845399 166.036753 160.671338 193.233073 179.910235 3193.678944 2463.266165 0.016139 0.016062 0.000217 0.000000 0.000000
129 10 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 148.253059 70.183697 178.182516 153.699959 269.009765 178.879449 2914.090067 2532.940792 0.017276 0.016337 0.000706 0.000000 0.000000
130 10 digital_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 70.395004 63.170514 157.236612 146.341394 198.734974 138.987343 2114.115256 2151.948889 0.016286 0.016290 0.000283 0.000000 0.000000
135 12 digital_ok 0.00% 0.00% 0.00% 0.00% 100.00% 0.00% -0.686980 0.277013 -0.207811 -0.128512 -0.691880 0.054989 -0.393576 -0.079941 0.515321 0.514896 0.328190 1.479601 1.548562
136 12 RF_maintenance 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 1.219474 12.963127 -0.448744 0.906843 2.894545 2.322796 1.560821 9.579199 0.542782 0.529251 0.327004 3.144728 4.088467
138 7 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 28.526937 -0.540346 66.392301 -0.818149 37.681104 6.507466 12.198403 0.637002 0.048793 0.220343 0.080920 0.000000 0.000000
140 13 digital_ok 0.00% 100.00% 100.00% 0.00% 100.00% 0.00% 2.641152 2.000708 -0.274672 0.584048 1.703107 -0.127063 2.773768 1.379624 0.089354 0.090276 0.018623 0.000000 0.000000
141 13 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 1.048729 1.306795 1.400885 4.157989 2.995866 2.883663 1.261907 29.488650 0.075901 0.077969 0.016918 1.479161 1.478232
142 13 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 1.595621 31.743573 6.256656 77.979643 5.420623 29.243964 7.386924 15.267910 0.099415 0.041459 0.027353 1.097463 1.052123
143 14 digital_ok 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 1.021418 -0.753381 0.139702 -0.791820 0.024958 -0.594456 -0.919160 -0.421896 0.557938 0.560855 0.335186 0.853138 0.821095
144 14 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 3.015657 5.107898 9.100622 14.455621 15.811025 9.436218 6.832102 7.661433 0.562916 0.558030 0.349978 6.402882 8.284086
145 14 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 23.639324 27.956004 76.314766 78.490522 38.581365 29.298182 18.870324 20.782287 0.037997 0.039620 -0.000590 1.642849 1.589625
150 15 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 26.013633 31.589456 76.087504 79.915177 38.272294 29.092219 22.328000 25.696440 0.047965 0.049272 0.001404 1.162680 1.157397
155 12 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 23.714180 27.128151 74.813643 77.480392 38.736117 29.411169 22.538149 24.561918 0.052410 0.050445 0.001918 0.000000 0.000000
156 12 RF_maintenance 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 0.380382 1.128724 -0.547987 0.123349 1.560182 2.834125 3.993987 30.945981 0.531954 0.522997 0.332345 2.804759 2.783601
157 12 RF_maintenance 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 1.357310 0.615399 4.952376 -0.611320 11.025592 1.681417 -2.144151 1.889917 0.528054 0.531699 0.328854 0.000000 0.000000
158 12 RF_maintenance 0.00% 0.00% 0.00% 0.00% 100.00% 0.00% -0.758965 -1.255146 0.669025 0.863636 -1.585412 -1.055560 -0.519021 -0.247175 0.537606 0.541321 0.334603 0.000000 0.000000
160 13 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 15.273439 34.242493 1.247654 2.940168 13.318354 15.328409 0.936282 36.326460 0.093006 0.089999 0.012679 0.000000 0.000000
161 13 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 3.206360 55.006005 5.502402 24.259229 12.096690 8.501791 6.211430 8.608046 0.048724 0.062483 0.005637 1.229840 1.218931
162 13 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 0.723910 -0.015322 -0.294616 -0.762210 5.340892 3.448793 1.771409 1.108532 0.061259 0.056776 0.004289 1.256036 1.252392
163 14 digital_ok 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.280634 -0.485234 -0.453050 -0.578737 -1.209868 3.756405 0.040648 0.695975 0.540603 0.533596 0.343186 1.338185 1.319193
164 14 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% -1.077090 -1.136025 -0.157202 -0.735214 -0.573607 5.526815 0.793143 12.024319 0.540253 0.531897 0.340697 11.520099 15.781141
165 14 digital_ok 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% -0.290502 -0.183953 -0.712526 -0.242176 -0.202179 0.502464 0.502185 -0.276565 0.524778 0.516404 0.333015 1.455926 1.404015
166 14 RF_maintenance 100.00% 0.00% 24.19% 0.00% 100.00% 0.00% 9.679369 20.200127 2.342236 3.561121 37.704423 29.226935 17.562410 20.572354 0.486745 0.463768 0.283531 0.000000 0.000000
167 15 digital_ok 100.00% 67.74% 61.83% 0.00% 100.00% 0.00% 32.036666 15.799737 6.210402 9.083739 43.613482 22.693134 65.474382 43.281852 0.372149 0.404340 0.211963 0.000000 0.000000
168 15 RF_maintenance 100.00% 16.13% 24.19% 0.00% 100.00% 0.00% 5.313171 7.743524 9.042318 12.390245 15.134009 18.135382 -5.267574 -6.162790 0.492292 0.468291 0.329289 4.766126 10.238975
169 15 digital_ok 100.00% 24.19% 24.19% 0.00% 100.00% 0.00% 7.486871 6.801707 12.245632 10.562774 24.059977 15.773075 -6.706235 -4.108885 0.477515 0.463613 0.316598 18.506164 28.486115
170 15 digital_ok 100.00% 30.11% 24.19% 0.00% 100.00% 0.00% 8.066132 5.207964 12.629435 9.062711 25.733496 13.750738 -5.846296 -4.170765 0.465576 0.468550 0.312557 0.000000 0.000000
176 12 digital_ok 0.00% 0.00% 0.00% 0.00% 100.00% 0.00% 0.175271 -0.914601 2.686150 -0.836365 2.853910 -0.783183 -2.899243 -0.311979 0.510936 0.513294 0.331672 0.845372 1.618979
177 12 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 1.567879 5.546472 -0.640174 9.023046 0.600493 8.989855 0.445247 -2.551308 0.525182 0.494760 0.339816 0.000000 0.000000
178 12 digital_ok 0.00% 0.00% 0.00% 0.00% 100.00% 0.00% -0.027274 -1.130597 3.151104 -0.741659 2.554567 -1.229147 1.923531 0.290188 0.534125 0.528327 0.341740 0.000000 0.000000
179 12 digital_ok 100.00% 0.00% 0.00% 0.00% 100.00% 0.00% 0.091515 0.994596 2.075654 -0.655993 23.839574 -0.968874 0.077016 0.068751 0.527975 0.527268 0.341225 2.457810 0.000000
180 13 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 18.767162 30.477978 1.271703 78.478050 11.099869 28.913570 46.304044 16.609243 0.095079 0.046086 0.035838 0.000000 0.000000
181 13 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 6.065672 1.016000 12.381111 2.898360 16.411516 6.532833 7.384992 7.051085 0.067653 0.060613 0.006411 1.193354 1.185868
182 13 RF_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 3.903018 5.416092 8.747597 9.661635 16.689945 13.755663 -5.516735 -5.511508 0.073555 0.075600 0.009406 1.284363 1.267981
183 13 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% -0.899548 1.109767 1.817296 4.349590 4.306268 1.784638 2.091544 25.593198 0.066095 0.057254 0.005187 1.288202 1.288656
184 14 digital_ok 0.00% 0.00% 0.00% 0.00% 0.00% 0.00% 0.614476 0.027274 -0.766942 -0.032298 -0.473581 0.148330 0.426390 -0.243169 0.534270 0.514378 0.348633 1.303530 1.336412
185 14 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
186 14 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
187 14 digital_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
189 15 digital_ok 100.00% 16.13% 21.51% 0.00% 100.00% 0.00% 1.175718 2.743955 0.518327 1.800427 -0.135488 7.498484 0.563337 5.057341 0.493149 0.478671 0.328371 16.684548 39.545997
190 15 digital_ok 100.00% 67.74% 65.05% 0.00% 100.00% 0.00% 52.348936 43.157482 9.254112 11.313690 14.871802 22.733220 70.402816 79.216128 0.364015 0.378055 0.159150 0.000000 0.000000
191 15 digital_ok 100.00% 24.19% 24.19% 0.00% 100.00% 0.00% 1.376416 0.575740 4.066551 -0.220857 3.439139 1.068818 -1.793561 7.576563 0.477869 0.470981 0.329688 0.000000 0.000000
220 18 RF_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
221 18 RF_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
222 18 RF_ok 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% nan nan inf inf nan nan nan nan nan nan nan 0.000000 0.000000
320 3 dish_maintenance 100.00% 100.00% 100.00% 0.00% 100.00% 0.00% 31.850535 32.242859 59.235588 60.313040 38.446875 29.286907 23.319049 17.141462 0.067812 0.075251 0.007332 0.000000 0.000000
321 2 not_connected 100.00% 62.37% 65.05% 0.00% 100.00% 0.00% 3.995601 3.189699 6.735965 6.683642 17.625282 14.885140 29.511205 25.710614 0.402323 0.381575 0.299321 0.000000 0.000000
323 2 not_connected 100.00% 75.81% 65.05% 0.00% 100.00% 0.00% 27.644531 6.838392 5.462437 11.722279 14.442743 20.723292 26.605465 -0.988701 0.293885 0.369175 0.257165 0.000000 0.000000
324 4 not_connected 100.00% 65.05% 67.74% 0.00% 100.00% 0.00% 8.569201 8.845448 13.782189 13.715696 28.457494 22.216584 -7.100829 -8.331973 0.369299 0.347311 0.273830 0.000000 0.000000
329 12 dish_maintenance 100.00% 59.68% 65.05% 0.00% 100.00% 0.00% 2.946801 5.179094 1.715886 9.025514 1.357300 15.530149 11.073188 -5.904366 0.401910 0.378310 0.294250 0.000000 0.000000
333 12 dish_maintenance 100.00% 59.68% 62.37% 0.00% 100.00% 0.00% 5.030721 3.213013 10.328591 5.511124 4.281445 10.462122 15.623053 -0.902494 0.402383 0.393185 0.290394 0.000000 0.000000
In [16]:
# print ex_ants for easy copy-pasting to YAML file
proposed_ex_ants = [ant for i, ant in enumerate(ants) if np.any([col[i] > .1 for col in bar_cols.values()])]
print('ex_ants: [' + ", ".join(str(ant) for ant in proposed_ex_ants) + ']')
ex_ants: [0, 1, 2, 3, 4, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19, 20, 21, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 36, 37, 38, 39, 45, 46, 50, 51, 52, 53, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 109, 110, 111, 112, 116, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 135, 136, 138, 140, 141, 142, 144, 145, 150, 155, 156, 157, 158, 160, 161, 162, 164, 166, 167, 168, 169, 170, 176, 177, 178, 179, 180, 181, 182, 183, 185, 186, 187, 189, 190, 191, 220, 221, 222, 320, 321, 323, 324, 329, 333]
In [17]:
# write to csv
outpath = os.path.join(nb_outdir, f'rtp_summary_table_{JD}.csv')
print(f'Now saving Table 1 to a csv at {outpath}')
df.to_csv(outpath)
Now saving Table 1 to a csv at /home/obs/src/H5C_Notebooks/_rtp_summary_/rtp_summary_table_2459760.csv
In [18]:
# Load antenna positions
data_list = sorted(glob.glob(os.path.join(data_path, f'zen.{JD}.?????.sum.uvh5')))
hd = io.HERAData(data_list[len(data_list) // 2])

# Figure out where to draw the nodes
node_centers = {}
for node in sorted(set(list(nodes.values()))):
    if np.isfinite(node):
        this_node_ants = [ant for ant in ants + unused_ants if nodes[ant] == node]
        if len(this_node_ants) == 1:
            # put the node label just to the west of the lone antenna 
            node_centers[node] = hd.antpos[ant][node] + np.array([-14.6 / 2, 0, 0])
        else:
            # put the node label between the two antennas closest to the node center
            node_centers[node] = np.mean([hd.antpos[ant] for ant in this_node_ants], axis=0)
            closest_two_pos = sorted([hd.antpos[ant] for ant in this_node_ants], 
                                     key=lambda pos: np.linalg.norm(pos - node_centers[node]))[0:2]
            node_centers[node] = np.mean(closest_two_pos, axis=0)
In [19]:
def Plot_Array(ants, unused_ants, outriggers):
    plt.figure(figsize=(16,16))
    
    plt.scatter(np.array([hd.antpos[ant][0] for ant in hd.data_ants if ant in ants]), 
                np.array([hd.antpos[ant][1] for ant in hd.data_ants if ant in ants]), c='w', s=0)

    # connect every antenna to their node
    for ant in ants:
        if nodes[ant] in node_centers:
            plt.plot([hd.antpos[ant][0], node_centers[nodes[ant]][0]], 
                     [hd.antpos[ant][1], node_centers[nodes[ant]][1]], 'k', zorder=0)

    rc_color = '#0000ff'
    antm_color = '#ffa500'
    autom_color = '#ff1493'

    # Plot 
    unflagged_ants = []
    for i, ant in enumerate(ants):
        ant_has_flag = False
        # plot large blue annuli for redcal flags
        if use_redcal:
            if redcal_flagged_frac[ant] > 0:
                ant_has_flag = True
                plt.gca().add_artist(plt.Circle(tuple(hd.antpos[ant][0:2]), radius=7 * (2 - 1 * float(not outriggers)), fill=True, lw=0,
                                                color=rc_color, alpha=redcal_flagged_frac[ant]))
                plt.gca().add_artist(plt.Circle(tuple(hd.antpos[ant][0:2]), radius=6 * (2 - 1 * float(not outriggers)), fill=True, color='w'))
        
        # plot medium green annuli for ant_metrics flags
        if use_ant_metrics: 
            if ant_metrics_xants_frac_by_ant[ant] > 0:
                ant_has_flag = True
                plt.gca().add_artist(plt.Circle(tuple(hd.antpos[ant][0:2]), radius=6 * (2 - 1 * float(not outriggers)), fill=True, lw=0,
                                                color=antm_color, alpha=ant_metrics_xants_frac_by_ant[ant]))
                plt.gca().add_artist(plt.Circle(tuple(hd.antpos[ant][0:2]), radius=5 * (2 - 1 * float(not outriggers)), fill=True, color='w'))
        
        # plot small red annuli for auto_metrics
        if use_auto_metrics:
            if ant in auto_ex_ants:
                ant_has_flag = True                
                plt.gca().add_artist(plt.Circle(tuple(hd.antpos[ant][0:2]), radius=5 * (2 - 1 * float(not outriggers)), fill=True, lw=0, color=autom_color)) 
        
        # plot black/white circles with black outlines for antennas
        plt.gca().add_artist(plt.Circle(tuple(hd.antpos[ant][0:2]), radius=4 * (2 - 1 * float(not outriggers)), fill=True, color=['w', 'k'][ant_has_flag], ec='k'))
        if not ant_has_flag:
            unflagged_ants.append(ant)

        # label antennas, using apriori statuses if available
        try:
            bgc = matplotlib.colors.to_rgb(status_colors[a_priori_statuses[ant]])
            c = 'black' if (bgc[0]*0.299 + bgc[1]*0.587 + bgc[2]*0.114) > 186 / 256 else 'white'
        except:
            c = 'k'
            bgc='white'
        plt.text(hd.antpos[ant][0], hd.antpos[ant][1], str(ant), va='center', ha='center', color=c, backgroundcolor=bgc)

    # label nodes
    for node in sorted(set(list(nodes.values()))):
        if not np.isnan(node) and not np.all(np.isnan(node_centers[node])):
            plt.text(node_centers[node][0], node_centers[node][1], str(node), va='center', ha='center', bbox={'color': 'w', 'ec': 'k'})
    
    # build legend 
    legend_objs = []
    legend_labels = []
    
    # use circles for annuli 
    legend_objs.append(matplotlib.lines.Line2D([0], [0], marker='o', color='w', markeredgecolor='k', markerfacecolor='w', markersize=13))
    legend_labels.append(f'{len(unflagged_ants)} / {len(ants)} Total {["Core", "Outrigger"][outriggers]} Antennas Never Flagged')
    legend_objs.append(matplotlib.lines.Line2D([0], [0], marker='o', color='w', markerfacecolor='k', markersize=15))
    legend_labels.append(f'{len(ants) - len(unflagged_ants)} Antennas {["Core", "Outrigger"][outriggers]} Flagged for Any Reason')

    if use_auto_metrics:
        legend_objs.append(matplotlib.lines.Line2D([0], [0], marker='o', color='w', markeredgewidth=2, markeredgecolor=autom_color, markersize=15))
        legend_labels.append(f'{len([ant for ant in auto_ex_ants if ant in ants])} {["Core", "Outrigger"][outriggers]} Antennas Flagged by Auto Metrics')
    if use_ant_metrics: 
        legend_objs.append(matplotlib.lines.Line2D([0], [0], marker='o', color='w', markeredgewidth=2, markeredgecolor=antm_color, markersize=15))
        legend_labels.append(f'{np.round(np.sum([frac for ant, frac in ant_metrics_xants_frac_by_ant.items() if ant in ants]), 2)} Antenna-Nights on' 
                             f'\n{np.sum([frac > 0 for ant, frac in ant_metrics_xants_frac_by_ant.items() if ant in ants])} {["Core", "Outrigger"][outriggers]} Antennas '
                             'Flagged by Ant Metrics\n(alpha indicates fraction of time)')        
    if use_redcal:
        legend_objs.append(matplotlib.lines.Line2D([0], [0], marker='o', color='w', markeredgewidth=2, markeredgecolor=rc_color, markersize=15))
        legend_labels.append(f'{np.round(np.sum(list(redcal_flagged_frac.values())), 2)} Antenna-Nights on' 
                             f'\n{np.sum([frac > 0 for ant, frac in redcal_flagged_frac.items() if ant in ants])} {["Core", "Outrigger"][outriggers]} Antennas '
                             'Flagged by Redcal\n(alpha indicates fraction of time)')

    # use rectangular patches for a priori statuses that appear in the array
    for aps in sorted(list(set(list(a_priori_statuses.values())))):
        if aps != 'Not Found':
            legend_objs.append(plt.Circle((0, 0), radius=7, fill=True, color=status_colors[aps]))
            legend_labels.append(f'A Priori Status:\n{aps} ({[status for ant, status in a_priori_statuses.items() if ant in ants].count(aps)} {["Core", "Outrigger"][outriggers]} Antennas)')

    # label nodes as a white box with black outline
    if len(node_centers) > 0:
        legend_objs.append(matplotlib.patches.Patch(facecolor='w', edgecolor='k'))
        legend_labels.append('Node Number')

    if len(unused_ants) > 0:
        legend_objs.append(matplotlib.lines.Line2D([0], [0], marker='o', color='w', markerfacecolor='grey', markersize=15, alpha=.2))
        legend_labels.append(f'Anntenna Not In Data')
        
    
    plt.legend(legend_objs, legend_labels, ncol=2, fontsize='large', framealpha=1)
    
    if outriggers:
        pass
    else:
        plt.xlim([-200, 150])
        plt.ylim([-150, 150])        
       
    # set axis equal and label everything
    plt.axis('equal')
    plt.tight_layout()
    plt.title(f'Summary of {["Core", "Outrigger"][outriggers]} Antenna Statuses and Metrics on {JD}', size=20)    
    plt.xlabel("Antenna East-West Position (meters)", size=12)
    plt.ylabel("Antenna North-South Position (meters)", size=12)
    plt.xticks(fontsize=12)
    plt.yticks(fontsize=12)
    xlim = plt.gca().get_xlim()
    ylim = plt.gca().get_ylim()    
        
    # plot unused antennas
    plt.autoscale(False)    
    for ant in unused_ants:
        if nodes[ant] in node_centers:
            plt.plot([hd.antpos[ant][0], node_centers[nodes[ant]][0]], 
                     [hd.antpos[ant][1], node_centers[nodes[ant]][1]], 'k', alpha=.2, zorder=0)
        
        plt.gca().add_artist(plt.Circle(tuple(hd.antpos[ant][0:2]), radius=4, fill=True, color='w', ec=None, alpha=1, zorder=0))
        plt.gca().add_artist(plt.Circle(tuple(hd.antpos[ant][0:2]), radius=4, fill=True, color='grey', ec=None, alpha=.2, zorder=0))
        if hd.antpos[ant][0] < xlim[1] and hd.antpos[ant][0] > xlim[0]:
            if hd.antpos[ant][1] < ylim[1] and hd.antpos[ant][1] > ylim[0]:
                plt.text(hd.antpos[ant][0], hd.antpos[ant][1], str(ant), va='center', ha='center', color='k', alpha=.2) 

Figure 1: Array Plot of Flags and A Priori Statuses¶

This plot shows all antennas, which nodes they are connected to, and their a priori statuses (as the highlight text of their antenna numbers). It may also show (depending on what is finished running):

  • Whether they were flagged by auto_metrics (red circle) for bandpass shape, overall power, temporal variability, or temporal discontinuities. This is done in a binary fashion for the whole night.
  • Whether they were flagged by ant_metrics (green circle) as either dead (on either polarization) or crossed, with the transparency indicating the fraction of the night (i.e. number of files) that were flagged.
  • Whether they were flagged by redcal (blue circle) for high chi^2, with the transparency indicating the fraction of the night (i.e. number of files) that were flagged.

Note that the last fraction does not include antennas that were flagged before going into redcal due to their a priori status, for example.

In [20]:
core_ants = [ant for ant in ants if ant < 320]
outrigger_ants = [ant for ant in ants if ant >= 320]
Plot_Array(ants=core_ants, unused_ants=unused_ants, outriggers=False)
if len(outrigger_ants) > 0:
    Plot_Array(ants=outrigger_ants, unused_ants=sorted(set(unused_ants + core_ants)), outriggers=True)

Metadata¶

In [21]:
from hera_qm import __version__
print(__version__)
from hera_cal import __version__
print(__version__)
2.0.2
3.1.1.dev2+g1b5039f
In [ ]: