comparison COBRAxy/ras_to_bounds.py @ 48:fac6930e6385 draft

Uploaded
author luca_milaz
date Sat, 12 Oct 2024 19:57:09 +0000
parents 41f35c2f0c7b
children 47153fe3d59e
comparison
equal deleted inserted replaced
47:7b07b05bdb5d 48:fac6930e6385
57 parser.add_argument('-rs', '--ras_selector', 57 parser.add_argument('-rs', '--ras_selector',
58 required = True, 58 required = True,
59 type=utils.Bool("using_RAS"), 59 type=utils.Bool("using_RAS"),
60 help = 'ras selector') 60 help = 'ras selector')
61 61
62 parser.add_argument('-c', '--classes',
63 type = str,
64 help = 'input classes')
65
66 parser.add_argument('-cc', '--cell_class',
67 type = str,
68 help = 'output of cell class')
69
62 ARGS = parser.parse_args() 70 ARGS = parser.parse_args()
63 return ARGS 71 return ARGS
64 72
65 ########################### warning ########################################### 73 ########################### warning ###########################################
66 def warning(s :str) -> None: 74 def warning(s :str) -> None:
113 121
114 Returns: 122 Returns:
115 None 123 None
116 """ 124 """
117 for reaction in rxns_ids: 125 for reaction in rxns_ids:
118 if reaction in ras_row.index and pd.notna(ras_row[reaction]): 126 if reaction in ras_row.index:
119 rxn = model.reactions.get_by_id(reaction)
120 scaling_factor = ras_row[reaction] 127 scaling_factor = ras_row[reaction]
121 rxn.lower_bound *= scaling_factor 128 lower_bound=model.reactions.get_by_id(reaction).lower_bound
122 rxn.upper_bound *= scaling_factor 129 upper_bound=model.reactions.get_by_id(reaction).upper_bound
130 valMax=float((upper_bound)*scaling_factor)
131 valMin=float((lower_bound)*scaling_factor)
132 if upper_bound!=0 and lower_bound==0:
133 model.reactions.get_by_id(reaction).upper_bound=valMax
134 if upper_bound==0 and lower_bound!=0:
135 model.reactions.get_by_id(reaction).lower_bound=valMin
136 if upper_bound!=0 and lower_bound!=0:
137 model.reactions.get_by_id(reaction).lower_bound=valMin
138 model.reactions.get_by_id(reaction).upper_bound=valMax
139 pass
123 140
124 def process_ras_cell(cellName, ras_row, model, rxns_ids, output_folder): 141 def process_ras_cell(cellName, ras_row, model, rxns_ids, output_folder):
125 """ 142 """
126 Process a single RAS cell, apply bounds, and save the bounds to a CSV file. 143 Process a single RAS cell, apply bounds, and save the bounds to a CSV file.
127 144
137 """ 154 """
138 model_new = model.copy() 155 model_new = model.copy()
139 apply_ras_bounds(model_new, ras_row, rxns_ids) 156 apply_ras_bounds(model_new, ras_row, rxns_ids)
140 bounds = pd.DataFrame([(rxn.lower_bound, rxn.upper_bound) for rxn in model_new.reactions], index=rxns_ids, columns=["lower_bound", "upper_bound"]) 157 bounds = pd.DataFrame([(rxn.lower_bound, rxn.upper_bound) for rxn in model_new.reactions], index=rxns_ids, columns=["lower_bound", "upper_bound"])
141 bounds.to_csv(output_folder + cellName + ".csv", sep='\t', index=True) 158 bounds.to_csv(output_folder + cellName + ".csv", sep='\t', index=True)
159 pass
142 160
143 def generate_bounds(model: cobra.Model, medium: dict, ras=None, output_folder='output/') -> pd.DataFrame: 161 def generate_bounds(model: cobra.Model, medium: dict, ras=None, output_folder='output/') -> pd.DataFrame:
144 """ 162 """
145 Generate reaction bounds for a metabolic model based on medium conditions and optional RAS adjustments. 163 Generate reaction bounds for a metabolic model based on medium conditions and optional RAS adjustments.
146 164
147 Args: 165 Args:
148 model (cobra.Model): The metabolic model for which bounds will be generated. 166 model (cobra.Model): The metabolic model for which bounds will be generated.
149 medium (dict): A dictionary where keys are reaction IDs and values are the medium conditions. 167 medium (dict): A dictionary where keys are reaction IDs and values are the medium conditions.
150 ras (pd.DataFrame, optional): A DataFrame with RAS scaling factors for different cell types. Defaults to None. 168 ras (pd.DataFrame, optional): RAS pandas dataframe. Defaults to None.
151 output_folder (str, optional): Folder path where output CSV files will be saved. Defaults to 'output/'. 169 output_folder (str, optional): Folder path where output CSV files will be saved. Defaults to 'output/'.
152 170
153 Returns: 171 Returns:
154 pd.DataFrame: DataFrame containing the bounds of reactions in the model. 172 pd.DataFrame: DataFrame containing the bounds of reactions in the model.
155 """ 173 """
174 else: 192 else:
175 model_new = model.copy() 193 model_new = model.copy()
176 apply_ras_bounds(model_new, pd.Series([1]*len(rxns_ids), index=rxns_ids), rxns_ids) 194 apply_ras_bounds(model_new, pd.Series([1]*len(rxns_ids), index=rxns_ids), rxns_ids)
177 bounds = pd.DataFrame([(rxn.lower_bound, rxn.upper_bound) for rxn in model_new.reactions], index=rxns_ids, columns=["lower_bound", "upper_bound"]) 195 bounds = pd.DataFrame([(rxn.lower_bound, rxn.upper_bound) for rxn in model_new.reactions], index=rxns_ids, columns=["lower_bound", "upper_bound"])
178 bounds.to_csv(output_folder + "bounds.csv", sep='\t', index=True) 196 bounds.to_csv(output_folder + "bounds.csv", sep='\t', index=True)
197 pass
198
179 199
180 200
181 ############################# main ########################################### 201 ############################# main ###########################################
182 def main() -> None: 202 def main() -> None:
183 """ 203 """
194 ARGS = process_args(sys.argv) 214 ARGS = process_args(sys.argv)
195 215
196 ARGS.output_folder = 'ras_to_bounds/' 216 ARGS.output_folder = 'ras_to_bounds/'
197 217
198 if(ARGS.ras_selector == True): 218 if(ARGS.ras_selector == True):
199 ras = read_dataset(ARGS.input_ras, "ras dataset") 219 ras_file_list = ARGS.ras_selector.split(",")
200 ras.replace("None", None, inplace=True) 220 if(len(ras_list)>1):
201 ras.set_index("Reactions", drop=True, inplace=True) 221 ras_class_names = [cls.strip() for cls in ARGS.classes.split(',')]
202 ras = ras.T 222 else:
203 ras = ras.astype(float) 223 ras_class_names = ["placeHolder"]
224 ras_list = []
225 class_assignments = pd.DataFrame(columns=["Patient_ID", "Class"])
226 for ras_matrix, ras_class_name in ras_file_list, ras_class_names:
227 ras = read_dataset(ras_matrix, "ras dataset")
228 ras.replace("None", None, inplace=True)
229 ras.set_index("Reactions", drop=True, inplace=True)
230 ras = ras.T
231 ras = ras.astype(float)
232 ras_list.append(ras)
233 for patient_id in ras.index:
234 class_assignments = class_assignments.append({"Patient_ID": patient_id, "Class": ras_class_name}, ignore_index=True)
235
236 # Concatenate all ras DataFrames into a single DataFrame
237 ras_combined = pd.concat(ras_list, axis=1)
238 # Normalize the RAS values by max RAS
239 ras_combined = ras_combined.div(ras_combined.max(axis=0))
240 ras_combined = ras_combined.fillna(0)
241
242
204 243
205 model_type :utils.Model = ARGS.model_selector 244 model_type :utils.Model = ARGS.model_selector
206 if model_type is utils.Model.Custom: 245 if model_type is utils.Model.Custom:
207 model = model_type.getCOBRAmodel(customPath = utils.FilePath.fromStrPath(ARGS.model), customExtension = utils.FilePath.fromStrPath(ARGS.model_name).ext) 246 model = model_type.getCOBRAmodel(customPath = utils.FilePath.fromStrPath(ARGS.model), customExtension = utils.FilePath.fromStrPath(ARGS.model_name).ext)
208 else: 247 else:
218 ARGS.medium_selector = ARGS.medium_selector.replace("_", " ") 257 ARGS.medium_selector = ARGS.medium_selector.replace("_", " ")
219 medium = df_mediums[[ARGS.medium_selector]] 258 medium = df_mediums[[ARGS.medium_selector]]
220 medium = medium[ARGS.medium_selector].to_dict() 259 medium = medium[ARGS.medium_selector].to_dict()
221 260
222 if(ARGS.ras_selector == True): 261 if(ARGS.ras_selector == True):
223 generate_bounds(model, medium, ras = ras, output_folder=ARGS.output_folder) 262 generate_bounds(model, medium, ras = ras_combined, output_folder=ARGS.output_folder)
263 if(len(ras_list)>1):
264 class_assignments.to_csv(ARGS.cell_class, sep = '\t', index = False)
224 else: 265 else:
225 generate_bounds(model, medium, output_folder=ARGS.output_folder) 266 generate_bounds(model, medium, output_folder=ARGS.output_folder)
226 267
227 pass 268 pass
228 269