2023-01-10 17:11:32 +01:00
#!/usr/bin/env python3
2023-01-13 19:46:07 +01:00
# vim: fdm=indent ts=4
2023-01-10 17:11:32 +01:00
"""
Show Signal to noise for the original simulation signal ,
the beacon signal and the combined signal for each antenna
"""
import numpy as np
import h5py
import matplotlib . pyplot as plt
import numpy as np
2023-01-12 13:47:37 +01:00
from earsim import REvent , block_filter
2023-01-10 17:11:32 +01:00
import aa_generate_beacon as beacon
import lib
if __name__ == " __main__ " :
from os import path
import sys
import matplotlib
import os
if os . name == ' posix ' and " DISPLAY " not in os . environ :
matplotlib . use ( ' Agg ' )
2023-01-12 14:31:21 +01:00
from scriptlib import MyArgumentParser
parser = MyArgumentParser ( )
2023-01-13 17:53:07 +01:00
# Bandpass
2023-01-13 19:46:07 +01:00
parser . add_argument ( ' -p ' , ' --use-passband ' , type = bool , default = True , help = ' (Default: %(default)d ) ' )
parser . add_argument ( ' -l ' , ' --passband-low ' , type = float , default = 30e-3 , help = ' Lower frequency [GHz] of the passband filter. (set -1 for np.inf) (Default: %(default)d ) ' )
parser . add_argument ( ' -u ' , ' --passband-high ' , type = float , default = 80e-3 , help = ' Upper frequency [GHz] of the passband filter. (set -1 for np.inf) (Default: %(default)d ) ' )
2023-01-13 17:53:07 +01:00
2023-01-12 14:31:21 +01:00
args = parser . parse_args ( )
2023-02-02 08:57:03 +01:00
figsize = ( 12 , 8 )
2023-01-10 17:11:32 +01:00
2023-01-12 14:49:54 +01:00
fig_dir = args . fig_dir
2023-01-12 14:31:21 +01:00
show_plots = args . show_plots
2023-01-10 17:11:32 +01:00
####
2023-02-02 17:55:37 +01:00
fname_dir = args . data_dir
2023-01-10 17:11:32 +01:00
antennas_fname = path . join ( fname_dir , beacon . antennas_fname )
2023-01-11 17:51:19 +01:00
tx_fname = path . join ( fname_dir , beacon . tx_fname )
2023-02-14 11:14:28 +01:00
snr_fname = path . join ( fname_dir , beacon . snr_fname )
2023-01-10 17:11:32 +01:00
# create fig_dir
if fig_dir :
os . makedirs ( fig_dir , exist_ok = True )
# Read in antennas from file
2023-02-02 08:49:05 +01:00
f_beacon , tx , antennas = beacon . read_beacon_hdf5 ( antennas_fname , traces_key = ' filtered_traces ' )
2023-01-11 17:51:19 +01:00
_ , __ , txdata = beacon . read_tx_file ( tx_fname )
2023-01-10 17:11:32 +01:00
# general properties
dt = antennas [ 0 ] . t [ 1 ] - antennas [ 0 ] . t [ 0 ] # ns
2023-02-02 08:49:05 +01:00
beacon_pb = lib . passband ( f_beacon , None ) # GHz
2023-01-11 17:51:19 +01:00
beacon_amp = np . max ( txdata [ ' amplitudes ' ] ) # mu V/m
2023-01-10 17:11:32 +01:00
2023-01-13 17:53:07 +01:00
# General Bandpass
low_bp = args . passband_low if args . passband_low > = 0 else np . inf # GHz
high_bp = args . passband_high if args . passband_high > = 0 else np . inf # GHz
pb = lib . passband ( low_bp , high_bp ) # GHz
2023-02-02 08:49:05 +01:00
noise_pb = pb
2023-01-13 17:53:07 +01:00
if args . use_passband : # Apply filter to raw beacon/noise to compare with Filtered Traces
2023-01-12 13:47:37 +01:00
myfilter = lambda x : block_filter ( x , dt , pb [ 0 ] , pb [ 1 ] )
else : # Compare raw beacon/noise with Filtered Traces
myfilter = lambda x : x
2023-01-10 17:11:32 +01:00
##
2023-02-02 08:49:05 +01:00
## Debug plot of Beacon vs Noise SNR
##
if True :
ant = antennas [ 0 ]
fig , ax = plt . subplots ( figsize = figsize )
_ = lib . signal_to_noise ( myfilter ( beacon_amp * ant . beacon ) , myfilter ( ant . noise ) , samplerate = 1 / dt , signal_band = beacon_pb , noise_band = noise_pb , debug_ax = ax )
ax . set_title ( " Spectra and passband " )
ax . set_xlabel ( " Frequency " )
ax . set_ylabel ( " Amplitude " )
low_x , high_x = min ( beacon_pb [ 0 ] , noise_pb [ 0 ] ) , max ( beacon_pb [ 1 ] or 0 , noise_pb [ 1 ] )
ax . set_xlim ( low_x , high_x )
if fig_dir :
fig . savefig ( path . join ( fig_dir , path . basename ( __file__ ) + f " .debug_plot.pdf " ) )
##
2023-01-10 17:11:32 +01:00
## Beacon vs Noise SNR
##
if True :
2023-02-02 08:49:05 +01:00
N_samples = len ( antennas [ 0 ] . beacon )
beacon_snrs = [ lib . signal_to_noise ( myfilter ( beacon_amp * ant . beacon ) , myfilter ( ant . noise ) , samplerate = 1 / dt , signal_band = beacon_pb , noise_band = noise_pb ) for i , ant in enumerate ( antennas ) ]
2023-01-10 17:11:32 +01:00
2023-02-14 11:14:28 +01:00
# write mean and std to file
beacon . write_snr_file ( snr_fname , beacon_snrs )
2023-02-09 12:58:45 +01:00
2023-02-01 14:13:26 +01:00
fig , ax = plt . subplots ( figsize = figsize )
2023-02-02 08:49:05 +01:00
ax . set_title ( f " Maximum Beacon/Noise SNR (N_samples: { N_samples : .1e } ) " )
2023-01-11 17:51:19 +01:00
ax . set_xlabel ( " Antenna no. " )
2023-01-10 17:11:32 +01:00
ax . set_ylabel ( " SNR " )
ax . plot ( [ int ( ant . name ) for ant in antennas ] , beacon_snrs , ' o ' , ls = ' none ' )
2023-01-31 14:52:27 +01:00
2023-01-10 17:11:32 +01:00
if fig_dir :
2023-01-12 13:47:37 +01:00
fig . savefig ( path . join ( fig_dir , path . basename ( __file__ ) + f " .beacon_vs_noise_snr.pdf " ) )
##
## Beacon vs Total SNR
##
if True :
2023-01-31 14:52:27 +01:00
beacon_snrs = [ lib . signal_to_noise ( myfilter ( beacon_amp * ant . beacon ) , ant . E_AxB , samplerate = 1 / dt , signal_band = beacon_pb , noise_band = pb ) for ant in antennas ]
2023-01-10 17:11:32 +01:00
2023-02-01 14:13:26 +01:00
fig , ax = plt . subplots ( figsize = figsize )
2023-01-12 13:47:37 +01:00
ax . set_title ( " Maximum Beacon/Total SNR " )
ax . set_xlabel ( " Antenna no. " )
ax . set_ylabel ( " SNR " )
ax . plot ( [ int ( ant . name ) for ant in antennas ] , beacon_snrs , ' o ' , ls = ' none ' )
if fig_dir :
fig . savefig ( path . join ( fig_dir , path . basename ( __file__ ) + f " .beacon_vs_total_snr.pdf " ) )
2023-01-10 17:11:32 +01:00
##
## Airshower signal vs Noise SNR
##
if True :
2023-01-31 14:52:27 +01:00
shower_snrs = [ lib . signal_to_noise ( ant . E_AxB , myfilter ( ant . noise ) , samplerate = 1 / dt , signal_band = pb , noise_band = pb ) for ant in antennas ]
2023-01-10 17:11:32 +01:00
2023-02-01 14:13:26 +01:00
fig , ax = plt . subplots ( figsize = figsize )
2023-01-12 13:47:37 +01:00
ax . set_title ( " Total (Signal+Beacon+Noise)/Noise SNR " )
2023-01-11 17:51:19 +01:00
ax . set_xlabel ( " Antenna no. " )
2023-01-10 17:11:32 +01:00
ax . set_ylabel ( " SNR " )
ax . plot ( [ int ( ant . name ) for ant in antennas ] , shower_snrs , ' o ' , ls = ' none ' )
2023-01-31 14:52:27 +01:00
2023-01-10 17:11:32 +01:00
if fig_dir :
2023-01-11 17:51:19 +01:00
fig . savefig ( path . join ( fig_dir , path . basename ( __file__ ) + f " .total_snr.pdf " ) )
2023-01-31 14:52:27 +01:00
2023-01-10 17:11:32 +01:00
if show_plots :
plt . show ( )