annotate testPrograms/testFM.m @ 30:1a502830d462

MT update
author Ray Meddis <rmeddis@essex.ac.uk>
date Mon, 11 Jul 2011 14:31:29 +0100
parents b51bf546ca3f
children 82fb37eb430e
rev   line source
rmeddis@29 1 function testFM(BFlist,paramsName,showPSTHs,paramChanges)
rmeddis@29 2 % specify whether you want AN 'probability' or 'spikes'
rmeddis@29 3 % spikes is more realistic but takes longer
rmeddis@29 4 % refractory effect is included only for spikes
rmeddis@29 5 %
rmeddis@29 6
rmeddis@29 7 % specify the AN ANresponse bin width (normally 1 ms).
rmeddis@29 8 % This can influence the measure of the AN onset rate based on the
rmeddis@29 9 % largest bin in the ANresponse
rmeddis@29 10 %
rmeddis@29 11 % Demonstration is based on Harris and Dallos
rmeddis@29 12
rmeddis@29 13 global inputStimulusParams outerMiddleEarParams DRNLParams
rmeddis@29 14 global IHC_VResp_VivoParams IHCpreSynapseParams AN_IHCsynapseParams
rmeddis@29 15
rmeddis@29 16 dbstop if error
rmeddis@29 17
rmeddis@29 18 restorePath=path;
rmeddis@29 19 addpath (['..' filesep 'MAP'], ['..' filesep 'utilities'], ...
rmeddis@29 20 ['..' filesep 'parameterStore'], ['..' filesep 'wavFileStore'],...
rmeddis@29 21 ['..' filesep 'testPrograms'])
rmeddis@29 22
rmeddis@29 23 if nargin<3
rmeddis@29 24 paramChanges=[];
rmeddis@29 25 end
rmeddis@29 26
rmeddis@29 27 % masker and probe levels are relative to this threshold
rmeddis@29 28 thresholdAtCF=10; % dB SPL
rmeddis@29 29 thresholdAtCF=5; % dB SPL
rmeddis@29 30
rmeddis@29 31 if nargin<1, showPSTHs=1;end
rmeddis@29 32
rmeddis@29 33 sampleRate=50000;
rmeddis@29 34
rmeddis@29 35 % fetch BF from GUI: use only the first target frequency
rmeddis@29 36 maskerFrequency=BFlist;
rmeddis@29 37 maskerDuration=.1;
rmeddis@29 38
rmeddis@29 39 targetFrequency=maskerFrequency;
rmeddis@29 40 probeLeveldB=20+thresholdAtCF; % H&D use 20 dB SL/ TMC uses 10 dB SL
rmeddis@29 41 probeDuration=0.008; % HD use 15 ms probe (fig 3).
rmeddis@29 42 probeDuration=0.015; % HD use 15 ms probe (fig 3).
rmeddis@29 43
rmeddis@29 44 rampDuration=.001; % HD use 1 ms linear ramp
rmeddis@29 45 initialSilenceDuration=0.02;
rmeddis@29 46 finalSilenceDuration=0.05; % useful for showing recovery
rmeddis@29 47
rmeddis@29 48 maskerLevels=[-80 10 20 30 40 60 ] + thresholdAtCF;
rmeddis@29 49 % maskerLevels=[-80 40 60 ] + thresholdAtCF;
rmeddis@29 50
rmeddis@29 51 dt=1/sampleRate;
rmeddis@29 52
rmeddis@29 53 figure(7), clf
rmeddis@29 54 set(gcf,'position',[613 36 360 247])
rmeddis@29 55 set(gcf,'name', ['forward masking: thresholdAtCF=' num2str(thresholdAtCF)])
rmeddis@29 56
rmeddis@29 57 if showPSTHs
rmeddis@29 58 figure(8), clf
rmeddis@29 59 set(gcf,'name', 'Harris and Dallos simulation')
rmeddis@29 60 set(gcf,'position',[980 36 380 249])
rmeddis@29 61 end
rmeddis@29 62
rmeddis@29 63 % Plot Harris and Dallos result for comparison
rmeddis@29 64 gapDurations=[0.001 0.002 0.005 0.01 0.02 0.05 0.1 0.3];
rmeddis@29 65 HDmaskerLevels=[+10 +20 +30 +40 +60];
rmeddis@29 66 HDresponse=[
rmeddis@29 67 1 1 1 1 1 1 1 1;
rmeddis@29 68 0.8 0.82 0.81 0.83 0.87 0.95 1 1;
rmeddis@29 69 0.48 0.5 0.54 0.58 0.7 0.85 0.95 1;
rmeddis@29 70 0.3 0.31 0.35 0.4 0.5 0.68 0.82 0.94;
rmeddis@29 71 0.2 0.27 0.27 0.29 0.42 0.64 0.75 0.92;
rmeddis@29 72 0.15 0.17 0.18 0.23 0.3 0.5 0.6 0.82];
rmeddis@29 73
rmeddis@29 74 figure(7)
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@29 147
rmeddis@29 148 % ********************************** run MAP model
rmeddis@29 149
rmeddis@29 150 global ANprobRateOutput tauCas ...
rmeddis@29 151
rmeddis@29 152 showPlotsAndDetails=0;
rmeddis@29 153
rmeddis@29 154 AN_spikesOrProbability='probability';
rmeddis@29 155
rmeddis@29 156 MAP1_14(inputSignal, 1/dt, targetFrequency, ...
rmeddis@29 157 paramsName, AN_spikesOrProbability, paramChanges);
rmeddis@29 158
rmeddis@29 159 [nFibers c]=size(ANprobRateOutput);
rmeddis@29 160 nLSRfibers=nFibers/length(tauCas);
rmeddis@29 161 ANresponse=ANprobRateOutput(end-nLSRfibers:end,:);
rmeddis@29 162 ANresponse=sum(ANresponse)/nLSRfibers;
rmeddis@29 163
rmeddis@29 164 % analyse results
rmeddis@29 165 probeStart=initialSilenceDuration+maskerDuration+gapDuration;
rmeddis@29 166 PSTHbinWidth=dt;
rmeddis@29 167 responseDelay=0.005;
rmeddis@29 168 probeTimes=probeStart+responseDelay:...
rmeddis@29 169 PSTHbinWidth:probeStart+probeDuration+responseDelay;
rmeddis@29 170 probeIDX=round(probeTimes/PSTHbinWidth);
rmeddis@29 171 probePSTH=ANresponse(probeIDX);
rmeddis@29 172 firingRate=mean(probePSTH);
rmeddis@29 173 % NB this only works if you start with the lowest level masker
rmeddis@29 174 maxProbeResponse=max([maxProbeResponse firingRate]);
rmeddis@29 175 allDurations=[allDurations gapDuration];
rmeddis@29 176 allFiringRates=[allFiringRates firingRate];
rmeddis@29 177
rmeddis@29 178 %% show PSTHs
rmeddis@29 179 if showPSTHs
rmeddis@29 180 nLevels=length(maskerLevels);
rmeddis@29 181 nDurations=length(gapDurations);
rmeddis@29 182 figure(8)
rmeddis@29 183 PSTHbinWidth=1e-3;
rmeddis@29 184 PSTH=UTIL_PSTHmaker(ANresponse, dt, PSTHbinWidth);
rmeddis@29 185 PSTH=PSTH*dt/PSTHbinWidth;
rmeddis@29 186 PSTHplotCount=PSTHplotCount+1;
rmeddis@29 187 subplot(nLevels,nDurations,PSTHplotCount)
rmeddis@29 188 probeTime=PSTHbinWidth:PSTHbinWidth:...
rmeddis@29 189 PSTHbinWidth*length(PSTH);
rmeddis@29 190 bar(probeTime, PSTH)
rmeddis@29 191 if strcmp(AN_spikesOrProbability, 'spikes')
rmeddis@29 192 ylim([0 500])
rmeddis@29 193 else
rmeddis@29 194 ylim([0 500])
rmeddis@29 195 end
rmeddis@29 196 xlim([0 longestSignalDuration])
rmeddis@29 197 grid on
rmeddis@29 198
rmeddis@29 199 if PSTHplotCount< (nLevels-1) * nDurations+1
rmeddis@29 200 set(gca,'xticklabel',[])
rmeddis@29 201 end
rmeddis@29 202
rmeddis@29 203 if ~isequal(mod(PSTHplotCount,nDurations),1)
rmeddis@29 204 set(gca,'yticklabel',[])
rmeddis@29 205 else
rmeddis@29 206 ylabel([num2str(maskerLevels...
rmeddis@29 207 (round(PSTHplotCount/nDurations) +1))])
rmeddis@29 208 end
rmeddis@29 209
rmeddis@29 210 if PSTHplotCount<=nDurations
rmeddis@29 211 title([num2str(1000*gapDurations(PSTHplotCount)) 'ms'])
rmeddis@29 212 end
rmeddis@29 213 end % showPSTHs
rmeddis@29 214
rmeddis@29 215 end % gapDurations duration
rmeddis@29 216 summaryFiringRates=[summaryFiringRates allFiringRates'];
rmeddis@29 217
rmeddis@29 218 figure(7), hold on
rmeddis@29 219 semilogx(allDurations, allFiringRates/maxProbeResponse)
rmeddis@29 220 ylim([0 1]), hold on
rmeddis@29 221 ylim([0 inf]), xlim([min(gapDurations) max(gapDurations)])
rmeddis@29 222 xlim([0.001 1])
rmeddis@29 223 pause(0.1) % to allow for CTRL/C interrupts
rmeddis@29 224 resultsMatrix(levelNo,:)=allFiringRates;
rmeddis@29 225 end % maskerLevel
rmeddis@29 226
rmeddis@29 227 disp('delay/ rates')
rmeddis@29 228 disp(num2str(round( [1000*allDurations' summaryFiringRates])))
rmeddis@29 229
rmeddis@29 230 % replot with best adjustment
rmeddis@29 231 % figure(34), clf% use for separate plot
rmeddis@29 232 figure(7), clf
rmeddis@29 233 peakProbe=max(max(resultsMatrix));
rmeddis@29 234 resultsMatrix=resultsMatrix/peakProbe;
rmeddis@29 235 semilogx(gapDurations,HDresponse,'o'), hold on
rmeddis@29 236 title(['FrMsk: probe ' num2str(probeLeveldB)...
rmeddis@29 237 'dB SL: peakProbe=' num2str(peakProbe,'%5.0f') ' sp/s'])
rmeddis@29 238 xlabel('gap duration (s)'), ylabel ('probe response')
rmeddis@29 239 semilogx(allDurations, resultsMatrix'), ylim([0 1])
rmeddis@29 240 ylim([0 inf]),
rmeddis@29 241 xlim([0.001 1])
rmeddis@29 242 legend(strvcat(num2str(maskerLevels'-thresholdAtCF)), -1)
rmeddis@29 243
rmeddis@29 244 % ------------------------------------------------- display parameters
rmeddis@29 245 disp(['parameter file was: ' paramsName])
rmeddis@29 246 fprintf('\n')
rmeddis@29 247 % UTIL_showStruct(inputStimulusParams, 'inputStimulusParams')
rmeddis@29 248 % UTIL_showStruct(outerMiddleEarParams, 'outerMiddleEarParams')
rmeddis@29 249 % UTIL_showStruct(DRNLParams, 'DRNLParams')
rmeddis@29 250 % UTIL_showStruct(IHC_VResp_VivoParams, 'IHC_VResp_VivoParams')
rmeddis@29 251 UTIL_showStruct(IHCpreSynapseParams, 'IHCpreSynapseParams')
rmeddis@29 252 UTIL_showStruct(AN_IHCsynapseParams, 'AN_IHCsynapseParams')
rmeddis@29 253
rmeddis@29 254
rmeddis@29 255 path(restorePath);