annotate userProgramsMathiasDietz/test_binaural.m @ 38:c2204b18f4a2 tip

End nov big change
author Ray Meddis <rmeddis@essex.ac.uk>
date Mon, 28 Nov 2011 13:34:28 +0000
parents
children
rev   line source
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