{ "cells": [ { "cell_type": "markdown", "id": "1f827cb6", "metadata": {}, "source": [ "# Constructing Simulation" ] }, { "cell_type": "markdown", "id": "437c82a7", "metadata": {}, "source": [ ":::{note}\n", "This tool extensively use NeuroH5 for simulation data structure. It is recommended to check this {ref}`discussion `.\n", ":::" ] }, { "cell_type": "markdown", "id": "1212d37b", "metadata": {}, "source": [ "```{mermaid}\n", "graph LR\n", "D(Design
Experiment) -->|yaml| C(Construct
Simulation) -->|h5| R(Run) -->|h5| P(Post Process)\n", "```" ] }, { "cell_type": "markdown", "id": "90d798a3", "metadata": {}, "source": [ "The experiment is designed within `YAML` configurations. To run the first example simulation, we provide the set of configuration files below:\n", "\n", "- [Repository](https://github.com/GazzolaLab/MiV-Simulator-Cases/tree/master/1-construction)\n", " 1. __config__: configuration YAML files to construct simulation\n", " 2. __templates__: collection of cell parameters (.hoc files)\n", " 3. __datasets__: directory to construct simulation in h5 format. It also contains (.swc) files.\n", "\n", "In the remaining, we demonstrate how to construct the simulation and how to run the simulation.\n", "\n", ":::{note}\n", "The detail description and configurability of each file is included [here](configuration_description.md).\n", ":::\n", "\n", ":::{note}\n", "Add the option `--use-hwthread-cpus` for `mpirun` to use thread-wise MPI instead of core.\n", ":::\n", "\n", ":::{note}\n", "Run each cells only once.\n", ":::" ] }, { "cell_type": "markdown", "id": "3afdd7c9", "metadata": {}, "source": [ "## Reset\n", "\n", "The configuration of the simuulation environment (soma coordinate, dendrite connection, cell parameters, etc.) are built in NeuroH5 format in `datasets` directory. To reset the configuration steps in this tutorial, simply remove all `*.h5` files inside the directory.\n", "\n", ":::{admonition} Click to toggle\n", ":class: dropdown\n", "```sh\n", "!rm -rf datasets/*.h5\n", "```\n", ":::" ] }, { "cell_type": "markdown", "id": "ee6b13bb", "metadata": {}, "source": [ "## Creating H5Types definitions" ] }, { "cell_type": "code", "execution_count": null, "id": "d7424be0", "metadata": {}, "outputs": [], "source": [ "import os\n", "import matplotlib.pyplot as plt\n", "\n", "datapath = \"datasets\"\n", "os.makedirs(datapath, exist_ok=True)" ] }, { "cell_type": "code", "execution_count": null, "id": "ececd0c3", "metadata": {}, "outputs": [], "source": [ "#!make-h5types --output-path datasets/MiV_Small_h5types.h5 # If config path is not specified, use default.\n", "!make-h5types --config-prefix config -c Microcircuit_Small.yaml --output-path datasets/MiV_Small_h5types.h5" ] }, { "cell_type": "markdown", "id": "f823fc14", "metadata": {}, "source": [ "You can use HDF5 utilities `h5ls` and `h5dump` to examine the contents of an HDF5 file as we build the case study.\n", "\n", "- h5ls: List each objects of an HDF5 file name and objects within the file. Apply method recursively with `-r` flag.\n", "- h5dump: Display h5 contents in dictionary format, in human readable form.\n", "\n", "For more detail, checkout [this page](https://www.asc.ohio-state.edu/wilkins.5/computing/HDF/hdf5tutorial/util.html)." ] }, { "cell_type": "code", "execution_count": null, "id": "4a4192d6", "metadata": {}, "outputs": [], "source": [ "!h5ls -r ./datasets/MiV_Small_h5types.h5" ] }, { "cell_type": "code", "execution_count": null, "id": "878ccfa1", "metadata": {}, "outputs": [], "source": [ "!h5dump -d /H5Types/Populations ./datasets/MiV_Small_h5types.h5" ] }, { "cell_type": "markdown", "id": "97ee4c78", "metadata": {}, "source": [ "## Copying and compiling NMODL mechanisms\n", "\n", ":::{note}\n", "`nrnivmodl` is a command to compile NEURON NMODL scripts. For more detail of NEURON NMODL, checkout [this page](http://web.mit.edu/neuron_v7.4/nrntuthtml/tutorial/tutD.html)\n", ":::" ] }, { "cell_type": "code", "execution_count": null, "id": "2efe5ef7", "metadata": {}, "outputs": [], "source": [ "!nrnivmodl mechanisms/* ." ] }, { "cell_type": "markdown", "id": "ac3f74f5", "metadata": {}, "source": [ "## Generating soma coordinates and measuring distances\n", "\n", "Here, we create `Microcircuit_Small_coords.h5` file that stores soma coordinate information. To see the contents in the file, try to use `h5dump`/`h5ls` like above." ] }, { "cell_type": "code", "execution_count": null, "id": "06269de8", "metadata": {}, "outputs": [], "source": [ "!generate-soma-coordinates -v \\\n", " --config=Microcircuit_Small.yaml \\\n", " --config-prefix=config \\\n", " --types-path=datasets/MiV_Small_h5types.h5 \\\n", " --output-path=datasets/Microcircuit_Small_coords.h5 \\\n", " --output-namespace='Generated Coordinates'" ] }, { "cell_type": "markdown", "id": "a42080fb", "metadata": {}, "source": [ "The tool `generate-soma-coordinates` generate and store soma location for each population. If you check the `h5` file, you should see new datasets `/Populations/PYR/Generated Coordinates/X Coordinate` etc. For more detail, you can checkout [this](miv_simulator.simulator.generate_soma_coordinates)." ] }, { "cell_type": "code", "execution_count": null, "id": "a3c2d784", "metadata": {}, "outputs": [], "source": [ "!mpirun -np 1 measure-distances -v \\\n", " -i PYR -i PVBC -i OLM -i STIM \\\n", " --config=Microcircuit_Small.yaml \\\n", " --config-prefix=config \\\n", " --coords-path=datasets/Microcircuit_Small_coords.h5" ] }, { "cell_type": "markdown", "id": "a1babea6", "metadata": {}, "source": [ "The tool `measure-distances` computes arc distances of soma, and store in the field `Arc Distances`. You should see the data now contains the group `/Populations/PYR/Arc Distance`." ] }, { "cell_type": "markdown", "id": "07adc01a", "metadata": {}, "source": [ "### Visualize (Soma Location)" ] }, { "cell_type": "code", "execution_count": null, "id": "64796249", "metadata": {}, "outputs": [], "source": [ "from miv_simulator import plotting as plot\n", "from miv_simulator import utils\n", "import matplotlib.pyplot as plt\n", "\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": null, "id": "fbda4aaf", "metadata": {}, "outputs": [], "source": [ "utils.config_logging(True)\n", "fig = plot.plot_coords_in_volume(\n", " populations=(\"PYR\", \"PVBC\", \"OLM\"),\n", " coords_path=\"datasets/Microcircuit_Small_coords.h5\",\n", " config=\"config/Microcircuit_Small.yaml\",\n", " coords_namespace=\"Generated Coordinates\",\n", " scale=25.0,\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "33258c6d", "metadata": {}, "outputs": [], "source": [ "utils.config_logging(True)\n", "fig = plot.plot_coords_in_volume(\n", " populations=(\"STIM\",),\n", " coords_path=\"datasets/Microcircuit_Small_coords.h5\",\n", " config=\"config/Microcircuit_Small.yaml\",\n", " coords_namespace=\"Generated Coordinates\",\n", " scale=25.0,\n", ")" ] }, { "cell_type": "markdown", "id": "bec5dd17", "metadata": {}, "source": [ "## Creating dendritic trees in NeuroH5 format\n", "\n", "`*.swc` file contains 3D point structure of the cell model. The tree model `*_tree.h5` can be created using `neurotree_import` feature from `neuroh5`." ] }, { "cell_type": "code", "execution_count": null, "id": "fd4eaca8", "metadata": {}, "outputs": [], "source": [ "!neurotrees_import PVBC datasets/PVBC_tree.h5 morphology/PVBC.swc\n", "!neurotrees_import PYR datasets/PYR_tree.h5 morphology/PYR.swc\n", "!neurotrees_import OLM datasets/OLM_tree.h5 morphology/OLM.swc\n", "\n", "!h5copy -p -s '/H5Types' -d '/H5Types' -i datasets/MiV_Small_h5types.h5 -o datasets/PVBC_tree.h5\n", "!h5copy -p -s '/H5Types' -d '/H5Types' -i datasets/MiV_Small_h5types.h5 -o datasets/PYR_tree.h5\n", "!h5copy -p -s '/H5Types' -d '/H5Types' -i datasets/MiV_Small_h5types.h5 -o datasets/OLM_tree.h5" ] }, { "cell_type": "markdown", "id": "bd6323d7", "metadata": {}, "source": [ "## Distributing synapses along dendritic trees\n", "\n", ":::{note}\n", "`neurotrees_copy` is a CLI command for NeuroH5.\n", ":::" ] }, { "cell_type": "code", "execution_count": null, "id": "078ad103", "metadata": {}, "outputs": [], "source": [ "!neurotrees_copy --fill --output datasets/PYR_forest_Small.h5 datasets/PYR_tree.h5 PYR 10\n", "!neurotrees_copy --fill --output datasets/PVBC_forest_Small.h5 datasets/PVBC_tree.h5 PVBC 90\n", "!neurotrees_copy --fill --output datasets/OLM_forest_Small.h5 datasets/OLM_tree.h5 OLM 143" ] }, { "cell_type": "code", "execution_count": null, "id": "c477bdf5", "metadata": {}, "outputs": [], "source": [ "!mpirun -np 1 distribute-synapse-locs \\\n", " --template-path templates \\\n", " --config=Microcircuit_Small.yaml \\\n", " --config-prefix=config \\\n", " --populations PYR \\\n", " --forest-path=./datasets/PYR_forest_Small.h5 \\\n", " --output-path=./datasets/PYR_forest_Small.h5 \\\n", " --distribution=poisson \\\n", " --io-size=1 --write-size=0 -v" ] }, { "cell_type": "code", "execution_count": null, "id": "a64e9a6a", "metadata": {}, "outputs": [], "source": [ "!mpirun -np 1 distribute-synapse-locs \\\n", " --template-path templates \\\n", " --config=Microcircuit_Small.yaml \\\n", " --config-prefix=config \\\n", " --populations PVBC \\\n", " --forest-path=./datasets/PVBC_forest_Small.h5 \\\n", " --output-path=./datasets/PVBC_forest_Small.h5 \\\n", " --distribution=poisson \\\n", " --io-size=1 --write-size=0 -v" ] }, { "cell_type": "code", "execution_count": null, "id": "ccd8a52e", "metadata": {}, "outputs": [], "source": [ "!mpirun -np 1 distribute-synapse-locs \\\n", " --template-path templates \\\n", " --config=Microcircuit_Small.yaml \\\n", " --config-prefix=config \\\n", " --populations OLM \\\n", " --forest-path=./datasets/OLM_forest_Small.h5 \\\n", " --output-path=./datasets/OLM_forest_Small.h5 \\\n", " --distribution=poisson \\\n", " --io-size=1 --write-size=0 -v" ] }, { "cell_type": "markdown", "id": "a8afaec3", "metadata": {}, "source": [ "## Generating connections\n", "\n", "Here, we generate distance connection network and store it in `Microcircuit_Small_connections.h5` file.\n", "\n", "> The schematic of the data structure can be found {ref}`here `." ] }, { "cell_type": "code", "execution_count": null, "id": "1afdccfe", "metadata": {}, "outputs": [], "source": [ "!mpirun -np 4 generate-distance-connections \\\n", " --config=Microcircuit_Small.yaml \\\n", " --config-prefix=config \\\n", " --forest-path=datasets/PYR_forest_Small.h5 \\\n", " --connectivity-path=datasets/Microcircuit_Small_connections.h5 \\\n", " --connectivity-namespace=Connections \\\n", " --coords-path=datasets/Microcircuit_Small_coords.h5 \\\n", " --coords-namespace='Generated Coordinates' \\\n", " --io-size=1 --cache-size=20 --write-size=100 -v" ] }, { "cell_type": "code", "execution_count": null, "id": "127356cb", "metadata": {}, "outputs": [], "source": [ "!mpirun -np 4 generate-distance-connections \\\n", " --config=Microcircuit_Small.yaml \\\n", " --config-prefix=config \\\n", " --forest-path=datasets/PVBC_forest_Small.h5 \\\n", " --connectivity-path=datasets/Microcircuit_Small_connections.h5 \\\n", " --connectivity-namespace=Connections \\\n", " --coords-path=datasets/Microcircuit_Small_coords.h5 \\\n", " --coords-namespace='Generated Coordinates' \\\n", " --io-size=1 --cache-size=20 --write-size=100 -v" ] }, { "cell_type": "code", "execution_count": null, "id": "e0aea05b", "metadata": {}, "outputs": [], "source": [ "!mpirun -np 4 generate-distance-connections \\\n", " --config=Microcircuit_Small.yaml \\\n", " --config-prefix=config \\\n", " --forest-path=datasets/OLM_forest_Small.h5 \\\n", " --connectivity-path=datasets/Microcircuit_Small_connections.h5 \\\n", " --connectivity-namespace=Connections \\\n", " --coords-path=datasets/Microcircuit_Small_coords.h5 \\\n", " --coords-namespace='Generated Coordinates' \\\n", " --io-size=1 --cache-size=20 --write-size=100 -v" ] }, { "cell_type": "markdown", "id": "c1615bb8", "metadata": {}, "source": [ "## Creating input features and spike trains" ] }, { "cell_type": "code", "execution_count": null, "id": "2ec4cad0", "metadata": {}, "outputs": [], "source": [ "!mpirun -np 1 generate-input-features \\\n", " -p STIM \\\n", " --config=Microcircuit_Small.yaml \\\n", " --config-prefix=config \\\n", " --coords-path=datasets/Microcircuit_Small_coords.h5 \\\n", " --output-path=datasets/Microcircuit_Small_input_features.h5 \\\n", " -v" ] }, { "cell_type": "code", "execution_count": null, "id": "da74f76b", "metadata": {}, "outputs": [], "source": [ "!mpirun -np 2 generate-input-spike-trains \\\n", " --config=Microcircuit_Small.yaml \\\n", " --config-prefix=config \\\n", " --selectivity-path=datasets/Microcircuit_Small_input_features.h5 \\\n", " --output-path=datasets/Microcircuit_Small_input_spikes.h5 \\\n", " --n-trials=3 -p STIM -v" ] }, { "cell_type": "markdown", "id": "c21b31d2", "metadata": {}, "source": [ "# Finalizing\n", "\n", "In the following steps, we collapse all H5 files into two files: __cell__ configuration, and __connectivity__ configuration. The simulator takes these two files to run the experiment.\n", "\n", "## Define path and variable names" ] }, { "cell_type": "code", "execution_count": null, "id": "7911cc82", "metadata": {}, "outputs": [], "source": [ "import os, sys\n", "import h5py, pathlib\n", "\n", "\n", "def h5_copy_dataset(f_src, f_dst, dset_path):\n", " print(f\"Copying {dset_path} from {f_src} to {f_dst} ...\")\n", " target_path = str(pathlib.Path(dset_path).parent)\n", " f_src.copy(f_src[dset_path], f_dst[target_path])\n", "\n", "\n", "h5types_file = \"MiV_Small_h5types.h5\"\n", "\n", "MiV_populations = [\"PYR\", \"OLM\", \"PVBC\", \"STIM\"]\n", "MiV_IN_populations = [\"OLM\", \"PVBC\"]\n", "MiV_EXT_populations = [\"STIM\"]\n", "\n", "MiV_cells_file = \"MiV_Cells_Microcircuit_Small_20220410.h5\"\n", "MiV_connections_file = \"MiV_Connections_Microcircuit_Small_20220410.h5\"\n", "\n", "MiV_coordinate_file = \"Microcircuit_Small_coords.h5\"\n", "\n", "MiV_PYR_forest_file = \"PYR_forest_Small.h5\"\n", "MiV_PVBC_forest_file = \"PVBC_forest_Small.h5\"\n", "MiV_OLM_forest_file = \"OLM_forest_Small.h5\"\n", "\n", "MiV_PYR_forest_syns_file = \"PYR_forest_Small.h5\"\n", "MiV_PVBC_forest_syns_file = \"PVBC_forest_Small.h5\"\n", "MiV_OLM_forest_syns_file = \"OLM_forest_Small.h5\"\n", "\n", "MiV_PYR_connectivity_file = \"Microcircuit_Small_connections.h5\"\n", "MiV_PVBC_connectivity_file = \"Microcircuit_Small_connections.h5\"\n", "MiV_OLM_connectivity_file = \"Microcircuit_Small_connections.h5\"" ] }, { "cell_type": "code", "execution_count": null, "id": "b0728dfa", "metadata": {}, "outputs": [], "source": [ "connectivity_files = {\n", " \"PYR\": MiV_PYR_connectivity_file,\n", " \"PVBC\": MiV_PVBC_connectivity_file,\n", " \"OLM\": MiV_OLM_connectivity_file,\n", "}\n", "\n", "\n", "coordinate_files = {\n", " \"PYR\": MiV_coordinate_file,\n", " \"PVBC\": MiV_coordinate_file,\n", " \"OLM\": MiV_coordinate_file,\n", " \"STIM\": MiV_coordinate_file,\n", "}\n", "\n", "distances_ns = \"Arc Distances\"\n", "input_coordinate_ns = \"Generated Coordinates\"\n", "coordinate_ns = \"Coordinates\"\n", "coordinate_namespaces = {\n", " \"PYR\": input_coordinate_ns,\n", " \"OLM\": input_coordinate_ns,\n", " \"PVBC\": input_coordinate_ns,\n", " \"STIM\": input_coordinate_ns,\n", "}\n", "\n", "\n", "forest_files = {\n", " \"PYR\": MiV_PYR_forest_file,\n", " \"PVBC\": MiV_PVBC_forest_file,\n", " \"OLM\": MiV_OLM_forest_file,\n", "}\n", "\n", "forest_syns_files = {\n", " \"PYR\": MiV_PYR_forest_syns_file,\n", " \"PVBC\": MiV_PVBC_forest_syns_file,\n", " \"OLM\": MiV_OLM_forest_syns_file,\n", "}\n", "\n", "\n", "vecstim_file_dict = {\"A Diag\": \"Microcircuit_Small_input_spikes.h5\"}\n", "\n", "vecstim_dict = {\n", " f\"Input Spikes {stim_id}\": stim_file\n", " for stim_id, stim_file in vecstim_file_dict.items()\n", "}" ] }, { "cell_type": "markdown", "id": "efb355c8", "metadata": {}, "source": [ "## Collapse files" ] }, { "cell_type": "code", "execution_count": null, "id": "0d239fad", "metadata": {}, "outputs": [], "source": [ "%cd datasets" ] }, { "cell_type": "markdown", "id": "64d436fa", "metadata": {}, "source": [ "## Creates H5Types entries" ] }, { "cell_type": "code", "execution_count": null, "id": "c7502387", "metadata": {}, "outputs": [], "source": [ "with h5py.File(MiV_cells_file, \"w\") as f:\n", " input_file = h5py.File(h5types_file, \"r\")\n", " h5_copy_dataset(input_file, f, \"/H5Types\")\n", " input_file.close()" ] }, { "cell_type": "markdown", "id": "57adc005", "metadata": {}, "source": [ "## Creates coordinates entries" ] }, { "cell_type": "code", "execution_count": null, "id": "427d9c93", "metadata": {}, "outputs": [], "source": [ "with h5py.File(MiV_cells_file, \"a\") as f_dst:\n", "\n", " grp = f_dst.create_group(\"Populations\")\n", "\n", " for p in MiV_populations:\n", " grp.create_group(p)\n", "\n", " for p in MiV_populations:\n", " coords_file = coordinate_files[p]\n", " coords_ns = coordinate_namespaces[p]\n", " coords_dset_path = f\"/Populations/{p}/{coords_ns}\"\n", " coords_output_path = f\"/Populations/{p}/Coordinates\"\n", " distances_dset_path = f\"/Populations/{p}/Arc Distances\"\n", " with h5py.File(coords_file, \"r\") as f_src:\n", " h5_copy_dataset(f_src, f_dst, coords_dset_path)\n", " h5_copy_dataset(f_src, f_dst, distances_dset_path)" ] }, { "cell_type": "markdown", "id": "a24ce2d1", "metadata": {}, "source": [ "## Creates forest entries and synapse attributes" ] }, { "cell_type": "code", "execution_count": null, "id": "27865885", "metadata": {}, "outputs": [], "source": [ "for p in MiV_populations:\n", " if p in forest_files:\n", " forest_file = forest_files[p]\n", " forest_syns_file = forest_syns_files[p]\n", " forest_dset_path = f\"/Populations/{p}/Trees\"\n", " forest_syns_dset_path = f\"/Populations/{p}/Synapse Attributes\"\n", " cmd = (\n", " f\"h5copy -p -s '{forest_dset_path}' -d '{forest_dset_path}' \"\n", " f\"-i {forest_file} -o {MiV_cells_file}\"\n", " )\n", " print(cmd)\n", " os.system(cmd)\n", " cmd = (\n", " f\"h5copy -p -s '{forest_syns_dset_path}' -d '{forest_syns_dset_path}' \"\n", " f\"-i {forest_syns_file} -o {MiV_cells_file}\"\n", " )\n", " print(cmd)\n", " os.system(cmd)" ] }, { "cell_type": "markdown", "id": "d5b3aca4", "metadata": {}, "source": [ "## Creates vector stimulus entries" ] }, { "cell_type": "code", "execution_count": null, "id": "a996724b", "metadata": {}, "outputs": [], "source": [ "for (vecstim_ns, vecstim_file) in vecstim_dict.items():\n", " for p in MiV_EXT_populations:\n", " vecstim_dset_path = f\"/Populations/{p}/{vecstim_ns}\"\n", " cmd = (\n", " f\"h5copy -p -s '{vecstim_dset_path}' -d '{vecstim_dset_path}' \"\n", " f\"-i {vecstim_file} -o {MiV_cells_file}\"\n", " )\n", " print(cmd)\n", " os.system(cmd)" ] }, { "cell_type": "markdown", "id": "437b0540", "metadata": {}, "source": [ "## Copy coordinates for STIM cells" ] }, { "cell_type": "code", "execution_count": null, "id": "f591406c", "metadata": {}, "outputs": [], "source": [ "p = \"STIM\"\n", "cmd = f\"h5copy -p -s '/Populations/{p}/Generated Coordinates' -d '/Populations/{p}/Coordinates' -i {MiV_cells_file} -o {MiV_cells_file}\"\n", "print(cmd)\n", "os.system(cmd)" ] }, { "cell_type": "code", "execution_count": null, "id": "b8b91182", "metadata": {}, "outputs": [], "source": [ "with h5py.File(MiV_connections_file, \"w\") as f:\n", " input_file = h5py.File(h5types_file, \"r\")\n", " h5_copy_dataset(input_file, f, \"/H5Types\")\n", " input_file.close()" ] }, { "cell_type": "markdown", "id": "e20203f7", "metadata": {}, "source": [ "## Creates connectivity entries" ] }, { "cell_type": "code", "execution_count": null, "id": "fbf1fede", "metadata": {}, "outputs": [], "source": [ "for p in MiV_populations:\n", " if p in connectivity_files:\n", " connectivity_file = connectivity_files[p]\n", " projection_dset_path = f\"/Projections/{p}\"\n", " cmd = (\n", " f\"h5copy -p -s {projection_dset_path} -d {projection_dset_path} \"\n", " f\"-i {connectivity_file} -o {MiV_connections_file}\"\n", " )\n", " print(cmd)\n", " os.system(cmd)" ] }, { "cell_type": "code", "execution_count": null, "id": "df985729", "metadata": {}, "outputs": [], "source": [ "%cd .." ] }, { "cell_type": "markdown", "id": "7fa75efb", "metadata": {}, "source": [ "# Run Network" ] }, { "cell_type": "code", "execution_count": null, "id": "6266e0b8", "metadata": {}, "outputs": [], "source": [ "!mpirun -np 8 run-network \\\n", " --config-file=Microcircuit_Small.yaml \\\n", " --config-prefix=config \\\n", " --arena-id=A \\\n", " --stimulus-id=Diag \\\n", " --template-paths=templates \\\n", " --dataset-prefix=\"./datasets\" \\\n", " --results-path=results \\\n", " --io-size=1 \\\n", " --tstop=500 \\\n", " --v-init=-75 \\\n", " --results-write-time=60 \\\n", " --stimulus-onset=0.0 \\\n", " --max-walltime-hours=0.49 \\\n", " --dt 0.025 \\\n", " --verbose\n" ] } ], "metadata": { "celltoolbar": "Tags", "file_format": "mystnb", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.0" } }, "nbformat": 4, "nbformat_minor": 5 }