%Define K, mu, and Y values for each strain
%"1" denotes Population A. "2" denotes Population B.
%umax2neg is the specific growth rate of PH04 pAHL-sfGFP.
K1 = 0.1; K2 = 0.1; Y1 = 0.45; Y2 = 0.45;
umax1 = 0.276; umax2 = 0.32; umax2neg = 0.276;

%Define constants in fHPr function
A = 1; B = 1; C = 29; D = 2.1; E = 0.48; 

%fHPr function
fHPr = @(x) D+((A-D)/(1+(x/C)^B)^E);

%Load data for fAI1 functions.
%'ai1ratefunctions.mat' contains 5 arrays.
%'A1time' contains time values in 0.1 hr increments ranging from 0 - 8 
%hours.'fAI10', 'fAI110', 'fAI120', 'fAI140', and 'fAI180' contain the 
%values for the rate of AI-1 production over time (in 0.1 hr increments)
%for each AI-2 concentration (0, 10, 20, 40, or 80 microM). These are used
%later (with an interpolate function) to determine the rate of AI-1 
%produced by Population A at specific times for specific AI-2
%concentrations.
load('ai1ratefunctions.mat')
fAIv = [fAI10 fAI110 fAI120 fAI140 fAI180];

%Define initial substrate concentration.
S0 = 8;

%Define initial values for AI-2 and AI-1 concentrations.
%Code is set up to simulate six different cultures (with different 
%initial AI-2 or AI-1 concentrations simultaneously).
AI2initial = [0 10 20 40 80 0];
AI1initial = [0 0 0 0 0 200];

%Define start and stop times for evaluating ODEs.
tinitial = 0; tfinal = 5; 

%Define starting cell density (OD600) and starting composition (fraction
%Population B).
startingod = .053; 
startingfrac = .3;
pop1initial = startingod*(1-startingfrac); 
pop2initial = startingod*startingfrac;

%Choose to define 'ratio' as 1, 2, or 3. Depending on which value is
%chosen, the resulting data will be copied into different columns in an
%Excel sheet. Allows simulations using three different initial culture
%compositions to be written to the same Excel sheet.
ratio = 2;

for i = [1,2,3,4,5,6];
    
    AI2(i)= AI2initial(1,i); 
    AI1(i)=AI1initial(1,i);
    initialconditions = [pop1initial;pop2initial;S0;AI1(i)];

    %system of ODEs
    f = @(t,x) [(umax1*x(3)*x(1))/(K1+x(3)); %X1
    (umax2*x(3)*x(2)*(fHPr(x(4))))/(K2+x(3)); %X2
    -((umax1*x(3)*x(1))/(Y1*(K1+x(3))))-((umax2*x(3)*x(2)*(fHPr(x(4))))/(Y2*(K2+x(3)))); %S
    interp2(A1time,[0 10 20 40 80],transpose(fAIv),t,AI2(i))*x(1)]; %AI1
    %Note that the interp2 function represents fAI1(t,AI2).
    %The interp2 function uses data generated from the fAI1 funtions for
    %each AI-2 concentration (Supplementary Table 1) at every 0.1 hr 
    %increment. Using ths data, the interp2 function determines the 
    %current AI-1 production rate based on the time in the simulation and 
    %the initial AI-2 concentration.

    options = ddeset('maxstep',0.1);

    sol = ode45(f,[tinitial tfinal],initialconditions,options);
    t = linspace(0,tfinal,101);
    xa = deval(sol,t);
    M{i} = xa;
    time{i}= t;
end
   
%Solve ODEs again for negative control.
%Uses strain that cannot grow faster in response to AI-1.

AI2initialneg = 0;

neg = @(t,x) [(umax1*x(3)*x(1))/(K1+x(3)); %X1
(umax2neg*x(3)*x(2))/(K2+x(3)); %X2
-((umax1*x(3)*x(1))/(Y1*(K1+x(3))))-((umax2neg*x(3)*x(2))/(Y2*(K2+x(3)))); %S
interp2(A1time,[0 10 20 40 80],transpose(fAIv),t,AI2initialneg)*x(1)];%AI1  

initialconditions = [pop1initial;pop2initial;S0;0];
    
sol = ode45(neg,[tinitial tfinal],initialconditions,options);
Mneg = linspace(0,tfinal,101);
timeneg = deval(sol,t);

%Define location of Excel workbook
filename = [];

%Change name of excel sheet below if desired.

if ratio == 1
    xlswrite(filename,transpose(time{1}),'Sheet3','A3');
    xlswrite(filename,transpose(M{1}),'Sheet3','B3');
    xlswrite(filename,transpose(time{2}),'Sheet3','G3');
    xlswrite(filename,transpose(M{2}),'Sheet3','H3');
    xlswrite(filename,transpose(time{3}),'Sheet3','M3');
    xlswrite(filename,transpose(M{3}),'Sheet3','N3');
    xlswrite(filename,transpose(time{4}),'Sheet3','S3');
    xlswrite(filename,transpose(M{4}),'Sheet3','T3');
    xlswrite(filename,transpose(time{5}),'Sheet3','Y3');
    xlswrite(filename,transpose(M{5}),'Sheet3','Z3');
    xlswrite(filename,transpose(time{6}),'Sheet3','AE3');
    xlswrite(filename,transpose(M{6}),'Sheet3','AF3');
    xlswrite(filename,transpose(timeneg),'Sheet3','AK3');
    xlswrite(filename,transpose(Mneg),'Sheet3','AL3');
end

if ratio == 2
    xlswrite(filename,transpose(time{1}),'Sheet3','AQ3');
    xlswrite(filename,transpose(M{1}),'Sheet3','AR3');
    xlswrite(filename,transpose(time{2}),'Sheet3','AW3');
    xlswrite(filename,transpose(M{2}),'Sheet3','AX3');
    xlswrite(filename,transpose(time{3}),'Sheet3','BC3');
    xlswrite(filename,transpose(M{3}),'Sheet3','BD3');
    xlswrite(filename,transpose(time{4}),'Sheet3','BI3');
    xlswrite(filename,transpose(M{4}),'Sheet3','BJ3');
    xlswrite(filename,transpose(time{5}),'Sheet3','BO3');
    xlswrite(filename,transpose(M{5}),'Sheet3','BP3');
    xlswrite(filename,transpose(time{6}),'Sheet3','BU3');
    xlswrite(filename,transpose(M{6}),'Sheet3','BV3');
    xlswrite(filename,transpose(timeneg),'Sheet3','CA3');
    xlswrite(filename,transpose(Mneg),'Sheet3','CB3');
end

if ratio == 3
    xlswrite(filename,transpose(time{1}),'Sheet3','CG3');
    xlswrite(filename,transpose(M{1}),'Sheet3','CH3');
    xlswrite(filename,transpose(time{2}),'Sheet3','CM3');
    xlswrite(filename,transpose(M{2}),'Sheet3','CN3');
    xlswrite(filename,transpose(time{3}),'Sheet3','CS3');
    xlswrite(filename,transpose(M{3}),'Sheet3','CT3');
    xlswrite(filename,transpose(time{4}),'Sheet3','CY3');
    xlswrite(filename,transpose(M{4}),'Sheet3','CZ3');
    xlswrite(filename,transpose(time{5}),'Sheet3','DE3');
    xlswrite(filename,transpose(M{5}),'Sheet3','DF3');
    xlswrite(filename,transpose(time{6}),'Sheet3','DK3');
    xlswrite(filename,transpose(M{6}),'Sheet3','DL3');
    xlswrite(filename,transpose(timeneg),'Sheet3','DQ3');
    xlswrite(filename,transpose(Mneg),'Sheet3','DR3');
end