annotate testPrograms/testFM.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 25d53244d5c8
children
rev   line source
rmeddis@32 1 function testFM(BFlist,paramsName, AN_spikesOrProbability,...
rmeddis@32 2 paramChanges)
rmeddis@32 3 % testFM(1000,'Normal','probability', [])
rmeddis@32 4 % testFM(1000,'Normal','spikes', [])
rmeddis@32 5
rmeddis@32 6 % Demonstration is based on Harris and Dallos
rmeddis@29 7 % specify whether you want AN 'probability' or 'spikes'
rmeddis@29 8 % spikes is more realistic but takes longer
rmeddis@29 9 % refractory effect is included only for spikes
rmeddis@29 10 %
rmeddis@29 11
rmeddis@29 12
rmeddis@32 13 global inputStimulusParams outerMiddleEarParams DRNLParams
rmeddis@29 14 global IHC_VResp_VivoParams IHCpreSynapseParams AN_IHCsynapseParams
rmeddis@38 15 global ANprobRateOutput ANoutput ANtauCas dtSpikes
rmeddis@29 16 dbstop if error
rmeddis@29 17 restorePath=path;
rmeddis@29 18 addpath (['..' filesep 'MAP'], ['..' filesep 'utilities'], ...
rmeddis@29 19 ['..' filesep 'parameterStore'], ['..' filesep 'wavFileStore'],...
rmeddis@29 20 ['..' filesep 'testPrograms'])
rmeddis@29 21
rmeddis@35 22 if nargin==0
rmeddis@35 23 BFlist=1000;
rmeddis@35 24 paramsName=('Normal');
rmeddis@35 25 AN_spikesOrProbability='spikes';
rmeddis@29 26 paramChanges=[];
rmeddis@35 27 else
rmeddis@35 28 if nargin<3
rmeddis@38 29 paramChanges=[];
rmeddis@35 30 end
rmeddis@29 31 end
rmeddis@29 32
rmeddis@29 33 % masker and probe levels are relative to this threshold
rmeddis@29 34 thresholdAtCF=10; % dB SPL
rmeddis@33 35 maskerLevels=[-80 10 20 30 40 60 ] + thresholdAtCF;
rmeddis@29 36
rmeddis@32 37 showPSTHs=1;
rmeddis@29 38
rmeddis@29 39 sampleRate=50000;
rmeddis@32 40 dt=1/sampleRate;
rmeddis@29 41
rmeddis@29 42 % fetch BF from GUI: use only the first target frequency
rmeddis@29 43 maskerFrequency=BFlist;
rmeddis@29 44 maskerDuration=.1;
rmeddis@29 45
rmeddis@29 46 targetFrequency=maskerFrequency;
rmeddis@29 47 probeLeveldB=20+thresholdAtCF; % H&D use 20 dB SL/ TMC uses 10 dB SL
rmeddis@29 48 probeDuration=0.015; % HD use 15 ms probe (fig 3).
rmeddis@29 49
rmeddis@29 50 rampDuration=.001; % HD use 1 ms linear ramp
rmeddis@29 51 initialSilenceDuration=0.02;
rmeddis@29 52 finalSilenceDuration=0.05; % useful for showing recovery
rmeddis@29 53
rmeddis@29 54 figure(7), clf
rmeddis@29 55 set(gcf,'position',[613 36 360 247])
rmeddis@29 56 set(gcf,'name', ['forward masking: thresholdAtCF=' num2str(thresholdAtCF)])
rmeddis@29 57
rmeddis@29 58 if showPSTHs
rmeddis@29 59 figure(8), clf
rmeddis@29 60 set(gcf,'name', 'Harris and Dallos simulation')
rmeddis@29 61 set(gcf,'position',[980 36 380 249])
rmeddis@29 62 end
rmeddis@29 63
rmeddis@29 64 % Plot Harris and Dallos result for comparison
rmeddis@32 65 figure(7)
rmeddis@29 66 gapDurations=[0.001 0.002 0.005 0.01 0.02 0.05 0.1 0.3];
rmeddis@29 67 HDmaskerLevels=[+10 +20 +30 +40 +60];
rmeddis@29 68 HDresponse=[
rmeddis@29 69 1 1 1 1 1 1 1 1;
rmeddis@29 70 0.8 0.82 0.81 0.83 0.87 0.95 1 1;
rmeddis@29 71 0.48 0.5 0.54 0.58 0.7 0.85 0.95 1;
rmeddis@29 72 0.3 0.31 0.35 0.4 0.5 0.68 0.82 0.94;
rmeddis@29 73 0.2 0.27 0.27 0.29 0.42 0.64 0.75 0.92;
rmeddis@29 74 0.15 0.17 0.18 0.23 0.3 0.5 0.6 0.82];
rmeddis@29 75 semilogx(gapDurations,HDresponse,'o'), hold on
rmeddis@29 76 legend(strvcat(num2str(maskerLevels')),'location','southeast')
rmeddis@29 77 title([ 'masker dB: ' num2str(HDmaskerLevels)])
rmeddis@29 78
rmeddis@29 79 %% Run the trials
rmeddis@29 80 maxProbeResponse=0;
rmeddis@29 81 levelNo=0;
rmeddis@29 82 resultsMatrix=zeros(length(maskerLevels), length(gapDurations));
rmeddis@29 83 summaryFiringRates=[];
rmeddis@29 84
rmeddis@29 85 % initial silence
rmeddis@29 86 time=dt: dt: initialSilenceDuration;
rmeddis@29 87 initialSilence=zeros(1,length(time));
rmeddis@29 88
rmeddis@29 89 % probe
rmeddis@29 90 time=dt: dt: probeDuration;
rmeddis@29 91 amp=28e-6*10^(probeLeveldB/20);
rmeddis@29 92 probe=amp*sin(2*pi.*targetFrequency*time);
rmeddis@29 93 % ramps
rmeddis@29 94 % catch rampTime error
rmeddis@29 95 if rampDuration>0.5*probeDuration, rampDuration=probeDuration/2; end
rmeddis@29 96 rampTime=dt:dt:rampDuration;
rmeddis@29 97 % raised cosine ramp
rmeddis@29 98 ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi)) ...
rmeddis@29 99 ones(1,length(time)-length(rampTime))];
rmeddis@29 100 % onset ramp
rmeddis@29 101 probe=probe.*ramp;
rmeddis@29 102 % offset ramp makes complete ramp for probe
rmeddis@29 103 ramp=fliplr(ramp);
rmeddis@29 104 % apply ramp mask to probe. Probe does not change below
rmeddis@29 105 probe=probe.*ramp;
rmeddis@29 106
rmeddis@29 107 % final silence
rmeddis@29 108 time=dt: dt: finalSilenceDuration;
rmeddis@29 109 finalSilence=zeros(1,length(time));
rmeddis@29 110
rmeddis@29 111 PSTHplotCount=0;
rmeddis@29 112 longestSignalDuration=initialSilenceDuration + maskerDuration +...
rmeddis@29 113 max(gapDurations) + probeDuration + finalSilenceDuration ;
rmeddis@29 114 for maskerLeveldB=maskerLevels
rmeddis@29 115 levelNo=levelNo+1;
rmeddis@29 116 allDurations=[];
rmeddis@29 117 allFiringRates=[];
rmeddis@29 118
rmeddis@29 119 %masker
rmeddis@29 120 time=dt: dt: maskerDuration;
rmeddis@29 121 masker=sin(2*pi.*maskerFrequency*time);
rmeddis@29 122 % masker ramps
rmeddis@29 123 if rampDuration>0.5*maskerDuration
rmeddis@29 124 % catch ramp duration error
rmeddis@29 125 rampDuration=maskerDuration/2;
rmeddis@29 126 end
rmeddis@29 127 % NB masker ramp (not probe ramp)
rmeddis@29 128 rampTime=dt:dt:rampDuration;
rmeddis@29 129 % raised cosine ramp
rmeddis@29 130 ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi))...
rmeddis@29 131 ones(1,length(time)-length(rampTime))];
rmeddis@29 132 % onset ramp
rmeddis@29 133 masker=masker.*ramp;
rmeddis@29 134 % offset ramp
rmeddis@29 135 ramp=fliplr(ramp);
rmeddis@29 136 % apply ramp
rmeddis@29 137 masker=masker.*ramp;
rmeddis@29 138 amp=28e-6*10^(maskerLeveldB/20);
rmeddis@29 139 maskerPa=amp*masker;
rmeddis@29 140
rmeddis@29 141 for gapDuration=gapDurations
rmeddis@29 142 time=dt: dt: gapDuration;
rmeddis@29 143 gap=zeros(1,length(time));
rmeddis@29 144
rmeddis@29 145 inputSignal=...
rmeddis@29 146 [initialSilence maskerPa gap probe finalSilence];
rmeddis@38 147 % time=dt:dt:length(inputSignal)*dt;
rmeddis@38 148 % figure(99), plot(time,inputSignal)
rmeddis@29 149
rmeddis@29 150 % ********************************** run MAP model
rmeddis@38 151 % showPlotsAndDetails=0;
rmeddis@38 152 nChanges=length(paramChanges);
rmeddis@38 153 paramChanges{nChanges+1}='AN_IHCsynapseParams.numFibers= 500;';
rmeddis@32 154 MAP1_14(inputSignal, 1/dt, targetFrequency, ...
rmeddis@32 155 paramsName, AN_spikesOrProbability, paramChanges);
rmeddis@29 156
rmeddis@32 157 if strcmp(AN_spikesOrProbability,'probability')
rmeddis@32 158 [nFibers c]=size(ANprobRateOutput);
rmeddis@32 159 nLSRfibers=nFibers/length(ANtauCas);
rmeddis@32 160 ANresponse=ANprobRateOutput(end-nLSRfibers:end,:);
rmeddis@38 161 dtSpikes=dt; % no adjustment for spikes speedup
rmeddis@32 162 else
rmeddis@32 163 [nFibers c]=size(ANoutput);
rmeddis@32 164 nLSRfibers=nFibers/length(ANtauCas);
rmeddis@32 165 ANresponse=ANoutput(end-nLSRfibers:end,:);
rmeddis@32 166 end
rmeddis@29 167
rmeddis@34 168 ANresponse=sum(ANresponse);
rmeddis@38 169 % ANresponseTimes=dtSpikes:dtSpikes:length(ANresponse)*dtSpikes;
rmeddis@38 170 % figure(99), plot(ANresponseTimes,ANresponse)
rmeddis@32 171
rmeddis@29 172 % analyse results
rmeddis@29 173 probeStart=initialSilenceDuration+maskerDuration+gapDuration;
rmeddis@38 174 PSTHbinWidth=dtSpikes;
rmeddis@29 175 responseDelay=0.005;
rmeddis@29 176 probeTimes=probeStart+responseDelay:...
rmeddis@29 177 PSTHbinWidth:probeStart+probeDuration+responseDelay;
rmeddis@29 178 probeIDX=round(probeTimes/PSTHbinWidth);
rmeddis@29 179 probePSTH=ANresponse(probeIDX);
rmeddis@29 180 firingRate=mean(probePSTH);
rmeddis@29 181 % NB this only works if you start with the lowest level masker
rmeddis@29 182 maxProbeResponse=max([maxProbeResponse firingRate]);
rmeddis@29 183 allDurations=[allDurations gapDuration];
rmeddis@29 184 allFiringRates=[allFiringRates firingRate];
rmeddis@32 185
rmeddis@29 186 %% show PSTHs
rmeddis@29 187 if showPSTHs
rmeddis@29 188 nLevels=length(maskerLevels);
rmeddis@29 189 nDurations=length(gapDurations);
rmeddis@29 190 figure(8)
rmeddis@29 191 PSTHbinWidth=1e-3;
rmeddis@38 192 PSTH=UTIL_PSTHmaker(ANresponse, dtSpikes, PSTHbinWidth);
rmeddis@38 193 PSTH=PSTH*dtSpikes/PSTHbinWidth;
rmeddis@29 194 PSTHplotCount=PSTHplotCount+1;
rmeddis@29 195 subplot(nLevels,nDurations,PSTHplotCount)
rmeddis@33 196 PSTHtime=PSTHbinWidth:PSTHbinWidth:...
rmeddis@29 197 PSTHbinWidth*length(PSTH);
rmeddis@34 198 if strcmp(AN_spikesOrProbability, 'spikes')
rmeddis@38 199 bar(PSTHtime, PSTH/PSTHbinWidth/nFibers)
rmeddis@38 200 % ylim([0 500])
rmeddis@34 201 else
rmeddis@38 202 bar(PSTHtime, PSTH)
rmeddis@29 203 ylim([0 500])
rmeddis@29 204 end
rmeddis@38 205 xlim([0 longestSignalDuration])
rmeddis@29 206 grid on
rmeddis@29 207
rmeddis@29 208 if PSTHplotCount< (nLevels-1) * nDurations+1
rmeddis@29 209 set(gca,'xticklabel',[])
rmeddis@29 210 end
rmeddis@29 211
rmeddis@29 212 if ~isequal(mod(PSTHplotCount,nDurations),1)
rmeddis@29 213 set(gca,'yticklabel',[])
rmeddis@29 214 else
rmeddis@29 215 ylabel([num2str(maskerLevels...
rmeddis@29 216 (round(PSTHplotCount/nDurations) +1))])
rmeddis@29 217 end
rmeddis@29 218
rmeddis@29 219 if PSTHplotCount<=nDurations
rmeddis@29 220 title([num2str(1000*gapDurations(PSTHplotCount)) 'ms'])
rmeddis@29 221 end
rmeddis@33 222
rmeddis@38 223 % figure(99), bar(PSTHtime, PSTH)
rmeddis@33 224
rmeddis@29 225 end % showPSTHs
rmeddis@29 226
rmeddis@29 227 end % gapDurations duration
rmeddis@29 228 summaryFiringRates=[summaryFiringRates allFiringRates'];
rmeddis@29 229
rmeddis@29 230 figure(7), hold on
rmeddis@29 231 semilogx(allDurations, allFiringRates/maxProbeResponse)
rmeddis@29 232 ylim([0 1]), hold on
rmeddis@29 233 ylim([0 inf]), xlim([min(gapDurations) max(gapDurations)])
rmeddis@29 234 xlim([0.001 1])
rmeddis@29 235 pause(0.1) % to allow for CTRL/C interrupts
rmeddis@29 236 resultsMatrix(levelNo,:)=allFiringRates;
rmeddis@29 237 end % maskerLevel
rmeddis@29 238
rmeddis@29 239 disp('delay/ rates')
rmeddis@29 240 disp(num2str(round( [1000*allDurations' summaryFiringRates])))
rmeddis@29 241
rmeddis@29 242 % replot with best adjustment
rmeddis@29 243 % figure(34), clf% use for separate plot
rmeddis@29 244 figure(7), clf
rmeddis@29 245 peakProbe=max(max(resultsMatrix));
rmeddis@29 246 resultsMatrix=resultsMatrix/peakProbe;
rmeddis@29 247 semilogx(gapDurations,HDresponse,'o'), hold on
rmeddis@29 248 title(['FrMsk: probe ' num2str(probeLeveldB)...
rmeddis@29 249 'dB SL: peakProbe=' num2str(peakProbe,'%5.0f') ' sp/s'])
rmeddis@29 250 xlabel('gap duration (s)'), ylabel ('probe response')
rmeddis@29 251 semilogx(allDurations, resultsMatrix'), ylim([0 1])
rmeddis@29 252 ylim([0 inf]),
rmeddis@29 253 xlim([0.001 1])
rmeddis@29 254 legend(strvcat(num2str(maskerLevels'-thresholdAtCF)), -1)
rmeddis@29 255
rmeddis@29 256 % ------------------------------------------------- display parameters
rmeddis@29 257 disp(['parameter file was: ' paramsName])
rmeddis@29 258 fprintf('\n')
rmeddis@29 259 % UTIL_showStruct(inputStimulusParams, 'inputStimulusParams')
rmeddis@29 260 % UTIL_showStruct(outerMiddleEarParams, 'outerMiddleEarParams')
rmeddis@29 261 % UTIL_showStruct(DRNLParams, 'DRNLParams')
rmeddis@29 262 % UTIL_showStruct(IHC_VResp_VivoParams, 'IHC_VResp_VivoParams')
rmeddis@29 263 UTIL_showStruct(IHCpreSynapseParams, 'IHCpreSynapseParams')
rmeddis@29 264 UTIL_showStruct(AN_IHCsynapseParams, 'AN_IHCsynapseParams')
rmeddis@29 265
rmeddis@29 266
rmeddis@32 267 path(restorePath);