Jump to content

Contributions:NeuroOmegaADC: Difference between revisions

From BCI2000 Wiki
Swiftj (talk | contribs)
mNo edit summary
 
(23 intermediate revisions by 2 users not shown)
Line 1: Line 1:
[[File:NeuroOmega system.jpg|400px|thumb|right|Alpha Omega Neuro Omega clinical system]]
==Versioning==
==Versioning==
[[File:NeuroOmega system.jpg|400px|thumb|right|Alpha Omega Neuro Omega clinical system]]
===Authors===
===Author===
* William Engelhardt (engelhardt@neurotechcenter.org)
Alexander Belsten (belsten@neurotechcenter.org)
* Alexander Belsten (belsten@neurotechcenter.org)


===Version History===
===Version History===
* 2024/01/30: Enable DynamicStimulation to use BCI2000 States as stimulation parameters.
* 2022/10/18: Changed to BufferedADC to prevent data loss.
* 2022/07/18: StimMarker 1 and Ports 1 and 2 are written to BCI2000 States.
* 2021/06/17: Initial working release R6310.  
* 2021/06/17: Initial working release R6310.  


===Source Code Revisions===
===Source Code Revisions===
*Initial development: 6274
*Initial development: 6274
*Known to compile under: 6319
*Known to compile under: 6969
*Broken since: --
*Broken since: --
===Known Issues/Important Things to Know===
===Known Issues/Important Things to Know===
*Digital input ports do not work at present time.
*Recording from channels with different sampling rates is not possible.  
*Recording from channels with different sampling rates is not possible.  
*The Neuro Omega is not able to immediately switch stimulating an electrode as a cathode to an anode. If this is desired, you must introduce a sham stimulation in-between, which can be done to a channel that is not used
*It has been seen with the [[#PC Specifications|computer used for Certification Testing ]], that if it has been powered on for more than a couple of days (or perhaps another reason, we are not totally sure), it fails to stream consistent data to the Neuro Omega. This creates an irregular block size timing, loss of data, and occasional crashing. '''This was fixed by restarting the computer.''' The theory for the source of the problem is that something was wrong with the AO driver, and restarting fixed it.


==Functional Description==  
==Functional Description==  
This source module allows you to collect electrophysiological data from the Alpha Omega Neuro Omega clinical recording system. The Neuro Omega can record from a variety of modalities, such as ECoG, sEEG, micro, and macro contacts. It is often used for the placement of deep brain stimulating electrodes, facilitated by its ability to sonify local field potentials and drive the DBS lead to precise depths.  
This source module allows you to collect electrophysiological data from the Alpha Omega Neuro Omega clinical recording system. The Neuro Omega can record from a variety of modalities, such as ECoG, sEEG, micro, and macro contacts. It is often used for the placement of deep brain stimulating electrodes, facilitated by its ability to sonify local field potentials and drive the DBS lead to precise depths.  
==Video Overview==
<br>
<youtube alignment="center" dimensions="700">https://youtu.be/icyllz5G55U</youtube>
<br>
'''Edits since the video creation'''
* You no longer need the BCI2000 computer's MAC address, you only need the Neuro Omega's.


==Integration into BCI2000==
==Integration into BCI2000==
*'''Install the NeuroOmega System SDK''' -  The SDK must be downloaded in order to run this source module. The executable "Neuro Omega System SDK .exe" must be obtained to download the SDK.
*'''Compile the source module''' -  You will need both the Neuro Omega clinical system and a PC with BCI2000 installed and the NeuroOmegaADC source module compiled. Compile the source module on the BCI2000 PC by enabling <code>BUILD_PRIVATE</code> in your CMake configuration and generating the BCI2000 solution. Access to the private directory in the SVN is necessary. Then compile the source module, and make <code>NeuroOmegaADC</code> the source module in your batch file.  
*'''Compile the source module''' -  You will need both the Neuro Omega clinical system and a PC with BCI2000 installed and the NeuroOmegaADC source module compiled. Compile the source module on the BCI2000 PC by enabling <code>BUILD_PRIVATE</code> in your CMake configuration and generating the BCI2000 solution. Access to the private directory in the SVN is necessary. Then compile the source module, and make <code>NeuroOmegaADC</code> the source module in your batch file.  


Line 25: Line 39:
*'''Configuring IPv4 address''' - Now that the two systems are connected physically, the BCI2000 PC's IPv4 address can be configured such that it is on the same subnet as the Neuro Omega. This can be done by checking the IPv4 address and subnet mask on the Neuro Omega system ethernet adapter and setting the BCI2000 PC's ethernet adapter to the same subnet mask and setting an appropriate IPv4 address.  
*'''Configuring IPv4 address''' - Now that the two systems are connected physically, the BCI2000 PC's IPv4 address can be configured such that it is on the same subnet as the Neuro Omega. This can be done by checking the IPv4 address and subnet mask on the Neuro Omega system ethernet adapter and setting the BCI2000 PC's ethernet adapter to the same subnet mask and setting an appropriate IPv4 address.  
*'''Installation of SDK''' - Alpha Omega provides an SDK installer for the Neuro Omega that must be installed. Acquire this installer and carry out the installation process.  
*'''Installation of SDK''' - Alpha Omega provides an SDK installer for the Neuro Omega that must be installed. Acquire this installer and carry out the installation process.  
*'''Setting MAC addresses''' - Now that the two systems are configured, and everything is installed, launch your batch file that has the NeuroOmegaADC as the source module. Open the ''Config'' window and navigate to the source tab. You will need to enter the Alpha Omega's MAC address into the ''NeuroOmegaMAC'' parameter. This can be located by looking at the sticker on the bottom of the Alpha Omega, near where ethernet ports are. Next, you will need to set the ''HostMAC'' parameter to the BCI2000 PC's MAC address. You can find this by opening the command prompt on the BCI2000 PC and entering the command <code>ipconfig /all</code>. In the output of this command, find ''physical address'' in the ethernet adapter section. This is the BCI2000 PC's MAC address.  
*'''Setting MAC addresses''' - Now that the two systems are configured, and everything is installed, launch your batch file that has the NeuroOmegaADC as the source module. Open the ''Config'' window and navigate to the source tab. You will need to enter the Alpha Omega's MAC address into the ''NeuroOmegaMAC'' parameter. This can be located by looking at the sticker on the bottom of the Alpha Omega, near where ethernet ports are.  
*'''Setting Recording Channels''' - On the Neuro Omega, launch the data acquisition software. Press <code>Ctrl-Shift-M</code> to show the menu bar. In the Options tab, open the settings dialog box for the channel type you want to record from. You should see a box like this:  
*'''Setting Recording Channels''' - On the Neuro Omega, launch the data acquisition software. Press <code>Ctrl-Shift-M</code> to show the menu bar. In the Options tab, open the settings dialog box for the channel type you want to record from. You should see a box like this:  
<gallery class="center" mode="nolines" widths=600px heights=600px>
<gallery class="center" mode="nolines" widths=600px heights=600px>
Line 31: Line 45:
</gallery>
</gallery>
There are two columns in the box that are of particular importance to recording with BCI2000. The first is the ''Channel ID'' column. To record from a channel, you will need to enter its corresponding integer ''Channel ID'' in the ''RecordingChIDs'' parameter in BCI2000. The other important column is the ''SR'' (sampling rate) column. '''All''' of the channels you record from in BCI2000 '''must''' have the same sampling rate. You must enter this sampling rate in the ''SamplingRate'' parameter in BCI2000.  
There are two columns in the box that are of particular importance to recording with BCI2000. The first is the ''Channel ID'' column. To record from a channel, you will need to enter its corresponding integer ''Channel ID'' in the ''RecordingChIDs'' parameter in BCI2000. The other important column is the ''SR'' (sampling rate) column. '''All''' of the channels you record from in BCI2000 '''must''' have the same sampling rate. You must enter this sampling rate in the ''SamplingRate'' parameter in BCI2000.  
==Stimulation==
===StimulationConfigurations===
<gallery mode="packed" widths=800px heights=500px>
File:NOStimulationFigure.png|Figure 2: Stimulation pulse shape and train shape definition. The stimulation pulses on the left would take place during the "Stimulation duration" phase on the right.
</gallery>
<gallery mode="packed" widths=350px heights=350px>
File:NOStimulationConfigurations.png|Figure 3: Stimulation pulse shape definition in BCI2000.
</gallery>
This parameter is where stimulation pulses are defined. The pulse shapes are defined according to Fig. 2.
'''Additional Notes:'''
* If only one pulse is desired, '''Train Duration''' and '''Train Frequency''' don't have to be specified, or they can be '''set to 0'''.
===StimulationTriggers===
<gallery mode="packed" widths=350px heights=350px>
File:NOStimulationTriggers.png|Figure 4: Stimulation triggers have an expression, a configuration ID, a list of channels, and a return channel.
</gallery>
'''Additional Notes:'''
* NeuroOmega has a bug where '''a channel cannot immediately switch from being a cathode to anode, or vice versa'''. To overcome this restriction, you can introduce a sham stimulation to a channel you are not using. This means you can set both the stimulation amplitudes to 0, and trigger it in-between the two stimulations. For example, if you did bipolar stimulation with Ch 1 and Ch 8 and wanted to switch which channel is the return channel. You could do the first stimulation to Ch 1 (with Ch 8 as the return channel), the sham stimulation, then the second stimulation to Ch 8 (with Ch 1 as the return channel).
* Channel Names are set by the NeuroOmega system. They can be found by following the steps resulting in Figure 1.
* If multiple stimulation channels are specified, ''each'' will be delivered with the current specified in the stimulation configuration. For example, if you want a total of 3mA with 2 channels, you should specify 1 mA as your current, which will be delivered at each electrode.
===DynamicStimulation===
* '''DynamicStimulation''': Enable to skip Preflight checks and change stimulation parameters during the run. This can easily be done with [[Technical Reference:State Definition|BCI2000 States]]. The State's value is evaluated when the StimulationTrigger Expression is true. This can be useful if you have a custom application which modifies States, then you can set one of the parameters as that State.
==[[User Reference:StimulationConfigurationIntegrativeTool (SCIT)|SCIT]]==
To help out with creating the BCI2000 parameters, a GUI has been made which should make it easy to translate your stimulation specifications into BCI2000 parameter files. The GUI also visualizes the stimulation from three different perspectives, making it easy to tell if your parameters are really what you want. There is a [[User Reference:StimulationConfigurationIntegrativeTool (SCIT)|Stimulation Configuration tool user reference]] which will further tell you how to use this tool.
<gallery mode="packed" widths=500px heights=500px>
File:NeuroOmegaGUIimg1.png|Figure 5: The Neuro Omega GUI which creates BCI2000 parameters from stimulation specifications.
</gallery>
==Parameters==
==Parameters==
===Source Tab===
====Signal Properties====
*'''SourceCh''' - This parameter should be "auto", as it is determined by the size of the "RecordingChIDs" parameter.


===NeuroOmegaMAC===
*'''SampleBlockSize''' - Number of samples that are transmitted at a time.  
This parameter should be the MAC address of the Neuro Omega system.  


===HostMAC===
*'''SamplingRate''' - Some channels on the Neuro Omega are recorded at different sampling rates, so this parameter is dictated by the configuration of the clinical system and must be manually entered accordingly. Information on how to check the sampling rate of a given channel is coming soon.  
This parameter should be the MAC address of the BCI2000 recording computer.  


===RecordingChIDs===
*'''ChannelNames''' - This should be set to auto, as the names of the channels will be automatically acquired from the Neuro Omega.
This parameter should be a list of channel IDs corresponding to the channels you want to record from. Each of these channels must have the same sampling rate.


===SourceCh===
*'''SourceChOffset''' - Use 'auto', or needs to be the length of number of channels in RecordingChIDs.  
This parameter should be "auto", as it is determined by the size of the "RecordingCHIDs" parameter.


===SampleBlockSize===
*'''SourceChGain''' - Use 'auto', or needs to be the length of number of channels in RecordingChIDs.  
Number of samples that are transmitted at a time.  


===SamplingRate===
*'''RecordingChIDs''' - This parameter should be a list of channel IDs corresponding to the channels you want to record from. Each of these channels must have the same sampling rate.
Some channels on the Neuro Omega are recorded at different sampling rates, so this parameter is dictated by the configuration of the clinical system and must be manually entered accordingly. Information on how to check the sampling rate of a given channel is coming soon.  


===SourceChGain===
====Hardware Addresses====
*'''NeuroOmegaMAC''' - This parameter should be the MAC address of the Neuro Omega system.


====MPX file====
*'''SaveMPX''' - Enabling will save a data file on the Neuro Omega system using their own data format.
*'''FilePath''' - Where to save the file on the Neuro Omega system. A tested path has been "C:\Surgeries_Data\<patient ID>"
*'''FileName''' - Name of the file on the Neuro Omega system. Will saved where the File Path specifies.


===SourceChOffset===
====Digital Ports====
*'''EnablePortInputs''' - Enabling this parameter will record from both 16-bit D-Sub digital input connectors to the Port1 and Port2 states. 


===ChannelNames===
====Device Information====
This should be set to auto, as the names of the channels will be automatically acquired from the Neuro Omega.
*'''ChannelInfo''' - This is a read-only parameter that will be populated with channel information from the Neuro Omega (namely, the mapping between channel IDs (integers) and channel names).


===EnablePortInputs===
====Drive====
Currently does not work!
*'''ReadDriveDepth''' - Enable if you would like to read the driver depth from device. Only enable if the driver is connected.


Enabling this parameter will record from both 16-bit D-Sub digital input connectors to the Port1 and Port2 states.  
===Application Tab===
====NeuroOmegaStimulation====
*'''EnableNeuroOmegaStimulation''' - If disabled, no stimulation will be performed.
*'''DynamicStimulation''' - [[#DynamicStimulation|Described above.]]
*'''StimulationConfigurations''' - [[#StimulationConfigurations|Described above.]]
*'''StimulationTriggers''' - [[#StimulationTriggers|Described above.]]


===DetectionType===
This dictates what triggers a high value from the 16-bit digital inputs. If set to mean, bit values from the Ports will be accumulated over the duration of a sample block, and the state will be equal to the mean of these accumulated values. If set to RisingEdge, the state's bit values for a block will be high if the corresponding bit was high during that block.
===ChannelInfo===
This is a read-only parameter that will be populated with channel information from the Neuro Omega (namely, the mapping between channel IDs (integers) and channel names).
==States==
==States==


===NeuroOmegaTimeStamp===
===NeuroOmegaTimeStamp===
The 32-bit time at which the channels are read from the Neuro Omega.
===AOConnectionPercentage===
From 0 - 100, the quality of the connection between the systems in percentage. Higher is better, and it might be useful for determining the cause of an issue if data isn't able to be streamed.
===StimMarker1===
A state that contains the number of the channel that is being stimulated. It will only be triggered when stimulation is occurring, otherwise it will be zero.
===StimMarker1Time===
The timestamp at which StimMarker1 occurs.  For every StimMarker event, there will be a corresponding time stamp.
===Port1 and Port2===
These are 16-bit states recorded from the 16-bit D-Sub digital input 1 and input 2 connector on the Neuro Omega. The states record each pin as a 1 or 0, and stored in a certain bit. To decode this data, analyze as binary. For example, if Port1 was 8, this would mean only the 4th pin of Port1 was high and the rest were low.
===Port1Time and Port2Time===
The timestamps at which Port1 and Port2 are triggered.
==Additional Information==
===TimeStamps===
There are currently three timestamps logged: NeuroOmega timestamp, StimMarker timestamp, and the Ports 1 and 2 timestamps. The NeuroOmega timestamp is 32 bits, and corresponds to the time at which each block of data is read. Since both the StimMarkers and the Ports are read asynchronously to the signal source, they each have their own timestamps to accurately mark when the event occurred. These states are 16-bit, and increase twice as fast as the NeuroOmegaTimeStamp. To align them, shift every other peak up by 2^15.
Here is a published Matlab script that aligns the data for you: '''[[File:AlignNeuroOmegaStimMarkerTime.pdf]]'''. The pdf shows an example of how it should look like, but to use it yourself '''you must change the file path'''.
The units of the NeuroOmega time are currently unknown, however you can easily convert it to milliseconds by using the SourceTime state at the same index.
==Certification Results==
The AmpServerPro certification was performed to give a better understanding of the restraints that must be placed on the system when using this device. Certification success criteria was determined internally and without rigor, and reflects our experience with psychophysical experiments and the performance we expect to need for the system. More information about certification testing can be found on the [[User Reference:BCI2000Certification|certification wiki page]].
===PC Specifications===
*Desktop Windows 10
*Processor: AMD Ryzen 7 5700G with Radeon Graphics 3.80 GHz
*Installed Ram: 32.00 GB
*Graphics Card: AMD Radeon(TM) Graphics
*System Type: 64-bit operating system, x64-based processor
*BCI2000 compiled with MSVC2019 and Qt 5.15.2
*g.USBamp UB with driver version 3.16.00 installed
===Certification Tests Performed===
Certification testing varied task (P3Spell (7x7 grid), P3Spell (1x1 grid), CursorTask, CursorTaskLow, and StimulusPresentation) with a block size of 100ms, and tested audio and video latency, for a total of 12 performed tasks. The audio latency and video latency are partitioned into separate windows, as we tested them in different runs.
===Success Criteria and Overall Results===
{|border="1"
|Name
|Actual Latency
|Success Criteria
|Result
|-
|Timestamp Latency Mean
|1.07ms
|1 ms
|Failed
|-
|Timestamp Latency STD
|1.98ms
|5 ms
|Passed
|-
|Processing Latency Mean
|3.07ms
|20 ms
|Passed
|-
|Processing Latency STD
|49.6ms
|10 ms
|Failed
|-
|Video Latency Mean
|61.3ms
|65 ms
|Passed
|-
|Video Latency STD
|9.79ms
|20 ms
|Passed
|-
|Audio Latency Mean
|43.8ms
|65 ms
|Passed
|-
|Audio Latency STD
|5.92ms
|20 ms
|Passed
|}
The individual task breakdown can be found commented out in the Wiki code below, for additional information.
===Acquisition Latency===
To measure the acquisition latency, the Audio and Video Latency were compared between the Neuro Omega and the g.USBAmp, which is considered to have an acquisition latency of 0. Performing this comparison, the Neuro Omega was found to have an average acquisition latency of '''11 ± 5 ms'''.
===Stimulation Latency===
Two tests were performed to measure the Stimulation Latency: 1) the latency of the [[#StimMarker1|StimMarker]] (the response from the Neuro Omega), and 2) the latency of the actual stimulation.
<gallery mode="packed" widths=400px heights=400px>
File:NO StimMarkerLatency SourceTime.png | Figure 6: The latency of the StimMarker, sent from the Neuro Omega to a BCI2000 state. The average is '''97 ± 1 ms'''.
File:NO StimulationLatency SourceTime.png | Figure 7: The latency of stimulation. The beginning of stimulation was measured by the first peak recorded. The average is '''200 ± 1 ms'''.
</gallery>


===Port1===
The two tests were performed at a block size of 100 ms, while stimulating the ECOG High Frequency channel #2 (numbered 10272). As you can observe, the StimMarker recognizes the stimulation before the stimulation actually occurs, by almost half the time.
This is a 16-bit state recorded from the 16-bit D-Sub digital input 1 connector on the Neuro Omega.
===Port2===
This is a 16-bit state recorded from the 16-bit D-Sub digital input 2 connector on the Neuro Omega.  


==See also==
==See also==
[[User Reference:Filters]], [[Contributions:ADCs]]
[[User Reference:Filters]], [[Contributions:ADCs]], [[User Reference:NeuroStimulationParamsGUI]]
 
[[Category:Contributions]][[Category:Data Acquisition]][[Category:Video]]
 
 
<!--
===Individual Task Breakdown===
====Video Latency====
<div style="border:black 1px solid;width:1000px;height:600px;overflow:auto;">
Overall result: 11/15 tasks passed, 4/15 tasks failed, 15 tasks are missing data
 
global 2022-07-28T10:41:52
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  failed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  failed
  VideoLatency.median() < time("65ms")  missing or invalid data
  VideoLatency.sdev() < time("20ms")  missing or invalid data
  AudioLatency.median() < time("65ms")  missing or invalid data
  AudioLatency.sdev() < time("20ms")  missing or invalid data
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=0, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=10331, median=-1.07ms, sdev=1.98ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=2403, median=3.07ms, sdev=49.6ms
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=2664, median=17ms, sdev=9.75ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=nan, median=nan, sdev=nan
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=2511, median=61.3ms, sdev=9.79ms
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=nan, median=nan, sdev=nan
 
 
 
C:/BCI2000.will/data/Certification.2/CursorTask_2200_16ch_100ms001/CursorTask_2200_16ch_100msS001R01_28-Jul-22.dat 2022-07-28T10:00:32
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  passed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  passed
  VideoLatency.median() < time("65ms")  passed
  VideoLatency.sdev() < time("20ms")  passed
  AudioLatency.median() < time("65ms")  missing or invalid data
  AudioLatency.sdev() < time("20ms")  missing or invalid data
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=nan, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=216, median=-493µs, sdev=2.1ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=50, median=15.4ms, sdev=1.28ms
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=50, median=24ms, sdev=5.77ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=nan, median=nan, sdev=nan
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=49, median=50.3ms, sdev=5.72ms
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=nan, median=nan, sdev=nan
 
 
C:/BCI2000.will/data/Certification.2/CursorTask_2200_4ch_100ms001/CursorTask_2200_4ch_100msS001R01_28-Jul-22.dat 2022-07-28T09:59:32
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  passed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  passed
  VideoLatency.median() < time("65ms")  passed
  VideoLatency.sdev() < time("20ms")  passed
  AudioLatency.median() < time("65ms")  missing or invalid data
  AudioLatency.sdev() < time("20ms")  missing or invalid data
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=nan, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=218, median=-733µs, sdev=1.89ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=50, median=4.95ms, sdev=1.11ms
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=50, median=23ms, sdev=5.23ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=nan, median=nan, sdev=nan
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=49, median=56.2ms, sdev=4.77ms
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=nan, median=nan, sdev=nan
 
 
C:/BCI2000.will/data/Certification.2/CursorTask_2200_8ch_100ms001/CursorTask_2200_8ch_100msS001R01_28-Jul-22.dat 2022-07-28T10:00:02
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  passed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  passed
  VideoLatency.median() < time("65ms")  passed
  VideoLatency.sdev() < time("20ms")  passed
  AudioLatency.median() < time("65ms")  missing or invalid data
  AudioLatency.sdev() < time("20ms")  missing or invalid data
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=nan, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=217, median=-673µs, sdev=1.74ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=50, median=9.69ms, sdev=1.55ms
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=50, median=24ms, sdev=4.91ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=nan, median=nan, sdev=nan
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=49, median=55.3ms, sdev=5.37ms
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=nan, median=nan, sdev=nan
 
 
C:/BCI2000.will/data/Certification.2/CursorTaskLow_2200_16ch_100ms001/CursorTaskLow_2200_16ch_100msS001R01_28-Jul-22.dat 2022-07-28T10:02:02
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  passed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  passed
  VideoLatency.median() < time("65ms")  passed
  VideoLatency.sdev() < time("20ms")  passed
  AudioLatency.median() < time("65ms")  missing or invalid data
  AudioLatency.sdev() < time("20ms")  missing or invalid data
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=nan, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=217, median=161µs, sdev=1.85ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=50, median=18.9ms, sdev=1.22ms
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=50, median=24ms, sdev=5.27ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=nan, median=nan, sdev=nan
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=49, median=53ms, sdev=4.57ms
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=nan, median=nan, sdev=nan
 
 
C:/BCI2000.will/data/Certification.2/CursorTaskLow_2200_4ch_100ms001/CursorTaskLow_2200_4ch_100msS001R01_28-Jul-22.dat 2022-07-28T10:01:02
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  failed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  passed
  VideoLatency.median() < time("65ms")  passed
  VideoLatency.sdev() < time("20ms")  passed
  AudioLatency.median() < time("65ms")  missing or invalid data
  AudioLatency.sdev() < time("20ms")  missing or invalid data
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=nan, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=218, median=-1.88ms, sdev=1.82ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=50, median=3.83ms, sdev=996µs
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=50, median=25ms, sdev=5.51ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=nan, median=nan, sdev=nan
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=49, median=57.6ms, sdev=4.71ms
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=nan, median=nan, sdev=nan
 
 
C:/BCI2000.will/data/Certification.2/CursorTaskLow_2200_8ch_100ms001/CursorTaskLow_2200_8ch_100msS001R01_28-Jul-22.dat 2022-07-28T10:01:32
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  passed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  passed
  VideoLatency.median() < time("65ms")  passed
  VideoLatency.sdev() < time("20ms")  passed
  AudioLatency.median() < time("65ms")  missing or invalid data
  AudioLatency.sdev() < time("20ms")  missing or invalid data
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=nan, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=218, median=46.1µs, sdev=1.74ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=50, median=10.2ms, sdev=1.23ms
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=50, median=24ms, sdev=5.1ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=nan, median=nan, sdev=nan
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=49, median=52.7ms, sdev=5.03ms
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=nan, median=nan, sdev=nan
 
 
C:/BCI2000.will/data/Certification.2/P3Spell_2200_16ch_100ms001/P3Spell_2200_16ch_100msS001R01_28-Jul-22.dat 2022-07-28T09:45:56
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  passed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  passed
  VideoLatency.median() < time("65ms")  passed
  VideoLatency.sdev() < time("20ms")  passed
  AudioLatency.median() < time("65ms")  missing or invalid data
  AudioLatency.sdev() < time("20ms")  missing or invalid data
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=nan, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=289, median=-467µs, sdev=1.92ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=20, median=6.03ms, sdev=1.34ms
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=20, median=21ms, sdev=6.94ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=nan, median=nan, sdev=nan
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=20, median=52.9ms, sdev=4.97ms
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=nan, median=nan, sdev=nan
 
 
C:/BCI2000.will/data/Certification.2/P3Spell_2200_4ch_100ms001/P3Spell_2200_4ch_100msS001R01_28-Jul-22.dat 2022-07-28T09:44:42
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  passed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  passed
  VideoLatency.median() < time("65ms")  passed
  VideoLatency.sdev() < time("20ms")  passed
  AudioLatency.median() < time("65ms")  missing or invalid data
  AudioLatency.sdev() < time("20ms")  missing or invalid data
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=nan, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=289, median=0, sdev=1.72ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=19, median=2ms, sdev=825µs
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=20, median=23ms, sdev=7.62ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=nan, median=nan, sdev=nan
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=20, median=49ms, sdev=4.8ms
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=nan, median=nan, sdev=nan
 
 
C:/BCI2000.will/data/Certification.2/P3Spell_2200_8ch_100ms001/P3Spell_2200_8ch_100msS001R01_28-Jul-22.dat 2022-07-28T09:45:19
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  passed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  passed
  VideoLatency.median() < time("65ms")  passed
  VideoLatency.sdev() < time("20ms")  passed
  AudioLatency.median() < time("65ms")  missing or invalid data
  AudioLatency.sdev() < time("20ms")  missing or invalid data
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=nan, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=289, median=-208µs, sdev=1.8ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=20, median=2.17ms, sdev=1.13ms
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=20, median=26ms, sdev=5.6ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=nan, median=nan, sdev=nan
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=20, median=52.2ms, sdev=5.05ms
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=nan, median=nan, sdev=nan
 
 
C:/BCI2000.will/data/Certification.2/P3SpellSingle_2200_16ch_100ms001/P3SpellSingle_2200_16ch_100msS001R01_28-Jul-22.dat 2022-07-28T09:56:23
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  failed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  passed
  VideoLatency.median() < time("65ms")  passed
  VideoLatency.sdev() < time("20ms")  passed
  AudioLatency.median() < time("65ms")  missing or invalid data
  AudioLatency.sdev() < time("20ms")  missing or invalid data
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=nan, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=1809, median=-2.01ms, sdev=2ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=506, median=3.04ms, sdev=1.71ms
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=519, median=24ms, sdev=5.92ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=nan, median=nan, sdev=nan
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=519, median=53.7ms, sdev=5.21ms
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=nan, median=nan, sdev=nan
 
 
C:/BCI2000.will/data/Certification.2/P3SpellSingle_2200_4ch_100ms001/P3SpellSingle_2200_4ch_100msS001R01_28-Jul-22.dat 2022-07-28T09:46:34
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  failed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  failed
  VideoLatency.median() < time("65ms")  failed
  VideoLatency.sdev() < time("20ms")  passed
  AudioLatency.median() < time("65ms")  missing or invalid data
  AudioLatency.sdev() < time("20ms")  missing or invalid data
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=nan, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=4477, median=-1.37ms, sdev=1.85ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=1045, median=2.23ms, sdev=75ms
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=1279, median=8ms, sdev=6.12ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=nan, median=nan, sdev=nan
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=1279, median=69.4ms, sdev=6.43ms
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=nan, median=nan, sdev=nan
 
 
C:/BCI2000.will/data/Certification.2/P3SpellSingle_2200_8ch_100ms001/P3SpellSingle_2200_8ch_100msS001R01_28-Jul-22.dat 2022-07-28T09:54:10
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  passed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  passed
  VideoLatency.median() < time("65ms")  passed
  VideoLatency.sdev() < time("20ms")  passed
  AudioLatency.median() < time("65ms")  missing or invalid data
  AudioLatency.sdev() < time("20ms")  missing or invalid data
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=nan, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=1253, median=-585µs, sdev=1.75ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=346, median=3.36ms, sdev=1.65ms
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=359, median=24ms, sdev=5.39ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=nan, median=nan, sdev=nan
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=359, median=51.9ms, sdev=5.21ms
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=nan, median=nan, sdev=nan
 
 
C:/BCI2000.will/data/Certification.2/StimulusPresentationAV_2200_16ch_100ms001/StimulusPresentationAV_2200_16ch_100msS001R01_28-Jul-22.dat 2022-07-28T10:03:30
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  passed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  passed
  VideoLatency.median() < time("65ms")  missing or invalid data
  VideoLatency.sdev() < time("20ms")  missing or invalid data
  AudioLatency.median() < time("65ms")  passed
  AudioLatency.sdev() < time("20ms")  passed
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=nan, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=206, median=188µs, sdev=2.1ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=49, median=4.03ms, sdev=1.46ms
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=49, median=25ms, sdev=9.08ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=49, median=39ms, sdev=1.32ms
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=nan, median=nan, sdev=nan
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=49, median=37.8ms, sdev=2.27ms
 
 
C:/BCI2000.will/data/Certification.2/StimulusPresentationAV_2200_4ch_100ms001/StimulusPresentationAV_2200_4ch_100msS001R01_28-Jul-22.dat 2022-07-28T10:02:32
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  failed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  passed
  VideoLatency.median() < time("65ms")  missing or invalid data
  VideoLatency.sdev() < time("20ms")  missing or invalid data
  AudioLatency.median() < time("65ms")  passed
  AudioLatency.sdev() < time("20ms")  passed
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=nan, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=207, median=-1.06ms, sdev=1.66ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=49, median=2.72ms, sdev=1.31ms
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=49, median=23ms, sdev=6.93ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=49, median=45ms, sdev=1.12ms
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=nan, median=nan, sdev=nan
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=49, median=47.3ms, sdev=1.74ms
 


[[Category:Contributions]][[Category:Data Acquisition]]
C:/BCI2000.will/data/Certification.2/StimulusPresentationAV_2200_8ch_100ms001/StimulusPresentationAV_2200_8ch_100msS001R01_28-Jul-22.dat 2022-07-28T10:03:01
could not evaluate all 10 requirements:
  AmpLatency.median() < time("7ms")  missing or invalid data
  AmpLatency.sdev() < time("2ms")  missing or invalid data
  abs(TimestampSkew.median()) < time("1ms")  passed
  TimestampSkew.sdev() < time("5ms")  passed
  ProcessingLatency.median() < time("20ms")  passed
  ProcessingLatency.sdev() < time("10ms")  passed
  VideoLatency.median() < time("65ms")  missing or invalid data
  VideoLatency.sdev() < time("20ms")  missing or invalid data
  AudioLatency.median() < time("65ms")  passed
  AudioLatency.sdev() < time("20ms")  passed
  AmpLatency -- interval between block begin, and amp digital out signal change:
  n=nan, median=nan, sdev=nan
  TimestampSkew -- clock skew between sample clock, and SourceTime time stamp:
  n=208, median=184µs, sdev=1.69ms
  ProcessingLatency -- time interval between block received, and stimulus triggered:
  n=49, median=2.71ms, sdev=952µs
  PresentationLatency -- time interval between stimulus trigger, and video memory change:
  n=49, median=22ms, sdev=6.23ms
  AudioPresentationLatency -- time interval between audio buffering, and estimated audio output:
  n=49, median=46ms, sdev=5.98ms
  VideoLatency -- time interval between stimulus trigger, and video signal change detected:
  n=nan, median=nan, sdev=nan
  AudioLatency -- time interval between stimulus trigger, and audio signal detected:
  n=49, median=44.3ms, sdev=7.3ms
</div>
-->

Latest revision as of 21:30, 13 November 2024

Alpha Omega Neuro Omega clinical system

Versioning

Authors

  • William Engelhardt (engelhardt@neurotechcenter.org)
  • Alexander Belsten (belsten@neurotechcenter.org)

Version History

  • 2024/01/30: Enable DynamicStimulation to use BCI2000 States as stimulation parameters.
  • 2022/10/18: Changed to BufferedADC to prevent data loss.
  • 2022/07/18: StimMarker 1 and Ports 1 and 2 are written to BCI2000 States.
  • 2021/06/17: Initial working release R6310.

Source Code Revisions

  • Initial development: 6274
  • Known to compile under: 6969
  • Broken since: --

Known Issues/Important Things to Know

  • Recording from channels with different sampling rates is not possible.
  • The Neuro Omega is not able to immediately switch stimulating an electrode as a cathode to an anode. If this is desired, you must introduce a sham stimulation in-between, which can be done to a channel that is not used
  • It has been seen with the computer used for Certification Testing , that if it has been powered on for more than a couple of days (or perhaps another reason, we are not totally sure), it fails to stream consistent data to the Neuro Omega. This creates an irregular block size timing, loss of data, and occasional crashing. This was fixed by restarting the computer. The theory for the source of the problem is that something was wrong with the AO driver, and restarting fixed it.


Functional Description

This source module allows you to collect electrophysiological data from the Alpha Omega Neuro Omega clinical recording system. The Neuro Omega can record from a variety of modalities, such as ECoG, sEEG, micro, and macro contacts. It is often used for the placement of deep brain stimulating electrodes, facilitated by its ability to sonify local field potentials and drive the DBS lead to precise depths.

Video Overview



Edits since the video creation

  • You no longer need the BCI2000 computer's MAC address, you only need the Neuro Omega's.

Integration into BCI2000

  • Install the NeuroOmega System SDK - The SDK must be downloaded in order to run this source module. The executable "Neuro Omega System SDK .exe" must be obtained to download the SDK.
  • Compile the source module - You will need both the Neuro Omega clinical system and a PC with BCI2000 installed and the NeuroOmegaADC source module compiled. Compile the source module on the BCI2000 PC by enabling BUILD_PRIVATE in your CMake configuration and generating the BCI2000 solution. Access to the private directory in the SVN is necessary. Then compile the source module, and make NeuroOmegaADC the source module in your batch file.

Connection to BCI2000 PC

  • Connection of Ethernet Cable - The BCI2000 PC connects to the Neuro Omega via a CAT6 ethernet cable. On the back of the Neuro Omega, you will find three ethernet ports. Connect the CAT6 cable into one that is not currently occupied, and connect the other end to the BCI2000 PC. It is a good idea to use an ethernet isolator to prevent transfer of significant current between the two systems.
  • Configuring IPv4 address - Now that the two systems are connected physically, the BCI2000 PC's IPv4 address can be configured such that it is on the same subnet as the Neuro Omega. This can be done by checking the IPv4 address and subnet mask on the Neuro Omega system ethernet adapter and setting the BCI2000 PC's ethernet adapter to the same subnet mask and setting an appropriate IPv4 address.
  • Installation of SDK - Alpha Omega provides an SDK installer for the Neuro Omega that must be installed. Acquire this installer and carry out the installation process.
  • Setting MAC addresses - Now that the two systems are configured, and everything is installed, launch your batch file that has the NeuroOmegaADC as the source module. Open the Config window and navigate to the source tab. You will need to enter the Alpha Omega's MAC address into the NeuroOmegaMAC parameter. This can be located by looking at the sticker on the bottom of the Alpha Omega, near where ethernet ports are.
  • Setting Recording Channels - On the Neuro Omega, launch the data acquisition software. Press Ctrl-Shift-M to show the menu bar. In the Options tab, open the settings dialog box for the channel type you want to record from. You should see a box like this:

There are two columns in the box that are of particular importance to recording with BCI2000. The first is the Channel ID column. To record from a channel, you will need to enter its corresponding integer Channel ID in the RecordingChIDs parameter in BCI2000. The other important column is the SR (sampling rate) column. All of the channels you record from in BCI2000 must have the same sampling rate. You must enter this sampling rate in the SamplingRate parameter in BCI2000.

Stimulation

StimulationConfigurations

This parameter is where stimulation pulses are defined. The pulse shapes are defined according to Fig. 2.

Additional Notes:

  • If only one pulse is desired, Train Duration and Train Frequency don't have to be specified, or they can be set to 0.


StimulationTriggers


Additional Notes:

  • NeuroOmega has a bug where a channel cannot immediately switch from being a cathode to anode, or vice versa. To overcome this restriction, you can introduce a sham stimulation to a channel you are not using. This means you can set both the stimulation amplitudes to 0, and trigger it in-between the two stimulations. For example, if you did bipolar stimulation with Ch 1 and Ch 8 and wanted to switch which channel is the return channel. You could do the first stimulation to Ch 1 (with Ch 8 as the return channel), the sham stimulation, then the second stimulation to Ch 8 (with Ch 1 as the return channel).
  • Channel Names are set by the NeuroOmega system. They can be found by following the steps resulting in Figure 1.
  • If multiple stimulation channels are specified, each will be delivered with the current specified in the stimulation configuration. For example, if you want a total of 3mA with 2 channels, you should specify 1 mA as your current, which will be delivered at each electrode.

DynamicStimulation

  • DynamicStimulation: Enable to skip Preflight checks and change stimulation parameters during the run. This can easily be done with BCI2000 States. The State's value is evaluated when the StimulationTrigger Expression is true. This can be useful if you have a custom application which modifies States, then you can set one of the parameters as that State.

SCIT

To help out with creating the BCI2000 parameters, a GUI has been made which should make it easy to translate your stimulation specifications into BCI2000 parameter files. The GUI also visualizes the stimulation from three different perspectives, making it easy to tell if your parameters are really what you want. There is a Stimulation Configuration tool user reference which will further tell you how to use this tool.

Parameters

Source Tab

Signal Properties

  • SourceCh - This parameter should be "auto", as it is determined by the size of the "RecordingChIDs" parameter.
  • SampleBlockSize - Number of samples that are transmitted at a time.
  • SamplingRate - Some channels on the Neuro Omega are recorded at different sampling rates, so this parameter is dictated by the configuration of the clinical system and must be manually entered accordingly. Information on how to check the sampling rate of a given channel is coming soon.
  • ChannelNames - This should be set to auto, as the names of the channels will be automatically acquired from the Neuro Omega.
  • SourceChOffset - Use 'auto', or needs to be the length of number of channels in RecordingChIDs.
  • SourceChGain - Use 'auto', or needs to be the length of number of channels in RecordingChIDs.
  • RecordingChIDs - This parameter should be a list of channel IDs corresponding to the channels you want to record from. Each of these channels must have the same sampling rate.

Hardware Addresses

  • NeuroOmegaMAC - This parameter should be the MAC address of the Neuro Omega system.

MPX file

  • SaveMPX - Enabling will save a data file on the Neuro Omega system using their own data format.
  • FilePath - Where to save the file on the Neuro Omega system. A tested path has been "C:\Surgeries_Data\<patient ID>"
  • FileName - Name of the file on the Neuro Omega system. Will saved where the File Path specifies.

Digital Ports

  • EnablePortInputs - Enabling this parameter will record from both 16-bit D-Sub digital input connectors to the Port1 and Port2 states.

Device Information

  • ChannelInfo - This is a read-only parameter that will be populated with channel information from the Neuro Omega (namely, the mapping between channel IDs (integers) and channel names).

Drive

  • ReadDriveDepth - Enable if you would like to read the driver depth from device. Only enable if the driver is connected.

Application Tab

NeuroOmegaStimulation

States

NeuroOmegaTimeStamp

The 32-bit time at which the channels are read from the Neuro Omega.

AOConnectionPercentage

From 0 - 100, the quality of the connection between the systems in percentage. Higher is better, and it might be useful for determining the cause of an issue if data isn't able to be streamed.

StimMarker1

A state that contains the number of the channel that is being stimulated. It will only be triggered when stimulation is occurring, otherwise it will be zero.

StimMarker1Time

The timestamp at which StimMarker1 occurs. For every StimMarker event, there will be a corresponding time stamp.

Port1 and Port2

These are 16-bit states recorded from the 16-bit D-Sub digital input 1 and input 2 connector on the Neuro Omega. The states record each pin as a 1 or 0, and stored in a certain bit. To decode this data, analyze as binary. For example, if Port1 was 8, this would mean only the 4th pin of Port1 was high and the rest were low.

Port1Time and Port2Time

The timestamps at which Port1 and Port2 are triggered.

Additional Information

TimeStamps

There are currently three timestamps logged: NeuroOmega timestamp, StimMarker timestamp, and the Ports 1 and 2 timestamps. The NeuroOmega timestamp is 32 bits, and corresponds to the time at which each block of data is read. Since both the StimMarkers and the Ports are read asynchronously to the signal source, they each have their own timestamps to accurately mark when the event occurred. These states are 16-bit, and increase twice as fast as the NeuroOmegaTimeStamp. To align them, shift every other peak up by 2^15.

Here is a published Matlab script that aligns the data for you: File:AlignNeuroOmegaStimMarkerTime.pdf. The pdf shows an example of how it should look like, but to use it yourself you must change the file path.

The units of the NeuroOmega time are currently unknown, however you can easily convert it to milliseconds by using the SourceTime state at the same index.

Certification Results

The AmpServerPro certification was performed to give a better understanding of the restraints that must be placed on the system when using this device. Certification success criteria was determined internally and without rigor, and reflects our experience with psychophysical experiments and the performance we expect to need for the system. More information about certification testing can be found on the certification wiki page.

PC Specifications

  • Desktop Windows 10
  • Processor: AMD Ryzen 7 5700G with Radeon Graphics 3.80 GHz
  • Installed Ram: 32.00 GB
  • Graphics Card: AMD Radeon(TM) Graphics
  • System Type: 64-bit operating system, x64-based processor
  • BCI2000 compiled with MSVC2019 and Qt 5.15.2
  • g.USBamp UB with driver version 3.16.00 installed

Certification Tests Performed

Certification testing varied task (P3Spell (7x7 grid), P3Spell (1x1 grid), CursorTask, CursorTaskLow, and StimulusPresentation) with a block size of 100ms, and tested audio and video latency, for a total of 12 performed tasks. The audio latency and video latency are partitioned into separate windows, as we tested them in different runs.

Success Criteria and Overall Results

Name Actual Latency Success Criteria Result
Timestamp Latency Mean 1.07ms 1 ms Failed
Timestamp Latency STD 1.98ms 5 ms Passed
Processing Latency Mean 3.07ms 20 ms Passed
Processing Latency STD 49.6ms 10 ms Failed
Video Latency Mean 61.3ms 65 ms Passed
Video Latency STD 9.79ms 20 ms Passed
Audio Latency Mean 43.8ms 65 ms Passed
Audio Latency STD 5.92ms 20 ms Passed

The individual task breakdown can be found commented out in the Wiki code below, for additional information.

Acquisition Latency

To measure the acquisition latency, the Audio and Video Latency were compared between the Neuro Omega and the g.USBAmp, which is considered to have an acquisition latency of 0. Performing this comparison, the Neuro Omega was found to have an average acquisition latency of 11 ± 5 ms.

Stimulation Latency

Two tests were performed to measure the Stimulation Latency: 1) the latency of the StimMarker (the response from the Neuro Omega), and 2) the latency of the actual stimulation.

The two tests were performed at a block size of 100 ms, while stimulating the ECOG High Frequency channel #2 (numbered 10272). As you can observe, the StimMarker recognizes the stimulation before the stimulation actually occurs, by almost half the time.

See also

User Reference:Filters, Contributions:ADCs, User Reference:NeuroStimulationParamsGUI