
Does your experiment involves multiple pieces of equipment that all have their own software packages that don't talk to each other? Or are you using a Neuropixels system with a separate auxiliary data acquisition board (e.g., NIDAQ) alongside an IMEC acquisition module? Do you want to synchronize recorded data or events across these systems?
Enter Barcoder.
Barcoder provides a common concept of time across all of the devices that form your experimental setup. It splits barcode outputs through standard BNC cables to all of your data acquisition devices, which records its barcodes along with whatever other data those devices capture. After your recording session, our python library identifies bar codes in each recording and converts time stamps from one system into the “time zone” of another.
Theory of operation (read: why you need this)
Barcoder outputs a different unique bar code every 5 seconds. Each bar code encodes a 16-bit number as 16 pulses, either 10-ms long followed by a 5-ms pause, or 5-ms long followed by a 10-ms pause, to encode ones and zeros. This type of code is much easier to reliably decode than a code that simply pulls a TTL line high to encode “one” or low to encode “zero”, because it contains its own pulse clock. You don't need to specify the sampling rate of your recording device for this to work. Our post-processing code automatically detects the bar codes and matches them between recordings from multiple devices, and then converts timestamps between recordings.
Let's go through a few ways you might already solve this problem, graded from A to F.

Synchronization techniques. A. A bar code generated by the Barcoder. Each bit in the code is reliably decodable. That's not an A, that's an A+. B. A bar code generated by other devices comprising a sequence of consecutive high or low bits. Where do these consecutive high or low bits start and stop? Confusing, potentially disasterous. Good idea, not quite all the way there: B. C. A simple synchronization pulse allows for alignment between devices, but fails catastrophically in case of any missing data. If there's only one, it will not account for temporal drift. Average, but passing. C. F. Too many experiments are still performed without any directly encoded synchronization at all, relying instead of the intrinsic timing accuracy of every individual component of the system.
Use case: Neuropixels and OpenEphys
As a typical example, consider recording from Neuropixels probes using the OpenEphys software. Your experiment involves a data acquisition chassis that contains an IMEC card that reads from the Neuropixels, and a NI-DAQ card that records auxiliary signals. Unfortunately, these are captured as different “streams” with no common timebase, so it is impossible to accurately align events captured by the NI-DAQ card with the spikes recorded with the Neuropixels probe. The Barcoder solves this problem. If you connect its output to the single digital input of the IMEC card as well as to the #1 digital input on the NI-DAQ card, you can do this:
!pip install ephysio
from ephysio import openephysio
expt = openephysio.Loader("/path/to/your/data")
spike_stream = expt.spikestream()
events = expt.nidaqevents(spike_stream)
events is a dictionary containing the time stamps of the events captured on all of the digital inputs of the NI-DAQ card, converted to the time units of the spike stream of your Neuropixels recording. Likewise,
lfp_stream = expt.lfpstream()
lfp_events = expt.nidaqevents(lfp_stream)
returns those same events converted to the time units of the LFP stream.
Benefits
Convenience
You may have ways to connect timeseries across devices by cross-matching identifiable events, but this is cumbersome and not necessarily reliable. The Barcoder is trivially easy to use and removes any question of reliability.
Resilience
We all know that experimental recordings aren't always perfect. You load your data and find that the number of stimuli captured in the recording is not quite the same as the number you provided. Something is off, but what? Somewhere in the recording a segment of time may have gotten dropped, or perhaps the stimulator stopped working for a while. With the Barcoder, you have a much better chance to reconstruct what happened, because all your data are tagged with unambiguous timestamps. If an individual bar code is broken by one of your recording devices, the Barcoder software will detect this, and can still use the other bar codes to reconstruct the timeline.
Specifications
The Barcoder operates on 5 V from a standard USB-C input. It needs less than 100 mA of power. For convenience, the Barcoder has two BNC connectors that carry the same output sequence, synchronized to within than 10 nanoseconds of each other. Each connector can source and sink 20 mA and may be “T-ed” (split) to a practically unlimited number of recording devices. The output level is 5 V.
Compatibility
The 5-V output from the Barcoder is compatible with devices from the vast majority of vendors. If you are uncertain of compatibility with your particular equipment, we will be happy to investigate.
- Choosing a selection results in a full page refresh.
- Opens in a new window.