function [FinalLattice,FinalFood,FinalGarbage] = DoubleBrothLoopF(InitialLattice,MaskLattice,InitialFoodLattice,InitialGarbageLattice,fc,fd,g,rc,rd,rg,rho,LysingRate,DFchannel,DGchannel,DFres,FoodDiffusionSigma,GarbageDiffusionSigma,MHPCoords,N,FilePrefix) % ================================================ % David Liao % 2008 February 10 % DoubleBrothLoopF % ================================================ % % Requires DoubleBrothF.m and IsingTrioFluorescence.m % DoubleBrothLoopF(InitialLattice,MaskLattice,InitialFoodLattice, % InitialGarbageLattice,fc,fd,g,rc,rd,rg,rho,LysingRate,DFchannel,DGchann % el,DFres,FoodDiffusionSigma,GarbageDiffusionSigma,MHPCoords,N,FilePrefi % x) L = size(InitialLattice); % Nearest neighbor filter: do fft once NeighborFilter = zeros(L(1)+2,L(2)+2,L(3)); NeighborFilter(2,1,1) = 1; NeighborFilter(1,2,1) = 1; NeighborFilter(1,1,2) = 1; NeighborFilter(L(1)+2,1,1) = 1; NeighborFilter(1,L(2)+2,1) = 1; NeighborFilter(1,1,L(3)) = 1; NeighborFilter(1,1,1) = 1; NeighborFilterfft = fftn(NeighborFilter); GreatestDiffLength = max(FoodDiffusionSigma,GarbageDiffusionSigma); CAPMU = [MHPCoords(1,4)+2*GreatestDiffLength MHPCoords(1,5)+2*GreatestDiffLength L(3)]; % Food diffusion filter: do fft once FoodGaussian = zeros(CAPMU); for i = 1:CAPMU(1) for j = 1:CAPMU(2) for k = 1:CAPMU(3) FoodGaussian(i,j,k) = exp(-(i^2 + j^2 + k^2)/FoodDiffusionSigma^2); end end end FoodGaussian = FoodGaussian + FoodGaussian(CAPMU(1):-1:1,:,:) + FoodGaussian(:,CAPMU(2):-1:1,:) + FoodGaussian(:,:,CAPMU(3):-1:1) + FoodGaussian(CAPMU(1):-1:1,CAPMU(2):-1:1,:) + FoodGaussian(:,CAPMU(2):-1:1,CAPMU(3):-1:1) + FoodGaussian(CAPMU(1):-1:1,:,CAPMU(3):-1:1) + FoodGaussian(CAPMU(1):-1:1,CAPMU(2):-1:1,CAPMU(3):-1:1); FoodGaussian = FoodGaussian/sum(sum(sum(FoodGaussian))); FoodGaussianfft = fftn(FoodGaussian); % Garbage diffusion filter: do fft once GarbageGaussian = zeros(CAPMU); for i = 1:CAPMU(1) for j = 1:CAPMU(2) for k = 1:CAPMU(3) GarbageGaussian(i,j,k) = exp(-(i^2 + j^2 + k^2)/GarbageDiffusionSigma^2); end end end GarbageGaussian = GarbageGaussian + GarbageGaussian(CAPMU(1):-1:1,:,:) + GarbageGaussian(:,CAPMU(2):-1:1,:) + GarbageGaussian(:,:,CAPMU(3):-1:1) + GarbageGaussian(CAPMU(1):-1:1,CAPMU(2):-1:1,:) + GarbageGaussian(:,CAPMU(2):-1:1,CAPMU(3):-1:1) + GarbageGaussian(CAPMU(1):-1:1,:,CAPMU(3):-1:1) + GarbageGaussian(CAPMU(1):-1:1,CAPMU(2):-1:1,CAPMU(3):-1:1); GarbageGaussian = GarbageGaussian/sum(sum(sum(GarbageGaussian))); GarbageGaussianfft = fftn(GarbageGaussian); % Write first picture ZerothColorImage = IsingTrioFluorescence(InitialLattice); imwrite(ZerothColorImage,[FilePrefix '000000.png']); CurrentLattice = InitialLattice; CurrentFoodLattice = InitialFoodLattice; CurrentGarbageLattice = InitialGarbageLattice; tic; for i = 1:N [CurrentLattice,CurrentFoodLattice,CurrentGarbageLattice] = DoubleBrothF(CurrentLattice,MaskLattice,CurrentFoodLattice,CurrentGarbageLattice,fc,fd,g,rc,rd,rg,rho,LysingRate,DFchannel,DGchannel,DFres,FoodGaussianfft,FoodDiffusionSigma,GarbageGaussianfft,GarbageDiffusionSigma,NeighborFilterfft,MHPCoords); CurrentColorImage = IsingTrioFluorescence(CurrentLattice); imwrite(CurrentColorImage,[FilePrefix num2str(i,'%06g') '.png']); ElapsedTime = toc; RemainingTime = (N - i)*ElapsedTime/i; fprintf(['Remaining time: ' ,num2str(RemainingTime), ' s. Elapsed time: ' ,num2str(ElapsedTime), ' s. \n']); end FinalLattice = CurrentLattice; FinalFood = CurrentFoodLattice; FinalGarbage = CurrentGarbageLattice;