m-thesis-introduction/simulations/airshower_beacon_simulation/aa_generate_beacon.py

183 lines
5.1 KiB
Python
Raw Normal View History

2022-09-26 17:18:07 +02:00
#!/usr/bin/env python3
2022-11-14 20:49:35 +01:00
# vim: fdm=indent ts=4
"""
Add a beacon measurement on top of the
simulated airshower.
"""
2022-09-26 17:18:07 +02:00
import numpy as np
import json
import h5py
2022-09-28 13:21:41 +02:00
import os.path as path
from copy import deepcopy as copy
2022-09-26 17:18:07 +02:00
from earsim import REvent, Antenna
import lib
tx_fname = 'tx.json'
2022-09-28 13:21:41 +02:00
antennas_fname = 'antennas.hdf5'
2022-09-26 17:18:07 +02:00
2022-09-28 13:21:41 +02:00
def write_tx_file(fname, tx, f_beacon):
2022-09-26 17:18:07 +02:00
with open(fname, 'w') as fp:
return json.dump(
dict(
f_beacon=f_beacon,
tx=dict(
x=tx.x,
y=tx.y,
z=tx.z,
name=tx.name
)
),
fp
)
2022-09-28 13:21:41 +02:00
def read_tx_file(fname):
2022-09-26 17:18:07 +02:00
with open(fname, 'r') as fp:
data = json.load(fp)
f_beacon = data['f_beacon']
tx = Antenna(**data['tx'])
return tx, f_beacon
2022-11-14 20:49:35 +01:00
def read_beacon_hdf5(fname, traces_key='traces'):
2022-09-26 17:18:07 +02:00
with h5py.File(fname, 'r') as h5:
tx_attrs = h5['tx'].attrs
f_beacon = tx_attrs.get('f_beacon')
mydict = { k:tx_attrs.get(k) for k in ['x', 'y', 'z', 'name'] }
tx = Antenna(**mydict)
2022-09-28 13:21:41 +02:00
2022-09-26 17:18:07 +02:00
antennas = []
for k, ant in h5['antennas'].items():
mydict = { k:ant.attrs.get(k) for k in ['x', 'y', 'z', 'name'] }
antenna = Antenna(**mydict)
2022-11-14 20:49:35 +01:00
antenna.t = ant[traces_key][0]
antenna.Ex = ant[traces_key][1]
antenna.Ey = ant[traces_key][2]
antenna.Ez = ant[traces_key][3]
if len(ant[traces_key]) > 4:
antenna.beacon = ant[traces_key][4]
if ant.attrs:
antenna.attrs = {**ant.attrs}
2022-09-26 17:18:07 +02:00
antennas.append(antenna)
return f_beacon, tx, antennas
2022-09-28 13:21:41 +02:00
def init_antenna_hdf5(fname, tx = None, f_beacon = None):
2022-09-26 17:18:07 +02:00
with h5py.File(fname, 'w') as fp:
2022-09-28 13:21:41 +02:00
if tx is not None or f_beacon is not None:
tx_group = fp.create_group('tx')
tx_attrs = tx_group.attrs
2022-09-26 17:18:07 +02:00
2022-09-28 13:21:41 +02:00
if f_beacon is not None:
tx_attrs['f_beacon'] = f_beacon
2022-09-26 17:18:07 +02:00
2022-09-28 13:21:41 +02:00
if tx is not None:
tx_attrs['x'] = tx.x
tx_attrs['y'] = tx.y
tx_attrs['z'] = tx.z
tx_attrs['name'] = tx.name
2022-09-26 17:18:07 +02:00
2022-09-28 13:21:41 +02:00
return fname
2022-11-18 11:02:41 +01:00
def append_antenna_hdf5(fname, antenna, columns = [], name='traces', prepend_time=True, overwrite=True, attrs_dict={}):
2022-09-28 15:54:11 +02:00
if not overwrite:
raise NotImplementedError
2022-09-26 17:18:07 +02:00
with h5py.File(fname, 'a') as fp:
2022-09-28 15:54:11 +02:00
if 'antennas' in fp.keys():
if not overwrite:
raise NotImplementedError
2022-09-26 17:18:07 +02:00
group = fp['antennas']
2022-09-28 15:54:11 +02:00
else:
group = fp.create_group('antennas')
2022-09-26 17:18:07 +02:00
2022-09-28 15:54:11 +02:00
if antenna.name in group:
if not overwrite:
raise NotImplementedError
ant_group = group[antenna.name]
else:
ant_group = group.create_group(antenna.name)
2022-09-28 13:21:41 +02:00
ant_attrs = ant_group.attrs
ant_attrs['x'] = antenna.x
ant_attrs['y'] = antenna.y
ant_attrs['z'] = antenna.z
ant_attrs['name'] = antenna.name
2022-09-26 17:18:07 +02:00
2022-11-18 11:02:41 +01:00
for k,v in attrs_dict.items():
ant_attrs[k] = v
2022-09-28 15:54:11 +02:00
if name in ant_group:
if not overwrite:
raise NotImplementedError
del ant_group[name]
2022-09-26 17:18:07 +02:00
2022-09-28 15:54:11 +02:00
dset = ant_group.create_dataset(name, (len(columns) + 1*prepend_time, len(columns[0])), dtype='f')
2022-09-28 13:21:41 +02:00
2022-09-28 15:54:11 +02:00
if prepend_time:
dset[0] = antenna.t
2022-09-28 13:21:41 +02:00
2022-09-28 15:54:11 +02:00
for i, col in enumerate(columns, 1*prepend_time):
dset[i] = col
2022-09-28 13:21:41 +02:00
2022-09-26 17:18:07 +02:00
if __name__ == "__main__":
from os import path
2022-11-14 20:49:35 +01:00
remake_tx = True
2022-09-26 17:18:07 +02:00
fname = "ZH_airshower/mysim.sry"
2022-11-14 20:49:35 +01:00
tx = Antenna(x=-500,y=0,z=0,name='tx') # m
f_beacon = 51.53e-3 # GHz
2022-09-26 17:18:07 +02:00
2022-09-28 15:54:11 +02:00
beacon_amplitudes = 1e-6*np.array([1e2, 0, 0]) # mu V/m
2022-11-14 20:49:35 +01:00
beacon_radiate_rsq = True
if beacon_radiate_rsq:
# Move tx out, and magnify beacon_amplitude (at tx)
tx = Antenna(x=-20e3,y=0,z=0,name='tx') # m
dist = lib.distance(tx, Antenna(x=0, y=0, z=0))
2022-11-18 11:02:41 +01:00
ampl = max(1, dist**2)
2022-11-14 20:49:35 +01:00
beacon_amplitudes *= ampl
2022-09-28 15:54:11 +02:00
2022-09-26 17:18:07 +02:00
####
fname_dir = path.dirname(fname)
tx_fname = path.join(fname_dir, tx_fname)
2022-09-28 13:21:41 +02:00
antennas_fname = path.join(fname_dir, antennas_fname)
2022-09-26 17:18:07 +02:00
if not path.isfile(tx_fname) or remake_tx:
2022-09-28 13:21:41 +02:00
write_tx_file(tx_fname, tx, f_beacon)
2022-09-26 17:18:07 +02:00
else:
2022-09-28 13:21:41 +02:00
tx, f_beacon = read_tx_file(tx_fname)
2022-09-26 17:18:07 +02:00
# read in antennas
ev = REvent(fname)
N_antennas = len(ev.antennas)
2022-09-28 13:21:41 +02:00
# initialize hdf5 file
init_antenna_hdf5(antennas_fname, tx, f_beacon)
2022-09-26 17:18:07 +02:00
# make beacon per antenna
for i, antenna in enumerate(ev.antennas):
2022-11-14 20:49:35 +01:00
beacon = lib.beacon_from(tx, antenna, f_beacon, antenna.t, radiate_rsq=beacon_radiate_rsq)
2022-09-28 13:21:41 +02:00
2022-09-28 15:54:11 +02:00
E = np.array([antenna.Ex, antenna.Ey, antenna.Ez, beacon])
append_antenna_hdf5( antennas_fname, antenna, E, name='orig_traces', prepend_time=True)
2022-09-28 13:21:41 +02:00
# add to relevant polarisation
2022-11-14 20:49:35 +01:00
for j, _ in enumerate(beacon_amplitudes):
E[j] += beacon_amplitudes[j]*beacon
2022-09-28 13:21:41 +02:00
2022-09-28 15:54:11 +02:00
append_antenna_hdf5( antennas_fname, antenna, E, name='traces', prepend_time=True)
2022-09-28 13:21:41 +02:00
print("Antenna HDF5 file written as " + str(antennas_fname))