12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- function [NL_output]=BC_NL(STA_output)
- %[NL_output]=BC_NL(STA_output)
- %this function computes the output nonlinearity (NL) from the linear-nonlinear model (LN-model)
- %for continous voltage signals of bipolar cells (BC).
- %Inputs:
- % STA_output = output of the BC_STA function; containing the
- % STA and stimulus signal
- %
- %Outpus: NL_output = structure containing the output nonlinearity
- %
- %
- % Note: the function is built only for cells recorded without frozen frames.
- % But additional comments are made for cells with frozen frames.
- % code by HS, last modified March 2021
- %-------------------------------------------------------------------------------
- %% 1. convolve zoom STA with stimulus (to get the generator signal)
- %get the linear filter (normalized, see Methods of Schreyer&Gollisch,2021)
- linearFiler=normSTA(STA_output.STA2D_zoom);
- %get stimulus signal
- stimulus=STA_output.stimulus2D_zoom;
- %%if you have frozen frames, only the stimulus signal of the running frames
- %%is used for the convolution. Also the stimulus signal has to be convolved
- %%for each trial of the running noise separately (because it is not a
- %%continous signal -> it was interupted by the frozen noise).
- %do the convolution with the stimulus signal
- generator_signal=filter2(linearFiler,stimulus,'valid');
- %%IMPORTANT: if you have a best spatial and temporal component as described in Point 7
- %in the function BC_STA.m (see Method of Manuscript), this part hast to be done in two lines, e.g.:
- %NL_PredXaxis2=filter2(sp_bestnorm,stimulus,'valid'); %first
- %convolve the spatial dimension
- %generator_signal=filter2(temp_bestnorm,NL_PredXaxis2,'valid'); %then the
- %temporal dimension
- %%Also note, to avoid noise contributions from pixels outside the receptive
- %%field,it is important to cut the STA into a smaller region around the maximum pixel, this
- %%gives a much cleaner NL-> see BC_STA.m and Methods in Schreyer&Gollisch (2021).
-
- %-------------------------------------------------------------------------------
- %% 2. get the y axis of the NL
- %get the voltage responses
- y_axisNL_unsorted=STA_output.membranPotAVG(STA_output.STA_fnbr:end); %sthe first value is at the length of the filter
- %-------------------------------------------------------------------------------
- %% 3. sort the axis and do the binning
- %sort the x axis
- [NL_xAxis,indx]=sort(generator_signal);
- %sort the corresponding y axis
- NL_yAxis=y_axisNL_unsorted(indx);
- %do a binning with percentile to have same amount of data in each bin
- %make 40 bins
- nbrbins=40;
- bins= doBin(NL_xAxis,NL_yAxis,nbrbins);
- %-------------------------------------------------------------------------------
- %% 4. plot the nonlinearity
- figure;
- plot(NL_xAxis,NL_yAxis,'.','color','k') %plot non-binned signal
- hold on;
- plot(bins.NL_xbin,bins.NL_ybin,'o','markerfacecolor','r','markeredgecolor','r') %plot binned signal
- title(['NL: filename: ' STA_output.filename])
- axis tight
- xlabel('generator signal')
- ylabel('voltage (mV)')
- %-------------------------------------------------------------------------------
- %% 5. add variables into the output
- NL_output.NL_xAxis=NL_xAxis;
- % STA_output.STA=STA; %not normalized
- NL_output.NL_yAxis=NL_yAxis;
- NL_output.bins=bins; %for reshapeing to 3D structure if needed
- end
|