%%
clear all;

changeCobraSolver('glpk','LP');

load EC_iAF1260;
Ec = EC_iAF1260;
Ec.description = 'E coli FBAME (with cytoplasmic membrane constraint)'


%% Remove Reactions
        Ec = removeRxns(Ec,{'EX_glc(e)'});
        
        Ec = removeRxns(Ec,{'NADH16pp','NADH5','CYTBD2pp','NADH17pp','NADH18pp','NADH9','FDH4pp','FDH5pp'}); 
        Ec = removeRxns(Ec, 'CYTBDpp');
        Ec = removeRxns(Ec, 'CYTBO3_4pp');
        
    
        
        
%% Proton Translocation Stoichiometries     
		Ec.CMC.H_ratio_cyo = 4;
		Ec.CMC.H_ratio_cyd1 = 2;
		Ec.CMC.H_ratio_cyd2 = 0.2;        
		Ec.CMC.H_ratio_ndh1 = 4;
		Ec.CMC.H_ratio_ndh2 = 0;
        
%% Enzyme Kms
		% Km of cytochromes   Bekker et al. 2009
		Ec.CMC.Kmo_cyo = 6.0/1000; 			%mM 
		Ec.CMC.Kmo_cyd1 = 0.3/1000;			%mM 
 		Ec.CMC.Kmo_cyd2 = 2/1000;				%mM
%% CMS Cost Parameters
        %{
        Ec.CMC.vGlc = 20.5;          cmsGlc = 1/Ec.CMC.vGlc;
        Ec.CMC.vCyo = 15;          cmsCyo = 1/Ec.CMC.vCyo;
        Ec.CMC.vCyd1 = 23;         cmsCyd1 = 1/Ec.CMC.vCyd1;
        Ec.CMC.vCyd2 = 66;         cmsCyd2 = 1/Ec.CMC.vCyd2
        
        %}
        Ec.CMC.vGlc = 18;          cmsGlc = 1/Ec.CMC.vGlc;
        Ec.CMC.vCyo = 15.2;          cmsCyo = 1/Ec.CMC.vCyo;
        Ec.CMC.vCyd1 = 23.4;         cmsCyd1 = 1/Ec.CMC.vCyd1;
        Ec.CMC.vCyd2 = 78;         cmsCyd2 = 1/Ec.CMC.vCyd2
        %Ec.CMC.vCyd2 = 35;         cmsCyd2 = 1/Ec.CMC.vCyd2
        
        
        %Ec.CMC.vNdh1 = 300;        cmsNdh1 = 1/Ec.CMC.vNdh1;
        %Ec.CMC.vNdh2 = 10000000;        cmsNdh2 = 1/Ec.CMC.vNdh2;
        %Ec.CMC.vSdh  = 100000000;        cmsSdh = 1/Ec.CMC.vSdh;
%% Add Reactions
% CMC = cytoplasmic membrane cost, a pseudo-metabolite

    %Glucose Transport
        str = sprintf('glc-D[e]  + %d CMC <=>  ',cmsGlc);
        Ec = addReaction(Ec, 'EX_glc(e)',str)
        
    %Cytochromes    
        str = sprintf('%d h[c] + 0.5 o2[c] + q8h2[c]  -> h2o[c] + %d h[p] + q8[c] +  %d CMC',Ec.CMC.H_ratio_cyo,Ec.CMC.H_ratio_cyo,cmsCyo)	
		Ec = addReaction(Ec, 'Cyo',str);
		str = sprintf('%d h[c] + 0.5 o2[c] + q8h2[c]  -> h2o[c] + %d h[p] + q8[c] +  %d CMC',Ec.CMC.H_ratio_cyd1,Ec.CMC.H_ratio_cyd1,cmsCyd1)	
		Ec = addReaction(Ec, 'Cyd-I',str);
		str = sprintf('%d h[c] + 0.5 o2[c] + q8h2[c] -> h2o[c] + %d h[p] + q8[c]  + %d CMC',Ec.CMC.H_ratio_cyd2,Ec.CMC.H_ratio_cyd2,cmsCyd2)	
		Ec = addReaction(Ec, 'Cyd-II',str);
    %NADH Dehydrogenases
        str = sprintf('%d h[c] + nadh[c] + q8[c]  -> %d h[p] + nad[c] + q8h2[c]',Ec.CMC.H_ratio_ndh1+1,Ec.CMC.H_ratio_ndh1);
        %str = sprintf('%d h[c] + nadh[c] + q8[c] +  %d CMC -> %d h[p] + nad[c] + q8h2[c] ',Ec.CMC.H_ratio_ndh1+1,Ec.CMC.H_ratio_ndh1,cmsNdh1);
		Ec = addReaction(Ec, 'NDH-I',str);
        str = sprintf('%d h[c] + nadh[c] + q8[c]  -> %d h[p] + nad[c] + q8h2[c]',Ec.CMC.H_ratio_ndh2+1,Ec.CMC.H_ratio_ndh2);
        %str = sprintf('%d h[c] + nadh[c] + q8[c]  +  %d CMC -> %d h[p] + nad[c] + q8h2[c] ',Ec.CMC.H_ratio_ndh2+1,Ec.CMC.H_ratio_ndh2,cmsNdh2);
		Ec = addReaction(Ec, 'NDH-II',str);       
        
        
        %str = sprintf('q8[c] + succ[c]  -> fum[c] + q8h2[c]')
        %str = sprintf('q8[c] + succ[c]  -> fum[c] + q8h2[c]+ %d CMC',cmsSdh)
        %Ec = addReaction(Ec, 'SUCDi',str);
%% Membrane Area Coinstraint
		Ec = addReaction(Ec, 'DM_CMC','CMC ->');
		Ec = changeRxnBounds(Ec,'DM_CMC',0,'l');
        Ec = changeRxnBounds(Ec,'DM_CMC',1,'u');
      

%% Physiological Constraints

	% ETC capacity
		Ec = changeRxnBounds(Ec,'NDH-I',1000,'u');
		Ec = changeRxnBounds(Ec,'NDH-II',1000,'u');
		Ec = changeRxnBounds(Ec,'Cyo',1000,'u'); 
		Ec = changeRxnBounds(Ec,'Cyd-I',1000,'u');
		Ec = changeRxnBounds(Ec,'Cyd-II',1000,'u');
		
	% environmental uptake constraints
    
		Ec = changeRxnBounds(Ec,'EX_o2(e)',-1000,'l');
		Ec = changeRxnBounds(Ec,'EX_glc(e)',-1000,'l');
        Ec = changeRxnBounds(Ec,'EX_succ(e)',0,'l');
        Ec = changeRxnBounds(Ec,'EX_ac(e)',0,'l');
        Ec = changeRxnBounds(Ec,'EX_h(e)',0,'l');
        %Ec = changeRxnBounds(Ec,'FDH4pp',0,'b');
        %Ec = changeRxnBounds(Ec,'FDH5pp',0,'b');
        

%% Maintenance Energy

	GAM = 50.81;
    rbio = findRxnIDs(Ec,'Ec_biomass_iAF1260_core_59p81M');
	Ec.S(354,rbio) = GAM;
	Ec.S(952,rbio) = GAM;
	Ec.S(1331,rbio) = GAM - 0.0040
	Ec.S(459,1001) = - GAM - 0.1780;
	Ec.S(946,rbio) = - GAM + 3.6380;
	%Ec = changeRxnBounds(Ec,'ATPM',7.6,'b'); % change NGAM
%}
save EC_iKZ_CMC Ec


