Mercurial > repos > tduigou > get_sbml_model
view get_infos.py @ 13:6bcd8f09158d draft default tip
planemo upload for repository https://github.com/brsynth/synbiocad-galaxy-wrappers commit 8ab0b9452a029b409b18b80243958b4901bdeb3d
author | tduigou |
---|---|
date | Tue, 01 Apr 2025 10:00:36 +0000 |
parents | 1aadcfdae10b |
children |
line wrap: on
line source
from argparse import ArgumentParser from libsbml import readSBMLFromFile from taxonid import get_taxonid from requests import get as r_get def get_biomass_rxn(sbml_doc): """ Returns the biomass reaction of the model Parameters ---------- sbml_doc: libsbml.SBMLDocument SBML model Returns ------- biomass_rxn: libsbml.Reaction Biomass reaction """ reactions = sbml_doc.getModel().getListOfReactions() # Search for 'biomass' keyword in reaction name for rxn in reactions: if "biomass" in rxn.getName().lower(): return rxn # Search for 'biomass' keyword in products # AND not in reactants for rxn in reactions: in_reactants = False for reac in rxn.getListOfReactants(): if "biomass" in reac.getSpecies().lower(): in_reactants = True break if not in_reactants: for prod in rxn.getListOfProducts(): if "biomass" in prod.getSpecies().lower(): return rxn return None def args(): parser = ArgumentParser("Returns cell informations") parser.add_argument("infile", type=str, help="SBML input file (xml)") parser.add_argument("--biomassid", type=str, help="ID of biomass reaction") parser.add_argument("--taxonid", type=str, help="Taxonomy ID") parser.add_argument("--standalone", action="store_true", help="Standalone mode, e.g. do not retrieve taxonomy ID on Internet (true if --taxonid is provided)") parser.add_argument("--compartments-outfile", type=str, help="Path to store cell compartments") parser.add_argument("--biomassid-outfile", type=str, help="Path to store biomass reaction ID") parser.add_argument("--taxonid-outfile", type=str, help="Path to store host taxonomy ID") params = parser.parse_args() return params def get_organism_from_bigg_model(model_id): """Try to retrieve organism info from BiGG Models for a given model ID.""" url = f"http://bigg.ucsd.edu/api/v2/models/{model_id}" try: response = r_get(url) if response.status_code == 200: data = response.json() organism = data.get("organism") return organism except Exception as e: print(f"Error querying BiGG: {e}") return None def get_taxon_id(input_name): """Try BiGG model name first, then NCBI directly.""" print(f"Trying input: {input_name}") # Try resolving as a BiGG model organism = get_organism_from_bigg_model(input_name) if organism: print(f"Model '{input_name}' maps to organism: {organism}") taxon_id = get_taxonid(organism) if taxon_id: return taxon_id # If not a model, try directly as an organism name print(f"Trying NCBI search with input: {input_name}") return get_taxonid(input_name) def entry_point(): params = args() # test if the file exists with open(params.infile): pass sbml_doc = readSBMLFromFile(params.infile) compartments = sbml_doc.getModel().getListOfCompartments() comp_str = "" for comp in compartments: comp_str += f"{comp.getId()}\t{comp.getName()}\n" print("Compartments:") for comp in compartments: print(f"{comp.getId()}\t{comp.getName()}".replace("\n", " | ")) if params.compartments_outfile: with open(params.compartments_outfile, "w") as f: f.write("#ID\tNAME\n") f.write(comp_str) if params.biomassid: biomass_rxn = sbml_doc.getModel().getReaction(params.biomassid) else: biomass_rxn = get_biomass_rxn(sbml_doc) if not biomass_rxn: print("Warning: unable to retrieve biomass reaction") biomass_id = "" else: biomass_id = biomass_rxn.getId() print(f"Biomass reaction ID: {biomass_id}") if params.biomassid_outfile: with open(params.biomassid_outfile, "w") as f: f.write("#ID\n") f.write(f"{biomass_id}\n") if params.taxonid: taxid = params.taxonid elif params.standalone: taxid = -1 else: model_id = sbml_doc.getModel().getId() if model_id: taxid = get_taxon_id(sbml_doc.getModel().getId()) if taxid == -1: # Try with model name model_name = sbml_doc.getModel().getName() if model_name: taxid = get_taxon_id(sbml_doc.getModel().getName()) print(f"Taxonomy ID: {taxid}") if params.taxonid_outfile: with open(params.taxonid_outfile, "w") as f: f.write("#ID\n") f.write(f"{taxid}\n") if __name__ == "__main__": entry_point()