diff --git a/.zenodo.json b/.zenodo.json new file mode 100644 index 0000000..aab3d70 --- /dev/null +++ b/.zenodo.json @@ -0,0 +1,30 @@ +{ + "title": "pyLocusZoom: Python library for multi-species GWAS visualization", + "description": "Publication-ready GWAS visualization in Python: regional association plots with LD coloring, gene tracks and recombination overlays, plus Manhattan, QQ, Miami, eQTL, fine-mapping, PheWAS, forest, LD heatmap and colocalization plots. Built-in canine and feline reference data, Ensembl gene annotation for any species, and matplotlib, plotly and bokeh backends.", + "upload_type": "software", + "license": "GPL-3.0-or-later", + "access_right": "open", + "creators": [ + { + "name": "Denyer, Michael" + } + ], + "keywords": [ + "gwas", + "genetics", + "visualization", + "locuszoom", + "regional-plot", + "linkage-disequilibrium", + "canine", + "feline" + ], + "related_identifiers": [ + { + "identifier": "https://pypi.org/project/pylocuszoom/", + "relation": "isSupplementTo", + "resource_type": "software", + "scheme": "url" + } + ] +} diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000..716e4fc --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,23 @@ +cff-version: 1.2.0 +message: "If you use pyLocusZoom in your research, please cite it using the metadata in this file." +type: software +title: "pyLocusZoom: Python library for multi-species GWAS visualization" +abstract: "Publication-ready GWAS visualization in Python: regional association plots with LD coloring, gene tracks and recombination overlays, plus Manhattan, QQ, Miami, eQTL, fine-mapping, PheWAS, forest, LD heatmap and colocalization plots. Built-in canine and feline reference data, Ensembl gene annotation for any species, and matplotlib, plotly and bokeh backends." +authors: + - family-names: Denyer + given-names: Michael + email: code.denyer@gmail.com +version: 3.1.0 +date-released: 2026-09-08 +license: GPL-3.0-or-later +repository-code: https://github.com/michael-denyer/pyLocusZoom +url: https://github.com/michael-denyer/pyLocusZoom +keywords: + - gwas + - genetics + - visualization + - locuszoom + - regional-plot + - linkage-disequilibrium + - canine + - feline diff --git a/README.md b/README.md index 838d384..c9b1ba5 100644 --- a/README.md +++ b/README.md @@ -825,6 +825,19 @@ Optional: - [Example Notebook](examples/getting_started.ipynb) - Interactive tutorial - [CHANGELOG](CHANGELOG.md) - Version history +## Citation + +If you use pyLocusZoom in your research, please cite it. GitHub's "Cite this repository" button reads [CITATION.cff](CITATION.cff), and each GitHub release is archived on Zenodo with its own DOI. + +```bibtex +@software{denyer_pylocuszoom, + author = {Denyer, Michael}, + title = {pyLocusZoom: Python library for multi-species GWAS visualization}, + url = {https://github.com/michael-denyer/pyLocusZoom}, + license = {GPL-3.0-or-later} +} +``` + ## License GPL-3.0-or-later diff --git a/docs/DEVELOPMENT.md b/docs/DEVELOPMENT.md index b7b18d1..64d5322 100644 --- a/docs/DEVELOPMENT.md +++ b/docs/DEVELOPMENT.md @@ -165,11 +165,13 @@ For a concrete example, see `prepare_manhattan_frames` in description covering *what* changed and *why*, and reference any related GitHub issues. Do not include AI-assistant attribution in commit messages or PR bodies. 9. Releases are cut from `main` by bumping `version` in `pyproject.toml`, running `uv lock`, - changing the `## [Unreleased]` CHANGELOG heading to `## [X.Y.Z] - YYYY-MM-DD`, committing - `pyproject.toml`, `uv.lock`, and `CHANGELOG.md` together, and creating a GitHub release + changing the `## [Unreleased]` CHANGELOG heading to `## [X.Y.Z] - YYYY-MM-DD`, setting + `version` and `date-released` in `CITATION.cff` to match, committing + `pyproject.toml`, `uv.lock`, `CHANGELOG.md`, and `CITATION.cff` together, and creating a GitHub release with tag `vX.Y.Z`. `.github/workflows/publish.yml` then publishes to PyPI via Trusted Publishing. BiocondaBot opens a follow-up PR against bioconda-recipes automatically once - the PyPI release is detected. + the PyPI release is detected. Zenodo archives the release and mints a version DOI from + `.zenodo.json`; the concept DOI in the README badge covers every version. Two things that catch people out: - `uv.lock` does not regenerate itself on a version bump. Skipping `uv lock` leaves a