comparison gem_escher_visualization.py @ 0:927af80d5e38 draft default tip

planemo upload for repository https://github.com/AlmaasLab/elixir-galaxy-tools-systemsbiology commit 3f7bec1264a86e1488ee1315dbac0f44675f5171
author iuc
date Fri, 13 Dec 2024 21:32:42 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:927af80d5e38
1 import argparse
2
3 import cobra
4 import pandas as pd
5 from escher import Builder
6
7
8 def __main__():
9 parser = argparse.ArgumentParser(
10 prog="EscherVisualization",
11 description="This program visualizes an Escher map",
12 epilog="Adding an epilog, but doubt it's needed.",
13 )
14 parser.add_argument(
15 "-m",
16 "--cb_model_location",
17 dest="cb_model_location",
18 action="store",
19 type=str,
20 default=None,
21 required=False,
22 help="The model to use."
23 )
24 parser.add_argument(
25 "-f",
26 "--flux_distribution_location",
27 dest="flux_distribution_location",
28 action="store",
29 type=str,
30 default=None,
31 required=False,
32 help="The flux distribution to visualize."
33 )
34 parser.add_argument(
35 "-e",
36 "--expect_map",
37 dest="expect_map",
38 action="store",
39 type=str,
40 default=None,
41 required=True,
42 help="Is a map expected to be uploaded?"
43 )
44 parser.add_argument(
45 "-l",
46 "--model_to_download",
47 dest="model_to_download",
48 action="store",
49 type=str,
50 default=None,
51 required=False,
52 help="The model to download."
53 )
54 parser.add_argument(
55 "--map_load_name",
56 dest="map_load_name",
57 action="store",
58 type=str,
59 default=None,
60 required=False,
61 help="The name of the map to use."
62 )
63 parser.add_argument(
64 "--map_upload_name",
65 dest="map_upload_name",
66 action="store",
67 type=str,
68 default=None,
69 required=False,
70 help="The name of the map to use."
71 )
72 parser.add_argument(
73 "-u",
74 "--uptake_constraints_file",
75 dest="uptake_constraints_file",
76 action="store",
77 type=str,
78 default=None,
79 required=False,
80 help="File containing new uptake constraits."
81 )
82 parser.add_argument(
83 "-output",
84 "--output",
85 dest="out_file",
86 action="store",
87 type=str,
88 default=None,
89 required=True,
90 help="The output file."
91 )
92
93 args = parser.parse_args()
94
95 if args.expect_map not in ["True", "False"]:
96 raise Exception("The expect_map argument must be either True or False.")
97 if args.expect_map == "True" and args.map_load_name is None and \
98 args.map_upload_name is None:
99 raise Exception(
100 "You must specify a map name if a map is expected to be uploaded."
101 )
102
103 cb_model = None
104 model_name = None
105 if args.model_to_download is not None and args.model_to_download != "None":
106 if args.cb_model_location is not None \
107 and args.cb_model_location != "None":
108 raise Exception(
109 "You cannot specify both a model to "
110 "download and a model to use."
111 )
112 model_name = args.model_to_download
113 elif args.cb_model_location is not None\
114 and args.cb_model_location != "None":
115 try:
116 cb_model = cobra.io.read_sbml_model(args.cb_model_location)
117 except Exception as e:
118 raise Exception(
119 "The model could not be read. "
120 "Ensure it is in correct SBML format."
121 ) from e
122
123 map_name = None
124 map_location = None
125 if args.map_upload_name is not None and args.map_upload_name != "None":
126 if args.map_load_name is not None and args.map_load_name != "None":
127 raise Exception(
128 "You cannot specify both a map to upload and a map to load."
129 )
130 map_location = args.map_upload_name
131 elif args.map_load_name is not None and args.map_load_name != "None":
132 map_name = args.map_load_name
133
134 if args.uptake_constraints_file is not None and \
135 args.uptake_constraints_file != "None":
136 if cb_model is None:
137 raise Exception(
138 "You cannot specify uptake constraints "
139 "without uploading a model."
140 )
141 else:
142 constraints_df = pd.read_csv(
143 args.uptake_constraints_file,
144 sep=";",
145 header=0,
146 index_col=False
147 )
148 for index, row in constraints_df.iterrows():
149 rxn_id = row["reaction_id"]
150 cb_model.reactions.get_by_id(rxn_id).lower_bound = \
151 row["lower_bound"]
152 cb_model.reactions.get_by_id(rxn_id).upper_bound = \
153 row["upper_bound"]
154
155 flux_dict = None
156 if args.flux_distribution_location is not None and \
157 args.flux_distribution_location != "None":
158 if cb_model is None:
159 raise Exception(
160 "You cannot specify a flux distribution "
161 "without uploading a model."
162 )
163 if args.uptake_constraints_file is not None and \
164 args.uptake_constraints_file != "None":
165 raise Exception(
166 "You cannot specify both uptake constraints and a flux "
167 "distribution."
168 )
169 try:
170 flux_df = pd.read_csv(
171 args.flux_distribution_location,
172 sep=";",
173 header=0,
174 index_col=False
175 )
176 flux_dict = {
177 key: value for key, value in zip(
178 flux_df['reaction_name'],
179 flux_df['flux']
180 )
181 }
182 except Exception as e:
183 raise Exception(
184 "The flux distribution file could not be read. "
185 "Ensure the file has semicolon-separated "
186 "columns and a header row."
187 ) from e
188
189 if cb_model is not None and flux_dict is None:
190 solution = cobra.flux_analysis.pfba(cb_model)
191
192 # make a dataframe with the reaction names, reaction ids, and flux
193 flux_distribution = pd.DataFrame(
194 columns=["reaction_name", "reaction_id", "flux"]
195 )
196 flux_distribution["reaction_name"] = [
197 reaction.name for reaction in cb_model.reactions
198 ]
199 flux_distribution["reaction_id"] = [
200 reaction.id for reaction in cb_model.reactions
201 ]
202 flux_distribution["flux"] = [
203 solution.fluxes[reaction.id] for reaction in cb_model.reactions
204 ]
205 flux_dict = {
206 key: value for key, value in zip(
207 flux_distribution['reaction_name'],
208 flux_distribution['flux']
209 )
210 }
211
212 builder = Builder()
213 if map_name is not None:
214 builder.map_name = map_name
215 print("Downloading map...")
216 if map_location is not None:
217 builder.map_json = map_location
218 print("Uploading map...")
219 if model_name is not None:
220 builder.model_name = model_name
221 print("Downloading model...")
222 if cb_model is not None:
223 builder.model = cb_model
224 print("Uploading model...")
225
226 if flux_dict is not None:
227 builder.reaction_data = flux_dict
228
229 builder.save_html(args.out_file)
230
231
232 if __name__ == "__main__":
233 __main__()