annotate COBRAxy/docs/tutorials/python-api.md @ 492:4ed95023af20 draft

Uploaded
author francesco_lapi
date Tue, 30 Sep 2025 14:02:17 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
492
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
1 # Python API Tutorial
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
2
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
3 Learn how to use COBRAxy tools programmatically in Python scripts and analysis pipelines.
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
4
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
5 ## Overview
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
6
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
7 This tutorial teaches you to integrate COBRAxy into Python workflows by calling tool main functions directly with parsed arguments.
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
8
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
9 **Time required**: ~45 minutes
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
10 **Difficulty**: Intermediate
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
11 **Prerequisites**: Basic Python knowledge, COBRAxy installation
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
12
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
13 ## Understanding COBRAxy Architecture
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
14
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
15 ### Tool Structure
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
16
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
17 Each COBRAxy tool is a Python module with:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
18 - `main(args)` function that accepts argument list
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
19 - Command-line argument parsing
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
20 - Self-contained execution logic
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
21
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
22 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
23 # General pattern for all tools
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
24 import tool_module
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
25 tool_module.main(['-arg1', 'value1', '-arg2', 'value2'])
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
26 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
27
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
28 ### Available Tools
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
29
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
30 | Python Module | Purpose | Key Arguments |
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
31 |---------------|---------|---------------|
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
32 | `ras_generator` | Compute reaction activity scores | `-in`, `-ra`, `-rs` |
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
33 | `rps_generator` | Compute reaction propensity scores | `-id`, `-rp` |
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
34 | `marea` | Statistical pathway analysis | `-input_data`, `-choice_map` |
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
35 | `ras_to_bounds` | Apply RAS constraints to model | `-ir`, `-ms`, `-idop` |
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
36 | `flux_simulation` | Sample metabolic fluxes | `-ms`, `-in`, `-a`, `-ns` |
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
37 | `flux_to_map` | Add flux data to maps | `-if`, `-mp`, `-idop` |
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
38
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
39 ## Setup Your Environment
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
40
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
41 ### Import Required Modules
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
42
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
43 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
44 import sys
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
45 import os
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
46 from pathlib import Path
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
47
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
48 # Add COBRAxy to Python path
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
49 cobraxy_path = "/path/to/COBRAxy"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
50 sys.path.insert(0, cobraxy_path)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
51
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
52 # Import COBRAxy tools
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
53 import ras_generator
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
54 import rps_generator
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
55 import marea
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
56 import ras_to_bounds
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
57 import flux_simulation
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
58 import flux_to_map
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
59 import metabolicModel2Tabular as model_setting
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
60 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
61
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
62 ### Set Working Directory
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
63
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
64 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
65 # Set up working directory
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
66 work_dir = Path("/path/to/analysis")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
67 work_dir.mkdir(exist_ok=True)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
68 os.chdir(work_dir)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
69
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
70 # COBRAxy tools expect this parameter
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
71 tool_dir = str(Path(cobraxy_path).absolute())
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
72 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
73
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
74 ## Basic Workflow Example
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
75
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
76 ### Step 1: Prepare Sample Data
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
77
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
78 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
79 import pandas as pd
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
80 import numpy as np
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
81
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
82 # Create sample gene expression data
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
83 genes = ['HGNC:5', 'HGNC:10', 'HGNC:15', 'HGNC:25', 'HGNC:30']
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
84 samples = ['Control_1', 'Control_2', 'Treatment_1', 'Treatment_2']
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
85
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
86 # Generate random expression values
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
87 np.random.seed(42)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
88 data = np.random.lognormal(mean=2, sigma=1, size=(len(genes), len(samples)))
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
89
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
90 # Create DataFrame
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
91 expression_df = pd.DataFrame(data, index=genes, columns=samples)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
92 expression_df.index.name = 'Gene_ID'
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
93
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
94 # Save to file
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
95 expression_file = work_dir / "expression_data.tsv"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
96 expression_df.to_csv(expression_file, sep='\t')
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
97 print(f"Created sample data: {expression_file}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
98 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
99
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
100 ### Step 2: Extract Model Information
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
101
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
102 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
103 # Extract model components (optional, for understanding model structure)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
104 model_args = [
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
105 '-td', tool_dir,
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
106 '-ms', 'ENGRO2', # Use built-in ENGRO2 model
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
107 '-idop', str(work_dir / 'model_info')
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
108 ]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
109
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
110 try:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
111 model_setting.main(model_args)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
112 print("✓ Model information extracted")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
113 except Exception as e:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
114 print(f"Model extraction failed: {e}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
115 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
116
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
117 ### Step 3: Generate RAS Scores
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
118
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
119 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
120 # Generate Reaction Activity Scores
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
121 ras_output = work_dir / "ras_scores.tsv"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
122
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
123 ras_args = [
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
124 '-td', tool_dir,
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
125 '-in', str(expression_file),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
126 '-ra', str(ras_output),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
127 '-rs', 'ENGRO2', # Built-in model
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
128 '-n', 'true' # Handle missing genes
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
129 ]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
130
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
131 try:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
132 ras_generator.main(ras_args)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
133 print(f"✓ RAS scores generated: {ras_output}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
134 except Exception as e:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
135 print(f"RAS generation failed: {e}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
136 raise
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
137 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
138
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
139 ### Step 4: Generate RPS Scores (Optional)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
140
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
141 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
142 # Create sample metabolite data
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
143 metabolites = ['glucose', 'pyruvate', 'lactate', 'ATP', 'NADH']
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
144 met_data = np.random.lognormal(mean=3, sigma=0.5, size=(len(metabolites), len(samples)))
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
145
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
146 met_df = pd.DataFrame(met_data, index=metabolites, columns=samples)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
147 met_df.index.name = 'Metabolite_ID'
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
148
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
149 metabolite_file = work_dir / "metabolite_data.tsv"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
150 met_df.to_csv(metabolite_file, sep='\t')
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
151
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
152 # Generate Reaction Propensity Scores
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
153 rps_output = work_dir / "rps_scores.tsv"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
154
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
155 rps_args = [
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
156 '-td', tool_dir,
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
157 '-id', str(metabolite_file),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
158 '-rp', str(rps_output)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
159 ]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
160
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
161 try:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
162 rps_generator.main(rps_args)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
163 print(f"✓ RPS scores generated: {rps_output}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
164 except Exception as e:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
165 print(f"RPS generation warning: {e}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
166 # RPS generation might fail with sample data - that's OK
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
167 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
168
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
169 ### Step 5: Statistical Analysis with MAREA
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
170
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
171 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
172 # Create enriched pathway maps
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
173 maps_output = work_dir / "pathway_maps"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
174
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
175 marea_args = [
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
176 '-td', tool_dir,
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
177 '-using_RAS', 'true',
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
178 '-input_data', str(ras_output),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
179 '-choice_map', 'ENGRO2',
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
180 '-gs', 'true', # Gene set analysis
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
181 '-idop', str(maps_output)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
182 ]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
183
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
184 try:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
185 marea.main(marea_args)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
186 print(f"✓ Pathway maps created: {maps_output}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
187 except Exception as e:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
188 print(f"MAREA analysis failed: {e}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
189 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
190
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
191 ### Step 6: Flux Simulation Pipeline
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
192
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
193 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
194 # Apply RAS constraints to model
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
195 bounds_output = work_dir / "model_bounds"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
196
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
197 bounds_args = [
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
198 '-td', tool_dir,
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
199 '-ms', 'ENGRO2',
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
200 '-ir', str(ras_output),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
201 '-rs', 'true', # Use RAS values
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
202 '-idop', str(bounds_output)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
203 ]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
204
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
205 try:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
206 ras_to_bounds.main(bounds_args)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
207 print(f"✓ Model constraints applied: {bounds_output}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
208 except Exception as e:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
209 print(f"Bounds generation failed: {e}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
210 raise
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
211
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
212 # Sample metabolic fluxes
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
213 flux_output = work_dir / "flux_samples"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
214
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
215 flux_args = [
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
216 '-td', tool_dir,
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
217 '-ms', 'ENGRO2',
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
218 '-in', str(bounds_output / "*.tsv"), # Will be expanded by tool
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
219 '-a', 'CBS', # Sampling algorithm
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
220 '-ns', '1000', # Number of samples
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
221 '-idop', str(flux_output)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
222 ]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
223
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
224 try:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
225 flux_simulation.main(flux_args)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
226 print(f"✓ Flux samples generated: {flux_output}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
227 except Exception as e:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
228 print(f"Flux simulation failed: {e}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
229 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
230
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
231 ### Step 7: Create Final Visualizations
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
232
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
233 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
234 # Add flux data to enriched maps
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
235 final_maps = work_dir / "final_visualizations"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
236
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
237 # Check if we have both maps and flux data
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
238 maps_dir = maps_output
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
239 flux_dir = flux_output
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
240
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
241 if maps_dir.exists() and flux_dir.exists():
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
242 flux_to_map_args = [
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
243 '-td', tool_dir,
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
244 '-if', str(flux_dir / "*.tsv"),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
245 '-mp', str(maps_dir / "*.svg"),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
246 '-idop', str(final_maps)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
247 ]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
248
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
249 try:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
250 flux_to_map.main(flux_to_map_args)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
251 print(f"✓ Final visualizations created: {final_maps}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
252 except Exception as e:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
253 print(f"Final mapping failed: {e}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
254 else:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
255 print("Skipping final visualization - missing input files")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
256 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
257
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
258 ## Advanced Usage Patterns
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
259
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
260 ### Error Handling and Validation
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
261
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
262 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
263 def run_cobraxy_tool(tool_module, args, description):
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
264 """Helper function to run COBRAxy tools with error handling."""
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
265 try:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
266 print(f"Running {description}...")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
267 tool_module.main(args)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
268 print(f"✓ {description} completed successfully")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
269 return True
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
270 except Exception as e:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
271 print(f"✗ {description} failed: {e}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
272 return False
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
273
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
274 # Usage
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
275 success = run_cobraxy_tool(
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
276 ras_generator,
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
277 ras_args,
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
278 "RAS generation"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
279 )
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
280
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
281 if not success:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
282 print("Pipeline stopped due to error")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
283 exit(1)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
284 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
285
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
286 ### Batch Processing Multiple Datasets
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
287
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
288 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
289 def process_dataset(dataset_path, output_dir):
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
290 """Process a single dataset through COBRAxy pipeline."""
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
291
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
292 dataset_name = dataset_path.stem
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
293 out_dir = Path(output_dir) / dataset_name
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
294 out_dir.mkdir(exist_ok=True)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
295
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
296 # Generate RAS
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
297 ras_file = out_dir / "ras_scores.tsv"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
298 ras_args = [
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
299 '-td', tool_dir,
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
300 '-in', str(dataset_path),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
301 '-ra', str(ras_file),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
302 '-rs', 'ENGRO2'
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
303 ]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
304
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
305 if run_cobraxy_tool(ras_generator, ras_args, f"RAS for {dataset_name}"):
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
306 # Continue with MAREA analysis
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
307 maps_dir = out_dir / "maps"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
308 marea_args = [
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
309 '-td', tool_dir,
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
310 '-using_RAS', 'true',
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
311 '-input_data', str(ras_file),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
312 '-choice_map', 'ENGRO2',
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
313 '-idop', str(maps_dir)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
314 ]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
315 run_cobraxy_tool(marea, marea_args, f"MAREA for {dataset_name}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
316
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
317 return out_dir
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
318
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
319 # Process multiple datasets
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
320 datasets = [
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
321 "/path/to/dataset1.tsv",
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
322 "/path/to/dataset2.tsv",
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
323 "/path/to/dataset3.tsv"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
324 ]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
325
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
326 results = []
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
327 for dataset in datasets:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
328 result_dir = process_dataset(Path(dataset), work_dir / "batch_results")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
329 results.append(result_dir)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
330
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
331 print(f"Processed {len(results)} datasets")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
332 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
333
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
334 ### Custom Analysis Pipelines
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
335
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
336 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
337 class COBRAxyPipeline:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
338 """Custom COBRAxy analysis pipeline."""
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
339
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
340 def __init__(self, tool_dir, work_dir):
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
341 self.tool_dir = tool_dir
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
342 self.work_dir = Path(work_dir)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
343 self.work_dir.mkdir(exist_ok=True)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
344
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
345 def run_enrichment_analysis(self, expression_file, model='ENGRO2'):
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
346 """Run enrichment-focused analysis."""
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
347
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
348 # Generate RAS
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
349 ras_file = self.work_dir / "ras_scores.tsv"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
350 ras_args = ['-td', self.tool_dir, '-in', str(expression_file),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
351 '-ra', str(ras_file), '-rs', model]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
352
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
353 if not run_cobraxy_tool(ras_generator, ras_args, "RAS generation"):
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
354 return None
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
355
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
356 # Run MAREA
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
357 maps_dir = self.work_dir / "enrichment_maps"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
358 marea_args = ['-td', self.tool_dir, '-using_RAS', 'true',
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
359 '-input_data', str(ras_file), '-choice_map', model,
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
360 '-gs', 'true', '-idop', str(maps_dir)]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
361
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
362 if run_cobraxy_tool(marea, marea_args, "MAREA analysis"):
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
363 return maps_dir
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
364 return None
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
365
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
366 def run_flux_analysis(self, expression_file, model='ENGRO2', n_samples=1000):
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
367 """Run flux sampling analysis."""
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
368
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
369 # Generate RAS and apply bounds
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
370 ras_file = self.work_dir / "ras_scores.tsv"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
371 bounds_dir = self.work_dir / "bounds"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
372 flux_dir = self.work_dir / "flux_samples"
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
373
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
374 # RAS generation
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
375 ras_args = ['-td', self.tool_dir, '-in', str(expression_file),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
376 '-ra', str(ras_file), '-rs', model]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
377 if not run_cobraxy_tool(ras_generator, ras_args, "RAS generation"):
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
378 return None
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
379
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
380 # Apply bounds
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
381 bounds_args = ['-td', self.tool_dir, '-ms', model, '-ir', str(ras_file),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
382 '-rs', 'true', '-idop', str(bounds_dir)]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
383 if not run_cobraxy_tool(ras_to_bounds, bounds_args, "Bounds application"):
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
384 return None
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
385
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
386 # Flux sampling
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
387 flux_args = ['-td', self.tool_dir, '-ms', model,
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
388 '-in', str(bounds_dir / "*.tsv"),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
389 '-a', 'CBS', '-ns', str(n_samples), '-idop', str(flux_dir)]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
390
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
391 if run_cobraxy_tool(flux_simulation, flux_args, "Flux simulation"):
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
392 return flux_dir
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
393 return None
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
394
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
395 # Usage
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
396 pipeline = COBRAxyPipeline(tool_dir, work_dir / "custom_analysis")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
397
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
398 # Run enrichment analysis
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
399 enrichment_results = pipeline.run_enrichment_analysis(expression_file)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
400 if enrichment_results:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
401 print(f"Enrichment analysis completed: {enrichment_results}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
402
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
403 # Run flux analysis
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
404 flux_results = pipeline.run_flux_analysis(expression_file, n_samples=500)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
405 if flux_results:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
406 print(f"Flux analysis completed: {flux_results}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
407 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
408
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
409 ## Integration with Data Analysis Libraries
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
410
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
411 ### Pandas Integration
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
412
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
413 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
414 # Read COBRAxy results back into pandas
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
415 ras_df = pd.read_csv(ras_output, sep='\t', index_col=0)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
416 print(f"RAS data shape: {ras_df.shape}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
417 print(f"Sample statistics:\n{ras_df.describe()}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
418
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
419 # Filter highly variable reactions
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
420 ras_std = ras_df.std(axis=1)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
421 variable_reactions = ras_std.nlargest(20).index
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
422 print(f"Most variable reactions: {list(variable_reactions)}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
423 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
424
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
425 ### Matplotlib Visualization
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
426
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
427 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
428 import matplotlib.pyplot as plt
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
429 import seaborn as sns
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
430
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
431 # Visualize RAS distributions
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
432 plt.figure(figsize=(12, 8))
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
433 sns.heatmap(ras_df.iloc[:50], cmap='RdBu_r', center=0, cbar_kws={'label': 'RAS Score'})
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
434 plt.title('Reaction Activity Scores (Top 50 Reactions)')
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
435 plt.xlabel('Samples')
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
436 plt.ylabel('Reactions')
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
437 plt.tight_layout()
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
438 plt.savefig(work_dir / 'ras_heatmap.png', dpi=300)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
439 plt.show()
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
440 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
441
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
442 ## Best Practices
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
443
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
444 ### 1. Environment Management
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
445 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
446 # Use pathlib for cross-platform compatibility
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
447 from pathlib import Path
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
448
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
449 # Use absolute paths
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
450 tool_dir = str(Path(cobraxy_path).absolute())
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
451 work_dir = Path("/analysis").absolute()
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
452 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
453
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
454 ### 2. Error Handling
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
455 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
456 # Always wrap tool calls in try-except
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
457 try:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
458 ras_generator.main(ras_args)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
459 except Exception as e:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
460 print(f"RAS generation failed: {e}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
461 # Log details, cleanup, or alternative action
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
462 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
463
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
464 ### 3. Argument Validation
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
465 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
466 def validate_file_exists(filepath):
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
467 """Validate input file exists."""
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
468 path = Path(filepath)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
469 if not path.exists():
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
470 raise FileNotFoundError(f"Input file not found: {filepath}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
471 return str(path.absolute())
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
472
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
473 # Use before calling tools
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
474 expression_file = validate_file_exists(expression_file)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
475 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
476
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
477
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
478
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
479 ## Troubleshooting
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
480
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
481 ### Common Issues
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
482
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
483 **Import errors**
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
484 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
485 # Check if COBRAxy path is correct
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
486 import sys
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
487 print("Python path includes:")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
488 for p in sys.path:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
489 print(f" {p}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
490
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
491 # Add COBRAxy path
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
492 sys.path.insert(0, "/correct/path/to/COBRAxy")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
493 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
494
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
495 **Tool execution failures**
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
496 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
497 # Enable verbose output
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
498 import logging
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
499 logging.basicConfig(level=logging.DEBUG)
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
500
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
501 # Check working directory
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
502 print(f"Current directory: {os.getcwd()}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
503 print(f"Directory contents: {list(Path('.').iterdir())}")
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
504 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
505
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
506 **File path issues**
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
507 ```python
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
508 # Use absolute paths
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
509 ras_args = [
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
510 '-td', str(Path(tool_dir).absolute()),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
511 '-in', str(Path(expression_file).absolute()),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
512 '-ra', str(Path(ras_output).absolute()),
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
513 '-rs', 'ENGRO2'
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
514 ]
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
515 ```
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
516
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
517 ## Next Steps
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
518
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
519 Now that you can use COBRAxy programmatically:
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
520
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
521 1. **[Tools Reference](../tools/)** - Detailed parameter documentation
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
522 2. **[Examples](../examples/)** - Real-world analysis scripts
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
523 3. **Build custom analysis pipelines** for your research needs
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
524 4. **Integrate with workflow managers** like Snakemake or Nextflow
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
525
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
526 ## Resources
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
527
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
528 - [COBRApy Documentation](https://cobrapy.readthedocs.io/) - Underlying metabolic modeling library
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
529 - [Pandas Documentation](https://pandas.pydata.org/) - Data manipulation
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
530 - [Matplotlib Gallery](https://matplotlib.org/gallery/) - Visualization examples
4ed95023af20 Uploaded
francesco_lapi
parents:
diff changeset
531 - [Python Pathlib](https://docs.python.org/3/library/pathlib.html) - Modern path handling