def microbe_enzproduction_rate(self, EnzGenes, EnzAttrib): """ Derive the taxon-specific fraction of 'available C' as enzymes. This fraction only varies with taxon, which is independent of gene within a taxon Parameters: EnzGenes: taxon-specific available genes for enzyme;dataframe (taxon * genes); from the above microbe_enzyme_gene() method EnzAttrib: dataframe [enzyme * 4 (C,N,P,maintenence cost)]; basic enzyme stoichiometry Constit_Prod_min: min of constitutive enzyme production efficiency Constit_Prod_max: max of constitutive enzyme production efficiency Enz_Prod_min: min of inducible enzyme production efficiency Enz_Prod_max: max of inducible enzyme production efficiency NormalizeProd: scalar; normalize enzyme production for the number of enzyme genes (0: No, 1: Yes) Returns: Tax_EnzProdConsti: series; taxon-specific fraction of available C as enzyme for each taxon Tax_EnzProdInduce: series; taxon-specific fraction of available C as enzyme for each taxon Tax_Induce_Enzyme_C: dataframe; taxon-specific fraction of available C as enzyme for each enzyme Tax_Consti_Enzyme_C: dataframe; taxon-specific fraction of available C as enzyme for each enzyme """ # LHS sampling of constitutive and inducible enzyme production efficiency for each taxon Tax_EnzProdConsti_array = LHS(self.n_taxa, self.Constit_Prod_min, self.Constit_Prod_max, 'uniform') Tax_EnzProdInduce_array = LHS(self.n_taxa, self.Enz_Prod_min, self.Enz_Prod_max, 'uniform') Tax_EnzProdConsti = pd.Series(data=Tax_EnzProdConsti_array, index=self.index, dtype='float32') Tax_EnzProdInduce = pd.Series(data=Tax_EnzProdInduce_array, index=self.index, dtype='float32') # Derive the production rate of every single gene of each taxon EnzProdConsti = EnzGenes.mul(Tax_EnzProdConsti, axis=0) EnzProdInduce = EnzGenes.mul(Tax_EnzProdInduce, axis=0) # Normalize constituitive and inducible enzyme production if self.NormalizeProd == 1: Normalize = EnzGenes.sum(axis=1) / self.Enz_per_taxon_max EnzProdConsti = EnzProdConsti.divide(Normalize, axis=0) EnzProdInduce = EnzProdInduce.divide(Normalize, axis=0) EnzProdConsti[Normalize == 0] = 0 EnzProdInduce[Normalize == 0] = 0 # Relative enzyme carbon cost for each enzyme gene of each taxon Tax_Consti_Enzyme_C = EnzProdConsti.mul( EnzAttrib["C_cost"], axis=1) #C_cost = 1; so it doesn't matter Tax_Induce_Enzyme_C = EnzProdInduce.mul(EnzAttrib["C_cost"], axis=1) return Tax_EnzProdConsti, Tax_EnzProdInduce, Tax_Consti_Enzyme_C, Tax_Induce_Enzyme_C
def microbe_uptake_cost(self, UptakeGenes): """ Derive the taxon-specific cost of every single gene of uptake transporter. Note this cost (in terms of Fraction of Biomass C) is same among different genes from the same taxon Parameters: UptakeGenes: dataframe; taxon-specific transporter genes; from the above method, microbe_uptake_gene() Uptake_C_cost_min: 0.01 transporter mg-1 biomass C Uptake_C_cost_max: 0.1 transporter mg-1 biomass C NormalizeUptake: normalize uptake investment for the number of uptake genes (0: No, 1: Yes) Returns: UptakeProd_series: series; taxon-specific transporter cost UptakeGenes_Cost: dataframe; taxon- and gene-specific transporter cost """ # LHS sampling of transporter production efficiency for each taxon UptakeProd_array = LHS(self.n_taxa, self.Uptake_C_cost_min, self.Uptake_C_cost_max, 'uniform') UptakeProd_series = pd.Series(data=UptakeProd_array, index=self.index, dtype='float32') # If true (== 1), then the uptake potential is normalized to the total number of uptake genes (n_uptake) if self.NormalizeUptake == 1: Normalize = UptakeGenes.sum(axis=1) / self.n_uptake UptakeGenes = UptakeGenes.divide(Normalize, axis=0) # Derive gene-specific production efficiency of each taxon UptakeGenes_Cost = UptakeGenes.mul(UptakeProd_series, axis=0) return UptakeProd_series, UptakeGenes_Cost
def microbe_osmoproduction_rate(self, OsmoGenes): """ Distribution of osmolyte production rate (i.e.,proportion of available C as osmolytes). Parameters: OsmoGenes: dataframe(taxon*genes); generated by the above microbe_osmolyte_gene() method Osmo_Constit_Prod_min: min of constitutive osmolyte production efficiency Osmo_Constit_Prod_max: max of constitutive osmolyte production efficiency Osmo_Induci_Prod_min: min of inducible osmolyte production efficiency Osmo_Induci_Prod_max: max of inducible osmolyte production efficiency NormalizeProd: 0:No; 1:Yes Returns: Tax_OsmoProd_Consti_series: Tax_OsmoProd_Induci_series: Tax_Consti_Osmo_C: taxon-specific fraction of available C as osmolytes for each gene Tax_Induce_Osmo_C: taxon-specific fraction of available C as osmolytes for each gene """ # LHS sampling of osmolyte production efficiency for every taxon Tax_OsmoProd_Consti = LHS(self.n_taxa, self.Osmo_Consti_Prod_min, self.Osmo_Consti_Prod_max, 'uniform') Tax_OsmoProd_Induci = LHS(self.n_taxa, self.Osmo_Induci_Prod_min, self.Osmo_Induci_Prod_max, 'uniform') Tax_OsmoProd_Consti_series = pd.Series(data=Tax_OsmoProd_Consti, index=self.index, dtype='float32') Tax_OsmoProd_Induci_series = pd.Series(data=Tax_OsmoProd_Induci, index=self.index, dtype='float32') # Derive the production rate of every single gene of each taxon Tax_Consti_Osmo_C = OsmoGenes.mul(Tax_OsmoProd_Consti_series, axis=0) Tax_Induci_Osmo_C = OsmoGenes.mul(Tax_OsmoProd_Induci_series, axis=0) # Normalize constituitive and inducible osmolyte production if self.NormalizeProd == 1: Normalize = OsmoGenes.sum(axis=1) / self.Osmo_per_taxon_max Tax_Consti_Osmo_C = Tax_Consti_Osmo_C.divide(Normalize, axis=0) Tax_Induci_Osmo_C = Tax_Induci_Osmo_C.divide(Normalize, axis=0) Tax_Consti_Osmo_C[Normalize == 0] = 0 Tax_Induci_Osmo_C[Normalize == 0] = 0 return Tax_OsmoProd_Consti_series, Tax_OsmoProd_Induci_series, Tax_Consti_Osmo_C, Tax_Induci_Osmo_C
def enzyme_Vmax(self, ReqEnz): """ Pre-exponential constants for enzymes. Parameters: ReqEnz: substrate required enzymes, from the substrate module Vmax0_min: 5 (mg substrate mg-1 enzyme day-1); Minimum Vmax for enzyme Vmax0_max: 50 (mg substrate mg-1 enzyme day-1); Maximum Vmax for enzyme Specif_factor: default 1; Efficiency-specificity Returns: Vmax0: dataframe(substrates * enzymes); feed the the method, enzyme_Km(), below Vmax0.T: dataframe(enzyme*substrate); will feed the expand() """ Vmax0_array = LHS(self.n_substrates * self.n_enzymes, self.Vmax0_min, self.Vmax0_max, 'uniform') Vmax0_array = Vmax0_array.reshape(self.n_substrates, self.n_enzymes) columns = ['Enz' + str(i) for i in range(1, self.n_enzymes + 1)] Vmax0 = pd.DataFrame(data=Vmax0_array, index=self.substrate_index, columns=columns, dtype='float32') # Account for efficiency-specificity tradeoff by dividing Vmax_0 by the number of substrates (or monomers) # targeted and multiplied by a specificity factor RE1 = ReqEnz.loc['set1'].iloc[range(self.n_substrates), :] RE2 = ReqEnz.loc['set2'].iloc[range(self.n_substrates), :] RE2 = RE2.fillna(0) # Total num. of substrates that each enzyme can target: series; indexed by enzyme total_substrates = RE1.sum(axis=0) + RE2.sum(axis=0) if self.Specif_factor == 0: total_substrates[total_substrates > 1] = 1 else: total_substrates[total_substrates > 1] = total_substrates[ total_substrates > 1] * self.Specif_factor Vmax0 = Vmax0.divide(total_substrates, axis=1) Vmax0.loc[:, total_substrates == 0] = 0 # get rid of NAs Vmax0 = Vmax0.astype('float32') return Vmax0, Vmax0.T
def enzyme_uptake_Vmax(self, Uptake_ReqEnz): """ Pre-exponential constants for uptake. Parameters: Uptake_ReqEnz: uptake required enzymes; monomers * enzymes; from the monomer module Uptake_Vmax0_min: 1 (mg substrate mg-1 substrate day-1) Minimum uptake Vmax Uptake_Vmax0_max: 10 (mg substrate mg-1 substrate day-1) Maximum uptake Vmax Specif_factor: default 1; Efficiency-specificity Return: Uptake_Vmax0: dataframe; Rows are monomers; cols are uptake enzymes """ #Uptake_Vmax0_array = np.random.uniform(self.Uptake_Vmax0_min,self.Uptake_Vmax0_max,self.n_uptake*self.n_monomers) Uptake_Vmax0_array = LHS(self.n_uptake * self.n_monomers, self.Uptake_Vmax0_min, self.Uptake_Vmax0_max, 'uniform') Uptake_Vmax0_array = Uptake_Vmax0_array.reshape( self.n_monomers, self.n_uptake) index = ['Mon' + str(i) for i in range(1, self.n_monomers + 1)] columns = ['Upt' + str(i) for i in range(1, self.n_uptake + 1)] Uptake_Vmax0 = pd.DataFrame(data=Uptake_Vmax0_array, index=index, columns=columns, dtype='float32') # implement the tradeoff with specificity total_monomers = Uptake_ReqEnz.sum(axis=0) if self.Specif_factor == 0: total_monomers[total_monomers > 1] = 1 else: total_monomers[total_monomers > 1] = total_monomers[ total_monomers > 1] * self.Specif_factor Uptake_Vmax0 = Uptake_Vmax0.divide(total_monomers, axis=1) Uptake_Vmax0.loc[:, total_monomers == 0] = 0 Uptake_Vmax0 = Uptake_Vmax0.astype('float32') return Uptake_Vmax0