rmeddis@29: function testRF rmeddis@29: % testIHC used either for IHC I/O function or receptive field (doReceptiveFields=1) rmeddis@29: rmeddis@29: global experiment method stimulusParameters expGUIhandles rmeddis@29: global inputStimulusParams IHC_ciliaParams rmeddis@29: global IHC_VResp_VivoParams IHCpreSynapseParams AN_IHCsynapseParams rmeddis@29: dbstop if error rmeddis@29: % set(expGUIhandles.pushbuttonStop, 'backgroundColor', [.941 .941 .941]) rmeddis@29: rmeddis@29: addpath (['..' filesep 'MAP'], ['..' filesep 'utilities'], ... rmeddis@29: ['..' filesep 'parameterStore'], ['..' filesep 'wavFileStore'],... rmeddis@29: ['..' filesep 'testPrograms']) rmeddis@29: rmeddis@29: targetFrequency=stimulusParameters.targetFrequency(1); rmeddis@29: rmeddis@29: sampleRate=50000; rmeddis@29: doReceptiveFields=1; rmeddis@29: rmeddis@29: toneDuration=.05; rmeddis@29: rampDuration=0.004; rmeddis@29: silenceDuration=.02; rmeddis@29: rmeddis@29: nRepeats=100; % no. of AN fibers rmeddis@29: rmeddis@29: plotGraphsForIHC=1; rmeddis@29: % number of MacGregor units is set in the parameter file. rmeddis@29: rmeddis@29: if doReceptiveFields rmeddis@29: % show all receptive field rmeddis@29: frequencies=targetFrequency* [ 0.5 0.7 0.9 1 1.1 1.3 1.6]; rmeddis@29: levels=0:20:80; nLevels=length(levels); rmeddis@29: figure(14), clf rmeddis@29: figure(15), clf rmeddis@29: else rmeddis@29: % show only I/O function at BF rmeddis@29: frequencies=targetFrequency; rmeddis@29: levels=-20:10:90; rmeddis@29: % levels=10:.25:13; rmeddis@29: % levels=-20:1:-15 rmeddis@29: nLevels=length(levels); rmeddis@29: % figure(13), clf, rmeddis@29: % set (gcf, 'name', ['IHC/AN input/output' num2str(AN_IHCsynapseParams.numFibers) ' repeats']) rmeddis@29: % drawnow rmeddis@29: end rmeddis@29: nFrequencies=length(frequencies); rmeddis@29: rmeddis@29: IHC_RP_peak=zeros(nLevels,nFrequencies); rmeddis@29: IHC_RP_min=zeros(nLevels,nFrequencies); rmeddis@29: IHC_RP_dc=zeros(nLevels,nFrequencies); rmeddis@29: AN_HSRonset=zeros(nLevels,nFrequencies); rmeddis@29: AN_HSRsaturated=zeros(nLevels,nFrequencies); rmeddis@29: AN_LSRonset=zeros(nLevels,nFrequencies); rmeddis@29: AN_LSRsaturated=zeros(nLevels,nFrequencies); rmeddis@29: CNLSRsaturated=zeros(nLevels,nFrequencies); rmeddis@29: CNHSRsaturated=zeros(nLevels,nFrequencies); rmeddis@29: ICHSRsaturated=zeros(nLevels,nFrequencies); rmeddis@29: ICLSRsaturated=zeros(nLevels,nFrequencies); rmeddis@29: rmeddis@29: rmeddis@29: levelNo=0; PSTHplotCount=0; rmeddis@29: for leveldB=levels rmeddis@29: fprintf('%4.0f\t', leveldB) rmeddis@29: levelNo=levelNo+1; rmeddis@29: amp=28e-6*10^(leveldB/20); rmeddis@29: rmeddis@29: freqNo=0; rmeddis@29: for frequency=frequencies rmeddis@29: rmeddis@29: paramFunctionName=['method=MAPparams' experiment.name ... rmeddis@29: '(' num2str(targetFrequency) ');' ]; rmeddis@29: eval(paramFunctionName); % read parameters afresh each pass rmeddis@29: rmeddis@29: dt=method.dt; rmeddis@29: time=dt:dt:toneDuration; rmeddis@29: rampTime=dt:dt:rampDuration; rmeddis@29: ramp=[0.5*(1+cos(2*pi*rampTime/(2*rampDuration)+pi)) ones(1,length(time)-length(rampTime))]; rmeddis@29: ramp=ramp.*fliplr(ramp); rmeddis@29: rmeddis@29: silence=zeros(1,round(silenceDuration/dt)); rmeddis@29: rmeddis@29: toneStartptr=length(silence)+1; rmeddis@29: toneMidptr=toneStartptr+round(toneDuration/(2*dt)) -1; rmeddis@29: toneEndptr=toneStartptr+round(toneDuration/dt) -1; rmeddis@29: rmeddis@29: % create signal (leveldB/ frequency) rmeddis@29: freqNo=freqNo+1; rmeddis@29: inputSignal=amp*sin(2*pi*frequency'*time); rmeddis@29: inputSignal= ramp.*inputSignal; rmeddis@29: inputSignal=[silence inputSignal silence]; rmeddis@29: rmeddis@29: if doReceptiveFields % receptive field rmeddis@29: method.plotGraphs= 0; % plot only PSTHs rmeddis@29: else rmeddis@29: method.plotGraphs= plotGraphsForIHC; % show progress rmeddis@29: end rmeddis@29: rmeddis@29: targetChannelNo=1; rmeddis@29: rmeddis@29: % force parameters rmeddis@29: % the number of AN fibers at each BF rmeddis@29: AN_IHCsynapseParams.numFibers= nRepeats; rmeddis@29: AN_IHCsynapseParams. mode= 'spikes'; rmeddis@29: AN_IHCsynapseParams.plotSynapseContents=0; rmeddis@29: AN_IHCsynapseParams.PSTHbinWidth=.001; rmeddis@29: rmeddis@29: method.DRNLSave=1; rmeddis@29: method.IHC_cilia_RPSave=1; rmeddis@29: method.PSTHbinWidth=1e-3; % useful 1-ms default for all PSTHs rmeddis@29: method.AN_IHCsynapseSave=1; rmeddis@29: method.MacGregorMultiSave=1; rmeddis@29: method.MacGregorSave=1; rmeddis@29: method.dt=dt; rmeddis@29: rmeddis@29: moduleSequence=[1:8]; rmeddis@29: rmeddis@38: global dtSpikes ARAttenuation TMoutput OMEoutput ... rmeddis@29: DRNLoutput IHC_cilia_output IHCrestingCiliaCond IHCrestingV... rmeddis@32: IHCoutput ANprobRateOutput ANoutput savePavailable ANtauCas ... rmeddis@29: CNoutput ICoutput ICmembraneOutput ICfiberTypeRates MOCattenuation rmeddis@29: rmeddis@29: AN_spikesOrProbability='spikes'; rmeddis@29: AN_spikesOrProbability='probability'; rmeddis@29: MAPparamsName='Normal'; rmeddis@29: rmeddis@29: MAP1_14(inputSignal, 1/dt, targetFrequency, ... rmeddis@29: MAPparamsName, AN_spikesOrProbability); rmeddis@29: rmeddis@29: % RP rmeddis@29: IHC_RPData=IHC_cilia_output; rmeddis@29: IHC_RPData=IHCoutput(targetChannelNo,:); rmeddis@29: IHC_RP_peak(levelNo,freqNo)=max(IHC_RPData(toneStartptr:toneEndptr)); rmeddis@29: IHC_RP_min(levelNo,freqNo)=min(IHC_RPData(toneStartptr:toneEndptr)); rmeddis@29: IHC_RP_dc(levelNo,freqNo)=mean(IHC_RPData(toneStartptr:toneEndptr)); rmeddis@29: rmeddis@29: % AN next rmeddis@29: AN_IHCsynapseAllData=ANoutput; rmeddis@29: method.PSTHbinWidth=0.001; rmeddis@29: rmeddis@32: nTaus=length(ANtauCas); rmeddis@29: numANfibers=size(ANoutput,1); rmeddis@29: numLSRfibers=numANfibers/nTaus; rmeddis@29: rmeddis@29: %LSR (same as HSR if no LSR fibers present) rmeddis@29: channelPtr1=(targetChannelNo-1)*numANfibers+1; rmeddis@29: channelPtr2=channelPtr1+numANfibers-1; rmeddis@29: LSRspikes=AN_IHCsynapseAllData(channelPtr1:channelPtr2,:); rmeddis@29: method.dt=method.AN_IHCsynapsedt; rmeddis@29: PSTH=UTIL_PSTHmaker(LSRspikes, method); rmeddis@29: PSTH=sum(PSTH,1); % sum across fibers (HSR only) rmeddis@29: PSTHStartptr=round(silenceDuration/method.PSTHbinWidth)+1; rmeddis@29: PSTHMidptr=PSTHStartptr+round(toneDuration/(2*method.PSTHbinWidth)) -1; rmeddis@29: PSTHEndptr=PSTHStartptr+round(toneDuration/method.PSTHbinWidth) -1; rmeddis@29: AN_LSRonset(levelNo,freqNo)=max(max(PSTH))/(method.PSTHbinWidth*method.numANfibers); rmeddis@29: AN_LSRsaturated(levelNo,freqNo)=sum(PSTH(PSTHMidptr:PSTHEndptr))/(method.numANfibers*toneDuration/2); rmeddis@29: rmeddis@29: % HSR rmeddis@29: channelPtr1=numLSRfibers+(targetChannelNo-1)*method.numANfibers+1; rmeddis@29: channelPtr2=channelPtr1+method.numANfibers-1; rmeddis@29: HSRspikes=AN_IHCsynapseAllData(channelPtr1:channelPtr2,:); rmeddis@29: method.dt=method.AN_IHCsynapsedt; rmeddis@29: PSTH=UTIL_PSTHmaker(HSRspikes, method); rmeddis@29: PSTH=sum(PSTH,1); % sum across fibers (HSR only) rmeddis@29: PSTHStartptr=round(silenceDuration/method.PSTHbinWidth)+1; rmeddis@29: PSTHMidptr=PSTHStartptr+round(toneDuration/(2*method.PSTHbinWidth)) -1; rmeddis@29: PSTHEndptr=PSTHStartptr+round(toneDuration/method.PSTHbinWidth) -1; rmeddis@29: AN_HSRonset(levelNo,freqNo)=max(max(PSTH))/(method.PSTHbinWidth*method.numANfibers); rmeddis@29: AN_HSRsaturated(levelNo,freqNo)=sum(PSTH(PSTHMidptr:PSTHEndptr))/(method.numANfibers*toneDuration/2); rmeddis@29: [cvANHSR, cvTimes, allTimeStamps, allISIs]= UTIL_CV(HSRspikes, method.AN_IHCsynapsedt); rmeddis@29: rmeddis@29: PSTHplotCount=PSTHplotCount+1; rmeddis@29: if doReceptiveFields % receptive field for HSR only rmeddis@29: figure(14), set(gcf,'name','AN') rmeddis@29: plotReceptiveFields(method, PSTH, PSTHplotCount, levels, frequencies) rmeddis@29: ylim([0 method.numANfibers]) rmeddis@29: xlabel(['CV= ' num2str(max(cvANHSR),'%4.2f')],'fontsize',8) rmeddis@29: end % doReceptiveFields rmeddis@29: rmeddis@29: % CN rmeddis@29: MacGregorMultiAllData=method.MacGregorMultiData; rmeddis@29: numLSRfibers=method.McGMultinNeuronsPerBF*length(method.nonlinCF)* (nTaus-1); rmeddis@29: rmeddis@29: %LSR (same as HSR if no LSR fibers present) rmeddis@29: channelPtr1=(targetChannelNo-1)*method.McGMultinNeuronsPerBF+1; rmeddis@29: channelPtr2=channelPtr1+method.McGMultinNeuronsPerBF-1; rmeddis@29: MacGregorMultiLSRspikes=MacGregorMultiAllData(channelPtr1:channelPtr2,:); rmeddis@29: method.dt=method.MacGregorMultidt; rmeddis@29: PSTH=UTIL_PSTHmaker(MacGregorMultiLSRspikes, method); rmeddis@29: PSTH=sum(PSTH,1); % sum across fibers (HSR only) rmeddis@29: PSTHStartptr=round(silenceDuration/method.PSTHbinWidth)+1; rmeddis@29: PSTHMidptr=PSTHStartptr+round(toneDuration/(2*method.PSTHbinWidth)) -1; rmeddis@29: PSTHEndptr=PSTHStartptr+round(toneDuration/method.PSTHbinWidth) -1; rmeddis@29: CNLSRsaturated(levelNo,freqNo)=sum(PSTH(PSTHMidptr:PSTHEndptr)); rmeddis@29: CNLSRsaturated(levelNo,freqNo)=CNLSRsaturated(levelNo,freqNo)... rmeddis@29: /((toneDuration/2)*method.McGMultinNeuronsPerBF); rmeddis@29: rmeddis@29: %HSR rmeddis@29: channelPtr1=numLSRfibers+(targetChannelNo-1)*method.McGMultinNeuronsPerBF+1; rmeddis@29: channelPtr2=channelPtr1+method.McGMultinNeuronsPerBF-1; rmeddis@29: MacGregorMultiHSRspikes=MacGregorMultiAllData(channelPtr1:channelPtr2,:); rmeddis@29: method.dt=method.MacGregorMultidt; rmeddis@29: PSTH=UTIL_PSTHmaker(MacGregorMultiHSRspikes, method); rmeddis@29: PSTH=sum(PSTH,1); % sum across fibers (HSR only) rmeddis@29: PSTHStartptr=round(silenceDuration/method.PSTHbinWidth)+1; rmeddis@29: PSTHMidptr=PSTHStartptr+round(toneDuration/(2*method.PSTHbinWidth)) -1; rmeddis@29: PSTHEndptr=PSTHStartptr+round(toneDuration/method.PSTHbinWidth) -1; rmeddis@29: CNHSRsaturated(levelNo,freqNo)=sum(PSTH(PSTHMidptr:PSTHEndptr)); rmeddis@29: CNHSRsaturated(levelNo,freqNo)=CNHSRsaturated(levelNo,freqNo)... rmeddis@29: /((toneDuration/2)*method.McGMultinNeuronsPerBF); rmeddis@29: [cvMMHSR, cvTimes, allTimeStamps, allISIs]= UTIL_CV(MacGregorMultiHSRspikes, method.MacGregorMultidt); rmeddis@29: rmeddis@29: if doReceptiveFields % receptive field rmeddis@29: figure(15), set(gcf,'name','CN HSR input') rmeddis@29: plotReceptiveFields(method, PSTH, PSTHplotCount, levels, frequencies) rmeddis@29: ylim([0 method.McGMultinNeuronsPerBF]) rmeddis@29: xlabel(['CV= ' num2str(max(cvMMHSR),'%4.2f')],'fontsize',8) rmeddis@29: end rmeddis@29: rmeddis@29: MacGregorAllData=method.MacGregorData; rmeddis@29: numLSRfibers=length(method.nonlinCF)* (nTaus-1); rmeddis@29: rmeddis@29: %LSR (same as HSR if no LSR fibers present) rmeddis@29: channelPtr1=targetChannelNo; rmeddis@29: MacGregorLSR=MacGregorAllData(channelPtr1,:); rmeddis@29: method.dt=method.MacGregordt; rmeddis@29: PSTH=UTIL_PSTHmaker(MacGregorLSR, method); rmeddis@29: PSTHStartptr=round(silenceDuration/method.PSTHbinWidth)+1; rmeddis@29: PSTHMidptr=PSTHStartptr+round(toneDuration/(2*method.PSTHbinWidth)) -1; rmeddis@29: PSTHEndptr=PSTHStartptr+round(toneDuration/method.PSTHbinWidth) -1; rmeddis@29: ICLSRsaturated(levelNo,freqNo)=sum(PSTH(PSTHMidptr:PSTHEndptr)); rmeddis@29: ICLSRsaturated(levelNo,freqNo)=ICLSRsaturated(levelNo,freqNo)/(toneDuration/2); rmeddis@29: rmeddis@29: %LSR (same as HSR if no LSR fibers present) rmeddis@29: channelPtr1=numLSRfibers+targetChannelNo; rmeddis@29: MacGregorHSR=MacGregorAllData(channelPtr1,:); rmeddis@29: method.dt=method.MacGregordt; rmeddis@29: PSTH=UTIL_PSTHmaker(MacGregorHSR, method); rmeddis@29: PSTHStartptr=round(silenceDuration/method.PSTHbinWidth)+1; rmeddis@29: PSTHMidptr=PSTHStartptr+round(toneDuration/(2*method.PSTHbinWidth)) -1; rmeddis@29: PSTHEndptr=PSTHStartptr+round(toneDuration/method.PSTHbinWidth) -1; rmeddis@29: ICHSRsaturated(levelNo,freqNo)=sum(PSTH(PSTHMidptr:PSTHEndptr)); rmeddis@29: ICHSRsaturated(levelNo,freqNo)=ICHSRsaturated(levelNo,freqNo)/(toneDuration/2); rmeddis@29: [cvICHSR, cvTimes, allTimeStamps, allISIs]= UTIL_CV(MacGregorHSR, method.MacGregordt); rmeddis@29: rmeddis@29: % if doReceptiveFields % receptive field rmeddis@29: % figure(16), set(gcf,'name','IC HSR input') rmeddis@29: % plotReceptiveFields(method, PSTH, PSTHplotCount, levels, frequencies) rmeddis@29: % ylim([0 method.McGMultinNeuronsPerBF]) rmeddis@29: % xlabel(['CV= ' num2str(max(cvICHSR),'%4.2f')],'fontsize',8) rmeddis@29: % end rmeddis@29: end % frequency rmeddis@29: end % level rmeddis@29: fprintf('\n') rmeddis@29: toneDuration=2; rmeddis@29: rampDuration=0.004; rmeddis@29: silenceDuration=.02; rmeddis@29: nRepeats=200; % no. of AN fibers rmeddis@29: fprintf('toneDuration %6.3f\n', toneDuration) rmeddis@29: fprintf(' %6.0f AN fibers (repeats)\n', nRepeats) rmeddis@29: fprintf('levels') rmeddis@29: fprintf('%6.2f\t', levels) rmeddis@29: fprintf('\n') rmeddis@29: rmeddis@29: rmeddis@29: % ---------------------------------------------------------- display parameters rmeddis@29: disp(['parameter file was: ' experiment.name]) rmeddis@29: fprintf('\n') rmeddis@29: UTIL_showStruct(IHC_VResp_VivoParams, 'IHC_cilia_RPParams') rmeddis@29: UTIL_showStruct(IHCpreSynapseParams, 'IHCpreSynapseParams') rmeddis@29: UTIL_showStruct(AN_IHCsynapseParams, 'AN_IHCsynapseParams') rmeddis@29: rmeddis@29: rmeddis@29: rmeddis@29: function plotReceptiveFields(method, PSTH, PSTHplotCount, levels, frequencies) rmeddis@29: rmeddis@29: % show PSTH for each level/frequency combination rmeddis@29: nLevels=length(levels); rmeddis@29: nFrequencies=length(frequencies); rmeddis@29: rmeddis@29: PSTHtime=method.PSTHbinWidth:method.PSTHbinWidth:method.PSTHbinWidth*length(PSTH); rmeddis@29: subplot(nLevels,nFrequencies,PSTHplotCount) rmeddis@29: bar(PSTHtime, PSTH) rmeddis@29: xlim([0 max(PSTHtime)]) rmeddis@29: % write axis labels only at left and bottom rmeddis@29: if PSTHplotCount< (nLevels-1) * nFrequencies+1 rmeddis@29: set(gca,'xticklabel',[]) rmeddis@29: end rmeddis@29: if ~isequal(mod(PSTHplotCount,nFrequencies),1) rmeddis@29: set(gca,'yticklabel',[]) rmeddis@29: else rmeddis@29: ylabel([num2str(levels(round(PSTHplotCount/nFrequencies) +1)) ' dB']) rmeddis@29: end rmeddis@29: % add titles only on top row rmeddis@29: if PSTHplotCount<=nFrequencies rmeddis@29: title([num2str(frequencies(PSTHplotCount)) ' Hz']) rmeddis@29: end