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