Tutorial CMOS MEA - multichannelsystems/McsMatlabDataTools GitHub Wiki

Loading data generated by CMOS-MEA software

Starting from version 2, CMOS-MEA-Control generates HDF5 files with the extensions .cmcr and .cmce, while CMOS-MEA-Tools generates HDF5 files with the extensions .cmtr and .cmte. All these files can be imported into Matlab with the command

data = McsHDF5.McsData('SOME_CMOS_MEA_FILE');

where 'SOME_CMOS_MEA_FILE' is the name of one of the HDF5 files mentioned above.

Up to this point, only the metadata has been read from the file. The actual data within the datasets will be loaded as soon as you try to access the datasets, for example in a plot function. The data is organized as follows within the data structure:

  • Top-level: General information and a cell array of McsRecording objects:
data
  • Each recording is stored in its individual cell: `
data.Recording{1}
  • Each recording can contain different data sources which may or may not be present in the file:
data.Recording{1}.Acquisition
data.Recording{1}.FilterTool
data.Recording{1}.SpikeExplorer
data.Recording{1}.NetworkExplorer
data.Recording{1}.SpikeSorter
data.Recording{1}.UnknownDataSources

Each of the data sources has a typical data structure which will be explained below. The UnknownDataSources array contains all data sources that did not match any of the known data sources. The toolbox can't fully support these data sources.

Most streams and data sources have an 'Info' field which contains metadata about the stream or data source:

data.Recording{1}.SpikeSorter.Info

Some data sources also have a 'Settings' field that contains the settings that were used in the software for this particular tool:

data.Recording{1}.SpikeSorter.Settings

Acquisition Data Source

Data files generated by CMOS-MEA-Control with extension .cmcr will usually contain the recorded raw data, as well as different analog, event and spike streams in their Acquisition data source. The actual contents of the file depend on the settings used when recording the file. These contents are arranged as cell arrays of streams:

data.Recording{1}.Acquisition.ChannelStream
data.Recording{1}.Acquisition.EventStream
data.Recording{1}.Acquisition.SensorStream
data.Recording{1}.Acquisition.SpikeStream

The contents of the ChannelStream, EventStream and SensorStream arrays are described in more detail in the DataManager help page of the Toolbox (see the Tutorial wiki page).

For files generated by CMOS-MEA-Tools, the Acquisition source will usually just be a link to the .cmcr file from which the results have been generated.

SpikeStream and SpikeExplorer

The SpikeStream array of the Acquisition data source and the SpikeExplorer data source both hold spike streams objects. These contain the results of channel-wise spike detection:

data.Recording{1}.Acquisition.SpikeStream{1}
data.Recording{1}.SpikeExplorer

The spikes are stored in the SpikeData field. They will be loaded from the file when the SpikeData field is accessed for the first time:

data.Recording{1}.Acquisition.SpikeStream{1}.SpikeData

FilterTool

The FilterTool data source contains information about the filter pipeline defined in the CMOS-MEA-Tools software. The details of each filter can be found in the Pipeline field:

data.Recording{1}.FilterTool.Pipeline{1}

NetworkExplorer

The NetworkExplorer data source holds the results of the Network Explorer Tool in CMOS-MEA-Tools. The STAs are stored in its STAData field and read from the file only when the STAData field is accessed for the first time:

data.Recording{1}.NetworkExplorer.STAData

Metadata about the STAs can be found in the STAInfos field:

data.Recording{1}.NetworkExplorer.STAInfos

For each channel/unit, there are two additional data sets available in the NetworkExplorer data source: Spikes and STAStdDev. These are mainly relevant for axon tracking in the STA. The Spikes field represents the results of a channel-wise spike detection in the STA and the STAStdDev field contains the standard deviations of each sensor in the STA which is used to compute the threshold for the spike detection. Both are read from the file the first time the respective field is accessed and have Info fields storing their metadata:

data.Recording{1}.NetworkExplorer.Spikes
data.Recording{1}.NetworkExplorer.SpikeInfos
data.Recording{1}.NetworkExplorer.STAStdDev
data.Recording{1}.NetworkExplorer.STAStdDevInfos

Reading a subset of STAs from the NetworkExplorer

In order to save memory, it is possible to load only a subset of STAs from the file instead of all of them. To achieve this, one needs to take care to not directly access the STAData field as this would trigger loading them from the field. Instead, one has to load first the metadata and then use the readPartialSTAData function:

data = McsHDF5.McsData('SOME_CMOS_MEA_FILE');
cfg = [];
cfg.sta = [2 4 8];
stas = data.Recording{1}.NetworkExplorer.readPartialSTAData(cfg);

'stas' will be a McsCmosNetworkExplorerSource object, containing the 2nd, 4th and 8th STA of the original data. In order to find out which indices to use in the cfg.sta array, you can access the STAInfos field which contains the metadata for each STA and is loaded from the beginning:

data.Recording{1}.NetworkExplorer.STAInfos

SpikeSorter

The SpikeSorter data source holds the results of the Spike Sorter Tool in CMOS-MEA-Tools. The UnitInfos field contains some details about each extracted unit, such as its location on the chip and the extracted quality measures:

data.Recording{1}.SpikeSorter.UnitInfos

It also contains a projection matrix that transforms raw data to the source signals of the units. For more information on how to perform this projection, please consult the CMOS-MEA software manual:

data.Recording{1}.SpikeSorter.ProjectionMatrix

Each extracted unit has its own entry in the UnitEntities array:

data.Recording{1}.SpikeSorter.UnitEntities{1}

For each unit, this data structure stores information about the extracted (spike) peaks, STAs of channels in its vicinity, the trace of its source signal and the coefficients for the projection from raw data to its source signal:

data.Recording{1}.SpikeSorter.UnitEntities{1}.Peaks
data.Recording{1}.SpikeSorter.UnitEntities{1}.RoiSTAs
data.Recording{1}.SpikeSorter.UnitEntities{1}.Source
data.Recording{1}.SpikeSorter.UnitEntities{1}.Unmixing

With the exception of the 'Unmixing' field, the contents of these fields are loaded from the file only when the field is accessed for the first time. Metadata about these fields can be found in the respective Info fields (PeaksInfo, RoiSTAsInfo, ...)

Plotting

Simple plot functions exist for the streams in the Acquisition data source:

plot(data.Recording{1}.Acquisition.ChannelStream{1},[])
plot(data.Recording{1}.Acquisition.EventStream{1},[])
plot(data.Recording{1}.Acquisition.SensorStream{1},[])
plot(data.Recording{1}.Acquisition.SpikeStream{1},[])

If for example the event stream and the spike streams have not been accessed before, their data is loaded during the execution of the respective plot function.

Plot functions can also be accessed at Acquisition, Recording or top level, in order to get an overview over all streams in the file/recording:

plot(data.Recording{1}.Acquisition,[]) plot(data.Recording{1},[]) plot(data,[])

If the second parameter of the plot function is empty, the default parameters are used for plotting. Otherwise, one can specify configuration structures for more fine-grained plotting. For example, the following commands will plot channels 1 and 2 of the second analog stream:

cfg = [];
cfg.channel = [1 2];
plot(data.Recording{1}.Acquisition.ChannelStream{2},cfg);

Each plot function has its own set of options, so you need to check the individual help functions for the specifics:

help McsHDF5.McsEventStream.plot

You can specify these configuration options also in higher level plot functions to achieve the same thing:

cfg = [];
cfg.acq.analog{2}.channel = [1 2];
plot(data.Recording{1},cfg);
cfg = [];
cfg.conf.acq.analog{2}.channel = [1 2];
plot(data,cfg);

You can also specify additional options in the plot function. These are forwarded to the underlying MATLAB plotting functions. The following command produces a time series plot of the first analog stream with thick dashed red lines:

plot(data.Recording{1}.Acquisition.ChannelStream{1},cfg,'--r','LineWidth',5);

Interactive Plots

Plot functions for the NetworkExplorer data source and the SpikeSorter data source produce interactive figures, i.e.

plot(data.Recording{1}.NetworkExplorer,[])
plot(data.Recording{1}.SpikeSorter,[])

The STAExplorer data source plot produces a Heat Map that visualizes the location of each detected sta and the realtive number of contributing sweeps. Upon clicking an non-active sensor on the Heat Map, labels for all units may be switched between visible and invisible. Clicking an active sensor opens a separate figure with corresponding detailed information. Namely, three graphics appear:

  • the signals of all sensors in a defined neighborhood of the clicked sensor
  • the signal of the clicked sensor
  • an animation showing the STA across the entire sensor array over time

The animation may started/paused by clicking into it. A bar in the magnified signal plot (middle) shows the timely position of the animation within the recording. By clicking into the signal, the current animation frame may be changed.

For more detailed information on configuration options please refer to the specific function help

help McsHDF5.McsCmosNetworkExplorerSource.plot

The SpikeSorter data source plot visualizes the entire sensor array. Several components of the visualization, including the grid, labels, etc., are configurable prior to calling the plot function. However, they may be adjusted via the interface as needed. Upon clicking a unit, the plot function for the corresponding SpikeSorter unit is called.

For more detailed information on configuration options please refer to the specific function help

help McsHDF5.McsCmosSpikeSorterSource.plot