diff --git a/Pipfile b/Pipfile index 0c92cb5..40cff1c 100644 --- a/Pipfile +++ b/Pipfile @@ -7,4 +7,5 @@ verify_ssl = true sphinx = "*" pydata-sphinx-theme = "0.13.3" sphinx-tabs = "*" -make = "*" \ No newline at end of file +make = "*" +sphinx-design = "*" diff --git a/Pipfile.lock b/Pipfile.lock index f0fee4b..03ab250 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "17dd2856de93f29781feadfdf8df0119417ea5c39ffe32c829b3ba590ce845a5" + "sha256": "ea3fbe8f423dff79ec4594b03f7948f4050d26f6a8564bd879cda8b022201809" }, "pipfile-spec": 6, "requires": {}, @@ -16,10 +16,11 @@ "default": { "accessible-pygments": { "hashes": [ - "sha256:416c6d8c1ea1c5ad8701903a20fcedf953c6e720d64f33dc47bfb2d3f2fa4e8d", - "sha256:e7b57a9b15958e9601c7e9eb07a440c813283545a20973f2574a5f453d0e953e" + "sha256:40918d3e6a2b619ad424cb91e556bd3bd8865443d9f22f1dcdf79e33c8046872", + "sha256:88ae3211e68a1d0b011504b2ffc1691feafce124b845bd072ab6f9f66f34d4b7" ], - "version": "==0.0.4" + "markers": "python_version >= '3.9'", + "version": "==0.0.5" }, "alabaster": { "hashes": [ @@ -31,11 +32,11 @@ }, "arrow": { "hashes": [ - "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1", - "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2" + "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80", + "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85" ], - "markers": "python_version >= '3.6'", - "version": "==1.2.3" + "markers": "python_version >= '3.8'", + "version": "==1.3.0" }, "babel": { "hashes": [ @@ -47,11 +48,11 @@ }, "beautifulsoup4": { "hashes": [ - "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da", - "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a" + "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b", + "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195" ], - "markers": "python_version >= '3.6'", - "version": "==4.12.2" + "markers": "python_full_version >= '3.7.0'", + "version": "==4.13.4" }, "certifi": { "hashes": [ @@ -164,7 +165,7 @@ "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", + "markers": "sys_platform == 'win32'", "version": "==0.4.6" }, "docutils": { @@ -191,14 +192,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.4.1" }, - "importlib-metadata": { - "hashes": [ - "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4", - "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5" - ], - "markers": "python_version < '3.10'", - "version": "==6.7.0" - }, "jinja2": { "hashes": [ "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", @@ -302,6 +295,7 @@ "sha256:bf41ca6c1c6216e929e28834e404bfc90e080b51915bbe7563b5e6fda70354f0" ], "index": "pypi", + "markers": "python_version >= '3.7'", "version": "==0.13.3" }, "pygments": { @@ -314,11 +308,11 @@ }, "python-dateutil": { "hashes": [ - "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", - "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" + "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", + "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.2" + "version": "==2.9.0.post0" }, "requests": { "hashes": [ @@ -338,26 +332,27 @@ }, "six": { "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", + "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.16.0" + "version": "==1.17.0" }, "snowballstemmer": { "hashes": [ - "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", - "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" + "sha256:6cd7b3897da8d6c9ffb968a6781fa6532dce9c3618a4b127d920dab764a19064", + "sha256:6d5eeeec8e9f84d4d56b847692bacf79bc2c8e90c7f80ca4444ff8b6f2e52895" ], - "version": "==2.2.0" + "markers": "python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==3.0.1" }, "soupsieve": { "hashes": [ - "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8", - "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea" + "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4", + "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a" ], - "markers": "python_version >= '3.7'", - "version": "==2.4.1" + "markers": "python_version >= '3.8'", + "version": "==2.7" }, "sphinx": { "hashes": [ @@ -368,13 +363,23 @@ "markers": "python_version >= '3.11'", "version": "==8.2.3" }, + "sphinx-design": { + "hashes": [ + "sha256:b11f37db1a802a183d61b159d9a202314d4d2fe29c163437001324fe2f19549c", + "sha256:b44eea3719386d04d765c1a8257caca2b3e6f8421d7b3a5e742c0fd45f84e632" + ], + "index": "pypi", + "markers": "python_version >= '3.9'", + "version": "==0.6.1" + }, "sphinx-tabs": { "hashes": [ - "sha256:7cea8942aeccc5d01a995789c01804b787334b55927f29b36ba16ed1e7cb27c6", - "sha256:d2a09f9e8316e400d57503f6df1c78005fdde220e5af589cc79d493159e1b832" + "sha256:991ad4a424ff54119799ba1491701aa8130dd43509474aef45a81c42d889784d", + "sha256:c12d7a36fd413b369e9e9967a0a4015781b71a9c393575419834f19204bd1915" ], "index": "pypi", - "version": "==3.4.1" + "markers": "python_version >= '3.7'", + "version": "==3.4.7" }, "sphinxcontrib-applehelp": { "hashes": [ @@ -424,13 +429,21 @@ "markers": "python_version >= '3.9'", "version": "==2.0.0" }, + "types-python-dateutil": { + "hashes": [ + "sha256:13e80d6c9c47df23ad773d54b2826bd52dbbb41be87c3f339381c1700ad21ee5", + "sha256:2b2b3f57f9c6a61fba26a9c0ffb9ea5681c9b83e69cd897c6b5f668d9c0cab93" + ], + "markers": "python_version >= '3.9'", + "version": "==2.9.0.20250516" + }, "typing-extensions": { "hashes": [ - "sha256:5d8c9dac95c27d20df12fb1d97b9793ab8b2af8a3a525e68c80e21060c161771", - "sha256:935ccf31549830cda708b42289d44b6f74084d616a00be651601a4f968e77c82" + "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", + "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef" ], - "markers": "python_version >= '3.7'", - "version": "==4.7.0" + "markers": "python_version >= '3.8'", + "version": "==4.13.2" }, "urllib3": { "hashes": [ @@ -439,14 +452,6 @@ ], "markers": "python_version >= '3.9'", "version": "==2.4.0" - }, - "zipp": { - "hashes": [ - "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", - "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556" - ], - "markers": "python_version >= '3.7'", - "version": "==3.15.0" } }, "develop": {} diff --git a/source/Tutorials/Commutator.rst b/source/Tutorials/Commutator.rst new file mode 100644 index 0000000..6246674 --- /dev/null +++ b/source/Tutorials/Commutator.rst @@ -0,0 +1,175 @@ +.. _commutator: + +.. role:: raw-html-m2r(raw) + :format: html + +Automating Tether Commutation +============================== + +.. note:: + Following this tutorial requires a 3D capable headstage, an Open Ephys SPI + commutator, and a 3D capable data acquisition system (e.g. a Gen 3 + Acquisition Board or ONIX). + +.. raw:: html + +
+
+ +
+ A demonstration of automated commutation using an + Acquisition Board Gen 3 (not shown), a + Low-profile 3D capable 64ch headstage, and an SPI + commutator. +
+
+
+ +Most acquisition systems rely on a tether to transmit power and data between the +headstage and the data acquisition controller. As the animal moves around during +freely behaving experiments, the tether can get twisted and tangled which risks +exerting torque on the animal. This can be is mitigated by using a commutator, a +device that untwists the tether as the animal moves around while maintaining +electrical continuity between the headstage on the animal and data acquisition +controller. Our commutators don't require tether torque measurements to know in +which direction to compensate for the twists. Instead, they use information from +absolute orientation sensors on our 3D capable headstages. Torque-free automatic +commutation relieves strain from the animal, encouraging more naturalistic +behaviors and enabling long-term recordings. + +This tutorial demonstrates how to automate commutation using the Open Ephys +GUI, a 3D capable headstage, and an Open Ephys commutator. + +Hardware Configuration +####################### + +.. tab-set:: + :sync-group: acquisition-hardware + + .. tab-item:: Acquisition Board + :sync: acquisition-board + + Make sure you have a `3D capable SPI headstage `__ which have an Inertial Measurement Unit (IMU). + + #. Follow the `Acquisition Board Quick Start Guide + `__ + to establish the following necessary acquisition board connections: + + - USB 3.0 connection between the acquisition board and the PC. + + - +5V connection between the acquisition board and an AC power + source. + + #. Follow the `SPI Commutator Connections section + `__ + of the commutator hardware docs to establish the following necessary + commutator connections: + + - SPI connection between the commutator's stator and the + `acquisition board `_. + + - SPI connection between the commutator's rotor and the 3D capable + headstage. + + - USB connection between the commutator and the PC. + + .. tab-item:: ONIX + :sync: onix + + Make sure you have a `3D capable ONIX headstage `__ which have an Inertial Measurement Unit (IMU), specifically, a BNO055 device. + + #. Follow the `ONIX Hardware Guide + `__ + to establish the following necessary ONIX connections: + + - 2x (A & B) coaxial connections between the breakout board and + the PCIe host. + + - SDR connection between the breakout board and the PCIe host. + + #. Follow the `Coax Commutator Connections section + `__ + of the commutator hardware docs to establish the following necessary + commutator connections: + + - Coaxial connection(s) between the commutator's stator(s) and the + acquisition board. + + - Coaxial connection(s) between the commutator's rotor(s) and the 3D + capable headstage. + + - USB connection between the commutator and the PC. + +Software Configuration +#################################### + +#. In the Open Ephys GUI, download the source processor for your hardware + (:doc:`/User-Manual/Plugins/Acquisition-Board` or + :doc:`/User-Manual/Plugins/Onix-Source`) via “File > Plugin Installer”. + +#. Download the signal chain that corresponds to which hardware you are using. + + .. tab-set:: + :sync-group: acquisition-hardware + + .. tab-item:: Acquisition Board + :sync: acquisition-board + + :download:`Acquisition Board Commutator Signal Chain ` + + .. image:: /_static/images/tutorials/commutator/commutator-signal-chain_acq-board.webp + :alt: Acquisition Board Signal Chain for commutation + + .. tab-item:: ONIX + :sync: onix + + :download:`ONIX Commutator Signal Chain ` + + .. image:: /_static/images/tutorials/commutator/commutator-signal-chain_onix-source.webp + :alt: ONIX Signal Chain for commutation + +#. :ref:`Open ` the downloaded signal chain in the GUI. + + .. tab-set:: + :sync-group: acquisition-hardware + + .. tab-item:: Acquisition Board + :sync: acquisition-board + + Confirm that "IMU" occupies one of the slots in headstage port + indicator in the Acquisition Board processor after the + Acquisition Board is initialized and headstage ports are + scanned. + + .. tab-item:: ONIX + :sync: onix + + Confirm that one of the data devices on your headstage is a + "BNO055" and that it is enabled using the processor's + configuration canvas. + +#. Refer to the :doc:`/User-Manual/Plugins/Commutator-Control` page to + configure the Commutator Control processor. + + - The selected Serial port should correspond to the COM port in which the commutator is connected. + + - The selected Stream should correspond to a 3D data stream. If multiple + 3D capable headstages are used, dual commutators, multiple 3D data + streams could be available. Select the one you want to use. + + - For typical usage of an off-the-shelf Open Ephys 3D capable headstage, + adjusting the rotation axis is not necessary. If you mount the headstage + in a non-conventional location, refer to the `IMU Data + `_ article and + `channel maps docs `_ + for your particular hardware to figure out how to set the rotation axis. + +#. Make sure the GUI has connected to the acquisition system and click the ▶ + play button in the top-right corner. The commutator now follows the rotation + of the headstage. + diff --git a/source/Tutorials/index.rst b/source/Tutorials/index.rst index 6491079..f251604 100644 --- a/source/Tutorials/index.rst +++ b/source/Tutorials/index.rst @@ -18,6 +18,7 @@ The following tutorials are available for the Open Ephys GUI: Closed-Loop-Latency Data-Synchronization + Commutator How-To-Make-Your-Own-Plugin Making-Your-Own-Visualizer-Plugin diff --git a/source/User-Manual/Exploring-the-user-interface.rst b/source/User-Manual/Exploring-the-user-interface.rst index 772a2ef..88af888 100644 --- a/source/User-Manual/Exploring-the-user-interface.rst +++ b/source/User-Manual/Exploring-the-user-interface.rst @@ -87,6 +87,8 @@ Menu items Below you'll find documentation for all of the commands available from the GUI's menu: +.. _file: + File ----- * **Open**: Browse for a previously saved signal chain XML file, and load it into the GUI. diff --git a/source/User-Manual/Plugins/Commutator-Control.rst b/source/User-Manual/Plugins/Commutator-Control.rst index d81ee31..98c495c 100644 --- a/source/User-Manual/Plugins/Commutator-Control.rst +++ b/source/User-Manual/Plugins/Commutator-Control.rst @@ -9,7 +9,7 @@ Commutator Control .. image:: ../../_static/images/plugins/commutatorcontrol/oecommutator.png :alt: Annotated settings interface for the Commutator Control plugin -.. csv-table:: Prevents twist in the tether connecting a moving animal to a stationary `Open Ephys Acquisition Board Gen 3 `__. +.. csv-table:: Prevents twist in the tether connecting a moving animal to a stationary `Open Ephys acquisition board Gen3 `__ using orientation data collected from a 3D-capable headstage. :widths: 18, 80 "*Plugin Type*", "Sink" @@ -18,7 +18,9 @@ Commutator Control "*Key Developers*", "Brandon Parks, Aarón Cuevas López" "*Source Code*", "https://github.com/open-ephys-plugins/oe-commutator-control" -.. tip:: For more in-depth documentation on the commutator hardware, please refer to the `Open Ephys Commutators docs site `__. +.. tip:: + - For instructions and an example signal chain for using this plugin, visit the :doc:`/Tutorials/Commutator` tutorial. + - For additional documentation on the commutator hardware, please refer to the `Open Ephys Commutators docs site `__. Installing and upgrading ========================== diff --git a/source/_static/downloads/tutorials/commutator-signal-chain_acq-board b/source/_static/downloads/tutorials/commutator-signal-chain_acq-board new file mode 100644 index 0000000..8c4985c --- /dev/null +++ b/source/_static/downloads/tutorials/commutator-signal-chain_acq-board @@ -0,0 +1,108 @@ + + + + + 1.0.1 + 10 + 18 Sep 2025 14:52:36 + Windows 11 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +