# `pronto` [![Stars](https://img.shields.io/github/stars/althonos/pronto.svg?style=social&maxAge=3600&label=Star)](https://github.com/althonos/pronto/stargazers)
*A Python frontend to ontologies.*
[![Actions](https://img.shields.io/github/actions/workflow/status/althonos/pronto/test.yml?branch=master&logo=github&style=flat-square&maxAge=300)](https://github.com/althonos/pronto/actions)
[![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square&maxAge=2678400)](https://choosealicense.com/licenses/mit/)
[![Source](https://img.shields.io/badge/source-GitHub-303030.svg?maxAge=2678400&style=flat-square)](https://github.com/althonos/pronto/)
[![Docs](https://img.shields.io/readthedocs/pronto?style=flat-square&maxAge=3600)](http://pronto.readthedocs.io/en/stable/?badge=stable)
[![Coverage](https://img.shields.io/codecov/c/gh/althonos/pronto?style=flat-square&maxAge=3600)](https://codecov.io/gh/althonos/pronto/)
[![Sanity](https://img.shields.io/codacy/grade/157b5fd24e5648ea80580f28399e79a4.svg?style=flat-square&maxAge=3600)](https://codacy.com/app/althonos/pronto)
[![PyPI](https://img.shields.io/pypi/v/pronto.svg?style=flat-square&maxAge=3600)](https://pypi.python.org/pypi/pronto)
[![Bioconda](https://img.shields.io/conda/vn/bioconda/pronto?style=flat-square&maxAge=3600)](https://anaconda.org/bioconda/pronto)
[![Versions](https://img.shields.io/pypi/pyversions/pronto.svg?style=flat-square&maxAge=3600)](https://pypi.org/project/pronto/#files)
[![Wheel](https://img.shields.io/pypi/wheel/pronto?style=flat-square&maxAge=3600)](https://pypi.org/project/pronto/#files)
[![Changelog](https://img.shields.io/badge/keep%20a-changelog-8A0707.svg?maxAge=2678400&style=flat-square)](https://github.com/althonos/pronto/blob/master/CHANGELOG.md)
[![GitHub issues](https://img.shields.io/github/issues/althonos/pronto.svg?style=flat-square&maxAge=600)](https://github.com/althonos/pronto/issues)
[![DOI](https://img.shields.io/badge/doi-10.5281%2Fzenodo.595572-purple?style=flat-square&maxAge=2678400)](https://doi.org/10.5281/zenodo.595572)
[![Downloads](https://img.shields.io/pypi/dm/pronto?style=flat-square&color=303f9f&maxAge=86400&label=downloads)](https://pepy.tech/project/pronto)
## π© Table of Contents
- [Overview](#%EF%B8%8F-overview)
- [Supported Languages](#%EF%B8%8F-supported-languages)
- [Installing](#-installing)
- [Examples](#-examples)
- [API Reference](#-api-reference)
- [License](#-license)
## πΊοΈ Overview
Pronto is a Python library to parse, browse, create, and export
ontologies, supporting several ontology languages and formats. It
implement the specifications of the
[Open Biomedical Ontologies 1.4](http://owlcollab.github.io/oboformat/doc/obo-syntax.html)
in the form of an safe high-level interface. *If you're only interested in
parsing OBO or OBO Graphs document, you may wish to consider
[`fastobo`](https://pypi.org/project/fastobo) instead.*
## π³οΈ Supported Languages
- [Open Biomedical Ontologies 1.4](http://owlcollab.github.io/oboformat/doc/GO.format.obo-1_4.html).
*Because this format is fairly new, not all OBO ontologies can be parsed at the
moment. See the [OBO Foundry roadmap](https://github.com/orgs/fastobo/projects/2)
listing the compliant ontologies, and don't hesitate to contact their developers
to push adoption forward.*
- [OBO Graphs](https://github.com/geneontology/obographs) in [JSON](http://json.org/)
format. *The format is not yet stabilized to the results may change from file
to file.*
- [Ontology Web Language 2](https://www.w3.org/TR/owl2-overview/)
in [RDF/XML format](https://www.w3.org/TR/2012/REC-owl2-mapping-to-rdf-20121211/).
*OWL2 ontologies are reverse translated to OBO using the mapping defined in the
[OBO 1.4 Semantics](http://owlcollab.github.io/oboformat/doc/obo-syntax.html).*
## π§ Installing
Installing with `pip` is the easiest:
```console
# pip install pronto # if you have the admin rights
$ pip install pronto --user # install it in a user-site directory
```
There is also a `conda` recipe in the `bioconda` channel:
```console
$ conda install -c bioconda pronto
```
Finally, a development version can be installed from GitHub
using `setuptools`, provided you have the right dependencies
installed already:
```console
$ git clone https://github.com/althonos/pronto
$ cd pronto
# python setup.py install
```
## π‘ Examples
If you're only reading ontologies, you'll only use the `Ontology`
class, which is the main entry point.
```python
>>> from pronto import Ontology
```
It can be instantiated from a path to an ontology in one of the supported
formats, even if the file is compressed:
```python
>>> go = Ontology("tests/data/go.obo.gz")
```
Loading a file from a persistent URL is also supported, although you may also
want to use the `Ontology.from_obo_library` method if you're using persistent
URLs a lot:
```python
>>> cl = Ontology("http://purl.obolibrary.org/obo/cl.obo")
>>> stato = Ontology.from_obo_library("stato.owl")
```
### π·οΈ Get a term by accession
`Ontology` objects can be used as mappings to access any entity
they contain from their identifier in compact form:
```python
>>> cl['CL:0002116']
Term('CL:0002116', name='B220-low CD38-positive unswitched memory B cell')
```
Note that when loading an OWL ontology, URIs will be compacted to CURIEs
whenever possible:
```python
>>> aeo = Ontology.from_obo_library("aeo.owl")
>>> aeo["AEO:0000078"]
Term('AEO:0000078', name='lumen of tube')
```
### ποΈ Create a new term from scratch
We can load an ontology, and edit it locally. Here, we add a new protein class
to the Protein Ontology.
```python
>>> pr = Ontology.from_obo_library("pr.obo")
>>> brh = ms.create_term("PR:XXXXXXXX")
>>> brh.name = "Bacteriorhodopsin"
>>> brh.superclasses().add(pr["PR:000001094"]) # is a rhodopsin-like G-protein
>>> brh.disjoint_from.add(pr["PR:000036194"]) # disjoint from eukaryotic proteins
```
### βοΈ Convert an OWL ontology to OBO format
The `Ontology.dump` method can be used to serialize an ontology to any of the
supported formats (currently OBO and OBO JSON):
```python
>>> edam = Ontology("http://edamontology.org/EDAM.owl")
>>> with open("edam.obo", "wb") as f:
... edam.dump(f, format="obo")
```
### πΏ Find ontology terms without subclasses
The `terms` method of `Ontology` instances can be used to
iterate over all the terms in the ontology (including the
ones that are imported). We can then use the `is_leaf`
method of `Term` objects to check is the term is a leaf in the
class inclusion graph.
```python
>>> ms = Ontology("ms.obo")
>>> for term in ms.terms():
... if term.is_leaf():
... print(term.id)
MS:0000000
MS:1000001
...
```
### π€« Silence warnings
`pronto` is explicit about the parts of the code that are doing
non-standard assumptions, or missing capabilities to handle certain
constructs. It does so by raising warnings with the `warnings` module,
which can get quite verbose.
If you are fine with the inconsistencies, you can manually disable
warning reports in your consumer code with the `filterwarnings` function:
```python
import warnings
import pronto
warnings.filterwarnings("ignore", category=pronto.warnings.ProntoWarning)
```
<!-- ### π€ Merging several ontologies -->
## π API Reference
A complete API reference can be found in the
[online documentation](https://pronto.readthedocs.io/en/latest/api.html), or
directly from the command line using `pydoc`:
```console
$ pydoc pronto.Ontology
```
## π License
This library is provided under the open-source
[MIT license](https://choosealicense.com/licenses/mit/).
Please cite this library if you are using it in a scientific
context using the following DOI:
[**10.5281/zenodo.595572**](https://doi.org/10.5281/zenodo.595572)
Raw data
{
"_id": null,
"home_page": "https://github.com/althonos/pronto",
"name": "pronto",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "bioinformatics, ontology, OBO, OWL, convert, parse",
"author": "Martin Larralde",
"author_email": "martin.larralde@embl.de",
"download_url": "https://files.pythonhosted.org/packages/21/cd/4b25a0919be39c2dbdd5a6bc7c93c0f22ed955b0c27b11e3d73a74ff0fef/pronto-2.5.8.tar.gz",
"platform": "any",
"description": "# `pronto` [![Stars](https://img.shields.io/github/stars/althonos/pronto.svg?style=social&maxAge=3600&label=Star)](https://github.com/althonos/pronto/stargazers)\n\n*A Python frontend to ontologies.*\n\n[![Actions](https://img.shields.io/github/actions/workflow/status/althonos/pronto/test.yml?branch=master&logo=github&style=flat-square&maxAge=300)](https://github.com/althonos/pronto/actions)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square&maxAge=2678400)](https://choosealicense.com/licenses/mit/)\n[![Source](https://img.shields.io/badge/source-GitHub-303030.svg?maxAge=2678400&style=flat-square)](https://github.com/althonos/pronto/)\n[![Docs](https://img.shields.io/readthedocs/pronto?style=flat-square&maxAge=3600)](http://pronto.readthedocs.io/en/stable/?badge=stable)\n[![Coverage](https://img.shields.io/codecov/c/gh/althonos/pronto?style=flat-square&maxAge=3600)](https://codecov.io/gh/althonos/pronto/)\n[![Sanity](https://img.shields.io/codacy/grade/157b5fd24e5648ea80580f28399e79a4.svg?style=flat-square&maxAge=3600)](https://codacy.com/app/althonos/pronto)\n[![PyPI](https://img.shields.io/pypi/v/pronto.svg?style=flat-square&maxAge=3600)](https://pypi.python.org/pypi/pronto)\n[![Bioconda](https://img.shields.io/conda/vn/bioconda/pronto?style=flat-square&maxAge=3600)](https://anaconda.org/bioconda/pronto)\n[![Versions](https://img.shields.io/pypi/pyversions/pronto.svg?style=flat-square&maxAge=3600)](https://pypi.org/project/pronto/#files)\n[![Wheel](https://img.shields.io/pypi/wheel/pronto?style=flat-square&maxAge=3600)](https://pypi.org/project/pronto/#files)\n[![Changelog](https://img.shields.io/badge/keep%20a-changelog-8A0707.svg?maxAge=2678400&style=flat-square)](https://github.com/althonos/pronto/blob/master/CHANGELOG.md)\n[![GitHub issues](https://img.shields.io/github/issues/althonos/pronto.svg?style=flat-square&maxAge=600)](https://github.com/althonos/pronto/issues)\n[![DOI](https://img.shields.io/badge/doi-10.5281%2Fzenodo.595572-purple?style=flat-square&maxAge=2678400)](https://doi.org/10.5281/zenodo.595572)\n[![Downloads](https://img.shields.io/pypi/dm/pronto?style=flat-square&color=303f9f&maxAge=86400&label=downloads)](https://pepy.tech/project/pronto)\n\n## \ud83d\udea9 Table of Contents\n\n- [Overview](#%EF%B8%8F-overview)\n- [Supported Languages](#%EF%B8%8F-supported-languages)\n- [Installing](#-installing)\n- [Examples](#-examples)\n- [API Reference](#-api-reference)\n- [License](#-license)\n\n## \ud83d\uddfa\ufe0f Overview\n\nPronto is a Python library to parse, browse, create, and export\nontologies, supporting several ontology languages and formats. It\nimplement the specifications of the\n[Open Biomedical Ontologies 1.4](http://owlcollab.github.io/oboformat/doc/obo-syntax.html)\nin the form of an safe high-level interface. *If you're only interested in\nparsing OBO or OBO Graphs document, you may wish to consider\n[`fastobo`](https://pypi.org/project/fastobo) instead.*\n\n\n## \ud83c\udff3\ufe0f Supported Languages\n\n- [Open Biomedical Ontologies 1.4](http://owlcollab.github.io/oboformat/doc/GO.format.obo-1_4.html).\n *Because this format is fairly new, not all OBO ontologies can be parsed at the\n moment. See the [OBO Foundry roadmap](https://github.com/orgs/fastobo/projects/2)\n listing the compliant ontologies, and don't hesitate to contact their developers\n to push adoption forward.*\n- [OBO Graphs](https://github.com/geneontology/obographs) in [JSON](http://json.org/)\n format. *The format is not yet stabilized to the results may change from file\n to file.*\n- [Ontology Web Language 2](https://www.w3.org/TR/owl2-overview/)\n in [RDF/XML format](https://www.w3.org/TR/2012/REC-owl2-mapping-to-rdf-20121211/).\n *OWL2 ontologies are reverse translated to OBO using the mapping defined in the\n [OBO 1.4 Semantics](http://owlcollab.github.io/oboformat/doc/obo-syntax.html).*\n\n## \ud83d\udd27 Installing\n\n\nInstalling with `pip` is the easiest:\n```console\n# pip install pronto # if you have the admin rights\n$ pip install pronto --user # install it in a user-site directory\n```\n\nThere is also a `conda` recipe in the `bioconda` channel:\n```console\n$ conda install -c bioconda pronto\n```\n\nFinally, a development version can be installed from GitHub\nusing `setuptools`, provided you have the right dependencies\ninstalled already:\n```console\n$ git clone https://github.com/althonos/pronto\n$ cd pronto\n# python setup.py install\n```\n\n## \ud83d\udca1 Examples\n\nIf you're only reading ontologies, you'll only use the `Ontology`\nclass, which is the main entry point.\n\n```python\n>>> from pronto import Ontology\n```\n\nIt can be instantiated from a path to an ontology in one of the supported\nformats, even if the file is compressed:\n```python\n>>> go = Ontology(\"tests/data/go.obo.gz\")\n```\n\nLoading a file from a persistent URL is also supported, although you may also\nwant to use the `Ontology.from_obo_library` method if you're using persistent\nURLs a lot:\n```python\n>>> cl = Ontology(\"http://purl.obolibrary.org/obo/cl.obo\")\n>>> stato = Ontology.from_obo_library(\"stato.owl\")\n```\n\n### \ud83c\udff7\ufe0f Get a term by accession\n\n`Ontology` objects can be used as mappings to access any entity\nthey contain from their identifier in compact form:\n```python\n>>> cl['CL:0002116']\nTerm('CL:0002116', name='B220-low CD38-positive unswitched memory B cell')\n```\n\nNote that when loading an OWL ontology, URIs will be compacted to CURIEs\nwhenever possible:\n\n```python\n>>> aeo = Ontology.from_obo_library(\"aeo.owl\")\n>>> aeo[\"AEO:0000078\"]\nTerm('AEO:0000078', name='lumen of tube')\n```\n\n### \ud83d\udd8a\ufe0f Create a new term from scratch\n\nWe can load an ontology, and edit it locally. Here, we add a new protein class\nto the Protein Ontology.\n```python\n>>> pr = Ontology.from_obo_library(\"pr.obo\")\n>>> brh = ms.create_term(\"PR:XXXXXXXX\")\n>>> brh.name = \"Bacteriorhodopsin\"\n>>> brh.superclasses().add(pr[\"PR:000001094\"]) # is a rhodopsin-like G-protein\n>>> brh.disjoint_from.add(pr[\"PR:000036194\"]) # disjoint from eukaryotic proteins\n```\n\n### \u270f\ufe0f Convert an OWL ontology to OBO format\n\nThe `Ontology.dump` method can be used to serialize an ontology to any of the\nsupported formats (currently OBO and OBO JSON):\n```python\n>>> edam = Ontology(\"http://edamontology.org/EDAM.owl\")\n>>> with open(\"edam.obo\", \"wb\") as f:\n... edam.dump(f, format=\"obo\")\n```\n\n### \ud83c\udf3f Find ontology terms without subclasses\n\nThe `terms` method of `Ontology` instances can be used to\niterate over all the terms in the ontology (including the\nones that are imported). We can then use the `is_leaf`\nmethod of `Term` objects to check is the term is a leaf in the\nclass inclusion graph.\n\n```python\n>>> ms = Ontology(\"ms.obo\")\n>>> for term in ms.terms():\n... if term.is_leaf():\n... print(term.id)\nMS:0000000\nMS:1000001\n...\n```\n\n### \ud83e\udd2b Silence warnings\n\n`pronto` is explicit about the parts of the code that are doing \nnon-standard assumptions, or missing capabilities to handle certain\nconstructs. It does so by raising warnings with the `warnings` module, \nwhich can get quite verbose. \n\nIf you are fine with the inconsistencies, you can manually disable \nwarning reports in your consumer code with the `filterwarnings` function:\n\n```python\nimport warnings\nimport pronto\nwarnings.filterwarnings(\"ignore\", category=pronto.warnings.ProntoWarning)\n```\n\n<!-- ### \ud83e\udd1d Merging several ontologies -->\n\n## \ud83d\udcd6 API Reference\n\nA complete API reference can be found in the\n[online documentation](https://pronto.readthedocs.io/en/latest/api.html), or\ndirectly from the command line using `pydoc`:\n```console\n$ pydoc pronto.Ontology\n```\n\n## \ud83d\udcdc License\n\nThis library is provided under the open-source\n[MIT license](https://choosealicense.com/licenses/mit/).\nPlease cite this library if you are using it in a scientific\ncontext using the following DOI:\n[**10.5281/zenodo.595572**](https://doi.org/10.5281/zenodo.595572)\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Python frontend to ontologies.",
"version": "2.5.8",
"project_urls": {
"Bug Tracker": "https://github.com/althonos/pronto/issues",
"CI": "https://github.com/althonos/pronto/actions",
"Changelog": "https://pronto.readthedocs.io/en/latest/changes.html",
"Coverage": "https://app.codecov.io/gh/althonos/pronto",
"Documentation": "https://pronto.readthedocs.io/en/latest/",
"Homepage": "https://github.com/althonos/pronto"
},
"split_keywords": [
"bioinformatics",
" ontology",
" obo",
" owl",
" convert",
" parse"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "eebe38d99005ea42725b2440f472ccae4fb73635652bb658db28fb90808f3e49",
"md5": "94e518e982547ea5aef3a192e9293d2d",
"sha256": "91445cd2c2000729e9b23be47b1e142fd967239700284f1375ee2b78d54a3416"
},
"downloads": -1,
"filename": "pronto-2.5.8-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "94e518e982547ea5aef3a192e9293d2d",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=3.7",
"size": 61732,
"upload_time": "2024-09-14T15:53:25",
"upload_time_iso_8601": "2024-09-14T15:53:25.013609Z",
"url": "https://files.pythonhosted.org/packages/ee/be/38d99005ea42725b2440f472ccae4fb73635652bb658db28fb90808f3e49/pronto-2.5.8-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "21cd4b25a0919be39c2dbdd5a6bc7c93c0f22ed955b0c27b11e3d73a74ff0fef",
"md5": "32502c2ca5907878f93b631866a772aa",
"sha256": "5283ec5b35ddc12d34f2e50098b9900bb7b80172b7f769ccc93f5d82b7022799"
},
"downloads": -1,
"filename": "pronto-2.5.8.tar.gz",
"has_sig": false,
"md5_digest": "32502c2ca5907878f93b631866a772aa",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 60844,
"upload_time": "2024-09-14T15:53:26",
"upload_time_iso_8601": "2024-09-14T15:53:26.701299Z",
"url": "https://files.pythonhosted.org/packages/21/cd/4b25a0919be39c2dbdd5a6bc7c93c0f22ed955b0c27b11e3d73a74ff0fef/pronto-2.5.8.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-09-14 15:53:26",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "althonos",
"github_project": "pronto",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "pronto"
}