diff --git a/articles/hardware/hs64/configuration.md b/articles/hardware/hs64/configuration.md index 71b41f95..723e0b97 100644 --- a/articles/hardware/hs64/configuration.md +++ b/articles/hardware/hs64/configuration.md @@ -1,7 +1,7 @@ --- uid: hs64_configuration -title: Headstage64 Configuration -hardware: Headstage64 +title: Headstage 64 Configuration +hardware: Headstage 64 configuration: true operator: ConfigureHeadstage64 dataRate: 4.1 @@ -10,10 +10,17 @@ blockReadSize: 4096 workflowLocation: workflow --- -## Configuring the Breakout Board and Headstage64 +## Configuring the Breakout Board and Headstage 64 -The `ConfigureBreakoutBoard` operator configures the Onix Breakout Board. In the Headstage64 example tutorial, it is configured to enable digital inputs to serve as a trigger for the Headstage64's electrical and optical stimulation and to enable monitoring of the percentage of memory occupied. This is accomplished by leaving all of the `ConfigureBreakoutBoard` properties set to their default values except its `Memory Monitor` `Enable` property is set to `True`. +The `ConfigureBreakoutBoard` operator configures the Onix Breakout Board. In the Headstage 64 example tutorial, it is +configured to enable digital inputs to serve as a trigger for the Headstage 64's electrical and optical stimulation and +to enable monitoring of the percentage of memory occupied. This is accomplished by leaving all of the +`ConfigureBreakoutBoard` properties set to their default values except its `Memory Monitor` `Enable` property is set to +`True`. -The `ConfigureHeadstage64` operator is used to configure the Headstage64. In the Headstage64 example tutorial, it is configured to enable streaming of electrophysiology data from a Rhd2164 amplifier, orientation data from the on-board Bno055 IMU, and position data from the Ts4231. This is accomplished in the Headstage64 example workflow by leaving all of the `ConfigureHeadstage64` properties set to their default values. +The `ConfigureHeadstage64` operator is used to configure the Headstage 64. In the Headstage 64 example tutorial, it is +configured to enable streaming of electrophysiology data from a Rhd2164 amplifier, orientation data from the on-board +Bno055 IMU, and position data from the Ts4231. This is accomplished in the Headstage 64 example workflow by leaving all +of the `ConfigureHeadstage64` properties set to their default values. [!INCLUDE [timestamp-info](../../../includes/configuration-timestamp.md)] \ No newline at end of file diff --git a/articles/hardware/hs64/estim.md b/articles/hardware/hs64/estim.md index 7cdf3191..a9a78c4e 100644 --- a/articles/hardware/hs64/estim.md +++ b/articles/hardware/hs64/estim.md @@ -3,7 +3,7 @@ uid: hs64_estim title: Headstage 64 Electrical Stimulation --- -The following excerpt from the Headstage64 [example workflow](xref:hs64_workflow) demonstrates electrical stimulation by +The following excerpt from the Headstage 64 [example workflow](xref:hs64_workflow) demonstrates electrical stimulation by triggering a train of pulses following a press of the △ key on the breakout board. ::: workflow diff --git a/articles/hardware/hs64/load-data.md b/articles/hardware/hs64/load-data.md index 8f163fa1..55f16c97 100644 --- a/articles/hardware/hs64/load-data.md +++ b/articles/hardware/hs64/load-data.md @@ -3,7 +3,7 @@ uid: hs64_load-data title: Load Data --- -The following python script can be used to load and plot the data produced by the Headstage64 [example workflow](xref:hs64_workflow). +The following python script can be used to load and plot the data produced by the Headstage 64 [example workflow](xref:hs64_workflow). [!code-python[](../../../workflows/hardware/hs64/load-hs64.py)] diff --git a/articles/hardware/hs64/overview.md b/articles/hardware/hs64/overview.md index 9ee889a4..de25e0c2 100644 --- a/articles/hardware/hs64/overview.md +++ b/articles/hardware/hs64/overview.md @@ -1,16 +1,17 @@ --- -uid: hs64_hs64 +uid: hs64 title: Headstage 64 --- -These are the devices available on the Headstage64: +These are the devices available on the Headstage 64: - [Rhd2164](xref:hs64_rhd2164): - - 64 electrophysiology channels for passive probes (e.g. tetrode, silicon probe, etc.) sampled at 30 kHz with 16 bit depth + - 64 electrophysiology channels for recording from passive probes (e.g. tetrode, silicon probe, etc.) sampled at 30 + kHz with 16 bit depth - Adjustable analog band-pass filter: - Lower cutoff configurable from 0.1 Hz to 500 Hz - Upper cutoff configurable from 100 Hz to 20 kHz - - Optional adjustable digital high-pass filter with cutoff configurable from 0.146 Hz to 3309 Hz + - Optional adjustable digital high-pass filter with cutoff configurable from 0.146 Hz to 3.309 kHz - Three auxiliary ADC channels sampled at 30 kHz with 16 bit depth - [Bno055](xref:hs64_bno055): 9-axis IMU for real-time, 3D orientation tracking sampled up to ~100 Hz for easy automated commutation with Open Ephys commutators - [Ts4231](xref:hs64_ts4231): 3x HTC Vive Lighthouse receivers for real-time, 3D position tracking sampled at 30 Hz per receiver in ideal conditions @@ -20,10 +21,12 @@ These are the devices available on the Headstage64: - The stimulation waveform is highly configurable via the 's properties. > [!TIP] -> For a detailed explanation of the Rhd2164 amplifier's properties, read the [datasheet](https://intantech.com/files/Intan_RHD2164_datasheet.pdf). +> Visit the +> [Headstage 64 Hardware Guide](https://open-ephys.github.io/onix-docs/Hardware%20Guide/Headstages/headstage-64/index.html) +> to learn more about the hardware such as weight, dimensions, and proper power voltages. > [!TIP] -> Visit the [Headstage64 Hardware Guide](https://open-ephys.github.io/onix-docs/Hardware%20Guide/Headstages/headstage-64/index.html) to learn more about the hardware such as weight, dimensions, and proper power voltages. +> Visit the [Headstage 64 Hardware Guide](https://open-ephys.github.io/onix-docs/Hardware%20Guide/Headstages/headstage-64/index.html) to learn more about the hardware such as weight, dimensions, and proper power voltages. -The following pages in the Headstage64 Guide provide an example workflow and a +The following pages in the Headstage 64 Guide provide an example workflow and a breakdown of its components. \ No newline at end of file diff --git a/articles/hardware/hs64/rhd2164.md b/articles/hardware/hs64/rhd2164.md index 4d7d3c6f..3513874a 100644 --- a/articles/hardware/hs64/rhd2164.md +++ b/articles/hardware/hs64/rhd2164.md @@ -1,9 +1,10 @@ --- uid: hs64_rhd2164 -title: Headstage 64 Rhd2164 +title: Rhd2164 --- -The following excerpt from the Headstage64 [example workflow](xref:hs64_hs64) demonstrates the Rhd2164 functionality by streaming and saving data from the Rhd2164 device. +The following excerpt from the Headstage 64 [example workflow](xref:hs64) demonstrates the Rhd2164 functionality by +streaming and saving data from the Rhd2164 device. ::: workflow ![/workflows/hardware/hs64/rhd2164.bonsai workflow](../../../workflows/hardware/hs64/rhd2164.bonsai) diff --git a/articles/hardware/hs64/ts4231.md b/articles/hardware/hs64/ts4231.md index 2f9818e2..9ec8cf90 100644 --- a/articles/hardware/hs64/ts4231.md +++ b/articles/hardware/hs64/ts4231.md @@ -3,7 +3,7 @@ uid: hs64_ts4231 title: Headstage 64 Ts4231 --- -The following excerpt from the Headstage64 [example workflow](xref:hs64_hs64) demonstrates the Headstage64's position +The following excerpt from the Headstage 64 [example workflow](xref:hs64) demonstrates the Headstage 64's position tracking capabilities. ::: workflow @@ -12,9 +12,9 @@ tracking capabilities. The operator generates a sequence of [TS4231V1PositionDataFrames](xref:OpenEphys.Onix1.TS4231V1PositionDataFrame). A `TS4231V1PositionDataFrame` is emitted -when a receiver on the Headstage64 captures a sequence of 12 optical signals from a pair of lighthouses which occurs at +when a receiver on the Headstage 64 captures a sequence of 12 optical signals from a pair of lighthouses which occurs at 30 Hz. Therefore, with no occlusions, the maximum achievable sample rate is 30 Hz per receiver. There are three -receivers on the Headstage64, so `TS4231V1PositionData` can emit up to 3 `TS4231V1PositionDataFrames` in a single 30 Hz +receivers on the Headstage 64, so `TS4231V1PositionData` can emit up to 3 `TS4231V1PositionDataFrames` in a single 30 Hz sampling cycle. Of course, if occlusions cause receivers to miss optical signals, this rate will be reduced. The `TS4231V1PositionData`'s `DeviceName` property is set to "Headstage64/TS4231V1". This links the diff --git a/articles/hardware/hs64/workflow.md b/articles/hardware/hs64/workflow.md index 92bfb045..e4b38d06 100644 --- a/articles/hardware/hs64/workflow.md +++ b/articles/hardware/hs64/workflow.md @@ -1,12 +1,12 @@ --- uid: hs64_workflow -title: Headstage64 Example Workflow +title: Headstage 64 Example Workflow --- The example workflow below can by copy/pasted into the Bonsai editor using the clipboard icon in the top right. This workflow: - Captures electrophysiology data from passive probes via the RHD2164 amplifier and saves it to disk. - Captures orientation data from the Bno055 IMU and saves it to disk. -- Monitors the Headstage64 port status. +- Monitors the Headstage 64 port status. - Automatically commutates the tether if there is a proper commutator connection. - Applies electrical stimulation triggered by pressing the breakout board's △ key. - Applies optical stimulation triggered by pressing the breakout board's ◯ key. diff --git a/articles/hardware/np2e/gui.md b/articles/hardware/np2e/gui.md index 6a2c37d5..63590c6e 100644 --- a/articles/hardware/np2e/gui.md +++ b/articles/hardware/np2e/gui.md @@ -38,7 +38,7 @@ In addition to the absolute number of channels, there are other restrictions in ### Keeping or discarding configuration settings -While the GUI is open, any changes to the configuration settings can be freely modified and will not affect the configuration unless `Okay` is pressed. This includes all aspects of the configuration, such as which electrodes are enabled, the chosen reference channel, and the probe calibration file. +While the GUI is open, any changes to the configuration settings can be freely modified and will not affect the configuration unless Ok is pressed. This includes all aspects of the configuration, such as which electrodes are enabled, the chosen reference channel, and the probe calibration file. > [!NOTE] > The hardware is not actually configured until the workflow starts. diff --git a/articles/hardware/np2e/np2.md b/articles/hardware/np2e/np2.md index 417afd24..0e818557 100644 --- a/articles/hardware/np2e/np2.md +++ b/articles/hardware/np2e/np2.md @@ -28,7 +28,7 @@ The operator generates a sequence of corresponding configuration operator. - `ProbeIndex` is set to "ProbeA". This links the data generated by this probe to the probe in port A of the headstage. -The relevant properties are selected from the `NeuropixelsV2eDataFrame` by right-clicking the `NeuropixelsV2eData` +The relevant members are selected from the `NeuropixelsV2eDataFrame` by right-clicking the `NeuropixelsV2eData` operator and choosing the following Output members: `Clock`, and `AmplifierData`. The [MatrixWriter](xref:Bonsai.Dsp.MatrixWriter) operators save the selected members to files with the following format: `np2-a-clock_.raw` and `np2-a-amp.raw`, respectively. diff --git a/articles/hardware/rhs2116/configuration.md b/articles/hardware/rhs2116/configuration.md new file mode 100644 index 00000000..81bd51fe --- /dev/null +++ b/articles/hardware/rhs2116/configuration.md @@ -0,0 +1,31 @@ +--- +uid: rhs2116_configuration +title: Headstage Rhs2116 Configuration +hardware: Headstage Rhs2116 +configuration: true +operator: ConfigureHeadstageRhs2116 +dataRate: 2.1 +timeUntilFullBuffer: 1 ms +blockReadSize: 4096 +workflowLocation: overview +--- + +## Configuring the Breakout Board and Headstage Rhs2116 + +The `ConfigureBreakoutBoard` operator configures the Onix Breakout Board. In the Headstage Rhs2116 +example tutorial, it is configured to enable digital inputs to serve as a trigger for the Headstage +Rhs2116's electrical and optical stimulation and to enable monitoring of the percentage of memory +occupied. This is accomplished by leaving all of the `ConfigureBreakoutBoard` properties set to +their default values except its Memory Monitor Enable property is set to "True". + +The `ConfigureHeadstageRhs2116` operator is used to configure the Headstage Rhs2116. In the +Headstage Rhs2116 example tutorial, it is configured to enable streaming of electrophysiology data +from a Rhs2116 amplifier, orientation data from the on-board Bno055 IMU, and position data from the +Ts4231. This is accomplished in the Headstage Rhs2116 example workflow by leaving all of the +`ConfigureHeadstageRhs2116` properties set to their default values. + +[!INCLUDE [timestamp-info](../../../includes/configuration-timestamp.md)] + +> [!TIP] +> For additional details on how to configure the headstage, as well as how to +> set stimulus waveforms, check out the page. \ No newline at end of file diff --git a/articles/hardware/rhs2116/gui.md b/articles/hardware/rhs2116/gui.md new file mode 100644 index 00000000..2fa361bc --- /dev/null +++ b/articles/hardware/rhs2116/gui.md @@ -0,0 +1,272 @@ +--- +uid: rhs2116_gui +title: Rhs2116 GUI +--- + +The `Rhs2116` headstage has a graphical user interface when the `OpenEphys.Onix1.Design` package is +downloaded. For more information on how to install that library, check out the + page. + +## Overview + +The GUI for `Rhs2116Headstage` allows for an easy way to change settings, as well as the ability to +set waveform parameters and visualize the effect. From the GUI, you can: + +- Modify stimulus parameters for all 32 channels + - Visualize waveforms across all channels + - Select specific channels using a ProbeInterface representation of the hardware + - Remove or add stimulus waveform parameters to one or more channels at a time + - Save and load channel configuration +- Change filter settings for recording data + - See or the + [Rhs2116 datasheet](https://intantech.com/files/Intan_RHS2116_datasheet.pdf) for more + information on filter settings + +This configuration GUI can be accessed by double-clicking on the `ConfigureHeadstageRhs2116` +operator. + +

+ +

+ +### Stimulus parameters + +The GUI accepts values for stimulation waveform parameters in metric units (e.g., milliseconds and +microamps). In the backend, the GUI converts metric units into units that can be written to the +hardware. Because the conversion between metric values and converted values is not always exact, the +GUI might automatically update the metric value initially input by the user to a metric value that +more accurately represents the converted value that will be written to hardware. This update is +visually displayed in the same text box where the user initially input their values and happens when +the focus moves away from the active text box (e.g., the user presses Tab or clicks +somewhere outside of the text box). + +Below is a table describing the various stimulus parameters that can be applied to each channel +including the resolution and limits for each parameter. + +| Parameter Name | Minimum Value | Maximum Value | Resolution | Remarks | +| ----- | ---- | ---- | ---- | ---- | +| `Biphasic Symmetric` | Unchecked | Checked | n/a | If checked, the positive and negative segments of each pulse will be symmetric | +| `Anodic First` | Unchecked | Checked | n/a | If checked, the anodic (positive) segment will be delivered first for every pulse | +| `Delay` | 0 ms | n/a | 0.03312 ms | Time between a trigger being received and the first pulse is delivered | +| `Inter-Pulse` | 0 ms | n/a | 0.03312 ms | Time between positive-to-negative (or negative-to-positive) stimulation for a single pulse | +| `Amplitude` | 0 µA | 2550 µA | Dependent on the step size | Enter the requested amplitude, and the actual value that will be applied on hardware based on the current step size is displayed underneath in the `Step Size` text box | +| `Step Size` | 0.01 µA | 25 µA | [Step Size](xref:OpenEphys.Onix1.Rhs2116StepSize) | Automatically calculated to optimize difference between requested and actually possible amplitude | +| `Pulse Width` | 0.03312 ms | n/a | 0.03312 ms | Time between each pulse's rising edge and falling edge (or vice-versa) | +| `Inter-Stimulus` | 0.03312 ms | n/a | 0.03312 ms | Time between successive pulses. Can be 0 if there is only one pulse | +| `Number of Pulses` | 1 | n/a | 1 | Number of pulses that are sent per trigger received | + +### ProbeInterface + +The `Rhs2116Headstage` GUI uses the +[ProbeInterface](https://probeinterface.readthedocs.io/en/main/index.html) format to draw the probes +and electrodes visually. For more information on the ProbeInterface JSON format, check out their +[format specifications](https://probeinterface.readthedocs.io/en/main/format_spec.html) page. + +When opening the GUI, there is a default probe configuration that is loaded and drawn which can be +saved to a [JSON file](#save-probeinterface-file). Conversely, an existing ProbeInterface JSON file +can be [loaded](#load-probeinterface-file) to update the current channel configuration. If the +default configuration is needed, it can be [loaded again](#load-default-configuration) at any time. + +## Using the Channel Selection Window + +Upon first opening the GUI, the main window will be blank if no stimulus parameters have been +defined. The window should look something like this: + +

+ +

+ +### Selecting channels + +Once a GUI has been [opened](#overview), the panel in the top right will be populated with a default +`Rhs2116` probe group, which is a graphical representation of the channels based on their location +on the PCB. The probe group is oriented where the tether is located above the channels shown. Below +are the controls used to navigate within this panel to view and choose electrodes. + +- Mouse Controls + - Mouse wheel zooms in/out towards the cursor + - Left-click and drag will select electrodes within the drawn rectangle + - Left-click on an electrode will toggle selection for that electrode + - Left-click on empty space will clear the electrode selection + - Middle-click and drag will pan the electrodes + +When channels are selected, they will be highlighted by a green circle around the contact number, +and the corresponding waveforms will be plotted in the main window; any channels that are +not selected will not be plotted. + +### Zoom and pan limits + +When zooming in and out, there are limits in both directions. The probe can only be zoomed out to +the point that the entire probe is visible within the panel and no more. Similarly, while zooming in +the probe will not zoom in past a certain point. + +In addition to the absolute zoom limits, the panel will automatically shift the probe to ensure it +is always in view. This is handled each time the probe is zoomed or panned. + +## Define Stimuli + +The following sections define how to apply parameters, read existing parameters, and clear parameters from channels. +They also provide example stimulus parameters and descriptions of error codes that can appear in the status strip to +facilitate troubleshooting. + +### Applying parameters + +The first step is to [select the channel(s)](#selecting-channels) where the parameters will be applied. +Note that the same set of parameters can be simultaneously applied to any or all channels without +restriction. If any channel already has stimulation parameters, note that selecting channels will +only plot the selected channels in the main window. In the example below, channels 7, 8, 23, and 24 +are selected. + +

+ +

+ +Enter the [stimulus parameters](#stimulus-parameters) that you want to apply to the currently +selected channel(s). Note that the value initially input by the user might update when the focus +moves away from the current text box (e.g., the user presses Tab or clicks somewhere +outside of the text box) to reflect the actual value that will be written based on the resolutions +listed above. In the example below, we can see that the table listed below as well shows the typed +values compared to the actual values list. + +| Parameter | Requested Value | Listed Value | +| --- | --- | --- | +| `Delay [ms]` | 5 | 5.00 | +| `Inter-Pulse [ms]` | 0 | 0.00 | +| `Anodic Amplitude [µA]` | 0.1 | 0.1 | +| `Anodic Pulse Width [ms]` | 23 | 22.99 | +| `Inter-Stimulus [ms]` | 100 | 99.99 | + +

+ +

+ +> [!TIP] +> If a channel already has stimulus parameters applied to it, it is easy to change individual +> parameters by only writing in the applicable text box. Any boxes without input will not be +> applied. + +The selected settings can be applied to the selected channels by pressing Apply, and the +waveforms will be plotted in the main window as shown below. + +

+ +

+ +To see the values that will be written to the hardware, click on the `Table` tab in the top left, +next to the `Stimulus Waveform` tab. This will open up a table that displays all 32 channels, and +the value in steps and samples that could be written to the hardware. Any changes made to the +channels parameters will be reflected in this window. An example of what the empty table looks like +when no parameters have been set is below. + +

+ +

+ +### Reading current parameters + +To easily copy settings from one channel to another, or to see what the current settings are on a +channel prior to updating then settings, click on a single channel in the channel selection window, +or click-and-drag until a single channel is selected, and then press on the Read button +in the bottom right. If more than one channel is selected, or no channels are selected, a window +will pop up prompting the user to select a single channel. + +To test this, select a channel that has not been configured yet and press Read. The +parameter fields will be populated with zeroes as shown in the image below: + +

+ +

+ +Now select a channel that has been configured and press Read to read that channel's +current parameters. For example, if one of the channels that was configured in the [Applying +parameters](#applying-parameters) section above is selected, the image below shows the result of the +operation: + +

+ +

+ +### Clearing current parameters + +To quickly remove the current stimulus parameter configuration from any given channel(s), select as +many channels as are needed and then press the Clear button. This will reset the +channel(s) to their default configuration, which removes all parameters. The waveforms will be +updated to show that there are no pulses being delivered on the channel(s). + +## Status strip + +The bottom left corner of the window shows the current status of the configuration settings. Below +is a table showing the possible statuses, as well as additional information on what each message +means and how invalid settings can be modified to allow the settings to be saved. In addition to the +status message, there is an additional message in the status strip that keeps a tally of how complex +the waveforms are. This is displayed as a total percentage of the number of slots used (or will be +used) by the hardware. Increasing the number of pulses will use more slots, and introducing pulses +across different channels that occur at different rates will use more slots. + +| Image | Status Label | Remarks | +| ---- | ---- | ---- | +| ![Valid stimulus sequence](../../../images/StatusReadyImage.png) | `Valid Stimulus Sequence` | There are no issues with the current configuration, and the number of slots fits within the hardware boundaries. Settings can be saved. | +| ![Invalid - too many pulses](../../../images/StatusBlockedImage.png) | `Invalid Sequence - Too many pulses defined` | The resulting waveform is too complex (for example, using the same settings as above but setting 350 pulses will give this error.). Reduce the complexity of the waveform before saving the configuration. | +| ![Invalid Sequence](../../../images/StatusCriticalImage.png) | `Invalid Sequence - Contact XX, Reason: Y` | Some combination of stimulus parameter settings is invalid and must be fixed before changes can be saved. The first contact with an invalid parameter set will be listed here, along with the actual reason. [Below](#reasons-for-invalid-sequence-status) is a list of possible reasons, but this is not an exhaustive list. | + +> [!TIP] +> In the case that there is an error defined on a particular channel, but it is unclear why the error +exists since it appears that nothing is configured on that channel, try selecting the channel and +[clear the configuration settings](#clearing-current-parameters) + +### Reasons for invalid sequence status + +| Reason | Explanation | +| --- | --- | +| `Stimuli = 0, Cathodic Width > 0` | The cathodic pulse width is greater than zero, but the number of pulses defined on the contact is zero. | +| `Stimuli = 0, Anodic Width > 0` | The anodic pulse width is greater than zero, but the number of pulses defined on the contact is zero. | +| `Stimuli = 0, ISI > 0` | The inter-stimulus interval is greater than zero, but the number of pulses defined on the contact is zero. | +| `Stimuli = 0, Anodic Steps > 0` | The number of anodic amplitude steps is greater than zero, but the number of pulses defined on the contact is zero. | +| `Stimuli = 0, Cathodic Steps > 0` | The number of cathodic amplitude steps is greater than zero, but the number of pulses defined on the contact is zero. | +| `Stimuli = 0, Delay > 0` | The delay is greater than zero, but the number of pulses defined on the contact is zero. | +| `Stimuli = 0, Dwell (Inter-Pulse) > 0` | The inter-pulse interval is greater than zero, but the number of pulses defined on the contact is zero. | +| `Anodic Width = 0, Anodic Steps > 0` | The anodic amplitude is greater than zero, but the anodic pulse-width is set to zero on this contact. | +| `Cathodic Width = 0, Cathodic Steps > 0` | The cathodic amplitude is greater than zero, but the cathodic pulse-width is set to zero on this contact. | +| `ISI = 0, Stimuli > 1` | The inter-stimulus interval is equal to zero, but the number of stimuli is greater than one. | + +## Keeping or discarding settings + +While the GUI is open, any changes to the configuration settings can be freely modified and will not +affect the configuration unless Ok is pressed. This includes all aspects of the +configuration, such as filter settings and all stimulus waveform parameters. + +> [!NOTE] +> The hardware is not actually configured until the workflow starts. + +If the window is closed any other way (such as by pressing `Cancel` or pressing the X to +close the window), any changes made *will not* be saved. If the current settings are considered +invalid (see [the table above](#reasons-for-invalid-sequence-status) for specific reasons why some +settings are invalid), they also *will not* be saved even if Ok is pressed. A message box +will pop up warning that the settings will not be saved, giving the opportunity to continue editing +and correct any settings that need modification. + +## Save ProbeInterface file + +To save a [ProbeInterface](#probeinterface) JSON file fully describing the probe, including which +electrodes are currently enabled, go to the File drop-down menu, and select `Channel Configuration → +Save Channel Configuration`. This will open a file dialog window to save the new JSON file. Choose a +folder location and a name for the file, then hit `Save`. This will export the current channel +configuration. This is a useful way to save any manually enabled electrodes as a backup, or to +easily switch between different configurations between recordings. + +## Load ProbeInterface file + +To load a [ProbeInterface](#probeinterface) JSON file, navigate to the File drop-down menu and +select `Channel Configuration → Load Channel Configuration`. This will open a file dialog window; +browse to the existing JSON file, select it and press `Open` to load the channel configuration. The +new probe shape will be loaded and drawn, with the enabled electrodes highlighted as usual. + +> [!NOTE] +> When loading a new configuration, the total number of electrodes must match the existing +> configuration, and the number of enabled electrodes must match. + +## Load default configuration + +To load the default channel configuration at any time, navigate to the File drop-down menu and +choose `Channel Configuration → Load Default Channel Configuration`. This will load the default +configuration, with the default orientation as described above. diff --git a/articles/hardware/rhs2116/load-data.md b/articles/hardware/rhs2116/load-data.md new file mode 100644 index 00000000..0d46af29 --- /dev/null +++ b/articles/hardware/rhs2116/load-data.md @@ -0,0 +1,14 @@ +--- +uid: rhs2116_load-data +title: Load Data +--- + +The following python script can be used to load and plot the data produced by the Headstage Rhs2116 [example workflow](xref:rhs2116). + +[!code-python[](../../../workflows/hardware/rhs2116/load-rhs2116.py)] + +> [!NOTE] +> This script will attempt to load entire files into arrays. For long recordings, data will need to +> be split into more manageable chunks by: +> - Modifying this script to partially load files +> - Modifying the workflow to cyclically create new files after a certain duration diff --git a/articles/hardware/rhs2116/memory-monitor.md b/articles/hardware/rhs2116/memory-monitor.md new file mode 100644 index 00000000..16b861ac --- /dev/null +++ b/articles/hardware/rhs2116/memory-monitor.md @@ -0,0 +1,8 @@ +--- +uid: rhs2116_memory-monitor +title: Memory Monitor +memoryMonitor: true +hardware: Headstage Rhs2116 +hardwareOperator: HeadstageRhs2116 +workflowLocation: overview +--- diff --git a/articles/hardware/rhs2116/overview.md b/articles/hardware/rhs2116/overview.md new file mode 100644 index 00000000..5066af56 --- /dev/null +++ b/articles/hardware/rhs2116/overview.md @@ -0,0 +1,30 @@ +--- +uid: rhs2116 +uid: rhs2116 +title: Headstage Rhs2116 +--- + +These are the devices available on the Headstage Rhs2116: + +- [Rhs2116 Pair](xref:rhs2116): + - 32 electrophysiology channels that are independently configurable to record electrophysiological signals from or + deliver electrical stimuli to passive probes. + - 30193.2367 Hz sample rate with 16 bit depth + - Adjustable analog band-pass filter: + - Lower cutoff configurable from 0.1 Hz to 1 kHz + - Upper cutoff configurable from 100 Hz to 20 kHz + - Lower cutoff during recovery immediately after stimulus configurable from 0.1 Hz to 1 kHz + - Optional adjustable digital high-pass filter with cutoff configurable from 0.146 Hz to 3.309 kHz +- [Electrical Stimulation](xref:rhs2116_stimulate): Single current source with ±15V compliance voltage and automatic electrode discharge + - The stimulation waveform is highly configurable via the 's properties. + +> [!TIP] +> Visit the +> [Headstage Rhs2116 Hardware Guide](https://open-ephys.github.io/onix-docs/Hardware%20Guide/Headstages/headstage-rhs2116.html) +> to learn more about the hardware such as weight, dimensions, and proper power voltages. + +::: workflow +![/workflows/hardware/rhs2116/rhs2116.bonsai workflow](../../../workflows/hardware/rhs2116/rhs2116.bonsai) +::: + +The following pages in the Headstage Rhs2116 Guide provide a breakdown of the above example workflow. \ No newline at end of file diff --git a/articles/hardware/rhs2116/port-status.md b/articles/hardware/rhs2116/port-status.md new file mode 100644 index 00000000..37b0db8f --- /dev/null +++ b/articles/hardware/rhs2116/port-status.md @@ -0,0 +1,10 @@ +--- +uid: rhs2116_port-status +title: Headstage Rhs2116 Port Status +hardware: Headstage Rhs2116 +portStatus: true +configureHardwareOperator: ConfigureHeadstageRhs2116 +hardwareOperator: HeadstageRhs2116 +workflowLocation: overview +--- + diff --git a/articles/hardware/rhs2116/rhs2116-record.md b/articles/hardware/rhs2116/rhs2116-record.md new file mode 100644 index 00000000..bb33be19 --- /dev/null +++ b/articles/hardware/rhs2116/rhs2116-record.md @@ -0,0 +1,29 @@ +--- +uid: rhs2116_record +title: Rhs2116 Recording +--- + +The following excerpt from the HeadstageRhs2116 [example workflow](xref:rhs2116) demonstrates the +Rhs2116 recording functionality by streaming and saving data from the Rhs2116 device. + +::: workflow +![/workflows/hardware/rhs2116/rhs2116-record.bonsai workflow](../../../workflows/hardware/rhs2116/rhs2116-record.bonsai) +::: + +The operator generates a sequence of +s using the following settings: +- The BufferSize property is set to 30. Each `Rhs2116DataFrame` will contain a [1 x 30 sample] Clock + vector, a [32 channel x 30 sample] AmplifierData matrix, and a [32 channel x 30 sample] DcData + matrix. This corresponds to 1 ms of data per data frame. +- The DeviceName property is set to "HeadstageRhs2116/Rhs2116". This links `Rhs2116Data` to the + Rhs2116s on the Headstage Rhs2116. + +The relevant properties are extracted from the `Rhs2116DataFrame` by right-clicking the +`Rhs2116Data` operator, and choosing the following Output members: Clock, AmplifierData, and DcData. +The s save the selected members to files with the following +formats: `rhs2116pair-clock_.raw`, `rhs2116pair-ac_.raw`, and +`rhs2116pair-dc_.raw`, respectively. + +> [!TIP] +> For more details about configuring the Rhs2116 and its data, read the +> [datasheet](https://intantech.com/files/Intan_RHS2116_datasheet.pdf). \ No newline at end of file diff --git a/articles/hardware/rhs2116/rhs2116-stimulate.md b/articles/hardware/rhs2116/rhs2116-stimulate.md new file mode 100644 index 00000000..2cc846e3 --- /dev/null +++ b/articles/hardware/rhs2116/rhs2116-stimulate.md @@ -0,0 +1,36 @@ +--- +uid: rhs2116_stimulate +title: Rhs2116 Stimulating +--- + +The following excerpt from the HeadstageRhs2116 [example workflow](xref:rhs2116) demonstrates the Rhs2116 +stimulation functionality by streaming and saving data from the Rhs2116 device. + +::: workflow +![/workflows/hardware/rhs2116/rhs2116-stimulate.bonsai workflow](../../../workflows/hardware/rhs2116/rhs2116-stimulate.bonsai) +::: + +The operator generates a sequence of +s. Although the digital inputs are sampled at 4 Mhz, +these data frames are only emitted when the port status changes (i.e., when a pin, button, or switch +is toggled). In the Breakout Board example workflow, the `DigitalInput`'s DeviceName property is +set to "BreakoutBoard/DigitalInput". This links the `DigitalInput` operator to the Breakout Board's +digital inputs. + + is selected from the `DigitalInputDataFrame`. It is an +enumerator with values that correspond to bit positions of the breakout board's digital port. +`Buttons` connects to `Condition` which is inspectable with the F12 hotkey. `Condition` +contains a `HasFlags` operator. Because `HasFlags`'s Value property is set to "Triangle", it outputs +"True" when the △ button is pressed. `Condition` passes `BreakoutButtonState` to `Double` +when the its internal conditional statement is evaluated is true. `Double` emits a value of type + to anytime it receives an item in +its upstream sequence. + +When `Rhs2116StimulusTrigger` receives a double from the upstream sequence, a stimulus waveform is +triggered. Its DeviceName property is set to "HeadstageRhs2116/StimulusTrigger" to link this +operator to the Rhs2116s on the Headstage Rhs2116. [Open the Headstage RHS2116 +GUI](xref:rhs2116_gui) to edit the stimulus waveform. + +> [!TIP] +> For more details about configuring the Rhs2116 and its stimulation capabilities, read the +> [datasheet](https://intantech.com/files/Intan_RHS2116_datasheet.pdf). \ No newline at end of file diff --git a/articles/toc.yml b/articles/toc.yml index cc38e2a9..a8ed9c57 100644 --- a/articles/toc.yml +++ b/articles/toc.yml @@ -82,6 +82,21 @@ - name: Memory Monitor href: hardware/hs64/memory-monitor.md - href: hardware/hs64/load-data.md + - href: hardware/rhs2116/overview.md + items: + - name: Configuration + href: hardware/rhs2116/configuration.md + - name: Rhs2116 GUI + href: hardware/rhs2116/gui.md + - name: Port Status + href: hardware/rhs2116/port-status.md + - name: Rhs2116 Electrophysiology Data + href: hardware/rhs2116/rhs2116-record.md + - name: Rhs2116 Stimulation + href: hardware/rhs2116/rhs2116-stimulate.md + - name: Memory Monitor + href: hardware/rhs2116/memory-monitor.md + - href: hardware/rhs2116/load-data.md - href: hardware/ucla-miniscope-v4/overview.md items: - name: Configuration @@ -93,4 +108,4 @@ - name: Orientation Data & Commutation href: hardware/ucla-miniscope-v4/bno055.md - name: Memory Monitor - href: hardware/ucla-miniscope-v4/memory-monitor.md \ No newline at end of file + href: hardware/ucla-miniscope-v4/memory-monitor.md diff --git a/images/StatusBlockedImage.png b/images/StatusBlockedImage.png new file mode 100644 index 00000000..3e35e47e Binary files /dev/null and b/images/StatusBlockedImage.png differ diff --git a/images/StatusCriticalImage.png b/images/StatusCriticalImage.png new file mode 100644 index 00000000..4762e0fe Binary files /dev/null and b/images/StatusCriticalImage.png differ diff --git a/images/StatusReadyImage.png b/images/StatusReadyImage.png new file mode 100644 index 00000000..cbe7c2eb Binary files /dev/null and b/images/StatusReadyImage.png differ diff --git a/images/rhs2116-gui-tut/bonsai-where-to-click.png b/images/rhs2116-gui-tut/bonsai-where-to-click.png new file mode 100644 index 00000000..2fa4479c Binary files /dev/null and b/images/rhs2116-gui-tut/bonsai-where-to-click.png differ diff --git a/images/rhs2116-gui-tut/channel-selection-7-8-23-24.png b/images/rhs2116-gui-tut/channel-selection-7-8-23-24.png new file mode 100644 index 00000000..42e293b7 Binary files /dev/null and b/images/rhs2116-gui-tut/channel-selection-7-8-23-24.png differ diff --git a/images/rhs2116-gui-tut/define-stimuli-a.png b/images/rhs2116-gui-tut/define-stimuli-a.png new file mode 100644 index 00000000..6e8893f9 Binary files /dev/null and b/images/rhs2116-gui-tut/define-stimuli-a.png differ diff --git a/images/rhs2116-gui-tut/define-stimuli-read-applied-parameters.png b/images/rhs2116-gui-tut/define-stimuli-read-applied-parameters.png new file mode 100644 index 00000000..092158d3 Binary files /dev/null and b/images/rhs2116-gui-tut/define-stimuli-read-applied-parameters.png differ diff --git a/images/rhs2116-gui-tut/define-stimuli-read-defaults.png b/images/rhs2116-gui-tut/define-stimuli-read-defaults.png new file mode 100644 index 00000000..742b1e73 Binary files /dev/null and b/images/rhs2116-gui-tut/define-stimuli-read-defaults.png differ diff --git a/images/rhs2116-gui-tut/gui-no-waveforms.png b/images/rhs2116-gui-tut/gui-no-waveforms.png new file mode 100644 index 00000000..c998cbeb Binary files /dev/null and b/images/rhs2116-gui-tut/gui-no-waveforms.png differ diff --git a/images/rhs2116-gui-tut/table.png b/images/rhs2116-gui-tut/table.png new file mode 100644 index 00000000..91ff9b48 Binary files /dev/null and b/images/rhs2116-gui-tut/table.png differ diff --git a/images/rhs2116-gui-tut/waveforms-7-8-23-24-a.png b/images/rhs2116-gui-tut/waveforms-7-8-23-24-a.png new file mode 100644 index 00000000..e48dd638 Binary files /dev/null and b/images/rhs2116-gui-tut/waveforms-7-8-23-24-a.png differ diff --git a/img-src/rhs2116-gui/bonsai-where-to-click.xcf b/img-src/rhs2116-gui/bonsai-where-to-click.xcf new file mode 100644 index 00000000..a9c4b0e8 Binary files /dev/null and b/img-src/rhs2116-gui/bonsai-where-to-click.xcf differ diff --git a/includes/configuration-timestamp.md b/includes/configuration-timestamp.md index 2e012baf..af4423ec 100644 --- a/includes/configuration-timestamp.md +++ b/includes/configuration-timestamp.md @@ -1,8 +1,6 @@ When the workflow is started, the current time (based on -[Coordinated Universal Time](https://en.wikipedia.org/wiki/Coordinated_Universal_Time)) -is saved, along with global hardware parameters governing data acquisition. This is -accomplished using a [TimeStamp](https://bonsai-rx.org/docs/api/Bonsai.Reactive.Timestamp.html) operator -to capture the computer's wall clock time. This -`Timestamp` is saved along with `ContextTask`'s properties (e.g., -`AcquisitionClockHz`, `BlockReadSize`, `BlockWriteSize`) to a csv -file (`start-time_.csv`) when the the workflow is started. \ No newline at end of file +[Coordinated Universal Time](https://en.wikipedia.org/wiki/Coordinated_Universal_Time)) is saved, along with global +hardware parameters governing data acquisition. This is accomplished using a +[TimeStamp](https://bonsai-rx.org/docs/api/Bonsai.Reactive.Timestamp.html) operator to capture the computer's wall clock +time. The timestamp is saved along with `ContextTask`'s properties (e.g. AcquisitionClockHz, BlockReadSize, +BlockWriteSize) to a csv file (`start-time_.csv`) when the workflow is started. \ No newline at end of file diff --git a/template/partials/hardware/bno055.tmpl.partial b/template/partials/hardware/bno055.tmpl.partial index 11579ff4..a534eeef 100644 --- a/template/partials/hardware/bno055.tmpl.partial +++ b/template/partials/hardware/bno055.tmpl.partial @@ -1,5 +1,8 @@

- The following excerpt from the {{{hardware}}} example workflow demonstrates Bno055 functionality, saves Bno055 data, and commutates the {{{hardware}}} if there is a proper commutator connection. + The following excerpt from the {{{hardware}}} example + workflow visualizes Bno055 data, saves Bno055 data, and commutates the {{{hardware}}} if there + is a proper commutator connection.

@@ -7,18 +10,41 @@

- The {{{bnoOperator}}} operator generates a sequence of Bno055DataFrames. The DeviceName property is set to "{{{hardwareOperator}}}/{{{bnoOperator}}}". This links the {{{bnoOperator}}} operator to the corresponding configuration operator. + The {{{bnoOperator}}} + operator generates a sequence of Bno055DataFrames. Its DeviceName property is + set to "{{{hardwareOperator}}}/{{{bnoOperator}}}" which links {{{bnoOperator}}} to + the Bno055 on the {{{hardware}}}.

- The CsvWriter operator writes the entire Bno055DataFrame to a file with the following format: bno055_<filecount>.csv. Because CsvWriter is a sink operator, its output sequence is equivalent to its input sequence (i.e., {{{bnoOperator}}}'s output). This means that the Quaternion property (originally from {{{bnoOperator}}}) can be selected from the CsvWriter operator by right-clicking the operator and selecting the proper Output property. + The CsvWriter + operator writes the entire Bno055DataFrame to a file with the following format: + bno055_<filecount>.csv. Because CsvWriter is a sink + operator, its output sequence is equivalent to its input sequence. This means that the Quaternion + member from Bno055DataFrame can be selected downstream of CsvWriter. + This is most easily performed by right-clicking the operator, hovering over "Output", and clicking + the corresponding member.

- Quaternion values are passed to the "AutoCommutator" IncludeWorkflow operator, which will automatically commutate the headstage if there is a proper commutator connected. "AutoCommutator" comes from the OpenEphys.Commutator Bonsai package. Its properties allow you to enable/disable the LED on the commutator using the LedEnable property, set the COM port using the PortName property, and set the orientation of the Bno055 orientation sensor using the headstage RotationAxis property. The RotationAxis is already correctly set for the {{{hardware}}}. However, the correct COM port value varies from system to system. You must find and set the correct COM port to which your commutator is connected in your system. + Quaternion values are passed to AutoCommutator which automatically commutates the + headstage's tether if there is a proper commutator connection. This operator comes from the + OpenEphys.Commutator Bonsai package. Make sure it's installed and updated. You can + enable/disable the commutator using the Enable property, enable/disable the LED on the commutator + using the LedEnable property, and set the COM port using the PortName property. The correct COM + port value varies from system to system. You must find and set the correct COM port to which your + commutator is connected in your system.

NOTE
-

The AutoCommutator operator is included in the workflow by default because it is so commonly used with {{{hardware}}}. However, it is disabled for people without a commutator to be able to run the workflow. To enable it, select the node and press Ctrl + Shift + D or select "Enable" in the context menu that appears after right-clicking the node.

+

+ AutoCommutator is included in the workflow because a commutator is often combined + with the {{{hardware}}} and the Breakout Board for freely-moving experiments. However, it is + disabled by default so that users without a commutator can run the workflow without additional + steps. To enable it, click on the node and press Ctrl + Shift + D or right-click the + node and click "Enable". +

\ No newline at end of file diff --git a/template/partials/hardware/configuration.tmpl.partial b/template/partials/hardware/configuration.tmpl.partial index ee90acbc..5a19000f 100644 --- a/template/partials/hardware/configuration.tmpl.partial +++ b/template/partials/hardware/configuration.tmpl.partial @@ -1,11 +1,25 @@

The following excerpt from the {{{hardware}}} - example workflow demonstrates how to create an ONIX acquisition context using CreateContext, configures a {{{hardware}}} - using {{{operator}}}, and - then starts acquisition using StartAcquisition. + example workflow demonstrates how to configure your {{{hardware}}} and Breakout Board + in Bonsai. This process comprises of the following steps: +

+

@@ -15,8 +29,8 @@
NOTE

- To learn more about the top-level configuration motif in every workflow involving - ONIX hardware, visit the Configuration Chain Tutorial.

@@ -25,13 +39,13 @@

Creating an Acquisition Context

- The CreateContext operator - creates a ContextTask that - defines the device driver and index where the hardware exists. The - Driver property is set to "riffa", which is the name of the PCIe device used by ONIX. - In this case, the Index property is set to 0 because there is only a single ONIX system. - If a second system is used on the same computer, a second CreateContext operator - would be required in its own configuration chain, with its Index property set to 1. + The CreateContext operator creates a ContextTask that defines the device driver and + index where the hardware exists. The Driver property is set to "riffa" which is the name of the + PCIe device used by ONIX. In this case, the Index property is set to 0 because there is only a + single ONIX system. If a second system is used on the same computer, a second + CreateContext operator would be required in its own configuration chain, with its + Index property set to 1.

{{{conceptual}}} @@ -39,28 +53,31 @@

Starting Acquisition

- After starting a workflow, the StartAcquisition + After starting a workflow, the StartAcquisition operator begins data acquisition with the hardware that has been configured. In the {{{hardware}}} - example workflow, data is collected from the {{{hardware}}} only, so the rate of data being - produced by the hardware will be ~{{{dataRate}}} MB/s. The StartAcquisition's ReadSize property is set to - {{{blockReadSize}}} bytes, meaning data collection will wait until - {{{blockReadSize}}} bytes of data have been produced by the hardware. At {{{dataRate}}} MB/s the - hardware will produce {{{blockReadSize}}} bytes every ~{{{timeUntilFullBuffer}}}. This is a hard - bound on the latency of the system. If lower latencies were required, the hardware would need to - produce data more quickly or the ReadSize would need to be reduced. + example workflow, most collected data is from the {{{hardware}}}. The rate of data being + produced by the hardware will be ~{{{dataRate}}} MB/s. The ReadSize property is set to + {{{blockReadSize}}} bytes, meaning data collection will wait until {{{blockReadSize}}} bytes of + data have been produced by the hardware. At {{{dataRate}}} MB/s the hardware will produce + {{{blockReadSize}}} bytes every ~{{{timeUntilFullBuffer}}}. This is a hard bound on the latency of + the system. If lower latencies were required, the hardware would need to produce data more quickly + or the ReadSize property value would need to be reduced.

-

The StartAcquisition's WriteSize property is set to 2048 bytes. This - determines the amount of memory that is preallocated for temporarily holding data before it is - sent to hardware. It is less critical to performance unless the rate that data be written to the - hardware is comparable to the rate that the hardware produces data, which is not a common scenario. +

+ The WriteSize property is set to 2048 bytes. This determines the amount of memory that is + preallocated for temporarily holding data before it is sent to hardware. It is less critical to + performance unless the rate that data be written to the hardware is comparable to the rate that + the hardware produces data, which is not a common scenario.

NOTE
-

For an overview of the devices on the {{{hardware}}} that can be configured through the {{{operator}}} operator, visit - the {{{hardware}}} - Overview.

+

+ For an overview of the devices on the {{{hardware}}} that can be configured through the {{{operator}}} operator, visit + the {{{hardware}}} Overview. +

diff --git a/template/partials/hardware/memoryMonitor.tmpl.partial b/template/partials/hardware/memoryMonitor.tmpl.partial index 566fe9e8..dd4d96e0 100644 --- a/template/partials/hardware/memoryMonitor.tmpl.partial +++ b/template/partials/hardware/memoryMonitor.tmpl.partial @@ -1,6 +1,7 @@

- The following excerpt from the Breakout Board example workflow demonstrates - memory monitor functionality. + The following excerpt from the Breakout Board example + workflow demonstrates memory monitor functionality.

@@ -8,41 +9,43 @@

- The MemoryMonitorData operator - generates a sequence of MemoryMonitorDataFrames. - MemoryMonitorData emits MemoryMonitorDataFrames at a regular interval defined during Breakout Board Configuration using the ConfigureBreakoutBoard's - MemoryMonitor SamplesPerSecond property (in our case 10 Hz). In the Breakout Board example workflow, the - MemoryMonitorData's DeviceName property is set to "BreakoutBoard/MemoryMonitor". - This links the MemoryMonitorData operator to the corresponding configuration operator. The - MemberSelector operator selects the PercentUsed member from the - MemoryMonitorDataFrame so the user can visualize PercentUsed data from the - MemoryMonitorDataFrame. + MemoryMonitorData + emits a MemoryMonitorDataFrame at a + regular interval set by Breakout Board Configuration + using the ConfigureBreakoutBoard's + SamplesPerSecond property (in our case 10 Hz). In the Breakout Board example workflow, the + MemoryMonitorData's DeviceName property is set to "BreakoutBoard/MemoryMonitor". This + links the MemoryMonitorData operator to the Breakout Board's memory monitor. + MemberSelector selects the PercentUsed member from + MemoryMonitorDataFrame so the user can visualize the percentage of the breakout + board's memory that is occupied.

Note

- The MemoryMonitorDataFrame operator generates a data stream that is most useful in the context of - closed-loop performance. It tells the user if data is being consumed rapidly enough by the host PC to keep up with - data production by the hardware. The hardware FIFO is a buffer that is required to deal with the fact that computers - with normal operating systems cannot perform operations with strict regularity. When there are hiccups in - acquisition, the hardware FIFO picks up the slack, but should then be cleared immediately. To get the lowest - latencies, the BlockReadSize should be as small as possible while the memory use percentage remains - around 0%. + MemoryMonitorData generates a data stream that is most useful in the context of + closed-loop performance. It tells the user if data is being consumed rapidly enough by the host + PC to keep up with data production by the hardware. The hardware FIFO is a buffer that is + required to deal with the fact that computers with normal operating systems cannot perform + operations with strict regularity. When there are hiccups in acquisition, the hardware FIFO + picks up the slack, but should then be cleared immediately. To get the lowest latencies, + StartAcquisition's BlockReadSize property should be as small as possible while + the memory use percentage remains around 0%.

Warning

- If the hardware FIFO's PercentUsed is non-zero for long time periods, or is increasing, the - StartAcquisition's BlockReadSize setting is too small (see the breakout board configuration). A small - BlockReadSize will mean that the host computer does not have to wait long for enough data to - become available to propagate it forward, but will reduce overall bandwidth by increasing the - frequency at which the host computer checks if data is available and performs hardware reads. + If the hardware FIFO's PercentUsed is non-zero for long time periods, or is + increasing, the value of StartAcquisition's BlockReadSize property is too small + (see the breakout board configuration). A small + BlockReadSize means that the host computer does not have to wait long for enough + data to become available to propagate it forward, but will reduce overall bandwidth by + increasing the frequency at which the host computer checks if data is available and performs + hardware reads.

\ No newline at end of file diff --git a/template/partials/hardware/portStatus.tmpl.partial b/template/partials/hardware/portStatus.tmpl.partial index aa037613..3bdc0597 100644 --- a/template/partials/hardware/portStatus.tmpl.partial +++ b/template/partials/hardware/portStatus.tmpl.partial @@ -1,9 +1,12 @@

- The Onix system reports when a headstage port connection enters or leaves an aberrant state. Such aberrant states include loss - of communication lock, detection of parity or CRC error, reception of a badly formatted packet, etc.. Knowing the time - and type of a communication failure is a good first step to track down its cause. The following excerpt from the - {{{hardware}}} example - workflow demonstrates port status functionality and saves timestamped port status data. + The Onix system reports when a headstage/miniscope port connection enters or leaves an aberrant + state. Such aberrant states include loss of communication lock, detection of parity or CRC error, + reception of a badly formatted packet, etc. Knowing the time and type of an aberrant state can + help track down its cause. The following excerpt from the {{{hardware}}} + example + workflow + demonstrates port status functionality and saves timestamped port status data.

@@ -11,26 +14,28 @@

- Headstage port status data is produced in Bonsai by the PortStatus operator which generates a sequence of PortStatusFrames. PortStatus emits a - PortStatusFrame whenever PortStatusCode changes value. PortStatus's - DeviceName property is set to "{{{hardwareOperator}}}/PortController". This links the - PortStatus operator to the breakout board's port controller. + PortStatus emits a PortStatusFrame when + PortStatusCode changes value + i.e. when the {{{hardware}}} port connection enters or leaves an aberrant state. Its DeviceName + property is set to "{{{hardwareOperator}}}/PortController" which links the operator to the port + controller where the {{{hardware}}} is connected.

- The TimeStamp operator + The TimeStamp operator generates a sequence of UTC timestamped items from its input sequence. The CsvWriter operator writes Timestamp as - well as Clock and StatusCode members from PortStatusFrame to a file with the - following name format: port-status_<timestamp>.csv. + href="https://bonsai-rx.org/docs/api/Bonsai.IO.CsvWriter.html">CsvWriter operator writes + Timestamp as well as Clock and StatusCode members from PortStatusFrame to a file with + the following name format: port-status_<filecount>.csv.

NOTE
-

The PortStatus datastream is always enabled. {{{configureHardwareOperator}}} has no - Enable property for the PortStatus operator like other Data I/O operators that can be used - with the {{{hardware}}}.

+

+ The PortStatus datastream is always enabled. + {{{configureHardwareOperator}}} does not have an Enable property for + streaming port status data. +

\ No newline at end of file diff --git a/workflows/hardware/rhs2116/configuration.bonsai b/workflows/hardware/rhs2116/configuration.bonsai new file mode 100644 index 00000000..07beaa17 --- /dev/null +++ b/workflows/hardware/rhs2116/configuration.bonsai @@ -0,0 +1,486 @@ + + + + + + + riffa + 0 + + + + + BreakoutBoard + + BreakoutBoard/Heartbeat + 0 + true + 10 + + + BreakoutBoard/AnalogIO + 6 + false + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + Input + Input + Input + Input + Input + Input + Input + Input + Input + Input + Input + Input + + + BreakoutBoard/DigitalIO + 7 + false + + + BreakoutBoard/OutputClock + 5 + false + 1000000 + 50 + 0 + + + BreakoutBoard/HarpSyncInput + 12 + false + Breakout + + + BreakoutBoard/MemoryMonitor + 10 + true + 10 + + + + + + HeadstageRhs2116 + + HeadstageRhs2116/Rhs2116Pair + 256 + true + Off + Low100mHz + Low250Hz + High10000Hz + + + HeadstageRhs2116/StimulusTrigger + 258 + Local + eyJzcGVjaWZpY2F0aW9uIjoicHJvYmVpbnRlcmZhY2UiLCJ2ZXJzaW9uIjoiMC4yLjIxIiwicHJvYmVzIjpbeyJuZGltIjoyLCJzaV91bml0cyI6Im1tIiwiYW5ub3RhdGlvbnMiOnsibmFtZSI6IlJoczIxMTZBIiwibWFudWZhY3R1cmVyIjoiIn0sImNvbnRhY3RfYW5ub3RhdGlvbnMiOnsiQW5ub3RhdGlvbnMiOm51bGx9LCJjb250YWN0X3Bvc2l0aW9ucyI6W1sxNi4wLDMuMF0sWzE1LjAsMy4wXSxbMTQuMCwzLjBdLFsxMy4wLDMuMF0sWzEyLjAsMy4wXSxbMTEuMCwzLjBdLFsxMC4wLDMuMF0sWzkuMCwzLjBdLFs4LjAsMy4wXSxbNy4wLDMuMF0sWzYuMCwzLjBdLFs1LjAsMy4wXSxbNC4wLDMuMF0sWzMuMCwzLjBdLFsyLjAsMy4wXSxbMS4wLDMuMF1dLCJjb250YWN0X3BsYW5lX2F4ZXMiOltbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV1dLCJjb250YWN0X3NoYXBlcyI6WyJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiXSwiY29udGFjdF9zaGFwZV9wYXJhbXMiOlt7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfV0sInByb2JlX3BsYW5hcl9jb250b3VyIjpbWzAuNSwyLjVdLFsxNi41LDIuNV0sWzE2LjUsMy41XSxbMC41LDMuNV0sWzAuNSwyLjVdXSwiZGV2aWNlX2NoYW5uZWxfaW5kaWNlcyI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTVdLCJjb250YWN0X2lkcyI6WyIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIiwiMTMiLCIxNCIsIjE1Il0sInNoYW5rX2lkcyI6WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiXX0seyJuZGltIjoyLCJzaV91bml0cyI6Im1tIiwiYW5ub3RhdGlvbnMiOnsibmFtZSI6IlJoczIxMTZCIiwibWFudWZhY3R1cmVyIjoiIn0sImNvbnRhY3RfYW5ub3RhdGlvbnMiOnsiQW5ub3RhdGlvbnMiOm51bGx9LCJjb250YWN0X3Bvc2l0aW9ucyI6W1sxLjAsMS4wXSxbMi4wLDEuMF0sWzMuMCwxLjBdLFs0LjAsMS4wXSxbNS4wLDEuMF0sWzYuMCwxLjBdLFs3LjAsMS4wXSxbOC4wLDEuMF0sWzkuMCwxLjBdLFsxMC4wLDEuMF0sWzExLjAsMS4wXSxbMTIuMCwxLjBdLFsxMy4wLDEuMF0sWzE0LjAsMS4wXSxbMTUuMCwxLjBdLFsxNi4wLDEuMF1dLCJjb250YWN0X3BsYW5lX2F4ZXMiOltbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV1dLCJjb250YWN0X3NoYXBlcyI6WyJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiXSwiY29udGFjdF9zaGFwZV9wYXJhbXMiOlt7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfV0sInByb2JlX3BsYW5hcl9jb250b3VyIjpbWzAuNSwwLjVdLFsxNi41LDAuNV0sWzE2LjUsMS41XSxbMC41LDEuNV0sWzAuNSwwLjVdXSwiZGV2aWNlX2NoYW5uZWxfaW5kaWNlcyI6WzE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxXSwiY29udGFjdF9pZHMiOlsiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSJdLCJzaGFua19pZHMiOlsiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIl19XX0= + + + + 1 + true + 0 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 3000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 6000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 9000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 12000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 15000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 18000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 21000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 24000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 27000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 30000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 33000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 36000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 39000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 42000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 45000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 48000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 51000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 54000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 57000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 60000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 63000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 66000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 69000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 72000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 75000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 78000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 81000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 84000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 87000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 90000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 93000 + 0 + 100 + 3 + 100 + 3 + 0 + + + Step10000nA + + + PortA + + + + + + 2048 + 2048 + + + + + + + start-time_.csv + false + false + FileCount + false + Timestamp,Value.AcquisitionClockHz,Value.BlockReadSize,Value.BlockWriteSize + + + + + + + + + + + \ No newline at end of file diff --git a/workflows/hardware/rhs2116/load-rhs2116.py b/workflows/hardware/rhs2116/load-rhs2116.py new file mode 100644 index 00000000..f5f479fc --- /dev/null +++ b/workflows/hardware/rhs2116/load-rhs2116.py @@ -0,0 +1,62 @@ +import os +import numpy as np +import matplotlib.pyplot as plt + +plt.close('all') + +#%% Set Parameters for Loading Data + +suffix = '0'; # Change to match file names' suffix +# Change this to the directory of your data. In this example, data's in the same directory as this data loading Python script +data_directory = os.path.dirname(os.path.realpath(__file__)) +start_t = 1.0 # when to start plotting data (seconds) +dur = 1.0 # duration of data to plot + +#%% Metadata + +dt = {'names': ('time', 'acq_clk_hz', 'block_read_sz', 'block_write_sz'), + 'formats': ('datetime64[us]', 'u4', 'u4', 'u4')} +meta = np.genfromtxt(os.path.join(data_directory, f'start-time_{suffix}.csv'), delimiter=',', dtype=dt) +print(f"Recording was started at {meta['time']} GMT") + +#%% RHS2116 ephys data + +start_t = 1.0 # when to start plotting data (seconds) +dur = 1.0 # duration of data to plot + +rhs2116 = {} +rhs2116['time'] = np.fromfile(os.path.join(data_directory, f'rhs2116-clock_{suffix}.raw'), dtype=np.uint64) / meta['acq_clk_hz'] +b = np.bitwise_and(rhs2116['time'] >= start_t, rhs2116['time'] < start_t + dur) +time = rhs2116['time'][b] + +# AC data +rhs2116['ac'] = np.reshape(np.fromfile(os.path.join(data_directory, f'rhs2116-ac_{suffix}.raw'), dtype=np.uint16), (-1, 32)) +rhs2116_ac = rhs2116['ac'][b, :].astype(np.double) +bit_depth = 16 +scalar = 0.195 +offset = (2 ** (bit_depth - 1)) * scalar +rhs2116_ac_converted = rhs2116_ac * scalar - offset + np.arange(rhs2116_ac.shape[1])[None, :] * offset / 4 + +# DC data +rhs2116['dc'] = np.reshape(np.fromfile(os.path.join(data_directory, f'rhs2116-dc_{suffix}.raw'), dtype=np.uint16), (-1, 32)) +rhs2116_dc = rhs2116['dc'][b, :].astype(np.double) +bit_depth = 10 +scalar = -19.23 +offset = (2 ** (bit_depth - 1)) * -scalar +rhs2116_dc_converted = rhs2116_dc * scalar - offset + np.arange(rhs2116_dc.shape[1])[None, :] * offset / 4 + +def setup_subplot(ax): + ax.set_yticks([]) + ax.set_ylabel("channel") + ax.set_xlabel("time (s)") + +fig, (ax_ac, ax_dc) = plt.subplots(nrows=1, ncols=2, figsize=(10,8)) +ax_ac.plot(time, rhs2116_ac_converted, 'k', linewidth=0.25) +ax_ac.set_title('RHS2116 AC Data') +setup_subplot(ax_ac) +ax_dc.plot(time, rhs2116_dc_converted, 'k', linewidth=0.25) +ax_dc.set_title('RHS2116 DC Data') +setup_subplot(ax_dc) +fig.suptitle('RHS2116 Data') +plt.tight_layout() +plt.show() \ No newline at end of file diff --git a/workflows/hardware/rhs2116/memory-monitor.bonsai b/workflows/hardware/rhs2116/memory-monitor.bonsai new file mode 100644 index 00000000..7e2cccd7 --- /dev/null +++ b/workflows/hardware/rhs2116/memory-monitor.bonsai @@ -0,0 +1,21 @@ + + + + + + + BreakoutBoard/MemoryMonitor + + + + PercentUsed + + + + + + + \ No newline at end of file diff --git a/workflows/hardware/rhs2116/port-status.bonsai b/workflows/hardware/rhs2116/port-status.bonsai new file mode 100644 index 00000000..30ae8a86 --- /dev/null +++ b/workflows/hardware/rhs2116/port-status.bonsai @@ -0,0 +1,32 @@ + + + + + + + HeadstageRhs2116/LinkController + + + + + + + port-status_.csv + false + false + FileCount + false + Timestamp,Value + + + + + + + + \ No newline at end of file diff --git a/workflows/hardware/rhs2116/rhs2116-record.bonsai b/workflows/hardware/rhs2116/rhs2116-record.bonsai new file mode 100644 index 00000000..726890ad --- /dev/null +++ b/workflows/hardware/rhs2116/rhs2116-record.bonsai @@ -0,0 +1,58 @@ + + + + + + + HeadstageRhs2116/Rhs2116Pair + 30 + + + + Clock + + + + rhs2116pair-clock_.raw + FileCount + false + ColumnMajor + + + + DCData + + + + rhs2116pair-dc_.raw + FileCount + false + ColumnMajor + + + + AmplifierData + + + + rhs2116pair-ac_.raw + FileCount + false + ColumnMajor + + + + + + + + + + + + + \ No newline at end of file diff --git a/workflows/hardware/rhs2116/rhs2116-stimulate.bonsai b/workflows/hardware/rhs2116/rhs2116-stimulate.bonsai new file mode 100644 index 00000000..7f761c91 --- /dev/null +++ b/workflows/hardware/rhs2116/rhs2116-stimulate.bonsai @@ -0,0 +1,54 @@ + + + + + + + BreakoutBoard/DigitalIO + + + + Buttons + + + + + + Source1 + + + + Square + + + + + + + + + + + + + 0 + + + + + HeadstageRhs2116/StimulusTrigger + + + + + + + + + + + \ No newline at end of file diff --git a/workflows/hardware/rhs2116/rhs2116.bonsai b/workflows/hardware/rhs2116/rhs2116.bonsai new file mode 100644 index 00000000..b7f2185b --- /dev/null +++ b/workflows/hardware/rhs2116/rhs2116.bonsai @@ -0,0 +1,600 @@ + + + + + + + riffa + 0 + + + + + BreakoutBoard + + BreakoutBoard/Heartbeat + 0 + true + 10 + + + BreakoutBoard/AnalogIO + 6 + false + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + TenVolts + Input + Input + Input + Input + Input + Input + Input + Input + Input + Input + Input + Input + + + BreakoutBoard/DigitalIO + 7 + false + + + BreakoutBoard/OutputClock + 5 + false + 1000000 + 50 + 0 + + + BreakoutBoard/HarpSyncInput + 12 + false + Breakout + + + BreakoutBoard/MemoryMonitor + 10 + true + 10 + + + + + + HeadstageRhs2116 + + HeadstageRhs2116/Rhs2116Pair + 256 + true + Off + Low100mHz + Low250Hz + High10000Hz + + + HeadstageRhs2116/StimulusTrigger + 258 + Local + eyJzcGVjaWZpY2F0aW9uIjoicHJvYmVpbnRlcmZhY2UiLCJ2ZXJzaW9uIjoiMC4yLjIxIiwicHJvYmVzIjpbeyJuZGltIjoyLCJzaV91bml0cyI6Im1tIiwiYW5ub3RhdGlvbnMiOnsibmFtZSI6IlJoczIxMTZBIiwibWFudWZhY3R1cmVyIjoiIn0sImNvbnRhY3RfYW5ub3RhdGlvbnMiOnsiQW5ub3RhdGlvbnMiOm51bGx9LCJjb250YWN0X3Bvc2l0aW9ucyI6W1sxNi4wLDMuMF0sWzE1LjAsMy4wXSxbMTQuMCwzLjBdLFsxMy4wLDMuMF0sWzEyLjAsMy4wXSxbMTEuMCwzLjBdLFsxMC4wLDMuMF0sWzkuMCwzLjBdLFs4LjAsMy4wXSxbNy4wLDMuMF0sWzYuMCwzLjBdLFs1LjAsMy4wXSxbNC4wLDMuMF0sWzMuMCwzLjBdLFsyLjAsMy4wXSxbMS4wLDMuMF1dLCJjb250YWN0X3BsYW5lX2F4ZXMiOltbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV1dLCJjb250YWN0X3NoYXBlcyI6WyJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiXSwiY29udGFjdF9zaGFwZV9wYXJhbXMiOlt7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfV0sInByb2JlX3BsYW5hcl9jb250b3VyIjpbWzAuNSwyLjVdLFsxNi41LDIuNV0sWzE2LjUsMy41XSxbMC41LDMuNV0sWzAuNSwyLjVdXSwiZGV2aWNlX2NoYW5uZWxfaW5kaWNlcyI6WzAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQsMTVdLCJjb250YWN0X2lkcyI6WyIwIiwiMSIsIjIiLCIzIiwiNCIsIjUiLCI2IiwiNyIsIjgiLCI5IiwiMTAiLCIxMSIsIjEyIiwiMTMiLCIxNCIsIjE1Il0sInNoYW5rX2lkcyI6WyIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiLCIiXX0seyJuZGltIjoyLCJzaV91bml0cyI6Im1tIiwiYW5ub3RhdGlvbnMiOnsibmFtZSI6IlJoczIxMTZCIiwibWFudWZhY3R1cmVyIjoiIn0sImNvbnRhY3RfYW5ub3RhdGlvbnMiOnsiQW5ub3RhdGlvbnMiOm51bGx9LCJjb250YWN0X3Bvc2l0aW9ucyI6W1sxLjAsMS4wXSxbMi4wLDEuMF0sWzMuMCwxLjBdLFs0LjAsMS4wXSxbNS4wLDEuMF0sWzYuMCwxLjBdLFs3LjAsMS4wXSxbOC4wLDEuMF0sWzkuMCwxLjBdLFsxMC4wLDEuMF0sWzExLjAsMS4wXSxbMTIuMCwxLjBdLFsxMy4wLDEuMF0sWzE0LjAsMS4wXSxbMTUuMCwxLjBdLFsxNi4wLDEuMF1dLCJjb250YWN0X3BsYW5lX2F4ZXMiOltbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV0sW1sxLjAsMC4wXSxbMC4wLDEuMF1dLFtbMS4wLDAuMF0sWzAuMCwxLjBdXSxbWzEuMCwwLjBdLFswLjAsMS4wXV1dLCJjb250YWN0X3NoYXBlcyI6WyJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiLCJjaXJjbGUiXSwiY29udGFjdF9zaGFwZV9wYXJhbXMiOlt7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfSx7InJhZGl1cyI6MC4zLCJ3aWR0aCI6bnVsbCwiaGVpZ2h0IjpudWxsfV0sInByb2JlX3BsYW5hcl9jb250b3VyIjpbWzAuNSwwLjVdLFsxNi41LDAuNV0sWzE2LjUsMS41XSxbMC41LDEuNV0sWzAuNSwwLjVdXSwiZGV2aWNlX2NoYW5uZWxfaW5kaWNlcyI6WzE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxXSwiY29udGFjdF9pZHMiOlsiMCIsIjEiLCIyIiwiMyIsIjQiLCI1IiwiNiIsIjciLCI4IiwiOSIsIjEwIiwiMTEiLCIxMiIsIjEzIiwiMTQiLCIxNSJdLCJzaGFua19pZHMiOlsiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIiwiIl19XX0= + + + + 1 + true + 0 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 3000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 6000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 9000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 12000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 15000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 18000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 21000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 24000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 27000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 30000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 33000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 36000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 39000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 42000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 45000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 48000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 51000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 54000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 57000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 60000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 63000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 66000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 69000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 72000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 75000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 78000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 81000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 84000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 87000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 90000 + 0 + 100 + 3 + 100 + 3 + 0 + + + 1 + true + 93000 + 0 + 100 + 3 + 100 + 3 + 0 + + + Step10000nA + + + PortA + + + + + + 2048 + 2048 + + + + + + + start-time_.csv + false + false + FileCount + false + Timestamp,Value.AcquisitionClockHz,Value.BlockReadSize,Value.BlockWriteSize + + + + HeadstageRhs2116/LinkController + + + + + + + port-status_.csv + false + false + FileCount + false + Timestamp,Value + + + + BreakoutBoard/DigitalIO + + + + Buttons + + + + + + Source1 + + + + Square + + + + + + + + + + + + + 0 + + + + + HeadstageRhs2116/StimulusTrigger + + + + + HeadstageRhs2116/Rhs2116Pair + 30 + + + + Clock + + + + rhs2116pair-clock_.raw + FileCount + false + ColumnMajor + + + + DCData + + + + rhs2116pair-dc_.raw + FileCount + false + ColumnMajor + + + + AmplifierData + + + + rhs2116pair-ac_.raw + FileCount + false + ColumnMajor + + + + + BreakoutBoard/MemoryMonitor + + + + PercentUsed + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file