function [C,phi,S12,confC,phierr,Cerr]=cohmathelper(J,err,Nsp)
% Helper function called by coherency matrix computations.
%
% Usage: [C,phi,S12,confC,phierr,Cerr]=cohmathelper(J,err,Nsp)
% Inputs:
% J : Fourier transforms of data
% err : [0 p] or 0 for no errors; [1 p] for theoretical confidence level,
% [2 p] for Jackknife (p - p value)
% Nsp : pass the number of spikes in each channel if finite size corrections are desired
%
% Outputs:
%
% C : coherence
% phi : phase of coherency
% S12 : cross spectral matrix
% confC : confidence level for coherency - only for err(1)>=1
% phierr - standard deviation for phi (note that the routine gives phierr as phierr(1,...)
% and phierr(2,...) in order to incorporate Jackknife (eventually).
% Currently phierr(1,...)=phierr(2,...). Note that phi + 2 phierr(1,...) and phi -2
% phierr(2,...) will give 95% confidence bands for phi - only for err(1)>=1
% Cerr : error bars for coherency (only for Jackknife estimates)-only for err(1)=2
%
errtype=err(1);
trialave=0;
[nf,K,Ch]=size(J);
clear K
confC=zeros(Ch,Ch);
C=zeros(nf,Ch,Ch);
S12=zeros(nf,Ch,Ch);
phi=zeros(nf,Ch,Ch);
phierr=zeros(2,nf,Ch,Ch);
if errtype==2; Cerr=zeros(2,nf,Ch,Ch);end;
for ch1=1:Ch;
J1=squeeze(J(:,:,ch1));
C(1:nf,ch1,ch1)=1;
phi(1:nf,ch1,ch1)=0;
% if errtype==2;
% phierr(1:nf,ch1,ch1)=0;
% Cerr(1:2,1:nf,ch1,ch1)=0;
% elseif errtype==1
% phierr(1:2,1:nf,ch1,ch1)=0;
% end;
s1=squeeze(mean(conj(J1).*J1,2));
for ch2=1:ch1-1;
J2=squeeze(J(:,:,ch2));
s12=squeeze(mean(conj(J1).*J2,2));
s2=squeeze(mean(conj(J2).*J2,2));
C12=s12./sqrt(s1.*s2);
C(:,ch1,ch2)=abs(C12);
C(:,ch2,ch1)=C(:,ch1,ch2);
phi(:,ch1,ch2)=angle(C12);
phi(:,ch2,ch1)=phi(:,ch1,ch2);
S12(:,ch1,ch2)=s12;
S12(:,ch2,ch1)=S12(:,ch1,ch2);
if errtype==2
if nargin<3;
[conf,phie,Ce]=coherr(abs(C12),J1,J2,err,trialave);
else
[conf,phie,Ce]=coherr(abs(C12),J1,J2,err,trialave,Nsp(ch1),Nsp(ch2));
end
confC(ch1,ch2)=conf;
phierr(1,:,ch1,ch2)=phie;phierr(2,:,ch1,ch2)=phie;
Cerr(1,:,ch1,ch2)=Ce(1,:);
Cerr(2,:,ch1,ch2)=Ce(2,:);
confC(ch2,ch1)=conf;
phierr(1,:,ch2,ch1)=phie;phierr(2,:,ch2,ch1)=phie;
Cerr(:,:,ch2,ch1)=Ce;
elseif errtype==1
if nargin<3;
[conf,phie]=coherr(abs(C12),J1,J2,err,trialave);
else
[conf,phie]=coherr(abs(C12),J1,J2,err,trialave,Nsp(ch1),Nsp(ch2));
end
confC(ch1,ch2)=conf;
phierr(1,:,ch1,ch2)=phie;phierr(2,:,ch1,ch2)=phie;
confC(ch2,ch1)=conf;
phierr(1,:,ch2,ch1)=phie;phierr(2,:,ch2,ch1)=phie;
end;
end;
end;