comparison COBRAxy/ras_generator.py @ 531:1fc5c1edb0ef draft default tip

Uploaded
author francesco_lapi
date Wed, 22 Oct 2025 13:30:18 +0000
parents 352c51a39e23
children
comparison
equal deleted inserted replaced
530:352c51a39e23 531:1fc5c1edb0ef
280 self.count_df_filtered = dataset_normalized.loc[self.genes] 280 self.count_df_filtered = dataset_normalized.loc[self.genes]
281 281
282 def compute(self, 282 def compute(self,
283 or_expression=np.sum, # type of operation to do in case of an or expression (sum, max, mean) 283 or_expression=np.sum, # type of operation to do in case of an or expression (sum, max, mean)
284 and_expression=np.min, # type of operation to do in case of an and expression(min, sum) 284 and_expression=np.min, # type of operation to do in case of an and expression(min, sum)
285 drop_na_rows=True, # if True remove the nan rows of the ras matrix 285 drop_na_rows=False, # if True remove the nan rows of the ras matrix
286 drop_duplicates=False, # if true, remove duplicates rows 286 drop_duplicates=False, # if true, remove duplicates rows
287 ignore_nan=True, # if True, ignore NaN values in GPR evaluation (e.g., A or NaN -> A) 287 ignore_nan=True, # if True, ignore NaN values in GPR evaluation (e.g., A or NaN -> A)
288 print_progressbar=True, # if True, print the progress bar 288 print_progressbar=True, # if True, print the progress bar
289 add_count_metadata=True, # if True add metadata of cells in the ras adata 289 add_count_metadata=True, # if True add metadata of cells in the ras adata
290 add_met_metadata=True, # if True add metadata from the metabolic model (gpr and compartments of reactions) 290 add_met_metadata=True, # if True add metadata from the metabolic model (gpr and compartments of reactions)
325 # Some genes missing and we don't ignore NaN - set to NaN 325 # Some genes missing and we don't ignore NaN - set to NaN
326 pass 326 pass
327 else: 327 else:
328 # Evaluate the GPR expression using AST 328 # Evaluate the GPR expression using AST
329 # For single gene, AST handles it fine: ast.parse("GENE_A") works 329 # For single gene, AST handles it fine: ast.parse("GENE_A") works
330 try: 330 # more genes in the formula
331 check_only_and=("and" in rule and "or" not in rule) #only and
332 check_only_or=("or" in rule and "and" not in rule) #only or
333 if check_only_and or check_only_or:
334 #or/and sequence
335 matrix = self.count_df_filtered.loc[genes_present].values
336 #compute for all cells
337 if check_only_and:
338 ras_df[ind] = self.and_function(matrix, axis=0)
339 else:
340 ras_df[ind] = self.or_function(matrix, axis=0)
341 else:
342 # complex expression (e.g. A or (B and C))
343 data = self.count_df_filtered.loc[genes_present] # dataframe of genes in the GPRs
331 tree = ast.parse(rule, mode="eval").body 344 tree = ast.parse(rule, mode="eval").body
332 data = self.count_df_filtered.loc[genes_present] 345 values_by_cell = [dict(zip(data.index, data[col].values)) for col in data.columns]
333 346 for j, values in enumerate(values_by_cell):
334 # Evaluate for each cell/sample 347 ras_df[ind, j] =self._evaluate_ast(tree, values, self.or_function, self.and_function, ignore_nan)
335 for j, col in enumerate(data.columns): 348
336 gene_values = dict(zip(data.index, data[col].values))
337 ras_df[ind, j] = self._evaluate_ast(tree, gene_values, self.or_function, self.and_function, ignore_nan)
338 except:
339 # If parsing fails, keep as NaN
340 pass
341
342 if print_progressbar: 349 if print_progressbar:
343 pbar.update(ind + 1) 350 pbar.update(ind + 1)
344 351
345 if print_progressbar: 352 if print_progressbar:
346 pbar.finish() 353 pbar.finish()