forked from cortex-lab/KiloSort
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmaster_file_example.m
108 lines (87 loc) · 5.41 KB
/
master_file_example.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
% default options are in parenthesis after the comment
addpath(genpath('C:\bin\GitHub\KiloSort')) % path to kilosort folder
addpath(genpath('C:\bin\GitHub\npy-matlab')) % path to npy-matlab scripts
ops.GPU = 1; % whether to run this code on an Nvidia GPU (much faster, mexGPUall first)
ops.parfor = 0; % whether to use parfor to accelerate some parts of the algorithm
ops.verbose = 1; % whether to print command line progress
ops.showfigures = 1; % whether to plot figures during optimization
ops.datatype = 'dat'; % binary ('dat', 'bin') or 'openEphys'
ops.fbinary = 'C:\DATA\Spikes\Piroska\piroska_example_short.dat'; % will be created for 'openEphys'
ops.fproc = 'C:\DATA\Spikes\Piroska\temp_wh.dat'; % residual from RAM of preprocessed data
ops.root = 'C:\DATA\Spikes\Piroska'; % 'openEphys' only: where raw files are
ops.fs = 25000; % sampling rate
ops.NchanTOT = 32; % total number of channels
ops.Nchan = 32; % number of active channels
ops.Nfilt = 32; % number of filters to use (2-4 times more than Nchan, should be a multiple of 32)
ops.nNeighPC = 12; % visualization only (Phy): number of channnels to mask the PCs, leave empty to skip (12)
ops.nNeigh = 16; % visualization only (Phy): number of neighboring templates to retain projections of (16)
% options for channel whitening
ops.whitening = 'full'; % type of whitening (default 'full', for 'noSpikes' set options for spike detection below)
ops.nSkipCov = 1; % compute whitening matrix from every N-th batch (1)
ops.whiteningRange = 32; % how many channels to whiten together (Inf for whole probe whitening, should be fine if Nchan<=32)
% define the channel map as a filename (string) or simply an array
ops.chanMap = 'C:\DATA\Spikes\Piroska\chanMap.mat'; % make this file using createChannelMapFile.m
% ops.chanMap = 1:ops.Nchan; % treated as linear probe if a chanMap file
% other options for controlling the model and optimization
ops.Nrank = 3; % matrix rank of spike template model (3)
ops.nfullpasses = 6; % number of complete passes through data during optimization (6)
ops.maxFR = 20000; % maximum number of spikes to extract per batch (20000)
ops.fshigh = 300; % frequency for high pass filtering
ops.ntbuff = 64; % samples of symmetrical buffer for whitening and spike detection
ops.scaleproc = 200; % int16 scaling of whitened data
ops.NT = 32*1024+ ops.ntbuff;% this is the batch size (try decreasing if out of memory)
% for GPU should be multiple of 32 + ntbuff
% the following options can improve/deteriorate results.
% when multiple values are provided for an option, the first two are beginning and ending anneal values,
% the third is the value used in the final pass.
ops.Th = [4 10 10]; % threshold for detecting spikes on template-filtered data ([6 12 12])
ops.lam = [5 20 20]; % large means amplitudes are forced around the mean ([10 30 30])
ops.nannealpasses = 4; % should be less than nfullpasses (4)
ops.momentum = 1./[20 400]; % start with high momentum and anneal (1./[20 1000])
ops.shuffle_clusters = 1; % allow merges and splits during optimization (1)
ops.mergeT = .1; % upper threshold for merging (.1)
ops.splitT = .1; % lower threshold for splitting (.1)
% options for initializing spikes from data
ops.initialize = 'no'; %'fromData' or 'no'
ops.spkTh = -6; % spike threshold in standard deviations (4)
ops.loc_range = [3 1]; % ranges to detect peaks; plus/minus in time and channel ([3 1])
ops.long_range = [30 6]; % ranges to detect isolated peaks ([30 6])
ops.maskMaxChannels = 5; % how many channels to mask up/down ([5])
ops.crit = .65; % upper criterion for discarding spike repeates (0.65)
ops.nFiltMax = 10000; % maximum "unique" spikes to consider (10000)
% load predefined principal components (visualization only (Phy): used for features)
dd = load('PCspikes2.mat'); % you might want to recompute this from your own data
ops.wPCA = dd.Wi(:,1:7); % PCs
% options for posthoc merges (under construction)
ops.fracse = 0.1; % binning step along discriminant axis for posthoc merges (in units of sd)
ops.epu = Inf;
ops.ForceMaxRAMforDat = 20e9; % maximum RAM the algorithm will try to use; on Windows it will autodetect.
%%
tic; % start timer
if ops.GPU
% initialize GPU (will erase any existing GPU arrays)
gpuDevice(1);
end
if strcmp(ops.datatype , 'openEphys')
ops = convertOpenEphysToRawBInary(ops); % convert data, only for OpenEphys
end
%
[rez, DATA, uproj] = preprocessData(ops);
if strcmp(ops.initialize, 'fromData')
% do scaled kmeans to initialize the algorithm (not sure if functional yet for CPU)
optimizePeaks;
end
%
[rez] = fitTemplates(ops, rez, DATA, WUinit);
%
% extracts final spike times (overlapping extraction)
fullMPMU;
% posthoc merge templates (under construction)
% rez = merge_posthoc2(rez);
% save matlab results file
save(fullfile(ops.root, 'rez.mat'), 'rez', '-v7.3');
% save python results file for Phy
rezToPhy(rez, ops.root);
% remove temporary file
delete(ops.fproc);
%%