The nine-species benchmark, version by version

Every public copy of the benchmark, compared spectrum by spectrum

The nine-species de novo sequencing benchmark exists in at least eleven public versions. Every spectrum followed from one to the next: splits, labels, precursors, peaks, and how much of one version’s test set another version trained on. Every number links to the code that computes it.

“Evaluated on nine-species” names at least eleven different sets of spectra. This page puts every public copy of the benchmark on one key, (species, raw file, scan), and follows each spectrum from one version to the next: whether it stays, which split it lands in, whether its label changes, and whether the spectrum itself does. It was computed on 2026-10-20 from the files as published that day.

Every number is a link. It leads to an entry in Reproducing every number at the end of the page, which names the public files it reads, the scripts that produce its input, and the code that counts it. The whole analysis reruns from those files with one script, run_all.sh. The catalog’s own record of the versions is the nine-species benchmark’s page.

Naming. Papers call DeepNovo’s 2017 release “9-species-V1” and the re-curated benchmark “9-species-V2”, usually without saying which file. Here v1 is the 2017 release and v2 main and v2 balanced are the two variants Wen & Noble published in 10.5281/zenodo.13685813. The three dated folders of MSV000090982 are earlier builds of v2, and none of them is v2 main.

Four things to know before quoting a nine-species number.

  1. MSV000090982 is not v2 main. It holds three builds, from 2022, 2023 and 2024, and even the 2024 build is 47,640 spectra away from v2 main.
  2. The InstaNovo split, which NovoBench trains on, overlaps the newer test sets. 17.0% of ProteoBench’s spectra, 21.8% of dIon’s test set and 21.8% of denovo_benchmarks’ nine-species sets are scans from its training split.
  3. One v2 spectrum in six has a precursor on an isotope peak (17.1% of v2 main). A model that enforces the precursor mass with no isotope allowance cannot get those right; on v1 and on the InstaNovo split that never happens.
  4. v1 writes every leucine as I (0 of its labels contain an L). Fold I and L before comparing labels across versions.

The versions

version where spectra made by
v1 MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf 1,528,127 PEAKS DB exports, one MGF per species (DeepNovo, 2017)
v1 folds MSV000081382, HighResolution/data/cross.9high_80k.exclude_<species>/ 9 × 554,738 to 598,010 about 80,000 spectra per species sampled once; each fold drops one species and splits the rest into train, valid and test
InstaNovo split InstaDeepAI/ms_ninespecies_benchmark, data/{train,validation,test}-*.parquet 639,286 v1’s yeast-excluded fold’s train (499,402) and valid (28,572), plus v1’s yeast file as test (111,312)
v2, MassIVE 2022 build MSV000090982, peak/ 2,812,194 the first revised search: Tide and Percolator over ThermoRawFileParser MGFs, no N-terminal modifications
v2, MassIVE 2023 build MSV000090982, updates/2023-03-08_woutb_2c43c18c/ 2,854,651 a re-search with four N-terminal modifications added
InstaNovo ninespecies_updated InstaDeepAI/ms_ninespecies_benchmark, data/ninespecies_updated/*.ipc 2,854,651 the MassIVE 2023 build: 2,854,651 records identical to it in species, scan, retention time, precursor, charge, label and peaks. The dataset card does not describe it
v2, MassIVE 2024 build MSV000090982, updates/2024-05-14_woutb_71950b89/ 2,844,905 the 2023 search with the peptides shared between species redrawn
v2 main 10.5281/zenodo.13685813, nine-species-main.zip 2,838,117 the published benchmark (Wen & Noble, 2024), the first build with no backbone in two species
v2 balanced 10.5281/zenodo.13685813, nine-species-balanced.zip 779,879 150 whole raw files of v2 main, chosen to even out the species
ProteoBench nine_species_balanced_De_Novo.mgf.gz 779,879 v2 balanced, record for record, with the species dropped and the scans renumbered
dIon alfred-n/dIon-datasets, representation_benchmarks/ninespecies/ 188,512 a subset of v2 main: test (182,393) and validation (6,119), up to about ten spectra per peptide
denovo_benchmarks MSV000096182, other/9_species_*_labels.csv, peak/mgf/ 946,155 101 raw files relabelled by the living benchmark’s own search

The same Zenodo record 10.5281/zenodo.13685813 also holds nine-species-intermediate.zip, the Tide and Percolator output (8,145,796 target PSMs over 8,054,115 scans), and nine-species-data.zip, the converted MGFs before any search (15,165,161 MS2 spectra from 356 raw files).

A backbone is the bare sequence with I and L folded together, the grain at which two labels can be the same peptide.

How the spectra flow between versions

Every spectrum that any version holds, counted once per column. The first column says where it started: in which split of the InstaNovo split (which is also NovoBench’s), elsewhere in v1, or not in v1 at all. The second says which revised version holds it, and the third where it sits inside v2 main. Each band keeps the colour of its starting point, so the training split can be followed into v2 balanced, which is ProteoBench.

Read from left to right: of the InstaNovo split’s 499,402 training spectra, almost half are in v2 main, and some of those land in v2 balanced and in dIon. Most of the rest went nowhere in v2 (the next section says why), and some only into denovo_benchmarks. The blue band, the spectra v1 never had, is most of v2. Hover a band for its count.

Where v1’s spectra went

49.9% of v1’s 1,528,127 labelled spectra are in v2 main. Each of the others was dropped at a step of the revised pipeline that can be named, by asking the revised search itself about that scan.

fate spectra
kept in v2 main 762,973
raw file not in the revised search (honeybee BM-2) 22,757
the revised search reported no target PSM for the scan 305,624
best PSM failed the 1% FDR, same peptide as v1 130,599
best PSM failed the 1% FDR, another peptide 239,294
passed, but the converted MGF gives no precursor charge 37,179
passed, but its peptide was found in several species and drawn for another 29,701

Every scan the revised search reported nothing for was converted and searched (278,175 with a precursor charge, 27,449 without); its best match was simply a decoy, or nothing at all. Of the spectra kept, 705,828 keep their backbone and modifications, 44,275 keep the backbone with different modifications, and 12,870 are relabelled as another peptide. Compared without folding I and L, 524,296 of them would look like label changes.

From raw files to v2 main, and a filter the paper does not mention

The converted MGFs in nine-species-data.zip let the whole pipeline be replayed in counts.

Not one spectrum in v2 main lacks a precursor charge (0), although 2,345,279 of the converted spectra do and the search ran on all of them: 62% of the human spectra, 56% of C. endoloripes’ and 15% of B. subtilis’. Percolator accepted 75,693 of them and every one was dropped. Wen & Noble do not describe this step. They report dropping “13 MGF files with fewer than 100 accepted PSMs”, and those are 13 B. subtilis files in which no spectrum has a charge at all (103 to 397 accepted PSMs each, and a DIA run with 1): they fall under 100 only once the charge-less ones are gone. 4 mouse files with almost nothing accepted leave 339 raw files in v2 main. Subtracting the charge-less spectra and those mouse files gives 2,898,614, the paper’s 2,898,611 within 3, and the shared-peptide draw then removes 60,497 more. denovo_benchmarks applies the same charge filter when it builds a dataset.

What changed in the spectra that stayed

v1 was exported by PEAKS in 2017 and v2 by ThermoRawFileParser in 2022, and the two disagree about the spectrum itself.

The precursor m/z. Among the 801,288 spectra v1 shares with the 2022 build, 102,812 have a neutral precursor mass 1 Da heavier in the revised version and 17,634 2 Da heavier. Every precursor in v1 sits on its label’s monoisotopic peak (0 on an isotope peak); ThermoRawFileParser writes the m/z the instrument selected, which is often an isotope peak. The revised search “allowed for 1 isotope error in the selection of candidate peptides” (Wen & Noble, Methods), and the released MGFs keep the instrument’s m/z.

Over v2 main it is 484,359 spectra, 17.1%, from 1.6% of V. mungo to 24.8% of yeast; in the builds 16.5% (2022), 17.1% (2023) and 17.1% (2024); in v2 balanced and ProteoBench 13.6%; in dIon 14.8%. The InstaNovo split has 0. These are isotope picks and not missed deamidations, which sit 0.019 Da away: the error assuming a carbon-13 offset has a median of 1.0 ppm against 11.0 ppm assuming deamidation, and 74,170 of the offset spectra have no N or Q to deamidate. Casanovo’s default allows an offset of 0 or 1; check what a given model does before comparing its numbers across the two.

The peaks. v1’s peak lists are sparser (median 142 peaks against 334) and reach fragment m/z values no fragment of the precursor can have (up to 47,568, against 5,496). For mouse, where both sides could be downloaded whole, 19,993 spectra were compared peak by peak: a median 97.6% of v1’s peaks are in the revised peak list within 10 ppm, carrying 97.0% of its intensity, and v1’s intensities are about 2.5 times the revised ones. v1 is the same scan after PEAKS’s own processing.

Everything else barely moves: 20 shared spectra change charge, the revised builds hold no charge-1 spectra (v1 has 0.24%) and no peptide shorter than 6 or longer than 50 residues.

The modification vocabulary. v1 and the 2022 build carry oxidation, N and Q deamidation and carbamidomethylation. From 2023 on, four N-terminal modifications appear: acetylation (+42.01), carbamylation (+43.01), ammonia loss (-17.03) and carbamylation with ammonia loss (+25.98), on 6.6% of v2 main’s spectra. A model trained on v1 or on the InstaNovo split has never seen one.

Between the builds of v2

out in label changed
MassIVE 2022 → 2023 199,297 241,754 41,389
MassIVE 2023 → 2024 28,674 18,928 0
MassIVE 2024 → v2 main 27,214 20,426 0

2022 to 2023 is a re-search. 83% of the spectra leaving, and 83% of those arriving, have a peptide the other build keeps in the same species: different scans of the same peptide passed the FDR. Of the relabelled spectra, 21,818 gain, lose or move an N or Q deamidation, 1,226 gain an N-terminal modification, 10,775 move an I/L or a modification, and 7,570 change peptide.

After 2023 every change is the shared-peptide draw. Wen & Noble give each peptide found in more than one species to one species at random and drop its spectra from the others. Re-running that draw moves whole peptides between species files: 28,673 of the 28,674 spectra leaving between 2023 and 2024, and 20,426 of the 20,426 arriving between 2024 and v2 main, carry a peptide found in more than one species. Backbones present in more than one species file: 855 in 2022, 1,458 in 2023, 353 in 2024, and 0 in v2 main. The benchmark repository cannot regenerate any of them exactly: its seed is fixed, but the species and file order it draws over come from the filesystem.

denovo_benchmarks’ nine species

The living benchmark’s datasets file calls its nine-species sets “De novo nine-species benchmark (MSV000090982)”. They are not. Its own deposit, MSV000096182, holds 101 raw files relabelled by its own search: 946,155 labels, keyed as <raw file>_<chunk>:<index> into MGF chunks of at most 20,000 charged spectra.

  • A different subset of files. Mouse takes all 13 raw files, including the ones v2 main drops; B. subtilis takes 4 of 106 and yeast 3 of 27; and honeybee includes BM-2, the file the revised search never had.
  • Different labels. Of the 477,999 spectra it shares with v2 main, 87.9% carry the same label; 467,142 are not in v2 main at all. 188,089 labels carry a modification the revised search did not allow: N-terminal, D, E and H carbamidomethylation, sodium on D and E, lysine and arginine methylation, and +12 and +26 N-terminal adducts.
  • A deamidation where the others see an isotope peak. On 44,464 spectra that v2 main labels at the M+1 peak, denovo_benchmarks writes the same backbone with one more deamidation in 39,011 cases. The carbon-13 reading fits better for 37,982 of them (median error 0.9 ppm against 12.1 ppm), so these labels most likely carry a deamidation that is not there.
  • A deposit that does not match its labels in two files. 1,014 labels point past the end of their MGF chunk (BC-2_1 holds 18,996 spectra and is cited up to index 19,999), so those chunks are not the files the labels were made from.

Splits, and what a model has already seen

v1’s folds are disjoint on the modified peptide, not on the backbone. No validation or test label of a fold is a training label of that fold, but 28% to 36% of every fold’s validation and test spectra carry a backbone it trains on, in another modification state. Across species, the held-out species’ spectra whose backbone the fold trained on run from 0.4% (M. mazei) to 22.6% (V. mungo). v2 was built to remove that, and did: 0 backbones of v2 main are in two species.

The InstaNovo split is v1’s yeast fold, the same training spectra NovoBench retrains on, in v1’s own order: row by row, 639,286 of its 639,286 records have the precursor and peak count of the v1 record in the same position of the yeast-excluded fold’s train and valid files, and, for its test set, of v1’s whole yeast file. Training on it and testing on another version outside yeast tests partly on training data, because the spectra are the same physical scans, re-labelled.

ProteoBench’s yeast and B. subtilis spectra are untouched, but 71% of its mouse spectra and 50% of its human ones are scans a NovoBench-style model was trained on. A number such a model scores on ProteoBench, on v2 main beyond the yeast file (8.2% training scans, 59.9% known backbones), on dIon or on denovo_benchmarks is partly a training score.

What to write when reporting a number

  • Name the build, not the accession. “9-species-V2” is three builds under one MassIVE accession plus v2 main and v2 balanced on Zenodo; InstaNovo’s ninespecies_updated is the 2023 build; denovo_benchmarks is a selection of its own.
  • Do not train on the InstaNovo or NovoBench split and test on a newer version outside yeast. Up to 21.8% of the test spectra are training scans, and about 64.2% carry a backbone the model trained on.
  • Allow a one-dalton precursor offset, or score the v2 spectra whose precursor is an isotope peak separately.
  • Fold I and L before comparing labels across versions.

Reproducing this page

Everything above was computed from the public files the versions table links, by the scripts in analysis/nine_species/. To rerun it:

git clone https://github.com/BioGeek/awesome_de_novo_peptide_sequencing
mkdir -p ~/data/ninespecies
cp -r awesome_de_novo_peptide_sequencing/analysis/nine_species ~/data/ninespecies/scripts
sh ~/data/ninespecies/scripts/run_all.sh                       # about 110 GB, 30 GB of RAM, a day
~/data/ninespecies/.venv/bin/python ~/data/ninespecies/scripts/page_numbers.py --check

run_all.sh lists the steps in order: list the three MassIVE deposits, fetch the HTTP sources (sources.py names every one), extract one table per source file, key every version on (species, raw file, scan), run the comparisons, and finally page_numbers.py, which computes every number on this page. Its --check compares the result with the committed page_numbers.json, which is what this page prints. The charts read site_data.json, written by export_site_data.py in the same run.

Reproducing every number

Every number above, in the order it first appears: what it counts, the public files it comes from, the scripts that produce its input (in run_all.sh’s order), and the code in page_numbers.py that computes it. page_numbers.py --only <id> recomputes one.

47,640 (Spectra in exactly one of MassIVE 2024 and v2 main). Reads MSV000090982, updates/2024-05-14_woutb_71950b89/, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_swing.py. Recompute: page_numbers.py --only r2024_main_diff.

Code
@number("r2024_main_diff", "Spectra in exactly one of MassIVE 2024 and v2 main", ["massive_2024", "v2_main"], ["a_swing.py"])
def _():
    return REG["r2024_main_out"]["f"]() + REG["r2024_main_in"]["f"]()

17.0% (Zenodo balanced = ProteoBench: share of spectra that are InstaNovo/NovoBench training scans). Reads Hugging Face InstaDeepAI/ms_ninespecies_benchmark, data/{train,validation,test}-*.parquet. Input from a_leak.py. Recompute: page_numbers.py --only leak_pb_pct.

Code
def _f(e=_e):
    return float(row(csv("leak__cross_version"), "same spectrum %", **{"evaluate on": e}))
# called with e='Zenodo balanced = ProteoBench'

21.8% (dIon test: share of spectra that are InstaNovo/NovoBench training scans). Reads Hugging Face InstaDeepAI/ms_ninespecies_benchmark, data/{train,validation,test}-*.parquet. Input from a_leak.py. Recompute: page_numbers.py --only leak_dion_pct.

Code
def _f(e=_e):
    return float(row(csv("leak__cross_version"), "same spectrum %", **{"evaluate on": e}))
# called with e='dIon test'

21.8% (denovo_benchmarks selection: share of spectra that are InstaNovo/NovoBench training scans). Reads Hugging Face InstaDeepAI/ms_ninespecies_benchmark, data/{train,validation,test}-*.parquet. Input from a_leak.py. Recompute: page_numbers.py --only leak_dnb_pct.

Code
def _f(e=_e):
    return float(row(csv("leak__cross_version"), "same spectrum %", **{"evaluate on": e}))
# called with e='denovo_benchmarks selection'

17.1% (Zenodo main: that, as a share). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_isotope.py. Recompute: page_numbers.py --only iso_main_pct.

Code
def _p(v=_v):
    return float(_iso(v)["non-monoisotopic %"][0])
# called with v='Zenodo main'

0 (v1 labels containing an L (it writes every leucine as I)). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf. Input from make_jobs.py, extract.py. Recompute: page_numbers.py --only v1_labels_with_l.

Code
@number("v1_labels_with_l", "v1 labels containing an L (it writes every leucine as I)", ["v1"], ["make_jobs.py", "extract.py"])
def _():
    return int(table("v1")["seq_raw"].str.contains("L").sum())

1,528,127 (Labelled spectra in v1’s nine species files). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf. Input from make_jobs.py, extract.py. Recompute: page_numbers.py --only v1_psms.

Code
@number("v1_psms", "Labelled spectra in v1's nine species files", ["v1"], ["make_jobs.py", "extract.py"])
def _():
    return table("v1", ("species",)).height

554,738 (Spectra in the smallest of v1’s nine folds (train + valid + test)). Reads MSV000081382, HighResolution/data/cross.9high_80k.exclude_<species>/. Input from make_jobs.py, extract.py. Recompute: page_numbers.py --only v1_fold_min.

Code
@number("v1_fold_min", "Spectra in the smallest of v1's nine folds (train + valid + test)", ["v1_folds"], ["make_jobs.py", "extract.py"])
def _():
    f = original("orig_fold", ["fold", "split"]).filter(pl.col("split").is_in(["train", "valid", "test"])).collect()
    return int(f.group_by("fold").len()["len"].min())

598,010 (Spectra in the largest of v1’s nine folds). Reads MSV000081382, HighResolution/data/cross.9high_80k.exclude_<species>/. Input from make_jobs.py, extract.py. Recompute: page_numbers.py --only v1_fold_max.

Code
@number("v1_fold_max", "Spectra in the largest of v1's nine folds", ["v1_folds"], ["make_jobs.py", "extract.py"])
def _():
    f = original("orig_fold", ["fold", "split"]).filter(pl.col("split").is_in(["train", "valid", "test"])).collect()
    return int(f.group_by("fold").len()["len"].max())

639,286 (InstaNovo split, all three splits). Reads Hugging Face InstaDeepAI/ms_ninespecies_benchmark, data/{train,validation,test}-*.parquet. Input from extract_tabular.py. Recompute: page_numbers.py --only instanovo_all.

Code
@number("instanovo_all", "InstaNovo split, all three splits", ["instanovo_split"], ["extract_tabular.py"])
def _():
    return release("instanovo_split", ["split"]).collect().height

499,402 (InstaNovo split, train). Reads Hugging Face InstaDeepAI/ms_ninespecies_benchmark, data/{train,validation,test}-*.parquet. Input from extract_tabular.py. Recompute: page_numbers.py --only instanovo_train.

Code
def _f(s=_split):
    return release("instanovo_split", ["split"]).filter(pl.col("split") == s).collect().height
# called with s='train'

28,572 (InstaNovo split, valid). Reads Hugging Face InstaDeepAI/ms_ninespecies_benchmark, data/{train,validation,test}-*.parquet. Input from extract_tabular.py. Recompute: page_numbers.py --only instanovo_valid.

Code
def _f(s=_split):
    return release("instanovo_split", ["split"]).filter(pl.col("split") == s).collect().height
# called with s='valid'

111,312 (InstaNovo split, test). Reads Hugging Face InstaDeepAI/ms_ninespecies_benchmark, data/{train,validation,test}-*.parquet. Input from extract_tabular.py. Recompute: page_numbers.py --only instanovo_test.

Code
def _f(s=_split):
    return release("instanovo_split", ["split"]).filter(pl.col("split") == s).collect().height
# called with s='test'

2,812,194 (Spectra in r2022). Reads MSV000090982, peak/. Input from make_jobs.py, extract.py. Recompute: page_numbers.py --only n_r2022.

Code
def _f(b=_b):
    return release(b, ["species"]).collect().height
# called with b='r2022'

2,854,651 (Spectra in r2023). Reads MSV000090982, updates/2023-03-08_woutb_2c43c18c/. Input from make_jobs.py, extract.py. Recompute: page_numbers.py --only n_r2023.

Code
def _f(b=_b):
    return release(b, ["species"]).collect().height
# called with b='r2023'

2,854,651 (Spectra in instanovo_ipc). Reads Hugging Face InstaDeepAI/ms_ninespecies_benchmark, data/ninespecies_updated/*.ipc. Input from extract_tabular.py, extract.py. Recompute: page_numbers.py --only n_instanovo_ipc.

Code
def _f(b=_b):
    return release(b, ["species"]).collect().height
# called with b='instanovo_ipc'

2,854,651 (InstaNovo’s ninespecies_updated records identical to a MassIVE 2023 record (same species, scan, retention time, precursor, charge, label, peak count and top-10 peaks)). Reads Hugging Face InstaDeepAI/ms_ninespecies_benchmark, data/ninespecies_updated/*.ipc, MSV000090982, updates/2023-03-08_woutb_2c43c18c/. Input from extract_tabular.py, make_jobs.py. Recompute: page_numbers.py --only ipc_is_2023.

Code
@number("ipc_is_2023", "InstaNovo's ninespecies_updated records identical to a MassIVE 2023 record "
        "(same species, scan, retention time, precursor, charge, label, peak count and top-10 peaks)",
        ["instanovo_ipc", "massive_2023"], ["extract_tabular.py", "make_jobs.py"])
def _():
    c = ["species", "scan", "pepmass", "rt", "charge", "seq_raw", "n_peaks", "top10_mz"]
    k = ["species", "scan", "rt3", "mz4"]
    a = release("instanovo_ipc", c).collect().pipe(renorm)
    b = release("r2023", c).collect().pipe(renorm)
    a, b = [x.with_columns(pl.col("rt").round(3).alias("rt3"), pl.col("pepmass").round(4).alias("mz4")) for x in (a, b)]
    j = a.join(b.select(k + ["seq_norm", "charge", "n_peaks", "top10_mz"]), on=k, suffix="_b")
    same = ((j["seq_norm"] == j["seq_norm_b"]) & (j["charge"] == j["charge_b"]) & (j["n_peaks"] == j["n_peaks_b"])
            & j.select(pl.col("top10_mz").list.sort() == pl.col("top10_mz_b").list.sort()).to_series())
    return int(same.sum())

2,844,905 (Spectra in r2024). Reads MSV000090982, updates/2024-05-14_woutb_71950b89/. Input from make_jobs.py, extract.py. Recompute: page_numbers.py --only n_r2024.

Code
def _f(b=_b):
    return release(b, ["species"]).collect().height
# called with b='r2024'

2,838,117 (Spectra in zenodo_main). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from make_jobs_zip.py, extract.py. Recompute: page_numbers.py --only n_zenodo_main.

Code
def _f(b=_b):
    return release(b, ["species"]).collect().height
# called with b='zenodo_main'

779,879 (Spectra in zenodo_balanced). Reads 10.5281/zenodo.13685813, nine-species-balanced.zip. Input from make_jobs_zip.py, extract.py. Recompute: page_numbers.py --only n_zenodo_balanced.

Code
def _f(b=_b):
    return release(b, ["species"]).collect().height
# called with b='zenodo_balanced'

150 (Raw files in v2 balanced). Reads 10.5281/zenodo.13685813, nine-species-balanced.zip. Input from a_flow.py. Recompute: page_numbers.py --only balanced_files.

Code
@number("balanced_files", "Raw files in v2 balanced", ["v2_balanced"], ["a_flow.py"])
def _():
    return registry().filter(pl.col("lab_zenodo_balanced").is_not_null()).select("species", "raw_file").n_unique()

779,879 (Spectra in proteobench). Reads ProteoBench, nine_species_balanced_De_Novo.mgf.gz. Input from make_jobs_zip.py, extract.py. Recompute: page_numbers.py --only n_proteobench.

Code
def _f(b=_b):
    return release(b, ["species"]).collect().height
# called with b='proteobench'

188,512 (dIon representation benchmark, both splits). Reads Hugging Face alfred-n/dIon-datasets, representation_benchmarks/ninespecies/. Input from extract_tabular.py. Recompute: page_numbers.py --only dion_all.

Code
@number("dion_all", "dIon representation benchmark, both splits", ["dion"], ["extract_tabular.py"])
def _():
    return release("dion", ["split"]).collect().height

182,393 (dIon representation benchmark, test). Reads Hugging Face alfred-n/dIon-datasets, representation_benchmarks/ninespecies/. Input from extract_tabular.py. Recompute: page_numbers.py --only dion_test.

Code
def _f(s=_s):
    return release("dion", ["split"]).filter(pl.col("split") == s).collect().height
# called with s='test'

6,119 (dIon representation benchmark, valid). Reads Hugging Face alfred-n/dIon-datasets, representation_benchmarks/ninespecies/. Input from extract_tabular.py. Recompute: page_numbers.py --only dion_valid.

Code
def _f(s=_s):
    return release("dion", ["split"]).filter(pl.col("split") == s).collect().height
# called with s='valid'

946,155 (Labels in denovo_benchmarks’ nine 9_species_*_labels.csv files). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf. Input from download_sources.py. Recompute: page_numbers.py --only dnb_labels.

Code
@number("dnb_labels", "Labels in denovo_benchmarks' nine 9_species_*_labels.csv files", ["dnb"], ["download_sources.py"])
def _():
    return sum(pl.read_csv(f).height for f in glob.glob(f"{T}/../raw/dnb_labels/9_species_*_labels.csv"))

101 (Raw files denovo_benchmarks’ nine-species labels cite). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf. Input from download_sources.py. Recompute: page_numbers.py --only dnb_raw_files.

Code
@number("dnb_raw_files", "Raw files denovo_benchmarks' nine-species labels cite", ["dnb"], ["download_sources.py"])
def _():
    ids = pl.concat([pl.read_csv(f) for f in glob.glob(f"{T}/../raw/dnb_labels/9_species_*_labels.csv")])["spectrum_id"]
    return ids.str.extract(r"^(.*)_\d+:\d+$", 1).n_unique()

8,145,796 (Target PSMs in v2’s Percolator output). Reads 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output). Input from extract_tabular.py, percolator_keyed.py. Recompute: page_numbers.py --only perc_target_psms.

Code
@number("perc_target_psms", "Target PSMs in v2's Percolator output", ["v2_intermediate"], ["extract_tabular.py", "percolator_keyed.py"])
def _():
    return pl.read_parquet(f"{OUT}/percolator_keyed.parquet", columns=["scan"]).height

8,054,115 (Converted scans whose best Percolator match is a target). Reads 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs), 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output). Input from datazip.py, a_converted.py. Recompute: page_numbers.py --only perc_target_scans.

Code
@number("perc_target_scans", "Converted scans whose best Percolator match is a target", ["v2_data", "v2_intermediate"],
        ["datazip.py", "a_converted.py"])
def _():
    return int(row(csv("converted__summary"), "target PSM", species="ALL"))

15,165,161 (MS2 spectra in v2’s converted MGFs (nine-species-data.zip)). Reads 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from datazip.py, a_converted.py. Recompute: page_numbers.py --only converted.

Code
@number("converted", "MS2 spectra in v2's converted MGFs (nine-species-data.zip)", ["v2_data"], ["datazip.py", "a_converted.py"])
def _():
    return int(row(csv("converted__summary"), "converted MS2", species="ALL"))

356 (Raw files in v2’s conversion). Reads 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from datazip.py. Recompute: page_numbers.py --only raw_files_converted.

Code
@number("raw_files_converted", "Raw files in v2's conversion", ["v2_data"], ["datazip.py"])
def _():
    return len(glob.glob(f"{T}/datazip__*.parquet"))

49.9% (Share of v1’s spectra in v2 main). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_flow.py, a_fate.py. Recompute: page_numbers.py --only fate_kept_pct.

Code
@number("fate_kept_pct", "Share of v1's spectra in v2 main", ["v1", "v2_main"], ["a_flow.py", "a_fate.py"], fmt=".1f", suffix="%")
def _():
    f = csv("fate__orig_to_main")
    return 100 * f.filter(pl.col("fate").str.starts_with("0 "))["spectra"][0] / f["spectra"].sum()

762,973 (v1 spectra whose fate in v2 main is step 0 (see the table)). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, 10.5281/zenodo.13685813, nine-species-main.zip, 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output), 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from a_flow.py, a_fate.py. Recompute: page_numbers.py --only fate_kept.

Code
def _f(p=_p):
    f = csv("fate__orig_to_main")
    return int(f.filter(pl.col("fate").str.starts_with(p + " "))["spectra"][0])
# called with p='0'

22,757 (v1 spectra whose fate in v2 main is step 1 (see the table)). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, 10.5281/zenodo.13685813, nine-species-main.zip, 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output), 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from a_flow.py, a_fate.py. Recompute: page_numbers.py --only fate_raw_missing.

Code
def _f(p=_p):
    f = csv("fate__orig_to_main")
    return int(f.filter(pl.col("fate").str.starts_with(p + " "))["spectra"][0])
# called with p='1'

305,624 (v1 spectra whose fate in v2 main is step 2 (see the table)). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, 10.5281/zenodo.13685813, nine-species-main.zip, 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output), 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from a_flow.py, a_fate.py. Recompute: page_numbers.py --only fate_no_psm.

Code
def _f(p=_p):
    f = csv("fate__orig_to_main")
    return int(f.filter(pl.col("fate").str.starts_with(p + " "))["spectra"][0])
# called with p='2'

130,599 (v1 spectra whose fate in v2 main is step 3a (see the table)). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, 10.5281/zenodo.13685813, nine-species-main.zip, 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output), 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from a_flow.py, a_fate.py. Recompute: page_numbers.py --only fate_fdr_same.

Code
def _f(p=_p):
    f = csv("fate__orig_to_main")
    return int(f.filter(pl.col("fate").str.starts_with(p + " "))["spectra"][0])
# called with p='3a'

239,294 (v1 spectra whose fate in v2 main is step 3b (see the table)). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, 10.5281/zenodo.13685813, nine-species-main.zip, 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output), 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from a_flow.py, a_fate.py. Recompute: page_numbers.py --only fate_fdr_other.

Code
def _f(p=_p):
    f = csv("fate__orig_to_main")
    return int(f.filter(pl.col("fate").str.starts_with(p + " "))["spectra"][0])
# called with p='3b'

37,179 (v1 spectra whose fate in v2 main is step 4a (see the table)). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, 10.5281/zenodo.13685813, nine-species-main.zip, 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output), 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from a_flow.py, a_fate.py. Recompute: page_numbers.py --only fate_nocharge.

Code
def _f(p=_p):
    f = csv("fate__orig_to_main")
    return int(f.filter(pl.col("fate").str.starts_with(p + " "))["spectra"][0])
# called with p='4a'

29,701 (v1 spectra whose fate in v2 main is step 4c (see the table)). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, 10.5281/zenodo.13685813, nine-species-main.zip, 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output), 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from a_flow.py, a_fate.py. Recompute: page_numbers.py --only fate_shared.

Code
def _f(p=_p):
    f = csv("fate__orig_to_main")
    return int(f.filter(pl.col("fate").str.starts_with(p + " "))["spectra"][0])
# called with p='4c'

278,175 (v1 spectra with no target PSM, converted with charge). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs), 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output). Input from a_fate.py, a_converted.py. Recompute: page_numbers.py --only nopsm_with_charge.

Code
def _f(c=_col):
    f = csv("converted__orig_fate")
    return int(f.filter(pl.col("fate").str.starts_with("2 "))[c][0])
# called with c='converted with charge'

27,449 (v1 spectra with no target PSM, converted without charge). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs), 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output). Input from a_fate.py, a_converted.py. Recompute: page_numbers.py --only nopsm_without_charge.

Code
def _f(c=_col):
    f = csv("converted__orig_fate")
    return int(f.filter(pl.col("fate").str.starts_with("2 "))[c][0])
# called with c='converted without charge'

705,828 (v1 spectra in v2 main with the same backbone and modifications (I=L)). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_flow.py. Recompute: page_numbers.py --only kept_same.

Code
@number("kept_same", "v1 spectra in v2 main with the same backbone and modifications (I=L)", ["v1", "v2_main"], ["a_flow.py"])
def _():
    f = csv("flow__labels_orig_vs_zenodo_main")
    return int(f["identical"].sum() + f["I/L only"].sum())

44,275 (v1 spectra in v2 main with the same backbone, other modifications). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_flow.py. Recompute: page_numbers.py --only kept_mods.

Code
@number("kept_mods", "v1 spectra in v2 main with the same backbone, other modifications", ["v1", "v2_main"], ["a_flow.py"])
def _():
    return int(csv("flow__labels_orig_vs_zenodo_main")["modifications differ"].sum())

12,870 (v1 spectra in v2 main labelled as another peptide). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_flow.py. Recompute: page_numbers.py --only kept_diff.

Code
@number("kept_diff", "v1 spectra in v2 main labelled as another peptide", ["v1", "v2_main"], ["a_flow.py"])
def _():
    return int(csv("flow__labels_orig_vs_zenodo_main")["different peptide"].sum())

524,296 (Spectra v1 and v2 main share whose labels differ only by I/L). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_flow.py. Recompute: page_numbers.py --only orig_label_il_only.

Code
@number("orig_label_il_only", "Spectra v1 and v2 main share whose labels differ only by I/L", ["v1", "v2_main"], ["a_flow.py"])
def _():
    return int(csv("flow__labels_orig_vs_zenodo_main")["I/L only"].sum())

0 (Charge-less spectra in v2 main). Reads 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs), 10.5281/zenodo.13685813, nine-species-main.zip. Input from datazip.py, a_converted.py. Recompute: page_numbers.py --only nocharge_in_main.

Code
@number("nocharge_in_main", "Charge-less spectra in v2 main", ["v2_data", "v2_main"], ["datazip.py", "a_converted.py"])
def _():
    return int(row(csv("converted__summary"), "in main, no charge", species="ALL"))

2,345,279 (Converted spectra whose MGF gives no precursor charge). Reads 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from datazip.py, a_converted.py. Recompute: page_numbers.py --only nocharge_total.

Code
@number("nocharge_total", "Converted spectra whose MGF gives no precursor charge", ["v2_data"], ["datazip.py", "a_converted.py"])
def _():
    return int(row(csv("converted__summary"), "no charge", species="ALL"))

62% (Share of H.-sapiens’s converted spectra with no precursor charge). Reads 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from datazip.py, a_converted.py. Recompute: page_numbers.py --only nocharge_human_pct.

Code
def _f(sp=_sp):
    r = csv("converted__summary").filter(pl.col("species") == sp)
    return 100 * r["no charge"][0] / r["converted MS2"][0]
# called with sp='H.-sapiens'

56% (Share of Candidatus-endoloripes’s converted spectra with no precursor charge). Reads 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from datazip.py, a_converted.py. Recompute: page_numbers.py --only nocharge_cendo_pct.

Code
def _f(sp=_sp):
    r = csv("converted__summary").filter(pl.col("species") == sp)
    return 100 * r["no charge"][0] / r["converted MS2"][0]
# called with sp='Candidatus-endoloripes'

15% (Share of Bacillus-subtilis’s converted spectra with no precursor charge). Reads 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from datazip.py, a_converted.py. Recompute: page_numbers.py --only nocharge_bsub_pct.

Code
def _f(sp=_sp):
    r = csv("converted__summary").filter(pl.col("species") == sp)
    return 100 * r["no charge"][0] / r["converted MS2"][0]
# called with sp='Bacillus-subtilis'

75,693 (Charge-less spectra Percolator accepted at q < 0.01). Reads 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs), 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output). Input from datazip.py, a_converted.py. Recompute: page_numbers.py --only nocharge_passing.

Code
@number("nocharge_passing", "Charge-less spectra Percolator accepted at q < 0.01", ["v2_data", "v2_intermediate"],
        ["datazip.py", "a_converted.py"])
def _():
    return int(row(csv("converted__summary"), "q<0.01, no charge", species="ALL"))

13 (B. subtilis MGFs with nothing in main, every spectrum charge-less). Reads 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from a_converted.py. Recompute: page_numbers.py --only bsub_chargeless_files.

Code
@number("bsub_chargeless_files", "B. subtilis MGFs with nothing in main, every spectrum charge-less", ["v2_data"], ["a_converted.py"])
def _():
    return _dropped_files().filter(pl.col("species") == "Bacillus-subtilis").height

103 (Fewest q < 0.01 PSMs in one of those files, the DIA run aside). Reads 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs), 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output). Input from a_converted.py. Recompute: page_numbers.py --only bsub_file_psm_min.

Code
@number("bsub_file_psm_min", "Fewest q < 0.01 PSMs in one of those files, the DIA run aside", ["v2_data", "v2_intermediate"], ["a_converted.py"])
def _():
    d = _dropped_files().filter((pl.col("species") == "Bacillus-subtilis") & ~pl.col("raw_file").str.contains("DIA"))
    return int(d["q<0.01"].min())

397 (Most q < 0.01 PSMs in one of those files). Reads 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs), 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output). Input from a_converted.py. Recompute: page_numbers.py --only bsub_file_psm_max.

Code
@number("bsub_file_psm_max", "Most q < 0.01 PSMs in one of those files", ["v2_data", "v2_intermediate"], ["a_converted.py"])
def _():
    return int(_dropped_files().filter(pl.col("species") == "Bacillus-subtilis")["q<0.01"].max())

4 (Mouse MGFs with nothing in main). Reads 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from a_converted.py. Recompute: page_numbers.py --only mouse_dropped_files.

Code
@number("mouse_dropped_files", "Mouse MGFs with nothing in main", ["v2_data"], ["a_converted.py"])
def _():
    return _dropped_files().filter(pl.col("species") == "Mus-musculus").height

339 (Raw files with a spectrum in v2 main). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_flow.py. Recompute: page_numbers.py --only raw_files_main.

Code
@number("raw_files_main", "Raw files with a spectrum in v2 main", ["v2_main"], ["a_flow.py"])
def _():
    return registry().filter(pl.col("lab_zenodo_main").is_not_null()).select("species", "raw_file").n_unique()

2,898,614 (q < 0.01 scans less the charge-less ones and the four mouse files). Reads 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs), 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output). Input from a_converted.py. Recompute: page_numbers.py --only after_filters.

Code
@number("after_filters", "q < 0.01 scans less the charge-less ones and the four mouse files", ["v2_data", "v2_intermediate"], ["a_converted.py"])
def _():
    s = csv("converted__summary").filter(pl.col("species") == "ALL")
    mouse = _dropped_files().filter(pl.col("species") == "Mus-musculus")["q<0.01"].sum()
    return int(s["q<0.01"][0] - s["q<0.01, no charge"][0] - mouse)

60,497 (Spectra the shared-peptide draw removes on the way to v2 main). Reads 10.5281/zenodo.13685813, nine-species-main.zip, 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from a_converted.py. Recompute: page_numbers.py --only shared_draw_removed.

Code
@number("shared_draw_removed", "Spectra the shared-peptide draw removes on the way to v2 main", ["v2_main", "v2_data"], ["a_converted.py"])
def _():
    return REG["after_filters"]["f"]() - release("zenodo_main", ["species"]).collect().height

801,288 (Spectra v1 shares with MassIVE 2022). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, MSV000090982, peak/. Input from make_jobs.py, extract.py. Recompute: page_numbers.py --only v1_2022_shared.

Code
@number("v1_2022_shared", "Spectra v1 shares with MassIVE 2022", ["v1", "massive_2022"], ["make_jobs.py", "extract.py"])
def _():
    return _v1_vs_2022().height

102,812 (Spectra v1 shares with MassIVE 2022 whose 2022 neutral precursor mass is 1 Da heavier). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, MSV000090982, peak/. Input from make_jobs.py. Recompute: page_numbers.py --only v1_2022_plus1.

Code
@number("v1_2022_plus1", "Spectra v1 shares with MassIVE 2022 whose 2022 neutral precursor mass is 1 Da heavier", ["v1", "massive_2022"], ["make_jobs.py"])
def _():
    return int((_v1_vs_2022()["dn"] == 1).sum())

17,634 (Spectra v1 shares with MassIVE 2022 whose 2022 neutral precursor mass is 2 Da heavier). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, MSV000090982, peak/. Input from make_jobs.py. Recompute: page_numbers.py --only v1_2022_plus2.

Code
@number("v1_2022_plus2", "Spectra v1 shares with MassIVE 2022 whose 2022 neutral precursor mass is 2 Da heavier", ["v1", "massive_2022"], ["make_jobs.py"])
def _():
    return int((_v1_vs_2022()["dn"] == 2).sum())

0 (original (species files): spectra whose precursor is the label’s M+1 peak). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_isotope.py. Recompute: page_numbers.py --only iso_v1.

Code
def _f(v=_v):
    return int(_iso(v)["offset +1"][0])
# called with v='original (species files)'

484,359 (Zenodo main: spectra whose precursor is the label’s M+1 peak). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_isotope.py. Recompute: page_numbers.py --only iso_main.

Code
def _f(v=_v):
    return int(_iso(v)["offset +1"][0])
# called with v='Zenodo main'

1.6% (v2 main, Vigna-mungo: share of precursors on the M+1 peak). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_isotope.py. Recompute: page_numbers.py --only iso_vmungo_pct.

Code
def _f(sp=_sp):
    return float(row(csv("isotope__non_mono_by_species"), "Zenodo main", species=sp))
# called with sp='Vigna-mungo'

24.8% (v2 main, Saccharomyces-cerevisiae: share of precursors on the M+1 peak). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_isotope.py. Recompute: page_numbers.py --only iso_yeast_pct.

Code
def _f(sp=_sp):
    return float(row(csv("isotope__non_mono_by_species"), "Zenodo main", species=sp))
# called with sp='Saccharomyces-cerevisiae'

16.5% (MassIVE r2022: that, as a share). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_isotope.py. Recompute: page_numbers.py --only iso_2022_pct.

Code
def _p(v=_v):
    return float(_iso(v)["non-monoisotopic %"][0])
# called with v='MassIVE r2022'

17.1% (MassIVE r2023: that, as a share). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_isotope.py. Recompute: page_numbers.py --only iso_2023_pct.

Code
def _p(v=_v):
    return float(_iso(v)["non-monoisotopic %"][0])
# called with v='MassIVE r2023'

17.1% (MassIVE r2024: that, as a share). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_isotope.py. Recompute: page_numbers.py --only iso_2024_pct.

Code
def _p(v=_v):
    return float(_iso(v)["non-monoisotopic %"][0])
# called with v='MassIVE r2024'

13.6% (Zenodo balanced = ProteoBench: that, as a share). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_isotope.py. Recompute: page_numbers.py --only iso_balanced_pct.

Code
def _p(v=_v):
    return float(_iso(v)["non-monoisotopic %"][0])
# called with v='Zenodo balanced = ProteoBench'

14.8% (dIon: that, as a share). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_isotope.py. Recompute: page_numbers.py --only iso_dion_pct.

Code
def _p(v=_v):
    return float(_iso(v)["non-monoisotopic %"][0])
# called with v='dIon'

0 (InstaNovo split: spectra whose precursor is the label’s M+1 peak). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_isotope.py. Recompute: page_numbers.py --only iso_instanovo.

Code
def _f(v=_v):
    return int(_iso(v)["offset +1"][0])
# called with v='InstaNovo split'

1.0 ppm (v2 main M+1 spectra: median error assuming a carbon-13 offset). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from make_jobs_zip.py. Recompute: page_numbers.py --only iso_c13_median_ppm.

Code
@number("iso_c13_median_ppm", "v2 main M+1 spectra: median error assuming a carbon-13 offset", ["v2_main"], ["make_jobs_zip.py"], fmt=".1f", suffix=" ppm")
def _():
    return float(_offset_spectra()["e1"].median())

11.0 ppm (v2 main M+1 spectra: median error assuming a missed deamidation instead). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from make_jobs_zip.py. Recompute: page_numbers.py --only iso_deam_median_ppm.

Code
@number("iso_deam_median_ppm", "v2 main M+1 spectra: median error assuming a missed deamidation instead", ["v2_main"], ["make_jobs_zip.py"], fmt=".1f", suffix=" ppm")
def _():
    return float(_offset_spectra()["edeam"].median())

74,170 (v2 main M+1 spectra whose peptide has no N or Q to deamidate). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from make_jobs_zip.py. Recompute: page_numbers.py --only iso_no_nq.

Code
@number("iso_no_nq", "v2 main M+1 spectra whose peptide has no N or Q to deamidate", ["v2_main"], ["make_jobs_zip.py"])
def _():
    return int((~_offset_spectra()["seq_bare"].str.contains("[NQ]")).sum())

142 (Median peaks per spectrum, v1). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf. Input from a_profile.py. Recompute: page_numbers.py --only peaks_v1_median.

Code
@number("peaks_v1_median", "Median peaks per spectrum, v1", ["v1"], ["a_profile.py"], fmt=".0f")
def _():
    return float(_profile("original (species files)", "peaks median"))

334 (Median peaks per spectrum, v2 main). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_profile.py. Recompute: page_numbers.py --only peaks_v2_median.

Code
@number("peaks_v2_median", "Median peaks per spectrum, v2 main", ["v2_main"], ["a_profile.py"], fmt=".0f")
def _():
    return float(_profile("Zenodo main", "peaks median"))

47,568 (Largest fragment m/z, v1). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf. Input from a_profile.py. Recompute: page_numbers.py --only frag_v1_max.

Code
@number("frag_v1_max", "Largest fragment m/z, v1", ["v1"], ["a_profile.py"], fmt=",.0f")
def _():
    return float(_profile("original (species files)", "fragment m/z max"))

5,496 (Largest fragment m/z, v2 main). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_profile.py. Recompute: page_numbers.py --only frag_v2_max.

Code
@number("frag_v2_max", "Largest fragment m/z, v2 main", ["v2_main"], ["a_profile.py"], fmt=",.0f")
def _():
    return float(_profile("Zenodo main", "fragment m/z max"))

19,993 (Mouse spectra compared peak by peak (v1 against MassIVE 2024)). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, MSV000090982, updates/2024-05-14_woutb_71950b89/. Input from a_peaks.py. Recompute: page_numbers.py --only mouse_peak_spectra.

Code
@number("mouse_peak_spectra", "Mouse spectra compared peak by peak (v1 against MassIVE 2024)", ["v1", "massive_2024"], ["a_peaks.py"])
def _():
    return _peaks().height

97.6% (Median share of v1’s peaks found in the revised peak list within 10 ppm). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, MSV000090982, updates/2024-05-14_woutb_71950b89/. Input from a_peaks.py. Recompute: page_numbers.py --only mouse_peaks_matched_pct.

Code
@number("mouse_peaks_matched_pct", "Median share of v1's peaks found in the revised peak list within 10 ppm", ["v1", "massive_2024"],
        ["a_peaks.py"], fmt=".1f", suffix="%")
def _():
    return 100 * float(_peaks()["orig_peaks_in_revised"].median())

97.0% (Median share of v1’s intensity carried by the peaks found in the revised peak list). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, MSV000090982, updates/2024-05-14_woutb_71950b89/. Input from a_peaks.py. Recompute: page_numbers.py --only mouse_intensity_matched_pct.

Code
@number("mouse_intensity_matched_pct", "Median share of v1's intensity carried by the peaks found in the revised peak list", ["v1", "massive_2024"], ["a_peaks.py"],
        fmt=".1f", suffix="%")
def _():
    return 100 * float(_peaks()["orig_intensity_in_revised"].median())

2.5 (Median ratio of v1’s to the revised median intensity). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, MSV000090982, updates/2024-05-14_woutb_71950b89/. Input from a_peaks.py. Recompute: page_numbers.py --only mouse_intensity_ratio.

Code
@number("mouse_intensity_ratio", "Median ratio of v1's to the revised median intensity", ["v1", "massive_2024"], ["a_peaks.py"], fmt=".1f")
def _():
    return float(_peaks()["intensity_ratio_median"].median())

20 (Spectra v1 shares with MassIVE 2022 whose charge differs between the two). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, MSV000090982, peak/. Input from make_jobs.py. Recompute: page_numbers.py --only v1_2022_charge_changed.

Code
@number("v1_2022_charge_changed", "Spectra v1 shares with MassIVE 2022 whose charge differs between the two", ["v1", "massive_2022"], ["make_jobs.py"])
def _():
    j = _v1_vs_2022()
    return int((j["charge"] != j["charge_r"]).sum())

0.24% (Share of v1 spectra at charge 1). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf. Input from a_profile.py. Recompute: page_numbers.py --only v1_charge1_pct.

Code
@number("v1_charge1_pct", "Share of v1 spectra at charge 1", ["v1"], ["a_profile.py"], fmt=".2f", suffix="%")
def _():
    return float(_profile("original (species files)", "z=1 %"))

6.6% (Share of v2 main spectra with an N-terminal modification). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from make_jobs_zip.py. Recompute: page_numbers.py --only nterm_main_pct.

Code
@number("nterm_main_pct", "Share of v2 main spectra with an N-terminal modification", ["v2_main"], ["make_jobs_zip.py"], fmt=".1f", suffix="%")
def _():
    m = table("zenodo_main", ("species", "seq_raw"))
    return 100 * m["seq_norm"].str.contains(r"^\[[^\]]*\]-").sum() / m.height

199,297 (Spectra in r2022, not r2023). Reads MSV000090982, peak/, MSV000090982, updates/2023-03-08_woutb_2c43c18c/, MSV000090982, updates/2024-05-14_woutb_71950b89/. Input from a_versions.py. Recompute: page_numbers.py --only r2022_r2023_out.

Code
def _out(a=_a, b=_b):
    return int(row(csv(f"{a}_vs_{b}__presence"), "only_a", species="ALL"))
# called with a='r2022', b='r2023'

241,754 (Spectra in r2023, not r2022). Reads MSV000090982, peak/, MSV000090982, updates/2023-03-08_woutb_2c43c18c/, MSV000090982, updates/2024-05-14_woutb_71950b89/. Input from a_versions.py. Recompute: page_numbers.py --only r2022_r2023_in.

Code
def _in(a=_a, b=_b):
    return int(row(csv(f"{a}_vs_{b}__presence"), "only_b", species="ALL"))
# called with a='r2022', b='r2023'

41,389 (Spectra in both whose label changed). Reads MSV000090982, peak/, MSV000090982, updates/2023-03-08_woutb_2c43c18c/, MSV000090982, updates/2024-05-14_woutb_71950b89/. Input from a_versions.py. Recompute: page_numbers.py --only r2022_r2023_relabelled.

Code
def _lab(a=_a, b=_b):
    r = csv(f"{a}_vs_{b}__labels").filter(pl.col("species") == "ALL")
    return int(r["I/L only"][0] + r["modifications differ"][0] + r["different peptide"][0])
# called with a='r2022', b='r2023'

28,674 (Spectra in r2023, not r2024). Reads MSV000090982, peak/, MSV000090982, updates/2023-03-08_woutb_2c43c18c/, MSV000090982, updates/2024-05-14_woutb_71950b89/. Input from a_versions.py. Recompute: page_numbers.py --only r2023_r2024_out.

Code
def _out(a=_a, b=_b):
    return int(row(csv(f"{a}_vs_{b}__presence"), "only_a", species="ALL"))
# called with a='r2023', b='r2024'

18,928 (Spectra in r2024, not r2023). Reads MSV000090982, peak/, MSV000090982, updates/2023-03-08_woutb_2c43c18c/, MSV000090982, updates/2024-05-14_woutb_71950b89/. Input from a_versions.py. Recompute: page_numbers.py --only r2023_r2024_in.

Code
def _in(a=_a, b=_b):
    return int(row(csv(f"{a}_vs_{b}__presence"), "only_b", species="ALL"))
# called with a='r2023', b='r2024'

0 (Spectra in both whose label changed). Reads MSV000090982, peak/, MSV000090982, updates/2023-03-08_woutb_2c43c18c/, MSV000090982, updates/2024-05-14_woutb_71950b89/. Input from a_versions.py. Recompute: page_numbers.py --only r2023_r2024_relabelled.

Code
def _lab(a=_a, b=_b):
    r = csv(f"{a}_vs_{b}__labels").filter(pl.col("species") == "ALL")
    return int(r["I/L only"][0] + r["modifications differ"][0] + r["different peptide"][0])
# called with a='r2023', b='r2024'

27,214 (Spectra in r2024, not zenodo_main). Reads MSV000090982, updates/2024-05-14_woutb_71950b89/, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_swing.py. Recompute: page_numbers.py --only r2024_main_out.

Code
def _f(t=_t):
    return int(row(csv("swing__transitions"), "spectra", transition=t))
# called with t='in r2024, not zenodo_main'

20,426 (Spectra in zenodo_main, not r2024). Reads MSV000090982, updates/2024-05-14_woutb_71950b89/, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_swing.py. Recompute: page_numbers.py --only r2024_main_in.

Code
def _f(t=_t):
    return int(row(csv("swing__transitions"), "spectra", transition=t))
# called with t='in zenodo_main, not r2024'

83% (Spectra in r2022, not r2023 whose peptide the other build keeps in the same species). Reads MSV000090982, peak/, MSV000090982, updates/2023-03-08_woutb_2c43c18c/. Input from a_swing.py. Recompute: page_numbers.py --only swing_22_23_out_same_pct.

Code
def _f(t=_t):
    r = csv("swing__transitions").filter(pl.col("transition") == t)
    return 100 * r["peptide present in other build, same species"][0] / r["spectra"][0]
# called with t='in r2022, not r2023'

83% (Spectra in r2023, not r2022 whose peptide the other build keeps in the same species). Reads MSV000090982, peak/, MSV000090982, updates/2023-03-08_woutb_2c43c18c/. Input from a_swing.py. Recompute: page_numbers.py --only swing_22_23_in_same_pct.

Code
def _f(t=_t):
    r = csv("swing__transitions").filter(pl.col("transition") == t)
    return 100 * r["peptide present in other build, same species"][0] / r["spectra"][0]
# called with t='in r2023, not r2022'

21,818 (2022 to 2023 relabellings: deamidation). Reads MSV000090982, peak/, MSV000090982, updates/2023-03-08_woutb_2c43c18c/. Input from make_jobs.py, extract.py. Recompute: page_numbers.py --only relabel_deamidation.

Code
def _f(k=_k):
    return int(_relabel_22_23()[k])
# called with k='deamidation'

1,226 (2022 to 2023 relabellings: N-terminal gained). Reads MSV000090982, peak/, MSV000090982, updates/2023-03-08_woutb_2c43c18c/. Input from make_jobs.py, extract.py. Recompute: page_numbers.py --only relabel_nterm.

Code
def _f(k=_k):
    return int(_relabel_22_23()[k])
# called with k='N-terminal gained'

10,775 (2022 to 2023 relabellings: same set). Reads MSV000090982, peak/, MSV000090982, updates/2023-03-08_woutb_2c43c18c/. Input from make_jobs.py, extract.py. Recompute: page_numbers.py --only relabel_same_set.

Code
def _f(k=_k):
    return int(_relabel_22_23()[k])
# called with k='same set'

7,570 (2022 to 2023 relabellings: different peptide). Reads MSV000090982, peak/, MSV000090982, updates/2023-03-08_woutb_2c43c18c/. Input from make_jobs.py, extract.py. Recompute: page_numbers.py --only relabel_peptide.

Code
def _f(k=_k):
    return int(_relabel_22_23()[k])
# called with k='different peptide'

28,673 (Spectra in r2023, not r2024 whose peptide Percolator found in more than one species). Reads 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output). Input from a_swing.py. Recompute: page_numbers.py --only swing_23_24_shared.

Code
def _f(t=_t, c=_c):
    return int(row(csv("swing__transitions"), c, transition=t))
# called with t='in r2023, not r2024', c='peptide shared between species (q<0.01)'

20,426 (Spectra in zenodo_main, not r2024 whose peptide Percolator found in more than one species). Reads 10.5281/zenodo.13685813, nine-species-intermediate.zip (Tide and Percolator output). Input from a_swing.py. Recompute: page_numbers.py --only swing_main_shared.

Code
def _f(t=_t, c=_c):
    return int(row(csv("swing__transitions"), c, transition=t))
# called with t='in zenodo_main, not r2024', c='peptide shared between species (q<0.01)'

855 (Backbones in more than one species file, r2022). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from make_jobs.py, make_jobs_zip.py. Recompute: page_numbers.py --only multi_species_r2022.

Code
def _f(b=_b):
    d = table(b, ("species", "seq_raw")).with_columns(il(pl.col("seq_bare")).alias("p"))
    return d.group_by("p").agg(pl.col("species").n_unique().alias("n")).filter(pl.col("n") > 1).height
# called with b='r2022'

1,458 (Backbones in more than one species file, r2023). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from make_jobs.py, make_jobs_zip.py. Recompute: page_numbers.py --only multi_species_r2023.

Code
def _f(b=_b):
    d = table(b, ("species", "seq_raw")).with_columns(il(pl.col("seq_bare")).alias("p"))
    return d.group_by("p").agg(pl.col("species").n_unique().alias("n")).filter(pl.col("n") > 1).height
# called with b='r2023'

353 (Backbones in more than one species file, r2024). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from make_jobs.py, make_jobs_zip.py. Recompute: page_numbers.py --only multi_species_r2024.

Code
def _f(b=_b):
    d = table(b, ("species", "seq_raw")).with_columns(il(pl.col("seq_bare")).alias("p"))
    return d.group_by("p").agg(pl.col("species").n_unique().alias("n")).filter(pl.col("n") > 1).height
# called with b='r2024'

0 (Backbones in more than one species file, zenodo_main). Reads 10.5281/zenodo.13685813, nine-species-main.zip. Input from make_jobs.py, make_jobs_zip.py. Recompute: page_numbers.py --only multi_species_zenodo_main.

Code
def _f(b=_b):
    d = table(b, ("species", "seq_raw")).with_columns(il(pl.col("seq_bare")).alias("p"))
    return d.group_by("p").agg(pl.col("species").n_unique().alias("n")).filter(pl.col("n") > 1).height
# called with b='zenodo_main'

13 (denovo_benchmarks, Mus-musculus: raw files). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf, 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from a_dnb.py. Recompute: page_numbers.py --only dnb_mouse_files.

Code
def _f(sp=_sp, col=_col):
    return _dnb_counts(sp, col)
# called with sp='Mus-musculus', col='raw files'

4 (denovo_benchmarks, Bacillus-subtilis: raw files). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf, 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from a_dnb.py. Recompute: page_numbers.py --only dnb_bsub_files.

Code
def _f(sp=_sp, col=_col):
    return _dnb_counts(sp, col)
# called with sp='Bacillus-subtilis', col='raw files'

106 (denovo_benchmarks, Bacillus-subtilis: raw files converted). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf, 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from a_dnb.py. Recompute: page_numbers.py --only dnb_bsub_converted.

Code
def _f(sp=_sp, col=_col):
    return _dnb_counts(sp, col)
# called with sp='Bacillus-subtilis', col='raw files converted'

3 (denovo_benchmarks, Saccharomyces-cerevisiae: raw files). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf, 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from a_dnb.py. Recompute: page_numbers.py --only dnb_yeast_files.

Code
def _f(sp=_sp, col=_col):
    return _dnb_counts(sp, col)
# called with sp='Saccharomyces-cerevisiae', col='raw files'

27 (denovo_benchmarks, Saccharomyces-cerevisiae: raw files converted). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf, 10.5281/zenodo.13685813, nine-species-data.zip (the converted MGFs). Input from a_dnb.py. Recompute: page_numbers.py --only dnb_yeast_converted.

Code
def _f(sp=_sp, col=_col):
    return _dnb_counts(sp, col)
# called with sp='Saccharomyces-cerevisiae', col='raw files converted'

477,999 (denovo_benchmarks spectra that v2 main also holds). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_dnb.py. Recompute: page_numbers.py --only dnb_in_main.

Code
@number("dnb_in_main", "denovo_benchmarks spectra that v2 main also holds", ["dnb", "v2_main"], ["a_dnb.py"])
def _():
    return sum(_dnb_vs(c) for c in ("identical", "I/L only", "modifications differ", "different peptide"))

87.9% (Share of the spectra denovo_benchmarks shares with v2 main that carry the same label (I=L)). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_dnb.py. Recompute: page_numbers.py --only dnb_same_label_pct.

Code
@number("dnb_same_label_pct", "Share of the spectra denovo_benchmarks shares with v2 main that carry the same label (I=L)", ["dnb", "v2_main"], ["a_dnb.py"], fmt=".1f", suffix="%")
def _():
    return 100 * (_dnb_vs("identical") + _dnb_vs("I/L only")) / REG["dnb_in_main"]["f"]()

467,142 (denovo_benchmarks spectra v2 main does not hold). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_dnb.py. Recompute: page_numbers.py --only dnb_not_in_main.

Code
@number("dnb_not_in_main", "denovo_benchmarks spectra v2 main does not hold", ["dnb", "v2_main"], ["a_dnb.py"])
def _():
    return _dnb_vs("absent")

188,089 (denovo_benchmarks labels with a modification the revised search did not allow). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf. Input from a_dnb.py. Recompute: page_numbers.py --only dnb_rare_mods.

Code
@number("dnb_rare_mods", "denovo_benchmarks labels with a modification the revised search did not allow", ["dnb"], ["a_dnb.py"])
def _():
    j = pl.read_parquet(f"{OUT}/dnb_vs_registry.parquet", columns=["lab_dnb"])
    return int(j["lab_dnb"].str.contains(r"[DEHKRC]\[\+(?:57.02|21.98|14.02|39.99)\]|\[\+(?:57.02|26.02|12.00)\]-").sum())

44,464 (Spectra v2 main labels at the M+1 peak that denovo_benchmarks also labels). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_dnb.py. Recompute: page_numbers.py --only dnb_iso_spectra.

Code
@number("dnb_iso_spectra", "Spectra v2 main labels at the M+1 peak that denovo_benchmarks also labels", ["dnb", "v2_main"], ["a_dnb.py"])
def _():
    return _dnb_iso(None)

39,011 (Of those, spectra denovo_benchmarks labels as the same backbone with one more deamidation). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_dnb.py. Recompute: page_numbers.py --only dnb_iso_deamidation.

Code
@number("dnb_iso_deamidation", "Of those, spectra denovo_benchmarks labels as the same backbone with one more deamidation", ["dnb", "v2_main"], ["a_dnb.py"])
def _():
    return _dnb_iso("modifications differ")

37,982 (Of those, spectra where v2 main’s carbon-13 reading fits the precursor better). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_dnb.py. Recompute: page_numbers.py --only dnb_c13_better.

Code
@number("dnb_c13_better", "Of those, spectra where v2 main's carbon-13 reading fits the precursor better", ["dnb", "v2_main"], ["a_dnb.py"])
def _():
    x = _dnb_deam()
    return int((x["e_c13"].abs() < x["e_dnb"].abs()).sum())

0.9 ppm (Of those, the median precursor error of v2 main’s carbon-13 reading). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_dnb.py. Recompute: page_numbers.py --only dnb_c13_ppm.

Code
@number("dnb_c13_ppm", "Of those, the median precursor error of v2 main's carbon-13 reading", ["dnb", "v2_main"], ["a_dnb.py"], fmt=".1f", suffix=" ppm")
def _():
    return float(_dnb_deam()["e_c13"].median())

12.1 ppm (Of those, the median precursor error of denovo_benchmarks’ deamidation reading). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf, 10.5281/zenodo.13685813, nine-species-main.zip. Input from a_dnb.py. Recompute: page_numbers.py --only dnb_deam_ppm.

Code
@number("dnb_deam_ppm", "Of those, the median precursor error of denovo_benchmarks' deamidation reading", ["dnb", "v2_main"], ["a_dnb.py"], fmt=".1f", suffix=" ppm")
def _():
    return float(_dnb_deam()["e_dnb"].median())

1,014 (denovo_benchmarks labels pointing past the end of their deposited MGF chunk). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf. Input from make_jobs_dnb.py. Recompute: page_numbers.py --only dnb_unresolved.

Code
@number("dnb_unresolved", "denovo_benchmarks labels pointing past the end of their deposited MGF chunk", ["dnb"], ["make_jobs_dnb.py"])
def _():
    return _dnb_unresolved()[0].height

18,996 (Spectra in the deposited chunk BC-2_1.mgf). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf. Input from make_jobs_dnb.py. Recompute: page_numbers.py --only dnb_bc2_1_spectra.

Code
@number("dnb_bc2_1_spectra", "Spectra in the deposited chunk BC-2_1.mgf", ["dnb"], ["make_jobs_dnb.py"])
def _():
    mg = _dnb_unresolved()[1]
    return mg.filter((pl.col("raw_file") == "BC-2") & (pl.col("fold") == "1")).height

19,999 (Highest index the labels cite in BC-2_1). Reads MSV000096182, other/9_species_*_labels.csv and peak/mgf/<raw file>_<chunk>.mgf. Input from download_sources.py. Recompute: page_numbers.py --only dnb_bc2_1_max_index.

Code
@number("dnb_bc2_1_max_index", "Highest index the labels cite in BC-2_1", ["dnb"], ["download_sources.py"])
def _():
    miss = _dnb_unresolved()[0]
    return int(miss.filter(pl.col("spectrum_id").str.starts_with("BC-2_1:"))["row"].max())

28% (Lowest share of a v1 fold’s valid or test spectra whose backbone the fold trains on). Reads MSV000081382, HighResolution/data/cross.9high_80k.exclude_<species>/. Input from make_jobs.py. Recompute: page_numbers.py --only fold_backbone_min.

Code
@number("fold_backbone_min", "Lowest share of a v1 fold's valid or test spectra whose backbone the fold trains on", ["v1_folds"],
        ["make_jobs.py"], fmt=".0f", suffix="%")
def _():
    return min(_fold_backbone())

36% (Highest such share). Reads MSV000081382, HighResolution/data/cross.9high_80k.exclude_<species>/. Input from make_jobs.py. Recompute: page_numbers.py --only fold_backbone_max.

Code
@number("fold_backbone_max", "Highest such share", ["v1_folds"], ["make_jobs.py"], fmt=".0f", suffix="%")
def _():
    return max(_fold_backbone())

0.4% (M. mazei spectra whose backbone the fold holding it out trained on). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, MSV000081382, HighResolution/data/cross.9high_80k.exclude_<species>/. Input from a_leak.py. Recompute: page_numbers.py --only heldout_min_pct.

Code
def _f(h=_h):
    return float(row(csv("leak__original_folds"), "peptide trained on %", **{"held-out species": h}))
# called with h='M. mazei'

22.6% (V. mungo spectra whose backbone the fold holding it out trained on). Reads MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, MSV000081382, HighResolution/data/cross.9high_80k.exclude_<species>/. Input from a_leak.py. Recompute: page_numbers.py --only heldout_max_pct.

Code
def _f(h=_h):
    return float(row(csv("leak__original_folds"), "peptide trained on %", **{"held-out species": h}))
# called with h='V. mungo'

639,286 (InstaNovo split records whose precursor and peak count equal the v1 record in the same position (v1’s yeast-excluded fold files for train and valid, v1’s yeast file for test)). Reads Hugging Face InstaDeepAI/ms_ninespecies_benchmark, data/{train,validation,test}-*.parquet, MSV000081382, HighResolution/data/high.<species>/peaks.db.mgf, MSV000081382, HighResolution/data/cross.9high_80k.exclude_<species>/. Input from extract_tabular.py, make_jobs.py. Recompute: page_numbers.py --only instanovo_row_aligned.

Code
@number("instanovo_row_aligned", "InstaNovo split records whose precursor and peak count equal the v1 record in the same "
        "position (v1's yeast-excluded fold files for train and valid, v1's yeast file for test)",
        ["instanovo_split", "v1", "v1_folds"], ["extract_tabular.py", "make_jobs.py"])
def _():
    n = 0
    for split in ("train", "valid", "test"):
        a = release("instanovo_split", ["split", "row", "pepmass", "n_peaks"]).filter(pl.col("split") == split).collect()
        if split == "test":
            b = original("orig_species", ["species", "row", "pepmass", "n_peaks"]).filter(
                pl.col("species") == "Saccharomyces-cerevisiae").collect()
        else:
            b = original("orig_fold", ["fold", "split", "row", "pepmass", "n_peaks"]).filter(
                (pl.col("fold") == "Saccharomyces-cerevisiae") & (pl.col("split") == split)).collect()
        j = a.join(b.select("row", pl.col("pepmass").alias("pm_b"), pl.col("n_peaks").alias("np_b")), on="row")
        n += j.filter(((pl.col("pepmass") - pl.col("pm_b")).abs() < 1e-3) & (pl.col("n_peaks") == pl.col("np_b"))).height
    return n

71% (ProteoBench, Mus-musculus: share of spectra that are InstaNovo/NovoBench training scans). Reads ProteoBench, nine_species_balanced_De_Novo.mgf.gz, Hugging Face InstaDeepAI/ms_ninespecies_benchmark, data/{train,validation,test}-*.parquet. Input from a_leak.py. Recompute: page_numbers.py --only leak_pb_mouse_pct.

Code
def _f(sp=_sp):
    r = csv("leak__instanovo_train_to_proteobench_by_species").filter(pl.col("species") == sp)
    return 100 * r["same spectrum"][0] / r["spectra"][0]
# called with sp='Mus-musculus'

50% (ProteoBench, H.-sapiens: share of spectra that are InstaNovo/NovoBench training scans). Reads ProteoBench, nine_species_balanced_De_Novo.mgf.gz, Hugging Face InstaDeepAI/ms_ninespecies_benchmark, data/{train,validation,test}-*.parquet. Input from a_leak.py. Recompute: page_numbers.py --only leak_pb_human_pct.

Code
def _f(sp=_sp):
    r = csv("leak__instanovo_train_to_proteobench_by_species").filter(pl.col("species") == sp)
    return 100 * r["same spectrum"][0] / r["spectra"][0]
# called with sp='H.-sapiens'

8.2% (Zenodo main, all species: share of spectra that are InstaNovo/NovoBench training scans). Reads Hugging Face InstaDeepAI/ms_ninespecies_benchmark, data/{train,validation,test}-*.parquet. Input from a_leak.py. Recompute: page_numbers.py --only leak_main_pct.

Code
def _f(e=_e):
    return float(row(csv("leak__cross_version"), "same spectrum %", **{"evaluate on": e}))
# called with e='Zenodo main, all species'

59.9% (Zenodo main, all species: share whose backbone is in that training split). Reads Hugging Face InstaDeepAI/ms_ninespecies_benchmark, data/{train,validation,test}-*.parquet. Input from a_leak.py. Recompute: page_numbers.py --only leak_main_pct_backbone.

Code
def _b(e=_e):
    return float(row(csv("leak__cross_version"), "peptide seen %", **{"evaluate on": e}))
# called with e='Zenodo main, all species'

64.2% (denovo_benchmarks selection: share whose backbone is in that training split). Reads Hugging Face InstaDeepAI/ms_ninespecies_benchmark, data/{train,validation,test}-*.parquet. Input from a_leak.py. Recompute: page_numbers.py --only leak_dnb_pct_backbone.

Code
def _b(e=_e):
    return float(row(csv("leak__cross_version"), "peptide seen %", **{"evaluate on": e}))
# called with e='denovo_benchmarks selection'
Back to top