To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

The primary repository for this project is hosted at git://github.com/rmeddis/MAP.git .
This repository is a read-only copy which is updated automatically every hour.

Statistics Download as Zip
| Branch: | Revision:

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

History | View | Annotate | Download (7.82 KB)

1
function testFM(showPSTHs)
2
%   specify whether you want AN 'probability' or 'spikes'
3
%       spikes is more realistic but takes longer
4
%       refractory effect is included only for spikes
5
%
6

    
7
% specify the AN ANresponse bin width (normally 1 ms).
8
%      This can influence the measure of the AN onset rate based on the
9
%      largest bin in the ANresponse
10
%
11
% Demonstration is based on Harris and Dallos
12

    
13
global experiment  stimulusParameters
14
global inputStimulusParams outerMiddleEarParams DRNLParams 
15
global IHC_VResp_VivoParams IHCpreSynapseParams  AN_IHCsynapseParams
16

    
17
dbstop if error
18
% masker and probe levels are relative to this threshold
19
thresholdAtCF=10; % dB SPL
20
thresholdAtCF=5; % dB SPL
21

    
22
if nargin<1, showPSTHs=1;end
23

    
24
sampleRate=50000;
25

    
26
% fetch BF from GUI: use only the first target frequency
27
BFlist=stimulusParameters.targetFrequency(1);
28
maskerFrequency=BFlist;
29
maskerDuration=.1;
30

    
31
targetFrequency=maskerFrequency;
32
probeLeveldB=20+thresholdAtCF;	% H&D use 20 dB SL/ TMC uses 10 dB SL
33
probeDuration=0.008; % HD use 15 ms probe (fig 3).
34
probeDuration=0.015; % HD use 15 ms probe (fig 3).
35

    
36
rampDuration=.001;  % HD use 1 ms linear ramp
37
initialSilenceDuration=0.02;
38
finalSilenceDuration=0.05;      % useful for showing recovery
39

    
40
maskerLevels=[-80   10 20 30 40 60 ] + thresholdAtCF;
41
% maskerLevels=[-80   40 60 ] + thresholdAtCF;
42

    
43
dt=1/sampleRate;
44

    
45
figure(7), clf
46
set(gcf,'position',[613    36   360   247])
47
set(gcf,'name', ['forward masking: thresholdAtCF=' num2str(thresholdAtCF)])
48

    
49
if showPSTHs
50
    figure(8), clf
51
    set(gcf,'name', 'Harris and Dallos simulation')
52
    set(gcf,'position',[980    36   380   249])
53
end
54

    
55
% Plot Harris and Dallos result for comparison
56
gapDurations=[0.001	0.002	0.005	0.01	0.02	0.05	0.1	0.3];
57
HDmaskerLevels=[+10	+20	+30	+40	+60];
58
HDresponse=[
59
    1 1 1 1 1 1 1 1;
60
    0.8  	0.82	0.81	0.83	0.87	0.95	1	    1;
61
    0.48	0.5	    0.54	0.58	0.7	    0.85	0.95	1;
62
    0.3	    0.31	0.35	0.4	    0.5	    0.68	0.82	0.94;
63
    0.2 	0.27	0.27	0.29	0.42	0.64	0.75	0.92;
64
    0.15	0.17	0.18	0.23	0.3	     0.5	0.6	    0.82];
65

    
66
figure(7)
67
semilogx(gapDurations,HDresponse,'o'), hold on
68
legend(strvcat(num2str(maskerLevels')),'location','southeast')
69
title([ 'masker dB: ' num2str(HDmaskerLevels)])
70

    
71
%% Run the trials
72
maxProbeResponse=0;
73
levelNo=0;
74
resultsMatrix=zeros(length(maskerLevels), length(gapDurations));
75
summaryFiringRates=[];
76

    
77
% initial silence
78
time=dt: dt: initialSilenceDuration;
79
initialSilence=zeros(1,length(time));
80

    
81
% probe
82
time=dt: dt: probeDuration;
83
amp=28e-6*10^(probeLeveldB/20);
84
probe=amp*sin(2*pi.*targetFrequency*time);
85
% ramps
86
% catch rampTime error
87
if rampDuration>0.5*probeDuration, rampDuration=probeDuration/2; end
88
rampTime=dt:dt:rampDuration;
89
% raised cosine ramp
90
ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi)) ...
91
    ones(1,length(time)-length(rampTime))];
92
%  onset ramp
93
probe=probe.*ramp;
94
%  offset ramp makes complete ramp for probe
95
ramp=fliplr(ramp);
96
% apply ramp mask to probe. Probe does not change below
97
probe=probe.*ramp;
98

    
99
% final silence
100
time=dt: dt: finalSilenceDuration;
101
finalSilence=zeros(1,length(time));
102

    
103
PSTHplotCount=0;
104
longestSignalDuration=initialSilenceDuration + maskerDuration +...
105
    max(gapDurations) + probeDuration + finalSilenceDuration ;
106
for maskerLeveldB=maskerLevels
107
    levelNo=levelNo+1;
108
    allDurations=[];
109
    allFiringRates=[];
110

    
111
    %masker
112
    time=dt: dt: maskerDuration;
113
    masker=sin(2*pi.*maskerFrequency*time);
114
    % masker ramps
115
    if rampDuration>0.5*maskerDuration
116
        % catch ramp duration error
117
        rampDuration=maskerDuration/2;
118
    end
119
    % NB masker ramp (not probe ramp)
120
    rampTime=dt:dt:rampDuration;
121
    % raised cosine ramp
122
    ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi))...
123
        ones(1,length(time)-length(rampTime))];
124
    %  onset ramp
125
    masker=masker.*ramp;
126
    %  offset ramp
127
    ramp=fliplr(ramp);
128
    % apply ramp
129
    masker=masker.*ramp;
130
    amp=28e-6*10^(maskerLeveldB/20);
131
    maskerPa=amp*masker;
132

    
133
    for gapDuration=gapDurations
134
        time=dt: dt: gapDuration;
135
        gap=zeros(1,length(time));
136

    
137
        inputSignal=...
138
            [initialSilence maskerPa gap probe finalSilence];
139

    
140
        % **********************************  run MAP model
141
        
142
        global  ANprobRateOutput  tauCas  ...
143

    
144
    MAPparamsName=experiment.name;
145
    showPlotsAndDetails=0;
146

    
147
AN_spikesOrProbability='probability';
148

    
149
MAP1_14(inputSignal, 1/dt, targetFrequency, ...
150
    MAPparamsName, AN_spikesOrProbability);
151
 
152
    [nFibers c]=size(ANprobRateOutput);
153
    nLSRfibers=nFibers/length(tauCas);
154
            ANresponse=ANprobRateOutput(end-nLSRfibers:end,:);
155
            ANresponse=sum(ANresponse)/nLSRfibers;
156
    
157
        % analyse results
158
        probeStart=initialSilenceDuration+maskerDuration+gapDuration;
159
        PSTHbinWidth=dt;
160
        responseDelay=0.005;
161
        probeTimes=probeStart+responseDelay:...
162
            PSTHbinWidth:probeStart+probeDuration+responseDelay;
163
        probeIDX=round(probeTimes/PSTHbinWidth);
164
        probePSTH=ANresponse(probeIDX);
165
        firingRate=mean(probePSTH);
166
        % NB this only works if you start with the lowest level masker
167
        maxProbeResponse=max([maxProbeResponse firingRate]);
168
        allDurations=[allDurations gapDuration];
169
        allFiringRates=[allFiringRates firingRate];
170
        
171
        %% show PSTHs
172
        if showPSTHs
173
            nLevels=length(maskerLevels);
174
            nDurations=length(gapDurations);
175
            figure(8)
176
            PSTHbinWidth=1e-3;
177
            PSTH=UTIL_PSTHmaker(ANresponse, dt, PSTHbinWidth);
178
            PSTH=PSTH*dt/PSTHbinWidth;
179
            PSTHplotCount=PSTHplotCount+1;
180
            subplot(nLevels,nDurations,PSTHplotCount)
181
            probeTime=PSTHbinWidth:PSTHbinWidth:...
182
                PSTHbinWidth*length(PSTH);
183
            bar(probeTime, PSTH)
184
            if strcmp(AN_spikesOrProbability, 'spikes')
185
                ylim([0 500])
186
            else
187
                ylim([0 500])
188
            end
189
            xlim([0 longestSignalDuration])
190
            grid on
191

    
192
            if PSTHplotCount< (nLevels-1) * nDurations+1
193
                set(gca,'xticklabel',[])
194
            end
195

    
196
            if ~isequal(mod(PSTHplotCount,nDurations),1)
197
                set(gca,'yticklabel',[])
198
            else
199
                ylabel([num2str(maskerLevels...
200
                    (round(PSTHplotCount/nDurations) +1))])
201
            end
202

    
203
            if PSTHplotCount<=nDurations
204
                title([num2str(1000*gapDurations(PSTHplotCount)) 'ms'])
205
            end
206
        end % showPSTHs
207

    
208
    end     % gapDurations duration
209
    summaryFiringRates=[summaryFiringRates allFiringRates'];
210

    
211
    figure(7), hold on
212
    semilogx(allDurations, allFiringRates/maxProbeResponse)
213
    ylim([0 1]), hold on
214
    ylim([0 inf]), xlim([min(gapDurations) max(gapDurations)])
215
    xlim([0.001 1])
216
    pause(0.1) % to allow for CTRL/C interrupts
217
    resultsMatrix(levelNo,:)=allFiringRates;
218
end          % maskerLevel
219

    
220
disp('delay/ rates')
221
disp(num2str(round( [1000*allDurations' summaryFiringRates])))
222

    
223
% replot with best adjustment
224
% figure(34), clf% use for separate plot
225
figure(7), clf
226
peakProbe=max(max(resultsMatrix));
227
resultsMatrix=resultsMatrix/peakProbe;
228
semilogx(gapDurations,HDresponse,'o'), hold on
229
title(['FrMsk: probe ' num2str(probeLeveldB)...
230
    'dB SL: peakProbe=' num2str(peakProbe,'%5.0f') ' sp/s'])
231
xlabel('gap duration (s)'), ylabel ('probe response')
232
semilogx(allDurations, resultsMatrix'), ylim([0 1])
233
ylim([0 inf]),
234
xlim([0.001 1])
235
legend(strvcat(num2str(maskerLevels'-thresholdAtCF)), -1)
236

    
237
% ------------------------------------------------- display parameters
238
disp(['parameter file was: ' experiment.name])
239
fprintf('\n')
240
% UTIL_showStruct(inputStimulusParams, 'inputStimulusParams')
241
% UTIL_showStruct(outerMiddleEarParams, 'outerMiddleEarParams')
242
% UTIL_showStruct(DRNLParams, 'DRNLParams')
243
% UTIL_showStruct(IHC_VResp_VivoParams, 'IHC_VResp_VivoParams')
244
UTIL_showStruct(IHCpreSynapseParams, 'IHCpreSynapseParams')
245
UTIL_showStruct(AN_IHCsynapseParams, 'AN_IHCsynapseParams')
246

    
247