Pulse: analog_template interpol + rename snr_factor

This commit is contained in:
Eric Teunis de Boone 2023-04-26 13:45:43 +02:00
parent 4abb6997b8
commit 279ea46550

View file

@ -127,20 +127,20 @@ def trace_upsampler(trace, template_t, trace_t):
def trace_downsampler(trace, template_t, trace_t, offset): def trace_downsampler(trace, template_t, trace_t, offset):
pass pass
def read_time_residuals_cache(cache_fname, template_dt, antenna_dt, noise_sigma_factor, N=None): def read_time_residuals_cache(cache_fname, template_dt, antenna_dt, snr_sigma_factor, N=None):
try: try:
with h5py.File(cache_fname, 'r') as fp: with h5py.File(cache_fname, 'r') as fp:
pgroup = fp['time_residuals'] pgroup = fp['time_residuals']
pgroup2 = pgroup[f'{template_dt}_{antenna_dt}'] pgroup2 = pgroup[f'{template_dt}_{antenna_dt}']
ds_name = str(noise_sigma_factor) ds_name = str(snr_sigma_factor)
ds = pgroup2[ds_name] ds = pgroup2[ds_name]
if N is None: if N is None:
return deepcopy(ds[:]) return deepcopy(ds[:])
else: else:
return deepcopy(ds[:min(N, len(ds))]) return deepcopy(ds[:min(N, len(ds))])
except KeyError: except (KeyError, FileNotFoundError):
return np.array([]) return np.array([])
def write_time_residuals_cache(cache_fname, time_residuals, template_dt, antenna_dt, noise_sigma_factor): def write_time_residuals_cache(cache_fname, time_residuals, template_dt, antenna_dt, noise_sigma_factor):
@ -164,13 +164,23 @@ if __name__ == "__main__":
bp_freq = (30e-3, 80e-3) # GHz bp_freq = (30e-3, 80e-3) # GHz
template_dt = 5e-2 # ns template_dt = 5e-2 # ns
template_length = 500 # ns interp_template_dt = 5e-5 # ns
template_length = 200 # ns
N_residuals = 50*3 if len(sys.argv) < 2 else int(sys.argv[1]) N_residuals = 50*3 if len(sys.argv) < 2 else int(sys.argv[1])
noise_factors = [1e-4, 3e-4, 1e-3, 3e-3, 1e-2, 3e-2, 1e-1, 3e-1, 5e-1, 7e-1] # amplitude factor snr_factors = np.concatenate( # 1/noise_amplitude factor
(
[0.25, 0.5, 0.75],
[1, 1.5, 2, 2.5, 3, 4, 5, 7],
[10, 20, 30, 50],
[100, 200, 300, 500]
),
axis=None)
antenna_dt = 2 # ns antenna_dt = 2 # ns
antenna_timelength = 2048 # ns antenna_timelength = 1024 # ns
cut_wrong_peak_matches = True
# #
# Create the template # Create the template
@ -180,7 +190,16 @@ if __name__ == "__main__":
template.signal = antenna_bp(_deltapeak[0], *bp_freq, template_dt) template.signal = antenna_bp(_deltapeak[0], *bp_freq, template_dt)
template.peak_sample = _deltapeak[1] template.peak_sample = _deltapeak[1]
template.peak_time = template.dt * template.peak_sample template.peak_time = template.dt * template.peak_sample
interp1d_template = interpolate.interp1d(template.t, template.signal, assume_sorted=True, fill_value=0, bounds_error=False)
# Interpolation Template
# to create an 'analog' sampled antenna
interp_template = Waveform(None, dt=interp_template_dt, name='Interpolation Template')
_interp_deltapeak = util.deltapeak(timelength=template_length, samplerate=1/interp_template.dt, offset=0)
interp_template.signal = antenna_bp(_interp_deltapeak[0], *bp_freq, interp_template.dt)
interp_template.peak_sample = _interp_deltapeak[1]
interp_template.peak_time = interp_template.dt * interp_template.peak_sample
interp_template.signal *= max(template.signal)/max(interp_template.signal)
interp_template.interpolate = interpolate.interp1d(interp_template.t, interp_template.signal, assume_sorted=True, fill_value=0, bounds_error=False)
if True: # show template if True: # show template
fig, ax = plt.subplots() fig, ax = plt.subplots()
@ -189,6 +208,8 @@ if __name__ == "__main__":
ax.set_ylabel("Amplitude") ax.set_ylabel("Amplitude")
ax.plot(template.t, max(template.signal)*_deltapeak[0], label='Impulse Template') ax.plot(template.t, max(template.signal)*_deltapeak[0], label='Impulse Template')
ax.plot(template.t, template.signal, label='Filtered Template') ax.plot(template.t, template.signal, label='Filtered Template')
ax.plot(interp_template.t, interp_template.signal, label='Filtered Interpolation Template', ls='dashed')
ax.legend()
fig.savefig('figures/11_template_deltapeak.pdf') fig.savefig('figures/11_template_deltapeak.pdf')
if True: # show filtering equivalence samplerates if True: # show filtering equivalence samplerates
@ -210,12 +231,13 @@ if __name__ == "__main__":
# #
h5_cache_fname = f'11_pulsed_timing.hdf5' h5_cache_fname = f'11_pulsed_timing.hdf5'
time_accuracies = np.zeros(len(noise_factors)) time_accuracies = np.zeros(len(snr_factors))
for k, noise_sigma_factor in tqdm(enumerate(noise_factors)): for k, snr_sigma_factor in tqdm(enumerate(snr_factors)):
print() #separating tqdm
# Read in cached time residuals # Read in cached time residuals
cached_time_residuals = read_time_residuals_cache(h5_cache_fname, template.dt, antenna_dt, noise_sigma_factor) if True:
cached_time_residuals = read_time_residuals_cache(h5_cache_fname, template.dt, antenna_dt, snr_sigma_factor)
else:
cached_time_residuals = np.array([])
# #
# Find difference between true and templated times # Find difference between true and templated times
@ -243,7 +265,8 @@ if __name__ == "__main__":
antenna.t = util.sampled_time(1/antenna.dt, start=0, end=antenna_timelength) antenna.t = util.sampled_time(1/antenna.dt, start=0, end=antenna_timelength)
antenna.signal = interp1d_template(antenna.t - antenna.peak_time) # Sample the interpolation template
antenna.signal = interp_template.interpolate(antenna.t - antenna.peak_time)
antenna.peak_sample = antenna.peak_time/antenna.dt antenna.peak_sample = antenna.peak_time/antenna.dt
antenna_true_signal = antenna.signal antenna_true_signal = antenna.signal
@ -254,7 +277,7 @@ if __name__ == "__main__":
antenna.signal *= -1 antenna.signal *= -1
## Add noise ## Add noise
noise_amplitude = max(template.signal) * noise_sigma_factor noise_amplitude = max(template.signal) * 1/snr_sigma_factor
noise_realisation = noise_amplitude * white_noise_realisation(len(antenna.signal)) noise_realisation = noise_amplitude * white_noise_realisation(len(antenna.signal))
filtered_noise = antenna_bp(noise_realisation, *bp_freq, antenna.dt) filtered_noise = antenna_bp(noise_realisation, *bp_freq, antenna.dt)
@ -323,16 +346,18 @@ if __name__ == "__main__":
lag_dt = upsampled_t[1] - upsampled_t[0] lag_dt = upsampled_t[1] - upsampled_t[0]
corrs, (out1_signal, out2_template, lags) = my_correlation(upsampled_trace, template.signal) corrs, (out1_signal, out2_template, lags) = my_correlation(upsampled_trace, template.signal)
else: # downsampled template
raise NotImplementedError
corrs, (out1_signal, out2_template, lags) = my_downsampling_correlation(template.signal, antenna.signal, template.t, antenna.t)
lag_dt = upsampled_t[1] - upsampled_t[0]
# Determine best correlation time # Determine best correlation time
idx = np.argmax(abs(corrs)) idx = np.argmax(abs(corrs))
best_sample_lag = lags[idx] best_sample_lag = lags[idx]
best_time_lag = best_sample_lag * lag_dt best_time_lag = best_sample_lag * lag_dt
else: # downsampled template
raise NotImplementedError
corrs, (_, _, lags) = my_downsampling_correlation(antenna.signal, antenna.t, template.signal, template.t)
lag_dt = upsampled_t[1] - upsampled_t[0]
# Calculate the time residual
time_residuals[j] = best_time_lag - true_time_offset time_residuals[j] = best_time_lag - true_time_offset
if not do_plots: if not do_plots:
@ -408,13 +433,16 @@ if __name__ == "__main__":
if True: if True:
plt.close(fig) plt.close(fig)
print()# separating tqdm
print()# separating tqdm print()# separating tqdm
# Were new time residuals calculated? # Were new time residuals calculated?
# Add them to the cache file # Add them to the cache file
if len(time_residuals) > 1: if len(time_residuals) > 1:
# merge cached and calculated time residuals # merge cached and calculated time residuals
time_residuals = np.concatenate((cached_time_residuals, time_residuals), axis=None) time_residuals = np.concatenate((cached_time_residuals, time_residuals), axis=None)
write_time_residuals_cache(h5_cache_fname, time_residuals, template_dt, antenna_dt, noise_sigma_factor)
if True: # write the cache
write_time_residuals_cache(h5_cache_fname, time_residuals, template_dt, antenna_dt, snr_sigma_factor)
else: else:
time_residuals = cached_time_residuals time_residuals = cached_time_residuals
@ -498,13 +526,17 @@ if __name__ == "__main__":
ax.set_yscale('log') ax.set_yscale('log')
# plot the values # plot the values
ax.plot(1/np.asarray(noise_factors), time_accuracies, ls='none', marker='o') ax.plot(np.asarray(snr_factors), time_accuracies, ls='none', marker='o')
if True: # limit y-axis to 1e0
ax.set_ylim([None, 1e1])
# Set horizontal line at 1 ns # Set horizontal line at 1 ns
if True: if True:
ax.axhline(1, ls='--', alpha=0.8, color='g') ax.axhline(1, ls='--', alpha=0.8, color='g')
ax.grid() ax.grid()
ax.axhline(template_dt/np.sqrt(12), ls='--', alpha=0.7, color='b')
fig.tight_layout() fig.tight_layout()
fig.savefig(f"figures/11_time_res_vs_snr_tdt{template_dt:0.1e}.pdf") fig.savefig(f"figures/11_time_res_vs_snr_tdt{template_dt:0.1e}.pdf")