CB-Frequency-Coding-of-Motor-Kinematics / Chirp / A_EP_Nev_20180815_vb5_NEX_v4.m
A_EP_Nev_20180815_vb5_NEX_v4.m
Raw
%% Calculate evoked single-unit timepoints in binned time intervals
% Version vb5_NEX_v3: add function to import ChirpWave detection points.
% Version vb5_NEX_v2: option to remove last trial of trigger (catchpoint)
% Version vb5: compatible with OpenEphys
% Raw data can be calculated with A_NSx_EP_20180810_v2b.m or v2a.m file
% version 4: change Y axis of mean plot to Hz 
% Sorted with BOSS first;
%load NEV file for sorted event
%load NS4 file 
clear all, close all;
%% Input Parameters %%
DataSource=1; % 1: BlockRock; 2: OpenEphys 
NEVtrigger=2; % if 2, load EP detection points from EPindex_ChirpWave.mat.
              % if 1, use sorted channel unit as EP trigger point,
              % if 0, use analog input channel as trigger point
  StimID=136; % define the channel of trigger (Sorted channel)
  StimUnitID=1; % define sorted unit ID for trigger
  NEVchannels=[1 2 3 4 5 6 9 9 12 13 14 15 16 136]; % Can be multiple channels, matrix length match NEVunits
  NEVunits=[1 1 1 1 1 1 1 2 1 1 1 1 1 1]; % Corresponding detected units of each channel, can be more than one unit in each channel
  ExtInt=[-50,200]; % in ms, Interval to extra, negative means before the catch point 
  Bin=10; % in ms, devided ExtInt into sections NOTE!!!(ExtInt(2)-ExtInt(1))/Bin should always be scalar.
RemoveLastTrial=0; % if==1 means remove last trial; keep =0 in most case
PlotEPdetection=1; % if==1, plot EP detection points in one EP graph
%%%%%%%%% Put input parameters into structure %%%%%%%%%%%%%
save temp.mat;
a_InputParameters=load('temp.mat');
delete temp.mat;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Main function%% 
%% open NEV file %%
NEV=F_openNEX;
%% NSx SourceFile identification %%
 % identify the Sourefile for NEV offline Sorting
if DataSource==1
NSx=openNSx;
SourceFile=[NSx.MetaTags.Filename NSx.MetaTags.FileExt];
a_InputParameters.SourceFile=SourceFile;
% check if the .nev & .nsx file matched
 if NSx.MetaTags.DataPoints-1<NEV.MetaTags.DataDuration<NSx.MetaTags.DataPoints+1 &...
     NEV.MetaTags.Filename==NSx.MetaTags.Filename;
     if NSx.MetaTags.FileExt=='.ns6';
     else % correct the error of NEV if not processed by .ns6 file.
        NEV.MetaTags.SampleRes=NSx.MetaTags.SamplingFreq;
        NEV.MetaTags.DataDurationSec=NEV.MetaTags.DataDuration/NEV.MetaTags.SampleRes;
     end
 else
    error('NEV & NSx file mismatch');
 end
end
if DataSource==2
   [GetFileName GetFilePath]=uigetfile('EphysOutputOFS*.mat'); % get filename and path
   ValidFileName=GetFileName;
   ValidFileName(end-3:end)=[];
   if NEV.MetaTags.Filename==ValidFileName
   else error('NEV & EphysOutputOFS file mismatch');
   end
end
fs=double(NEV.MetaTags.SampleRes);
%% Stimulation (trigger) identification
if NEVtrigger==1;
   A=find(NEV.Data.Spikes.Electrode==StimID); % find spikes index that match the selected ChannelID
   B=find(NEV.Data.Spikes.Unit(A)==StimUnitID); % find spikes index that match the sorted UnitID. 
   CatchPoint=NEV.Data.Spikes.TimeStamp(A(B)); % find spikes taht match the sorted channel-unit.
end

if NEVtrigger==2;
    a_ChirpParameters=load('EPindex_ChirpWave.mat','a_InputParameters');
    load('EPindex_ChirpWave.mat','EPindex');
    CatchPoint=EPindex;
    clear EPindex;
    if strcmp(a_ChirpParameters.a_InputParameters.SourceFile,SourceFile)==0;
        errordlg('FileName of EP and Chirp not matched','File Error');
        return
    end
end

%% remove last trial
if RemoveLastTrial==1;
    CatchPoint=CatchPoint(1:end-1);
end
%% Detect 
  ExtEdges(:,1)=CatchPoint'+ExtInt(1)*fs/1000;
  ExtEdges(:,2)=CatchPoint'+ExtInt(2)*fs/1000;
%% Create Detection points of each unit %%
EPplotXY=cell(1,length(NEVunits));
for i=length(NEVunits):-1:1;
    SU_Name(i)={sprintf('Chan%d-U%d',NEVchannels(i),NEVunits(i))};
    SUpoints(i,:)=zeros(1,NEV.MetaTags.DataDuration);
    C=find(NEV.Data.Spikes.Electrode==NEVchannels(i)); % find spikes index that match the selected ChannelID
    D=find(NEV.Data.Spikes.Unit(C)==NEVunits(i)); % find spikes index that match the sorted UnitID. 
    E=NEV.Data.Spikes.TimeStamp(C(D)); % find spikes that match the sorted channel-unit.
    SUpoints(i,E)=1;
    for j=length(CatchPoint):-1:1;
        EP_SUpoints(j,:,i)=SUpoints(i,ExtEdges(j,1):ExtEdges(j,2));
    end
    [Y,X]=find(EP_SUpoints(:,:,i)==1); % Y:trials; X:timestamps
    X=ExtInt(1)+(X-1)*1000/fs; % X: timestamps in ms
    EPplotXY{i}=[X,Y]; 
end


if PlotEPdetection==1
  i=length(NEVunits)+1;
  SUpoints(i,CatchPoint)=1;
    for j=length(CatchPoint):-1:1;
        EP_SUpoints(j,:,i)=SUpoints(i,ExtEdges(j,1):ExtEdges(j,2));
    end
    [Y,X]=find(EP_SUpoints(:,:,i)==1); % Y:trials; X:timestamps
    X=ExtInt(1)+(X-1)*1000/fs; % X: timestamps in ms
    EPplotXY{i}=[X,Y]; 
    SU_Name{i}=['EPpoints'];
end
EP_SUmean=squeeze(mean(EP_SUpoints,1));

%Process binned data
BinEdges=1:Bin*fs/1000:([ExtInt(2)-ExtInt(1)]*fs/1000+1);
BinNumber=(ExtInt(2)-ExtInt(1))/Bin;
for k=BinNumber:-1:1;
    EP_SUmeanBinHz(k,:)=sum(EP_SUmean([BinEdges(k):BinEdges(k+1)-1],:))*1000/Bin;
end



%% Plot %%%%%%%%%%%%%%%%% 
%%Scatter plot for EP 
for i=1:length(NEVunits);
    
   AA=EPplotXY{i};
figure(i);
    h2=axes;
    h11=scatter(AA(:,1),AA(:,2));
    axis([ExtInt(1),ExtInt(2),0,inf]);
    set(h2,'ydir','reverse');
    set(h11,'Marker','.');
    xlabel('ms');
    ylabel('trials');
    title([sprintf('Chan%d-U%d  NEV-',NEVchannels(i),NEVunits(i)),SourceFile]);
    saveas(i,sprintf('EPrawNEV_Chan%d-U%d.fig',NEVchannels(i),NEVunits(i)));
    saveas(i,sprintf('EPrawNEV_Chan%d-U%d.jpg',NEVchannels(i),NEVunits(i)));
end

if PlotEPdetection==1
  i=length(NEVunits)+1;
  AA=EPplotXY{i};
figure(i);
    h2=axes;
    h11=scatter(AA(:,1),AA(:,2));
    axis([ExtInt(1),ExtInt(2),0,inf]);
    set(h2,'ydir','reverse');
    set(h11,'Marker','.');
    xlabel('ms');
    ylabel('trials');
    title(['EPpoints NEV-',SourceFile]);
    saveas(i,['EPrawNEV_EPpoints.fig']);
    saveas(i,['EPrawNEV_EPpoints.jpg']);
end

%%Mean plots
figure(i+1);
T_vec=ExtInt(1):1000/fs:ExtInt(2);
h21=plot(T_vec,EP_SUmean);
title(['EPmean NEV-' ,SourceFile]);
xlabel('Time (ms)'); 
ylabel('count');
axis([ExtInt(1),ExtInt(2),0,0.2]);
legend(SU_Name);
set(h21(1),'Color',[0,0,1]); % Set the line 1 by RGB color [0 0 1] (blue)
saveas(i+1,'EPmeanNEVraw.fig');
saveas(i+1,'EPmeanNEVraw.jpg');

%plot binned data
figure(i+2);
T_bin=ExtInt(1):Bin:[ExtInt(2)-Bin];
h22=plot(T_bin,EP_SUmeanBinHz);
title([sprintf('EP bin%dms NEV-',Bin) ,SourceFile]);
xlabel('Time (ms)'); 
ylabel('Frequency (Hz)');
%axis(EPaxis);
legend(SU_Name);
set(h22(1),'Color',[0,0,1]); % Set the line 1 by RGB color [0 0 1] (blue)
saveas(i+2,'EPmeanNEV.fig');
saveas(i+2,'EPmeanNEV.jpg');

%% Save data
a_EP_NEV.NEV=NEV;
a_EP_NEV.a_InputParameters=a_InputParameters;
a_EP_NEV.ExtEdges=ExtEdges;
a_EP_NEV.EP_SUpoints=EP_SUpoints;
a_EP_NEV.EP_SUmean=EP_SUmean;
a_EP_NEV.EP_SUmeanBinHz=EP_SUmeanBinHz;
a_EP_NEV.T_vec=T_vec;
a_EP_NEV.T_bin=T_bin;
save('EP_NEVresults.mat','a_EP_NEV','-v7.3');