Matlab tools for electrophysiology experiments collected with PLDAPS and Open-Ephys
ephys-matlab provides a set of tools for essential components of visual neuroscience experiments:
caveats: This is a work in progress and will gain new features as they become necessary. This package will not be supported for public consumption.
PLDAPS manages stimulus presentation and behavioral monitoring. Open-Ephys
A central component of ephys-matlab is the use of meta data for tracking what experiments / analyses have been run. In many ways, we use this as if we had a database, but it is not one!! It is just an excel file that keeps track of the
The following git repositories are required for ephys-matlab to import a session.
Repos associated with PLDAPS/Eyelink/OpenEphys:
PLDAPS, PEP, edfmex, analysis-tools
Repos associated with KiloSort:
KiloSort, Spkes, SortQuality, npy-matlab
Once the repositories are on you disk, edit addEphysMatlab
to appropriately point to each of them and then add them to the matlab path.
ephys-matlab
uses matlab preferences to manage the location of local data and server data. Set up both directories using the following commands in matlab.
setpref('EPHYS', 'SERVER_DATA', '/full/path/to/the/data/on/the/server')
setpref('EPHYS', 'LOCAL_DATA', '/full/path/to/folder/on/local/disk')
The file import_script.m
provides a template for importing an ephys session collected with PLDAPS / Open-Ephys / Eyelink
In the future it will support other eyetrackers, but for the time being, it expects that every session will contain three types of files
Make sure that all the paths are added
addEphysMatlab
"Shank" refers to a particular array or group of electrodes. Ephys-matlab will separate recordings by shank. Shanks will be spike-sorted separately and the processed data will live in separate directories. Use edit hardware.electrodeFactory
to see the available recording devices. To add a recording device, simply add a new case
to the switch statement and update it to point to the appropriate files (under hardware.electrode
, and hardware.headstage
).
Here is an example of a recording shank entry:
shank{1} = hardware.electrode.Shank2;
shank{1}.headstages{1} = hardware.headstage.intan_RHD2132; % specify what type of headstage was used
shank{1}.name = 'V1'; % name the electrode array
hardware.electrode.(probeName)
are all probe
objects. You have to create one that matches the probe you are using. The important properties are channelMap
and xcoords
, ycoords
, zcoords
. Counter-intuitively, x
and z
code placement in the chamber and ycoords
codes for the depth of each electrode site.
The line shank{1} = hardware.electrode.Shank2;
points to the 32 channel silicone linear array that we have named "shank2".
Shank2 with properties:
name: 'Shank2'
manufacturer: 'Atlas'
design: 'E32-50-S1-L6'
num: '2015-151'
xcoords: [32×1 double]
ycoords: [32×1 double]
zcoords: [32×1 double]
channelMap: [1×32 double]
connector: 'Omnetics36'
material: 'IrOx'
impedence: 0.5000
headstages: {}
hardware.headstage.(headstageName)
refer to the digitizing headstages used with intan/open-ephys.
For example, we have several 32 channel headstages from intan.
intan_RHD2132 with properties:
name: 'intan_RHD2132'
manufacturer: 'intan'
model: 'RHD2132'
filter: [1 7500]
samplingRate: 30000
connector: 'Omnetics36'
gains: NaN
channelMap: [1×36 double]
Headstages can apply a channel map to a probe, which will re-order the channels properly. Setting up the headstage and electrode per the manufacturers specs will produce a channel map that accurately orders the channels.
Headstages can also be blank and apply no channel map. This assumes that the channel map specified by the electrode is the correct mapping. This might be useful if using single electrodes, when you already know which channel corresponds to which electrode and there is no particular geometry.
For example: For single electrodes specify a custom channel map using numbers relative to the headstage start. eg., if using ch36 plugged into headstage 2, this should be channel 4 (relative to the start of headstage 2)
% list single electrode channels (this can be a vector if > 1 electrode used)
chanMap = 4;
shank{2} = hardware.electrode.customChannelMap(chanMap);
shank{2}.name = 'MtBurrHoleMapping';
If you chose hardware.electrode.customChannelMap(chNum), the channel map will be chanMap. That's it. No specifying headstage necessary. Behind the scenes, it is calling hardware.headstage.blank32
, which applies no channel map.
Call io.importSession()
without any arguments to run a generic import. This will ask you to select a directory where the data from the session live. Then it will prompt for a recording device (shank) and then automatically population the meta table with information from the available data.
If a session has been imported, it will show up as a row in the excel file under getpref('EPHYS', 'SERVERDATA')
.
For example,
meta = io.getExperimentsAnd('Subject', 'Ellie', 'Chamber', 'V1', 'Lens', 1, 'StimulusProtocols', 'hartleyFF', 'SpikeSorting', 'Kilo');