rmeddis@34
|
1 function testANprob(targetFrequency,BFlist, levels, ...
|
rmeddis@29
|
2 paramsName, paramChanges)
|
rmeddis@38
|
3 % testANprob generates rate/level functions for AN and brainstem units.
|
rmeddis@38
|
4 % also other information like PSTHs, MOC efferent activity levels.
|
rmeddis@38
|
5 % A 'probability' model is used.
|
rmeddis@38
|
6 % e.g.
|
rmeddis@34
|
7 % testANprob(1000,1000, -10:10:80, 'Normal')
|
rmeddis@34
|
8
|
rmeddis@29
|
9 global IHC_VResp_VivoParams IHC_cilia_RPParams IHCpreSynapseParams
|
rmeddis@29
|
10 global AN_IHCsynapseParams
|
rmeddis@32
|
11 global ANprobRateOutput dt ANtauCas
|
rmeddis@29
|
12 global ARattenuation MOCattenuation
|
rmeddis@29
|
13
|
rmeddis@29
|
14 AN_spikesOrProbability='probability';
|
rmeddis@29
|
15
|
rmeddis@29
|
16 dbstop if error
|
rmeddis@29
|
17 addpath (['..' filesep 'MAP'], ['..' filesep 'utilities'], ...
|
rmeddis@29
|
18 ['..' filesep 'parameterStore'], ['..' filesep 'wavFileStore'],...
|
rmeddis@29
|
19 ['..' filesep 'testPrograms'])
|
rmeddis@29
|
20
|
rmeddis@35
|
21 if nargin<5, paramChanges=[]; end
|
rmeddis@35
|
22 if nargin<4, paramsName='Normal'; end
|
rmeddis@35
|
23 if nargin<3, levels=-10:10:80; end
|
rmeddis@35
|
24 if nargin==0, targetFrequency=1000; BFlist=1000; end
|
rmeddis@29
|
25
|
rmeddis@29
|
26 nLevels=length(levels);
|
rmeddis@29
|
27
|
rmeddis@29
|
28 toneDuration=.2;
|
rmeddis@29
|
29 rampDuration=0.002;
|
rmeddis@29
|
30 silenceDuration=.02;
|
rmeddis@29
|
31 localPSTHbinwidth=0.001;
|
rmeddis@29
|
32
|
rmeddis@29
|
33 % Use only the first frequency in the GUI targetFrequency box to defineBF
|
rmeddis@29
|
34 % targetFrequency=stimulusParameters.targetFrequency(1);
|
rmeddis@29
|
35 % BFlist=targetFrequency;
|
rmeddis@29
|
36
|
rmeddis@29
|
37 AN_HSRonset=zeros(nLevels,1);
|
rmeddis@29
|
38 AN_HSRsaturated=zeros(nLevels,1);
|
rmeddis@29
|
39 AN_LSRonset=zeros(nLevels,1);
|
rmeddis@29
|
40 AN_LSRsaturated=zeros(nLevels,1);
|
rmeddis@29
|
41
|
rmeddis@29
|
42 AR=zeros(nLevels,1);
|
rmeddis@29
|
43 MOC=zeros(nLevels,1);
|
rmeddis@29
|
44
|
rmeddis@29
|
45 figure(15), clf
|
rmeddis@34
|
46 set(gcf,'position',[980 356 401 321])
|
rmeddis@29
|
47 drawnow
|
rmeddis@29
|
48
|
rmeddis@29
|
49 %% guarantee that the sample rate is at least 10 times the frequency
|
rmeddis@29
|
50 sampleRate=50000;
|
rmeddis@29
|
51 while sampleRate< 10* targetFrequency
|
rmeddis@29
|
52 sampleRate=sampleRate+10000;
|
rmeddis@29
|
53 end
|
rmeddis@29
|
54
|
rmeddis@29
|
55 %% adjust sample rate so that the pure tone stimulus has an integer
|
rmeddis@29
|
56 %% numver of epochs in a period
|
rmeddis@29
|
57 dt=1/sampleRate;
|
rmeddis@29
|
58 period=1/targetFrequency;
|
rmeddis@29
|
59
|
rmeddis@29
|
60 %% main computational loop (vary level)
|
rmeddis@29
|
61 levelNo=0;
|
rmeddis@29
|
62 for leveldB=levels
|
rmeddis@29
|
63 levelNo=levelNo+1;
|
rmeddis@29
|
64
|
rmeddis@29
|
65 fprintf('%4.0f\t', leveldB)
|
rmeddis@29
|
66 amp=28e-6*10^(leveldB/20);
|
rmeddis@29
|
67
|
rmeddis@29
|
68 time=dt:dt:toneDuration;
|
rmeddis@29
|
69 rampTime=dt:dt:rampDuration;
|
rmeddis@29
|
70 ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi)) ...
|
rmeddis@29
|
71 ones(1,length(time)-length(rampTime))];
|
rmeddis@29
|
72 ramp=ramp.*fliplr(ramp);
|
rmeddis@29
|
73
|
rmeddis@29
|
74 silence=zeros(1,round(silenceDuration/dt));
|
rmeddis@29
|
75
|
rmeddis@29
|
76 % create signal (leveldB/ targetFrequency)
|
rmeddis@29
|
77 inputSignal=amp*sin(2*pi*targetFrequency'*time);
|
rmeddis@29
|
78 inputSignal= ramp.*inputSignal;
|
rmeddis@29
|
79 inputSignal=[silence inputSignal];
|
rmeddis@29
|
80
|
rmeddis@29
|
81 %% run the model
|
rmeddis@29
|
82 showPlotsAndDetails=0;
|
rmeddis@29
|
83
|
rmeddis@29
|
84
|
rmeddis@29
|
85 MAP1_14(inputSignal, 1/dt, BFlist, ...
|
rmeddis@29
|
86 paramsName, AN_spikesOrProbability, paramChanges);
|
rmeddis@29
|
87
|
rmeddis@32
|
88 nTaus=length(ANtauCas);
|
rmeddis@29
|
89
|
rmeddis@29
|
90 %LSR (same as HSR if no LSR fibers present)
|
rmeddis@29
|
91 [nANFibers nTimePoints]=size(ANprobRateOutput);
|
rmeddis@29
|
92
|
rmeddis@29
|
93 numLSRfibers=1;
|
rmeddis@29
|
94 numHSRfibers=numLSRfibers;
|
rmeddis@29
|
95
|
rmeddis@29
|
96 LSRspikes=ANprobRateOutput(1:numLSRfibers,:);
|
rmeddis@29
|
97 PSTH=UTIL_PSTHmaker(LSRspikes, dt, localPSTHbinwidth);
|
rmeddis@29
|
98 PSTHLSR=PSTH/(localPSTHbinwidth/dt); % across fibers rates
|
rmeddis@29
|
99 PSTHtime=localPSTHbinwidth:localPSTHbinwidth:...
|
rmeddis@29
|
100 localPSTHbinwidth*length(PSTH);
|
rmeddis@29
|
101 AN_LSRonset(levelNo)= max(PSTHLSR); % peak in 5 ms window
|
rmeddis@29
|
102 AN_LSRsaturated(levelNo)= mean(PSTHLSR(round(length(PSTH)/2):end));
|
rmeddis@29
|
103
|
rmeddis@29
|
104 % HSR
|
rmeddis@29
|
105 HSRspikes= ANprobRateOutput(end- numHSRfibers+1:end, :);
|
rmeddis@29
|
106 PSTH=UTIL_PSTHmaker(HSRspikes, dt, localPSTHbinwidth);
|
rmeddis@29
|
107 PSTH=PSTH/(localPSTHbinwidth/dt); % sum across fibers (HSR only)
|
rmeddis@29
|
108 AN_HSRonset(levelNo)= max(PSTH);
|
rmeddis@29
|
109 AN_HSRsaturated(levelNo)= mean(PSTH(round(length(PSTH)/2): end));
|
rmeddis@29
|
110
|
rmeddis@29
|
111 figure(15), subplot(2,2,4)
|
rmeddis@35
|
112 hold off, bar(PSTHtime,PSTH, 'k')
|
rmeddis@29
|
113 hold on, bar(PSTHtime,PSTHLSR,'r')
|
rmeddis@29
|
114 ylim([0 1000])
|
rmeddis@29
|
115 xlim([0 length(PSTH)*localPSTHbinwidth])
|
rmeddis@29
|
116 set(gcf,'name',[num2str(BFlist), ' Hz: ' num2str(leveldB) ' dB']);
|
rmeddis@29
|
117
|
rmeddis@29
|
118 AR(levelNo)=min(ARattenuation);
|
rmeddis@29
|
119 MOC(levelNo)=min(MOCattenuation(length(MOCattenuation)/2:end));
|
rmeddis@29
|
120
|
rmeddis@29
|
121
|
rmeddis@29
|
122 figure(15), subplot(2,2,3)
|
rmeddis@34
|
123 plot(20*log10(MOC), 'k'), hold on
|
rmeddis@34
|
124 plot(20*log10(AR), 'r'), hold off
|
rmeddis@34
|
125 title(' MOC/AR'), ylabel('dB attenuation')
|
rmeddis@29
|
126 ylim([-30 0])
|
rmeddis@29
|
127
|
rmeddis@34
|
128 end % level
|
rmeddis@29
|
129
|
rmeddis@29
|
130 figure(15), subplot(2,2,3)
|
rmeddis@34
|
131 plot(levels,20*log10(MOC), 'k'), hold on
|
rmeddis@34
|
132 plot(levels,20*log10(AR), 'r'), hold off
|
rmeddis@34
|
133 title(' MOC/AR'), ylabel('dB attenuation')
|
rmeddis@29
|
134 ylim([-30 0])
|
rmeddis@29
|
135 xlim([0 max(levels)])
|
rmeddis@29
|
136
|
rmeddis@29
|
137 fprintf('\n')
|
rmeddis@29
|
138 toneDuration=2;
|
rmeddis@29
|
139 rampDuration=0.004;
|
rmeddis@29
|
140 silenceDuration=.02;
|
rmeddis@29
|
141 nRepeats=200; % no. of AN fibers
|
rmeddis@29
|
142 fprintf('toneDuration %6.3f\n', toneDuration)
|
rmeddis@29
|
143 fprintf(' %6.0f AN fibers (repeats)\n', nRepeats)
|
rmeddis@29
|
144 fprintf('levels')
|
rmeddis@29
|
145 fprintf('%6.2f\t', levels)
|
rmeddis@29
|
146 fprintf('\n')
|
rmeddis@29
|
147
|
rmeddis@29
|
148
|
rmeddis@29
|
149 % ---------------------------------------------------- display parameters
|
rmeddis@29
|
150
|
rmeddis@29
|
151
|
rmeddis@29
|
152 nRows=2; nCols=2;
|
rmeddis@29
|
153
|
rmeddis@29
|
154 % AN rate - level ONSET functions
|
rmeddis@29
|
155 subplot(nRows,nCols,1)
|
rmeddis@29
|
156 plot(levels,AN_LSRonset,'ro'), hold on
|
rmeddis@38
|
157 plot(levels,AN_HSRonset,'ko', 'MarkerEdgeColor','k', 'markerFaceColor','k'), hold off
|
rmeddis@29
|
158 ylim([0 1000]), xlim([min(levels) max(levels)])
|
rmeddis@29
|
159 ttl=['tauCa= ' num2str(IHCpreSynapseParams.tauCa)];
|
rmeddis@29
|
160 title( ttl)
|
rmeddis@29
|
161 xlabel('level dB SPL'), ylabel('peak rate (sp/s)'), grid on
|
rmeddis@34
|
162 text(0, 800, 'AN onset', 'fontsize', 14)
|
rmeddis@29
|
163
|
rmeddis@29
|
164 % AN rate - level ADAPTED function
|
rmeddis@29
|
165 subplot(nRows,nCols,2)
|
rmeddis@29
|
166 plot(levels,AN_LSRsaturated, 'ro'), hold on
|
rmeddis@38
|
167 plot(levels,AN_HSRsaturated, 'ko', 'MarkerEdgeColor','k', 'markerFaceColor','k'), hold off
|
rmeddis@35
|
168 maxYlim=340;
|
rmeddis@35
|
169 ylim([0 maxYlim])
|
rmeddis@29
|
170 set(gca,'ytick',0:50:300)
|
rmeddis@29
|
171 xlim([min(levels) max(levels)])
|
rmeddis@29
|
172 set(gca,'xtick',[levels(1):20:levels(end)])
|
rmeddis@29
|
173 % grid on
|
rmeddis@29
|
174 ttl=[ 'spont=' num2str(mean(AN_HSRsaturated(1,:)),'%4.0f')...
|
rmeddis@29
|
175 ' sat=' num2str(mean(AN_HSRsaturated(end,1)),'%4.0f')];
|
rmeddis@29
|
176 title( ttl)
|
rmeddis@29
|
177 xlabel('level dB SPL'), ylabel ('adapted rate (sp/s)')
|
rmeddis@35
|
178 text(0, maxYlim-50, 'AN adapted', 'fontsize', 14), grid on
|
rmeddis@29
|
179
|
rmeddis@29
|
180 allData=[ levels' AN_HSRonset AN_HSRsaturated...
|
rmeddis@29
|
181 AN_LSRonset AN_LSRsaturated ];
|
rmeddis@29
|
182 fprintf('\n levels \tANHSR Onset \tANHSR adapted\tANLSR Onset \tANLSR adapted\tCNHSR\tCNLSR\tICHSR \tICLSR \n');
|
rmeddis@29
|
183 UTIL_printTabTable(round(allData))
|
rmeddis@29
|
184
|
rmeddis@29
|
185
|
rmeddis@29
|
186 UTIL_showStruct(IHC_cilia_RPParams, 'IHC_cilia_RPParams')
|
rmeddis@29
|
187 UTIL_showStruct(IHCpreSynapseParams, 'IHCpreSynapseParams')
|
rmeddis@29
|
188 UTIL_showStruct(AN_IHCsynapseParams, 'AN_IHCsynapseParams')
|
rmeddis@29
|
189
|
rmeddis@29
|
190
|
rmeddis@29
|
191 allData=[ levels' AN_HSRonset AN_HSRsaturated...
|
rmeddis@29
|
192 AN_LSRonset AN_LSRsaturated ];
|
rmeddis@29
|
193 fprintf('\n levels \tANHSR Onset \tANHSR adapted\tANLSR Onset \tANLSR adapted\tCNHSR\tCNLSR\tICHSR \tICLSR \n');
|
rmeddis@29
|
194 UTIL_printTabTable(round(allData))
|
rmeddis@29
|
195
|