annotate COBRAxy/fromCSVtoCOBRA_beta.py @ 455:4e2bc80764b6 draft

Uploaded
author francesco_lapi
date Fri, 12 Sep 2025 15:05:54 +0000
parents 3654c08668f1
children a6e45049c1b9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
451
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
1 import os
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
2 import csv
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
3 import cobra
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
4 import pickle
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
5 import argparse
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
6 import pandas as pd
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
7 import utils.general_utils as utils
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
8 from typing import Optional, Tuple, Union, List, Dict
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
9 import logging
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
10 import utils.rule_parsing as rulesUtils
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
11 import utils.reaction_parsing as reactionUtils
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
12 import utils.model_utils as modelUtils
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
13
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
14 ARGS : argparse.Namespace
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
15 def process_args(args: List[str] = None) -> argparse.Namespace:
453
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
16 parser = argparse.ArgumentParser(
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
17 usage="%(prog)s [options]",
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
18 description="Convert a tabular/CSV file to a COBRA model"
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
19 )
451
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
20
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
21
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
22 parser.add_argument("--out_log", type=str, required=True,
453
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
23 help="Output log file")
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
24
451
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
25
453
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
26 parser.add_argument("--input", type=str, required=True,
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
27 help="Input tabular file (CSV/TSV)")
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
28
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
29
451
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
30 parser.add_argument("--format", type=str, required=True, choices=["sbml", "json", "mat", "yaml"],
453
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
31 help="Model format (SBML, JSON, MATLAB, YAML)")
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
32
451
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
33
453
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
34 parser.add_argument("--output", type=str, required=True,
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
35 help="Output model file path")
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
36
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
37
451
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
38 parser.add_argument("--tool_dir", type=str, default=os.path.dirname(__file__),
453
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
39 help="Tool directory (passed from Galaxy as $__tool_directory__)")
451
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
40
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
41
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
42 return parser.parse_args(args)
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
43
453
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
44
451
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
45 ###############################- ENTRY POINT -################################
453
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
46
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
47 def main(args: List[str] = None) -> None:
451
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
48 global ARGS
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
49 ARGS = process_args(args)
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
50
453
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
51 # configure logging to the requested log file (overwrite each run)
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
52 logging.basicConfig(filename=ARGS.out_log,
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
53 level=logging.DEBUG,
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
54 format='%(asctime)s %(levelname)s: %(message)s',
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
55 filemode='w')
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
56
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
57 logging.info('Starting fromCSVtoCOBRA tool')
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
58 logging.debug('Args: input=%s format=%s output=%s tool_dir=%s', ARGS.input, ARGS.format, ARGS.output, ARGS.tool_dir)
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
59
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
60 try:
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
61 # Basic sanity checks
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
62 if not os.path.exists(ARGS.input):
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
63 logging.error('Input file not found: %s', ARGS.input)
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
64
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
65 out_dir = os.path.dirname(os.path.abspath(ARGS.output))
455
4e2bc80764b6 Uploaded
francesco_lapi
parents: 454
diff changeset
66
453
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
67 if out_dir and not os.path.isdir(out_dir):
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
68 try:
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
69 os.makedirs(out_dir, exist_ok=True)
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
70 logging.info('Created missing output directory: %s', out_dir)
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
71 except Exception as e:
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
72 logging.exception('Cannot create output directory: %s', out_dir)
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
73
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
74 model = modelUtils.build_cobra_model_from_csv(ARGS.input)
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
75
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
76 # Save model in requested format
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
77 if ARGS.format == "sbml":
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
78 cobra.io.write_sbml_model(model, ARGS.output)
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
79 elif ARGS.format == "json":
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
80 cobra.io.save_json_model(model, ARGS.output)
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
81 elif ARGS.format == "mat":
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
82 cobra.io.save_matlab_model(model, ARGS.output)
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
83 elif ARGS.format == "yaml":
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
84 cobra.io.save_yaml_model(model, ARGS.output)
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
85 else:
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
86 logging.error('Unknown format requested: %s', ARGS.format)
454
3654c08668f1 Uploaded
francesco_lapi
parents: 453
diff changeset
87 print(f"ERROR: Unknown format: {ARGS.format}")
3654c08668f1 Uploaded
francesco_lapi
parents: 453
diff changeset
88
453
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
89
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
90 logging.info('Model successfully written to %s (format=%s)', ARGS.output, ARGS.format)
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
91
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
92 except Exception:
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
93 # Log full traceback to the out_log so Galaxy users/admins can see what happened
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
94 logging.exception('Unhandled exception in fromCSVtoCOBRA')
451
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
95
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
96
a4e8f3188813 Uploaded
francesco_lapi
parents:
diff changeset
97 if __name__ == '__main__':
453
51f794fff930 Uploaded
francesco_lapi
parents: 451
diff changeset
98 main()