Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Whether you are new to Python or an experienced bioimage researcher, VLab4Mic pr

- Build **virtual samples** from PDB/CIF structures
- Apply **direct or indirect fluorescent labeling**
- Introduce **defects**, crowding, and structural variation
- Introduce **Structural integrity**, crowding, and structural variation
- Simulate image acquisition across modalities
- Run **parameter sweeps** to explore experimental conditions
- Compare **noiseless vs. realistic** acquisitions
Expand Down
2 changes: 1 addition & 1 deletion docs/search.js

Large diffs are not rendered by default.

7 changes: 3 additions & 4 deletions docs/vlab4mic.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/analysis.html

Large diffs are not rendered by default.

20 changes: 10 additions & 10 deletions docs/vlab4mic/analysis/_plots.html

Large diffs are not rendered by default.

20 changes: 10 additions & 10 deletions docs/vlab4mic/analysis/metrics.html

Large diffs are not rendered by default.

3,734 changes: 1,876 additions & 1,858 deletions docs/vlab4mic/analysis/sweep.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/configs.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/configs/acquisition.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/configs/fluorophores.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/configs/modalities.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/configs/probes.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/configs/structures.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/configs/virtualsample.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/download.html

Large diffs are not rendered by default.

8,434 changes: 4,355 additions & 4,079 deletions docs/vlab4mic/experiments.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/generate.html

Large diffs are not rendered by default.

40 changes: 21 additions & 19 deletions docs/vlab4mic/generate/coordinates_field.html

Large diffs are not rendered by default.

3,683 changes: 1,870 additions & 1,813 deletions docs/vlab4mic/generate/imaging.html

Large diffs are not rendered by default.

6,993 changes: 3,504 additions & 3,489 deletions docs/vlab4mic/generate/labelled_instance.html

Large diffs are not rendered by default.

450 changes: 230 additions & 220 deletions docs/vlab4mic/generate/labels.html

Large diffs are not rendered by default.

4,780 changes: 2,401 additions & 2,379 deletions docs/vlab4mic/generate/molecular_structure.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/generate/psfs.html

Large diffs are not rendered by default.

238 changes: 0 additions & 238 deletions docs/vlab4mic/jupyter_widgets.html

This file was deleted.

3,275 changes: 0 additions & 3,275 deletions docs/vlab4mic/jupyter_widgets/_experiment_parameters.html

This file was deleted.

2,283 changes: 0 additions & 2,283 deletions docs/vlab4mic/jupyter_widgets/_experiment_visualisation.html

This file was deleted.

1,094 changes: 0 additions & 1,094 deletions docs/vlab4mic/jupyter_widgets/_widget_generator.html

This file was deleted.

860 changes: 0 additions & 860 deletions docs/vlab4mic/jupyter_widgets/experiment_widgets.html

This file was deleted.

2,565 changes: 0 additions & 2,565 deletions docs/vlab4mic/jupyter_widgets/sweep_parameters_widgets.html

This file was deleted.

7,201 changes: 3,751 additions & 3,450 deletions docs/vlab4mic/sweep_generator.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/utils.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/utils/data_format.html

Large diffs are not rendered by default.

18 changes: 9 additions & 9 deletions docs/vlab4mic/utils/data_format/configuration_format.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/utils/data_format/structural_format.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/utils/data_format/visualisation.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/utils/io.html

Large diffs are not rendered by default.

76 changes: 60 additions & 16 deletions docs/vlab4mic/utils/io/text.html

Large diffs are not rendered by default.

97 changes: 71 additions & 26 deletions docs/vlab4mic/utils/io/tiff.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/utils/io/yaml_functions.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/utils/sample.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/utils/sample/arrays.html

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions docs/vlab4mic/utils/transform.html

Large diffs are not rendered by default.

154 changes: 83 additions & 71 deletions docs/vlab4mic/utils/transform/cif_builder.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/utils/transform/datatype.html

Large diffs are not rendered by default.

18 changes: 9 additions & 9 deletions docs/vlab4mic/utils/transform/image_convolution.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/utils/transform/noise.html

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/utils/transform/normals.html

Large diffs are not rendered by default.

292 changes: 169 additions & 123 deletions docs/vlab4mic/utils/transform/points_transforms.html

Large diffs are not rendered by default.

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions docs/vlab4mic/utils/visualisation.html

Large diffs are not rendered by default.

568 changes: 213 additions & 355 deletions docs/vlab4mic/utils/visualisation/matplotlib_plots.html

Large diffs are not rendered by default.

400 changes: 201 additions & 199 deletions docs/vlab4mic/workflows.html

Large diffs are not rendered by default.

22 changes: 11 additions & 11 deletions examples/article_figures/fig3B.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
sweep_repetitions=20,
# parameters for sweep
labelling_efficiency=(0,1,0.25),
defect=(0,1,0.25),
defect_small_cluster=[300,],
defect_large_cluster=[600,],
structural_integrity=(0,1,0.25),
structural_integrity_small_cluster=[300,],
structural_integrity_large_cluster=[600,],
exp_time=[0.001, 0.01,],
# output and analysis
output_name="vlab_script",
Expand All @@ -26,21 +26,21 @@
plt.rcParams['figure.figsize'] = [20, 10]

fig, axs = plt.subplots(1, 4)
image, parameters = sweep_gen.preview_image_output_by_ID(probe_parameters=4, defect_parameters=0, modality_template=3, return_image=True)
image, parameters = sweep_gen.preview_image_output_by_ID(probe_parameters=4, structural_integrity_parameters=0, modality_template=3, return_image=True)
axs[0].imshow(image, cmap="grey")
title = "Labelling efficiency: " + str(parameters[2]["labelling_efficiency"]) + "\n" + "Incomplete Labelling: " + str(parameters[3]["defect"])
title = "Labelling efficiency: " + str(parameters[2]["labelling_efficiency"]) + "\n" + "Structural Integrity: " + str(parameters[3]["structural_integrity"])
axs[0].set_title(title)
image, parameters = sweep_gen.preview_image_output_by_ID(probe_parameters=1, defect_parameters=0, modality_template=3, return_image=True)
image, parameters = sweep_gen.preview_image_output_by_ID(probe_parameters=1, structural_integrity_parameters=0, modality_template=3, return_image=True)
axs[1].imshow(image, cmap="grey")
title = "Labelling efficiency: " + str(parameters[2]["labelling_efficiency"]) + "\n" + "Incomplete Labelling: " + str(parameters[3]["defect"])
title = "Labelling efficiency: " + str(parameters[2]["labelling_efficiency"]) + "\n" + "Structural Integrity: " + str(parameters[3]["structural_integrity"])
axs[1].set_title(title)
image, parameters = sweep_gen.preview_image_output_by_ID(probe_parameters=4, defect_parameters=2, modality_template=3, return_image=True)
image, parameters = sweep_gen.preview_image_output_by_ID(probe_parameters=4, structural_integrity_parameters=2, modality_template=3, return_image=True)
axs[2].imshow(image, cmap="grey")
title = "Labelling efficiency: " + str(parameters[2]["labelling_efficiency"]) + "\n" + "Incomplete Labelling: " + str(parameters[3]["defect"])
title = "Labelling efficiency: " + str(parameters[2]["labelling_efficiency"]) + "\n" + "Structural Integrity: " + str(parameters[3]["structural_integrity"])
axs[2].set_title(title)
image, parameters = sweep_gen.preview_image_output_by_ID(probe_parameters=1, defect_parameters=2, modality_template=3, return_image=True)
image, parameters = sweep_gen.preview_image_output_by_ID(probe_parameters=1, structural_integrity_parameters=2, modality_template=3, return_image=True)
axs[3].imshow(image, cmap="grey")
title = "Labelling efficiency: " + str(parameters[2]["labelling_efficiency"]) + "\n" + "Incomplete Labelling: " + str(parameters[3]["defect"])
title = "Labelling efficiency: " + str(parameters[2]["labelling_efficiency"]) + "\n" + "Structural Integrity: " + str(parameters[3]["structural_integrity"])
axs[3].set_title(title)


Expand Down
24 changes: 12 additions & 12 deletions examples/parameter_sweep.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@
sweep_repetitions=3,
# parameters for sweep
labelling_efficiency=(0, 1, 0.5), # values between 0 and 1 with step of 0.5
defect=(0, 1, 0.5), # values between 0 and 1 with step of 0.5
defect_small_cluster=[300,], # 1 single value
defect_large_cluster=[600,], # 1 single value
structural_integrity=(0, 1, 0.5), # values between 0 and 1 with step of 0.5
structural_integrity_small_cluster=[300,], # 1 single value
structural_integrity_large_cluster=[600,], # 1 single value
exp_time=[0.001, 0.01,], # 2 values
# output and analysis
output_name="vlab_example_sweep",
Expand All @@ -24,7 +24,7 @@

## - probe_model
## - probe_parameters
## - defect_parameters
## - structural_integrity_parameters
## - virtual_sample_parameters
## - Modality_template
## - Modality_parameters
Expand All @@ -35,25 +35,25 @@
## For instance, the first combination is always "0_0_0_0_0_0_0". When a parameter is not used in the sweep,
## its ID is always 0.

## For this example, since we used 3 values for labelling efficiency and defect,
## For this example, since we used 3 values for labelling efficiency and structural_integrity,
## the possible IDs for labelling efficiency are 0, 1 or 2 (for 0, 0.5 and 1, respectively).
## Similarly, the IDs for defect are also 0, 1, 2 (for 0, 0.5 and 1, respectively).
## Similarly, the IDs for structural_integrity are also 0, 1, 2 (for 0, 0.5 and 1, respectively).

## We will show the simulations for SMLM modality (modality_template ID = 3) in defaults.
fig, axs = plt.subplots(1, 2)
# First image: labelling efficiency of 1 and no defect
image, parameters = sweep_gen.preview_image_output_by_ID(probe_parameters=2, defect_parameters=0, modality_template=3, return_image=True)
# First image: labelling efficiency of 1 and no structural_integrity
image, parameters = sweep_gen.preview_image_output_by_ID(probe_parameters=2, structural_integrity_parameters=0, modality_template=3, return_image=True)
axs[0].imshow(image, cmap="grey")
axs[0].set_xticks([])
axs[0].set_yticks([])
title = "Labelling efficiency: " + str(parameters[2]["labelling_efficiency"]) + "\n" + "Incomplete Labelling: " + str(parameters[3]["defect"])
title = "Labelling efficiency: " + str(parameters[2]["labelling_efficiency"]) + "\n" + "Structural Integrity: " + str(parameters[3]["structural_integrity"])
axs[0].set_title(title)
# Second image: labelling efficiency of 1 and defect of 0.5
image, parameters = sweep_gen.preview_image_output_by_ID(probe_parameters=2, defect_parameters=1, modality_template=3, return_image=True)
# Second image: labelling efficiency of 1 and structural_integrity of 0.5
image, parameters = sweep_gen.preview_image_output_by_ID(probe_parameters=2, structural_integrity_parameters=1, modality_template=3, return_image=True)
axs[1].imshow(image, cmap="grey")
axs[1].set_xticks([])
axs[1].set_yticks([])
title = "Labelling efficiency: " + str(parameters[2]["labelling_efficiency"]) + "\n" + "Incomplete Labelling: " + str(parameters[3]["defect"])
title = "Labelling efficiency: " + str(parameters[2]["labelling_efficiency"]) + "\n" + "Structural Integrity: " + str(parameters[3]["structural_integrity"])
axs[1].set_title(title)

plt.show()
2 changes: 1 addition & 1 deletion examples/readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ In this example we select a NPC model, labelled at the C-terminal of Nup96.

Then we set up parameters for sweep:
- Labelling efficiency: 3 values from 0 to 1
- Incomplete labelling (or defects): 3 values from 0 to 1
- Incomplete labelling (or structural_integrity): 3 values from 0 to 1

We then compare each image output against a reference, for example, by calculating its pearson correlation.

Expand Down
22 changes: 11 additions & 11 deletions manual.md
Original file line number Diff line number Diff line change
Expand Up @@ -375,9 +375,9 @@ sweep_gen = run_parameter_sweep(
sweep_repetitions=20,
# parameters for sweep
labelling_efficiency=(0, 1, 5), # 5 linearly spaced values between 0 and 1
defect=(0, 1, 5), # 5 linearly spaced values between 0 and 1
defect_small_cluster=[300,], # 1 single value
defect_large_cluster=[600,], # 1 single value
structural_integrity=(0, 1, 5), # 5 linearly spaced values between 0 and 1
structural_integrity_small_cluster=[300,], # 1 single value
structural_integrity_large_cluster=[600,], # 1 single value
exp_time=[0.001, 0.01,], # 2 values
# output and analysis
output_name="vlab_script",
Expand All @@ -389,7 +389,7 @@ sweep_gen = run_parameter_sweep(
```

> ⚠️ **Note:** When running a parameter sweep, all possible parameter combinations will be used.
> For example, setting 10 values for labelling efficiencies and 10 values for particle defects will generate 100 combinations.
> For example, setting 10 values for labelling efficiencies and 10 values for particle structural_integrity will generate 100 combinations.

### 📝 Available parameters for sweeping

Expand All @@ -410,9 +410,9 @@ If a parameter is `None`, it will not be swept and will use default values.
- probe_DoL
- probe_wobble_theta
- labelling_efficiency
- defect
- defect_small_cluster
- defect_large_cluster
- structural_integrity
- structural_integrity_small_cluster
- structural_integrity_large_cluster
- sample_dimensions
- particle_orientations
- rotation_angles
Expand Down Expand Up @@ -456,13 +456,13 @@ If a parameter is `None`, it will not be swept and will use default values.
| **peptide_motif** | Dictionary specifying motif extraction for probe target sequence |
| **as_primary** | Whether to treat the probe as a primary linker (bool) |

## 🧩 Defects parameters
## 🧩 Structural Integrity parameters

| Parameter name | Description |
| --- | --- |
| **defect** | Fraction of the particle rendered inaccessible to probes (float) |
| **defect_small_cluster** | Maximum distance between epitopes for first grouping (in Å) |
| **defect_large_cluster** | Minimum distance between epitopes for second grouping (in Å) |
| **structural_integrity** | Fraction of the particle rendered inaccessible to probes (float) |
| **structural_integrity_small_cluster** | Maximum distance between epitopes for first grouping (in Å) |
| **structural_integrity_large_cluster** | Minimum distance between epitopes for second grouping (in Å) |

## 🧱 Virtual sample parameters

Expand Down
43 changes: 10 additions & 33 deletions notebooks/VLab4Mic_main.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
"This notebook guides you through a complete virtual microscopy experiment:\n",
"\n",
"1. **Select a macromolecular structure** (e.g., virus particles, nuclear pore complexes)\n",
"2. **Choose and configure probes** for labeling with advanced defect modeling options\n",
"2. **Choose and configure probes** for labeling with advanced structural integrity modeling options\n",
"3. **Create a virtual sample** with multiple labeled particles\n",
"4. **Configure imaging modalities** (SMLM, confocal, widefield, etc.)\n",
"5. **Set acquisition parameters** and simulate realistic image data\n",
Expand Down Expand Up @@ -84,15 +84,7 @@
"cellView": "form",
"id": "34087ec5"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Experiment created with default parameters\n"
]
}
],
"outputs": [],
"source": [
"#@title Install vlab4mic and necessary dependencies\n",
"try:\n",
Expand Down Expand Up @@ -212,13 +204,13 @@
"\n",
"## ⚙️ Advanced Parameters\n",
"\n",
"### 🔬 Structural Defect Modeling\n",
"Simulate realistic structural defects in macromolecular complexes:\n",
"- **Defect Fraction (0-1)**: Proportion of structural units to remove (e.g., 0.2 = 20% defects)\n",
"### 🔬 Structural Structural Integrity Modeling\n",
"Simulate realistic structural structural integrity in macromolecular complexes:\n",
"- **Structural Integrity Fraction (0-1)**: Proportion of structural units to remove (e.g., 0.2 = 20% structural integrity)\n",
"- **Small Cluster Distance (Å)**: Clustering threshold for identifying small defective regions\n",
"- **Large Cluster Distance (Å)**: Clustering threshold for identifying large defective regions\n",
"\n",
"⚠️ **Requirements**: All three defect parameters must be > 0 to enable defect modeling.\n",
"⚠️ **Requirements**: All three structural integrity parameters must be > 0 to enable structural integrity modeling.\n",
"\n",
"### 🛠️ Custom Probe Configuration\n",
"Fine-tune probe properties:\n",
Expand Down Expand Up @@ -526,28 +518,13 @@
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": null,
"id": "cb99d484",
"metadata": {
"cellView": "form",
"id": "cb99d484"
},
"outputs": [
{
"data": {
"application/vnd.jupyter.widget-view+json": {
"model_id": "0173c9adc3534ba290131feb3f99a39c",
"version_major": 2,
"version_minor": 0
},
"text/plain": [
"VBox(children=(HTML(value=\"Current settings of the experiment:<br>Structure ID: 1XI5<br>Probes: ['NHS_ester']<…"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"outputs": [],
"source": [
"#@title Run your experiment\n",
"experiment_widgets.run_experiment_widget(my_experiment).show()"
Expand All @@ -559,7 +536,7 @@
"provenance": []
},
"kernelspec": {
"display_name": "vlab",
"display_name": "vlab4mic-dev",
"language": "python",
"name": "python3"
},
Expand All @@ -573,7 +550,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.13"
"version": "3.11.14"
}
},
"nbformat": 4,
Expand Down
20 changes: 8 additions & 12 deletions notebooks/VLab4Mic_parameter_sweeps.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -40,11 +40,11 @@
"### Step-by-Step Workflow:\n",
"\n",
"1. **🏗️ Choose a Structure** - Select your macromolecular complex of interest\n",
"2. **🎯 Configure Probes** - Set up labeling strategies and defect modeling\n",
"2. **🎯 Configure Probes** - Set up labeling strategies and structural integrity modeling\n",
"3. **📡 Select Modalities** - Choose imaging techniques (SMLM, confocal, widefield)\n",
"4. **⚙️ Define Parameter Sweeps** - Set ranges for systematic testing:\n",
" - **Probe parameters:** efficiency, distance to epitope\n",
" - **Defect modeling:** fraction, small/large cluster thresholds \n",
" - **Structural Integrity modeling:** fraction, small/large cluster thresholds \n",
" - **Sample parameters:** particle count, orientations\n",
" - **Acquisition settings:** exposure time, noise levels\n",
"5. **📊 Execute & Analyze** - Generate comprehensive datasets and comparisons\n",
Expand All @@ -54,12 +54,12 @@
"## 🔄 Understanding Parameter Sweeps\n",
"\n",
"A **parameter sweep** systematically explores the parameter space by running simulations for **every possible combination** of your selected parameter values across:\n",
"- Molecular structures + Probe configurations + Imaging modalities + Defect settings\n",
"- Molecular structures + Probe configurations + Imaging modalities + Structural Integrity settings\n",
"\n",
"### ⚠️ Key Considerations:\n",
"- **📈 Exponential scaling:** More parameters = exponentially more simulations\n",
"- **🎛️ Parameter interactions:** Probe modifiers affect all selected probes \n",
"- **🧬 Defect modeling:** Parameters work together to simulate realistic structural defects\n",
"- **🧬 Structural Integrity modeling:** Parameters work together to simulate realistic structural defects\n",
"- **💻 Computational cost:** Balance thoroughness with available resources\n",
"\n",
"### 💡 **Pro Tip:** Start with small parameter ranges to test your workflow, then expand for comprehensive studies.\n",
Expand Down Expand Up @@ -117,10 +117,6 @@
"for group_name, params in sweep_generator.param_settings.items():\n",
" print(f\" • {group_name}: {', '.join(params.keys())}\")\n",
"\n",
"# Confirm defect parameters are ready\n",
"defect_available = 'particle_defect' in sweep_generator.param_settings\n",
"print(f\"\\n🧬 Defect modeling: {'✅ Ready' if defect_available else '❌ Not available'}\")\n",
"\n",
"print(\"\\n🎉 System ready! Proceed to structure selection below.\")"
]
},
Expand Down Expand Up @@ -227,14 +223,14 @@
"source": [
"# ⚙️ Step 3: Configure Parameter Sweep Ranges\n",
"\n",
"Define the parameter ranges for systematic exploration. Each module (probe, defect modeling, sample, acquisition) offers specific parameters that modify your configurations.\n",
"Define the parameter ranges for systematic exploration. Each module (probe, structural integrity modeling, sample, acquisition) offers specific parameters that modify your configurations.\n",
"\n",
"### 🎛️ Parameter Categories:\n",
"\n",
"| Category | Parameters | Purpose |\n",
"|----------|------------|---------|\n",
"| **🎯 Probe** | Labeling Efficiency, Probe Distance to Epitope | Optimize labeling strategies |\n",
"| **🧬 Defect** | Defect Fraction, Small Cluster, Large Cluster | Model realistic structural defects |\n",
"| **🧬 Structural Integrity** | Structural Integrity Fraction, Small Cluster, Large Cluster | Model realistic structural defects |\n",
"| **📦 Sample** | Random Orientations, Number of Particles | Control sample properties |\n",
"| **📸 Acquisition** | Exposure Time | Optimize imaging conditions |\n",
"\n",
Expand Down Expand Up @@ -428,7 +424,7 @@
"provenance": []
},
"kernelspec": {
"display_name": "vlab-dev",
"display_name": "vlab4mic-dev",
"language": "python",
"name": "python3"
},
Expand All @@ -442,7 +438,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.13"
"version": "3.11.14"
}
},
"nbformat": 4,
Expand Down
Loading