rmeddis@28: function vectorStrength=testAN(targetFrequency,BFlist, levels) rmeddis@28: % testIHC used either for IHC I/O function ... rmeddis@28: % or receptive field (doReceptiveFields=1) rmeddis@28: rmeddis@28: global experiment method stimulusParameters rmeddis@28: global IHC_VResp_VivoParams IHC_cilia_RPParams IHCpreSynapseParams rmeddis@28: global AN_IHCsynapseParams rmeddis@28: rmeddis@28: global ANoutput ANdt CNoutput ICoutput ICmembraneOutput tauCas rmeddis@28: global ARattenuation MOCattenuation rmeddis@28: rmeddis@28: dbstop if error rmeddis@28: rmeddis@28: addpath (['..' filesep 'MAP'], ['..' filesep 'utilities'], ... rmeddis@28: ['..' filesep 'parameterStore'], ['..' filesep 'wavFileStore'],... rmeddis@28: ['..' filesep 'testPrograms']) rmeddis@28: rmeddis@28: if nargin<3 rmeddis@28: levels=-10:10:80; rmeddis@28: % levels=80:10:90; rmeddis@28: end rmeddis@28: rmeddis@28: nLevels=length(levels); rmeddis@28: rmeddis@28: toneDuration=.2; rmeddis@28: rampDuration=0.002; rmeddis@28: silenceDuration=.02; rmeddis@28: localPSTHbinwidth=0.001; rmeddis@28: rmeddis@28: % Use only the first frequency in the GUI targetFrequency box to defineBF rmeddis@28: % targetFrequency=stimulusParameters.targetFrequency(1); rmeddis@28: % BFlist=targetFrequency; rmeddis@28: rmeddis@28: AN_HSRonset=zeros(nLevels,1); rmeddis@28: AN_HSRsaturated=zeros(nLevels,1); rmeddis@28: AN_LSRonset=zeros(nLevels,1); rmeddis@28: AN_LSRsaturated=zeros(nLevels,1); rmeddis@28: CNLSRrate=zeros(nLevels,1); rmeddis@28: CNHSRsaturated=zeros(nLevels,1); rmeddis@28: ICHSRsaturated=zeros(nLevels,1); rmeddis@28: ICLSRsaturated=zeros(nLevels,1); rmeddis@28: vectorStrength=zeros(nLevels,1); rmeddis@28: rmeddis@28: AR=zeros(nLevels,1); rmeddis@28: MOC=zeros(nLevels,1); rmeddis@28: rmeddis@28: % ANoutput=zeros(200,200); rmeddis@28: rmeddis@28: figure(15), clf rmeddis@28: set(gcf,'position',[980 356 401 321]) rmeddis@28: figure(5), clf rmeddis@28: set(gcf,'position', [980 34 400 295]) rmeddis@28: drawnow rmeddis@28: rmeddis@28: %% guarantee that the sample rate is at least 10 times the frequency rmeddis@28: sampleRate=50000; rmeddis@28: while sampleRate< 10* targetFrequency rmeddis@28: sampleRate=sampleRate+10000; rmeddis@28: end rmeddis@28: rmeddis@28: %% adjust sample rate so that the pure tone stimulus has an integer rmeddis@28: %% numver of epochs in a period rmeddis@28: dt=1/sampleRate; rmeddis@28: period=1/targetFrequency; rmeddis@28: ANspeedUpFactor=5; %anticipating MAP (needs clearing up) rmeddis@28: ANdt=dt*ANspeedUpFactor; rmeddis@28: ANdt=period/round(period/ANdt); rmeddis@28: dt=ANdt/ANspeedUpFactor; rmeddis@28: sampleRate=1/dt; rmeddis@28: epochsPerPeriod=sampleRate*period; rmeddis@28: rmeddis@28: %% main computational loop (vary level) rmeddis@28: levelNo=0; rmeddis@28: for leveldB=levels rmeddis@28: levelNo=levelNo+1; rmeddis@28: rmeddis@28: fprintf('%4.0f\t', leveldB) rmeddis@28: amp=28e-6*10^(leveldB/20); rmeddis@28: rmeddis@28: time=dt:dt:toneDuration; rmeddis@28: rampTime=dt:dt:rampDuration; rmeddis@28: ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi)) ... rmeddis@28: ones(1,length(time)-length(rampTime))]; rmeddis@28: ramp=ramp.*fliplr(ramp); rmeddis@28: rmeddis@28: silence=zeros(1,round(silenceDuration/dt)); rmeddis@28: rmeddis@28: % create signal (leveldB/ targetFrequency) rmeddis@28: inputSignal=amp*sin(2*pi*targetFrequency'*time); rmeddis@28: inputSignal= ramp.*inputSignal; rmeddis@28: inputSignal=[silence inputSignal]; rmeddis@28: rmeddis@28: %% run the model rmeddis@28: AN_spikesOrProbability='spikes'; rmeddis@28: MAPparamsName=experiment.name; rmeddis@28: showPlotsAndDetails=0; rmeddis@28: rmeddis@28: rmeddis@28: MAP1_14(inputSignal, 1/dt, BFlist, ... rmeddis@28: MAPparamsName, AN_spikesOrProbability); rmeddis@28: rmeddis@28: nTaus=length(tauCas); rmeddis@28: rmeddis@28: %LSR (same as HSR if no LSR fibers present) rmeddis@28: [nANFibers nTimePoints]=size(ANoutput); rmeddis@28: rmeddis@28: numLSRfibers=nANFibers/nTaus; rmeddis@28: numHSRfibers=numLSRfibers; rmeddis@28: rmeddis@28: LSRspikes=ANoutput(1:numLSRfibers,:); rmeddis@28: PSTH=UTIL_PSTHmaker(LSRspikes, ANdt, localPSTHbinwidth); rmeddis@28: PSTHLSR=mean(PSTH,1)/localPSTHbinwidth; % across fibers rates rmeddis@28: PSTHtime=localPSTHbinwidth:localPSTHbinwidth:... rmeddis@28: localPSTHbinwidth*length(PSTH); rmeddis@28: AN_LSRonset(levelNo)= max(PSTHLSR); % peak in 5 ms window rmeddis@28: AN_LSRsaturated(levelNo)= mean(PSTHLSR(round(length(PSTH)/2):end)); rmeddis@28: rmeddis@28: % HSR rmeddis@28: HSRspikes= ANoutput(end- numHSRfibers+1:end, :); rmeddis@28: PSTH=UTIL_PSTHmaker(HSRspikes, ANdt, localPSTHbinwidth); rmeddis@28: PSTH=mean(PSTH,1)/localPSTHbinwidth; % sum across fibers (HSR only) rmeddis@28: AN_HSRonset(levelNo)= max(PSTH); rmeddis@28: AN_HSRsaturated(levelNo)= mean(PSTH(round(length(PSTH)/2): end)); rmeddis@28: rmeddis@28: figure(5), subplot(2,2,2) rmeddis@28: hold off, bar(PSTHtime,PSTH, 'b') rmeddis@28: hold on, bar(PSTHtime,PSTHLSR,'r') rmeddis@28: ylim([0 1000]) rmeddis@28: xlim([0 length(PSTH)*localPSTHbinwidth]) rmeddis@28: set(gcf,'name',[num2str(BFlist), ' Hz: ' num2str(leveldB) ' dB']); rmeddis@28: rmeddis@28: % AN - CV rmeddis@28: % CV is computed 5 times. Use the middle one (3) as most typical rmeddis@28: cvANHSR= UTIL_CV(HSRspikes, ANdt); rmeddis@28: rmeddis@28: % AN - vector strength rmeddis@28: PSTH=sum(HSRspikes); rmeddis@28: [PH, binTimes]=UTIL_periodHistogram... rmeddis@28: (PSTH, ANdt, targetFrequency); rmeddis@28: VS=UTIL_vectorStrength(PH); rmeddis@28: vectorStrength(levelNo)=VS; rmeddis@28: disp(['sat rate= ' num2str(AN_HSRsaturated(levelNo)) ... rmeddis@28: '; phase-locking VS = ' num2str(VS)]) rmeddis@28: title(['AN HSR: CV=' num2str(cvANHSR(3),'%5.2f') ... rmeddis@28: 'VS=' num2str(VS,'%5.2f')]) rmeddis@28: rmeddis@28: % CN - first-order neurons rmeddis@28: rmeddis@28: % CN LSR rmeddis@28: [nCNneurons c]=size(CNoutput); rmeddis@28: nLSRneurons=round(nCNneurons/nTaus); rmeddis@28: CNLSRspikes=CNoutput(1:nLSRneurons,:); rmeddis@28: PSTH=UTIL_PSTHmaker(CNLSRspikes, ANdt, localPSTHbinwidth); rmeddis@28: PSTH=sum(PSTH)/nLSRneurons; rmeddis@28: CNLSRrate(levelNo)=mean(PSTH(round(length(PSTH)/2):end))/localPSTHbinwidth; rmeddis@28: rmeddis@28: %CN HSR rmeddis@28: MacGregorMultiHSRspikes=... rmeddis@28: CNoutput(end-nLSRneurons:end,:); rmeddis@28: PSTH=UTIL_PSTHmaker(MacGregorMultiHSRspikes, ANdt, localPSTHbinwidth); rmeddis@28: PSTH=sum(PSTH)/nLSRneurons; rmeddis@28: PSTH=mean(PSTH,1)/localPSTHbinwidth; % sum across fibers (HSR only) rmeddis@28: rmeddis@28: CNHSRsaturated(levelNo)=mean(PSTH(length(PSTH)/2:end)); rmeddis@28: rmeddis@28: figure(5), subplot(2,2,3) rmeddis@28: bar(PSTHtime,PSTH) rmeddis@28: ylim([0 1000]) rmeddis@28: xlim([0 length(PSTH)*localPSTHbinwidth]) rmeddis@28: cvMMHSR= UTIL_CV(MacGregorMultiHSRspikes, ANdt); rmeddis@28: title(['CN CV= ' num2str(cvMMHSR(3),'%5.2f')]) rmeddis@28: rmeddis@28: % IC LSR rmeddis@28: [nICneurons c]=size(ICoutput); rmeddis@28: nLSRneurons=round(nICneurons/nTaus); rmeddis@28: ICLSRspikes=ICoutput(1:nLSRneurons,:); rmeddis@28: PSTH=UTIL_PSTHmaker(ICLSRspikes, ANdt, localPSTHbinwidth); rmeddis@28: ICLSRsaturated(levelNo)=mean(PSTH(round(length(PSTH)/2):end))/localPSTHbinwidth; rmeddis@28: rmeddis@28: %IC HSR rmeddis@28: MacGregorMultiHSRspikes=... rmeddis@28: ICoutput(end-nLSRneurons:end,:); rmeddis@28: PSTH=UTIL_PSTHmaker(MacGregorMultiHSRspikes, ANdt, localPSTHbinwidth); rmeddis@28: PSTH=sum(PSTH)/nLSRneurons; rmeddis@28: PSTH=mean(PSTH,1)/localPSTHbinwidth; % sum across fibers (HSR only) rmeddis@28: rmeddis@28: ICHSRsaturated(levelNo)=mean(PSTH(length(PSTH)/2:end)); rmeddis@28: rmeddis@28: AR(levelNo)=min(ARattenuation); rmeddis@28: MOC(levelNo)=min(MOCattenuation(length(MOCattenuation)/2:end)); rmeddis@28: rmeddis@28: time=dt:dt:dt*size(ICmembraneOutput,2); rmeddis@28: figure(5), subplot(2,2,4) rmeddis@28: plot(time,ICmembraneOutput(2, 1:end),'k') rmeddis@28: ylim([-0.07 0]) rmeddis@28: xlim([0 max(time)]) rmeddis@28: title(['IC ' num2str(leveldB,'%4.0f') 'dB']) rmeddis@28: drawnow rmeddis@28: rmeddis@28: figure(5), subplot(2,2,1) rmeddis@28: plot(20*log10(MOC), 'k'), rmeddis@28: title(' MOC'), ylabel('dB attenuation') rmeddis@28: ylim([-30 0]) rmeddis@28: rmeddis@28: rmeddis@28: end % level rmeddis@28: figure(5), subplot(2,2,1) rmeddis@28: plot(levels,20*log10(MOC), 'k'), rmeddis@28: title(' MOC'), ylabel('dB attenuation') rmeddis@28: ylim([-30 0]) rmeddis@28: xlim([0 max(levels)]) rmeddis@28: rmeddis@28: fprintf('\n') rmeddis@28: toneDuration=2; rmeddis@28: rampDuration=0.004; rmeddis@28: silenceDuration=.02; rmeddis@28: nRepeats=200; % no. of AN fibers rmeddis@28: fprintf('toneDuration %6.3f\n', toneDuration) rmeddis@28: fprintf(' %6.0f AN fibers (repeats)\n', nRepeats) rmeddis@28: fprintf('levels') rmeddis@28: fprintf('%6.2f\t', levels) rmeddis@28: fprintf('\n') rmeddis@28: rmeddis@28: rmeddis@28: % ---------------------------------------------------- display parameters rmeddis@28: rmeddis@28: figure(15), clf rmeddis@28: nRows=2; nCols=2; rmeddis@28: rmeddis@28: % AN rate - level ONSET functions rmeddis@28: subplot(nRows,nCols,1) rmeddis@28: plot(levels,AN_LSRonset,'ro'), hold on rmeddis@28: plot(levels,AN_HSRonset,'ko'), hold off rmeddis@28: ylim([0 1000]), xlim([min(levels) max(levels)]) rmeddis@28: ttl=['tauCa= ' num2str(IHCpreSynapseParams.tauCa)]; rmeddis@28: title( ttl) rmeddis@28: xlabel('level dB SPL'), ylabel('peak rate (sp/s)'), grid on rmeddis@28: text(0, 800, 'AN onset', 'fontsize', 16) rmeddis@28: rmeddis@28: % AN rate - level ADAPTED function rmeddis@28: subplot(nRows,nCols,2) rmeddis@28: plot(levels,AN_LSRsaturated, 'ro'), hold on rmeddis@28: plot(levels,AN_HSRsaturated, 'ko'), hold off rmeddis@28: ylim([0 400]) rmeddis@28: set(gca,'ytick',0:50:300) rmeddis@28: xlim([min(levels) max(levels)]) rmeddis@28: set(gca,'xtick',[levels(1):20:levels(end)]) rmeddis@28: % grid on rmeddis@28: ttl=[ 'spont=' num2str(mean(AN_HSRsaturated(1,:)),'%4.0f')... rmeddis@28: ' sat=' num2str(mean(AN_HSRsaturated(end,1)),'%4.0f')]; rmeddis@28: title( ttl) rmeddis@28: xlabel('level dB SPL'), ylabel ('adapted rate (sp/s)') rmeddis@28: text(0, 340, 'AN adapted', 'fontsize', 16), grid on rmeddis@28: rmeddis@28: % CN rate - level ADAPTED function rmeddis@28: subplot(nRows,nCols,3) rmeddis@28: plot(levels,CNLSRrate, 'ro'), hold on rmeddis@28: plot(levels,CNHSRsaturated, 'ko'), hold off rmeddis@28: ylim([0 400]) rmeddis@28: set(gca,'ytick',0:50:300) rmeddis@28: xlim([min(levels) max(levels)]) rmeddis@28: set(gca,'xtick',[levels(1):20:levels(end)]) rmeddis@28: % grid on rmeddis@28: ttl=[ 'spont=' num2str(mean(CNHSRsaturated(1,:)),'%4.0f') ' sat=' ... rmeddis@28: num2str(mean(CNHSRsaturated(end,1)),'%4.0f')]; rmeddis@28: title( ttl) rmeddis@28: xlabel('level dB SPL'), ylabel ('adapted rate (sp/s)') rmeddis@28: text(0, 350, 'CN', 'fontsize', 16), grid on rmeddis@28: rmeddis@28: % IC rate - level ADAPTED function rmeddis@28: subplot(nRows,nCols,4) rmeddis@28: plot(levels,ICLSRsaturated, 'ro'), hold on rmeddis@28: plot(levels,ICHSRsaturated, 'ko'), hold off rmeddis@28: ylim([0 400]) rmeddis@28: set(gca,'ytick',0:50:300) rmeddis@28: xlim([min(levels) max(levels)]) rmeddis@28: set(gca,'xtick',[levels(1):20:levels(end)]), grid on rmeddis@28: rmeddis@28: rmeddis@28: ttl=['spont=' num2str(mean(ICHSRsaturated(1,:)),'%4.0f') ... rmeddis@28: ' sat=' num2str(mean(ICHSRsaturated(end,1)),'%4.0f')]; rmeddis@28: title( ttl) rmeddis@28: xlabel('level dB SPL'), ylabel ('adapted rate (sp/s)') rmeddis@28: text(0, 350, 'IC', 'fontsize', 16) rmeddis@28: set(gcf,'name',' AN CN IC rate/level') rmeddis@28: rmeddis@28: peakVectorStrength=max(vectorStrength); rmeddis@28: rmeddis@28: fprintf('\n') rmeddis@28: disp('levels vectorStrength') rmeddis@28: fprintf('%3.0f \t %6.4f \n', [levels; vectorStrength']) rmeddis@28: fprintf('\n') rmeddis@28: fprintf('Phase locking, max vector strength=\t %6.4f\n\n',... rmeddis@28: max(vectorStrength)) rmeddis@28: rmeddis@28: allData=[ levels' AN_HSRonset AN_HSRsaturated... rmeddis@28: AN_LSRonset AN_LSRsaturated ... rmeddis@28: CNHSRsaturated CNLSRrate... rmeddis@28: ICHSRsaturated ICLSRsaturated]; rmeddis@28: fprintf('\n levels \tANHSR Onset \tANHSR adapted\tANLSR Onset \tANLSR adapted\tCNHSR\tCNLSR\tICHSR \tICLSR \n'); rmeddis@28: UTIL_printTabTable(round(allData)) rmeddis@28: fprintf('VS (phase locking)= \t%6.4f\n\n',... rmeddis@28: max(vectorStrength)) rmeddis@28: rmeddis@28: UTIL_showStruct(IHC_cilia_RPParams, 'IHC_cilia_RPParams') rmeddis@28: UTIL_showStruct(IHCpreSynapseParams, 'IHCpreSynapseParams') rmeddis@28: UTIL_showStruct(AN_IHCsynapseParams, 'AN_IHCsynapseParams') rmeddis@28: rmeddis@28: fprintf('\n') rmeddis@28: disp('levels vectorStrength') rmeddis@28: fprintf('%3.0f \t %6.4f \n', [levels; vectorStrength']) rmeddis@28: fprintf('\n') rmeddis@28: fprintf('Phase locking, max vector strength= \t%6.4f\n\n',... rmeddis@28: max(vectorStrength)) rmeddis@28: rmeddis@28: allData=[ levels' AN_HSRonset AN_HSRsaturated... rmeddis@28: AN_LSRonset AN_LSRsaturated ... rmeddis@28: CNHSRsaturated CNLSRrate... rmeddis@28: ICHSRsaturated ICLSRsaturated]; rmeddis@28: fprintf('\n levels \tANHSR Onset \tANHSR adapted\tANLSR Onset \tANLSR adapted\tCNHSR\tCNLSR\tICHSR \tICLSR \n'); rmeddis@28: UTIL_printTabTable(round(allData)) rmeddis@28: fprintf('VS (phase locking)= \t%6.4f\n\n',... rmeddis@28: max(vectorStrength)) rmeddis@28: