diff --git a/.gitmodules b/.gitmodules index 4cde6b83..9185749f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "src/aind_behavior_vr_foraging/curricula/aind.Behavior.VrForaging.Curricula"] path = src/aind_behavior_vr_foraging/curricula/aind.Behavior.VrForaging.Curricula url = https://github.com/AllenNeuralDynamics/Aind.Behavior.VrForaging.Curricula +[submodule "src/platforms/FIP_DAQ_Control"] + path = src/platforms/FIP_DAQ_Control + url = https://github.com/AllenNeuralDynamics/FIP_DAQ_Control.git diff --git a/pyproject.toml b/pyproject.toml index bee73f8d..dae9e239 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Operating System :: Microsoft :: Windows", ] -version = "0.6.0" +version = "0.6.1rc1" readme = {file = "README.md", content-type = "text/markdown"} dependencies = [ @@ -30,8 +30,10 @@ Changelog = "https://github.com/AllenNeuralDynamics/Aind.Behavior.VrForaging/rel data = ["contraqctor<0.6.0"] +platform_fip = ["aind_physiology_fip"] + launcher = [ - "aind-clabe[aind-services] >= 0.8.0 ,<0.9.0", + "aind-clabe[aind-services] >= 0.8.2 ,<0.9.0", "aind-data-schema>=2", "aind_behavior_vr_foraging[data]", ] @@ -75,3 +77,6 @@ ignore-words-list = 'nd' [tool.uv] default-groups = ['dev'] required-version = '>=0.8.4' + +[tool.uv.sources] +aind_physiology_fip = { path = "./src/Platforms/FIP_DAQ_Control" } \ No newline at end of file diff --git a/src/DataSchemas/aind_behavior_vr_foraging.json b/src/DataSchemas/aind_behavior_vr_foraging.json index d176f795..44e0843d 100644 --- a/src/DataSchemas/aind_behavior_vr_foraging.json +++ b/src/DataSchemas/aind_behavior_vr_foraging.json @@ -359,8 +359,8 @@ "type": "string" }, "version": { - "const": "0.6.0", - "default": "0.6.0", + "const": "0.6.1-rc1", + "default": "0.6.1-rc1", "title": "Version", "type": "string" }, @@ -568,8 +568,8 @@ "description": "Parameters of the task logic" }, "version": { - "const": "0.6.0", - "default": "0.6.0", + "const": "0.6.1-rc1", + "default": "0.6.1-rc1", "title": "Version", "type": "string" }, diff --git a/src/Extensions/AindBehaviorVrForaging.Generated.cs b/src/Extensions/AindBehaviorVrForaging.Generated.cs index 899074e1..a527da87 100644 --- a/src/Extensions/AindBehaviorVrForaging.Generated.cs +++ b/src/Extensions/AindBehaviorVrForaging.Generated.cs @@ -955,7 +955,7 @@ public partial class AindVrForagingRig public AindVrForagingRig() { _aindBehaviorServicesPkgVersion = "0.12.3"; - _version = "0.6.0"; + _version = "0.6.1-rc1"; _triggeredCameraController = new CameraControllerSpinnakerCamera(); _harpBehavior = new HarpBehavior(); _harpOlfactometer = new Olfactometer(); @@ -1362,7 +1362,7 @@ public AindVrForagingTaskLogic() _name = "AindVrForaging"; _description = ""; _taskParameters = new AindVrForagingTaskParameters(); - _version = "0.6.0"; + _version = "0.6.1-rc1"; } protected AindVrForagingTaskLogic(AindVrForagingTaskLogic other) diff --git a/src/aind_behavior_vr_foraging/launcher.py b/src/aind_behavior_vr_foraging/launcher.py index 524f7ebb..e40b2361 100644 --- a/src/aind_behavior_vr_foraging/launcher.py +++ b/src/aind_behavior_vr_foraging/launcher.py @@ -1,7 +1,9 @@ +import asyncio import logging from pathlib import Path from typing import Any, cast +import aind_physiology_fip.rig from aind_behavior_services.calibration.aind_manipulator import ManipulatorPosition from aind_behavior_services.session import AindBehaviorSessionModel from clabe import resource_monitor @@ -14,7 +16,7 @@ ) from clabe.data_transfer.aind_watchdog import WatchdogDataTransferService, WatchdogSettings from clabe.launcher import Launcher, LauncherCliArgs -from clabe.pickers import DefaultBehaviorPickerSettings +from clabe.pickers import DefaultBehaviorPicker, DefaultBehaviorPickerSettings from clabe.pickers.dataverse import DataversePicker from contraqctor.contract.json import SoftwareEvents from pydantic_settings import CliApp @@ -27,7 +29,7 @@ logger = logging.getLogger(__name__) -def experiment(launcher: Launcher) -> None: +async def experiment(launcher: Launcher) -> None: monitor = resource_monitor.ResourceMonitor( constrains=[ resource_monitor.available_storage_constraint_factory(launcher.settings.data_dir, 2e11), @@ -39,6 +41,13 @@ def experiment(launcher: Launcher) -> None: # Start experiment setup picker = DataversePicker(launcher=launcher, settings=DefaultBehaviorPickerSettings()) + + fip_picker = DefaultBehaviorPicker( + launcher=launcher, + settings=DefaultBehaviorPickerSettings( + config_library_dir=Path(r"\\allen\aind\scratch\AindBehavior.db\AindPhysiologyFip") + ), + ) manipulator_modifier = ByAnimalManipulatorModifier(picker, launcher) # Pick and register session @@ -52,13 +61,29 @@ def experiment(launcher: Launcher) -> None: # Fetch rig settings rig = picker.pick_rig(AindVrForagingRig) + fip_rig = fip_picker.pick_rig(aind_physiology_fip.rig.AindPhysioFipRig) + # Post-fetching modifications manipulator_modifier.inject(rig) # Run the task via Bonsai bonsai_app = AindBehaviorServicesBonsaiApp(BonsaiAppSettings(workflow=Path(r"./src/main.bonsai"))) + + fip_app = AindBehaviorServicesBonsaiApp( + BonsaiAppSettings( + workflow=Path(r"./src/platforms/FIP_DAQ_Control/main.bonsai"), + executable=Path(r"./src/platforms/FIP_DAQ_Control/bonsai/bonsai.exe"), + is_editor_mode=True, + is_start_flag=True, + ) + ) bonsai_app.add_app_settings(launcher, rig=rig, session=session, task_logic=task_logic) - bonsai_app.run().get_result(allow_stderr=True) + fip_app.add_app_settings(launcher=launcher, session=session, rig=fip_rig) + + await asyncio.gather(bonsai_app.run_async(), fip_app.run_async()) + + bonsai_app.get_result(allow_stderr=True) + fip_app.get_result(allow_stderr=True) # Update manipulator initial position for next session manipulator_modifier.dump() diff --git a/src/platforms/FIP_DAQ_Control b/src/platforms/FIP_DAQ_Control new file mode 160000 index 00000000..7791f296 --- /dev/null +++ b/src/platforms/FIP_DAQ_Control @@ -0,0 +1 @@ +Subproject commit 7791f296469cdafbf38e2d329f90a96ae5f1bc4a diff --git a/uv.lock b/uv.lock index d834a086..dadff438 100644 --- a/uv.lock +++ b/uv.lock @@ -57,7 +57,7 @@ wheels = [ [[package]] name = "aind-behavior-vr-foraging" -version = "0.6.0" +version = "0.6.1rc1" source = { editable = "." } dependencies = [ { name = "aind-behavior-services" }, @@ -73,6 +73,9 @@ launcher = [ { name = "aind-data-schema" }, { name = "contraqctor" }, ] +platform-fip = [ + { name = "aind-physiology-fip" }, +] [package.dev-dependencies] dev = [ @@ -94,12 +97,13 @@ docs = [ requires-dist = [ { name = "aind-behavior-services", specifier = ">=0.12,<0.13" }, { name = "aind-behavior-vr-foraging", extras = ["data"], marker = "extra == 'launcher'" }, - { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.8.0,<0.9.0" }, + { name = "aind-clabe", extras = ["aind-services"], marker = "extra == 'launcher'", specifier = ">=0.8.2,<0.9.0" }, { name = "aind-data-schema", marker = "extra == 'launcher'", specifier = ">=2" }, + { name = "aind-physiology-fip", marker = "extra == 'platform-fip'", directory = "src/Platforms/FIP_DAQ_Control" }, { name = "contraqctor", marker = "extra == 'data'", specifier = "<0.6.0" }, { name = "pydantic-settings" }, ] -provides-extras = ["data", "launcher"] +provides-extras = ["data", "platform-fip", "launcher"] [package.metadata.requires-dev] dev = [ @@ -120,7 +124,7 @@ docs = [ [[package]] name = "aind-clabe" -version = "0.8.1" +version = "0.8.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-behavior-services" }, @@ -130,9 +134,9 @@ dependencies = [ { name = "rich" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ed/08/235ed31a6e7601d851d721ee64f1129f2d1a8266ef632251c6c4ad78b553/aind_clabe-0.8.1.tar.gz", hash = "sha256:797f3341378b1164d236b867381c41e65d37c48c14241f5b43fd6e6193540581", size = 47625, upload-time = "2025-10-20T03:10:36.108Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/37/dff7f633606ce87600a4114bd1dd506f2109d5d891f66030b5769426ac1c/aind_clabe-0.8.2.tar.gz", hash = "sha256:f384d51a541b900f5783a9523eba4f885cfa69850a2ac33881db07ca7a7f1d3a", size = 48635, upload-time = "2025-10-21T02:29:17.795Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/53/b9d642932c6deb923dc3bbde307c896aad4b706ec64bd81044ac9c365fc1/aind_clabe-0.8.1-py3-none-any.whl", hash = "sha256:6eed68e6d6859c6f200bdafb91768e68d8920917d46caa77ed2b42a350b3fdc9", size = 64907, upload-time = "2025-10-20T03:10:35.129Z" }, + { url = "https://files.pythonhosted.org/packages/6d/14/0ac35972d01f3a82bc1a720b42589929dd8beabc6066dc26ef16597e4e96/aind_clabe-0.8.2-py3-none-any.whl", hash = "sha256:d366a0495763d64d8bfb2fbc195951269b7e0fb3152bd967f944b48155384698", size = 66180, upload-time = "2025-10-21T02:29:16.829Z" }, ] [package.optional-dependencies] @@ -151,16 +155,16 @@ aind-services = [ [[package]] name = "aind-data-schema" -version = "2.0.3" +version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aind-data-schema-models" }, { name = "pydantic" }, { name = "semver" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/46/cc/636358c2f3629c293f201c8f3eba6a86335b7979c648282b7f6fb59ba675/aind_data_schema-2.0.3.tar.gz", hash = "sha256:def6a43d8f9e6259177f2b58e2b830b38d7e7b8dc006827314f6ea8b1577d55b", size = 739960, upload-time = "2025-10-02T18:04:49.036Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/93/a283d16a6ffb59f9cd558edcb0fcea5b1099d81921c3ac167a43cc3c4f3d/aind_data_schema-2.1.0.tar.gz", hash = "sha256:899d1a209211c742ece04c9506500983f0a8ffc7e0911f0e82e4d9501f50134e", size = 750414, upload-time = "2025-10-20T18:30:42.133Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ac/61/dae645b22f3b38b1f28a597a2438b95c5e239f8deb1a4f2b9e1dc7187f5f/aind_data_schema-2.0.3-py3-none-any.whl", hash = "sha256:a216ad39e6d8db11d45e3686f5bfa65eec2f676db1031b279e52112de151f023", size = 85042, upload-time = "2025-10-02T18:04:47.412Z" }, + { url = "https://files.pythonhosted.org/packages/86/1c/40593876feb8cb106ca45b9d25a708abf68db544358286abfd950074a109/aind_data_schema-2.1.0-py3-none-any.whl", hash = "sha256:0b59880cc3c22f703b2f8f99249d178cd177b2ab6fd2cb115e37251606404957", size = 86103, upload-time = "2025-10-20T18:30:40.413Z" }, ] [[package]] @@ -192,6 +196,39 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/12/62/594a4609d1ceda3b39147becc766dc52217d8f7c2b438d22cd6a8938f8f9/aind_data_transfer_service-1.19.1-py3-none-any.whl", hash = "sha256:c3fe2b1e51050db6492f35da70fde0755025d437e04e8d0b5b800db0e8abc4a5", size = 23370, upload-time = "2025-10-06T22:43:57.191Z" }, ] +[[package]] +name = "aind-physiology-fip" +version = "0.1.2rc2" +source = { directory = "src/Platforms/FIP_DAQ_Control" } +dependencies = [ + { name = "aind-behavior-services" }, +] + +[package.metadata] +requires-dist = [ + { name = "aind-behavior-services", specifier = "<0.13" }, + { name = "contraqctor", marker = "extra == 'data'", specifier = "<0.6" }, + { name = "opencv-python", marker = "extra == 'data'" }, + { name = "pydantic-settings", marker = "extra == 'data'" }, +] +provides-extras = ["data"] + +[package.metadata.requires-dev] +dev = [ + { name = "aind-physiology-fip", extras = ["data"] }, + { name = "codespell" }, + { name = "ruff" }, +] +docs = [ + { name = "autodoc-pydantic", extras = ["erdantic"] }, + { name = "furo" }, + { name = "sphinx" }, + { name = "sphinx-copybutton" }, + { name = "sphinx-jinja" }, + { name = "sphinx-jsonschema" }, + { name = "sphinx-mdinclude" }, +] + [[package]] name = "alabaster" version = "1.0.0" @@ -1253,9 +1290,9 @@ name = "msal" version = "1.34.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "cryptography", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, - { name = "pyjwt", extra = ["crypto"], marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, - { name = "requests", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "cryptography" }, + { name = "pyjwt", extra = ["crypto"] }, + { name = "requests" }, ] sdist = { url = "https://files.pythonhosted.org/packages/cf/0e/c857c46d653e104019a84f22d4494f2119b4fe9f896c92b4b864b3b045cc/msal-1.34.0.tar.gz", hash = "sha256:76ba83b716ea5a6d75b0279c0ac353a0e05b820ca1f6682c0eb7f45190c43c2f", size = 153961, upload-time = "2025-09-22T23:05:48.989Z" } wheels = [ @@ -1739,7 +1776,7 @@ wheels = [ [package.optional-dependencies] crypto = [ - { name = "cryptography", marker = "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux')" }, + { name = "cryptography" }, ] [[package]] @@ -2257,7 +2294,7 @@ wheels = [ [[package]] name = "typer" -version = "0.19.2" +version = "0.20.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, @@ -2265,9 +2302,9 @@ dependencies = [ { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/21/ca/950278884e2ca20547ff3eb109478c6baf6b8cf219318e6bc4f666fad8e8/typer-0.19.2.tar.gz", hash = "sha256:9ad824308ded0ad06cc716434705f691d4ee0bfd0fb081839d2e426860e7fdca", size = 104755, upload-time = "2025-09-23T09:47:48.256Z" } +sdist = { url = "https://files.pythonhosted.org/packages/8f/28/7c85c8032b91dbe79725b6f17d2fffc595dff06a35c7a30a37bef73a1ab4/typer-0.20.0.tar.gz", hash = "sha256:1aaf6494031793e4876fb0bacfa6a912b551cf43c1e63c800df8b1a866720c37", size = 106492, upload-time = "2025-10-20T17:03:49.445Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/00/22/35617eee79080a5d071d0f14ad698d325ee6b3bf824fc0467c03b30e7fa8/typer-0.19.2-py3-none-any.whl", hash = "sha256:755e7e19670ffad8283db353267cb81ef252f595aa6834a0d1ca9312d9326cb9", size = 46748, upload-time = "2025-09-23T09:47:46.777Z" }, + { url = "https://files.pythonhosted.org/packages/78/64/7713ffe4b5983314e9d436a90d5bd4f63b6054e2aca783a3cfc44cb95bbf/typer-0.20.0-py3-none-any.whl", hash = "sha256:5b463df6793ec1dca6213a3cf4c0f03bc6e322ac5e16e13ddd622a889489784a", size = 47028, upload-time = "2025-10-20T17:03:47.617Z" }, ] [[package]]