comparison COBRAxy/flux_simulation.py @ 515:ded8a0d6cb6d draft

Uploaded
author luca_milaz
date Thu, 09 Oct 2025 09:32:09 +0000
parents 97eea560a10f
children c66aa96336d3
comparison
equal deleted inserted replaced
514:e24998921824 515:ded8a0d6cb6d
109 109
110 parser.add_argument('-ota', '--output_type_analysis', 110 parser.add_argument('-ota', '--output_type_analysis',
111 type=str, 111 type=str,
112 required=False, 112 required=False,
113 help='output type analysis (optimization methods)') 113 help='output type analysis (optimization methods)')
114 114
115 parser.add_argument('-idop', '--output_path', 115 parser.add_argument('-idop', '--output_path',
116 type=str, 116 type=str,
117 default='flux_simulation', 117 default='flux_simulation/',
118 help='output path for maps') 118 help = 'output path for fluxes')
119 119
120 parser.add_argument('-otm', '--out_mean',
121 type = str,
122 help = 'output of mean of fluxes')
123
124 parser.add_argument('-otmd', '--out_median',
125 type = str,
126 help = 'output of median of fluxes')
127
128 parser.add_argument('-otq', '--out_quantiles',
129 type = str,
130 help = 'output of quantiles of fluxes')
131
132 parser.add_argument('-otf', '--out_fluxes',
133 type = str,
134 help = 'output of fluxes')
135 parser.add_argument('-otfva', '--out_fva',
136 type = str,
137 help = 'output of FVA results')
138 parser.add_argument('-otp', '--out_pfba',
139 type = str,
140 help = 'output of pFBA results')
141 parser.add_argument('-ots', '--out_sensitivity',
142 type = str,
143 help = 'output of sensitivity results')
120 ARGS = parser.parse_args(args) 144 ARGS = parser.parse_args(args)
121 return ARGS 145 return ARGS
122 ########################### warning ########################################### 146 ########################### warning ###########################################
123 def warning(s :str) -> None: 147 def warning(s :str) -> None:
124 """ 148 """
133 with open(ARGS.out_log, 'a') as log: 157 with open(ARGS.out_log, 'a') as log:
134 log.write(s + "\n\n") 158 log.write(s + "\n\n")
135 print(s) 159 print(s)
136 160
137 161
138 def write_to_file(dataset: pd.DataFrame, name: str, keep_index:bool=False)->None: 162 def write_to_file(dataset: pd.DataFrame, name: str, path: str, keep_index:bool=False)->None:
139 """ 163 """
140 Write a DataFrame to a TSV file under ARGS.output_path with a given base name. 164 Write a DataFrame to a TSV file under path with a given base name.
141 165
142 Args: 166 Args:
143 dataset: The DataFrame to write. 167 dataset: The DataFrame to write.
144 name: Base file name (without extension). 168 name: Base file name (without extension).
169 path: Directory path where the file will be saved.
145 keep_index: Whether to keep the DataFrame index in the file. 170 keep_index: Whether to keep the DataFrame index in the file.
146 171
147 Returns: 172 Returns:
148 None 173 None
149 """ 174 """
150 dataset.index.name = 'Reactions' 175 dataset.index.name = 'Reactions'
151 dataset.to_csv(ARGS.output_path + "/" + name + ".csv", sep = '\t', index = keep_index) 176 dataset.to_csv(os.path.join(path, name + ".csv"), sep = '\t', index = keep_index)
152 177
153 ############################ dataset input #################################### 178 ############################ dataset input ####################################
154 def read_dataset(data :str, name :str) -> pd.DataFrame: 179 def read_dataset(data :str, name :str) -> pd.DataFrame:
155 """ 180 """
156 Read a dataset from a CSV file and return it as a pandas DataFrame. 181 Read a dataset from a CSV file and return it as a pandas DataFrame.
220 245
221 # Convert back to DataFrame with proper column names 246 # Convert back to DataFrame with proper column names
222 samplesTotal = pd.DataFrame(samplesTotal_array, columns=reaction_ids) 247 samplesTotal = pd.DataFrame(samplesTotal_array, columns=reaction_ids)
223 248
224 # Save the final merged result as CSV 249 # Save the final merged result as CSV
225 write_to_file(samplesTotal.T, model_name, True) 250 write_to_file(samplesTotal.T, model_name, ARGS.output_path, True)
226 251
227 # Clean up temporary numpy files 252 # Clean up temporary numpy files
228 for i in range(n_batches): 253 for i in range(n_batches):
229 batch_filename = f"{ARGS.output_path}/{model_name}_{i}_OPTGP.npy" 254 batch_filename = f"{ARGS.output_path}/{model_name}_{i}_OPTGP.npy"
230 if os.path.exists(batch_filename): 255 if os.path.exists(batch_filename):
297 322
298 # Convert back to DataFrame with proper column namesq 323 # Convert back to DataFrame with proper column namesq
299 samplesTotal = pd.DataFrame(samplesTotal_array, columns=reaction_ids) 324 samplesTotal = pd.DataFrame(samplesTotal_array, columns=reaction_ids)
300 325
301 # Save the final merged result as CSV 326 # Save the final merged result as CSV
302 write_to_file(samplesTotal.T, model_name, True) 327 write_to_file(samplesTotal.T, model_name, ARGS.output_path, True)
303 328
304 # Clean up temporary numpy files 329 # Clean up temporary numpy files
305 for i in range(n_batches): 330 for i in range(n_batches):
306 batch_filename = f"{ARGS.output_path}/{model_name}_{i}_CBS.npy" 331 batch_filename = f"{ARGS.output_path}/{model_name}_{i}_CBS.npy"
307 if os.path.exists(batch_filename): 332 if os.path.exists(batch_filename):
486 num_processors = max(1, cpu_count() - 1) 511 num_processors = max(1, cpu_count() - 1)
487 512
488 global ARGS 513 global ARGS
489 ARGS = process_args(args) 514 ARGS = process_args(args)
490 515
491 if not os.path.exists(ARGS.output_path): 516 if not os.path.exists('flux_simulation'):
492 os.makedirs(ARGS.output_path) 517 os.makedirs('flux_simulation')
493 518
494 # --- Normalize inputs (the tool may pass comma-separated --input and either --name or --names) --- 519 # --- Normalize inputs (the tool may pass comma-separated --input and either --name or --names) ---
495 ARGS.input_files = ARGS.input.split(",") if ARGS.input else [] 520 ARGS.input_files = ARGS.input.split(",") if ARGS.input else []
496 ARGS.file_names = ARGS.name.split(",") 521 ARGS.file_names = ARGS.name.split(",")
497 # output types (required) -> list 522 # output types (required) -> list
557 all_quantiles = pd.concat([result[2] for result in results], ignore_index=False) 582 all_quantiles = pd.concat([result[2] for result in results], ignore_index=False)
558 583
559 if "mean" in ARGS.output_types: 584 if "mean" in ARGS.output_types:
560 all_mean = all_mean.fillna(0.0) 585 all_mean = all_mean.fillna(0.0)
561 all_mean = all_mean.sort_index() 586 all_mean = all_mean.sort_index()
562 write_to_file(all_mean.T, "mean", True) 587 write_to_file(all_mean.T, "mean", ARGS.out_mean, True)
563 588
564 if "median" in ARGS.output_types: 589 if "median" in ARGS.output_types:
565 all_median = all_median.fillna(0.0) 590 all_median = all_median.fillna(0.0)
566 all_median = all_median.sort_index() 591 all_median = all_median.sort_index()
567 write_to_file(all_median.T, "median", True) 592 write_to_file(all_median.T, "median", ARGS.out_median, True)
568 593
569 if "quantiles" in ARGS.output_types: 594 if "quantiles" in ARGS.output_types:
570 all_quantiles = all_quantiles.fillna(0.0) 595 all_quantiles = all_quantiles.fillna(0.0)
571 all_quantiles = all_quantiles.sort_index() 596 all_quantiles = all_quantiles.sort_index()
572 write_to_file(all_quantiles.T, "quantiles", True) 597 write_to_file(all_quantiles.T, "quantiles", ARGS.out_quantiles, True)
573 else: 598 else:
574 print("=== SAMPLING SKIPPED (n_samples = 0 or sampling disabled) ===") 599 print("=== SAMPLING SKIPPED (n_samples = 0 or sampling disabled) ===")
575 600
576 # Handle optimization analysis outputs (always available) 601 # Handle optimization analysis outputs (always available)
577 print("=== PROCESSING OPTIMIZATION RESULTS ===") 602 print("=== PROCESSING OPTIMIZATION RESULTS ===")
582 index_result = 3 if perform_sampling else 0 607 index_result = 3 if perform_sampling else 0
583 608
584 if "pFBA" in ARGS.output_type_analysis: 609 if "pFBA" in ARGS.output_type_analysis:
585 all_pFBA = pd.concat([result[index_result] for result in results], ignore_index=False) 610 all_pFBA = pd.concat([result[index_result] for result in results], ignore_index=False)
586 all_pFBA = all_pFBA.sort_index() 611 all_pFBA = all_pFBA.sort_index()
587 write_to_file(all_pFBA.T, "pFBA", True) 612 write_to_file(all_pFBA.T, "pFBA", ARGS.out_pfba, True)
588 index_result += 1 613 index_result += 1
589 614
590 if "FVA" in ARGS.output_type_analysis: 615 if "FVA" in ARGS.output_type_analysis:
591 all_FVA = pd.concat([result[index_result] for result in results], ignore_index=False) 616 all_FVA = pd.concat([result[index_result] for result in results], ignore_index=False)
592 all_FVA = all_FVA.sort_index() 617 all_FVA = all_FVA.sort_index()
593 write_to_file(all_FVA.T, "FVA", True) 618 write_to_file(all_FVA.T, "FVA", ARGS.out_fva, True)
594 index_result += 1 619 index_result += 1
595 620
596 if "sensitivity" in ARGS.output_type_analysis: 621 if "sensitivity" in ARGS.output_type_analysis:
597 all_sensitivity = pd.concat([result[index_result] for result in results], ignore_index=False) 622 all_sensitivity = pd.concat([result[index_result] for result in results], ignore_index=False)
598 all_sensitivity = all_sensitivity.sort_index() 623 all_sensitivity = all_sensitivity.sort_index()
599 write_to_file(all_sensitivity.T, "sensitivity", True) 624 write_to_file(all_sensitivity.T, "sensitivity", ARGS.out_sensitivity, True)
600 625
601 return 626 return
602 627
603 ############################################################################## 628 ##############################################################################
604 if __name__ == "__main__": 629 if __name__ == "__main__":