rmeddis@9
|
1 function vectorStrength=testAN(targetFrequency,BFlist, levels)
|
rmeddis@0
|
2 % testIHC used either for IHC I/O function ...
|
rmeddis@0
|
3 % or receptive field (doReceptiveFields=1)
|
rmeddis@0
|
4
|
rmeddis@0
|
5 global experiment method stimulusParameters
|
rmeddis@9
|
6 global IHC_VResp_VivoParams IHC_cilia_RPParams IHCpreSynapseParams
|
rmeddis@0
|
7 global AN_IHCsynapseParams
|
rmeddis@0
|
8 % global saveMembranePotential MacGregorMultiParams
|
rmeddis@0
|
9 dbstop if error
|
rmeddis@0
|
10
|
rmeddis@0
|
11 addpath (['..' filesep 'MAP'], ['..' filesep 'utilities'], ...
|
rmeddis@0
|
12 ['..' filesep 'parameterStore'], ['..' filesep 'wavFileStore'],...
|
rmeddis@0
|
13 ['..' filesep 'testPrograms'])
|
rmeddis@0
|
14
|
rmeddis@9
|
15 if nargin<3
|
rmeddis@9
|
16 levels=-10:10:80;
|
rmeddis@9
|
17 % levels=80:10:90;
|
rmeddis@9
|
18 end
|
rmeddis@9
|
19
|
rmeddis@0
|
20 nLevels=length(levels);
|
rmeddis@0
|
21
|
rmeddis@0
|
22 toneDuration=.2;
|
rmeddis@0
|
23 rampDuration=0.002;
|
rmeddis@0
|
24 silenceDuration=.02;
|
rmeddis@0
|
25 localPSTHbinwidth=0.001;
|
rmeddis@0
|
26
|
rmeddis@0
|
27 % Use only the first frequency in the GUI targetFrequency box to defineBF
|
rmeddis@9
|
28 % targetFrequency=stimulusParameters.targetFrequency(1);
|
rmeddis@9
|
29 % BFlist=targetFrequency;
|
rmeddis@0
|
30
|
rmeddis@0
|
31 AN_HSRonset=zeros(nLevels,1);
|
rmeddis@0
|
32 AN_HSRsaturated=zeros(nLevels,1);
|
rmeddis@0
|
33 AN_LSRonset=zeros(nLevels,1);
|
rmeddis@0
|
34 AN_LSRsaturated=zeros(nLevels,1);
|
rmeddis@0
|
35 CNLSRrate=zeros(nLevels,1);
|
rmeddis@0
|
36 CNHSRsaturated=zeros(nLevels,1);
|
rmeddis@0
|
37 ICHSRsaturated=zeros(nLevels,1);
|
rmeddis@0
|
38 ICLSRsaturated=zeros(nLevels,1);
|
rmeddis@0
|
39 vectorStrength=zeros(nLevels,1);
|
rmeddis@0
|
40
|
rmeddis@0
|
41 AR=zeros(nLevels,1);
|
rmeddis@0
|
42 MOC=zeros(nLevels,1);
|
rmeddis@0
|
43
|
rmeddis@0
|
44 % ANoutput=zeros(200,200);
|
rmeddis@0
|
45
|
rmeddis@0
|
46 figure(15), clf
|
rmeddis@0
|
47 set(gcf,'position',[980 356 401 321])
|
rmeddis@0
|
48 figure(5), clf
|
rmeddis@9
|
49 set(gcf,'position', [980 34 400 295])
|
rmeddis@9
|
50 set(gcf,'name',[num2str(BFlist), ' Hz']);
|
rmeddis@0
|
51 drawnow
|
rmeddis@0
|
52
|
rmeddis@0
|
53 levelNo=0;
|
rmeddis@0
|
54 for leveldB=levels
|
rmeddis@0
|
55 levelNo=levelNo+1;
|
rmeddis@0
|
56
|
rmeddis@9
|
57 %% sample rate should be amultiple of the targetFrequency for PSTH below
|
rmeddis@0
|
58 sampleRate=50000;
|
rmeddis@9
|
59 sampleRate=20*targetFrequency;
|
rmeddis@9
|
60 if sampleRate<20000
|
rmeddis@9
|
61 sampleRate=round(40000/targetFrequency)*targetFrequency;
|
rmeddis@9
|
62 end
|
rmeddis@9
|
63
|
rmeddis@9
|
64
|
rmeddis@9
|
65 %% ananana
|
rmeddis@0
|
66 dt=1/sampleRate;
|
rmeddis@0
|
67 period=1/targetFrequency;
|
rmeddis@0
|
68 dt=dt*(dt/period)*round(period/dt);
|
rmeddis@0
|
69
|
rmeddis@0
|
70 fprintf('%4.0f\t', leveldB)
|
rmeddis@0
|
71 amp=28e-6*10^(leveldB/20);
|
rmeddis@0
|
72
|
rmeddis@0
|
73 time=dt:dt:toneDuration;
|
rmeddis@0
|
74 rampTime=dt:dt:rampDuration;
|
rmeddis@0
|
75 ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi)) ...
|
rmeddis@0
|
76 ones(1,length(time)-length(rampTime))];
|
rmeddis@0
|
77 ramp=ramp.*fliplr(ramp);
|
rmeddis@0
|
78
|
rmeddis@0
|
79 silence=zeros(1,round(silenceDuration/dt));
|
rmeddis@0
|
80
|
rmeddis@0
|
81 % create signal (leveldB/ targetFrequency)
|
rmeddis@0
|
82 inputSignal=amp*sin(2*pi*targetFrequency'*time);
|
rmeddis@0
|
83 inputSignal= ramp.*inputSignal;
|
rmeddis@0
|
84 inputSignal=[silence inputSignal];
|
rmeddis@0
|
85
|
rmeddis@0
|
86 %% run the model
|
rmeddis@0
|
87 AN_spikesOrProbability='spikes';
|
rmeddis@0
|
88 MAPparamsName=experiment.name;
|
rmeddis@0
|
89 showPlotsAndDetails=0;
|
rmeddis@0
|
90
|
rmeddis@0
|
91 global ANoutput CNoutput ICoutput ICmembraneOutput tauCas
|
rmeddis@0
|
92 global ARattenuation MOCattenuation
|
rmeddis@9
|
93
|
rmeddis@9
|
94 MAP1_14(inputSignal, 1/dt, BFlist, ...
|
rmeddis@0
|
95 MAPparamsName, AN_spikesOrProbability);
|
rmeddis@0
|
96
|
rmeddis@0
|
97 nTaus=length(tauCas);
|
rmeddis@0
|
98
|
rmeddis@0
|
99 %LSR (same as HSR if no LSR fibers present)
|
rmeddis@0
|
100 [nANFibers nTimePoints]=size(ANoutput);
|
rmeddis@0
|
101 dt=dt* length(inputSignal)/nTimePoints;
|
rmeddis@0
|
102
|
rmeddis@0
|
103 numLSRfibers=nANFibers/nTaus;
|
rmeddis@0
|
104 numHSRfibers=numLSRfibers;
|
rmeddis@0
|
105
|
rmeddis@0
|
106 LSRspikes=ANoutput(1:numLSRfibers,:);
|
rmeddis@0
|
107 PSTH=UTIL_makePSTH(LSRspikes, dt, localPSTHbinwidth);
|
rmeddis@0
|
108 PSTHLSR=mean(PSTH,1)/localPSTHbinwidth; % across fibers rates
|
rmeddis@0
|
109 PSTHtime=localPSTHbinwidth:localPSTHbinwidth:...
|
rmeddis@0
|
110 localPSTHbinwidth*length(PSTH);
|
rmeddis@0
|
111 AN_LSRonset(levelNo)= max(PSTHLSR); % peak in 5 ms window
|
rmeddis@0
|
112 AN_LSRsaturated(levelNo)= mean(PSTHLSR(round(length(PSTH)/2):end));
|
rmeddis@0
|
113
|
rmeddis@0
|
114 % HSR
|
rmeddis@0
|
115 HSRspikes= ANoutput(end- numHSRfibers+1:end, :);
|
rmeddis@0
|
116 PSTH=UTIL_makePSTH(HSRspikes, dt, localPSTHbinwidth);
|
rmeddis@0
|
117 PSTH=mean(PSTH,1)/localPSTHbinwidth; % sum across fibers (HSR only)
|
rmeddis@0
|
118 AN_HSRonset(levelNo)= max(PSTH);
|
rmeddis@0
|
119 AN_HSRsaturated(levelNo)= mean(PSTH(round(length(PSTH)/2): end));
|
rmeddis@0
|
120
|
rmeddis@0
|
121 figure(5), subplot(2,2,2)
|
rmeddis@0
|
122 hold off, bar(PSTHtime,PSTH, 'b')
|
rmeddis@0
|
123 hold on, bar(PSTHtime,PSTHLSR,'r')
|
rmeddis@0
|
124 ylim([0 1000])
|
rmeddis@9
|
125 xlim([0 length(PSTH)*localPSTHbinwidth])
|
rmeddis@9
|
126
|
rmeddis@0
|
127 % AN - CV
|
rmeddis@0
|
128 % CV is computed 5 times. Use the middle one (3) as most typical
|
rmeddis@0
|
129 cvANHSR= UTIL_CV(HSRspikes, dt);
|
rmeddis@0
|
130
|
rmeddis@0
|
131 % AN - vector strength
|
rmeddis@0
|
132 PSTH=sum(HSRspikes);
|
rmeddis@0
|
133 [PH, binTimes]=UTIL_periodHistogram...
|
rmeddis@0
|
134 (PSTH, dt, targetFrequency);
|
rmeddis@0
|
135 VS=UTIL_vectorStrength(PH);
|
rmeddis@0
|
136 vectorStrength(levelNo)=VS;
|
rmeddis@0
|
137 disp(['sat rate= ' num2str(AN_HSRsaturated(levelNo)) ...
|
rmeddis@0
|
138 '; phase-locking VS = ' num2str(VS)])
|
rmeddis@0
|
139 title(['AN HSR: CV=' num2str(cvANHSR(3),'%5.2f') ...
|
rmeddis@0
|
140 'VS=' num2str(VS,'%5.2f')])
|
rmeddis@0
|
141
|
rmeddis@0
|
142 % CN - first-order neurons
|
rmeddis@0
|
143
|
rmeddis@0
|
144 % CN LSR
|
rmeddis@0
|
145 [nCNneurons c]=size(CNoutput);
|
rmeddis@0
|
146 nLSRneurons=round(nCNneurons/nTaus);
|
rmeddis@0
|
147 CNLSRspikes=CNoutput(1:nLSRneurons,:);
|
rmeddis@0
|
148 PSTH=UTIL_makePSTH(CNLSRspikes, dt, localPSTHbinwidth);
|
rmeddis@0
|
149 PSTH=sum(PSTH)/nLSRneurons;
|
rmeddis@0
|
150 CNLSRrate(levelNo)=mean(PSTH(round(length(PSTH)/2):end))/localPSTHbinwidth;
|
rmeddis@0
|
151
|
rmeddis@0
|
152 %CN HSR
|
rmeddis@0
|
153 MacGregorMultiHSRspikes=...
|
rmeddis@0
|
154 CNoutput(end-nLSRneurons:end,:);
|
rmeddis@0
|
155 PSTH=UTIL_makePSTH(MacGregorMultiHSRspikes, dt, localPSTHbinwidth);
|
rmeddis@0
|
156 PSTH=sum(PSTH)/nLSRneurons;
|
rmeddis@0
|
157 PSTH=mean(PSTH,1)/localPSTHbinwidth; % sum across fibers (HSR only)
|
rmeddis@0
|
158
|
rmeddis@0
|
159 CNHSRsaturated(levelNo)=mean(PSTH(length(PSTH)/2:end));
|
rmeddis@0
|
160
|
rmeddis@0
|
161 figure(5), subplot(2,2,3)
|
rmeddis@0
|
162 bar(PSTHtime,PSTH)
|
rmeddis@0
|
163 ylim([0 1000])
|
rmeddis@0
|
164 xlim([0 length(PSTH)*localPSTHbinwidth])
|
rmeddis@0
|
165 cvMMHSR= UTIL_CV(MacGregorMultiHSRspikes, dt);
|
rmeddis@0
|
166 title(['CN CV= ' num2str(cvMMHSR(3),'%5.2f')])
|
rmeddis@0
|
167
|
rmeddis@0
|
168 % IC LSR
|
rmeddis@0
|
169 [nICneurons c]=size(ICoutput);
|
rmeddis@0
|
170 nLSRneurons=round(nICneurons/nTaus);
|
rmeddis@0
|
171 ICLSRspikes=ICoutput(1:nLSRneurons,:);
|
rmeddis@0
|
172 PSTH=UTIL_makePSTH(ICLSRspikes, dt, localPSTHbinwidth);
|
rmeddis@0
|
173 ICLSRsaturated(levelNo)=mean(PSTH(round(length(PSTH)/2):end))/localPSTHbinwidth;
|
rmeddis@0
|
174
|
rmeddis@0
|
175 %IC HSR
|
rmeddis@0
|
176 MacGregorMultiHSRspikes=...
|
rmeddis@0
|
177 ICoutput(end-nLSRneurons:end,:);
|
rmeddis@0
|
178 PSTH=UTIL_makePSTH(MacGregorMultiHSRspikes, dt, localPSTHbinwidth);
|
rmeddis@0
|
179 PSTH=sum(PSTH)/nLSRneurons;
|
rmeddis@0
|
180 PSTH=mean(PSTH,1)/localPSTHbinwidth; % sum across fibers (HSR only)
|
rmeddis@0
|
181
|
rmeddis@0
|
182 ICHSRsaturated(levelNo)=mean(PSTH(length(PSTH)/2:end));
|
rmeddis@0
|
183
|
rmeddis@0
|
184 AR(levelNo)=min(ARattenuation);
|
rmeddis@0
|
185 MOC(levelNo)=min(MOCattenuation(length(MOCattenuation)/2:end));
|
rmeddis@0
|
186
|
rmeddis@0
|
187 time=dt:dt:dt*size(ICmembraneOutput,2);
|
rmeddis@0
|
188 figure(5), subplot(2,2,4)
|
rmeddis@0
|
189 plot(time,ICmembraneOutput(2, 1:end),'k')
|
rmeddis@0
|
190 ylim([-0.07 0])
|
rmeddis@0
|
191 xlim([0 max(time)])
|
rmeddis@0
|
192 title(['IC ' num2str(leveldB,'%4.0f') 'dB'])
|
rmeddis@0
|
193 drawnow
|
rmeddis@9
|
194
|
rmeddis@0
|
195 figure(5), subplot(2,2,1)
|
rmeddis@0
|
196 plot(20*log10(MOC), 'k'),
|
rmeddis@0
|
197 title(' MOC'), ylabel('dB attenuation')
|
rmeddis@0
|
198 ylim([-30 0])
|
rmeddis@0
|
199
|
rmeddis@0
|
200
|
rmeddis@0
|
201 end % level
|
rmeddis@0
|
202 figure(5), subplot(2,2,1)
|
rmeddis@9
|
203 plot(levels,20*log10(MOC), 'k'),
|
rmeddis@9
|
204 title(' MOC'), ylabel('dB attenuation')
|
rmeddis@9
|
205 ylim([-30 0])
|
rmeddis@0
|
206 xlim([0 max(levels)])
|
rmeddis@0
|
207
|
rmeddis@0
|
208 fprintf('\n')
|
rmeddis@0
|
209 toneDuration=2;
|
rmeddis@0
|
210 rampDuration=0.004;
|
rmeddis@0
|
211 silenceDuration=.02;
|
rmeddis@0
|
212 nRepeats=200; % no. of AN fibers
|
rmeddis@0
|
213 fprintf('toneDuration %6.3f\n', toneDuration)
|
rmeddis@0
|
214 fprintf(' %6.0f AN fibers (repeats)\n', nRepeats)
|
rmeddis@0
|
215 fprintf('levels')
|
rmeddis@0
|
216 fprintf('%6.2f\t', levels)
|
rmeddis@0
|
217 fprintf('\n')
|
rmeddis@0
|
218
|
rmeddis@0
|
219
|
rmeddis@0
|
220 % ---------------------------------------------------- display parameters
|
rmeddis@0
|
221
|
rmeddis@0
|
222 figure(15), clf
|
rmeddis@0
|
223 nRows=2; nCols=2;
|
rmeddis@0
|
224
|
rmeddis@0
|
225 % AN rate - level ONSET functions
|
rmeddis@0
|
226 subplot(nRows,nCols,1)
|
rmeddis@0
|
227 plot(levels,AN_LSRonset,'ro'), hold on
|
rmeddis@0
|
228 plot(levels,AN_HSRonset,'ko'), hold off
|
rmeddis@0
|
229 ylim([0 1000]), xlim([min(levels) max(levels)])
|
rmeddis@0
|
230 ttl=['tauCa= ' num2str(IHCpreSynapseParams.tauCa)];
|
rmeddis@0
|
231 title( ttl)
|
rmeddis@0
|
232 xlabel('level dB SPL'), ylabel('peak rate (sp/s)'), grid on
|
rmeddis@0
|
233 text(0, 800, 'AN onset', 'fontsize', 16)
|
rmeddis@0
|
234
|
rmeddis@0
|
235 % AN rate - level ADAPTED function
|
rmeddis@0
|
236 subplot(nRows,nCols,2)
|
rmeddis@0
|
237 plot(levels,AN_LSRsaturated, 'ro'), hold on
|
rmeddis@0
|
238 plot(levels,AN_HSRsaturated, 'ko'), hold off
|
rmeddis@0
|
239 ylim([0 400])
|
rmeddis@0
|
240 set(gca,'ytick',0:50:300)
|
rmeddis@0
|
241 xlim([min(levels) max(levels)])
|
rmeddis@0
|
242 set(gca,'xtick',[levels(1):20:levels(end)])
|
rmeddis@0
|
243 % grid on
|
rmeddis@0
|
244 ttl=[ 'spont=' num2str(mean(AN_HSRsaturated(1,:)),'%4.0f')...
|
rmeddis@0
|
245 ' sat=' num2str(mean(AN_HSRsaturated(end,1)),'%4.0f')];
|
rmeddis@0
|
246 title( ttl)
|
rmeddis@0
|
247 xlabel('level dB SPL'), ylabel ('adapted rate (sp/s)')
|
rmeddis@0
|
248 text(0, 340, 'AN adapted', 'fontsize', 16), grid on
|
rmeddis@0
|
249
|
rmeddis@0
|
250 % CN rate - level ADAPTED function
|
rmeddis@0
|
251 subplot(nRows,nCols,3)
|
rmeddis@0
|
252 plot(levels,CNLSRrate, 'ro'), hold on
|
rmeddis@0
|
253 plot(levels,CNHSRsaturated, 'ko'), hold off
|
rmeddis@0
|
254 ylim([0 400])
|
rmeddis@0
|
255 set(gca,'ytick',0:50:300)
|
rmeddis@0
|
256 xlim([min(levels) max(levels)])
|
rmeddis@0
|
257 set(gca,'xtick',[levels(1):20:levels(end)])
|
rmeddis@0
|
258 % grid on
|
rmeddis@0
|
259 ttl=[ 'spont=' num2str(mean(CNHSRsaturated(1,:)),'%4.0f') ' sat=' ...
|
rmeddis@0
|
260 num2str(mean(CNHSRsaturated(end,1)),'%4.0f')];
|
rmeddis@0
|
261 title( ttl)
|
rmeddis@0
|
262 xlabel('level dB SPL'), ylabel ('adapted rate (sp/s)')
|
rmeddis@0
|
263 text(0, 350, 'CN', 'fontsize', 16), grid on
|
rmeddis@0
|
264
|
rmeddis@0
|
265 % IC rate - level ADAPTED function
|
rmeddis@0
|
266 subplot(nRows,nCols,4)
|
rmeddis@0
|
267 plot(levels,ICLSRsaturated, 'ro'), hold on
|
rmeddis@0
|
268 plot(levels,ICHSRsaturated, 'ko'), hold off
|
rmeddis@0
|
269 ylim([0 400])
|
rmeddis@0
|
270 set(gca,'ytick',0:50:300)
|
rmeddis@0
|
271 xlim([min(levels) max(levels)])
|
rmeddis@0
|
272 set(gca,'xtick',[levels(1):20:levels(end)]), grid on
|
rmeddis@0
|
273
|
rmeddis@9
|
274
|
rmeddis@0
|
275 ttl=['spont=' num2str(mean(ICHSRsaturated(1,:)),'%4.0f') ...
|
rmeddis@0
|
276 ' sat=' num2str(mean(ICHSRsaturated(end,1)),'%4.0f')];
|
rmeddis@0
|
277 title( ttl)
|
rmeddis@0
|
278 xlabel('level dB SPL'), ylabel ('adapted rate (sp/s)')
|
rmeddis@0
|
279 text(0, 350, 'IC', 'fontsize', 16)
|
rmeddis@0
|
280 set(gcf,'name',' AN CN IC rate/level')
|
rmeddis@0
|
281
|
rmeddis@9
|
282 peakVectorStrength=max(vectorStrength);
|
rmeddis@0
|
283
|
rmeddis@0
|
284 fprintf('\n')
|
rmeddis@0
|
285 disp('levels vectorStrength')
|
rmeddis@0
|
286 fprintf('%3.0f \t %6.4f \n', [levels; vectorStrength'])
|
rmeddis@0
|
287 fprintf('\n')
|
rmeddis@9
|
288 fprintf('Phase locking, max vector strength=\t %6.4f\n\n',...
|
rmeddis@0
|
289 max(vectorStrength))
|
rmeddis@0
|
290
|
rmeddis@0
|
291 allData=[ levels' AN_HSRonset AN_HSRsaturated...
|
rmeddis@0
|
292 AN_LSRonset AN_LSRsaturated ...
|
rmeddis@0
|
293 CNHSRsaturated CNLSRrate...
|
rmeddis@0
|
294 ICHSRsaturated ICLSRsaturated];
|
rmeddis@0
|
295 fprintf('\n levels \tANHSR Onset \tANHSR adapted\tANLSR Onset \tANLSR adapted\tCNHSR\tCNLSR\tICHSR \tICLSR \n');
|
rmeddis@0
|
296 UTIL_printTabTable(round(allData))
|
rmeddis@0
|
297 fprintf('VS (phase locking)= \t%6.4f\n\n',...
|
rmeddis@0
|
298 max(vectorStrength))
|
rmeddis@0
|
299
|
rmeddis@9
|
300 UTIL_showStruct(IHC_cilia_RPParams, 'IHC_cilia_RPParams')
|
rmeddis@9
|
301 UTIL_showStruct(IHCpreSynapseParams, 'IHCpreSynapseParams')
|
rmeddis@9
|
302 UTIL_showStruct(AN_IHCsynapseParams, 'AN_IHCsynapseParams')
|
rmeddis@9
|
303
|
rmeddis@9
|
304 fprintf('\n')
|
rmeddis@9
|
305 disp('levels vectorStrength')
|
rmeddis@9
|
306 fprintf('%3.0f \t %6.4f \n', [levels; vectorStrength'])
|
rmeddis@9
|
307 fprintf('\n')
|
rmeddis@9
|
308 fprintf('Phase locking, max vector strength= \t%6.4f\n\n',...
|
rmeddis@9
|
309 max(vectorStrength))
|
rmeddis@9
|
310
|
rmeddis@9
|
311 allData=[ levels' AN_HSRonset AN_HSRsaturated...
|
rmeddis@9
|
312 AN_LSRonset AN_LSRsaturated ...
|
rmeddis@9
|
313 CNHSRsaturated CNLSRrate...
|
rmeddis@9
|
314 ICHSRsaturated ICLSRsaturated];
|
rmeddis@9
|
315 fprintf('\n levels \tANHSR Onset \tANHSR adapted\tANLSR Onset \tANLSR adapted\tCNHSR\tCNLSR\tICHSR \tICLSR \n');
|
rmeddis@9
|
316 UTIL_printTabTable(round(allData))
|
rmeddis@9
|
317 fprintf('VS (phase locking)= \t%6.4f\n\n',...
|
rmeddis@9
|
318 max(vectorStrength))
|
rmeddis@9
|
319
|