├── src └── brendapyrser │ ├── __init__.py │ ├── constants.py │ └── parser.py ├── assets ├── logo.png └── social_logo_cut.png ├── MANIFEST.in ├── envs └── brendapyrser-dev.yml ├── CITATION.cff ├── .gitignore ├── .github ├── workflows │ ├── docs.yml │ ├── ci.yml │ ├── joss.yml │ ├── tests.yml │ └── docker.yml ├── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md └── CODE_OF_CONDUCT.md ├── pyproject.toml ├── README.md ├── paper ├── paper.md └── paper.bib ├── CONTRIBUTING.md ├── LICENSE ├── tests └── tests.py └── docs └── examples.ipynb /src/brendapyrser/__init__.py: -------------------------------------------------------------------------------- 1 | from .parser import Reaction, BRENDA, ReactionList 2 | -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Robaina/BRENDApyrser/HEAD/assets/logo.png -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | prune data code_oven README_files .ipynb_checkpoints 2 | exclude README.ipynb gitignore 3 | -------------------------------------------------------------------------------- /assets/social_logo_cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Robaina/BRENDApyrser/HEAD/assets/social_logo_cut.png -------------------------------------------------------------------------------- /envs/brendapyrser-dev.yml: -------------------------------------------------------------------------------- 1 | name: brendapyrser-dev 2 | channels: 3 | - defaults 4 | - bioconda 5 | - conda-forge 6 | dependencies: 7 | - python >= 3.8 8 | - poetry >= 1.3 9 | - pip 10 | - pip: 11 | - mkdocs 12 | - mkdocs-gen-files 13 | - pymdown-extensions 14 | - mkdocs-jupyter 15 | - mkdocstrings[python] 16 | - ruff 17 | - black 18 | - black[jupyter] 19 | - argmark 20 | - coverage 21 | -------------------------------------------------------------------------------- /CITATION.cff: -------------------------------------------------------------------------------- 1 | cff-version: 1.2.0 2 | message: "If you use this software, please cite it as below." 3 | authors: 4 | - family-names: "Robaina-Estévez" 5 | given-names: "Semidán" 6 | orcid: "https://orcid.org/0000-0003-0781-1677" 7 | title: "BRENDApyrser: a Python package to parse and manipulate the BRENDA database" 8 | version: 0.0.3 9 | doi: 10.5281/zenodo.7026555 10 | date-released: 2022-08-26 11 | url: "https://github.com/Robaina/BRENDApyrser" 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.txt 2 | /code_oven 3 | /data 4 | /.ipynb_checkpoints 5 | 6 | *.py[cod] 7 | 8 | # C extensions 9 | *.so 10 | 11 | # Packages 12 | *.egg 13 | *.egg-info 14 | dist 15 | build 16 | eggs 17 | parts 18 | bin 19 | var 20 | sdist 21 | develop-eggs 22 | .installed.cfg 23 | lib 24 | lib64 25 | __pycache__ 26 | 27 | # *.ipynb 28 | 29 | # Installer logs 30 | pip-log.txt 31 | 32 | # Unit test / coverage reports 33 | .coverage 34 | .tox 35 | nosetests.xml 36 | 37 | # Translations 38 | *.mo 39 | 40 | # Mr Developer 41 | .mr.developer.cfg 42 | .project 43 | .pydevproject 44 | dev.ipynb 45 | 46 | *NOTES.txt 47 | 48 | ms/* 49 | -------------------------------------------------------------------------------- /.github/workflows/docs.yml: -------------------------------------------------------------------------------- 1 | name: docs 2 | on: 3 | push: 4 | branches: [ main ] 5 | paths: 6 | - 'docs/**' 7 | - 'mkdocs.yml' 8 | 9 | jobs: 10 | 11 | build-docs: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v3 15 | with: 16 | fetch-depth: 0 17 | - uses: actions/setup-python@v2 18 | - run: pip install --upgrade pip && pip install mkdocs mkdocs-gen-files pymdown-extensions mkdocs-jupyter mkdocstrings[python] 19 | - run: git config user.name 'github-actions[bot]' && git config user.email 'github-actions[bot]@users.noreply.github.com' 20 | - name: Publish docs 21 | run: mkdocs gh-deploy 22 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: push 3 | jobs: 4 | quality: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - uses: actions/checkout@v3 8 | - name: Install Python 9 | uses: actions/setup-python@v4 10 | with: 11 | python-version: "3.8" 12 | - name: Install dependencies 13 | run: | 14 | python -m pip install --upgrade pip 15 | pip install ruff black 16 | # Include `--format=github` to enable automatic inline annotations. 17 | # - name: Check linters 18 | # run: ruff --format=github . # ruff does not allow trailing white space in logo (cli.py) 19 | - name: Check format 20 | run: black --check . 21 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/workflows/joss.yml: -------------------------------------------------------------------------------- 1 | name: joss 2 | on: [push] 3 | 4 | jobs: 5 | paper: 6 | runs-on: ubuntu-latest 7 | name: Paper Draft 8 | steps: 9 | - name: Checkout 10 | uses: actions/checkout@v3 11 | - name: Open Journals PDF Generator 12 | uses: openjournals/openjournals-draft-action@master 13 | with: 14 | journal: joss 15 | # This should be the path to the paper within your repo. 16 | paper-path: ms/paper.md 17 | - name: Upload 18 | uses: actions/upload-artifact@v1 19 | with: 20 | name: paper 21 | # This is the output path where Pandoc will write the compiled 22 | # PDF. Note, this should be the same directory as the input 23 | # paper.md 24 | path: ms/paper.pdf 25 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: tests 2 | on: 3 | push: 4 | paths-ignore: 5 | - '**.md' 6 | - '**.ipynb' 7 | - '**.bib' 8 | - 'ms/*' 9 | pull_request: 10 | types: [opened, reopened, edited] 11 | paths-ignore: 12 | - '**.md' 13 | - '**.ipynb' 14 | - '**.bib' 15 | - 'ms/*' 16 | 17 | jobs: 18 | 19 | create-env: 20 | name: ${{ matrix.os }} 21 | runs-on: ${{ matrix.os }} 22 | defaults: 23 | run: 24 | shell: bash -l {0} 25 | 26 | strategy: 27 | fail-fast: false 28 | matrix: 29 | os: [ubuntu-latest, macos-latest] 30 | 31 | steps: 32 | - name: checkout repository 33 | uses: actions/checkout@v3 34 | with: 35 | fetch-depth: 0 36 | 37 | - name: create environment 38 | uses: conda-incubator/setup-miniconda@v2 39 | with: 40 | python-version: 3.8 41 | # mamba-version: "*" 42 | channels: conda-forge,bioconda,defaults 43 | auto-activate-base: false 44 | activate-environment: tests_brendapyrser 45 | environment-file: envs/brendapyrser-dev.yml 46 | 47 | - name: Build & Install BRENDApyrser 48 | run: poetry build && pip install dist/brendapyrser*.whl 49 | 50 | - name: Run tests and collect coverage 51 | run: coverage run -m unittest discover tests && coverage xml 52 | 53 | - name: Upload coverage to Codecov 54 | uses: codecov/codecov-action@v3 55 | with: 56 | version: "v0.1.15" 57 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["poetry-core"] 3 | build-backend = "poetry.core.masonry.api" 4 | 5 | [tool.poetry] 6 | name = "brendapyrser" 7 | version = "0.0.4" 8 | description = "Tools to parse the BRENDA database" 9 | license = "Apache-2.0" 10 | authors = ["Semidán Robaina Estévez "] 11 | maintainers = ["Semidán Robaina Estévez "] 12 | readme = "README.md" 13 | homepage = "https://github.com/robaina/BRENDApyrser" 14 | repository = "https://github.com/robaina/BRENDApyrser" 15 | documentation = "https://robaina.github.io/BRENDApyrser" 16 | keywords = ["BRENDA", "metabolism", "enzymes", "bioinformatics"] 17 | classifiers = [ 18 | "License :: OSI Approved :: Apache Software License", 19 | "Programming Language :: Python :: 3", 20 | "Topic :: Scientific/Engineering :: Bio-Informatics", 21 | "Natural Language :: English", 22 | ] 23 | packages = [{ include = "brendapyrser", from = "src" }] 24 | [tool.poetry.dependencies] 25 | python = "^3.8" 26 | numpy = "^1.20.2" 27 | pandas = "^1.2.4" 28 | importlib-metadata = "^4.0.1" 29 | 30 | [tool.ruff] 31 | select = [ 32 | "E", # pycodestyle errors 33 | "W", # pycodestyle warnings 34 | "F", # pyflakes 35 | "I", # isort 36 | ] 37 | ignore = [ 38 | "E501", # line too long, handled by black 39 | "B008", # do not perform function calls in argument defaults 40 | "C901", # mccabe complexity 41 | "E999", # match statement is not yet supported 42 | "W605", # ASCII art, verbatim text 43 | ] 44 | 45 | [tool.ruff.isort] 46 | known-first-party = ["brendapyrser"] 47 | -------------------------------------------------------------------------------- /src/brendapyrser/constants.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | BRENDA data fields and units of measurement. 6 | """ 7 | 8 | fields = { 9 | "AC": "activating compound", 10 | "AP": "application", 11 | "CF": "cofactor", 12 | "CL": "cloned", 13 | "CR": "crystallization", 14 | "EN": "engineering", 15 | "EXP": "expression", 16 | "GI": "general information on enzyme", 17 | "GS": "general stability", 18 | "IC50": "IC-50 Value", 19 | "ID": "EC-class", 20 | "IN": "inhibitors", 21 | "KKM": "Kcat/KM-Value substrate in {...}", 22 | "KI": "Ki-value, inhibitor in {...}", 23 | "KM": "KM-value, substrate in {...}", 24 | "LO": "localization", 25 | "ME": "metals/ions", 26 | "MW": "molecular weight", 27 | "NSP": "natural substrates/products reversibilty information in {...}", 28 | "OS": "oxygen stability", 29 | "OSS": "organic solvent stability", 30 | "PHO": "pH-optimum", 31 | "PHR": "pH-range", 32 | "PHS": "pH stability", 33 | "PI": "isoelectric point", 34 | "PM": "posttranslation modification", 35 | "PR": "protein", 36 | "PU": "purification", 37 | "RE": "reaction catalyzed", 38 | "RF": "references", 39 | "REN": "renatured", 40 | "RN": "accepted name (IUPAC)", 41 | "RT": "reaction type", 42 | "SA": "specific activity", 43 | "SN": "synonyms", 44 | "SP": "substrates/products, reversibilty information in {...}", 45 | "SS": "storage stability", 46 | "ST": "source/tissue", 47 | "SU": "subunits", 48 | "SY": "systematic name", 49 | "TN": "turnover number, substrate in {...}", 50 | "TO": "temperature optimum", 51 | "TR": "temperature range", 52 | "TS": "temperature stability", 53 | } 54 | 55 | units = { 56 | "KM": "mM", 57 | "KI": "mM", 58 | "TN": "$s^{-1}$", 59 | "SA": "$µmol.min^{-1}.mg^{-1}$", 60 | "KKM": "$mM^{-1}.s^{-1}$", 61 | "TO": "${}^oC$", 62 | "TR": "${}^oC$", 63 | "TS": "${}^oC$", 64 | "MW": "Da", 65 | } 66 | -------------------------------------------------------------------------------- /.github/workflows/docker.yml: -------------------------------------------------------------------------------- 1 | # This workflow uses actions that are not certified by GitHub. 2 | # They are provided by a third-party and are governed by 3 | # separate terms of service, privacy policy, and support 4 | # documentation. 5 | 6 | # GitHub recommends pinning actions to a commit SHA. 7 | # To get a newer version, you will need to update the SHA. 8 | # You can also reference a tag or branch, but the action may change without warning. 9 | 10 | name: Publish Docker image 11 | 12 | on: 13 | release: 14 | types: [published] 15 | 16 | push: 17 | branches: 18 | - main 19 | 20 | jobs: 21 | push_to_registries: 22 | name: Push Docker image to multiple registries 23 | runs-on: ubuntu-latest 24 | permissions: 25 | packages: write 26 | contents: read 27 | steps: 28 | - name: Check out the repo 29 | uses: actions/checkout@v3 30 | 31 | - name: Log in to Docker Hub 32 | uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 33 | with: 34 | username: ${{ secrets.DOCKER_USERNAME }} 35 | password: ${{ secrets.DOCKER_PASSWORD }} 36 | 37 | - name: Log in to the Container registry 38 | uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 39 | with: 40 | registry: ghcr.io 41 | username: ${{ github.actor }} 42 | password: ${{ secrets.API_GITHUB_TOKEN }} 43 | 44 | - name: Extract metadata (tags, labels) for Docker 45 | id: meta 46 | uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 47 | with: 48 | images: | 49 | robaina/brendapyrser 50 | ghcr.io/${{ github.repository }} 51 | 52 | - name: Build and push Docker images 53 | uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc 54 | with: 55 | context: . 56 | push: true 57 | tags: ${{ steps.meta.outputs.tags }} 58 | labels: ${{ steps.meta.outputs.labels }} -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![logo](assets/logo.png) 2 | ## a Python package to parse and manipulate the BRENDA database 3 | 4 | [![tests](https://github.com/Robaina/BRENDApyrser/actions/workflows/tests.yml/badge.svg)](https://github.com/Robaina/BRENDApyrser/actions/workflows/tests.yml) 5 | [![codecov](https://codecov.io/gh/Robaina/BRENDApyrser/graph/badge.svg?token=214SPFXRTG)](https://codecov.io/gh/Robaina/BRENDApyrser) 6 | ![PyPI](https://img.shields.io/pypi/v/brendapyrser) 7 | ![GitHub release (latest by date)](https://img.shields.io/github/v/release/Robaina/Brendapyrser) 8 | [![GitHub license](https://img.shields.io/github/license/Robaina/BRENDApyrser)](https://github.com/Robaina/BRENDApyrser/blob/master/LICENSE) 9 | ![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4) 10 | [![DOI](https://zenodo.org/badge/299416438.svg)](https://zenodo.org/badge/latestdoi/299416438) 11 | 12 | ## What is Brendapyrser? 13 | This project provides python classes and functions to parse the text file containing the entire BRENDA enzyme database (https://www.brenda-enzymes.org) 14 | 15 | This is an ongoing project! 16 | 17 | ## Installation 18 | 1. ```pip install brendapyrser``` 19 | 20 | or 21 | 22 | 2. Git clone project to local directory. 23 | 24 | In terminal navigate to directory and enter: ```python setup.py install``` 25 | 26 | ## Usage 27 | 28 | Due to BRENDA's license, BRENDA's database cannot be downloaded directly by the parser, instead, the user is asked to download the database as a text file after accepting usage conditions [here](https://www.brenda-enzymes.org/download.php). 29 | 30 | You can find a jupyter notebook with usage examples [here](docs/examples.ipynb). 31 | 32 | ## Contribute 33 | 34 | Contributions are always more than welcome! Feel free to fork, make changes and pull requests. If you don't know where to start, you can always browse open issues. Thanks! 35 | 36 | ## Citation 37 | 38 | If you use this software, please cite it as below: 39 | 40 | Robaina-Estévez, S. (2022). BRENDApyrser: a Python package to parse and manipulate the BRENDA database (Version 0.0.3)[Computer software]. https://doi.org/10.5281/zenodo.7026555 41 | -------------------------------------------------------------------------------- /paper/paper.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 'Brendapyrser: a Python package to parse and manipulate the BRENDA database' 3 | tags: 4 | - Python 5 | - bioinformatics 6 | - BRENDA 7 | - metabolism 8 | - enzymes 9 | - biochemistry 10 | authors: 11 | - name: Semidán Robaina-Estévez 12 | orcid: 0000-0003-0781-1677 13 | email: srobaina@ull.edu.es 14 | affiliation: 1 15 | affiliations: 16 | - name: Department of Microbiology. University of La Laguna. Spain. 17 | index: 1 18 | date: 18 August 2022 19 | bibliography: paper.bib 20 | --- 21 | 22 | # Summary 23 | 24 | Enzymes — proteins with specialized, catalytic functions — constitute the workforce of cellular metabolism, catalyzing thousands of biochemical reactions within cells. Enzymes present different physicochemical properties that affect their function. Knowledge about these enzyme functional properties is fundamental to understanding how biochemical reactions operate and are controlled by the cell. The BRENDA [@brenda] database is a widely-used, publicly available collection of enzyme functional information obtained from the primary literature. The development of computational tools to parse and query BRENDA would facilitate its integration in analyses of cellular metabolism. 25 | 26 | # Statement of need 27 | 28 | Users can access the BRENDA database directly on the website [@brenda-web], which provides searching and filtering capabilities. BRENDA also offers an API to access the database programmatically within several programming languages. However, obtaining specific data through the browser or the API turns inefficient in certain applications, for instance, when extracting certain data fields for thousands of enzymes to conduct statistical analyses. Here, we present `Brendapyrser`, a Python package to parse and manipulate the BRENDA database. Instead of accessing BRENDA via its API, `Brendapyrser` provides a collection of objects and methods to parse BRENDA locally as a text file — currently sized under 300 MB —, thus extracting data fields more quickly. 29 | 30 | `Brendapyrser` was developed to be used by both researchers and students in courses in the areas of biochemistry, molecular biology, bioinformatics and computational biology. Moreover, `Brendapyrser`'s syntax and object-oriented organization are well-suited for exploratory analyses within the Python ecosystem, integrating well with interactive computing tools such as Jupyter Notebooks [@jupyter]. 31 | 32 | # Acknowledgements 33 | 34 | We acknowledge constructive feedback from Brendapyrser users that has helped improve the package. This work has been conducted without any financial or commercial support. 35 | 36 | # References -------------------------------------------------------------------------------- /paper/paper.bib: -------------------------------------------------------------------------------- 1 | @misc{brenda-web, 2 | author = {Prof. Dr. D. Schomburg}, 3 | title = {BRENDA: The comprehensive ennzyme information system}, 4 | year = {2022}, 5 | publisher = {Technische Universität Braunschweig}, 6 | journal = {Website}, 7 | url = {https://www.brenda-enzymes.org} 8 | } 9 | 10 | @article{brenda, 11 | author = {Jeske, Lisa and Placzek, Sandra and Schomburg, Ida and Chang, Antje and Schomburg, Dietmar}, 12 | title = "{BRENDA in 2019: a European ELIXIR core data resource}", 13 | journal = {Nucleic Acids Research}, 14 | volume = {47}, 15 | number = {D1}, 16 | pages = {D542-D549}, 17 | year = {2018}, 18 | month = {11}, 19 | abstract = "{The BRENDA enzyme database (www.brenda-enzymes.org), recently appointed ELIXIR Core Data Resource, is the main enzyme and enzyme-ligand information system. The core database provides a comprehensive overview on enzymes. A collection of 4.3 million data for ∼84 000 enzymes manually evaluated and extracted from ∼140 000 primary literature references is combined with information obtained by text and data mining, data integration and prediction algorithms. Supplements comprise disease-related data, protein sequences, 3D structures, predicted enzyme locations and genome annotations. Major developments are a revised ligand summary page and the structure search now including a similarity and isomer search. BKMS-react, an integrated database containing known enzyme-catalyzed reactions, is supplemented with further reactions and improved access to pathway connections. In addition to existing enzyme word maps with graphical information of enzyme specific terms, plant word maps have been developed. They show a graphical overview of terms, e.g. enzyme or plant pathogen information, connected to specific plants. An organism summary page showing all relevant information, e.g. taxonomy and synonyms linked to enzyme data, was implemented. Based on a decision by the IUBMB enzyme task force the enzyme class EC 7 has been established for ‘translocases’, enzymes that catalyze a transport of ions or metabolites across cellular membranes.}", 20 | issn = {0305-1048}, 21 | doi = {10.1093/nar/gky1048}, 22 | url = {https://doi.org/10.1093/nar/gky1048}, 23 | eprint = {https://academic.oup.com/nar/article-pdf/47/D1/D542/27437170/gky1048.pdf}, 24 | } 25 | 26 | @conference{jupyter, 27 | Title = {Jupyter Notebooks -- a publishing format for reproducible computational workflows}, 28 | Author = {Thomas Kluyver and Benjamin Ragan-Kelley and Fernando P{\'e}rez and Brian Granger and Matthias Bussonnier and Jonathan Frederic and Kyle Kelley and Jessica Hamrick and Jason Grout and Sylvain Corlay and Paul Ivanov and Dami{\'a}n Avila and Safia Abdalla and Carol Willing}, 29 | Booktitle = {Positioning and Power in Academic Publishing: Players, Agents and Agendas}, 30 | Editor = {F. Loizides and B. Schmidt}, 31 | Organization = {IOS Press}, 32 | Pages = {87 - 90}, 33 | Year = {2016} 34 | } -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to BRENDApyrser 2 | 3 | First of all, thanks for taking the time to contribute! :tada::+1: 4 | 5 | Here you will find a set of guidelines for contributing to BRENDApyrser. Feel free to propose changes to this document in a pull request. 6 | 7 | ## Code of conduct 8 | 9 | This project and everyone participating in it is governed by the [Contributor Covenant, v2.0](.github/CODE_OF_CONDUCT.md) code of conduct. By participating, you are expected to uphold this code. 10 | 11 | ## I have a question! 12 | 13 | If you only have a question about all things related to BRENDApyrser, the best course of actions for you is to open a new [discussion](https://github.com/Robaina/BRENDApyrser/discussions). 14 | 15 | ## How can I contribute? 16 | 17 | ### 1. Reporting bugs 18 | 19 | We all make mistakes, and the developers behind BRENDApyrser are no exception... So, if you find a bug in the source code, please open an [issue](https://github.com/Robaina/BRENDApyrser/issues) and report it. Please, first search for similar issues that are currrently open. 20 | 21 | ### 2. Suggesting enhancements 22 | 23 | Are you missing some feature that would like BRENDApyrser to have? No problem! You can contribute by suggesting an enhancement, just open a new issue and tag it with the [```enhancement```](https://github.com/Robaina/BRENDApyrser/labels/enhancement) label. Please, first search for similar issues that are currrently open. 24 | 25 | ### 3. Improving the documentation 26 | 27 | Help is always needed at improving the [documentation](https://robaina.github.io/BRENDApyrser/). Either adding more detailed docstrings, usage explanations or new examples. 28 | 29 | ## First contribution 30 | 31 | Unsure where to begin contributing to BRENDApyrser? You can start by looking for issues with the label [```good first issue```](https://github.com/Robaina/BRENDApyrser/labels/good%20first%20issue). If you are unsure about how to set a developer environment for BRENDApyrser, do take a look at the section below. Thanks! 32 | 33 | ## Setting up a local developer environment 34 | 35 | To setup up a developer environment for BRENDApyrser: 36 | 37 | 1. Fork and download repo, cd to downloaded directory. You should create a new branch to work on your issue. 38 | 39 | 2. Create conda environment with required dependencies: 40 | 41 | The file `envs/BRENDApyrser-dev.yml` contains all dependencies required to use BRENDApyrser. Conda is very slow solving the environment. It is recommended to use [mamba](https://github.com/mamba-org/mamba) instead: 42 | 43 | ```bash 44 | mamba env create -n BRENDApyrser-dev -f envs/BRENDApyrser-dev.yml 45 | conda activate BRENDApyrser-dev 46 | ``` 47 | 48 | 3. Build package 49 | 50 | ```bash 51 | (BRENDApyrser-dev) poetry build 52 | ``` 53 | 54 | 4. Install BRENDApyrser 55 | 56 | ```bash 57 | (BRENDApyrser-dev) pip install dist/BRENDApyrser*.whl 58 | ``` 59 | 60 | 5. Run tests 61 | 62 | ```bash 63 | (BRENDApyrser-dev) python -m unittest discover tests 64 | ``` 65 | 66 | ## Building the documentation 67 | 68 | The documentation is formed by a series of markdown files located in directory [docs](https://github.com/Robaina/BRENDApyrser/tree/main/docs). This repo uses [mkdocs](https://www.mkdocs.org/) to automatically generate documentation pages from markdown files. Also, [MathJax](https://github.com/mathjax/MathJax) syntax is allowed! 69 | 70 | This means that, to modify the [API reference](https://robaina.github.io/BRENDApyrser/references/api/), all you need to do is to modify the docstring directly in the source file where the definion/class is located. And, to update the documentation pages, you just have to update the corresponding markdown file in the [docs](https://github.com/Robaina/BRENDApyrser/tree/main/docs) directory. Note that, if you need to change the documentation structure (e.g., add or new pages),you would need to tell mkdocs about this change through its [configuration file](https://github.com/Robaina/BRENDApyrser/blob/main/mkdocs.yml). Or just open an issue and ask for help! 71 | 72 | When all the changes are ready to deploy, just open a pull request. After reviewing and merging the changes, the documentation will be automatically deployed. 73 | 74 | Run the documentation locally with: 75 | 76 | > mkdocs serve 77 | 78 | ## Tests on push and pull request to main 79 | 80 | BRENDApyrser's repo contains a [GitHub Action](https://github.com/features/actions) to perform build and integration tests which is triggered automatically on push and pull request events to the main brach. Currently the tests include building and installing BRENDApyrser in Ubuntu and MacOS and running the [test](tests) suit. 81 | -------------------------------------------------------------------------------- /.github/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | hello@semidanrobaina.com. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright [yyyy] [name of copyright owner] 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /tests/tests.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | Unit tests for brendapyrser. 6 | """ 7 | 8 | import unittest 9 | 10 | from brendapyrser import Reaction 11 | 12 | rxn_data = """ID 1.1.1.304 13 | ******************************************************************************** 14 | * * 15 | * Copyrighted by Dietmar Schomburg, Techn. University Braunschweig, GERMANY * 16 | * Distributed under the License as stated at http:/www.brenda-enzymes.org * 17 | * * 18 | ******************************************************************************** 19 | 20 | PROTEIN 21 | PR #1# Staphylococcus aureus <4> 22 | PR #2# Geobacillus stearothermophilus <5,8> 23 | PR #3# Klebsiella aerogenes <1> 24 | PR #4# Bacillus licheniformis <10> 25 | PR #5# Rhodococcus erythropolis <7> 26 | PR #6# Columba livia <2,3> 27 | PR #7# Klebsiella pneumoniae Q48436 UniProt <6> 28 | PR #8# Paenibacillus polymyxa KC505218 GenBank <9> 29 | PR #9# Mycobacterium sp. W8VSK8 UniProt <11> 30 | 31 | RECOMMENDED_NAME 32 | RN diacetyl reductase [(S)-acetoin forming] 33 | 34 | 35 | SYSTEMATIC_NAME 36 | SN (S)-acetoin:NAD+ oxidoreductase 37 | 38 | 39 | SYNONYMS 40 | SY #2# S-stereospecific diacetyl reductase <8> 41 | SY #2# BSDR <8> 42 | SY #4# budC <10> 43 | SY #5# AdR <7> 44 | SY #5# acetoin(diacetyl) reductase <7> 45 | SY #5# ReADR <7> 46 | SY #8# diacetyl reductase <9> 47 | SY #8# DAR <9> 48 | SY #9# ADS1 <11> 49 | 50 | REACTION 51 | RE (S)-acetoin + NAD+ = diacetyl + NADH + H+ (#6# Theorell-Chance 52 | mechanism with NADH as the leading substrate <3>) 53 | RE (S)-acetoin + NAD+ = diacetyl + NADH + H+ (#6# Theorell-Chance 54 | mechanism with NADH as the leading substrate <3>) 55 | 56 | SOURCE_TISSUE 57 | ST #6# liver <2,3> 58 | 59 | NATURAL_SUBSTRATE_PRODUCT 60 | NSP #2,5# diacetyl + NADH + H+ = (S)-acetoin + NAD+ <7,8> 61 | NSP #2,5# diacetyl + NADH + H+ = (S)-acetoin + NAD+ {ir} <7,8> 62 | NSP #2,5# diacetyl + NADH + H+ = (S)-acetoin + NAD+ {r} <7,8> 63 | NSP #2,5,8# more = ? (#5# Rhodococcus erythropolis WZ010 is capable of 64 | producing optically pure (2S,3S)-2,3-butanediol in alcoholic 65 | fermentation. <7>; #8# the enzyme also catalyzes the stereospcific 66 | reaction of (S)-acetoin reduction to butanediol, EC 1.1.1.76 <9>; #2# 67 | the enzyme shows an S-enantioselectivity in the reversible reduction of 68 | acetoin so it might be responsible of the meso-butenediol formation 69 | from R-acetoin. It acts on racemic acetoin and (S)-acetoin to form 70 | (2S,3S)-butane-2,3-diol, EC 1.1.1.76, but also on the 71 | (2R,3R)-butane-2,3-diol isomer in the reverse reaction, EC 1.1.1.4 <8>) 72 | <7,8,9> 73 | 74 | SUBSTRATE_PRODUCT 75 | SP #1# 2,3-pentanedione + beta-NADH + H+ = L-3-hydroxy-2-pentanone + 76 | beta-NAD+ {ir} <4> 77 | SP #1# diacetyl + beta-NADH + H+ = (S)-acetoin + beta-NAD+ (#1# 86.9% of 78 | the activity with pentane-2,3-dione <4>) {ir} <4> 79 | SP #1# ethyl pyruvate + beta-NADH + H+ = ? + beta-NAD+ (#1# 38.4% of the 80 | activity with pentane-2,3-dione <4>) {ir} <4> 81 | SP #1# methyl pyruvate + beta-NADH + H+ = ? + beta-NAD+ (#1# 22.8% of the 82 | activity with pentane-2,3-dione <4>) {ir} <4> 83 | SP #1,2,4,5,8,9# more = ? (#1# no activity with alpha-NADH or NADPH <4>; 84 | #5# Rhodococcus erythropolis WZ010 is capable of producing optically 85 | pure (2S,3S)-2,3-butanediol in alcoholic fermentation. <7>; #8# the 86 | enzyme also catalyzes the stereospcific reaction of (S)-acetoin 87 | reduction to butanediol, EC 1.1.1.76 <9>; #2# the enzyme shows an 88 | S-enantioselectivity in the reversible reduction of acetoin so it might 89 | be responsible of the meso-butenediol formation from R-acetoin. It acts 90 | on racemic acetoin and (S)-acetoin to form (2S,3S)-butane-2,3-diol, EC 91 | 1.1.1.76, but also on the (2R,3R)-butane-2,3-diol isomer in the reverse 92 | reaction, EC 1.1.1.4 <8>; #5# the enzyme displays absolute 93 | stereospecificity in the reduction of diacetyl to 94 | (2S,3S)-2,3-butanediol via (S)-acetoin. The enzyme shows higher 95 | catalytic efficiency for (S)-1-phenylethanol oxidation than that for 96 | acetophenone reduction. ReADR-catalyzed asymmetric reduction of 97 | diacetyl is coupled with stereoselective oxidation of 1-phenylethanol, 98 | which simultaneously forms both (2S,3S)-2,3-butanediol and 99 | (R)-1-phenylethanol in great conversions and enantiomeric excess 100 | values.The enzyme accepts a broad range of substrates including 101 | aliphatic and aryl alcohols, aldehydes, and ketones <7>; #9# enzyme 102 | shows activity as a reductase specific for (S)-acetoin, EC 1.1.1.76, 103 | and both diacetyl reductase (EC 1.1.1.304) and NAD+-dependent alcohol 104 | dehydrogenase (EC 1.1.1.1) activities <11>; #4# enzyme shows oxidative 105 | activity to racemic 2,3-butanediol but no activity toward racemic 106 | acetoin in the presence of NAD+ <10>) <4,7,8,9,10,11> 107 | SP #2,3,5,6,7,9# diacetyl + NADH + H+ = (S)-acetoin + NAD+ (#7# 87% of the 108 | (R)-2,3-butanediol dehydrogenase activity with substrate acetoin <6>) 109 | <1,2,3,5,6,7,8,11> 110 | SP #2,3,5,6,7,9# diacetyl + NADH + H+ = (S)-acetoin + NAD+ (#7# 87% of the 111 | (R)-2,3-butanediol dehydrogenase activity with substrate acetoin <6>) 112 | {ir} <1,2,3,5,6,7,8,11> 113 | SP #2,3,5,6,7,9# diacetyl + NADH + H+ = (S)-acetoin + NAD+ (#7# 87% of the 114 | (R)-2,3-butanediol dehydrogenase activity with substrate acetoin <6>) 115 | {r} <1,2,3,5,6,7,8,11> 116 | SP #3# ethyl pyruvate + NADH + H+ = ? + NAD+ (#3# 57.7% of the activity 117 | with diacetyl <1>) <1> 118 | SP #3# methyl glyoxal + NADH + H+ = ? + NAD+ (#3# 11% of the activity with 119 | diacetyl <1>) <1> 120 | SP #3# methyl pyruvate + NADH + H+ = ? + NAD+ (#3# 49% of the activity 121 | with diacetyl <1>) <1> 122 | SP #3,7# 2,3-pentanedione + NADH + H+ = 3-hydroxy-2-pentanone + NAD+ (#7# 123 | 77% of the (R)-2,3-butanediol dehydrogenase activity with substrate 124 | acetoin <6>; #3# 85.6% of the activity with diacetyl <1>) <1,6> 125 | SP #4# (2S,3S)-2,3-butanediol + NAD+ = (3S)-acetoin + NADH + H+ {r} <10> 126 | SP #4# (3S)-acetoin + NADH + H+ = (2S,3S)-2,3-butanediol + NAD+ (#4# 97% 127 | of the activity with diacetyl <10>) |#4# 97.3% enantiomeric excess and 128 | 96.5% diastereomeric excess <10>| {r} <10> 129 | SP #4# 1,2-propanediol + NAD+ = ? + NADH + H+ |#4# 0.5% of the activity 130 | with 2,3-butanediol <10>| {r} <10> 131 | SP #4# diacetyl + NADH + H+ = (3S)-acetoin + NAD+ |#4# 97.3% enantiomeric 132 | excess <10>| {ir} <10> 133 | SP #4# 2,3-pentanedione + NADH + H+ = ? + NAD+ |#4# 69% of the activity 134 | with diacetyl <10>| <10> 135 | SP #4# 2,3-hexanedione + NADH + H+ = ? + NAD+ |#4# 66% of the activity 136 | with diacetyl <10>| <10> 137 | SP #4# 3,4-hexanedione + NADH + H+ = ? + NAD+ |#4# 10% of the activity 138 | with diacetyl <10>| <10> 139 | SP #6,8# diacetyl + NADPH + H+ = (S)-acetoin + NADP+ {ir} <3,9> 140 | 141 | TURNOVER_NUMBER 142 | TN #4# 748 {NAD+} (#4# pH 10.0, 30°C <10>) <10> 143 | TN #4# 202 {(3S)-acetoin} (#4# pH 6.0, 30°C <10>) <10> 144 | TN #4# 591 {(2S,3S)-2,3-butanediol} (#4# pH 10.0, 30°C <10>) <10> 145 | TN #4# 1222 {diacetyl} (#4# pH 6.0, 30°C <10>) <10> 146 | TN #4# 1274 {NADH} (#4# pH 6.0, 30°C <10>) <10> 147 | TN #9# 110 {NADH} (#9# pH 7.0, 30°C <11>) <11> 148 | TN #9# 163 {diacetyl} (#9# pH 7.0, 30°C <11>) <11> 149 | 150 | KM_VALUE 151 | KM #1# 0.045 {NADH} (#1# 25°C, pH 6.0, cosubstrate diacetyl <4>) <4> 152 | KM #1# 0.095 {NADH} (#1# 25°C, pH 6.0, cosubstrate methyl pyruvate <4>) 153 | <4> 154 | KM #1# 0.025 {NADH} (#1# 25°C, pH 6.0, cosubstrate 2,3-pentanedione <4>) 155 | <4> 156 | KM #1# 0.11 {NADH} (#1# 25°C, pH 6.0, cosubstrate ethyl pyruvate <4>) <4> 157 | KM #1# 24 {ethyl pyruvate} (#1# 25°C, pH 6.0 <4>) <4> 158 | KM #1# 16 {Methyl pyruvate} (#1# 25°C, pH 6.0 <4>) <4> 159 | KM #1# 6 {2,3-Pentanedione} (#1# 25°C, pH 6.0 <4>) <4> 160 | KM #1# 15 {diacetyl} (#1# 25°C, pH 6.0 <4>) <4> 161 | KM #2# 19 {diacetyl} (#2# pH 7.5, 25°C <5>) <5> 162 | KM #3# 0.005 {NADH} (#3# cosubstrate acetoin, pH 7.0, 25°C <1>) <1> 163 | KM #3# 20 {ethyl pyruvate} (#3# pH 7.0, 25°C <1>) <1> 164 | KM #3# 0.007 {NADH} (#3# cosubstrate diacetyl, pH 7.0, 25°C <1>) <1> 165 | KM #3# 1.6 {diacetyl} (#3# pH 7.0, 25°C <1>) <1> 166 | KM #3# 6 {pentane-2,3-dione} (#3# pH 7.0, 25°C <1>) <1> 167 | KM #3# 18 {Methyl pyruvate} (#3# pH 7.0, 25°C <1>) <1> 168 | KM #3# 75 {methyl glyoxal} (#3# pH 7.0, 25°C <1>) <1> 169 | KM #4# 0.25 {NADH} (#4# pH 6.0, 30°C <10>) <10> 170 | KM #4# 0.34 {NAD+} (#4# pH 10.0, 30°C <10>) <10> 171 | KM #4# 0.47 {(3S)-acetoin} (#4# pH 6.0, 30°C <10>) <10> 172 | KM #4# 7.25 {(2S,3S)-2,3-butanediol} (#4# pH 10.0, 30°C <10>) <10> 173 | KM #4# 72.4 {diacetyl} (#4# pH 6.0, 30°C <10>) <10> 174 | KM #5# -999 {more} (#5# Michaelis-Menten-type kinetics <7>) <7> 175 | KM #6# 0.1 {NADH} (#6# pH 6.1, 25°C <3>) <3> 176 | KM #6# 3.1 {diacetyl} (#6# pH 6.1, 25°C <3>) <3> 177 | KM #6# 3 {diacetyl} (#6# 25°C, pH 6.1 <2>) <2> 178 | KM #6# 0.087 {NADH} (#6# 25°C, pH 5.9 <2>) <2> 179 | KM #6# 0.116 {NADH} (#6# 25°C, pH 6.1 <2>) <2> 180 | KM #6# 2.64 {diacetyl} (#6# 25°C, pH 6.7 <2>) <2> 181 | KM #6# 0.135 {NADH} (#6# 25°C, pH 6.7 <2>) <2> 182 | KM #6# 2.81 {diacetyl} (#6# 25°C, pH 5.9 <2>) <2> 183 | KM #9# 0.05 {NADH} (#9# pH 7.0, 30°C <11>) <11> 184 | KM #9# 4.47 {diacetyl} (#9# pH 7.0, 30°C <11>) <11> 185 | 186 | PH_OPTIMUM 187 | PHO #1,8# 6 (#8# assay at <9>) <4,9> 188 | PHO #2# 6.5 (#2# assay at <8>) <8> 189 | PHO #4# 5 (#4# reduction of diacetyl <10>) <10> 190 | PHO #4# 10 (#4# oxidation of butanediol <10>) <10> 191 | PHO #5# 7 (#5# diacetyl reduction <7>) <7> 192 | PHO #6# 6.1 <3> 193 | 194 | PH_RANGE 195 | PHR #4# 5-8 (#4# reduction of diacetyl <10>) <10> 196 | PHR #6# 5 (#6# 5 min, 30% loss of activity <2>) <2> 197 | PHR #6# 5.1 (#6# 5 min, 20% loss of activity <2>) <2> 198 | PHR #6# 5.4-7.6 (#6# stable within <2>) <2> 199 | PHR #6# 4.8 (#6# 5 min, 60% loss of activity <2>) <2> 200 | 201 | SPECIFIC_ACTIVITY 202 | SA #2# 71.4 (#2# pH 7.5, 25°C <5>) <5> 203 | SA #4# 120.0 (#4# substrate diacetyl, 30°C, pH 6.0 <10>) <10> 204 | SA #8# 72.6 (#8# purified recombinant enzyme, NADPH, pH 6.0, 30°C <9>) <9> 205 | 206 | TEMPERATURE_OPTIMUM 207 | TO #2# 50 <5> 208 | TO #5,8# 30 (#8# assay at <9>; #5# diacetyl reduction <7>) <7,9> 209 | 210 | COFACTOR 211 | CF #1,2,3,4,5,6# NADH (#2# dependent on <8>; #1# beta-NADH <4>; #3# 212 | specific for beta-NADH <1>) <1,3,4,5,7,8,10> 213 | CF #1,4,8# more (#4# no activity with NADPH <10>; #8# inactive with NADH 214 | <9>; #1# no activity with alpha-NADH or NADPH <4>) <4,9,10> 215 | CF #4,5# NAD+ <7,10> 216 | CF #8# NADPH (#8# dependent on <9>) <9> 217 | 218 | ACTIVATING_COMPOUND 219 | AC #5# DMSO (#5# DMSO at a final concentration of 30% v/v added into the 220 | assay mixture, increases the activity up to 120% of the control enzyme 221 | activity <7>) <7> 222 | 223 | INHIBITORS 224 | IN #1# diacetyl (#1# substrate inhibition at concentrations above 80-90 mM 225 | <4>) <4> 226 | IN #1# ethyl pyruvate (#1# substrate inhibition at concentrations above 227 | 80-90 mM <4>) <4> 228 | IN #1# Methyl pyruvate (#1# substrate inhibition at concentrations above 229 | 80-90 mM <4>) <4> 230 | IN #4# Cu2+ (#4# 1 mM, 0.2% of initial activity with substrate diacetyl, 231 | 1% with substrate 2,3-butanediol, respectively <10>) <10> 232 | IN #4# Ag+ (#4# 1 mM, 0.5% of initial activity with substrate diacetyl, 233 | 0.5% with substrate 2,3-butanediol, respectively <10>) <10> 234 | IN #4# Fe3+ (#4# 1 mM, 2% of initial activity with substrate diacetyl, 235 | 3.5% with substrate 2,3-butanediol, respectively <10>) <10> 236 | IN #4# EDTA (#4# 1 mM, 91% of initial activity with substrate diacetyl, 237 | 90% with substrate 2,3-butanediol, respectively <10>) <10> 238 | IN #4,5# Al3+ (#4# 1 mM, 4% of initial activity with substrate diacetyl, 239 | 6% with substrate 2,3-butanediol, respectively <10>) <7,10> 240 | IN #4,5# Zn2+ (#5# inhibits 94.6% at 2 mM <7>; #4# 1 mM, 75% of initial 241 | activity with substrate diacetyl, 80% with substrate 2,3-butanediol, 242 | respectively <10>) <7,10> 243 | IN #5# Fe2+ (#5# inhibits 91.6% at 2 mM <7>) <7> 244 | IN #6# 2-oxoglutarate (#6# noncompetitive <3>) <3> 245 | IN #6# hexane-2,5-dione (#6# noncompetitive <3>) <3> 246 | IN #6# NAD+ (#6# competitive, product inhibition <3>) <3> 247 | IN #6# acetoin (#6# noncompetitive, product inhibition <3>) <3> 248 | IN #6# acetone (#6# competitive for diacetyl, uncompetitive for NADH <3>) 249 | <3> 250 | IN #6# Pentane-3-one (#6# competitive for diacetyl, uncompetitive for NADH 251 | <3>) <3> 252 | 253 | METALS_IONS 254 | ME #5# more (#5# addition of EDTA or the cations at 1 mM, such as Na+, K+, 255 | Mn2+, Mg2+, and Ca2+, have no significant effect on the activity of 256 | ReADR <7>) <7> 257 | ME #5# Mn2+ (#5# activates by 201.6 to 265.6% at 2 mM <7>) <7> 258 | ME #5# K+ (#5# activates by 201.6 to 265.6% at 2 mM <7>) <7> 259 | ME #5# Na+ (#5# activates by 201.6 to 265.6% at 2 mM <7>) <7> 260 | 261 | MOLECULAR_WEIGHT 262 | MW #1# 68000 (#1# gel filtration <4>) <4> 263 | MW #2# 26000 (#2# 2 * 26000, SDS-PAGE <5>) <5> 264 | MW #2# 49000 (#2# gel filtration <5>) <5> 265 | MW #3# 61000 (#3# gel filtration <1>) <1> 266 | MW #3# 28000 (#3# 2 * 28000, SDS-PAGE <1>) <1> 267 | MW #4# 125000 (#4# gel filtration <10>) <10> 268 | MW #4# 30000 (#4# 4 * 30000, SDS-PAGE <10>) <10> 269 | MW #5# 26864 (#5# 2 * 26864, sequence calculation <7>) <7> 270 | MW #7# 96000 (#7# gel filtration <6>) <6> 271 | MW #7# 26591 (#7# 4 * 26591, calculated <6>) <6> 272 | MW #8# 118000 (#8# recombinant enzyme, gel filtration <9>) <9> 273 | MW #8# 28500 (#8# 4 * 28500, recombinant enzyme, SDS-PAGE <9>) <9> 274 | MW #9# 150000 (#9# gel filtration <11>) <11> 275 | MW #9# 36000 <11> 276 | 277 | SUBUNITS 278 | SU #1# monomer (#1# 1 * 68000, SDS-PAGE <4>) <4> 279 | SU #2,3# dimer (#3# 2 * 28000, SDS-PAGE <1>; #2# 2 * 26000, SDS-PAGE <5>) 280 | <1,5> 281 | SU #4,7,8,9# tetramer (#4# 4 * 30000, SDS-PAGE <10>; #7# 4 * 26591, 282 | calculated <6>; #8# 4 * 28500, recombinant enzyme, SDS-PAGE <9>; #9# 4 283 | * 36000, SDS-PAGE, 4 * 35971, calculated <11>) <6,9,10,11> 284 | SU #5# homodimer (#5# 2 * 26864, sequence calculation <7>) <7> 285 | 286 | PI_VALUE 287 | PI #3# 6.8 (#3# isoelectric focusing <1>) <1> 288 | PI #7# 5.9-7.2 (#7# isoelectric focusing <6>) <6> 289 | PI #9# 4.8 (#9# isoelectric focusing <11>) <11> 290 | PI #9# 5.1 (#9# calculated <11>) <11> 291 | 292 | APPLICATION 293 | AP #5,8# synthesis (#5# acetoin(diacetyl) reductase, i.e. 2,3-butanediol 294 | dehydrogenase, is one of the key enzymes in the microbial production of 295 | 2,3-butanediol, a platform with extensive industrial applications in 296 | the production of plastics, printing inks, perfumes, fumigants, 297 | spandex, moistening and softening agents, plasticizers, and 298 | pharmaceutical carrier <7>; #8# the enzyme is used for production of 299 | S-acetoin with higher than 99.9% optical purity from diacetyl using 300 | whole cells of engineered Escherichia coli <9>) <7,9> 301 | 302 | CLONED 303 | CL #4# (expression in Escherichia coli) <10> 304 | CL #5# (gene adr, DNA and amino acid sequence determination and analysis, 305 | sequence comparison, expression of His-tagged enzyme in Escherichia 306 | coli) <7> 307 | CL #7# (expression in Escherichia coli) <6> 308 | CL #8# (gene dar, fucntional expression in Escherichia coli strain Rosetta 309 | (DE3), resulting in production of S-acetoin with higher than 99.9% 310 | optical purity from diacetyl) <9> 311 | 312 | PURIFICATION 313 | PU #1# <4> 314 | PU #2# <5> 315 | PU #2# (native enzyme by adsorption on diethylaminoethyl–Sepharose and 316 | hydrophobic interaction chromatography) <8> 317 | PU #3# <1> 318 | PU #5# (recombinant His-tagged enzyme from Escherichia coli by nickel 319 | affinity chromatography) <7> 320 | PU #8# (recombinant enzyme from Escherichia coli strain Rosetta (DE3)) <9> 321 | 322 | GENERAL_STABILITY 323 | GS #2# (unstable to dilution, kept diluted at 0°C for ca. 60 min it will 324 | lose 62% of activity. This inactivation is almost completely reversed 325 | by the addition of NAD+) <5> 326 | 327 | ORGANIC_SOLVENT_STABILITY 328 | OSS #5# DMSO (#5# the enzyme retains 53.6% of the initial activity after 4 329 | h incubation with 30% v/v DMSO at 4°C <7>) <7> 330 | 331 | PH_STABILITY 332 | PHS #7# 7-8 <6> 333 | 334 | STORAGE_STABILITY 335 | SS #2# (storage at 0°C in the presence of 20% glycerol, 0.1 mM EDTA, 5 mM 336 | 2-mercaptoethanol and 0.6 mM NAD+ in TEA buffer, pH 7.5, half-life of 337 | one month) <5> 338 | 339 | REFERENCE 340 | RF <1> Carballo, J.; Martin, R.; Bernardo, A.; Gonzalez, J.: Purification, 341 | characterization and some properties of diacetyl(acetoin) reductase 342 | from Enterobacter aerogenes. Eur. J. Biochem. (1991) 198, 327-332. 343 | {Pubmed:2040298} (c) 344 | RF <2> Martin, R.; Diez, V.; Burgos, J.: Pigeon liver diacetyl reductase. 345 | Effects of pH on the kinetic parameters of the reaction. Biochim. 346 | Biophys. Acta (1976) 429, 293-300. {Pubmed:4124} 347 | RF <3> Burgos, J.; Martin, R.; Diez, V.: Pigeon liver diacetyl reductase. 348 | Kinetic and thermodynamic studies with NADH as coenzyme. Biochim. 349 | Biophys. Acta (1974) 364, 9-16. {Pubmed:4373071} 350 | RF <4> Vidal, I.; Gonzalez, J.; Bernardo, A.; Martin, R.: Purification and 351 | classification of diacetyl-reducing enzymes from Staphylococcus aureus. 352 | Biochem. J. (1988) 251, 461-466. {Pubmed:3041963} 353 | RF <5> Giovannini, P.P.; Medici, A; Bergamini, C.M.; Rippa, M.: Properties 354 | of diacetyl (acetoin) reductase from Bacillus stearothermophilus. 355 | Bioorg. Med. Chem. (1996) 4, 1197-1201. {Pubmed:8879540} 356 | RF <6> Ui, S.; Okajima, Y.; Mimura, A.; Kanai, H.; kobayashi, T.; Kudo, 357 | T.: Sequence analysis of the gene for and characterization of D-acetoin 358 | forming meso-2,3-butanediol dehydrogenase of Klebsiella pneumoniae 359 | expressed in Escherichia coli. J. Ferment. Bioeng. (1997) 83, 32-37. 360 | {Pubmed:} 361 | RF <7> Wang, Z.; Song, Q.; Yu, M.; Wang, Y.; Xiong, B.; Zhang, Y.; Zheng, 362 | J.; Ying, X.: Characterization of a stereospecific acetoin(diacetyl) 363 | reductase from Rhodococcus erythropolis WZ010 and its application for 364 | the synthesis of (2S,3S)-2,3-butanediol. Appl. Microbiol. Biotechnol. 365 | (2014) 98, 641-650. {Pubmed:23568047} 366 | RF <8> Giovannini, P.; Mantovani, M.; Grandini, A.; Medici, A.; Pedrini, 367 | P.: New acetoin reductases from Bacillus stearothermophilus: meso- and 368 | 2R,3R-butanediol as fermentation products. J. Mol. Catal. B (2011) 69, 369 | 15-20. {Pubmed:} 370 | RF <9> Gao, J.; Xu, Y.; Li, F.; Ding, G.: Production of S-acetoin from 371 | diacetyl by Escherichia coli transformant cells that express the 372 | diacetyl reductase gene of Paenibacillus polymyxa ZJ-9. Lett. Appl. 373 | Microbiol. (2013) 57, 274-281. {Pubmed:23701367} 374 | RF <10> Xu, G.C.; Bian, Y.Q.; Han, R.Z.; Dong, J.J.; Ni, Y.: Cloning, 375 | expression, and characterization of budC gene encoding 376 | meso-2,3-butanediol dehydrogenase from Bacillus licheniformis. Appl. 377 | Biochem. Biotechnol. (2016) 178, 604-617. {Pubmed:26494135} 378 | RF <11> Takeda, M.; Anamizu, S.; Motomatsu, S.; Chen, X.; Thapa Chhetri, 379 | R.: Identification and characterization of a mycobacterial 380 | NAD+-dependent alcohol dehydrogenase with superior reduction of 381 | diacetyl to (S)-acetoin. Biosci. Biotechnol. Biochem. (2014) 78, 382 | 1879-1886. {Pubmed:25082080} 383 | 384 | KI_VALUE 385 | KI #1# 300 {diacetyl} (#1# 25°C, pH 6.0 <4>) <4> 386 | KI #1# 150 {ethyl pyruvate} (#1# 25°C, pH 6.0 <4>) <4> 387 | KI #1# 150 {Methyl pyruvate} (#1# 25°C, pH 6.0 <4>) <4> 388 | 389 | KCAT_KM_VALUE 390 | KKM #4# 16.9 {diacetyl} (#4# pH 6.0, 30°C <10>) <10> 391 | KKM #4# 81.5 {(2S,3S)-2,3-butanediol} (#4# pH 10.0, 30°C <10>) <10> 392 | KKM #4# 432 {(3S)-acetoin} (#4# pH 6.0, 30°C <10>) <10> 393 | KKM #4# 2192 {NAD+} (#4# pH 10.0, 30°C <10>) <10> 394 | KKM #4# 5072 {NADH} (#4# pH 6.0, 30°C <10>) <10> 395 | KKM #5# 8.519 {NADH} (#5# pH 7.0, 30°C, recombinant enzyme <7>) <7> 396 | KKM #9# 210 {NADH} (#9# pH 7.0, 30°C <11>) <11> 397 | KKM #9# 36.4 {diacetyl} (#9# pH 7.0, 30°C <11>) <11> 398 | 399 | GENERAL_INFORMATION 400 | GI #2,5# metabolism (#5# acetoin(diacetyl) reductase, also known as 401 | 2,3-butanediol dehydrogenase, is one of the key enzymes in the 402 | microbial production of 2,3-butanediol <7>; #2# the enzyme is involved 403 | in the butanediol cycle, overview <8>) <7,8> 404 | GI #5# evolution (#5# the enzyme belongs to the family of the short-chain 405 | dehydrogenase/reductases <7>) <7>""" 406 | 407 | 408 | class TestReaction(unittest.TestCase): 409 | def test_ec_number(self): 410 | rxn = Reaction(rxn_data) 411 | self.assertEqual( 412 | rxn.ec_number, "1.1.1.304", "Failed to correctly retrieve EC number" 413 | ) 414 | 415 | def test_name(self): 416 | rxn = Reaction(rxn_data) 417 | self.assertEqual( 418 | rxn.name, 419 | "Diacetyl reductase [(s)-acetoin forming]", 420 | "Failed to correctly retrieve reaction name", 421 | ) 422 | 423 | def test_sysname(self): 424 | rxn = Reaction(rxn_data) 425 | self.assertEqual( 426 | rxn.systematic_name, 427 | "(S)-acetoin:NAD+ oxidoreductase", 428 | "Failed to correctly retrieve systematic reaction name", 429 | ) 430 | 431 | def test_KMvalues(self): 432 | rxn = Reaction(rxn_data) 433 | self.assertEqual( 434 | rxn.KMvalues.get_values()[:4], 435 | [0.045, 0.095, 0.025, 0.11], 436 | "Failed to correctly retrieve KM values", 437 | ) 438 | 439 | def test_KKMvalues(self): 440 | rxn = Reaction(rxn_data) 441 | self.assertEqual( 442 | rxn.KKMvalues.get_values()[:4], 443 | [16.9, 36.4, 81.5, 432.0], 444 | "Failed to correctly retrieve KKM values", 445 | ) 446 | 447 | def test_Kcatvalues(self): 448 | rxn = Reaction(rxn_data) 449 | self.assertEqual( 450 | rxn.Kcatvalues.get_values()[:4], 451 | [748.0, 202.0, 591.0, 1222.0], 452 | "Failed to correctly retrieve Kcat values", 453 | ) 454 | 455 | def test_temperature(self): 456 | rxn = Reaction(rxn_data) 457 | self.assertEqual( 458 | rxn.temperature["optimum"][0]["value"], 459 | 50.0, 460 | "Failed to correctly retrieve temperature values", 461 | ) 462 | 463 | 464 | if __name__ == "__main__": 465 | unittest.main() 466 | -------------------------------------------------------------------------------- /src/brendapyrser/parser.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | """ 5 | Object to parse and manipulate the BRENDA database 6 | """ 7 | 8 | from __future__ import annotations 9 | 10 | import re 11 | from importlib import metadata 12 | 13 | import numpy as np 14 | import pandas as pd 15 | 16 | from .constants import fields, units 17 | 18 | meta = metadata.metadata("brendapyrser") 19 | __version__ = meta["Version"] 20 | __author__ = meta["Author"] 21 | 22 | 23 | class BRENDA: 24 | """ 25 | Provides methods to parse the BRENDA database (https://www.brenda-enzymes.org/) 26 | """ 27 | 28 | def __init__(self, path_to_database): 29 | with open(path_to_database, encoding="utf-8") as file: 30 | self.__data = file.read() 31 | self.__ec_numbers = [ 32 | ec.group(1) for ec in re.finditer("(?<=ID\\t)(.*)(?=\\n)", self.__data) 33 | ] 34 | self.__reactions = self.__initializeReactionObjects() 35 | self.__copyright = """Copyrighted by Dietmar Schomburg, Techn. University 36 | Braunschweig, GERMANY. Distributed under the License as stated 37 | at http:/www.brenda-enzymes.org""" 38 | self.__fields = fields 39 | self.__units = units 40 | 41 | def _repr_html_(self): 42 | """This method is executed automatically by Jupyter to print html!""" 43 | return """ 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |
Number of Enzymes{n_ec}
BRENDA copyright{cr}
Brendapyrser version{parser}
Author{author}
55 | """.format( 56 | n_ec=len(self.__reactions), 57 | cr=self.__copyright, 58 | parser=__version__, 59 | author=__author__, 60 | ) 61 | 62 | def __getRxnData(self): 63 | rxn_data = [ 64 | r.group(0) 65 | for r in re.finditer("ID\\t(.+?)///", self.__data, flags=re.DOTALL) 66 | ] 67 | del self.__data 68 | return rxn_data 69 | 70 | def __initializeReactionObjects(self): 71 | return [Reaction(datum) for datum in self.__getRxnData()] 72 | 73 | @property 74 | def fields(self): 75 | return self.__fields 76 | 77 | @property 78 | def units(self): 79 | return self.__units 80 | 81 | @property 82 | def reactions(self): 83 | return ReactionList(self.__reactions) 84 | 85 | @property 86 | def copyright(self): 87 | return self.__copyright 88 | 89 | def getOrganisms(self) -> list: 90 | """ 91 | Get list of all represented species in BRENDA 92 | """ 93 | species = set() 94 | for rxn in self.__reactions: 95 | species.update([s["name"] for s in rxn.proteins.values()]) 96 | species.remove("") 97 | species = list(set([s for s in species if "no activity" not in s])) 98 | return species 99 | 100 | def getKMcompounds(self) -> list: 101 | """ 102 | Get list of all substrates in BRENDA with KM data 103 | """ 104 | cpds = set() 105 | for rxn in self.__reactions: 106 | cpds.update([s for s in rxn.KMvalues.keys()]) 107 | try: 108 | cpds.remove("") 109 | except Exception: 110 | pass 111 | return list(cpds) 112 | 113 | 114 | class ReactionList(list): 115 | # Make ReactionList slicing return ReactionList object 116 | def __init__(self, seq=None): 117 | super(self.__class__, self).__init__(seq) 118 | 119 | def __getslice__(self, start, stop): 120 | return self.__class__(super(self.__class__, self).__getslice__(start, stop)) 121 | 122 | def __getitem__(self, key): 123 | if isinstance(key, slice): 124 | return self.__class__(super(self.__class__, self).__getitem__(key)) 125 | else: 126 | return super(self.__class__, self).__getitem__(key) 127 | 128 | def get_by_id(self, id: str): 129 | try: 130 | return [rxn for rxn in self if rxn.ec_number == id][0] 131 | except Exception: 132 | raise ValueError(f"Enzyme with EC {id} not found in database") 133 | 134 | def get_by_name(self, name: str): 135 | try: 136 | return [rxn for rxn in self if rxn.name.lower() == name.lower()][0] 137 | except Exception: 138 | raise ValueError(f"Enzyme {name} not found in database") 139 | 140 | def filter_by_substrate(self, substrate: str) -> list[Reaction]: 141 | """ 142 | Filter reactions by a specific substrate 143 | """ 144 | return [ 145 | rxn 146 | for rxn in self 147 | if any( 148 | [substrate in mets["substrates"] for mets in rxn.substratesAndProducts] 149 | ) 150 | ] 151 | 152 | def filter_by_product(self, product: str) -> list[Reaction]: 153 | """ 154 | Filter reactions by a specific product 155 | """ 156 | return [ 157 | rxn 158 | for rxn in self 159 | if any([product in mets["products"] for mets in rxn.substratesAndProducts]) 160 | ] 161 | 162 | def filter_by_compound(self, compound: str) -> list[Reaction]: 163 | """ 164 | Filter reactions by a substrate or product 165 | """ 166 | return [ 167 | rxn 168 | for rxn in self 169 | if any( 170 | [ 171 | (compound in mets["substrates"] or compound in mets["products"]) 172 | for mets in rxn.substratesAndProducts 173 | ] 174 | ) 175 | ] 176 | 177 | def filter_by_organism(self, species: str): 178 | def is_contained(p, S): 179 | return any([p in s.lower() for s in S]) 180 | 181 | return self.__class__( 182 | [rxn for rxn in self if is_contained(species.lower(), rxn.organisms)] 183 | ) 184 | 185 | 186 | class EnzymeDict(dict): 187 | def filter_by_organism(self, species: str): 188 | filtered_dict = {} 189 | 190 | def is_contained(p, S): 191 | return any([p in s for s in S]) 192 | 193 | for k in self.keys(): 194 | filtered_values = [ 195 | v for v in self[k] if is_contained(species, v["species"]) 196 | ] 197 | if len(filtered_values) > 0: 198 | filtered_dict[k] = filtered_values 199 | return self.__class__(filtered_dict) 200 | 201 | def get_values(self): 202 | return [v["value"] for k in self.keys() for v in self[k]] 203 | 204 | 205 | class EnzymePropertyDict(EnzymeDict): 206 | def filter_by_compound(self, compound: str): 207 | try: 208 | return self.__class__({compound: self[compound]}) 209 | except Exception: 210 | return self.__class__({compound: []}) 211 | 212 | 213 | class EnzymeConditionDict(EnzymeDict): 214 | def filter_by_condition(self, condition: str): 215 | try: 216 | return self.__class__({condition: self[condition]}) 217 | except Exception: 218 | raise KeyError( 219 | f'Invalid condition, valid conditions are: {", ".join(list(self.keys()))}' 220 | ) 221 | 222 | 223 | class Reaction: 224 | def __init__(self, reaction_data): 225 | self.__reaction_data = reaction_data 226 | self.__ec_number = self.__extractRegexPattern("(?<=ID\t)(.*)(?=\n)") 227 | self.__systematic_name = self.__extractRegexPattern("(?<=SN\t)(.*)(?=\n)") 228 | self.__name = self.__extractRegexPattern("(?<=RN\t)(.*)(?=\n)").capitalize() 229 | self.__mechanism_str = ( 230 | self.__extractRegexPattern("(?<=RE\t)(.*)(?=\n[A-Z])", dotall=True) 231 | .replace("=", "<=>") 232 | .replace("\n\t", "") 233 | .split("\nRE\t") 234 | ) 235 | self.__reaction_type = self.__extractRegexPattern( 236 | "(?<=RT\t)(.*)(?=\n)", dotall=True 237 | ).split("\nRT\t") 238 | self.__proteins = self.getSpeciesDict() 239 | self.__references = self.getReferencesDict() 240 | 241 | def getSpeciesDict(self) -> dict: 242 | """ 243 | Returns a dict listing all proteins for given EC number 244 | """ 245 | species = {} 246 | lines = self.__getDataLines("PR") 247 | for line in lines: 248 | res = self.extractDataLineInfo(line) 249 | species_name, protein_ID = self.__splitSpeciesFromProteinID(res["value"]) 250 | species[res["species"][0]] = { 251 | "name": species_name, 252 | "proteinID": protein_ID, 253 | "refs": res["refs"], 254 | } 255 | return species 256 | 257 | def getReferencesDict(self): 258 | """ 259 | Returns a dict listing the bibliography cited for the given EC number 260 | """ 261 | references = {} 262 | lines = self.__getDataLines("RF") 263 | for line in lines: 264 | line = self.__removeTabs(line) 265 | line, refs = self.__extractDataField(line, ("<", ">")) 266 | references[refs] = line 267 | return references 268 | 269 | def printReactionSummary(self): 270 | data = { 271 | "EC number": self.__ec_number, 272 | "Name": self.__name, 273 | "Systematic name": self.__systematic_name, 274 | "Reaction type": self.__reaction_type, 275 | "Mechanism": self.__mechanism, 276 | } 277 | return pd.DataFrame.from_dict(data, orient="index", columns=[""]) 278 | 279 | def _repr_html_(self): 280 | """This method is executed automatically by Jupyter to print html!""" 281 | return """ 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 |
Enzyme identifier{ec}
Name{name}
Systematic name{sys_name}
Reaction type{rxn_type}
Reaction{rxn_str}
295 | """.format( 296 | ec=self.__ec_number, 297 | name=self.__name, 298 | sys_name=self.__systematic_name, 299 | rxn_type=self.__reaction_type, 300 | rxn_str=self.reaction_str, 301 | ) 302 | 303 | def __extractRegexPattern(self, pattern, dotall=False): 304 | if dotall: 305 | flag = re.DOTALL 306 | else: 307 | flag = 0 308 | try: 309 | return re.search(pattern, self.__reaction_data, flags=flag).group(1) 310 | except Exception: 311 | return "" 312 | 313 | def __getDataLines(self, pattern: str): 314 | try: 315 | search_pattern = f"{pattern}\t(.+?)\n(?!\t)" 316 | return [ 317 | p.group(1) 318 | for p in re.finditer( 319 | search_pattern, self.__reaction_data, flags=re.DOTALL 320 | ) 321 | ] 322 | except Exception: 323 | return [] 324 | 325 | @staticmethod 326 | def __removeTabs(line): 327 | return line.replace("\n", "").replace("\t", "").strip() 328 | 329 | @staticmethod 330 | def __extractDataField(line, regex_tags: tuple): 331 | try: 332 | left, right = regex_tags 333 | searched_s = re.search(f"{left}(.+?){right}", line) 334 | span = searched_s.span() 335 | matched_s = line[span[0] + 1 : span[1] - 1].strip() 336 | line = line.replace(f"{searched_s.group()}", "") 337 | return (line, matched_s) 338 | except Exception: 339 | return (line, "") 340 | 341 | @staticmethod 342 | def __eval_range_value(v): 343 | try: 344 | if not re.search("\d-\d", v): 345 | return float(v) 346 | else: 347 | return np.mean([float(s) for s in v.split("-")]) 348 | except Exception: 349 | return -999 350 | 351 | @staticmethod 352 | def __splitSpeciesFromProteinID(line): 353 | try: 354 | idx = re.search("[A-Z]{1}[0-9]{1}", line).start() 355 | return (line[:idx].strip(), line[idx:].strip()) 356 | except Exception: 357 | return (line.strip(), "") 358 | 359 | def extractDataLineInfo(self, line: str, numeric_value=False): 360 | """ 361 | Extracts data fields in each data line according to the tags used by BRENDA 362 | and described in the REAMDE.txt file. What remains after extracting all tags 363 | is the value of that particular data field, e.g., KM value. 364 | """ 365 | line = self.__removeTabs(line) 366 | line, specific_info = self.__extractDataField(line, ("{", ".*}")) 367 | line, meta = self.__extractDataField(line, ("\(", ".*\)")) 368 | line, refs = self.__extractDataField(line, ("<", ">")) 369 | line, species = self.__extractDataField(line, ("#", "#")) 370 | if numeric_value: 371 | value = self.__eval_range_value(line.strip()) 372 | else: 373 | value = line.strip() 374 | return { 375 | "value": value, 376 | "species": species.split(","), 377 | "meta": meta, 378 | "refs": refs.split(","), 379 | "specific_info": specific_info, 380 | } 381 | 382 | def __extractReactionMechanismInfo(self, line: str): 383 | """ 384 | Extracts reaction string and mechanism info 385 | """ 386 | line = self.__removeTabs(line) 387 | line, meta = self.__extractDataField(line, ("\(", ".*\)")) 388 | rxn_str = line.strip() 389 | meta_list = [] 390 | for meta_line in meta.split(";"): 391 | meta_line, refs = self.__extractDataField(meta_line, ("<", ">")) 392 | meta_line, species = self.__extractDataField(meta_line, ("#", "#")) 393 | meta_list.append( 394 | { 395 | "species": species.split(","), 396 | "refs": refs.split(","), 397 | "meta": meta_line.strip(), 398 | } 399 | ) 400 | return (rxn_str, meta_list) 401 | 402 | def __getBinomialNames(self, species_list: list) -> list: 403 | """ 404 | Returns a list with binomial names mapped to the species codes 405 | employed by BRENDA to attach species to protein entries 406 | """ 407 | species_dict = self.__proteins 408 | return list( 409 | set( 410 | [ 411 | species_dict[s]["name"] 412 | for s in species_list 413 | if s in species_dict.keys() 414 | ] 415 | ) 416 | ) 417 | 418 | def __getFullReferences(self, refs_list: list) -> list: 419 | """ 420 | Returns a list with full reference mapped to the refs codes 421 | employed by BRENDA in each entry 422 | """ 423 | refs_dict = self.__references 424 | return [refs_dict[s] for s in refs_list if s in refs_dict.keys()] 425 | 426 | def __getDictOfEnzymeActuators(self, pattern: str) -> dict: 427 | res = {} 428 | lines = self.__getDataLines(pattern) 429 | for line in lines: 430 | data = self.extractDataLineInfo(line) 431 | if data["value"] != "more": 432 | res[data["value"]] = { 433 | "species": self.__getBinomialNames(data["species"]), 434 | "meta": data["meta"], 435 | #'refs': data['refs']} 436 | "refs": self.__getFullReferences(data["refs"]), 437 | } 438 | return EnzymePropertyDict(res) 439 | 440 | def __getDictOfEnzymeProperties(self, pattern: str) -> dict: 441 | res = {} 442 | lines = self.__getDataLines(pattern) 443 | for line in lines: 444 | data = self.extractDataLineInfo(line, numeric_value=True) 445 | substrate = data["specific_info"] 446 | if substrate != "more": 447 | if substrate not in res.keys(): 448 | res[substrate] = [] 449 | res[substrate].append( 450 | { 451 | "value": data["value"], 452 | "species": self.__getBinomialNames(data["species"]), 453 | "meta": data["meta"], 454 | #'refs': data['refs']}) 455 | "refs": self.__getFullReferences(data["refs"]), 456 | } 457 | ) 458 | return EnzymePropertyDict(res) 459 | 460 | def __extractTempOrPHData(self, data_type: str) -> list: 461 | values = [] 462 | lines = self.__getDataLines(data_type) 463 | if "R" not in data_type: 464 | eval_value = self.__eval_range_value 465 | else: 466 | 467 | def eval_value(v): 468 | try: 469 | return [float(s) for s in v.split("-")] 470 | except Exception: 471 | return [-999, -999] 472 | 473 | for line in lines: 474 | data = self.extractDataLineInfo(line) 475 | values.append( 476 | { 477 | "value": eval_value(data["value"]), 478 | "species": self.__getBinomialNames(data["species"]), 479 | "meta": data["meta"], 480 | "refs": data["refs"], 481 | } 482 | ) 483 | return values 484 | 485 | @property 486 | def summary(self): 487 | return self.printReactionSummary() 488 | 489 | @property 490 | def ec_number(self): 491 | return self.__ec_number 492 | 493 | @property 494 | def name(self): 495 | return self.__name 496 | 497 | @property 498 | def systematic_name(self): 499 | return self.__systematic_name 500 | 501 | @property 502 | def reaction_str(self): 503 | return self.__extractReactionMechanismInfo(self.__mechanism_str)[0] 504 | 505 | @property 506 | def mechanism(self): 507 | return self.__mechanism_str 508 | # return self.__extractReactionMechanismInfo(self.__mechanism_str)[1] 509 | 510 | @property 511 | def reaction_type(self) -> list[str]: 512 | return self.__reaction_type 513 | 514 | @property 515 | def cofactors(self): 516 | return self.__getDictOfEnzymeActuators("CF") 517 | 518 | @property 519 | def metals(self): 520 | return self.__getDictOfEnzymeActuators("ME") 521 | 522 | @property 523 | def inhibitors(self): 524 | return self.__getDictOfEnzymeActuators("IN") 525 | 526 | @property 527 | def activators(self): 528 | return self.__getDictOfEnzymeActuators("AC") 529 | 530 | @property 531 | def KMvalues(self): 532 | return self.__getDictOfEnzymeProperties("KM") 533 | 534 | @property 535 | def KIvalues(self): 536 | return self.__getDictOfEnzymeProperties("KI") 537 | 538 | @property 539 | def KKMvalues(self): 540 | return self.__getDictOfEnzymeProperties("KKM") 541 | 542 | @property 543 | def Kcatvalues(self): 544 | return self.__getDictOfEnzymeProperties("TN") 545 | 546 | @property 547 | def specificActivities(self): 548 | lines = self.__getDataLines("SA") 549 | return [self.extractDataLineInfo(line, numeric_value=True) for line in lines] 550 | 551 | @property 552 | def substratesAndProducts(self) -> list: 553 | """ 554 | Returns list of dicts with evaluated "natural" substrates and products 555 | of the enzyme across organisms. 556 | """ 557 | substrates, products, res = [], [], [] 558 | lines = self.__getDataLines("NSP") 559 | for line in lines: 560 | data = self.extractDataLineInfo(line) 561 | rxn = ( 562 | data["value"] 563 | .replace("{}", "") 564 | .replace("?", "") 565 | .replace("more", "") 566 | .strip() 567 | ) 568 | try: 569 | subs, prods = rxn.split("=") 570 | subs = [s.strip() for s in subs.split("+") if s.strip() != ""] 571 | prods = [s.strip() for s in prods.split("+") if s.strip() != ""] 572 | subs.sort() 573 | prods.sort() 574 | if subs not in substrates and len(subs) > 0 and len(prods) > 0: 575 | substrates.append(subs) 576 | products.append(prods) 577 | res.append({"substrates": subs, "products": prods}) 578 | except Exception: 579 | pass 580 | return res 581 | 582 | @property 583 | def temperature(self): 584 | return EnzymeConditionDict( 585 | { 586 | "optimum": self.__extractTempOrPHData("TO"), 587 | "range": self.__extractTempOrPHData("TR"), 588 | "stability": self.__extractTempOrPHData("TS"), 589 | } 590 | ) 591 | 592 | @property 593 | def PH(self): 594 | return EnzymeConditionDict( 595 | { 596 | "optimum": self.__extractTempOrPHData("PHO"), 597 | "range": self.__extractTempOrPHData("PHR"), 598 | "stability": self.__extractTempOrPHData("PHS"), 599 | } 600 | ) 601 | 602 | @property 603 | def proteins(self) -> dict: 604 | return self.__proteins 605 | 606 | @property 607 | def organisms(self) -> list: 608 | """ 609 | Returns a list containing all represented species in the database for this reaction 610 | """ 611 | organisms = list(set([s["name"] for s in self.proteins.values()])) 612 | organisms.sort() 613 | return organisms 614 | 615 | @property 616 | def references(self): 617 | return self.__references 618 | -------------------------------------------------------------------------------- /docs/examples.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Brendapyrser: A python parser for the BRENDA database\n", 8 | "\n", 9 | "This project provides python classes and functions to parse the text file containing the entire BRENDA enzyme database (https://www.brenda-enzymes.org)\n", 10 | "\n", 11 | "Due to BRENDA's license, BRENDA's database cannot be downloaded directly by the parser, instead, the user is asked to download the database as a text file after accepting usage conditions [here](https://www.brenda-enzymes.org/download_brenda_without_registration.php)." 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 1, 17 | "metadata": {}, 18 | "outputs": [], 19 | "source": [ 20 | "import numpy as np\n", 21 | "from matplotlib import pyplot as plt\n", 22 | "from brendapyrser import BRENDA\n", 23 | "\n", 24 | "\n", 25 | "dataFile = \"data/brenda_download.txt\"" 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": {}, 31 | "source": [ 32 | "## 1. Parsing BRENDA" 33 | ] 34 | }, 35 | { 36 | "cell_type": "code", 37 | "execution_count": 2, 38 | "metadata": {}, 39 | "outputs": [ 40 | { 41 | "data": { 42 | "text/html": [ 43 | "\n", 44 | " \n", 45 | " \n", 46 | " \n", 47 | " \n", 48 | " \n", 51 | " \n", 52 | " \n", 53 | " \n", 54 | " \n", 55 | " \n", 56 | "
Number of Enzymes7609
BRENDA copyrightCopyrighted by Dietmar Schomburg, Techn. University\n", 49 | " Braunschweig, GERMANY. Distributed under the License as stated\n", 50 | " at http:/www.brenda-enzymes.org
Brendapyrser version0.0.2
AuthorSemidán Robaina Estévez, 2020-2022
\n", 57 | " " 58 | ], 59 | "text/plain": [ 60 | "" 61 | ] 62 | }, 63 | "execution_count": 2, 64 | "metadata": {}, 65 | "output_type": "execute_result" 66 | } 67 | ], 68 | "source": [ 69 | "# Let's load the database\n", 70 | "brenda = BRENDA(dataFile)\n", 71 | "brenda" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": 4, 77 | "metadata": {}, 78 | "outputs": [ 79 | { 80 | "data": { 81 | "image/png": "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", 82 | "text/plain": [ 83 | "
" 84 | ] 85 | }, 86 | "metadata": { 87 | "needs_background": "light" 88 | }, 89 | "output_type": "display_data" 90 | }, 91 | { 92 | "name": "stdout", 93 | "output_type": "stream", 94 | "text": [ 95 | "Minimum and maximum values in database: 0.0 mM, 997.0 mM\n" 96 | ] 97 | } 98 | ], 99 | "source": [ 100 | "# Plot all Km values in the database\n", 101 | "BRENDA_KMs = np.array([v for r in brenda.reactions for v in r.KMvalues.get_values()])\n", 102 | "values = BRENDA_KMs[(BRENDA_KMs < 1000) & (BRENDA_KMs >= 0)]\n", 103 | "plt.hist(values)\n", 104 | "plt.title(f\"Median KM value: {np.median(values)}\")\n", 105 | "plt.xlabel(\"KM (mM)\")\n", 106 | "plt.show()\n", 107 | "print(f\"Minimum and maximum values in database: {values.min()} mM, {values.max()} mM\")" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 6, 113 | "metadata": {}, 114 | "outputs": [ 115 | { 116 | "data": { 117 | "image/png": "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", 118 | "text/plain": [ 119 | "
" 120 | ] 121 | }, 122 | "metadata": { 123 | "needs_background": "light" 124 | }, 125 | "output_type": "display_data" 126 | }, 127 | { 128 | "name": "stdout", 129 | "output_type": "stream", 130 | "text": [ 131 | "Minimum and maximum values in database: 5.83e-10 1/s, 997.0 1/s\n" 132 | ] 133 | } 134 | ], 135 | "source": [ 136 | "# Plot all Km values in the database\n", 137 | "BRENDA_Kcats = np.array(\n", 138 | " [v for r in brenda.reactions for v in r.Kcatvalues.get_values()]\n", 139 | ")\n", 140 | "values = BRENDA_Kcats[(BRENDA_Kcats < 1000) & (BRENDA_Kcats >= 0)]\n", 141 | "plt.hist(values)\n", 142 | "plt.title(f\"Median Kcat value: {np.median(values)}\")\n", 143 | "plt.xlabel(\"Kcat (1/s)\")\n", 144 | "plt.show()\n", 145 | "print(f\"Minimum and maximum values in database: {values.min()} 1/s, {values.max()} 1/s\")" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 7, 151 | "metadata": {}, 152 | "outputs": [ 153 | { 154 | "data": { 155 | "image/png": "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", 156 | "text/plain": [ 157 | "
" 158 | ] 159 | }, 160 | "metadata": { 161 | "needs_background": "light" 162 | }, 163 | "output_type": "display_data" 164 | }, 165 | { 166 | "name": "stdout", 167 | "output_type": "stream", 168 | "text": [ 169 | "Minimum and maximum values in database: 0.0 °C, 125.0 °C\n" 170 | ] 171 | } 172 | ], 173 | "source": [ 174 | "# Plot all enzyme optimal temperature values in the database\n", 175 | "BRENDA_TO = np.array(\n", 176 | " [\n", 177 | " v\n", 178 | " for r in brenda.reactions\n", 179 | " for v in r.temperature.filter_by_condition(\"optimum\").get_values()\n", 180 | " ]\n", 181 | ")\n", 182 | "values = BRENDA_TO[(BRENDA_TO >= 0)]\n", 183 | "plt.hist(values)\n", 184 | "plt.title(f\"Median Optimum Temperature: {np.median(values)}\")\n", 185 | "plt.xlabel(\"TO (${}^oC$)\")\n", 186 | "plt.show()\n", 187 | "print(f\"Minimum and maximum values in database: {values.min()} °C, {values.max()} °C\")" 188 | ] 189 | }, 190 | { 191 | "cell_type": "markdown", 192 | "metadata": {}, 193 | "source": [ 194 | "We see that the median optimal temperature for all enzymes in the BRENDA database is 37 °C! That's interesting... perhaps all organisms have agreed to prefer that temperature over other ones... or, more likely, it could be that BRENDA database is biased towards mammals and microorganisms that live within mammals... such as human pathogens.\n", 195 | "\n", 196 | "Let's filter results for a particular species, let's try with a hyperthermophylic baterial genus, _Thermotoga_" 197 | ] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "execution_count": 8, 202 | "metadata": {}, 203 | "outputs": [ 204 | { 205 | "data": { 206 | "image/png": "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", 207 | "text/plain": [ 208 | "
" 209 | ] 210 | }, 211 | "metadata": { 212 | "needs_background": "light" 213 | }, 214 | "output_type": "display_data" 215 | }, 216 | { 217 | "name": "stdout", 218 | "output_type": "stream", 219 | "text": [ 220 | "Minimum and maximum values in database: 20.0 °C, 105.0 °C\n" 221 | ] 222 | } 223 | ], 224 | "source": [ 225 | "# Plot all enzyme optimal temperature values in the database\n", 226 | "species = \"Thermotoga\"\n", 227 | "BRENDA_TO = np.array(\n", 228 | " [\n", 229 | " v\n", 230 | " for r in brenda.reactions.filter_by_organism(species)\n", 231 | " for v in r.temperature.filter_by_condition(\"optimum\")\n", 232 | " .filter_by_organism(species)\n", 233 | " .get_values()\n", 234 | " ]\n", 235 | ")\n", 236 | "values = BRENDA_TO[(BRENDA_TO >= 0)]\n", 237 | "plt.hist(values)\n", 238 | "plt.title(f\"Median Optimum Temperature: {np.median(values)}\")\n", 239 | "plt.xlabel(\"TO (${}^oC$)\")\n", 240 | "plt.show()\n", 241 | "print(f\"Minimum and maximum values in database: {values.min()} °C, {values.max()} °C\")" 242 | ] 243 | }, 244 | { 245 | "cell_type": "markdown", 246 | "metadata": {}, 247 | "source": [ 248 | "We can see that the median optimal temperature among all enzymes in the genus, 80°C, is much higher than in the case of the entire database. That's consistent with the fact that _Thermotoga_ are hyperthermophylic... alright!" 249 | ] 250 | }, 251 | { 252 | "cell_type": "markdown", 253 | "metadata": {}, 254 | "source": [ 255 | "## 2. Extracting data for _Pyruvate kinase_" 256 | ] 257 | }, 258 | { 259 | "cell_type": "code", 260 | "execution_count": 3, 261 | "metadata": {}, 262 | "outputs": [ 263 | { 264 | "data": { 265 | "text/html": [ 266 | "\n", 267 | " \n", 268 | " \n", 269 | " \n", 270 | " \n", 271 | " \n", 272 | " \n", 273 | " \n", 274 | " \n", 275 | " \n", 276 | " \n", 277 | " \n", 278 | " \n", 279 | "
Enzyme identifier2.7.1.40
NamePyruvate kinase
Systematic nameATP:pyruvate 2-O-phosphotransferase
Reaction typePhospho group transfer
ReactionATP + pyruvate <=> ADP + phosphoenolpyruvate
\n", 280 | " " 281 | ], 282 | "text/plain": [ 283 | "" 284 | ] 285 | }, 286 | "execution_count": 3, 287 | "metadata": {}, 288 | "output_type": "execute_result" 289 | } 290 | ], 291 | "source": [ 292 | "# We can retrieve an enzyme entry by its EC number like this\n", 293 | "r = brenda.reactions.get_by_id(\"2.7.1.40\")\n", 294 | "r" 295 | ] 296 | }, 297 | { 298 | "cell_type": "code", 299 | "execution_count": 10, 300 | "metadata": {}, 301 | "outputs": [ 302 | { 303 | "data": { 304 | "image/png": "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", 305 | "text/plain": [ 306 | "
" 307 | ] 308 | }, 309 | "metadata": { 310 | "needs_background": "light" 311 | }, 312 | "output_type": "display_data" 313 | } 314 | ], 315 | "source": [ 316 | "# Here are all the KM values for phosphoenolpyruvate associated with this enzyme class\n", 317 | "compound = \"phosphoenolpyruvate\"\n", 318 | "kms = r.KMvalues.filter_by_compound(compound).get_values()\n", 319 | "plt.hist(kms)\n", 320 | "plt.xlabel(\"KM (mM)\")\n", 321 | "plt.title(f\"{r.name} ({compound})\")\n", 322 | "plt.show()" 323 | ] 324 | }, 325 | { 326 | "cell_type": "code", 327 | "execution_count": 14, 328 | "metadata": {}, 329 | "outputs": [ 330 | { 331 | "data": { 332 | "image/png": "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", 333 | "text/plain": [ 334 | "
" 335 | ] 336 | }, 337 | "metadata": { 338 | "needs_background": "light" 339 | }, 340 | "output_type": "display_data" 341 | } 342 | ], 343 | "source": [ 344 | "# Here are all the KM values for phosphoenolpyruvate associated with this enzyme class\n", 345 | "compound = \"phosphoenolpyruvate\"\n", 346 | "KMs = r.KMvalues.filter_by_compound(compound).get_values()\n", 347 | "plt.hist(KMs)\n", 348 | "plt.xlabel(\"KM (mM)\")\n", 349 | "plt.title(f\"{r.name} ({compound})\")\n", 350 | "plt.show()" 351 | ] 352 | }, 353 | { 354 | "cell_type": "code", 355 | "execution_count": 12, 356 | "metadata": {}, 357 | "outputs": [ 358 | { 359 | "data": { 360 | "text/plain": [ 361 | "[0.051500000000000004, 0.18]" 362 | ] 363 | }, 364 | "execution_count": 12, 365 | "metadata": {}, 366 | "output_type": "execute_result" 367 | } 368 | ], 369 | "source": [ 370 | "# And further filtered by organism\n", 371 | "r.KMvalues.filter_by_organism(\"Bos taurus\").filter_by_compound(\n", 372 | " \"phosphoenolpyruvate\"\n", 373 | ").get_values()" 374 | ] 375 | }, 376 | { 377 | "cell_type": "code", 378 | "execution_count": 11, 379 | "metadata": {}, 380 | "outputs": [ 381 | { 382 | "data": { 383 | "image/png": "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", 384 | "text/plain": [ 385 | "
" 386 | ] 387 | }, 388 | "metadata": { 389 | "needs_background": "light" 390 | }, 391 | "output_type": "display_data" 392 | } 393 | ], 394 | "source": [ 395 | "# Here are all the Kcat values for phosphoenolpyruvate associated with this enzyme class\n", 396 | "compound = \"phosphoenolpyruvate\"\n", 397 | "kcats = r.Kcatvalues.filter_by_compound(compound).get_values()\n", 398 | "plt.hist(kcats)\n", 399 | "plt.xlabel(\"Kcat ($s^{-1}$)\")\n", 400 | "plt.title(f\"{r.name} ({compound})\")\n", 401 | "plt.show()" 402 | ] 403 | }, 404 | { 405 | "cell_type": "markdown", 406 | "metadata": {}, 407 | "source": [ 408 | "## 3 Finding all KM values for a given substrate and organism\n", 409 | "Next, we will retrieve KM values associated to a particular substrate for all enzymes in a given species. Will t he KM values distribute around a narrow or wider concentration range? Since substrate concentration in cytoplasma is the same for all enzymes it makes sense that all cytoplasmi enzymes utilizing that substrate have similar KM values. Let's test this idea with _Escherichia coli_ and some common substrates participating in the central carbon metabolism." 410 | ] 411 | }, 412 | { 413 | "cell_type": "code", 414 | "execution_count": 13, 415 | "metadata": {}, 416 | "outputs": [ 417 | { 418 | "data": { 419 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXAAAAEWCAYAAAB/tMx4AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjQuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8rg+JYAAAACXBIWXMAAAsTAAALEwEAmpwYAAAbU0lEQVR4nO3deZxcZZ3v8c8XQlgDYWkyISwRQTQwGrwNKCgqIYqAJDPDMAGX4GTMANdR7owzIF4V0XHgXhE3vBpBjLJmUEhE4QKRwFUkTIDIvoQQSCBLIwTComy/+8fzNBSVqq7T3dXdecj3/Xr1q+vsv1N96ltPPefUaUUEZmZWng2GugAzM+sbB7iZWaEc4GZmhXKAm5kVygFuZlYoB7iZWaEc4H0k6VRJ57dxfadIOqfCfD+R9LUepj8jadd21VWhnlefB0k75+1vOFjbb0XShyRdPtR1NCLpTEnHD3Ud3SSFpN3y4x9I+uJQ12Q9W28CXNISSc/ngOn++d5Q19UtIr4eEf/QhvVsERGL21FTH7b9SN7+y42m57/BwTXDUyQ9Kel9ksbmALmtbpntJL0gaUkfy/p34PSa9YWkOyRtUDPua5J+UrfdLfIxcmWT/Xhe0hpJqyXdKOm4unWu9UZbs4/D8qhvAKdIGt7HfRswEXFcRHx1qOuoJekYSQ9LelbS5ZK26WHe8ZJukfRc/j2+Ztqpkl6sy4Jda6bPkHSfpFckHTuwe9U/602AZx/JAdP98+mhLgig5gW93pA0FTgbOCwirq+ZtJmkvWqGjwEe6uM29gG2ioib6ibtAExpsfjfAH8GJkr6iwbTPxIRI4BdSG8QJwHn9qa+iFgO3Asc0Zvl1keS9gR+CHwcGAU8B3y/ybzDgdnA+cDWwExgdt0b5SV1WVDb6PkDcAJwa/v3pL3WtwBvSNJukq6X9JSkxyVdUjNtT0nXSHpC0kpJp9QsOlzST3NL7C5JnTXL7SDp55K6JD0k6TM1006VdKmk8yU9DRxb3yUj6T25Zbda0tK6lsDWkn6Vtztf0ptrlqv9GHyYpNskPZ3XcWqL52GSpIV5/gclHVKzL3Pyc7BI0qeaLF/fwmy2nX8EzgQ+FBE31k3+GTC1ZvgTwE/rlj9J0qN5/++TNKHJpj4MXN9g/P8CvtKizqnAD4DbgY81mykinoqIOcDfAVPr3nyqmAccVmVGScdK+p2ks/JxsVjS/nn8Ukmr8htj9/wbS/qGpEfysfsDSZvWTP9XScslPSbp7+u29eonCElbS7oiH8tP5sc71sw7T9JXc21rJF0tabtePg+tfBT4ZUTcEBHPAF8E/lrSiAbzvh8YBnwrIv4cEd8BBBxUZUMRcXZEzAX+1J7SB44DPPkqcDXp3XpH4LsA+eC4FriK1GrbDZhbs9wRwMXASGAO8L283AbAL0nv5GOACcCJkj5Us+wk4NK87AW1xUjaBbgy19EBjAcW1swyBfhKrncRqZugkWdJATiSFBLHS5rcaEZJ+5KC8l/z/AcCS/Lki4Fl+Tk4Evi6pEovhgaOB04DJkTEggbTzwemSNpQ0jhgC2B+TZ17AJ8G9skt4A/V1FnvL4H7Goz/BfA0cGyjhfLz/37S3+UC0nPYo4i4mfQcvbfVvHXuAd7Ri/n3I72pbAtcSPrb7EM6Nj8GfE/SFnne04G3kI6f3UjH4pcA8pvz54CJwO7Aq11bDWwAnEf6tLEz8Dz5WK9xDPBJYHtgeF73WpTOk6zu4eeYJjXsSXo9ARARDwIv5P1rNO/t8fr7hNyex3f7SG6Q3KV16DxEb61vAX553cHS3ZJ8kXRw7hARf4qI3+bxhwMrIuLMPH5NRMyvWd9vI+LXuc/3Z7z2QtwH6IiI0yLihfzx7Ee8/mP77yPi8oh4JSKer6vzGODaiLgoIl6MiD9GxMKa6ZdFxM0R8RIpYMY32tmImBcRd+Rt3A5cBLyvyXMzDfhxRFyT5380Iu6VtBNwAHBSfg4WAudQIdSamAjcBNzRZPoyUugenLfxs7rpLwMbA+MkbRQRS/KLuZGRwJoG44PUgvuiGvc/f5wUAHeTAnJPSXs336VXPQbU9st+rvZ4I4VIvTW5zqoeiojz8jF3CbATcFpuaV5NCrXdJAmYDvyPiHgiItYAX+e1Y/Ao4LyIuDMingVObbbBfPz9PCKey+v5d9Y+js6LiPvzsTyL5sfkIxExsoefC5uUsQXwVN24p4BGLfBW884C3kZqHH0K+JKko5tsd522vgX45LqD5Ud5/L+RPmLdnN+Ruz9O7gQ0CweAFTWPnwM2yR/LdwF2qHvxnkLqu+u2tIf19na7WzSaSdJ+kq7LH32fAo4Dmn20bbbNHYDuAOj2MKk11xfHk1pN5+SQaeSnpNbx0dQFeEQsAk4kBc4qSRdL2qHJep6k8QuciPg16c3iHxtM/gT5U1FEPErqhpnaYL56Y4Anaoa/UXu8AW9vsMwIYHWFdXdbWfP4+Vxj/bgtSOG0GXBLzTF4VR4P6e9aeww+3GyDkjaT9EOlE4hPAzcAI/X6q40qHZP98AywZd24LWn8Bt3jvBFxd0Q8FhEv5y68b5M+WRZnfQvwhiJiRUR8KiJ2IL2gv5/7kZcCfbkkbymppVT7ZjEiIg6t3WyL5d/cw/SqLiR17ewUEVuR+nSbhWazbT4GbFPX17gz8Ggfa1pJ6lJ6L01OQgE/J3X5LI6IR+onRsSFEfEe0htlAGc0Wc/tNP6I3e0LpDfWzbpHSNqf1KXweUkrJK0gdVsc01OfudIJ0zHAb5vN08TbqOkaaKPHSWG+Z80xuFVEdAfrctKbdrede1jXvwB7APtFxJak7jVofiw1pdcuNW3289Emi95FTVeT0lUjGwP3N5n37XUNhLfn8Y1EX/ZlXeAAByT9bc1JmSdJf9BXgCuA0ZJOzCeERkjar8IqbwbWKJ1s2zT35+6VX+RVXAAcLOkoScMkbauay6B6YQSp9fyn3MfdrH8R0hUUn5Q0QdIGksZIemtELAVuBP5D0iaS3k7qbunzNfAR8RgpxA+RdFaD6c+STjitdVmlpD0kHSRpY9JJpudJf6tGfk3zLiMiYh5wJ69vXU8FrgHGkboBxgN7AZuSTorW17OlpMNJXS3nR0SzrqFm3kc639G9vnlqcbK5ioh4hdRtd5ak7fO6x9Sch5lFOnk+TtJmwJd7WN0I0vO8WunSvZ7mbVVX96WmzX4uaLLoBaR+6/dK2px0HuUXdZ8Mu80jdbV9Jr9uu682+w28erJ+ayX7Ap8hXbVCnj5c0iakUN8oH/frZFauk0UNoF/WvdtflsfvA8yX9AypxfrZiFicD46JwEdIHxEfAD7QaiO5f/Jw0ov/IVJr6BxgqypF5lbnoaSWzxOkE5i9OdHV7QTgNElrSCevZvWwzZtJJ6HOIvUXXk9q4ULqyhhLao1fBnw5Iq7tQz2123uEFNJHSvqPBtMXNOnb3ph0cu5x0t9ke+DzTbZxK/BUizfd/0nut84v2qOA7+ZPZd0/D7H21TG/zM/rUlJL/puk568ySaNJbxSX14zeCfhdb9bTg5NIJ7lvyl0f15Ja0kTElcC3SKG2KP9u5lukN7DHSecvrmpTfZVFxF2kLsALgFWkN5UTuqdLulL5CrGIeAGYTOoKWw38Pan79IU8+xTSPq8hddedEREzazZ3NekNa39gRn58IOsghf+hg72BSfogcEJETB7qWupJOhN4MCK+n4d3BGZFxP5DW5mVwgFuZlao9a0LxczsDcMBbmZWKAe4mVmhBvUmStttt12MHTt2MDdpZla8W2655fGI6KgfP6gBPnbsWBYsaHT7CzMza0ZSw2/KugvFzKxQDnAzs0I5wM3MCuUANzMrlAPczKxQDnAzs0I5wM3MCuUANzMrlAPczKxQg/pNzP4Ye/KvhmS7S04/bEi2a2bWilvgZmaFcoCbmRXKAW5mVigHuJlZoRzgZmaFcoCbmRXKAW5mVqiWAS5pD0kLa36elnSipG0kXSPpgfx768Eo2MzMkpYBHhH3RcT4iBgP/DfgOeAy4GRgbkTsDszNw2ZmNkh624UyAXgwIh4GJgEz8/iZwOQ21mVmZi30NsCnABflx6MiYnl+vAIY1WgBSdMlLZC0oKurq49lmplZvcoBLmk4cATwn/XTIiKAaLRcRMyIiM6I6Ozo6OhzoWZm9nq9aYF/GLg1Ilbm4ZWSRgPk36vaXZyZmTXXmwA/mte6TwDmAFPz46nA7HYVZWZmrVUKcEmbAxOBX9SMPh2YKOkB4OA8bGZmg6TS/cAj4llg27pxfyRdlWJmZkPA38Q0MyuUA9zMrFAOcDOzQjnAzcwK5QA3MyuUA9zMrFAOcDOzQjnAzcwK5QA3MyuUA9zMrFAOcDOzQjnAzcwK5QA3MyuUA9zMrFAOcDOzQjnAzcwK5QA3MyuUA9zMrFAOcDOzQlX9p8YjJV0q6V5J90h6t6RtJF0j6YH8e+uBLtbMzF5TtQX+beCqiHgr8A7gHuBkYG5E7A7MzcNmZjZIWga4pK2AA4FzASLihYhYDUwCZubZZgKTB6ZEMzNrpEoL/E1AF3CepNsknSNpc2BURCzP86wARjVaWNJ0SQskLejq6mpP1WZmVinAhwHvBP5PROwNPEtdd0lEBBCNFo6IGRHRGRGdHR0d/a3XzMyyKgG+DFgWEfPz8KWkQF8paTRA/r1qYEo0M7NGWgZ4RKwAlkraI4+aANwNzAGm5nFTgdkDUqGZmTU0rOJ8/wRcIGk4sBj4JCn8Z0maBjwMHDUwJZqZWSOVAjwiFgKdDSZNaGs1ZmZWmb+JaWZWKAe4mVmhHOBmZoVygJuZFcoBbmZWKAe4mVmhHOBmZoVygJuZFcoBbmZWKAe4mVmhHOBmZoVygJuZFcoBbmZWKAe4mVmhHOBmZoVygJuZFcoBbmZWKAe4mVmhHOBmZoWq9D8xJS0B1gAvAy9FRKekbYBLgLHAEuCoiHhyYMo0M7N6vWmBfyAixkdE9z83PhmYGxG7A3PzsJmZDZL+dKFMAmbmxzOByf2uxszMKqsa4AFcLekWSdPzuFERsTw/XgGMarSgpOmSFkha0NXV1c9yzcysW6U+cOA9EfGopO2BayTdWzsxIkJSNFowImYAMwA6OzsbzmNmZr1XqQUeEY/m36uAy4B9gZWSRgPk36sGqkgzM1tbywCXtLmkEd2PgQ8CdwJzgKl5tqnA7IEq0szM1lalC2UUcJmk7vkvjIirJP0XMEvSNOBh4KiBK9PMzOq1DPCIWAy8o8H4PwITBqIoMzNrzd/ENDMrlAPczKxQDnAzs0I5wM3MCuUANzMrlAPczKxQDnAzs0I5wM3MCuUANzMrlAPczKxQDnAzs0I5wM3MCuUANzMrlAPczKxQDnAzs0I5wM3MCuUANzMrlAPczKxQDnAzs0JVDnBJG0q6TdIVefhNkuZLWiTpEknDB65MMzOr15sW+GeBe2qGzwDOiojdgCeBae0szMzMelYpwCXtCBwGnJOHBRwEXJpnmQlMHoD6zMysiaot8G8B/wa8koe3BVZHxEt5eBkwptGCkqZLWiBpQVdXV39qNTOzGi0DXNLhwKqIuKUvG4iIGRHRGRGdHR0dfVmFmZk1MKzCPAcAR0g6FNgE2BL4NjBS0rDcCt8ReHTgyjQzs3otW+AR8fmI2DEixgJTgN9ExEeB64Aj82xTgdkDVqWZma2lP9eBnwT8s6RFpD7xc9tTkpmZVVGlC+VVETEPmJcfLwb2bX9JZmZWhb+JaWZWKAe4mVmhHOBmZoVygJuZFcoBbmZWKAe4mVmhHOBmZoVygJuZFcoBbmZWKAe4mVmhHOBmZoVygJuZFcoBbmZWKAe4mVmhHOBmZoVygJuZFcoBbmZWKAe4mVmhHOBmZoVqGeCSNpF0s6Q/SLpL0lfy+DdJmi9pkaRLJA0f+HLNzKxblRb4n4GDIuIdwHjgEEnvAs4AzoqI3YAngWkDVqWZma2lZYBH8kwe3Cj/BHAQcGkePxOYPBAFmplZY5X6wCVtKGkhsAq4BngQWB0RL+VZlgFjmiw7XdICSQu6urraULKZmUHFAI+IlyNiPLAjsC/w1qobiIgZEdEZEZ0dHR19q9LMzNbSq6tQImI1cB3wbmCkpGF50o7Ao+0tzczMelLlKpQOSSPz402BicA9pCA/Ms82FZg9QDWamVkDw1rPwmhgpqQNSYE/KyKukHQ3cLGkrwG3AecOYJ1mZlanZYBHxO3A3g3GLyb1h5uZ2RDwNzHNzArlADczK5QD3MysUA5wM7NCOcDNzArlADczK5QD3MysUA5wM7NCOcDNzArlADczK5QD3MysUA5wM7NCOcDNzArlADczK5QD3MysUA5wM7NCOcDNzArlADczK5QD3MysUFX+K/1Okq6TdLekuyR9No/fRtI1kh7Iv7ce+HLNzKxblRb4S8C/RMQ44F3Af5c0DjgZmBsRuwNz87CZmQ2SlgEeEcsj4tb8eA1wDzAGmATMzLPNBCYPUI1mZtZAr/rAJY0F9gbmA6MiYnmetAIY1WSZ6ZIWSFrQ1dXVn1rNzKxG5QCXtAXwc+DEiHi6dlpEBBCNlouIGRHRGRGdHR0d/SrWzMxeUynAJW1ECu8LIuIXefRKSaPz9NHAqoEp0czMGqlyFYqAc4F7IuKbNZPmAFPz46nA7PaXZ2ZmzQyrMM8BwMeBOyQtzONOAU4HZkmaBjwMHDUgFZqZWUMtAzwifguoyeQJ7S3HzMyq8jcxzcwK5QA3MyuUA9zMrFAOcDOzQjnAzcwK5QA3MyuUA9zMrFAOcDOzQjnAzcwK5QA3MyuUA9zMrFAOcDOzQjnAzcwK5QA3MyuUA9zMrFAOcDOzQjnAzcwK5QA3MyuUA9zMrFBV/iv9jyWtknRnzbhtJF0j6YH8e+uBLdPMzOpVaYH/BDikbtzJwNyI2B2Ym4fNzGwQtQzwiLgBeKJu9CRgZn48E5jc3rLMzKyVvvaBj4qI5fnxCmBUsxklTZe0QNKCrq6uPm7OzMzq9fskZkQEED1MnxERnRHR2dHR0d/NmZlZ1tcAXylpNED+vap9JZmZWRXD+rjcHGAqcHr+PbttFa1jxp78q6EuYdAtOf2woS7BzCqochnhRcDvgT0kLZM0jRTcEyU9ABych83MbBC1bIFHxNFNJk1ocy1mZtYL/iammVmhHOBmZoVygJuZFcoBbmZWKAe4mVmhHOBmZoVygJuZFcoBbmZWKAe4mVmhHOBmZoVygJuZFaqvdyO0N7ChvAOj74RoVp1b4GZmhXIL3Ax/6rAyuQVuZlYoB7iZWaHchWJm642h6iobqG4yt8DNzArlADczK1S/ulAkHQJ8G9gQOCci/M+NrV+G8mqQofJG+1hvg6fPLXBJGwJnAx8GxgFHSxrXrsLMzKxn/elC2RdYFBGLI+IF4GJgUnvKMjOzVvrThTIGWFozvAzYr34mSdOB6XnwGUn39XF72wGP93HZEnj/ylfUPuqMXi9S1P710YDsYx+e63q7NBo54JcRRsQMYEZ/1yNpQUR0tqGkdZL3r3xv9H18o+8flLeP/elCeRTYqWZ4xzzOzMwGQX8C/L+A3SW9SdJwYAowpz1lmZlZK33uQomIlyR9Gvi/pMsIfxwRd7WtsrX1uxtmHef9K98bfR/f6PsHhe2jImKoazAzsz7wNzHNzArlADczK9Q6FeCSDpF0n6RFkk5uMH1jSZfk6fMljR2CMvulwj7+s6S7Jd0uaa6khtd/rqta7V/NfH8jKSQVc8lWtyr7KOmo/He8S9KFg11jf1Q4RneWdJ2k2/JxeuhQ1NlXkn4saZWkO5tMl6Tv5P2/XdI7B7vGyiJinfghnQh9ENgVGA78ARhXN88JwA/y4ynAJUNd9wDs4weAzfLj40vaxyr7l+cbAdwA3AR0DnXdA/A33B24Ddg6D28/1HW3ef9mAMfnx+OAJUNddy/38UDgncCdTaYfClwJCHgXMH+oa272sy61wKt8NX8SMDM/vhSYIEmDWGN/tdzHiLguIp7LgzeRrq8vRdXbK3wVOAP402AW1yZV9vFTwNkR8SRARKwa5Br7o8r+BbBlfrwV8Ngg1tdvEXED8EQPs0wCfhrJTcBISaMHp7reWZcCvNFX88c0myciXgKeArYdlOrao8o+1ppGagmUouX+5Y+jO0VEqbcdrPI3fAvwFkm/k3RTvmtnKars36nAxyQtA34N/NPglDZoevs6HTL+jzzrKEkfAzqB9w11Le0iaQPgm8CxQ1zKQBtG6kZ5P+kT1A2S/jIiVg9lUW10NPCTiDhT0ruBn0naKyJeGerC1jfrUgu8ylfzX51H0jDSx7c/Dkp17VHp9gOSDga+ABwREX8epNraodX+jQD2AuZJWkLqX5xT2InMKn/DZcCciHgxIh4C7icFegmq7N80YBZARPwe2IR0E6g3imJuE7IuBXiVr+bPAabmx0cCv4l81qEQLfdR0t7AD0nhXVLfKbTYv4h4KiK2i4ixETGW1Md/REQsGJpy+6TKcXo5qfWNpO1IXSqLB7HG/qiyf48AEwAkvY0U4F2DWuXAmgN8Il+N8i7gqYhYPtRFNTTUZ1EbnP29n3QW/At53GmkFzmkA+U/gUXAzcCuQ13zAOzjtcBKYGH+mTPUNbdz/+rmnUdhV6FU/BuK1FV0N3AHMGWoa27z/o0Dfke6QmUh8MGhrrmX+3cRsBx4kfRpaRpwHHBczd/v7Lz/d6zLx6i/Sm9mVqh1qQvFzMx6wQFuZlYoB7iZWaEc4GZmhXKAm5kVygFuxZH0TM3jQyXdL2kXSafmOxzuVjP9xJ7ueijpUkm79mLb78/r+4eacePzuM/l4W9IOqhve2dWnQPciiVpAvAd4MMR8XAefQfpyyfd/hZo+K/+JO0JbBgRvf2SzZ3AUTXDR5Ouie72XaDprXTN2sUBbkWSdCDwI+DwiHiwZtLl5LvnSXoz6YZnjzdZzUeB2TXrfEbS/8738L5W0r6S5klaLOmImuUeBjaRNCrfDfMQam46lt9MtpX0F/3fU7PmHOBWoo1JQT05Iu6tm/Y0sFTSXuR7xvewngOAW2qGNyfdnmFPYA3wNWAi8FekbyLWupTUut8fuBWov2fNrXn9ZgPGAW4lehG4kfQV6EYuJoX3ZOCyHtYzmtffw+MF4Kr8+A7g+oh4MT8eW7fsLFKAH036ana9VcAOPWzbrN8c4FaiV0h90PtKOqXB9CuAjwOPRMTTPaznedL9dbq9GK/dW+IVcqs60m1SX3fr5YhYQXojmQjMbbDuTfL6zQaM7wduRYqI5yQdBvw/SSsj4ty6aSeRbsjUk3uA3YAlfSzjS6R/l/Zyg38M9RbSjdfMBowD3IoVEU/k/3Zzg6SuumkXV1jFr0i3fb22j9u/sdF4SRuR3hhKuk2uFch3I7T1lqRNgeuAAyLi5Tau96+Ad0bEF9u1TrNG3Adu662IeB74Mu3/f4fDgDPbvE6ztbgFbmZWKLfAzcwK5QA3MyuUA9zMrFAOcDOzQjnAzcwK9f8BmdK0DxAwqXMAAAAASUVORK5CYII=", 420 | "text/plain": [ 421 | "
" 422 | ] 423 | }, 424 | "metadata": { 425 | "needs_background": "light" 426 | }, 427 | "output_type": "display_data" 428 | } 429 | ], 430 | "source": [ 431 | "species, compound = \"Escherichia coli\", \"NADH\"\n", 432 | "KMs = np.array(\n", 433 | " [\n", 434 | " v\n", 435 | " for r in brenda.reactions.filter_by_organism(species)\n", 436 | " for v in r.KMvalues.filter_by_compound(compound)\n", 437 | " .filter_by_organism(species)\n", 438 | " .get_values()\n", 439 | " ]\n", 440 | ")\n", 441 | "\n", 442 | "if len(KMs) > 0:\n", 443 | " plt.hist(KMs)\n", 444 | " plt.xlabel(\"KM (mM)\")\n", 445 | " plt.title(f\"{species} KMs ({compound}), median = {np.median((KMs))}\")\n", 446 | " plt.show()\n", 447 | "else:\n", 448 | " print(\"No KM values for compound\")" 449 | ] 450 | }, 451 | { 452 | "cell_type": "markdown", 453 | "metadata": {}, 454 | "source": [ 455 | "That's interesting! typical NADH concentrations are low in _Escherichia coli_, e.g., from [BioNumbers](http://book.bionumbers.org/what-are-the-concentrations-of-free-metabolites-in-cells/) we get a value of 0.083 mM. The median KM value for NADH among all enzymes binding it is lower as we see in the plot above! Hence, it looks like most enzymes are (nearly) saturated for NADH and thus fluxes are sort of independent of NADH concentration." 456 | ] 457 | }, 458 | { 459 | "cell_type": "markdown", 460 | "metadata": {}, 461 | "source": [ 462 | "# 4 Filtering reactions by specific compound\n", 463 | "\n", 464 | "We can also filter reactions in BRENDA by a specific compound: substrate, product or either of the two. Let's filter reactions containing _phosphoenolpyruvate_ as a substrate, product or both to exemplify this feature" 465 | ] 466 | }, 467 | { 468 | "cell_type": "code", 469 | "execution_count": 25, 470 | "metadata": {}, 471 | "outputs": [ 472 | { 473 | "data": { 474 | "text/html": [ 475 | "\n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | " \n", 481 | " \n", 482 | " \n", 483 | " \n", 484 | " \n", 485 | " \n", 486 | " \n", 487 | " \n", 488 | "
Enzyme identifier2.5.1.19
Name3-phosphoshikimate 1-carboxyvinyltransferase
Systematic namephosphoenolpyruvate:3-phosphoshikimate 5-O-(1-carboxyvinyl)-transferase
Reaction typeEnolpyruvate group transfer (#3,52,55# induced-fit mechanism, formation
Reactionphosphoenolpyruvate + 3-phosphoshikimate <=> phosphate +5-O-
\n", 489 | " " 490 | ], 491 | "text/plain": [ 492 | "" 493 | ] 494 | }, 495 | "execution_count": 25, 496 | "metadata": {}, 497 | "output_type": "execute_result" 498 | } 499 | ], 500 | "source": [ 501 | "substrate_rxns = brenda.reactions.filter_by_substrate(\"phosphoenolpyruvate\")\n", 502 | "substrate_rxns[2]" 503 | ] 504 | }, 505 | { 506 | "cell_type": "code", 507 | "execution_count": 26, 508 | "metadata": {}, 509 | "outputs": [ 510 | { 511 | "data": { 512 | "text/html": [ 513 | "\n", 514 | " \n", 515 | " \n", 516 | " \n", 517 | " \n", 518 | " \n", 519 | " \n", 520 | " \n", 521 | " \n", 522 | " \n", 523 | " \n", 524 | " \n", 525 | " \n", 526 | "
Enzyme identifier2.5.1.7
NameUdp-n-acetylglucosamine 1-carboxyvinyltransferase
Systematic namephosphoenolpyruvate:UDP-N-acetyl-D-glucosamine
Reaction typeCarboxyvinyl group transfer
Reactionphosphoenolpyruvate + UDP-N-acetyl-alpha-D-glucosamine <=> phosphate +UDP-N-acetyl-3-O-
\n", 527 | " " 528 | ], 529 | "text/plain": [ 530 | "" 531 | ] 532 | }, 533 | "execution_count": 26, 534 | "metadata": {}, 535 | "output_type": "execute_result" 536 | } 537 | ], 538 | "source": [ 539 | "compound_rxns = brenda.reactions.filter_by_compound(\"phosphoenolpyruvate\")\n", 540 | "compound_rxns[7]" 541 | ] 542 | } 543 | ], 544 | "metadata": { 545 | "interpreter": { 546 | "hash": "367a058ebb24ea2c2bb1633bf810ec6a1a05f59e065f27f721ea93103e797079" 547 | }, 548 | "kernelspec": { 549 | "display_name": "Python 3 (ipykernel)", 550 | "language": "python", 551 | "name": "python3" 552 | }, 553 | "language_info": { 554 | "codemirror_mode": { 555 | "name": "ipython", 556 | "version": 3 557 | }, 558 | "file_extension": ".py", 559 | "mimetype": "text/x-python", 560 | "name": "python", 561 | "nbconvert_exporter": "python", 562 | "pygments_lexer": "ipython3", 563 | "version": "3.9.6" 564 | } 565 | }, 566 | "nbformat": 4, 567 | "nbformat_minor": 4 568 | } 569 | --------------------------------------------------------------------------------