annotate testPrograms/testAN.m @ 34:e097e9044ef6

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