annotate multithreshold 1.46/testFM.m @ 7:573c75007cf4

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