comparison COBRAxy/utils/model_utils.py @ 506:ffc234ec80db draft

Uploaded
author francesco_lapi
date Wed, 01 Oct 2025 13:19:03 +0000
parents 96f512dff490
children ca98c149ec61
comparison
equal deleted inserted replaced
505:96f512dff490 506:ffc234ec80db
221 221
222 222
223 223
224 def generate_compartments(model: cobraModel) -> pd.DataFrame: 224 def generate_compartments(model: cobraModel) -> pd.DataFrame:
225 """ 225 """
226 Generates a DataFrame containing compartment information for each reaction. 226 Generates a DataFrame containing pathway information for each reaction.
227 Creates columns for each compartment position (Compartment_1, Compartment_2, etc.) 227 Creates columns for each pathway position (Pathway_1, Pathway_2, etc.) only if pathways exist.
228 228
229 Args: 229 Args:
230 model: the COBRA model to extract compartment data from. 230 model: the COBRA model to extract pathway data from.
231 231
232 Returns: 232 Returns:
233 pd.DataFrame: DataFrame with ReactionID and compartment columns 233 pd.DataFrame: DataFrame with ReactionID and pathway columns (if any pathways exist)
234 """ 234 """
235 pathway_data = [] 235 pathway_data = []
236 236
237 # First pass: determine the maximum number of pathways any reaction has 237 # First pass: determine the maximum number of pathways any reaction has
238 max_pathways = 0 238 max_pathways = 0
239 reaction_pathways = {} 239 reaction_pathways = {}
240 has_any_pathways = False
240 241
241 for reaction in model.reactions: 242 for reaction in model.reactions:
242 # Get unique pathways from all metabolites in the reaction 243 # Get unique pathways from all metabolites in the reaction
243 if 'pathways' in reaction.annotation: 244 if 'pathways' in reaction.annotation and reaction.annotation['pathways']:
244 if type(reaction.annotation['pathways']) == list: 245 if type(reaction.annotation['pathways']) == list:
245 reaction_pathways[reaction.id] = reaction.annotation['pathways'] 246 # Filter out empty/None values
246 max_pathways = max(max_pathways, len(reaction.annotation['pathways'])) 247 valid_pathways = [p for p in reaction.annotation['pathways'] if p]
248 if valid_pathways:
249 reaction_pathways[reaction.id] = valid_pathways
250 max_pathways = max(max_pathways, len(valid_pathways))
251 has_any_pathways = True
252 else:
253 reaction_pathways[reaction.id] = []
247 else: 254 else:
248 reaction_pathways[reaction.id] = [reaction.annotation['pathways']] 255 # Single pathway value
256 if reaction.annotation['pathways']:
257 reaction_pathways[reaction.id] = [reaction.annotation['pathways']]
258 max_pathways = max(max_pathways, 1)
259 has_any_pathways = True
260 else:
261 reaction_pathways[reaction.id] = []
249 else: 262 else:
250 # No pathway annotation - use empty list 263 # No pathway annotation - use empty list
251 reaction_pathways[reaction.id] = [] 264 reaction_pathways[reaction.id] = []
252 265
253 # Create column names for pathways 266 # If no pathways exist in the model, return DataFrame with only ReactionID
267 if not has_any_pathways:
268 return None
269
270 # Create column names for pathways only if they exist
254 pathway_columns = [f"Pathway_{i+1}" for i in range(max_pathways)] 271 pathway_columns = [f"Pathway_{i+1}" for i in range(max_pathways)]
255 272
256 # Second pass: create the data 273 # Second pass: create the data with pathway columns
257 for reaction_id, pathways in reaction_pathways.items(): 274 for reaction_id, pathways in reaction_pathways.items():
258 row = {"ReactionID": reaction_id} 275 row = {"ReactionID": reaction_id}
259 276
260 # Fill pathway columns 277 # Fill pathway columns
261 for i in range(max_pathways): 278 for i in range(max_pathways):
262 col_name = pathway_columns[i] 279 col_name = pathway_columns[i]
263 if i < len(pathways): 280 if i < len(pathways):
264 row[col_name] = pathways[i] 281 row[col_name] = pathways[i]
265 else: 282 else:
266 row[col_name] = None # or "" if you prefer empty strings 283 row[col_name] = None
267 284
268 pathway_data.append(row) 285 pathway_data.append(row)
269 286
270 return pd.DataFrame(pathway_data) 287 return pd.DataFrame(pathway_data)
271 288
287 for col in pathway_cols: 304 for col in pathway_cols:
288 if pd.notna(row[col]) and str(row[col]).strip(): 305 if pd.notna(row[col]) and str(row[col]).strip():
289 pathways.append(str(row[col]).strip()) 306 pathways.append(str(row[col]).strip())
290 307
291 if pathways: 308 if pathways:
292 309
293 reaction = model.reactions.get_by_id(reaction_id) 310 reaction = model.reactions.get_by_id(reaction_id)
294 if len(pathways) == 1: 311 if len(pathways) == 1:
295 reaction.annotation['pathways'] = pathways[0] 312 reaction.annotation['pathways'] = pathways[0]
296 else: 313 else:
297 reaction.annotation['pathways'] = pathways 314 reaction.annotation['pathways'] = pathways