{"id":16916904,"url":"https://github.com/althonos/pyrodigal","last_synced_at":"2026-03-07T21:07:15.533Z","repository":{"id":40408396,"uuid":"259109961","full_name":"althonos/pyrodigal","owner":"althonos","description":"Cython bindings and Python interface to Prodigal, an ORF finder for genomes and metagenomes. Now with SIMD!","archived":false,"fork":false,"pushed_at":"2026-01-07T16:05:03.000Z","size":7425,"stargazers_count":178,"open_issues_count":14,"forks_count":10,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-03-01T16:44:54.272Z","etag":null,"topics":["bioconda","bioinformatics","cython-wrapper","gene-finding","genome","metagenomes","orf-finder","prodigal","python","python-interface","python-library","simd"],"latest_commit_sha":null,"homepage":"https://pyrodigal.readthedocs.org","language":"Cython","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/althonos.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-04-26T18:59:13.000Z","updated_at":"2026-02-20T18:35:46.000Z","dependencies_parsed_at":"2023-09-27T16:30:08.758Z","dependency_job_id":"e6264495-1e92-42e8-9728-484f328b6c1c","html_url":"https://github.com/althonos/pyrodigal","commit_stats":{"total_commits":839,"total_committers":5,"mean_commits":167.8,"dds":0.1299165673420739,"last_synced_commit":"b02c8f01f141ad0999721ad772aa146a65f2fb99"},"previous_names":[],"tags_count":74,"template":false,"template_full_name":null,"purl":"pkg:github/althonos/pyrodigal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/althonos%2Fpyrodigal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/althonos%2Fpyrodigal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/althonos%2Fpyrodigal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/althonos%2Fpyrodigal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/althonos","download_url":"https://codeload.github.com/althonos/pyrodigal/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/althonos%2Fpyrodigal/sbom","scorecard":{"id":187194,"data":{"date":"2025-08-11","repo":{"name":"github.com/althonos/pyrodigal","commit":"189767337875401742a906299c84b34f18043bfd"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"name":"Code-Review","score":0,"reason":"Found 1/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/package.yml:1","Warn: no topLevel permission defined: .github/workflows/paper.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":2,"reason":"2 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Info: Possibly incomplete results: error parsing shell code: a command can only contain words and redirects; encountered (: benches/data/download.py:0","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/package.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/package.yml:58: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:65: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:74: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/package.yml:78: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:85: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:94: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/package.yml:98: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/package.yml:102: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:110: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:119: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:123: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:131: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:194: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/package.yml:195: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/package.yml:38: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:143: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:147: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:173: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:178: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/package.yml:183: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:208: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:212: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/package.yml:216: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/package.yml:227: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/package.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/paper.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/paper.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/paper.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/paper.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/paper.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/paper.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:50: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:54: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:108: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:112: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:165: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:169: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/test.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:174: update your workflow using https://app.stepsecurity.io/secureworkflow/althonos/pyrodigal/test.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/package.yml:153","Warn: pipCommand not pinned by hash: .github/workflows/package.yml:155","Warn: pipCommand not pinned by hash: .github/workflows/package.yml:128","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:59","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:61","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:63","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:117","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:119","Warn: pipCommand not pinned by hash: .github/workflows/test.yml:121","Info:   0 out of  29 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  11 third-party GitHubAction dependencies pinned","Info:   0 out of   9 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: COPYING:0","Info: FSF or OSI recognized license: GNU General Public License v3.0: COPYING:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/package.yml:158"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"19 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2018-34 / GHSA-2fc2-6r4j-p65h","Warn: Project is vulnerable to: PYSEC-2021-856 / GHSA-5545-2q6w-2gh6","Warn: Project is vulnerable to: PYSEC-2019-108 / GHSA-9fq2-x9r6-wfmf","Warn: Project is vulnerable to: PYSEC-2018-33 / GHSA-cw6w-4rcx-xphc","Warn: Project is vulnerable to: PYSEC-2021-857 / GHSA-f7c7-j99h-c22f","Warn: Project is vulnerable to: GHSA-fpfv-jqm9-f5jm","Warn: Project is vulnerable to: PYSEC-2017-1 / GHSA-frgw-fgh6-9g52","Warn: Project is vulnerable to: PYSEC-2019-156 / GHSA-xp76-357g-9wqq","Warn: Project is vulnerable to: PYSEC-2023-102","Warn: Project is vulnerable to: PYSEC-2023-114","Warn: Project is vulnerable to: PYSEC-2017-74","Warn: Project is vulnerable to: GHSA-29gw-9793-fvw7","Warn: Project is vulnerable to: PYSEC-2022-12 / GHSA-pq7m-3gw7-gq5x","Warn: Project is vulnerable to: PYSEC-2021-140 / GHSA-9w8r-397f-prfh","Warn: Project is vulnerable to: PYSEC-2023-117 / GHSA-mrwq-x4v8-fh7p","Warn: Project is vulnerable to: PYSEC-2021-141 / GHSA-pq64-v7f5-gqh8","Warn: Project is vulnerable to: PYSEC-2025-49 / GHSA-5rjg-fvgr-3xxf","Warn: Project is vulnerable to: GHSA-cx63-2mw6-8hw5","Warn: Project is vulnerable to: PYSEC-2022-43012 / GHSA-r9hx-vwmv-q579"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 1 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-16T19:59:30.823Z","repository_id":40408396,"created_at":"2025-08-16T19:59:30.823Z","updated_at":"2025-08-16T19:59:30.823Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30225411,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T17:00:40.062Z","status":"ssl_error","status_checked_at":"2026-03-07T17:00:39.026Z","response_time":53,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bioconda","bioinformatics","cython-wrapper","gene-finding","genome","metagenomes","orf-finder","prodigal","python","python-interface","python-library","simd"],"created_at":"2024-10-13T19:31:15.275Z","updated_at":"2026-03-07T21:07:15.501Z","avatar_url":"https://github.com/althonos.png","language":"Cython","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🔥 Pyrodigal [![Stars](https://img.shields.io/github/stars/althonos/pyrodigal.svg?style=social\u0026maxAge=3600\u0026label=Star)](https://github.com/althonos/pyrodigal/stargazers)\n\n*Cython bindings and Python interface to [Prodigal](https://github.com/hyattpd/Prodigal/), an ORF\nfinder for genomes and metagenomes. **Now with SIMD!***\n\n[![Actions](https://img.shields.io/github/actions/workflow/status/althonos/pyrodigal/test.yml?branch=main\u0026logo=github\u0026style=flat-square\u0026maxAge=300)](https://github.com/althonos/pyrodigal/actions)\n[![Coverage](https://img.shields.io/codecov/c/gh/althonos/pyrodigal?style=flat-square\u0026maxAge=3600\u0026logo=codecov)](https://codecov.io/gh/althonos/pyrodigal/)\n[![License](https://img.shields.io/badge/license-GPLv3-blue.svg?style=flat-square\u0026maxAge=2678400)](https://choosealicense.com/licenses/gpl-3.0/)\n[![PyPI](https://img.shields.io/pypi/v/pyrodigal.svg?style=flat-square\u0026maxAge=3600\u0026logo=PyPI)](https://pypi.org/project/pyrodigal)\n[![Bioconda](https://img.shields.io/conda/vn/bioconda/pyrodigal?style=flat-square\u0026maxAge=3600\u0026logo=anaconda)](https://anaconda.org/bioconda/pyrodigal)\n[![AUR](https://img.shields.io/aur/version/python-pyrodigal?logo=archlinux\u0026style=flat-square\u0026maxAge=3600)](https://aur.archlinux.org/packages/python-pyrodigal)\n[![Wheel](https://img.shields.io/pypi/wheel/pyrodigal.svg?style=flat-square\u0026maxAge=3600)](https://pypi.org/project/pyrodigal/#files)\n[![Python Versions](https://img.shields.io/pypi/pyversions/pyrodigal.svg?style=flat-square\u0026maxAge=600\u0026logo=python)](https://pypi.org/project/pyrodigal/#files)\n[![Python Implementations](https://img.shields.io/pypi/implementation/pyrodigal.svg?style=flat-square\u0026maxAge=600\u0026label=impl)](https://pypi.org/project/pyrodigal/#files)\n[![Source](https://img.shields.io/badge/source-GitHub-303030.svg?maxAge=2678400\u0026style=flat-square)](https://github.com/althonos/pyrodigal/)\n[![GitHub issues](https://img.shields.io/github/issues/althonos/pyrodigal.svg?style=flat-square\u0026maxAge=600)](https://github.com/althonos/pyrodigal/issues)\n[![Docs](https://img.shields.io/readthedocs/pyrodigal/latest?style=flat-square\u0026maxAge=600)](https://pyrodigal.readthedocs.io)\n[![Changelog](https://img.shields.io/badge/keep%20a-changelog-8A0707.svg?maxAge=2678400\u0026style=flat-square)](https://github.com/althonos/pyrodigal/blob/main/CHANGELOG.md)\n[![Downloads](https://img.shields.io/badge/dynamic/regex?url=https%3A%2F%2Fpepy.tech%2Fprojects%2Fpyrodigal\u0026search=%5B0-9%5D%2B.%5B0-9%5D%2B(k%7CM)\u0026style=flat-square\u0026label=downloads\u0026color=303f9f\u0026cacheSeconds=86400)](https://pepy.tech/project/pyrodigal)\n[![Paper](https://img.shields.io/badge/paper-JOSS-9400ff?style=flat-square\u0026maxAge=86400)](https://doi.org/10.21105/joss.04296)\n[![Citations](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fbadge.dimensions.ai%2Fdetails%2Fid%2Fpub.1147419140%2Fmetadata.json\u0026query=%24.times_cited\u0026style=flat-square\u0026label=citations\u0026maxAge=86400)](https://badge.dimensions.ai/details/id/pub.1147419140)\n\n## 🗺️ Overview\n\nPyrodigal is a Python module that provides bindings to Prodigal using\n[Cython](https://cython.org/). It directly interacts with the Prodigal\ninternals, which has the following advantages:\n\n- **single dependency**: Pyrodigal is distributed as a Python package, so you\n  can add it as a dependency to your project, and stop worrying about the\n  Prodigal binary being present on the end-user machine.\n- **no intermediate files**: Everything happens in memory, in a Python object\n  you fully control, so you don't have to invoke the Prodigal CLI using a\n  sub-process and temporary files. Sequences can be passed directly as\n  strings or bytes, which avoids the overhead of formatting your input to\n  FASTA for Prodigal.\n- **better memory usage**: Pyrodigal uses more compact data structures compared\n  to the original Prodigal implementation, allowing to save memory to store \n  the same information. A heuristic is used to estimate the number of nodes\n  to allocate based on the sequence GC% in order to minimize reallocations.\n- **better performance**: Pyrodigal uses *SIMD* instructions to compute which\n  dynamic programming nodes can be ignored when scoring connections. This can\n  save from a third to half the runtime depending on the sequence. The [Benchmarks](https://pyrodigal.readthedocs.io/en/stable/guide/benchmarks.html) page of the documentation contains comprehensive comparisons. See the [JOSS paper](https://doi.org/10.21105/joss.04296)\n  for details about how this is achieved.\n- **same results**: Pyrodigal is tested to make sure it produces\n  exactly the same results as Prodigal `v2.6.3+31b300a`. *This was verified\n  extensively by [Julian Hahnfeld](https://github.com/jhahnfeld) and can be\n  checked with his [comparison repository](https://github.com/jhahnfeld/prodigal-pyrodigal-comparison).*\n\n### 📋 Features\n\nThe library now features everything from the original Prodigal CLI:\n\n- **run mode selection**: Choose between *single* mode, using a training\n  sequence to count nucleotide hexamers, or *metagenomic* mode, using\n  pre-trained data from different organisms (`prodigal -p`).\n- **region masking**: Prevent genes from being predicted across regions\n  containing unknown nucleotides  (`prodigal -m`).\n- **closed ends**: Genes will be identified as running over edges if they\n  are larger than a certain size, but this can be disabled (`prodigal -c`).\n- **training configuration**: During the training process, a custom\n  translation table can be given (`prodigal -g`), and the Shine-Dalgarno motif\n  search can be forcefully bypassed (`prodigal -n`)\n- **output files**: Output files can be written in a format mostly\n  compatible with the Prodigal binary, including the protein translations\n  in FASTA format (`prodigal -a`), the gene sequences in FASTA format\n  (`prodigal -d`), or the potential gene scores in tabular format\n  (`prodigal -s`).\n- **training data persistence**: Getting training data from a sequence and\n  using it for other sequences is supported; in addition, a training data\n  file can be saved and loaded transparently (`prodigal -t`).\n\nIn addition, the **new** features are available:\n\n- **custom gene size threshold**: While Prodigal uses a minimum gene size\n  of 90 nucleotides (60 if on edge), Pyrodigal allows to customize this\n  threshold, allowing for smaller ORFs to be identified if needed.\n- **custom metagenomic models**: Since `v3.0.0`, you can use your own \n  metagenomic models to run Pyrodigal in *meta*-mode. *Check for instance\n  [`pyrodigal-gv`](https://github.com/althonos/pyrodigal-gv) by \n  [Antônio Camargo](https://github.com/apcamargo/), which \n  provides additional models for giant viruses and gut phages,\n  or [`pyrodigal-rv`](https://github.com/LanderDC/pyrodigal-rv)\n  by [Lander De Coninck](https://github.com/LanderDC) which\n  provides additional models for RNA viruses.*\n\n### 🐏 Memory\n\nPyrodigal makes several changes compared to the original Prodigal binary\nregarding memory management:\n\n* Sequences are stored as raw bytes instead of compressed bitmaps. This means\n  that the sequence itself takes 3/8th more space, but since the memory used\n  for storing the sequence is often negligible compared to the memory used to\n  store dynamic programming nodes, this is an acceptable trade-off for better\n  performance when extracting said nodes.\n* Node fields use smaller data types to fit into 128 bytes, compared to the \n  176 bytes of the original Prodigal data structure.\n* Node arrays are pre-allocated based on the sequence GC% to extrapolate the\n  probability to find a start or stop codon.\n* Genes are stored in a more compact data structure than in Prodigal (which\n  reserves a buffer to store string data), saving around 1KiB per gene.\n\n\n### 🧶 Thread-safety\n\n[`pyrodigal.GeneFinder`](https://pyrodigal.readthedocs.io/en/stable/api/gene_finder.html#pyrodigal.GeneFinder)\ninstances are thread-safe. In addition, the\n[`find_genes`](https://pyrodigal.readthedocs.io/en/stable/api/gene_finder.html#pyrodigal.GeneFinder.find_genes)\nmethod is re-entrant. This means you can train an\n[`GeneFinder`](https://pyrodigal.readthedocs.io/en/stable/api/gene_finder.html#pyrodigal.GeneFinder)\ninstance once, and then use a pool to process sequences in parallel:\n```python\nimport multiprocessing.pool\nimport pyrodigal\n\ngene_finder = pyrodigal.GeneFinder()\ngene_finder.train(training_sequence)\n\nwith multiprocessing.pool.ThreadPool() as pool:\n    predictions = pool.map(gene_finder.find_genes, sequences)\n```\n\n## 🔧 Installing\n\nThis project is supported on Python 3.7 and later.\n\nPyrodigal can be installed directly from [PyPI](https://pypi.org/project/pyrodigal/),\nwhich hosts some pre-built wheels for the x86-64 architecture (Linux/MacOS/Windows)\nand the Aarch64 architecture (Linux/MacOS), as well as the code required to compile\nfrom source with Cython:\n```console\n$ pip install pyrodigal\n```\n\nOtherwise, Pyrodigal is also available as a [Bioconda](https://bioconda.github.io/)\npackage:\n```console\n$ conda install -c bioconda pyrodigal\n```\n\nCheck the [*install* page](https://pyrodigal.readthedocs.io/en/stable/guide/install.html)\nof the documentation for other ways to install Pyrodigal on your machine.\n\n## 💡 Example\n\nLet's load a sequence from a\n[GenBank](http://www.insdc.org/files/feature_table.html) file, use a `GeneFinder`\nto find all the genes it contains, and print the proteins in two-line FASTA\nformat.\n\n### 🔬 [Biopython](https://github.com/biopython/biopython)\n\nTo use the [`GeneFinder`](https://pyrodigal.readthedocs.io/en/stable/api/gene_finder.html#pyrodigal.GeneFinder)\nin single mode (corresponding to `prodigal -p single`, the default operation mode of Prodigal),\nyou must explicitly call the\n[`train`](https://pyrodigal.readthedocs.io/en/stable/api/gene_finder.html#pyrodigal.GeneFinder.train) method\nwith the sequence you want to use for training before trying to find genes,\nor you will get a [`RuntimeError`](https://docs.python.org/3/library/exceptions.html#RuntimeError):\n```python\nimport Bio.SeqIO\nimport pyrodigal\n\nrecord = Bio.SeqIO.read(\"sequence.gbk\", \"genbank\")\n\ngene_finder = pyrodigal.GeneFinder()\ngene_finder.train(bytes(record.seq))\ngenes = gene_finder.find_genes(bytes(record.seq))\n```\n\nHowever, in `meta` mode (corresponding to `prodigal -p meta`), you can find genes directly:\n```python\nimport Bio.SeqIO\nimport pyrodigal\n\nrecord = Bio.SeqIO.read(\"sequence.gbk\", \"genbank\")\n\ngene_finder = pyrodigal.GeneFinder(meta=True)\nfor i, pred in enumerate(gene_finder.find_genes(bytes(record.seq))):\n    print(f\"\u003e{record.id}_{i+1}\")\n    print(pred.translate())\n```\n\n*On older versions of Biopython (before 1.79) you will need to use\n`record.seq.encode()` instead of `bytes(record.seq)`*.\n\n\n### 🧪 [Scikit-bio](https://github.com/biocore/scikit-bio)\n\n```python\nimport skbio.io\nimport pyrodigal\n\nseq = next(skbio.io.read(\"sequence.gbk\", \"genbank\"))\n\ngene_finder = pyrodigal.GeneFinder(meta=True)\nfor i, pred in enumerate(gene_finder.find_genes(seq.values.view('B'))):\n    print(f\"\u003e{record.id}_{i+1}\")\n    print(pred.translate())\n```\n\n*We need to use the [`view`](https://numpy.org/doc/stable/reference/generated/numpy.ndarray.view.html)\nmethod to get the sequence viewable by Cython as an array of `unsigned char`.*\n\n\n## 🔖 Citation\n\nPyrodigal is scientific software, with a\n[published paper](https://doi.org/10.21105/joss.04296)\nin the [Journal of Open-Source Software](https://joss.theoj.org/). Please\ncite both [Pyrodigal](https://doi.org/10.21105/joss.04296)\nand [Prodigal](https://doi.org/10.1186/1471-2105-11-119) if you are using it in\nan academic work, for instance as:\n\n\u003e Pyrodigal (Larralde, 2022), a Python library binding to Prodigal (Hyatt *et al.*, 2010).\n\nDetailed references are available on the [Publications page](https://pyrodigal.readthedocs.io/en/stable/guide/publications.html) of the\n[online documentation](https://pyrodigal.readthedocs.io/).\n\n## 💭 Feedback\n\n### ⚠️ Issue Tracker\n\nFound a bug ? Have an enhancement request ? Head over to the [GitHub issue\ntracker](https://github.com/althonos/pyrodigal/issues) if you need to report\nor ask something. If you are filing in on a bug, please include as much\ninformation as you can about the issue, and try to recreate the same bug\nin a simple, easily reproducible situation.\n\n### 🏗️ Contributing\n\nContributions are more than welcome! See\n[`CONTRIBUTING.md`](https://github.com/althonos/pyrodigal/blob/main/CONTRIBUTING.md)\nfor more details.\n\n## 📋 Changelog\n\nThis project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html)\nand provides a [changelog](https://github.com/althonos/pyrodigal/blob/main/CHANGELOG.md)\nin the [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) format.\n\n\n## ⚖️ License\n\nThis library is provided under the [GNU General Public License v3.0](https://choosealicense.com/licenses/gpl-3.0/).\nThe Prodigal code was written by [Doug Hyatt](https://github.com/hyattpd) and is distributed under the\nterms of the GPLv3 as well. See `vendor/Prodigal/LICENSE` for more information.\n\n*This project is in no way not affiliated, sponsored, or otherwise endorsed\nby the [original Prodigal authors](https://github.com/hyattpd). It was developed\nby [Martin Larralde](https://github.com/althonos/) during his PhD project\nat the [European Molecular Biology Laboratory](https://www.embl.de/) in\nthe [Zeller team](https://github.com/zellerlab).*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falthonos%2Fpyrodigal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falthonos%2Fpyrodigal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falthonos%2Fpyrodigal/lists"}