rmeddis@38
|
1 function test_binaural
|
rmeddis@38
|
2 % test_binaural is a first attempt to produce a binaural model
|
rmeddis@38
|
3 % incorporating MSO and IC models.
|
rmeddis@38
|
4 % The monaural response is computed first for left and right stimuli
|
rmeddis@38
|
5 % before using the CN response as input to the binaural MSO model
|
rmeddis@38
|
6 % that, in turn, feeds a single cell IC model.
|
rmeddis@38
|
7 %
|
rmeddis@38
|
8 % The function has no arguments and everything is set up internally
|
rmeddis@38
|
9 %
|
rmeddis@38
|
10 % #1
|
rmeddis@38
|
11 % Identify the file (in 'MAPparamsName') containing the model parameters
|
rmeddis@38
|
12 % the default is 'PL' which uses primary like neurons in the CN to
|
rmeddis@38
|
13 % simulate spherical bushy cells
|
rmeddis@38
|
14 %
|
rmeddis@38
|
15 % #2
|
rmeddis@38
|
16 % Set AN_spikesOrProbability'). to 'spikes'
|
rmeddis@38
|
17 %
|
rmeddis@38
|
18 % #3
|
rmeddis@38
|
19 % Choose between a tone signal or file input (in 'signalType')
|
rmeddis@38
|
20 %
|
rmeddis@38
|
21 % #4
|
rmeddis@38
|
22 % Set the signal rms level (in leveldBSPL)
|
rmeddis@38
|
23 %
|
rmeddis@38
|
24 % #5
|
rmeddis@38
|
25 % Identify the channels in terms of their best frequencies in the vector
|
rmeddis@38
|
26 % BFlist. This is currently a single-channel model, so only one BF needed
|
rmeddis@38
|
27 %
|
rmeddis@38
|
28 % #6
|
rmeddis@38
|
29 % Last minute changes to the parameters fetched earlier can be made using
|
rmeddis@38
|
30 % the cell array of strings 'paramChanges'.
|
rmeddis@38
|
31 % Each string must have the same format as the corresponding line in the
|
rmeddis@38
|
32 % file identified in 'MAPparamsName'
|
rmeddis@38
|
33 % Currently this is used to specify that only HSR fibers are used and
|
rmeddis@38
|
34 % for changing the current per AN spike at the CN dendrite
|
rmeddis@38
|
35 %
|
rmeddis@38
|
36 % #7
|
rmeddis@38
|
37 % specify the parameters of the MSO cells in the MSOParams structure
|
rmeddis@38
|
38 %
|
rmeddis@38
|
39 % #8
|
rmeddis@38
|
40 % specify the parameters of the IC cells in the ICMSOParams structure
|
rmeddis@38
|
41 %
|
rmeddis@38
|
42 % #9
|
rmeddis@38
|
43 % identify the plots required from MAP1_14 (i.e. before the bonaural model)
|
rmeddis@38
|
44 %
|
rmeddis@38
|
45 % #10
|
rmeddis@38
|
46 % Specify ITDs. The program cycles through different ITDs
|
rmeddis@38
|
47 %
|
rmeddis@38
|
48
|
rmeddis@38
|
49 global CNoutput dtSpikes
|
rmeddis@38
|
50 dbstop if error
|
rmeddis@38
|
51 restorePath=path;
|
rmeddis@38
|
52 addpath (['..' filesep 'MAP'], ['..' filesep 'wavFileStore'], ...
|
rmeddis@38
|
53 ['..' filesep 'utilities'])
|
rmeddis@38
|
54
|
rmeddis@38
|
55 %% #1 monaural model parameter file name
|
rmeddis@38
|
56 MAPparamsName='PL';
|
rmeddis@38
|
57
|
rmeddis@38
|
58
|
rmeddis@38
|
59 %% #2 'spikes' are mandatory for this model
|
rmeddis@38
|
60 AN_spikesOrProbability='spikes';
|
rmeddis@38
|
61
|
rmeddis@38
|
62
|
rmeddis@38
|
63 %% #3 pure tone, harmonic sequence or speech file input
|
rmeddis@38
|
64 signalType= 'tones';
|
rmeddis@38
|
65 sampleRate= 50000;
|
rmeddis@38
|
66 duration=0.050; % seconds
|
rmeddis@38
|
67 rampDuration=.005; % raised cosine ramp (seconds)
|
rmeddis@38
|
68 beginSilence=0.050;
|
rmeddis@38
|
69 endSilence=0.050;
|
rmeddis@38
|
70 toneFrequency= 750; % or a pure tone (Hz)
|
rmeddis@38
|
71
|
rmeddis@38
|
72 % or
|
rmeddis@38
|
73 % harmonic sequence (Hz)
|
rmeddis@38
|
74 % F0=210;
|
rmeddis@38
|
75 % toneFrequency= F0:F0:8000;
|
rmeddis@38
|
76
|
rmeddis@38
|
77 % or
|
rmeddis@38
|
78 % signalType= 'file';
|
rmeddis@38
|
79 % fileName='twister_44kHz';
|
rmeddis@38
|
80
|
rmeddis@38
|
81 if strcmp(signalType, 'file')
|
rmeddis@38
|
82 % needed for labeling plot
|
rmeddis@38
|
83 showMapOptions.fileName=fileName;
|
rmeddis@38
|
84 else
|
rmeddis@38
|
85 showMapOptions.fileName=[];
|
rmeddis@38
|
86 end
|
rmeddis@38
|
87
|
rmeddis@38
|
88 %% #4 rms level
|
rmeddis@38
|
89 leveldBSPL= 70;
|
rmeddis@38
|
90
|
rmeddis@38
|
91
|
rmeddis@38
|
92 %% #5 number of channels in the model
|
rmeddis@38
|
93 BFlist=toneFrequency;
|
rmeddis@38
|
94
|
rmeddis@38
|
95 %% #6 change model parameters
|
rmeddis@38
|
96
|
rmeddis@38
|
97 paramChanges={'IHCpreSynapseParams.tauCa=80e-6;',...
|
rmeddis@38
|
98 'MacGregorMultiParams.currentPerSpike=0.800e-6;'};
|
rmeddis@38
|
99
|
rmeddis@38
|
100 % Parameter changes can be used to change one or more model parameters
|
rmeddis@38
|
101 % *after* the MAPparams file has been read
|
rmeddis@38
|
102
|
rmeddis@38
|
103 %% #7 MSO parameters
|
rmeddis@38
|
104 MSOParams.nNeuronsPerBF= 10; % N neurons per BF
|
rmeddis@38
|
105 MSOParams.type = 'primary-like cell';
|
rmeddis@38
|
106 MSOParams.fibersPerNeuron=4; % N input fibers
|
rmeddis@38
|
107 MSOParams.dendriteLPfreq=2000; % dendritic filter
|
rmeddis@38
|
108 MSOParams.currentPerSpike=0.11e-6; % (A) per spike
|
rmeddis@38
|
109 MSOParams.currentPerSpike=0.5e-6; % (A) per spike
|
rmeddis@38
|
110 MSOParams.Cap=4.55e-9; % cell capacitance (Siemens)
|
rmeddis@38
|
111 MSOParams.tauM=5e-4; % membrane time constant (s)
|
rmeddis@38
|
112 MSOParams.Ek=-0.01; % K+ eq. potential (V)
|
rmeddis@38
|
113 MSOParams.dGkSpike=3.64e-5; % K+ cond.shift on spike,S
|
rmeddis@38
|
114 MSOParams.tauGk= 0.0012; % K+ conductance tau (s)
|
rmeddis@38
|
115 MSOParams.Th0= 0.01; % equilibrium threshold (V)
|
rmeddis@38
|
116 MSOParams.c= 0.01; % threshold shift on spike, (V)
|
rmeddis@38
|
117 MSOParams.tauTh= 0.015; % variable threshold tau
|
rmeddis@38
|
118 MSOParams.Er=-0.06; % resting potential (V)
|
rmeddis@38
|
119 MSOParams.Eb=0.06; % spike height (V)
|
rmeddis@38
|
120 MSOParams.debugging=0; % (special)
|
rmeddis@38
|
121 MSOParams.wideband=0; % special for wideband units
|
rmeddis@38
|
122
|
rmeddis@38
|
123 %% #8 IC parameters
|
rmeddis@38
|
124 ICchopperParams.nNeuronsPerBF= 10; % N neurons per BF
|
rmeddis@38
|
125 ICchopperParams.type = 'chopper cell';
|
rmeddis@38
|
126 ICchopperParams.fibersPerNeuron=10; % N input fibers
|
rmeddis@38
|
127 ICchopperParams.dendriteLPfreq=50; % dendritic filter
|
rmeddis@38
|
128 ICchopperParams.currentPerSpike=50e-9; % *per spike
|
rmeddis@38
|
129 ICchopperParams.currentPerSpike=100e-9; % *per spike
|
rmeddis@38
|
130 ICchopperParams.Cap=1.67e-8; % ??cell capacitance (Siemens)
|
rmeddis@38
|
131 ICchopperParams.tauM=0.002; % membrane time constant (s)
|
rmeddis@38
|
132 ICchopperParams.Ek=-0.01; % K+ eq. potential (V)
|
rmeddis@38
|
133 ICchopperParams.dGkSpike=1.33e-4; % K+ cond.shift on spike,S
|
rmeddis@38
|
134 ICchopperParams.tauGk= 0.0005;% K+ conductance tau (s)
|
rmeddis@38
|
135 ICchopperParams.Th0= 0.01; % equilibrium threshold (V)
|
rmeddis@38
|
136 ICchopperParams.c= 0; % threshold shift on spike, (V)
|
rmeddis@38
|
137 ICchopperParams.tauTh= 0.02; % variable threshold tau
|
rmeddis@38
|
138 ICchopperParams.Er=-0.06; % resting potential (V)
|
rmeddis@38
|
139 ICchopperParams.Eb=0.06; % spike height (V)
|
rmeddis@38
|
140 ICchopperParams.PSTHbinWidth= 1e-4;
|
rmeddis@38
|
141
|
rmeddis@38
|
142 %% #9 delare 'showMap' options to control graphical output
|
rmeddis@38
|
143 % this applies to the monaural input model only
|
rmeddis@38
|
144 showMapOptions.printModelParameters=0; % prints all parameters
|
rmeddis@38
|
145 showMapOptions.showModelOutput=1; % plot all stages if monaural input
|
rmeddis@38
|
146
|
rmeddis@38
|
147 %% #10 ITDs
|
rmeddis@38
|
148 % the program cycles through a range of stimulus ITDs
|
rmeddis@38
|
149 ITDs=0e-6:100e-6:2000e-6;
|
rmeddis@38
|
150 % ITDs=0; % single shot
|
rmeddis@38
|
151
|
rmeddis@38
|
152 %% Now start computing!
|
rmeddis@38
|
153 figure(98), clf, set(gcf, 'name', 'binaural demo')
|
rmeddis@38
|
154 MSOcounts=zeros(1,length(ITDs));
|
rmeddis@38
|
155 ICcounts=zeros(1,length(ITDs));
|
rmeddis@38
|
156 ITDcount=0;
|
rmeddis@38
|
157 for ITD=ITDs
|
rmeddis@38
|
158 ITDcount=ITDcount+1;
|
rmeddis@38
|
159 delaySamples=round(ITD* sampleRate);
|
rmeddis@38
|
160 %% Generate stimuli
|
rmeddis@38
|
161 switch signalType
|
rmeddis@38
|
162 case 'tones'
|
rmeddis@38
|
163 % Create pure tone stimulus
|
rmeddis@38
|
164 dt=1/sampleRate; % seconds
|
rmeddis@38
|
165 time=dt: dt: duration;
|
rmeddis@38
|
166 inputSignal=sum(sin(2*pi*toneFrequency'*time), 1);
|
rmeddis@38
|
167 amp=10^(leveldBSPL/20)*28e-6; % converts to Pascals (peak)
|
rmeddis@38
|
168 inputSignal=amp*inputSignal;
|
rmeddis@38
|
169 % apply ramps
|
rmeddis@38
|
170 % catch rampTime error
|
rmeddis@38
|
171 if rampDuration>0.5*duration, rampDuration=duration/2; end
|
rmeddis@38
|
172 rampTime=dt:dt:rampDuration;
|
rmeddis@38
|
173 ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi)) ...
|
rmeddis@38
|
174 ones(1,length(time)-length(rampTime))];
|
rmeddis@38
|
175 inputSignal=inputSignal.*ramp;
|
rmeddis@38
|
176 ramp=fliplr(ramp);
|
rmeddis@38
|
177 inputSignal=inputSignal.*ramp;
|
rmeddis@38
|
178 % add silence
|
rmeddis@38
|
179 intialSilence= zeros(1,round(beginSilence/dt));
|
rmeddis@38
|
180 finalSilence= zeros(1,round(endSilence/dt));
|
rmeddis@38
|
181 inputSignal= [intialSilence inputSignal finalSilence];
|
rmeddis@38
|
182
|
rmeddis@38
|
183 case 'file'
|
rmeddis@38
|
184 %% file input simple or mixed
|
rmeddis@38
|
185 [inputSignal sampleRate]=wavread(fileName);
|
rmeddis@38
|
186 dt=1/sampleRate;
|
rmeddis@38
|
187 inputSignal=inputSignal(:,1);
|
rmeddis@38
|
188 targetRMS=20e-6*10^(leveldBSPL/20);
|
rmeddis@38
|
189 rms=(mean(inputSignal.^2))^0.5;
|
rmeddis@38
|
190 amp=targetRMS/rms;
|
rmeddis@38
|
191 inputSignal=inputSignal*amp;
|
rmeddis@38
|
192 intialSilence= zeros(1,round(0.1/dt));
|
rmeddis@38
|
193 finalSilence= zeros(1,round(0.2/dt));
|
rmeddis@38
|
194 inputSignal= [intialSilence inputSignal' finalSilence];
|
rmeddis@38
|
195 end
|
rmeddis@38
|
196
|
rmeddis@38
|
197 %% run the monaural model twice
|
rmeddis@38
|
198 t=dt:dt:dt*length(inputSignal);
|
rmeddis@38
|
199 for ear={'left','right'}
|
rmeddis@38
|
200 figure(98), subplot(4,1,1), colour='b'; hold off
|
rmeddis@38
|
201 switch ear{1}
|
rmeddis@38
|
202 case 'right'
|
rmeddis@38
|
203 inputSignal=circshift(inputSignal', delaySamples)';
|
rmeddis@38
|
204 hold on
|
rmeddis@38
|
205 colour='r';
|
rmeddis@38
|
206 end
|
rmeddis@38
|
207 plot(t, inputSignal, colour)
|
rmeddis@38
|
208 title ('binaural inputs signals')
|
rmeddis@38
|
209 ylabel('Pa'), xlabel('time')
|
rmeddis@38
|
210 xlim([0 max(t)])
|
rmeddis@38
|
211
|
rmeddis@38
|
212 % call to monaural model
|
rmeddis@38
|
213 MAP1_14(inputSignal, sampleRate, BFlist, ...
|
rmeddis@38
|
214 MAPparamsName, AN_spikesOrProbability, paramChanges);
|
rmeddis@38
|
215
|
rmeddis@38
|
216 % the model run is now complete. Now display the results
|
rmeddis@38
|
217 UTIL_showMAP(showMapOptions, paramChanges)
|
rmeddis@38
|
218
|
rmeddis@38
|
219 % copy the CN inputspiking pattern to the binaural display
|
rmeddis@38
|
220 figure(98)
|
rmeddis@38
|
221 switch ear{1}
|
rmeddis@38
|
222 case 'left'
|
rmeddis@38
|
223 CNoutputLeft=CNoutput;
|
rmeddis@38
|
224 subplot(4,2,3)
|
rmeddis@38
|
225 case 'right'
|
rmeddis@38
|
226 CNoutputRight=CNoutput;
|
rmeddis@38
|
227 subplot(4,2,4)
|
rmeddis@38
|
228 end
|
rmeddis@38
|
229 plotInstructions=[];
|
rmeddis@38
|
230 plotInstructions.axes=gca;
|
rmeddis@38
|
231 plotInstructions.displaydt=dtSpikes;
|
rmeddis@38
|
232 plotInstructions.title= ['CN spikes ' ear{1}];
|
rmeddis@38
|
233 plotInstructions.rasterDotSize=2;
|
rmeddis@38
|
234 if sum(sum(CNoutput))<100
|
rmeddis@38
|
235 plotInstructions.rasterDotSize=3;
|
rmeddis@38
|
236 end
|
rmeddis@38
|
237 UTIL_plotMatrix(CNoutput, plotInstructions);
|
rmeddis@38
|
238
|
rmeddis@38
|
239 end % left/ right ear
|
rmeddis@38
|
240
|
rmeddis@38
|
241 %% MSO
|
rmeddis@38
|
242 % run MSO model using left and right CN spikes
|
rmeddis@38
|
243 MSOspikes=MSO(CNoutputLeft,CNoutputRight, dtSpikes, MSOParams);
|
rmeddis@38
|
244
|
rmeddis@38
|
245 sumspikes=sum(sum(MSOspikes));
|
rmeddis@38
|
246 disp(['ITD/ MSO spikes count= ' num2str([ITD sumspikes])])
|
rmeddis@38
|
247 MSOcounts(ITDcount)=sumspikes;
|
rmeddis@38
|
248 figure(98), subplot(4,2, 8), cla, hold off, plot(ITDs*1e6, MSOcounts)
|
rmeddis@38
|
249
|
rmeddis@38
|
250 %% IC chopper
|
rmeddis@38
|
251 % run IC model using all MSO spikes as input to a single IC cell
|
rmeddis@38
|
252 ICMSOspikes=ICchopper(MSOspikes, dtSpikes, ICchopperParams);
|
rmeddis@38
|
253
|
rmeddis@38
|
254 sumspikes=sum(sum(ICMSOspikes));
|
rmeddis@38
|
255 disp(['ITD/ ICMSO spikes count= ' num2str([ITD sumspikes])])
|
rmeddis@38
|
256 ICcounts(ITDcount)=sumspikes;
|
rmeddis@38
|
257 figure(98), subplot(4,2,8),hold on, plot(ITDs*1e6, ICcounts,'r')
|
rmeddis@38
|
258 xlabel('ITD'), ylabel(' spike count')
|
rmeddis@38
|
259 title('MSO (blue)/ IC (red) spike counts')
|
rmeddis@38
|
260 legend({'MSO','IC'})
|
rmeddis@38
|
261
|
rmeddis@38
|
262 end % ITDs
|
rmeddis@38
|
263
|
rmeddis@38
|
264 path(restorePath)
|
rmeddis@38
|
265
|
rmeddis@38
|
266
|
rmeddis@38
|
267 function MSOspikes=MSO(CNoutputLeft,CNoutputRight, dtSpikes, MSOparams)
|
rmeddis@38
|
268 %%
|
rmeddis@38
|
269 [nMSOcells nEpochs]=size(CNoutputLeft);
|
rmeddis@38
|
270 inputCurrent=zeros(nMSOcells, nEpochs);
|
rmeddis@38
|
271 MSOmembranePotential=inputCurrent;
|
rmeddis@38
|
272
|
rmeddis@38
|
273 MSO_tauM=MSOparams.tauM;
|
rmeddis@38
|
274 MSO_tauGk=MSOparams.tauGk;
|
rmeddis@38
|
275 MSO_tauTh=MSOparams.tauTh;
|
rmeddis@38
|
276 MSO_cap=MSOparams.Cap;
|
rmeddis@38
|
277 MSO_c=MSOparams.c;
|
rmeddis@38
|
278 MSO_b=MSOparams.dGkSpike;
|
rmeddis@38
|
279 MSO_Th0=MSOparams.Th0;
|
rmeddis@38
|
280 MSO_Ek=MSOparams.Ek;
|
rmeddis@38
|
281 MSO_Eb= MSOparams.Eb;
|
rmeddis@38
|
282 MSO_Er=MSOparams.Er;
|
rmeddis@38
|
283
|
rmeddis@38
|
284 MSO_E=zeros(nMSOcells,1);
|
rmeddis@38
|
285 MSO_Gk=zeros(nMSOcells,1);
|
rmeddis@38
|
286 MSO_Th=MSO_Th0*ones(nMSOcells,1);
|
rmeddis@38
|
287
|
rmeddis@38
|
288 % Dendritic filtering, all spikes are replaced by CNalphaFunction functions
|
rmeddis@38
|
289 MSOdendriteLPfreq= MSOparams.dendriteLPfreq;
|
rmeddis@38
|
290 MSOcurrentPerSpike=MSOparams.currentPerSpike;
|
rmeddis@38
|
291 MSOspikeToCurrentTau=1/(2*pi*MSOdendriteLPfreq);
|
rmeddis@38
|
292 t=dtSpikes:dtSpikes:5*MSOspikeToCurrentTau;
|
rmeddis@38
|
293 MSO_CNalphaFunction= (MSOcurrentPerSpike / ...
|
rmeddis@38
|
294 MSOspikeToCurrentTau)*t.*exp(-t / MSOspikeToCurrentTau);
|
rmeddis@38
|
295 % show alpha function
|
rmeddis@38
|
296 % figure(84), subplot(4,2,2), plot(t,MSO_CNalphaFunction)
|
rmeddis@38
|
297 % title(['LP cutoff ' num2str(MSOdendriteLPfreq)])
|
rmeddis@38
|
298
|
rmeddis@38
|
299 % convert CN spikes to post-dendritic current
|
rmeddis@38
|
300 CN_spikes=CNoutputLeft+CNoutputRight;
|
rmeddis@38
|
301 for i=1:nMSOcells
|
rmeddis@38
|
302 x= conv2(CN_spikes(i,:), MSO_CNalphaFunction);
|
rmeddis@38
|
303 inputCurrent(i,:)=x(1:nEpochs);
|
rmeddis@38
|
304 end
|
rmeddis@38
|
305
|
rmeddis@38
|
306 if MSO_c==0
|
rmeddis@38
|
307 % faster computation when threshold is stable (c==0)
|
rmeddis@38
|
308 for t=1:nEpochs
|
rmeddis@38
|
309 s=MSO_E>MSO_Th0;
|
rmeddis@38
|
310 dE = (-MSO_E/MSO_tauM + inputCurrent(:,t)/MSO_cap +...
|
rmeddis@38
|
311 (MSO_Gk/MSO_cap).*(MSO_Ek-MSO_E))*dtSpikes;
|
rmeddis@38
|
312 dGk=-MSO_Gk*dtSpikes/MSO_tauGk +MSO_b*s;
|
rmeddis@38
|
313 MSO_E=MSO_E+dE;
|
rmeddis@38
|
314 MSO_Gk=MSO_Gk+dGk;
|
rmeddis@38
|
315 MSOmembranePotential(:,t)=MSO_E+s.*(MSO_Eb-MSO_E)+MSO_Er;
|
rmeddis@38
|
316 end
|
rmeddis@38
|
317 else
|
rmeddis@38
|
318 % threshold is changing (MSO_c>0; e.g. bushy cell)
|
rmeddis@38
|
319 for t=1:nEpochs
|
rmeddis@38
|
320 dE = (-MSO_E/MSO_tauM + ...
|
rmeddis@38
|
321 inputCurrent(:,t)/MSO_cap + (MSO_Gk/MSO_cap)...
|
rmeddis@38
|
322 .*(MSO_Ek-MSO_E))*dtSpikes;
|
rmeddis@38
|
323 MSO_E=MSO_E+dE;
|
rmeddis@38
|
324 s=MSO_E>MSO_Th;
|
rmeddis@38
|
325 MSOmembranePotential(:,t)=MSO_E+s.*(MSO_Eb-MSO_E)+MSO_Er;
|
rmeddis@38
|
326 dGk=-MSO_Gk*dtSpikes/MSO_tauGk +MSO_b*s;
|
rmeddis@38
|
327 MSO_Gk=MSO_Gk+dGk;
|
rmeddis@38
|
328
|
rmeddis@38
|
329 % After a spike, the threshold is raised
|
rmeddis@38
|
330 % otherwise it settles to its baseline
|
rmeddis@38
|
331 dTh=-(MSO_Th-MSO_Th0)*dtSpikes/MSO_tauTh +s*MSO_c;
|
rmeddis@38
|
332 MSO_Th=MSO_Th+dTh;
|
rmeddis@38
|
333 end
|
rmeddis@38
|
334 end
|
rmeddis@38
|
335
|
rmeddis@38
|
336 figure(98),subplot(4,1,3)
|
rmeddis@38
|
337 hold off, imagesc(MSOmembranePotential)
|
rmeddis@38
|
338 title ('MSO (V)')
|
rmeddis@38
|
339
|
rmeddis@38
|
340 MSOspikes=MSOmembranePotential> -0.01;
|
rmeddis@38
|
341 % Remove any spike that is immediately followed by a spike
|
rmeddis@38
|
342 % NB 'find' works on columns (whence the transposing)
|
rmeddis@38
|
343 MSOspikes=MSOspikes';
|
rmeddis@38
|
344 idx=find(MSOspikes);
|
rmeddis@38
|
345 idx=idx(1:end-1);
|
rmeddis@38
|
346 MSOspikes(idx+1)=0;
|
rmeddis@38
|
347 MSOspikes=MSOspikes';
|
rmeddis@38
|
348
|
rmeddis@38
|
349
|
rmeddis@38
|
350 function ICMSOspikes=ICchopper(ICMSOspikes, dtSpikes, ICMSOParams)
|
rmeddis@38
|
351 %%
|
rmeddis@38
|
352 ICMSOspikes=sum(ICMSOspikes);
|
rmeddis@38
|
353 [nICMSOcells nEpochs]=size(ICMSOspikes);
|
rmeddis@38
|
354 inputCurrent=zeros(nICMSOcells, nEpochs);
|
rmeddis@38
|
355 ICMSOmembranePotential=inputCurrent;
|
rmeddis@38
|
356
|
rmeddis@38
|
357 ICMSO_tauM=ICMSOParams.tauM;
|
rmeddis@38
|
358 ICMSO_tauGk=ICMSOParams.tauGk;
|
rmeddis@38
|
359 ICMSO_tauTh=ICMSOParams.tauTh;
|
rmeddis@38
|
360 ICMSO_cap=ICMSOParams.Cap;
|
rmeddis@38
|
361 ICMSO_c=ICMSOParams.c;
|
rmeddis@38
|
362 ICMSO_b=ICMSOParams.dGkSpike;
|
rmeddis@38
|
363 ICMSO_Th0=ICMSOParams.Th0;
|
rmeddis@38
|
364 ICMSO_Ek=ICMSOParams.Ek;
|
rmeddis@38
|
365 ICMSO_Eb= ICMSOParams.Eb;
|
rmeddis@38
|
366 ICMSO_Er=ICMSOParams.Er;
|
rmeddis@38
|
367
|
rmeddis@38
|
368 ICMSO_E=zeros(nICMSOcells,1);
|
rmeddis@38
|
369 ICMSO_Gk=zeros(nICMSOcells,1);
|
rmeddis@38
|
370 ICMSO_Th=ICMSO_Th0*ones(nICMSOcells,1);
|
rmeddis@38
|
371
|
rmeddis@38
|
372 % Dendritic filtering, all spikes are replaced by CNalphaFunction functions
|
rmeddis@38
|
373 ICMSOdendriteLPfreq= ICMSOParams.dendriteLPfreq;
|
rmeddis@38
|
374 ICMSOcurrentPerSpike=ICMSOParams.currentPerSpike;
|
rmeddis@38
|
375 ICMSOspikeToCurrentTau=1/(2*pi*ICMSOdendriteLPfreq);
|
rmeddis@38
|
376 t=dtSpikes:dtSpikes:5*ICMSOspikeToCurrentTau;
|
rmeddis@38
|
377 ICMSOalphaFunction= (ICMSOcurrentPerSpike / ...
|
rmeddis@38
|
378 ICMSOspikeToCurrentTau)*t.*exp(-t / ICMSOspikeToCurrentTau);
|
rmeddis@38
|
379 % show alpha function
|
rmeddis@38
|
380 % figure(84), subplot(4,2,5), plot(t,ICMSOalphaFunction)
|
rmeddis@38
|
381 % title(['IC MSO LP cutoff ' num2str(ICMSOdendriteLPfreq)])
|
rmeddis@38
|
382
|
rmeddis@38
|
383 % post-dendritic current
|
rmeddis@38
|
384 for i=1:nICMSOcells
|
rmeddis@38
|
385 x= conv2(1*ICMSOspikes(i,:), ICMSOalphaFunction);
|
rmeddis@38
|
386 inputCurrent(i,:)=x(1:nEpochs);
|
rmeddis@38
|
387 end
|
rmeddis@38
|
388
|
rmeddis@38
|
389 if ICMSO_c==0
|
rmeddis@38
|
390 % faster computation when threshold is stable (c==0)
|
rmeddis@38
|
391 for t=1:nEpochs
|
rmeddis@38
|
392 s=ICMSO_E>ICMSO_Th0;
|
rmeddis@38
|
393 dE = (-ICMSO_E/ICMSO_tauM + inputCurrent(:,t)/ICMSO_cap +...
|
rmeddis@38
|
394 (ICMSO_Gk/ICMSO_cap).*(ICMSO_Ek-ICMSO_E))*dtSpikes;
|
rmeddis@38
|
395 dGk=-ICMSO_Gk*dtSpikes/ICMSO_tauGk +ICMSO_b*s;
|
rmeddis@38
|
396 ICMSO_E=ICMSO_E+dE;
|
rmeddis@38
|
397 ICMSO_Gk=ICMSO_Gk+dGk;
|
rmeddis@38
|
398 ICMSOmembranePotential(:,t)=ICMSO_E+s.*(ICMSO_Eb-ICMSO_E)+ICMSO_Er;
|
rmeddis@38
|
399 end
|
rmeddis@38
|
400 else
|
rmeddis@38
|
401 % threshold is changing (ICMSO_c>0; e.g. bushy cell)
|
rmeddis@38
|
402 for t=1:nEpochs
|
rmeddis@38
|
403 dE = (-ICMSO_E/ICMSO_tauM + ...
|
rmeddis@38
|
404 inputCurrent(:,t)/ICMSO_cap + (ICMSO_Gk/ICMSO_cap)...
|
rmeddis@38
|
405 .*(ICMSO_Ek-ICMSO_E))*dtSpikes;
|
rmeddis@38
|
406 ICMSO_E=ICMSO_E+dE;
|
rmeddis@38
|
407 s=ICMSO_E>ICMSO_Th;
|
rmeddis@38
|
408 ICMSOmembranePotential(:,t)=ICMSO_E+s.*(ICMSO_Eb-ICMSO_E)+ICMSO_Er;
|
rmeddis@38
|
409 dGk=-ICMSO_Gk*dtSpikes/ICMSO_tauGk +ICMSO_b*s;
|
rmeddis@38
|
410 ICMSO_Gk=ICMSO_Gk+dGk;
|
rmeddis@38
|
411
|
rmeddis@38
|
412 % After a spike, the threshold is raised
|
rmeddis@38
|
413 % otherwise it settles to its baseline
|
rmeddis@38
|
414 dTh=-(ICMSO_Th-ICMSO_Th0)*dtSpikes/ICMSO_tauTh +s*ICMSO_c;
|
rmeddis@38
|
415 ICMSO_Th=ICMSO_Th+dTh;
|
rmeddis@38
|
416 end
|
rmeddis@38
|
417 end
|
rmeddis@38
|
418
|
rmeddis@38
|
419 t=dtSpikes:dtSpikes:dtSpikes*length(ICMSOmembranePotential);
|
rmeddis@38
|
420 figure(98),subplot(4,2,7)
|
rmeddis@38
|
421 plot(t, ICMSOmembranePotential)
|
rmeddis@38
|
422 ylim([-0.07 0]), xlim([0 max(t)])
|
rmeddis@38
|
423 title('IC (V)')
|
rmeddis@38
|
424
|
rmeddis@38
|
425 ICMSOspikes=ICMSOmembranePotential> -0.01;
|
rmeddis@38
|
426 % now remove any spike that is immediately followed by a spike
|
rmeddis@38
|
427 % NB 'find' works on columns (whence the transposing)
|
rmeddis@38
|
428 ICMSOspikes=ICMSOspikes';
|
rmeddis@38
|
429 idx=find(ICMSOspikes);
|
rmeddis@38
|
430 idx=idx(1:end-1);
|
rmeddis@38
|
431 ICMSOspikes(idx+1)=0;
|
rmeddis@38
|
432 ICMSOspikes=ICMSOspikes';
|
rmeddis@38
|
433
|