From e90c4c95438eb22a36e0cb264fb5cb9892162407 Mon Sep 17 00:00:00 2001 From: Dominik Demuth Date: Sun, 1 Dec 2024 19:24:19 +0100 Subject: [PATCH] split simulating and evaluating and stuff --- angle_dependence.py | 49 ++++++++++++++++++++++++++++++++++++++ main.py => process_sims.py | 28 +++++----------------- python/helpers.py | 23 +++++------------- python/ste.py | 2 +- start_sims.py | 14 +++++++++++ 5 files changed, 76 insertions(+), 40 deletions(-) create mode 100644 angle_dependence.py rename main.py => process_sims.py (77%) create mode 100644 start_sims.py diff --git a/angle_dependence.py b/angle_dependence.py new file mode 100644 index 0000000..f699eea --- /dev/null +++ b/angle_dependence.py @@ -0,0 +1,49 @@ +import pathlib +import re + +import numpy as np +from matplotlib import pyplot as plt + +from python.helpers import read_parameter_file + +angles = [] +tau_cc = [] +tau_ss = [] +tau2 = [] + +tevo = [5e-6, 10e-6] + + +for fit_files in pathlib.Path('.').glob(f'IsotropicAngle/angle=*/Delta/tau=*/ste_fit_*.dat'): + folder = fit_files.parent + + file_base = fit_files.stem.replace('ste_fit_', '') + parameter = read_parameter_file(folder / ('ste_' + file_base + '_parameter.txt')) + angles.append(parameter['angle']) + + with fit_files.open('r') as f: + # tau of F2 is hidden in the second header line + for _ in range(2): + line = f.readline() + tau2.append(float(re.search('tau=(.+?)\s', line).group(1))) + + fit_values = np.loadtxt(fit_files) + x = fit_values[:, 0] + + # get indexes for given evolution times + nearest_idx = [np.searchsorted(x, tt) for tt in tevo] + tau_cc.append(fit_values[nearest_idx, 1]) + tau_ss.append(fit_values[nearest_idx, 4]) + + +plt.semilogy(angles, tau_cc, '-.') +plt.semilogy(angles, tau_ss, '--') +plt.semilogy(angles, tau2) + +np.savetxt( + 'tau_angles.dat', + np.c_[angles, tau_cc, tau_ss, tau2], + header=f"Angle dependence of correlation times\nfor evolution times {tevo}\nangle->tau_cc->tauss->tau2" +) + +plt.show() diff --git a/main.py b/process_sims.py similarity index 77% rename from main.py rename to process_sims.py index 4f2a07b..64f4288 100644 --- a/main.py +++ b/process_sims.py @@ -1,17 +1,8 @@ +import pathlib + import matplotlib.pyplot as plt from python.ste import * -from python.helpers import * - -# Simulation parameter -motion = 'IsotropicAngle' -distribution = 'Delta' -# parameter = {} -parameter = { - "angle": [10], -} - -parameter = prepare_rw_parameter(parameter) fig_tau_cc, ax_tau_cc = plt.subplots() ax_tau_cc.set_title('tau_cc') @@ -31,12 +22,8 @@ ax_beta_ss.set_title('beta_ss') fig_finfty_ss, ax_finfty_ss = plt.subplots() ax_finfty_ss.set_title('f_infty_ss') -for variation in parameter: - print(f"\nRun RW for {motion}/{distribution} with arguments {variation}\n") - # run_sims(motion, distribution, ste=True, spectrum=False, **variation) - - conf_file = find_config_file(motion, distribution, variation) - +for conf_file in pathlib.Path('.').glob(f'IsotropicAngle/angle=*/Delta/tau=*/*_parameter.txt'): + print(conf_file) vary_string, tau_cc, beta_cc, finfty_cc = fit_ste(conf_file, f'coscos', plot_decays=False, verbose=False) _, tau_ss, beta_ss, finfty_ss = fit_ste(conf_file, f'sinsin', plot_decays=False, verbose=False) _, tau_2, beta_2, finfty_2 = fit_ste(conf_file, f'f2', plot_decays=True, verbose=True) @@ -50,9 +37,8 @@ for variation in parameter: ax_beta_ss.plot(*beta_ss.T, label=vary_string) ax_finfty_ss.plot(*finfty_ss.T, label=vary_string) - np.savetxt( - f'ste_fit_{vary_string}.dat', + conf_file.with_name(f'ste_fit_{vary_string}.dat'), np.c_[ tau_cc, beta_cc[:, 1], finfty_cc[:, 1], tau_ss[:, 1], beta_ss[:, 1], finfty_ss[:, 1], @@ -62,8 +48,6 @@ for variation in parameter: f'tevo\ttaucc\tbetacc\tfinftycc\ttauss\tbetass\tfinftyss', ) - - for ax in [ax_tau_cc, ax_beta_cc, ax_finfty_cc, ax_tau_ss, ax_beta_ss, ax_finfty_ss]: ax.legend() -plt.show() \ No newline at end of file +plt.show() diff --git a/python/helpers.py b/python/helpers.py index a5505a3..c350151 100644 --- a/python/helpers.py +++ b/python/helpers.py @@ -54,23 +54,11 @@ def run_sims( subprocess.run(arguments) -def find_config_file(motion: str, distribution: str, var_params: dict) -> pathlib.Path: - # TODO handle situation if multiple files fit - p_file = None - if var_params: - var_string = '|'.join(([f'{k}={v:1.6e}' for (k, v) in var_params.items()])).replace('.', '\.').replace('+', '\+') - pattern = re.compile(var_string) - for p_file in pathlib.Path('.').glob('*_parameter.txt'): - if len(re.findall(pattern, str(p_file))) == len(var_params) and re.search(f'{motion}_{distribution}', str(p_file)): - return p_file - raise ValueError(f'No parameter file found for {motion}, {distribution}, {var_params}') - else: - for p_file in pathlib.Path('.').glob('*_parameter.txt'): - if re.search(f'{motion}_{distribution}', str(p_file)): - return p_file - raise ValueError(f'No parameter file found for {motion}, {distribution}, {var_params}') - +def find_config_file(config_path: str | pathlib.Path, varied_params: dict[str, float]) -> dict[str, float]: + parameter = read_parameter_file(config_path) + parameter.update(varied_params) + return parameter def read_parameter_file(path: str | pathlib.Path) -> dict[str, float]: @@ -81,8 +69,9 @@ def read_parameter_file(path: str | pathlib.Path) -> dict[str, float]: parameter_dict = {} with path.open('r') as f: for line in f.readlines(): + if line.startswith('#'): + continue k, v = line.split('=') parameter_dict[k] = float(v) - k, v = line.split('=') return parameter_dict diff --git a/python/ste.py b/python/ste.py index 6d6c494..563140d 100644 --- a/python/ste.py +++ b/python/ste.py @@ -74,7 +74,7 @@ def fit_ste( # make evolution times tevo = np.linspace(parameter['tevo_start'], parameter['tevo_stop'], num=int(parameter['tevo_steps'])) - raw_data = np.loadtxt(f'{prefix}_{varied_string}.dat') + raw_data = np.loadtxt(parameter_file.with_name(f'{prefix}_{varied_string}.dat')) t_mix = raw_data[:, 0] decay = raw_data[:, 1:] diff --git a/start_sims.py b/start_sims.py new file mode 100644 index 0000000..9baaa0f --- /dev/null +++ b/start_sims.py @@ -0,0 +1,14 @@ +from python.helpers import * + +#Simulation parameter +motion = 'IsotropicAngle' +distribution = 'Delta' +parameter = { + "angle": [10, 109.47], +} + +parameter = prepare_rw_parameter(parameter) + +for variation in parameter: + print(f"\nRun RW for {motion}/{distribution} with arguments {variation}\n") + run_sims(motion, distribution, ste=True, spectrum=False, **variation) \ No newline at end of file