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