{
 "page": "tools/kmerseek.html",
 "title": "kmerseek card",
 "source": {
  "repo": "seanome/2024-kmerseek-analysis",
  "commit": "4a4b11714ddb740f8a7e324058b26bee8fb35af4",
  "commit_date": "2026-10-15T13:12:56Z",
  "path": "results/leaderboard",
  "copied_at": "2026-10-15T13:44:05Z",
  "sha256": {
   "results.parquet": "0c0cf94b5fc40587cab2ffbf7aaf84df9b5475037cc0d818ad2f452a9c73a837",
   "compute.parquet": "8a47ba2123c60cbb41b4833c9f96661934369137b72c5d81ef0808c98247e435",
   "coverage.md": "c10b26730d8dc44b16120bd2f6ee87eb8ed0db3efa40398b339ddac0b0cb7781",
   "provenance.json": "22e54f206354e42208f8a78c4f4827f980ac1db2ce13153f2b077274552e4141",
   "inventory.md": "8dc7040a38cf06af126bd08211edf1f6055c69fe9ac2b4088c6ba8f7f90e6c71",
   "pileup/regions.parquet": "e97701d2fcb601babe25c7d5c6c82760ea19e460e9bc1d555fe5f8f69cb4d6d8",
   "pileup/calls.parquet": "41bc1f6db7bf54f00370b11db2ffed61031d90a42895aa1697be26fc449ea958",
   "pileup/provenance.json": "5ed6e70dd9e82b5200f089b9da3afc62d0a10cc6a51da86715f5f26d3aac9b9e"
  },
  "pileup_commit": "39d81ec90815cacbf3744199d1fa8e99ab28c6f4"
 },
 "text": [
  {
   "tag": "h1",
   "text": "kmerseek"
  },
  {
   "tag": "p",
   "text": "Short words of k letters (k-mers) shared between two proteins."
  },
  {
   "tag": "h2",
   "text": "Will it work for you?"
  },
  {
   "tag": "li",
   "text": "Is the closest same-family domain in the relative you will search at least 40% identical, for most of your proteins? If yes, Fmax here is 40–60% 0.005 (n = 563), 60–100% 0.297 (n = 1,289). If no, 20–30% 0.000 (n = 93), 30–40% 0.000 (n = 165). (Pfam truth set, raw calls, zebrafish (430 Mya) as the relative searched, setting gbmr4, k = 21; subsets with at least 30 true instances.)"
  },
  {
   "tag": "li",
   "text": "Are the features you care about longer than 60 residues? If yes, Fmax here is 61–120 aa 0.208 (n = 963), 121–250 aa 0.098 (n = 504), 251 aa or more 0.050 (n = 277). If no, 16–30 aa 0.281 (n = 271), 31–60 aa 0.232 (n = 420). (Pfam truth set, raw calls, zebrafish (430 Mya) as the relative searched, setting gbmr4, k = 21.)"
  },
  {
   "tag": "li",
   "text": "Can you spend about 0.0552 core-hours per 1,000 proteins for each relative you search? That is the measured mean per relative; see \"Cost per 1,000 queries\" below."
  },
  {
   "tag": "h2",
   "text": "Best Fmax and cost"
  },
  {
   "tag": "p",
   "text": "Under the Pfam truth set, raw calls, zebrafish (430 Mya) as the relative searched, its best setting is gbmr4, k = 21 (gbmr4_k21_lcFalse): Fmax 0.192 over 2,435 true instances. Searching costs about $0.00246 per 1,000 queries (0.0552 core-hours), for each relative searched."
  },
  {
   "tag": "h2",
   "text": "Where it is strong and weak"
  },
  {
   "tag": "p",
   "text": "Each line compares this setting with the best setting of any other tool on the same subset of the proteins, so the other tool's setting can change from line to line. Only subsets with at least 30 true instances are compared."
  },
  {
   "tag": "p",
   "text": "Where it is closest to, or furthest ahead of, the best other tool:"
  },
  {
   "tag": "li",
   "text": "regions 16–30 aa long: Fmax 0.281 (n = 271); best other: HH-suite (hhsearch), single-protein profiles, 0.066."
  },
  {
   "tag": "li",
   "text": "regions 31–60 aa long: Fmax 0.232 (n = 420); best other: phmmer, default options, 0.095."
  },
  {
   "tag": "p",
   "text": "Where it is furthest behind the best other tool:"
  },
  {
   "tag": "li",
   "text": "regions 251 aa or more long: Fmax 0.050 (n = 277); best other: phmmer, default options, 0.477."
  },
  {
   "tag": "li",
   "text": "identity 20–30% to the closest same-family domain: Fmax 0.000 (n = 93); best other: phmmer, default options, 0.359."
  },
  {
   "tag": "p",
   "text": "Swiss-Prot features, raw calls, zebrafish, setting wwmj5, k = 11: best feature type membrane-spanning, Fmax 0.362 (n = 1,124); worst coiled coil, Fmax 0.000 (n = 145)."
  },
  {
   "tag": "figcaption",
   "text": "Figure 2. Where kmerseek is ahead and behind: its Fmax on each subset of the proteins, against the best other tool on that subset (Pfam truth set, raw calls, zebrafish as the relative; its best setting, gbmr4, k = 21). Left out, under 30 true instances: 0–20%."
  },
  {
   "tag": "h2",
   "text": "kmerseek"
  },
  {
   "tag": "p",
   "text": "each row: the claim, the result that would disprove it, the verdict with its number, the evidence"
  },
  {
   "tag": "h3",
   "text": "● Holds (1)"
  },
  {
   "tag": "summary",
   "text": "Scope and related numbers"
  },
  {
   "tag": "p",
   "text": "Swiss-Prot features, raw calls, setting hp_thomas_dill2_k24_lcFalse, 998 human queries"
  },
  {
   "tag": "li",
   "text": "on Pfam domains, the best kmerseek setting for each mammal: −0.193 to +0.130 across 6 of 6; furthest: clupus −0.193"
  },
  {
   "tag": "li",
   "text": "settings that pass on Swiss-Prot features (raw or dedup): 2 of 30 setting and dedup choices pass (15 settings): hp_thomas_dill2_k24_lcFalse raw, hp_thomas_dill2_k24_lcFalse dedup"
  },
  {
   "tag": "p",
   "text": "Source: seanome/2024-kmerseek-analysis@4a4b1171 results.parquet"
  },
  {
   "tag": "li",
   "text": "●Parity with phmmer inside mammalsDisproved if: Fmax more than 0.05 from phmmer's on any of the 6 mammalsholds · −0.042 to +0.013 across 6 of 6 · leaderboard"
  },
  {
   "tag": "h3",
   "text": "○ Not yet tested (3)"
  },
  {
   "tag": "summary",
   "text": "Scope and related numbers"
  },
  {
   "tag": "p",
   "text": "Pfam-N regions, raw calls, kmerseek hp_thomas_dill2 settings, all 15 relatives"
  },
  {
   "tag": "li",
   "text": "share of Pfam pairs at 20-30% identity sharing one exact hp_thomas_dill2 23-mer: 0.038"
  },
  {
   "tag": "li",
   "text": "recall at a 0.001 false-positive rate for an exact 23-mer seed, Pfam 20-30%: 0.039"
  },
  {
   "tag": "li",
   "text": "○Exact HP seeds find homologs below 40% identityDisproved if: Fmax under 0.05 in the under-40% identity bins on Pfam-N, for every hydrophobic-polar settingnot yet tested · the 0-20%, 20-30%, 30-40% bins hold at most 1 region for any setting and relative; at least 30 are needed to decide · notebook 230 to 232"
  },
  {
   "tag": "summary",
   "text": "Scope and related numbers"
  },
  {
   "tag": "p",
   "text": "the 87 short Swiss-Prot features of notebook 244 where kmerseek drew the boundary and every other tool's call ran past it"
  },
  {
   "tag": "li",
   "text": "short features passing every criterion in notebook 244: 87"
  },
  {
   "tag": "li",
   "text": "across all Swiss-Prot features, not only short ones, kmerseek settings above a Kyte-Doolittle scan: 0 of 406"
  },
  {
   "tag": "li",
   "text": "○Short features under 60 aa placed at 50 to 90% identityDisproved if: a Kyte-Doolittle hydrophobicity window, with no search, lands on as many of the 87 casesnot yet tested · the Kyte-Doolittle window was not run on the 87 cases · notebook 244"
  },
  {
   "tag": "summary",
   "text": "Scope and related numbers"
  },
  {
   "tag": "p",
   "text": "Botryllus histocompatibility factor (BHF)"
  },
  {
   "tag": "li",
   "text": "best E-value of any human protein for BHF, any kmerseek setting (notebook 241): 0.609548"
  },
  {
   "tag": "li",
   "text": "○The BHF membrane tether is a find other tools missDisproved if: a Kyte-Doolittle window on BHF calls the same regionnot yet tested · no Kyte-Doolittle window has been run on BHF · notebook 241"
  },
  {
   "tag": "h3",
   "text": "⊘ Disproved (2)"
  },
  {
   "tag": "summary",
   "text": "Scope and related numbers"
  },
  {
   "tag": "p",
   "text": "1,000 Swiss-Prot queries against Swiss-Prot on one laptop; kmerseek hp k15, scaled 10"
  },
  {
   "tag": "li",
   "text": "kmerseek search peak memory, GB: 82.68"
  },
  {
   "tag": "li",
   "text": "MMseqs2 -s 5.7 search peak memory, GB: 2.55"
  },
  {
   "tag": "p",
   "text": "Source: notebooks/239_laptop_scale_swissprot.ipynb @ ba20e8b, cell 1"
  },
  {
   "tag": "li",
   "text": "⊘Faster per query than MMseqs2Disproved if: kmerseek answers fewer queries per second than MMseqs2 on the same 1,000 Swiss-Prot queriesdisproved 13 Sep 2026 · 2.29 queries per second against MMseqs2's 78.6 · notebook 239"
  },
  {
   "tag": "summary",
   "text": "Scope and related numbers"
  },
  {
   "tag": "p",
   "text": "SCOPe40, hp_thomas_dill at k 26, family level"
  },
  {
   "tag": "li",
   "text": "per-query family sensitivity, kmerseek better than FoldSeek on 228 shared queries (Wilcoxon): p=0.1171"
  },
  {
   "tag": "li",
   "text": "best kmerseek 0.4 AUC over all 5,713 reference queries (family), any setting: 0.295 (mmseqs12.k6.c_max|region_evalue, n = 5,713 queries)"
  },
  {
   "tag": "li",
   "text": "best kmerseek 0.4 AUC over only the queries it fires on (family), any setting: 0.999 (uniprot18.k9.exact|f_weighted_target_in_query, n = 753 queries)"
  },
  {
   "tag": "p",
   "text": "Source: notebooks/076_hp_alphabet_sweep_per_class.ipynb @ 31f53c1, cell 19"
  },
  {
   "tag": "li",
   "text": "⊘Outperforms Foldseek on SCOPeDisproved if: inside FoldSeek's 5,713-query SCOPe40 benchmark, kmerseek detects no query that FoldSeek missesdisproved 30 Aug 2026 · fired on 188 of 5,713 benchmark queries (3.3%); 0 that FoldSeek missed · notebook 076"
  },
  {
   "tag": "h2",
   "text": "What it compares"
  },
  {
   "tag": "p",
   "text": "Short words of k letters (k-mers) shared between two proteins. First, each amino acid is replaced by a letter from a smaller alphabet, for example H for hydrophobic and P for polar. Two proteins can then match where their residues differ but their pattern of residue types is the same."
  },
  {
   "tag": "h2",
   "text": "What it needs"
  },
  {
   "tag": "li",
   "text": "sequence only: yes"
  },
  {
   "tag": "li",
   "text": "3D structure prediction: no"
  },
  {
   "tag": "li",
   "text": "GPU: no"
  },
  {
   "tag": "h2",
   "text": "Reference searched"
  },
  {
   "tag": "p",
   "text": "An index of the relative's proteome (Quest for Orthologs reference proteomes, release 2020_04), built once per alphabet and k-mer length."
  },
  {
   "tag": "h2",
   "text": "How to read its score"
  },
  {
   "tag": "p",
   "text": "region_enrichment: the number of k-mers the region shares with the target divided by the number expected by chance (fold enrichment). Higher ranks first. A region was kept when either test passed: its own score was at least 1.3, or the whole query protein's p-value was at most 0.05."
  },
  {
   "tag": "h2",
   "text": "Known failure modes"
  },
  {
   "tag": "li",
   "text": "A feature shorter than k residues contains no complete k-mer, so it cannot be found. Figure 2 above shows how Fmax changes with region length."
  },
  {
   "tag": "li",
   "text": "The task script records a kmerseek search that exits with an error as a search with no hits, so a crash would look like a miss. How often that happened in this run: not measured."
  },
  {
   "tag": "li",
   "text": "Setting hp_thomas_dill2 k33 was scored, but no trace row holds its search task, so its cost is not measured, and the scoring task for it was not found either."
  },
  {
   "tag": "h2",
   "text": "Cost per 1,000 queries"
  },
  {
   "tag": "p",
   "text": "Setting gbmr4_k21_lcFalse, searching one relative (mean over the 15 relatives it searched): 0.0552 core-hours reserved per 1,000 queries (4 cores for the task's wall time), measured on Sherlock. Peak memory 5.2 GB. That is about $0.00246 at $0.044625 per CPU-hour. Building its databases took 0.147 core-hours over 6 databases. A database is built once and reused, so this is not in the per-query cost. This covers the 6 database builds the task records hold; the search used 15 relatives."
  },
  {
   "tag": "p",
   "text": "The per-query cost counts the search only. The run recorded cost per tool and setting, summed over all relatives, so the cost for one relative is the mean."
  },
  {
   "tag": "h2",
   "text": "Licence"
  },
  {
   "tag": "li",
   "text": "Licence: MIT (source)"
  },
  {
   "tag": "li",
   "text": "Commercial use allowed: Yes."
  },
  {
   "tag": "h2",
   "text": "Settings in the table"
  },
  {
   "tag": "li",
   "text": "hp_thomas_dill2, k = 24 (hp_thomas_dill2_k24_lcFalse): alphabet hp_thomas_dill2 (2 letters, hydrophobic ACFILMVWY and polar DEGHKNPQRST (Thomas and Dill 1996)), k = 24, low-complexity k-mers kept"
  },
  {
   "tag": "li",
   "text": "hp_thomas_dill2, k = 27 (hp_thomas_dill2_k27_lcFalse): alphabet hp_thomas_dill2 (2 letters, hydrophobic ACFILMVWY and polar DEGHKNPQRST (Thomas and Dill 1996)), k = 27, low-complexity k-mers kept"
  },
  {
   "tag": "li",
   "text": "hp_thomas_dill2, k = 30 (hp_thomas_dill2_k30_lcFalse): alphabet hp_thomas_dill2 (2 letters, hydrophobic ACFILMVWY and polar DEGHKNPQRST (Thomas and Dill 1996)), k = 30, low-complexity k-mers kept"
  },
  {
   "tag": "li",
   "text": "hp_thomas_dill2, k = 33 (hp_thomas_dill2_k33_lcFalse): alphabet hp_thomas_dill2 (2 letters, hydrophobic ACFILMVWY and polar DEGHKNPQRST (Thomas and Dill 1996)), k = 33, low-complexity k-mers kept"
  },
  {
   "tag": "li",
   "text": "gbmr4, k = 15 (gbmr4_k15_lcFalse): alphabet gbmr4 (4 letters: ADKERNTSQ, YFLIVMCWH, G, P (Solis and Rackovsky 2000)), k = 15, low-complexity k-mers kept"
  },
  {
   "tag": "li",
   "text": "gbmr4, k = 17 (gbmr4_k17_lcFalse): alphabet gbmr4 (4 letters: ADKERNTSQ, YFLIVMCWH, G, P (Solis and Rackovsky 2000)), k = 17, low-complexity k-mers kept"
  },
  {
   "tag": "li",
   "text": "gbmr4, k = 19 (gbmr4_k19_lcFalse): alphabet gbmr4 (4 letters: ADKERNTSQ, YFLIVMCWH, G, P (Solis and Rackovsky 2000)), k = 19, low-complexity k-mers kept"
  },
  {
   "tag": "li",
   "text": "gbmr4, k = 21 (gbmr4_k21_lcFalse): alphabet gbmr4 (4 letters: ADKERNTSQ, YFLIVMCWH, G, P (Solis and Rackovsky 2000)), k = 21, low-complexity k-mers kept"
  },
  {
   "tag": "li",
   "text": "wwmj5, k = 11 (wwmj5_k11_lcFalse): alphabet wwmj5 (5 letters: CMFILVWY, ATH, GP, DE, SNQRK (Wang and Wang 1999)), k = 11, low-complexity k-mers kept"
  },
  {
   "tag": "li",
   "text": "wwmj5, k = 12 (wwmj5_k12_lcFalse): alphabet wwmj5 (5 letters: CMFILVWY, ATH, GP, DE, SNQRK (Wang and Wang 1999)), k = 12, low-complexity k-mers kept"
  },
  {
   "tag": "li",
   "text": "wwmj5, k = 14 (wwmj5_k14_lcFalse): alphabet wwmj5 (5 letters: CMFILVWY, ATH, GP, DE, SNQRK (Wang and Wang 1999)), k = 14, low-complexity k-mers kept"
  },
  {
   "tag": "li",
   "text": "wwmj5, k = 15 (wwmj5_k15_lcFalse): alphabet wwmj5 (5 letters: CMFILVWY, ATH, GP, DE, SNQRK (Wang and Wang 1999)), k = 15, low-complexity k-mers kept"
  },
  {
   "tag": "li",
   "text": "protein20, k = 6 (protein20_k6_lcFalse): alphabet protein20 (the 20 amino acids, not reduced), k = 6, low-complexity k-mers kept"
  },
  {
   "tag": "li",
   "text": "protein20, k = 7 (protein20_k7_lcFalse): alphabet protein20 (the 20 amino acids, not reduced), k = 7, low-complexity k-mers kept"
  },
  {
   "tag": "li",
   "text": "protein20, k = 8 (protein20_k8_lcFalse): alphabet protein20 (the 20 amino acids, not reduced), k = 8, low-complexity k-mers kept"
  },
  {
   "tag": "h2",
   "text": "Version, container, command"
  },
  {
   "tag": "li",
   "text": "Version: kmerseek 0.3.1 (printed in the search log)"
  },
  {
   "tag": "li",
   "text": "Container: docker.io/olgabot/kmerseek:2026-08-24-reduced-alphabets"
  },
  {
   "tag": "pre",
   "text": "kmerseek search \\ --alphabet hp_thomas_dill2 \\ --ksize 24 \\ --query UP000005640_9606.fasta \\ --target zebrafish.hp_thomas_dill2.k24.lcfalse.kmerseek.rocksdb \\ --threshold 0.0 \\ --min-shared-kmers 2 \\ --max-query-pvalue 0.05 \\ --min-region-score 1.3"
  },
  {
   "tag": "p",
   "text": "Shown for setting hp_thomas_dill2 k24. Other settings change --alphabet and --ksize only."
  },
  {
   "tag": "p",
   "text": "Tool id kmerseek. Numbers from seanome/2024-kmerseek-analysis commit 4a4b1171."
  },
  {
   "tag": "p",
   "text": "All tool cards · this card as Markdown · as JSON"
  }
 ],
 "data": {
  "tool": "kmerseek",
  "name": "kmerseek",
  "kind": "counts shared k-mers in a reduced alphabet",
  "compares": "Short words of k letters (k-mers) shared between two proteins. First, each amino acid is replaced by a letter from a smaller alphabet, for example H for hydrophobic and P for polar. Two proteins can then match where their residues differ but their pattern of residue types is the same.",
  "needs": {
   "sequence only": true,
   "3D structure prediction": false,
   "GPU": false
  },
  "reference": "An index of the relative's proteome (Quest for Orthologs reference proteomes, release 2020_04), built once per alphabet and k-mer length.",
  "score": "region_enrichment: the number of k-mers the region shares with the target divided by the number expected by chance (fold enrichment). Higher ranks first. A region was kept when either test passed: its own score was at least 1.3, or the whole query protein's p-value was at most 0.05.",
  "failure_modes": [
   "A feature shorter than k residues contains no complete k-mer, so it cannot be found. Figure 2 above shows how Fmax changes with region length.",
   "The task script records a kmerseek search that exits with an error as a search with no hits, so a crash would look like a miss. How often that happened in this run: not measured.",
   "Setting hp_thomas_dill2 k33 was scored, but no trace row holds its search task, so its cost is not measured, and the scoring task for it was not found either."
  ],
  "version": "kmerseek 0.3.1 (printed in the search log)",
  "licence": "MIT",
  "commercial_use": "Yes.",
  "licence_url": "https://github.com/seanome/kmerseek",
  "container": "docker.io/olgabot/kmerseek:2026-08-24-reduced-alphabets",
  "command": "kmerseek search \\\n    --alphabet hp_thomas_dill2 \\\n    --ksize    24 \\\n    --query    UP000005640_9606.fasta \\\n    --target   zebrafish.hp_thomas_dill2.k24.lcfalse.kmerseek.rocksdb \\\n    --threshold         0.0 \\\n    --min-shared-kmers  2 \\\n    --max-query-pvalue  0.05 \\\n    --min-region-score  1.3",
  "numbers_from": {
   "repo": "seanome/2024-kmerseek-analysis",
   "commit": "4a4b11714ddb740f8a7e324058b26bee8fb35af4",
   "filters": "pfam, raw, zebrafish"
  },
  "best_setting": "gbmr4_k21_lcFalse",
  "strong": [
   {
    "axis": "feature_length_bin",
    "stratum": "16-30",
    "fmax": 0.280694003473648,
    "n": 271,
    "other_tool": "hhblits",
    "other_setting": "single_seq",
    "other_fmax": 0.06589146154089374,
    "margin": 0.21480254193275422
   },
   {
    "axis": "feature_length_bin",
    "stratum": "31-60",
    "fmax": 0.23209537155652643,
    "n": 420,
    "other_tool": "hmmer3_phmmer",
    "other_setting": "default",
    "other_fmax": 0.09545667362809032,
    "margin": 0.1366386979284361
   }
  ],
  "weak": [
   {
    "axis": "feature_length_bin",
    "stratum": "251+",
    "fmax": 0.05,
    "n": 277,
    "other_tool": "hmmer3_phmmer",
    "other_setting": "default",
    "other_fmax": 0.4770249187378286,
    "margin": -0.4270249187378286
   },
   {
    "axis": "identity",
    "stratum": "20-30%",
    "fmax": 0.0,
    "n": 93,
    "other_tool": "hmmer3_phmmer",
    "other_setting": "default",
    "other_fmax": 0.35875364786222397,
    "margin": -0.35875364786222397
   }
  ],
  "cost_per_1000_queries": {
   "core_h_reserved_per_relative": 0.0551695984561716,
   "n_relatives": 15,
   "database_build_core_h": 0.14666666666666667,
   "database_build_gpu_h": null,
   "peak_rss_gb": 5.2,
   "hardware": "Stanford Sherlock, SLURM partition hns"
  },
  "questions": [
   "Is the closest same-family domain in the relative you will search at least 40% identical, for most of your proteins? If yes, Fmax here is 40–60% 0.005 (n = 563), 60–100% 0.297 (n = 1,289). If no, 20–30% 0.000 (n = 93), 30–40% 0.000 (n = 165). (Pfam truth set, raw calls, zebrafish (430 Mya) as the relative searched, setting gbmr4, k = 21; subsets with at least 30 true instances.)",
   "Are the features you care about longer than 60 residues? If yes, Fmax here is 61–120 aa 0.208 (n = 963), 121–250 aa 0.098 (n = 504), 251 aa or more 0.050 (n = 277). If no, 16–30 aa 0.281 (n = 271), 31–60 aa 0.232 (n = 420). (Pfam truth set, raw calls, zebrafish (430 Mya) as the relative searched, setting gbmr4, k = 21.)",
   "Can you spend about 0.0552 core-hours per 1,000 proteins for each relative you search? That is the measured mean per relative; see \"Cost per 1,000 queries\" below."
  ],
  "markdown": "kmerseek.md"
 }
}
