function rRemote=ConnPatchyRemOverlap(n,nM,patchSize,numPatches,remoteRad,nOut,nOverlap,distfunc,CellLocFunc)
% Function for obtaining patchy remote connectivity matrix
% ARGS:
% n^2 is the number of units in the sheet
% nM^2 is the number of units in a macrocolumn
% patchSize is the number of units in a remote patch
% numPatches is the number of remote patches a local macrocolumn connects to
% remoteRad is the max distance (in number of units) of the location of the patches
% nOut is the number of outgoing connections to remote patches per unit
% nOverlap is the number of remote patches a local macrocolumn shares with its neighbour
% distfunc is the function used to calculate the distances (can be @distTorus or @distSheet for toroidal or zero-flux boundaries)
% CellLocFunc is the function that generates patches of a certain size, @makeCellCluster is used for clusters that do not wrap around the boundary, @makeCellClusterToroidal is used for clusters that wrap around the boundary
% RETURNS:
% rRemote = is a sparse n^2 x n^2 connectivity matrix of the remote patchy connections
numMacroCol=n/nM;%number of macrocolumns
patchPercent=patchSize/n^2;
MCmap=zeros(numMacroCol^2,patchSize,numPatches);
[xMacro,yMacro]=meshgrid(1:numMacroCol,1:numMacroCol);
xMacro=reshape(xMacro,numMacroCol^2,1);
yMacro=reshape(yMacro,numMacroCol^2,1);
[xF,yF]=meshgrid(1:n,1:n);
xF=reshape(xF,n^2,1);
yF=reshape(yF,n^2,1);
expectedCl=round(pi*(remoteRad^2 - nM^2));%expected number of neighbours
for k=randperm(numMacroCol^2)
distM=(distfunc([xMacro(k) yMacro(k)],[xMacro yMacro]));
neighbourMacroIndex=find(distM<=1&distM>0);
%get the middle of the macrocolumn in terms of the full sheet posistion
xiF=(ceil(k/numMacroCol)-1)*nM+nM/2;
remTemp=(rem(k,numMacroCol)-1);
if remTemp==-1
remTemp=numMacroCol-1;
end
yiF=remTemp*nM+nM/2;
distMFull=(distfunc([xiF yiF],[xF yF]));
%get the cells that are ok as patchposition starters
neighbourFullIndex=find(distMFull>nM & distMFull<=remoteRad);
cl=length(neighbourFullIndex);
realNumPatch=round(cl/expectedCl*6);
%check if any of the index points are filled in MCmap
NeighbourfilledIndex=find(MCmap(neighbourMacroIndex,1,1)>0);
PatchCoordinates=zeros(patchSize,numPatches);
if ~isempty(NeighbourfilledIndex)
chosenNeighbourIndex=NeighbourfilledIndex(randi(length(NeighbourfilledIndex),1));
choosePatch=randperm(numPatches);
choosePatch=choosePatch(1:nOverlap);
PatchCoordinates(:,1:nOverlap)=MCmap(neighbourMacroIndex(chosenNeighbourIndex),:,choosePatch);
PatchCoordinates = generatePatchesOverlap(numPatches,realNumPatch,cl,neighbourFullIndex,xF,yF,n,patchPercent,nOverlap,PatchCoordinates,CellLocFunc);
MCmap(k,:,:)=PatchCoordinates;
else
%generate the patches
PatchCoordinates = generatePatchesOverlap(numPatches,realNumPatch,cl,neighbourFullIndex,xF,yF,n,patchPercent,0,PatchCoordinates,CellLocFunc);
MCmap(k,:,:)=PatchCoordinates;
end
end
%write results to sparse matrix
rRemote=sparse(n^2,n^2);
indFull=reshape(1:n^2,n,n);
for xcood=1:n
for ycood=1:n
%find matching macro column
MacroCNumber=(ceil(xcood/nM)-1)*numMacroCol+ceil(ycood/nM);
PossiblePos=MCmap(MacroCNumber,:,:);
PossiblePos=PossiblePos(:);
randPos=randperm(patchSize*numPatches);
WireTarget=PossiblePos(randPos(1:nOut));
WireTarget=WireTarget(WireTarget>0);%get rid of -1s
%wire current cell to a patch.
cind=indFull(ycood,xcood);
rRemote(WireTarget,cind)=1;
end
end
%%
%imagesc(reshape(rRemote(:,149*150+80),n,n))
end