% This function generates a connection matrix for the FS neurons
function [gapSrc, gapDest, conMat] = makeFSconnectionMatrixOnlySecWrappedSetNGJ(nX,nY,nZ,nGJ)
nTot = nX*nY*nZ;
if(nGJ == 0)
gapSrc = [];
gapDest = [];
conMat = sparse(nTot,nTot);
return
end
plotFlag = 0;
%clear all, close all
avgDist = 150e-6;
lenX = nX*avgDist;
lenY = nY*avgDist;
lenZ = nZ*avgDist;
[xCoord,yCoord,zCoord] = ...
meshgrid((1:nX)*avgDist,(1:nY)*avgDist,(1:nZ)*avgDist);
xdist = abs(repmat(xCoord(:),1,nTot) - repmat(xCoord(:)',nTot,1));
ydist = abs(repmat(yCoord(:),1,nTot) - repmat(yCoord(:)',nTot,1));
zdist = abs(repmat(zCoord(:),1,nTot) - repmat(zCoord(:)',nTot,1));
xdist = min(xdist, lenX-xdist);
ydist = min(ydist, lenY-ydist);
zdist = min(zdist, lenZ-zdist);
distMat = sqrt(xdist.^2 + ydist.^2 + zdist.^2);
% With the current implementation we just want to set diagonal to zero
% not the entire lower triangular
distMat(find(diag(diag(distMat)))) = inf;
% Setting R = 100e-6 for primary dendrite gap junctions
% R = 248e-6 for secondary denrites...
R = 150e-6; %100e-6; %248e-6;
distMask = (0 < distMat & distMat <= 2*R);
% Volume of intersection between two identical spheres
% http://mathworld.wolfram.com/Sphere-SphereIntersection.html
Vint = (pi/12) * (4*R + distMat).*(2*R - distMat).^2;
Vint(~distMask) = 0;
% We want to specify how many gap junctions the neurons
% should have on average, then have them distributed randomly, based
% on the overlapping volumes.
%
avgNumCons = nGJ;
% Calculate the cumulative probability distribution
Vprob = cumsum(Vint,2);
VprobN = repmat(Vprob(:,end),1,size(Vprob,2));
Vprob = Vprob./VprobN;
connectionList = [];
connectionMask = zeros(size(Vprob));
for i=1:ceil(avgNumCons/2)
% We should place avgNumCons gap junctions on each neuron (on average)
% since gap junctions are connections between two neurons, we only
% need to add avgNumCons/2.
for j=1:size(Vprob,1)
idx = find(rand < Vprob(j,:),1);
connectionList = [connectionList; j, idx];
connectionMask(j,idx) = connectionMask(j,idx) + 1;
end
end
conMat = sparse(connectionMask);
clear connectionMask
%keyboard
%spy(connectionMask)
primGJloc{1} = 'primdend1';
primGJloc{2} = 'primdend2';
primGJloc{3} = 'primdend3';
secGJloc{1} = 'secdend1';
secGJloc{2} = 'secdend1/sec_dend2';
secGJloc{3} = 'secdend1/sec_dend3';
secGJloc{4} = 'secdend1/sec_dend4';
secGJloc{5} = 'secdend2';
secGJloc{6} = 'secdend2/sec_dend2';
secGJloc{7} = 'secdend2/sec_dend3';
secGJloc{8} = 'secdend2/sec_dend4';
secGJloc{9} = 'secdend3';
secGJloc{10} = 'secdend3/sec_dend2';
secGJloc{11} = 'secdend3/sec_dend3';
secGJloc{12} = 'secdend3/sec_dend4';
secGJloc{13} = 'secdend4';
secGJloc{14} = 'secdend4/sec_dend2';
secGJloc{15} = 'secdend4/sec_dend3';
secGJloc{16} = 'secdend4/sec_dend4';
secGJloc{17} = 'secdend5';
secGJloc{18} = 'secdend5/sec_dend2';
secGJloc{19} = 'secdend5/sec_dend3';
secGJloc{20} = 'secdend5/sec_dend4';
secGJloc{21} = 'secdend6';
secGJloc{22} = 'secdend6/sec_dend2';
secGJloc{23} = 'secdend6/sec_dend3';
secGJloc{24} = 'secdend6/sec_dend4';
innerSecGJloc{1} = 'secdend1';
innerSecGJloc{2} = 'secdend2';
innerSecGJloc{3} = 'secdend3';
innerSecGJloc{4} = 'secdend4';
innerSecGJloc{5} = 'secdend5';
innerSecGJloc{6} = 'secdend6';
% Are the neurons within 2x the prim dendrite distance?
% maxPrimDist = 2*100e-6;
%[srcIdx,destIdx] = find(connectionMask);
srcIdx = connectionList(:,1);
destIdx = connectionList(:,2);
clear connectionMask
for i=1:length(srcIdx)
% % If the neurons are close to each other connect to primary dendrite
% % otherwise connect on secondary dendrite.
% if(distMat(srcIdx(i),destIdx(i)) <= maxPrimDist)
% dendLocSrc = primGJloc{ceil(rand*length(primGJloc))};
% dendLocDest = primGJloc{ceil(rand*length(primGJloc))};
% else
% disp('Using secondary dendrites, this is OnlyPrim file...')
% keyboard
%
% dendLocSrc = secGJloc{ceil(rand*length(secGJloc))};
% dendLocDest = secGJloc{ceil(rand*length(secGJloc))};
% end
dendLocSrc = innerSecGJloc{ceil(rand*length(innerSecGJloc))};
dendLocDest = innerSecGJloc{ceil(rand*length(innerSecGJloc))};
gapSrc{i} = sprintf('/fs[%d]/%s',srcIdx(i)-1,dendLocSrc);
gapDest{i} = sprintf('/fs[%d]/%s',destIdx(i)-1,dendLocDest);
end
%keyboard
clear distMat
if(plotFlag)
plot3dConMatSimple(conMat,xCoord,yCoord,zCoord)
end