mirror of
https://gitlab.science.ru.nl/mthesis-edeboone/m-thesis-introduction.git
synced 2024-12-22 11:33:32 +01:00
ZH: extract code plotting measured and actual phases (or residuals)
This commit is contained in:
parent
61c3f608c9
commit
e821ce00ca
2 changed files with 76 additions and 22 deletions
|
@ -8,6 +8,7 @@ import numpy as np
|
||||||
|
|
||||||
import aa_generate_beacon as beacon
|
import aa_generate_beacon as beacon
|
||||||
import lib
|
import lib
|
||||||
|
from lib import figlib
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
from os import path
|
from os import path
|
||||||
|
@ -155,42 +156,30 @@ if __name__ == "__main__":
|
||||||
##
|
##
|
||||||
## Histogram
|
## Histogram
|
||||||
##
|
##
|
||||||
fig, axs = plt.subplots(2, 1, sharex=True, figsize=figsize)
|
fig = figlib.phase_comparison_figure(
|
||||||
colors = ['blue', 'orange']
|
loc_c,
|
||||||
|
actual_clock_phases,
|
||||||
if True:
|
plot_residuals=plot_residuals,
|
||||||
phase2time = lambda x: x/(2*np.pi*f_beacon)
|
f_beacon=f_beacon,
|
||||||
time2phase = lambda x: 2*np.pi*x*f_beacon
|
figsize=figsize
|
||||||
secax = axs[0].secondary_xaxis('top', functions=(phase2time, time2phase))
|
)
|
||||||
secax.set_xlabel('Time $\\Delta\\varphi/(2\\pi f_{beac})$ [ns]')
|
|
||||||
|
|
||||||
if plot_residuals:
|
if plot_residuals:
|
||||||
fig.suptitle("Difference between Measured and True Clock phases")
|
fig.suptitle("Difference between Measured and True Clock phases")
|
||||||
else:
|
else:
|
||||||
fig.suptitle("Comparison Measured and True Clock Phases")
|
fig.suptitle("Comparison Measured and True Clock Phases")
|
||||||
|
|
||||||
|
axs = fig.get_axes()
|
||||||
axs[-1].set_xlabel(f'Antenna {title} {color_label}')
|
axs[-1].set_xlabel(f'Antenna {title} {color_label}')
|
||||||
|
|
||||||
#
|
#
|
||||||
hist_kwargs = dict(bins='sqrt', density=False, alpha=0.8, histtype='step')
|
|
||||||
|
|
||||||
i=0
|
i=0
|
||||||
axs[i].set_ylabel("#")
|
secax = axs[i].child_axes[0]
|
||||||
axs[i].hist(loc_c, color=colors[0], label='Measured', ls='solid', **hist_kwargs)
|
secax.set_xlabel('Time $\\Delta\\varphi/(2\\pi f_{beac})$ [ns]')
|
||||||
if not plot_residuals: # also plot the true clock phases
|
|
||||||
axs[i].hist(actual_clock_phases, color=colors[1], label='Actual', ls='dashed', **hist_kwargs)
|
|
||||||
#axs[i].legend()
|
|
||||||
|
|
||||||
#
|
#
|
||||||
plot_kwargs = dict(alpha=0.6, ls='none')
|
|
||||||
|
|
||||||
i=1
|
i=1
|
||||||
axs[i].set_ylabel("Antenna no.")
|
axs[i].set_ylabel("Antenna no.")
|
||||||
axs[i].plot(loc_c, np.arange(len(loc_c)), marker='x' if plot_residuals else '3', color=colors[0], label='Measured', **plot_kwargs)
|
|
||||||
|
|
||||||
if not plot_residuals: # also plot the true clock phases
|
|
||||||
axs[i].plot(actual_clock_phases, np.arange(len(loc_c)), marker='4', color=colors[1], label='Actual', **plot_kwargs)
|
|
||||||
axs[i].legend()
|
|
||||||
|
|
||||||
# Save figure
|
# Save figure
|
||||||
if fig_dir:
|
if fig_dir:
|
||||||
|
|
65
simulations/airshower_beacon_simulation/lib/figlib.py
Normal file
65
simulations/airshower_beacon_simulation/lib/figlib.py
Normal file
|
@ -0,0 +1,65 @@
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
def phase_comparison_figure(
|
||||||
|
measured_phases,
|
||||||
|
true_phases,
|
||||||
|
plot_residuals=True,
|
||||||
|
f_beacon=None,
|
||||||
|
hist_kwargs={},
|
||||||
|
sc_kwargs={},
|
||||||
|
colors=['blue', 'orange'],
|
||||||
|
legend_on_scatter=True,
|
||||||
|
**fig_kwargs
|
||||||
|
):
|
||||||
|
"""
|
||||||
|
Create a figure comparing measured_phase against true_phase
|
||||||
|
by both plotting the values, and the residuals.
|
||||||
|
"""
|
||||||
|
default_fig_kwargs = dict(sharex=True)
|
||||||
|
fig_kwargs = {**default_fig_kwargs, **fig_kwargs}
|
||||||
|
|
||||||
|
do_hist_plot = hist_kwargs is not False
|
||||||
|
do_scatter_plot = sc_kwargs is not False
|
||||||
|
|
||||||
|
fig, axs = plt.subplots(0+do_hist_plot+do_scatter_plot, 1, **fig_kwargs)
|
||||||
|
|
||||||
|
if not hasattr(axs, '__len__'):
|
||||||
|
axs = [axs]
|
||||||
|
|
||||||
|
if f_beacon:
|
||||||
|
phase2time = lambda x: x/(2*np.pi*f_beacon)
|
||||||
|
time2phase = lambda x: 2*np.pi*x*f_beacon
|
||||||
|
secax = axs[0].secondary_xaxis('top', functions=(phase2time, time2phase))
|
||||||
|
secax.set_xlabel('Time $\\varphi/(2\\pi f_{beac})$ [ns]')
|
||||||
|
|
||||||
|
# Histogram
|
||||||
|
if do_hist_plot:
|
||||||
|
i=0
|
||||||
|
default_hist_kwargs = dict(bins='sqrt', density=False, alpha=0.8, histtype='step')
|
||||||
|
hist_kwargs = {**default_hist_kwargs, **hist_kwargs}
|
||||||
|
|
||||||
|
axs[i].set_ylabel("#")
|
||||||
|
|
||||||
|
_counts, _bins, _patches = axs[i].hist(measured_phases, color=colors[0], label='Measured', ls='solid', **hist_kwargs)
|
||||||
|
if not plot_residuals: # also plot the true clock phases
|
||||||
|
axs[i].hist(true_phases, color=colors[1], label='Actual', ls='dashed', **{**hist_kwargs, **dict(bins=_bins)})
|
||||||
|
|
||||||
|
# Scatter plot
|
||||||
|
if do_scatter_plot:
|
||||||
|
i=1
|
||||||
|
default_sc_kwargs = dict(alpha=0.6, ls='none')
|
||||||
|
sc_kwargs = {**default_sc_kwargs, **sc_kwargs}
|
||||||
|
|
||||||
|
axs[i].set_ylabel("Antenna no.")
|
||||||
|
axs[i].plot(measured_phases, np.arange(len(measured_phases)), marker='x' if plot_residuals else '3', color=colors[0], label='Measured', **sc_kwargs)
|
||||||
|
|
||||||
|
if not plot_residuals: # also plot the true clock phases
|
||||||
|
axs[i].plot(true_phases, np.arange(len(true_phases)), marker='4', color=colors[1], label='Actual', **sc_kwargs)
|
||||||
|
|
||||||
|
if not plot_residuals and legend_on_scatter:
|
||||||
|
axs[i].legend()
|
||||||
|
|
||||||
|
fig.tight_layout()
|
||||||
|
|
||||||
|
return fig
|
Loading…
Reference in a new issue