From 14ecf8f0d8e7185a80247ecdf8d64e4fa7d80e63 Mon Sep 17 00:00:00 2001 From: Kristian Date: Thu, 12 Feb 2026 12:33:45 +0100 Subject: [PATCH 1/2] write distances_per_led_and_layer f as individual txt files to allow backwards calculation of LED intensities --- examples/postprocessing.ipynb | 91 +++++++++++++++++++----- ledsa/analysis/ExtinctionCoefficients.py | 3 +- 2 files changed, 74 insertions(+), 20 deletions(-) diff --git a/examples/postprocessing.ipynb b/examples/postprocessing.ipynb index 2440670..f001151 100644 --- a/examples/postprocessing.ipynb +++ b/examples/postprocessing.ipynb @@ -13,8 +13,17 @@ ] }, { + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-12T11:17:30.067553Z", + "start_time": "2026-02-12T11:17:29.969340Z" + } + }, "cell_type": "code", "source": [ + "import os\n", + "import numpy as np\n", + "\n", "import matplotlib.pyplot as plt\n", "from matplotlib import rcParams\n", "from mpl_toolkits.axes_grid1.inset_locator import InsetPosition\n", @@ -22,14 +31,8 @@ "\n", "from ledsa.postprocessing.simulation import SimData" ], - "metadata": { - "collapsed": false, - "pycharm": { - "name": "#%%\n" - } - }, "outputs": [], - "execution_count": null + "execution_count": 3 }, { "cell_type": "markdown", @@ -49,10 +52,14 @@ "collapsed": false, "pycharm": { "name": "#%%\n" + }, + "ExecuteTime": { + "end_time": "2026-02-12T11:17:30.594443Z", + "start_time": "2026-02-12T11:17:30.589324Z" } }, "outputs": [], - "execution_count": null + "execution_count": 4 }, { "cell_type": "markdown", @@ -62,15 +69,29 @@ } }, { - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-12T11:18:12.183982Z", + "start_time": "2026-02-12T11:18:11.385095Z" + } + }, "cell_type": "code", "source": [ "# Input Dir (Simulations)\n", "path_simulation = '/Path/to/simulation'\n", - "sim = SimData(path_simulation)" + "sim = SimData(path_simulation, remove_duplicates=True)" ], - "outputs": [], - "execution_count": null + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "config.ini loaded\n", + "config_analysis.ini loaded!\n" + ] + } + ], + "execution_count": 7 }, { "metadata": {}, @@ -83,7 +104,12 @@ "source": "## Plot normalized LED Intensities as a function of height for a specific point in time" }, { - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-02-12T11:18:45.447856Z", + "start_time": "2026-02-12T11:18:45.216050Z" + } + }, "cell_type": "code", "source": [ "# Parameters for LED line analysis\n", @@ -95,20 +121,47 @@ "# Find closest time point to given time\n", "closest_time = sim.get_closest_time(time)\n", "# Get normalized LED intensities at specified time and line\n", - "extco_red = sim.get_ledparams_at_led_array(channel=color_channel, led_array_id=led_array_id, window=window, yaxis='height').loc[\n", - " closest_time, :]\n", + "led_intensities = sim.get_ledparams_at_led_array(channel=color_channel, led_array_id=led_array_id, window=window,).loc[closest_time, :]\n", + "\n", + "# Backwards calculate Intensities from Distances Array and Extinction coefficients\n", + "extinction_coefficients = sim.get_extco_at_time(channel=color_channel, time=closest_time, window=window, yaxis='height').iloc[:, led_array_id]\n", + "distances_per_led_and_layer_file = os.path.join(path_simulation, f'led_array_{led_array_id}_distances_per_layer.txt')\n", + "distances_per_led_and_layer = np.loadtxt(distances_per_led_and_layer_file)\n", + "bw_led_intensities = np.exp(np.matmul(distances_per_led_and_layer, -extinction_coefficients.values))\n", "\n", "# Create scatter plot of LED intensity vs height\n", "fig, ax = plt.subplots()\n", - "ax.scatter(extco_red, extco_red.index, color='red', s=5, label=\"channel 0\")\n", + "ax.scatter(led_intensities, range(len(led_intensities)), color='red', s=5, label=f\"LED intensities channel {color_channel}\")\n", + "ax.plot(bw_led_intensities, range(len(bw_led_intensities)), color='black', label=f\"BW LED intensities channel {color_channel}\")\n", "ax.grid()\n", "ax.set_title(f\"Time: {closest_time} s, LED array: {led_array_id}\")\n", "ax.set_xlabel(\"Intensity / -\")\n", - "ax.set_ylabel(\"Height / m\")\n", + "ax.set_ylabel(\"LED / -\")\n", "ax.legend(loc='best')\n" ], - "outputs": [], - "execution_count": null + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "text/plain": [ + "
" + ], + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "execution_count": 12 }, { "metadata": {}, diff --git a/ledsa/analysis/ExtinctionCoefficients.py b/ledsa/analysis/ExtinctionCoefficients.py index 96e3836..550c606 100644 --- a/ledsa/analysis/ExtinctionCoefficients.py +++ b/ledsa/analysis/ExtinctionCoefficients.py @@ -100,7 +100,8 @@ def set_all_member_variables(self) -> None: """ if len(self.distances_per_led_and_layer) == 0: self.distances_per_led_and_layer = self.calc_distance_array() - np.savetxt(f'distances_per_led_and_layer.txt', self.distances_per_led_and_layer) + file_name = f'led_array_{self.experiment.led_array}_distances_per_layer.txt' + np.savetxt(file_name, self.distances_per_led_and_layer) if self.calculated_img_data.empty: self.load_img_data() if self.ref_intensities.shape[0] == 0: From 0cbcc9b851ea330a343aaa865d82865c44c3a487 Mon Sep 17 00:00:00 2001 From: Kristian Date: Thu, 12 Feb 2026 12:34:07 +0100 Subject: [PATCH 2/2] bugfix for reading results data --- ledsa/postprocessing/simulation.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ledsa/postprocessing/simulation.py b/ledsa/postprocessing/simulation.py index 4e15838..765f1f3 100644 --- a/ledsa/postprocessing/simulation.py +++ b/ledsa/postprocessing/simulation.py @@ -137,12 +137,14 @@ def _get_extco_df_from_path(self): file_df = pd.read_csv(file, skiprows=4) channel = int(file.split('channel_')[1].split('_')[0]) led_array = int(file.split('array_')[1].split('.')[0]) - n_layers = len(file_df.columns) # For backwards compatibility, check if Experiment_Time[s] is already in the dataframe - if 'Experiment_Time[s]' not in file_df.columns: + if '# Experiment_Time[s]' not in file_df.columns: time = self.image_info_df['Experiment_Time[s]'].astype(int) file_df = file_df.merge(time, left_index=True, right_index=True) + else: + file_df.rename(columns={'# Experiment_Time[s]': 'Experiment_Time[s]'}, inplace=True) # TODO: this is just a workaround, do better... file_df.set_index('Experiment_Time[s]', inplace=True) + n_layers = len(file_df.columns) iterables = [[channel], [led_array], [i for i in range(0, n_layers)]] file_df.columns = pd.MultiIndex.from_product(iterables, names=["Channel", "LED Array", "Layer"]) extco_list.append(file_df)