Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 6 additions & 10 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -224,8 +224,9 @@ The Python is tooling, not a shipped package, and it is not covered by CI:
what a change did to real output.
- `benchmarks/make_tutorial_dataset.py` generates the dataset used by the
tutorial and by the example report.
- `benchmarks/amap_performance_benchmark.py` profiles a run on a full local
dataset; `benchmarks/README.md` documents its invocation and its output.
- `benchmarks/performance_benchmark.py` times a run on a pangenome you have
(wall time, peak memory, disk); `benchmarks/README.md` documents its
invocation and its output.
- `benchmarks/recore_report.py` and `tools/make_logo_variants.py` generate
assets.

Expand Down Expand Up @@ -282,14 +283,9 @@ By contributing you agree that your contribution is licensed under the same
terms as the project, which are the ones in [LICENSE](../LICENSE) at the
repository root.

> [!WARNING]
> The repository currently disagrees with itself about which licence that is.
> `Cargo.toml`, the README and the documentation all say GNU General Public
> License v3.0 (`GPL-3.0-only`), while the committed `LICENSE` file contains the
> text of the GNU **Affero** General Public License v3. Those are different
> licences with different obligations for anyone running a modified copy over a
> network. This needs resolving by the maintainer, one way or the other, before
> the first outside contribution lands.
That licence is the GNU Affero General Public License v3.0 (`AGPL-3.0-only`).
`Cargo.toml`, `CITATION.cff`, the README and the website name it too, and
`tools/check_site.py` fails if one of them drifts from `LICENSE`.

Participation is covered by the [Code of Conduct](CODE_OF_CONDUCT.md).
Security issues do not go in the issue tracker: see [SECURITY.md](SECURITY.md).
Expand Down
6 changes: 1 addition & 5 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,6 @@ tutorial_out/
out_strict/
out_balanced/
out_sensitive/
benchmarks/amap_performance_metrics.tsv
benchmarks/performance_metrics.tsv


# Added by cargo

/target
.claude/
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,25 @@ and Recore uses semantic versioning.

### Changed

- Recore is licensed under the GNU Affero General Public License v3.0
(`AGPL-3.0-only`), the licence its `LICENSE` file holds; `Cargo.toml`, the
README and the website said GPL-3.0. A `CITATION.cff` names the authors for
GitHub's citation button. `tools/check_site.py` fails if `Cargo.toml`,
`CITATION.cff`, the README, the contributing guide or the website name a
licence other than the one in `LICENSE`.
- The example report says it is made from synthetic data: next to its own
title, where it shows in the website's frame, full screen and on a phone,
and next to every link to it on the website, in the README and in the
documentation. `tools/label_example_report.py` adds the note after the report
is regenerated, and `tools/check_site.py` fails on a report or a link without
it.
- `benchmarks/performance_benchmark.py` times Recore on any pangenome, given
the same inputs as Recore, with an optional tree to keep a subset of genomes
and a cluster limit for a quick run. It replaces a benchmark that only ran on
one local dataset. `benchmarks/self_benchmark.py` works in the system's
temporary directory instead of a macOS path.
- The Run report page no longer prints a leftover MkDocs button attribute as
text, and `tools/check_site.py` fails on MkDocs syntax left in the markdown.
- The documentation site is now a short website instead of fourteen MkDocs
pages: an install line, a command builder that writes the run for your
pangenome tool and the files you have, a one-minute example with the counts it
Expand Down
23 changes: 23 additions & 0 deletions CITATION.cff
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
cff-version: 1.2.0
message: "If you use this software, please cite it as below."
title: "Recore"
abstract: "Post-hoc rescue and quality control of pangenome presence/absence matrices."
type: software
authors:
- family-names: Ruiz-Rodriguez
given-names: Paula
orcid: "https://orcid.org/0000-0003-0727-5974"
affiliation: "I2SysBio, University of Valencia-CSIC, FISABIO Joint Research Unit Infection and Public Health, Valencia, Spain"
email: paula.ruiz.rodriguez@csic.es
- family-names: Coscolla
given-names: Mireia
orcid: "https://orcid.org/0000-0003-0752-0538"
affiliation: "I2SysBio, University of Valencia-CSIC, FISABIO Joint Research Unit Infection and Public Health, Valencia, Spain"
repository-code: "https://github.com/PathoGenOmics-Lab/recore"
url: "https://pathogenomics-lab.github.io/recore/"
license: AGPL-3.0-only
keywords:
- pangenome
- presence/absence matrix
- Panaroo
- bioinformatics
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ edition = "2021"
rust-version = "1.85"
authors = ["Paula Ruiz-Rodriguez <paula.ruiz.rodriguez@csic.es>", "Mireia Coscolla"]
description = "Post-hoc rescue of falsely absent genes in pangenome matrices"
license = "GPL-3.0-only"
license = "AGPL-3.0-only"
repository = "https://github.com/PathoGenOmics-Lab/recore"
keywords = ["pangenome", "panaroo", "core-genome", "rescue", "bioinformatics"]
categories = ["science", "command-line-utilities"]
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ puts back the genes that are really there, and keeps the evidence for each one.
<sub>For Panaroo, Roary, PPanGGOLiN, PanTA and PIRATE · pure Rust · Linux and macOS</sub>

<a href="https://github.com/PathoGenOmics-Lab/recore/actions/workflows/ci.yml"><img src="https://github.com/PathoGenOmics-Lab/recore/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-GPLv3-blue.svg" alt="License: GPLv3"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-AGPLv3-blue.svg" alt="License: AGPLv3"></a>
<img src="https://img.shields.io/badge/Rust-1.85%2B-orange.svg" alt="Rust 1.85+">

</div>
Expand Down Expand Up @@ -105,8 +105,8 @@ Four files answer most questions. [All of them](docs/guide/outputs.md).
| `orthology_evidence.tsv` | One row per change: the evidence, the decision, and wording you can use in a paper. |
| `recore_report.html` | The whole run in one page that works offline. Open it in any browser. |

[Explore a real report](https://pathogenomics-lab.github.io/recore/#report),
the one the example run writes.
[Explore an example report](https://pathogenomics-lab.github.io/recore/#report),
the one the example run writes from synthetic data.

## 5 · One setting that matters

Expand Down Expand Up @@ -146,7 +146,7 @@ here as well:
> Ruiz-Rodriguez P, Coscolla M. (2026). Recore: post-hoc rescue and quality
> control of pangenome presence/absence matrices. *In preparation.*

<sub>GPL-3.0, see [LICENSE](LICENSE) · [PathoGenOmics Lab](https://github.com/PathoGenOmics-Lab) · Paula Ruiz-Rodriguez, paula.ruiz.rodriguez@csic.es</sub>
<sub>AGPL-3.0, see [LICENSE](LICENSE) · [PathoGenOmics Lab](https://github.com/PathoGenOmics-Lab) · Paula Ruiz-Rodriguez, paula.ruiz.rodriguez@csic.es</sub>

---

Expand Down
49 changes: 22 additions & 27 deletions benchmarks/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -155,43 +155,38 @@ cross-references, a product and a long note), six names per CDS, which is what
an annotation index has to hold for most real assemblies; that run goes to
`benchmarks/search_scaling_rich_metrics.tsv`.

## AMAP performance benchmark
## Performance on your own pangenome

`amap_performance_benchmark.py` profiles Recore on the full local AMAP
pangenome. It is a resource benchmark, not a precision/recall truth set.
`performance_benchmark.py` times Recore on a pangenome you have: wall time,
peak memory of the whole process tree, temporary disk, output size, and the
rescue counts, appended to `benchmarks/performance_metrics.tsv`. It is a
resource benchmark, not a truth set.

The script:

- filters `AMAP-gene_presence_absence.csv` with the canonical 459-tip tree
- links FASTA and GFF inputs instead of copying them
- runs the release binary with the publication settings
- records wall time, peak RSS, temporary disk use, output size, rescues, and
corrected matrix entries

Run from the repository root:
Give it the same inputs as Recore. A Newick tree keeps only the genomes that are
its tips, and `--max-clusters` keeps the first clusters, to time a subset; both
need a Panaroo or Roary `gene_presence_absence.csv`. FASTA and GFF files are
linked, not copied. The `publication` profile adds `--synteny`,
`--multi-allele` and `--nscluster`; `rescue_only` searches without them.

```bash
python3 benchmarks/amap_performance_benchmark.py \
--threads 8 \
--profile publication \
--minimap2 /path/to/minimap2
python3 benchmarks/performance_benchmark.py \
-p gene_presence_absence.csv -r pan_genome_reference.fa \
-g genomes/ -a annotations/ --tree species.nwk --threads 8
```

For a quick smoke test:
For a quick smoke test on the tutorial dataset (below):

```bash
python3 benchmarks/amap_performance_benchmark.py \
--max-clusters 50 \
--threads 4 \
--profile rescue_only \
--minimap2 /path/to/minimap2 \
--metrics /tmp/recore_amap_smoke_metrics.tsv
python3 benchmarks/performance_benchmark.py \
-p tutorial_data/gene_presence_absence.csv \
-r tutorial_data/pan_genome_reference.fa \
-g tutorial_data/genomes --max-clusters 20 --profile rescue_only \
--threads 4 --metrics recore_smoke_metrics.tsv
```

The default AMAP output metrics file is
`benchmarks/amap_performance_metrics.tsv`. Because it records local hardware
and temporary paths, treat it as a local run log rather than a portable
benchmark table.
It builds `target/release/recore` first unless you pass `--recore` with a
binary or `--skip-build`. The metrics file records the machine and temporary
paths, so treat it as a local run log rather than a portable benchmark table.

## Tutorial dataset

Expand Down
Loading
Loading