From 454cfe48d278ee571c02a695d885d90e610f3d46 Mon Sep 17 00:00:00 2001 From: Jim Schaff Date: Wed, 25 Mar 2026 17:05:14 -0400 Subject: [PATCH 01/10] Add vc.login()/vc.logout() and make api_client optional in all remote functions Simplifies the authentication flow so users no longer need to import login_interactive() from internal paths or thread api_client through every call. Breaking change: api_client moves from first positional arg to last optional kwarg in save_and_start, wait_for_simulation, export_n5, and run_remote. Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/getting-started/quickstart.md | 10 +- .../guides/notebooks/remote-simulations.ipynb | 117 +++--------------- docs/guides/remote-simulations.md | 44 +++---- pyvcell/vcml/__init__.py | 4 +- pyvcell/vcml/utils.py | 8 +- pyvcell/vcml/vcml_remote.py | 83 +++++++++++-- 6 files changed, 120 insertions(+), 146 deletions(-) diff --git a/docs/getting-started/quickstart.md b/docs/getting-started/quickstart.md index f9c6695..53df6b5 100644 --- a/docs/getting-started/quickstart.md +++ b/docs/getting-started/quickstart.md @@ -20,19 +20,17 @@ biomodel = vc.load_biomodel("279851639") To browse or search models by name, authenticate first: ```python -from pyvcell._internal.api.vcell_client.auth.auth_utils import login_interactive - -api_client = login_interactive() # opens a browser for login +vc.login() # opens a browser for login # List available models (public, shared, and your private models) -for m in vc.list_biomodels(api_client=api_client)[:2]: +for m in vc.list_biomodels()[:2]: print(m) # Load by name and owner -biomodel = vc.load_biomodel(name="Tutorial_MultiApp", owner="tutorial", api_client=api_client) +biomodel = vc.load_biomodel(name="Tutorial_MultiApp", owner="tutorial") # Load by database ID -biomodel = vc.load_biomodel("279851639", api_client=api_client) +biomodel = vc.load_biomodel("279851639") ``` Output: diff --git a/docs/guides/notebooks/remote-simulations.ipynb b/docs/guides/notebooks/remote-simulations.ipynb index db9e87b..a555dd0 100644 --- a/docs/guides/notebooks/remote-simulations.ipynb +++ b/docs/guides/notebooks/remote-simulations.ipynb @@ -28,13 +28,9 @@ "start_time": "2026-03-09T12:59:48.311989Z" } }, - "source": [ - "from pyvcell._internal.api.vcell_client.auth.auth_utils import login_interactive\n", - "\n", - "api_client = login_interactive()" - ], + "source": "import pyvcell.vcml as vc\n\nvc.login()", "outputs": [], - "execution_count": 1 + "execution_count": null }, { "cell_type": "markdown", @@ -51,25 +47,9 @@ "start_time": "2026-03-09T12:59:50.326519Z" } }, - "source": "import pyvcell.vcml as vc\n\nantimony_str = \"\"\"\n compartment ec = 1;\n compartment cell = 2;\n compartment pm = 1;\n species A in cell;\n species B in cell;\n J0: A -> B; cell * (k1*A - k2*B)\n J0 in cell;\n k1 = 5.0; k2 = 2.0\n A = 10\n\"\"\"\nbiomodel = vc.load_antimony_str(antimony_str)\nmodel = biomodel.model\nmodel.get_compartment(\"pm\").dim = 2\n\ngeo = vc.Geometry(name=\"geo\", origin=(0, 0, 0), extent=(10, 10, 10), dim=3)\ngeo.add_sphere(name=\"cell_domain\", radius=4, center=(5, 5, 5))\ngeo.add_background(name=\"ec_domain\")\ngeo.add_surface(name=\"pm_domain\", sub_volume_1=\"cell_domain\", sub_volume_2=\"ec_domain\")\n\napp = biomodel.add_application(\"app1\", geometry=geo)\napp.map_compartment(\"cell\", \"cell_domain\")\napp.map_compartment(\"ec\", \"ec_domain\")\napp.map_species(\"A\", init_conc=\"3+sin(x)\", diff_coef=1.0)\napp.map_species(\"B\", init_conc=\"2+cos(x+y+z)\", diff_coef=1.0)\n\nsim = app.add_sim(name=\"sim1\", duration=2.0, output_time_step=0.05, mesh_size=(50, 50, 50))", - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2026-03-09T12:59:51.082123Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", - "Please remove the `packages` attribute from your configuration file.\n", - "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2026-03-09 08:59:51,085 ERROR (SBMLDocument.java:573) - There was an error accessing the sbml online validator!\n", - "2026-03-09T12:59:51.090261Z main WARN The Logger cbit.vcell.model.Kinetics was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@67b1217b and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2026-03-09T12:59:51.093216Z main WARN The Logger cbit.vcell.mapping.AbstractMathMapping was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@67b1217b and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2026-03-09 08:59:51,093 INFO (DiffEquMathMapping.java:1457) - WARNING:::: MathMapping.refreshMathDescription() ... assigning boundary condition types not unique\n", - "2026-03-09 08:59:51,093 INFO (DiffEquMathMapping.java:1457) - WARNING:::: MathMapping.refreshMathDescription() ... assigning boundary condition types not unique\n", - "2026-03-09 08:59:51,094 INFO (Entrypoints.java:172) - Returning from sbmlToVcell: {\"success\":true,\"message\":\"Success\"}\n" - ] - } - ], - "execution_count": 2 + "source": "antimony_str = \"\"\"\n compartment ec = 1;\n compartment cell = 2;\n compartment pm = 1;\n species A in cell;\n species B in cell;\n J0: A -> B; cell * (k1*A - k2*B)\n J0 in cell;\n k1 = 5.0; k2 = 2.0\n A = 10\n\"\"\"\nbiomodel = vc.load_antimony_str(antimony_str)\nmodel = biomodel.model\nmodel.get_compartment(\"pm\").dim = 2\n\ngeo = vc.Geometry(name=\"geo\", origin=(0, 0, 0), extent=(10, 10, 10), dim=3)\ngeo.add_sphere(name=\"cell_domain\", radius=4, center=(5, 5, 5))\ngeo.add_background(name=\"ec_domain\")\ngeo.add_surface(name=\"pm_domain\", sub_volume_1=\"cell_domain\", sub_volume_2=\"ec_domain\")\n\napp = biomodel.add_application(\"app1\", geometry=geo)\napp.map_compartment(\"cell\", \"cell_domain\")\napp.map_compartment(\"ec\", \"ec_domain\")\napp.map_species(\"A\", init_conc=\"3+sin(x)\", diff_coef=1.0)\napp.map_species(\"B\", init_conc=\"2+cos(x+y+z)\", diff_coef=1.0)\n\nsim = app.add_sim(name=\"sim1\", duration=2.0, output_time_step=0.05, mesh_size=(50, 50, 50))", + "outputs": [], + "execution_count": null }, { "cell_type": "code", @@ -79,24 +59,9 @@ "start_time": "2026-03-09T12:59:51.154384Z" } }, - "source": "from datetime import datetime\nfrom pyvcell._internal.api.vcell_client.api.bio_model_resource_api import BioModelResourceApi\n\nvcml_str = vc.to_vcml_str(biomodel)\n\nbm_api = BioModelResourceApi(api_client)\nmodel_name = f\"MyRemoteModel_{datetime.now().strftime('%Y%m%d_%H%M%S')}\"\nsaved_vcml = bm_api.save_bio_model(body=vcml_str, new_name=model_name)\nprint(f\"Saved model as: {model_name}\")", - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2026-03-09T12:59:51.168514Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", - "Please remove the `packages` attribute from your configuration file.\n", - "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2026-03-09T12:59:51.171992Z main WARN The Logger cbit.vcell.model.Kinetics was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@3248a0bf and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2026-03-09T12:59:51.363477Z main WARN The Logger cbit.vcell.mapping.AbstractMathMapping was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@3248a0bf and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2026-03-09 08:59:51,364 INFO (DiffEquMathMapping.java:1457) - WARNING:::: MathMapping.refreshMathDescription() ... assigning boundary condition types not unique\n", - "2026-03-09 08:59:51,373 INFO (Entrypoints.java:200) - Returning from vcellToVcml: {\"success\":true,\"message\":\"Success\"}\n", - "Saved model as: MyRemoteModel_20260309_085951\n" - ] - } - ], - "execution_count": 3 + "source": "from datetime import datetime\nfrom pyvcell._internal.api.vcell_client.api.bio_model_resource_api import BioModelResourceApi\n\nvcml_str = vc.to_vcml_str(biomodel)\n\nbm_api = BioModelResourceApi()\nmodel_name = f\"MyRemoteModel_{datetime.now().strftime('%Y%m%d_%H%M%S')}\"\nsaved_vcml = bm_api.save_bio_model(body=vcml_str, new_name=model_name)\nprint(f\"Saved model as: {model_name}\")", + "outputs": [], + "execution_count": null }, { "cell_type": "code", @@ -133,17 +98,9 @@ "start_time": "2026-03-09T12:59:52.639633Z" } }, - "source": "from pyvcell._internal.api.vcell_client.api.simulation_resource_api import SimulationResourceApi\n\nsim_api = SimulationResourceApi(api_client)\nsim_api.start_simulation(sim_id=sim_key)\nprint(\"Simulation started\")", - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Simulation started\n" - ] - } - ], - "execution_count": 5 + "source": "from pyvcell._internal.api.vcell_client.api.simulation_resource_api import SimulationResourceApi\n\nsim_api = SimulationResourceApi()\nsim_api.start_simulation(sim_id=sim_key)\nprint(\"Simulation started\")", + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", @@ -214,17 +171,9 @@ "start_time": "2026-03-09T13:00:43.223492Z" } }, - "source": "from pyvcell._internal.api.vcell_client.api.export_resource_api import ExportResourceApi\nfrom pyvcell._internal.api.vcell_client.models.n5_export_request import N5ExportRequest\nfrom pyvcell._internal.api.vcell_client.models.standard_export_info import StandardExportInfo\nfrom pyvcell._internal.api.vcell_client.models.exportable_data_type import ExportableDataType\nfrom pyvcell._internal.api.vcell_client.models.variable_specs import VariableSpecs\nfrom pyvcell._internal.api.vcell_client.models.variable_mode import VariableMode\nfrom pyvcell._internal.api.vcell_client.models.time_specs import TimeSpecs\nfrom pyvcell._internal.api.vcell_client.models.time_mode import TimeMode\n\nexport_api = ExportResourceApi(api_client)\n\n# Compute time indices from simulation parameters\nnum_time_points = int(sim.duration / sim.output_time_step) + 1\nall_times = [i * sim.output_time_step for i in range(num_time_points)]\n\nrequest = N5ExportRequest(\n standard_export_information=StandardExportInfo(\n simulation_name=sim_name,\n simulation_key=sim_key,\n simulation_job=0,\n variable_specs=VariableSpecs(\n variable_names=[\"A\", \"B\"],\n mode=VariableMode.VARIABLE_MULTI,\n ),\n time_specs=TimeSpecs(\n begin_time_index=0,\n end_time_index=num_time_points - 1,\n all_times=all_times,\n mode=TimeMode.TIME_RANGE,\n ),\n ),\n exportable_data_type=ExportableDataType.PDE_VARIABLE_DATA,\n dataset_name=\"my_results\",\n)\n\njob_id = export_api.export_n5(n5_export_request=request)\nprint(f\"Export job started: {job_id}\")", - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Export job started: 4919316062\n" - ] - } - ], - "execution_count": 7 + "source": "from pyvcell._internal.api.vcell_client.api.export_resource_api import ExportResourceApi\nfrom pyvcell._internal.api.vcell_client.models.n5_export_request import N5ExportRequest\nfrom pyvcell._internal.api.vcell_client.models.standard_export_info import StandardExportInfo\nfrom pyvcell._internal.api.vcell_client.models.exportable_data_type import ExportableDataType\nfrom pyvcell._internal.api.vcell_client.models.variable_specs import VariableSpecs\nfrom pyvcell._internal.api.vcell_client.models.variable_mode import VariableMode\nfrom pyvcell._internal.api.vcell_client.models.time_specs import TimeSpecs\nfrom pyvcell._internal.api.vcell_client.models.time_mode import TimeMode\n\nexport_api = ExportResourceApi()\n\n# Compute time indices from simulation parameters\nnum_time_points = int(sim.duration / sim.output_time_step) + 1\nall_times = [i * sim.output_time_step for i in range(num_time_points)]\n\nrequest = N5ExportRequest(\n standard_export_information=StandardExportInfo(\n simulation_name=sim_name,\n simulation_key=sim_key,\n simulation_job=0,\n variable_specs=VariableSpecs(\n variable_names=[\"A\", \"B\"],\n mode=VariableMode.VARIABLE_MULTI,\n ),\n time_specs=TimeSpecs(\n begin_time_index=0,\n end_time_index=num_time_points - 1,\n all_times=all_times,\n mode=TimeMode.TIME_RANGE,\n ),\n ),\n exportable_data_type=ExportableDataType.PDE_VARIABLE_DATA,\n dataset_name=\"my_results\",\n)\n\njob_id = export_api.export_n5(n5_export_request=request)\nprint(f\"Export job started: {job_id}\")", + "outputs": [], + "execution_count": null }, { "cell_type": "code", @@ -289,7 +238,7 @@ }, { "cell_type": "markdown", - "source": "## Convenience API\n\nThe steps above (save, start, monitor, export, open TensorStore) can be replaced with a few convenience functions from `pyvcell.vcml`:\n\n```python\n# One-liner: save, run, export, and open TensorStore\nstore = vc.run_remote(api_client, biomodel, \"sim1\")\n\n# Or composable:\nsaved_bm, saved_sim = vc.save_and_start(api_client, biomodel, \"sim1\")\nvc.wait_for_simulation(api_client, saved_bm, saved_sim)\nstore = vc.export_n5(api_client, saved_sim, biomodel=saved_bm)\n```", + "source": "## Convenience API\n\nThe steps above (save, start, monitor, export, open TensorStore) can be replaced with a few convenience functions from `pyvcell.vcml`:\n\n```python\n# One-liner: save, run, export, and open TensorStore\nstore = vc.run_remote(biomodel, \"sim1\")\n\n# Or composable:\nsaved_bm, saved_sim = vc.save_and_start(biomodel, \"sim1\")\nvc.wait_for_simulation(saved_bm, saved_sim)\nstore = vc.export_n5(saved_sim, biomodel=saved_bm)\n```", "metadata": {} }, { @@ -300,39 +249,9 @@ } }, "cell_type": "code", - "source": "# One-liner: save, run, export, and open TensorStore\nmodel_name = f\"MyRemoteModel_{datetime.now().strftime('%Y%m%d_%H%M%S')}\"\nstore = vc.run_remote(api_client, biomodel, \"sim1\", model_name=model_name, on_progress=print)\nprint(f\"Shape: {store.shape}, Dtype: {store.dtype}\")", - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "2026-03-09T13:17:59.738617Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", - "Please remove the `packages` attribute from your configuration file.\n", - "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2026-03-09T13:17:59.742812Z main WARN The Logger cbit.vcell.model.Kinetics was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@ae32def and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2026-03-09T13:17:59.931398Z main WARN The Logger cbit.vcell.mapping.AbstractMathMapping was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@ae32def and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2026-03-09 09:17:59,932 INFO (DiffEquMathMapping.java:1457) - WARNING:::: MathMapping.refreshMathDescription() ... assigning boundary condition types not unique\n", - "2026-03-09 09:17:59,941 INFO (Entrypoints.java:200) - Returning from vcellToVcml: {\"success\":true,\"message\":\"Success\"}\n", - "Saving biomodel to server...\n", - "Starting simulation...\n", - "Status: Status.WAITING, Details: waiting to be dispatched\n", - "Status: Status.RUNNING, Details: running...\n", - "Status: Status.RUNNING, Details: initializing mesh\n", - "Status: Status.RUNNING, Details: simulation [SimID_306603569_0_] started\n", - "Status: Status.RUNNING, Details: simulation [SimID_306603569_0_] started\n", - "Status: Status.RUNNING, Details: simulation [SimID_306603569_0_] started\n", - "Status: Status.RUNNING, Details: 1.35\n", - "Status: Status.RUNNING, Details: 1.35\n", - "Status: Status.RUNNING, Details: 1.35\n", - "Status: Status.COMPLETED, Details: completed\n", - "Starting N5 export...\n", - "Export job started: 4957758156\n", - "Export complete: https://vcell.cam.uchc.edu/n5Data/schaff/98e993615baa16f.n5?dataSetName=4957758156\n", - "Shape: (98, 98, 3, 98, 41), Dtype: dtype(\"float64\")\n" - ] - } - ], - "execution_count": 11 + "source": "# One-liner: save, run, export, and open TensorStore\nmodel_name = f\"MyRemoteModel_{datetime.now().strftime('%Y%m%d_%H%M%S')}\"\nstore = vc.run_remote(biomodel, \"sim1\", model_name=model_name, on_progress=print)\nprint(f\"Shape: {store.shape}, Dtype: {store.dtype}\")", + "outputs": [], + "execution_count": null } ], "metadata": { diff --git a/docs/guides/remote-simulations.md b/docs/guides/remote-simulations.md index 1fea00b..ca6e65f 100644 --- a/docs/guides/remote-simulations.md +++ b/docs/guides/remote-simulations.md @@ -13,23 +13,15 @@ This guide requires a VCell account and access to the VCell server. Code example ## Authenticate -Use `login_interactive()` to authenticate via OAuth2. This opens your browser for login and returns an authenticated API client: +Use `vc.login()` to authenticate via OAuth2. This opens your browser for login and caches the authenticated client for all subsequent remote calls: ```python -from pyvcell._internal.api.vcell_client.auth.auth_utils import login_interactive +import pyvcell.vcml as vc -api_client = login_interactive() +vc.login() ``` -The defaults connect to the production VCell server (`https://vcell.cam.uchc.edu`). Only change them if you know what you are doing: - -```python -api_client = login_interactive( - api_base_url="https://vcell.cam.uchc.edu", - client_id="cjoWhd7W8A8znf7Z7vizyvKJCiqTgRtf", - issuer_url="https://dev-dzhx7i2db3x3kkvq.us.auth0.com", -) -``` +To clear the cached client, call `vc.logout()`. ## Save model to VCell server @@ -68,10 +60,10 @@ app.map_species("B", init_conc="2+cos(x+y+z)", diff_coef=1.0) sim = app.add_sim(name="sim1", duration=2.0, output_time_step=0.05, mesh_size=(50, 50, 50)) -# Serialize and save to server +# Serialize and save to server (vc.login() must have been called) vcml_str = vc.to_vcml_str(biomodel) -bm_api = BioModelResourceApi(api_client) +bm_api = BioModelResourceApi() # uses the client cached by vc.login() saved_vcml = bm_api.save_bio_model(body=vcml_str, new_name="MyRemoteModel") ``` @@ -92,7 +84,7 @@ Use `SimulationResourceApi` to start the simulation on the server: ```python from pyvcell._internal.api.vcell_client.api.simulation_resource_api import SimulationResourceApi -sim_api = SimulationResourceApi(api_client) +sim_api = SimulationResourceApi() # uses the client cached by vc.login() status_messages = sim_api.start_simulation(sim_id=sim_key) print(status_messages) ``` @@ -140,7 +132,7 @@ from pyvcell._internal.api.vcell_client.models.variable_mode import VariableMode from pyvcell._internal.api.vcell_client.models.time_specs import TimeSpecs from pyvcell._internal.api.vcell_client.models.time_mode import TimeMode -export_api = ExportResourceApi(api_client) +export_api = ExportResourceApi() # uses the client cached by vc.login() # Compute time indices from simulation parameters num_time_points = int(sim.duration / sim.output_time_step) + 1 @@ -235,7 +227,6 @@ from urllib.parse import urlparse, parse_qs import tensorstore as ts import pyvcell.vcml as vc -from pyvcell._internal.api.vcell_client.auth.auth_utils import login_interactive from pyvcell._internal.api.vcell_client.api.bio_model_resource_api import BioModelResourceApi from pyvcell._internal.api.vcell_client.api.simulation_resource_api import SimulationResourceApi from pyvcell._internal.api.vcell_client.api.export_resource_api import ExportResourceApi @@ -248,7 +239,7 @@ from pyvcell._internal.api.vcell_client.models.time_specs import TimeSpecs from pyvcell._internal.api.vcell_client.models.time_mode import TimeMode # 1. Authenticate -api_client = login_interactive() +vc.login() # 2. Build model locally antimony_str = """ @@ -280,7 +271,7 @@ sim = app.add_sim(name="sim1", duration=2.0, output_time_step=0.05, mesh_size=(5 # 3. Save to server vcml_str = vc.to_vcml_str(biomodel) -bm_api = BioModelResourceApi(api_client) +bm_api = BioModelResourceApi() model_name = f"MyRemoteModel_{datetime.now().strftime('%Y%m%d_%H%M%S')}" saved_vcml = bm_api.save_bio_model(body=vcml_str, new_name=model_name) @@ -291,7 +282,7 @@ sim_key = saved_app.simulations[0].version.key sim_name = saved_app.simulations[0].name # 4. Start simulation -sim_api = SimulationResourceApi(api_client) +sim_api = SimulationResourceApi() sim_api.start_simulation(sim_id=sim_key) # 5. Monitor progress @@ -306,7 +297,7 @@ if status_record.status != "COMPLETED": raise RuntimeError(f"Simulation ended with status: {status_record.status}") # 6. Export results -export_api = ExportResourceApi(api_client) +export_api = ExportResourceApi() # uses the client cached by vc.login() num_time_points = int(sim.duration / sim.output_time_step) + 1 all_times = [i * sim.output_time_step for i in range(num_time_points)] request = N5ExportRequest( @@ -371,23 +362,22 @@ The `pyvcell.vcml` module provides high-level functions that wrap the steps abov ```python import pyvcell.vcml as vc -from pyvcell._internal.api.vcell_client.auth.auth_utils import login_interactive -api_client = login_interactive() +vc.login() # ... build biomodel and sim as above ... # One call does everything: save, run, export, and open TensorStore -store = vc.run_remote(api_client, biomodel, "sim1") +store = vc.run_remote(biomodel, "sim1") data = store[:, :, 0, 0, 0].read().result() ``` Or use the composable functions for more control: ```python -saved_bm, saved_sim = vc.save_and_start(api_client, biomodel, "sim1") -vc.wait_for_simulation(api_client, saved_bm, saved_sim) -store = vc.export_n5(api_client, saved_sim, biomodel=saved_bm) +saved_bm, saved_sim = vc.save_and_start(biomodel, "sim1") +vc.wait_for_simulation(saved_bm, saved_sim) +store = vc.export_n5(saved_sim, biomodel=saved_bm) ``` | Function | Purpose | Returns | diff --git a/pyvcell/vcml/__init__.py b/pyvcell/vcml/__init__.py index 793dd78..53433f5 100644 --- a/pyvcell/vcml/__init__.py +++ b/pyvcell/vcml/__init__.py @@ -47,7 +47,7 @@ write_vcml_file, ) from pyvcell.vcml.vcml_reader import VcmlReader -from pyvcell.vcml.vcml_remote import export_n5, run_remote, save_and_start, wait_for_simulation +from pyvcell.vcml.vcml_remote import export_n5, login, logout, run_remote, save_and_start, wait_for_simulation from pyvcell.vcml.vcml_simulation import simulate from pyvcell.vcml.vcml_writer import VcmlWriter from pyvcell.vcml.workspace import get_workspace_dir, set_workspace_dir @@ -99,6 +99,8 @@ "save_and_start", "wait_for_simulation", "export_n5", + "login", + "logout", "Field", "list_biomodels", "load_biomodel", diff --git a/pyvcell/vcml/utils.py b/pyvcell/vcml/utils.py index 958bca2..b1bee08 100644 --- a/pyvcell/vcml/utils.py +++ b/pyvcell/vcml/utils.py @@ -219,7 +219,9 @@ def list_biomodels(api_client: ApiClient | None = None) -> list[dict[str, str | from pyvcell._internal.api.vcell_client.configuration import Configuration if api_client is None: - api_client = ApiClient(configuration=Configuration()) + from pyvcell.vcml.vcml_remote import _cached_api_client + + api_client = _cached_api_client if _cached_api_client is not None else ApiClient(configuration=Configuration()) host = api_client.configuration.host headers: dict[str, str] = {"Accept": "application/json"} @@ -290,7 +292,9 @@ def load_biomodel( raise ValueError("Provide either biomodel_id or name, not both") if api_client is None: - api_client = ApiClient(configuration=Configuration()) + from pyvcell.vcml.vcml_remote import _cached_api_client + + api_client = _cached_api_client if _cached_api_client is not None else ApiClient(configuration=Configuration()) bm_api = BioModelResourceApi(api_client) diff --git a/pyvcell/vcml/vcml_remote.py b/pyvcell/vcml/vcml_remote.py index 24f71a2..cdb4b77 100644 --- a/pyvcell/vcml/vcml_remote.py +++ b/pyvcell/vcml/vcml_remote.py @@ -24,6 +24,58 @@ _TERMINAL_STATUSES = {Status.COMPLETED, Status.FAILED, Status.STOPPED} +_cached_api_client: ApiClient | None = None + + +def _resolve_api_client(api_client: ApiClient | None) -> ApiClient: + """Return the given client, or fall back to the cached client from login().""" + if api_client is not None: + return api_client + if _cached_api_client is not None: + return _cached_api_client + raise RuntimeError("No API client provided and not logged in. Call vc.login() first or pass api_client explicitly.") + + +def login( + api_base_url: str = "https://vcell.cam.uchc.edu", + client_id: str = "cjoWhd7W8A8znf7Z7vizyvKJCiqTgRtf", + issuer_url: str = "https://dev-dzhx7i2db3x3kkvq.us.auth0.com", + insecure: bool = False, +) -> None: + """Authenticate with the VCell server via interactive browser login. + + Opens a browser window for OAuth2 login. On success, caches the + authenticated client for use by all remote functions. + + Args: + api_base_url: VCell server URL. + client_id: OAuth2 client ID. + issuer_url: OAuth2 issuer URL. + insecure: Disable SSL verification. + """ + global _cached_api_client + from pyvcell._internal.api.vcell_client.auth.auth_utils import login_interactive + + client = login_interactive( + api_base_url=api_base_url, + client_id=client_id, + issuer_url=issuer_url, + insecure=insecure, + ) + _cached_api_client = client + ApiClient.set_default(client) # type: ignore[no-untyped-call] + + +def logout() -> None: + """Clear the cached API client. + + After calling this, remote functions will require an explicit + ``api_client`` argument until :func:`login` is called again. + """ + global _cached_api_client + _cached_api_client = None + ApiClient.set_default(None) # type: ignore[no-untyped-call] + def _find_simulation(biomodel: Biomodel, sim_name: str) -> tuple[Application, Simulation]: """Find a simulation by name across all applications.""" @@ -54,24 +106,25 @@ def _open_n5_from_export_url(url: str) -> TensorStore: def save_and_start( - api_client: ApiClient, biomodel: Biomodel, simulation: Simulation | str, model_name: str | None = None, on_progress: Callable[[str], None] | None = None, + api_client: ApiClient | None = None, ) -> tuple[Biomodel, Simulation]: """Save a biomodel to the VCell server and start a simulation. Args: - api_client: Authenticated API client from ``login_interactive()``. biomodel: The biomodel to save. simulation: Simulation object or name string identifying the simulation to start. model_name: Name for the saved model on the server. Defaults to ``biomodel.name``. on_progress: Optional callback for status messages. + api_client: Authenticated API client. If ``None``, uses the client cached by :func:`login`. Returns: A tuple of (saved_biomodel, saved_simulation) with server-assigned version keys. """ + api_client = _resolve_api_client(api_client) sim_name = simulation if isinstance(simulation, str) else simulation.name # Serialize and save @@ -99,27 +152,28 @@ def save_and_start( def wait_for_simulation( - api_client: ApiClient, biomodel: Biomodel, simulation: Simulation, poll_interval: float = 5.0, timeout: float | None = None, on_progress: Callable[[str], None] | None = None, + api_client: ApiClient | None = None, ) -> None: """Poll simulation status until it reaches a terminal state. Args: - api_client: Authenticated API client. biomodel: Saved biomodel (must have ``version.key``). simulation: Saved simulation (must have ``version.key``). poll_interval: Seconds between status polls. timeout: Maximum seconds to wait. ``None`` means wait indefinitely. on_progress: Optional callback receiving status strings. + api_client: Authenticated API client. If ``None``, uses the client cached by :func:`login`. Raises: RuntimeError: If the simulation fails, is stopped, or times out. ValueError: If the biomodel or simulation is missing version keys. """ + api_client = _resolve_api_client(api_client) if biomodel.version is None or biomodel.version.key is None: raise ValueError("biomodel must have a version key (save it to the server first)") if simulation.version is None or simulation.version.key is None: @@ -149,7 +203,6 @@ def wait_for_simulation( def export_n5( - api_client: ApiClient, simulation: Simulation, biomodel: Biomodel | None = None, variable_names: list[str] | None = None, @@ -157,11 +210,11 @@ def export_n5( poll_interval: float = 5.0, timeout: float | None = None, on_progress: Callable[[str], None] | None = None, + api_client: ApiClient | None = None, ) -> TensorStore: """Export simulation results as N5 and open as a TensorStore. Args: - api_client: Authenticated API client. simulation: Saved simulation (must have ``version.key``). biomodel: Saved biomodel. Required when ``variable_names`` is ``None`` so that species names can be derived from the application. @@ -171,6 +224,7 @@ def export_n5( poll_interval: Seconds between export status polls. timeout: Maximum seconds to wait for the export. ``None`` means wait indefinitely. on_progress: Optional callback receiving status strings. + api_client: Authenticated API client. If ``None``, uses the client cached by :func:`login`. Returns: A TensorStore pointing to the exported N5 data. @@ -180,6 +234,7 @@ def export_n5( ``variable_names`` is ``None`` and ``biomodel`` is not provided. RuntimeError: If the export fails or times out. """ + api_client = _resolve_api_client(api_client) if simulation.version is None or simulation.version.key is None: raise ValueError("simulation must have a version key (save and run it first)") @@ -246,7 +301,6 @@ def export_n5( def run_remote( - api_client: ApiClient, biomodel: Biomodel, simulation: Simulation | str, model_name: str | None = None, @@ -255,6 +309,7 @@ def run_remote( poll_interval: float = 5.0, timeout: float | None = None, on_progress: Callable[[str], None] | None = None, + api_client: ApiClient | None = None, ) -> TensorStore: """Save, run, and export a simulation in one call. @@ -262,7 +317,6 @@ def run_remote( :func:`export_n5` into a single convenience function. Args: - api_client: Authenticated API client from ``login_interactive()``. biomodel: The biomodel to save and simulate. simulation: Simulation object or name string. model_name: Name for the saved model on the server. @@ -271,18 +325,24 @@ def run_remote( poll_interval: Seconds between status polls. timeout: Maximum seconds to wait for each phase (simulation and export). on_progress: Optional callback receiving status strings. + api_client: Authenticated API client. If ``None``, uses the client cached by :func:`login`. Returns: A TensorStore pointing to the exported N5 results. """ + api_client = _resolve_api_client(api_client) saved_bm, saved_sim = save_and_start( - api_client, biomodel, simulation, model_name=model_name, on_progress=on_progress + biomodel, simulation, model_name=model_name, on_progress=on_progress, api_client=api_client ) wait_for_simulation( - api_client, saved_bm, saved_sim, poll_interval=poll_interval, timeout=timeout, on_progress=on_progress + saved_bm, + saved_sim, + poll_interval=poll_interval, + timeout=timeout, + on_progress=on_progress, + api_client=api_client, ) return export_n5( - api_client, saved_sim, biomodel=saved_bm, variable_names=variable_names, @@ -290,4 +350,5 @@ def run_remote( poll_interval=poll_interval, timeout=timeout, on_progress=on_progress, + api_client=api_client, ) From 6c551f24961c975f1cfb018fc65b2f02af305442 Mon Sep 17 00:00:00 2001 From: Jim Schaff Date: Fri, 27 Mar 2026 16:58:51 -0400 Subject: [PATCH 02/10] Add VCellSession, SimulationJob, and vc.connect() as single entry point Introduces session-based API for all remote operations: - vc.connect() for anonymous access, vc.connect(login=True) for auth - VCellSession with run_sim(), start_sim(), save_biomodel(), load_biomodel(), list_biomodels() - SimulationJob with status, wait(), export(), result() for non-blocking simulation control - Remove module-level remote functions (run_remote, save_and_start, etc.) and load_biomodel/list_biomodels from top-level vc.* API - Add integration tests with --run-remote flag for authenticated tests - Rewrite remote-simulations guide and notebook around session API Co-Authored-By: Claude Opus 4.6 (1M context) --- CLAUDE.md | 14 +- docs/getting-started/quickstart.md | 20 +- .../guides/notebooks/remote-simulations.ipynb | 168 +-------- docs/guides/remote-simulations.md | 330 ++++-------------- pyvcell/vcml/__init__.py | 15 +- pyvcell/vcml/session.py | 307 ++++++++++++++++ pyvcell/vcml/vcml_remote.py | 60 ++-- tests/conftest.py | 6 + tests/vcml/test_load_biomodel.py | 15 +- tests/vcml/test_remote_integration.py | 165 +++++++++ 10 files changed, 630 insertions(+), 470 deletions(-) create mode 100644 pyvcell/vcml/session.py create mode 100644 tests/vcml/test_remote_integration.py diff --git a/CLAUDE.md b/CLAUDE.md index 829bcc7..4cc285c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -28,6 +28,14 @@ Run `make check`, which does: Then run tests: `poetry run pytest tests -v` +For changes to remote/session code, also prompt the developer to run authenticated integration tests manually: + +```bash +poetry run pytest tests/vcml/test_remote_integration.py -v --run-remote +``` + +This requires interactive browser login and a live VCell server. + ## Project structure ``` @@ -58,8 +66,10 @@ scripts/ The main entry point is `import pyvcell.vcml as vc`. Key functions: -- **Load models**: `vc.load_vcml_file()`, `vc.load_vcml_url()`, `vc.load_biomodel(id)`, `vc.load_sbml_file()`, `vc.load_antimony_str()` -- **Simulate**: `vc.simulate(biomodel, sim_name)` (local), `vc.run_remote(...)` (server) +- **Load models (local)**: `vc.load_vcml_file()`, `vc.load_vcml_url()`, `vc.load_sbml_file()`, `vc.load_antimony_str()` +- **Simulate (local)**: `vc.simulate(biomodel, sim_name)` +- **Remote (anonymous)**: `session = vc.connect()`, `session.load_biomodel(id)`, `session.list_biomodels()` +- **Remote (authenticated)**: `session = vc.connect(login=True)`, `session.run_sim(...)`, `session.start_sim(...)` - **Results**: `result.plotter.plot_concentrations()`, `result.plotter.plot_slice_3d()` ## Code conventions diff --git a/docs/getting-started/quickstart.md b/docs/getting-started/quickstart.md index 53df6b5..b12ec84 100644 --- a/docs/getting-started/quickstart.md +++ b/docs/getting-started/quickstart.md @@ -11,26 +11,20 @@ biomodel = vc.load_vcml_file("path/to/model.vcml") print(biomodel) ``` -You can also load public models directly from the VCell database by ID: +You can also load public models from the VCell server. Use `vc.connect()` to create a session for remote access: ```python -biomodel = vc.load_biomodel("279851639") -``` - -To browse or search models by name, authenticate first: +session = vc.connect() -```python -vc.login() # opens a browser for login +# Load by database ID +biomodel = session.load_biomodel("279851639") -# List available models (public, shared, and your private models) -for m in vc.list_biomodels()[:2]: +# List available models +for m in session.list_biomodels()[:2]: print(m) # Load by name and owner -biomodel = vc.load_biomodel(name="Tutorial_MultiApp", owner="tutorial") - -# Load by database ID -biomodel = vc.load_biomodel("279851639") +biomodel = session.load_biomodel(name="Tutorial_MultiApp", owner="tutorial") ``` Output: diff --git a/docs/guides/notebooks/remote-simulations.ipynb b/docs/guides/notebooks/remote-simulations.ipynb index a555dd0..fb84baa 100644 --- a/docs/guides/notebooks/remote-simulations.ipynb +++ b/docs/guides/notebooks/remote-simulations.ipynb @@ -28,16 +28,14 @@ "start_time": "2026-03-09T12:59:48.311989Z" } }, - "source": "import pyvcell.vcml as vc\n\nvc.login()", + "source": "import pyvcell.vcml as vc\n\nsession = vc.connect(login=True)", "outputs": [], "execution_count": null }, { "cell_type": "markdown", "metadata": {}, - "source": [ - "## Build and save model to VCell server" - ] + "source": "## Build a model locally" }, { "cell_type": "code", @@ -52,14 +50,14 @@ "execution_count": null }, { - "cell_type": "code", + "cell_type": "markdown", "metadata": { "ExecuteTime": { "end_time": "2026-03-09T12:59:52.619682Z", "start_time": "2026-03-09T12:59:51.154384Z" } }, - "source": "from datetime import datetime\nfrom pyvcell._internal.api.vcell_client.api.bio_model_resource_api import BioModelResourceApi\n\nvcml_str = vc.to_vcml_str(biomodel)\n\nbm_api = BioModelResourceApi()\nmodel_name = f\"MyRemoteModel_{datetime.now().strftime('%Y%m%d_%H%M%S')}\"\nsaved_vcml = bm_api.save_bio_model(body=vcml_str, new_name=model_name)\nprint(f\"Saved model as: {model_name}\")", + "source": "## Run remotely (blocking)\n\nThe simplest approach — save, run, wait, and export in one call:", "outputs": [], "execution_count": null }, @@ -71,24 +69,14 @@ "start_time": "2026-03-09T12:59:52.625336Z" } }, - "source": "saved_biomodel = vc.load_vcml_str(saved_vcml)\nbm_key = saved_biomodel.version.key\nsaved_app = next(a for a in saved_biomodel.applications if a.name == \"app1\")\nsim_key = saved_app.simulations[0].version.key\nsim_name = saved_app.simulations[0].name\nprint(f\"BioModel key: {bm_key}, Simulation key: {sim_key}\")", - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "BioModel key: 306602051, Simulation key: 306602048\n" - ] - } - ], - "execution_count": 4 + "source": "from datetime import datetime\n\nmodel_name = f\"MyRemoteModel_{datetime.now().strftime('%Y%m%d_%H%M%S')}\"\nstore = session.run_sim(biomodel, \"sim1\", model_name=model_name, on_progress=print)\nprint(f\"Shape: {store.shape}, Dtype: {store.dtype}\")\n# Shape is (X, Y, Variables, Z, Time)", + "outputs": [], + "execution_count": null }, { "cell_type": "markdown", "metadata": {}, - "source": [ - "## Start simulation" - ] + "source": "## Run remotely (non-blocking)\n\nFor more control, use `start_sim()` to get a `SimulationJob`:" }, { "cell_type": "code", @@ -98,16 +86,14 @@ "start_time": "2026-03-09T12:59:52.639633Z" } }, - "source": "from pyvcell._internal.api.vcell_client.api.simulation_resource_api import SimulationResourceApi\n\nsim_api = SimulationResourceApi()\nsim_api.start_simulation(sim_id=sim_key)\nprint(\"Simulation started\")", + "source": "model_name = f\"MyRemoteModel_{datetime.now().strftime('%Y%m%d_%H%M%S')}\"\njob = session.start_sim(biomodel, \"sim1\", model_name=model_name, on_progress=print)\nprint(f\"Simulation started, status: {job.status}\")", "outputs": [], "execution_count": null }, { "cell_type": "markdown", "metadata": {}, - "source": [ - "## Monitor progress" - ] + "source": "Wait for completion and export results:" }, { "cell_type": "code", @@ -117,139 +103,7 @@ "start_time": "2026-03-09T12:59:52.769842Z" } }, - "source": [ - "import time\n", - "\n", - "while True:\n", - " status_record = sim_api.get_simulation_status(\n", - " sim_id=sim_key,\n", - " bio_model_id=bm_key,\n", - " )\n", - " print(f\"Status: {status_record.status}, Details: {status_record.details}\")\n", - "\n", - " if status_record.status in (\"COMPLETED\", \"FAILED\", \"STOPPED\"):\n", - " break\n", - "\n", - " time.sleep(5)\n", - "\n", - "if status_record.status != \"COMPLETED\":\n", - " raise RuntimeError(f\"Simulation ended with status: {status_record.status}\")" - ], - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Status: Status.WAITING, Details: waiting to be dispatched\n", - "Status: Status.RUNNING, Details: running...\n", - "Status: Status.RUNNING, Details: running...\n", - "Status: Status.RUNNING, Details: running...\n", - "Status: Status.RUNNING, Details: simulation [SimID_306602048_0_] started\n", - "Status: Status.RUNNING, Details: simulation [SimID_306602048_0_] started\n", - "Status: Status.RUNNING, Details: simulation [SimID_306602048_0_] started\n", - "Status: Status.RUNNING, Details: 1.35\n", - "Status: Status.RUNNING, Details: 1.35\n", - "Status: Status.RUNNING, Details: 1.35\n", - "Status: Status.COMPLETED, Details: completed\n" - ] - } - ], - "execution_count": 6 - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Export results (N5 format)" - ] - }, - { - "cell_type": "code", - "metadata": { - "ExecuteTime": { - "end_time": "2026-03-09T13:00:43.280494Z", - "start_time": "2026-03-09T13:00:43.223492Z" - } - }, - "source": "from pyvcell._internal.api.vcell_client.api.export_resource_api import ExportResourceApi\nfrom pyvcell._internal.api.vcell_client.models.n5_export_request import N5ExportRequest\nfrom pyvcell._internal.api.vcell_client.models.standard_export_info import StandardExportInfo\nfrom pyvcell._internal.api.vcell_client.models.exportable_data_type import ExportableDataType\nfrom pyvcell._internal.api.vcell_client.models.variable_specs import VariableSpecs\nfrom pyvcell._internal.api.vcell_client.models.variable_mode import VariableMode\nfrom pyvcell._internal.api.vcell_client.models.time_specs import TimeSpecs\nfrom pyvcell._internal.api.vcell_client.models.time_mode import TimeMode\n\nexport_api = ExportResourceApi()\n\n# Compute time indices from simulation parameters\nnum_time_points = int(sim.duration / sim.output_time_step) + 1\nall_times = [i * sim.output_time_step for i in range(num_time_points)]\n\nrequest = N5ExportRequest(\n standard_export_information=StandardExportInfo(\n simulation_name=sim_name,\n simulation_key=sim_key,\n simulation_job=0,\n variable_specs=VariableSpecs(\n variable_names=[\"A\", \"B\"],\n mode=VariableMode.VARIABLE_MULTI,\n ),\n time_specs=TimeSpecs(\n begin_time_index=0,\n end_time_index=num_time_points - 1,\n all_times=all_times,\n mode=TimeMode.TIME_RANGE,\n ),\n ),\n exportable_data_type=ExportableDataType.PDE_VARIABLE_DATA,\n dataset_name=\"my_results\",\n)\n\njob_id = export_api.export_n5(n5_export_request=request)\nprint(f\"Export job started: {job_id}\")", - "outputs": [], - "execution_count": null - }, - { - "cell_type": "code", - "metadata": { - "ExecuteTime": { - "end_time": "2026-03-09T13:06:19.664644Z", - "start_time": "2026-03-09T13:00:43.281212Z" - } - }, - "source": [ - "while True:\n", - " events = export_api.export_status()\n", - " for event in events:\n", - " if event.job_id == job_id:\n", - " if event.event_type == \"EXPORT_COMPLETE\":\n", - " export_url = event.location\n", - " print(f\"Export complete: {export_url}\")\n", - " break\n", - " elif event.event_type == \"EXPORT_FAILURE\":\n", - " raise RuntimeError(f\"Export failed: {event}\")\n", - " else:\n", - " time.sleep(5)\n", - " continue\n", - " break" - ], - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Export complete: https://vcell.cam.uchc.edu/n5Data/schaff/ffea0744240babd.n5?dataSetName=4919316062\n" - ] - } - ], - "execution_count": 8 - }, - { - "cell_type": "markdown", - "source": "## Read N5 results with TensorStore\n\nThe export URL is not a direct download — it points to a remote N5 dataset served via S3-compatible storage. Parse the URL and open with TensorStore for lazy chunked reads:", - "metadata": {} - }, - { - "cell_type": "code", - "source": "from urllib.parse import urlparse, parse_qs\nimport tensorstore as ts\n\nparsed = urlparse(export_url)\npath_parts = parsed.path.strip(\"/\").split(\"/\", 1)\nbucket = path_parts[0] # \"n5Data\"\ncontainer_key = path_parts[1] # \"{user}/{hash}.n5\"\ns3_endpoint = f\"{parsed.scheme}://{parsed.netloc}\" # \"https://vcell.cam.uchc.edu\"\ndataset_name = parse_qs(parsed.query)[\"dataSetName\"][0] # export job ID\n\nstore = ts.open({\n \"driver\": \"n5\",\n \"kvstore\": {\n \"driver\": \"http\",\n \"base_url\": f\"{s3_endpoint}/{bucket}/{container_key}/{dataset_name}\",\n },\n \"open\": True,\n}).result()\n\nprint(f\"Shape: {store.shape}, Dtype: {store.dtype}\")\n# Shape is (X, Y, Variables, Z, Time)\n# Channels 0..N-2 are exported variables (A, B), channel N-1 is the domain mask\n\n# Read a slice — e.g. variable A, all X/Y, first z-slice, first timepoint\nslice_data = store[:, :, 0, 0, 0].read().result()\nprint(f\"Slice shape: {slice_data.shape}\")", - "metadata": { - "ExecuteTime": { - "end_time": "2026-03-09T13:06:19.913631Z", - "start_time": "2026-03-09T13:06:19.673180Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Shape: (98, 98, 3, 98, 41), Dtype: dtype(\"float64\")\n", - "Slice shape: (98, 98)\n" - ] - } - ], - "execution_count": 9 - }, - { - "cell_type": "markdown", - "source": "## Convenience API\n\nThe steps above (save, start, monitor, export, open TensorStore) can be replaced with a few convenience functions from `pyvcell.vcml`:\n\n```python\n# One-liner: save, run, export, and open TensorStore\nstore = vc.run_remote(biomodel, \"sim1\")\n\n# Or composable:\nsaved_bm, saved_sim = vc.save_and_start(biomodel, \"sim1\")\nvc.wait_for_simulation(saved_bm, saved_sim)\nstore = vc.export_n5(saved_sim, biomodel=saved_bm)\n```", - "metadata": {} - }, - { - "metadata": { - "ExecuteTime": { - "end_time": "2026-03-09T13:24:18.971823Z", - "start_time": "2026-03-09T13:17:59.723184Z" - } - }, - "cell_type": "code", - "source": "# One-liner: save, run, export, and open TensorStore\nmodel_name = f\"MyRemoteModel_{datetime.now().strftime('%Y%m%d_%H%M%S')}\"\nstore = vc.run_remote(biomodel, \"sim1\", model_name=model_name, on_progress=print)\nprint(f\"Shape: {store.shape}, Dtype: {store.dtype}\")", + "source": "# Block until done, then export\nstore = job.result()\nprint(f\"Shape: {store.shape}, Dtype: {store.dtype}\")\n\n# Read a slice — e.g. variable A, all X/Y, first z-slice, first timepoint\nslice_data = store[:, :, 0, 0, 0].read().result()\nprint(f\"Slice shape: {slice_data.shape}\")", "outputs": [], "execution_count": null } diff --git a/docs/guides/remote-simulations.md b/docs/guides/remote-simulations.md index ca6e65f..73a2a4e 100644 --- a/docs/guides/remote-simulations.md +++ b/docs/guides/remote-simulations.md @@ -11,27 +11,27 @@ This guide requires a VCell account and access to the VCell server. Code example - A [VCell account](https://vcell.org) - Familiarity with [Building a Model](building-a-model.md) -## Authenticate +## Connect to VCell -Use `vc.login()` to authenticate via OAuth2. This opens your browser for login and caches the authenticated client for all subsequent remote calls: +All remote operations go through a `VCellSession`. Use `vc.connect()` for anonymous access to public data, or `vc.connect(login=True)` for full authenticated access: ```python import pyvcell.vcml as vc -vc.login() +# Anonymous — browse and load public models (no login required) +session = vc.connect() + +# Authenticated — full access (opens browser for OAuth2 login) +session = vc.connect(login=True) ``` -To clear the cached client, call `vc.logout()`. +To clear an authenticated session, call `vc.logout()`. -## Save model to VCell server +## Build a model -Build a model locally (see [Building a Model](building-a-model.md) for details), then save it to the server: +Build a model locally (see [Building a Model](building-a-model.md) for details): ```python -import pyvcell.vcml as vc -from pyvcell._internal.api.vcell_client.api.bio_model_resource_api import BioModelResourceApi - -# Build a model locally antimony_str = """ compartment ec = 1; compartment cell = 2; @@ -59,57 +59,43 @@ app.map_species("A", init_conc="3+sin(x)", diff_coef=1.0) app.map_species("B", init_conc="2+cos(x+y+z)", diff_coef=1.0) sim = app.add_sim(name="sim1", duration=2.0, output_time_step=0.05, mesh_size=(50, 50, 50)) - -# Serialize and save to server (vc.login() must have been called) -vcml_str = vc.to_vcml_str(biomodel) - -bm_api = BioModelResourceApi() # uses the client cached by vc.login() -saved_vcml = bm_api.save_bio_model(body=vcml_str, new_name="MyRemoteModel") ``` -Parse the saved VCML to get the biomodel ID and simulation key, which you'll need for the next steps: +## Run a remote simulation (blocking) + +The simplest way — save, run, wait, and export in one call: ```python -saved_biomodel = vc.load_vcml_str(saved_vcml) -bm_key = saved_biomodel.version.key -saved_app = next(a for a in saved_biomodel.applications if a.name == "app1") -sim_key = saved_app.simulations[0].version.key -sim_name = saved_app.simulations[0].name +store = session.run_sim(biomodel, "sim1") +data = store[:, :, 0, 0, 0].read().result() ``` -## Start simulation +The returned `TensorStore` points to the exported N5 results. Reads are lazy — only the N5 blocks you access are fetched. -Use `SimulationResourceApi` to start the simulation on the server: +## Run a remote simulation (non-blocking) + +For more control, use `start_sim()` to get a `SimulationJob`: ```python -from pyvcell._internal.api.vcell_client.api.simulation_resource_api import SimulationResourceApi +job = session.start_sim(biomodel, "sim1") -sim_api = SimulationResourceApi() # uses the client cached by vc.login() -status_messages = sim_api.start_simulation(sim_id=sim_key) -print(status_messages) -``` +# Check status without blocking +print(job.status) -## Monitor progress +# Block until completion, then export +store = job.result() +``` -Poll the simulation status until it reaches a terminal state: +Or control each step individually: ```python -import time - -while True: - status_record = sim_api.get_simulation_status( - sim_id=sim_key, - bio_model_id=bm_key, - ) - print(f"Status: {status_record.status}, Details: {status_record.details}") - - if status_record.status in ("COMPLETED", "FAILED", "STOPPED"): - break +job = session.start_sim(biomodel, "sim1", on_progress=print) - time.sleep(5) +# Wait for completion +job.wait() -if status_record.status != "COMPLETED": - raise RuntimeError(f"Simulation ended with status: {status_record.status}") +# Export results +store = job.export() ``` The simulation lifecycle follows these states: @@ -118,128 +104,66 @@ The simulation lifecycle follows these states: A simulation can also end in `FAILED` or `STOPPED`. -## Export results (N5 format) +## Browse and load models -Once the simulation completes, export the results in N5 format. The server writes the N5 dataset to S3-compatible storage and returns a URL you can read remotely with `zarr` and `s3fs`: +Load public models by ID with an anonymous session: ```python -from pyvcell._internal.api.vcell_client.api.export_resource_api import ExportResourceApi -from pyvcell._internal.api.vcell_client.models.n5_export_request import N5ExportRequest -from pyvcell._internal.api.vcell_client.models.standard_export_info import StandardExportInfo -from pyvcell._internal.api.vcell_client.models.exportable_data_type import ExportableDataType -from pyvcell._internal.api.vcell_client.models.variable_specs import VariableSpecs -from pyvcell._internal.api.vcell_client.models.variable_mode import VariableMode -from pyvcell._internal.api.vcell_client.models.time_specs import TimeSpecs -from pyvcell._internal.api.vcell_client.models.time_mode import TimeMode - -export_api = ExportResourceApi() # uses the client cached by vc.login() - -# Compute time indices from simulation parameters -num_time_points = int(sim.duration / sim.output_time_step) + 1 -all_times = [i * sim.output_time_step for i in range(num_time_points)] - -request = N5ExportRequest( - standard_export_information=StandardExportInfo( - simulation_name=sim_name, - simulation_key=sim_key, - simulation_job=0, - variable_specs=VariableSpecs( - variable_names=["A", "B"], - mode=VariableMode.VARIABLE_MULTI, - ), - time_specs=TimeSpecs( - begin_time_index=0, - end_time_index=num_time_points - 1, - all_times=all_times, - mode=TimeMode.TIME_RANGE, - ), - ), - exportable_data_type=ExportableDataType.PDE_VARIABLE_DATA, - dataset_name="my_results", -) - -job_id = export_api.export_n5(n5_export_request=request) -print(f"Export job started: {job_id}") +session = vc.connect() +biomodel = session.load_biomodel("279851639") ``` -Poll for export completion: +Listing and searching by name currently require an authenticated session (temporary — the VCell API will support anonymous listing in a future release): ```python -while True: - events = export_api.export_status() - for event in events: - if event.job_id == job_id: - if event.event_type == "EXPORT_COMPLETE": - export_url = event.location - print(f"Export complete: {export_url}") - break - elif event.event_type == "EXPORT_FAILURE": - raise RuntimeError(f"Export failed: {event}") - else: - time.sleep(5) - continue - break +session = vc.connect(login=True) + +# List accessible models (public + private) +models = session.list_biomodels() +for m in models[:5]: + print(m) + +# Load by name +biomodel = session.load_biomodel(name="Tutorial_MultiApp", owner="tutorial") ``` -## Read N5 results with TensorStore +## Save a model -The export URL is not a direct download — it points to a remote N5 dataset served via S3-compatible storage. Parse the URL to extract the S3 endpoint, bucket, container path, and dataset name: +Save a biomodel to the server without starting a simulation: ```python -from urllib.parse import urlparse, parse_qs - -parsed = urlparse(export_url) -path_parts = parsed.path.strip("/").split("/", 1) -bucket = path_parts[0] # "n5Data" -container_key = path_parts[1] # "{user}/{hash}.n5" -s3_endpoint = f"{parsed.scheme}://{parsed.netloc}" # "https://vcell.cam.uchc.edu" -dataset_name = parse_qs(parsed.query)["dataSetName"][0] # export job ID +saved_biomodel = session.save_biomodel(biomodel, name="MyModel") +print(saved_biomodel.version.key) ``` -Open the N5 dataset with TensorStore. Reads are lazy — only the N5 blocks you access are fetched: +## Session API reference -```python -import tensorstore as ts - -store = ts.open({ - "driver": "n5", - "kvstore": { - "driver": "http", - "base_url": f"{s3_endpoint}/{bucket}/{container_key}/{dataset_name}", - }, - "open": True, -}).result() - -print(f"Shape: {store.shape}, Dtype: {store.dtype}") -# Shape is (X, Y, Variables, Z, Time) -# Channels 0..N-2 are exported variables (A, B), channel N-1 is the domain mask +| Method | Auth required? | Purpose | Returns | +| -------------------------- | -------------- | ----------------------------- | ---------------------------- | +| `session.load_biomodel()` | No (public ID) | Load model by ID or name | `Biomodel` | +| `session.list_biomodels()` | Yes\* | List accessible models | `list[dict]` | +| `session.save_biomodel()` | Yes | Save model to server | `Biomodel` with version keys | +| `session.run_sim()` | Yes | Save, run, export (blocking) | `TensorStore` | +| `session.start_sim()` | Yes | Save and start (non-blocking) | `SimulationJob` | -# Read a slice — e.g. variable A, all X/Y, first z-slice, first timepoint -slice_data = store[:, :, 0, 0, 0].read().result() -``` +| SimulationJob method | Purpose | Returns | +| -------------------- | -------------------------- | -------------------------- | +| `job.status` | Poll current status | `Status` | +| `job.wait()` | Block until terminal state | `None` (raises on failure) | +| `job.export()` | Export results as N5 | `TensorStore` | +| `job.result()` | `wait()` then `export()` | `TensorStore` | + +\* Temporarily requires auth due to a VCell API limitation — will support anonymous access in a future release. + +All methods accept an optional `on_progress` callback and `timeout` parameter. ## Complete example ```python -import time -from datetime import datetime -from urllib.parse import urlparse, parse_qs - -import tensorstore as ts import pyvcell.vcml as vc -from pyvcell._internal.api.vcell_client.api.bio_model_resource_api import BioModelResourceApi -from pyvcell._internal.api.vcell_client.api.simulation_resource_api import SimulationResourceApi -from pyvcell._internal.api.vcell_client.api.export_resource_api import ExportResourceApi -from pyvcell._internal.api.vcell_client.models.n5_export_request import N5ExportRequest -from pyvcell._internal.api.vcell_client.models.standard_export_info import StandardExportInfo -from pyvcell._internal.api.vcell_client.models.exportable_data_type import ExportableDataType -from pyvcell._internal.api.vcell_client.models.variable_specs import VariableSpecs -from pyvcell._internal.api.vcell_client.models.variable_mode import VariableMode -from pyvcell._internal.api.vcell_client.models.time_specs import TimeSpecs -from pyvcell._internal.api.vcell_client.models.time_mode import TimeMode # 1. Authenticate -vc.login() +session = vc.connect(login=True) # 2. Build model locally antimony_str = """ @@ -269,126 +193,12 @@ app.map_species("A", init_conc="3+sin(x)", diff_coef=1.0) app.map_species("B", init_conc="2+cos(x+y+z)", diff_coef=1.0) sim = app.add_sim(name="sim1", duration=2.0, output_time_step=0.05, mesh_size=(50, 50, 50)) -# 3. Save to server -vcml_str = vc.to_vcml_str(biomodel) -bm_api = BioModelResourceApi() -model_name = f"MyRemoteModel_{datetime.now().strftime('%Y%m%d_%H%M%S')}" -saved_vcml = bm_api.save_bio_model(body=vcml_str, new_name=model_name) - -saved_biomodel = vc.load_vcml_str(saved_vcml) -bm_key = saved_biomodel.version.key -saved_app = next(a for a in saved_biomodel.applications if a.name == "app1") -sim_key = saved_app.simulations[0].version.key -sim_name = saved_app.simulations[0].name - -# 4. Start simulation -sim_api = SimulationResourceApi() -sim_api.start_simulation(sim_id=sim_key) - -# 5. Monitor progress -while True: - status_record = sim_api.get_simulation_status(sim_id=sim_key, bio_model_id=bm_key) - print(f"Status: {status_record.status}") - if status_record.status in ("COMPLETED", "FAILED", "STOPPED"): - break - time.sleep(5) - -if status_record.status != "COMPLETED": - raise RuntimeError(f"Simulation ended with status: {status_record.status}") - -# 6. Export results -export_api = ExportResourceApi() # uses the client cached by vc.login() -num_time_points = int(sim.duration / sim.output_time_step) + 1 -all_times = [i * sim.output_time_step for i in range(num_time_points)] -request = N5ExportRequest( - standard_export_information=StandardExportInfo( - simulation_name=sim_name, - simulation_key=sim_key, - simulation_job=0, - variable_specs=VariableSpecs( - variable_names=["A", "B"], - mode=VariableMode.VARIABLE_MULTI, - ), - time_specs=TimeSpecs( - begin_time_index=0, - end_time_index=num_time_points - 1, - all_times=all_times, - mode=TimeMode.TIME_RANGE, - ), - ), - exportable_data_type=ExportableDataType.PDE_VARIABLE_DATA, - dataset_name="my_results", -) -job_id = export_api.export_n5(n5_export_request=request) - -while True: - events = export_api.export_status() - for event in events: - if event.job_id == job_id: - if event.event_type == "EXPORT_COMPLETE": - export_url = event.location - break - elif event.event_type == "EXPORT_FAILURE": - raise RuntimeError(f"Export failed: {event}") - else: - time.sleep(5) - continue - break - -# 7. Read N5 results with TensorStore (lazy chunked reads) -parsed = urlparse(export_url) -path_parts = parsed.path.strip("/").split("/", 1) -bucket = path_parts[0] -container_key = path_parts[1] -s3_endpoint = f"{parsed.scheme}://{parsed.netloc}" -dataset_name = parse_qs(parsed.query)["dataSetName"][0] - -store = ts.open({ - "driver": "n5", - "kvstore": { - "driver": "http", - "base_url": f"{s3_endpoint}/{bucket}/{container_key}/{dataset_name}", - }, - "open": True, -}).result() +# 3. Run remotely (blocking) +store = session.run_sim(biomodel, "sim1", on_progress=print) print(f"Results shape: {store.shape}, dtype: {store.dtype}") # Shape is (X, Y, Variables, Z, Time) -# Channels 0..N-2 are exported variables (A, B), channel N-1 is the domain mask -``` - -## Convenience API - -The `pyvcell.vcml` module provides high-level functions that wrap the steps above into a few calls: - -```python -import pyvcell.vcml as vc - -vc.login() - -# ... build biomodel and sim as above ... - -# One call does everything: save, run, export, and open TensorStore -store = vc.run_remote(biomodel, "sim1") -data = store[:, :, 0, 0, 0].read().result() ``` -Or use the composable functions for more control: - -```python -saved_bm, saved_sim = vc.save_and_start(biomodel, "sim1") -vc.wait_for_simulation(saved_bm, saved_sim) -store = vc.export_n5(saved_sim, biomodel=saved_bm) -``` - -| Function | Purpose | Returns | -| ----------------------- | ----------------------------------- | ------------------------------------------ | -| `save_and_start()` | Save biomodel + start simulation | `(Biomodel, Simulation)` with version keys | -| `wait_for_simulation()` | Poll until completed/failed/stopped | `None` (raises on failure) | -| `export_n5()` | Export + poll + open TensorStore | `TensorStore` | -| `run_remote()` | All three chained | `TensorStore` | - -All functions accept an optional `on_progress` callback and `timeout` parameter. - ## Next steps - [Parameter Exploration](parameter-exploration.md) — Run batch simulations with varied parameters diff --git a/pyvcell/vcml/__init__.py b/pyvcell/vcml/__init__.py index 53433f5..d9a389b 100644 --- a/pyvcell/vcml/__init__.py +++ b/pyvcell/vcml/__init__.py @@ -24,12 +24,11 @@ VCMLDocument, Version, ) +from pyvcell.vcml.session import SimulationJob, VCellSession from pyvcell.vcml.utils import ( field_data_refs, - list_biomodels, load_antimony_file, load_antimony_str, - load_biomodel, load_sbml_file, load_sbml_str, load_sbml_url, @@ -47,7 +46,7 @@ write_vcml_file, ) from pyvcell.vcml.vcml_reader import VcmlReader -from pyvcell.vcml.vcml_remote import export_n5, login, logout, run_remote, save_and_start, wait_for_simulation +from pyvcell.vcml.vcml_remote import connect, logout from pyvcell.vcml.vcml_simulation import simulate from pyvcell.vcml.vcml_writer import VcmlWriter from pyvcell.vcml.workspace import get_workspace_dir, set_workspace_dir @@ -95,15 +94,11 @@ "get_workspace_dir", "set_workspace_dir", "simulate", - "run_remote", - "save_and_start", - "wait_for_simulation", - "export_n5", - "login", + "connect", "logout", + "VCellSession", + "SimulationJob", "Field", - "list_biomodels", - "load_biomodel", "load_vcml_url", "load_sbml_url", "suppress_stdout", diff --git a/pyvcell/vcml/session.py b/pyvcell/vcml/session.py new file mode 100644 index 0000000..257ad47 --- /dev/null +++ b/pyvcell/vcml/session.py @@ -0,0 +1,307 @@ +from __future__ import annotations + +from collections.abc import Callable + +from tensorstore._tensorstore import TensorStore # type: ignore[import-not-found] + +from pyvcell._internal.api.vcell_client.api.simulation_resource_api import SimulationResourceApi +from pyvcell._internal.api.vcell_client.api_client import ApiClient +from pyvcell._internal.api.vcell_client.models.status import Status +from pyvcell.vcml.models import Biomodel, Simulation + + +class SimulationJob: + """Handle to a running remote simulation. + + Returned by :meth:`VCellSession.start_sim`. Provides methods to check + status, wait for completion, and export results. + """ + + def __init__( + self, + api_client: ApiClient, + saved_biomodel: Biomodel, + saved_simulation: Simulation, + variable_names: list[str] | None = None, + dataset_name: str | None = None, + poll_interval: float = 5.0, + timeout: float | None = None, + on_progress: Callable[[str], None] | None = None, + ) -> None: + self._api_client = api_client + self._saved_biomodel = saved_biomodel + self._saved_simulation = saved_simulation + self._variable_names = variable_names + self._dataset_name = dataset_name + self._poll_interval = poll_interval + self._timeout = timeout + self._on_progress = on_progress + + @property + def biomodel(self) -> Biomodel: + """The saved biomodel with server-assigned version keys.""" + return self._saved_biomodel + + @property + def simulation(self) -> Simulation: + """The saved simulation with server-assigned version keys.""" + return self._saved_simulation + + @property + def status(self) -> Status: + """Poll the server once and return the current simulation status.""" + if self._saved_biomodel.version is None or self._saved_biomodel.version.key is None: + raise ValueError("biomodel is missing a version key") + if self._saved_simulation.version is None or self._saved_simulation.version.key is None: + raise ValueError("simulation is missing a version key") + + sim_api = SimulationResourceApi(self._api_client) + record = sim_api.get_simulation_status( + sim_id=self._saved_simulation.version.key, + bio_model_id=self._saved_biomodel.version.key, + ) + status: Status = record.status # type: ignore[assignment] + return status + + def wait(self, poll_interval: float | None = None, timeout: float | None = None) -> None: + """Block until the simulation reaches a terminal state. + + Args: + poll_interval: Override the default poll interval (seconds). + timeout: Override the default timeout (seconds). + + Raises: + RuntimeError: If the simulation fails, is stopped, or times out. + """ + from pyvcell.vcml.vcml_remote import wait_for_simulation + + wait_for_simulation( + self._saved_biomodel, + self._saved_simulation, + poll_interval=poll_interval or self._poll_interval, + timeout=timeout if timeout is not None else self._timeout, + on_progress=self._on_progress, + api_client=self._api_client, + ) + + def export( + self, + variable_names: list[str] | None = None, + dataset_name: str | None = None, + poll_interval: float | None = None, + timeout: float | None = None, + ) -> TensorStore: + """Export simulation results as N5 and open as a TensorStore. + + Args: + variable_names: Override the variables to export. + dataset_name: Override the N5 dataset name. + poll_interval: Override the default poll interval (seconds). + timeout: Override the default timeout (seconds). + + Returns: + A TensorStore pointing to the exported N5 data. + """ + from pyvcell.vcml.vcml_remote import export_n5 + + return export_n5( + self._saved_simulation, + biomodel=self._saved_biomodel, + variable_names=variable_names if variable_names is not None else self._variable_names, + dataset_name=dataset_name if dataset_name is not None else self._dataset_name, + poll_interval=poll_interval or self._poll_interval, + timeout=timeout if timeout is not None else self._timeout, + on_progress=self._on_progress, + api_client=self._api_client, + ) + + def result( + self, + variable_names: list[str] | None = None, + dataset_name: str | None = None, + poll_interval: float | None = None, + timeout: float | None = None, + ) -> TensorStore: + """Wait for completion, then export and return results. + + Convenience method combining :meth:`wait` and :meth:`export`. + + Returns: + A TensorStore pointing to the exported N5 data. + """ + self.wait(poll_interval=poll_interval, timeout=timeout) + return self.export(variable_names=variable_names, dataset_name=dataset_name, poll_interval=poll_interval, timeout=timeout) + + +class VCellSession: + """Session for remote VCell operations. + + Created by :func:`~pyvcell.vcml.login` (authenticated) or + :func:`~pyvcell.vcml.connect` (anonymous, public data only). + + Example:: + + import pyvcell.vcml as vc + + # Anonymous — browse public models + session = vc.connect() + biomodel = session.load_biomodel("279851639") + + # Authenticated — full access + session = vc.connect(login=True) + store = session.run_sim(biomodel, "sim1") + """ + + def __init__(self, api_client: ApiClient, authenticated: bool = True) -> None: + self._api_client = api_client + self._authenticated = authenticated + + def _require_auth(self, operation: str) -> None: + """Raise if this session is not authenticated.""" + if not self._authenticated: + raise RuntimeError(f"{operation} requires authentication. Use vc.connect(login=True) instead of vc.connect().") + + def run_sim( + self, + biomodel: Biomodel, + simulation: Simulation | str, + model_name: str | None = None, + variable_names: list[str] | None = None, + dataset_name: str | None = None, + poll_interval: float = 5.0, + timeout: float | None = None, + on_progress: Callable[[str], None] | None = None, + ) -> TensorStore: + """Save, run, and export a simulation in one blocking call. + + Args: + biomodel: The biomodel to save and simulate. + simulation: Simulation object or name string. + model_name: Name for the saved model on the server. + variable_names: Variables to export. ``None`` exports all. + dataset_name: Name for the N5 dataset. + poll_interval: Seconds between status polls. + timeout: Maximum seconds to wait for each phase. + on_progress: Optional callback receiving status strings. + + Returns: + A TensorStore pointing to the exported N5 results. + """ + self._require_auth("run_sim") + from pyvcell.vcml.vcml_remote import run_remote + + return run_remote( + biomodel, + simulation, + model_name=model_name, + variable_names=variable_names, + dataset_name=dataset_name, + poll_interval=poll_interval, + timeout=timeout, + on_progress=on_progress, + api_client=self._api_client, + ) + + def start_sim( + self, + biomodel: Biomodel, + simulation: Simulation | str, + model_name: str | None = None, + variable_names: list[str] | None = None, + dataset_name: str | None = None, + poll_interval: float = 5.0, + timeout: float | None = None, + on_progress: Callable[[str], None] | None = None, + ) -> SimulationJob: + """Save a biomodel and start a simulation without blocking. + + Args: + biomodel: The biomodel to save and simulate. + simulation: Simulation object or name string. + model_name: Name for the saved model on the server. + variable_names: Variables to export when calling :meth:`SimulationJob.export`. + dataset_name: Name for the N5 dataset. + poll_interval: Default seconds between status polls. + timeout: Default maximum seconds to wait. + on_progress: Optional callback receiving status strings. + + Returns: + A :class:`SimulationJob` that can be used to monitor, wait, and export results. + """ + self._require_auth("start_sim") + from pyvcell.vcml.vcml_remote import save_and_start + + saved_bm, saved_sim = save_and_start( + biomodel, + simulation, + model_name=model_name, + on_progress=on_progress, + api_client=self._api_client, + ) + return SimulationJob( + api_client=self._api_client, + saved_biomodel=saved_bm, + saved_simulation=saved_sim, + variable_names=variable_names, + dataset_name=dataset_name, + poll_interval=poll_interval, + timeout=timeout, + on_progress=on_progress, + ) + + def save_biomodel(self, biomodel: Biomodel, name: str | None = None) -> Biomodel: + """Save a biomodel to the VCell server. + + Args: + biomodel: The biomodel to save. + name: Name for the saved model. Defaults to ``biomodel.name``. + + Returns: + The saved biomodel with server-assigned version keys. + """ + self._require_auth("save_biomodel") + from pyvcell._internal.api.vcell_client.api.bio_model_resource_api import BioModelResourceApi + + from pyvcell.vcml.utils import load_vcml_str, to_vcml_str + + vcml_str = to_vcml_str(biomodel) + bm_api = BioModelResourceApi(self._api_client) + saved_vcml = bm_api.save_bio_model(body=vcml_str, new_name=name or biomodel.name) + return load_vcml_str(saved_vcml) + + def list_biomodels(self) -> list[dict[str, str | None]]: + """Return a list of accessible BioModels from the VCell server. + + Requires an authenticated session (temporary — the VCell API + should support anonymous listing of public models but currently + returns an error for unauthenticated requests). + + Returns: + A list of dictionaries with ``"id"``, ``"name"``, and ``"owner"`` keys. + """ + # TODO: remove auth guard once VCell API supports anonymous listing + self._require_auth("list_biomodels") + from pyvcell.vcml.utils import list_biomodels + + return list_biomodels(api_client=self._api_client) + + def load_biomodel( + self, + biomodel_id: str | None = None, + *, + name: str | None = None, + owner: str | None = None, + ) -> Biomodel: + """Load a VCell BioModel by ID or by name/owner lookup. + + Args: + biomodel_id: The BioModel database key. + name: BioModel name to search for (case-insensitive substring). + owner: Owner username to narrow the search. + + Returns: + A parsed Biomodel instance. + """ + from pyvcell.vcml.utils import load_biomodel + + return load_biomodel(biomodel_id, name=name, owner=owner, api_client=self._api_client) diff --git a/pyvcell/vcml/vcml_remote.py b/pyvcell/vcml/vcml_remote.py index cdb4b77..2cb9e94 100644 --- a/pyvcell/vcml/vcml_remote.py +++ b/pyvcell/vcml/vcml_remote.py @@ -2,8 +2,12 @@ import time from collections.abc import Callable +from typing import TYPE_CHECKING from urllib.parse import parse_qs, urlparse +if TYPE_CHECKING: + from pyvcell.vcml.session import VCellSession + from tensorstore._tensorstore import TensorStore # type: ignore[import-not-found] from pyvcell._internal.api.vcell_client.api.bio_model_resource_api import BioModelResourceApi @@ -36,41 +40,57 @@ def _resolve_api_client(api_client: ApiClient | None) -> ApiClient: raise RuntimeError("No API client provided and not logged in. Call vc.login() first or pass api_client explicitly.") -def login( +def connect( api_base_url: str = "https://vcell.cam.uchc.edu", + login: bool = False, client_id: str = "cjoWhd7W8A8znf7Z7vizyvKJCiqTgRtf", issuer_url: str = "https://dev-dzhx7i2db3x3kkvq.us.auth0.com", insecure: bool = False, -) -> None: - """Authenticate with the VCell server via interactive browser login. +) -> VCellSession: + """Connect to the VCell server and return a session. - Opens a browser window for OAuth2 login. On success, caches the - authenticated client for use by all remote functions. + By default, creates an anonymous session that can browse and load + public BioModels. Pass ``login=True`` to authenticate via OAuth2 + (opens a browser window), which enables running simulations and + saving models. Args: api_base_url: VCell server URL. - client_id: OAuth2 client ID. - issuer_url: OAuth2 issuer URL. - insecure: Disable SSL verification. + login: If ``True``, open a browser for interactive OAuth2 login. + client_id: OAuth2 client ID (only used when ``login=True``). + issuer_url: OAuth2 issuer URL (only used when ``login=True``). + insecure: Disable SSL verification (only used when ``login=True``). + + Returns: + A :class:`VCellSession` — anonymous or authenticated depending on *login*. """ - global _cached_api_client - from pyvcell._internal.api.vcell_client.auth.auth_utils import login_interactive + from pyvcell.vcml.session import VCellSession as _VCellSession - client = login_interactive( - api_base_url=api_base_url, - client_id=client_id, - issuer_url=issuer_url, - insecure=insecure, - ) - _cached_api_client = client - ApiClient.set_default(client) # type: ignore[no-untyped-call] + if login: + global _cached_api_client + from pyvcell._internal.api.vcell_client.auth.auth_utils import login_interactive + + client = login_interactive( + api_base_url=api_base_url, + client_id=client_id, + issuer_url=issuer_url, + insecure=insecure, + ) + _cached_api_client = client + ApiClient.set_default(client) # type: ignore[no-untyped-call] + return _VCellSession(api_client=client, authenticated=True) + else: + from pyvcell._internal.api.vcell_client.configuration import Configuration + + client = ApiClient(configuration=Configuration(host=api_base_url)) + return _VCellSession(api_client=client, authenticated=False) def logout() -> None: """Clear the cached API client. - After calling this, remote functions will require an explicit - ``api_client`` argument until :func:`login` is called again. + After calling this, authenticated session features will be unavailable + until :func:`connect` is called again with ``login=True``. """ global _cached_api_client _cached_api_client = None diff --git a/tests/conftest.py b/tests/conftest.py index e9df8e8..b695ff1 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -27,6 +27,12 @@ ) +def pytest_addoption(parser: pytest.Parser) -> None: + parser.addoption( + "--run-remote", action="store_true", default=False, help="Run authenticated remote integration tests" + ) + + @pytest.fixture def test_root_dir() -> Path: return Path(__file__).parent diff --git a/tests/vcml/test_load_biomodel.py b/tests/vcml/test_load_biomodel.py index 9f5bcb1..c74fbb1 100644 --- a/tests/vcml/test_load_biomodel.py +++ b/tests/vcml/test_load_biomodel.py @@ -1,20 +1,19 @@ import pyvcell.vcml as vc -from pyvcell._internal.api.vcell_client import ApiClient, Configuration def test_load_biomodel_public() -> None: - """Load a public BioModel by ID using the default anonymous client.""" - # Dolgitzer 2025 — a published, public model - bm = vc.load_biomodel("279851639") + """Load a public BioModel by ID using an anonymous session.""" + session = vc.connect() + bm = session.load_biomodel("279851639") assert bm.name == "Dolgitzer 2025 A Continuum Model of Mechanosensation Based on Contractility Kit Assembly" assert len(bm.applications) > 0 assert bm.version is not None assert bm.version.key == "279851639" -def test_load_biomodel_with_explicit_client() -> None: - """Load a public BioModel using an explicitly provided ApiClient.""" - client = ApiClient(configuration=Configuration(host="https://vcell.cam.uchc.edu")) - bm = vc.load_biomodel("279851639", api_client=client) +def test_load_biomodel_with_explicit_url() -> None: + """Load a public BioModel using a session with an explicit server URL.""" + session = vc.connect(api_base_url="https://vcell.cam.uchc.edu") + bm = session.load_biomodel("279851639") assert bm.name == "Dolgitzer 2025 A Continuum Model of Mechanosensation Based on Contractility Kit Assembly" assert len(bm.applications) > 0 diff --git a/tests/vcml/test_remote_integration.py b/tests/vcml/test_remote_integration.py new file mode 100644 index 0000000..e6c86bf --- /dev/null +++ b/tests/vcml/test_remote_integration.py @@ -0,0 +1,165 @@ +"""Integration tests for remote VCell operations via VCellSession. + +Anonymous tests (vc.connect()) run by default. +Authenticated tests (vc.connect(login=True)) require interactive login +and are skipped unless --run-remote is passed to pytest. + +Usage: + poetry run pytest tests/vcml/test_remote_integration.py -v # anonymous only + poetry run pytest tests/vcml/test_remote_integration.py -v --run-remote # all tests +""" + +from __future__ import annotations + +import pytest + +import pyvcell.vcml as vc +from pyvcell.vcml.models import Biomodel +from pyvcell.vcml.session import VCellSession + + +def _build_test_biomodel() -> Biomodel: + """Build a minimal 3D biomodel for remote simulation tests. + + Uses 3D geometry because the VCell server N5 export does not + support 1D mesh to image conversions. + """ + antimony_str = """ + compartment cell = 1; + species A in cell; + species B in cell; + J0: A -> B; cell * (k1*A - k2*B) + J0 in cell; + k1 = 5.0; k2 = 2.0 + A = 10 + """ + biomodel = vc.load_antimony_str(antimony_str) + geo = vc.Geometry(name="geo", origin=(0, 0, 0), extent=(10, 10, 10), dim=3) + geo.add_background(name="cell_domain") + app = biomodel.add_application("app1", geometry=geo) + app.map_compartment("cell", "cell_domain") + app.map_species("A", init_conc="10", diff_coef=1.0) + app.map_species("B", init_conc="0", diff_coef=1.0) + app.add_sim(name="sim1", duration=0.5, output_time_step=0.1, mesh_size=(10, 10, 10)) + return biomodel + + +# --------------------------------------------------------------------------- +# Fixtures +# --------------------------------------------------------------------------- + + +@pytest.fixture(scope="module") +def anonymous_session() -> VCellSession: + """Anonymous session for public data access.""" + return vc.connect() + + +@pytest.fixture(scope="module") +def authenticated_session(request: pytest.FixtureRequest) -> VCellSession: + """Authenticated session — skipped unless --run-remote is passed.""" + if not request.config.getoption("--run-remote", default=False): + pytest.skip("Authenticated remote tests require --run-remote flag") + return vc.connect(login=True) + + +# --------------------------------------------------------------------------- +# Anonymous tests +# --------------------------------------------------------------------------- + + +class TestAnonymousSession: + """Tests that use an anonymous (unauthenticated) session.""" + + def test_connect_returns_session(self, anonymous_session: VCellSession) -> None: + assert isinstance(anonymous_session, VCellSession) + + def test_load_biomodel_by_id(self, anonymous_session: VCellSession) -> None: + bm = anonymous_session.load_biomodel("279851639") + assert bm.name == "Dolgitzer 2025 A Continuum Model of Mechanosensation Based on Contractility Kit Assembly" + assert len(bm.applications) > 0 + assert bm.version is not None + assert bm.version.key == "279851639" + + def test_list_biomodels_requires_auth(self, anonymous_session: VCellSession) -> None: + """Listing biomodels currently requires auth due to VCell API bug. + + TODO: Once VCell API supports anonymous listing, change this test to + verify that list_biomodels() works on an anonymous session. + """ + with pytest.raises(RuntimeError, match="requires authentication"): + anonymous_session.list_biomodels() + + def test_run_sim_requires_auth(self, anonymous_session: VCellSession) -> None: + bm = anonymous_session.load_biomodel("279851639") + with pytest.raises(RuntimeError, match="requires authentication"): + anonymous_session.run_sim(bm, bm.applications[0].simulations[0].name) + + def test_save_biomodel_requires_auth(self, anonymous_session: VCellSession) -> None: + bm = anonymous_session.load_biomodel("279851639") + with pytest.raises(RuntimeError, match="requires authentication"): + anonymous_session.save_biomodel(bm) + + def test_start_sim_requires_auth(self, anonymous_session: VCellSession) -> None: + bm = anonymous_session.load_biomodel("279851639") + with pytest.raises(RuntimeError, match="requires authentication"): + anonymous_session.start_sim(bm, bm.applications[0].simulations[0].name) + + +# --------------------------------------------------------------------------- +# Authenticated tests (require --run-remote) +# --------------------------------------------------------------------------- + + +class TestAuthenticatedSession: + """Tests that require interactive login and a live VCell server.""" + + def test_list_biomodels_authenticated(self, authenticated_session: VCellSession) -> None: + models = authenticated_session.list_biomodels() + assert len(models) > 0 + + def test_load_biomodel_by_name(self, authenticated_session: VCellSession) -> None: + bm = authenticated_session.load_biomodel(name="Dolgitzer 2025 A Continuum Model") + assert "Dolgitzer 2025" in bm.name + + def test_save_biomodel(self, authenticated_session: VCellSession) -> None: + from datetime import datetime + + bm = authenticated_session.load_biomodel("279851639") + name = f"test_save_pyvcell_{datetime.now().strftime('%Y%m%d_%H%M%S')}" + saved = authenticated_session.save_biomodel(bm, name=name) + assert saved.version is not None + assert saved.version.key is not None + + def test_run_sim_blocking(self, authenticated_session: VCellSession) -> None: + """Full end-to-end: build model, run remotely, get results.""" + biomodel = _build_test_biomodel() + + from datetime import datetime + + name = f"test_run_sim_{datetime.now().strftime('%Y%m%d_%H%M%S')}" + store = authenticated_session.run_sim(biomodel, "sim1", model_name=name, on_progress=print) + assert store.shape is not None + assert len(store.shape) > 0 + + def test_start_sim_nonblocking(self, authenticated_session: VCellSession) -> None: + """Start a simulation, check status, wait, export.""" + biomodel = _build_test_biomodel() + + from datetime import datetime + + name = f"test_start_sim_{datetime.now().strftime('%Y%m%d_%H%M%S')}" + job = authenticated_session.start_sim(biomodel, "sim1", model_name=name, on_progress=print) + + # Job should have saved biomodel/simulation with version keys + assert job.biomodel.version is not None + assert job.simulation.version is not None + + # Status should be queryable + status = job.status + assert status is not None + + # Wait and export + store = job.result() + assert store.shape is not None + assert len(store.shape) > 0 From f68abd566fb7d5e0bbed52657d7b5e1d0dc39bf7 Mon Sep 17 00:00:00 2001 From: Jim Schaff Date: Fri, 27 Mar 2026 17:06:18 -0400 Subject: [PATCH 03/10] Split export_n5 internally into _submit_export and _await_export Separates the export request submission from the polling loop, making it possible to expose non-blocking export in the future without changing the current blocking public API. Co-Authored-By: Claude Opus 4.6 (1M context) --- pyvcell/vcml/vcml_remote.py | 56 ++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/pyvcell/vcml/vcml_remote.py b/pyvcell/vcml/vcml_remote.py index 2cb9e94..611778f 100644 --- a/pyvcell/vcml/vcml_remote.py +++ b/pyvcell/vcml/vcml_remote.py @@ -115,6 +115,40 @@ def _find_app_for_simulation(biomodel: Biomodel, simulation: Simulation) -> Appl raise ValueError(f"Simulation '{simulation.name}' not found in biomodel '{biomodel.name}'") +def _submit_export(export_api: ExportResourceApi, request: N5ExportRequest) -> int: + """Submit an N5 export request and return the job ID.""" + job_id: int = export_api.export_n5(n5_export_request=request) + return job_id + + +def _await_export( + export_api: ExportResourceApi, + job_id: int, + poll_interval: float = 5.0, + timeout: float | None = None, + on_progress: Callable[[str], None] | None = None, +) -> TensorStore: + """Poll for export completion and return the opened TensorStore.""" + start_time = time.monotonic() + while True: + events = export_api.export_status() + for event in events: + if event.job_id == job_id: + if event.event_type == "EXPORT_COMPLETE": + if event.location is None: + raise RuntimeError("Export completed but no location was returned") + if on_progress: + on_progress(f"Export complete: {event.location}") + return _open_n5_from_export_url(event.location) + elif event.event_type == "EXPORT_FAILURE": + raise RuntimeError(f"Export failed: {event}") + + if timeout is not None and (time.monotonic() - start_time) >= timeout: + raise RuntimeError(f"Export timed out after {timeout}s") + + time.sleep(poll_interval) + + def _open_n5_from_export_url(url: str) -> TensorStore: """Parse an N5 export URL and open via TensorStore.""" parsed = urlparse(url) @@ -294,30 +328,12 @@ def export_n5( on_progress("Starting N5 export...") export_api = ExportResourceApi(api_client) - job_id = export_api.export_n5(n5_export_request=request) + job_id = _submit_export(export_api, request) if on_progress: on_progress(f"Export job started: {job_id}") - # Poll for completion - start_time = time.monotonic() - while True: - events = export_api.export_status() - for event in events: - if event.job_id == job_id: - if event.event_type == "EXPORT_COMPLETE": - if event.location is None: - raise RuntimeError("Export completed but no location was returned") - if on_progress: - on_progress(f"Export complete: {event.location}") - return _open_n5_from_export_url(event.location) - elif event.event_type == "EXPORT_FAILURE": - raise RuntimeError(f"Export failed: {event}") - - if timeout is not None and (time.monotonic() - start_time) >= timeout: - raise RuntimeError(f"Export timed out after {timeout}s") - - time.sleep(poll_interval) + return _await_export(export_api, job_id, poll_interval=poll_interval, timeout=timeout, on_progress=on_progress) def run_remote( From c4e2651e7dc08c7791c9b0c273c6a08bd31833da Mon Sep 17 00:00:00 2001 From: Jim Schaff Date: Fri, 27 Mar 2026 17:06:25 -0400 Subject: [PATCH 04/10] Fix formatting in session.py Co-Authored-By: Claude Opus 4.6 (1M context) --- pyvcell/vcml/session.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pyvcell/vcml/session.py b/pyvcell/vcml/session.py index 257ad47..30e8de1 100644 --- a/pyvcell/vcml/session.py +++ b/pyvcell/vcml/session.py @@ -130,7 +130,9 @@ def result( A TensorStore pointing to the exported N5 data. """ self.wait(poll_interval=poll_interval, timeout=timeout) - return self.export(variable_names=variable_names, dataset_name=dataset_name, poll_interval=poll_interval, timeout=timeout) + return self.export( + variable_names=variable_names, dataset_name=dataset_name, poll_interval=poll_interval, timeout=timeout + ) class VCellSession: @@ -159,7 +161,9 @@ def __init__(self, api_client: ApiClient, authenticated: bool = True) -> None: def _require_auth(self, operation: str) -> None: """Raise if this session is not authenticated.""" if not self._authenticated: - raise RuntimeError(f"{operation} requires authentication. Use vc.connect(login=True) instead of vc.connect().") + raise RuntimeError( + f"{operation} requires authentication. Use vc.connect(login=True) instead of vc.connect()." + ) def run_sim( self, @@ -261,7 +265,6 @@ def save_biomodel(self, biomodel: Biomodel, name: str | None = None) -> Biomodel """ self._require_auth("save_biomodel") from pyvcell._internal.api.vcell_client.api.bio_model_resource_api import BioModelResourceApi - from pyvcell.vcml.utils import load_vcml_str, to_vcml_str vcml_str = to_vcml_str(biomodel) From 9d1df31da3a93488aa44e4e673de55fa601abac9 Mon Sep 17 00:00:00 2001 From: Jim Schaff Date: Fri, 27 Mar 2026 22:34:17 -0400 Subject: [PATCH 05/10] Add notebook lint/execution tests and fix broken notebooks - Add tests/examples/test_example_notebooks.py with mypy lint checks for all example notebooks and tiered execution tests (default, --run-interactive for trame, --run-remote for VCell auth) - Update tests/guides/test_notebooks.py to use --run-remote flag instead of hardcoded skip for remote-simulations notebook - Fix fielddata_trame.ipynb: rename shadowed `app` variable to `viewer` - Fix _internal_data_demo.ipynb: rename shadowed `y` variable - Fix _internal_vcell_publications.ipynb: import Publication directly - Add copasi-basico as dev dependency for sysbio notebooks - Reduce remote-simulations notebook/guide model size for faster tests - Fix DeprecationWarning for Path context manager in vtk_test and test_result - Add --run-interactive pytest flag - Add docs/project-overview.md for presentations Co-Authored-By: Claude Opus 4.6 (1M context) --- .../guides/notebooks/remote-simulations.ipynb | 4 +- docs/guides/remote-simulations.md | 4 +- docs/project-overview.md | 89 ++++ examples/notebooks/_internal_data_demo.ipynb | 36 +- .../_internal_vcell_publications.ipynb | 11 +- examples/notebooks/fielddata_trame.ipynb | 446 +++++++++--------- poetry.lock | 264 ++++++++++- pyproject.toml | 1 + tests/_internal/simdata/vtk_test.py | 3 +- tests/conftest.py | 3 + tests/examples/__init__.py | 0 tests/examples/test_example_notebooks.py | 156 ++++++ tests/guides/test_notebooks.py | 12 +- tests/sim_results/test_result.py | 3 +- 14 files changed, 759 insertions(+), 273 deletions(-) create mode 100644 docs/project-overview.md create mode 100644 tests/examples/__init__.py create mode 100644 tests/examples/test_example_notebooks.py diff --git a/docs/guides/notebooks/remote-simulations.ipynb b/docs/guides/notebooks/remote-simulations.ipynb index fb84baa..fef8ba4 100644 --- a/docs/guides/notebooks/remote-simulations.ipynb +++ b/docs/guides/notebooks/remote-simulations.ipynb @@ -45,7 +45,7 @@ "start_time": "2026-03-09T12:59:50.326519Z" } }, - "source": "antimony_str = \"\"\"\n compartment ec = 1;\n compartment cell = 2;\n compartment pm = 1;\n species A in cell;\n species B in cell;\n J0: A -> B; cell * (k1*A - k2*B)\n J0 in cell;\n k1 = 5.0; k2 = 2.0\n A = 10\n\"\"\"\nbiomodel = vc.load_antimony_str(antimony_str)\nmodel = biomodel.model\nmodel.get_compartment(\"pm\").dim = 2\n\ngeo = vc.Geometry(name=\"geo\", origin=(0, 0, 0), extent=(10, 10, 10), dim=3)\ngeo.add_sphere(name=\"cell_domain\", radius=4, center=(5, 5, 5))\ngeo.add_background(name=\"ec_domain\")\ngeo.add_surface(name=\"pm_domain\", sub_volume_1=\"cell_domain\", sub_volume_2=\"ec_domain\")\n\napp = biomodel.add_application(\"app1\", geometry=geo)\napp.map_compartment(\"cell\", \"cell_domain\")\napp.map_compartment(\"ec\", \"ec_domain\")\napp.map_species(\"A\", init_conc=\"3+sin(x)\", diff_coef=1.0)\napp.map_species(\"B\", init_conc=\"2+cos(x+y+z)\", diff_coef=1.0)\n\nsim = app.add_sim(name=\"sim1\", duration=2.0, output_time_step=0.05, mesh_size=(50, 50, 50))", + "source": "antimony_str = \"\"\"\n compartment ec = 1;\n compartment cell = 2;\n compartment pm = 1;\n species A in cell;\n species B in cell;\n J0: A -> B; cell * (k1*A - k2*B)\n J0 in cell;\n k1 = 5.0; k2 = 2.0\n A = 10\n\"\"\"\nbiomodel = vc.load_antimony_str(antimony_str)\nmodel = biomodel.model\nmodel.get_compartment(\"pm\").dim = 2\n\ngeo = vc.Geometry(name=\"geo\", origin=(0, 0, 0), extent=(10, 10, 10), dim=3)\ngeo.add_sphere(name=\"cell_domain\", radius=4, center=(5, 5, 5))\ngeo.add_background(name=\"ec_domain\")\ngeo.add_surface(name=\"pm_domain\", sub_volume_1=\"cell_domain\", sub_volume_2=\"ec_domain\")\n\napp = biomodel.add_application(\"app1\", geometry=geo)\napp.map_compartment(\"cell\", \"cell_domain\")\napp.map_compartment(\"ec\", \"ec_domain\")\napp.map_species(\"A\", init_conc=\"3+sin(x)\", diff_coef=1.0)\napp.map_species(\"B\", init_conc=\"2+cos(x+y+z)\", diff_coef=1.0)\n\nsim = app.add_sim(name=\"sim1\", duration=0.5, output_time_step=0.1, mesh_size=(20, 20, 20))", "outputs": [], "execution_count": null }, @@ -121,4 +121,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file diff --git a/docs/guides/remote-simulations.md b/docs/guides/remote-simulations.md index 73a2a4e..3ce3331 100644 --- a/docs/guides/remote-simulations.md +++ b/docs/guides/remote-simulations.md @@ -58,7 +58,7 @@ app.map_compartment("ec", "ec_domain") app.map_species("A", init_conc="3+sin(x)", diff_coef=1.0) app.map_species("B", init_conc="2+cos(x+y+z)", diff_coef=1.0) -sim = app.add_sim(name="sim1", duration=2.0, output_time_step=0.05, mesh_size=(50, 50, 50)) +sim = app.add_sim(name="sim1", duration=0.5, output_time_step=0.1, mesh_size=(20, 20, 20)) ``` ## Run a remote simulation (blocking) @@ -191,7 +191,7 @@ app.map_compartment("cell", "cell_domain") app.map_compartment("ec", "ec_domain") app.map_species("A", init_conc="3+sin(x)", diff_coef=1.0) app.map_species("B", init_conc="2+cos(x+y+z)", diff_coef=1.0) -sim = app.add_sim(name="sim1", duration=2.0, output_time_step=0.05, mesh_size=(50, 50, 50)) +sim = app.add_sim(name="sim1", duration=0.5, output_time_step=0.1, mesh_size=(20, 20, 20)) # 3. Run remotely (blocking) store = session.run_sim(biomodel, "sim1", on_progress=print) diff --git a/docs/project-overview.md b/docs/project-overview.md new file mode 100644 index 0000000..7c2147e --- /dev/null +++ b/docs/project-overview.md @@ -0,0 +1,89 @@ +# pyvcell — Project Overview + +Source material for presentations, slides, and stakeholder communications. + +## What it is + +Python interface for [Virtual Cell](https://vcell.org) — a platform for spatial modeling, simulation, and analysis of cell biological systems. Published as prebuilt Python packages on PyPI for Linux, macOS, and Windows. + +## Motivation + +Jupyter notebooks have become a valuable tool for learning, developing, and disseminating modeling projects, and enhance reproducibility. Python scripting provides flexibility to customize simulation and data analysis workflows and easily integrate familiar, powerful tools for data analysis and visualization. Following the approach of the BasiCO Python library (which wraps COPASI), pyvcell empowers modelers to use VCell's spatial simulation technology while providing complete control over the structure of their modeling projects — all from Python scripts, Jupyter notebooks, or other third-party tools. + +## Who it's for + +Computational biologists, biophysicists, and researchers who want to build and simulate cell models programmatically rather than through the VCell desktop GUI. pyvcell expands the reach of VCell's spatial simulation capabilities to modelers who prefer Python-based workflows. + +## Core capabilities + +1. **Model building** — Define compartments, species, reactions, and spatial geometries in Python using Antimony, SBML, or VCML formats +2. **Complex geometries** — Analytic primitives (spheres, backgrounds), multi-compartment structures, reusable geometries from existing models, and image-based segmented geometries +3. **Local simulation** — Run VCell solvers locally, get results as Zarr arrays, visualize with built-in plotters +4. **Remote simulation** — Connect to the VCell server cluster for large-scale simulations, with results streamed back lazily +5. **Simulation chaining** — Use output from one simulation as initial conditions for the next via field data references (`vcField`) +6. **Synthetic field data** — Supply programmatic or image-derived spatial data as initial conditions +7. **Parameter exploration** — Modify parameters, run batch sweeps, and compare results for sensitivity analysis +8. **Visualization** — Concentration time series, 2D/3D spatial slices, animations, VTK mesh export, and interactive Trame widgets in Jupyter +9. **Format interop** — Round-trip between VCML, SBML Spatial (designed by the VCell team), and Antimony representations + +## Key design principles + +- **Lightweight Python datamodels, proven Java algorithms** — Model authoring and manipulation uses pure Python dataclasses exposing essential VCell concepts only. Validation, math generation, and simulation preprocessing invoke battle-tested Java logic from libvcell, bundled via GraalVM native compilation. This includes model translation (SBML Spatial to VCell BioModel), math generation (BioModel to MathModel using VCell's formal equation-based descriptions of reaction-diffusion-advection PDE, particle Brownian dynamics, hybrid PDE/particle, or rule-based mesoscopic molecular processes), and mesh generation/solver preprocessing. + +- **Native solvers as Python packages** — VCell's C++ solvers are repackaged as standalone Python packages using thin wrappers (pybind11, scikit-build-core). pyvcell-fvsolver is on PyPI today; pyvcell-ode, pyvcell-nfsim, and pyvcell-stoch are in progress. + +- **Wrapped API with session-based remote access** — All VCell API endpoints are accessible, but common operations (load/save biomodels, run remote simulations, retrieve results) are wrapped in a remote session for simplified, discoverable access. A single entry point (`vc.connect()`) provides both anonymous and authenticated sessions. + +- **Cloud-native lazy data retrieval** — Remote results use N5 format (similar to Zarr) with TensorStore for multidimensional data access — only requested data is transmitted, on demand. + +- **Ecosystem integration** — Results are exported into VTK and Zarr format for convenient access using NumPy, Pandas, VTK, and PyVista for further data analysis and visualization. Interactive 3D visualization in Jupyter is provided via Trame widgets. + +## Minimal examples + +### Local: load, simulate, visualize + +```python +import pyvcell.vcml as vc + +biomodel = vc.load_vcml_file("model.vcml") +result = vc.simulate(biomodel, "Simulation1") +result.plotter.plot_concentrations() +``` + +### Remote: connect, load from server, run on cluster + +```python +import pyvcell.vcml as vc + +session = vc.connect(login=True) +biomodel = session.load_biomodel("279851639") +store = session.run_sim(biomodel, "sim1") +``` + +### Chain simulations: use first run's output as next run's initial conditions + +```python +result1 = vc.simulate(biomodel, "sim1") +species.init_conc = f"vcField('{result1.solver_output_dir.name}','s0',0.0,'Volume')" +result2 = vc.simulate(biomodel, "sim1") +``` + +### Parameter sweep + +```python +for kf in [0.1, 1.0, 10.0]: + model.set_parameter_value("r0.Kf", kf) + result = vc.simulate(biomodel, "sim1") + result.plotter.plot_concentrations() +``` + +## Architecture summary + +| Layer | Technology | Role | +| --- | --- | --- | +| Python datamodels | Pydantic/dataclasses | Model authoring, manipulation, essential VCell concepts | +| libvcell | Java via GraalVM native compilation | Validation, math generation, solver preprocessing | +| Solvers | C++ via pybind11/scikit-build-core | Local finite volume, ODE, stochastic, rule-based simulation | +| VCell API | OpenAPI generated client | Remote simulation, model storage, result export | +| Data access | Zarr, N5/TensorStore, VTK | Local and remote result retrieval | +| Visualization | Matplotlib, PyVista, Trame | 2D/3D plotting, animations, interactive Jupyter widgets | diff --git a/examples/notebooks/_internal_data_demo.ipynb b/examples/notebooks/_internal_data_demo.ipynb index 33a01ac..339d301 100644 --- a/examples/notebooks/_internal_data_demo.ipynb +++ b/examples/notebooks/_internal_data_demo.ipynb @@ -56,7 +56,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "e88a4bb558aba920", "metadata": { "ExecuteTime": { @@ -69,9 +69,7 @@ } }, "outputs": [], - "source": [ - "test_data_dir = Path(os.getcwd()).parent / \"solver_output\"\n" - ] + "source": "test_data_dir = Path(os.getcwd()).parent / \"solver_output\"" }, { "cell_type": "markdown", @@ -442,7 +440,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "d560b5a94bb8a5cb", "metadata": { "ExecuteTime": { @@ -454,30 +452,8 @@ "outputs_hidden": false } }, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "t = metadata['times']\n", - "y = [c['mean_values'] for c in metadata['channels'] if c['index'] > 4]\n", - "y_labels = [c['label'] for c in metadata['channels'] if c['index'] > 4]\n", - "\n", - "fig, ax = plt.subplots()\n", - "ax.plot(t, y)\n", - "ax.set(xlabel='time (s)', ylabel='concentration',\n", - " title='Concentration over time')\n", - "ax.legend(y_labels)\n", - "ax.grid()\n" - ] + "outputs": [], + "source": "times = metadata['times']\nconc_values = [c['mean_values'] for c in metadata['channels'] if c['index'] > 4]\nconc_labels = [c['label'] for c in metadata['channels'] if c['index'] > 4]\n\nfig, ax = plt.subplots()\nax.plot(times, conc_values)\nax.set(xlabel='time (s)', ylabel='concentration',\n title='Concentration over time')\nax.legend(conc_labels)\nax.grid()" }, { "cell_type": "markdown", @@ -629,4 +605,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/notebooks/_internal_vcell_publications.ipynb b/examples/notebooks/_internal_vcell_publications.ipynb index be18792..aafa5b3 100644 --- a/examples/notebooks/_internal_vcell_publications.ipynb +++ b/examples/notebooks/_internal_vcell_publications.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "5e183b4a68315dfe", "metadata": { "ExecuteTime": { @@ -15,12 +15,7 @@ } }, "outputs": [], - "source": [ - "from IPython.display import display\n", - "from pyvcell._internal.api.vcell_client import ApiClient, Configuration, PublicationResourceApi\n", - "from pyvcell._internal.api.vcell_client.auth.auth_utils import login_interactive\n", - "from pyvcell._internal.api.vcell_client.models import Publication" - ] + "source": "from IPython.display import display\nfrom pyvcell._internal.api.vcell_client import ApiClient, Configuration, PublicationResourceApi\nfrom pyvcell._internal.api.vcell_client.auth.auth_utils import login_interactive\nfrom pyvcell._internal.api.vcell_client.models.publication import Publication" }, { "cell_type": "markdown", @@ -249,4 +244,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/examples/notebooks/fielddata_trame.ipynb b/examples/notebooks/fielddata_trame.ipynb index dfabdab..b0bf951 100644 --- a/examples/notebooks/fielddata_trame.ipynb +++ b/examples/notebooks/fielddata_trame.ipynb @@ -2,57 +2,91 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, "id": "cd6e4d13dfbf7174", "metadata": { "ExecuteTime": { - "end_time": "2025-04-13T19:23:29.721995Z", - "start_time": "2025-04-13T19:23:27.464335Z" + "end_time": "2026-03-27T21:51:42.624402Z", + "start_time": "2026-03-27T21:51:39.652565Z" } }, - "outputs": [], "source": [ "import os\n", "import shutil\n", "from pathlib import Path\n", "import pyvcell.vcml as vc\n" - ] + ], + "outputs": [], + "execution_count": 1 }, { "cell_type": "code", - "execution_count": 2, "id": "90b534edd21ee708", "metadata": { "ExecuteTime": { - "end_time": "2025-04-13T19:23:31.213426Z", - "start_time": "2025-04-13T19:23:29.732582Z" + "end_time": "2026-03-27T21:51:44.484147Z", + "start_time": "2026-03-27T21:51:42.625974Z" } }, + "source": [ + "# ----- make a workspace\n", + "workspace_dir = Path(os.getcwd()) / \"workspace\"\n", + "sim1_dir = workspace_dir / \"sim1_dir\"\n", + "if sim1_dir.exists():\n", + " shutil.rmtree(sim1_dir)\n", + "sim2_dir = workspace_dir / \"sim2_dir\"\n", + "if sim2_dir.exists():\n", + " shutil.rmtree(sim2_dir)\n", + "\n", + "# ---- read in VCML file\n", + "model_fp = Path(os.getcwd()).parent / \"models\" / \"SmallSpatialProject_3D.vcml\"\n", + "bio_model1 = vc.load_vcml_file(model_fp)\n", + "\n", + "# ---- get the application and the species mappings for species \"s0\" and \"s1\"\n", + "app = bio_model1.applications[0]\n", + "s1_mapping = next(s for s in app.species_mappings if s.species_name == \"s1\")\n", + "s0_mapping = next(s for s in app.species_mappings if s.species_name == \"s0\")\n", + "\n", + "# ---- add a simulation to the first application in the biomodel (didn't already have a simulation in the VCML file)\n", + "new_sim = vc.Simulation(name=\"new_sim\", duration=10.0, output_time_step=0.1, mesh_size=(20, 20, 20))\n", + "app.simulations.append(new_sim)\n", + "\n", + "# ---- set the initial concentration of species \"s0\" and \"s1\" in the first application\n", + "s0_mapping.init_conc = \"3+sin(x)+cos(y)+sin(z)\"\n", + "s1_mapping.init_conc = \"3+sin(x+y+z)\"\n", + "\n", + "# ---- run simulation, store in sim1_dir, and plot results\n", + "# >>>>> This forms the data for the \"Field Data\" identified by 'sim1_dir' <<<<<<\n", + "sim1_result = vc.simulate(biomodel=bio_model1, simulation=new_sim.name)\n", + "# print([c.label for c in sim1_result.channel_data])\n", + "# print(sim1_result.time_points[::11])\n", + "# sim1_result.plotter.plot_slice_3d(time_index=0, channel_id=\"s0\")\n", + "# sim1_result.plotter.plot_slice_3d(time_index=0, channel_id=\"s1\")\n", + "# sim1_result.plotter.plot_concentrations()" + ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv_jupyter/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", - "2025-04-14T02:39:13.347430Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", + "2026-03-27T21:51:42.763841Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", "Please remove the `packages` attribute from your configuration file.\n", "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2025-04-14T02:39:13.351282Z main WARN The Logger cbit.vcell.model.Kinetics was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@51a4211b and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2025-04-14T02:39:13.519687Z main WARN The Logger cbit.vcell.mapping.AbstractMathMapping was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@51a4211b and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2025-04-13 22:39:13,522 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [l.uM.dm-2.s-1] and [molecules.s-1.um-2] in Expression: ((Kf_r1 * s0) - (Kr_r1 * s2))\n", - "2025-04-13 22:39:13,522 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [molecules.s-1.um-2] and [l.uM.dm-2.s-1] in Expression: ((Kf_r2 * s2) - (Kr_r2 * s3))\n", - "2025-04-13 22:39:13,527 INFO (Entrypoints.java:200) - Returning from vcellToVcml: {\"success\":true,\"message\":\"Success\"}\n", - "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv_jupyter/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", - "2025-04-14T02:39:13.542295Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "2026-03-27T21:51:42.786230Z main WARN The Logger cbit.vcell.model.Kinetics was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@b070d2b and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", + "2026-03-27T21:51:43.014657Z main WARN The Logger cbit.vcell.mapping.AbstractMathMapping was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@b070d2b and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", + "2026-03-27 17:51:43,039 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [l.uM.dm-2.s-1] and [molecules.s-1.um-2] in Expression: ((Kf_r1 * s0) - (Kr_r1 * s2))\n", + "2026-03-27 17:51:43,039 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [molecules.s-1.um-2] and [l.uM.dm-2.s-1] in Expression: ((Kf_r2 * s2) - (Kr_r2 * s3))\n", + "2026-03-27 17:51:43,048 INFO (Entrypoints.java:202) - Returning from vcellToVcml: {\"success\":true,\"message\":\"Success\"}\n", + "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", + "2026-03-27T21:51:43.063292Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", "Please remove the `packages` attribute from your configuration file.\n", "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2025-04-14T02:39:13.543110Z main WARN The Logger org.vcell.libvcell.Entrypoints was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@377bd8e6 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2025-04-14T02:39:13.546545Z main WARN The Logger cbit.vcell.model.Kinetics was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@377bd8e6 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2025-04-14T02:39:13.550469Z main WARN The Logger cbit.vcell.mapping.AbstractMathMapping was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@377bd8e6 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2025-04-13 22:39:13,558 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [l.uM.dm-2.s-1] and [molecules.s-1.um-2] in Expression: ((Kf_r1 * s0) - (Kr_r1 * s2))\n", - "2025-04-13 22:39:13,559 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [molecules.s-1.um-2] and [l.uM.dm-2.s-1] in Expression: ((Kf_r2 * s2) - (Kr_r2 * s3))\n", - "2025-04-13 22:39:13,567 INFO (Entrypoints.java:83) - Returning from vcmlToFiniteVolumeInput: {\"success\":true,\"message\":\"Success\"}\n", - "Setting Base file name to: `\"/Users/jimschaff/Documents/workspace/pyvcell/examples/notebooks/workspace/out_dir_m6cuj2vl/SimID_208355207_0_\"`\n" + "2026-03-27T21:51:43.064087Z main WARN The Logger org.vcell.libvcell.Entrypoints was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@4a6e46f0 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", + "2026-03-27T21:51:43.067715Z main WARN The Logger cbit.vcell.model.Kinetics was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@4a6e46f0 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", + "2026-03-27T21:51:43.072121Z main WARN The Logger cbit.vcell.mapping.AbstractMathMapping was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@4a6e46f0 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", + "2026-03-27 17:51:43,084 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [l.uM.dm-2.s-1] and [molecules.s-1.um-2] in Expression: ((Kf_r1 * s0) - (Kr_r1 * s2))\n", + "2026-03-27 17:51:43,084 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [molecules.s-1.um-2] and [l.uM.dm-2.s-1] in Expression: ((Kf_r2 * s2) - (Kr_r2 * s3))\n", + "2026-03-27 17:51:43,096 INFO (Entrypoints.java:85) - Returning from vcmlToFiniteVolumeInput: {\"success\":true,\"message\":\"Success\"}\n" ] }, { @@ -66,6 +100,7 @@ "name": "stdout", "output_type": "stream", "text": [ + "Setting Base file name to: `\"/Users/jimschaff/Documents/workspace/pyvcell/examples/notebooks/workspace/out_dir_zxwst4xd/SimID_831034087_0_\"`\n", "initializing mesh\n", "numVolume=8000\n", "\n", @@ -86,9 +121,9 @@ "mesh initialized\n", "preprocessing finished\n", "pdeCount=4, odeCount=0\n", - "No log-file found at constructed path `/Users/jimschaff/Documents/workspace/pyvcell/examples/notebooks/workspace/out_dir_m6cuj2vl/SimID_208355207_0_.log`.simulation [SimID_208355207_0_] started\n", + "No log-file found at constructed path `/Users/jimschaff/Documents/workspace/pyvcell/examples/notebooks/workspace/out_dir_zxwst4xd/SimID_831034087_0_.log`.simulation [SimID_831034087_0_] started\n", "temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0000.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0000.sim\n", "**This is a little endian machine.**\n", "[[[data:0]]]\n", "numVolRegions=2\n", @@ -105,203 +140,203 @@ "sundials pde solver is starting from time 0\n", "----------------------------------\n", "temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0001.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0001.sim\n", "[[[data:0.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0002.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0002.sim\n", "[[[data:0.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0003.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0003.sim\n", "[[[data:0.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0004.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0004.sim\n", "[[[data:0.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0005.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0005.sim\n", "[[[data:0.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0006.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0006.sim\n", "[[[data:0.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0007.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0007.sim\n", "[[[data:0.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0008.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0008.sim\n", "[[[data:0.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0009.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0009.sim\n", "[[[data:0.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0010.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0010.sim\n", "[[[data:1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0011.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0011.sim\n", "[[[data:1.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0012.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0012.sim\n", "[[[data:1.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0013.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0013.sim\n", "[[[data:1.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0014.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0014.sim\n", "[[[data:1.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0015.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0015.sim\n", "[[[data:1.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0016.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0016.sim\n", "[[[data:1.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0017.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0017.sim\n", "[[[data:1.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0018.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0018.sim\n", "[[[data:1.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0019.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0019.sim\n", "[[[data:1.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0020.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0020.sim\n", "[[[data:2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0021.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0021.sim\n", "[[[data:2.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0022.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0022.sim\n", "[[[data:2.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0023.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0023.sim\n", "[[[data:2.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0024.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0024.sim\n", "[[[data:2.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0025.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0025.sim\n", "[[[data:2.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0026.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0026.sim\n", "[[[data:2.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0027.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0027.sim\n", "[[[data:2.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0028.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0028.sim\n", "[[[data:2.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0029.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0029.sim\n", "[[[data:2.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0030.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0030.sim\n", "[[[data:3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0031.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0031.sim\n", "[[[data:3.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0032.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0032.sim\n", "[[[data:3.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0033.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0033.sim\n", "[[[data:3.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0034.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0034.sim\n", "[[[data:3.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0035.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0035.sim\n", "[[[data:3.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0036.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0036.sim\n", "[[[data:3.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0037.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0037.sim\n", "[[[data:3.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0038.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0038.sim\n", "[[[data:3.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0039.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0039.sim\n", "[[[data:3.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0040.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0040.sim\n", "[[[data:4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0041.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0041.sim\n", "[[[data:4.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0042.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0042.sim\n", "[[[data:4.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0043.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0043.sim\n", "[[[data:4.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0044.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0044.sim\n", "[[[data:4.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0045.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0045.sim\n", "[[[data:4.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0046.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0046.sim\n", "[[[data:4.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0047.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0047.sim\n", "[[[data:4.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0048.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0048.sim\n", "[[[data:4.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0049.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0049.sim\n", "[[[data:4.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0050.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0050.sim\n", "[[[data:5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0051.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0051.sim\n", "[[[data:5.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0052.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0052.sim\n", "[[[data:5.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0053.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0053.sim\n", "[[[data:5.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0054.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0054.sim\n", "[[[data:5.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0055.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0055.sim\n", "[[[data:5.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0056.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0056.sim\n", "[[[data:5.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0057.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0057.sim\n", "[[[data:5.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0058.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0058.sim\n", "[[[data:5.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0059.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0059.sim\n", "[[[data:5.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0060.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0060.sim\n", "[[[data:6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0061.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0061.sim\n", "[[[data:6.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0062.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0062.sim\n", "[[[data:6.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0063.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0063.sim\n", "[[[data:6.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0064.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0064.sim\n", "[[[data:6.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0065.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0065.sim\n", "[[[data:6.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0066.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0066.sim\n", "[[[data:6.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0067.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0067.sim\n", "[[[data:6.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0068.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0068.sim\n", "[[[data:6.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0069.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0069.sim\n", "[[[data:6.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0070.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0070.sim\n", "[[[data:7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0071.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0071.sim\n", "[[[data:7.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0072.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0072.sim\n", "[[[data:7.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0073.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0073.sim\n", "[[[data:7.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0074.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0074.sim\n", "[[[data:7.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0075.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0075.sim\n", "[[[data:7.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0076.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0076.sim\n", "[[[data:7.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0077.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0077.sim\n", "[[[data:7.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0078.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0078.sim\n", "[[[data:7.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0079.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0079.sim\n", "[[[data:7.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0080.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0080.sim\n", "[[[data:8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0081.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0081.sim\n", "[[[data:8.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0082.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0082.sim\n", "[[[data:8.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0083.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0083.sim\n", "[[[data:8.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0084.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0084.sim\n", "[[[data:8.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0085.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0085.sim\n", "[[[data:8.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0086.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0086.sim\n", "[[[data:8.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0087.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0087.sim\n", "[[[data:8.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0088.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0088.sim\n", "[[[data:8.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0089.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0089.sim\n", "[[[data:8.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0090.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0090.sim\n", "[[[data:9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0091.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0091.sim\n", "[[[data:9.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0092.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0092.sim\n", "[[[data:9.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0093.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0093.sim\n", "[[[data:9.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0094.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0094.sim\n", "[[[data:9.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0095.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0095.sim\n", "[[[data:9.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0096.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0096.sim\n", "[[[data:9.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0097.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0097.sim\n", "[[[data:9.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0098.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0098.sim\n", "[[[data:9.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0099.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0099.sim\n", "[[[data:9.9]]]\n", "Final Statistics.. \n", "\n", @@ -316,85 +351,81 @@ "last step = 0.100000\n", "\n", "temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_208355207_0_0100.sim\n", - "[[[data:10]]][[[progress:100%]]]" + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0100.sim\n", + "[[[data:10]]][[[progress:100%]]]--------------- sim summary ----------------\n", + "Cartesian Mesh: Domain x:[0,10] y:[0,10] z:[0,10]\n", + " Elements numX=20 numY=20 numZ=20\n", + "\n", + "\ttime = 10 sec\n", + "\tdT = 0.1 sec\n", + "--------------------------------------------\n", + "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", + "2026-03-27T21:51:43.837602Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "Please remove the `packages` attribute from your configuration file.\n", + "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", + "2026-03-27 17:51:43,838 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", + "2026-03-27T21:51:43.850801Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "Please remove the `packages` attribute from your configuration file.\n", + "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", + "2026-03-27 17:51:43,851 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", + "2026-03-27T21:51:43.863715Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "Please remove the `packages` attribute from your configuration file.\n", + "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", + "2026-03-27 17:51:43,864 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", + "2026-03-27T21:51:43.876272Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "Please remove the `packages` attribute from your configuration file.\n", + "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", + "2026-03-27 17:51:43,876 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", + "2026-03-27T21:51:43.888854Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "Please remove the `packages` attribute from your configuration file.\n", + "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", + "2026-03-27 17:51:43,889 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", + "2026-03-27T21:51:43.901453Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "Please remove the `packages` attribute from your configuration file.\n", + "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", + "2026-03-27 17:51:43,902 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", + "2026-03-27T21:51:43.913444Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "Please remove the `packages` attribute from your configuration file.\n", + "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", + "2026-03-27 17:51:43,914 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", + "2026-03-27T21:51:43.925442Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "Please remove the `packages` attribute from your configuration file.\n", + "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", + "2026-03-27 17:51:43,926 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", + "2026-03-27T21:51:43.937310Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "Please remove the `packages` attribute from your configuration file.\n", + "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", + "2026-03-27 17:51:43,937 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n" ] } ], - "source": [ - "# ----- make a workspace\n", - "workspace_dir = Path(os.getcwd()) / \"workspace\"\n", - "sim1_dir = workspace_dir / \"sim1_dir\"\n", - "if sim1_dir.exists():\n", - " shutil.rmtree(sim1_dir)\n", - "sim2_dir = workspace_dir / \"sim2_dir\"\n", - "if sim2_dir.exists():\n", - " shutil.rmtree(sim2_dir)\n", - "\n", - "# ---- read in VCML file\n", - "model_fp = Path(os.getcwd()).parent / \"models\" / \"SmallSpatialProject_3D.vcml\"\n", - "bio_model1 = vc.load_vcml_file(model_fp)\n", - "\n", - "# ---- get the application and the species mappings for species \"s0\" and \"s1\"\n", - "app = bio_model1.applications[0]\n", - "s1_mapping = next(s for s in app.species_mappings if s.species_name == \"s1\")\n", - "s0_mapping = next(s for s in app.species_mappings if s.species_name == \"s0\")\n", - "\n", - "# ---- add a simulation to the first application in the biomodel (didn't already have a simulation in the VCML file)\n", - "new_sim = vc.Simulation(name=\"new_sim\", duration=10.0, output_time_step=0.1, mesh_size=(20, 20, 20))\n", - "app.simulations.append(new_sim)\n", - "\n", - "# ---- set the initial concentration of species \"s0\" and \"s1\" in the first application\n", - "s0_mapping.init_conc = \"3+sin(x)+cos(y)+sin(z)\"\n", - "s1_mapping.init_conc = \"3+sin(x+y+z)\"\n", - "\n", - "# ---- run simulation, store in sim1_dir, and plot results\n", - "# >>>>> This forms the data for the \"Field Data\" identified by 'sim1_dir' <<<<<<\n", - "sim1_result = vc.simulate(biomodel=bio_model1, simulation=new_sim.name)\n", - "# print([c.label for c in sim1_result.channel_data])\n", - "# print(sim1_result.time_points[::11])\n", - "# sim1_result.plotter.plot_slice_3d(time_index=0, channel_id=\"s0\")\n", - "# sim1_result.plotter.plot_slice_3d(time_index=0, channel_id=\"s1\")\n", - "# sim1_result.plotter.plot_concentrations()" - ] + "execution_count": 2 }, { "cell_type": "code", - "execution_count": 3, "id": "f139cbdd98786c82", "metadata": { "ExecuteTime": { - "end_time": "2025-04-13T19:23:31.964708Z", - "start_time": "2025-04-13T19:23:31.261662Z" + "end_time": "2026-03-27T21:51:45.846157Z", + "start_time": "2026-03-27T21:51:44.526981Z" } }, + "source": "import pyvcell.sim_results.widget as widget\n\nviewer = widget.App(sim1_result.vtk_data)\nlayout = await viewer.run()", "outputs": [], - "source": [ - "import pyvcell.sim_results.widget as widget\n", - "from trame.app.jupyter import show\n", - "\n", - "app = widget.App(sim1_result.vtk_data)\n", - "layout = await app.run()\n", - "show(layout, open_browser=False)\n", - "\n", - "# vtk_data1 = sim1_result.vtk_data\n", - "#\n", - "# app = App(vtk_data1)\n", - "# # asyncio.get_event_loop().run_until_complete(app.run())\n", - "# await app.run()" - ] + "execution_count": null }, { "cell_type": "code", - "execution_count": 4, "id": "initial_id", - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-13T19:23:31.973545Z", - "start_time": "2025-04-13T19:23:31.971919Z" - } - }, - "outputs": [], + "metadata": {}, "source": [ "\n", "\n", @@ -407,46 +438,33 @@ "# # sim2_result.plotter.plot_slice_3d(time_index=0, channel_id=\"s0\")\n", "# # sim2_result.plotter.plot_slice_3d(time_index=0, channel_id=\"s1\")\n", "# # sim2_result.plotter.plot_concentrations()\n" - ] + ], + "outputs": [], + "execution_count": null }, { "cell_type": "code", - "execution_count": null, "id": "fe9a9ec55e853f21", - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-13T19:23:31.980863Z", - "start_time": "2025-04-13T19:23:31.979364Z" - } - }, + "metadata": {}, + "source": [], "outputs": [], - "source": [] + "execution_count": null }, { "cell_type": "code", - "execution_count": null, "id": "9adf3b911df4b628", - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-13T19:23:31.988565Z", - "start_time": "2025-04-13T19:23:31.987299Z" - } - }, + "metadata": {}, + "source": [], "outputs": [], - "source": [] + "execution_count": null }, { "cell_type": "code", - "execution_count": null, "id": "52fef2ac53b66666", - "metadata": { - "ExecuteTime": { - "end_time": "2025-04-13T19:23:31.995756Z", - "start_time": "2025-04-13T19:23:31.994581Z" - } - }, + "metadata": {}, + "source": [], "outputs": [], - "source": [] + "execution_count": null } ], "metadata": { @@ -470,4 +488,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} +} \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index d712e94..ac85b1f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -782,7 +782,7 @@ version = "1.3.3" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.11" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1"}, {file = "contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381"}, @@ -868,6 +868,33 @@ mypy = ["bokeh", "contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.17.0)", " test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] +[[package]] +name = "copasi-basico" +version = "0.86" +description = "Simplified COPASI interface for python" +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "copasi_basico-0.86-py3-none-any.whl", hash = "sha256:d92b93ad28edcd84b83962913d1fc973906ca612c01e954007d23a9031167058"}, + {file = "copasi_basico-0.86.tar.gz", hash = "sha256:de3090ee3bb46a64953ab35b759023d20081a29d518eb3a5d0377fe23765f336"}, +] + +[package.dependencies] +lxml = "*" +matplotlib = "*" +numpy = "*" +pandas = "*" +python-copasi = "*" +PyYAML = "*" +scipy = "*" + +[package.extras] +docs = ["sphinx", "sphinx_rtd_theme", "sphinxcontrib", "sphinxcontrib-bibtex", "sphinxcontrib-mermaid", "sphinxcontrib-plantuml", "sphinxcontrib-programoutput"] +petab = ["copasi-petab-importer", "petab", "petab-select"] +ssr = ["libssr", "python-libsbml"] +tqdm = ["tqdm"] + [[package]] name = "coverage" version = "7.13.5" @@ -1065,7 +1092,7 @@ version = "0.12.1" description = "Composable style cycles" optional = false python-versions = ">=3.8" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, @@ -1255,7 +1282,7 @@ version = "4.62.1" description = "Tools to manipulate font files" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "fonttools-4.62.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ad5cca75776cd453b1b035b530e943334957ae152a36a88a320e779d61fc980c"}, {file = "fonttools-4.62.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b3ae47e8636156a9accff64c02c0924cbebad62854c4a6dbdc110cd5b4b341a"}, @@ -2262,7 +2289,7 @@ version = "1.5.0" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "kiwisolver-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32cc0a5365239a6ea0c6ed461e8838d053b57e397443c0ca894dcc8e388d4374"}, {file = "kiwisolver-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cc0b66c1eec9021353a4b4483afb12dfd50e3669ffbb9152d6842eb34c7e29fd"}, @@ -2533,7 +2560,7 @@ version = "5.4.0" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "lxml-5.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e7bc6df34d42322c5289e37e9971d6ed114e3776b45fa879f734bded9d1fea9c"}, {file = "lxml-5.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6854f8bd8a1536f8a1d9a3655e6354faa6406621cf857dc27b681b69860645c7"}, @@ -2836,7 +2863,7 @@ version = "3.10.8" description = "Python plotting package" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7"}, {file = "matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656"}, @@ -3805,7 +3832,7 @@ version = "2.4.3" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.11" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "numpy-2.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:33b3bf58ee84b172c067f56aeadc7ee9ab6de69c5e800ab5b10295d54c581adb"}, {file = "numpy-2.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ba7b51e71c05aa1f9bc3641463cd82308eab40ce0d5c7e1fd4038cbf9938147"}, @@ -4021,6 +4048,98 @@ files = [ dev = ["pytest", "tox"] lint = ["black"] +[[package]] +name = "pandas" +version = "3.0.1" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.11" +groups = ["dev"] +files = [ + {file = "pandas-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:de09668c1bf3b925c07e5762291602f0d789eca1b3a781f99c1c78f6cac0e7ea"}, + {file = "pandas-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:24ba315ba3d6e5806063ac6eb717504e499ce30bd8c236d8693a5fd3f084c796"}, + {file = "pandas-3.0.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:406ce835c55bac912f2a0dcfaf27c06d73c6b04a5dde45f1fd3169ce31337389"}, + {file = "pandas-3.0.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:830994d7e1f31dd7e790045235605ab61cff6c94defc774547e8b7fdfbff3dc7"}, + {file = "pandas-3.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a64ce8b0f2de1d2efd2ae40b0abe7f8ae6b29fbfb3812098ed5a6f8e235ad9bf"}, + {file = "pandas-3.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9832c2c69da24b602c32e0c7b1b508a03949c18ba08d4d9f1c1033426685b447"}, + {file = "pandas-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:84f0904a69e7365f79a0c77d3cdfccbfb05bf87847e3a51a41e1426b0edb9c79"}, + {file = "pandas-3.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:4a68773d5a778afb31d12e34f7dd4612ab90de8c6fb1d8ffe5d4a03b955082a1"}, + {file = "pandas-3.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:476f84f8c20c9f5bc47252b66b4bb25e1a9fc2fa98cead96744d8116cb85771d"}, + {file = "pandas-3.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0ab749dfba921edf641d4036c4c21c0b3ea70fea478165cb98a998fb2a261955"}, + {file = "pandas-3.0.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8e36891080b87823aff3640c78649b91b8ff6eea3c0d70aeabd72ea43ab069b"}, + {file = "pandas-3.0.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:532527a701281b9dd371e2f582ed9094f4c12dd9ffb82c0c54ee28d8ac9520c4"}, + {file = "pandas-3.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:356e5c055ed9b0da1580d465657bc7d00635af4fd47f30afb23025352ba764d1"}, + {file = "pandas-3.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9d810036895f9ad6345b8f2a338dd6998a74e8483847403582cab67745bff821"}, + {file = "pandas-3.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:536232a5fe26dd989bd633e7a0c450705fdc86a207fec7254a55e9a22950fe43"}, + {file = "pandas-3.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f463ebfd8de7f326d38037c7363c6dacb857c5881ab8961fb387804d6daf2f7"}, + {file = "pandas-3.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5272627187b5d9c20e55d27caf5f2cd23e286aba25cadf73c8590e432e2b7262"}, + {file = "pandas-3.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:661e0f665932af88c7877f31da0dc743fe9c8f2524bdffe23d24fdcb67ef9d56"}, + {file = "pandas-3.0.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75e6e292ff898679e47a2199172593d9f6107fd2dd3617c22c2946e97d5df46e"}, + {file = "pandas-3.0.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1ff8cf1d2896e34343197685f432450ec99a85ba8d90cce2030c5eee2ef98791"}, + {file = "pandas-3.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:eca8b4510f6763f3d37359c2105df03a7a221a508f30e396a51d0713d462e68a"}, + {file = "pandas-3.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:06aff2ad6f0b94a17822cf8b83bbb563b090ed82ff4fe7712db2ce57cd50d9b8"}, + {file = "pandas-3.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9fea306c783e28884c29057a1d9baa11a349bbf99538ec1da44c8476563d1b25"}, + {file = "pandas-3.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:a8d37a43c52917427e897cb2e429f67a449327394396a81034a4449b99afda59"}, + {file = "pandas-3.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d54855f04f8246ed7b6fc96b05d4871591143c46c0b6f4af874764ed0d2d6f06"}, + {file = "pandas-3.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e1b677accee34a09e0dc2ce5624e4a58a1870ffe56fc021e9caf7f23cd7668f"}, + {file = "pandas-3.0.1-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a9cabbdcd03f1b6cd254d6dda8ae09b0252524be1592594c00b7895916cb1324"}, + {file = "pandas-3.0.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ae2ab1f166668b41e770650101e7090824fd34d17915dd9cd479f5c5e0065e9"}, + {file = "pandas-3.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6bf0603c2e30e2cafac32807b06435f28741135cb8697eae8b28c7d492fc7d76"}, + {file = "pandas-3.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c426422973973cae1f4a23e51d4ae85974f44871b24844e4f7de752dd877098"}, + {file = "pandas-3.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b03f91ae8c10a85c1613102c7bef5229b5379f343030a3ccefeca8a33414cf35"}, + {file = "pandas-3.0.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:99d0f92ed92d3083d140bf6b97774f9f13863924cf3f52a70711f4e7588f9d0a"}, + {file = "pandas-3.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3b66857e983208654294bb6477b8a63dee26b37bdd0eb34d010556e91261784f"}, + {file = "pandas-3.0.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56cf59638bf24dc9bdf2154c81e248b3289f9a09a6d04e63608c159022352749"}, + {file = "pandas-3.0.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1a9f55e0f46951874b863d1f3906dcb57df2d9be5c5847ba4dfb55b2c815249"}, + {file = "pandas-3.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1849f0bba9c8a2fb0f691d492b834cc8dadf617e29015c66e989448d58d011ee"}, + {file = "pandas-3.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c3d288439e11b5325b02ae6e9cc83e6805a62c40c5a6220bea9beb899c073b1c"}, + {file = "pandas-3.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:93325b0fe372d192965f4cca88d97667f49557398bbf94abdda3bf1b591dbe66"}, + {file = "pandas-3.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:97ca08674e3287c7148f4858b01136f8bdfe7202ad25ad04fec602dd1d29d132"}, + {file = "pandas-3.0.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:58eeb1b2e0fb322befcf2bbc9ba0af41e616abadb3d3414a6bc7167f6cbfce32"}, + {file = "pandas-3.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cd9af1276b5ca9e298bd79a26bda32fa9cc87ed095b2a9a60978d2ca058eaf87"}, + {file = "pandas-3.0.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94f87a04984d6b63788327cd9f79dda62b7f9043909d2440ceccf709249ca988"}, + {file = "pandas-3.0.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85fe4c4df62e1e20f9db6ebfb88c844b092c22cd5324bdcf94bfa2fc1b391221"}, + {file = "pandas-3.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:331ca75a2f8672c365ae25c0b29e46f5ac0c6551fdace8eec4cd65e4fac271ff"}, + {file = "pandas-3.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:15860b1fdb1973fffade772fdb931ccf9b2f400a3f5665aef94a00445d7d8dd5"}, + {file = "pandas-3.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:44f1364411d5670efa692b146c748f4ed013df91ee91e9bec5677fb1fd58b937"}, + {file = "pandas-3.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:108dd1790337a494aa80e38def654ca3f0968cf4f362c85f44c15e471667102d"}, + {file = "pandas-3.0.1.tar.gz", hash = "sha256:4186a699674af418f655dbd420ed87f50d56b4cd6603784279d9eef6627823c8"}, +] + +[package.dependencies] +numpy = [ + {version = ">=1.26.0", markers = "python_version < \"3.14\""}, + {version = ">=2.3.3", markers = "python_version >= \"3.14\""}, +] +python-dateutil = ">=2.8.2" +tzdata = {version = "*", markers = "sys_platform == \"win32\" or sys_platform == \"emscripten\""} + +[package.extras] +all = ["PyQt5 (>=5.15.9)", "SQLAlchemy (>=2.0.36)", "adbc-driver-postgresql (>=1.2.0)", "adbc-driver-sqlite (>=1.2.0)", "beautifulsoup4 (>=4.12.3)", "bottleneck (>=1.4.2)", "fastparquet (>=2024.11.0)", "fsspec (>=2024.10.0)", "gcsfs (>=2024.10.0)", "html5lib (>=1.1)", "hypothesis (>=6.116.0)", "jinja2 (>=3.1.5)", "lxml (>=5.3.0)", "matplotlib (>=3.9.3)", "numba (>=0.60.0)", "numexpr (>=2.10.2)", "odfpy (>=1.4.1)", "openpyxl (>=3.1.5)", "psycopg2 (>=2.9.10)", "pyarrow (>=13.0.0)", "pyiceberg (>=0.8.1)", "pymysql (>=1.1.1)", "pyreadstat (>=1.2.8)", "pytest (>=8.3.4)", "pytest-xdist (>=3.6.1)", "python-calamine (>=0.3.0)", "pytz (>=2024.2)", "pyxlsb (>=1.0.10)", "qtpy (>=2.4.2)", "s3fs (>=2024.10.0)", "scipy (>=1.14.1)", "tables (>=3.10.1)", "tabulate (>=0.9.0)", "xarray (>=2024.10.0)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.2.0)", "zstandard (>=0.23.0)"] +aws = ["s3fs (>=2024.10.0)"] +clipboard = ["PyQt5 (>=5.15.9)", "qtpy (>=2.4.2)"] +compression = ["zstandard (>=0.23.0)"] +computation = ["scipy (>=1.14.1)", "xarray (>=2024.10.0)"] +excel = ["odfpy (>=1.4.1)", "openpyxl (>=3.1.5)", "python-calamine (>=0.3.0)", "pyxlsb (>=1.0.10)", "xlrd (>=2.0.1)", "xlsxwriter (>=3.2.0)"] +feather = ["pyarrow (>=13.0.0)"] +fss = ["fsspec (>=2024.10.0)"] +gcp = ["gcsfs (>=2024.10.0)"] +hdf5 = ["tables (>=3.10.1)"] +html = ["beautifulsoup4 (>=4.12.3)", "html5lib (>=1.1)", "lxml (>=5.3.0)"] +iceberg = ["pyiceberg (>=0.8.1)"] +mysql = ["SQLAlchemy (>=2.0.36)", "pymysql (>=1.1.1)"] +output-formatting = ["jinja2 (>=3.1.5)", "tabulate (>=0.9.0)"] +parquet = ["pyarrow (>=13.0.0)"] +performance = ["bottleneck (>=1.4.2)", "numba (>=0.60.0)", "numexpr (>=2.10.2)"] +plot = ["matplotlib (>=3.9.3)"] +postgresql = ["SQLAlchemy (>=2.0.36)", "adbc-driver-postgresql (>=1.2.0)", "psycopg2 (>=2.9.10)"] +pyarrow = ["pyarrow (>=13.0.0)"] +spss = ["pyreadstat (>=1.2.8)"] +sql-other = ["SQLAlchemy (>=2.0.36)", "adbc-driver-postgresql (>=1.2.0)", "adbc-driver-sqlite (>=1.2.0)"] +test = ["hypothesis (>=6.116.0)", "pytest (>=8.3.4)", "pytest-xdist (>=3.6.1)"] +timezone = ["pytz (>=2024.2)"] +xml = ["lxml (>=5.3.0)"] + [[package]] name = "pandocfilters" version = "1.5.1" @@ -4089,7 +4208,7 @@ version = "12.1.1" description = "Python Imaging Library (fork)" optional = false python-versions = ">=3.10" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "pillow-12.1.1-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1f1625b72740fdda5d77b4def688eb8fd6490975d06b909fd19f13f391e077e0"}, {file = "pillow-12.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:178aa072084bd88ec759052feca8e56cbb14a60b39322b99a049e58090479713"}, @@ -4698,7 +4817,7 @@ version = "3.3.2" description = "pyparsing - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" -groups = ["main"] +groups = ["main", "dev"] files = [ {file = "pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d"}, {file = "pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc"}, @@ -4766,6 +4885,52 @@ pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] +[[package]] +name = "python-copasi" +version = "4.46.300" +description = "COPASI Python API" +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "python_copasi-4.46.300-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6fd5709ca1a78428a163d1a203fea7a0decc69fcd5f8438ddfa5bbaf2d31981"}, + {file = "python_copasi-4.46.300-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8940425b288cf5f52cd99deb69e848d6ffe99b8b02208cfcc486f19fa4918b1a"}, + {file = "python_copasi-4.46.300-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2fa40e04006d540b6bca1e9cd59e16c15c96854c530c620676519b3edec12d36"}, + {file = "python_copasi-4.46.300-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f01ed153041a37b0c29d5a03c5244e0ff1874eacebe735c670ae140846dc6421"}, + {file = "python_copasi-4.46.300-cp310-cp310-win_amd64.whl", hash = "sha256:9e5d5995ea2ac11845b8e314984390a4cc38bc0ebec226b890fb173c39c64322"}, + {file = "python_copasi-4.46.300-cp310-cp310-win_arm64.whl", hash = "sha256:cb425ef95950f55ade364f7b3fad02df555e2fc061f5dd8b79c7c2e17e2e6307"}, + {file = "python_copasi-4.46.300-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:df42f6d83dfa376ef70ee53d58fb15a22f10aa1b61fd6f52892a9825d3b0044d"}, + {file = "python_copasi-4.46.300-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3109e67caea1fa1318778769ec985c1aa5878c19237e73189115cbd83b665f0e"}, + {file = "python_copasi-4.46.300-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1adaadcfd881f4dd160fdde41a03114c42c1d5205a28b4e4d66dff2f7361d66d"}, + {file = "python_copasi-4.46.300-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99d6561f0b150605d7b2782af121fbf2597786b48e0ca7139d02e2cf2f98cc89"}, + {file = "python_copasi-4.46.300-cp311-cp311-win_amd64.whl", hash = "sha256:bca6e68c47011745edaa06d4391fd102192c758540acc2fa5e5a2d2ff20d2986"}, + {file = "python_copasi-4.46.300-cp311-cp311-win_arm64.whl", hash = "sha256:5b68a8bee537e7b62d883341818cc56356cdaf64356dd50ef20bbc77845c6189"}, + {file = "python_copasi-4.46.300-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c288312bfd4841aa549df92fcf070581c2cd71d7ca1b3f6ffdb9c5c551b35bf"}, + {file = "python_copasi-4.46.300-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d5b3d6ab846e7f7ee1dd6d0bc8ae2df8b3272434ff6b30a4d38fa0745ffc45f5"}, + {file = "python_copasi-4.46.300-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ba3be336f892c76df37c0311ce42beea6ff506db0acd1ff2ea93c357403e73"}, + {file = "python_copasi-4.46.300-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:033d21faecc6f981355e6307c1fdebc9029838cf942597caa145d870ff3f445a"}, + {file = "python_copasi-4.46.300-cp312-cp312-win_amd64.whl", hash = "sha256:1e057f94ad6bfe35bf457a7f8b6a3dbb776d44df0772e7e5dc2be54ede0fb072"}, + {file = "python_copasi-4.46.300-cp312-cp312-win_arm64.whl", hash = "sha256:d6fc0cc65a70ed6c23aad200d6501ddf13ea07515e7aab5ea376f354dabf30e1"}, + {file = "python_copasi-4.46.300-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:aba072a1ae075d04148cc37e9493ea79ac0c8474bca06b13c39521f802645a57"}, + {file = "python_copasi-4.46.300-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4355d1289de105bd51b86cd2ef64aeaa3c9921753de173eba37e5225e3268186"}, + {file = "python_copasi-4.46.300-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fd98fa69c13c149b4fb86a387ef240615ee5f32b0395a38ad8efaf77eed00ee6"}, + {file = "python_copasi-4.46.300-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6a2a8a45ee9cf8404f950082425cb8f11a53cf70dccc5cb95082ab166d70fe5b"}, + {file = "python_copasi-4.46.300-cp313-cp313-win_amd64.whl", hash = "sha256:63cacffe4a651c42e14d1d3f5dc156602df0c150fde1bcf62f6652043c63efd2"}, + {file = "python_copasi-4.46.300-cp313-cp313-win_arm64.whl", hash = "sha256:c889b184290d6d7ef1cd09daa3b01656c567ef4781cd1c9e1a21b27534661c83"}, + {file = "python_copasi-4.46.300-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e25a9159f8958550a75546e8fe734d621cb616ac108761e98179d948c957bd05"}, + {file = "python_copasi-4.46.300-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1bd8bdfc6e4dc16202a8d867f87012a7861503df952989422cd013e3dc6e8062"}, + {file = "python_copasi-4.46.300-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44d691f5960b72c0265f2c360bb1b74e3ceaafdfe175c13f3f715d18684a6268"}, + {file = "python_copasi-4.46.300-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a08864ab379d893ea13efd4691b6dd924131dc98530180d9df86068cabe4ba1a"}, + {file = "python_copasi-4.46.300-cp314-cp314-win_amd64.whl", hash = "sha256:f79af84864bc12fd7d64050a0d84cf27f8d2a2f3bf7fe3dc36a652873ebe2f3d"}, + {file = "python_copasi-4.46.300-cp314-cp314-win_arm64.whl", hash = "sha256:b858704aa061c059d6a21a505c8657b65bfdbd412724bfe414a4cb83bfbfb595"}, + {file = "python_copasi-4.46.300-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2659dc1a983779e5c8d64bf360f4eb0ca169ad8a362d7639c800a5d6d7e4d529"}, + {file = "python_copasi-4.46.300-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18d878482d15f514be7a84131f576718a11c59869ff7569a7a86b9f8c2744bd5"}, + {file = "python_copasi-4.46.300-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:554f4fa303e1cf9742d084d7a33bdaf74ff0531ae4e3753624226e5c4d11234a"}, + {file = "python_copasi-4.46.300-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f2a928bf697baed5579c8aa005bdb21078c8e6f2798685c0409242e7f8c656e"}, + {file = "python_copasi-4.46.300-cp39-cp39-win_amd64.whl", hash = "sha256:00ce8b8eb18833d4fee3edb4b1db3b18ae3d06569204c87d2a67bc3af61b123e"}, + {file = "python_copasi-4.46.300-cp39-cp39-win_arm64.whl", hash = "sha256:5fa56797ccfa4b2fd8ddd99bcbb353f7e70af3f2369c97cd291d6b7e2ebdc720"}, +] + [[package]] name = "python-dateutil" version = "2.9.0.post0" @@ -5397,6 +5562,85 @@ files = [ {file = "rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84"}, ] +[[package]] +name = "scipy" +version = "1.17.1" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.11" +groups = ["dev"] +files = [ + {file = "scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec"}, + {file = "scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696"}, + {file = "scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee"}, + {file = "scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd"}, + {file = "scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c"}, + {file = "scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4"}, + {file = "scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444"}, + {file = "scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082"}, + {file = "scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff"}, + {file = "scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d"}, + {file = "scipy-1.17.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:35c3a56d2ef83efc372eaec584314bd0ef2e2f0d2adb21c55e6ad5b344c0dcb8"}, + {file = "scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76"}, + {file = "scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086"}, + {file = "scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b"}, + {file = "scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21"}, + {file = "scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458"}, + {file = "scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb"}, + {file = "scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea"}, + {file = "scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87"}, + {file = "scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3"}, + {file = "scipy-1.17.1-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:5e3c5c011904115f88a39308379c17f91546f77c1667cea98739fe0fccea804c"}, + {file = "scipy-1.17.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:6fac755ca3d2c3edcb22f479fceaa241704111414831ddd3bc6056e18516892f"}, + {file = "scipy-1.17.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:7ff200bf9d24f2e4d5dc6ee8c3ac64d739d3a89e2326ba68aaf6c4a2b838fd7d"}, + {file = "scipy-1.17.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:4b400bdc6f79fa02a4d86640310dde87a21fba0c979efff5248908c6f15fad1b"}, + {file = "scipy-1.17.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b64ca7d4aee0102a97f3ba22124052b4bd2152522355073580bf4845e2550b6"}, + {file = "scipy-1.17.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:581b2264fc0aa555f3f435a5944da7504ea3a065d7029ad60e7c3d1ae09c5464"}, + {file = "scipy-1.17.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:beeda3d4ae615106d7094f7e7cef6218392e4465cc95d25f900bebabfded0950"}, + {file = "scipy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6609bc224e9568f65064cfa72edc0f24ee6655b47575954ec6339534b2798369"}, + {file = "scipy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:37425bc9175607b0268f493d79a292c39f9d001a357bebb6b88fdfaff13f6448"}, + {file = "scipy-1.17.1-cp313-cp313-win_arm64.whl", hash = "sha256:5cf36e801231b6a2059bf354720274b7558746f3b1a4efb43fcf557ccd484a87"}, + {file = "scipy-1.17.1-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:d59c30000a16d8edc7e64152e30220bfbd724c9bbb08368c054e24c651314f0a"}, + {file = "scipy-1.17.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:010f4333c96c9bb1a4516269e33cb5917b08ef2166d5556ca2fd9f082a9e6ea0"}, + {file = "scipy-1.17.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2ceb2d3e01c5f1d83c4189737a42d9cb2fc38a6eeed225e7515eef71ad301dce"}, + {file = "scipy-1.17.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:844e165636711ef41f80b4103ed234181646b98a53c8f05da12ca5ca289134f6"}, + {file = "scipy-1.17.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:158dd96d2207e21c966063e1635b1063cd7787b627b6f07305315dd73d9c679e"}, + {file = "scipy-1.17.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74cbb80d93260fe2ffa334efa24cb8f2f0f622a9b9febf8b483c0b865bfb3475"}, + {file = "scipy-1.17.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dbc12c9f3d185f5c737d801da555fb74b3dcfa1a50b66a1a93e09190f41fab50"}, + {file = "scipy-1.17.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94055a11dfebe37c656e70317e1996dc197e1a15bbcc351bcdd4610e128fe1ca"}, + {file = "scipy-1.17.1-cp313-cp313t-win_amd64.whl", hash = "sha256:e30bdeaa5deed6bc27b4cc490823cd0347d7dae09119b8803ae576ea0ce52e4c"}, + {file = "scipy-1.17.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a720477885a9d2411f94a93d16f9d89bad0f28ca23c3f8daa521e2dcc3f44d49"}, + {file = "scipy-1.17.1-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:a48a72c77a310327f6a3a920092fa2b8fd03d7deaa60f093038f22d98e096717"}, + {file = "scipy-1.17.1-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:45abad819184f07240d8a696117a7aacd39787af9e0b719d00285549ed19a1e9"}, + {file = "scipy-1.17.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3fd1fcdab3ea951b610dc4cef356d416d5802991e7e32b5254828d342f7b7e0b"}, + {file = "scipy-1.17.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7bdf2da170b67fdf10bca777614b1c7d96ae3ca5794fd9587dce41eb2966e866"}, + {file = "scipy-1.17.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:adb2642e060a6549c343603a3851ba76ef0b74cc8c079a9a58121c7ec9fe2350"}, + {file = "scipy-1.17.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eee2cfda04c00a857206a4330f0c5e3e56535494e30ca445eb19ec624ae75118"}, + {file = "scipy-1.17.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d2650c1fb97e184d12d8ba010493ee7b322864f7d3d00d3f9bb97d9c21de4068"}, + {file = "scipy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:08b900519463543aa604a06bec02461558a6e1cef8fdbb8098f77a48a83c8118"}, + {file = "scipy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:3877ac408e14da24a6196de0ddcace62092bfc12a83823e92e49e40747e52c19"}, + {file = "scipy-1.17.1-cp314-cp314-win_arm64.whl", hash = "sha256:f8885db0bc2bffa59d5c1b72fad7a6a92d3e80e7257f967dd81abb553a90d293"}, + {file = "scipy-1.17.1-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:1cc682cea2ae55524432f3cdff9e9a3be743d52a7443d0cba9017c23c87ae2f6"}, + {file = "scipy-1.17.1-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:2040ad4d1795a0ae89bfc7e8429677f365d45aa9fd5e4587cf1ea737f927b4a1"}, + {file = "scipy-1.17.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:131f5aaea57602008f9822e2115029b55d4b5f7c070287699fe45c661d051e39"}, + {file = "scipy-1.17.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:9cdc1a2fcfd5c52cfb3045feb399f7b3ce822abdde3a193a6b9a60b3cb5854ca"}, + {file = "scipy-1.17.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e3dcd57ab780c741fde8dc68619de988b966db759a3c3152e8e9142c26295ad"}, + {file = "scipy-1.17.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a9956e4d4f4a301ebf6cde39850333a6b6110799d470dbbb1e25326ac447f52a"}, + {file = "scipy-1.17.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:a4328d245944d09fd639771de275701ccadf5f781ba0ff092ad141e017eccda4"}, + {file = "scipy-1.17.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a77cbd07b940d326d39a1d1b37817e2ee4d79cb30e7338f3d0cddffae70fcaa2"}, + {file = "scipy-1.17.1-cp314-cp314t-win_amd64.whl", hash = "sha256:eb092099205ef62cd1782b006658db09e2fed75bffcae7cc0d44052d8aa0f484"}, + {file = "scipy-1.17.1-cp314-cp314t-win_arm64.whl", hash = "sha256:200e1050faffacc162be6a486a984a0497866ec54149a01270adc8a59b7c7d21"}, + {file = "scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0"}, +] + +[package.dependencies] +numpy = ">=1.26.4,<2.7" + +[package.extras] +dev = ["click (<8.3.0)", "cython-lint (>=0.12.2)", "mypy (==1.10.0)", "pycodestyle", "ruff (>=0.12.0)", "spin", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)", "tabulate"] +test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + [[package]] name = "scooby" version = "0.11.0" @@ -6372,4 +6616,4 @@ jupyter = ["ipytree (>=0.2.2)", "ipywidgets (>=8.0.0)", "notebook"] [metadata] lock-version = "2.1" python-versions = ">=3.11,<4.0" -content-hash = "f46b382dbfd14dce0832a5dcdbdb22dfa1dc2860b47f4bf61c8bc1a173af5abb" +content-hash = "e691fc1fdfafb6e3b99e14a8c35eac6869e2bd86c81770312ccd3bd918c259e8" diff --git a/pyproject.toml b/pyproject.toml index 7ea2a9b..cd9f3c5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -53,6 +53,7 @@ notebook = "^7.3.2" lxml-stubs = "^0.5.1" trame-jupyter-extension = "^2.1.4" ipywidgets = "^8.1.5" +copasi-basico = ">=0.65" [tool.poetry.group.docs.dependencies] mkdocs = "^1.6.1" diff --git a/tests/_internal/simdata/vtk_test.py b/tests/_internal/simdata/vtk_test.py index 6f1ff6d..7b1b97c 100644 --- a/tests/_internal/simdata/vtk_test.py +++ b/tests/_internal/simdata/vtk_test.py @@ -24,7 +24,8 @@ @pytest.mark.skipif(IN_GITHUB_ACTIONS, reason="Test doesn't work in Github Actions.") def test_vtk(solver_output_path: Path, solver_output_simid_jobid: tuple[int, int], zarr_path: Path) -> None: - with tempfile.TemporaryDirectory() as tmpdirname, Path(tmpdirname) as tmp_dir: + with tempfile.TemporaryDirectory() as tmpdirname: + tmp_dir = Path(tmpdirname) sim_id, job_id = solver_output_simid_jobid result = Result(solver_output_dir=solver_output_path, sim_id=sim_id, job_id=job_id, zarr_dir=tmp_dir) mesh: CartesianMesh = result.mesh diff --git a/tests/conftest.py b/tests/conftest.py index b695ff1..8fb0822 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -31,6 +31,9 @@ def pytest_addoption(parser: pytest.Parser) -> None: parser.addoption( "--run-remote", action="store_true", default=False, help="Run authenticated remote integration tests" ) + parser.addoption( + "--run-interactive", action="store_true", default=False, help="Run notebooks requiring trame/display server" + ) @pytest.fixture diff --git a/tests/examples/__init__.py b/tests/examples/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/examples/test_example_notebooks.py b/tests/examples/test_example_notebooks.py new file mode 100644 index 0000000..d7b282b --- /dev/null +++ b/tests/examples/test_example_notebooks.py @@ -0,0 +1,156 @@ +"""Lint and optionally execute example notebooks. + +Static checks (ruff) run on all notebooks by default. +Execution tests are split into tiers: + +- Default: notebooks that run headless without auth or display server +- --run-interactive: notebooks requiring trame/display server +- --run-remote: notebooks requiring VCell server auth + +Usage: + poetry run pytest tests/examples/test_example_notebooks.py -v # lint all, execute safe ones + poetry run pytest tests/examples/test_example_notebooks.py -v --run-interactive # also run trame notebooks + poetry run pytest tests/examples/test_example_notebooks.py -v --run-remote # also run auth notebooks +""" + +from __future__ import annotations + +import os +import subprocess +import sys +from pathlib import Path + +import pytest + +NOTEBOOKS_DIR = Path(__file__).resolve().parents[2] / "examples" / "notebooks" + +# Notebooks that need interactive trame/display server +INTERACTIVE_NOTEBOOKS = {"fielddata_trame", "widget"} + +# Notebooks that need VCell server auth +REMOTE_NOTEBOOKS = {"_internal_vcell_publications", "_internal_n5_download_demo"} + +# Notebooks that can't be executed in CI +NO_EXECUTE_NOTEBOOKS: set[str] = set() + +notebook_paths = sorted(NOTEBOOKS_DIR.glob("*.ipynb")) + + +def pytest_configure(config: pytest.Config) -> None: + config.addinivalue_line("markers", "interactive: requires trame/display server") + config.addinivalue_line("markers", "remote: requires VCell server auth") + + +# --------------------------------------------------------------------------- +# Static lint checks (all notebooks) +# --------------------------------------------------------------------------- + + +@pytest.mark.parametrize( + "notebook", + notebook_paths, + ids=[p.stem for p in notebook_paths], +) +def test_notebook_lint(notebook: Path, tmp_path: Path) -> None: + """Export notebook to .py and run mypy type checks.""" + # Export to Python script + result = subprocess.run( # noqa: S603 + [ + sys.executable, + "-m", + "jupyter", + "nbconvert", + "--to", + "script", + "--output-dir", + str(tmp_path), + str(notebook), + ], + capture_output=True, + text=True, + timeout=30, + ) + assert result.returncode == 0, f"nbconvert failed for {notebook.name}:\n{result.stderr}" + + # Find the exported .py file + py_files = list(tmp_path.glob("*.py")) + assert len(py_files) == 1, f"Expected 1 .py file, got {len(py_files)}" + py_file = py_files[0] + + # Run mypy (same approach as scripts/check_notebooks.sh) + result = subprocess.run( # noqa: S603 + [ + sys.executable, + "-m", + "mypy", + "--ignore-missing-imports", + str(py_file), + ], + capture_output=True, + text=True, + timeout=60, + ) + # Filter out errors inherent to notebook-as-script conversion: + # - top-level-await: valid in Jupyter kernels + # - name-defined: Jupyter builtins like display, In + # - union-attr: biomodel.model is Model | None, notebooks don't guard + # - no-redef: notebooks reuse variable names across cells + # - no-untyped-call: Jupyter builtins like display are untyped + # - attr-defined on generated API code: not explicitly exported + notebook_noise = {"top-level-await", "name-defined", "union-attr", "no-redef", "no-untyped-call"} + errors = [ + line + for line in result.stdout.strip().splitlines() + if "error:" in line and not any(f"[{code}]" in line for code in notebook_noise) + ] + assert not errors, f"Type errors in {notebook.name}:\n" + "\n".join(errors) + + +# --------------------------------------------------------------------------- +# Execution checks (tiered) +# --------------------------------------------------------------------------- + + +def _should_execute(notebook_stem: str, request: pytest.FixtureRequest) -> None: + """Skip notebooks based on their tier and available flags.""" + if notebook_stem in NO_EXECUTE_NOTEBOOKS: + pytest.skip(f"{notebook_stem} requires local data files not available in CI") + if notebook_stem in INTERACTIVE_NOTEBOOKS: + if not request.config.getoption("--run-interactive", default=False): + pytest.skip(f"{notebook_stem} requires --run-interactive flag (needs trame/display)") + if notebook_stem in REMOTE_NOTEBOOKS: + if not request.config.getoption("--run-remote", default=False): + pytest.skip(f"{notebook_stem} requires --run-remote flag (needs VCell auth)") + + +@pytest.mark.parametrize( + "notebook", + notebook_paths, + ids=[p.stem for p in notebook_paths], +) +def test_notebook_executes(notebook: Path, tmp_path: Path, request: pytest.FixtureRequest) -> None: + """Run a notebook with nbconvert --execute and assert zero exit code.""" + _should_execute(notebook.stem, request) + + output = tmp_path / notebook.name + result = subprocess.run( # noqa: S603 + [ + sys.executable, + "-m", + "jupyter", + "nbconvert", + "--to", + "notebook", + "--execute", + "--output", + str(output), + str(notebook), + ], + capture_output=True, + text=True, + timeout=300, + env={**os.environ, "MPLBACKEND": "Agg"}, + ) + assert ( + result.returncode == 0 + ), f"Notebook {notebook.name} failed:\nSTDOUT:\n{result.stdout}\nSTDERR:\n{result.stderr}" diff --git a/tests/guides/test_notebooks.py b/tests/guides/test_notebooks.py index 3db74db..0230aad 100644 --- a/tests/guides/test_notebooks.py +++ b/tests/guides/test_notebooks.py @@ -10,7 +10,7 @@ NOTEBOOKS_DIR = Path(__file__).resolve().parents[2] / "docs" / "guides" / "notebooks" -SKIP_NOTEBOOKS = {"remote-simulations"} +REMOTE_NOTEBOOKS = {"remote-simulations"} notebook_paths = sorted(NOTEBOOKS_DIR.glob("*.ipynb")) @@ -20,11 +20,13 @@ notebook_paths, ids=[p.stem for p in notebook_paths], ) -def test_notebook_executes(notebook: Path, tmp_path: Path) -> None: +def test_notebook_executes(notebook: Path, tmp_path: Path, request: pytest.FixtureRequest) -> None: """Run a notebook with nbconvert --execute and assert zero exit code.""" - if notebook.stem in SKIP_NOTEBOOKS: - pytest.skip(f"{notebook.name} requires interactive auth and a live server") + if notebook.stem in REMOTE_NOTEBOOKS and not request.config.getoption("--run-remote", default=False): + pytest.skip(f"{notebook.name} requires --run-remote flag (needs VCell auth)") output = tmp_path / notebook.name + # Remote notebooks run full simulations on the VCell cluster — need longer timeout + timeout = 600 if notebook.stem in REMOTE_NOTEBOOKS else 300 result = subprocess.run( # noqa: S603 [ sys.executable, @@ -40,7 +42,7 @@ def test_notebook_executes(notebook: Path, tmp_path: Path) -> None: ], capture_output=True, text=True, - timeout=300, + timeout=timeout, env={**__import__("os").environ, "MPLBACKEND": "Agg"}, ) assert ( diff --git a/tests/sim_results/test_result.py b/tests/sim_results/test_result.py index 712a9fb..5084f24 100644 --- a/tests/sim_results/test_result.py +++ b/tests/sim_results/test_result.py @@ -17,7 +17,8 @@ @pytest.mark.skipif(IN_GITHUB_ACTIONS, reason="Test doesn't work in Github Actions.") def test_plot_slice_2D(solver_output_path: Path, solver_output_simid_jobid: tuple[int, int], zarr_path: Path) -> None: - with tempfile.TemporaryDirectory() as dirname, Path(dirname) as tmp_dir: + with tempfile.TemporaryDirectory() as dirname: + tmp_dir = Path(dirname) sim_id, job_id = solver_output_simid_jobid result = Result(solver_output_dir=solver_output_path, sim_id=sim_id, job_id=job_id, zarr_dir=tmp_dir) From c95602d4b6ca5647639d50b296806045f0f03ba9 Mon Sep 17 00:00:00 2001 From: Jim Schaff Date: Fri, 27 Mar 2026 22:35:42 -0400 Subject: [PATCH 06/10] Gitignore generated .vtu and .json files in examples/solver_output Co-Authored-By: Claude Opus 4.6 (1M context) --- .gitignore | 2 ++ tests/examples/test_example_notebooks.py | 10 ++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index ca82aa5..e3128f9 100644 --- a/.gitignore +++ b/.gitignore @@ -178,6 +178,8 @@ test_output_1/ examples/test_output/SimID_* /examples/notebooks/*.py /examples/solver_output/zarr/ +/examples/solver_output/*.vtu +/examples/solver_output/*.json examples/notebooks/workspace/ diff --git a/tests/examples/test_example_notebooks.py b/tests/examples/test_example_notebooks.py index d7b282b..f10850b 100644 --- a/tests/examples/test_example_notebooks.py +++ b/tests/examples/test_example_notebooks.py @@ -115,12 +115,10 @@ def _should_execute(notebook_stem: str, request: pytest.FixtureRequest) -> None: """Skip notebooks based on their tier and available flags.""" if notebook_stem in NO_EXECUTE_NOTEBOOKS: pytest.skip(f"{notebook_stem} requires local data files not available in CI") - if notebook_stem in INTERACTIVE_NOTEBOOKS: - if not request.config.getoption("--run-interactive", default=False): - pytest.skip(f"{notebook_stem} requires --run-interactive flag (needs trame/display)") - if notebook_stem in REMOTE_NOTEBOOKS: - if not request.config.getoption("--run-remote", default=False): - pytest.skip(f"{notebook_stem} requires --run-remote flag (needs VCell auth)") + if notebook_stem in INTERACTIVE_NOTEBOOKS and not request.config.getoption("--run-interactive", default=False): + pytest.skip(f"{notebook_stem} requires --run-interactive flag (needs trame/display)") + if notebook_stem in REMOTE_NOTEBOOKS and not request.config.getoption("--run-remote", default=False): + pytest.skip(f"{notebook_stem} requires --run-remote flag (needs VCell auth)") @pytest.mark.parametrize( From f1aaa8c8e4491892259db070da8c9813fb0e238d Mon Sep 17 00:00:00 2001 From: Jim Schaff Date: Fri, 27 Mar 2026 22:46:32 -0400 Subject: [PATCH 07/10] Fix EOF newline in notebook and update project overview Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/guides/notebooks/remote-simulations.ipynb | 2 +- docs/project-overview.md | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/guides/notebooks/remote-simulations.ipynb b/docs/guides/notebooks/remote-simulations.ipynb index fef8ba4..0bf9977 100644 --- a/docs/guides/notebooks/remote-simulations.ipynb +++ b/docs/guides/notebooks/remote-simulations.ipynb @@ -121,4 +121,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} \ No newline at end of file +} diff --git a/docs/project-overview.md b/docs/project-overview.md index 7c2147e..020bf92 100644 --- a/docs/project-overview.md +++ b/docs/project-overview.md @@ -79,11 +79,11 @@ for kf in [0.1, 1.0, 10.0]: ## Architecture summary -| Layer | Technology | Role | -| --- | --- | --- | -| Python datamodels | Pydantic/dataclasses | Model authoring, manipulation, essential VCell concepts | -| libvcell | Java via GraalVM native compilation | Validation, math generation, solver preprocessing | -| Solvers | C++ via pybind11/scikit-build-core | Local finite volume, ODE, stochastic, rule-based simulation | -| VCell API | OpenAPI generated client | Remote simulation, model storage, result export | -| Data access | Zarr, N5/TensorStore, VTK | Local and remote result retrieval | -| Visualization | Matplotlib, PyVista, Trame | 2D/3D plotting, animations, interactive Jupyter widgets | +| Layer | Technology | Role | +| ----------------- | ----------------------------------- | ----------------------------------------------------------- | +| Python datamodels | Pydantic/dataclasses | Model authoring, manipulation, essential VCell concepts | +| libvcell | Java via GraalVM native compilation | Validation, math generation, solver preprocessing | +| Solvers | C++ via pybind11/scikit-build-core | Local finite volume, ODE, stochastic, rule-based simulation | +| VCell API | OpenAPI generated client | Remote simulation, model storage, result export | +| Data access | Zarr, N5/TensorStore, VTK | Local and remote result retrieval | +| Visualization | Matplotlib, PyVista, Trame | 2D/3D plotting, animations, interactive Jupyter widgets | From 92135d606f0e7d0a4d5add4791a9e5553c438b45 Mon Sep 17 00:00:00 2001 From: Jim Schaff Date: Sun, 29 Mar 2026 16:30:15 -0400 Subject: [PATCH 08/10] Add Field.expression, Field.__init__, get_species_mapping, get_mask - Field.expression property generates vcField() string for use in initial condition formulas - Field.__init__ with defaults for var_name and time for direct construction without create_fields() - Application.get_species_mapping() convenience method - SegmentedImageGeometry.get_mask() returns boolean mask by subvolume name - Fix to_segmented_image() to use subvolume names instead of pixel class names for image-based geometries - Add scipy mypy override Co-Authored-By: Claude Opus 4.6 (1M context) --- pyproject.toml | 7 ++++++ .../geometry/segmented_image_geometry.py | 15 ++++++++++++ pyvcell/vcml/field.py | 24 +++++++++++++++++++ pyvcell/vcml/models.py | 16 ++++++++++++- 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index cd9f3c5..11238ee 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -85,6 +85,13 @@ disable_error_code = [ "no-any-return", "return" ] +[[tool.mypy.overrides]] +module = "scipy.*" +ignore_missing_imports = true +disable_error_code = [ + "import-untyped" +] + [[tool.mypy.overrides]] module = "trame.*" ignore_missing_imports = true diff --git a/pyvcell/_internal/geometry/segmented_image_geometry.py b/pyvcell/_internal/geometry/segmented_image_geometry.py index c4b5a00..2de8b6f 100644 --- a/pyvcell/_internal/geometry/segmented_image_geometry.py +++ b/pyvcell/_internal/geometry/segmented_image_geometry.py @@ -48,6 +48,21 @@ def __init__( self.spacing = spacing self.label_names = label_names + def get_mask(self, subvolume_name: str) -> npt.NDArray[np.bool_]: + """Return a boolean mask for the named subvolume. + + Args: + subvolume_name: Name of the subvolume (e.g. ``"cell_domain"``). + + Returns: + Boolean array with the same shape as :attr:`labels`. + """ + for label, name in self.label_names.items(): + if name == subvolume_name: + return self.labels == label # type: ignore[no-any-return] + available = list(self.label_names.values()) + raise ValueError(f"Subvolume '{subvolume_name}' not found. Available: {available}") + def to_pyvista(self) -> pv.ImageData: """Convert to a PyVista ImageData with cell data 'subvolume'.""" import pyvista as pv diff --git a/pyvcell/vcml/field.py b/pyvcell/vcml/field.py index 72f265a..7ea2311 100644 --- a/pyvcell/vcml/field.py +++ b/pyvcell/vcml/field.py @@ -19,11 +19,35 @@ class Field: time: float data_nD: NDArrayND + def __init__( + self, + data_name: str = "", + var_name: str = "channel_1", + time: float = 0.0, + data_nD: NDArrayND | None = None, + ) -> None: + self.data_name = data_name + self.var_name = var_name + self.time = time + self.data_nD = data_nD if data_nD is not None else np.zeros(0, dtype=np.float64) + def __repr__(self) -> str: return ( f"Field(data_name={self.data_name}, var_name={self.var_name}, time={self.time}, shape={self.data_nD.shape})" ) + @property + def expression(self) -> str: + """Return the ``vcField()`` expression string for use in initial condition formulas. + + Example:: + + field = fields[0] + species.init_conc = field.expression + species.init_conc = f"4.0 * {field.expression} / 7.0" + """ + return f"vcField('{self.data_name}', '{self.var_name}', {self.time}, 'Volume')" + def write(self, file_path: Path) -> None: var_info = VariableInfo(var_name=self.var_name, variable_type=VariableType.VOLUME) field_data_file = FieldDataFile.from_image(data_nD=self.data_nD, var_info=var_info) diff --git a/pyvcell/vcml/models.py b/pyvcell/vcml/models.py index 6937303..d04dbdf 100644 --- a/pyvcell/vcml/models.py +++ b/pyvcell/vcml/models.py @@ -324,7 +324,14 @@ def to_segmented_image(self, resolution: int = 50) -> SegmentedImageGeometry: .reshape((sz, sy, sx)) # [z, y, x] .transpose((2, 1, 0)) # [x, y, z] = (nx, ny, nz) ) - label_names = {pc.pixel_value: pc.name for pc in self.image.pixel_classes} + # Map pixel values to subvolume names (subvolumes have image_pixel_value matching pixel classes) + pixel_to_subvolume = { + sv.image_pixel_value: sv.name for sv in self.subvolumes if sv.image_pixel_value is not None + } + label_names = { + pv: pixel_to_subvolume.get(pv, pc_name) + for pv, pc_name in ((pc.pixel_value, pc.name) for pc in self.image.pixel_classes) + } else: nx = ny = nz = resolution x = np.linspace(ox + ex / (2 * nx), ox + ex - ex / (2 * nx), nx) @@ -462,6 +469,13 @@ def map_species(self, species: Species | str, init_conc: float | str, diff_coef: self.species_mappings.append(species_mapping) return species_mapping + def get_species_mapping(self, species_name: str) -> SpeciesMapping: + """Get a species mapping by name.""" + for sm in self.species_mappings: + if sm.species_name == species_name: + return sm + raise ValueError(f"Species mapping '{species_name}' not found in application '{self.name}'") + def map_compartment(self, compartment: Compartment | str, domain: GeometryClass | str) -> CompartmentMapping: compartment_name = compartment.name if isinstance(compartment, Compartment) else compartment domain_name = domain.name if isinstance(domain, GeometryClass) else domain From a5e600c7cf38ebc84eb03e0e6b6d0b2c43c418f3 Mon Sep 17 00:00:00 2001 From: Jim Schaff Date: Sun, 29 Mar 2026 16:30:25 -0400 Subject: [PATCH 09/10] Refactor Trame widget and add image field data demo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Widget fixes: - Fix time_index bug: get_data expects time value, not index - Refactor into _init_state/_bind_state_changes/_render_current/_render - Preserve valid state (variable, time, clip) across re-runs - Add status bar footer showing current render info - Add error handling in state change callbacks - Set iframe height to 1000px for better display in notebooks New examples: - examples/notebooks/image_field_data_demo.ipynb — synthetic microscopy image as initial conditions with Trame visualization - examples/scripts/image_field_data_demo.py — same workflow as script - Update project-overview.md with image field data example Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/project-overview.md | 24 + examples/notebooks/fielddata_trame.ipynb | 340 +++++----- .../notebooks/image_field_data_demo.ipynb | 411 ++++++++++++ examples/notebooks/widget.ipynb | 614 +++++++++++++++++- examples/scripts/image_field_data_demo.py | 36 + pyvcell/sim_results/widget.py | 117 +++- tests/examples/test_example_notebooks.py | 2 +- 7 files changed, 1334 insertions(+), 210 deletions(-) create mode 100644 examples/notebooks/image_field_data_demo.ipynb create mode 100644 examples/scripts/image_field_data_demo.py diff --git a/docs/project-overview.md b/docs/project-overview.md index 020bf92..102cb32 100644 --- a/docs/project-overview.md +++ b/docs/project-overview.md @@ -68,6 +68,30 @@ species.init_conc = f"vcField('{result1.solver_output_dir.name}','s0',0.0,'Volum result2 = vc.simulate(biomodel, "sim1") ``` +### Image data as initial conditions + +```python +import numpy as np +from scipy.ndimage import gaussian_filter +import pyvcell.vcml as vc + +biomodel = vc.load_vcml_file("model.vcml") +app = biomodel.applications[0] +sim = app.simulations[0] + +# Build a synthetic "microscopy image" from the geometry's domain mask +seg = app.geometry.to_segmented_image(resolution=64) +mask = seg.get_mask("cell_domain").astype(float) +image_data = gaussian_filter(mask, sigma=3) + 0.05 * np.random.randn(*mask.shape) + +# Create a field and use it as initial condition +field = vc.Field(data_name="microscopy", data_nD=image_data) +app.get_species_mapping("s0").init_conc = field.expression + +# Simulate — solver resamples field data to simulation mesh via trilinear interpolation +result = vc.simulate(biomodel, sim.name, fields=[field]) +``` + ### Parameter sweep ```python diff --git a/examples/notebooks/fielddata_trame.ipynb b/examples/notebooks/fielddata_trame.ipynb index b0bf951..97b62dd 100644 --- a/examples/notebooks/fielddata_trame.ipynb +++ b/examples/notebooks/fielddata_trame.ipynb @@ -5,8 +5,8 @@ "id": "cd6e4d13dfbf7174", "metadata": { "ExecuteTime": { - "end_time": "2026-03-27T21:51:42.624402Z", - "start_time": "2026-03-27T21:51:39.652565Z" + "end_time": "2026-03-28T13:22:37.347754Z", + "start_time": "2026-03-28T13:22:35.812722Z" } }, "source": [ @@ -23,8 +23,8 @@ "id": "90b534edd21ee708", "metadata": { "ExecuteTime": { - "end_time": "2026-03-27T21:51:44.484147Z", - "start_time": "2026-03-27T21:51:42.625974Z" + "end_time": "2026-03-28T13:22:39.137649Z", + "start_time": "2026-03-28T13:22:37.351076Z" } }, "source": [ @@ -69,38 +69,25 @@ "output_type": "stream", "text": [ "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", - "2026-03-27T21:51:42.763841Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "2026-03-28T13:22:37.453969Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", "Please remove the `packages` attribute from your configuration file.\n", "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2026-03-27T21:51:42.786230Z main WARN The Logger cbit.vcell.model.Kinetics was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@b070d2b and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2026-03-27T21:51:43.014657Z main WARN The Logger cbit.vcell.mapping.AbstractMathMapping was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@b070d2b and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2026-03-27 17:51:43,039 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [l.uM.dm-2.s-1] and [molecules.s-1.um-2] in Expression: ((Kf_r1 * s0) - (Kr_r1 * s2))\n", - "2026-03-27 17:51:43,039 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [molecules.s-1.um-2] and [l.uM.dm-2.s-1] in Expression: ((Kf_r2 * s2) - (Kr_r2 * s3))\n", - "2026-03-27 17:51:43,048 INFO (Entrypoints.java:202) - Returning from vcellToVcml: {\"success\":true,\"message\":\"Success\"}\n", + "2026-03-28T13:22:37.458328Z main WARN The Logger cbit.vcell.model.Kinetics was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@2a42b34e and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", + "2026-03-28T13:22:37.684973Z main WARN The Logger cbit.vcell.mapping.AbstractMathMapping was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@2a42b34e and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", + "2026-03-28 09:22:37,704 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [l.uM.dm-2.s-1] and [molecules.s-1.um-2] in Expression: ((Kf_r1 * s0) - (Kr_r1 * s2))\n", + "2026-03-28 09:22:37,704 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [molecules.s-1.um-2] and [l.uM.dm-2.s-1] in Expression: ((Kf_r2 * s2) - (Kr_r2 * s3))\n", + "2026-03-28 09:22:37,708 INFO (Entrypoints.java:202) - Returning from vcellToVcml: {\"success\":true,\"message\":\"Success\"}\n", "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", - "2026-03-27T21:51:43.063292Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "2026-03-28T13:22:37.724671Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", "Please remove the `packages` attribute from your configuration file.\n", "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2026-03-27T21:51:43.064087Z main WARN The Logger org.vcell.libvcell.Entrypoints was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@4a6e46f0 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2026-03-27T21:51:43.067715Z main WARN The Logger cbit.vcell.model.Kinetics was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@4a6e46f0 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2026-03-27T21:51:43.072121Z main WARN The Logger cbit.vcell.mapping.AbstractMathMapping was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@4a6e46f0 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", - "2026-03-27 17:51:43,084 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [l.uM.dm-2.s-1] and [molecules.s-1.um-2] in Expression: ((Kf_r1 * s0) - (Kr_r1 * s2))\n", - "2026-03-27 17:51:43,084 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [molecules.s-1.um-2] and [l.uM.dm-2.s-1] in Expression: ((Kf_r2 * s2) - (Kr_r2 * s3))\n", - "2026-03-27 17:51:43,096 INFO (Entrypoints.java:85) - Returning from vcmlToFiniteVolumeInput: {\"success\":true,\"message\":\"Success\"}\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Simulation Complete in Main() ... \n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Setting Base file name to: `\"/Users/jimschaff/Documents/workspace/pyvcell/examples/notebooks/workspace/out_dir_zxwst4xd/SimID_831034087_0_\"`\n", + "2026-03-28T13:22:37.725581Z main WARN The Logger org.vcell.libvcell.Entrypoints was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@cf16f1 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", + "2026-03-28T13:22:37.729407Z main WARN The Logger cbit.vcell.model.Kinetics was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@cf16f1 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", + "2026-03-28T13:22:37.733458Z main WARN The Logger cbit.vcell.mapping.AbstractMathMapping was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@cf16f1 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", + "2026-03-28 09:22:37,743 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [l.uM.dm-2.s-1] and [molecules.s-1.um-2] in Expression: ((Kf_r1 * s0) - (Kr_r1 * s2))\n", + "2026-03-28 09:22:37,743 WARN (AbstractMathMapping.java:1130) - Unit exception: Incompatible units [molecules.s-1.um-2] and [l.uM.dm-2.s-1] in Expression: ((Kf_r2 * s2) - (Kr_r2 * s3))\n", + "2026-03-28 09:22:37,753 INFO (Entrypoints.java:85) - Returning from vcmlToFiniteVolumeInput: {\"success\":true,\"message\":\"Success\"}\n", + "Setting Base file name to: `\"/Users/jimschaff/Documents/workspace/pyvcell/examples/notebooks/workspace/out_dir_l5q5l31q/SimID_2113910508_0_\"`\n", "initializing mesh\n", "numVolume=8000\n", "\n", @@ -121,9 +108,9 @@ "mesh initialized\n", "preprocessing finished\n", "pdeCount=4, odeCount=0\n", - "No log-file found at constructed path `/Users/jimschaff/Documents/workspace/pyvcell/examples/notebooks/workspace/out_dir_zxwst4xd/SimID_831034087_0_.log`.simulation [SimID_831034087_0_] started\n", + "No log-file found at constructed path `/Users/jimschaff/Documents/workspace/pyvcell/examples/notebooks/workspace/out_dir_l5q5l31q/SimID_2113910508_0_.log`.simulation [SimID_2113910508_0_] started\n", "temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0000.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0000.sim\n", "**This is a little endian machine.**\n", "[[[data:0]]]\n", "numVolRegions=2\n", @@ -140,203 +127,203 @@ "sundials pde solver is starting from time 0\n", "----------------------------------\n", "temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0001.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0001.sim\n", "[[[data:0.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0002.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0002.sim\n", "[[[data:0.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0003.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0003.sim\n", "[[[data:0.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0004.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0004.sim\n", "[[[data:0.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0005.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0005.sim\n", "[[[data:0.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0006.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0006.sim\n", "[[[data:0.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0007.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0007.sim\n", "[[[data:0.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0008.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0008.sim\n", "[[[data:0.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0009.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0009.sim\n", "[[[data:0.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0010.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0010.sim\n", "[[[data:1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0011.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0011.sim\n", "[[[data:1.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0012.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0012.sim\n", "[[[data:1.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0013.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0013.sim\n", "[[[data:1.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0014.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0014.sim\n", "[[[data:1.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0015.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0015.sim\n", "[[[data:1.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0016.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0016.sim\n", "[[[data:1.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0017.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0017.sim\n", "[[[data:1.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0018.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0018.sim\n", "[[[data:1.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0019.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0019.sim\n", "[[[data:1.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0020.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0020.sim\n", "[[[data:2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0021.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0021.sim\n", "[[[data:2.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0022.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0022.sim\n", "[[[data:2.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0023.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0023.sim\n", "[[[data:2.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0024.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0024.sim\n", "[[[data:2.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0025.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0025.sim\n", "[[[data:2.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0026.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0026.sim\n", "[[[data:2.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0027.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0027.sim\n", "[[[data:2.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0028.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0028.sim\n", "[[[data:2.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0029.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0029.sim\n", "[[[data:2.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0030.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0030.sim\n", "[[[data:3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0031.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0031.sim\n", "[[[data:3.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0032.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0032.sim\n", "[[[data:3.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0033.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0033.sim\n", "[[[data:3.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0034.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0034.sim\n", "[[[data:3.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0035.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0035.sim\n", "[[[data:3.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0036.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0036.sim\n", "[[[data:3.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0037.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0037.sim\n", "[[[data:3.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0038.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0038.sim\n", "[[[data:3.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0039.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0039.sim\n", "[[[data:3.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0040.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0040.sim\n", "[[[data:4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0041.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0041.sim\n", "[[[data:4.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0042.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0042.sim\n", "[[[data:4.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0043.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0043.sim\n", "[[[data:4.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0044.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0044.sim\n", "[[[data:4.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0045.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0045.sim\n", "[[[data:4.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0046.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0046.sim\n", "[[[data:4.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0047.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0047.sim\n", "[[[data:4.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0048.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0048.sim\n", "[[[data:4.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0049.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0049.sim\n", "[[[data:4.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0050.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0050.sim\n", "[[[data:5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0051.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0051.sim\n", "[[[data:5.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0052.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0052.sim\n", "[[[data:5.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0053.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0053.sim\n", "[[[data:5.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0054.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0054.sim\n", "[[[data:5.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0055.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0055.sim\n", "[[[data:5.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0056.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0056.sim\n", "[[[data:5.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0057.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0057.sim\n", "[[[data:5.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0058.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0058.sim\n", "[[[data:5.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0059.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0059.sim\n", "[[[data:5.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0060.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0060.sim\n", "[[[data:6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0061.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0061.sim\n", "[[[data:6.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0062.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0062.sim\n", "[[[data:6.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0063.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0063.sim\n", "[[[data:6.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0064.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0064.sim\n", "[[[data:6.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0065.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0065.sim\n", "[[[data:6.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0066.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0066.sim\n", "[[[data:6.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0067.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0067.sim\n", "[[[data:6.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0068.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0068.sim\n", "[[[data:6.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0069.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0069.sim\n", "[[[data:6.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0070.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0070.sim\n", "[[[data:7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0071.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0071.sim\n", "[[[data:7.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0072.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0072.sim\n", "[[[data:7.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0073.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0073.sim\n", "[[[data:7.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0074.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0074.sim\n", "[[[data:7.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0075.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0075.sim\n", "[[[data:7.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0076.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0076.sim\n", "[[[data:7.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0077.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0077.sim\n", "[[[data:7.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0078.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0078.sim\n", "[[[data:7.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0079.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0079.sim\n", "[[[data:7.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0080.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0080.sim\n", "[[[data:8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0081.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0081.sim\n", "[[[data:8.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0082.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0082.sim\n", "[[[data:8.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0083.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0083.sim\n", "[[[data:8.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0084.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0084.sim\n", "[[[data:8.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0085.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0085.sim\n", "[[[data:8.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0086.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0086.sim\n", "[[[data:8.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0087.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0087.sim\n", "[[[data:8.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0088.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0088.sim\n", "[[[data:8.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0089.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0089.sim\n", "[[[data:8.9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0090.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0090.sim\n", "[[[data:9]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0091.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0091.sim\n", "[[[data:9.1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0092.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0092.sim\n", "[[[data:9.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0093.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0093.sim\n", "[[[data:9.3]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0094.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0094.sim\n", "[[[data:9.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0095.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0095.sim\n", "[[[data:9.5]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0096.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0096.sim\n", "[[[data:9.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0097.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0097.sim\n", "[[[data:9.7]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0098.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0098.sim\n", "[[[data:9.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0099.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0099.sim\n", "[[[data:9.9]]]\n", "Final Statistics.. \n", "\n", @@ -351,7 +338,7 @@ "last step = 0.100000\n", "\n", "temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", - "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_831034087_0_0100.sim\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_2113910508_0_0100.sim\n", "[[[data:10]]][[[progress:100%]]]--------------- sim summary ----------------\n", "Cartesian Mesh: Domain x:[0,10] y:[0,10] z:[0,10]\n", " Elements numX=20 numY=20 numZ=20\n", @@ -360,50 +347,57 @@ "\tdT = 0.1 sec\n", "--------------------------------------------\n", "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", - "2026-03-27T21:51:43.837602Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "2026-03-28T13:22:38.499281Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", "Please remove the `packages` attribute from your configuration file.\n", "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2026-03-27 17:51:43,838 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "2026-03-28 09:22:38,500 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", - "2026-03-27T21:51:43.850801Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "2026-03-28T13:22:38.512211Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", "Please remove the `packages` attribute from your configuration file.\n", "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2026-03-27 17:51:43,851 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "2026-03-28 09:22:38,513 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", - "2026-03-27T21:51:43.863715Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "2026-03-28T13:22:38.524720Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", "Please remove the `packages` attribute from your configuration file.\n", "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2026-03-27 17:51:43,864 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "2026-03-28 09:22:38,525 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", - "2026-03-27T21:51:43.876272Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "2026-03-28T13:22:38.538238Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", "Please remove the `packages` attribute from your configuration file.\n", "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2026-03-27 17:51:43,876 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "2026-03-28 09:22:38,539 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", - "2026-03-27T21:51:43.888854Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "2026-03-28T13:22:38.553598Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", "Please remove the `packages` attribute from your configuration file.\n", "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2026-03-27 17:51:43,889 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "2026-03-28 09:22:38,554 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", - "2026-03-27T21:51:43.901453Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "2026-03-28T13:22:38.568202Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", "Please remove the `packages` attribute from your configuration file.\n", "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2026-03-27 17:51:43,902 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "2026-03-28 09:22:38,569 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", - "2026-03-27T21:51:43.913444Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "2026-03-28T13:22:38.581304Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", "Please remove the `packages` attribute from your configuration file.\n", "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2026-03-27 17:51:43,914 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "2026-03-28 09:22:38,582 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", - "2026-03-27T21:51:43.925442Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "2026-03-28T13:22:38.593667Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", "Please remove the `packages` attribute from your configuration file.\n", "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2026-03-27 17:51:43,926 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "2026-03-28 09:22:38,594 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", - "2026-03-27T21:51:43.937310Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "2026-03-28T13:22:38.605724Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", "Please remove the `packages` attribute from your configuration file.\n", "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", - "2026-03-27 17:51:43,937 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n" + "2026-03-28 09:22:38,606 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Simulation Complete in Main() ... \n" ] } ], @@ -414,18 +408,23 @@ "id": "f139cbdd98786c82", "metadata": { "ExecuteTime": { - "end_time": "2026-03-27T21:51:45.846157Z", - "start_time": "2026-03-27T21:51:44.526981Z" + "end_time": "2026-03-28T13:24:22.438053Z", + "start_time": "2026-03-28T13:24:22.301854Z" } }, "source": "import pyvcell.sim_results.widget as widget\n\nviewer = widget.App(sim1_result.vtk_data)\nlayout = await viewer.run()", "outputs": [], - "execution_count": null + "execution_count": 5 }, { "cell_type": "code", "id": "initial_id", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-03-28T13:22:40.059215Z", + "start_time": "2026-03-28T13:22:40.054395Z" + } + }, "source": [ "\n", "\n", @@ -440,31 +439,46 @@ "# # sim2_result.plotter.plot_concentrations()\n" ], "outputs": [], - "execution_count": null + "execution_count": 4 }, { "cell_type": "code", "id": "fe9a9ec55e853f21", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-03-28T13:22:40.062662Z", + "start_time": "2026-03-28T13:22:40.059595Z" + } + }, "source": [], "outputs": [], - "execution_count": null + "execution_count": 4 }, { "cell_type": "code", "id": "9adf3b911df4b628", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-03-28T13:22:40.065805Z", + "start_time": "2026-03-28T13:22:40.063Z" + } + }, "source": [], "outputs": [], - "execution_count": null + "execution_count": 4 }, { "cell_type": "code", "id": "52fef2ac53b66666", - "metadata": {}, + "metadata": { + "ExecuteTime": { + "end_time": "2026-03-28T13:22:40.071822Z", + "start_time": "2026-03-28T13:22:40.066167Z" + } + }, "source": [], "outputs": [], - "execution_count": null + "execution_count": 4 } ], "metadata": { @@ -488,4 +502,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/examples/notebooks/image_field_data_demo.ipynb b/examples/notebooks/image_field_data_demo.ipynb new file mode 100644 index 0000000..7c56cac --- /dev/null +++ b/examples/notebooks/image_field_data_demo.ipynb @@ -0,0 +1,411 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-0", + "metadata": {}, + "source": [ + "# Image Field Data Demo\n", + "\n", + "Use synthetic microscopy image data as initial conditions for a spatial simulation,\n", + "then visualize results with an interactive 3D Trame widget." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "cell-1", + "metadata": { + "ExecuteTime": { + "end_time": "2026-03-28T22:48:54.833270Z", + "start_time": "2026-03-28T22:48:52.977296Z" + } + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "from scipy.ndimage import gaussian_filter\n", + "import pyvcell.vcml as vc" + ] + }, + { + "cell_type": "markdown", + "id": "cell-2", + "metadata": {}, + "source": [ + "## Load model and set up simulation" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cell-3", + "metadata": { + "ExecuteTime": { + "end_time": "2026-03-28T22:48:54.842961Z", + "start_time": "2026-03-28T22:48:54.834107Z" + } + }, + "outputs": [], + "source": [ + "import os\n", + "from pathlib import Path\n", + "\n", + "model_path = Path(os.getcwd()).parent / \"models\" / \"Tutorial_MultiApp_PDE.vcml\"\n", + "biomodel = vc.load_vcml_file(model_path)\n", + "app = biomodel.applications[0]\n", + "sim = app.simulations[0]\n", + "sim.mesh_size = (100, 100, 36)\n", + "sim.duration = 2.0\n", + "sim.output_time_step = 0.2" + ] + }, + { + "cell_type": "markdown", + "id": "cell-4", + "metadata": {}, + "source": [ + "## Build synthetic microscopy image from geometry domain mask" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-5", + "metadata": { + "ExecuteTime": { + "end_time": "2026-03-28T22:50:34.583705Z", + "start_time": "2026-03-28T22:50:34.478413Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Image shape: (256, 256, 34), Mesh size: (100, 100, 36)\n" + ] + } + ], + "source": [ + "seg = app.geometry.to_segmented_image(resolution=64)\n", + "mask = seg.get_mask(\"cytosol\").astype(float)\n", + "image_data = gaussian_filter(mask, sigma=3) + 0.05 * np.random.randn(*mask.shape)\n", + "\n", + "print(f\"Image shape: {image_data.shape}, Mesh size: {sim.mesh_size}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-6", + "metadata": {}, + "source": [ + "## Create field and use as initial condition" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "cell-7", + "metadata": { + "ExecuteTime": { + "end_time": "2026-03-28T22:50:37.217035Z", + "start_time": "2026-03-28T22:50:37.186563Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial condition: vcField('microscopy', 'channel_1', 0.0, 'Volume')\n" + ] + } + ], + "source": [ + "field = vc.Field(data_name=\"microscopy\", data_nD=image_data)\n", + "app.get_species_mapping(\"Ran_cyt\").init_conc = field.expression\n", + "\n", + "print(f\"Initial condition: {field.expression}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-8", + "metadata": {}, + "source": [ + "## Simulate\n", + "\n", + "The solver resamples the 64x64x64 image data to the 20x20x20 simulation mesh via trilinear interpolation." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cell-9", + "metadata": { + "ExecuteTime": { + "end_time": "2026-03-28T22:50:48.251904Z", + "start_time": "2026-03-28T22:50:46.903946Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", + "2026-03-29T20:03:27.134719Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "Please remove the `packages` attribute from your configuration file.\n", + "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", + "2026-03-29T20:03:27.139446Z main WARN The Logger cbit.vcell.model.Kinetics was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@369b79f7 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", + "2026-03-29T20:03:27.463309Z main WARN The Logger cbit.vcell.mapping.AbstractMathMapping was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@369b79f7 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", + "2026-03-29 16:03:27,468 INFO (Entrypoints.java:202) - Returning from vcellToVcml: {\"success\":true,\"message\":\"Success\"}\n", + "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", + "2026-03-29T20:03:27.491579Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "Please remove the `packages` attribute from your configuration file.\n", + "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", + "2026-03-29T20:03:27.492418Z main WARN The Logger org.vcell.libvcell.Entrypoints was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@2308f230 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", + "2026-03-29T20:03:27.496158Z main WARN The Logger cbit.vcell.model.Kinetics was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@2308f230 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", + "2026-03-29T20:03:27.513091Z main WARN The Logger cbit.vcell.mapping.AbstractMathMapping was created with the message factory org.apache.logging.log4j.message.ReusableMessageFactory@2308f230 and is now requested with a null message factory (defaults to org.apache.logging.log4j.message.ParameterizedMessageFactory), which may create log events with unexpected formatting.\n", + "DataSet.read() open '/Users/jimschaff/Documents/workspace/pyvcell/examples/notebooks/workspace/out_dir_qir12gq4/SimID_1289029706_0_microscopy_channel_1_0_0_Volume.fdat'\n", + "2026-03-29 16:03:27,621 INFO (Entrypoints.java:85) - Returning from vcmlToFiniteVolumeInput: {\"success\":true,\"message\":\"Success\"}\n", + "Setting Base file name to: `\"/Users/jimschaff/Documents/workspace/pyvcell/examples/notebooks/workspace/out_dir_qir12gq4/SimID_1289029706_0_\"`\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Simulation Complete in Main() ... \n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "initializing mesh\n", + "numVolume=360000\n", + "\n", + "CartesianMesh::computeNormalsFromNeighbors(), compute normals from neighbors\n", + "Membrane Elements -> N=16661\n", + "==============================================\n", + "qhull precision error: initial simplex is not convex. Distance=-1.2e-16\n", + "559 has 0 neighbors !\n", + "qhull precision warning: \n", + "1132 has 0 neighbors !\n", + "qhull precision warning: \n", + "2202 has 0 neighbors !\n", + "13777 has 0 neighbors !\n", + "--------Num of points that have zero neighbors 4\n", + "--------Num Neighbors before symmetrize 99119\n", + "--------Num Neighbors after symmetrize 108070\n", + "Total volume=6062.500738\n", + "Total FluxArea =47.45975686\n", + "Total FluxAreaXM =0\n", + "Total FluxAreaXP =0\n", + "Total FluxAreaYM =32.00361766\n", + "Total FluxAreaYP =15.45613919\n", + "Total FluxAreaZM =0\n", + "Total FluxAreaZP =0\n", + "mesh initialized\n", + "preprocessing finished\n", + "**This is a little endian machine.**\n", + "\n", + "read data for field 'microscopy'.\n", + "pdeCount=4, odeCount=0\n", + "No log-file found at constructed path `/Users/jimschaff/Documents/workspace/pyvcell/examples/notebooks/workspace/out_dir_qir12gq4/SimID_1289029706_0_.log`.simulation [SimID_1289029706_0_] started\n", + "temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_1289029706_0_0000.sim\n", + "[[[data:0]]]\n", + "numVolRegions=4\n", + "Region 0: size=315016, offset=0\n", + "Region 1: size=36021, offset=315016\n", + "Region 2: size=1, offset=351037\n", + "Region 3: size=8962, offset=351038\n", + "# of active points = 360000\n", + "Constant diffusion/advection in region cytosol1\n", + "Constant diffusion/advection in region cytosol2\n", + "Constant diffusion/advection in region Nucleus3\n", + "numUnknowns = 117028\n", + "\n", + "****** using Sundials CVode with PREC_LEFT, relTol=1e-07, absTol=1e-09, maxStep=0.1\n", + "\n", + "----------------------------------\n", + "sundials pde solver is starting from time 0\n", + "----------------------------------\n", + "temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_1289029706_0_0001.sim\n", + "[[[data:0.2]]]SimTool.start1() sending JOB_PROGRESS to SimulationMessaging: percentile=0.1, time=0.2\n", + "[[[progress:10%]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_1289029706_0_0002.sim\n", + "[[[data:0.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_1289029706_0_0003.sim\n", + "[[[data:0.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_1289029706_0_0004.sim\n", + "[[[data:0.8]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_1289029706_0_0005.sim\n", + "[[[data:1]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_1289029706_0_0006.sim\n", + "[[[data:1.2]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_1289029706_0_0007.sim\n", + "[[[data:1.4]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_1289029706_0_0008.sim\n", + "[[[data:1.6]]]temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_1289029706_0_0009.sim\n", + "[[[data:1.8]]]\n", + "Final Statistics.. \n", + "\n", + "lenrw = 1170369 leniw = 50\n", + "lenrwLS = 1170326 leniwLS = 10\n", + "nst = 238\n", + "nfe = 282 nfeLS = 299\n", + "nni = 278 nli = 299\n", + "nsetups = 48 netf = 6\n", + "npe = 5 nps = 542\n", + "ncfn = 0 ncfl = 1\n", + "last step = 0.007572\n", + "\n", + "temporary directory used is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/\n", + "sim file name is /var/folders/zz/gcfcvgtd5v1cdgj2sw4bjzdr0000gr/T/SimID_1289029706_0_0010.sim\n", + "[[[data:2]]][[[progress:100%]]]Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", + "2026-03-29T20:03:33.107014Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "Please remove the `packages` attribute from your configuration file.\n", + "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", + "2026-03-29 16:03:33,107 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "Found shared library: /Users/jimschaff/Documents/workspace/pyvcell/.venv/lib/python3.11/site-packages/libvcell/lib/libvcell.dylib\n", + "2026-03-29T20:03:33.121532Z main WARN The use of package scanning to locate Log4j plugins is deprecated.\n", + "Please remove the `packages` attribute from your configuration file.\n", + "See https://logging.apache.org/log4j/2.x/faq.html#package-scanning for details.\n", + "2026-03-29 16:03:33,122 INFO (Entrypoints.java:274) - Returning from vcellInfixToNumExprInfix: {\"success\":true,\"message\":\"Success\"}\n", + "Time points: [0.0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0]\n", + "Channels: ['region_mask', 't', 'x', 'y', 'z', 'C_cyt', 'Ran_cyt', 'RanC_cyt', 'RanC_nuc', 'J_r0']\n" + ] + } + ], + "source": [ + "result = vc.simulate(biomodel, sim.name, fields=[field])\n", + "\n", + "print(f\"Time points: {result.time_points}\")\n", + "print(f\"Channels: {[c.label for c in result.channel_data]}\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-10", + "metadata": {}, + "source": [ + "## Visualize results" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "cell-11", + "metadata": { + "ExecuteTime": { + "end_time": "2026-03-28T22:50:51.702909Z", + "start_time": "2026-03-28T22:50:51.483014Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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t99+k3bt2snff/+d4Q9n3759plTwmWeeka1bt5owdeONN5rQpqWEs2fPNutpqWGePHlk9OjRkpCQ4LUfHdd5zpw55rzatGkj1atXd7bv033pc+vRvn17CVdBbbGoCV8fga4LAAAA+PihKHL2eOhdmLxFtEeMLNm1djaiPIOJdkAyZcoU6dChg1sPkgcPHjQhaezYsSa0XX311V77/PDDD2X48OHSt29f57wnnnhC3nvvPXn77bfT3QO85a677jKBsXv37vLFF19IwYIFncs0HJ44ccI8134wunbtKt98843pUKVz585u+9FtHQ6H3H///eZ1ixYtzEPfk27r2dYvXOVIFzPHjx83aRoAAADwomHtrUqhd2Ge3iGSr2jQdqfVGbWUSasOaslXp06d5LbbbvMKbJ5BR5UsWVLeeOMNufbaa2XatGk+A1vz5s3dwpp64YUXTGDT42XEihUrTOcoWhL4+eefu4U1VblyZbfXDz/8sAlsn332mdv70B4yNZDFxMSYkrjcLNOBbefOnW6vT5065TXPokWdGzdulJ9//lmqVauW2UMDAAAAYcdXr+vapOiTTz7x2yP7qlWrzG9sbdt1+vRpUzJlVaP8999//bYP83TRRRdJ8eLFTbXGjNAqjKpHjx6mLV1aWrZsadrnaQnirl27pEKFCma+Vpvcs2ePdOvWzasaaG6T6cCmKdn1xpk0aZJ5pEZvIL3pAAAAALiz2mmdPXtWVq9eLRs2bDAlUM2aNfMqbYqPjzfztOMRf6zg5ql8+fI+52vQOnLkSIY+Fg1dKj2FMw899JAp6Rs1apS89NJLZp6+X/UAmSHzgU2LV63AtmDBApOAtQcYX2JjY6VcuXKmJ5pbbrkls4cGAABAONK2YFq9MBTPOwg822YNGTJEBg4caDoR0c43dNBoy7Bhw0xYq1evnml3dvnll5seH7UqofbGeMkll/jtOyIy0h4dxt99992mgxINbIMGDZL9+/ebEjYtGLr22mslt8t0YJs/f77bh37DDTeYiw0AAABkiBYGBLEtWKh76qmnTFVDrfL48ssvu/3W1g5HlIY2q+t/i/bQmN2sKo1btmwJeJsiRYqYYQn0fek4c3/++adpw6adjURkUScuoSSosVobRepfAAAAAAAEz5tvvmmmX331lWmnZjl69Kjf6o3ff/99tn8E11xzjTNAat8WgdLOR5S209PeIXW4sHvvvdfnulp66GsYgHAV1MCmxbPaUBEAAABA8DRs2ND0oqhBRas+WnSwbKXjm7maOHFihrvlzwwdsFurbeoA3w8++KAZQNuVduuvg3V7uvLKK011Tu3RUguBdJgCbUrli87/77//5NixY5IbZEm3/tozjY5Grj3SaCNHX/VmtXhT66gCAAAASNvgwYNNoLHaeulA2dq2TXtY1DZgEyZMMAFOf4ProNgDBgwwQwJkNy0F1MG3tZRNqzjq2Gk6pJdWk9TeLIcOHWra3PkqZdOQp6ypL9ofxgcffGACnnbEkjdvXtNWT6uOhqOgBzZtJKkD7lkD4ikNbK71T63XBDYAAAAgMA0aNDAd902ePNl0NqIlbdoB4KJFi+T555+Xv/76y3Q0omFIe23XQJMTge3iiy+W33//3YznpiV9v/zyi6niqNU2+/TpIzfddJPP7dq2bWumup7nAOGudHw5zRMaXsePH29KHVu1akVgC4Q2hrzvvvtMw8HnnnvOlLItXbrU1EXVRK2NIjXxP/roo3LFFVcEtE8AAAAgNzh+/Hia6/gaPuuqq64yg1X74qumm5bU6cMfrbaYWTo0gBbOpKeAxmpzp3lCA54/BQoUMCVs+sgNgtqGTYs3teRMg9qrr74qNWrUcI6foA0l161bJ48//rgpxiWwAQAAAFBaO08DmA4Dllp1yNwoqIFNiz414WtxrS/R0dGmWFbHarMGxQMAAACQO40ePdoM/H3ZZZfJvn37TJVJf52N5FZBbcOmXXdWrFjR+VobFyrteESLRa2x2po0aeK32BYAAACAPUydOtU8AqHjpmkHI+mxYMECGTt2rJQsWdIMDG4NX4AsCmzaU82RI0ecr8uWLWum2vjRtQqkrnPmzJlgHhoAAABAkGmvjhqoAtG6det0BzbtsFAfyKYqkbVq1TKdili0m01t6Kg92FgNHpcsWSJz5841XW8CAAAAsC/tnER/xwfy0KqNsHlg0wHudKC7FStWmNc6/kL9+vVNd57avaeWsulAeklJSabzEQAAAABANgW2u+++W3744QcpXbp08s4jI2XWrFly7bXXmtHOdWyI/Pnzy2uvvSY9e/YM5qEBAAAAIOwEtQ2bjr92/fXXu83TkjUdff306dNmbAntITK1cRUAAAAAAFkQ2Pr37y/FihXzOUCelqzpAwAAAACQA1UiR4wYIWvWrAnmLgEAAAAg1wpqYCtfvrzpUAQAAAAAYLPA1rlzZzP4nQ6UDQAAAACwUWB7+eWXpWLFinLjjTeaHiEBAAAAADbpdKRTp06SJ08eWbx4sTRq1EjKli1rAlzevHm91o2IiJBff/01mIcHAAAAgLAS1MA2f/5853Md7Xzv3r3m4YsGNgAAAAAXhsjy/L1cqFAhqV27ttx+++3yyCOPSExMTI5frp07d8qHH34ov/zyi2zfvl1OnTpleopv0KCBaSKlYzMXLFgwp08zbAQ1sG3bti2YuwMAAABynXvuucdMExMTTSBasmSJLF++XGbOnGnGN46ODupP+HT5+OOP5YknnpBz586Z8ZWbNWsmhQsXlv3798uiRYtMiHvllVfk77//lhIlSoidDB482DThGj16tPTq1UtCRVA/7UqVKgVzdwAAAECuM2bMGLfXGtZat25tmhN999130rNnzxw5r08++UT69OljSs8+/fRTueuuu9xqzZ0+fdqUvL366qum1M1ugS1UBbXTEU3T06dPT3O9GTNmmHUBAAAApK5JkybOEqGffvopRy7Xrl275PHHHzcBTX/va7VHzyZO+fPnl6eeesoETM/qnbBJYNNixqlTp6a5nn7IWhwJAAAAIG116tQx0wMHDrjN134jvv32W9PGrWbNmlKgQAHT7q1x48by0Ucf+RwjWX+za9jSkry1a9fKzTffbNqg6batWrUyVTA9jRgxQs6ePSvdu3eXNm3apHqu2uZO95dRGvj0/Vx88cWmQ0PtyLBdu3by2WefmeVaHVNL7zQgHjt2zOc+9D3oe9Te61XlypWd+ePee+81y6yHaz8cYR/YAqX1cSMjc+TQAAAAQMixxjnWdmOuNLzccccdMmfOHClTpox07NhRrrrqKlm3bp3ppKR3795+97ly5UqzrraTu/7666VGjRry22+/mXCkbdBczZo1y0z1WFlp+PDhpl3c+PHjTVDr0qWL1K1b15yPlt4pDXHazu/MmTPy9ddf+9yPFe6skslu3bqZTlFU8+bNzfbWQ6+bneVIi0W9gTKTugEAABC+tNTo5PnkgBJKCsUUyrKe0LWzEdW+fXu3+doByZQpU6RDhw5uPUgePHjQlC6NHTvWhLarr77aa5/a3kwDUt++fZ3ztEOR9957T95++2358ssvzbz4+Hj5559/zPPLL79csoqG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v+6663yuoyHl8ssvl7/++itTx9LjtG3bVpYtWyZly5aVTp06yfbt201PlTNnzjTzq1atGtC+tIpm06ZNZfPmzWabzp07y7p162T48OHyww8/mFLB4sWLu22TlJQkt956q0yZMsWErw4dOpj9TJw40VQHnTdvnjRu3NitmmijRo3Mc92XhrYCBQqY6/D111+bEkedduvWLVPXBQAAAED4CGoJmxVS/IU1y8UXX2zasmXGa6+9ZkKZBq1NmzbJ+PHjZfny5TJ06FA5ePCgswpmILQkTcOaVtHcuHGj2dfff/9tSgl13/379/faZtSoUSas1ahRQzZs2GCC2vz5803wOn36tNx5550mpLm68sorZerUqXLgwAETanVd3f/zzz8v8fHx5pw19AEAAABA0AObVh/UKn5piYuLM+3aMkrDzYgRI8zzDz/8UAoWLOhcpuGqfv36smDBAlMFMS1affPbb781JX8fffSRW0coQ4YMMdUcx40bZ0KWq2HDhpnp22+/LaVLl3bO79q1q9x8880mAE6bNs05X/ernbBoSWBUVJRzfmRkpCmZvOSSS+TkyZOmdA4AAAAATF4I5mUoVaqUCSpp0TZegQQ7fxYvXizHjx+XatWqScOGDb2WW9UKZ8yYkea+fvzxR1O9sWXLlm7BS2lbNm1zp23VtETMsm3bNvMetN2aVoXMzPGVdsyiIVNltuQRAAAAQPgIamDTNmWrVq0yVSP90WqEGuquvfbaDB9n9erVZqpt4Xyx5gfSkUdG9mVtU7duXYmJicnU8S1bt2410zJlygS8DQAAAMJHkSJFzEP/mK8PrYmlr6+66ip57733MlVDLZh27twpTz/9tPnNq30zaE01LfjQZlFaY+3UqVM5fYphJaidjjzzzDOm/Zd22vHmm2/KLbfc4tYLo4a1AQMGmM42fLULS89NosqXL+9zuTV/x44dWbKvYB7fGgpBq2/qza69bAaqTp06Pudv2bLFBL+5c+dKTtFqryonzyHccE25nnbHPco1tTvuUXtdU/09qI8TJ06YYIIL7rjjDjPVWl76u1P7adCH9oUwefLkHB3L+PPPP5fnnntOzp07Z5oOaf8VhQoVkv/++8/8pv3ll1/k5ZdfNn1NXHTRRZLTkpKSzFTvs2DvVz8f/Teg/VikRdfT+z0jgvpp16pVy7QHu+uuu+TRRx81D/3rwNix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vXr1zDb33nuvIykpKcPnpp9BhQoVzL4WLlzoCBXBvqb+/P33346IiAhH/vz5vQbm5B5N28mTJ821089i06ZNueoezaqBs3Pr92iwByXmezT41zS3f49m1fXM7d+jeu5t27Y153799dcHNEh2uH+PEtjg9Pzzz5ubsFmzZo5Tp0455w8dOtTMb9WqldvV+uCDDxyXXHKJ45lnnvG6infeeafZpmvXro7z58875/ft29fMv+eee7y2+eyzz8yyGjVquP3jmTRpkplfvXp1t33llusZFxfnaNq0qdmme/fujoSEhDSPvX79eseXX35pvpBcHThwwNG5c2ezrwYNGmQq+IXyNZ01a5bj119/9dr/6tWrnV/Ueq964h71/2/eMnbsWHP9rrrqqlx5j6b3xxvfo9lzPfkeDf415Xs0uNfTVW7+HtXfOLfccos595YtW5p/u2nJDd+jBDY4nTlzxtGkSRNzM5YtW9aEA+u1/hViy5YtblfrpZde8nuzHzx40FGtWjWzXKe33Xabo27dus5/AIcPH/baJjEx0fmPtFixYo5u3bo5Wrdubf5Kly9fPseyZcty5fV8/PHHzXz9K9Add9xhlvt6uJo3b57zOl577bVmO72WhQoVMvPLly/v2LhxoyPUBOuaWvMrVapk/lp2++23Oxo3buyIjo428/VanT592uv43KP+/81b9H7TdT788MNUP8twvUdnzpxp7knrod9f+n5c5+k6Fr5Hs+d68j0a/GvK92jw/81bcvP36HvvvWfOXR/6m9Dfb56DBw/mqu9RAhvc6I/UQYMGmZtai5DLlCnj6NWrl2PXrl1eVyqtLx39R/DYY4+ZInndl071LxpHjx5N9S8rWlpSp04dR968eR0XXXSR+Yeybt26XHs99bX15ZXaw9WePXvMDxT965weMyYmxlGwYEHH5Zdfbo6jVYNCVTCu6ZIlSxy9e/c21Uz1HtOgVrx4cfOFrH9ZS60Uk3vU/795rX6if1jQ++3QoUOpfo7heo+OHj06zX+ruo6F79HsuZ58jwb/mvI9mjX/5nP796h1fdJ6bNu2LVf9Ho3Q/5e9reYAAAAAAIGgl0gAAAAAsCkCGwAAAADYFIENAAAAAGyKwAYAAAAANkVgAwAAAACbIrABAAAAgE0R2AAAAADApghsAAAAAGBTBDYAAAAAsCkCGwAAAADYFIENAAAAAGyKwAYAAAAANkVgAwAgDZUrV5aIiIiQvU5t27aV8uXLy7lz5zK0/dSpU837//7774N+bgCA1BHYAAC52vbt200Yad26tYSjWbNmybx58+S5556TPHnyZGgfnTp1kgYNGph9nD9/PujnCADwj8AGAEAafv31V1m/fn1IXicNWSVLlpT7778/w/vQQPvMM8/Ili1b5PPPPw/q+QEAUkdgAwAgDdWqVZNatWqF3HVavHixrFmzRm677TaJjY3N1L60lK1QoUIycuTIoJ0fACBtBDYAQK41ePBgqVKlinm+YMECU5JkPXr16pVqGzbXqpRxcXHSv39/qVChguTLl08uv/xymTFjhnPdCRMmSJMmTaRAgQJSunRp6du3r5w5c8bnOZ0+fVreeOMNadiwoRQsWNA8rrrqKhk7dmy6359VGtajRw+fy5csWSKdO3eWSpUqmeqSZcqUkcaNG5vStFOnTrmtq+9L19UAuHz58nSfCwAgYyIcDocjg9sCABDStDONcePGyaRJk0yQat++vXNZixYtnNUINbDt2LFDXP+TqYFNw17Tpk0lKSlJtm3bJldffbUcOnRIfvvtNxPmfvzxR1m7dq0MHDhQWrVqJYULFzbLDh8+LHfccYd8/fXXbudz4MABufbaa00o0vCkwU+PqcHq+PHj8uijj8oHH3wQ8PsrVaqUCV4nTpyQ6Ohot2UaKDWA6f41pOl7OXbsmPz777+m6qO+H33frkaNGiX33XefDBo0SF555ZV0X28AQAZoYAMAILfatm2bpjBHq1at/K5TqVIls46v7fTRtm1bx6lTp5zLRo8ebeZXr17dUaxYMcfvv//uXLZnzx5HqVKlzPItW7a47fPGG2808/v16+c4e/asc/7+/fsdjRo1Mst++OGHgN7X+vXrzfrNmjXzufzqq682yydOnOi1bMWKFY4TJ054zV+7dq3ZRrcFAGQPqkQCAJAJkZGR8vHHH5vqjpa7775bSpQoIZs3b5ZHHnlEGjVq5FxWrlw5ufPOO81zLW2zrFq1SmbPni1XXnmlDBs2zK1HRy39+/TTT81zPVYgtJROXXLJJT6XHzx40EyvueYar2V6DtpezZPVjk/PFQCQPQhsAABkglYbrFmzpvt/XCMjTbswdd1113ltU7VqVTPdt2+fc97PP/9splpNUbf3ZLVpW7FiRUDnpdUrVbFixXwuv+KKK8z0rrvukt9//91U60yLVqvUIKdVLOPj4wM6DwBA5hDYAADIhIsvvtjnfA1X/pZby1wHstY2cer555936/zE9aHt0bSNXCC0zZvyVVKmXn/9dTO2mrZl0zZsWiJ48803m45Kzp4963e/2g5PaXs3AEDWc2+BDAAA0sVXaVh6llusEi7t7ESHEcisIkWKmOnJkyd9LtceLVeuXClz586VmTNnml4yNbzp4+2335alS5fKRRdd5DcIFi1aNNPnCABIG4ENAAAbKF++vLNK5JNPPpnp/WkPkerIkSOpVnHUKptWtU3tCbN3794mxL311lsmuLk6f/68KeXTUrbMjusGAAgMVSIBALmaFTwSEhJy9Dy0O381ZcqUoOxPqzuqjRs3BryNtrt7+umnzfO///7ba/mGDRvM9LLLLgvKOQIA0kZgAwDkatp2KyYmxow9lpiYmGPnoQNra2hbvHix6VlSO/bwtHr1ajO2WyC0d0gtZdMeHX2F0XfffVf279/vNV97qrSqTHqyOjzRMeUAANmDwAYAkNxewqYDZmt40VIp7ZJfB8wePXp0tp+LDuKtvUF+9NFHprSrTZs2ZgiAm266SSpWrGhKtgINbOrGG2+UM2fOyPLly72Wvfzyy6ZDFB2c+7bbbpPu3bubkDd8+HApXry4DBgwwGub+fPnm2mHDh0y+U4BAIEisAEAcj3tGVG7tz98+LB888038sUXX5hOOLKblogtWbJE3n//fbn00kvlr7/+kokTJ5ox1XQogCFDhvgMUv488MADZqrvydMHH3wgt99+u5w+fVp++OEHEwS1TVv//v3N8WrUqOG2vga/qVOnSv369U1pIAAge0To6NnZdCwAAJDNtMRu9+7d5uE6GHd6ffvtt3LHHXeY0r//+7//C+o5AgD8I7ABABDGtE2aVmHUErVHH300Q/vQv+1q8NMeIv/55x96iASAbERgAwAgzLVt21Y2bdpkOlbJSCmbVoW85ZZbZPz48aatGwAg+xDYAAAAAMCm6HQEAAAAAGyKwAYAAAAANkVgAwAAAACbIrABAAAAgE0R2AAAAADApghsAAAAAGBTBDYAAAAAsCkCGwAAAADYFIENAAAAAGyKwAYAAAAANkVgAwAAAACbIrABAAAAgE0R2AAAAADApghsAAAAACD29P8W+QDxOw2uMgAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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d92lVVf05p/5zGfUctBpvYsFVIaZQCDjINmTqjqpnthJfve739UJCGSXqnox7Xdv4HpTkLUxFgCkbo8++qj++5hjjlnrb9xjaNY9PDw8ig3elcWjZPGLX/xCSTn2dyRAsqQPYYd0+OYuj/XF9773vTwpx/ccUD2HhLNS87WvfU39xanSskHc77vvPq1W0zBK4+ihhx6qVoa96aHoa0C20Wd//etf16oxAUyQc0j6448/nm98Rd4xmPu5IWCyBDj2NO4CJC4QdRpgOwsh23777fNpwx4eg4bcANklluace0jDN396eHh4BICGnIr48ccf3yPyiwYdDTNEF8LLig3ValZvIOn0OuCUMpDkl/36/e9/r6mehBVByqdMmbLW8wgrWr58ue5fKYKmUCYfHGPOGeAnx52VDZx3OgPN48hZ0OF7S1WPQWn+nLNE9phwUr+/11OL/yBTZnhXllKCl7J4eHh4FHiH94SUA8g2Fp7olnE5wVoRooh85Omnn9amRKrV6NSx7UNG0t+yEV7/1ltv1YyAqVOnaiNkZ6QcMIEoVVLOKgU6carlQbccnwzsUTLwGnOPTuCJuYeHh0cfAJKOfIWm43vvvVdTOm+++Wat5pIYiqRkxowZql/HMQQ/7r4m6bwelXuaPkk3ReJVDL7rfQ2cWGjE5fNedtlla+UgeHh4eJQqPDH38PDw6GO4sJ+TTz5ZddyQ9FtuuUUbD19//XW58MILtfkSucvll1+urikbStL5e2QcTAywS4SUBx1JygWsOmD9SLMtmn+awIPwycAeJQNfMffoBJ6Ye3h4ePQzSSesCHkMFoto0vHf578h5CRxUvHFyg+fcWwMe0vSeT7SDqwFmRBAygvtBcsBK1euVJkQqw244jCpKYST7RA+1lUPAfpyjpPXl3t4eBQbPDH38PDwGECSjoadyjkWi1TSCTE66aSTlEjiy08YEMmcLvAom82uk5RDxHkNiCZad0KGyg1oxz/5yU9qyNBRRx0l119/facNtZtttpkkEgm1vaS6XgjXEErwkofHoMJXzD06gSfmHh4eHoMASCUptp/61KfUQYXGUareSFEglZdeeqnssssu6i6CBSiEsjOSjhMM1feqqip58MEH1UK03ID9IU4rL7zwgjbS0txK42pn8MnAHh4epQxvl+jh4eFRZMBr/F//+pemjVJRp7IOcFmByB95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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "result.plotter.plot_concentrations()\n", + "result.plotter.plot_slice_3d(time_index=0, channel_id=\"Ran_cyt\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-12", + "metadata": {}, + "source": [ + "## Interactive 3D visualization with Trame" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-13", + "metadata": { + "ExecuteTime": { + "end_time": "2026-03-28T22:51:05.188503Z", + "start_time": "2026-03-28T22:51:04.297786Z" + }, + "scrolled": true + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "128798dce17441e48e009950ab3dd909", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "HTML(value='