Apps
Apps enable you to create custom tools for real-time neural data processing that integrate seamlessly into your existing signal chains. Apps are custom tools or algorithms implemented in C++ using the tools we provide in the Synapse App SDK. An app is packaged and deployed to Synapse devices, where it can be used to process neural data in real-time with arbitrary output. This output can be read out by a local client running 'synapsectl' using the Taps API. Instruction for building and deploying an example can can be found in App API. Information about the tools we provide for App development can be found in the App SDK.
Taps
Taps are ports used to read data from nodes in the signal chain to a client (e.g., a computer running synapse-python). They are automatically created for standard nodes, making all node outputs accessible via the client. Taps can also be used to read out data from any position within a Synapse App, and can even be placed in multiple positions within a single app. For more information, visit Taps API.
Nodes
A Synapse device's capability is defined by the set of nodes it supports. Nodes come in a range of flavors: from Electrical Broadband to read from electrodes, or Optical Stimulation to write to light sources. Synapse Apps also function as nodes in the signal chain, but differ from standard nodes in their ability to implement powerful custom user-defined algorithms or operations. A full list of nodes and their configuration options can be found in the Node Reference.
Signal Chain
The signal chain controls how data is acquired, handled, and output by linking nodes together to create one or multiple signal chains running on your device. Signal chains can be configured in both linear and branching arrangements, and can include one or many nodes. When combined with Taps and the DiskWriter node, signal chains can stream or save data from any combination of nodes, though the DiskWriter node is restricted to data in the broadband frame format. The Synapse Apps node further expands capabilities by allowing you to build and deploy custom neural engineering tools within the signal chain.
DiskWriter Node & HDF5 Format
Data can be saved to on-device storage using the DiskWriter node. DiskWriter nodes create a termination point in the signal chain where data is saved to on-device storage in HDF5 format, and can be connected to any node outputting data in broadband frame format. This means that DiskWriters should be placed either at the end of a signal chain, or as a branched output from an intermediate node in the chain.
DiskWriter nodes operate independently. This means multiple DiskWriters can be used to save data from more than one node outputs at a time. As such, multiple data files are created simultaneously when using more than one DiskWriter, and each DiskWriter should be assigned a unique name when configuring your signal chain. DiskWriters save data in HDF5 format to facilitate interoperability with the NWB format developed by Neurodata Without Borders.
When acquiring broadband neural data, the data must be multiplied by a scaling factor to obtain raw voltage values. This is done by multiplying the analog to digital conversion (ADC) counts by the lowest significant bit (uV) value found in the File Attributes table.
The table and diagram below show an example of the HDF5 file attributes and structure, respectively.
Key | Value |
---|---|
lowest significant bit (uV) | 0.982965 |
Sample rate | 30000 |
Session Description | b 'ImpedanceTest' |
Session Start Time | b'2025-07-03T21:46:09Z' |
File Structure:
āāā š acquisition/
ā āāā š ElectricalSeries (shape=(29524832,), dtype=int32)
ā āāā š channel_range_count (shape=(0,), dtype=uint32)
ā āāā š channel_range_start (shape=(0,), dtype=uint32)
ā āāā š channel_range_type (shape=(0,), dtype=uint32)
ā āāā š sequence_number (shape=(922651,), dtype=uint64)
ā āāā š timestamp (shape=(922651,), dtype=uint64)
āāā š general/
āāā š device/
ā @device_type: b'SciFi'
āāā š extracellular_ephys/
āāā š electrodes/
āāā š id (shape=(32,), dtype=uint32)
Status Messages
Synapse uses compliant implementations to evaluate if a user-constructed signal chain is valid for a given device:
- Are the nodes available on the device?
- Do the nodes have sufficient bandwidth to be chained together?
- Do all signal chains have a Stream In or Stream Out node?
If a Synapse device receives an invalid configuration, the DeviceInfo
status
ās message
and code
fields will be updated with the relevant error message and code.
Status Code | Status Name | Description |
---|---|---|
0 | kOk | Not an error; returned on success. |
1 | kUndefinedError | Unknown error. |
2 | kInvalidConfiguration | The client specified an invalid signal chain. Note that this differs from kFailedPrecondition because kInvalidConfiguration indicates arguments that are problematic regardless of the state of the system (e.g., a malformed file name). |
3 | kFailedPrecondition | The operation was rejected because the system is not in a state required for the operation's execution. |
4 | kUnimplemented | The operation is not implemented or is not supported/enabled in this service. |
5 | kInternalError | Internal errors. This means that some invariants expected by the underlying system have been broken. |
6 | kPermissionDenied | The request does not have valid authentication credentials for the operation. |
7 | kQueryFailed | The query failed because the data received was incoherent. |
Peripheral Acquisition and Stimulation Devices
Peripherals can be hard or soft devices equipped with an ASIC for acquiring neural data or controlling device output such as Axon Probes or Adapters equipped with the Nixel or Pixel chips.
You can also use your own peripherals by simply integrating the Axon data bus. An example of this is the Synapse-Cereplex driver, which allows the SciFi headstage to acquire data from Blackrock Cerebus devices.
Some node types correspond to a specific peripheral input type, such as the Broadband or Stimulation nodes. These nodes require specific input and must be mapped to a peripheral device. This is done by specifying the peripheral ID when adding the node to your device configuration file. Some peripherals can be autodiscovered via the device.info()
command and each peripheral has a unique set of configuration options that are configured when their respective Synapse node is created.
Peripheral devices for environmental events or triggers transmitting digital TTL signals for data synchronization are categorically different and require specific channel configurations as discussed under the Axon GPIO inputs subsection.