adesomics.cli
1import argparse 2from pathlib import Path 3from xml.parsers.expat import model 4import numpy as np 5import pandas as pd 6from adesomics.io.count_matrix import CountMatrix 7from adesomics.mapping.connection import Connector 8from adesomics.dge.statistics import DifferentialExpression 9from adesomics.population.population_model import PopulationSet, _save 10from adesomics.io.metadata import Metadata 11from adesomics.io.gsmm import Model 12 13 14def main(): 15 16 parser = argparse.ArgumentParser( 17 prog="adesomics", 18 description="adesomics: RNA-seq to FBA pipeline toolkit", 19 ) 20 parser.add_argument( 21 "--countmatrix", 22 metavar="PATH", 23 help="Path to a count matrix file from featureCounts ().txt/.tsv)", 24 ) 25 parser.add_argument( 26 "--model", 27 metavar="PATH", 28 help="Path to the metabolic model file (.xml or .SBML)", 29 ) 30 parser.add_argument( 31 "--contrast", 32 nargs=2, 33 metavar=("TREATED", "REFERENCE") 34 ) 35 parser.add_argument( 36 "--stats" 37 ) 38 parser.add_argument( 39 "--pop", 40 action="store_true", 41 help="Computes the growth rate into a population model and saves respective plots." 42 ) 43 parser.add_argument( 44 "--label", 45 nargs="+", 46 metavar="LABEL", 47 help="One label per sample (in count-matrix column order), used in the prints instead of the sample IDs.", 48 ) 49 50 src = parser.add_mutually_exclusive_group(required=False) 51 src.add_argument("--sra", metavar="CSV", 52 help="SraRunTable.csv from NCBI Run Selector") 53 args = parser.parse_args() 54 55 if args.countmatrix is None: 56 path_str = input("Path to count matrix file: ").strip() 57 else: 58 path_str = args.countmatrix 59 60 path = Path(path_str) 61 62 if args.model is None: 63 model_path_str = input("Path to metabolic model file: ").strip() 64 else: 65 model_path_str = args.model 66 67 model_path = Path(model_path_str) 68 69 print(f"Loading count matrix from '{path}' ...") 70 try: 71 cm = CountMatrix.from_file(path) 72 samples = list(cm.sample_names) 73 if args.label is not None and len(args.label) != len(samples): 74 print(f"Error: --label expects {len(samples)} label(s) " 75 f"(one per sample), got {len(args.label)}.") 76 raise SystemExit(1) 77 except FileNotFoundError: 78 print(f"Error: File not found: '{path}'") 79 raise SystemExit(1) 80 except ValueError as e: 81 print(f"Error: {e}") 82 raise SystemExit(1) 83 84 if args.sra: 85 md = Metadata.from_sra_run_table(args.sra) 86 md_samples = list(md.align(cm.counts).groups) 87 else: 88 md = None 89 md_samples = cm.sample_names 90 91 if args.stats: 92 de = DifferentialExpression(cm, md).fit() 93 94 if args.contrast: 95 a, b = args.contrast 96 de = DifferentialExpression(cm, md).fit() 97 98 de.results(a, b).to_csv(f"results/de_{a}_vs_{b}.csv") 99 100 ax = de.volcano(a, b) 101 _save(ax.figure, f"volcano_{a}_vs_{b}.png", "results") 102 103 print(f"Loading metabolic model from '{model_path}' ...") 104 105 try: 106 model = Model.from_file(model_path) 107 except FileNotFoundError: 108 print(f"Error: File not found: '{model_path}'") 109 raise SystemExit(1) 110 except ValueError as e: 111 print(f"Error: {e}") 112 raise SystemExit(1) 113 114 print(cm.summary()) 115 print(model.summary()) 116 print("---- Mapping genes between count matrix and metabolic model ----") 117 118 conn = Connector(model, cm) 119 sol = conn.compare(cm.sample_names) 120 121 print("---- Successfull optimization ----") 122 123 if args.label is not None: 124 md_samples = args.label 125 for sample, md_sample in zip(cm.sample_names, md_samples): 126 print(f"growth rate mue for {md_sample}: {sol[sample].objective_value}") 127 128 if args.pop: 129 pops = PopulationSet.from_connector(conn, md) 130 ax = pops.plot_growth_curves(t_max=6) 131 pops.plot_growth_rates() 132 133 print("-----------------------------------------") 134 print("| A D E S O M I C S |") 135 print("-----------------------------------------")
def
main():
15def main(): 16 17 parser = argparse.ArgumentParser( 18 prog="adesomics", 19 description="adesomics: RNA-seq to FBA pipeline toolkit", 20 ) 21 parser.add_argument( 22 "--countmatrix", 23 metavar="PATH", 24 help="Path to a count matrix file from featureCounts ().txt/.tsv)", 25 ) 26 parser.add_argument( 27 "--model", 28 metavar="PATH", 29 help="Path to the metabolic model file (.xml or .SBML)", 30 ) 31 parser.add_argument( 32 "--contrast", 33 nargs=2, 34 metavar=("TREATED", "REFERENCE") 35 ) 36 parser.add_argument( 37 "--stats" 38 ) 39 parser.add_argument( 40 "--pop", 41 action="store_true", 42 help="Computes the growth rate into a population model and saves respective plots." 43 ) 44 parser.add_argument( 45 "--label", 46 nargs="+", 47 metavar="LABEL", 48 help="One label per sample (in count-matrix column order), used in the prints instead of the sample IDs.", 49 ) 50 51 src = parser.add_mutually_exclusive_group(required=False) 52 src.add_argument("--sra", metavar="CSV", 53 help="SraRunTable.csv from NCBI Run Selector") 54 args = parser.parse_args() 55 56 if args.countmatrix is None: 57 path_str = input("Path to count matrix file: ").strip() 58 else: 59 path_str = args.countmatrix 60 61 path = Path(path_str) 62 63 if args.model is None: 64 model_path_str = input("Path to metabolic model file: ").strip() 65 else: 66 model_path_str = args.model 67 68 model_path = Path(model_path_str) 69 70 print(f"Loading count matrix from '{path}' ...") 71 try: 72 cm = CountMatrix.from_file(path) 73 samples = list(cm.sample_names) 74 if args.label is not None and len(args.label) != len(samples): 75 print(f"Error: --label expects {len(samples)} label(s) " 76 f"(one per sample), got {len(args.label)}.") 77 raise SystemExit(1) 78 except FileNotFoundError: 79 print(f"Error: File not found: '{path}'") 80 raise SystemExit(1) 81 except ValueError as e: 82 print(f"Error: {e}") 83 raise SystemExit(1) 84 85 if args.sra: 86 md = Metadata.from_sra_run_table(args.sra) 87 md_samples = list(md.align(cm.counts).groups) 88 else: 89 md = None 90 md_samples = cm.sample_names 91 92 if args.stats: 93 de = DifferentialExpression(cm, md).fit() 94 95 if args.contrast: 96 a, b = args.contrast 97 de = DifferentialExpression(cm, md).fit() 98 99 de.results(a, b).to_csv(f"results/de_{a}_vs_{b}.csv") 100 101 ax = de.volcano(a, b) 102 _save(ax.figure, f"volcano_{a}_vs_{b}.png", "results") 103 104 print(f"Loading metabolic model from '{model_path}' ...") 105 106 try: 107 model = Model.from_file(model_path) 108 except FileNotFoundError: 109 print(f"Error: File not found: '{model_path}'") 110 raise SystemExit(1) 111 except ValueError as e: 112 print(f"Error: {e}") 113 raise SystemExit(1) 114 115 print(cm.summary()) 116 print(model.summary()) 117 print("---- Mapping genes between count matrix and metabolic model ----") 118 119 conn = Connector(model, cm) 120 sol = conn.compare(cm.sample_names) 121 122 print("---- Successfull optimization ----") 123 124 if args.label is not None: 125 md_samples = args.label 126 for sample, md_sample in zip(cm.sample_names, md_samples): 127 print(f"growth rate mue for {md_sample}: {sol[sample].objective_value}") 128 129 if args.pop: 130 pops = PopulationSet.from_connector(conn, md) 131 ax = pops.plot_growth_curves(t_max=6) 132 pops.plot_growth_rates() 133 134 print("-----------------------------------------") 135 print("| A D E S O M I C S |") 136 print("-----------------------------------------")