Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

This format is currently under development!

From the NWB website:

Neurodata Without Borders: Neurophysiology (NWB:N) is a project to develop a unified data format for cellular-based neurophysiology data, focused on the dynamics of groups of neurons measured under a large range of experimental conditions. The NWB:N team consists of neuroscientists and software developers who recognize that adoption of a unified data format is an important step toward breaking down the barriers to data sharing in neuroscience.

NWB:N is funded by GE, the Allen Institute for Brain Science, the Howard Hughes Medical Institute (HHMI), The Kavli Foundation and the International Neuroinformatics Coordinating Facility. Our founding scientific partners are the Allen Institute, the Svoboda Lab at the Janelia Research Campus of HHMI, the Meister Lab at the California Institute of Technology, the Buzsáki Lab at New York University School of Medicine and the University of California, Berkeley.

...

The official format specification can be found on GitHub as raw HTML files. We've adapted it for use with Open Ephys by extending some base classes of the NWB specification to hold extra data that might be provided by the software. Extension files for the official NWB API will be provided as per the standard. The resulting format is as follows:

Open Ephys NWB File Structure (based on version 1.0.6)

(NOTE: The current version of the NWB record format on the development branch of Open Ephys is untested and unfinished so it might have bugs or fields not completely complying with the specification. )

...

Top-level groups (always created):

/acquisition
/analysis
/epochs
/general
/processing
/stimulus

Top-level datasets (always created):

/file_create_date: date + time in ISO format (text array)

...

/session_start_time: date + time in ISO format (text)


...

/acquisition group:

All of the data generated during recording should be stored in this group.

...

For writing continuous data, we use the NWB ElectricalSeries:

/acquisition/timeseries/recording<R>/continuous/processor<P>/recording<R>
    ./ancestry: ['TimeSeries', 'ElectricalSeries'] (text array attr)

...

    ./neurodata_type: 'TimeSeries' (text attr)
    ./source: Recorded processor name + <P> From data source processor name <P> (text attr)
    ./help: 'Stores acquired voltage data from extracellular recordings' (text attr)

...

            ./channel_metadata
                ./schema_id: 'openephys:metadata<metadata>/' (text attr)
                ./<metadata name>Field_<M>: L values or text string
                    ./schema_id: 'openephys:<text_metadata>' or 'openephys:<number_metadata>' (text attr) 
                    ./descriptionname: metadata descriptionfield name (text attr)
                    ./identifier                    ./description: metadata identifierdescription (text attr)
 
                    ./identifier: metadata identifier (text attr)
 

For writing spike data, we use the NWB SpikeEventSeries:

/acquisition/timeseries/recording<R>/spikes/electrode<E>/recording<R>
    ./ancestry: ['TimeSeries', 'SpikeEventSeries'] (text array attr)

...

    ./neurodata_type: 'TimeSeries' (text attr)
    ./source: Processor name + <P> (text attr)
    ./help: 'Snapshorts of spike events from data' (attr, text)

...

    ./oe_extra_info
        ./schema_id: 'openephys:<channeloe_extra_info>info/'
        ./name: channel info object name (text attr)

...

        ./channel_metadata
            ./schema_id: 'openephys:metadata<metadata>/' (text attr)
            ./<metadata name>Field_<M>: L values or text string
                   ./schema_id: 'openephys:<text_metadata>' or 'openephys:<number_metadata>' (text attr) 
                ./descriptionname: metadata descriptionfield name (text attr)
                     ./description: metadata description (text attr)
                ./identifier: metadata identifier (text attr)
        ./spike_metadata
            ./schema_id: 'openephys:metadata<metadata>/' (text attr)
            ./<metadata name> X spikes x Field_<M>: L values or Xtext spikes stringsstring
                   ./schema_id: 'openephys:<text_metadata>' or 'openephys:<number_metadata>' (text attr) 
                ./descriptionname: metadata field descriptionname (text attr)
                       ./description: metadata description (text attr)
                ./identifier: metadata identifier (text attr)

...

For writing messages, we use the NWB AnnotationSeries:

/acquisition/timeseries/recording<R>/events/text<T>/recording<R>
    ./ancestry: ['TimeSeries', 'AnnotationSeries'] (text array attr)

...

    ./neurodata_type: 'TimeSeries' (text attr)
    ./source: Processor name + <P> (text attr)
    ./help: 'Time-stamped annotations about an experiment' (attr, text)

...

    ./oe_extra_info
        ./schema_id: 'openephys:<channeloe_extra_info>info/'
        ./name: channel info object name (text attr)

...

        ./channel_metadata
            ./schema_id: 'openephys:metadata<metadata>/' (text attr)
            ./<metadata name>Field_<M>: L values or text string
                   ./schema_id: 'openephys:<text_metadata>' or 'openephys:<number_metadata>' (text attr) 
                ./descriptionname: metadata descriptionfield name (text attr)
                  ./description: metadata description (text attr)
                ./identifier: metadata identifier (text attr)
        ./spike_metadata
            ./schema_id: 'openephys:metadata<metadata>/' (text attr)
            ./<metadata name>  N x Field_<M>: L values or Ntext stringsstring
                   ./schema_id: 'openephys:<text_metadata>' or 'openephys:<number_metadata>' (text attr) 
                ./descriptionname: metadata descriptionfield name (text attr)
                ./identifier:         ./description: metadata description (text attr)
                ./identifier: metadata identifier (text attr)

...

For writing TTL events, we use a custom derived version of the NWB IntervalSeries called TTLSeries:

/acquisition/timeseries/recording<R>/events/ttl<T>/recording<R>
    ./ancestry: ['TimeSeries', 'IntervalSeries', 'TTLSeries'] (text array attr)

...

    ./neurodata_type: 'TimeSeries' (text attr)
    ./source: Processor name + <P> (text attr)
    ./help: 'Stores the start and stop times for TTL events' (attr, text)

...

    ./oe_extra_info
        ./schema_id: 'openephys:<channeloe_extra_info>info/'
        ./name: channel info object name (text attr)

...

        ./channel_metadata
            ./schema_id: 'openephys:metadata<metadata>/' (text attr)
            ./<metadata name>Field_<M>: L values or text string
                   ./schema_id: 'openephys:<text_metadata>' or 'openephys:<number_metadata>' (text attr) 
                ./name: metadata field name (text attr)
                ./description: metadata description (text attr)

...

        ./event_metadata
            ./schema_id: 'openephys:metadata<metadata>/' (text attr)
            ./<metadata name>  N xField_<M>: L values or Ntext stringsstring
                   ./schema_id: 'openephys:<text_metadata>' or 'openephys:<number_metadata>' or 'openephys:<number_metadata>' (text attr) 
                ./name: metadata field name (text attr)
                ./description: metadata description (text attr)

...

For writing Binary events, we use a custom derived version of the NWB  Timeseries called BinarySeries:

/acquisition/timeseries/recording<R>/events/binary<T>/recording<R>
    ./ancestry: ['TimeSeries', 'BinarySeries'] (text array attr)

...

    ./neurodata_type: 'TimeSeries' (text attr)
    ./source: Processor name + <P> (text attr)
    ./help: 'Stores arbitrary binary data' (attr, text)

...

    ./oe_extra_info
        ./schema_id: 'openephys:<channeloe_extra_info>info/'
        ./name: channel info object name (text attr)

...

        ./channel_metadata
            ./schema_id: 'openephys:metadata<metadata>/' (text attr)
            ./<metadata name>Field_<M>: L values or text string
                   ./schema_id: 'openephys:<text_metadata>' or 'openephys:<number_metadata>' (text attr) 
                ./name: metadata field name (text attr)
                ./description: metadata description (text attr)

...

        ./event_metadata
            ./schema_id: 'openephys:metadata<metadata>/' (text attr)
            ./<metadata name>  N x Field_<M>: L values or Ntext stringsstring
                   ./schema_id: 'openephys:<text_metadata>' or 'openephys:<number_metadata>' (text attr) 
                ./name: metadata field name (text attr)
                ./description: metadata description (text attr)

...

T = index of recorded event of the specific type

M = index of metadata field (1, 2, 3, etc...)


Rules for creating new files, versus creating new groups:

  • If acquisition is stopped, create a new file (experiment1.nwb, experiment2.nwb, etc.). Timestamps are reset to zero.
  • If recording is stopped (but acquisition is active), create a new group (recording1, recording2, etc.). Timestamps are relative to start of acquisition.



...


/general group:

All of the experimental metadata should be stored in this group. Eventually, we should have a pop-up window inside the GUI that allows the user to input various parameters (e.g., subject name, experimenter name) that will be automatically written here.

...