annotate Copy_of_multithreshold 1.46/testFM.m @ 28:02aa9826efe0

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