comparison COBRAxy/ras_to_bounds.py @ 113:1961a091484c draft

Uploaded
author luca_milaz
date Sun, 13 Oct 2024 15:55:16 +0000
parents 4ea14da7043b
children a7a079f6a4cd
comparison
equal deleted inserted replaced
112:4ea14da7043b 113:1961a091484c
109 if len(dataset.columns) < 2: 109 if len(dataset.columns) < 2:
110 sys.exit('Execution aborted: wrong format of ' + name + '\n') 110 sys.exit('Execution aborted: wrong format of ' + name + '\n')
111 return dataset 111 return dataset
112 112
113 113
114 def apply_ras_bounds(model, ras_row, rxns_ids): 114 def apply_ras_bounds(model, ras_row, rxns_ids, mediumRxns_ids):
115 """ 115 """
116 Adjust the bounds of reactions in the model based on RAS values. 116 Adjust the bounds of reactions in the model based on RAS values.
117 117
118 Args: 118 Args:
119 model (cobra.Model): The metabolic model to be modified. 119 model (cobra.Model): The metabolic model to be modified.
120 ras_row (pd.Series): A row from a RAS DataFrame containing scaling factors for reaction bounds. 120 ras_row (pd.Series): A row from a RAS DataFrame containing scaling factors for reaction bounds.
121 rxns_ids (list of str): List of reaction IDs to which the scaling factors will be applied. 121 rxns_ids (list of str): List of reaction IDs to which the scaling factors will be applied.
122 122 mediumRxns_ids (list of str): List of reaction IDs in the medium. Their RAS is set to zero, but they are already set in the model.
123 Returns: 123 Returns:
124 None 124 None
125 """ 125 """
126 for reaction in rxns_ids: 126 for reaction in rxns_ids:
127 if reaction in ras_row.index: 127 if reaction in ras_row.index and ras_row[reaction] not in mediumRxns_ids:
128 scaling_factor = ras_row[reaction] 128 scaling_factor = ras_row[reaction]
129 lower_bound=model.reactions.get_by_id(reaction).lower_bound 129 lower_bound=model.reactions.get_by_id(reaction).lower_bound
130 upper_bound=model.reactions.get_by_id(reaction).upper_bound 130 upper_bound=model.reactions.get_by_id(reaction).upper_bound
131 valMax=float((upper_bound)*scaling_factor) 131 valMax=float((upper_bound)*scaling_factor)
132 valMin=float((lower_bound)*scaling_factor) 132 valMin=float((lower_bound)*scaling_factor)
137 if upper_bound!=0 and lower_bound!=0: 137 if upper_bound!=0 and lower_bound!=0:
138 model.reactions.get_by_id(reaction).lower_bound=valMin 138 model.reactions.get_by_id(reaction).lower_bound=valMin
139 model.reactions.get_by_id(reaction).upper_bound=valMax 139 model.reactions.get_by_id(reaction).upper_bound=valMax
140 pass 140 pass
141 141
142 def process_ras_cell(cellName, ras_row, model, rxns_ids, output_folder): 142 def process_ras_cell(cellName, ras_row, model, rxns_ids, mediumRxns_ids, output_folder):
143 """ 143 """
144 Process a single RAS cell, apply bounds, and save the bounds to a CSV file. 144 Process a single RAS cell, apply bounds, and save the bounds to a CSV file.
145 145
146 Args: 146 Args:
147 cellName (str): The name of the RAS cell (used for naming the output file). 147 cellName (str): The name of the RAS cell (used for naming the output file).
148 ras_row (pd.Series): A row from a RAS DataFrame containing scaling factors for reaction bounds. 148 ras_row (pd.Series): A row from a RAS DataFrame containing scaling factors for reaction bounds.
149 model (cobra.Model): The metabolic model to be modified. 149 model (cobra.Model): The metabolic model to be modified.
150 rxns_ids (list of str): List of reaction IDs to which the scaling factors will be applied. 150 rxns_ids (list of str): List of reaction IDs to which the scaling factors will be applied.
151 mediumRxns_ids (list of str): List of reaction IDs in the medium. Their RAS is set to zero, but they are already set in the model.
151 output_folder (str): Folder path where the output CSV file will be saved. 152 output_folder (str): Folder path where the output CSV file will be saved.
152 153
153 Returns: 154 Returns:
154 None 155 None
155 """ 156 """
156 model_new = model.copy() 157 model_new = model.copy()
157 apply_ras_bounds(model_new, ras_row, rxns_ids) 158 apply_ras_bounds(model_new, ras_row, rxns_ids, mediumRxns_ids)
158 bounds = pd.DataFrame([(rxn.lower_bound, rxn.upper_bound) for rxn in model_new.reactions], index=rxns_ids, columns=["lower_bound", "upper_bound"]) 159 bounds = pd.DataFrame([(rxn.lower_bound, rxn.upper_bound) for rxn in model_new.reactions], index=rxns_ids, columns=["lower_bound", "upper_bound"])
159 bounds.to_csv(output_folder + cellName + ".csv", sep='\t', index=True) 160 bounds.to_csv(output_folder + cellName + ".csv", sep='\t', index=True)
160 pass 161 pass
161 162
162 def generate_bounds(model: cobra.Model, medium: dict, ras=None, output_folder='output/') -> pd.DataFrame: 163 def generate_bounds(model: cobra.Model, medium: dict, ras=None, output_folder='output/') -> pd.DataFrame:
179 if value is not None: 180 if value is not None:
180 if(reaction != "EX_thbpt_e" and reaction != "EX_lac__L_e"): 181 if(reaction != "EX_thbpt_e" and reaction != "EX_lac__L_e"):
181 model.reactions.get_by_id(reaction).lower_bound = -float(value) 182 model.reactions.get_by_id(reaction).lower_bound = -float(value)
182 if(reaction == "EX_lac__L_e"): 183 if(reaction == "EX_lac__L_e"):
183 model.reactions.get_by_id(reaction).lower_bound = float(0.0) 184 model.reactions.get_by_id(reaction).lower_bound = float(0.0)
185
186 mediumRxns_ids = medium.keys()
184 187
185 # Perform Flux Variability Analysis (FVA) 188 # Perform Flux Variability Analysis (FVA)
186 df_FVA = cobra.flux_analysis.flux_variability_analysis(model, fraction_of_optimum=0, processes=1).round(8) 189 df_FVA = cobra.flux_analysis.flux_variability_analysis(model, fraction_of_optimum=0, processes=1).round(8)
187 190
188 # Set FVA bounds 191 # Set FVA bounds
189 for reaction in rxns_ids: 192 for reaction in rxns_ids:
190 model.reactions.get_by_id(reaction).lower_bound = float(df_FVA.loc[reaction, "minimum"]) 193 model.reactions.get_by_id(reaction).lower_bound = float(df_FVA.loc[reaction, "minimum"])
191 model.reactions.get_by_id(reaction).upper_bound = float(df_FVA.loc[reaction, "maximum"]) 194 model.reactions.get_by_id(reaction).upper_bound = float(df_FVA.loc[reaction, "maximum"])
192 195
193 warning(str(model.reactions.get_by_id("EX_Lcystin_e").lower_bound)) 196 #warning(str(model.reactions.get_by_id("EX_Lcystin_e").lower_bound))
194 197
195 if ras is not None: 198 if ras is not None:
196 #Parallel(n_jobs=cpu_count())(delayed(process_ras_cell)(cellName, ras_row, model, rxns_ids, output_folder) for cellName, ras_row in ras.iterrows()) 199 #Parallel(n_jobs=cpu_count())(delayed(process_ras_cell)(cellName, ras_row, model, rxns_ids, output_folder) for cellName, ras_row in ras.iterrows())
197 for cellName, ras_row in ras.iterrows(): 200 for cellName, ras_row in ras.iterrows():
198 process_ras_cell(cellName, ras_row, model, rxns_ids, output_folder) 201 process_ras_cell(cellName, ras_row, model, rxns_ids, mediumRxns_ids, output_folder)
199 break #just one cell for testing 202 break #just one cell for testing
200 else: 203 else:
201 model_new = model.copy() 204 model_new = model.copy()
202 apply_ras_bounds(model_new, pd.Series([1]*len(rxns_ids), index=rxns_ids), rxns_ids) 205 apply_ras_bounds(model_new, pd.Series([1]*len(rxns_ids), index=rxns_ids), rxns_ids, mediumRxns_ids)
203 bounds = pd.DataFrame([(rxn.lower_bound, rxn.upper_bound) for rxn in model_new.reactions], index=rxns_ids, columns=["lower_bound", "upper_bound"]) 206 bounds = pd.DataFrame([(rxn.lower_bound, rxn.upper_bound) for rxn in model_new.reactions], index=rxns_ids, columns=["lower_bound", "upper_bound"])
204 bounds.to_csv(output_folder + "bounds.csv", sep='\t', index=True) 207 bounds.to_csv(output_folder + "bounds.csv", sep='\t', index=True)
205 pass 208 pass
206 209
207 210