Neuroshare provides access to raw data and metadata (such as the sampling rate and creation date) via so called Entities, which groups data of the same type together. The standard defines 4 different entities: Events, Analog signals, Segments and Neural entities (i.e. spiketrains):
Event entities represent specific timepoints with associated data, e.g. trigger events.
Analog signal entities represents continuously sampled, i.e. digitized, analog data. Examples are waveforms recorded via an electrode (microelectrodes, EKG, EEG).
Segment entities contain cutouts of continuously sampled analog signals from one or more sources that are usually short in time. Most prominent example are waveforms of action potentials from one ore more electrodes.
Neural entities are arrays of timestamps when action potentials happened, i.e. arrays of spike times.
All entities in the file are accessed by their entity index. Each individual entity can have one or more data entries attached to it; these are indetified by a sequential index.
The basic desgin of the API closely follows the Neuroshare entity model. For all 4 entities there is a class that represents that entity:
All entity classes derive from a common Entity class that provides metadata common to all entites such as the label (Entity.label()) and how many data entries are contained in the entity (Entity.item_count() or just len(entity)).
Opening a file is simply done by creating a neuroshare.File object with the path to the datafile as constructor argument: fd = neuroshare.File('data.mcd'). Individual enitities can be accessed via the File.get_entity() function or via indexing through the File.entities() property (e.g. File.entities[idx]).
Data is accessed via the get_data() function that all 4 entities provide. Consult the documentation of the individual functions for details.
How to list all entities in a file called data.mcd:
import neuroshare as ns
fd = ns.File('data.mcd')
for i, entity in enumerate(fd.entities):
print('%04d: "%s" type: %d' % (i, entity.label, entity.entity_type))
This will produces the following output:
0000: "trig0001 0000 0000 trig0001" type: 1
0001: "elec0001 0000 0000 01" type: 2
0002: "elec0001 0001 0001 02" type: 2
0003: "elec0001 0002 0002 03" type: 2
[...]
To access the data and timestamps of an analog entity the AnalogEntity.get_data() is used:
analog1 = fd.entities[1] #access the entity 1
#now load all the raw data
data, timestamps, cont_count = analog1.get_data()
The data value is a 3-tuple which contains the raw data and the timestamps for each datapoint. It is also possible to retrieve a subset of the available data:
data = analog1.get_data(20, 10) #fetch 10 elements starting at index 20
print("%d" % data[0].shape)
# -> 10
print (data[0])
# ->
# [ 8.50000000e-05 7.00000000e-05 2.16666667e-05 3.16666667e-05
# 3.66666667e-05 0.00000000e+00 -5.50000000e-05 -9.33333333e-05
# -6.66666667e-05 3.33333333e-06]
Metadata is exposed as python properties of the individual entities:
print(analog1.units)
# -> 'V'
print(analog1.sample_rate)
# -> 25000.0
Object that represents a datafile that can be open via neuroshare at the location given by filename. The file will be opened upon object construction.
Individual entities can be opened via the get_entity() function or the entities() property. NB: The first entity index is 0
The name of the application that created the file
Close the file.
Additional comments
The time when this file was created, i.e. the data recorded. Returns a datetime.datetime object.
Property that returns a proxy object to allow the opening of entities in a via indexing, ie:
entity = datafile.entities[10] #retrieve the entity with at 10
The number of entities in this file
Text description of the file type
Open the entity at the given index.
List all entities. The range can be limited via the start and end parameters.
Timespan of the data in the file [in seconds]
Minimum resolution of timestamps [in seconds]
Base class of all entities that are contained in a neuroshare file
The type of the entity (of EntityType)
The underlying data file of this entity
Convert from a given timestamp to the corresponding index. The position argument controls how the timestamp is matched to the index. Options are:
Convert from a given index to the corresponding timestamp
The entity id of this entity
Number of data items for the specified entity in the file
The label or name of the entity
Event entities represent specific timepoints with associated data, e.g. trigger events. Data can be binary (8, 16 or 32 bit) values, text or comma separated values (cvs).
Description of the csv fields
The type of the event:
Retrieve the data at index. Returns a 2-tuple with the timestamp of the data at the first position ([0]) and the actual data a the second position ([1])). Example use: timestamp, data = event.get_data(0)
Maximum length of the data for the event [in bytes]
Minimum length of the data for the event [in bytes]
Entity that represents continuously sampled, i.e. digitized, analog data. Examples are waveforms recorded via an electrode (microelectrodes, EKG, EEG). Actual data can be accessed via the get_data() function. .. note:: data may contain gaps (e.g. when no data is recorded between trails)
Retrieve raw data from file starting at index up to count elements. If no parameters are given retrieves all available data.
Returns a tuple with three elements containing the raw data [0], the timestamp of each data point [1] and how many of the data values are continuous [2]. Example use: data, times, count = analog1.get_data()
Raw data and timestamp data are return as numpy.ndarray.
Type of the filter used [text]
High frequency cutoff [in Hz] of the filter
Order of the high frequency filter
Hardware specific additional location information
x coordinate of the source [in meters]
y coordinate of the source [in meters]
z coordinate of the source [in meters]
Type of the filter used [text]
Low frequency cutoff [in Hz] of the filter
Order of the high frequency filter
Maximum value of the data
Minimum value of the data
Additional information
Minimal resolvable step size
Sampling rate (in Hz).
Physical units of measured data
Entity the represents timestamps of action potentials, i.e. spike times. Cutouts of the waveforms corresponding to spike data in a neural entity might be found in a separate SegmentEntity (cf. source_entity_id()).
Retrieve the spike times associated with this entity. A subset of the data can be requested via the index and count parameters.
Additional information about the signal source
[Optional] Id of the source entity of this spike, if any. For example the spike waveform of the action potential corresponding to this spike might have been recorded in a segment entity.
[Optional] unit id used in the source entity (cf. source_entity_id())
Segment entities contain cutouts of continuously sampled analog signals from one or more sources that are usually short in time. Most prominent example are waveforms of action potentials from one ore more electrodes.
Retrieve the data at index
Maximum number of samples in each data item
Number of sources for this segment entity.
Property that provides access to the metadata of the individual sources of this entity.
Returns a sequence of objects of type SegmentSource. Metadata properties of a SegmentSource are analogous to the AnalogEntity.