diff --git a/analysis/calibration_truth/repeat_call_truth/accessions.tsv b/analysis/calibration_truth/repeat_call_truth/accessions.tsv new file mode 100644 index 0000000..cf18d0f --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/accessions.tsv @@ -0,0 +1,156 @@ +accession +E9P9G2 +P32323 +P32781 +P32768 +P36170 +P08640 +P38894 +P39712 +P20840 +Q12140 +P40442 +Q05164 +Q6B2U8 +Q12127 +P47001 +P53301 +P29029 +P28319 +P43497 +P38248 +P23776 +P38993 +Q04433 +P22146 +P41809 +P32478 +P39005 +P36027 +P32334 +Q03178 +P54867 +P53616 +P32623 +P53832 +P32329 +P47178 +P47179 +P42835 +Q01589 +P10863 +P40552 +Q12218 +Q04739 +P22943 +Q03125 +P38082 +P40505 +Q12507 +Q5A8T4 +Q59L12 +A0A1D8PQB9 +Q5A8T7 +Q5A2Z7 +Q5A312 +A0A1D8PQ86 +G1UBC2 +P46593 +Q59PF9 +Q5AL03 +Q5AAL9 +P0CU38 +A0A1D8PIY8 +Q59XA7 +Q5A849 +Q5A7R7 +Q5A029 +Q5A1E0 +Q59XL0 +Q59XB0 +Q5A6U1 +Q5ACL7 +Q5A5M7 +Q59TP1 +Q59RR0 +Q59WH0 +Q5AMT2 +Q59WG7 +Q5AA40 +A0A1D8PMH9 +Q5AFI4 +Q59Y20 +A0A1D8PCY4 +Q5AIR7 +Q59RW5 +Q59XX2 +Q5AAN7 +P43076 +P87020 +Q59UT4 +Q5A4X3 +P0CY27 +Q5A651 +P0DJ06 +P0CY29 +Q59SU1 +Q59NP5 +Q5AJC0 +P29717 +Q59Y31 +O94072 +Q59ZB1 +A0A1D8PP43 +Q59Z29 +Q5A4F3 +P83774 +Q59U10 +P53705 +P39827 +Q9Y7W4 +Q59QH2 +A0A1D8PK00 +P53698 +A0A1D8PR83 +G1UB67 +Q59X67 +A0A1D8PQU2 +Q59XU9 +P82612 +A0A1D8PE35 +Q5A6N7 +A0A1D8PN26 +A0A1D8PKY7 +Q59SR6 +P82610 +Q00310 +P46592 +A0A1D8PD52 +A0A1D8PE87 +A0A1D8PRI0 +A0A1D8PCV9 +Q59UQ8 +O74189 +A0A1D8PIK2 +Q59XU5 +Q5AMQ6 +Q5A7M9 +Q5A287 +Q5AK51 +Q5ANF0 +Q5AQ36 +O59923 +A0A1D8PE53 +A0A1D8PJZ6 +A0A1D8PT45 +Q59Q34 +A0A1D8PTB4 +Q59UR3 +Q5ADM7 +Q5ANJ4 +A0A1D8PHU1 +P0CY34 +P13649 +Q5AH00 +Q5AP80 +Q5A2J7 diff --git a/analysis/calibration_truth/repeat_call_truth/build_truth.py b/analysis/calibration_truth/repeat_call_truth/build_truth.py new file mode 100644 index 0000000..623fe31 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/build_truth.py @@ -0,0 +1,156 @@ +#!/usr/bin/env python3 +"""Build per-species truth tables for the call `tandem_repeat_protein` ("has a tandem repeat region"). + +Input: repeat_truth_candidates.tsv (label 1, 0 or empty per curated protein; see make_candidates.py) +and the proteome FASTA of each run (to cluster the truth proteins at 30% identity, coverage 0.5, as +analysis/calibration_truth/c1_truth_count.py does). Output per species: truth..tsv with the +columns id, label, cluster (what `cellsurface_sorting_hat_calibrate truth` reads) and +truth..annotated.tsv with the basis of each label. + +Labels: 1 = paper statement or at least two UniProt Repeat features. 0 = no UniProt Repeat feature +(absence of annotation, so an ASSUMED negative: UniProt lacks features for some repeat proteins). +Proteins with one feature, a family-inference-only claim, or no record are left out. A protein with +several curated rows gets one row; evidence of a repeat beats an assumed negative. + +Usage: build_truth.py --candidates FILE --fasta Scer_S288C=PATH --fasta Calb_SC5314=PATH --out DIR +Needs `mmseqs` on PATH (module load MMseqs2/17-b804f). +""" + +import argparse +import csv +import subprocess +import sys +import tempfile +from pathlib import Path + + +def read_fasta(path): + seqs, name, buf = {}, None, [] + with open(path) as f: + for line in f: + line = line.rstrip() + if line.startswith(">"): + if name: + seqs[name] = "".join(buf).rstrip("*") + name, buf = line[1:].split()[0], [] + else: + buf.append(line) + if name: + seqs[name] = "".join(buf).rstrip("*") + return seqs + + +def cluster(seqs, threads=4): + """``{id: representative id}``. MMseqs2 rewrites UniProt-style IDs (sp|ACC|NAME) in its output, so + the sequences go in under neutral index IDs and the result is mapped back.""" + names = list(seqs) + with tempfile.TemporaryDirectory() as tmp: + fa = Path(tmp) / "in.faa" + with open(fa, "w") as f: + for i, k in enumerate(names): + f.write(f">s{i}\n{seqs[k]}\n") + subprocess.run( + [ + "mmseqs", + "easy-cluster", + str(fa), + f"{tmp}/clu", + f"{tmp}/tmp", + "--min-seq-id", + "0.3", + "-c", + "0.5", + "-v", + "1", + "--threads", + str(threads), + ], + check=True, + capture_output=True, + ) + rep = {} + for line in open(f"{tmp}/clu_cluster.tsv"): + a, b = line.rstrip("\n").split("\t") + rep[names[int(b[1:])]] = names[int(a[1:])] + return rep + + +def main(): + ap = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + ap.add_argument("--candidates", required=True) + ap.add_argument("--fasta", action="append", required=True, help="PROTEOME=PATH, repeatable") + ap.add_argument("--out", required=True) + a = ap.parse_args() + rows = list(csv.DictReader(open(a.candidates), delimiter="\t")) + out = Path(a.out) + out.mkdir(parents=True, exist_ok=True) + for spec in a.fasta: + prot, path = spec.split("=", 1) + seqs = read_fasta(path) + keep = [r for r in rows if r["proteome"] == prot and r["label"] in ("0", "1")] + # one row per protein: two curated accessions can map to one protein. Evidence of a repeat + # (label 1) beats an assumed negative (label 0, which is only an absent annotation). + by = {} + for r in keep: + by.setdefault(r["protein"], []).append(r) + keep = [] + for k, v in by.items(): + pos = [x for x in v if x["label"] == "1"] + if pos and len(pos) < len(v): + print( + f"{prot}: {k}: a positive claim overrides {len(v) - len(pos)} assumed negative(s)", + file=sys.stderr, + ) + keep.append((pos or v)[0]) + missing = [r["protein"] for r in keep if r["protein"] not in seqs] + if missing: + raise SystemExit(f"{prot}: {len(missing)} proteins not in the FASTA, e.g. {missing[0]}") + rep = cluster({r["protein"]: seqs[r["protein"]] for r in keep}) + with open(out / f"truth.{prot}.tsv", "w", newline="") as f: + w = csv.writer(f, delimiter="\t", lineterminator="\n") + w.writerow(["id", "label", "cluster"]) + for r in keep: + w.writerow([r["protein"], r["label"], rep[r["protein"]]]) + with open(out / f"truth.{prot}.annotated.tsv", "w", newline="") as f: + w = csv.writer(f, delimiter="\t", lineterminator="\n") + w.writerow( + [ + "id", + "gene", + "accession", + "label", + "cluster", + "basis", + "curated_class", + "evidence", + "tuned_or_homolog", + ] + ) + for r in keep: + w.writerow( + [ + r["protein"], + r["gene"], + r["accession"], + r["label"], + rep[r["protein"]], + r["basis"], + r["curated_class"], + r["evidence"], + r["tuned_or_homolog"], + ] + ) + pos = [r for r in keep if r["label"] == "1"] + neg = [r for r in keep if r["label"] == "0"] + print( + f"{prot}: {len(pos)} positives in {len({rep[r['protein']] for r in pos})} clusters; " + f"{len(neg)} negatives in {len({rep[r['protein']] for r in neg})} clusters", + file=sys.stderr, + ) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/analysis/calibration_truth/repeat_call_truth/build_truth_v3.py b/analysis/calibration_truth/repeat_call_truth/build_truth_v3.py new file mode 100644 index 0000000..a4dec9d --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/build_truth_v3.py @@ -0,0 +1,228 @@ +#!/usr/bin/env python3 +"""Truth set for the repeat call under the owner's definition of 2026-10-08. + +`tandem_repeat_protein` means a repeating motif or array as in FLO11. A repeating DOMAIN counts only if it +is a known domain associated with adhesion (owner's examples: Ser/Thr-rich tandem repeats, the Thr-rich +functional amyloid core, Hwp1 repeats, Iff/Hyr repeats). + +Labels from the UniProt `Repeat` features of each entry (a feature description is a number such as "1" or +"2-5", a family name such as "ALS 3", or a domain name such as "WD 4"): + array feature : unnamed/numbered, or a name on ADHESION_FAMILIES (ALS, PIR, HYR, IFF, HWP, FLO, ...) + domain feature : a name on GLOBULAR_DOMAINS (WD, LRR, BNR, Sel1, PbH, CXXCXGXG, ANK, TPR, ...) + other named : any other name (kept out of both classes) +Positive = at least 2 array features. Negative = no Repeat feature at all and no Region, Compositional bias +or Domain feature that mentions "repeat" (an ASSUMED negative: an absent annotation). A protein whose only +repeats are globular domains, or whose names are unknown, is left out: it is neither positive nor negative. +Paper statements from the adjudicated curation table are positive. Evidence of a repeat beats an assumed +negative when one protein has several rows. + +Population: reviewed UniProt entries with a signal peptide (KW-0732) plus the curated adhesin-table proteins, +mapped to the run proteome by exact sequence. Clusters: MMseqs2, 30% identity, coverage 0.5. + +Usage: build_truth_v3.py --candidates repeat_truth_candidates.tsv --fasta PROT=PATH ... --out DIR +Needs `mmseqs` on PATH. UniProt is queried live. +""" + +import argparse +import csv +import datetime +import json +import re +import sys +import urllib.parse +import urllib.request +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from build_truth import cluster, read_fasta # noqa: E402 + +TAXA = {"Scer_S288C": 559292, "Calb_SC5314": 237561} +ADHESION_FAMILIES = re.compile( + r"^(ALS|PIR|HYR|IFF|HWP|HPF|FLO|EPA|AWP|SRP|GLEYA|FLOCCULIN|CWP|PGA)", re.I +) +GLOBULAR_DOMAINS = re.compile( + r"^(WD|LRR|BNR|SEL1?|PBH\d?|CXXCXGXG|ANK|TPR|HEAT|ARM|KELCH|RCC\d?|EF-HAND|PPR|NHL|PQQ|RLD|TIM|CBS|ZF|ZINC)\b", + re.I, +) + + +def kind(description): + """'array' | 'domain' | 'other' for one Repeat feature description.""" + d = re.sub(r";.*$", "", description.strip()) # drop '; approximate' and '; truncated' + name = re.sub(r"[\d\s\-]+$", "", d).strip() + if not name: + return "array" # numbered only, as in "1", "2-5" + if GLOBULAR_DOMAINS.match(name): + return "domain" + if ADHESION_FAMILIES.match(name): + return "array" + return "other" + + +def fetch_by_query(query): + url = "https://rest.uniprot.org/uniprotkb/stream?format=json&query=" + urllib.parse.quote(query) + with urllib.request.urlopen(url, timeout=300) as resp: + release = resp.headers.get("X-UniProt-Release", "") + return json.load(resp)["results"], release + + +def fetch_accessions(accs, batch=40): + out = [] + for i in range(0, len(accs), batch): + q = " OR ".join(f"accession:{a}" for a in accs[i : i + batch]) + out += fetch_by_query(q)[0] + return out + + +def summarize(entry): + feats = entry.get("features", []) + kinds = [kind(f.get("description", "")) for f in feats if f["type"] == "Repeat"] + mention = sum( + 1 + for f in feats + if f["type"] in ("Region", "Compositional bias", "Domain", "Motif") + and re.search("repeat", f.get("description", ""), re.I) + ) + return kinds.count("array"), kinds.count("domain"), kinds.count("other"), mention + + +def label_of(n_arr, n_dom, n_oth, mention): + if n_arr >= 2: + return "1", "UniProt >=2 array-type repeat features" + if n_arr == 0 and n_dom == 0 and n_oth == 0 and mention == 0: + return "0", "no UniProt repeat feature (assumed negative)" + if n_arr == 0 and n_dom > 0 and n_oth == 0: + return "", "only globular repeat domains (excluded)" + return "", "ambiguous repeat annotation (excluded)" + + +def main(): + ap = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + ap.add_argument("--candidates", required=True) + ap.add_argument("--fasta", action="append", required=True) + ap.add_argument("--out", required=True) + a = ap.parse_args() + cur = list(csv.DictReader(open(a.candidates), delimiter="\t")) + out = Path(a.out) + for spec in a.fasta: + prot, path = spec.split("=", 1) + seqs = read_fasta(path) + by_seq = {} + for k, s in seqs.items(): + by_seq.setdefault(s, []).append(k) + entries, release = fetch_by_query( + f"organism_id:{TAXA[prot]} AND reviewed:true AND keyword:KW-0732" + ) + accs = sorted({r["accession"] for r in cur if r["proteome"] == prot and r["accession"]}) + have = {e["primaryAccession"] for e in entries} + entries += fetch_accessions([x for x in accs if x not in have]) + rows, skipped = {}, {"no exact match": 0, "several matches": 0, "left out": 0} + why_out = {} + for e in entries: + hits = by_seq.get(e["sequence"]["value"], []) + if not hits: + skipped["no exact match"] += 1 + continue + if len(hits) > 1: + skipped["several matches"] += 1 + continue + lab, why = label_of(*summarize(e)) + if lab == "": + skipped["left out"] += 1 + why_out[why] = why_out.get(why, 0) + 1 + continue + gene = (e.get("genes") or [{}])[0].get("geneName", {}).get("value", "") + row = { + "protein": hits[0], + "gene": gene, + "accession": e["primaryAccession"], + "label": lab, + "basis": why, + "curated_class": "uniprot", + "evidence": "-", + "tuned_or_homolog": "unknown", + } + old = rows.get(hits[0]) + if old is None or (lab == "1" and old["label"] == "0"): + rows[hits[0]] = row + n_uni = len(rows) + by_acc = {e["primaryAccession"]: e for e in entries} + for r in cur: # curated proteins keep the protein ID of the curated table (their sequence can differ slightly from UniProt) + if r["proteome"] != prot or not r["accession"]: + continue + e = by_acc.get(r["accession"]) + base = { + k: r[k] + for k in ( + "protein", + "gene", + "accession", + "curated_class", + "evidence", + "tuned_or_homolog", + ) + } + if r["basis"] == "paper statement" and r["label"] == "1": + new = {**base, "label": "1", "basis": "paper statement"} + elif e is not None: + lab, why = label_of(*summarize(e)) + if lab == "": + rows.pop(r["protein"], None) + continue + new = {**base, "label": lab, "basis": why} + else: + continue + old = rows.get(r["protein"]) + if old is None or new["label"] == "1" or old["label"] != "1": + rows[r["protein"]] = new + keep = list(rows.values()) + rep = cluster({r["protein"]: seqs[r["protein"]] for r in keep}) + with open(out / f"truth_v3.{prot}.tsv", "w", newline="") as f: + w = csv.writer(f, delimiter="\t", lineterminator="\n") + w.writerow(["id", "label", "cluster"]) + for r in keep: + w.writerow([r["protein"], r["label"], rep[r["protein"]]]) + with open(out / f"truth_v3.{prot}.annotated.tsv", "w", newline="") as f: + w = csv.writer(f, delimiter="\t", lineterminator="\n") + w.writerow( + [ + "id", + "gene", + "accession", + "label", + "cluster", + "basis", + "curated_class", + "evidence", + "tuned_or_homolog", + ] + ) + for r in keep: + w.writerow( + [ + r["id"] if "id" in r else r["protein"], + r["gene"], + r["accession"], + r["label"], + rep[r["protein"]], + r["basis"], + r["curated_class"], + r["evidence"], + r["tuned_or_homolog"], + ] + ) + pos = [r for r in keep if r["label"] == "1"] + neg = [r for r in keep if r["label"] == "0"] + print( + f"{prot}: UniProt release {release} fetched {datetime.date.today()}: {len(entries)} entries, {n_uni} labelled, skipped {skipped} {why_out}; " + f"truth_v3 {len(pos)} positives in {len({rep[r['protein']] for r in pos})} clusters, " + f"{len(neg)} negatives in {len({rep[r['protein']] for r in neg})} clusters", + file=sys.stderr, + ) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/analysis/calibration_truth/repeat_call_truth/curated_rows_mapped.tsv b/analysis/calibration_truth/repeat_call_truth/curated_rows_mapped.tsv new file mode 100644 index 0000000..957f521 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/curated_rows_mapped.tsv @@ -0,0 +1,177 @@ +proteome protein gene accession cls evidence tuned_or_homolog signal_peptide_protein[R0] tandem_repeat_protein wall_family_domain cell_wall_adhesion_candidate[R0] +Afum_Af293_UniProt tr|Q4WXJ1|Q4WXJ1_ASPFU Q4WXJ1 adhesin E1 yes called not_called not_called not_called +Afum_Af293_UniProt tr|Q4WXC4|Q4WXC4_ASPFU Q4WXC4 adhesin E2 no called called not_called called +Afum_Af293_UniProt sp|P41746|RODA_ASPFU rodA P41746 adhesin E2 yes called not_called not_called not_called +Afum_Af293_UniProt tr|Q4WG20|Q4WG20_ASPFU Q4WG20 adhesin E3 no not_called not_called not_called not_called +Afum_Af293_UniProt tr|Q4WLX2|Q4WLX2_ASPFU Q4WLX2 adhesin E3 no not_called not_called not_called not_called +Afum_Af293_UniProt sp|E9QT94|RODB_ASPFU rodB E9QT94 adhesin E3 yes called not_called not_called not_called +Afum_Af293_UniProt sp|Q4WZB4|ABR1_ASPFU abr1 Q4WZB4 hard_negative N1 no called not_called not_called not_called +Afum_Af293_UniProt sp|E9RBR0|ABR2_ASPFU abr2 E9RBR0 hard_negative N1 no called not_called not_called not_called +Afum_Af293_UniProt sp|Q4WL79|BGLH_ASPFU bglH Q4WL79 hard_negative N1 no not_called not_called not_called not_called +Afum_Af293_UniProt sp|Q4WU49|BGLI_ASPFU bglI Q4WU49 hard_negative N1 no not_called not_called not_called not_called +Afum_Af293_UniProt sp|Q4WLY1|BGLJ_ASPFU bglJ Q4WLY1 hard_negative N1 no not_called not_called not_called not_called +Afum_Af293_UniProt sp|Q4WA69|BGLK_ASPFU bglK Q4WA69 hard_negative N1 no not_called not_called not_called not_called +Afum_Af293_UniProt sp|Q4WNS8|ECM33_ASPFU ecm33 Q4WNS8 hard_negative N1 no called not_called not_called not_called +Afum_Af293_UniProt sp|P0C7S9|GEL1_ASPFU gel1 P0C7S9 hard_negative N1 no called not_called not_called not_called +Afum_Af293_UniProt sp|Q4WLB9|CFMA_ASPFU cfmA Q4WLB9 hard_negative N2 no called not_called not_called not_called +Afum_Af293_UniProt sp|Q4WNE1|CFMC_ASPFU cfmC Q4WNE1 hard_negative N2 no called not_called not_called not_called +Afum_Af293_UniProt tr|Q4X0J5|Q4X0J5_ASPFU Q4X0J5 indirect_regulator - no not_called not_called not_called not_called +Afum_Af293_UniProt sp|Q4WW81|LECF_ASPFU fleA Q4WW81 indirect_regulator - no not_called not_called not_called not_called +Afum_Af293_UniProt sp|Q4WM22|SITA_ASPFU sitA Q4WM22 indirect_regulator - no not_called not_called not_called not_called +Scer_S288C YIR019C FLO11 E9P9G2 adhesin E1 yes called not_called not_called not_called +Scer_S288C YNR044W AGA1 P32323 adhesin E1 no called not_called not_called not_called +Scer_S288C YGL032C AGA2 P32781 adhesin E1 no called not_called not_called not_called +Scer_S288C YAR050W FLO1 P32768 adhesin E1 yes called called called called +Scer_S288C YKR102W FLO10 P36170 adhesin E1 yes called called called called +Scer_S288C YIR019C FLO11 P08640 adhesin E1 yes called not_called not_called not_called +Scer_S288C YHR211W FLO5 P38894 adhesin E1 yes called called called called +Scer_S288C YAL063C FLO9 P39712 adhesin E1 yes called called called called +Scer_S288C YJR004C SAG1 P20840 adhesin E1 no called not_called not_called not_called +Scer_S288C YDL037C BSC1 Q12140 adhesin E3 no not_called called not_called not_called +Scer_S288C YIL169C CSS1 P40442 adhesin E3 no called not_called not_called not_called +Scer_S288C YOL155C HPF1 Q05164 adhesin E3 no called not_called not_called not_called +Scer_S288C YAL064C-A TDA8 Q6B2U8 adhesin E3 no not_called not_called not_called not_called +Scer_S288C YLR110C CCW12 Q12127 surface_other_adhesion_phenotype - no called not_called not_called not_called +Scer_S288C YJL158C CIS3 P47001 hard_negative N1 no called not_called not_called not_called +Scer_S288C YGR189C CRH1 P53301 hard_negative N1 no called not_called not_called not_called +Scer_S288C YLR286C CTS1 P29029 hard_negative N1 yes called not_called not_called not_called +Scer_S288C YKL096W CWP1 P28319 hard_negative N1 no called not_called not_called not_called +Scer_S288C YKL096W-A CWP2 P43497 hard_negative N1 no called not_called not_called not_called +Scer_S288C YBR078W ECM33 P38248 hard_negative N1 no called not_called not_called not_called +Scer_S288C YLR300W EXG1 P23776 hard_negative N1 no called not_called not_called not_called +Scer_S288C YMR058W FET3 P38993 hard_negative N1 no called not_called not_called not_called +Scer_S288C YDR534C FIT1 Q04433 hard_negative N1 no called called not_called called +Scer_S288C YMR307W GAS1 P22146 hard_negative N1 no called not_called not_called not_called +Scer_S288C YDR420W HKR1 P41809 hard_negative N1 no called not_called not_called not_called +Scer_S288C YJL159W HSP150 P32478 hard_negative N1 no called called not_called called +Scer_S288C YJL174W KRE9 P39005 hard_negative N1 no called not_called not_called not_called +Scer_S288C YLR332W MID2 P36027 hard_negative N1 no called not_called not_called not_called +Scer_S288C YGR014W MSB2 P32334 hard_negative N1 no called not_called not_called not_called +Scer_S288C YKL164C PIR1 Q03178 hard_negative N1 no called called not_called called +Scer_S288C YOR008C SLG1 P54867 hard_negative N1 no called not_called not_called not_called +Scer_S288C YNL066W SUN4 P53616 hard_negative N1 no called not_called not_called not_called +Scer_S288C YEL040W UTR2 P32623 hard_negative N1 no called not_called not_called not_called +Scer_S288C YNL283C WSC2 P53832 hard_negative N1 no called not_called not_called not_called +Scer_S288C YLR120C YPS1 P32329 hard_negative N1 no not_called not_called not_called not_called +Scer_S288C YJR150C DAN1 P47178 hard_negative N2 no called not_called not_called not_called +Scer_S288C YJR151C DAN4 P47179 hard_negative N2 no called not_called not_called not_called +Scer_S288C YNL327W EGT2 P42835 hard_negative N2 no called not_called not_called not_called +Scer_S288C YDR077W SED1 Q01589 hard_negative N2 no called not_called not_called not_called +Scer_S288C YER011W TIR1 P10863 hard_negative N2 no called called not_called called +Scer_S288C YIL011W TIR3 P40552 hard_negative N2 no called not_called not_called not_called +Scer_S288C YOR009W TIR4 Q12218 hard_negative N2 no called called not_called called +Scer_S288C YER027C GAL83 Q04739 indirect_regulator - no not_called not_called not_called not_called +Scer_S288C YFL014W HSP12 P22943 indirect_regulator - no not_called not_called not_called not_called +Scer_S288C YDR043C NRG1 Q03125 indirect_regulator - no not_called not_called not_called not_called +Scer_S288C YBR066C NRG2 P38082 indirect_regulator - no not_called not_called not_called not_called +Scer_S288C YIL084C SDS3 P40505 indirect_regulator - no not_called not_called not_called not_called +Scer_S288C YOR315W SFG1 Q12507 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C6_03700W_A ALS1 Q5A8T4 adhesin E1 yes called called not_called called +Calb_SC5314 CR_07070C_A ALS3 Q59L12 adhesin E1 yes called called not_called called +Calb_SC5314 C6_04130C_A ALS4 A0A1D8PQB9 adhesin E1 yes called called not_called called +Calb_SC5314 C6_03690W_A ALS5 Q5A8T7 adhesin E1 yes called not_called not_called not_called +Calb_SC5314 C3_06190C_A ALS6 Q5A2Z7 adhesin E1 yes called not_called not_called not_called +Calb_SC5314 C3_06320W_A ALS7 Q5A312 adhesin E1 yes called not_called not_called not_called +Calb_SC5314 C6_03710W_A ALS9 A0A1D8PQ86 adhesin E1 yes called called not_called called +Calb_SC5314 C2_09530W_A EAP1 G1UBC2 adhesin E1 no called not_called not_called not_called +Calb_SC5314 C4_03570W_A HWP1 P46593 adhesin E1 yes called not_called not_called not_called +Calb_SC5314 C4_03510C_A HWP2 Q59PF9 adhesin E1 no called not_called not_called not_called +Calb_SC5314 C1_13450W_A HYR1 Q5AL03 adhesin E1 yes called not_called not_called not_called +Calb_SC5314 CR_00610W_A IFF4 Q5AAL9 adhesin E1 yes called not_called not_called not_called +Calb_SC5314 C6_04380W_A ALS2 P0CU38 adhesin E2 yes called called not_called called +Calb_SC5314 C3_00580W_A FLO9 A0A1D8PIY8 adhesin E2 yes called not_called not_called not_called +Calb_SC5314 C5_00730W_A HYR3 Q59XA7 adhesin E2 yes called not_called not_called not_called +Calb_SC5314 CR_00760C_A HYR4 Q5A849 adhesin E2 yes called not_called not_called not_called +Calb_SC5314 C3_00600W_A IFF11 Q5A7R7 adhesin E2 yes not_called not_called not_called not_called +Calb_SC5314 CR_03630W_A IFF3 Q5A029 adhesin E2 yes called not_called not_called not_called +Calb_SC5314 C4_06550C_A IFF5 Q5A1E0 adhesin E2 yes called not_called not_called not_called +Calb_SC5314 C2_09130C_A IFF6 Q59XL0 adhesin E2 yes called not_called not_called not_called +Calb_SC5314 C5_00710W_A IFF8 Q59XB0 adhesin E2 yes called not_called not_called not_called +Calb_SC5314 CR_03880W_A IFF9 Q5A6U1 adhesin E2 yes called not_called not_called not_called +Calb_SC5314 CR_10480W_A PGA1 Q5ACL7 adhesin E2 no called not_called not_called not_called +Calb_SC5314 C7_03290C_A RBR3 Q5A5M7 adhesin E2 no called not_called not_called not_called +Calb_SC5314 C4_03520C_A RBT1 Q59TP1 adhesin E2 no called not_called not_called not_called +Calb_SC5314 CR_07440W_A ACE2 Q59RR0 surface_other_adhesion_phenotype - no not_called not_called not_called not_called +Calb_SC5314 C1_10860C_A ADA2 Q59WH0 surface_other_adhesion_phenotype - no not_called not_called not_called not_called +Calb_SC5314 C4_02250C_A BGL2 Q5AMT2 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C1_10830W_A BIG1 Q59WG7 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C1_06010W_A CHS7 Q5AA40 surface_other_adhesion_phenotype - no not_called not_called not_called not_called +Calb_SC5314 C4_06100W_A CWH41 A0A1D8PMH9 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C7_00360W_A DFI1 Q5AFI4 surface_other_adhesion_phenotype - no not_called not_called not_called not_called +Calb_SC5314 C2_08490W_A DSE1 Q59Y20 surface_other_adhesion_phenotype - no not_called not_called not_called not_called +Calb_SC5314 C1_03190C_A ECM33 A0A1D8PCY4 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C1_03680W_A ENG1 Q5AIR7 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C6_04580W_A HXK1 Q59RW5 surface_other_adhesion_phenotype - no not_called not_called not_called not_called +Calb_SC5314 C2_10030C_A MP65 Q59XX2 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C1_06370C_A PBR1 Q5AAN7 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C4_04530C_A PHR1 P43076 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C4_06980W_A PRA1 P87020 surface_other_adhesion_phenotype - yes called not_called not_called not_called +Calb_SC5314 C4_00130W_A RBT5 Q59UT4 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C5_00220W_A ROT2 Q5A4X3 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C6_03490C_A SAP1 P0CY27 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C4_04470W_A SAP10 Q5A651 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 CR_07800W_A SAP2 P0DJ06 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C3_05230W_A SAP3 P0CY29 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C3_03870C_A SAP9 Q59SU1 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C6_00820W_A SUN41 Q59NP5 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C3_01730C_A UTR2 Q5AJC0 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C1_02990C_A XOG1 P29717 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 C2_08590W_A YWP1 Q59Y31 surface_other_adhesion_phenotype - no called not_called not_called not_called +Calb_SC5314 CR_01970C_A VMA4 O94072 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C2_06970W_A AAH1 Q59ZB1 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C5_05050W_A ADH1 A0A1D8PP43 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C2_07170C_A AFT2 Q59Z29 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C3_06000W_A AHR1 Q5A4F3 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C7_01250W_A ASC1 P83774 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 CR_06440C_A BCR1 Q59U10 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C5_02470W_A BUD4 P53705 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 CR_04570C_A CDC10 P39827 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C2_04930C_A CRK1 Q9Y7W4 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C1_04020C_A CSH1 Q59QH2 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C3_04390W_A CUP5 A0A1D8PK00 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C2_10110W_A CYC1 P53698 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C7_03070C_A CYR1 A0A1D8PR83 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 CR_09880W_A DEF1 G1UB67 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 CR_07890W_A EFG1 Q59X67 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C7_01360C_A FMP28 A0A1D8PQU2 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C2_10240W_A GPD1 Q59XU9 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C2_03270W_A GPM1 P82612 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C1_07680W_A HAP2 A0A1D8PE35 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 CR_04290W_A HAP31 Q5A6N7 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C5_00940C_A HAP5 A0A1D8PN26 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C4_00140C_A HIS4 A0A1D8PKY7 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C3_03660W_A IRS4 Q59SR6 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 CR_01620C_A MET6 P82610 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C3_01810C_A MNT1 Q00310 indirect_regulator - no called not_called not_called not_called +Calb_SC5314 C3_01830C_A MNT2 P46592 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C1_03710C_A MSB1 A0A1D8PD52 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C1_08300W_A NOT5 A0A1D8PE87 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C7_04040C_A NPT1 A0A1D8PRI0 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C1_02840W_A PDE2 A0A1D8PCV9 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C4_00350W_A PEP7 Q59UQ8 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C7_02890C_A PMT1 O74189 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C2_10080W_A RAP1 A0A1D8PIK2 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C2_10210C_A RAS1 Q59XU5 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C4_02030W_A RFX2 Q5AMQ6 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C3_00320W_A RHR2 Q5A7M9 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 CR_05990C_A SFL1 Q5A287 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C5_04830W_A SFL2 Q5AK51 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C3_04860W_A SFP1 Q5ANF0 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C1_09140C_A SHO1 Q5AQ36 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C2_01330C_A SIR2 O59923 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C1_07870C_A SMI1 A0A1D8PE53 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C3_04290C_A SNF5 A0A1D8PJZ6 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 CR_06000W_A SOK1 A0A1D8PT45 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C2_06540C_A SPF1 Q59Q34 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 CR_06610W_A STE2 A0A1D8PTB4 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C4_00300C_A SWI1 Q59UR3 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C3_06870W_A TDH3 Q5ADM7 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C3_04530C_A TEC1 Q5ANJ4 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C2_07210C_A TPK2 A0A1D8PHU1 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C1_00060W_A TUP1 P0CY34 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C3_01350C_A URA3 P13649 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C7_01820C_A VMA11 Q5AH00 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C1_10150W_A WOR1 Q5AP80 indirect_regulator - no not_called not_called not_called not_called +Calb_SC5314 C2_07730W_A YVC1 Q5A2J7 indirect_regulator - no not_called not_called not_called not_called +Cimm_RS XP_001240075.1 A0A0E1RVD3 adhesin E3 yes called not_called not_called not_called +Cimm_RS XP_001249024.1 CTS1 Q1E3R8 hard_negative N1 yes called not_called not_called not_called diff --git a/analysis/calibration_truth/repeat_call_truth/detector14_stopping_points.py b/analysis/calibration_truth/repeat_call_truth/detector14_stopping_points.py new file mode 100644 index 0000000..21bc375 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/detector14_stopping_points.py @@ -0,0 +1,142 @@ +#!/usr/bin/env python3 +"""Where does detector 14 stop for the truth positives that it misses? (diagnosis only) + +For each truth positive that the combined repeat call misses, run the stages of +analysis/cocci_repeats/14_repeat_detect_general.py directly: the best period, its sequence-level +z-score (gate Z_MIN) and composition-corrected score (gate MIN_SCORE), and the region that +periodic_region() extracts at the default cut. Compare the region with the span of the UniProt +`Repeat` features. Nothing is changed or written except the output table. + +Usage: detector14_stopping_points.py --detector FILE --work WORKDIR_ROOT --truth DIR --prefix truth_v2 --out FILE +""" + +import argparse +import csv +import importlib.util +import json +import sys +import urllib.request + +SPECIES = ("Scer_S288C", "Calb_SC5314") + + +def load(path): + spec = importlib.util.spec_from_file_location("detector14", path) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + return mod + + +def fasta(path): + seqs, name, buf = {}, None, [] + for line in open(path): + line = line.rstrip() + if line.startswith(">"): + if name: + seqs[name] = "".join(buf).rstrip("*") + name, buf = line[1:].split()[0], [] + else: + buf.append(line) + if name: + seqs[name] = "".join(buf).rstrip("*") + return seqs + + +def uniprot_span(acc): + d = json.load( + urllib.request.urlopen(f"https://rest.uniprot.org/uniprotkb/{acc}.json", timeout=60) + ) + reps = [ + (f["location"]["start"]["value"], f["location"]["end"]["value"]) + for f in d["features"] + if f["type"] == "Repeat" + ] + return len(reps), (max(b for _, b in reps) - min(a for a, _ in reps) + 1) / d["sequence"][ + "length" + ] + + +def called(row): + return ( + bool(row) + and int(row["rep_period"]) > 0 + and float(row["rep_coverage"]) >= 0.25 + and float(row["rep_n_copies"]) >= 2.5 + ) + + +def main(): + ap = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + ap.add_argument("--detector", required=True) + ap.add_argument("--work", required=True) + ap.add_argument("--truth", required=True) + ap.add_argument("--prefix", default="truth_v2") + ap.add_argument("--out", required=True) + a = ap.parse_args() + d = load(a.detector) + out = [] + for prot in SPECIES: + seqs = fasta(f"{a.work}/{prot}.faa") + r02 = { + r["protein"]: r + for r in csv.DictReader( + open(f"{a.work}/{prot}/raw/repeats/repeat02.tsv"), delimiter="\t" + ) + } + r14 = { + r["protein"]: r + for r in csv.DictReader( + open(f"{a.work}/{prot}/raw/repeats/repeat14.tsv"), delimiter="\t" + ) + } + for t in csv.DictReader(open(f"{a.truth}/{a.prefix}.{prot}.annotated.tsv"), delimiter="\t"): + if t["label"] != "1" or called(r02.get(t["id"])) or called(r14.get(t["id"])): + continue + s = seqs[t["id"]] + if len(s) < 80: + continue + idx = d.encode(s) + exp = d.expected_rate(d.background(idx), d.SIM) + scores = d.period_scan(idx, d.SIM, exp) + if not scores: + continue + raw = {q: v[1] for q, v in scores.items()} + zs = d.z_scan(raw) + p, _, _ = d.pick_period({q: (zs[q], raw[q]) for q in scores}) + sc = scores[p][0] + d.REGION_THRESHOLD = 0.5 + span = d.periodic_region(idx, p, d.SIM, exp) + n_rep, uni_frac = uniprot_span(t["accession"]) + gate = ( + "z_seq below Z_MIN" + if zs[p] < d.Z_MIN + else "score below MIN_SCORE" + if sc < d.MIN_SCORE + else "region test or coverage" + ) + out.append( + { + "proteome": prot, + "gene": t["gene"] or t["accession"], + "length": len(s), + "best_period": p, + "z_seq": f"{zs[p]:.2f}", + "score": f"{sc:.3f}", + "stops_at": gate, + "region_fraction_at_cut_0.5": f"{(span[1] - span[0]) / len(s):.2f}", + "uniprot_repeats": n_rep, + "uniprot_span_fraction": f"{uni_frac:.2f}", + } + ) + with open(a.out, "w", newline="") as f: + w = csv.DictWriter(f, fieldnames=list(out[0]), delimiter="\t", lineterminator="\n") + w.writeheader() + w.writerows(out) + print(f"{len(out)} missed positives -> {a.out}", file=sys.stderr) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/analysis/calibration_truth/repeat_call_truth/detector14_stopping_points.tsv b/analysis/calibration_truth/repeat_call_truth/detector14_stopping_points.tsv new file mode 100644 index 0000000..30944fe --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/detector14_stopping_points.tsv @@ -0,0 +1,32 @@ +proteome gene length best_period z_seq score stops_at region_fraction_at_cut_0.5 uniprot_repeats uniprot_span_fraction +Scer_S288C FLO11 1367 15 3.31 0.185 z_seq below Z_MIN 0.04 46 0.67 +Scer_S288C KRE1 313 28 3.28 0.120 z_seq below Z_MIN 0.01 2 0.22 +Scer_S288C SAG1 650 51 2.22 0.058 z_seq below Z_MIN 0.01 2 0.13 +Scer_S288C CNE1 502 19 2.58 0.053 z_seq below Z_MIN 0.00 8 0.25 +Scer_S288C PEP1 1579 4 0.00 -0.002 z_seq below Z_MIN 0.00 10 0.72 +Scer_S288C AGA1 725 35 3.74 0.131 z_seq below Z_MIN 0.14 20 0.61 +Scer_S288C MSB2 1306 17 4.78 0.100 score below MIN_SCORE 0.06 7 0.09 +Scer_S288C VTH1 1549 4 0.00 0.002 z_seq below Z_MIN 0.00 12 0.72 +Scer_S288C VTH2 1549 4 0.00 0.001 z_seq below Z_MIN 0.00 12 0.72 +Scer_S288C HKR1 1802 14 6.07 0.167 region test or coverage 0.16 12 0.19 +Scer_S288C EGT2 1041 38 5.39 0.119 score below MIN_SCORE 0.06 9 0.49 +Scer_S288C SED1 338 51 3.69 0.178 z_seq below Z_MIN 0.14 9 0.61 +Scer_S288C HPF1 967 13 4.16 0.138 score below MIN_SCORE 0.07 18 0.84 +Scer_S288C HRD3 833 75 2.59 0.043 z_seq below Z_MIN 0.00 7 0.67 +Scer_S288C CCW12 133 15 2.86 0.145 z_seq below Z_MIN 0.04 2 0.22 +Scer_S288C SCJ1 377 9 2.25 0.045 z_seq below Z_MIN 0.01 4 0.17 +Scer_S288C DAN4 1161 24 4.35 0.186 region test or coverage 0.13 17 0.58 +Scer_S288C FMP27 2628 4 0.00 0.011 z_seq below Z_MIN 0.00 9 0.82 +Scer_S288C SPS22 463 44 2.24 0.055 z_seq below Z_MIN 0.01 5 0.43 +Scer_S288C PIR5 287 12 2.68 0.074 z_seq below Z_MIN 0.01 4 0.35 +Scer_S288C PGU1 361 18 1.93 0.043 z_seq below Z_MIN 0.01 5 0.37 +Calb_SC5314 EAP1 653 24 3.38 0.199 z_seq below Z_MIN 0.07 25 0.60 +Calb_SC5314 HWP1 634 20 4.28 0.220 region test or coverage 0.07 14 0.22 +Calb_SC5314 ALS7 1568 72 2.74 0.057 z_seq below Z_MIN 0.01 4 0.09 +Calb_SC5314 ALS5 1347 36 5.10 0.104 score below MIN_SCORE 0.05 6 0.16 +Calb_SC5314 PGA55 1404 6 2.76 0.300 z_seq below Z_MIN 0.03 88 0.52 +Calb_SC5314 PGA18 753 8 4.49 0.166 region test or coverage 0.04 24 0.41 +Calb_SC5314 ALS6 1366 36 5.44 0.083 score below MIN_SCORE 0.07 6 0.16 +Calb_SC5314 DSE1 724 29 2.30 0.038 z_seq below Z_MIN 0.00 5 0.44 +Calb_SC5314 ASC1 317 42 2.63 0.069 z_seq below Z_MIN 0.03 7 0.96 +Calb_SC5314 TUP1 512 14 2.15 0.063 z_seq below Z_MIN 0.01 7 0.61 diff --git a/analysis/calibration_truth/repeat_call_truth/detector14_stopping_points_v3.tsv b/analysis/calibration_truth/repeat_call_truth/detector14_stopping_points_v3.tsv new file mode 100644 index 0000000..61b9b29 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/detector14_stopping_points_v3.tsv @@ -0,0 +1,21 @@ +proteome gene length best_period z_seq score stops_at region_fraction_at_cut_0.5 uniprot_repeats uniprot_span_fraction +Scer_S288C FLO11 1367 15 3.31 0.185 z_seq below Z_MIN 0.04 46 0.67 +Scer_S288C KRE1 313 28 3.28 0.120 z_seq below Z_MIN 0.01 2 0.22 +Scer_S288C SAG1 650 51 2.22 0.058 z_seq below Z_MIN 0.01 2 0.13 +Scer_S288C CNE1 502 19 2.58 0.053 z_seq below Z_MIN 0.00 8 0.25 +Scer_S288C AGA1 725 35 3.74 0.131 z_seq below Z_MIN 0.14 20 0.61 +Scer_S288C MSB2 1306 17 4.78 0.100 score below MIN_SCORE 0.06 7 0.09 +Scer_S288C HKR1 1802 14 6.07 0.167 region test or coverage 0.16 12 0.19 +Scer_S288C EGT2 1041 38 5.39 0.119 score below MIN_SCORE 0.06 9 0.49 +Scer_S288C SED1 338 51 3.69 0.178 z_seq below Z_MIN 0.14 9 0.61 +Scer_S288C HPF1 967 13 4.16 0.138 score below MIN_SCORE 0.07 18 0.84 +Scer_S288C CCW12 133 15 2.86 0.145 z_seq below Z_MIN 0.04 2 0.22 +Scer_S288C DAN4 1161 24 4.35 0.186 region test or coverage 0.13 17 0.58 +Scer_S288C PIR5 287 12 2.68 0.074 z_seq below Z_MIN 0.01 4 0.35 +Calb_SC5314 EAP1 653 24 3.38 0.199 z_seq below Z_MIN 0.07 25 0.60 +Calb_SC5314 HWP1 634 20 4.28 0.220 region test or coverage 0.07 14 0.22 +Calb_SC5314 ALS7 1568 72 2.74 0.057 z_seq below Z_MIN 0.01 4 0.09 +Calb_SC5314 ALS5 1347 36 5.10 0.104 score below MIN_SCORE 0.05 6 0.16 +Calb_SC5314 PGA55 1404 6 2.76 0.300 z_seq below Z_MIN 0.03 88 0.52 +Calb_SC5314 PGA18 753 8 4.49 0.166 region test or coverage 0.04 24 0.41 +Calb_SC5314 ALS6 1366 36 5.44 0.083 score below MIN_SCORE 0.07 6 0.16 diff --git a/analysis/calibration_truth/repeat_call_truth/expand_with_uniprot_secreted.py b/analysis/calibration_truth/repeat_call_truth/expand_with_uniprot_secreted.py new file mode 100644 index 0000000..bddeb5d --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/expand_with_uniprot_secreted.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python3 +"""Widen the repeat-call truth tables with reviewed, secreted UniProt proteins of the two species. + +Population: UniProtKB reviewed entries with the keyword Signal (KW-0732) for S. cerevisiae S288C +(559292) and C. albicans SC5314 (237561). Each entry is mapped to the run proteome by an exact +sequence match (an entry whose sequence matches no protein, or several, is skipped). Label: 1 when the +entry has two or more `Repeat` features, 0 when it has none and no Region, Compositional bias or Domain +feature that mentions "repeat". Entries with one feature or a text mention are left out. +NOTE: a negative is an absent annotation, not a proof; `Repeat` features also mark repeat DOMAINS (WD40, +ankyrin) that the repeat detectors are not built to find. +The curated labels of make_candidates.py are kept; evidence of a repeat beats an assumed negative. + +Usage: expand_with_uniprot_secreted.py --candidates repeat_truth_candidates.tsv --fasta PROT=PATH ... --out DIR +Needs `mmseqs` on PATH. UniProt is queried live; the release is recorded in the output. +""" + +import argparse +import csv +import datetime +import json +import re +import sys +import urllib.parse +import urllib.request +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent)) +from build_truth import cluster, read_fasta # noqa: E402 + +TAXA = {"Scer_S288C": 559292, "Calb_SC5314": 237561, "Afum_Af293_UniProt": 330879} + + +def fetch(taxon): + query = f"organism_id:{taxon} AND reviewed:true AND keyword:KW-0732" + url = "https://rest.uniprot.org/uniprotkb/stream?format=json&query=" + urllib.parse.quote(query) + with urllib.request.urlopen(url, timeout=300) as resp: + release = resp.headers.get("X-UniProt-Release", "") + data = json.load(resp) + return data["results"], release + + +def summarize(entry): + feats = entry.get("features", []) + n_rep = sum(1 for f in feats if f["type"] == "Repeat") + mention = sum( + 1 + for f in feats + if f["type"] in ("Region", "Compositional bias", "Domain", "Motif") + and re.search("repeat", f.get("description", ""), re.I) + ) + return n_rep, mention + + +def main(): + ap = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + ap.add_argument("--candidates", required=True) + ap.add_argument("--fasta", action="append", required=True) + ap.add_argument("--out", required=True) + a = ap.parse_args() + cur = list(csv.DictReader(open(a.candidates), delimiter="\t")) + out = Path(a.out) + for spec in a.fasta: + prot, path = spec.split("=", 1) + seqs = read_fasta(path) + by_seq = {} + for k, s in seqs.items(): + by_seq.setdefault(s, []).append(k) + entries, release = fetch(TAXA[prot]) + rows, skipped = {}, {"no exact match": 0, "several matches": 0, "ambiguous label": 0} + for e in entries: + hits = by_seq.get(e["sequence"]["value"], []) + if not hits: + skipped["no exact match"] += 1 + continue + if len(hits) > 1: + skipped["several matches"] += 1 + continue + n_rep, mention = summarize(e) + if n_rep >= 2: + lab, why = "1", "UniProt reviewed, secreted, >=2 repeat features" + elif n_rep == 0 and mention == 0: + lab, why = "0", "UniProt reviewed, secreted, no repeat feature (assumed negative)" + else: + skipped["ambiguous label"] += 1 + continue + rows[hits[0]] = { + "protein": hits[0], + "gene": e.get("genes", [{}])[0].get("geneName", {}).get("value", ""), + "accession": e["primaryAccession"], + "label": lab, + "basis": why, + "curated_class": "uniprot_secreted", + "evidence": "-", + "tuned_or_homolog": "unknown", + } + n_uni = len(rows) + for r in cur: # curated labels are kept; a repeat claim beats an assumed negative + if r["proteome"] != prot or r["label"] not in ("0", "1"): + continue + old = rows.get(r["protein"]) + if old and old["label"] == "1" and r["label"] == "0": + continue + rows[r["protein"]] = { + k: r[k] + for k in ( + "protein", + "gene", + "accession", + "label", + "basis", + "curated_class", + "evidence", + "tuned_or_homolog", + ) + } + keep = list(rows.values()) + rep = cluster({r["protein"]: seqs[r["protein"]] for r in keep}) + with open(out / f"truth_v2.{prot}.tsv", "w", newline="") as f: + w = csv.writer(f, delimiter="\t", lineterminator="\n") + w.writerow(["id", "label", "cluster"]) + for r in keep: + w.writerow([r["protein"], r["label"], rep[r["protein"]]]) + with open(out / f"truth_v2.{prot}.annotated.tsv", "w", newline="") as f: + w = csv.writer(f, delimiter="\t", lineterminator="\n") + w.writerow( + [ + "id", + "gene", + "accession", + "label", + "cluster", + "basis", + "curated_class", + "evidence", + "tuned_or_homolog", + ] + ) + for r in keep: + w.writerow( + [ + r["protein"], + r["gene"], + r["accession"], + r["label"], + rep[r["protein"]], + r["basis"], + r["curated_class"], + r["evidence"], + r["tuned_or_homolog"], + ] + ) + pos = [r for r in keep if r["label"] == "1"] + neg = [r for r in keep if r["label"] == "0"] + print( + f"{prot}: UniProt release {release} fetched {datetime.date.today()}: {len(entries)} entries, " + f"{n_uni} usable, skipped {skipped}; truth_v2 {len(pos)} positives in " + f"{len({rep[r['protein']] for r in pos})} clusters, {len(neg)} negatives in " + f"{len({rep[r['protein']] for r in neg})} clusters", + file=sys.stderr, + ) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/analysis/calibration_truth/repeat_call_truth/make_candidates.py b/analysis/calibration_truth/repeat_call_truth/make_candidates.py new file mode 100644 index 0000000..bf066a2 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/make_candidates.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python3 +"""Label the curated proteins of two species for the repeat call (input of build_truth.py). + +Inputs: curated_rows_mapped.tsv (curated rows joined to run protein IDs), uniprot_repeat_features.tsv +(analysis/calibration_truth/uniprot_repeat_features.py), and the adjudicated consensus table. +Output: repeat_truth_candidates.tsv. Rules are in build_truth.py. +""" + +import csv +import sys + +D = sys.argv[1] if len(sys.argv) > 1 else "." +CONS = ( + sys.argv[2] + if len(sys.argv) > 2 + else "../../../data/controls/repeat-mechanism/adjudication/curation_table.consensus.tsv" +) +rows = list(csv.DictReader(open(f"{D}/curated_rows_mapped.tsv"), delimiter="\t")) +uni = { + r["accession"]: r + for r in csv.DictReader(open(f"{D}/uniprot_repeat_features.tsv"), delimiter="\t") +} +cons = {r["accession"]: r for r in csv.DictReader(open(CONS), delimiter="\t")} +out = [] +for r in rows: + if r["proteome"] not in ("Scer_S288C", "Calb_SC5314"): + continue + u, c = uni.get(r["accession"]), cons.get(r["accession"]) + n = int(u["n_repeat_features"]) if u else None + paper = bool(c and c["final_label"] == "2a" and c["repeat_evidence_tier"] == "stated_in_paper") + famonly = bool( + c and c["final_label"] == "2a" and c["repeat_evidence_tier"] == "family_inference" + ) + if paper or (n is not None and n >= 2): + lab, why = 1, ("paper statement" if paper else "UniProt >=2 repeat features") + elif famonly: + lab, why = "", "family inference only (excluded)" + elif n == 1: + lab, why = "", "1 UniProt repeat feature (ambiguous, excluded)" + elif n == 0: + lab, why = 0, "no UniProt repeat feature (assumed negative)" + else: + lab, why = "", "no UniProt record" + out.append( + { + "proteome": r["proteome"], + "protein": r["protein"], + "gene": r["gene"], + "accession": r["accession"], + "curated_class": r["cls"], + "evidence": r["evidence"], + "label": lab, + "basis": why, + "tuned_or_homolog": r["tuned_or_homolog"], + "repeat_call": r["tandem_repeat_protein"], + } + ) +w = csv.DictWriter( + open(f"{D}/repeat_truth_candidates.tsv", "w"), + fieldnames=list(out[0]), + delimiter="\t", + lineterminator="\n", +) +w.writeheader() +w.writerows(out) +print(len(out), "rows", file=sys.stderr) diff --git a/analysis/calibration_truth/repeat_call_truth/region_cut_scan.py b/analysis/calibration_truth/repeat_call_truth/region_cut_scan.py new file mode 100644 index 0000000..22cd166 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/region_cut_scan.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +"""Exploratory: what happens to the repeat call if detector 14 used a lower region cut? + +Loads analysis/cocci_repeats/14_repeat_detect_general.py as a library, changes REGION_THRESHOLD in memory +only, runs detect() on the truth proteins, and applies the call rule of the sorting hat (period > 0, +coverage >= 0.25, copies >= 2.5; detector 14 only, so this is a lower bound on the combined call). +Nothing on disk changes. A different cut needs a held-out truth set and the owner's decision. + +Usage: region_cut_scan.py --detector FILE --fasta PROTEOME=PATH ... --truth DIR --prefix truth_v2 --out FILE +""" + +import argparse +import csv +import importlib.util +import sys + + +def load(path): + spec = importlib.util.spec_from_file_location("detector14", path) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + return mod + + +def read_fasta(path): + seqs, name, buf = {}, None, [] + for line in open(path): + line = line.rstrip() + if line.startswith(">"): + if name: + seqs[name] = "".join(buf).rstrip("*") + name, buf = line[1:].split()[0], [] + else: + buf.append(line) + if name: + seqs[name] = "".join(buf).rstrip("*") + return seqs + + +def main(): + ap = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + ap.add_argument("--detector", required=True) + ap.add_argument("--fasta", action="append", required=True) + ap.add_argument("--truth", required=True) + ap.add_argument("--prefix", default="truth_v2") + ap.add_argument("--out", required=True) + a = ap.parse_args() + det = load(a.detector) + rows = [] + for spec in a.fasta: + prot, path = spec.split("=", 1) + seqs = read_fasta(path) + truth = list( + csv.DictReader(open(f"{a.truth}/{a.prefix}.{prot}.annotated.tsv"), delimiter="\t") + ) + for cut in (0.5, 0.4, 0.3, 0.2): + det.REGION_THRESHOLD = cut + tp = fp = fn = tn = 0 + gained, falsepos = [], [] + for t in truth: + seq = seqs[t["id"]] + r = det.detect(seq) if len(seq) >= 80 else {} + called = ( + bool(r) + and r.get("period", 0) > 0 + and r.get("coverage", 0) >= 0.25 + and r.get("n_copies", 0) >= 2.5 + ) + y = t["label"] == "1" + tp += y and called + fn += y and not called + fp += (not y) and called + tn += (not y) and not called + if called: + (gained if y else falsepos).append(t["gene"] or t["accession"]) + rows.append( + { + "proteome": prot, + "region_threshold": cut, + "positives": tp + fn, + "sensitivity_detector14_only": f"{tp / (tp + fn):.3f}", + "negatives": fp + tn, + "false_positives": fp, + "specificity": f"{tn / (fp + tn):.3f}", + "called_positives": ";".join(gained), + "called_negatives": ";".join(falsepos), + } + ) + with open(a.out, "w", newline="") as f: + w = csv.DictWriter(f, fieldnames=list(rows[0]), delimiter="\t", lineterminator="\n") + w.writeheader() + w.writerows(rows) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/analysis/calibration_truth/repeat_call_truth/region_cut_scan.tsv b/analysis/calibration_truth/repeat_call_truth/region_cut_scan.tsv new file mode 100644 index 0000000..0ef1af7 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/region_cut_scan.tsv @@ -0,0 +1,9 @@ +proteome region_threshold positives sensitivity_detector14_only negatives false_positives specificity called_positives called_negatives +Scer_S288C 0.5 31 0.323 297 3 0.990 TIR1;HSP150;FLO1;FLO10;FLO5;PIR1;PIR3;FLO9;FIT1;TIR4 P53872;MF(ALPHA)1;MF(ALPHA)2 +Scer_S288C 0.4 31 0.323 297 3 0.990 TIR1;HSP150;FLO1;FLO10;FLO5;PIR1;PIR3;FLO9;FIT1;TIR4 P53872;MF(ALPHA)1;MF(ALPHA)2 +Scer_S288C 0.3 31 0.323 297 3 0.990 TIR1;HSP150;FLO1;FLO10;FLO5;PIR1;PIR3;FLO9;FIT1;TIR4 P53872;MF(ALPHA)1;MF(ALPHA)2 +Scer_S288C 0.2 31 0.323 297 3 0.990 TIR1;HSP150;FLO1;FLO10;FLO5;PIR1;PIR3;FLO9;FIT1;TIR4 P53872;MF(ALPHA)1;MF(ALPHA)2 +Calb_SC5314 0.5 16 0.375 210 4 0.981 ALS9;ALS4;ALS3;PIR1;ALS1;ALS2 PGA13;PGA37;PGA57;PGA54 +Calb_SC5314 0.4 16 0.375 210 5 0.976 ALS9;ALS4;ALS3;PIR1;ALS1;ALS2 PGA13;PGA62;PGA37;PGA57;PGA54 +Calb_SC5314 0.3 16 0.375 210 5 0.976 ALS9;ALS4;ALS3;PIR1;ALS1;ALS2 PGA13;PGA62;PGA37;PGA57;PGA54 +Calb_SC5314 0.2 16 0.375 210 5 0.976 ALS9;ALS4;ALS3;PIR1;ALS1;ALS2 PGA13;PGA62;PGA37;PGA57;PGA54 diff --git a/analysis/calibration_truth/repeat_call_truth/repeat_truth_candidates.tsv b/analysis/calibration_truth/repeat_call_truth/repeat_truth_candidates.tsv new file mode 100644 index 0000000..65db39e --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/repeat_truth_candidates.tsv @@ -0,0 +1,156 @@ +proteome protein gene accession curated_class evidence label basis tuned_or_homolog repeat_call +Scer_S288C YIR019C FLO11 E9P9G2 adhesin E1 0 no UniProt repeat feature (assumed negative) yes not_called +Scer_S288C YNR044W AGA1 P32323 adhesin E1 1 UniProt >=2 repeat features no not_called +Scer_S288C YGL032C AGA2 P32781 adhesin E1 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YAR050W FLO1 P32768 adhesin E1 1 paper statement yes called +Scer_S288C YKR102W FLO10 P36170 adhesin E1 1 UniProt >=2 repeat features yes called +Scer_S288C YIR019C FLO11 P08640 adhesin E1 1 paper statement yes not_called +Scer_S288C YHR211W FLO5 P38894 adhesin E1 1 UniProt >=2 repeat features yes called +Scer_S288C YAL063C FLO9 P39712 adhesin E1 1 UniProt >=2 repeat features yes called +Scer_S288C YJR004C SAG1 P20840 adhesin E1 1 UniProt >=2 repeat features no not_called +Scer_S288C YDL037C BSC1 Q12140 adhesin E3 0 no UniProt repeat feature (assumed negative) no called +Scer_S288C YIL169C CSS1 P40442 adhesin E3 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YOL155C HPF1 Q05164 adhesin E3 1 UniProt >=2 repeat features no not_called +Scer_S288C YAL064C-A TDA8 Q6B2U8 adhesin E3 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YLR110C CCW12 Q12127 surface_other_adhesion_phenotype - 1 UniProt >=2 repeat features no not_called +Scer_S288C YJL158C CIS3 P47001 hard_negative N1 1 UniProt repeat feature (ambiguous, excluded) no not_called +Scer_S288C YGR189C CRH1 P53301 hard_negative N1 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YLR286C CTS1 P29029 hard_negative N1 0 no UniProt repeat feature (assumed negative) yes not_called +Scer_S288C YKL096W CWP1 P28319 hard_negative N1 1 UniProt repeat feature (ambiguous, excluded) no not_called +Scer_S288C YKL096W-A CWP2 P43497 hard_negative N1 1 UniProt repeat feature (ambiguous, excluded) no not_called +Scer_S288C YBR078W ECM33 P38248 hard_negative N1 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YLR300W EXG1 P23776 hard_negative N1 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YMR058W FET3 P38993 hard_negative N1 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YDR534C FIT1 Q04433 hard_negative N1 1 UniProt >=2 repeat features no called +Scer_S288C YMR307W GAS1 P22146 hard_negative N1 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YDR420W HKR1 P41809 hard_negative N1 1 UniProt >=2 repeat features no not_called +Scer_S288C YJL159W HSP150 P32478 hard_negative N1 1 UniProt >=2 repeat features no called +Scer_S288C YJL174W KRE9 P39005 hard_negative N1 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YLR332W MID2 P36027 hard_negative N1 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YGR014W MSB2 P32334 hard_negative N1 1 UniProt >=2 repeat features no not_called +Scer_S288C YKL164C PIR1 Q03178 hard_negative N1 1 UniProt >=2 repeat features no called +Scer_S288C YOR008C SLG1 P54867 hard_negative N1 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YNL066W SUN4 P53616 hard_negative N1 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YEL040W UTR2 P32623 hard_negative N1 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YNL283C WSC2 P53832 hard_negative N1 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YLR120C YPS1 P32329 hard_negative N1 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YJR150C DAN1 P47178 hard_negative N2 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YJR151C DAN4 P47179 hard_negative N2 1 UniProt >=2 repeat features no not_called +Scer_S288C YNL327W EGT2 P42835 hard_negative N2 1 UniProt >=2 repeat features no not_called +Scer_S288C YDR077W SED1 Q01589 hard_negative N2 1 UniProt >=2 repeat features no not_called +Scer_S288C YER011W TIR1 P10863 hard_negative N2 1 UniProt >=2 repeat features no called +Scer_S288C YIL011W TIR3 P40552 hard_negative N2 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YOR009W TIR4 Q12218 hard_negative N2 1 UniProt >=2 repeat features no called +Scer_S288C YER027C GAL83 Q04739 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YFL014W HSP12 P22943 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YDR043C NRG1 Q03125 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YBR066C NRG2 P38082 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YIL084C SDS3 P40505 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Scer_S288C YOR315W SFG1 Q12507 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C6_03700W_A ALS1 Q5A8T4 adhesin E1 1 paper statement yes called +Calb_SC5314 CR_07070C_A ALS3 Q59L12 adhesin E1 1 paper statement yes called +Calb_SC5314 C6_04130C_A ALS4 A0A1D8PQB9 adhesin E1 1 UniProt >=2 repeat features yes called +Calb_SC5314 C6_03690W_A ALS5 Q5A8T7 adhesin E1 1 UniProt >=2 repeat features yes not_called +Calb_SC5314 C3_06190C_A ALS6 Q5A2Z7 adhesin E1 1 UniProt >=2 repeat features yes not_called +Calb_SC5314 C3_06320W_A ALS7 Q5A312 adhesin E1 1 UniProt >=2 repeat features yes not_called +Calb_SC5314 C6_03710W_A ALS9 A0A1D8PQ86 adhesin E1 1 UniProt >=2 repeat features yes called +Calb_SC5314 C2_09530W_A EAP1 G1UBC2 adhesin E1 1 UniProt >=2 repeat features no not_called +Calb_SC5314 C4_03570W_A HWP1 P46593 adhesin E1 1 UniProt >=2 repeat features yes not_called +Calb_SC5314 C4_03510C_A HWP2 Q59PF9 adhesin E1 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_13450W_A HYR1 Q5AL03 adhesin E1 family inference only (excluded) yes not_called +Calb_SC5314 CR_00610W_A IFF4 Q5AAL9 adhesin E1 family inference only (excluded) yes not_called +Calb_SC5314 C6_04380W_A ALS2 P0CU38 adhesin E2 1 UniProt >=2 repeat features yes called +Calb_SC5314 C3_00580W_A FLO9 A0A1D8PIY8 adhesin E2 family inference only (excluded) yes not_called +Calb_SC5314 C5_00730W_A HYR3 Q59XA7 adhesin E2 family inference only (excluded) yes not_called +Calb_SC5314 CR_00760C_A HYR4 Q5A849 adhesin E2 family inference only (excluded) yes not_called +Calb_SC5314 C3_00600W_A IFF11 Q5A7R7 adhesin E2 family inference only (excluded) yes not_called +Calb_SC5314 CR_03630W_A IFF3 Q5A029 adhesin E2 family inference only (excluded) yes not_called +Calb_SC5314 C4_06550C_A IFF5 Q5A1E0 adhesin E2 family inference only (excluded) yes not_called +Calb_SC5314 C2_09130C_A IFF6 Q59XL0 adhesin E2 family inference only (excluded) yes not_called +Calb_SC5314 C5_00710W_A IFF8 Q59XB0 adhesin E2 family inference only (excluded) yes not_called +Calb_SC5314 CR_03880W_A IFF9 Q5A6U1 adhesin E2 family inference only (excluded) yes not_called +Calb_SC5314 CR_10480W_A PGA1 Q5ACL7 adhesin E2 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C7_03290C_A RBR3 Q5A5M7 adhesin E2 family inference only (excluded) no not_called +Calb_SC5314 C4_03520C_A RBT1 Q59TP1 adhesin E2 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 CR_07440W_A ACE2 Q59RR0 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_10860C_A ADA2 Q59WH0 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C4_02250C_A BGL2 Q5AMT2 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_10830W_A BIG1 Q59WG7 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_06010W_A CHS7 Q5AA40 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C4_06100W_A CWH41 A0A1D8PMH9 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C7_00360W_A DFI1 Q5AFI4 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C2_08490W_A DSE1 Q59Y20 surface_other_adhesion_phenotype - 1 UniProt >=2 repeat features no not_called +Calb_SC5314 C1_03190C_A ECM33 A0A1D8PCY4 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_03680W_A ENG1 Q5AIR7 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C6_04580W_A HXK1 Q59RW5 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C2_10030C_A MP65 Q59XX2 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_06370C_A PBR1 Q5AAN7 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C4_04530C_A PHR1 P43076 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C4_06980W_A PRA1 P87020 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) yes not_called +Calb_SC5314 C4_00130W_A RBT5 Q59UT4 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C5_00220W_A ROT2 Q5A4X3 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C6_03490C_A SAP1 P0CY27 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C4_04470W_A SAP10 Q5A651 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 CR_07800W_A SAP2 P0DJ06 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C3_05230W_A SAP3 P0CY29 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C3_03870C_A SAP9 Q59SU1 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C6_00820W_A SUN41 Q59NP5 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C3_01730C_A UTR2 Q5AJC0 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_02990C_A XOG1 P29717 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C2_08590W_A YWP1 Q59Y31 surface_other_adhesion_phenotype - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 CR_01970C_A VMA4 O94072 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C2_06970W_A AAH1 Q59ZB1 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C5_05050W_A ADH1 A0A1D8PP43 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C2_07170C_A AFT2 Q59Z29 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C3_06000W_A AHR1 Q5A4F3 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C7_01250W_A ASC1 P83774 indirect_regulator - 1 UniProt >=2 repeat features no not_called +Calb_SC5314 CR_06440C_A BCR1 Q59U10 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C5_02470W_A BUD4 P53705 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 CR_04570C_A CDC10 P39827 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C2_04930C_A CRK1 Q9Y7W4 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_04020C_A CSH1 Q59QH2 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C3_04390W_A CUP5 A0A1D8PK00 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C2_10110W_A CYC1 P53698 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C7_03070C_A CYR1 A0A1D8PR83 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 CR_09880W_A DEF1 G1UB67 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 CR_07890W_A EFG1 Q59X67 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C7_01360C_A FMP28 A0A1D8PQU2 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C2_10240W_A GPD1 Q59XU9 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C2_03270W_A GPM1 P82612 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_07680W_A HAP2 A0A1D8PE35 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 CR_04290W_A HAP31 Q5A6N7 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C5_00940C_A HAP5 A0A1D8PN26 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C4_00140C_A HIS4 A0A1D8PKY7 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C3_03660W_A IRS4 Q59SR6 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 CR_01620C_A MET6 P82610 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C3_01810C_A MNT1 Q00310 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C3_01830C_A MNT2 P46592 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_03710C_A MSB1 A0A1D8PD52 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_08300W_A NOT5 A0A1D8PE87 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C7_04040C_A NPT1 A0A1D8PRI0 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_02840W_A PDE2 A0A1D8PCV9 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C4_00350W_A PEP7 Q59UQ8 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C7_02890C_A PMT1 O74189 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C2_10080W_A RAP1 A0A1D8PIK2 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C2_10210C_A RAS1 Q59XU5 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C4_02030W_A RFX2 Q5AMQ6 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C3_00320W_A RHR2 Q5A7M9 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 CR_05990C_A SFL1 Q5A287 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C5_04830W_A SFL2 Q5AK51 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C3_04860W_A SFP1 Q5ANF0 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_09140C_A SHO1 Q5AQ36 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C2_01330C_A SIR2 O59923 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_07870C_A SMI1 A0A1D8PE53 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C3_04290C_A SNF5 A0A1D8PJZ6 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 CR_06000W_A SOK1 A0A1D8PT45 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C2_06540C_A SPF1 Q59Q34 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 CR_06610W_A STE2 A0A1D8PTB4 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C4_00300C_A SWI1 Q59UR3 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C3_06870W_A TDH3 Q5ADM7 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C3_04530C_A TEC1 Q5ANJ4 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C2_07210C_A TPK2 A0A1D8PHU1 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_00060W_A TUP1 P0CY34 indirect_regulator - 1 UniProt >=2 repeat features no not_called +Calb_SC5314 C3_01350C_A URA3 P13649 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C7_01820C_A VMA11 Q5AH00 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C1_10150W_A WOR1 Q5AP80 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called +Calb_SC5314 C2_07730W_A YVC1 Q5A2J7 indirect_regulator - 0 no UniProt repeat feature (assumed negative) no not_called diff --git a/analysis/calibration_truth/repeat_call_truth/threshold_scan.py b/analysis/calibration_truth/repeat_call_truth/threshold_scan.py new file mode 100644 index 0000000..31dd41a --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/threshold_scan.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +"""Exploratory: sensitivity and specificity of the repeat call on the truth tables, by subset and cutoff. + +NOT a tuning step and nothing here changes the module. The cutoffs of the repeat call are module +parameters (coverage and copies, modules/repeats.py). The truth tables are small and several +positives tuned the detectors, so a scan on them can only describe the trade-off. Applying a new +cutoff needs a larger independent truth set and the owner's decision. + +Usage: threshold_scan.py --work WORKDIR_ROOT --truth DIR [--prefix truth_v2] --out FILE +Reads //raw/repeats/repeat02.tsv and repeat14.tsv (detector tables) and +//out_calls/calls.long.tsv.gz (for the R0 call). +""" + +import argparse +import csv +import gzip +import itertools +import sys + +SPECIES = {"Scer_S288C": "S. cerevisiae S288C", "Calb_SC5314": "C. albicans SC5314"} + + +def read(path): + return {r["protein"]: r for r in csv.DictReader(open(path), delimiter="\t")} + + +def sp_calls(path): + out = {} + with gzip.open(path, "rt") as f: + for r in csv.DictReader(f, delimiter="\t"): + if r["call"] == "signal_peptide_protein" and r["variant"] == "R0": + out[r["protein"]] = r["value"] == "called" + return out + + +def detector_call(row, cov, copies): + if not row: + return False + return ( + int(row["rep_period"]) > 0 + and float(row["rep_coverage"]) >= cov + and float(row["rep_n_copies"]) >= copies + ) + + +def main(): + ap = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + ap.add_argument("--work", required=True) + ap.add_argument("--truth", required=True) + ap.add_argument("--prefix", default="truth", help="truth or truth_v2") + ap.add_argument("--out", required=True) + a = ap.parse_args() + rows = [] + for prot in SPECIES: + truth = list( + csv.DictReader(open(f"{a.truth}/{a.prefix}.{prot}.annotated.tsv"), delimiter="\t") + ) + r02 = read(f"{a.work}/{prot}/raw/repeats/repeat02.tsv") + r14 = read(f"{a.work}/{prot}/raw/repeats/repeat14.tsv") + sp = sp_calls(f"{a.work}/{prot}/out_calls/calls.long.tsv.gz") + subsets = { + "all": lambda t: True, + "secreted (R0 called)": lambda t, sp=sp: sp.get(t["id"], False), + "untuned": lambda t: t["tuned_or_homolog"] == "no", + } + for (cov, copies), (sname, keep) in itertools.product( + itertools.product([0.05, 0.10, 0.15, 0.20, 0.25], [2.5, 3.0, 4.0]), subsets.items() + ): + tp = fp = fn = tn = 0 + for t in truth: + if not keep(t): + continue + called = detector_call(r02.get(t["id"]), cov, copies) or detector_call( + r14.get(t["id"]), cov, copies + ) + y = t["label"] == "1" + tp += y and called + fn += y and not called + fp += (not y) and called + tn += (not y) and not called + rows.append( + { + "proteome": prot, + "subset": sname, + "min_coverage": cov, + "min_copies": copies, + "positives": tp + fn, + "negatives": fp + tn, + "tp": tp, + "fp": fp, + "sensitivity": f"{tp / (tp + fn):.3f}" if tp + fn else "NA", + "specificity": f"{tn / (fp + tn):.3f}" if fp + tn else "NA", + } + ) + with open(a.out, "w", newline="") as f: + w = csv.DictWriter(f, fieldnames=list(rows[0]), delimiter="\t", lineterminator="\n") + w.writeheader() + w.writerows(rows) + print(f"{len(rows)} rows -> {a.out}", file=sys.stderr) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/analysis/calibration_truth/repeat_call_truth/threshold_scan.tsv b/analysis/calibration_truth/repeat_call_truth/threshold_scan.tsv new file mode 100644 index 0000000..7802102 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/threshold_scan.tsv @@ -0,0 +1,91 @@ +proteome subset min_coverage min_copies positives negatives tp fp sensitivity specificity +Scer_S288C all 0.05 2.5 19 25 11 3 0.579 0.880 +Scer_S288C secreted (R0 called) 0.05 2.5 19 16 11 2 0.579 0.875 +Scer_S288C untuned 0.05 2.5 14 24 7 3 0.500 0.875 +Scer_S288C all 0.05 3.0 19 25 11 3 0.579 0.880 +Scer_S288C secreted (R0 called) 0.05 3.0 19 16 11 2 0.579 0.875 +Scer_S288C untuned 0.05 3.0 14 24 7 3 0.500 0.875 +Scer_S288C all 0.05 4.0 19 25 11 3 0.579 0.880 +Scer_S288C secreted (R0 called) 0.05 4.0 19 16 11 2 0.579 0.875 +Scer_S288C untuned 0.05 4.0 14 24 7 3 0.500 0.875 +Scer_S288C all 0.1 2.5 19 25 11 3 0.579 0.880 +Scer_S288C secreted (R0 called) 0.1 2.5 19 16 11 2 0.579 0.875 +Scer_S288C untuned 0.1 2.5 14 24 7 3 0.500 0.875 +Scer_S288C all 0.1 3.0 19 25 11 3 0.579 0.880 +Scer_S288C secreted (R0 called) 0.1 3.0 19 16 11 2 0.579 0.875 +Scer_S288C untuned 0.1 3.0 14 24 7 3 0.500 0.875 +Scer_S288C all 0.1 4.0 19 25 11 3 0.579 0.880 +Scer_S288C secreted (R0 called) 0.1 4.0 19 16 11 2 0.579 0.875 +Scer_S288C untuned 0.1 4.0 14 24 7 3 0.500 0.875 +Scer_S288C all 0.15 2.5 19 25 11 2 0.579 0.920 +Scer_S288C secreted (R0 called) 0.15 2.5 19 16 11 1 0.579 0.938 +Scer_S288C untuned 0.15 2.5 14 24 7 2 0.500 0.917 +Scer_S288C all 0.15 3.0 19 25 11 2 0.579 0.920 +Scer_S288C secreted (R0 called) 0.15 3.0 19 16 11 1 0.579 0.938 +Scer_S288C untuned 0.15 3.0 14 24 7 2 0.500 0.917 +Scer_S288C all 0.15 4.0 19 25 11 2 0.579 0.920 +Scer_S288C secreted (R0 called) 0.15 4.0 19 16 11 1 0.579 0.938 +Scer_S288C untuned 0.15 4.0 14 24 7 2 0.500 0.917 +Scer_S288C all 0.2 2.5 19 25 9 1 0.474 0.960 +Scer_S288C secreted (R0 called) 0.2 2.5 19 16 9 0 0.474 1.000 +Scer_S288C untuned 0.2 2.5 14 24 5 1 0.357 0.958 +Scer_S288C all 0.2 3.0 19 25 9 1 0.474 0.960 +Scer_S288C secreted (R0 called) 0.2 3.0 19 16 9 0 0.474 1.000 +Scer_S288C untuned 0.2 3.0 14 24 5 1 0.357 0.958 +Scer_S288C all 0.2 4.0 19 25 9 1 0.474 0.960 +Scer_S288C secreted (R0 called) 0.2 4.0 19 16 9 0 0.474 1.000 +Scer_S288C untuned 0.2 4.0 14 24 5 1 0.357 0.958 +Scer_S288C all 0.25 2.5 19 25 9 1 0.474 0.960 +Scer_S288C secreted (R0 called) 0.25 2.5 19 16 9 0 0.474 1.000 +Scer_S288C untuned 0.25 2.5 14 24 5 1 0.357 0.958 +Scer_S288C all 0.25 3.0 19 25 9 1 0.474 0.960 +Scer_S288C secreted (R0 called) 0.25 3.0 19 16 9 0 0.474 1.000 +Scer_S288C untuned 0.25 3.0 14 24 5 1 0.357 0.958 +Scer_S288C all 0.25 4.0 19 25 9 1 0.474 0.960 +Scer_S288C secreted (R0 called) 0.25 4.0 19 16 9 0 0.474 1.000 +Scer_S288C untuned 0.25 4.0 14 24 5 1 0.357 0.958 +Calb_SC5314 all 0.05 2.5 13 82 6 0 0.462 1.000 +Calb_SC5314 secreted (R0 called) 0.05 2.5 10 24 6 0 0.600 1.000 +Calb_SC5314 untuned 0.05 2.5 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.05 3.0 13 82 6 0 0.462 1.000 +Calb_SC5314 secreted (R0 called) 0.05 3.0 10 24 6 0 0.600 1.000 +Calb_SC5314 untuned 0.05 3.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.05 4.0 13 82 6 0 0.462 1.000 +Calb_SC5314 secreted (R0 called) 0.05 4.0 10 24 6 0 0.600 1.000 +Calb_SC5314 untuned 0.05 4.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.1 2.5 13 82 6 0 0.462 1.000 +Calb_SC5314 secreted (R0 called) 0.1 2.5 10 24 6 0 0.600 1.000 +Calb_SC5314 untuned 0.1 2.5 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.1 3.0 13 82 6 0 0.462 1.000 +Calb_SC5314 secreted (R0 called) 0.1 3.0 10 24 6 0 0.600 1.000 +Calb_SC5314 untuned 0.1 3.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.1 4.0 13 82 6 0 0.462 1.000 +Calb_SC5314 secreted (R0 called) 0.1 4.0 10 24 6 0 0.600 1.000 +Calb_SC5314 untuned 0.1 4.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.15 2.5 13 82 6 0 0.462 1.000 +Calb_SC5314 secreted (R0 called) 0.15 2.5 10 24 6 0 0.600 1.000 +Calb_SC5314 untuned 0.15 2.5 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.15 3.0 13 82 6 0 0.462 1.000 +Calb_SC5314 secreted (R0 called) 0.15 3.0 10 24 6 0 0.600 1.000 +Calb_SC5314 untuned 0.15 3.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.15 4.0 13 82 6 0 0.462 1.000 +Calb_SC5314 secreted (R0 called) 0.15 4.0 10 24 6 0 0.600 1.000 +Calb_SC5314 untuned 0.15 4.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.2 2.5 13 82 5 0 0.385 1.000 +Calb_SC5314 secreted (R0 called) 0.2 2.5 10 24 5 0 0.500 1.000 +Calb_SC5314 untuned 0.2 2.5 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.2 3.0 13 82 5 0 0.385 1.000 +Calb_SC5314 secreted (R0 called) 0.2 3.0 10 24 5 0 0.500 1.000 +Calb_SC5314 untuned 0.2 3.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.2 4.0 13 82 5 0 0.385 1.000 +Calb_SC5314 secreted (R0 called) 0.2 4.0 10 24 5 0 0.500 1.000 +Calb_SC5314 untuned 0.2 4.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.25 2.5 13 82 5 0 0.385 1.000 +Calb_SC5314 secreted (R0 called) 0.25 2.5 10 24 5 0 0.500 1.000 +Calb_SC5314 untuned 0.25 2.5 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.25 3.0 13 82 5 0 0.385 1.000 +Calb_SC5314 secreted (R0 called) 0.25 3.0 10 24 5 0 0.500 1.000 +Calb_SC5314 untuned 0.25 3.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.25 4.0 13 82 5 0 0.385 1.000 +Calb_SC5314 secreted (R0 called) 0.25 4.0 10 24 5 0 0.500 1.000 +Calb_SC5314 untuned 0.25 4.0 4 81 0 0 0.000 1.000 diff --git a/analysis/calibration_truth/repeat_call_truth/threshold_scan_v2.tsv b/analysis/calibration_truth/repeat_call_truth/threshold_scan_v2.tsv new file mode 100644 index 0000000..c52fba1 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/threshold_scan_v2.tsv @@ -0,0 +1,91 @@ +proteome subset min_coverage min_copies positives negatives tp fp sensitivity specificity +Scer_S288C all 0.05 2.5 31 297 12 7 0.387 0.976 +Scer_S288C secreted (R0 called) 0.05 2.5 30 210 12 6 0.400 0.971 +Scer_S288C untuned 0.05 2.5 14 24 7 3 0.500 0.875 +Scer_S288C all 0.05 3.0 31 297 12 7 0.387 0.976 +Scer_S288C secreted (R0 called) 0.05 3.0 30 210 12 6 0.400 0.971 +Scer_S288C untuned 0.05 3.0 14 24 7 3 0.500 0.875 +Scer_S288C all 0.05 4.0 31 297 12 6 0.387 0.980 +Scer_S288C secreted (R0 called) 0.05 4.0 30 210 12 5 0.400 0.976 +Scer_S288C untuned 0.05 4.0 14 24 7 3 0.500 0.875 +Scer_S288C all 0.1 2.5 31 297 12 6 0.387 0.980 +Scer_S288C secreted (R0 called) 0.1 2.5 30 210 12 5 0.400 0.976 +Scer_S288C untuned 0.1 2.5 14 24 7 3 0.500 0.875 +Scer_S288C all 0.1 3.0 31 297 12 6 0.387 0.980 +Scer_S288C secreted (R0 called) 0.1 3.0 30 210 12 5 0.400 0.976 +Scer_S288C untuned 0.1 3.0 14 24 7 3 0.500 0.875 +Scer_S288C all 0.1 4.0 31 297 12 5 0.387 0.983 +Scer_S288C secreted (R0 called) 0.1 4.0 30 210 12 4 0.400 0.981 +Scer_S288C untuned 0.1 4.0 14 24 7 3 0.500 0.875 +Scer_S288C all 0.15 2.5 31 297 12 5 0.387 0.983 +Scer_S288C secreted (R0 called) 0.15 2.5 30 210 12 4 0.400 0.981 +Scer_S288C untuned 0.15 2.5 14 24 7 2 0.500 0.917 +Scer_S288C all 0.15 3.0 31 297 12 5 0.387 0.983 +Scer_S288C secreted (R0 called) 0.15 3.0 30 210 12 4 0.400 0.981 +Scer_S288C untuned 0.15 3.0 14 24 7 2 0.500 0.917 +Scer_S288C all 0.15 4.0 31 297 12 4 0.387 0.987 +Scer_S288C secreted (R0 called) 0.15 4.0 30 210 12 3 0.400 0.986 +Scer_S288C untuned 0.15 4.0 14 24 7 2 0.500 0.917 +Scer_S288C all 0.2 2.5 31 297 10 4 0.323 0.987 +Scer_S288C secreted (R0 called) 0.2 2.5 30 210 10 3 0.333 0.986 +Scer_S288C untuned 0.2 2.5 14 24 5 1 0.357 0.958 +Scer_S288C all 0.2 3.0 31 297 10 4 0.323 0.987 +Scer_S288C secreted (R0 called) 0.2 3.0 30 210 10 3 0.333 0.986 +Scer_S288C untuned 0.2 3.0 14 24 5 1 0.357 0.958 +Scer_S288C all 0.2 4.0 31 297 10 3 0.323 0.990 +Scer_S288C secreted (R0 called) 0.2 4.0 30 210 10 2 0.333 0.990 +Scer_S288C untuned 0.2 4.0 14 24 5 1 0.357 0.958 +Scer_S288C all 0.25 2.5 31 297 10 4 0.323 0.987 +Scer_S288C secreted (R0 called) 0.25 2.5 30 210 10 3 0.333 0.986 +Scer_S288C untuned 0.25 2.5 14 24 5 1 0.357 0.958 +Scer_S288C all 0.25 3.0 31 297 10 4 0.323 0.987 +Scer_S288C secreted (R0 called) 0.25 3.0 30 210 10 3 0.333 0.986 +Scer_S288C untuned 0.25 3.0 14 24 5 1 0.357 0.958 +Scer_S288C all 0.25 4.0 31 297 10 3 0.323 0.990 +Scer_S288C secreted (R0 called) 0.25 4.0 30 210 10 2 0.333 0.990 +Scer_S288C untuned 0.25 4.0 14 24 5 1 0.357 0.958 +Calb_SC5314 all 0.05 2.5 16 210 8 8 0.500 0.962 +Calb_SC5314 secreted (R0 called) 0.05 2.5 12 143 7 8 0.583 0.944 +Calb_SC5314 untuned 0.05 2.5 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.05 3.0 16 210 8 8 0.500 0.962 +Calb_SC5314 secreted (R0 called) 0.05 3.0 12 143 7 8 0.583 0.944 +Calb_SC5314 untuned 0.05 3.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.05 4.0 16 210 8 4 0.500 0.981 +Calb_SC5314 secreted (R0 called) 0.05 4.0 12 143 7 4 0.583 0.972 +Calb_SC5314 untuned 0.05 4.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.1 2.5 16 210 7 8 0.438 0.962 +Calb_SC5314 secreted (R0 called) 0.1 2.5 12 143 7 8 0.583 0.944 +Calb_SC5314 untuned 0.1 2.5 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.1 3.0 16 210 7 8 0.438 0.962 +Calb_SC5314 secreted (R0 called) 0.1 3.0 12 143 7 8 0.583 0.944 +Calb_SC5314 untuned 0.1 3.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.1 4.0 16 210 7 4 0.438 0.981 +Calb_SC5314 secreted (R0 called) 0.1 4.0 12 143 7 4 0.583 0.972 +Calb_SC5314 untuned 0.1 4.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.15 2.5 16 210 7 7 0.438 0.967 +Calb_SC5314 secreted (R0 called) 0.15 2.5 12 143 7 7 0.583 0.951 +Calb_SC5314 untuned 0.15 2.5 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.15 3.0 16 210 7 7 0.438 0.967 +Calb_SC5314 secreted (R0 called) 0.15 3.0 12 143 7 7 0.583 0.951 +Calb_SC5314 untuned 0.15 3.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.15 4.0 16 210 7 3 0.438 0.986 +Calb_SC5314 secreted (R0 called) 0.15 4.0 12 143 7 3 0.583 0.979 +Calb_SC5314 untuned 0.15 4.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.2 2.5 16 210 6 6 0.375 0.971 +Calb_SC5314 secreted (R0 called) 0.2 2.5 12 143 6 6 0.500 0.958 +Calb_SC5314 untuned 0.2 2.5 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.2 3.0 16 210 6 6 0.375 0.971 +Calb_SC5314 secreted (R0 called) 0.2 3.0 12 143 6 6 0.500 0.958 +Calb_SC5314 untuned 0.2 3.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.2 4.0 16 210 6 2 0.375 0.990 +Calb_SC5314 secreted (R0 called) 0.2 4.0 12 143 6 2 0.500 0.986 +Calb_SC5314 untuned 0.2 4.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.25 2.5 16 210 6 5 0.375 0.976 +Calb_SC5314 secreted (R0 called) 0.25 2.5 12 143 6 5 0.500 0.965 +Calb_SC5314 untuned 0.25 2.5 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.25 3.0 16 210 6 5 0.375 0.976 +Calb_SC5314 secreted (R0 called) 0.25 3.0 12 143 6 5 0.500 0.965 +Calb_SC5314 untuned 0.25 3.0 4 81 0 0 0.000 1.000 +Calb_SC5314 all 0.25 4.0 16 210 6 1 0.375 0.995 +Calb_SC5314 secreted (R0 called) 0.25 4.0 12 143 6 1 0.500 0.993 +Calb_SC5314 untuned 0.25 4.0 4 81 0 0 0.000 1.000 diff --git a/analysis/calibration_truth/repeat_call_truth/threshold_scan_v3.tsv b/analysis/calibration_truth/repeat_call_truth/threshold_scan_v3.tsv new file mode 100644 index 0000000..985e795 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/threshold_scan_v3.tsv @@ -0,0 +1,91 @@ +proteome subset min_coverage min_copies positives negatives tp fp sensitivity specificity +Scer_S288C all 0.05 2.5 23 297 12 7 0.522 0.976 +Scer_S288C secreted (R0 called) 0.05 2.5 23 210 12 6 0.522 0.971 +Scer_S288C untuned 0.05 2.5 14 24 7 3 0.500 0.875 +Scer_S288C all 0.05 3.0 23 297 12 7 0.522 0.976 +Scer_S288C secreted (R0 called) 0.05 3.0 23 210 12 6 0.522 0.971 +Scer_S288C untuned 0.05 3.0 14 24 7 3 0.500 0.875 +Scer_S288C all 0.05 4.0 23 297 12 6 0.522 0.980 +Scer_S288C secreted (R0 called) 0.05 4.0 23 210 12 5 0.522 0.976 +Scer_S288C untuned 0.05 4.0 14 24 7 3 0.500 0.875 +Scer_S288C all 0.1 2.5 23 297 12 6 0.522 0.980 +Scer_S288C secreted (R0 called) 0.1 2.5 23 210 12 5 0.522 0.976 +Scer_S288C untuned 0.1 2.5 14 24 7 3 0.500 0.875 +Scer_S288C all 0.1 3.0 23 297 12 6 0.522 0.980 +Scer_S288C secreted (R0 called) 0.1 3.0 23 210 12 5 0.522 0.976 +Scer_S288C untuned 0.1 3.0 14 24 7 3 0.500 0.875 +Scer_S288C all 0.1 4.0 23 297 12 5 0.522 0.983 +Scer_S288C secreted (R0 called) 0.1 4.0 23 210 12 4 0.522 0.981 +Scer_S288C untuned 0.1 4.0 14 24 7 3 0.500 0.875 +Scer_S288C all 0.15 2.5 23 297 12 5 0.522 0.983 +Scer_S288C secreted (R0 called) 0.15 2.5 23 210 12 4 0.522 0.981 +Scer_S288C untuned 0.15 2.5 14 24 7 2 0.500 0.917 +Scer_S288C all 0.15 3.0 23 297 12 5 0.522 0.983 +Scer_S288C secreted (R0 called) 0.15 3.0 23 210 12 4 0.522 0.981 +Scer_S288C untuned 0.15 3.0 14 24 7 2 0.500 0.917 +Scer_S288C all 0.15 4.0 23 297 12 4 0.522 0.987 +Scer_S288C secreted (R0 called) 0.15 4.0 23 210 12 3 0.522 0.986 +Scer_S288C untuned 0.15 4.0 14 24 7 2 0.500 0.917 +Scer_S288C all 0.2 2.5 23 297 10 4 0.435 0.987 +Scer_S288C secreted (R0 called) 0.2 2.5 23 210 10 3 0.435 0.986 +Scer_S288C untuned 0.2 2.5 14 24 5 1 0.357 0.958 +Scer_S288C all 0.2 3.0 23 297 10 4 0.435 0.987 +Scer_S288C secreted (R0 called) 0.2 3.0 23 210 10 3 0.435 0.986 +Scer_S288C untuned 0.2 3.0 14 24 5 1 0.357 0.958 +Scer_S288C all 0.2 4.0 23 297 10 3 0.435 0.990 +Scer_S288C secreted (R0 called) 0.2 4.0 23 210 10 2 0.435 0.990 +Scer_S288C untuned 0.2 4.0 14 24 5 1 0.357 0.958 +Scer_S288C all 0.25 2.5 23 297 10 4 0.435 0.987 +Scer_S288C secreted (R0 called) 0.25 2.5 23 210 10 3 0.435 0.986 +Scer_S288C untuned 0.25 2.5 14 24 5 1 0.357 0.958 +Scer_S288C all 0.25 3.0 23 297 10 4 0.435 0.987 +Scer_S288C secreted (R0 called) 0.25 3.0 23 210 10 3 0.435 0.986 +Scer_S288C untuned 0.25 3.0 14 24 5 1 0.357 0.958 +Scer_S288C all 0.25 4.0 23 297 10 3 0.435 0.990 +Scer_S288C secreted (R0 called) 0.25 4.0 23 210 10 2 0.435 0.990 +Scer_S288C untuned 0.25 4.0 14 24 5 1 0.357 0.958 +Calb_SC5314 all 0.05 2.5 13 211 8 8 0.615 0.962 +Calb_SC5314 secreted (R0 called) 0.05 2.5 12 144 7 8 0.583 0.944 +Calb_SC5314 untuned 0.05 2.5 1 82 0 1 0.000 0.988 +Calb_SC5314 all 0.05 3.0 13 211 8 8 0.615 0.962 +Calb_SC5314 secreted (R0 called) 0.05 3.0 12 144 7 8 0.583 0.944 +Calb_SC5314 untuned 0.05 3.0 1 82 0 1 0.000 0.988 +Calb_SC5314 all 0.05 4.0 13 211 8 4 0.615 0.981 +Calb_SC5314 secreted (R0 called) 0.05 4.0 12 144 7 4 0.583 0.972 +Calb_SC5314 untuned 0.05 4.0 1 82 0 1 0.000 0.988 +Calb_SC5314 all 0.1 2.5 13 211 7 8 0.538 0.962 +Calb_SC5314 secreted (R0 called) 0.1 2.5 12 144 7 8 0.583 0.944 +Calb_SC5314 untuned 0.1 2.5 1 82 0 1 0.000 0.988 +Calb_SC5314 all 0.1 3.0 13 211 7 8 0.538 0.962 +Calb_SC5314 secreted (R0 called) 0.1 3.0 12 144 7 8 0.583 0.944 +Calb_SC5314 untuned 0.1 3.0 1 82 0 1 0.000 0.988 +Calb_SC5314 all 0.1 4.0 13 211 7 4 0.538 0.981 +Calb_SC5314 secreted (R0 called) 0.1 4.0 12 144 7 4 0.583 0.972 +Calb_SC5314 untuned 0.1 4.0 1 82 0 1 0.000 0.988 +Calb_SC5314 all 0.15 2.5 13 211 7 7 0.538 0.967 +Calb_SC5314 secreted (R0 called) 0.15 2.5 12 144 7 7 0.583 0.951 +Calb_SC5314 untuned 0.15 2.5 1 82 0 1 0.000 0.988 +Calb_SC5314 all 0.15 3.0 13 211 7 7 0.538 0.967 +Calb_SC5314 secreted (R0 called) 0.15 3.0 12 144 7 7 0.583 0.951 +Calb_SC5314 untuned 0.15 3.0 1 82 0 1 0.000 0.988 +Calb_SC5314 all 0.15 4.0 13 211 7 3 0.538 0.986 +Calb_SC5314 secreted (R0 called) 0.15 4.0 12 144 7 3 0.583 0.979 +Calb_SC5314 untuned 0.15 4.0 1 82 0 1 0.000 0.988 +Calb_SC5314 all 0.2 2.5 13 211 6 6 0.462 0.972 +Calb_SC5314 secreted (R0 called) 0.2 2.5 12 144 6 6 0.500 0.958 +Calb_SC5314 untuned 0.2 2.5 1 82 0 0 0.000 1.000 +Calb_SC5314 all 0.2 3.0 13 211 6 6 0.462 0.972 +Calb_SC5314 secreted (R0 called) 0.2 3.0 12 144 6 6 0.500 0.958 +Calb_SC5314 untuned 0.2 3.0 1 82 0 0 0.000 1.000 +Calb_SC5314 all 0.2 4.0 13 211 6 2 0.462 0.991 +Calb_SC5314 secreted (R0 called) 0.2 4.0 12 144 6 2 0.500 0.986 +Calb_SC5314 untuned 0.2 4.0 1 82 0 0 0.000 1.000 +Calb_SC5314 all 0.25 2.5 13 211 6 5 0.462 0.976 +Calb_SC5314 secreted (R0 called) 0.25 2.5 12 144 6 5 0.500 0.965 +Calb_SC5314 untuned 0.25 2.5 1 82 0 0 0.000 1.000 +Calb_SC5314 all 0.25 3.0 13 211 6 5 0.462 0.976 +Calb_SC5314 secreted (R0 called) 0.25 3.0 12 144 6 5 0.500 0.965 +Calb_SC5314 untuned 0.25 3.0 1 82 0 0 0.000 1.000 +Calb_SC5314 all 0.25 4.0 13 211 6 1 0.462 0.995 +Calb_SC5314 secreted (R0 called) 0.25 4.0 12 144 6 1 0.500 0.993 +Calb_SC5314 untuned 0.25 4.0 1 82 0 0 0.000 1.000 diff --git a/analysis/calibration_truth/repeat_call_truth/truth.Calb_SC5314.annotated.tsv b/analysis/calibration_truth/repeat_call_truth/truth.Calb_SC5314.annotated.tsv new file mode 100644 index 0000000..75a5f70 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/truth.Calb_SC5314.annotated.tsv @@ -0,0 +1,96 @@ +id gene accession label cluster basis curated_class evidence tuned_or_homolog +C6_03700W_A ALS1 Q5A8T4 1 CR_07070C_A paper statement adhesin E1 yes +CR_07070C_A ALS3 Q59L12 1 CR_07070C_A paper statement adhesin E1 yes +C6_04130C_A ALS4 A0A1D8PQB9 1 CR_07070C_A UniProt >=2 repeat features adhesin E1 yes +C6_03690W_A ALS5 Q5A8T7 1 CR_07070C_A UniProt >=2 repeat features adhesin E1 yes +C3_06190C_A ALS6 Q5A2Z7 1 CR_07070C_A UniProt >=2 repeat features adhesin E1 yes +C3_06320W_A ALS7 Q5A312 1 CR_07070C_A UniProt >=2 repeat features adhesin E1 yes +C6_03710W_A ALS9 A0A1D8PQ86 1 CR_07070C_A UniProt >=2 repeat features adhesin E1 yes +C2_09530W_A EAP1 G1UBC2 1 C2_09530W_A UniProt >=2 repeat features adhesin E1 no +C4_03570W_A HWP1 P46593 1 C4_03570W_A UniProt >=2 repeat features adhesin E1 yes +C4_03510C_A HWP2 Q59PF9 0 C4_03510C_A no UniProt repeat feature (assumed negative) adhesin E1 no +C6_04380W_A ALS2 P0CU38 1 CR_07070C_A UniProt >=2 repeat features adhesin E2 yes +CR_10480W_A PGA1 Q5ACL7 0 CR_10480W_A no UniProt repeat feature (assumed negative) adhesin E2 no +C4_03520C_A RBT1 Q59TP1 0 C4_03570W_A no UniProt repeat feature (assumed negative) adhesin E2 no +CR_07440W_A ACE2 Q59RR0 0 CR_07440W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C1_10860C_A ADA2 Q59WH0 0 C1_10860C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C4_02250C_A BGL2 Q5AMT2 0 C4_02250C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C1_10830W_A BIG1 Q59WG7 0 C1_10830W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C1_06010W_A CHS7 Q5AA40 0 C1_06010W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C4_06100W_A CWH41 A0A1D8PMH9 0 C4_06100W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C7_00360W_A DFI1 Q5AFI4 0 C7_00360W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C2_08490W_A DSE1 Q59Y20 1 C2_08490W_A UniProt >=2 repeat features surface_other_adhesion_phenotype - no +C1_03190C_A ECM33 A0A1D8PCY4 0 C1_03190C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C1_03680W_A ENG1 Q5AIR7 0 C1_03680W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C6_04580W_A HXK1 Q59RW5 0 C6_04580W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C2_10030C_A MP65 Q59XX2 0 C2_10030C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C1_06370C_A PBR1 Q5AAN7 0 C1_06370C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C4_04530C_A PHR1 P43076 0 C4_04530C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C4_06980W_A PRA1 P87020 0 C4_06980W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - yes +C4_00130W_A RBT5 Q59UT4 0 C4_00130W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C5_00220W_A ROT2 Q5A4X3 0 C5_00220W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C6_03490C_A SAP1 P0CY27 0 C4_04470W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C4_04470W_A SAP10 Q5A651 0 C4_04470W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +CR_07800W_A SAP2 P0DJ06 0 C4_04470W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C3_05230W_A SAP3 P0CY29 0 C4_04470W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C3_03870C_A SAP9 Q59SU1 0 C4_04470W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C6_00820W_A SUN41 Q59NP5 0 C6_00820W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C3_01730C_A UTR2 Q5AJC0 0 C3_01730C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C1_02990C_A XOG1 P29717 0 C1_02990C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C2_08590W_A YWP1 Q59Y31 0 C2_08590W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +CR_01970C_A VMA4 O94072 0 CR_01970C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_06970W_A AAH1 Q59ZB1 0 C2_06970W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C5_05050W_A ADH1 A0A1D8PP43 0 C5_05050W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_07170C_A AFT2 Q59Z29 0 C2_07170C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_06000W_A AHR1 Q5A4F3 0 C3_06000W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_01250W_A ASC1 P83774 1 C7_01250W_A UniProt >=2 repeat features indirect_regulator - no +CR_06440C_A BCR1 Q59U10 0 CR_06440C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C5_02470W_A BUD4 P53705 0 C5_02470W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_04570C_A CDC10 P39827 0 CR_04570C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_04930C_A CRK1 Q9Y7W4 0 C2_04930C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_04020C_A CSH1 Q59QH2 0 C1_04020C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_04390W_A CUP5 A0A1D8PK00 0 C3_04390W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_10110W_A CYC1 P53698 0 C2_10110W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_03070C_A CYR1 A0A1D8PR83 0 C7_03070C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_09880W_A DEF1 G1UB67 0 CR_09880W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_07890W_A EFG1 Q59X67 0 CR_07890W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_01360C_A FMP28 A0A1D8PQU2 0 C7_01360C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_10240W_A GPD1 Q59XU9 0 C2_10240W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_03270W_A GPM1 P82612 0 C2_03270W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_07680W_A HAP2 A0A1D8PE35 0 C1_07680W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_04290W_A HAP31 Q5A6N7 0 CR_04290W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C5_00940C_A HAP5 A0A1D8PN26 0 C5_00940C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C4_00140C_A HIS4 A0A1D8PKY7 0 C4_00140C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_03660W_A IRS4 Q59SR6 0 C3_03660W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_01620C_A MET6 P82610 0 CR_01620C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_01810C_A MNT1 Q00310 0 C3_01810C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_01830C_A MNT2 P46592 0 C3_01810C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_03710C_A MSB1 A0A1D8PD52 0 C1_03710C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_08300W_A NOT5 A0A1D8PE87 0 C1_08300W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_04040C_A NPT1 A0A1D8PRI0 0 C7_04040C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_02840W_A PDE2 A0A1D8PCV9 0 C1_02840W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C4_00350W_A PEP7 Q59UQ8 0 C4_00350W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_02890C_A PMT1 O74189 0 C7_02890C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_10080W_A RAP1 A0A1D8PIK2 0 C2_10080W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_10210C_A RAS1 Q59XU5 0 C2_10210C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C4_02030W_A RFX2 Q5AMQ6 0 C4_02030W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_00320W_A RHR2 Q5A7M9 0 C3_00320W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_05990C_A SFL1 Q5A287 0 CR_05990C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C5_04830W_A SFL2 Q5AK51 0 C5_04830W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_04860W_A SFP1 Q5ANF0 0 C3_04860W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_09140C_A SHO1 Q5AQ36 0 C1_09140C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_01330C_A SIR2 O59923 0 C2_01330C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_07870C_A SMI1 A0A1D8PE53 0 C1_07870C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_04290C_A SNF5 A0A1D8PJZ6 0 C3_04290C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_06000W_A SOK1 A0A1D8PT45 0 CR_06000W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_06540C_A SPF1 Q59Q34 0 C2_06540C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_06610W_A STE2 A0A1D8PTB4 0 CR_06610W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C4_00300C_A SWI1 Q59UR3 0 C4_00300C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_06870W_A TDH3 Q5ADM7 0 C3_06870W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_04530C_A TEC1 Q5ANJ4 0 C3_04530C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_07210C_A TPK2 A0A1D8PHU1 0 C2_07210C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_00060W_A TUP1 P0CY34 1 C1_00060W_A UniProt >=2 repeat features indirect_regulator - no +C3_01350C_A URA3 P13649 0 C3_01350C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_01820C_A VMA11 Q5AH00 0 C3_04390W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_10150W_A WOR1 Q5AP80 0 C1_10150W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_07730W_A YVC1 Q5A2J7 0 C2_07730W_A no UniProt repeat feature (assumed negative) indirect_regulator - no diff --git a/analysis/calibration_truth/repeat_call_truth/truth.Calb_SC5314.tsv b/analysis/calibration_truth/repeat_call_truth/truth.Calb_SC5314.tsv new file mode 100644 index 0000000..58b857b --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/truth.Calb_SC5314.tsv @@ -0,0 +1,96 @@ +id label cluster +C6_03700W_A 1 CR_07070C_A +CR_07070C_A 1 CR_07070C_A +C6_04130C_A 1 CR_07070C_A +C6_03690W_A 1 CR_07070C_A +C3_06190C_A 1 CR_07070C_A +C3_06320W_A 1 CR_07070C_A +C6_03710W_A 1 CR_07070C_A +C2_09530W_A 1 C2_09530W_A +C4_03570W_A 1 C4_03570W_A +C4_03510C_A 0 C4_03510C_A +C6_04380W_A 1 CR_07070C_A +CR_10480W_A 0 CR_10480W_A +C4_03520C_A 0 C4_03570W_A +CR_07440W_A 0 CR_07440W_A +C1_10860C_A 0 C1_10860C_A +C4_02250C_A 0 C4_02250C_A +C1_10830W_A 0 C1_10830W_A +C1_06010W_A 0 C1_06010W_A +C4_06100W_A 0 C4_06100W_A +C7_00360W_A 0 C7_00360W_A +C2_08490W_A 1 C2_08490W_A +C1_03190C_A 0 C1_03190C_A +C1_03680W_A 0 C1_03680W_A +C6_04580W_A 0 C6_04580W_A +C2_10030C_A 0 C2_10030C_A +C1_06370C_A 0 C1_06370C_A +C4_04530C_A 0 C4_04530C_A +C4_06980W_A 0 C4_06980W_A +C4_00130W_A 0 C4_00130W_A +C5_00220W_A 0 C5_00220W_A +C6_03490C_A 0 C4_04470W_A +C4_04470W_A 0 C4_04470W_A +CR_07800W_A 0 C4_04470W_A +C3_05230W_A 0 C4_04470W_A +C3_03870C_A 0 C4_04470W_A +C6_00820W_A 0 C6_00820W_A +C3_01730C_A 0 C3_01730C_A +C1_02990C_A 0 C1_02990C_A +C2_08590W_A 0 C2_08590W_A +CR_01970C_A 0 CR_01970C_A +C2_06970W_A 0 C2_06970W_A +C5_05050W_A 0 C5_05050W_A +C2_07170C_A 0 C2_07170C_A +C3_06000W_A 0 C3_06000W_A +C7_01250W_A 1 C7_01250W_A +CR_06440C_A 0 CR_06440C_A +C5_02470W_A 0 C5_02470W_A +CR_04570C_A 0 CR_04570C_A +C2_04930C_A 0 C2_04930C_A +C1_04020C_A 0 C1_04020C_A +C3_04390W_A 0 C3_04390W_A +C2_10110W_A 0 C2_10110W_A +C7_03070C_A 0 C7_03070C_A +CR_09880W_A 0 CR_09880W_A +CR_07890W_A 0 CR_07890W_A +C7_01360C_A 0 C7_01360C_A +C2_10240W_A 0 C2_10240W_A +C2_03270W_A 0 C2_03270W_A +C1_07680W_A 0 C1_07680W_A +CR_04290W_A 0 CR_04290W_A +C5_00940C_A 0 C5_00940C_A +C4_00140C_A 0 C4_00140C_A +C3_03660W_A 0 C3_03660W_A +CR_01620C_A 0 CR_01620C_A +C3_01810C_A 0 C3_01810C_A +C3_01830C_A 0 C3_01810C_A +C1_03710C_A 0 C1_03710C_A +C1_08300W_A 0 C1_08300W_A +C7_04040C_A 0 C7_04040C_A +C1_02840W_A 0 C1_02840W_A +C4_00350W_A 0 C4_00350W_A +C7_02890C_A 0 C7_02890C_A +C2_10080W_A 0 C2_10080W_A +C2_10210C_A 0 C2_10210C_A +C4_02030W_A 0 C4_02030W_A +C3_00320W_A 0 C3_00320W_A +CR_05990C_A 0 CR_05990C_A +C5_04830W_A 0 C5_04830W_A +C3_04860W_A 0 C3_04860W_A +C1_09140C_A 0 C1_09140C_A +C2_01330C_A 0 C2_01330C_A +C1_07870C_A 0 C1_07870C_A +C3_04290C_A 0 C3_04290C_A +CR_06000W_A 0 CR_06000W_A +C2_06540C_A 0 C2_06540C_A +CR_06610W_A 0 CR_06610W_A +C4_00300C_A 0 C4_00300C_A +C3_06870W_A 0 C3_06870W_A +C3_04530C_A 0 C3_04530C_A +C2_07210C_A 0 C2_07210C_A +C1_00060W_A 1 C1_00060W_A +C3_01350C_A 0 C3_01350C_A +C7_01820C_A 0 C3_04390W_A +C1_10150W_A 0 C1_10150W_A +C2_07730W_A 0 C2_07730W_A diff --git a/analysis/calibration_truth/repeat_call_truth/truth.Scer_S288C.annotated.tsv b/analysis/calibration_truth/repeat_call_truth/truth.Scer_S288C.annotated.tsv new file mode 100644 index 0000000..ced5fd9 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/truth.Scer_S288C.annotated.tsv @@ -0,0 +1,45 @@ +id gene accession label cluster basis curated_class evidence tuned_or_homolog +YIR019C FLO11 P08640 1 YIR019C paper statement adhesin E1 yes +YNR044W AGA1 P32323 1 YNR044W UniProt >=2 repeat features adhesin E1 no +YGL032C AGA2 P32781 0 YGL032C no UniProt repeat feature (assumed negative) adhesin E1 no +YAR050W FLO1 P32768 1 YAR050W paper statement adhesin E1 yes +YKR102W FLO10 P36170 1 YAR050W UniProt >=2 repeat features adhesin E1 yes +YHR211W FLO5 P38894 1 YAR050W UniProt >=2 repeat features adhesin E1 yes +YAL063C FLO9 P39712 1 YAR050W UniProt >=2 repeat features adhesin E1 yes +YJR004C SAG1 P20840 1 YJR004C UniProt >=2 repeat features adhesin E1 no +YDL037C BSC1 Q12140 0 YDL037C no UniProt repeat feature (assumed negative) adhesin E3 no +YIL169C CSS1 P40442 0 YOL155C no UniProt repeat feature (assumed negative) adhesin E3 no +YOL155C HPF1 Q05164 1 YOL155C UniProt >=2 repeat features adhesin E3 no +YAL064C-A TDA8 Q6B2U8 0 YAL064C-A no UniProt repeat feature (assumed negative) adhesin E3 no +YLR110C CCW12 Q12127 1 YLR110C UniProt >=2 repeat features surface_other_adhesion_phenotype - no +YGR189C CRH1 P53301 0 YGR189C no UniProt repeat feature (assumed negative) hard_negative N1 no +YLR286C CTS1 P29029 0 YLR286C no UniProt repeat feature (assumed negative) hard_negative N1 yes +YBR078W ECM33 P38248 0 YBR078W no UniProt repeat feature (assumed negative) hard_negative N1 no +YLR300W EXG1 P23776 0 YLR300W no UniProt repeat feature (assumed negative) hard_negative N1 no +YMR058W FET3 P38993 0 YMR058W no UniProt repeat feature (assumed negative) hard_negative N1 no +YDR534C FIT1 Q04433 1 YDR534C UniProt >=2 repeat features hard_negative N1 no +YMR307W GAS1 P22146 0 YMR307W no UniProt repeat feature (assumed negative) hard_negative N1 no +YDR420W HKR1 P41809 1 YDR420W UniProt >=2 repeat features hard_negative N1 no +YJL159W HSP150 P32478 1 YKL164C UniProt >=2 repeat features hard_negative N1 no +YJL174W KRE9 P39005 0 YJL174W no UniProt repeat feature (assumed negative) hard_negative N1 no +YLR332W MID2 P36027 0 YLR332W no UniProt repeat feature (assumed negative) hard_negative N1 no +YGR014W MSB2 P32334 1 YGR014W UniProt >=2 repeat features hard_negative N1 no +YKL164C PIR1 Q03178 1 YKL164C UniProt >=2 repeat features hard_negative N1 no +YOR008C SLG1 P54867 0 YOR008C no UniProt repeat feature (assumed negative) hard_negative N1 no +YNL066W SUN4 P53616 0 YNL066W no UniProt repeat feature (assumed negative) hard_negative N1 no +YEL040W UTR2 P32623 0 YEL040W no UniProt repeat feature (assumed negative) hard_negative N1 no +YNL283C WSC2 P53832 0 YNL283C no UniProt repeat feature (assumed negative) hard_negative N1 no +YLR120C YPS1 P32329 0 YLR120C no UniProt repeat feature (assumed negative) hard_negative N1 no +YJR150C DAN1 P47178 0 YJR150C no UniProt repeat feature (assumed negative) hard_negative N2 no +YJR151C DAN4 P47179 1 YJR151C UniProt >=2 repeat features hard_negative N2 no +YNL327W EGT2 P42835 1 YNL327W UniProt >=2 repeat features hard_negative N2 no +YDR077W SED1 Q01589 1 YDR077W UniProt >=2 repeat features hard_negative N2 no +YER011W TIR1 P10863 1 YER011W UniProt >=2 repeat features hard_negative N2 no +YIL011W TIR3 P40552 0 YER011W no UniProt repeat feature (assumed negative) hard_negative N2 no +YOR009W TIR4 Q12218 1 YER011W UniProt >=2 repeat features hard_negative N2 no +YER027C GAL83 Q04739 0 YER027C no UniProt repeat feature (assumed negative) indirect_regulator - no +YFL014W HSP12 P22943 0 YFL014W no UniProt repeat feature (assumed negative) indirect_regulator - no +YDR043C NRG1 Q03125 0 YBR066C no UniProt repeat feature (assumed negative) indirect_regulator - no +YBR066C NRG2 P38082 0 YBR066C no UniProt repeat feature (assumed negative) indirect_regulator - no +YIL084C SDS3 P40505 0 YIL084C no UniProt repeat feature (assumed negative) indirect_regulator - no +YOR315W SFG1 Q12507 0 YOR315W no UniProt repeat feature (assumed negative) indirect_regulator - no diff --git a/analysis/calibration_truth/repeat_call_truth/truth.Scer_S288C.tsv b/analysis/calibration_truth/repeat_call_truth/truth.Scer_S288C.tsv new file mode 100644 index 0000000..0882a78 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/truth.Scer_S288C.tsv @@ -0,0 +1,45 @@ +id label cluster +YIR019C 1 YIR019C +YNR044W 1 YNR044W +YGL032C 0 YGL032C +YAR050W 1 YAR050W +YKR102W 1 YAR050W +YHR211W 1 YAR050W +YAL063C 1 YAR050W +YJR004C 1 YJR004C +YDL037C 0 YDL037C +YIL169C 0 YOL155C +YOL155C 1 YOL155C +YAL064C-A 0 YAL064C-A +YLR110C 1 YLR110C +YGR189C 0 YGR189C +YLR286C 0 YLR286C +YBR078W 0 YBR078W +YLR300W 0 YLR300W +YMR058W 0 YMR058W +YDR534C 1 YDR534C +YMR307W 0 YMR307W +YDR420W 1 YDR420W +YJL159W 1 YKL164C +YJL174W 0 YJL174W +YLR332W 0 YLR332W +YGR014W 1 YGR014W +YKL164C 1 YKL164C +YOR008C 0 YOR008C +YNL066W 0 YNL066W +YEL040W 0 YEL040W +YNL283C 0 YNL283C +YLR120C 0 YLR120C +YJR150C 0 YJR150C +YJR151C 1 YJR151C +YNL327W 1 YNL327W +YDR077W 1 YDR077W +YER011W 1 YER011W +YIL011W 0 YER011W +YOR009W 1 YER011W +YER027C 0 YER027C +YFL014W 0 YFL014W +YDR043C 0 YBR066C +YBR066C 0 YBR066C +YIL084C 0 YIL084C +YOR315W 0 YOR315W diff --git a/analysis/calibration_truth/repeat_call_truth/truth_v2.Afum_Af293_UniProt.annotated.tsv b/analysis/calibration_truth/repeat_call_truth/truth_v2.Afum_Af293_UniProt.annotated.tsv new file mode 100644 index 0000000..fdf990a --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/truth_v2.Afum_Af293_UniProt.annotated.tsv @@ -0,0 +1,168 @@ +id gene accession label cluster basis curated_class evidence tuned_or_homolog +sp|E9QSG0|DSCA_ASPFU dscA E9QSG0 0 sp|E9QSG0|DSCA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|E9RBR0|ABR2_ASPFU abr2 E9RBR0 0 sp|E9RBR0|ABR2_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|O00092|PHYA_ASPFU phyA O00092 0 sp|O00092|PHYA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|P28296|ORYZ_ASPFU alp1 P28296 0 sp|P28296|ORYZ_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|P46075|ELM_ASPFU mep P46075 0 sp|P46075|ELM_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|P67875|RNMG_ASPFU mitF P67875 0 sp|P67875|RNMG_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WBS1|MANF_ASPFU manF Q4WBS1 0 sp|Q4WBS1|MANF_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WGL5|SUN1_ASPFU sun1 Q4WGL5 0 sp|Q4WGL5|SUN1_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WI46|CRH2_ASPFU crh2 Q4WI46 0 sp|Q4WI46|CRH2_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WKP8|IREA_ASPFU ireA Q4WKP8 0 sp|Q4WKP8|IREA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WL81|NADA_ASPFU nadA Q4WL81 0 sp|Q4WL81|NADA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WLB9|CFMA_ASPFU cfmA Q4WLB9 0 sp|Q4WLB9|CFMA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WP32|LP9B_ASPFU AA9_B Q4WP32 0 sp|Q4WBU0|LP9C_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WR75|FREB_ASPFU freB Q4WR75 0 sp|Q4WR75|FREB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WZB4|ABR1_ASPFU abr1 Q4WZB4 0 sp|E9R598|FETC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q70J59|SED2_ASPFU sed2 Q70J59 0 sp|Q4WQU0|SED4_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q8J0P4|CRH5_ASPFU crh5 Q8J0P4 0 sp|Q4WXE6|CRH3_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q92405|CATB_ASPFU catB Q92405 0 sp|Q92405|CATB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|A4DA41|SPYC_ASPFU spyC A4DA41 0 sp|Q4WLD1|PYR5_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|E9QRF2|CHIB1_ASPFU chiB1 E9QRF2 0 sp|E9QRF2|CHIB1_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|E9QT94|RODB_ASPFU rodB E9QT94 0 sp|E9QT94|RODB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|E9R598|FETC_ASPFU fetC E9R598 0 sp|E9R598|FETC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|O42630|CARP_ASPFU pep2 O42630 0 sp|O42630|CARP_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|P0C7S9|GEL1_ASPFU gel1 P0C7S9 0 sp|P0C954|GEL2_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|P0C954|GEL2_ASPFU gel2 P0C954 0 sp|P0C954|GEL2_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|P0C955|GEL3_ASPFU gel3 P0C955 0 sp|P0C954|GEL2_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|P0C957|PLB1_ASPFU plb1 P0C957 0 sp|P0C958|PLB3_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|P0C958|PLB3_ASPFU plb3 P0C958 0 sp|P0C958|PLB3_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|P41746|RODA_ASPFU rodA P41746 0 sp|E9QT94|RODB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|P41748|PEPA_ASPFU pepA P41748 0 sp|P41748|PEPA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|P87184|ALP2_ASPFU alp2 P87184 0 sp|P28296|ORYZ_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WBM1|VPS10_ASPFU vps10 Q4WBM1 1 sp|Q4WBM1|VPS10_ASPFU UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +sp|Q4WBU0|LP9C_ASPFU AA9C Q4WBU0 0 sp|Q4WBU0|LP9C_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WBW4|AXE1_ASPFU axeA Q4WBW4 0 sp|Q4WBW4|AXE1_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WD22|CRH1_ASPFU crh1 Q4WD22 0 sp|Q4WXE6|CRH3_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WEP7|CHIA1_ASPFU chiA1 Q4WEP7 0 sp|Q4WEP7|CHIA1_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WG11|XYNA_ASPFU xlnA Q4WG11 0 sp|Q4WLV2|XYNB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WG16|EGLC_ASPFU eglC Q4WG16 0 sp|Q4WG16|EGLC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WK60|EXGA_ASPFU exgA Q4WK60 0 sp|Q4WK60|EXGA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WLD1|PYR5_ASPFU pyr5 Q4WLD1 0 sp|Q4WLD1|PYR5_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WLW6|FMQD_ASPFU fmqD Q4WLW6 0 sp|Q4WLW6|FMQD_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WM08|CBHB_ASPFU cbhB Q4WM08 0 sp|Q4WM08|CBHB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WMA6|CFMB_ASPFU cfmB Q4WMA6 0 sp|Q4WMA6|CFMB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WMW2|CRH4_ASPFU crh4 Q4WMW2 0 sp|Q4WXE6|CRH3_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WNE1|CFMC_ASPFU cfmC Q4WNE1 0 sp|Q4WNE1|CFMC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WQ08|ADMB_ASPFU ADM-B Q4WQ08 0 sp|Q4WQ08|ADMB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WQS0|SIA_ASPFU Q4WQS0 0 sp|Q4WQS0|SIA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WQU0|SED4_ASPFU sed4 Q4WQU0 0 sp|Q4WQU0|SED4_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WR20|HELB3_ASPFU helB3 Q4WR20 0 sp|Q4WR22|HELB4_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WRZ5|MNS1B_ASPFU mns1B Q4WRZ5 0 sp|Q4WRZ5|MNS1B_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WXE6|CRH3_ASPFU crh3 Q4WXE6 0 sp|Q4WXE6|CRH3_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4X066|LP9A_ASPFU AA9A Q4X066 0 sp|Q4WBU0|LP9C_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q70DX9|SED1_ASPFU sed1 Q70DX9 0 sp|Q70DX9|SED1_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q70GH4|SED3_ASPFU sed3 Q70GH4 0 sp|Q4WQU0|SED4_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q8X176|PHOA_ASPFU phoA Q8X176 0 sp|Q8X176|PHOA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|A4DA70|AGALD_ASPFU aglD A4DA70 0 sp|Q4WE86|AGALB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|E9RCR4|GLIC_ASPFU gliC E9RCR4 0 sp|E9RCR4|GLIC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|P0C956|GEL4_ASPFU gel4 P0C956 0 sp|P0C954|GEL2_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|P0C959|DPP5_ASPFU P0C959 0 sp|P0C959|DPP5_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|P79017|ALL2_ASPFU P79017 0 sp|P79017|ALL2_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q0H904|XYNC_ASPFU xlnC Q0H904 0 sp|Q0H904|XYNC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4W8Z9|FAEB1_ASPFU faeB-1 Q4W8Z9 0 sp|Q4WMR0|FAEB2_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4W930|ABNC_ASPFU abnC Q4W930 0 sp|Q4WYX7|ABNA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4W9P4|LAP1_ASPFU lap1 Q4W9P4 0 sp|Q4W9P4|LAP1_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4W9T6|RGLA_ASPFU rglA Q4W9T6 0 sp|Q4W9T6|RGLA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4W9Z4|CUTI3_ASPFU Q4W9Z4 0 sp|Q4X1N0|CUTI1_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WA38|MNLOX_ASPFU Q4WA38 0 sp|Q4WA38|MNLOX_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WA45|NPIIC_ASPFU Q4WA45 0 sp|Q4WQR6|NPIIA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WAJ6|CELB_ASPFU celB Q4WAJ6 0 sp|Q4WM08|CBHB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WAY2|CWHLA_ASPFU cwhA Q4WAY2 0 sp|Q4WAY2|CWHLA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WBE1|PGLRB_ASPFU pgaB Q4WBE1 1 sp|Q4WBE1|PGLRB_ASPFU UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +sp|Q4WBK6|PGXB_ASPFU pgxB Q4WBK6 1 sp|Q4WBT4|XGHA_ASPFU UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +sp|Q4WBR2|NEG1_ASPFU neg1 Q4WBR2 0 sp|Q4WBR2|NEG1_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WBR8|RODC_ASPFU rodC Q4WBR8 0 sp|E9QT94|RODB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WBT4|XGHA_ASPFU xghA Q4WBT4 1 sp|Q4WBT4|XGHA_ASPFU UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +sp|Q4WBT5|PMEA_ASPFU pmeA Q4WBT5 0 sp|Q4WBT5|PMEA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WC60|BTGE_ASPFU btgE Q4WC60 0 sp|Q4WC60|BTGE_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WCG2|OS9_ASPFU yos9 Q4WCG2 0 sp|Q4WCG2|OS9_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WCX9|YA280_ASPFU Q4WCX9 0 sp|Q4WCX9|YA280_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WCZ8|PGLRX_ASPFU pgaX Q4WCZ8 1 sp|Q4WBT4|XGHA_ASPFU UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +sp|Q4WD44|FSQC_ASPFU fsqC Q4WD44 0 sp|Q4WD44|FSQC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WDN4|OPSB_ASPFU opsB Q4WDN4 0 sp|Q4WDN4|OPSB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WE86|AGALB_ASPFU aglB Q4WE86 0 sp|Q4WE86|AGALB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WEH3|LP11B_ASPFU AA11B Q4WEH3 0 sp|Q4WF00|LP11A_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WEK0|RODF_ASPFU rodF Q4WEK0 0 sp|Q4WEK0|RODF_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WER9|LYSMA_ASPFU ldpA Q4WER9 0 sp|Q4WRR0|LYSMB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WF00|LP11A_ASPFU AA11A Q4WF00 0 sp|Q4WF00|LP11A_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WFI6|BXLB_ASPFU bxlB Q4WFI6 0 sp|Q4WFI6|BXLB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WFK4|CBHC_ASPFU cbhC Q4WFK4 0 sp|Q4WFK4|CBHC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WFS2|Y1220_ASPFU Q4WFS2 0 sp|Q4WFS2|Y1220_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WFX9|LAP2_ASPFU lap2 Q4WFX9 0 sp|Q4WFX9|LAP2_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WG05|BGALE_ASPFU lacE Q4WG05 0 sp|Q4WNE4|BGALC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WGT3|BGLL_ASPFU bglL Q4WGT3 0 sp|Q4WGT3|BGLL_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WGU1|SED5_ASPFU sed5 Q4WGU1 0 sp|Q4WGU1|SED5_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WHX4|FKBP2_ASPFU fpr2 Q4WHX4 0 sp|Q4WHX4|FKBP2_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WIS6|PELB_ASPFU pelB Q4WIS6 0 sp|Q4WIS6|PELB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WIT0|PLYA_ASPFU plyA Q4WIT0 0 sp|Q4WIT0|PLYA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WJ80|GANA_ASPFU galA Q4WJ80 0 sp|Q4WJ80|GANA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WJJ3|BGLA_ASPFU bglA Q4WJJ3 0 sp|Q4WGT3|BGLL_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WJU8|XGEA_ASPFU xgeA Q4WJU8 0 sp|Q4WJU8|XGEA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WKX2|FGND_ASPFU Q4WKX2 0 sp|Q4WKX2|FGND_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WL66|ABFB_ASPFU abfB Q4WL66 0 sp|Q4WL66|ABFB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WL88|PLYC_ASPFU plyC Q4WL88 0 sp|Q4WL88|PLYC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WLV2|XYNB_ASPFU xlnB Q4WLV2 0 sp|Q4WLV2|XYNB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WMR0|FAEB2_ASPFU faeB-2 Q4WMR0 0 sp|Q4WMR0|FAEB2_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WMS9|MANBA_ASPFU mndA Q4WMS9 0 sp|Q4WMS9|MANBA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WMU3|BGLF_ASPFU bglF Q4WMU3 0 sp|Q4WGT3|BGLL_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WNA2|CBHA_ASPFU cbhA Q4WNA2 0 sp|Q4WM08|CBHB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WNE4|BGALC_ASPFU lacC Q4WNE4 0 sp|Q4WNE4|BGALC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WNS8|ECM33_ASPFU ecm33 Q4WNS8 0 sp|Q4WNS8|ECM33_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WNV0|CTSD_ASPFU ctsD Q4WNV0 0 sp|O42630|CARP_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WP12|PPIB_ASPFU cpr2 Q4WP12 0 sp|Q4WP12|PPIB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WPH9|DPP4_ASPFU dpp4 Q4WPH9 0 sp|Q4WPH9|DPP4_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WQL0|TMEDA_ASPFU erv25 Q4WQL0 0 sp|Q4WQL0|TMEDA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WQR6|NPIIA_ASPFU Q4WQR6 0 sp|Q4WQR6|NPIIA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WQT2|PGLRA_ASPFU pgaA Q4WQT2 1 sp|Q4WBE1|PGLRB_ASPFU UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +sp|Q4WQV2|CUTI2_ASPFU Q4WQV2 0 sp|Q4X1N0|CUTI1_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WQY8|TPCJ_ASPFU tpcJ Q4WQY8 0 sp|Q4WQY8|TPCJ_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WR18|HELB2_ASPFU helB2 Q4WR18 0 sp|Q4WR22|HELB4_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WR19|HELC_ASPFU helC Q4WR19 0 sp|Q4WR19|HELC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WR22|HELB4_ASPFU helB4 Q4WR22 0 sp|Q4WR22|HELB4_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WR62|BGLM_ASPFU bglM Q4WR62 0 sp|Q4WGT3|BGLL_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WR80|PGLR_ASPFU Q4WR80 1 sp|Q4WBE1|PGLRB_ASPFU UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +sp|Q4WRB0|XYND_ASPFU xlnD Q4WRB0 0 sp|Q4WFI6|BXLB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WRD3|BGALB_ASPFU lacB Q4WRD3 0 sp|Q4WNE4|BGALC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WRH9|AGDC_ASPFU agdC Q4WRH9 0 sp|Q4WRH9|AGDC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WRR0|LYSMB_ASPFU ldpB Q4WRR0 0 sp|Q4WRR0|LYSMB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WS33|BGALA_ASPFU lacA Q4WS33 0 sp|Q4WNE4|BGALC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WTB3|ABFC_ASPFU abfC Q4WTB3 0 sp|Q4WTB3|ABFC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WTK9|KEX1_ASPFU kex1 Q4WTK9 0 sp|Q4WTK9|KEX1_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WV10|PELA_ASPFU pelA Q4WV10 0 sp|Q4WIS6|PELB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WV23|RHGB_ASPFU rhgB Q4WV23 0 sp|Q4WV23|RHGB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WVZ3|AGALA_ASPFU aglA Q4WVZ3 0 sp|Q4WVZ3|AGALA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WW45|AGUA_ASPFU aguA Q4WW45 0 sp|Q4WW45|AGUA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WX94|PGXC_ASPFU pgxC Q4WX94 1 sp|Q4WX94|PGXC_ASPFU UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +sp|Q4WXZ5|RNY1_ASPFU rny1 Q4WXZ5 0 sp|Q4WXZ5|RNY1_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WYX7|ABNA_ASPFU abnA Q4WYX7 0 sp|Q4WYX7|ABNA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WZ11|IELA_ASPFU Q4WZ11 0 sp|Q4WZ11|IELA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WZ61|EASE_ASPFU easE Q4WZ61 0 sp|Q4WZ61|EASE_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WZ68|EASK_ASPFU easK Q4WZ68 0 sp|Q4WZ68|EASK_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4X055|RODG_ASPFU rodG Q4X055 0 sp|Q4X055|RODG_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4X084|EGLX_ASPFU Q4X084 0 sp|Q4X084|EGLX_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4X0A5|ABNB_ASPFU abnB Q4X0A5 0 sp|Q4WYX7|ABNA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4X136|NPC2_ASPFU npc2 Q4X136 0 sp|Q4X136|NPC2_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4X1N0|CUTI1_ASPFU Q4X1N0 0 sp|Q4X1N0|CUTI1_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4X1N4|EXGB_ASPFU exgB Q4X1N4 0 sp|Q4X1N4|EXGB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4X1U0|ECM14_ASPFU ecm14 Q4X1U0 0 sp|Q4X1U0|ECM14_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q5VJG9|CBPYA_ASPFU cpyA Q5VJG9 0 sp|Q5VJG9|CBPYA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q6Q487|CALX_ASPFU Q6Q487 0 sp|Q6Q487|CALX_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|A4D9B6|FAEC_ASPFU faeC A4D9B6 0 sp|A4D9B6|FAEC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|O42799|ALL7_ASPFU O42799 0 sp|O42799|ALL7_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|O60022|AL15_ASPFU O60022 0 sp|O60022|AL15_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|O60024|ALL4_ASPFU O60024 0 sp|O60024|ALL4_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WA60|NSCC_ASPFU nscC Q4WA60 0 sp|Q4WA60|NSCC_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WB37|CSN_ASPFU csn Q4WB37 0 sp|Q4WB37|CSN_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WC29|PLYE_ASPFU plyE Q4WC29 0 sp|Q4WKV8|PLYF_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WFV6|YA880_ASPFU Q4WFV6 0 sp|Q4WFV6|YA880_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WGV9|PLYD_ASPFU plyD Q4WGV9 0 sp|Q4WKV8|PLYF_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WJ01|MEP1_ASPFU Q4WJ01 0 sp|Q4WJ01|MEP1_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WKV8|PLYF_ASPFU plyF Q4WKV8 0 sp|Q4WKV8|PLYF_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WNC9|P20D1_ASPFU Q4WNC9 0 sp|Q4WNC9|P20D1_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WR79|RGLB_ASPFU rglB Q4WR79 0 sp|Q4WR79|RGLB_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WTC7|NPR3_ASPFU npr3 Q4WTC7 0 sp|Q4WTC7|NPR3_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WUK7|X325_ASPFU X325 Q4WUK7 0 sp|Q4WUK7|X325_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WZS3|Y5950_ASPFU Q4WZS3 0 sp|P41748|PEPA_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WC84|YFAS1_ASPFU Q4WC84 0 sp|Q4WC84|YFAS1_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +sp|Q4WES5|LCL2_ASPFU lcl2 Q4WES5 0 sp|Q4WES5|LCL2_ASPFU UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown diff --git a/analysis/calibration_truth/repeat_call_truth/truth_v2.Afum_Af293_UniProt.tsv b/analysis/calibration_truth/repeat_call_truth/truth_v2.Afum_Af293_UniProt.tsv new file mode 100644 index 0000000..e343973 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/truth_v2.Afum_Af293_UniProt.tsv @@ -0,0 +1,168 @@ +id label cluster +sp|E9QSG0|DSCA_ASPFU 0 sp|E9QSG0|DSCA_ASPFU +sp|E9RBR0|ABR2_ASPFU 0 sp|E9RBR0|ABR2_ASPFU +sp|O00092|PHYA_ASPFU 0 sp|O00092|PHYA_ASPFU +sp|P28296|ORYZ_ASPFU 0 sp|P28296|ORYZ_ASPFU +sp|P46075|ELM_ASPFU 0 sp|P46075|ELM_ASPFU +sp|P67875|RNMG_ASPFU 0 sp|P67875|RNMG_ASPFU +sp|Q4WBS1|MANF_ASPFU 0 sp|Q4WBS1|MANF_ASPFU +sp|Q4WGL5|SUN1_ASPFU 0 sp|Q4WGL5|SUN1_ASPFU +sp|Q4WI46|CRH2_ASPFU 0 sp|Q4WI46|CRH2_ASPFU +sp|Q4WKP8|IREA_ASPFU 0 sp|Q4WKP8|IREA_ASPFU +sp|Q4WL81|NADA_ASPFU 0 sp|Q4WL81|NADA_ASPFU +sp|Q4WLB9|CFMA_ASPFU 0 sp|Q4WLB9|CFMA_ASPFU +sp|Q4WP32|LP9B_ASPFU 0 sp|Q4WBU0|LP9C_ASPFU +sp|Q4WR75|FREB_ASPFU 0 sp|Q4WR75|FREB_ASPFU +sp|Q4WZB4|ABR1_ASPFU 0 sp|E9R598|FETC_ASPFU +sp|Q70J59|SED2_ASPFU 0 sp|Q4WQU0|SED4_ASPFU +sp|Q8J0P4|CRH5_ASPFU 0 sp|Q4WXE6|CRH3_ASPFU +sp|Q92405|CATB_ASPFU 0 sp|Q92405|CATB_ASPFU +sp|A4DA41|SPYC_ASPFU 0 sp|Q4WLD1|PYR5_ASPFU +sp|E9QRF2|CHIB1_ASPFU 0 sp|E9QRF2|CHIB1_ASPFU +sp|E9QT94|RODB_ASPFU 0 sp|E9QT94|RODB_ASPFU +sp|E9R598|FETC_ASPFU 0 sp|E9R598|FETC_ASPFU +sp|O42630|CARP_ASPFU 0 sp|O42630|CARP_ASPFU +sp|P0C7S9|GEL1_ASPFU 0 sp|P0C954|GEL2_ASPFU +sp|P0C954|GEL2_ASPFU 0 sp|P0C954|GEL2_ASPFU +sp|P0C955|GEL3_ASPFU 0 sp|P0C954|GEL2_ASPFU +sp|P0C957|PLB1_ASPFU 0 sp|P0C958|PLB3_ASPFU +sp|P0C958|PLB3_ASPFU 0 sp|P0C958|PLB3_ASPFU +sp|P41746|RODA_ASPFU 0 sp|E9QT94|RODB_ASPFU +sp|P41748|PEPA_ASPFU 0 sp|P41748|PEPA_ASPFU +sp|P87184|ALP2_ASPFU 0 sp|P28296|ORYZ_ASPFU +sp|Q4WBM1|VPS10_ASPFU 1 sp|Q4WBM1|VPS10_ASPFU +sp|Q4WBU0|LP9C_ASPFU 0 sp|Q4WBU0|LP9C_ASPFU +sp|Q4WBW4|AXE1_ASPFU 0 sp|Q4WBW4|AXE1_ASPFU +sp|Q4WD22|CRH1_ASPFU 0 sp|Q4WXE6|CRH3_ASPFU +sp|Q4WEP7|CHIA1_ASPFU 0 sp|Q4WEP7|CHIA1_ASPFU +sp|Q4WG11|XYNA_ASPFU 0 sp|Q4WLV2|XYNB_ASPFU +sp|Q4WG16|EGLC_ASPFU 0 sp|Q4WG16|EGLC_ASPFU +sp|Q4WK60|EXGA_ASPFU 0 sp|Q4WK60|EXGA_ASPFU +sp|Q4WLD1|PYR5_ASPFU 0 sp|Q4WLD1|PYR5_ASPFU +sp|Q4WLW6|FMQD_ASPFU 0 sp|Q4WLW6|FMQD_ASPFU +sp|Q4WM08|CBHB_ASPFU 0 sp|Q4WM08|CBHB_ASPFU +sp|Q4WMA6|CFMB_ASPFU 0 sp|Q4WMA6|CFMB_ASPFU +sp|Q4WMW2|CRH4_ASPFU 0 sp|Q4WXE6|CRH3_ASPFU +sp|Q4WNE1|CFMC_ASPFU 0 sp|Q4WNE1|CFMC_ASPFU +sp|Q4WQ08|ADMB_ASPFU 0 sp|Q4WQ08|ADMB_ASPFU +sp|Q4WQS0|SIA_ASPFU 0 sp|Q4WQS0|SIA_ASPFU +sp|Q4WQU0|SED4_ASPFU 0 sp|Q4WQU0|SED4_ASPFU +sp|Q4WR20|HELB3_ASPFU 0 sp|Q4WR22|HELB4_ASPFU +sp|Q4WRZ5|MNS1B_ASPFU 0 sp|Q4WRZ5|MNS1B_ASPFU +sp|Q4WXE6|CRH3_ASPFU 0 sp|Q4WXE6|CRH3_ASPFU +sp|Q4X066|LP9A_ASPFU 0 sp|Q4WBU0|LP9C_ASPFU +sp|Q70DX9|SED1_ASPFU 0 sp|Q70DX9|SED1_ASPFU +sp|Q70GH4|SED3_ASPFU 0 sp|Q4WQU0|SED4_ASPFU +sp|Q8X176|PHOA_ASPFU 0 sp|Q8X176|PHOA_ASPFU +sp|A4DA70|AGALD_ASPFU 0 sp|Q4WE86|AGALB_ASPFU +sp|E9RCR4|GLIC_ASPFU 0 sp|E9RCR4|GLIC_ASPFU +sp|P0C956|GEL4_ASPFU 0 sp|P0C954|GEL2_ASPFU +sp|P0C959|DPP5_ASPFU 0 sp|P0C959|DPP5_ASPFU +sp|P79017|ALL2_ASPFU 0 sp|P79017|ALL2_ASPFU +sp|Q0H904|XYNC_ASPFU 0 sp|Q0H904|XYNC_ASPFU +sp|Q4W8Z9|FAEB1_ASPFU 0 sp|Q4WMR0|FAEB2_ASPFU +sp|Q4W930|ABNC_ASPFU 0 sp|Q4WYX7|ABNA_ASPFU +sp|Q4W9P4|LAP1_ASPFU 0 sp|Q4W9P4|LAP1_ASPFU +sp|Q4W9T6|RGLA_ASPFU 0 sp|Q4W9T6|RGLA_ASPFU +sp|Q4W9Z4|CUTI3_ASPFU 0 sp|Q4X1N0|CUTI1_ASPFU +sp|Q4WA38|MNLOX_ASPFU 0 sp|Q4WA38|MNLOX_ASPFU +sp|Q4WA45|NPIIC_ASPFU 0 sp|Q4WQR6|NPIIA_ASPFU +sp|Q4WAJ6|CELB_ASPFU 0 sp|Q4WM08|CBHB_ASPFU +sp|Q4WAY2|CWHLA_ASPFU 0 sp|Q4WAY2|CWHLA_ASPFU +sp|Q4WBE1|PGLRB_ASPFU 1 sp|Q4WBE1|PGLRB_ASPFU +sp|Q4WBK6|PGXB_ASPFU 1 sp|Q4WBT4|XGHA_ASPFU +sp|Q4WBR2|NEG1_ASPFU 0 sp|Q4WBR2|NEG1_ASPFU +sp|Q4WBR8|RODC_ASPFU 0 sp|E9QT94|RODB_ASPFU +sp|Q4WBT4|XGHA_ASPFU 1 sp|Q4WBT4|XGHA_ASPFU +sp|Q4WBT5|PMEA_ASPFU 0 sp|Q4WBT5|PMEA_ASPFU +sp|Q4WC60|BTGE_ASPFU 0 sp|Q4WC60|BTGE_ASPFU +sp|Q4WCG2|OS9_ASPFU 0 sp|Q4WCG2|OS9_ASPFU +sp|Q4WCX9|YA280_ASPFU 0 sp|Q4WCX9|YA280_ASPFU +sp|Q4WCZ8|PGLRX_ASPFU 1 sp|Q4WBT4|XGHA_ASPFU +sp|Q4WD44|FSQC_ASPFU 0 sp|Q4WD44|FSQC_ASPFU +sp|Q4WDN4|OPSB_ASPFU 0 sp|Q4WDN4|OPSB_ASPFU +sp|Q4WE86|AGALB_ASPFU 0 sp|Q4WE86|AGALB_ASPFU +sp|Q4WEH3|LP11B_ASPFU 0 sp|Q4WF00|LP11A_ASPFU +sp|Q4WEK0|RODF_ASPFU 0 sp|Q4WEK0|RODF_ASPFU +sp|Q4WER9|LYSMA_ASPFU 0 sp|Q4WRR0|LYSMB_ASPFU +sp|Q4WF00|LP11A_ASPFU 0 sp|Q4WF00|LP11A_ASPFU +sp|Q4WFI6|BXLB_ASPFU 0 sp|Q4WFI6|BXLB_ASPFU +sp|Q4WFK4|CBHC_ASPFU 0 sp|Q4WFK4|CBHC_ASPFU +sp|Q4WFS2|Y1220_ASPFU 0 sp|Q4WFS2|Y1220_ASPFU +sp|Q4WFX9|LAP2_ASPFU 0 sp|Q4WFX9|LAP2_ASPFU +sp|Q4WG05|BGALE_ASPFU 0 sp|Q4WNE4|BGALC_ASPFU +sp|Q4WGT3|BGLL_ASPFU 0 sp|Q4WGT3|BGLL_ASPFU +sp|Q4WGU1|SED5_ASPFU 0 sp|Q4WGU1|SED5_ASPFU +sp|Q4WHX4|FKBP2_ASPFU 0 sp|Q4WHX4|FKBP2_ASPFU +sp|Q4WIS6|PELB_ASPFU 0 sp|Q4WIS6|PELB_ASPFU +sp|Q4WIT0|PLYA_ASPFU 0 sp|Q4WIT0|PLYA_ASPFU +sp|Q4WJ80|GANA_ASPFU 0 sp|Q4WJ80|GANA_ASPFU +sp|Q4WJJ3|BGLA_ASPFU 0 sp|Q4WGT3|BGLL_ASPFU +sp|Q4WJU8|XGEA_ASPFU 0 sp|Q4WJU8|XGEA_ASPFU +sp|Q4WKX2|FGND_ASPFU 0 sp|Q4WKX2|FGND_ASPFU +sp|Q4WL66|ABFB_ASPFU 0 sp|Q4WL66|ABFB_ASPFU +sp|Q4WL88|PLYC_ASPFU 0 sp|Q4WL88|PLYC_ASPFU +sp|Q4WLV2|XYNB_ASPFU 0 sp|Q4WLV2|XYNB_ASPFU +sp|Q4WMR0|FAEB2_ASPFU 0 sp|Q4WMR0|FAEB2_ASPFU +sp|Q4WMS9|MANBA_ASPFU 0 sp|Q4WMS9|MANBA_ASPFU +sp|Q4WMU3|BGLF_ASPFU 0 sp|Q4WGT3|BGLL_ASPFU +sp|Q4WNA2|CBHA_ASPFU 0 sp|Q4WM08|CBHB_ASPFU +sp|Q4WNE4|BGALC_ASPFU 0 sp|Q4WNE4|BGALC_ASPFU +sp|Q4WNS8|ECM33_ASPFU 0 sp|Q4WNS8|ECM33_ASPFU +sp|Q4WNV0|CTSD_ASPFU 0 sp|O42630|CARP_ASPFU +sp|Q4WP12|PPIB_ASPFU 0 sp|Q4WP12|PPIB_ASPFU +sp|Q4WPH9|DPP4_ASPFU 0 sp|Q4WPH9|DPP4_ASPFU +sp|Q4WQL0|TMEDA_ASPFU 0 sp|Q4WQL0|TMEDA_ASPFU +sp|Q4WQR6|NPIIA_ASPFU 0 sp|Q4WQR6|NPIIA_ASPFU +sp|Q4WQT2|PGLRA_ASPFU 1 sp|Q4WBE1|PGLRB_ASPFU +sp|Q4WQV2|CUTI2_ASPFU 0 sp|Q4X1N0|CUTI1_ASPFU +sp|Q4WQY8|TPCJ_ASPFU 0 sp|Q4WQY8|TPCJ_ASPFU +sp|Q4WR18|HELB2_ASPFU 0 sp|Q4WR22|HELB4_ASPFU +sp|Q4WR19|HELC_ASPFU 0 sp|Q4WR19|HELC_ASPFU +sp|Q4WR22|HELB4_ASPFU 0 sp|Q4WR22|HELB4_ASPFU +sp|Q4WR62|BGLM_ASPFU 0 sp|Q4WGT3|BGLL_ASPFU +sp|Q4WR80|PGLR_ASPFU 1 sp|Q4WBE1|PGLRB_ASPFU +sp|Q4WRB0|XYND_ASPFU 0 sp|Q4WFI6|BXLB_ASPFU +sp|Q4WRD3|BGALB_ASPFU 0 sp|Q4WNE4|BGALC_ASPFU +sp|Q4WRH9|AGDC_ASPFU 0 sp|Q4WRH9|AGDC_ASPFU +sp|Q4WRR0|LYSMB_ASPFU 0 sp|Q4WRR0|LYSMB_ASPFU +sp|Q4WS33|BGALA_ASPFU 0 sp|Q4WNE4|BGALC_ASPFU +sp|Q4WTB3|ABFC_ASPFU 0 sp|Q4WTB3|ABFC_ASPFU +sp|Q4WTK9|KEX1_ASPFU 0 sp|Q4WTK9|KEX1_ASPFU +sp|Q4WV10|PELA_ASPFU 0 sp|Q4WIS6|PELB_ASPFU +sp|Q4WV23|RHGB_ASPFU 0 sp|Q4WV23|RHGB_ASPFU +sp|Q4WVZ3|AGALA_ASPFU 0 sp|Q4WVZ3|AGALA_ASPFU +sp|Q4WW45|AGUA_ASPFU 0 sp|Q4WW45|AGUA_ASPFU +sp|Q4WX94|PGXC_ASPFU 1 sp|Q4WX94|PGXC_ASPFU +sp|Q4WXZ5|RNY1_ASPFU 0 sp|Q4WXZ5|RNY1_ASPFU +sp|Q4WYX7|ABNA_ASPFU 0 sp|Q4WYX7|ABNA_ASPFU +sp|Q4WZ11|IELA_ASPFU 0 sp|Q4WZ11|IELA_ASPFU +sp|Q4WZ61|EASE_ASPFU 0 sp|Q4WZ61|EASE_ASPFU +sp|Q4WZ68|EASK_ASPFU 0 sp|Q4WZ68|EASK_ASPFU +sp|Q4X055|RODG_ASPFU 0 sp|Q4X055|RODG_ASPFU +sp|Q4X084|EGLX_ASPFU 0 sp|Q4X084|EGLX_ASPFU +sp|Q4X0A5|ABNB_ASPFU 0 sp|Q4WYX7|ABNA_ASPFU +sp|Q4X136|NPC2_ASPFU 0 sp|Q4X136|NPC2_ASPFU +sp|Q4X1N0|CUTI1_ASPFU 0 sp|Q4X1N0|CUTI1_ASPFU +sp|Q4X1N4|EXGB_ASPFU 0 sp|Q4X1N4|EXGB_ASPFU +sp|Q4X1U0|ECM14_ASPFU 0 sp|Q4X1U0|ECM14_ASPFU +sp|Q5VJG9|CBPYA_ASPFU 0 sp|Q5VJG9|CBPYA_ASPFU +sp|Q6Q487|CALX_ASPFU 0 sp|Q6Q487|CALX_ASPFU +sp|A4D9B6|FAEC_ASPFU 0 sp|A4D9B6|FAEC_ASPFU +sp|O42799|ALL7_ASPFU 0 sp|O42799|ALL7_ASPFU +sp|O60022|AL15_ASPFU 0 sp|O60022|AL15_ASPFU +sp|O60024|ALL4_ASPFU 0 sp|O60024|ALL4_ASPFU +sp|Q4WA60|NSCC_ASPFU 0 sp|Q4WA60|NSCC_ASPFU +sp|Q4WB37|CSN_ASPFU 0 sp|Q4WB37|CSN_ASPFU +sp|Q4WC29|PLYE_ASPFU 0 sp|Q4WKV8|PLYF_ASPFU +sp|Q4WFV6|YA880_ASPFU 0 sp|Q4WFV6|YA880_ASPFU +sp|Q4WGV9|PLYD_ASPFU 0 sp|Q4WKV8|PLYF_ASPFU +sp|Q4WJ01|MEP1_ASPFU 0 sp|Q4WJ01|MEP1_ASPFU +sp|Q4WKV8|PLYF_ASPFU 0 sp|Q4WKV8|PLYF_ASPFU +sp|Q4WNC9|P20D1_ASPFU 0 sp|Q4WNC9|P20D1_ASPFU +sp|Q4WR79|RGLB_ASPFU 0 sp|Q4WR79|RGLB_ASPFU +sp|Q4WTC7|NPR3_ASPFU 0 sp|Q4WTC7|NPR3_ASPFU +sp|Q4WUK7|X325_ASPFU 0 sp|Q4WUK7|X325_ASPFU +sp|Q4WZS3|Y5950_ASPFU 0 sp|P41748|PEPA_ASPFU +sp|Q4WC84|YFAS1_ASPFU 0 sp|Q4WC84|YFAS1_ASPFU +sp|Q4WES5|LCL2_ASPFU 0 sp|Q4WES5|LCL2_ASPFU diff --git a/analysis/calibration_truth/repeat_call_truth/truth_v2.Calb_SC5314.annotated.tsv b/analysis/calibration_truth/repeat_call_truth/truth_v2.Calb_SC5314.annotated.tsv new file mode 100644 index 0000000..0098167 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/truth_v2.Calb_SC5314.annotated.tsv @@ -0,0 +1,227 @@ +id gene accession label cluster basis curated_class evidence tuned_or_homolog +C1_12510W_A RAX2 A0A1D8PFE5 0 C1_12510W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C3_01550C_A TOS1 A0A1D8PJA8 0 C2_00100C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C6_03710W_A ALS9 A0A1D8PQ86 1 CR_07070C_A UniProt >=2 repeat features adhesin E1 yes +C6_04130C_A ALS4 A0A1D8PQB9 1 CR_07070C_A UniProt >=2 repeat features adhesin E1 yes +C7_00090C_A CSA1 G1UB63 0 C7_00090C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_09530W_A EAP1 G1UBC2 1 C2_09530W_A UniProt >=2 repeat features adhesin E1 no +C1_00220W_A PHR2 O13318 0 C5_05390C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C6_03490C_A SAP1 P0CY27 0 C3_05230W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C3_05230W_A SAP3 P0CY29 0 C3_05230W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +CR_07800W_A SAP2 P0DJ06 0 C3_05230W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C1_02990C_A XOG1 P29717 0 C1_02990C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C5_04130C_A CHT2 P40953 0 CR_00180C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_10110W_A CHT3 P40954 0 CR_00180C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_04530C_A PHR1 P43076 0 C5_05390C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C6_03030W_A SAP5 P43094 0 C3_05230W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_03570W_A HWP1 P46593 1 C4_03570W_A UniProt >=2 repeat features adhesin E1 yes +C4_06980W_A PRA1 P87020 0 C4_06980W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - yes +C4_03470C_A ECE1 Q07730 0 C4_03470C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_04400C_A APE2 Q59KZ1 0 C1_04400C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_07070C_A ALS3 Q59L12 1 CR_07070C_A paper statement adhesin E1 yes +C6_00820W_A SUN41 Q59NP5 0 C1_13940W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C2_08870C_A PIR1 Q59SF7 1 C2_08870C_A UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +C3_03870C_A SAP9 Q59SU1 0 C3_05230W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C4_03520C_A RBT1 Q59TP1 0 C4_03570W_A no UniProt repeat feature (assumed negative) adhesin E2 no +C4_00450C_A PGA10 Q59UP6 0 C4_06920C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_00130W_A RBT5 Q59UT4 0 C4_06920C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C4_00120W_A PGA7 Q59UT5 0 C4_06920C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_04870W_A SAP7 Q59VH7 0 C3_05230W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_10830W_A BIG1 Q59WG7 0 C1_10830W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C2_10030C_A MP65 Q59XX2 0 C2_10030C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C2_08590W_A YWP1 Q59Y31 0 C2_08590W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C4_06920C_A CSA2 Q5A0X8 0 C4_06920C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C3_06320W_A ALS7 Q5A312 1 CR_07070C_A UniProt >=2 repeat features adhesin E1 yes +CR_08510W_A PGA13 Q5A343 0 CR_08510W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_05770C_A CFL1 Q5A446 0 C4_05770C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C6_01720C_A SUR7 Q5A4M8 0 C6_01720C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_04050C_A RHD3 Q5A5U4 0 C4_04050C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_04470W_A SAP10 Q5A651 0 C3_05230W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C6_03500C_A SAP4 Q5A8N2 0 C3_05230W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C6_03700W_A ALS1 Q5A8T4 1 CR_07070C_A paper statement adhesin E1 yes +C6_03690W_A ALS5 Q5A8T7 1 CR_07070C_A UniProt >=2 repeat features adhesin E1 yes +CR_00610W_A IFF4 Q5AAL9 0 C5_00730W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_06940C_A ATC1 Q5AAU5 0 C1_06940C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C6_02710C_A SAP6 Q5AC08 0 C3_05230W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_00240C_A SOD6 Q5ACV9 0 C2_00240C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_00520W_A DFG5 Q5ACZ2 0 C2_00520W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_00660C_A SOD4 Q5AD05 0 C2_00680C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_00680C_A SOD5 Q5AD07 0 C2_00680C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C3_02510C_A SAP8 Q5AEM6 0 C3_05230W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_02370C_A PGA59 Q5AF39 0 C4_02370C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_02390W_A PGA62 Q5AF41 0 C4_02370C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_02900C_A CRH11 Q5AFA2 0 C4_02900C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C7_00860W_A SSR1 Q5AFN8 0 C7_00860W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_03680W_A ENG1 Q5AIR7 0 C1_03680W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C3_01730C_A UTR2 Q5AJC0 0 C3_01730C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C5_05390C_A PGA4 Q5AJY5 0 C5_05390C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C5_04800W_A CRH12 Q5AK54 0 C4_02900C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_13450W_A HYR1 Q5AL03 0 C5_00730W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_02250C_A BGL2 Q5AMT2 0 C4_02250C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C1_10400C_A FGR41 Q5AP52 0 C1_10400C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C7_02830C_A LIP5 Q9P8W0 0 CR_09220C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C6_01990W_A PLB1 Q9UWF6 0 C6_01990W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_06970C_A ZRT101 A0A1D8PMR6 0 C4_06970C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_10290W_A GAM1 O74254 0 C1_10290W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_09580C_A LIP1 O94091 0 CR_09220C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_03510C_A HWP2 Q59PF9 0 C3_03050C_A no UniProt repeat feature (assumed negative) adhesin E1 no +C1_07620C_A PIR32 Q59PW0 0 C1_07620C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_02360C_A PGA5 Q59VW6 0 C5_05390C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C5_00730W_A HYR3 Q59XA7 0 C5_00730W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_09130C_A IFF6 Q59XL0 0 C5_00730W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_14120C_A RBE1 Q59ZX3 0 C1_07030C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_10470C_A ATG27 Q5A5S7 0 C2_10470C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_04070C_A PGA30 Q5A5U6 0 C4_04050C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C3_00600W_A IFF11 Q5A7R7 0 C3_00600W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_00760C_A HYR4 Q5A849 0 C5_00730W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_05760C_A PGA26 Q5AA09 0 C1_05760C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_00180C_A CHT1 Q5AAH2 0 CR_00180C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_07030C_A RBT4 Q5AB48 0 C1_07030C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_10480W_A PGA1 Q5ACL7 0 CR_03790C_A no UniProt repeat feature (assumed negative) adhesin E2 no +C2_01360C_A DCW1 Q5AD78 0 C2_00520W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C5_02460C_A ECM331 Q5AGC4 0 C5_02460C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_02630C_A EXG2 Q5AIA1 0 C1_02990C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C3_02300W_A FGR23 Q5AJV5 0 C3_02300W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_13940W_A SIM1 Q5AKU5 0 C1_13940W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C7_03300C_A LIP8 Q9P8V9 0 CR_09220C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_09420W_A LIP2 Q9P8W5 0 CR_09220C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_10050W_A HNV1 A0A1D8PES5 0 C1_10050W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_00100C_A PGA52 Q59L72 0 C2_00100C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C6_00070C_A PGA25 Q59L86 0 C6_00070C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C6_00160W_A PGA48 Q59L96 0 C6_00160W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_05120W_A BTN1 Q59LX9 0 C1_05120W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_07580C_A PRY1 Q59PV6 0 C1_07030C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_08980C_A PGA55 Q59SG9 1 C2_08980C_A UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +CR_02280W_A PGA23 Q59V01 0 CR_02280W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C5_00710W_A IFF8 Q59XB0 0 C5_00730W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_10010C_A IRC22-2 Q59XW9 0 C2_09780C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_09780C_A IRC22-1 Q59YF4 0 C2_09780C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_03630W_A IFF3 Q5A029 0 C5_00730W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_06310C_A PGA41 Q5A1B3 0 C4_06560W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_06550C_A IFF5 Q5A1E0 0 C5_00730W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C3_06250W_A ERV25 Q5A302 0 C3_06250W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C5_00270W_A PGA14 Q5A4X8 0 C5_00270W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C7_03110W_A PGA28 Q5A5K7 0 C7_03110W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C7_03290C_A RBR3 Q5A5M7 0 C5_00730W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_04440C_A RBR1 Q5A6M0 0 CR_04440C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_04420C_A RBR2 Q5A6M2 0 CR_04420C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_03880W_A IFF9 Q5A6U1 0 C5_00730W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C6_03860C_A PGA61 Q5A8I6 0 C6_03860C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C6_03850C_A IHD1 Q5A8I8 0 C6_03850C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_05960W_A PGA45 Q5AA33 0 C1_05960W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_07040C_A Q5AB49 0 C1_07030C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_10210W_A PGA12 Q5ACP5 0 CR_10210W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_10020C_A YOS9 Q5ACR4 0 CR_10020C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_00910W_A PGA19 Q5AD34 0 C2_00910W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C3_07160W_A PGA32 Q5ADQ7 0 C3_07160W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C3_03050C_A PGA18 Q5AEG7 1 C3_03050C_A UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +C7_00940W_A KEX1 Q5AFP8 0 C7_00940W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C7_01560C_A NUP Q5AGW8 0 C7_01560C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_03350W_A PGA17 Q5AHA4 0 C2_03350W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_03720W_A PGA16 Q5AHE8 0 C2_03720W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_03600W_A Q5AHZ2 0 C1_03600W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C5_04400W_A RNY1-A Q5AK94 0 C5_04400W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C5_04370C_A PGA37 Q5AK97 0 C5_04370C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C5_04260W_A RNY1-B Q5AKB1 0 C5_04400W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_01000C_A PGA57 Q5AMF7 0 C5_04370C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_09080C_A PGA6 Q5APJ9 0 C1_09080C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_09590C_A LIP10 Q9P4E5 0 CR_09220C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C7_02880C_A LIP9 Q9P4E6 0 CR_09220C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_09220C_A LIP7 Q9P4E7 0 CR_09220C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_09600C_A LIP6 Q9P4E8 0 CR_09220C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C6_04490W_A LIP4 Q9P8W1 0 CR_09220C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_09900W_A LIP3 Q9P8W2 0 CR_09220C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_03790C_A KRE1 P0CY22 0 CR_03790C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_06260W_A PGA50 Q59MD0 0 C1_06260W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_04900C_A PGA39 Q59N10 0 CR_04900C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_05920C_A PGA49 Q59QA5 0 C4_05920C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_02290W_A PGA22 Q59V02 0 CR_02290W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_10810W_A Q59WG5 0 C1_10810W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_08430C_A PGA46 Q59Y11 0 C2_08430C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_06260W_A PGA43 Q5A1A9 0 C4_06260W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_06300C_A PGA42 Q5A1B2 0 C4_06560W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_06560W_A PGA15 Q5A1E1 0 C4_06560W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_02750C_A PGA34 Q5A210 0 CR_02750C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_08680C_A NPR3 Q5A319 0 CR_08680C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_08350W_A SIL1 Q5A360 0 CR_08350W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_01280C_A NPC2 Q5A8A2 0 CR_01280C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_00770C_A ROT1 Q5ABP8 0 C1_00770C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C6_03060W_A PGA60 Q5ABW2 0 C6_03060W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_10330W_A PGA11 Q5ACN3 0 CR_10330W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_00800C_A PGA27 Q5AD23 0 C2_00800C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_03070W_A PGA54 Q5AFC2 0 C4_03070W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C5_03050C_A PGA58 Q5AG46 0 C5_03050C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C2_03440W_A PGA33 Q5AHC0 0 C2_03440W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C1_03120W_A Q5AI48 0 C1_03120W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C3_01370C_A PGA44 Q5AJK6 0 C3_01370C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C4_01360W_A PGA53 Q5AMJ5 0 C4_01360W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C3_05020W_A MTC6 Q5AND1 0 C3_05020W_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +CR_05800C_A LCL2 Q59PT4 0 CR_05800C_A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +C3_06190C_A ALS6 Q5A2Z7 1 CR_07070C_A UniProt >=2 repeat features adhesin E1 yes +C6_04380W_A ALS2 P0CU38 1 CR_07070C_A UniProt >=2 repeat features adhesin E2 yes +CR_07440W_A ACE2 Q59RR0 0 CR_07440W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C1_10860C_A ADA2 Q59WH0 0 C1_10860C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C1_06010W_A CHS7 Q5AA40 0 C1_06010W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C4_06100W_A CWH41 A0A1D8PMH9 0 C4_06100W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C7_00360W_A DFI1 Q5AFI4 0 C7_00360W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C2_08490W_A DSE1 Q59Y20 1 C2_08490W_A UniProt >=2 repeat features surface_other_adhesion_phenotype - no +C1_03190C_A ECM33 A0A1D8PCY4 0 C5_02460C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C6_04580W_A HXK1 Q59RW5 0 C6_04580W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C1_06370C_A PBR1 Q5AAN7 0 C1_06370C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C5_00220W_A ROT2 Q5A4X3 0 C5_00220W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +CR_01970C_A VMA4 O94072 0 CR_01970C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_06970W_A AAH1 Q59ZB1 0 C2_06970W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C5_05050W_A ADH1 A0A1D8PP43 0 C5_05050W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_07170C_A AFT2 Q59Z29 0 C2_07170C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_06000W_A AHR1 Q5A4F3 0 C3_06000W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_01250W_A ASC1 P83774 1 C7_01250W_A UniProt >=2 repeat features indirect_regulator - no +CR_06440C_A BCR1 Q59U10 0 CR_06440C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C5_02470W_A BUD4 P53705 0 C5_02470W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_04570C_A CDC10 P39827 0 CR_04570C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_04930C_A CRK1 Q9Y7W4 0 C2_04930C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_04020C_A CSH1 Q59QH2 0 C1_04020C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_04390W_A CUP5 A0A1D8PK00 0 C3_04390W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_10110W_A CYC1 P53698 0 C2_10110W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_03070C_A CYR1 A0A1D8PR83 0 C7_03070C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_09880W_A DEF1 G1UB67 0 CR_09880W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_07890W_A EFG1 Q59X67 0 CR_07890W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_01360C_A FMP28 A0A1D8PQU2 0 C7_01360C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_10240W_A GPD1 Q59XU9 0 C2_10240W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_03270W_A GPM1 P82612 0 C2_03270W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_07680W_A HAP2 A0A1D8PE35 0 C1_07680W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_04290W_A HAP31 Q5A6N7 0 CR_04290W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C5_00940C_A HAP5 A0A1D8PN26 0 C5_00940C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C4_00140C_A HIS4 A0A1D8PKY7 0 C4_00140C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_03660W_A IRS4 Q59SR6 0 C3_03660W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_01620C_A MET6 P82610 0 CR_01620C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_01810C_A MNT1 Q00310 0 C3_01810C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_01830C_A MNT2 P46592 0 C3_01810C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_03710C_A MSB1 A0A1D8PD52 0 C1_03710C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_08300W_A NOT5 A0A1D8PE87 0 C1_08300W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_04040C_A NPT1 A0A1D8PRI0 0 C7_04040C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_02840W_A PDE2 A0A1D8PCV9 0 C1_02840W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C4_00350W_A PEP7 Q59UQ8 0 C4_00350W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_02890C_A PMT1 O74189 0 C7_02890C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_10080W_A RAP1 A0A1D8PIK2 0 C2_10080W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_10210C_A RAS1 Q59XU5 0 C2_10210C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C4_02030W_A RFX2 Q5AMQ6 0 C4_02030W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_00320W_A RHR2 Q5A7M9 0 C3_00320W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_05990C_A SFL1 Q5A287 0 CR_05990C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C5_04830W_A SFL2 Q5AK51 0 C5_04830W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_04860W_A SFP1 Q5ANF0 0 C3_04860W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_09140C_A SHO1 Q5AQ36 0 C1_09140C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_01330C_A SIR2 O59923 0 C2_01330C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_07870C_A SMI1 A0A1D8PE53 0 C1_07870C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_04290C_A SNF5 A0A1D8PJZ6 0 C3_04290C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_06000W_A SOK1 A0A1D8PT45 0 CR_06000W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_06540C_A SPF1 Q59Q34 0 C2_06540C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_06610W_A STE2 A0A1D8PTB4 0 CR_06610W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C4_00300C_A SWI1 Q59UR3 0 C4_00300C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_06870W_A TDH3 Q5ADM7 0 C3_06870W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_04530C_A TEC1 Q5ANJ4 0 C3_04530C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_07210C_A TPK2 A0A1D8PHU1 0 C2_07210C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_00060W_A TUP1 P0CY34 1 C1_00060W_A UniProt >=2 repeat features indirect_regulator - no +C3_01350C_A URA3 P13649 0 C3_01350C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_01820C_A VMA11 Q5AH00 0 C3_04390W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_10150W_A WOR1 Q5AP80 0 C1_10150W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_07730W_A YVC1 Q5A2J7 0 C2_07730W_A no UniProt repeat feature (assumed negative) indirect_regulator - no diff --git a/analysis/calibration_truth/repeat_call_truth/truth_v2.Calb_SC5314.tsv b/analysis/calibration_truth/repeat_call_truth/truth_v2.Calb_SC5314.tsv new file mode 100644 index 0000000..01ea477 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/truth_v2.Calb_SC5314.tsv @@ -0,0 +1,227 @@ +id label cluster +C1_12510W_A 0 C1_12510W_A +C3_01550C_A 0 C2_00100C_A +C6_03710W_A 1 CR_07070C_A +C6_04130C_A 1 CR_07070C_A +C7_00090C_A 0 C7_00090C_A +C2_09530W_A 1 C2_09530W_A +C1_00220W_A 0 C5_05390C_A +C6_03490C_A 0 C3_05230W_A +C3_05230W_A 0 C3_05230W_A +CR_07800W_A 0 C3_05230W_A +C1_02990C_A 0 C1_02990C_A +C5_04130C_A 0 CR_00180C_A +CR_10110W_A 0 CR_00180C_A +C4_04530C_A 0 C5_05390C_A +C6_03030W_A 0 C3_05230W_A +C4_03570W_A 1 C4_03570W_A +C4_06980W_A 0 C4_06980W_A +C4_03470C_A 0 C4_03470C_A +C1_04400C_A 0 C1_04400C_A +CR_07070C_A 1 CR_07070C_A +C6_00820W_A 0 C1_13940W_A +C2_08870C_A 1 C2_08870C_A +C3_03870C_A 0 C3_05230W_A +C4_03520C_A 0 C4_03570W_A +C4_00450C_A 0 C4_06920C_A +C4_00130W_A 0 C4_06920C_A +C4_00120W_A 0 C4_06920C_A +C1_04870W_A 0 C3_05230W_A +C1_10830W_A 0 C1_10830W_A +C2_10030C_A 0 C2_10030C_A +C2_08590W_A 0 C2_08590W_A +C4_06920C_A 0 C4_06920C_A +C3_06320W_A 1 CR_07070C_A +CR_08510W_A 0 CR_08510W_A +C4_05770C_A 0 C4_05770C_A +C6_01720C_A 0 C6_01720C_A +C4_04050C_A 0 C4_04050C_A +C4_04470W_A 0 C3_05230W_A +C6_03500C_A 0 C3_05230W_A +C6_03700W_A 1 CR_07070C_A +C6_03690W_A 1 CR_07070C_A +CR_00610W_A 0 C5_00730W_A +C1_06940C_A 0 C1_06940C_A +C6_02710C_A 0 C3_05230W_A +C2_00240C_A 0 C2_00240C_A +C2_00520W_A 0 C2_00520W_A +C2_00660C_A 0 C2_00680C_A +C2_00680C_A 0 C2_00680C_A +C3_02510C_A 0 C3_05230W_A +C4_02370C_A 0 C4_02370C_A +C4_02390W_A 0 C4_02370C_A +C4_02900C_A 0 C4_02900C_A +C7_00860W_A 0 C7_00860W_A +C1_03680W_A 0 C1_03680W_A +C3_01730C_A 0 C3_01730C_A +C5_05390C_A 0 C5_05390C_A +C5_04800W_A 0 C4_02900C_A +C1_13450W_A 0 C5_00730W_A +C4_02250C_A 0 C4_02250C_A +C1_10400C_A 0 C1_10400C_A +C7_02830C_A 0 CR_09220C_A +C6_01990W_A 0 C6_01990W_A +C4_06970C_A 0 C4_06970C_A +C1_10290W_A 0 C1_10290W_A +C1_09580C_A 0 CR_09220C_A +C4_03510C_A 0 C3_03050C_A +C1_07620C_A 0 C1_07620C_A +C1_02360C_A 0 C5_05390C_A +C5_00730W_A 0 C5_00730W_A +C2_09130C_A 0 C5_00730W_A +C1_14120C_A 0 C1_07030C_A +C2_10470C_A 0 C2_10470C_A +C4_04070C_A 0 C4_04050C_A +C3_00600W_A 0 C3_00600W_A +CR_00760C_A 0 C5_00730W_A +C1_05760C_A 0 C1_05760C_A +CR_00180C_A 0 CR_00180C_A +C1_07030C_A 0 C1_07030C_A +CR_10480W_A 0 CR_03790C_A +C2_01360C_A 0 C2_00520W_A +C5_02460C_A 0 C5_02460C_A +C1_02630C_A 0 C1_02990C_A +C3_02300W_A 0 C3_02300W_A +C1_13940W_A 0 C1_13940W_A +C7_03300C_A 0 CR_09220C_A +C1_09420W_A 0 CR_09220C_A +C1_10050W_A 0 C1_10050W_A +C2_00100C_A 0 C2_00100C_A +C6_00070C_A 0 C6_00070C_A +C6_00160W_A 0 C6_00160W_A +C1_05120W_A 0 C1_05120W_A +C1_07580C_A 0 C1_07030C_A +C2_08980C_A 1 C2_08980C_A +CR_02280W_A 0 CR_02280W_A +C5_00710W_A 0 C5_00730W_A +C2_10010C_A 0 C2_09780C_A +C2_09780C_A 0 C2_09780C_A +CR_03630W_A 0 C5_00730W_A +C4_06310C_A 0 C4_06560W_A +C4_06550C_A 0 C5_00730W_A +C3_06250W_A 0 C3_06250W_A +C5_00270W_A 0 C5_00270W_A +C7_03110W_A 0 C7_03110W_A +C7_03290C_A 0 C5_00730W_A +CR_04440C_A 0 CR_04440C_A +CR_04420C_A 0 CR_04420C_A +CR_03880W_A 0 C5_00730W_A +C6_03860C_A 0 C6_03860C_A +C6_03850C_A 0 C6_03850C_A +C1_05960W_A 0 C1_05960W_A +C1_07040C_A 0 C1_07030C_A +CR_10210W_A 0 CR_10210W_A +CR_10020C_A 0 CR_10020C_A +C2_00910W_A 0 C2_00910W_A +C3_07160W_A 0 C3_07160W_A +C3_03050C_A 1 C3_03050C_A +C7_00940W_A 0 C7_00940W_A +C7_01560C_A 0 C7_01560C_A +C2_03350W_A 0 C2_03350W_A +C2_03720W_A 0 C2_03720W_A +C1_03600W_A 0 C1_03600W_A +C5_04400W_A 0 C5_04400W_A +C5_04370C_A 0 C5_04370C_A +C5_04260W_A 0 C5_04400W_A +C4_01000C_A 0 C5_04370C_A +C1_09080C_A 0 C1_09080C_A +C1_09590C_A 0 CR_09220C_A +C7_02880C_A 0 CR_09220C_A +CR_09220C_A 0 CR_09220C_A +C1_09600C_A 0 CR_09220C_A +C6_04490W_A 0 CR_09220C_A +C1_09900W_A 0 CR_09220C_A +CR_03790C_A 0 CR_03790C_A +C1_06260W_A 0 C1_06260W_A +CR_04900C_A 0 CR_04900C_A +C4_05920C_A 0 C4_05920C_A +CR_02290W_A 0 CR_02290W_A +C1_10810W_A 0 C1_10810W_A +C2_08430C_A 0 C2_08430C_A +C4_06260W_A 0 C4_06260W_A +C4_06300C_A 0 C4_06560W_A +C4_06560W_A 0 C4_06560W_A +CR_02750C_A 0 CR_02750C_A +CR_08680C_A 0 CR_08680C_A +CR_08350W_A 0 CR_08350W_A +CR_01280C_A 0 CR_01280C_A +C1_00770C_A 0 C1_00770C_A +C6_03060W_A 0 C6_03060W_A +CR_10330W_A 0 CR_10330W_A +C2_00800C_A 0 C2_00800C_A +C4_03070W_A 0 C4_03070W_A +C5_03050C_A 0 C5_03050C_A +C2_03440W_A 0 C2_03440W_A +C1_03120W_A 0 C1_03120W_A +C3_01370C_A 0 C3_01370C_A +C4_01360W_A 0 C4_01360W_A +C3_05020W_A 0 C3_05020W_A +CR_05800C_A 0 CR_05800C_A +C3_06190C_A 1 CR_07070C_A +C6_04380W_A 1 CR_07070C_A +CR_07440W_A 0 CR_07440W_A +C1_10860C_A 0 C1_10860C_A +C1_06010W_A 0 C1_06010W_A +C4_06100W_A 0 C4_06100W_A +C7_00360W_A 0 C7_00360W_A +C2_08490W_A 1 C2_08490W_A +C1_03190C_A 0 C5_02460C_A +C6_04580W_A 0 C6_04580W_A +C1_06370C_A 0 C1_06370C_A +C5_00220W_A 0 C5_00220W_A +CR_01970C_A 0 CR_01970C_A +C2_06970W_A 0 C2_06970W_A +C5_05050W_A 0 C5_05050W_A +C2_07170C_A 0 C2_07170C_A +C3_06000W_A 0 C3_06000W_A +C7_01250W_A 1 C7_01250W_A +CR_06440C_A 0 CR_06440C_A +C5_02470W_A 0 C5_02470W_A +CR_04570C_A 0 CR_04570C_A +C2_04930C_A 0 C2_04930C_A +C1_04020C_A 0 C1_04020C_A +C3_04390W_A 0 C3_04390W_A +C2_10110W_A 0 C2_10110W_A +C7_03070C_A 0 C7_03070C_A +CR_09880W_A 0 CR_09880W_A +CR_07890W_A 0 CR_07890W_A +C7_01360C_A 0 C7_01360C_A +C2_10240W_A 0 C2_10240W_A +C2_03270W_A 0 C2_03270W_A +C1_07680W_A 0 C1_07680W_A +CR_04290W_A 0 CR_04290W_A +C5_00940C_A 0 C5_00940C_A +C4_00140C_A 0 C4_00140C_A +C3_03660W_A 0 C3_03660W_A +CR_01620C_A 0 CR_01620C_A +C3_01810C_A 0 C3_01810C_A +C3_01830C_A 0 C3_01810C_A +C1_03710C_A 0 C1_03710C_A +C1_08300W_A 0 C1_08300W_A +C7_04040C_A 0 C7_04040C_A +C1_02840W_A 0 C1_02840W_A +C4_00350W_A 0 C4_00350W_A +C7_02890C_A 0 C7_02890C_A +C2_10080W_A 0 C2_10080W_A +C2_10210C_A 0 C2_10210C_A +C4_02030W_A 0 C4_02030W_A +C3_00320W_A 0 C3_00320W_A +CR_05990C_A 0 CR_05990C_A +C5_04830W_A 0 C5_04830W_A +C3_04860W_A 0 C3_04860W_A +C1_09140C_A 0 C1_09140C_A +C2_01330C_A 0 C2_01330C_A +C1_07870C_A 0 C1_07870C_A +C3_04290C_A 0 C3_04290C_A +CR_06000W_A 0 CR_06000W_A +C2_06540C_A 0 C2_06540C_A +CR_06610W_A 0 CR_06610W_A +C4_00300C_A 0 C4_00300C_A +C3_06870W_A 0 C3_06870W_A +C3_04530C_A 0 C3_04530C_A +C2_07210C_A 0 C2_07210C_A +C1_00060W_A 1 C1_00060W_A +C3_01350C_A 0 C3_01350C_A +C7_01820C_A 0 C3_04390W_A +C1_10150W_A 0 C1_10150W_A +C2_07730W_A 0 C2_07730W_A diff --git a/analysis/calibration_truth/repeat_call_truth/truth_v2.Scer_S288C.annotated.tsv b/analysis/calibration_truth/repeat_call_truth/truth_v2.Scer_S288C.annotated.tsv new file mode 100644 index 0000000..d7f7307 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/truth_v2.Scer_S288C.annotated.tsv @@ -0,0 +1,329 @@ +id gene accession label cluster basis curated_class evidence tuned_or_homolog +YLR390W-A CCW14 O13547 0 YLR390W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YBR093C PHO5 P00635 0 YAR071W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YIL162W SUC2 P00724 0 YIL162W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR297W PRC1 P00729 0 YBR139W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YPL154C PEP4 P07267 0 YPL154C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YIR019C FLO11 P08640 1 YIR019C paper statement adhesin E1 yes +YEL060C PRB1 P09232 0 YOR003W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YGL203C KEX1 P09620 0 YGL203C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YER011W TIR1 P10863 1 YBR067C UniProt >=2 repeat features hard_negative N2 no +YIL015W BAR1 P12630 0 YPL154C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YNL238W KEX2 P13134 0 YNL238W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YGR282C BGL2 P15703 0 YGR282C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL034W KAR2 P16474 0 YJL034W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YNL322C KRE1 P17260 1 YNL322C UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +YCL043C PDI1 P17967 0 YDR518W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJR004C SAG1 P20840 1 YJR004C UniProt >=2 repeat features adhesin E1 no +YMR307W GAS1 P22146 0 YOL132W no UniProt repeat feature (assumed negative) hard_negative N1 no +YLR300W EXG1 P23776 0 YOR190W no UniProt repeat feature (assumed negative) hard_negative N1 no +YCL045C EMC1 P25574 0 YCL045C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YCR089W FIG2 P25653 0 YCR089W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YBR067C TIP1 P27654 0 YBR067C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YAL058W CNE1 P27825 1 YAL058W UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +YLR286C CTS1 P29029 0 YLR286C no UniProt repeat feature (assumed negative) hard_negative N1 yes +YBL017C PEP1 P32319 1 YJL222W UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +YNR044W AGA1 P32323 1 YNR044W UniProt >=2 repeat features adhesin E1 no +YLR120C YPS1 P32329 0 YPL154C no UniProt repeat feature (assumed negative) hard_negative N1 no +YGR014W MSB2 P32334 1 YGR014W UniProt >=2 repeat features hard_negative N1 no +YHR079C IRE1 P32361 0 YHR079C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR519W FPR2 P32472 0 YDR519W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR518W EUG1 P32474 0 YDR518W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL159W HSP150 P32478 1 YKL164C UniProt >=2 repeat features hard_negative N1 no +YEL040W UTR2 P32623 0 YLR213C no UniProt repeat feature (assumed negative) hard_negative N1 no +YAR050W FLO1 P32768 1 YAR050W paper statement adhesin E1 yes +YLR214W FRE1 P32791 0 YLR214W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR083C EMP70 P32802 0 YLR083C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YGL200C EMP24 P32803 0 YGL200C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YEL002C WBP1 P33767 0 YEL002C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YBR036C CSG2 P35206 0 YBR036C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YKL073W LHS1 P36016 0 YKL073W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR332W MID2 P36027 0 YLR332W no UniProt repeat feature (assumed negative) hard_negative N1 no +YKL220C FRE2 P36033 0 YOR384W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YKL077W PSG1 P36081 0 YKL077W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YKL034W TUL1 P36096 0 YKL034W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YKR102W FLO10 P36170 1 YAR050W UniProt >=2 repeat features adhesin E1 yes +YBR139W ATG42 P38109 0 YBR139W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YBR229C ROT2 P38138 0 YBR229C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YBR078W ECM33 P38248 0 YBR078W no UniProt repeat feature (assumed negative) hard_negative N1 no +YHL023C NPR3 P38742 0 YHL023C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHR132C ECM14 P38836 0 YHR132C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHR143W DSE2 P38844 0 YHR143W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHR188C GPI16 P38875 0 YHR188C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHR195W NVJ1 P38881 0 YHR195W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHR202W SMN1 P38887 0 YHR202W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHR204W MNL1 P38888 0 YHR204W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHR211W FLO5 P38894 1 YAR050W UniProt >=2 repeat features adhesin E1 yes +YIL140W AXL2 P38928 0 YIL140W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR058W FET3 P38993 0 YFL041W no UniProt repeat feature (assumed negative) hard_negative N1 no +YMR008C PLB1 P39105 0 YMR006C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YAL007C ERP2 P39704 0 YOR016C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YAL053W FLC2 P39719 0 YOR365C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL073W JEM1 P40358 0 YJL073W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL062W LAS21 P40367 0 YJL062W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YIL173W VTH1 P40438 1 YJL222W UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +YIL005W EPS1 P40557 0 YIL005W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL222W VTH2 P40890 1 YJL222W UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +YJL002C OST1 P41543 0 YJL002C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR420W HKR1 P41809 1 YDR420W UniProt >=2 repeat features hard_negative N1 no +YNL291C MID1 P41821 0 YNL291C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YNL327W EGT2 P42835 1 YNL327W UniProt >=2 repeat features hard_negative N2 no +YFL048C EMP47 P43555 0 YLR080W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YFL041W FET5 P43561 0 YFL041W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL178C ATG27 P46989 0 YJL178C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL079C PRY1 P47032 0 YJL079C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL078C PRY3 P47033 0 YJL078C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJR150C DAN1 P47178 0 YJR150C no UniProt repeat feature (assumed negative) hard_negative N2 no +YOR085W OST3 P48439 0 YOR085W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR331W GPI8 P49018 0 YDR331W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YGR106C VOA1 P53262 0 YGR106C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YGR189C CRH1 P53301 0 YGR189C no UniProt repeat feature (assumed negative) hard_negative N1 no +YGR279C SCW4 P53334 0 YGR279C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR144C MKC7 P53379 0 YPL154C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YNL012W SPO1 P53541 0 YNL012W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YNL066W SUN4 P53616 0 YKR042W no UniProt repeat feature (assumed negative) hard_negative N1 no +YNR060W FRE4 P53746 0 YOR384W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YNR067C DSE4 P53753 0 YNR067C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YNL283C WSC2 P53832 0 YNL283C no UniProt repeat feature (assumed negative) hard_negative N1 no +YNL190W P53872 0 YNL190W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YNL158W PGA1 P53896 0 YNL158W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YML012W ERV25 P54837 0 YML012W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR008C SLG1 P54867 0 YOR008C no UniProt repeat feature (assumed negative) hard_negative N1 no +YDR077W SED1 Q01589 1 YDR077W UniProt >=2 repeat features hard_negative N2 no +YMR149W SWP1 Q02795 0 YMR149W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YPL123C RNY1 Q02933 0 YPL123C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YML130C ERO1 Q03103 0 YML130C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YKL164C PIR1 Q03178 1 YKL164C UniProt >=2 repeat features hard_negative N1 no +YKL163W PIR3 Q03180 1 YKL164C UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +YMR215W GAS3 Q03655 0 YOL132W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR006C PLB2 Q03674 0 YMR006C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR200W ROT1 Q03691 0 YMR200W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YML019W OST6 Q03723 0 YML019W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR236C FMN1 Q03778 0 YDR236C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR456W NHX1 Q04121 0 YDR456W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR065W KAR5 Q04746 0 YMR065W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR221W GTB1 Q04924 0 YDR221W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR305C SCW10 Q04951 0 YGR279C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR238W DFG5 Q05031 0 YKL046C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOL155C HPF1 Q05164 1 YOL155C UniProt >=2 repeat features adhesin E3 no +YAR002C-A ERP1 Q05359 0 YHR110W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR194C NCW2 Q05777 0 YLR194C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR207W HRD3 Q05787 1 YLR207W UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +YLR343W GAS2 Q06135 0 YOL132W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR308W CDA2 Q06703 0 YLR307W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOL011W PLB3 Q08108 0 YMR006C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOL030W GAS5 Q08193 0 YOL132W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR381W FRE3 Q08905 0 YOR384W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YPL221W FLC1 Q08967 0 YOR365C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR110C CCW12 Q12127 1 YLR110C UniProt >=2 repeat features surface_other_adhesion_phenotype - no +YPL006W NCR1 Q12200 0 YPL006W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR121C YPS3 Q12303 0 YPL154C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR055W PST1 Q12355 0 YBR078W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR080W EMP46 Q12396 0 YLR080W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR288C MPD1 Q12404 0 YOR288C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDL046W NPC2 Q12408 0 YDL046W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDL010W GRX6 Q12438 0 YBR014C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR084C RAX2 Q12465 0 YLR084C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLL051C FRE6 Q12473 0 YOR384W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR057W YOS9 Q99220 0 YDR057W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHR057C CPR2 P23285 0 YHR057C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR214W SCJ1 P25303 1 YMR214W UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +YCR011C ADP1 P25371 0 YCR011C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YCR045C RRT12 P25381 0 YOR003W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YCR044C PER1 P25625 0 YCR044C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR190W SPR1 P32603 0 YOR190W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YGL032C AGA2 P32781 0 YGL032C no UniProt repeat feature (assumed negative) adhesin E1 no +YDR304C CPR5 P35176 0 YHR057C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YAR071W PHO11 P35842 0 YAR071W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YKL046C DCW1 P36091 0 YKL046C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YKR013W PRY2 P36110 0 YJL079C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YKR042W UTH1 P36135 0 YKR042W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YBR286W APE3 P37302 0 YBR286W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YBR014C GRX7 P38068 0 YBR014C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YBR162C TOS1 P38288 0 YJL171C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YNL160W YGP1 P38616 0 YHR139C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHR101C BIG1 P38813 0 YHR101C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL192C SOP4 P39543 0 YJL192C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YAL063C FLO9 P39712 1 YAR050W UniProt >=2 repeat features adhesin E1 yes +YER113C TMN3 P40071 0 YER113C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YER150W SPI1 P40092 0 YER150W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YIL169C CSS1 P40442 0 YOL155C no UniProt repeat feature (assumed negative) adhesin E3 no +YIL123W SIM1 P40472 0 YKR042W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YIL011W TIR3 P40552 0 YBR067C no UniProt repeat feature (assumed negative) hard_negative N2 no +YIR039C YPS6 P40583 0 YPL154C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL186W MNN5 P46982 0 YJL186W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL171C TOH1 P46992 0 YJL171C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL059W YHC3 P47040 0 YJL059W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL038C LOH1 P47055 0 YJL038C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL037W IRC18 P47056 0 YJL038C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJR151C DAN4 P47179 1 YJR151C UniProt >=2 repeat features hard_negative N2 no +YGL228W SHE10 P53075 0 YGL228W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YGL139W FLC3 P53121 0 YOR365C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YGL028C SCW11 P53189 0 YGR279C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YGR023W MTL1 P53214 0 YLR332W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR534C FIT1 Q04433 1 YDR534C UniProt >=2 repeat features hard_negative N1 no +YDR107C TMN2 Q04562 0 YLR083C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR213C CRR1 Q05790 0 YLR213C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR454W FMP27 Q06179 1 YLR454W UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +YDR349C YPS7 Q06325 0 YDR349C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR371W CTS2 Q06350 0 YDR371W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR307W CDA1 Q06702 0 YLR307W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YPR079W MRL1 Q06815 0 YPR079W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOL031C SIL1 Q08199 0 YOL031C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOL132W GAS4 Q08271 0 YOL132W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR247W SRL1 Q08673 0 YOR247W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR382W FIT2 Q08906 0 YOR382W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR384W FRE5 Q08908 0 YOR384W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YPL189W GUP2 Q08929 0 YPL189W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR056C EMC10 Q12025 0 YDR056C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOL105C WSC3 Q12215 0 YNL283C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR009W TIR4 Q12218 1 YBR067C UniProt >=2 repeat features hard_negative N2 no +YOR154W SLP1 Q12232 0 YOR154W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR032C PST2 Q12335 0 YDR032C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR016C ERP4 Q12450 0 YOR016C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YNL024C-A KSH1 Q8TGJ3 0 YNL024C-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOL088C MPD2 Q99316 0 YOL088C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YPL187W MF(ALPHA)1 P01149 0 YGL089C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR522C SPS2 P08459 0 YBR078W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR336W KRE5 P22023 0 YOR336W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YBR092C PHO3 P24031 0 YAR071W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR003W YSP3 P25036 0 YOR003W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YCR069W CPR4 P25334 0 YHR057C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YCL048W SPS22 P25380 1 YBR078W UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +YGL089C MF(ALPHA)2 P32435 0 YGL089C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YKL039W PTM1 P32857 0 YKL039W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YKR044W UIP5 P36137 0 YKR044W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHR215W PHO12 P38693 0 YAR071W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHL028W WSC4 P38739 0 YHL028W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHL017W P38745 0 YKL039W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHR110W ERP5 P38819 0 YHR110W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHR151C MTC6 P38849 0 YHR151C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL174W KRE9 P39005 0 YDL049C no UniProt repeat feature (assumed negative) hard_negative N1 no +YEL059W HHY1 P39982 0 YEL059W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YEL001C IRC22 P40006 0 YEL001C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YFR039C OSW7 P43611 0 YFR039C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YFR041C ERJ5 P43613 0 YFR041C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL160C PIR5 P46999 1 YKL164C UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +YJR153W PGU1 P47180 1 YJR153W UniProt reviewed, secreted, >=2 repeat features uniprot_secreted - unknown +YNL300W TOS6 P48560 0 YNL300W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDL049C KNH1 P50112 0 YDL049C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDL024C DIA3 P52290 0 YAR071W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR261C EXG2 P52911 0 YOR190W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YGL258W VEL1 P53058 0 YOR387C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YGL002W ERP6 P53198 0 YHR110W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOL052C-A DDR2 P89113 0 YMR251W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YPL130W SPO19 Q03029 0 YPL130W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR251W-A HOR7 Q05827 0 YMR251W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YPR121W THI22 Q06490 0 YPR121W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR413W Q06689 0 YLR413W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR037C PAU23 Q07987 0 YLR037C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR040C AFB1 Q07988 0 YLR040C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR042C Q07990 0 YLR042C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR104W LCL2 Q08045 0 YLR104W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR383C FIT3 Q08907 0 YOR383C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YPL163C SVS1 Q12254 0 YOR247W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR214C SPR2 Q12282 0 YOR214C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDL018C ERP3 Q12403 0 YDL018C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDL206W Q12424 0 YDL206W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOL154W ZPS1 Q12512 0 YOL154W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YKL018C-A Q3E7A7 0 YKL018C-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR325W PAU19 P0CE85 0 YLR037C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHR139C SPS100 P13130 0 YHR139C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YCR061W P25639 0 YCR061W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YKL224C PAU16 P35994 0 YLR037C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YBR301W PAU24 P38155 0 YLR037C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YBR224W P38320 0 YBR224W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHL046C PAU13 P38725 0 YLR037C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHR138C P38841 0 YHR138C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR250W SSP120 P39931 0 YLR250W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YER076C P40049 0 YER076C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YIL059C P40520 0 YIL059C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YIR041W PAU15 P40585 0 YLR037C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YFL051C P43552 0 YFL051C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YFR012W DCV1 P43595 0 YFR012W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YFR020W CSS2 P43600 0 YFR020W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJR120W P47157 0 YJR120W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YGL259W YPS5 P53057 0 YGL259W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YGR079W P53249 0 YGR079W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YNL228W P53862 0 YNL228W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YNL033W P53964 0 YNL019C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YNL019C P53975 0 YNL019C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR417C P87267 0 YEL053W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YKR005C Q02203 0 YKR005C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YPL056C LCL1 Q02786 0 YPL056C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR542W PAU10 Q03050 0 YLR037C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YFL013W-A Q03187 0 YFL013W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR415C Q04033 0 YDR415C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR445C Q04100 0 YDR445C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDL237W AIM6 Q07716 0 YDL237W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR001C Q07895 0 YLR001C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR062C BUD28 Q07992 0 YLR062C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOL134C Q08272 0 YOL134C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOL159C CSS3 Q08300 0 YOL159C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR082C Q08498 0 YOR082C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR365C Q08844 0 YOR365C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR387C Q08910 0 YOR387C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR389W Q08912 0 YPL277C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YPL277C Q08989 0 YPL277C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDL151C BUD30 Q12064 0 YDL151C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR137C SIA1 Q12212 0 YOR137C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR262W Q12331 0 YDR262W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLL025W PAU17 Q12370 0 YLR037C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YCL048W-A Q2V2Q2 0 YCL048W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR524C-B Q3E6R4 0 YDR524C-B UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR008C-A Q3E7B9 0 YOR008C-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR158W-B Q6B0X2 0 YMR158W-B UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YEL053W-A A0A023PXC2 0 YEL053W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YER147C-A A0A023PXD5 0 YER147C-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR203W A0A023PXI4 0 YDR203W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YAL016C-A A0A023PYC6 0 YAL016C-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YEL018C-A A0A023PYD9 0 YEL018C-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YER087C-A A0A023PYE9 0 YER087C-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YER145C-A A0A023PYF4 0 YER145C-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHR070C-A A0A023PYH0 0 YHR070C-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR048C A0A023PZE6 0 YDR048C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YER084W-A A0A023PZG0 0 YER084W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YER137W-A A0A023PZG5 0 YER137W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR119W-A A0A023PZL2 0 YMR119W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR316C-A I2HB70 0 YMR316C-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YAL034C-B O13515 0 YAL034C-B UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YPL136W O13519 0 YPL136W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDL240C-A P0C5L8 0 YDL240C-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YEL020C-B P0C5M6 0 YEL020C-B UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YCL049C P25577 0 YCL049C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YBR013C P38215 0 YBR013C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHL042W P38729 0 YHL042W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YHL037C P38733 0 YHL037C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YAR020C PAU7 P39545 0 YAR020C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YEL028W P39989 0 YEL028W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJR071W P47121 0 YJR071W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YGL149W P53116 0 YGL149W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YNL319W P53826 0 YNL319W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR366C P87287 0 YDR366C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YNL155C-A P9WEJ2 0 YNL155C-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YML084W Q04521 0 YML084W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR053W Q07790 0 YDR053W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLL044W Q07880 0 YLL044W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR055W Q08439 0 YOR055W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR139C Q08532 0 YOR139C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YPL261C Q08976 0 YPL261C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YOR024W Q12070 0 YOR024W UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YBR200W-A Q3E755 0 YBR200W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDR246W-A Q3E763 0 YDR246W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR247W-A Q3E782 0 YMR247W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YBL008W-A Q3E821 0 YBL008W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YJL052C-A Q3E837 0 YJL052C-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YCL012C Q8J0M4 0 YCL012C UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YCR045W-A Q8TGQ2 0 YCR045W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YFR034W-A Q8TGR2 0 YFR034W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR315W-A Q8TGS4 0 YMR315W-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YMR272W-B Q8TGS5 0 YMR272W-B UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YLR406C-A Q8TGT1 0 YLR406C-A UniProt reviewed, secreted, no repeat feature (assumed negative) uniprot_secreted - unknown +YDL037C BSC1 Q12140 0 YDL037C no UniProt repeat feature (assumed negative) adhesin E3 no +YAL064C-A TDA8 Q6B2U8 0 YAL064C-A no UniProt repeat feature (assumed negative) adhesin E3 no +YER027C GAL83 Q04739 0 YER027C no UniProt repeat feature (assumed negative) indirect_regulator - no +YFL014W HSP12 P22943 0 YFL014W no UniProt repeat feature (assumed negative) indirect_regulator - no +YDR043C NRG1 Q03125 0 YBR066C no UniProt repeat feature (assumed negative) indirect_regulator - no +YBR066C NRG2 P38082 0 YBR066C no UniProt repeat feature (assumed negative) indirect_regulator - no +YIL084C SDS3 P40505 0 YIL084C no UniProt repeat feature (assumed negative) indirect_regulator - no +YOR315W SFG1 Q12507 0 YOR315W no UniProt repeat feature (assumed negative) indirect_regulator - no diff --git a/analysis/calibration_truth/repeat_call_truth/truth_v2.Scer_S288C.tsv b/analysis/calibration_truth/repeat_call_truth/truth_v2.Scer_S288C.tsv new file mode 100644 index 0000000..15c97a5 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/truth_v2.Scer_S288C.tsv @@ -0,0 +1,329 @@ +id label cluster +YLR390W-A 0 YLR390W-A +YBR093C 0 YAR071W +YIL162W 0 YIL162W +YMR297W 0 YBR139W +YPL154C 0 YPL154C +YIR019C 1 YIR019C +YEL060C 0 YOR003W +YGL203C 0 YGL203C +YER011W 1 YBR067C +YIL015W 0 YPL154C +YNL238W 0 YNL238W +YGR282C 0 YGR282C +YJL034W 0 YJL034W +YNL322C 1 YNL322C +YCL043C 0 YDR518W +YJR004C 1 YJR004C +YMR307W 0 YOL132W +YLR300W 0 YOR190W +YCL045C 0 YCL045C +YCR089W 0 YCR089W +YBR067C 0 YBR067C +YAL058W 1 YAL058W +YLR286C 0 YLR286C +YBL017C 1 YJL222W +YNR044W 1 YNR044W +YLR120C 0 YPL154C +YGR014W 1 YGR014W +YHR079C 0 YHR079C +YDR519W 0 YDR519W +YDR518W 0 YDR518W +YJL159W 1 YKL164C +YEL040W 0 YLR213C +YAR050W 1 YAR050W +YLR214W 0 YLR214W +YLR083C 0 YLR083C +YGL200C 0 YGL200C +YEL002C 0 YEL002C +YBR036C 0 YBR036C +YKL073W 0 YKL073W +YLR332W 0 YLR332W +YKL220C 0 YOR384W +YKL077W 0 YKL077W +YKL034W 0 YKL034W +YKR102W 1 YAR050W +YBR139W 0 YBR139W +YBR229C 0 YBR229C +YBR078W 0 YBR078W +YHL023C 0 YHL023C +YHR132C 0 YHR132C +YHR143W 0 YHR143W +YHR188C 0 YHR188C +YHR195W 0 YHR195W +YHR202W 0 YHR202W +YHR204W 0 YHR204W +YHR211W 1 YAR050W +YIL140W 0 YIL140W +YMR058W 0 YFL041W +YMR008C 0 YMR006C +YAL007C 0 YOR016C +YAL053W 0 YOR365C +YJL073W 0 YJL073W +YJL062W 0 YJL062W +YIL173W 1 YJL222W +YIL005W 0 YIL005W +YJL222W 1 YJL222W +YJL002C 0 YJL002C +YDR420W 1 YDR420W +YNL291C 0 YNL291C +YNL327W 1 YNL327W +YFL048C 0 YLR080W +YFL041W 0 YFL041W +YJL178C 0 YJL178C +YJL079C 0 YJL079C +YJL078C 0 YJL078C +YJR150C 0 YJR150C +YOR085W 0 YOR085W +YDR331W 0 YDR331W +YGR106C 0 YGR106C +YGR189C 0 YGR189C +YGR279C 0 YGR279C +YDR144C 0 YPL154C +YNL012W 0 YNL012W +YNL066W 0 YKR042W +YNR060W 0 YOR384W +YNR067C 0 YNR067C +YNL283C 0 YNL283C +YNL190W 0 YNL190W +YNL158W 0 YNL158W +YML012W 0 YML012W +YOR008C 0 YOR008C +YDR077W 1 YDR077W +YMR149W 0 YMR149W +YPL123C 0 YPL123C +YML130C 0 YML130C +YKL164C 1 YKL164C +YKL163W 1 YKL164C +YMR215W 0 YOL132W +YMR006C 0 YMR006C +YMR200W 0 YMR200W +YML019W 0 YML019W +YDR236C 0 YDR236C +YDR456W 0 YDR456W +YMR065W 0 YMR065W +YDR221W 0 YDR221W +YMR305C 0 YGR279C +YMR238W 0 YKL046C +YOL155C 1 YOL155C +YAR002C-A 0 YHR110W +YLR194C 0 YLR194C +YLR207W 1 YLR207W +YLR343W 0 YOL132W +YLR308W 0 YLR307W +YOL011W 0 YMR006C +YOL030W 0 YOL132W +YOR381W 0 YOR384W +YPL221W 0 YOR365C +YLR110C 1 YLR110C +YPL006W 0 YPL006W +YLR121C 0 YPL154C +YDR055W 0 YBR078W +YLR080W 0 YLR080W +YOR288C 0 YOR288C +YDL046W 0 YDL046W +YDL010W 0 YBR014C +YLR084C 0 YLR084C +YLL051C 0 YOR384W +YDR057W 0 YDR057W +YHR057C 0 YHR057C +YMR214W 1 YMR214W +YCR011C 0 YCR011C +YCR045C 0 YOR003W +YCR044C 0 YCR044C +YOR190W 0 YOR190W +YGL032C 0 YGL032C +YDR304C 0 YHR057C +YAR071W 0 YAR071W +YKL046C 0 YKL046C +YKR013W 0 YJL079C +YKR042W 0 YKR042W +YBR286W 0 YBR286W +YBR014C 0 YBR014C +YBR162C 0 YJL171C +YNL160W 0 YHR139C +YHR101C 0 YHR101C +YJL192C 0 YJL192C +YAL063C 1 YAR050W +YER113C 0 YER113C +YER150W 0 YER150W +YIL169C 0 YOL155C +YIL123W 0 YKR042W +YIL011W 0 YBR067C +YIR039C 0 YPL154C +YJL186W 0 YJL186W +YJL171C 0 YJL171C +YJL059W 0 YJL059W +YJL038C 0 YJL038C +YJL037W 0 YJL038C +YJR151C 1 YJR151C +YGL228W 0 YGL228W +YGL139W 0 YOR365C +YGL028C 0 YGR279C +YGR023W 0 YLR332W +YDR534C 1 YDR534C +YDR107C 0 YLR083C +YLR213C 0 YLR213C +YLR454W 1 YLR454W +YDR349C 0 YDR349C +YDR371W 0 YDR371W +YLR307W 0 YLR307W +YPR079W 0 YPR079W +YOL031C 0 YOL031C +YOL132W 0 YOL132W +YOR247W 0 YOR247W +YOR382W 0 YOR382W +YOR384W 0 YOR384W +YPL189W 0 YPL189W +YDR056C 0 YDR056C +YOL105C 0 YNL283C +YOR009W 1 YBR067C +YOR154W 0 YOR154W +YDR032C 0 YDR032C +YOR016C 0 YOR016C +YNL024C-A 0 YNL024C-A +YOL088C 0 YOL088C +YPL187W 0 YGL089C +YDR522C 0 YBR078W +YOR336W 0 YOR336W +YBR092C 0 YAR071W +YOR003W 0 YOR003W +YCR069W 0 YHR057C +YCL048W 1 YBR078W +YGL089C 0 YGL089C +YKL039W 0 YKL039W +YKR044W 0 YKR044W +YHR215W 0 YAR071W +YHL028W 0 YHL028W +YHL017W 0 YKL039W +YHR110W 0 YHR110W +YHR151C 0 YHR151C +YJL174W 0 YDL049C +YEL059W 0 YEL059W +YEL001C 0 YEL001C +YFR039C 0 YFR039C +YFR041C 0 YFR041C +YJL160C 1 YKL164C +YJR153W 1 YJR153W +YNL300W 0 YNL300W +YDL049C 0 YDL049C +YDL024C 0 YAR071W +YDR261C 0 YOR190W +YGL258W 0 YOR387C +YGL002W 0 YHR110W +YOL052C-A 0 YMR251W-A +YPL130W 0 YPL130W +YMR251W-A 0 YMR251W-A +YPR121W 0 YPR121W +YLR413W 0 YLR413W +YLR037C 0 YLR037C +YLR040C 0 YLR040C +YLR042C 0 YLR042C +YLR104W 0 YLR104W +YOR383C 0 YOR383C +YPL163C 0 YOR247W +YOR214C 0 YOR214C +YDL018C 0 YDL018C +YDL206W 0 YDL206W +YOL154W 0 YOL154W +YKL018C-A 0 YKL018C-A +YMR325W 0 YLR037C +YHR139C 0 YHR139C +YCR061W 0 YCR061W +YKL224C 0 YLR037C +YBR301W 0 YLR037C +YBR224W 0 YBR224W +YHL046C 0 YLR037C +YHR138C 0 YHR138C +YLR250W 0 YLR250W +YER076C 0 YER076C +YIL059C 0 YIL059C +YIR041W 0 YLR037C +YFL051C 0 YFL051C +YFR012W 0 YFR012W +YFR020W 0 YFR020W +YJR120W 0 YJR120W +YGL259W 0 YGL259W +YGR079W 0 YGR079W +YNL228W 0 YNL228W +YNL033W 0 YNL019C +YNL019C 0 YNL019C +YDR417C 0 YEL053W-A +YKR005C 0 YKR005C +YPL056C 0 YPL056C +YDR542W 0 YLR037C +YFL013W-A 0 YFL013W-A +YDR415C 0 YDR415C +YDR445C 0 YDR445C +YDL237W 0 YDL237W +YLR001C 0 YLR001C +YLR062C 0 YLR062C +YOL134C 0 YOL134C +YOL159C 0 YOL159C +YOR082C 0 YOR082C +YOR365C 0 YOR365C +YOR387C 0 YOR387C +YOR389W 0 YPL277C +YPL277C 0 YPL277C +YDL151C 0 YDL151C +YOR137C 0 YOR137C +YDR262W 0 YDR262W +YLL025W 0 YLR037C +YCL048W-A 0 YCL048W-A +YDR524C-B 0 YDR524C-B +YOR008C-A 0 YOR008C-A +YMR158W-B 0 YMR158W-B +YEL053W-A 0 YEL053W-A +YER147C-A 0 YER147C-A +YDR203W 0 YDR203W +YAL016C-A 0 YAL016C-A +YEL018C-A 0 YEL018C-A +YER087C-A 0 YER087C-A +YER145C-A 0 YER145C-A +YHR070C-A 0 YHR070C-A +YDR048C 0 YDR048C +YER084W-A 0 YER084W-A +YER137W-A 0 YER137W-A +YMR119W-A 0 YMR119W-A +YMR316C-A 0 YMR316C-A +YAL034C-B 0 YAL034C-B +YPL136W 0 YPL136W +YDL240C-A 0 YDL240C-A +YEL020C-B 0 YEL020C-B +YCL049C 0 YCL049C +YBR013C 0 YBR013C +YHL042W 0 YHL042W +YHL037C 0 YHL037C +YAR020C 0 YAR020C +YEL028W 0 YEL028W +YJR071W 0 YJR071W +YGL149W 0 YGL149W +YNL319W 0 YNL319W +YDR366C 0 YDR366C +YNL155C-A 0 YNL155C-A +YML084W 0 YML084W +YDR053W 0 YDR053W +YLL044W 0 YLL044W +YOR055W 0 YOR055W +YOR139C 0 YOR139C +YPL261C 0 YPL261C +YOR024W 0 YOR024W +YBR200W-A 0 YBR200W-A +YDR246W-A 0 YDR246W-A +YMR247W-A 0 YMR247W-A +YBL008W-A 0 YBL008W-A +YJL052C-A 0 YJL052C-A +YCL012C 0 YCL012C +YCR045W-A 0 YCR045W-A +YFR034W-A 0 YFR034W-A +YMR315W-A 0 YMR315W-A +YMR272W-B 0 YMR272W-B +YLR406C-A 0 YLR406C-A +YDL037C 0 YDL037C +YAL064C-A 0 YAL064C-A +YER027C 0 YER027C +YFL014W 0 YFL014W +YDR043C 0 YBR066C +YBR066C 0 YBR066C +YIL084C 0 YIL084C +YOR315W 0 YOR315W diff --git a/analysis/calibration_truth/repeat_call_truth/truth_v3.Calb_SC5314.annotated.tsv b/analysis/calibration_truth/repeat_call_truth/truth_v3.Calb_SC5314.annotated.tsv new file mode 100644 index 0000000..6de21bb --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/truth_v3.Calb_SC5314.annotated.tsv @@ -0,0 +1,225 @@ +id gene accession label cluster basis curated_class evidence tuned_or_homolog +C1_12510W_A RAX2 A0A1D8PFE5 0 C1_12510W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C3_01550C_A TOS1 A0A1D8PJA8 0 C2_00100C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C6_03710W_A ALS9 A0A1D8PQ86 1 CR_07070C_A UniProt >=2 array-type repeat features adhesin E1 yes +C6_04130C_A ALS4 A0A1D8PQB9 1 CR_07070C_A UniProt >=2 array-type repeat features adhesin E1 yes +C7_00090C_A CSA1 G1UB63 0 C7_00090C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C2_09530W_A EAP1 G1UBC2 1 C2_09530W_A UniProt >=2 array-type repeat features adhesin E1 no +C1_00220W_A PHR2 O13318 0 C5_05390C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C6_03490C_A SAP1 P0CY27 0 C3_05230W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C3_05230W_A SAP3 P0CY29 0 C3_05230W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +CR_07800W_A SAP2 P0DJ06 0 C3_05230W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C1_02990C_A XOG1 P29717 0 C1_02990C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C5_04130C_A CHT2 P40953 0 CR_00180C_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_10110W_A CHT3 P40954 0 CR_00180C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_04530C_A PHR1 P43076 0 C5_05390C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C6_03030W_A SAP5 P43094 0 C3_05230W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_03570W_A HWP1 P46593 1 C4_03570W_A UniProt >=2 array-type repeat features adhesin E1 yes +C4_06980W_A PRA1 P87020 0 C4_06980W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - yes +C4_03470C_A ECE1 Q07730 0 C4_03470C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_04400C_A APE2 Q59KZ1 0 C1_04400C_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_07070C_A ALS3 Q59L12 1 CR_07070C_A paper statement adhesin E1 yes +C6_00820W_A SUN41 Q59NP5 0 C1_13940W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C2_08870C_A PIR1 Q59SF7 1 C2_08870C_A UniProt >=2 array-type repeat features uniprot - unknown +C3_03870C_A SAP9 Q59SU1 0 C3_05230W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C4_03520C_A RBT1 Q59TP1 0 C4_03570W_A no UniProt repeat feature (assumed negative) adhesin E2 no +C4_00450C_A PGA10 Q59UP6 0 C4_06920C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_00130W_A RBT5 Q59UT4 0 C4_06920C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C4_00120W_A PGA7 Q59UT5 0 C4_06920C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_04870W_A SAP7 Q59VH7 0 C3_05230W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_10830W_A BIG1 Q59WG7 0 C1_10830W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C2_10030C_A MP65 Q59XX2 0 C2_10030C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C2_08590W_A YWP1 Q59Y31 0 C2_08590W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C4_06920C_A CSA2 Q5A0X8 0 C4_06920C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C3_06320W_A ALS7 Q5A312 1 CR_07070C_A UniProt >=2 array-type repeat features adhesin E1 yes +CR_08510W_A PGA13 Q5A343 0 CR_08510W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_05770C_A CFL1 Q5A446 0 C4_05770C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C6_01720C_A SUR7 Q5A4M8 0 C6_01720C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_04050C_A RHD3 Q5A5U4 0 C4_04050C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_04470W_A SAP10 Q5A651 0 C3_05230W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C6_03500C_A SAP4 Q5A8N2 0 C3_05230W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C6_03700W_A ALS1 Q5A8T4 1 CR_07070C_A paper statement adhesin E1 yes +C6_03690W_A ALS5 Q5A8T7 1 CR_07070C_A UniProt >=2 array-type repeat features adhesin E1 yes +CR_00610W_A IFF4 Q5AAL9 0 C5_00730W_A no UniProt repeat feature (assumed negative) adhesin E1 yes +C1_06940C_A ATC1 Q5AAU5 0 C1_06940C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C6_02710C_A SAP6 Q5AC08 0 C3_05230W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C2_00240C_A SOD6 Q5ACV9 0 C2_00240C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C2_00520W_A DFG5 Q5ACZ2 0 C2_00520W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C2_00660C_A SOD4 Q5AD05 0 C2_00680C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C2_00680C_A SOD5 Q5AD07 0 C2_00680C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C3_02510C_A SAP8 Q5AEM6 0 C3_05230W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_02370C_A PGA59 Q5AF39 0 C4_02370C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_02390W_A PGA62 Q5AF41 0 C4_02370C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_02900C_A CRH11 Q5AFA2 0 C4_02900C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C7_00860W_A SSR1 Q5AFN8 0 C7_00860W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_03680W_A ENG1 Q5AIR7 0 C1_03680W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C3_01730C_A UTR2 Q5AJC0 0 C3_01730C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C5_05390C_A PGA4 Q5AJY5 0 C5_05390C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C5_04800W_A CRH12 Q5AK54 0 C4_02900C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_13450W_A HYR1 Q5AL03 0 C5_00730W_A no UniProt repeat feature (assumed negative) adhesin E1 yes +C4_02250C_A BGL2 Q5AMT2 0 C4_02250C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C1_10400C_A FGR41 Q5AP52 0 C1_10400C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C7_02830C_A LIP5 Q9P8W0 0 CR_09220C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C6_01990W_A PLB1 Q9UWF6 0 C6_01990W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_06970C_A ZRT101 A0A1D8PMR6 0 C4_06970C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_10290W_A GAM1 O74254 0 C1_10290W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_09580C_A LIP1 O94091 0 CR_09220C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_03510C_A HWP2 Q59PF9 0 C3_03050C_A no UniProt repeat feature (assumed negative) adhesin E1 no +C1_07620C_A PIR32 Q59PW0 0 C1_07620C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_02360C_A PGA5 Q59VW6 0 C5_05390C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C5_00730W_A HYR3 Q59XA7 0 C5_00730W_A no UniProt repeat feature (assumed negative) adhesin E2 yes +C2_09130C_A IFF6 Q59XL0 0 C5_00730W_A no UniProt repeat feature (assumed negative) adhesin E2 yes +C1_14120C_A RBE1 Q59ZX3 0 C1_07030C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C2_10470C_A ATG27 Q5A5S7 0 C2_10470C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_04070C_A PGA30 Q5A5U6 0 C4_04050C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C3_00600W_A IFF11 Q5A7R7 0 C3_00600W_A no UniProt repeat feature (assumed negative) adhesin E2 yes +CR_00760C_A HYR4 Q5A849 0 C5_00730W_A no UniProt repeat feature (assumed negative) adhesin E2 yes +C1_05760C_A PGA26 Q5AA09 0 C1_05760C_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_00180C_A CHT1 Q5AAH2 0 CR_00180C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_07030C_A RBT4 Q5AB48 0 C1_07030C_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_10480W_A PGA1 Q5ACL7 0 CR_03790C_A no UniProt repeat feature (assumed negative) adhesin E2 no +C2_01360C_A DCW1 Q5AD78 0 C2_00520W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C5_02460C_A ECM331 Q5AGC4 0 C5_02460C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_02630C_A EXG2 Q5AIA1 0 C1_02990C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C3_02300W_A FGR23 Q5AJV5 0 C3_02300W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_13940W_A SIM1 Q5AKU5 0 C1_13940W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C7_03300C_A LIP8 Q9P8V9 0 CR_09220C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_09420W_A LIP2 Q9P8W5 0 CR_09220C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_10050W_A HNV1 A0A1D8PES5 0 C1_10050W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C2_00100C_A PGA52 Q59L72 0 C2_00100C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C6_00070C_A PGA25 Q59L86 0 C6_00070C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C6_00160W_A PGA48 Q59L96 0 C6_00160W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_05120W_A BTN1 Q59LX9 0 C1_05120W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_07580C_A PRY1 Q59PV6 0 C1_07030C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C2_08980C_A PGA55 Q59SG9 1 C2_08980C_A UniProt >=2 array-type repeat features uniprot - unknown +CR_02280W_A PGA23 Q59V01 0 CR_02280W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C5_00710W_A IFF8 Q59XB0 0 C5_00730W_A no UniProt repeat feature (assumed negative) adhesin E2 yes +C2_10010C_A IRC22-2 Q59XW9 0 C2_09780C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C2_09780C_A IRC22-1 Q59YF4 0 C2_09780C_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_03630W_A IFF3 Q5A029 0 C5_00730W_A no UniProt repeat feature (assumed negative) adhesin E2 yes +C4_06310C_A PGA41 Q5A1B3 0 C4_06560W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_06550C_A IFF5 Q5A1E0 0 C5_00730W_A no UniProt repeat feature (assumed negative) adhesin E2 yes +C3_06250W_A ERV25 Q5A302 0 C3_06250W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C5_00270W_A PGA14 Q5A4X8 0 C5_00270W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C7_03110W_A PGA28 Q5A5K7 0 C7_03110W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C7_03290C_A RBR3 Q5A5M7 0 C5_00730W_A no UniProt repeat feature (assumed negative) adhesin E2 no +CR_04440C_A RBR1 Q5A6M0 0 CR_04440C_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_04420C_A RBR2 Q5A6M2 0 CR_04420C_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_03880W_A IFF9 Q5A6U1 0 C5_00730W_A no UniProt repeat feature (assumed negative) adhesin E2 yes +C6_03860C_A PGA61 Q5A8I6 0 C6_03860C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C6_03850C_A IHD1 Q5A8I8 0 C6_03850C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_05960W_A PGA45 Q5AA33 0 C1_05960W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_07040C_A Q5AB49 0 C1_07030C_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_10210W_A PGA12 Q5ACP5 0 CR_10210W_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_10020C_A YOS9 Q5ACR4 0 CR_10020C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C2_00910W_A PGA19 Q5AD34 0 C2_00910W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C3_07160W_A PGA32 Q5ADQ7 0 C3_07160W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C3_03050C_A PGA18 Q5AEG7 1 C3_03050C_A UniProt >=2 array-type repeat features uniprot - unknown +C7_00940W_A KEX1 Q5AFP8 0 C7_00940W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C7_01560C_A NUP Q5AGW8 0 C7_01560C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C2_03350W_A PGA17 Q5AHA4 0 C2_03350W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C2_03720W_A PGA16 Q5AHE8 0 C2_03720W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_03600W_A Q5AHZ2 0 C1_03600W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C5_04400W_A RNY1-A Q5AK94 0 C5_04400W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C5_04370C_A PGA37 Q5AK97 0 C5_04370C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C5_04260W_A RNY1-B Q5AKB1 0 C5_04400W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_01000C_A PGA57 Q5AMF7 0 C5_04370C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_09080C_A PGA6 Q5APJ9 0 C1_09080C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_09590C_A LIP10 Q9P4E5 0 CR_09220C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C7_02880C_A LIP9 Q9P4E6 0 CR_09220C_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_09220C_A LIP7 Q9P4E7 0 CR_09220C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_09600C_A LIP6 Q9P4E8 0 CR_09220C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C6_04490W_A LIP4 Q9P8W1 0 CR_09220C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_09900W_A LIP3 Q9P8W2 0 CR_09220C_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_03790C_A KRE1 P0CY22 0 CR_03790C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_06260W_A PGA50 Q59MD0 0 C1_06260W_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_04900C_A PGA39 Q59N10 0 CR_04900C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_05920C_A PGA49 Q59QA5 0 C4_05920C_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_02290W_A PGA22 Q59V02 0 CR_02290W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_10810W_A Q59WG5 0 C1_10810W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C2_08430C_A PGA46 Q59Y11 0 C2_08430C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_06260W_A PGA43 Q5A1A9 0 C4_06260W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_06300C_A PGA42 Q5A1B2 0 C4_06560W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_06560W_A PGA15 Q5A1E1 0 C4_06560W_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_02750C_A PGA34 Q5A210 0 CR_02750C_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_08680C_A NPR3 Q5A319 0 CR_08680C_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_08350W_A SIL1 Q5A360 0 CR_08350W_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_01280C_A NPC2 Q5A8A2 0 CR_01280C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_00770C_A ROT1 Q5ABP8 0 C1_00770C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C6_03060W_A PGA60 Q5ABW2 0 C6_03060W_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_10330W_A PGA11 Q5ACN3 0 CR_10330W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C2_00800C_A PGA27 Q5AD23 0 C2_00800C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_03070W_A PGA54 Q5AFC2 0 C4_03070W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C5_03050C_A PGA58 Q5AG46 0 C5_03050C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C2_03440W_A PGA33 Q5AHC0 0 C2_03440W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_03120W_A Q5AI48 0 C1_03120W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C3_01370C_A PGA44 Q5AJK6 0 C3_01370C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C4_01360W_A PGA53 Q5AMJ5 0 C4_01360W_A no UniProt repeat feature (assumed negative) uniprot - unknown +C3_05020W_A MTC6 Q5AND1 0 C3_05020W_A no UniProt repeat feature (assumed negative) uniprot - unknown +CR_05800C_A LCL2 Q59PT4 0 CR_05800C_A no UniProt repeat feature (assumed negative) uniprot - unknown +C1_02840W_A PDE2 A0A1D8PCV9 0 C1_02840W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_03190C_A ECM33 A0A1D8PCY4 0 C5_02460C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C2_07210C_A TPK2 A0A1D8PHU1 0 C2_07210C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_10080W_A RAP1 A0A1D8PIK2 0 C2_10080W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_04290C_A SNF5 A0A1D8PJZ6 0 C3_04290C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C4_00140C_A HIS4 A0A1D8PKY7 0 C4_00140C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C5_00940C_A HAP5 A0A1D8PN26 0 C5_00940C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C5_05050W_A ADH1 A0A1D8PP43 0 C5_05050W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_03070C_A CYR1 A0A1D8PR83 0 C7_03070C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_09880W_A DEF1 G1UB67 0 CR_09880W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_01330C_A SIR2 O59923 0 C2_01330C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_02890C_A PMT1 O74189 0 C7_02890C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_01350C_A URA3 P13649 0 C3_01350C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_04570C_A CDC10 P39827 0 CR_04570C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_01830C_A MNT2 P46592 0 C3_01810C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C5_02470W_A BUD4 P53705 0 C5_02470W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_01620C_A MET6 P82610 0 CR_01620C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_03270W_A GPM1 P82612 0 C2_03270W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_01810C_A MNT1 Q00310 0 C3_01810C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_07440W_A ACE2 Q59RR0 0 CR_07440W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C6_04580W_A HXK1 Q59RW5 0 C6_04580W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +CR_06440C_A BCR1 Q59U10 0 CR_06440C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_07680W_A HAP2 A0A1D8PE35 0 C1_07680W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_08300W_A NOT5 A0A1D8PE87 0 C1_08300W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C4_06100W_A CWH41 A0A1D8PMH9 0 C4_06100W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +CR_06610W_A STE2 A0A1D8PTB4 0 CR_06610W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_10110W_A CYC1 P53698 0 C2_10110W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_06540C_A SPF1 Q59Q34 0 C2_06540C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_04390W_A CUP5 A0A1D8PK00 0 C3_04390W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_01360C_A FMP28 A0A1D8PQU2 0 C7_01360C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_04040C_A NPT1 A0A1D8PRI0 0 C7_04040C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_04020C_A CSH1 Q59QH2 0 C1_04020C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_03660W_A IRS4 Q59SR6 0 C3_03660W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_03710C_A MSB1 A0A1D8PD52 0 C1_03710C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_07870C_A SMI1 A0A1D8PE53 0 C1_07870C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_06000W_A SOK1 A0A1D8PT45 0 CR_06000W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_01970C_A VMA4 O94072 0 CR_01970C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C4_00300C_A SWI1 Q59UR3 0 C4_00300C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_10860C_A ADA2 Q59WH0 0 C1_10860C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +CR_07890W_A EFG1 Q59X67 0 CR_07890W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_10210C_A RAS1 Q59XU5 0 C2_10210C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_07170C_A AFT2 Q59Z29 0 C2_07170C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +CR_05990C_A SFL1 Q5A287 0 CR_05990C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_07730W_A YVC1 Q5A2J7 0 C2_07730W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_06000W_A AHR1 Q5A4F3 0 C3_06000W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_06870W_A TDH3 Q5ADM7 0 C3_06870W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_00360W_A DFI1 Q5AFI4 0 C7_00360W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C5_04830W_A SFL2 Q5AK51 0 C5_04830W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C4_02030W_A RFX2 Q5AMQ6 0 C4_02030W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_04530C_A TEC1 Q5ANJ4 0 C3_04530C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_10150W_A WOR1 Q5AP80 0 C1_10150W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_09140C_A SHO1 Q5AQ36 0 C1_09140C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C2_04930C_A CRK1 Q9Y7W4 0 C2_04930C_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C4_00350W_A PEP7 Q59UQ8 0 C4_00350W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_06010W_A CHS7 Q5AA40 0 C1_06010W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C2_10240W_A GPD1 Q59XU9 0 C2_10240W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C5_00220W_A ROT2 Q5A4X3 0 C5_00220W_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +CR_04290W_A HAP31 Q5A6N7 0 CR_04290W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_00320W_A RHR2 Q5A7M9 0 C3_00320W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C7_01820C_A VMA11 Q5AH00 0 C3_04390W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C3_04860W_A SFP1 Q5ANF0 0 C3_04860W_A no UniProt repeat feature (assumed negative) indirect_regulator - no +C1_06370C_A PBR1 Q5AAN7 0 C1_06370C_A no UniProt repeat feature (assumed negative) surface_other_adhesion_phenotype - no +C3_06190C_A ALS6 Q5A2Z7 1 CR_07070C_A UniProt >=2 array-type repeat features adhesin E1 yes +C6_04380W_A ALS2 P0CU38 1 CR_07070C_A UniProt >=2 array-type repeat features adhesin E2 yes +C3_00580W_A FLO9 A0A1D8PIY8 0 C3_00600W_A no UniProt repeat feature (assumed negative) adhesin E2 yes +C2_06970W_A AAH1 Q59ZB1 0 C2_06970W_A no UniProt repeat feature (assumed negative) indirect_regulator - no diff --git a/analysis/calibration_truth/repeat_call_truth/truth_v3.Calb_SC5314.tsv b/analysis/calibration_truth/repeat_call_truth/truth_v3.Calb_SC5314.tsv new file mode 100644 index 0000000..7cb14a3 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/truth_v3.Calb_SC5314.tsv @@ -0,0 +1,225 @@ +id label cluster +C1_12510W_A 0 C1_12510W_A +C3_01550C_A 0 C2_00100C_A +C6_03710W_A 1 CR_07070C_A +C6_04130C_A 1 CR_07070C_A +C7_00090C_A 0 C7_00090C_A +C2_09530W_A 1 C2_09530W_A +C1_00220W_A 0 C5_05390C_A +C6_03490C_A 0 C3_05230W_A +C3_05230W_A 0 C3_05230W_A +CR_07800W_A 0 C3_05230W_A +C1_02990C_A 0 C1_02990C_A +C5_04130C_A 0 CR_00180C_A +CR_10110W_A 0 CR_00180C_A +C4_04530C_A 0 C5_05390C_A +C6_03030W_A 0 C3_05230W_A +C4_03570W_A 1 C4_03570W_A +C4_06980W_A 0 C4_06980W_A +C4_03470C_A 0 C4_03470C_A +C1_04400C_A 0 C1_04400C_A +CR_07070C_A 1 CR_07070C_A +C6_00820W_A 0 C1_13940W_A +C2_08870C_A 1 C2_08870C_A +C3_03870C_A 0 C3_05230W_A +C4_03520C_A 0 C4_03570W_A +C4_00450C_A 0 C4_06920C_A +C4_00130W_A 0 C4_06920C_A +C4_00120W_A 0 C4_06920C_A +C1_04870W_A 0 C3_05230W_A +C1_10830W_A 0 C1_10830W_A +C2_10030C_A 0 C2_10030C_A +C2_08590W_A 0 C2_08590W_A +C4_06920C_A 0 C4_06920C_A +C3_06320W_A 1 CR_07070C_A +CR_08510W_A 0 CR_08510W_A +C4_05770C_A 0 C4_05770C_A +C6_01720C_A 0 C6_01720C_A +C4_04050C_A 0 C4_04050C_A +C4_04470W_A 0 C3_05230W_A +C6_03500C_A 0 C3_05230W_A +C6_03700W_A 1 CR_07070C_A +C6_03690W_A 1 CR_07070C_A +CR_00610W_A 0 C5_00730W_A +C1_06940C_A 0 C1_06940C_A +C6_02710C_A 0 C3_05230W_A +C2_00240C_A 0 C2_00240C_A +C2_00520W_A 0 C2_00520W_A +C2_00660C_A 0 C2_00680C_A +C2_00680C_A 0 C2_00680C_A +C3_02510C_A 0 C3_05230W_A +C4_02370C_A 0 C4_02370C_A +C4_02390W_A 0 C4_02370C_A +C4_02900C_A 0 C4_02900C_A +C7_00860W_A 0 C7_00860W_A +C1_03680W_A 0 C1_03680W_A +C3_01730C_A 0 C3_01730C_A +C5_05390C_A 0 C5_05390C_A +C5_04800W_A 0 C4_02900C_A +C1_13450W_A 0 C5_00730W_A +C4_02250C_A 0 C4_02250C_A +C1_10400C_A 0 C1_10400C_A +C7_02830C_A 0 CR_09220C_A +C6_01990W_A 0 C6_01990W_A +C4_06970C_A 0 C4_06970C_A +C1_10290W_A 0 C1_10290W_A +C1_09580C_A 0 CR_09220C_A +C4_03510C_A 0 C3_03050C_A +C1_07620C_A 0 C1_07620C_A +C1_02360C_A 0 C5_05390C_A +C5_00730W_A 0 C5_00730W_A +C2_09130C_A 0 C5_00730W_A +C1_14120C_A 0 C1_07030C_A +C2_10470C_A 0 C2_10470C_A +C4_04070C_A 0 C4_04050C_A +C3_00600W_A 0 C3_00600W_A +CR_00760C_A 0 C5_00730W_A +C1_05760C_A 0 C1_05760C_A +CR_00180C_A 0 CR_00180C_A +C1_07030C_A 0 C1_07030C_A +CR_10480W_A 0 CR_03790C_A +C2_01360C_A 0 C2_00520W_A +C5_02460C_A 0 C5_02460C_A +C1_02630C_A 0 C1_02990C_A +C3_02300W_A 0 C3_02300W_A +C1_13940W_A 0 C1_13940W_A +C7_03300C_A 0 CR_09220C_A +C1_09420W_A 0 CR_09220C_A +C1_10050W_A 0 C1_10050W_A +C2_00100C_A 0 C2_00100C_A +C6_00070C_A 0 C6_00070C_A +C6_00160W_A 0 C6_00160W_A +C1_05120W_A 0 C1_05120W_A +C1_07580C_A 0 C1_07030C_A +C2_08980C_A 1 C2_08980C_A +CR_02280W_A 0 CR_02280W_A +C5_00710W_A 0 C5_00730W_A +C2_10010C_A 0 C2_09780C_A +C2_09780C_A 0 C2_09780C_A +CR_03630W_A 0 C5_00730W_A +C4_06310C_A 0 C4_06560W_A +C4_06550C_A 0 C5_00730W_A +C3_06250W_A 0 C3_06250W_A +C5_00270W_A 0 C5_00270W_A +C7_03110W_A 0 C7_03110W_A +C7_03290C_A 0 C5_00730W_A +CR_04440C_A 0 CR_04440C_A +CR_04420C_A 0 CR_04420C_A +CR_03880W_A 0 C5_00730W_A +C6_03860C_A 0 C6_03860C_A +C6_03850C_A 0 C6_03850C_A +C1_05960W_A 0 C1_05960W_A +C1_07040C_A 0 C1_07030C_A +CR_10210W_A 0 CR_10210W_A +CR_10020C_A 0 CR_10020C_A +C2_00910W_A 0 C2_00910W_A +C3_07160W_A 0 C3_07160W_A +C3_03050C_A 1 C3_03050C_A +C7_00940W_A 0 C7_00940W_A +C7_01560C_A 0 C7_01560C_A +C2_03350W_A 0 C2_03350W_A +C2_03720W_A 0 C2_03720W_A +C1_03600W_A 0 C1_03600W_A +C5_04400W_A 0 C5_04400W_A +C5_04370C_A 0 C5_04370C_A +C5_04260W_A 0 C5_04400W_A +C4_01000C_A 0 C5_04370C_A +C1_09080C_A 0 C1_09080C_A +C1_09590C_A 0 CR_09220C_A +C7_02880C_A 0 CR_09220C_A +CR_09220C_A 0 CR_09220C_A +C1_09600C_A 0 CR_09220C_A +C6_04490W_A 0 CR_09220C_A +C1_09900W_A 0 CR_09220C_A +CR_03790C_A 0 CR_03790C_A +C1_06260W_A 0 C1_06260W_A +CR_04900C_A 0 CR_04900C_A +C4_05920C_A 0 C4_05920C_A +CR_02290W_A 0 CR_02290W_A +C1_10810W_A 0 C1_10810W_A +C2_08430C_A 0 C2_08430C_A +C4_06260W_A 0 C4_06260W_A +C4_06300C_A 0 C4_06560W_A +C4_06560W_A 0 C4_06560W_A +CR_02750C_A 0 CR_02750C_A +CR_08680C_A 0 CR_08680C_A +CR_08350W_A 0 CR_08350W_A +CR_01280C_A 0 CR_01280C_A +C1_00770C_A 0 C1_00770C_A +C6_03060W_A 0 C6_03060W_A +CR_10330W_A 0 CR_10330W_A +C2_00800C_A 0 C2_00800C_A +C4_03070W_A 0 C4_03070W_A +C5_03050C_A 0 C5_03050C_A +C2_03440W_A 0 C2_03440W_A +C1_03120W_A 0 C1_03120W_A +C3_01370C_A 0 C3_01370C_A +C4_01360W_A 0 C4_01360W_A +C3_05020W_A 0 C3_05020W_A +CR_05800C_A 0 CR_05800C_A +C1_02840W_A 0 C1_02840W_A +C1_03190C_A 0 C5_02460C_A +C2_07210C_A 0 C2_07210C_A +C2_10080W_A 0 C2_10080W_A +C3_04290C_A 0 C3_04290C_A +C4_00140C_A 0 C4_00140C_A +C5_00940C_A 0 C5_00940C_A +C5_05050W_A 0 C5_05050W_A +C7_03070C_A 0 C7_03070C_A +CR_09880W_A 0 CR_09880W_A +C2_01330C_A 0 C2_01330C_A +C7_02890C_A 0 C7_02890C_A +C3_01350C_A 0 C3_01350C_A +CR_04570C_A 0 CR_04570C_A +C3_01830C_A 0 C3_01810C_A +C5_02470W_A 0 C5_02470W_A +CR_01620C_A 0 CR_01620C_A +C2_03270W_A 0 C2_03270W_A +C3_01810C_A 0 C3_01810C_A +CR_07440W_A 0 CR_07440W_A +C6_04580W_A 0 C6_04580W_A +CR_06440C_A 0 CR_06440C_A +C1_07680W_A 0 C1_07680W_A +C1_08300W_A 0 C1_08300W_A +C4_06100W_A 0 C4_06100W_A +CR_06610W_A 0 CR_06610W_A +C2_10110W_A 0 C2_10110W_A +C2_06540C_A 0 C2_06540C_A +C3_04390W_A 0 C3_04390W_A +C7_01360C_A 0 C7_01360C_A +C7_04040C_A 0 C7_04040C_A +C1_04020C_A 0 C1_04020C_A +C3_03660W_A 0 C3_03660W_A +C1_03710C_A 0 C1_03710C_A +C1_07870C_A 0 C1_07870C_A +CR_06000W_A 0 CR_06000W_A +CR_01970C_A 0 CR_01970C_A +C4_00300C_A 0 C4_00300C_A +C1_10860C_A 0 C1_10860C_A +CR_07890W_A 0 CR_07890W_A +C2_10210C_A 0 C2_10210C_A +C2_07170C_A 0 C2_07170C_A +CR_05990C_A 0 CR_05990C_A +C2_07730W_A 0 C2_07730W_A +C3_06000W_A 0 C3_06000W_A +C3_06870W_A 0 C3_06870W_A +C7_00360W_A 0 C7_00360W_A +C5_04830W_A 0 C5_04830W_A +C4_02030W_A 0 C4_02030W_A +C3_04530C_A 0 C3_04530C_A +C1_10150W_A 0 C1_10150W_A +C1_09140C_A 0 C1_09140C_A +C2_04930C_A 0 C2_04930C_A +C4_00350W_A 0 C4_00350W_A +C1_06010W_A 0 C1_06010W_A +C2_10240W_A 0 C2_10240W_A +C5_00220W_A 0 C5_00220W_A +CR_04290W_A 0 CR_04290W_A +C3_00320W_A 0 C3_00320W_A +C7_01820C_A 0 C3_04390W_A +C3_04860W_A 0 C3_04860W_A +C1_06370C_A 0 C1_06370C_A +C3_06190C_A 1 CR_07070C_A +C6_04380W_A 1 CR_07070C_A +C3_00580W_A 0 C3_00600W_A +C2_06970W_A 0 C2_06970W_A diff --git a/analysis/calibration_truth/repeat_call_truth/truth_v3.Scer_S288C.annotated.tsv b/analysis/calibration_truth/repeat_call_truth/truth_v3.Scer_S288C.annotated.tsv new file mode 100644 index 0000000..a98f818 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/truth_v3.Scer_S288C.annotated.tsv @@ -0,0 +1,321 @@ +id gene accession label cluster basis curated_class evidence tuned_or_homolog +YLR390W-A CCW14 O13547 0 YLR390W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YBR093C PHO5 P00635 0 YAR071W no UniProt repeat feature (assumed negative) uniprot - unknown +YIL162W SUC2 P00724 0 YIL162W no UniProt repeat feature (assumed negative) uniprot - unknown +YMR297W PRC1 P00729 0 YBR139W no UniProt repeat feature (assumed negative) uniprot - unknown +YPL154C PEP4 P07267 0 YPL154C no UniProt repeat feature (assumed negative) uniprot - unknown +YIR019C FLO11 P08640 1 YIR019C paper statement adhesin E1 yes +YEL060C PRB1 P09232 0 YOR003W no UniProt repeat feature (assumed negative) uniprot - unknown +YGL203C KEX1 P09620 0 YGL203C no UniProt repeat feature (assumed negative) uniprot - unknown +YER011W TIR1 P10863 1 YBR067C UniProt >=2 array-type repeat features hard_negative N2 no +YIL015W BAR1 P12630 0 YPL154C no UniProt repeat feature (assumed negative) uniprot - unknown +YNL238W KEX2 P13134 0 YNL238W no UniProt repeat feature (assumed negative) uniprot - unknown +YGR282C BGL2 P15703 0 YGR282C no UniProt repeat feature (assumed negative) uniprot - unknown +YJL034W KAR2 P16474 0 YJL034W no UniProt repeat feature (assumed negative) uniprot - unknown +YNL322C KRE1 P17260 1 YNL322C UniProt >=2 array-type repeat features uniprot - unknown +YCL043C PDI1 P17967 0 YDR518W no UniProt repeat feature (assumed negative) uniprot - unknown +YJR004C SAG1 P20840 1 YJR004C UniProt >=2 array-type repeat features adhesin E1 no +YMR307W GAS1 P22146 0 YOL132W no UniProt repeat feature (assumed negative) hard_negative N1 no +YLR300W EXG1 P23776 0 YOR190W no UniProt repeat feature (assumed negative) hard_negative N1 no +YCL045C EMC1 P25574 0 YCL045C no UniProt repeat feature (assumed negative) uniprot - unknown +YCR089W FIG2 P25653 0 YCR089W no UniProt repeat feature (assumed negative) uniprot - unknown +YBR067C TIP1 P27654 0 YBR067C no UniProt repeat feature (assumed negative) uniprot - unknown +YAL058W CNE1 P27825 1 YAL058W UniProt >=2 array-type repeat features uniprot - unknown +YLR286C CTS1 P29029 0 YLR286C no UniProt repeat feature (assumed negative) hard_negative N1 yes +YNR044W AGA1 P32323 1 YNR044W UniProt >=2 array-type repeat features adhesin E1 no +YLR120C YPS1 P32329 0 YPL154C no UniProt repeat feature (assumed negative) hard_negative N1 no +YGR014W MSB2 P32334 1 YGR014W UniProt >=2 array-type repeat features hard_negative N1 no +YHR079C IRE1 P32361 0 YHR079C no UniProt repeat feature (assumed negative) uniprot - unknown +YDR519W FPR2 P32472 0 YDR519W no UniProt repeat feature (assumed negative) uniprot - unknown +YDR518W EUG1 P32474 0 YDR518W no UniProt repeat feature (assumed negative) uniprot - unknown +YJL159W HSP150 P32478 1 YKL164C UniProt >=2 array-type repeat features hard_negative N1 no +YEL040W UTR2 P32623 0 YLR213C no UniProt repeat feature (assumed negative) hard_negative N1 no +YAR050W FLO1 P32768 1 YAR050W paper statement adhesin E1 yes +YLR214W FRE1 P32791 0 YLR214W no UniProt repeat feature (assumed negative) uniprot - unknown +YLR083C EMP70 P32802 0 YLR083C no UniProt repeat feature (assumed negative) uniprot - unknown +YGL200C EMP24 P32803 0 YGL200C no UniProt repeat feature (assumed negative) uniprot - unknown +YEL002C WBP1 P33767 0 YEL002C no UniProt repeat feature (assumed negative) uniprot - unknown +YBR036C CSG2 P35206 0 YBR036C no UniProt repeat feature (assumed negative) uniprot - unknown +YKL073W LHS1 P36016 0 YKL073W no UniProt repeat feature (assumed negative) uniprot - unknown +YLR332W MID2 P36027 0 YLR332W no UniProt repeat feature (assumed negative) hard_negative N1 no +YKL220C FRE2 P36033 0 YOR384W no UniProt repeat feature (assumed negative) uniprot - unknown +YKL077W PSG1 P36081 0 YKL077W no UniProt repeat feature (assumed negative) uniprot - unknown +YKL034W TUL1 P36096 0 YKL034W no UniProt repeat feature (assumed negative) uniprot - unknown +YKR102W FLO10 P36170 1 YAR050W UniProt >=2 array-type repeat features adhesin E1 yes +YBR139W ATG42 P38109 0 YBR139W no UniProt repeat feature (assumed negative) uniprot - unknown +YBR229C ROT2 P38138 0 YBR229C no UniProt repeat feature (assumed negative) uniprot - unknown +YBR078W ECM33 P38248 0 YBR078W no UniProt repeat feature (assumed negative) hard_negative N1 no +YHL023C NPR3 P38742 0 YHL023C no UniProt repeat feature (assumed negative) uniprot - unknown +YHR132C ECM14 P38836 0 YHR132C no UniProt repeat feature (assumed negative) uniprot - unknown +YHR143W DSE2 P38844 0 YHR143W no UniProt repeat feature (assumed negative) uniprot - unknown +YHR188C GPI16 P38875 0 YHR188C no UniProt repeat feature (assumed negative) uniprot - unknown +YHR195W NVJ1 P38881 0 YHR195W no UniProt repeat feature (assumed negative) uniprot - unknown +YHR202W SMN1 P38887 0 YHR202W no UniProt repeat feature (assumed negative) uniprot - unknown +YHR204W MNL1 P38888 0 YHR204W no UniProt repeat feature (assumed negative) uniprot - unknown +YHR211W FLO5 P38894 1 YAR050W UniProt >=2 array-type repeat features adhesin E1 yes +YIL140W AXL2 P38928 0 YIL140W no UniProt repeat feature (assumed negative) uniprot - unknown +YMR058W FET3 P38993 0 YFL041W no UniProt repeat feature (assumed negative) hard_negative N1 no +YMR008C PLB1 P39105 0 YMR006C no UniProt repeat feature (assumed negative) uniprot - unknown +YAL007C ERP2 P39704 0 YOR016C no UniProt repeat feature (assumed negative) uniprot - unknown +YAL053W FLC2 P39719 0 YOR365C no UniProt repeat feature (assumed negative) uniprot - unknown +YJL073W JEM1 P40358 0 YJL073W no UniProt repeat feature (assumed negative) uniprot - unknown +YJL062W LAS21 P40367 0 YJL062W no UniProt repeat feature (assumed negative) uniprot - unknown +YIL005W EPS1 P40557 0 YIL005W no UniProt repeat feature (assumed negative) uniprot - unknown +YJL002C OST1 P41543 0 YJL002C no UniProt repeat feature (assumed negative) uniprot - unknown +YDR420W HKR1 P41809 1 YDR420W UniProt >=2 array-type repeat features hard_negative N1 no +YNL291C MID1 P41821 0 YNL291C no UniProt repeat feature (assumed negative) uniprot - unknown +YNL327W EGT2 P42835 1 YNL327W UniProt >=2 array-type repeat features hard_negative N2 no +YFL048C EMP47 P43555 0 YLR080W no UniProt repeat feature (assumed negative) uniprot - unknown +YFL041W FET5 P43561 0 YFL041W no UniProt repeat feature (assumed negative) uniprot - unknown +YJL178C ATG27 P46989 0 YJL178C no UniProt repeat feature (assumed negative) uniprot - unknown +YJL079C PRY1 P47032 0 YJL079C no UniProt repeat feature (assumed negative) uniprot - unknown +YJL078C PRY3 P47033 0 YJL078C no UniProt repeat feature (assumed negative) uniprot - unknown +YJR150C DAN1 P47178 0 YJR150C no UniProt repeat feature (assumed negative) hard_negative N2 no +YOR085W OST3 P48439 0 YOR085W no UniProt repeat feature (assumed negative) uniprot - unknown +YDR331W GPI8 P49018 0 YDR331W no UniProt repeat feature (assumed negative) uniprot - unknown +YGR106C VOA1 P53262 0 YGR106C no UniProt repeat feature (assumed negative) uniprot - unknown +YGR189C CRH1 P53301 0 YGR189C no UniProt repeat feature (assumed negative) hard_negative N1 no +YGR279C SCW4 P53334 0 YGR279C no UniProt repeat feature (assumed negative) uniprot - unknown +YDR144C MKC7 P53379 0 YPL154C no UniProt repeat feature (assumed negative) uniprot - unknown +YNL012W SPO1 P53541 0 YNL012W no UniProt repeat feature (assumed negative) uniprot - unknown +YNL066W SUN4 P53616 0 YKR042W no UniProt repeat feature (assumed negative) hard_negative N1 no +YNR060W FRE4 P53746 0 YOR384W no UniProt repeat feature (assumed negative) uniprot - unknown +YNR067C DSE4 P53753 0 YNR067C no UniProt repeat feature (assumed negative) uniprot - unknown +YNL283C WSC2 P53832 0 YNL283C no UniProt repeat feature (assumed negative) hard_negative N1 no +YNL190W P53872 0 YNL190W no UniProt repeat feature (assumed negative) uniprot - unknown +YNL158W PGA1 P53896 0 YNL158W no UniProt repeat feature (assumed negative) uniprot - unknown +YML012W ERV25 P54837 0 YML012W no UniProt repeat feature (assumed negative) uniprot - unknown +YOR008C SLG1 P54867 0 YOR008C no UniProt repeat feature (assumed negative) hard_negative N1 no +YDR077W SED1 Q01589 1 YDR077W UniProt >=2 array-type repeat features hard_negative N2 no +YMR149W SWP1 Q02795 0 YMR149W no UniProt repeat feature (assumed negative) uniprot - unknown +YPL123C RNY1 Q02933 0 YPL123C no UniProt repeat feature (assumed negative) uniprot - unknown +YML130C ERO1 Q03103 0 YML130C no UniProt repeat feature (assumed negative) uniprot - unknown +YKL164C PIR1 Q03178 1 YKL164C UniProt >=2 array-type repeat features hard_negative N1 no +YKL163W PIR3 Q03180 1 YKL164C UniProt >=2 array-type repeat features uniprot - unknown +YMR215W GAS3 Q03655 0 YOL132W no UniProt repeat feature (assumed negative) uniprot - unknown +YMR006C PLB2 Q03674 0 YMR006C no UniProt repeat feature (assumed negative) uniprot - unknown +YMR200W ROT1 Q03691 0 YMR200W no UniProt repeat feature (assumed negative) uniprot - unknown +YML019W OST6 Q03723 0 YML019W no UniProt repeat feature (assumed negative) uniprot - unknown +YDR236C FMN1 Q03778 0 YDR236C no UniProt repeat feature (assumed negative) uniprot - unknown +YDR456W NHX1 Q04121 0 YDR456W no UniProt repeat feature (assumed negative) uniprot - unknown +YMR065W KAR5 Q04746 0 YMR065W no UniProt repeat feature (assumed negative) uniprot - unknown +YDR221W GTB1 Q04924 0 YDR221W no UniProt repeat feature (assumed negative) uniprot - unknown +YMR305C SCW10 Q04951 0 YGR279C no UniProt repeat feature (assumed negative) uniprot - unknown +YMR238W DFG5 Q05031 0 YKL046C no UniProt repeat feature (assumed negative) uniprot - unknown +YOL155C HPF1 Q05164 1 YOL155C UniProt >=2 array-type repeat features adhesin E3 no +YAR002C-A ERP1 Q05359 0 YHR110W no UniProt repeat feature (assumed negative) uniprot - unknown +YLR194C NCW2 Q05777 0 YLR194C no UniProt repeat feature (assumed negative) uniprot - unknown +YLR343W GAS2 Q06135 0 YOL132W no UniProt repeat feature (assumed negative) uniprot - unknown +YLR308W CDA2 Q06703 0 YLR307W no UniProt repeat feature (assumed negative) uniprot - unknown +YOL011W PLB3 Q08108 0 YMR006C no UniProt repeat feature (assumed negative) uniprot - unknown +YOL030W GAS5 Q08193 0 YOL132W no UniProt repeat feature (assumed negative) uniprot - unknown +YOR381W FRE3 Q08905 0 YOR384W no UniProt repeat feature (assumed negative) uniprot - unknown +YPL221W FLC1 Q08967 0 YOR365C no UniProt repeat feature (assumed negative) uniprot - unknown +YLR110C CCW12 Q12127 1 YLR110C UniProt >=2 array-type repeat features surface_other_adhesion_phenotype - no +YPL006W NCR1 Q12200 0 YPL006W no UniProt repeat feature (assumed negative) uniprot - unknown +YLR121C YPS3 Q12303 0 YPL154C no UniProt repeat feature (assumed negative) uniprot - unknown +YDR055W PST1 Q12355 0 YBR078W no UniProt repeat feature (assumed negative) uniprot - unknown +YLR080W EMP46 Q12396 0 YLR080W no UniProt repeat feature (assumed negative) uniprot - unknown +YOR288C MPD1 Q12404 0 YOR288C no UniProt repeat feature (assumed negative) uniprot - unknown +YDL046W NPC2 Q12408 0 YDL046W no UniProt repeat feature (assumed negative) uniprot - unknown +YDL010W GRX6 Q12438 0 YBR014C no UniProt repeat feature (assumed negative) uniprot - unknown +YLR084C RAX2 Q12465 0 YLR084C no UniProt repeat feature (assumed negative) uniprot - unknown +YLL051C FRE6 Q12473 0 YOR384W no UniProt repeat feature (assumed negative) uniprot - unknown +YDR057W YOS9 Q99220 0 YDR057W no UniProt repeat feature (assumed negative) uniprot - unknown +YHR057C CPR2 P23285 0 YHR057C no UniProt repeat feature (assumed negative) uniprot - unknown +YCR011C ADP1 P25371 0 YCR011C no UniProt repeat feature (assumed negative) uniprot - unknown +YCR045C RRT12 P25381 0 YOR003W no UniProt repeat feature (assumed negative) uniprot - unknown +YCR044C PER1 P25625 0 YCR044C no UniProt repeat feature (assumed negative) uniprot - unknown +YOR190W SPR1 P32603 0 YOR190W no UniProt repeat feature (assumed negative) uniprot - unknown +YGL032C AGA2 P32781 0 YGL032C no UniProt repeat feature (assumed negative) adhesin E1 no +YDR304C CPR5 P35176 0 YHR057C no UniProt repeat feature (assumed negative) uniprot - unknown +YAR071W PHO11 P35842 0 YAR071W no UniProt repeat feature (assumed negative) uniprot - unknown +YKL046C DCW1 P36091 0 YKL046C no UniProt repeat feature (assumed negative) uniprot - unknown +YKR013W PRY2 P36110 0 YJL079C no UniProt repeat feature (assumed negative) uniprot - unknown +YKR042W UTH1 P36135 0 YKR042W no UniProt repeat feature (assumed negative) uniprot - unknown +YBR286W APE3 P37302 0 YBR286W no UniProt repeat feature (assumed negative) uniprot - unknown +YBR014C GRX7 P38068 0 YBR014C no UniProt repeat feature (assumed negative) uniprot - unknown +YBR162C TOS1 P38288 0 YJL171C no UniProt repeat feature (assumed negative) uniprot - unknown +YNL160W YGP1 P38616 0 YHR139C no UniProt repeat feature (assumed negative) uniprot - unknown +YHR101C BIG1 P38813 0 YHR101C no UniProt repeat feature (assumed negative) uniprot - unknown +YJL192C SOP4 P39543 0 YJL192C no UniProt repeat feature (assumed negative) uniprot - unknown +YAL063C FLO9 P39712 1 YAR050W UniProt >=2 array-type repeat features adhesin E1 yes +YER113C TMN3 P40071 0 YER113C no UniProt repeat feature (assumed negative) uniprot - unknown +YER150W SPI1 P40092 0 YER150W no UniProt repeat feature (assumed negative) uniprot - unknown +YIL169C CSS1 P40442 0 YOL155C no UniProt repeat feature (assumed negative) adhesin E3 no +YIL123W SIM1 P40472 0 YKR042W no UniProt repeat feature (assumed negative) uniprot - unknown +YIL011W TIR3 P40552 0 YBR067C no UniProt repeat feature (assumed negative) hard_negative N2 no +YIR039C YPS6 P40583 0 YPL154C no UniProt repeat feature (assumed negative) uniprot - unknown +YJL186W MNN5 P46982 0 YJL186W no UniProt repeat feature (assumed negative) uniprot - unknown +YJL171C TOH1 P46992 0 YJL171C no UniProt repeat feature (assumed negative) uniprot - unknown +YJL059W YHC3 P47040 0 YJL059W no UniProt repeat feature (assumed negative) uniprot - unknown +YJL038C LOH1 P47055 0 YJL038C no UniProt repeat feature (assumed negative) uniprot - unknown +YJL037W IRC18 P47056 0 YJL038C no UniProt repeat feature (assumed negative) uniprot - unknown +YJR151C DAN4 P47179 1 YJR151C UniProt >=2 array-type repeat features hard_negative N2 no +YGL228W SHE10 P53075 0 YGL228W no UniProt repeat feature (assumed negative) uniprot - unknown +YGL139W FLC3 P53121 0 YOR365C no UniProt repeat feature (assumed negative) uniprot - unknown +YGL028C SCW11 P53189 0 YGR279C no UniProt repeat feature (assumed negative) uniprot - unknown +YGR023W MTL1 P53214 0 YLR332W no UniProt repeat feature (assumed negative) uniprot - unknown +YDR534C FIT1 Q04433 1 YDR534C UniProt >=2 array-type repeat features hard_negative N1 no +YDR107C TMN2 Q04562 0 YLR083C no UniProt repeat feature (assumed negative) uniprot - unknown +YLR213C CRR1 Q05790 0 YLR213C no UniProt repeat feature (assumed negative) uniprot - unknown +YDR349C YPS7 Q06325 0 YDR349C no UniProt repeat feature (assumed negative) uniprot - unknown +YDR371W CTS2 Q06350 0 YDR371W no UniProt repeat feature (assumed negative) uniprot - unknown +YLR307W CDA1 Q06702 0 YLR307W no UniProt repeat feature (assumed negative) uniprot - unknown +YPR079W MRL1 Q06815 0 YPR079W no UniProt repeat feature (assumed negative) uniprot - unknown +YOL031C SIL1 Q08199 0 YOL031C no UniProt repeat feature (assumed negative) uniprot - unknown +YOL132W GAS4 Q08271 0 YOL132W no UniProt repeat feature (assumed negative) uniprot - unknown +YOR247W SRL1 Q08673 0 YOR247W no UniProt repeat feature (assumed negative) uniprot - unknown +YOR382W FIT2 Q08906 0 YOR382W no UniProt repeat feature (assumed negative) uniprot - unknown +YOR384W FRE5 Q08908 0 YOR384W no UniProt repeat feature (assumed negative) uniprot - unknown +YPL189W GUP2 Q08929 0 YPL189W no UniProt repeat feature (assumed negative) uniprot - unknown +YDR056C EMC10 Q12025 0 YDR056C no UniProt repeat feature (assumed negative) uniprot - unknown +YOL105C WSC3 Q12215 0 YNL283C no UniProt repeat feature (assumed negative) uniprot - unknown +YOR009W TIR4 Q12218 1 YBR067C UniProt >=2 array-type repeat features hard_negative N2 no +YOR154W SLP1 Q12232 0 YOR154W no UniProt repeat feature (assumed negative) uniprot - unknown +YDR032C PST2 Q12335 0 YDR032C no UniProt repeat feature (assumed negative) uniprot - unknown +YOR016C ERP4 Q12450 0 YOR016C no UniProt repeat feature (assumed negative) uniprot - unknown +YNL024C-A KSH1 Q8TGJ3 0 YNL024C-A no UniProt repeat feature (assumed negative) uniprot - unknown +YOL088C MPD2 Q99316 0 YOL088C no UniProt repeat feature (assumed negative) uniprot - unknown +YPL187W MF(ALPHA)1 P01149 0 YGL089C no UniProt repeat feature (assumed negative) uniprot - unknown +YDR522C SPS2 P08459 0 YBR078W no UniProt repeat feature (assumed negative) uniprot - unknown +YOR336W KRE5 P22023 0 YOR336W no UniProt repeat feature (assumed negative) uniprot - unknown +YBR092C PHO3 P24031 0 YAR071W no UniProt repeat feature (assumed negative) uniprot - unknown +YOR003W YSP3 P25036 0 YOR003W no UniProt repeat feature (assumed negative) uniprot - unknown +YCR069W CPR4 P25334 0 YHR057C no UniProt repeat feature (assumed negative) uniprot - unknown +YGL089C MF(ALPHA)2 P32435 0 YGL089C no UniProt repeat feature (assumed negative) uniprot - unknown +YKL039W PTM1 P32857 0 YKL039W no UniProt repeat feature (assumed negative) uniprot - unknown +YKR044W UIP5 P36137 0 YKR044W no UniProt repeat feature (assumed negative) uniprot - unknown +YHR215W PHO12 P38693 0 YAR071W no UniProt repeat feature (assumed negative) uniprot - unknown +YHL028W WSC4 P38739 0 YHL028W no UniProt repeat feature (assumed negative) uniprot - unknown +YHL017W P38745 0 YKL039W no UniProt repeat feature (assumed negative) uniprot - unknown +YHR110W ERP5 P38819 0 YHR110W no UniProt repeat feature (assumed negative) uniprot - unknown +YHR151C MTC6 P38849 0 YHR151C no UniProt repeat feature (assumed negative) uniprot - unknown +YJL174W KRE9 P39005 0 YDL049C no UniProt repeat feature (assumed negative) hard_negative N1 no +YEL059W HHY1 P39982 0 YEL059W no UniProt repeat feature (assumed negative) uniprot - unknown +YEL001C IRC22 P40006 0 YEL001C no UniProt repeat feature (assumed negative) uniprot - unknown +YFR039C OSW7 P43611 0 YFR039C no UniProt repeat feature (assumed negative) uniprot - unknown +YFR041C ERJ5 P43613 0 YFR041C no UniProt repeat feature (assumed negative) uniprot - unknown +YJL160C PIR5 P46999 1 YKL164C UniProt >=2 array-type repeat features uniprot - unknown +YNL300W TOS6 P48560 0 YNL300W no UniProt repeat feature (assumed negative) uniprot - unknown +YDL049C KNH1 P50112 0 YDL049C no UniProt repeat feature (assumed negative) uniprot - unknown +YDL024C DIA3 P52290 0 YAR071W no UniProt repeat feature (assumed negative) uniprot - unknown +YDR261C EXG2 P52911 0 YOR190W no UniProt repeat feature (assumed negative) uniprot - unknown +YGL258W VEL1 P53058 0 YOR387C no UniProt repeat feature (assumed negative) uniprot - unknown +YGL002W ERP6 P53198 0 YHR110W no UniProt repeat feature (assumed negative) uniprot - unknown +YOL052C-A DDR2 P89113 0 YMR251W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YPL130W SPO19 Q03029 0 YPL130W no UniProt repeat feature (assumed negative) uniprot - unknown +YMR251W-A HOR7 Q05827 0 YMR251W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YPR121W THI22 Q06490 0 YPR121W no UniProt repeat feature (assumed negative) uniprot - unknown +YLR413W Q06689 0 YLR413W no UniProt repeat feature (assumed negative) uniprot - unknown +YLR037C PAU23 Q07987 0 YLR037C no UniProt repeat feature (assumed negative) uniprot - unknown +YLR040C AFB1 Q07988 0 YLR040C no UniProt repeat feature (assumed negative) uniprot - unknown +YLR042C Q07990 0 YLR042C no UniProt repeat feature (assumed negative) uniprot - unknown +YLR104W LCL2 Q08045 0 YLR104W no UniProt repeat feature (assumed negative) uniprot - unknown +YOR383C FIT3 Q08907 0 YOR383C no UniProt repeat feature (assumed negative) uniprot - unknown +YPL163C SVS1 Q12254 0 YOR247W no UniProt repeat feature (assumed negative) uniprot - unknown +YOR214C SPR2 Q12282 0 YOR214C no UniProt repeat feature (assumed negative) uniprot - unknown +YDL018C ERP3 Q12403 0 YDL018C no UniProt repeat feature (assumed negative) uniprot - unknown +YDL206W Q12424 0 YDL206W no UniProt repeat feature (assumed negative) uniprot - unknown +YOL154W ZPS1 Q12512 0 YOL154W no UniProt repeat feature (assumed negative) uniprot - unknown +YKL018C-A Q3E7A7 0 YKL018C-A no UniProt repeat feature (assumed negative) uniprot - unknown +YMR325W PAU19 P0CE85 0 YLR037C no UniProt repeat feature (assumed negative) uniprot - unknown +YHR139C SPS100 P13130 0 YHR139C no UniProt repeat feature (assumed negative) uniprot - unknown +YCR061W P25639 0 YCR061W no UniProt repeat feature (assumed negative) uniprot - unknown +YKL224C PAU16 P35994 0 YLR037C no UniProt repeat feature (assumed negative) uniprot - unknown +YBR301W PAU24 P38155 0 YLR037C no UniProt repeat feature (assumed negative) uniprot - unknown +YBR224W P38320 0 YBR224W no UniProt repeat feature (assumed negative) uniprot - unknown +YHL046C PAU13 P38725 0 YLR037C no UniProt repeat feature (assumed negative) uniprot - unknown +YHR138C P38841 0 YHR138C no UniProt repeat feature (assumed negative) uniprot - unknown +YLR250W SSP120 P39931 0 YLR250W no UniProt repeat feature (assumed negative) uniprot - unknown +YER076C P40049 0 YER076C no UniProt repeat feature (assumed negative) uniprot - unknown +YIL059C P40520 0 YIL059C no UniProt repeat feature (assumed negative) uniprot - unknown +YIR041W PAU15 P40585 0 YLR037C no UniProt repeat feature (assumed negative) uniprot - unknown +YFL051C P43552 0 YFL051C no UniProt repeat feature (assumed negative) uniprot - unknown +YFR012W DCV1 P43595 0 YFR012W no UniProt repeat feature (assumed negative) uniprot - unknown +YFR020W CSS2 P43600 0 YFR020W no UniProt repeat feature (assumed negative) uniprot - unknown +YJR120W P47157 0 YJR120W no UniProt repeat feature (assumed negative) uniprot - unknown +YGL259W YPS5 P53057 0 YGL259W no UniProt repeat feature (assumed negative) uniprot - unknown +YGR079W P53249 0 YGR079W no UniProt repeat feature (assumed negative) uniprot - unknown +YNL228W P53862 0 YNL228W no UniProt repeat feature (assumed negative) uniprot - unknown +YNL033W P53964 0 YNL019C no UniProt repeat feature (assumed negative) uniprot - unknown +YNL019C P53975 0 YNL019C no UniProt repeat feature (assumed negative) uniprot - unknown +YDR417C P87267 0 YEL053W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YKR005C Q02203 0 YKR005C no UniProt repeat feature (assumed negative) uniprot - unknown +YPL056C LCL1 Q02786 0 YPL056C no UniProt repeat feature (assumed negative) uniprot - unknown +YDR542W PAU10 Q03050 0 YLR037C no UniProt repeat feature (assumed negative) uniprot - unknown +YFL013W-A Q03187 0 YFL013W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YDR415C Q04033 0 YDR415C no UniProt repeat feature (assumed negative) uniprot - unknown +YDR445C Q04100 0 YDR445C no UniProt repeat feature (assumed negative) uniprot - unknown +YDL237W AIM6 Q07716 0 YDL237W no UniProt repeat feature (assumed negative) uniprot - unknown +YLR001C Q07895 0 YLR001C no UniProt repeat feature (assumed negative) uniprot - unknown +YLR062C BUD28 Q07992 0 YLR062C no UniProt repeat feature (assumed negative) uniprot - unknown +YOL134C Q08272 0 YOL134C no UniProt repeat feature (assumed negative) uniprot - unknown +YOL159C CSS3 Q08300 0 YOL159C no UniProt repeat feature (assumed negative) uniprot - unknown +YOR082C Q08498 0 YOR082C no UniProt repeat feature (assumed negative) uniprot - unknown +YOR365C Q08844 0 YOR365C no UniProt repeat feature (assumed negative) uniprot - unknown +YOR387C Q08910 0 YOR387C no UniProt repeat feature (assumed negative) uniprot - unknown +YOR389W Q08912 0 YPL277C no UniProt repeat feature (assumed negative) uniprot - unknown +YPL277C Q08989 0 YPL277C no UniProt repeat feature (assumed negative) uniprot - unknown +YDL151C BUD30 Q12064 0 YDL151C no UniProt repeat feature (assumed negative) uniprot - unknown +YOR137C SIA1 Q12212 0 YOR137C no UniProt repeat feature (assumed negative) uniprot - unknown +YDR262W Q12331 0 YDR262W no UniProt repeat feature (assumed negative) uniprot - unknown +YLL025W PAU17 Q12370 0 YLR037C no UniProt repeat feature (assumed negative) uniprot - unknown +YCL048W-A Q2V2Q2 0 YCL048W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YDR524C-B Q3E6R4 0 YDR524C-B no UniProt repeat feature (assumed negative) uniprot - unknown +YOR008C-A Q3E7B9 0 YOR008C-A no UniProt repeat feature (assumed negative) uniprot - unknown +YMR158W-B Q6B0X2 0 YMR158W-B no UniProt repeat feature (assumed negative) uniprot - unknown +YEL053W-A A0A023PXC2 0 YEL053W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YER147C-A A0A023PXD5 0 YER147C-A no UniProt repeat feature (assumed negative) uniprot - unknown +YDR203W A0A023PXI4 0 YDR203W no UniProt repeat feature (assumed negative) uniprot - unknown +YAL016C-A A0A023PYC6 0 YAL016C-A no UniProt repeat feature (assumed negative) uniprot - unknown +YEL018C-A A0A023PYD9 0 YEL018C-A no UniProt repeat feature (assumed negative) uniprot - unknown +YER087C-A A0A023PYE9 0 YER087C-A no UniProt repeat feature (assumed negative) uniprot - unknown +YER145C-A A0A023PYF4 0 YER145C-A no UniProt repeat feature (assumed negative) uniprot - unknown +YHR070C-A A0A023PYH0 0 YHR070C-A no UniProt repeat feature (assumed negative) uniprot - unknown +YDR048C A0A023PZE6 0 YDR048C no UniProt repeat feature (assumed negative) uniprot - unknown +YER084W-A A0A023PZG0 0 YER084W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YER137W-A A0A023PZG5 0 YER137W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YMR119W-A A0A023PZL2 0 YMR119W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YMR316C-A I2HB70 0 YMR316C-A no UniProt repeat feature (assumed negative) uniprot - unknown +YAL034C-B O13515 0 YAL034C-B no UniProt repeat feature (assumed negative) uniprot - unknown +YPL136W O13519 0 YPL136W no UniProt repeat feature (assumed negative) uniprot - unknown +YDL240C-A P0C5L8 0 YDL240C-A no UniProt repeat feature (assumed negative) uniprot - unknown +YEL020C-B P0C5M6 0 YEL020C-B no UniProt repeat feature (assumed negative) uniprot - unknown +YCL049C P25577 0 YCL049C no UniProt repeat feature (assumed negative) uniprot - unknown +YBR013C P38215 0 YBR013C no UniProt repeat feature (assumed negative) uniprot - unknown +YHL042W P38729 0 YHL042W no UniProt repeat feature (assumed negative) uniprot - unknown +YHL037C P38733 0 YHL037C no UniProt repeat feature (assumed negative) uniprot - unknown +YAR020C PAU7 P39545 0 YAR020C no UniProt repeat feature (assumed negative) uniprot - unknown +YEL028W P39989 0 YEL028W no UniProt repeat feature (assumed negative) uniprot - unknown +YJR071W P47121 0 YJR071W no UniProt repeat feature (assumed negative) uniprot - unknown +YGL149W P53116 0 YGL149W no UniProt repeat feature (assumed negative) uniprot - unknown +YNL319W P53826 0 YNL319W no UniProt repeat feature (assumed negative) uniprot - unknown +YDR366C P87287 0 YDR366C no UniProt repeat feature (assumed negative) uniprot - unknown +YNL155C-A P9WEJ2 0 YNL155C-A no UniProt repeat feature (assumed negative) uniprot - unknown +YML084W Q04521 0 YML084W no UniProt repeat feature (assumed negative) uniprot - unknown +YDR053W Q07790 0 YDR053W no UniProt repeat feature (assumed negative) uniprot - unknown +YLL044W Q07880 0 YLL044W no UniProt repeat feature (assumed negative) uniprot - unknown +YOR055W Q08439 0 YOR055W no UniProt repeat feature (assumed negative) uniprot - unknown +YOR139C Q08532 0 YOR139C no UniProt repeat feature (assumed negative) uniprot - unknown +YPL261C Q08976 0 YPL261C no UniProt repeat feature (assumed negative) uniprot - unknown +YOR024W Q12070 0 YOR024W no UniProt repeat feature (assumed negative) uniprot - unknown +YBR200W-A Q3E755 0 YBR200W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YDR246W-A Q3E763 0 YDR246W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YMR247W-A Q3E782 0 YMR247W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YBL008W-A Q3E821 0 YBL008W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YJL052C-A Q3E837 0 YJL052C-A no UniProt repeat feature (assumed negative) uniprot - unknown +YCL012C Q8J0M4 0 YCL012C no UniProt repeat feature (assumed negative) uniprot - unknown +YCR045W-A Q8TGQ2 0 YCR045W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YFR034W-A Q8TGR2 0 YFR034W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YMR315W-A Q8TGS4 0 YMR315W-A no UniProt repeat feature (assumed negative) uniprot - unknown +YMR272W-B Q8TGS5 0 YMR272W-B no UniProt repeat feature (assumed negative) uniprot - unknown +YLR406C-A Q8TGT1 0 YLR406C-A no UniProt repeat feature (assumed negative) uniprot - unknown +YFL014W HSP12 P22943 0 YFL014W no UniProt repeat feature (assumed negative) indirect_regulator - no +YIL084C SDS3 P40505 0 YIL084C no UniProt repeat feature (assumed negative) indirect_regulator - no +YDR043C NRG1 Q03125 0 YBR066C no UniProt repeat feature (assumed negative) indirect_regulator - no +YER027C GAL83 Q04739 0 YER027C no UniProt repeat feature (assumed negative) indirect_regulator - no +YBR066C NRG2 P38082 0 YBR066C no UniProt repeat feature (assumed negative) indirect_regulator - no +YOR315W SFG1 Q12507 0 YOR315W no UniProt repeat feature (assumed negative) indirect_regulator - no +YDL037C BSC1 Q12140 0 YDL037C no UniProt repeat feature (assumed negative) adhesin E3 no +YAL064C-A TDA8 Q6B2U8 0 YAL064C-A no UniProt repeat feature (assumed negative) adhesin E3 no diff --git a/analysis/calibration_truth/repeat_call_truth/truth_v3.Scer_S288C.tsv b/analysis/calibration_truth/repeat_call_truth/truth_v3.Scer_S288C.tsv new file mode 100644 index 0000000..8090b87 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/truth_v3.Scer_S288C.tsv @@ -0,0 +1,321 @@ +id label cluster +YLR390W-A 0 YLR390W-A +YBR093C 0 YAR071W +YIL162W 0 YIL162W +YMR297W 0 YBR139W +YPL154C 0 YPL154C +YIR019C 1 YIR019C +YEL060C 0 YOR003W +YGL203C 0 YGL203C +YER011W 1 YBR067C +YIL015W 0 YPL154C +YNL238W 0 YNL238W +YGR282C 0 YGR282C +YJL034W 0 YJL034W +YNL322C 1 YNL322C +YCL043C 0 YDR518W +YJR004C 1 YJR004C +YMR307W 0 YOL132W +YLR300W 0 YOR190W +YCL045C 0 YCL045C +YCR089W 0 YCR089W +YBR067C 0 YBR067C +YAL058W 1 YAL058W +YLR286C 0 YLR286C +YNR044W 1 YNR044W +YLR120C 0 YPL154C +YGR014W 1 YGR014W +YHR079C 0 YHR079C +YDR519W 0 YDR519W +YDR518W 0 YDR518W +YJL159W 1 YKL164C +YEL040W 0 YLR213C +YAR050W 1 YAR050W +YLR214W 0 YLR214W +YLR083C 0 YLR083C +YGL200C 0 YGL200C +YEL002C 0 YEL002C +YBR036C 0 YBR036C +YKL073W 0 YKL073W +YLR332W 0 YLR332W +YKL220C 0 YOR384W +YKL077W 0 YKL077W +YKL034W 0 YKL034W +YKR102W 1 YAR050W +YBR139W 0 YBR139W +YBR229C 0 YBR229C +YBR078W 0 YBR078W +YHL023C 0 YHL023C +YHR132C 0 YHR132C +YHR143W 0 YHR143W +YHR188C 0 YHR188C +YHR195W 0 YHR195W +YHR202W 0 YHR202W +YHR204W 0 YHR204W +YHR211W 1 YAR050W +YIL140W 0 YIL140W +YMR058W 0 YFL041W +YMR008C 0 YMR006C +YAL007C 0 YOR016C +YAL053W 0 YOR365C +YJL073W 0 YJL073W +YJL062W 0 YJL062W +YIL005W 0 YIL005W +YJL002C 0 YJL002C +YDR420W 1 YDR420W +YNL291C 0 YNL291C +YNL327W 1 YNL327W +YFL048C 0 YLR080W +YFL041W 0 YFL041W +YJL178C 0 YJL178C +YJL079C 0 YJL079C +YJL078C 0 YJL078C +YJR150C 0 YJR150C +YOR085W 0 YOR085W +YDR331W 0 YDR331W +YGR106C 0 YGR106C +YGR189C 0 YGR189C +YGR279C 0 YGR279C +YDR144C 0 YPL154C +YNL012W 0 YNL012W +YNL066W 0 YKR042W +YNR060W 0 YOR384W +YNR067C 0 YNR067C +YNL283C 0 YNL283C +YNL190W 0 YNL190W +YNL158W 0 YNL158W +YML012W 0 YML012W +YOR008C 0 YOR008C +YDR077W 1 YDR077W +YMR149W 0 YMR149W +YPL123C 0 YPL123C +YML130C 0 YML130C +YKL164C 1 YKL164C +YKL163W 1 YKL164C +YMR215W 0 YOL132W +YMR006C 0 YMR006C +YMR200W 0 YMR200W +YML019W 0 YML019W +YDR236C 0 YDR236C +YDR456W 0 YDR456W +YMR065W 0 YMR065W +YDR221W 0 YDR221W +YMR305C 0 YGR279C +YMR238W 0 YKL046C +YOL155C 1 YOL155C +YAR002C-A 0 YHR110W +YLR194C 0 YLR194C +YLR343W 0 YOL132W +YLR308W 0 YLR307W +YOL011W 0 YMR006C +YOL030W 0 YOL132W +YOR381W 0 YOR384W +YPL221W 0 YOR365C +YLR110C 1 YLR110C +YPL006W 0 YPL006W +YLR121C 0 YPL154C +YDR055W 0 YBR078W +YLR080W 0 YLR080W +YOR288C 0 YOR288C +YDL046W 0 YDL046W +YDL010W 0 YBR014C +YLR084C 0 YLR084C +YLL051C 0 YOR384W +YDR057W 0 YDR057W +YHR057C 0 YHR057C +YCR011C 0 YCR011C +YCR045C 0 YOR003W +YCR044C 0 YCR044C +YOR190W 0 YOR190W +YGL032C 0 YGL032C +YDR304C 0 YHR057C +YAR071W 0 YAR071W +YKL046C 0 YKL046C +YKR013W 0 YJL079C +YKR042W 0 YKR042W +YBR286W 0 YBR286W +YBR014C 0 YBR014C +YBR162C 0 YJL171C +YNL160W 0 YHR139C +YHR101C 0 YHR101C +YJL192C 0 YJL192C +YAL063C 1 YAR050W +YER113C 0 YER113C +YER150W 0 YER150W +YIL169C 0 YOL155C +YIL123W 0 YKR042W +YIL011W 0 YBR067C +YIR039C 0 YPL154C +YJL186W 0 YJL186W +YJL171C 0 YJL171C +YJL059W 0 YJL059W +YJL038C 0 YJL038C +YJL037W 0 YJL038C +YJR151C 1 YJR151C +YGL228W 0 YGL228W +YGL139W 0 YOR365C +YGL028C 0 YGR279C +YGR023W 0 YLR332W +YDR534C 1 YDR534C +YDR107C 0 YLR083C +YLR213C 0 YLR213C +YDR349C 0 YDR349C +YDR371W 0 YDR371W +YLR307W 0 YLR307W +YPR079W 0 YPR079W +YOL031C 0 YOL031C +YOL132W 0 YOL132W +YOR247W 0 YOR247W +YOR382W 0 YOR382W +YOR384W 0 YOR384W +YPL189W 0 YPL189W +YDR056C 0 YDR056C +YOL105C 0 YNL283C +YOR009W 1 YBR067C +YOR154W 0 YOR154W +YDR032C 0 YDR032C +YOR016C 0 YOR016C +YNL024C-A 0 YNL024C-A +YOL088C 0 YOL088C +YPL187W 0 YGL089C +YDR522C 0 YBR078W +YOR336W 0 YOR336W +YBR092C 0 YAR071W +YOR003W 0 YOR003W +YCR069W 0 YHR057C +YGL089C 0 YGL089C +YKL039W 0 YKL039W +YKR044W 0 YKR044W +YHR215W 0 YAR071W +YHL028W 0 YHL028W +YHL017W 0 YKL039W +YHR110W 0 YHR110W +YHR151C 0 YHR151C +YJL174W 0 YDL049C +YEL059W 0 YEL059W +YEL001C 0 YEL001C +YFR039C 0 YFR039C +YFR041C 0 YFR041C +YJL160C 1 YKL164C +YNL300W 0 YNL300W +YDL049C 0 YDL049C +YDL024C 0 YAR071W +YDR261C 0 YOR190W +YGL258W 0 YOR387C +YGL002W 0 YHR110W +YOL052C-A 0 YMR251W-A +YPL130W 0 YPL130W +YMR251W-A 0 YMR251W-A +YPR121W 0 YPR121W +YLR413W 0 YLR413W +YLR037C 0 YLR037C +YLR040C 0 YLR040C +YLR042C 0 YLR042C +YLR104W 0 YLR104W +YOR383C 0 YOR383C +YPL163C 0 YOR247W +YOR214C 0 YOR214C +YDL018C 0 YDL018C +YDL206W 0 YDL206W +YOL154W 0 YOL154W +YKL018C-A 0 YKL018C-A +YMR325W 0 YLR037C +YHR139C 0 YHR139C +YCR061W 0 YCR061W +YKL224C 0 YLR037C +YBR301W 0 YLR037C +YBR224W 0 YBR224W +YHL046C 0 YLR037C +YHR138C 0 YHR138C +YLR250W 0 YLR250W +YER076C 0 YER076C +YIL059C 0 YIL059C +YIR041W 0 YLR037C +YFL051C 0 YFL051C +YFR012W 0 YFR012W +YFR020W 0 YFR020W +YJR120W 0 YJR120W +YGL259W 0 YGL259W +YGR079W 0 YGR079W +YNL228W 0 YNL228W +YNL033W 0 YNL019C +YNL019C 0 YNL019C +YDR417C 0 YEL053W-A +YKR005C 0 YKR005C +YPL056C 0 YPL056C +YDR542W 0 YLR037C +YFL013W-A 0 YFL013W-A +YDR415C 0 YDR415C +YDR445C 0 YDR445C +YDL237W 0 YDL237W +YLR001C 0 YLR001C +YLR062C 0 YLR062C +YOL134C 0 YOL134C +YOL159C 0 YOL159C +YOR082C 0 YOR082C +YOR365C 0 YOR365C +YOR387C 0 YOR387C +YOR389W 0 YPL277C +YPL277C 0 YPL277C +YDL151C 0 YDL151C +YOR137C 0 YOR137C +YDR262W 0 YDR262W +YLL025W 0 YLR037C +YCL048W-A 0 YCL048W-A +YDR524C-B 0 YDR524C-B +YOR008C-A 0 YOR008C-A +YMR158W-B 0 YMR158W-B +YEL053W-A 0 YEL053W-A +YER147C-A 0 YER147C-A +YDR203W 0 YDR203W +YAL016C-A 0 YAL016C-A +YEL018C-A 0 YEL018C-A +YER087C-A 0 YER087C-A +YER145C-A 0 YER145C-A +YHR070C-A 0 YHR070C-A +YDR048C 0 YDR048C +YER084W-A 0 YER084W-A +YER137W-A 0 YER137W-A +YMR119W-A 0 YMR119W-A +YMR316C-A 0 YMR316C-A +YAL034C-B 0 YAL034C-B +YPL136W 0 YPL136W +YDL240C-A 0 YDL240C-A +YEL020C-B 0 YEL020C-B +YCL049C 0 YCL049C +YBR013C 0 YBR013C +YHL042W 0 YHL042W +YHL037C 0 YHL037C +YAR020C 0 YAR020C +YEL028W 0 YEL028W +YJR071W 0 YJR071W +YGL149W 0 YGL149W +YNL319W 0 YNL319W +YDR366C 0 YDR366C +YNL155C-A 0 YNL155C-A +YML084W 0 YML084W +YDR053W 0 YDR053W +YLL044W 0 YLL044W +YOR055W 0 YOR055W +YOR139C 0 YOR139C +YPL261C 0 YPL261C +YOR024W 0 YOR024W +YBR200W-A 0 YBR200W-A +YDR246W-A 0 YDR246W-A +YMR247W-A 0 YMR247W-A +YBL008W-A 0 YBL008W-A +YJL052C-A 0 YJL052C-A +YCL012C 0 YCL012C +YCR045W-A 0 YCR045W-A +YFR034W-A 0 YFR034W-A +YMR315W-A 0 YMR315W-A +YMR272W-B 0 YMR272W-B +YLR406C-A 0 YLR406C-A +YFL014W 0 YFL014W +YIL084C 0 YIL084C +YDR043C 0 YBR066C +YER027C 0 YER027C +YBR066C 0 YBR066C +YOR315W 0 YOR315W +YDL037C 0 YDL037C +YAL064C-A 0 YAL064C-A diff --git a/analysis/calibration_truth/repeat_call_truth/uniprot_repeat_features.tsv b/analysis/calibration_truth/repeat_call_truth/uniprot_repeat_features.tsv new file mode 100644 index 0000000..8e496a9 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/uniprot_repeat_features.tsv @@ -0,0 +1,156 @@ +accession reviewed length n_repeat_features repeat_evidence_codes n_region_mentions_repeat region_descriptions fetched +A0A1D8PCV9 no 571 0 0 2026-10-07 +A0A1D8PCY4 no 423 0 0 2026-10-07 +A0A1D8PD52 no 1287 0 0 2026-10-07 +A0A1D8PE35 no 364 0 0 2026-10-07 +A0A1D8PE53 no 620 0 0 2026-10-07 +A0A1D8PE87 no 662 0 0 2026-10-07 +A0A1D8PHU1 no 413 0 0 2026-10-07 +A0A1D8PIK2 no 430 0 0 2026-10-07 +A0A1D8PIY8 no 1244 0 0 2026-10-07 +A0A1D8PJZ6 no 696 0 0 2026-10-07 +A0A1D8PK00 no 160 0 0 2026-10-07 +A0A1D8PKY7 no 838 0 0 2026-10-07 +A0A1D8PMH9 no 830 0 0 2026-10-07 +A0A1D8PN26 no 348 0 0 2026-10-07 +A0A1D8PP43 no 350 0 0 2026-10-07 +A0A1D8PQ86 yes 1890 19 none:19 0 2026-10-07 +A0A1D8PQB9 yes 2100 38 none:38 0 2026-10-07 +A0A1D8PQU2 no 184 0 0 2026-10-07 +A0A1D8PR83 no 1690 0 0 2026-10-07 +A0A1D8PRI0 no 421 0 0 2026-10-07 +A0A1D8PT45 no 825 0 0 2026-10-07 +A0A1D8PTB4 no 469 0 0 2026-10-07 +E9P9G2 no 1360 0 0 2026-10-07 +G1UB67 yes 887 0 0 2026-10-07 +G1UBC2 yes 653 25 none:25 2 15 X 6 AA tandem repeats, Ser/Thr-rich | 10 X 20 AA approximate tandem repeats 2026-10-07 +O59923 yes 519 0 0 2026-10-07 +O74189 yes 877 0 0 2026-10-07 +O94072 yes 226 0 0 2026-10-07 +P08640 yes 1367 46 ECO:0000269:46 5 4 X 10 AA repeats, Ser/Thr-rich | 2 X 13 AA repeats, Thr-rich | 22 X 15 AA approximate repeats, Ser-rich 2026-10-07 +P0CU38 yes 2530 50 none:50 0 2026-10-07 +P0CY27 yes 391 0 0 2026-10-07 +P0CY29 yes 398 0 0 2026-10-07 +P0CY34 yes 512 7 none:7 0 2026-10-07 +P0DJ06 yes 398 0 0 2026-10-07 +P10863 yes 254 11 none:11 2 5 X 6 AA approximate tandem repeats, Ala/Ser-rich | 5 X 12 AA approximate tandem repeats, Ala/Ser-rich 2026-10-07 +P13649 yes 270 0 0 2026-10-07 +P20840 yes 650 2 none:2 1 2 X 40 AA tandem repeats 2026-10-07 +P22146 yes 559 0 0 2026-10-07 +P22943 yes 109 0 0 2026-10-07 +P23776 yes 448 0 0 2026-10-07 +P28319 yes 239 1 none:1 0 2026-10-07 +P29029 yes 562 0 0 2026-10-07 +P29717 yes 438 0 0 2026-10-07 +P32323 yes 725 20 ECO:0000269:20 2 2 X approximate repeats | 18 X approximate tandem repeats, Ser/Thr-rich 2026-10-07 +P32329 yes 569 0 0 2026-10-07 +P32334 yes 1306 7 none:7 1 7 X 17 AA tandem repeats 2026-10-07 +P32478 yes 413 11 ECO:0000255:11;ECO:0000269:11 0 2026-10-07 +P32623 yes 467 0 0 2026-10-07 +P32768 yes 1537 26 none:26 4 18 X 45 AA approximate tandem repeats, Thr-rich | 2 X 20 AA approximate tandem repeats, Ser/Thr-rich | 3 X 51 AA approximate repeats, Ser/Thr-rich 2026-10-07 +P32781 yes 87 0 0 2026-10-07 +P36027 yes 376 0 0 2026-10-07 +P36170 yes 1169 10 ECO:0000269:10 2 6 X 27 AA approximate repeats, Ser/Thr-rich | 4 X 36 AA approximate repeats, Ser/Thr-rich 2026-10-07 +P38082 yes 220 0 0 2026-10-07 +P38248 yes 429 0 0 2026-10-07 +P38894 yes 1075 13 ECO:0000269:13 3 8 X 45 AA approximate tandem repeats, Thr-rich | 2 X 20 AA approximate tandem repeats, Ser-rich | 3 X 51 AA approximate repeats, Ser/Thr-rich 2026-10-07 +P38993 yes 636 0 0 2026-10-07 +P39005 yes 276 0 0 2026-10-07 +P39712 yes 1322 19 none:19 3 13 X 45 AA approximate tandem repeats, Thr-rich | 3 X 15 AA approximate repeats, Ser-rich | 3 X 51 AA approximate repeats, Thr-rich 2026-10-07 +P39827 yes 357 0 0 2026-10-07 +P40442 yes 995 0 0 2026-10-07 +P40505 yes 327 0 0 2026-10-07 +P40552 yes 269 0 0 2026-10-07 +P41809 yes 1802 12 none:12 1 12 X 28 AA tandem repeats of S-[AV]-[P]-V-A-V-S-S-T-Y-T-S-S-P-S-A-P-A-A-I-S-S-T-Y-T-S-S-P 2026-10-07 +P42835 yes 1041 9 ECO:0000269:9 1 9 X approximate repeats 2026-10-07 +P43076 yes 548 0 0 2026-10-07 +P43497 yes 92 1 none:1 0 2026-10-07 +P46592 yes 461 0 0 2026-10-07 +P46593 yes 634 14 none:14 1 14 X 10 AA tandem repeats of [EVIQ]-P-[CDT]-D-[YNW]-P-[PQ]-[QI]-[QP]-[QDN] 2026-10-07 +P47001 yes 227 1 none:1 0 2026-10-07 +P47178 yes 298 0 0 2026-10-07 +P47179 yes 1161 17 ECO:0000269:17 3 46 X 3 AA tandem repeats of T-[SP]-T | 14 X 12 AA approximate tandem repeats | 2.5 X 88 AA approximate tandem repeats 2026-10-07 +P53301 yes 507 0 0 2026-10-07 +P53616 yes 420 0 0 2026-10-07 +P53698 yes 110 0 0 2026-10-07 +P53705 yes 1709 0 0 2026-10-07 +P53832 yes 503 0 0 2026-10-07 +P54867 yes 378 0 0 2026-10-07 +P82610 yes 767 0 0 2026-10-07 +P82612 yes 248 0 0 2026-10-07 +P83774 yes 317 7 ECO:0000255:7 0 2026-10-07 +P87020 yes 299 0 0 2026-10-07 +Q00310 yes 431 0 0 2026-10-07 +Q01589 yes 338 9 ECO:0000269:9 2 7 X approximate tandem repeats | 2 X 43 AA repeats 2026-10-07 +Q03125 yes 231 0 0 2026-10-07 +Q03178 yes 341 8 ECO:0000255:8;ECO:0000269:8 0 2026-10-07 +Q04433 yes 528 16 ECO:0000269:16 2 4 X approximate tandem repeats | 12 X 6 AA approximate tandem repeats, Ser/Thr-rich 2026-10-07 +Q04739 yes 417 0 0 2026-10-07 +Q05164 yes 967 18 ECO:0000269:18 2 13 X approximate repeats, Ser-rich | 4.5 X approximate tandem repeats, Thr-rich 2026-10-07 +Q12127 yes 133 2 none:2 0 2026-10-07 +Q12140 yes 328 0 0 2026-10-07 +Q12218 yes 487 11 ECO:0000269:11 1 11 X 12 AA approximate tandem repeats, Ser-rich 2026-10-07 +Q12507 yes 346 0 0 2026-10-07 +Q59L12 yes 1155 14 none:14 0 2026-10-07 +Q59NP5 yes 418 0 0 2026-10-07 +Q59PF9 yes 908 0 0 2026-10-07 +Q59Q34 no 1223 0 0 2026-10-07 +Q59QH2 no 337 0 0 2026-10-07 +Q59RR0 yes 783 0 0 2026-10-07 +Q59RW5 yes 493 0 0 2026-10-07 +Q59SR6 yes 638 0 0 2026-10-07 +Q59SU1 yes 544 0 0 2026-10-07 +Q59TP1 yes 721 0 0 2026-10-07 +Q59U10 yes 740 0 0 2026-10-07 +Q59UQ8 no 445 0 0 2026-10-07 +Q59UR3 no 987 0 0 2026-10-07 +Q59UT4 yes 241 0 0 2026-10-07 +Q59WG7 yes 322 0 0 2026-10-07 +Q59WH0 yes 445 0 0 2026-10-07 +Q59X67 yes 550 0 0 2026-10-07 +Q59XA7 yes 1249 0 0 2026-10-07 +Q59XB0 yes 714 0 0 2026-10-07 +Q59XL0 yes 1085 0 0 2026-10-07 +Q59XU5 yes 290 0 0 2026-10-07 +Q59XU9 no 403 0 0 2026-10-07 +Q59XX2 yes 378 0 0 2026-10-07 +Q59Y20 yes 724 5 none:5 0 2026-10-07 +Q59Y31 yes 533 0 0 2026-10-07 +Q59Z29 yes 798 0 0 2026-10-07 +Q59ZB1 yes 356 0 0 2026-10-07 +Q5A029 yes 941 0 0 2026-10-07 +Q5A1E0 yes 1308 0 0 2026-10-07 +Q5A287 yes 805 0 0 2026-10-07 +Q5A2J7 yes 675 0 0 2026-10-07 +Q5A2Z7 yes 1366 6 none:6 0 2026-10-07 +Q5A312 yes 1568 4 none:4 0 2026-10-07 +Q5A4F3 yes 624 0 0 2026-10-07 +Q5A4X3 no 871 0 0 2026-10-07 +Q5A5M7 yes 1562 0 0 2026-10-07 +Q5A651 yes 453 0 0 2026-10-07 +Q5A6N7 no 105 0 0 2026-10-07 +Q5A6U1 yes 941 0 0 2026-10-07 +Q5A7M9 no 254 0 0 2026-10-07 +Q5A7R7 yes 511 0 0 2026-10-07 +Q5A849 yes 1225 0 0 2026-10-07 +Q5A8T4 yes 1260 12 none:12 0 2026-10-07 +Q5A8T7 yes 1347 6 none:6 0 2026-10-07 +Q5AA40 yes 310 0 0 2026-10-07 +Q5AAL9 yes 1526 0 0 2026-10-07 +Q5AAN7 no 175 0 0 2026-10-07 +Q5ACL7 yes 132 0 0 2026-10-07 +Q5ADM7 no 335 0 0 2026-10-07 +Q5AFI4 yes 337 0 0 2026-10-07 +Q5AH00 no 163 0 0 2026-10-07 +Q5AIR7 yes 1145 0 0 2026-10-07 +Q5AJC0 yes 470 0 0 2026-10-07 +Q5AK51 yes 714 0 0 2026-10-07 +Q5AL03 yes 919 0 0 2026-10-07 +Q5AMQ6 yes 1111 0 0 2026-10-07 +Q5AMT2 yes 308 0 0 2026-10-07 +Q5ANF0 no 445 0 0 2026-10-07 +Q5ANJ4 yes 743 0 0 2026-10-07 +Q5AP80 yes 785 0 0 2026-10-07 +Q5AQ36 yes 388 0 0 2026-10-07 +Q6B2U8 yes 126 0 0 2026-10-07 +Q9Y7W4 yes 745 0 0 2026-10-07 diff --git a/analysis/calibration_truth/repeat_call_truth/zseq_rule_scan.py b/analysis/calibration_truth/repeat_call_truth/zseq_rule_scan.py new file mode 100644 index 0000000..65236f9 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/zseq_rule_scan.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python3 +"""Exploratory: add a sequence-level periodicity rule to the repeat call and measure it on the truth tables. + +Current call: either detector gives a period, with region coverage >= 0.25 and >= 2.5 copies. +Candidate extra rule: detector 14 `rep_z_seq` >= Z (strong periodicity of the whole sequence, even when no +repeat region could be extracted). NOTHING IS CHANGED in the module. The truth tables are small and +partly tuned; an extra rule needs a held-out truth set and the owner's decision. + +Usage: zseq_rule_scan.py --work WORKDIR_ROOT --truth DIR --prefix truth_v2 --out FILE +""" + +import argparse +import csv +import sys + + +def read(path): + return {r["protein"]: r for r in csv.DictReader(open(path), delimiter="\t")} + + +def current(row, cov=0.25, copies=2.5): + return ( + bool(row) + and int(row["rep_period"]) > 0 + and float(row["rep_coverage"]) >= cov + and float(row["rep_n_copies"]) >= copies + ) + + +def main(): + ap = argparse.ArgumentParser( + description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter + ) + ap.add_argument("--work", required=True) + ap.add_argument("--truth", required=True) + ap.add_argument("--prefix", default="truth_v2") + ap.add_argument("--out", required=True) + a = ap.parse_args() + out = [] + for prot in ("Scer_S288C", "Calb_SC5314"): + truth = list( + csv.DictReader(open(f"{a.truth}/{a.prefix}.{prot}.annotated.tsv"), delimiter="\t") + ) + r02 = read(f"{a.work}/{prot}/raw/repeats/repeat02.tsv") + r14 = read(f"{a.work}/{prot}/raw/repeats/repeat14.tsv") + for z in (None, 6.0, 5.5, 5.0, 4.5, 4.0, 3.5): + tp = fp = fn = tn = 0 + gained, falsepos = [], [] + for t in truth: + base = current(r02.get(t["id"])) or current(r14.get(t["id"])) + row14 = r14.get(t["id"]) # proteins under the detectors' minimum length have no row + extra = z is not None and bool(row14) and float(row14["rep_z_seq"]) >= z + called = base or extra + y = t["label"] == "1" + tp += y and called + fn += y and not called + fp += (not y) and called + tn += (not y) and not called + if extra and not base: + (gained if y else falsepos).append(t["gene"] or t["accession"]) + out.append( + { + "proteome": prot, + "z_seq_min": "none" if z is None else z, + "positives": tp + fn, + "sensitivity": f"{tp / (tp + fn):.3f}", + "negatives": fp + tn, + "false_positives": fp, + "specificity": f"{tn / (fp + tn):.3f}", + "gained_positives": ";".join(gained), + "added_false_positives": ";".join(falsepos), + } + ) + with open(a.out, "w", newline="") as f: + w = csv.DictWriter(f, fieldnames=list(out[0]), delimiter="\t", lineterminator="\n") + w.writeheader() + w.writerows(out) + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/analysis/calibration_truth/repeat_call_truth/zseq_rule_scan.tsv b/analysis/calibration_truth/repeat_call_truth/zseq_rule_scan.tsv new file mode 100644 index 0000000..c2757e2 --- /dev/null +++ b/analysis/calibration_truth/repeat_call_truth/zseq_rule_scan.tsv @@ -0,0 +1,15 @@ +proteome z_seq_min positives sensitivity negatives false_positives specificity gained_positives added_false_positives +Scer_S288C none 31 0.323 297 4 0.987 +Scer_S288C 6.0 31 0.355 297 4 0.987 HKR1 +Scer_S288C 5.5 31 0.355 297 4 0.987 HKR1 +Scer_S288C 5.0 31 0.387 297 5 0.983 HKR1;EGT2 Q8TGR2 +Scer_S288C 4.5 31 0.419 297 5 0.983 MSB2;HKR1;EGT2 Q8TGR2 +Scer_S288C 4.0 31 0.484 297 13 0.956 MSB2;HKR1;EGT2;HPF1;DAN4 SLG1;RNY1;NHX1;CSS1;FIT2;WSC4;Q08912;Q07880;Q8TGR2 +Scer_S288C 3.5 31 0.548 297 23 0.923 AGA1;MSB2;HKR1;EGT2;SED1;HPF1;DAN4 FPR2;GPI8;SLG1;RNY1;NHX1;SPR1;YGP1;CSS1;FIT2;WSC4;P53964;P53975;Q08498;Q08912;Q08989;Q07880;Q8TGQ2;Q8TGR2;NRG2 +Calb_SC5314 none 16 0.375 210 5 0.976 +Calb_SC5314 6.0 16 0.375 210 7 0.967 IFF5;RBR3 +Calb_SC5314 5.5 16 0.375 210 8 0.962 PGA62;IFF5;RBR3 +Calb_SC5314 5.0 16 0.500 210 9 0.957 ALS5;ALS6 PGA62;IFF5;RBR3;IFF9 +Calb_SC5314 4.5 16 0.500 210 12 0.943 ALS5;ALS6 YWP1;PGA62;IFF3;IFF5;RBR3;IFF9;PGA42 +Calb_SC5314 4.0 16 0.625 210 16 0.924 HWP1;ALS5;PGA18;ALS6 YWP1;IFF4;PGA62;IFF3;IFF5;RBR3;IFF9;PGA22;PGA42;BCR1;HAP2 +Calb_SC5314 3.5 16 0.625 210 33 0.843 HWP1;ALS5;PGA18;ALS6 CSA1;XOG1;ECE1;RBT1;PGA10;YWP1;IFF4;ATC1;SOD4;PGA62;PLB1;PGA5;PGA25;PGA23;IFF3;PGA41;IFF5;RBR3;IFF9;PGA22;PGA42;ROT1;LCL2;BCR1;CSH1;HAP2;RFX2;WOR1 diff --git a/analysis/cocci_repeats/asm_locus_raw.tar.gz b/analysis/cocci_repeats/asm_locus_raw.tar.gz new file mode 100644 index 0000000..db6a955 Binary files /dev/null and b/analysis/cocci_repeats/asm_locus_raw.tar.gz differ diff --git a/analysis/cocci_repeats/asm_vs_ref_bins.tsv.gz b/analysis/cocci_repeats/asm_vs_ref_bins.tsv.gz new file mode 100644 index 0000000..ea2100b Binary files /dev/null and b/analysis/cocci_repeats/asm_vs_ref_bins.tsv.gz differ diff --git a/data/controls/repeat-mechanism/errata_2026-10-08.md b/data/controls/repeat-mechanism/errata_2026-10-08.md new file mode 100644 index 0000000..a83713c --- /dev/null +++ b/data/controls/repeat-mechanism/errata_2026-10-08.md @@ -0,0 +1,17 @@ +# Errata and label notes, 2026-10-08 + +Raised by the Als9 curation of 2026-10-06 (`to_import/IMPORT_LOG.md`, Sheppard 2004, PMID 15128742). The +agent tables are not edited. The consequences are recorded here. + +1. **ALS7 (Q5A312), adhesin label.** The row is E1 from a GO "IMP" annotation that cites PMID 17510860. That + paper studies Als1p and Als5p only (agent B's note, finding 3). Sheppard 2004 expressed ALS1, 3, 5, 6, 7 + and 9 in *S. cerevisiae*: Als7p adhered to none of the substrates tested (laminin, fibronectin, gelatin, + epithelial and endothelial cells). Action: `data/curated/adhesins/manual_overrides.tsv` now has a row + that sets ALS7 to E3 (adhesion not directly shown). `adhesins.tsv` is a generated file and changes the + next time `analysis/curation/build_adhesins.py` is run (it queries live services; not re-run here). + **The repeat label of ALS7 is not affected:** UniProt Q5A312 has 4 `Repeat` features (ALS repeats), and + the adjudicated table gives `2a` at the database-annotation tier. +2. **ALS9 (A0A1D8PQ86), mechanism source.** Agent A cites PMID 15116430 for ALS9. That is the ALS1 paper. + Agent B cites PMID 17600078. The adhesion evidence for ALS9 is Sheppard 2004 (PMID 15128742): adherence to + laminin only. UniProt records Als repeat features for ALS9, so the repeat label does not rest on the + wrong citation. No table value changes; read the ALS9 row with this note. diff --git a/data/curated/adhesins/manual_overrides.tsv b/data/curated/adhesins/manual_overrides.tsv index eb416af..fff9a1b 100644 --- a/data/curated/adhesins/manual_overrides.tsv +++ b/data/curated/adhesins/manual_overrides.tsv @@ -17,3 +17,4 @@ Q12140 BSC1 adhesin E3 Flo11 domain, no adhesion evidence; shipped-model false p P0CI66 adhesin E3 198-aa subtelomeric flocculin-repeat ORF (likely pseudogene fragment) P0CI67 adhesin E3 198-aa subtelomeric flocculin-repeat ORF (likely pseudogene fragment) Q6B2U8 TDA8 adhesin E3 126-aa PA14 fragment ORF +Q5A312 ALS7 adhesin E3 GO IMP annotation cites PMID 17510860, which studies Als1p and Als5p only and does not mention Als7p. Sheppard 2004 (PMID 15128742): S. cerevisiae expressing Als7p adhered to none of the substrates tested. Als family member by sequence (4 UniProt Repeat features). Adhesion not directly shown; owner to confirm (2026-10-08) diff --git a/docs/HANDOFF-2026-10-08.md b/docs/HANDOFF-2026-10-08.md new file mode 100644 index 0000000..10cc656 --- /dev/null +++ b/docs/HANDOFF-2026-10-08.md @@ -0,0 +1,76 @@ +# Handoff, 2026-10-08: per-call status entries built, first calibration of the repeat call + +Read this after `docs/HANDOFF-2026-10-07.md`. The working style holds: spec, plan and independent review before code; branches only; nothing pushed without the owner's go-ahead; `/usr/bin/python3.12`; the pre-commit hook (ruff 0.3.5, ruff-format) aborts a commit that it reformats, so re-add and commit again. + +## 1. What was done overnight (all local, nothing pushed) + +| item | branch | state | +|---|---|---| +| Per-call status entries: plan, two independent reviews (spec review 1; plan review 1), seven tasks of code with tests first | `per-call-status` (about 20 commits ahead of `origin/main`) | done; 788 tests pass, 7 skipped; about 40 mutation checks each fail a named test | +| Truth tables for the repeat call (S288C, *C. albicans*, *A. fumigatus*), UniProt expansion, scans | `per-call-status` (merged from `repeat-truth-curation`, which also exists in the worktree `../adhesionPred-curation`) | done | +| First measured status of `tandem_repeat_protein` | report `docs/reports/2026-10-08-repeat-call-calibration.md` | `smoke` in two species | +| ALS7 label override, errata for ALS7 and ALS9 | `per-call-status` | done; owner to confirm | +| Independent code review of the implementation (Opus, read-only, 30 mutations: 27 killed, 3 survived) | `per-call-status` | verdict "ready, with minor fixes"; all but one fix applied (`docs/superpowers/plans/2026-10-08-per-call-status-code-review-1.md`); 788 tests pass | + +PR #74 (`sorting-hat-classifier-runs`: nine runs, curated-label check, class breakdown, scale) is still open and was not touched. `per-call-status` was cut from `origin/main` after PR #73 and does not contain PR #74. + +## 2. The result in one table + +The repeat call (`repeat02` or `repeat14`) now has a measured status, written by `cellsurface_sorting_hat_calibrate truth --call-status`. Leakage `tuned_on_truth` caps every entry at `smoke`. + +| species | positives (clusters) | negatives (clusters) | sensitivity [95%] | specificity [95%] | status | +|---|---|---|---|---|---| +| *S. cerevisiae* | 31 (22) | 297 (227) | 0.323 [0.043, 0.535] | 0.987 [0.962, 1.000] | `smoke` | +| *C. albicans* | 16 (9) | 210 (155) | 0.375 [0.000, 0.680] | 0.976 [0.938, 0.995] | `smoke` | +| *A. fumigatus* | 8 (4), all enzyme repeat domains | 159 (117) | not measurable | 1.000 [0.968, 1.000] | no entry written | + +- **Specificity is high; sensitivity is low.** The call finds about a third of UniProt-annotated repeat proteins. +- **About half of the misses are real tandem arrays that the detectors do not find** (AGA1 20 repeats, HPF1 18, EAP1 25, PGA18 24, ALS5, ALS6, ALS7); the other half are repeat domains (BNR, LRR, WD, PbH) that the detectors were never built for. See the report, section 4. +- Changing the coverage cutoff or the region cut does not fix it. Of the 31 missed positives, 22 stop at detector 14's sequence-level z gate, 5 at its score pre-filter, 4 at the region test. Where a region is found it covers 0.04 to 0.14 of the protein, against 0.16 to 0.84 for the UniProt repeat span. An extra rule on `rep_z_seq` gains a few positives and adds false positives that look like real adhesin-like proteins. Nothing in the module was changed. +- The *A. fumigatus* positives are all PbH and BNR domains in enzymes. The repeat call has **no measurement in filamentous fungi**. +- Negatives are assumed (absent UniProt annotation). IFF5, RBR3 and IFF9 appear as false positives, but CGD describes them as adhesin-like GPI proteins, so they are probably true repeat proteins that UniProt has no features for. + +## 2a. Update after the owner's answers (2026-10-08, later) + +- Decision 2 answered: see item 2 below. The truth was rebuilt; the repeat call under the new definition is `smoke` with sensitivity 0.435 [0.067, 0.667] (S288C) and 0.462 [0.000, 0.788] (*C. albicans*), specificity 0.987 and 0.976. Report section 8. +- Decision 3 (ALS7 to E3) confirmed by the owner. PR #74 is merged. +- Open for the owner: decisions 1, 4, 5 and the CFEM and Hydrophobin sign-off. + +## 3. Decisions for the owner + +1. **Review the code and the branch, then say whether to push `per-call-status` and open a PR.** Read first: `docs/superpowers/plans/2026-10-08-per-call-status.md` (decisions D1 to D15) and the review records. +2. **What does `tandem_repeat_protein` mean?** *Decided by the owner on 2026-10-08:* a repeating motif or array as in FLO11. A repeating domain counts only if it is a known domain associated with adhesion. Examples the owner named: Ser/Thr-rich tandem repeats, the Thr-rich functional amyloid core, Hwp1 repeats (*C. albicans*), Iff/Hyr repeats. More are expected to be found by studying the properties of the arrays. The truth set was rebuilt to match (report section 8); the v2 numbers below are for the broad truth that this decision replaces. The report's section 7 states what is needed for `estimated` (at least 20 independent positive clusters, about 60 for a half-width of 0.10 at sensitivity 0.3, and a truth set no detector saw). +3. **Confirm the ALS7 override** (E1 to E3) in `data/curated/adhesins/manual_overrides.tsv`, and the ALS9 note in `data/controls/repeat-mechanism/errata_2026-10-08.md`. `adhesins.tsv` is generated and changes at the next `build_adhesins.py` run (live services; not run). +4. **Derived composite statuses.** The note is printed only when call files exist (plan decision D5). If you want a marker in `status_basis` for every run, that changes `calls.long`. +5. **Detector work.** Is it worth looking at the short-unit arrays (EAP1, PGA18, AGA1; 6 to 8 aa units) and the Als repeats of ALS5 to ALS7? Leads are in the report. A change needs a held-out truth set. +6. Still waiting from before: CFEM and Hydrophobin sign-off (PA14 is active); the per-species R0 status for the other runs; PR #74. + +## 3a. What a morning check can verify quickly + +``` +cd /bigdata/stajichlab/jstajich/projects/adhesionPred && git checkout per-call-status +PYTHONPATH=$PWD/src /usr/bin/python3.12 -m pytest tests/cellsurface_sorting_hat -q -p no:cacheprovider # 788 passed, 7 skipped +# the two measured call files and their run output (work directories are git-ignored): +ls _workdir/sorting_hat/Scer_S288C/status/calls _workdir/sorting_hat/Calb_SC5314/status/calls +sed -n '/^## Call calibration/,/^## Calls/p' _workdir/sorting_hat/Scer_S288C/out_calls/report.md +``` +Copies of the call files are in `docs/reports/data/sorting_hat/call_status/`. + +## 4. Files and where things are + +| topic | location | +|---|---| +| per-call status code | `src/cellsurface_sorting_hat/call_status.py`, `calibration/call_files.py`, `engine.py` (`call_eligible`, `call_hash`, `reads_of_call`, `evaluate`), `calibration/cli.py` (`--call-status`), `cli.py`, `outputs.py` | +| tests | `tests/cellsurface_sorting_hat/test_call_helpers.py`, `test_call_status.py`, `calibration/test_call_files.py`, `calibration/test_truth_call_status.py`, additions to `test_engine.py` and `test_cli.py` (incl. the pinned golden output in `golden/`) | +| rules | `docs/paper/03`, section 6a | +| truth tables, scripts, scans | `analysis/calibration_truth/repeat_call_truth/` | +| report | `docs/reports/2026-10-08-repeat-call-calibration.md` | + +## 5. Things to know + +- **Known small gap (review F9, accepted):** `truth --call-status` checks the module identities against `run.json` and then re-reads the module records inside the lock. A module record that changed between those two points would get the new identity attached to the old measure. One writer per work directory is the supported use. +- `tests/surface_glyco` and `tests/adhesion_properties` cannot be collected on this node (no `esm`, and other optional packages). The CI job runs them in its own environment. This is unchanged from before; `tests/cellsurface_sorting_hat` is what covers the work here. +- MMseqs2 rewrites UniProt-style IDs (`sp|ACC|NAME`) in its output; `build_truth.cluster()` now uses neutral IDs. +- `hmmsearch` cannot read a gzipped target FASTA when the query file has several models; plain FASTA copies are in `_workdir/sorting_hat/*.faa`. +- Fetch dates and the UniProt release (2026_03) are in the truth scripts' output and the report. +- The worktree `../adhesionPred-curation` was created for the curation branch and can be removed with `git worktree remove ../adhesionPred-curation` once its branch is merged (it is merged into `per-call-status`). diff --git a/docs/paper/02-training-and-testing-ledger.md b/docs/paper/02-training-and-testing-ledger.md index 840dcf9..e1cce37 100644 --- a/docs/paper/02-training-and-testing-ledger.md +++ b/docs/paper/02-training-and-testing-ledger.md @@ -119,3 +119,16 @@ not show that its calls are right. The count shows that the 20-cluster floor is not met for repeat-mediated adhesins. The missing piece is a mechanism label, not more rows. See `docs/agent-tasks/03-repeat-mechanism-controls.md`. + +## G. Per-call status and the first calibration of the repeat call (2026-10-08) + +| ID | Activity | Result | Source | How checked | State | +|---|---|---|---|---|---| +| G1 | Per-call status entries (a status for a call that reads several modules) | Spec, plan, two independent reviews, seven tasks built test first. 782 tests pass (683 before). A call file is used only when config, modules read, identities, run states and the call definition match. | `docs/superpowers/specs/2026-10-07-per-call-status-design.md`, `plans/2026-10-08-per-call-status*.md`, `docs/paper/03` section 6a | tests, about 40 mutation checks | Measured (software) | +| G2 | Repeat call (`repeat02` OR `repeat14`), *S. cerevisiae* S288C | 31 positives (22 clusters), 297 negatives (227): sensitivity 0.323 [0.043, 0.535], specificity 0.987 [0.962, 1.000]. Status `smoke` (cluster bootstrap; leakage `tuned_on_truth`). | `docs/reports/2026-10-08-repeat-call-calibration.md`, `docs/reports/data/sorting_hat/call_status/` | recomputed from the status file | Measured, exploratory | +| G3 | Repeat call, *C. albicans* SC5314 | 16 positives (9 clusters), 210 negatives (155): sensitivity 0.375 [0.000, 0.680], specificity 0.976 [0.938, 0.995]. Status `smoke`. | same | same | Measured, exploratory | +| G4 | Repeat call, *A. fumigatus* Af293 | 8 positives (4 clusters), all enzyme repeat domains (PbH, BNR); 159 negatives (117), none called. No status written: sensitivity for arrays is not measurable from UniProt here. | same, section 4a | same | Not measured for arrays | +| G5 | Labels of the truth set | Positive: paper statement or at least 2 UniProt `Repeat` features. Negative: no `Repeat` feature and no text mention (an **assumed** negative). Family inference never counts. | `analysis/calibration_truth/repeat_call_truth/` | scripts, UniProt release 2026_03 | Assumption stated | +| G6 | Why sensitivity is low | 18 of 31 (S288C) and 8 of 16 (*C. albicans*) positives have no period in either detector. About half are arrays (AGA1, HPF1, SED1, EGT2, MSB2, EAP1, PGA18, ALS5 to ALS7) and half repeat domains. Coverage-cutoff and z-score scans do not fix it. | report section 4; `threshold_scan_v2.tsv`, `zseq_rule_scan.tsv` | recomputed | Measured, exploratory | +| G7 | ALS7 adhesion label | GO IMP cites PMID 17510860 (Als1p and Als5p only); Sheppard 2004 shows no adherence for Als7p. Override E1 to E3. | `data/curated/adhesins/manual_overrides.tsv`, errata | PubMed abstract, extracted paper facts | Owner to confirm | +| G8 | Repeat call under the owner's definition (motif or array; adhesion-associated repeat domains only) | S288C 23 positives (16 clusters), 297 negatives: sensitivity 0.435 [0.067, 0.667], specificity 0.987; *C. albicans* 13 (6), 211: 0.462 [0.000, 0.788], 0.976. `smoke`. All 20 remaining misses are arrays (11 at the z gate, 5 at the score pre-filter, 4 at the region test or coverage). | report section 8; `truth_v3.*`, `detector14_stopping_points_v3.tsv` | recomputed from the status files and scripts | Measured, exploratory | diff --git a/docs/paper/03-status-and-validation-rules.md b/docs/paper/03-status-and-validation-rules.md index 074adf9..35c884c 100644 --- a/docs/paper/03-status-and-validation-rules.md +++ b/docs/paper/03-status-and-validation-rules.md @@ -97,6 +97,39 @@ Naming note: "Phase C" is the held-out evaluation of step 1. A more descriptive documents is "step 1 held-out benchmark". The path `_workdir/step1_compare/phasec/` and older documents keep the old name. No rename is planned now. +## 6a. Calls that read several modules: call status files (2026-10-08) + +A status normally belongs to one module (`status/.json`). Two calls read two modules: +`tandem_repeat_protein` (`repeat02` or `repeat14`) and `iuis_allergen_homolog` (`allergen_homology` or +`pfam_allergen`). A truth table measures such a call as a whole, so its status belongs to the call: +`status/calls/.json`, written by `cellsurface_sorting_hat_calibrate truth --call-status`. +Design: `docs/superpowers/specs/2026-10-07-per-call-status-design.md`; plan and review: +`docs/superpowers/plans/2026-10-08-per-call-status*.md`. + +Rules (owner decisions Q6 to Q8, 2026-10-07): +- **One source per call.** A call file is allowed only for a call that has an expression, has no `ref`, + is not an `other_*` call, names no step 1 module literally, and reads two or more modules (for every + variant). Other calls keep module files. +- **A call file is valid for a run only when everything it was measured with is unchanged:** the config + (hash), the modules the call reads, their identity (version, parameters, artefact), their run state + (`ok`; an `unavailable`, `partial` or `error` module makes the file stale, because the call was measured + with a different rule), and the call definition (hash of the expression, the thresholds it references + and the engine semantics). A stale file is never used. The run falls back to the module statuses and + says why in `status_basis` and in the report. +- **A file that cannot be read, or that names a call that does not exist or cannot have a call file, + stops the run.** A stale file does not. +- **A call file cannot raise a status.** Every entry needs its measure and a `leakage:` note; the status + is never stronger than the measure allows, and any leakage other than `none` caps it at `smoke`. + The loader refuses a tested taxon below 2 (the root would apply to every protein). +- **Lineage is as for modules:** a species applies to its strains, the most specific tested taxon wins, + a sibling clade does not inherit. +- **Composite calls (decision 3, Q7).** A composite call such as `cell_wall_adhesion_candidate` takes the + weakest status of the measured leaf calls that decided it. A leaf call with a call file contributes the + call status; a leaf without one contributes its module statuses. The result is a derived value, not a + measurement of the composite. The report says so in its "Call calibration" section, which appears + only when call files exist. +- A call whose value is `not_assessable` never takes a call status. + ## 7. What a reader can rely on today | Claim | Basis | diff --git a/docs/reports/2026-10-08-repeat-call-calibration.md b/docs/reports/2026-10-08-repeat-call-calibration.md new file mode 100644 index 0000000..8de86e0 --- /dev/null +++ b/docs/reports/2026-10-08-repeat-call-calibration.md @@ -0,0 +1,114 @@ +# The repeat call has a measured status: per-call status entries and the first calibration + +*2026-10-08. Branch `per-call-status` (local, not pushed). Research use only. Everything here is exploratory and the leakage cap applies: the best status any entry can reach is `smoke`.* + +## 1. What was built + +`tandem_repeat_protein` reads two modules (`repeat02` or `repeat14`). A status belonged to one module, so this call could never be calibrated (decision 3 of 2026-10-06). Per-call status entries remove that limit. Spec: `docs/superpowers/specs/2026-10-07-per-call-status-design.md`; plan and independent reviews: `docs/superpowers/plans/2026-10-08-per-call-status*.md`; rules: `docs/paper/03`, section 6a. + +| piece | where | tests | +|---|---|---| +| call helpers (`reads_of_call`, `call_eligible`, `call_hash`) | `engine.py` | `test_call_helpers.py` (17) | +| call status file loader, validity, resolver | `call_status.py` | `test_call_status.py` (36) | +| writer with merge, lock, validation before write | `calibration/call_files.py` | `test_call_files.py` (14) | +| engine hook (leaf-call grouping, stale fallback) | `engine.evaluate` | `test_engine.py` (+9) | +| core command, report section, `run.json` field | `cli.py`, `outputs.py` | `test_cli.py` (+5, and a pinned full-output golden test) | +| `calibrate truth --call-status` | `calibration/cli.py` | `test_truth_call_status.py` (17) | + +The suite went from 683 to 782 tests passed (7 skipped: shellcheck is not installed). The output of a run without call files is pinned and unchanged. Each task has mutation checks (about 40 in all) that fail named tests. A call file is never used when the config, the modules read, their identity or run state, or the call definition differ from the measurement. + +## 2. The truth set + +Per species, one row per protein, in `analysis/calibration_truth/repeat_call_truth/` (`truth_v2..tsv`, annotated versions, and the scripts that build them). + +- **Positive:** a paper statement of a repeat region (adjudicated curation table), or two or more UniProt `Repeat` features. +- **Negative:** no UniProt `Repeat` feature and no Region, Compositional bias or Domain feature that mentions a repeat. **This is an assumed negative: an absent annotation is not proof.** UniProt lacks features for some repeat proteins (SOWgp, BAD1). +- **Population:** the 155 curated adhesin-table proteins of the two species, plus the reviewed UniProt proteins that have a signal peptide (344 for S288C, 162 for *C. albicans*), mapped to the run proteome by exact sequence. Family inference never counts as a positive (owner decision 5). +- **Clusters:** MMseqs2 at 30% identity and coverage 0.5, as in the C1 count. +- UniProt release 2026_03, fetched 2026-10-08. + +## 3. Measured status of the repeat call + +Cluster bootstrap, 95% intervals, leakage `tuned_on_truth` (FLO1, FLO5, FLO9, FLO10 and the Als proteins tuned the detectors). + +| species (taxon) | positives (clusters) | negatives (clusters) | sensitivity [95%] | specificity [95%] | status | +|---|---|---|---|---|---| +| *S. cerevisiae* (4932) | 31 (22) | 297 (227) | 0.323 [0.043, 0.535] | 0.987 [0.962, 1.000] | `smoke` | +| *C. albicans* (5476) | 16 (9) | 210 (155) | 0.375 [0.000, 0.680] | 0.976 [0.938, 0.995] | `smoke` | + +An earlier version on the 155 curated proteins only gave S288C 0.474 [0.111, 0.724] / 0.960 [0.800, 1.000] (19 positives, 14 clusters) and *C. albicans* 0.385 [0.000, 0.737] / 1.000 [0.952, 1.000] (13 positives, 6 clusters). Files: `docs/reports/data/sorting_hat/call_status/`. + +How to read it: +- **Specificity is high** (at least 0.976 in both species, upper bound 1.0), but the negatives are assumed. +- **Sensitivity is low and the intervals are wide.** The call finds about a third of the positives. +- **The status cannot be `estimated`.** Sensitivity half-widths are about 0.25 to 0.34. The leakage cap would hold it at `smoke` in any case. +- *C. albicans* has 9 positive clusters (the Als family forms one or two), against a floor of 20. S288C has 22, past the cluster floor, but not the half-width rule. + +## 4. Why sensitivity is low + +Of the 31 S288C positives, 18 have no periodicity in either detector (period 0). The same holds for 8 of 16 in *C. albicans*. I looked up the UniProt `Repeat` features of these proteins (feature names and counts, fetched 2026-10-08). + +| group | proteins | what UniProt records | +|---|---|---| +| **Numbered tandem arrays that the detectors miss** (S288C) | AGA1 (20 repeats, median unit 7 aa), HPF1 (18, 13 aa), SED1 (9, 14 aa), EGT2 (9, 35 aa), MSB2 (7, 17 aa), CNE1 (8) | repeats of 7 to 35 aa; three of them cover 0.6 to 0.84 of the protein | +| ... with only two repeats | KRE1, SAG1, CCW12 | 2 numbered repeats each | +| **Numbered tandem arrays that the detectors miss** (*C. albicans*) | EAP1 (25 repeats, median unit 6 aa, 0.60 of the protein), PGA18 (24, 8 aa, 0.41), ALS5, ALS6, ALS7 (Als repeats, 4 to 6 copies of about 32 aa, 0.16 of the protein) | | +| **Named repeat domains** | PEP1, VTH1, VTH2 (BNR), HRD3 (Sel), SCJ1 (CXXCXGXG), FMP27 and SPS22 (LRR), PGU1 (PbH), PIR5 (PIR); DSE1, ASC1, TUP1 (WD) | domain-type repeats | + +So the misses are about half arrays and half repeat domains. The detectors are tandem-array detectors, so the domain-type misses are by design. **The array-type misses are not**: AGA1, HPF1, EAP1 and PGA18 have 18 to 25 short repeats and get no period. Section 4's next paragraph shows where each missed positive stops. + +Where `repeat14` stops, by running its stages on each of the 31 missed positives (`detector14_stopping_points.tsv`, from `analysis/cocci_repeats/14_repeat_detect_general.py`; I corrected an earlier reading of the code after running it on ALS5): +- **22 stop at the sequence-level gate**: the best period has `z_seq` below `Z_MIN` = 4.0. This includes FLO11 (3.3), EAP1 (3.4), AGA1 (3.7), SED1 (3.7), ALS7 (2.7) and PGA55 (2.8; 88 UniProt repeats). +- **5 stop at the pre-filter**: z is 4.2 to 5.4 but the composition-corrected score is below `MIN_SCORE` = 0.15: ALS5 (0.104), ALS6 (0.083), HPF1 (0.138), EGT2 (0.119), MSB2 (0.100). +- **4 pass both and fail at the region test or the call's coverage cutoff**: PGA18, DAN4, HKR1, HWP1. +- **The region it finds is small even when it exists.** At the default cut the extracted region covers 0.04 to 0.14 of the protein, while the UniProt repeat span covers 0.16 to 0.84 (for example AGA1 0.14 against 0.61; HPF1 0.07 against 0.84; EAP1 0.07 against 0.60; ALS5 0.05 against 0.16). The call also needs coverage of at least 0.25, so these proteins would be rejected there even if the earlier gates passed. Lowering the region cut from 0.5 to 0.2 calls no additional positive (`region_cut_scan.tsv`). +- The short-unit arrays (EAP1, PGA18, AGA1) and the diverged Als units are not what this detector's gates and region extraction were set for. + +Two exploratory scans (nothing in the module was changed): +- **Coverage cutoff** (`threshold_scan_v2.tsv`). Lowering 0.25 to 0.15 gains a few positives (S288C 0.323 to 0.387; *C. albicans* 0.375 to 0.438) and costs 1 to 2 false positives. Lowering it further adds little. +- **An added sequence-level rule** (`zseq_rule_scan.tsv`): also call a protein when `rep_z_seq` is at least Z. At Z = 5.0 it gains EGT2 in S288C and ALS5 and ALS6 in *C. albicans*, and adds 1 and 4 false positives (S288C Q8TGR2; *C. albicans* PGA62, IFF5, RBR3, IFF9). CGD describes IFF5, RBR3 and IFF9 as GPI-anchored adhesin-like proteins, so several of these "false positives" are probably real repeat proteins that UniProt has no features for. That is the assumed-negative problem, and it means the specificity numbers above are lower bounds on the true specificity in an unknown amount. I do not propose a rule change on this evidence: a new rule needs a held-out truth set and the owner's decision. + +Leads for the detector (not done): relax or replace the sequence-level gate for Ser/Thr-rich and short-unit arrays (FLO11, EAP1, AGA1, PGA55), judge arrays by copy number and not by the fraction of the protein they cover (ALS5 to ALS7 cover 0.14 to 0.16), and extend the extracted region to the whole array. Each change needs a held-out truth set (section 7). + +## 4a. *A. fumigatus*: no status written + +The same method on the 167 reviewed, secreted UniProt proteins of *A. fumigatus* Af293 (taxon 330879; `truth_v2.Afum_Af293_UniProt.tsv`) gives 8 positives in 4 clusters and 159 negatives in 117 clusters. Result: sensitivity 0.000 [0.000, 0.490], specificity 1.000 [0.968, 1.000], no negative called. **I did not write a status entry for it.** All 8 positives are enzymes with repeat domains: seven PbH (pectate-lyase-like beta-helix) repeats in polygalacturonases and a xylogalacturonan hydrolase (pgaA, pgaB, pgaX, pgxB, pgxC, xghA, AFUA_1G17), and one BNR repeat set in Vps10. They are not surface arrays, so "sensitivity 0.0" would say nothing about the arrays the call is for, and the report would show a misleading number. + +What this does show: the repeat call called none of 159 reviewed secreted *A. fumigatus* proteins. Whether it finds tandem arrays in filamentous fungi (SOWgp, BAD1 and CspA are the known cases) is **not measured**. The repeat call has a measurement only in two Saccharomycotina species. UniProt has no reviewed *A. fumigatus* array protein to test it on. The curated adhesin tables hold a few (CspA among them); a truth set for filamentous fungi needs curation (agent tasks 03 and 08). + +## 5. Effect on the other calls + +With the call files in place, a re-run gives statuses (S288C, 6,722 proteins; the run has the R0 status source): +- `tandem_repeat_protein`: `smoke` for 6,714 proteins (the 8 invalid sequences stay `unvalidated`). +- `cell_wall_adhesion_candidate[R0]`: 9 called proteins are `smoke` (decided by the repeat leg and R0), 4 called proteins are `unvalidated` because the PA14 leg also decided them and its module has no status. Not-called records are `smoke` only when every deciding leg is measured. +- *C. albicans* (6,212 proteins): 15 called candidates `smoke`. + +These composite statuses are derived values (weakest measured leaf), not measurements of the composite. + +## 6. What this does not show + +- It does not show that the call separates adhesins from other wall proteins. The earlier curated-label check (`2026-10-07-classifier-runs-and-scale.md`) found that it does not on untuned proteins; this measurement counts repeat proteins of any kind. +- Negatives are assumed. Positives include repeat domains. Both inflate the apparent difficulty or ease in ways I cannot size. +- The truth proteins are the curated adhesin set plus reviewed UniProt proteins. Reviewed proteins are the better-studied ones. +- Leakage: the detectors were tuned on Als, Flo and SOWgp. The cap holds the status at `smoke`. + +## 7. To reach `estimated` + +Independent positive clusters (at least 20, and about 60 for a half-width of 0.10 at sensitivity 0.3, by the binomial approximation that ignores cluster structure), a truth set that no detector saw, and a decision on what "tandem repeat" means for the call (arrays only, or any repeat). The curation tasks 03 and 08 supply positives. A narrower truth definition (tandem arrays at a stated period) would give a sharper measure. + +## 8. Under the owner's definition of the call (2026-10-08) + +**Decision.** `tandem_repeat_protein` means a repeating motif or array as in FLO11. A repeating domain counts only if it is a known domain associated with adhesion. The owner's examples: Ser/Thr-rich tandem repeats, the Thr-rich functional amyloid core, Hwp1 repeats (*C. albicans*), Iff/Hyr repeats; more are expected from the properties of the arrays. + +**Truth set rebuilt** (`build_truth_v3.py`, `truth_v3..tsv`): a positive has at least two array-type UniProt `Repeat` features (numbered, or from an adhesion-associated family name: ALS, PIR, HYR, IFF, HWP, HPF, FLO, EPA, AWP, SRP, CWP, PGA). Proteins whose only repeats are globular domains (BNR, Sel1, LRR, CXXCXGXG, PbH, WD) are left out of both classes: PEP1, VTH1, VTH2, HRD3, SCJ1, FMP27, SPS22, PGU1 (S288C) and DSE1, ASC1, TUP1 (*C. albicans*). Five S288C proteins with one PIR feature each are left out as ambiguous. The adhesion-associated family list is my reading of the owner's examples and is open to additions. Negatives are as before (assumed). + +| species | positives (clusters) | negatives (clusters) | sensitivity [95%] | specificity [95%] | status | +|---|---|---|---|---|---| +| *S. cerevisiae* (4932) | 23 (16) | 297 (227) | 0.435 [0.067, 0.667] | 0.987 [0.962, 1.000] | `smoke` | +| *C. albicans* (5476) | 13 (6) | 211 (155) | 0.462 [0.000, 0.788] | 0.976 [0.938, 0.996] | `smoke` | + +Sensitivity rises from 0.32 and 0.38 to 0.44 and 0.46 because the domain proteins are no longer counted as misses. The intervals stay wide (16 and 6 positive clusters). Leakage `tuned_on_truth` caps both at `smoke`. These entries replace the broad-truth entries of section 3; the earlier files are kept as `*.broad_truth.json` in `docs/reports/data/sorting_hat/call_status/`. + +**All 20 remaining misses are arrays** (`detector14_stopping_points_v3.tsv`): 11 stop at detector 14's sequence-level z gate (FLO11, KRE1, SAG1, CNE1, AGA1, SED1, CCW12, PIR5, EAP1, ALS7, PGA55), 5 at the score pre-filter (MSB2, EGT2, HPF1, ALS5, ALS6) and 4 at the region test or the coverage cutoff (HKR1, DAN4, HWP1, PGA18). They include classes the owner named: FLO11 (Ser/Thr-rich), HWP1 (Hwp1 repeats) and the Als repeats. + +The coverage-cutoff scan on the new truth (`threshold_scan_v3.tsv`, all truth proteins): S288C 0.435 at coverage 0.25 (4 false positives of 297), 0.522 at 0.15 (5), 0.522 at 0.05 (7); *C. albicans* 0.462 (5 of 211), 0.538 (7), 0.615 at 0.05 (8). A lower cutoff buys 1 to 4 positives for 1 to 3 false positives, and many of the false positives are probably true repeat proteins that UniProt does not annotate. This does not fix the detector's gates. diff --git a/docs/reports/data/sorting_hat/call_status/Calb_SC5314/tandem_repeat_protein.broad_truth.json b/docs/reports/data/sorting_hat/call_status/Calb_SC5314/tandem_repeat_protein.broad_truth.json new file mode 100644 index 0000000..874dd66 --- /dev/null +++ b/docs/reports/data/sorting_hat/call_status/Calb_SC5314/tandem_repeat_protein.broad_truth.json @@ -0,0 +1,48 @@ +{ + "call": "tandem_repeat_protein", + "call_hash": "94228eccdcd64a1065c0750f1ad680d9a5895619057c2fad6734ddd0e365afdd", + "config_sha256": "f97cb08508c13100cded294a41d86940d3907419f7d59d76f49bbcc278a08ade", + "entries": [ + { + "measure": { + "calibration_set": "repeat_curated_plus_uniprot_secreted_Calb", + "n_clusters_neg": 155, + "n_clusters_pos": 9, + "n_neg": 210, + "n_pos": 16, + "notes": "curated adhesin set plus reviewed secreted UniProt proteins; labels from UniProt Repeat features (>=2) and paper statements; negatives assumed from absent annotation; Repeat features also mark repeat domains (WD40, ankyrin). truth rows without a call: 0; not assessable: 0; sensitivity if not assessable positives count as missed: 0.375 call=tandem_repeat_protein; variant=; reads=repeat02,repeat14 leakage: tuned_on_truth", + "sensitivity": { + "hi": 0.679807356553759, + "lo": 0.0, + "value": 0.375 + }, + "specificity": { + "hi": 0.995475622681505, + "lo": 0.9383164358899687, + "value": 0.9761904761904762 + }, + "truth_source": "analysis/calibration_truth/repeat_call_truth/truth_v2.Calb_SC5314.tsv" + }, + "source": "analysis/calibration_truth/repeat_call_truth/truth_v2.Calb_SC5314.tsv", + "status": "smoke", + "taxa": [ + 5476 + ] + } + ], + "reads": [ + { + "artefact_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "name": "repeat02", + "params_hash": "7d723f2d540d1e45f46e55661b67d2059dddeb722d210a90ce4691b169edd116", + "version": "1" + }, + { + "artefact_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "name": "repeat14", + "params_hash": "946489ad437ccee8bf3b9c4f7289248d9eba1751fd21db7e0c16dd326f08e2eb", + "version": "1" + } + ], + "variant": "" +} diff --git a/docs/reports/data/sorting_hat/call_status/Calb_SC5314/tandem_repeat_protein.curated_only.json b/docs/reports/data/sorting_hat/call_status/Calb_SC5314/tandem_repeat_protein.curated_only.json new file mode 100644 index 0000000..6bde14e --- /dev/null +++ b/docs/reports/data/sorting_hat/call_status/Calb_SC5314/tandem_repeat_protein.curated_only.json @@ -0,0 +1,48 @@ +{ + "call": "tandem_repeat_protein", + "call_hash": "94228eccdcd64a1065c0750f1ad680d9a5895619057c2fad6734ddd0e365afdd", + "config_sha256": "f97cb08508c13100cded294a41d86940d3907419f7d59d76f49bbcc278a08ade", + "entries": [ + { + "measure": { + "calibration_set": "repeat_curated_Calb", + "n_clusters_neg": 76, + "n_clusters_pos": 6, + "n_neg": 82, + "n_pos": 13, + "notes": "curated adhesin set; labels from UniProt Repeat features (>=2) and paper statements; negatives assumed from absent annotation. truth rows without a call: 0; not assessable: 0; sensitivity if not assessable positives count as missed: 0.385 call=tandem_repeat_protein; variant=; reads=repeat02,repeat14 leakage: tuned_on_truth", + "sensitivity": { + "hi": 0.7369246640404318, + "lo": 0.0, + "value": 0.38461538461538464 + }, + "specificity": { + "hi": 1.0, + "lo": 0.9518864142123544, + "value": 1.0 + }, + "truth_source": "../adhesionPred-curation/analysis/calibration_truth/repeat_call_truth/truth.Calb_SC5314.tsv" + }, + "source": "../adhesionPred-curation/analysis/calibration_truth/repeat_call_truth/truth.Calb_SC5314.tsv", + "status": "smoke", + "taxa": [ + 5476 + ] + } + ], + "reads": [ + { + "artefact_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "name": "repeat02", + "params_hash": "7d723f2d540d1e45f46e55661b67d2059dddeb722d210a90ce4691b169edd116", + "version": "1" + }, + { + "artefact_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "name": "repeat14", + "params_hash": "946489ad437ccee8bf3b9c4f7289248d9eba1751fd21db7e0c16dd326f08e2eb", + "version": "1" + } + ], + "variant": "" +} diff --git a/docs/reports/data/sorting_hat/call_status/Calb_SC5314/tandem_repeat_protein.owner_definition.json b/docs/reports/data/sorting_hat/call_status/Calb_SC5314/tandem_repeat_protein.owner_definition.json new file mode 100644 index 0000000..c3a0465 --- /dev/null +++ b/docs/reports/data/sorting_hat/call_status/Calb_SC5314/tandem_repeat_protein.owner_definition.json @@ -0,0 +1,48 @@ +{ + "call": "tandem_repeat_protein", + "call_hash": "94228eccdcd64a1065c0750f1ad680d9a5895619057c2fad6734ddd0e365afdd", + "config_sha256": "f97cb08508c13100cded294a41d86940d3907419f7d59d76f49bbcc278a08ade", + "entries": [ + { + "measure": { + "calibration_set": "repeat_motif_definition_Calb", + "n_clusters_neg": 155, + "n_clusters_pos": 6, + "n_neg": 211, + "n_pos": 13, + "notes": "owner definition of 2026-10-08: repeating motif or array, or an adhesion-associated repeat domain; labels from UniProt Repeat features (>=2 array-type); globular repeat domains left out; negatives assumed from absent annotation. truth rows without a call: 0; not assessable: 0; sensitivity if not assessable positives count as missed: 0.462 call=tandem_repeat_protein; variant=; reads=repeat02,repeat14 leakage: tuned_on_truth", + "sensitivity": { + "hi": 0.7883710444073659, + "lo": 0.0, + "value": 0.46153846153846156 + }, + "specificity": { + "hi": 0.9957274011299435, + "lo": 0.9384747085737122, + "value": 0.976303317535545 + }, + "truth_source": "analysis/calibration_truth/repeat_call_truth/truth_v3.Calb_SC5314.tsv" + }, + "source": "analysis/calibration_truth/repeat_call_truth/truth_v3.Calb_SC5314.tsv", + "status": "smoke", + "taxa": [ + 5476 + ] + } + ], + "reads": [ + { + "artefact_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "name": "repeat02", + "params_hash": "7d723f2d540d1e45f46e55661b67d2059dddeb722d210a90ce4691b169edd116", + "version": "1" + }, + { + "artefact_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "name": "repeat14", + "params_hash": "946489ad437ccee8bf3b9c4f7289248d9eba1751fd21db7e0c16dd326f08e2eb", + "version": "1" + } + ], + "variant": "" +} diff --git a/docs/reports/data/sorting_hat/call_status/Scer_S288C/tandem_repeat_protein.broad_truth.json b/docs/reports/data/sorting_hat/call_status/Scer_S288C/tandem_repeat_protein.broad_truth.json new file mode 100644 index 0000000..05aa14e --- /dev/null +++ b/docs/reports/data/sorting_hat/call_status/Scer_S288C/tandem_repeat_protein.broad_truth.json @@ -0,0 +1,48 @@ +{ + "call": "tandem_repeat_protein", + "call_hash": "94228eccdcd64a1065c0750f1ad680d9a5895619057c2fad6734ddd0e365afdd", + "config_sha256": "f97cb08508c13100cded294a41d86940d3907419f7d59d76f49bbcc278a08ade", + "entries": [ + { + "measure": { + "calibration_set": "repeat_curated_plus_uniprot_secreted_S288C", + "n_clusters_neg": 227, + "n_clusters_pos": 22, + "n_neg": 297, + "n_pos": 31, + "notes": "curated adhesin set plus reviewed secreted UniProt proteins; labels from UniProt Repeat features (>=2) and paper statements; negatives assumed from absent annotation; Repeat features also mark repeat domains (WD40, ankyrin). truth rows without a call: 0; not assessable: 0; sensitivity if not assessable positives count as missed: 0.323 call=tandem_repeat_protein; variant=; reads=repeat02,repeat14 leakage: tuned_on_truth", + "sensitivity": { + "hi": 0.5348837209302325, + "lo": 0.043478260869565216, + "value": 0.3225806451612903 + }, + "specificity": { + "hi": 1.0, + "lo": 0.9615046195781914, + "value": 0.9865319865319865 + }, + "truth_source": "analysis/calibration_truth/repeat_call_truth/truth_v2.Scer_S288C.tsv" + }, + "source": "analysis/calibration_truth/repeat_call_truth/truth_v2.Scer_S288C.tsv", + "status": "smoke", + "taxa": [ + 4932 + ] + } + ], + "reads": [ + { + "artefact_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "name": "repeat02", + "params_hash": "7d723f2d540d1e45f46e55661b67d2059dddeb722d210a90ce4691b169edd116", + "version": "1" + }, + { + "artefact_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "name": "repeat14", + "params_hash": "946489ad437ccee8bf3b9c4f7289248d9eba1751fd21db7e0c16dd326f08e2eb", + "version": "1" + } + ], + "variant": "" +} diff --git a/docs/reports/data/sorting_hat/call_status/Scer_S288C/tandem_repeat_protein.curated_only.json b/docs/reports/data/sorting_hat/call_status/Scer_S288C/tandem_repeat_protein.curated_only.json new file mode 100644 index 0000000..564e638 --- /dev/null +++ b/docs/reports/data/sorting_hat/call_status/Scer_S288C/tandem_repeat_protein.curated_only.json @@ -0,0 +1,48 @@ +{ + "call": "tandem_repeat_protein", + "call_hash": "94228eccdcd64a1065c0750f1ad680d9a5895619057c2fad6734ddd0e365afdd", + "config_sha256": "f97cb08508c13100cded294a41d86940d3907419f7d59d76f49bbcc278a08ade", + "entries": [ + { + "measure": { + "calibration_set": "repeat_curated_S288C", + "n_clusters_neg": 24, + "n_clusters_pos": 14, + "n_neg": 25, + "n_pos": 19, + "notes": "curated adhesin set; labels from UniProt Repeat features (>=2) and paper statements; negatives assumed from absent annotation. truth rows without a call: 0; not assessable: 0; sensitivity if not assessable positives count as missed: 0.474 call=tandem_repeat_protein; variant=; reads=repeat02,repeat14 leakage: tuned_on_truth", + "sensitivity": { + "hi": 0.7243037135278506, + "lo": 0.1111111111111111, + "value": 0.47368421052631576 + }, + "specificity": { + "hi": 1.0, + "lo": 0.7999565836067155, + "value": 0.96 + }, + "truth_source": "../adhesionPred-curation/analysis/calibration_truth/repeat_call_truth/truth.Scer_S288C.tsv" + }, + "source": "../adhesionPred-curation/analysis/calibration_truth/repeat_call_truth/truth.Scer_S288C.tsv", + "status": "smoke", + "taxa": [ + 4932 + ] + } + ], + "reads": [ + { + "artefact_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "name": "repeat02", + "params_hash": "7d723f2d540d1e45f46e55661b67d2059dddeb722d210a90ce4691b169edd116", + "version": "1" + }, + { + "artefact_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "name": "repeat14", + "params_hash": "946489ad437ccee8bf3b9c4f7289248d9eba1751fd21db7e0c16dd326f08e2eb", + "version": "1" + } + ], + "variant": "" +} diff --git a/docs/reports/data/sorting_hat/call_status/Scer_S288C/tandem_repeat_protein.owner_definition.json b/docs/reports/data/sorting_hat/call_status/Scer_S288C/tandem_repeat_protein.owner_definition.json new file mode 100644 index 0000000..3a7fc77 --- /dev/null +++ b/docs/reports/data/sorting_hat/call_status/Scer_S288C/tandem_repeat_protein.owner_definition.json @@ -0,0 +1,48 @@ +{ + "call": "tandem_repeat_protein", + "call_hash": "94228eccdcd64a1065c0750f1ad680d9a5895619057c2fad6734ddd0e365afdd", + "config_sha256": "f97cb08508c13100cded294a41d86940d3907419f7d59d76f49bbcc278a08ade", + "entries": [ + { + "measure": { + "calibration_set": "repeat_motif_definition_S288C", + "n_clusters_neg": 227, + "n_clusters_pos": 16, + "n_neg": 297, + "n_pos": 23, + "notes": "owner definition of 2026-10-08: repeating motif or array, or an adhesion-associated repeat domain; labels from UniProt Repeat features (>=2 array-type); globular repeat domains left out; negatives assumed from absent annotation. truth rows without a call: 0; not assessable: 0; sensitivity if not assessable positives count as missed: 0.435 call=tandem_repeat_protein; variant=; reads=repeat02,repeat14 leakage: tuned_on_truth", + "sensitivity": { + "hi": 0.6666666666666666, + "lo": 0.06666666666666667, + "value": 0.43478260869565216 + }, + "specificity": { + "hi": 1.0, + "lo": 0.9615046195781914, + "value": 0.9865319865319865 + }, + "truth_source": "analysis/calibration_truth/repeat_call_truth/truth_v3.Scer_S288C.tsv" + }, + "source": "analysis/calibration_truth/repeat_call_truth/truth_v3.Scer_S288C.tsv", + "status": "smoke", + "taxa": [ + 4932 + ] + } + ], + "reads": [ + { + "artefact_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "name": "repeat02", + "params_hash": "7d723f2d540d1e45f46e55661b67d2059dddeb722d210a90ce4691b169edd116", + "version": "1" + }, + { + "artefact_hash": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "name": "repeat14", + "params_hash": "946489ad437ccee8bf3b9c4f7289248d9eba1751fd21db7e0c16dd326f08e2eb", + "version": "1" + } + ], + "variant": "" +} diff --git a/docs/superpowers/plans/2026-10-08-per-call-status-code-review-1.md b/docs/superpowers/plans/2026-10-08-per-call-status-code-review-1.md new file mode 100644 index 0000000..7b0b629 --- /dev/null +++ b/docs/superpowers/plans/2026-10-08-per-call-status-code-review-1.md @@ -0,0 +1,22 @@ +# Code review 1 of the per-call status implementation, with dispositions + +*2026-10-08. One independent review (Opus, read-only; it applied 30 mutations to a copy of the code: 27 killed, 3 survived). Verdict: **ready, with minor fixes**. No blocker or major finding; no path found by which a stale, hand-edited or malformed call file raises a status or applies to a wrong protein, taxon, variant or run.* + +| id | finding | disposition | +|---|---|---| +| F1 | A name check swapped for a length check survived | Fixed: test `test_a_renamed_read_with_the_same_count_is_stale_not_an_error` | +| F2 | Plan T2.5 said a read-back failure leaves the previous file; the read-back runs after the write | Fixed in the plan and the code comment: validation before the write is what protects the old file | +| F3 | The lock file was made before the variant was checked (`../x` made a lock file) | Fixed: `check_variant` runs first; test parametrized over `R0`, `../x`, `a/b` | +| F4 | A per-variant eligible call without `--variant` gave a misleading refusal | Fixed: `check_variant` first in `_check_call_run` (no eligible per-variant call is packaged, so unit-tested only) | +| F5 | A refusal named the path twice | Fixed, with a test | +| F6 | The report column `file` held `valid` or `stale: ...` | Fixed: renamed `validity`, asserted in `test_cli.py` | +| F7 | Spec R6 listed clusters and leakage that the report omits | Spec corrected | +| F8 | The per-variant loop in `call_eligible` cannot fail today | Comment added: guard if the literal-name rule is relaxed | +| F9 | Module identity is checked against `run.json` outside the lock, `reads` re-read inside it | **Accepted, not changed.** One writer per work directory is the supported use (plan D8). The window is a module record changing between two lines of one command. Noted in the handoff. | +| F10 | Leakage values defined twice | Fixed: one list, `LEAKAGE_VALUES` | +| F11 | Formatter split an `if` around a comment | Fixed | +| F12 | The spec's "unrelated threshold change does not make the file stale" never holds, because `config_sha256` is compared first | Spec corrected | + +Deviations from the plan that the reviewer found harmless: the hook returns a pair and not a triple; the stale basis uses `; ` and not `:`; `write_call_status` has no `reads` parameter (see F9); `run.json` `call_status_sources` is a superset of the planned fields; the alias `_reads_of_call` was removed; the derived-status note appears only in the Call calibration section (decision D5). + +After the fixes: 788 tests pass, 7 skipped. diff --git a/docs/superpowers/plans/2026-10-08-per-call-status-review-1.md b/docs/superpowers/plans/2026-10-08-per-call-status-review-1.md new file mode 100644 index 0000000..ee725c5 --- /dev/null +++ b/docs/superpowers/plans/2026-10-08-per-call-status-review-1.md @@ -0,0 +1,26 @@ +# Review 1 of the per-call status plan, with dispositions + +*2026-10-08. One independent review (Opus, read-only; it ran the baseline tests: 683 passed, 7 skipped). Verdict: needs rework before implementation. 1 blocker, 7 major, 10 minor. I checked P1 against `cli.py` (`load_modules` records an identity before it checks the run state). All findings are applied in revision 2 of the plan (decisions D1 to D15) or decided there.* + +| id | severity | finding | disposition | +|---|---|---|---| +| P1 | blocker | The reader checked names and identities but not run states, so a call status measured on two modules could apply when one module is `unavailable` | Applied (D10, T2.2): module states are passed to the resolver; reason `module state not ok`. Test and mutation added. | +| P2 | major | `call_eligible` was ambiguous for per-variant calls | Applied (D15, T1.2, T1.5) | +| P3 | major | A tenth known limit breaks `test_the_spec_and_the_report_list_the_same_known_limits`; no golden report text exists | Applied (D5): `_known_limits` unchanged; T4.6 | +| P4 | major | A static limits line changes every `report.md` (R5) | Decided (D5): the derived note is printed only when call files exist; the paper docs state it for all readers. A `status_basis` marker is left to the owner. | +| P5 | major | The golden comparison would be taken after Task 3 and compared gzip bytes; no fixture | Applied (Task 3a): golden files from the base commit, decompressed text, committed fixture | +| P6 | major | A hand-edited file could raise a status through taxon 0 or 1 or by editing the leakage cap | Applied (D11): taxa below 2 refused; `leakage` required in the notes and the cap applied at load | +| P7 | major | The lock test would rarely catch a missing lock | Applied (T2.5): deterministic probe through a patched `write_atomic` | +| P8 | major | No new-path test used `measured_call_of`, so a wrong leaf call would pass | Applied (T3.4) | +| P9 | minor | The core run would import numpy through `calibration.measure` | Applied (D1): `status_from_measure` moves to `status.py`; writer to `calibration/call_files.py` | +| P10 | minor | `resolve_entry` needs one identity; a call file has none | Applied (D1): `best_entry` helper | +| P11 | minor | `call_hash` over thresholds is redundant with `config_sha256` | Kept: the hash gives a clearer reason and covers `ENGINE_SEMANTICS`; documented | +| P12 | minor | `_reads_of_call` drops literal step 1 names | Applied (D15): calls that name a step 1 module literally are not eligible | +| P13 | minor | Identities must be written as strings | Applied (D11) | +| P14 | minor | No per-variant eligible call is packaged | Applied (T1.4): custom config | +| P15 | minor | `TOY_NODES` has no strain; the `write_run_json` helper lacks two keys | Applied (T2.3, Task 5 note) | +| P16 | minor | `report.md` contains the installed version | Applied (Task 3a) | +| P17 | minor | Only `unavailable` was tested | Applied (T2.2, Task 5) | +| P18 | minor | `fcntl` on a network file system | Applied (D8) | + +Open items the reviewer listed are decided in D12 to D14. diff --git a/docs/superpowers/plans/2026-10-08-per-call-status.md b/docs/superpowers/plans/2026-10-08-per-call-status.md new file mode 100644 index 0000000..7ea7c36 --- /dev/null +++ b/docs/superpowers/plans/2026-10-08-per-call-status.md @@ -0,0 +1,135 @@ +# Per-call status entries: implementation plan + +*2026-10-08. **Revision 2**, after independent review 1 (`2026-10-08-per-call-status-review-1.md`: 1 blocker, 7 major, 10 minor; all applied or decided below). Plan for `docs/superpowers/specs/2026-10-07-per-call-status-design.md` (revision 2; owner decisions Q6 to Q8 recorded). Branch `per-call-status`. Test first in every task. One commit per task. Nothing is pushed until the owner says so. Revision 2 has not been re-reviewed.* + +Python 3.12. Run tests with `PYTHONPATH=$PWD/src /usr/bin/python3.12 -m pytest tests/cellsurface_sorting_hat -q -p no:cacheprovider`. The baseline is 683 passed, 7 skipped. The pre-commit hook runs ruff 0.3.5 and ruff-format and aborts a commit that it reformats: re-add and commit again. + +## Decisions taken in this plan (the spec left them open or implicit) + +D1. **Module layout (review P9, P10).** `status.py` gains `status_from_measure` and its constants (`MIN_POSITIVES`, `MIN_NEGATIVES`, `MIN_CLUSTERS`, `MAX_HALF_WIDTH`), moved from `calibration/measure.py`, which re-exports them (so no numpy import enters the core run), and a helper `best_entry(entries, taxon, lineage)` that `resolve_entry` and the call resolver both use. A new `src/cellsurface_sorting_hat/call_status.py` holds the loader, the validity check and the resolver; it imports `status` and `engine`, and nothing from `calibration`. A new `src/cellsurface_sorting_hat/calibration/call_files.py` holds the writer, merge and lock; it imports `call_status`, `status` and `calibration.measure`. `engine.py` gets the call helpers (`reads_of_call`, `call_eligible`, `call_hash`, `ENGINE_SEMANTICS`) and does not import `call_status`. +D2. **Hook shape.** `evaluate(..., call_status_of=None)`. The hook is `call_status_of(call, variant, taxon)`. It returns `None` (no file for this call, or the taxon is not tested: module logic, no prefix), `(status, basis)` (applies), or `(None, reason)` (a file exists and is stale: module logic with the prefix `call status stale ():` on that leaf's basis items). +D3. **Byte identity (R5).** When no hook is given, or when it returns `None` for every leaf of a record, `evaluate` takes the old code path unchanged. The new path runs only when at least one leaf has a call status or a stale reason. +D4. **Grouping.** Contributors are `(module, leaf_call)`. The leaf variant is the record's label if the leaf call is `per_variant`, else the empty string. A leaf with an applying call status contributes one status and one basis item (`call::taxon:`), placed where the leaf's first item would stand in the old sorted order. Every other pair goes through `status_for` as today. The record status is the weakest over all items. +D5. **Derived-status note (review P3, P4).** `_known_limits` is not changed (a test pins exactly nine limits against the orchestrator spec, and a static line would change `report.md` for every run, against R5). The note "statuses of composite calls are derived: the weakest status of the measured leaf calls that decided them (owner decision Q7)" is printed only in the "Call calibration" section, so only when call files exist. The paper docs state it for every reader (Task 6). The owner may later ask for a marker in `status_basis`; that is a separate change. +D6. **Loader strictness (review F8).** The call-file loader requires `measure` in every entry, checks `status` against `status_from_measure`, rejects an unknown call, an ineligible call, a name that does not match, a variant error, and a taxon in two entries. `load_status_source` (module files) is unchanged. +D7. **Eager load, hard errors (Q6).** `CallStatusResolver.__init__` loads every `status/calls/*.json` and raises `InputError` naming the file for any structural problem (unknown or ineligible call, bad file, wrong name). A well-formed but stale file never raises. +D8. **Lock (review F13, P18).** `write_call_status` takes `fcntl.flock` on `status/calls/.lock` and holds it through read, merge, write and read-back. `/bigdata` is a network file system on which `fcntl` locks may be unreliable (`cache.py` says so); the lock is documented as best effort, with one writer per work directory as the supported use. +D9. **Migration.** None. No change to module files or `load_status_source`. +D10. **Run state in the reader (review P1, blocker).** `CallStatusResolver` receives `loaded.states`. A file is stale with the reason `module state not ok: ()` when any read module's state is not `ok`, in addition to the identity checks. Order of reasons: `config differs`, `reads differ`, `no module run record: `, `module state not ok: ()`, `identity differs: `, `call_hash differs`. +D11. **Loader limits (review P6).** The call-file loader refuses a taxon below 2 (a status for the root or taxon 1 would apply to every protein). It requires `leakage: ` in `measure.notes` (the writer always writes it) and caps the status: any value other than `none` allows at most `smoke`. Identity values in `reads` are strings (review P13). +D12. **Stale basis text (open item).** For a stale leaf the basis item is `:call status stale (); `. A hook result is `(status, basis)` (the tested taxon is inside `basis`), not a triple. +D13. **Report rows (open item).** `rows()` gives one row per entry and tested taxon, with the tested taxon in the `taxon` column, plus one row per stale file with `valid=false`. +D14. **Flags (open items).** `--call-status` is a flag; the call comes from `--call`. `--config` applies to both modes, but only the `--call-status` path checks `config_sha256`. The call path writes `notes` as `call=; variant=; reads=; leakage: ` plus the user's text. The legacy case (a module file with `call=` notes for a call that also has a call file) is tested in Task 4: the call file is used and the report shows both the module calibration row and the call row. +D15. **Eligibility (review P2, P12).** For a `per_variant` call the rule `reads >= 2` is checked for every variant label in `step1_variants`; for a call that is not per-variant it is checked once. A call that names a step 1 module literally (not through `{step1}`) is not eligible (reason `literal step1 module`). + +## Task 1: engine helpers + +Files: `src/cellsurface_sorting_hat/engine.py`, `tests/cellsurface_sorting_hat/test_call_helpers.py`. + +Produces: +- `ENGINE_SEMANTICS = "1"` (bumped by hand when the evaluation rules change). +- `reads_of_call(cfg, call, variant="")`: `sorted(modules_of_call(cfg, call))`; with a variant, a step 1 module of another variant is removed (moved from `calibration/cli._reads_of_call`; that function becomes a thin alias). +- `call_eligible(cfg, call)` -> `(bool, reason)`, per D15. Eligible: the call exists, has `expr`, is not `kind: other`, its expression has no `ref` node (walk), names no step 1 module literally, and reads at least two modules for every variant it has. Reasons: `unknown call`, `kind other`, `contains ref`, `literal step1 module`, `reads fewer than two modules`. +- `call_hash(cfg, call, variant="")`: SHA-256 of canonical JSON (sorted keys, separators `(",", ":")`) of `{name, per_variant, variant, variant_module, expr, semantics}`. In `expr`, every `test` value `"$name"` is replaced by the number in `cfg.thresholds`, and `{step1}` in a module name by the variant module. Only thresholds the call references appear. + +Tests (write first): +1. `reads_of_call` for `tandem_repeat_protein` is `["repeat02", "repeat14"]`; for `iuis_allergen_homolog` it is `["allergen_homology", "pfam_allergen"]`; for `signal_peptide_protein` with variant `R0` it is `["step1_rule@R0"]`. +2. `call_eligible`: true for the two calls above; false with the exact reason for `cell_wall_adhesion_candidate` (`contains ref`), `other_not_surface` (`kind other`), `signal_peptide_protein` (`reads fewer than two modules`), and an unknown name. +3. `call_hash`: stable; changes when a referenced threshold changes (copy the config to `tmp_path`, edit, reload); does not change when an unreferenced threshold changes; changes when `ENGINE_SEMANTICS` is monkeypatched; differs between variants of a per-variant call. +4. A config with a `ref` inside an otherwise two-module call is refused by `call_eligible`. A custom config with a per-variant call reading `{step1}` and one more module is eligible; one that names `step1_rule@R1` literally is refused (review P14). +5. `signal_peptide_protein` is not eligible although `reads_of_call` without a variant returns four step 1 modules (review P2). + +Mutations (each makes a named test fail): hash ignores thresholds; hash includes unreferenced thresholds; `call_eligible` ignores `ref`. + +## Task 2: call-file loader, validity, resolver + +Files: new `src/cellsurface_sorting_hat/call_status.py`, `tests/cellsurface_sorting_hat/test_call_status.py`. + +Produces: +- `CallSource(call, variant, config_sha256, call_hash, reads, entries, path)`. +- `load_call_source(path, cfg)`: structural checks in D6. Raises `ValueError` with the path in the message. +- `stale_reason(source, cfg, identities, states, config_sha256)` -> `""` or one reason of D10, checked in that order. +- `CallStatusResolver(workdir, cfg, identities, states, config_sha256, lineage)`: + - loads `status/calls/*.json` (`InputError` from `cli` is not imported here; raise `CallStatusError(ValueError)` and let `cli` convert it); + - `__call__(call, variant, taxon)` per D2, using `status.best_entry` (lineage, most specific wins); + - `rows()` -> list of dicts for the report and `run.json` (file, call, variant, taxon, status, calibration set, counts, rates, valid, reason). +- (in `calibration/call_files.py`) `write_call_status(workdir, cfg, call, variant, config_sha256, reads, entries)`: validates entries with `_check_entries` and the D11 rules, takes the lock (D8), merges per the spec (other calibration sets stay, the same set is replaced, everything is dropped with a stderr message when `reads`, `call_hash` or `config_sha256` differ), writes atomically with `write_atomic`, reads back with `load_call_source`. + +Tests (write first), all with a tiny config in `tmp_path` and the toy taxonomy of `conftest.py`: +1. A valid file loads. Each structural refusal (also: a taxon below 2; `leakage` missing from the notes; a status above `smoke` with leakage other than `none`; the same file edited so that a `smoke` entry says `estimated`): no `measure`; status stronger than the measure allows; name differs from `call`/`variant`; unknown call; ineligible call (`ref`, `other`, one module); variant given for a non-per-variant call; duplicate taxon. +2. `stale_reason`: one test per reason and one for the valid case. Identity tests change `version`, `params_hash` and `artefact_hash` separately. `module state not ok` is parametrized over `unavailable`, `error`, `not_run`, `partial` and a missing state (review P1, P17). A test where `repeat14` is `unavailable` and `repeat02` is called shows the call status does not apply (the OR is called through `repeat02` alone). +3. Resolver lineage (a `Lineage` built in the test with a strain below a species: `TOY_NODES` has none, review P15): a tested species applies to its strain; a sibling clade does not; the most specific tested taxon wins; a not-tested taxon returns `None`. +4. A stale file returns `(None, reason)`; a missing file returns `None`; a malformed file raises `CallStatusError` naming the file; an orphan file for a call that is no longer in the config raises. +5. `write_call_status`: merge rules (other set stays, same set replaced, `call_hash` change drops old entries with a message). The lock is tested deterministically (review P7): `write_atomic` is monkeypatched to try `fcntl.flock(LOCK_EX | LOCK_NB)` on the lock file from a second file descriptor and record that it fails while the writer is inside the write, and that it succeeds afterwards. The entries are validated before anything is written, so an invalid update leaves the previous file in place; the read-back after the write is a self-check (code review 1, F2). + +Mutations: ignore `reads` names; ignore identities; ignore `call_hash`; ignore `config_sha256`; ignore module states; refuse only `unavailable` and `error`; accept a status stronger than its measure; accept taxon 1; ignore the leakage cap; keep old entries when only `call_hash` changed; drop the lock. + +## Task 3: engine hook + +Files: `src/cellsurface_sorting_hat/engine.py`, `tests/cellsurface_sorting_hat/test_engine.py`. + +Task 3a (before any engine change): add the golden test. A fixture directory under `tests/cellsurface_sorting_hat/golden/` holds a small workdir with R0, `repeat02`, `repeat14`, `pfam_adhesion`, allergen and antigen modules, a module status file for R0 and a taxon map. `test_golden_run` runs `cli.run` on it and compares the decompressed `calls.long.tsv.gz` text with a stored `calls.long.expected.tsv` and the `report.md` with the line `- version: ...` removed (review P5, P16) with a stored `report.expected.md`. Generate the expected files from the base commit (07882e0) and commit them before Task 3b. This is the fixture review F10 asked for. + +Task 3b: `evaluate(cfg, protein_ids, taxa, modules, status_of, measured_call_of=None, call_status_of=None)` implementing D3 and D4. + +Tests (write first, using the existing `run` helper extended with `call_status_of`): +1. Equivalence: for a multi-protein toy with several calls, `evaluate` with a hook that always returns `None` equals `evaluate` without the argument, record for record (value, status, basis). +2. A call status for `tandem_repeat_protein` applies to its records: status and basis `call:tandem_repeat_protein:taxon:`; the module statuses of `repeat02` and `repeat14` are ignored for that call. +3. `not_assessable` records stay `unvalidated` with an empty basis whatever the hook returns (review F1). +4. Composite: `cell_wall_adhesion_candidate` takes the weakest over groups: the repeat leaf with a call status, the R0 leaf with a module status measured on `signal_peptide_protein` (supply `measured_call_of`, review P8). Assert the full basis string and its order. A leaf without a call status uses module logic. +5. False OR and false AND: the status comes from the false inputs, grouped by leaf; a call status on the false leaf applies. +6. `other_surface_no_mechanism`: a called mechanism with a call status contributes it; the surface contributors do not enter, as today. +7. Per-variant: a call status keyed `(signal_peptide_protein, "R0")` is looked up with variant `R0` for a record at label `R0` and is not used at label `R2`; a non-per-variant leaf is looked up with the empty variant even at label `R0`. +8. A stale hook result `(None, reason)` gives the module-logic status and the basis item prefix `call status stale ():`. +9. A taxon not tested returns `None`: module logic, no prefix. + +Mutations: apply the call status to `not_assessable` records; ignore the variant; use the call status for a sibling clade (hook mutation); drop the weakest-over-groups rule; drop the stale prefix; pass the record's call instead of the leaf call to `status_for` (caught by test 4). + +## Task 4: core command, report, run.json + +Files: `src/cellsurface_sorting_hat/cli.py`, `outputs.py`, `tests/cellsurface_sorting_hat/test_cli.py`, `test_outputs.py`. + +Change: +- `run()` builds `CallStatusResolver` after `load_modules` (needs `loaded.identities`, `cfg.sha256`, the lineage) and passes it as `call_status_of`. A `CallStatusError` becomes `InputError`. +- `RunInfo.call_status_sources` (default `[]`), written to `run.json` as `call_status_sources` (list of `{file, call, variant, valid, reason}`) and shown in the report as a "Call calibration" table only when the list is not empty (review F15). Stale files appear in it with the reason. +- The derived-status note of D5 is printed in the "Call calibration" section only. + +Tests (write first): +1. End to end on a toy workdir: a valid `status/calls/tandem_repeat_protein.json` changes the status of that call in `calls.long.tsv.gz`; `run.json` lists it; the report has the table. +2. With no `status/calls/`, the golden test of Task 3a still passes unchanged (`calls.long` and `report.md` identical; `run.json` gains `call_status_sources: []`, the one change R5 does not cover). +3. A stale file (change a module version) leaves the module-logic statuses and lists the file with its reason in the report and `run.json`. +4. A file for an unknown call stops the run with exit code 2 and a message naming the file (Q6). +5. Legacy case (D14): a module file with `call=tandem_repeat_protein` notes and a call file for that call: the call file is used, and the report shows both the module row and the call row. +6. `test_the_spec_and_the_report_list_the_same_known_limits` passes unchanged. + +## Task 5: `calibrate truth --call-status` + +Files: `src/cellsurface_sorting_hat/calibration/cli.py`, `tests/cellsurface_sorting_hat/calibration/test_truth_call_status.py`. + +Change: `--module` and `--call-status` are mutually exclusive and one is required; add `--config` (default: the packaged config). With `--call-status`: +1. `load_config(args.config)`; the call must pass `call_eligible`. +2. `run.json` next to `--calls-long` must have `config_sha256` equal to `cfg.sha256`, and `module_states` with state `ok` for every read module (any other state, or a missing key or file, is refused with the module and state named). +3. For each read module, `_check_run_identity` (existing) must pass. `reads` is built from the workdir's module records. +4. Truth reading, matching, `build_measure` and the leakage cap are unchanged (shared with the module path; factor the common part into a helper rather than copying). +5. The entry is written by `write_call_status`. +`--module` keeps its behaviour, including the refusal of a call that reads more than one module. + +Note (review P15): the calibration tests' `write_run_json` helper writes neither `config_sha256` nor `module_states`; extend it in this task. + +Tests (write first): the success path for `tandem_repeat_protein` on a toy truth table (sensitivity and specificity values checked against a hand count, leakage `tuned_on_truth` caps the status at `smoke`); then a second `cellsurface_sorting_hat` run uses the file. Refusals: a read module in each of `unavailable`, `partial`, `error` and `not_run` (parametrized, review P17); missing `module_states`; module identity mismatch; config hash mismatch; genus taxon; `kind: other`; composite; single-module call; both or neither of `--module` and `--call-status`. + +## Task 6: documentation and rules + +Files: `docs/paper/03-status-and-validation-rules.md` (section on call files: scope, validity, order, what a reader can rely on), `docs/paper/04-limits-and-open-questions.md`. + +## Task 7: real data + +Not code. After Tasks 1 to 6 pass, build truth tables from curated data (a separate analysis task) and run `truth --call-status` for `tandem_repeat_protein` on S288C and *C. albicans*. Report in `docs/reports/`. Use leakage `tuned_on_truth` where a truth protein tuned a detector. Do not raise any status above what the measure and the cap allow. + +## Out of scope + +A call file for a single-module call; for `ref` or `other` calls; a status for a composite measured as a whole; module-file migration; changes to the interval or `estimated` rules. + +## Self-review against the spec + +Every row of the spec's failure table has a test: not assessable (T3.3), `other`/`ref`/one module (T1.2, T2.1, T5), reads (T2.2), identity (T2.2), no run record (T2.2), `call_hash` (T1.3, T2.2), config (T2.2, T5), `module_states` (T5), no `measure` and status strength (T2.1), duplicate taxon (T2.1), file name (T2.1), variant rules (T2.1, T3.7), unknown call (T2.4, T4.4), legacy module file with `call=` notes (T3.2), concurrent writers (T2.5), leakage cap (T5). diff --git a/docs/superpowers/specs/2026-10-07-per-call-status-design.md b/docs/superpowers/specs/2026-10-07-per-call-status-design.md index 56830ba..c8dd01c 100644 --- a/docs/superpowers/specs/2026-10-07-per-call-status-design.md +++ b/docs/superpowers/specs/2026-10-07-per-call-status-design.md @@ -20,7 +20,7 @@ R2. A call status is valid only for the exact modules (name, version, parameters R3. A stale or invalid call status is never used. It must never raise a status. R4. Existing module status files stay valid and unchanged. The R0 files need no migration. R5. A call without a valid call status behaves as today, byte for byte in `calls.long.tsv.gz` and `report.md`. -R6. The report shows call statuses with the measure (positives, negatives, clusters, sensitivity, specificity, leakage). +R6. The report shows call statuses with the measure (positives, negatives, sensitivity, specificity). Clusters and leakage are in the stored `measure` and its notes; the report table does not list them (code review 1, F7). R7. Lineage rules stay as today: a status applies to the tested taxon and its descendants, the most specific tested taxon wins, a sibling clade does not inherit. R8. One source per call (owner question Q8): a call has either a module file path or a call file path, never both. @@ -54,7 +54,7 @@ Loader rules (stricter than `load_status_source`): `measure` is required in ever SHA-256 of the canonical JSON (sorted keys, no spaces) of an object with: -- the call's `expr`, with every threshold reference replaced by the numeric value in force (only the thresholds the call references, so an unrelated threshold change does not make the file stale); +- the call's `expr`, with every threshold reference replaced by the numeric value in force (only the thresholds the call references). Note (code review 1, F12): the reader also compares `config_sha256`, and any threshold edit changes the config file, so any threshold change makes a file stale with the reason `config differs`; `call_hash` adds the call expression and `ENGINE_SEMANTICS` as a second, clearer check; - `per_variant`; - for `{step1}` calls, the variant label and the module name it maps to; - `ENGINE_SEMANTICS`, a constant in `engine.py`, bumped by hand when the evaluation rules change (Kleene tables, NA handling, `_bad_value`). diff --git a/src/cellsurface_sorting_hat/calibration/call_files.py b/src/cellsurface_sorting_hat/calibration/call_files.py new file mode 100644 index 0000000..90bd113 --- /dev/null +++ b/src/cellsurface_sorting_hat/calibration/call_files.py @@ -0,0 +1,106 @@ +"""Write ``status/calls/[.].json`` (see ``cellsurface_sorting_hat.call_status``).""" + +import fcntl +import json +import sys +from contextlib import contextmanager +from pathlib import Path + +from cellsurface_sorting_hat.cache import write_atomic +from cellsurface_sorting_hat.call_status import ( + build_source, + call_file_name, + check_variant, + load_call_source, +) +from cellsurface_sorting_hat.engine import call_eligible, call_hash, reads_of_call + + +@contextmanager +def _locked(path): + """Exclusive ``fcntl`` lock on ``.lock``. It is best effort on a network file system + (see cache.py); one writer per work directory is the supported use.""" + lock = path.with_name(path.name + ".lock") + lock.parent.mkdir(parents=True, exist_ok=True) + with open(lock, "a") as fh: + fcntl.flock(fh, fcntl.LOCK_EX) + try: + yield + finally: + fcntl.flock(fh, fcntl.LOCK_UN) + + +def _reads(workdir, cfg, call, variant): + """Identities of the modules the call reads, from the module run records (all values strings).""" + reads = [] + for module in reads_of_call(cfg, call, variant): + path = Path(workdir) / "modules" / f"{module}.json" + if not path.is_file(): + raise ValueError( + f"{path}: module run record not found; run the module {module!r} first" + ) + record = json.loads(path.read_text(encoding="utf-8-sig")) + reads.append( + { + "name": module, + "version": str(record.get("version", "")), + "params_hash": str(record.get("params_hash", "")), + "artefact_hash": str(record.get("artefact_hash", "")), + } + ) + return reads + + +def write_call_status(workdir, cfg, call, variant, config_sha256, entries): + """Add ``entries`` to the call status file, validate, and write it atomically. + + Entries of other calibration sets stay and entries of the same set are replaced. All old entries + are dropped (with a message on stderr) when the modules read, their identities, the call + definition or the config differ from the old file. The result is checked before anything is + written, so an invalid update leaves the existing file as it was. + """ + ok, reason = call_eligible(cfg, call) + if not ok: + raise ValueError( + f"unknown call {call!r}" + if reason == "unknown call" + else f"call {call!r} is not eligible for a call status file ({reason})" + ) + check_variant(cfg, call, variant) # before any file name or lock file is built from the variant + name = call_file_name(call, variant) + path = Path(workdir) / "status" / "calls" / name + entries = list(entries) + with _locked(path): + data = { + "call": call, + "variant": variant, + "config_sha256": config_sha256, + "call_hash": call_hash(cfg, call, variant), + "reads": _reads(workdir, cfg, call, variant), + } + kept = [] + if path.exists(): + try: + old = json.loads(path.read_text(encoding="utf-8-sig")) + old_entries = old["entries"] + for e in old_entries: + e["measure"]["calibration_set"] + except (ValueError, KeyError, TypeError) as err: + raise ValueError( + f"{path}: cannot read the existing call status file: {err!r}" + ) from err + same = all(old.get(k) == data[k] for k in ("reads", "call_hash", "config_sha256")) + if same: + replaced = {e["measure"]["calibration_set"] for e in entries} + kept = [e for e in old_entries if e["measure"]["calibration_set"] not in replaced] + else: + print( + f"{path}: module, call or config changed; {len(old_entries)} old entr(ies) dropped", + file=sys.stderr, + ) + data["entries"] = kept + entries + build_source(data, cfg, name, path) # raises before anything is written + payload = (json.dumps(data, indent=2, sort_keys=True, allow_nan=False) + "\n").encode() + write_atomic(path, payload) + load_call_source(path, cfg) # read back under the lock: a self-check of what was written + return path diff --git a/src/cellsurface_sorting_hat/calibration/cli.py b/src/cellsurface_sorting_hat/calibration/cli.py index 6e6271c..1abe056 100644 --- a/src/cellsurface_sorting_hat/calibration/cli.py +++ b/src/cellsurface_sorting_hat/calibration/cli.py @@ -8,13 +8,15 @@ from pathlib import Path from cellsurface_sorting_hat.calibration import phasec +from cellsurface_sorting_hat.calibration.call_files import write_call_status from cellsurface_sorting_hat.calibration.measure import ( build_measure, make_entry, write_status_source, ) from cellsurface_sorting_hat.calibration.panel import panel_check -from cellsurface_sorting_hat.engine import load_config, modules_of_call, variant_label +from cellsurface_sorting_hat.call_status import LEAKAGE_VALUES, check_variant +from cellsurface_sorting_hat.engine import call_eligible, load_config, reads_of_call from cellsurface_sorting_hat.fasta import read_fasta from cellsurface_sorting_hat.modules import allergen, pfam from cellsurface_sorting_hat.taxonomy import TaxonError @@ -55,7 +57,20 @@ def build_parser(): "truth", help="sensitivity and specificity of one call against a truth table" ) p.add_argument("--workdir", required=True) - p.add_argument("--module", required=True, help="module that receives the status entry") + target = p.add_mutually_exclusive_group(required=True) + target.add_argument( + "--module", help="module that receives the status entry (a call that reads one module)" + ) + target.add_argument( + "--call-status", + action="store_true", + help="write status/calls/.json: the status of a call that reads two or more modules", + ) + p.add_argument( + "--config", + help="categories.yaml of the run (default: the packaged file); with --call-status its hash " + "must equal config_sha256 in run.json", + ) p.add_argument( "--calls-long", required=True, help="calls.long.tsv.gz of a run on the truth proteins" ) @@ -77,7 +92,7 @@ def build_parser(): p.add_argument( "--leakage", required=True, - choices=["none", "partial", "tuned_on_truth", "in_reference", "unknown"], + choices=list(LEAKAGE_VALUES), help="did the truth proteins help to set the rule or its cutoffs? anything but 'none' caps the status at smoke", ) p.add_argument("--n-boot", type=int, default=2000) @@ -113,7 +128,7 @@ def build_parser(): return ap -LEAKAGE = ("none", "partial", "tuned_on_truth", "in_reference", "unknown") +LEAKAGE = LEAKAGE_VALUES CALL_VALUES = ("called", "not_called", "not_assessable") @@ -239,14 +254,6 @@ def _plain(text): return " ".join(str(text).replace("=", ":").replace(";", ",").split()) -def _reads_of_call(cfg, call, variant): - """Modules that a call reads. With ``variant``, a step 1 module of another variant is left out.""" - reads = modules_of_call(cfg, call) - if variant: - reads = [m for m in reads if m not in cfg.step1_variants or variant_label(m) == variant] - return reads - - def _check_run_identity(calls_long, workdir, module): """``run.json`` next to ``calls_long`` must carry the identity of ``module`` that the work directory's module record carries now. A status belongs to the data it was measured on.""" @@ -360,6 +367,52 @@ def _read_truth(path, calls): return rows +def _check_call_run(calls_long, workdir, cfg, call, variant): + """Checks for ``--call-status``; returns the modules the call reads. + + The call must be eligible. ``run.json`` next to ``calls_long`` must come from a run with this + config and every read module in state ``ok`` (a call measured with a module missing is a + different rule). Each module identity must be the one in the work directory now. + """ + ok, reason = call_eligible(cfg, call) + if not ok: + raise ValueError( + f"unknown call {call!r}" + if reason == "unknown call" + else f"call {call!r} is not eligible for a call status file ({reason}); " + "it needs an expression with no ref, not kind other, reading two or more modules" + ) + check_variant(cfg, call, variant, f"call {call!r}") + reads = reads_of_call(cfg, call, variant) + path = Path(calls_long).with_name("run.json") + if not path.is_file(): + raise ValueError(f"{path}: not found; it must be next to --calls-long (the run output)") + try: + run_json = json.loads(path.read_text(encoding="utf-8-sig")) + except ValueError as exc: + raise ValueError(f"{path}: not valid JSON ({exc})") from exc + if "config_sha256" not in run_json: + raise ValueError(f"{path}: no config_sha256; run the core command again") + if run_json["config_sha256"] != cfg.sha256: + raise ValueError( + f"{path}: the run used another config (config_sha256 differs from --config)" + ) + states = run_json.get("module_states") + if not isinstance(states, dict): + raise ValueError(f"{path}: no module_states; run the core command again") + for module in reads: + state = states.get(module, "missing") + if state != "ok": + raise ValueError( + f"module {module!r} was not ok in the run (state: {state}); the call was not " + "measured with all the modules it reads" + ) + for module in reads: + _require_run_record(workdir, module) + _check_run_identity(calls_long, workdir, module) + return reads + + def run(args): if args.cmd == "phasec": record = _require_run_record(args.workdir, phasec.R0_MODULE) @@ -389,7 +442,9 @@ def run(args): if args.cmd == "truth": if args.n_boot < 1: raise ValueError("--n-boot must be at least 1") - _require_run_record(args.workdir, args.module) + cfg = load_config(args.config) if args.config else load_config() + if args.module: + _require_run_record(args.workdir, args.module) if len(args.taxa) != 1: raise ValueError( "--taxa takes exactly one taxon: a status entry is one species; " @@ -397,19 +452,22 @@ def run(args): ) nodes = read_nodes(args.nodes_dmp) _require_species(args.taxa[0], nodes, "--taxa") - reads = _reads_of_call(load_config(), args.call, args.variant) - if args.module not in reads: - raise ValueError( - f"--module {args.module!r} is not read by call {args.call!r}; " - f"the call reads: {', '.join(reads)}" - ) - if len(reads) > 1: - raise ValueError( - f"call {args.call!r} reads {len(reads)} modules ({', '.join(reads)}); a status " - "comes from a measurement of one module on a call that reads only that module. " - "Give a call that reads one module" - ) - _check_run_identity(args.calls_long, args.workdir, args.module) + if args.call_status: + reads = _check_call_run(args.calls_long, args.workdir, cfg, args.call, args.variant) + else: + reads = reads_of_call(cfg, args.call, args.variant) + if args.module not in reads: + raise ValueError( + f"--module {args.module!r} is not read by call {args.call!r}; " + f"the call reads: {', '.join(reads)}" + ) + if len(reads) > 1: + raise ValueError( + f"call {args.call!r} reads {len(reads)} modules ({', '.join(reads)}); a status " + "comes from a measurement of one module on a call that reads only that module. " + "Give a call that reads one module, or use --call-status" + ) + _check_run_identity(args.calls_long, args.workdir, args.module) protein_taxa = _read_protein_taxa(args.calls_long) calls = _read_call_values(args.calls_long, args.call, args.variant) y, called, clusters, unmatched, unknown, unknown_pos = [], [], [], 0, 0, 0 @@ -444,7 +502,10 @@ def run(args): ).strip() if not any(lab == 0 for lab in y): notes += " specificity not measured (no negatives)" - notes += f" call={args.call}; module={args.module}; variant={args.variant}" + if args.call_status: + notes += f" call={args.call}; variant={args.variant}; reads={','.join(reads)}" + else: + notes += f" call={args.call}; module={args.module}; variant={args.variant}" measure = build_measure( args.calibration_set, str(args.truth), @@ -455,10 +516,14 @@ def run(args): args.n_boot, args.seed, ) - path = Path(args.workdir) / "status" / f"{args.module}.json" measure["notes"] = f"{measure['notes']} leakage: {args.leakage}".strip() cap = None if args.leakage == "none" else "smoke" entry = make_entry(args.taxa, measure, source=str(args.truth), cap=cap) + if args.call_status: + return write_call_status( + args.workdir, cfg, args.call, args.variant, cfg.sha256, [entry] + ) + path = Path(args.workdir) / "status" / f"{args.module}.json" return write_status_source( args.workdir, args.module, _merge_entries(path, [entry], args.workdir, args.module) ) diff --git a/src/cellsurface_sorting_hat/calibration/measure.py b/src/cellsurface_sorting_hat/calibration/measure.py index 59beea9..7044cd0 100644 --- a/src/cellsurface_sorting_hat/calibration/measure.py +++ b/src/cellsurface_sorting_hat/calibration/measure.py @@ -6,24 +6,22 @@ from cellsurface_sorting_hat.cache import write_atomic from cellsurface_sorting_hat.calibration.intervals import cluster_bootstrap -from cellsurface_sorting_hat.status import ( +from cellsurface_sorting_hat.status import ( # noqa: F401 (re-exported: older code imports these here) _STRENGTH, ENTRY_KEYS, ESTIMATED, + MAX_HALF_WIDTH, + MIN_CLUSTERS, + MIN_NEGATIVES, + MIN_POSITIVES, SMOKE, UNVALIDATED, _check_measure, load_status_source, + status_from_measure, weakest, ) -MIN_POSITIVES = 20 -MIN_NEGATIVES = 20 -MIN_CLUSTERS = 20 -MAX_HALF_WIDTH = 0.10 -# Floating-point subtraction can give 0.10000000000000003 for an interval of exactly 0.10. -_TOLERANCE = 1e-9 - def build_measure(calibration_set, truth_source, y, call, clusters, notes="", n_boot=2000, seed=1): rates = cluster_bootstrap(y, call, clusters, n_boot=n_boot, seed=seed) @@ -44,37 +42,6 @@ def build_measure(calibration_set, truth_source, y, call, clusters, notes="", n_ return measure -def status_from_measure( - measure, - min_positives=MIN_POSITIVES, - min_negatives=MIN_NEGATIVES, - max_half_width=MAX_HALF_WIDTH, - min_clusters=MIN_CLUSTERS, -): - """``estimated`` needs at least 20 positives and 20 negatives (and, when recorded, at least 20 - independent clusters of each) and a 95% interval half-width of at most 0.10 for both - sensitivity and specificity. Phase C uses the same floor for recall. A measure with any - positive but without a specificity is at most ``smoke``: a rule that was never tested on - negatives is not an estimate. No sensitivity or no positive gives ``unvalidated``. - - A measure with a non-finite or out-of-range rate or count is refused with ``ValueError``.""" - _check_measure(measure, "measure") - sens, spec = measure.get("sensitivity"), measure.get("specificity") - if not sens or measure.get("n_pos", 0) < 1: - return UNVALIDATED - narrow = (sens["hi"] - sens["lo"]) / 2 <= max_half_width + _TOLERANCE - if spec: - narrow = narrow and (spec["hi"] - spec["lo"]) / 2 <= max_half_width + _TOLERANCE - enough = measure["n_pos"] >= min_positives and measure.get("n_neg", 0) >= min_negatives - # independent clusters, when the measure records them (older files may not) - for key in ("n_clusters_pos", "n_clusters_neg"): - if key in measure and measure[key] < min_clusters: - enough = False - if spec and enough and narrow: - return ESTIMATED - return SMOKE - - def _taxa(taxa): if isinstance(taxa, str | bytes): raise ValueError("taxa must be a list of integers") diff --git a/src/cellsurface_sorting_hat/call_status.py b/src/cellsurface_sorting_hat/call_status.py new file mode 100644 index 0000000..413b8cf --- /dev/null +++ b/src/cellsurface_sorting_hat/call_status.py @@ -0,0 +1,278 @@ +"""Status files for calls that read two or more modules. + +A module status file (``status/.json``) records a calibration of one module. A call that reads +several modules (for example ``tandem_repeat_protein`` = ``repeat02`` OR ``repeat14``) is measured as +a whole, so its status lives in ``status/calls/[.].json``. + +A call file is valid for a run only when the config, the modules the call reads, their identities and +run states, and the call definition are the ones it was measured with. A stale file is never used. +A file that is not well formed, or that names a call that does not exist or cannot have a call file, +stops the run (the caller turns ``CallStatusError`` into an input error). +""" + +import json +import re +from dataclasses import dataclass +from pathlib import Path + +from cellsurface_sorting_hat.engine import ( + call_eligible, + call_hash, + reads_of_call, + variant_label, +) +from cellsurface_sorting_hat.status import ( + _STRENGTH, + ENTRY_KEYS, + SMOKE, + ModuleIdentity, + StatusEntry, + _check_measure, + best_entry, + status_from_measure, + weakest, +) + +FILE_KEYS = {"call", "variant", "config_sha256", "call_hash", "reads", "entries"} +LEAKAGE_VALUES = ("none", "partial", "tuned_on_truth", "in_reference", "unknown") +_LEAKAGE = re.compile(r"(?:^|[\s;])leakage:\s*([a-z_]+)") +MIN_TAXON = 2 # taxon 1 is the root: a status for it would apply to every protein + + +class CallStatusError(ValueError): + """A call status file is not usable.""" + + +@dataclass(frozen=True) +class CallSource: + path: Path + call: str + variant: str + config_sha256: str + call_hash: str + reads: tuple # of ModuleIdentity + entries: tuple # of StatusEntry + + +def call_file_name(call, variant=""): + return f"{call}.{variant}.json" if variant else f"{call}.json" + + +def leakage_of(measure): + found = _LEAKAGE.findall((measure or {}).get("notes", "")) + return found[-1] if found else None + + +def _entries(raw, where): + if not isinstance(raw, list) or not raw: + raise ValueError(f"{where}: entries must be a non-empty list") + out, listed = [], {} + for i, e in enumerate(raw): + at = f"{where} entries[{i}]" + if not isinstance(e, dict) or not {"taxa", "status", "measure"} <= set(e) <= ENTRY_KEYS: + raise ValueError( + f"{at}: needs taxa, status and measure, and only keys {sorted(ENTRY_KEYS)}" + ) + if e["status"] not in _STRENGTH: + raise ValueError(f"{at}: unknown status {e['status']!r}") + taxa = e["taxa"] + if ( + not isinstance(taxa, list) + or not taxa + or any(isinstance(t, bool) or not isinstance(t, int) or t < MIN_TAXON for t in taxa) + ): + raise ValueError(f"{at}: taxa must be a list of integers of at least {MIN_TAXON}") + for t in taxa: + if t in listed: + raise ValueError(f"{at}: taxon {t} is already in entries[{listed[t]}]") + listed[t] = i + measure = e["measure"] + _check_measure(measure, at) + allowed = status_from_measure(measure) + if weakest([e["status"], allowed]) != e["status"]: + raise ValueError( + f"{at}: status {e['status']} is stronger than the measure allows ({allowed})" + ) + leak = leakage_of(measure) + if leak not in LEAKAGE_VALUES: + raise ValueError(f"{at}: measure.notes needs 'leakage: <{'|'.join(LEAKAGE_VALUES)}>'") + if leak != "none" and weakest([e["status"], SMOKE]) != e["status"]: + raise ValueError(f"{at}: leakage {leak} allows at most smoke, not {e['status']}") + out.append(StatusEntry(tuple(taxa), e["status"], str(e.get("source", "")), measure)) + return tuple(out) + + +def check_variant(cfg, call, variant, where="call status"): + """``ValueError`` unless ``variant`` fits ``call``: one of the step 1 labels for a per-variant + call, empty for any other call. Call this before any file name is built from the variant.""" + labels = [variant_label(v) for v in cfg.step1_variants] + if cfg.call_by_name(call).get("per_variant"): + if variant not in labels: + raise ValueError(f"{where}: variant must be one of {labels} for call {call!r}") + elif variant != "": + raise ValueError(f"{where}: call {call!r} has no variants, but variant is {variant!r}") + + +def build_source(data, cfg, file_name, path=None): + """A ``CallSource`` from parsed JSON, or ``ValueError``. ``file_name`` must be the canonical name.""" + where = str(path or file_name) + if not isinstance(data, dict): + raise ValueError(f"{where}: must be a JSON object") + missing, extra = FILE_KEYS - set(data), set(data) - FILE_KEYS + if missing or extra: + raise ValueError( + f"{where}: missing key(s) {sorted(missing)}, unknown key(s) {sorted(extra)}" + ) + call, variant = data["call"], data["variant"] + if not isinstance(call, str) or not isinstance(variant, str): + raise ValueError(f"{where}: call and variant must be strings") + ok, reason = call_eligible(cfg, call) + if not ok: + raise ValueError( + f"{where}: call {call!r} is not eligible for a call status file ({reason})" + if reason != "unknown call" + else f"{where}: unknown call {call!r}" + ) + check_variant(cfg, call, variant, where) + if file_name != call_file_name(call, variant): + raise ValueError( + f"{where}: file name does not match call and variant ({call_file_name(call, variant)})" + ) + reads = data["reads"] + keys = {"name", "version", "params_hash", "artefact_hash"} + if ( + not isinstance(reads, list) + or not reads + or any( + not isinstance(r, dict) + or set(r) != keys + or any(not isinstance(v, str) for v in r.values()) + for r in reads + ) + ): + raise ValueError(f"{where}: reads must be a list of objects with {sorted(keys)} (strings)") + for key in ("config_sha256", "call_hash"): + if not isinstance(data[key], str) or not data[key]: + raise ValueError(f"{where}: {key} must be a non-empty string") + return CallSource( + Path(path) if path else Path(file_name), + call, + variant, + data["config_sha256"], + data["call_hash"], + tuple( + ModuleIdentity(r["name"], r["version"], r["params_hash"], r["artefact_hash"]) + for r in reads + ), + _entries(data["entries"], where), + ) + + +def load_call_source(path, cfg): + path = Path(path) + data = json.loads(path.read_text(encoding="utf-8-sig")) + return build_source(data, cfg, path.name, path) + + +def stale_reason(source, cfg, identities, states, config_sha256): + """``""`` when the file belongs to this run, else why not (checked in a fixed order).""" + if source.config_sha256 != config_sha256: + return "config differs" + now = reads_of_call(cfg, source.call, source.variant) + if sorted(r.name for r in source.reads) != now: + return "reads differ" + for m in now: + if m not in identities: + return f"no module run record: {m}" + for m in now: + state = states.get(m, "missing") + if state != "ok": + return f"module state not ok: {m} ({state})" + for r in source.reads: + if identities[r.name] != r: + return f"identity differs: {r.name}" + if source.call_hash != call_hash(cfg, source.call, source.variant): + return "call_hash differs" + return "" + + +def _rate_text(rate): + return ( + "not measured" if not rate else f"{rate['value']:.3f} [{rate['lo']:.3f}, {rate['hi']:.3f}]" + ) + + +class CallStatusResolver: + """Loads every ``/status/calls/*.json`` and answers ``(call, variant, taxon)``.""" + + def __init__(self, workdir, cfg, identities, states, config_sha256, lineage): + self.folder = Path(workdir) / "status" / "calls" + self.lineage = lineage + self._items = {} # (call, variant) -> (source, stale reason) + for path in sorted(self.folder.glob("*.json")): + try: + source = load_call_source(path, cfg) + except (KeyError, TypeError, ValueError) as err: # JSONDecodeError is a ValueError + message = str(err) + raise CallStatusError( + message if message.startswith(str(path)) else f"{path}: {message}" + ) from err + reason = stale_reason(source, cfg, identities, states, config_sha256) + self._items[(source.call, source.variant)] = (source, reason) + + def __call__(self, call, variant, taxon): + """None (no file, or the taxon is not tested), ``(status, basis)``, or ``(None, reason)`` (stale).""" + item = self._items.get((call, variant)) + if item is None: + return None + source, reason = item + if reason: + return None, reason + best = best_entry(source.entries, taxon, self.lineage) + if best is None: + return None + entry, tested = best + return entry.status, f"call:{call}:taxon:{tested}" + + def rows(self): + """One row per entry and tested taxon of a valid file, and one row per stale file.""" + out = [] + for (call, variant), (source, reason) in sorted(self._items.items()): + if reason: + out.append( + { + "file": source.path.name, + "call": call, + "variant": variant, + "taxon": "", + "status": "", + "calibration_set": "", + "n_pos": "", + "n_neg": "", + "sensitivity": "", + "specificity": "", + "valid": False, + "reason": reason, + } + ) + continue + for entry in source.entries: + m = entry.measure + for taxon in entry.taxa: + out.append( + { + "file": source.path.name, + "call": call, + "variant": variant, + "taxon": taxon, + "status": entry.status, + "calibration_set": m.get("calibration_set", ""), + "n_pos": m.get("n_pos", ""), + "n_neg": m.get("n_neg", ""), + "sensitivity": _rate_text(m.get("sensitivity")), + "specificity": _rate_text(m.get("specificity")), + "valid": True, + "reason": "", + } + ) + return out diff --git a/src/cellsurface_sorting_hat/cli.py b/src/cellsurface_sorting_hat/cli.py index dffe8f5..de1d1f4 100644 --- a/src/cellsurface_sorting_hat/cli.py +++ b/src/cellsurface_sorting_hat/cli.py @@ -19,6 +19,7 @@ from pathlib import Path from cellsurface_sorting_hat import __version__ +from cellsurface_sorting_hat.call_status import CallStatusError, CallStatusResolver from cellsurface_sorting_hat.engine import ( ConfigError, ModuleTable, @@ -366,7 +367,13 @@ def run(args): loaded = load_modules(args.workdir, ids, invalid, required_columns(cfg)) tables = loaded.tables resolver = StatusResolver(args.workdir, loaded.identities, lineage) - records = evaluate(cfg, ids, taxa, tables, resolver, resolver.measured_call) + try: + call_resolver = CallStatusResolver( + args.workdir, cfg, loaded.identities, loaded.states, cfg.sha256, lineage + ) + except CallStatusError as err: + raise InputError(str(err)) from err + records = evaluate(cfg, ids, taxa, tables, resolver, resolver.measured_call, call_resolver) out = Path(args.out) out.mkdir(parents=True, exist_ok=True) counts = Counter(taxa.values()) @@ -403,6 +410,7 @@ def run(args): for _, i in sorted(loaded.identities.items()) ], calibration=calibration_rows(resolver, set(tables) | {cfg.default_gate}, taxa.values()), + call_status_sources=call_resolver.rows(), ) report = render_report(info, records) # render first: a failure leaves no partial output write_long(out / "calls.long.tsv.gz", records) diff --git a/src/cellsurface_sorting_hat/engine.py b/src/cellsurface_sorting_hat/engine.py index 3afe8c1..c735b15 100644 --- a/src/cellsurface_sorting_hat/engine.py +++ b/src/cellsurface_sorting_hat/engine.py @@ -4,7 +4,9 @@ does no I/O except reading the config. """ +import copy import hashlib +import json import math import operator from dataclasses import dataclass, field @@ -23,6 +25,9 @@ from cellsurface_sorting_hat.status import UNVALIDATED, weakest OK_STATE = "ok" +# Bump by hand when the evaluation rules change (Kleene tables, NA handling). It is part of call_hash, +# so a call status file measured under other rules is stale. +ENGINE_SEMANTICS = "1" _OPS = {">=": operator.ge, "<=": operator.le, ">": operator.gt, "<": operator.lt, "==": operator.eq} _NODE_KEYS = {"call", "flag", "test", "ref", "and", "or", "not"} @@ -247,7 +252,9 @@ def available_variants(cfg, modules): return [v for v in cfg.step1_variants if v in modules] -def evaluate(cfg, protein_ids, taxa, modules, status_of, measured_call_of=None): +def evaluate( + cfg, protein_ids, taxa, modules, status_of, measured_call_of=None, call_status_of=None +): """Evaluate every call for every protein; return a list of ``CallRecord``. ``taxa`` maps protein ID to taxon ID. ``modules`` maps module name to ``ModuleTable``. @@ -258,6 +265,15 @@ def evaluate(cfg, protein_ids, taxa, modules, status_of, measured_call_of=None): when the leaf that reads the module sits in the measured call. In every other call that reads the module, the module is ``unvalidated`` with the basis ``module measured on call X``. Without ``measured_call_of`` every status counts for every call. + + ``call_status_of(call, variant, taxon)`` (optional) serves call status files, for calls that read + several modules. It returns None (no file for the call, or the taxon is not tested), ``(status, + basis)`` (the call was measured as a whole), or ``(None, reason)`` (a file exists and is stale: the + module statuses are used and the basis says why). A record whose value is not assessable has no + deciding module and never takes a call status. Contributors are grouped by the leaf call they sit + in; a leaf with a call status contributes one status and one basis item. The record status is the + weakest over all items. Without the hook, or when it returns None for every leaf, the result is + exactly the one without the hook. """ variants = available_variants(cfg, modules) status_cache, records = {}, [] @@ -272,6 +288,15 @@ def status_for(module, taxon, leaf_call): return UNVALIDATED, f"module measured on call {measured}" return status, basis + call_cache = {} + + def call_status_for(leaf, label, taxon): + variant = label if cfg.call_by_name(leaf).get("per_variant") else "" + key = (leaf, variant, taxon) + if key not in call_cache: + call_cache[key] = call_status_of(leaf, variant, taxon) + return call_cache[key] + for pid in protein_ids: taxon = taxa[pid] results = {} @@ -299,11 +324,18 @@ def status_for(module, taxon, leaf_call): results[(call["name"], label)] = res if res.contributors: names = sorted(res.contributors) - pairs = [status_for(m, taxon, c) for m, c in names] - status = weakest(s for s, _ in pairs) - basis = ";".join( - f"{m}:{b}" for (m, _), (_, b) in zip(names, pairs, strict=True) - ) + leaf_status = {} + if call_status_of is not None: + for leaf in {c for _, c in names}: + leaf_status[leaf] = call_status_for(leaf, label, taxon) + if all(v is None for v in leaf_status.values()): + pairs = [status_for(m, taxon, c) for m, c in names] + status = weakest(s for s, _ in pairs) + basis = ";".join( + f"{m}:{b}" for (m, _), (_, b) in zip(names, pairs, strict=True) + ) + else: + status, basis = _status_with_calls(names, leaf_status, status_for, taxon) else: status, basis = UNVALIDATED, "" records.append( @@ -312,6 +344,26 @@ def status_for(module, taxon, leaf_call): return records +def _status_with_calls(names, leaf_status, status_for, taxon): + """Status and basis of a record when at least one leaf call has a call status or a stale file.""" + items, statuses, emitted = [], [], set() + for module, leaf in names: + found = leaf_status.get(leaf) + if found is not None and found[0] is not None: + # one item for the whole leaf, where its first module would stand + if leaf not in emitted: + emitted.add(leaf) + items.append(found[1]) + statuses.append(found[0]) + continue + status, basis = status_for(module, taxon, leaf) + if found is not None: # a stale file: say why the module statuses are used + basis = f"call status stale ({found[1]}); {basis}" + items.append(f"{module}:{basis}") + statuses.append(status) + return weakest(statuses), ";".join(items) + + def _expand_step1(cfg, names): expanded = set() for n in names: @@ -365,6 +417,91 @@ def modules_of_call(cfg, name): return sorted(_expand_step1(cfg, names)) +def reads_of_call(cfg, name, variant=""): + """Modules that a call reads. With ``variant``, a step 1 module of another variant is left out.""" + reads = modules_of_call(cfg, name) + if variant: + reads = [m for m in reads if m not in cfg.step1_variants or variant_label(m) == variant] + return reads + + +def _has_ref(node): + kind, arg = next(iter(node.items())) + if kind == "ref": + return True + if kind in ("and", "or"): + return any(_has_ref(child) for child in arg) + if kind == "not": + return _has_ref(arg) + return False + + +def _variant_labels(cfg, call): + return [variant_label(v) for v in cfg.step1_variants] if call.get("per_variant") else [""] + + +def call_eligible(cfg, name): + """``(True, "")`` when a call may have a call status file, else ``(False, reason)``. + + Eligible: the call has an expression, is not ``kind: other``, has no ``ref`` node, names no step 1 + module literally, and reads at least two modules for every variant it has. + """ + try: + call = cfg.call_by_name(name) + except ConfigError: + return False, "unknown call" + if call.get("kind") == "other": + return False, "kind other" + if _has_ref(call["expr"]): + return False, "contains ref" + raw = set() + _walk_modules(call["expr"], raw, set()) + if raw & set(cfg.step1_variants): + return False, "literal step1 module" + # Every label gives the same count while literal step 1 names are refused above; the loop is a + # guard in case that rule is ever relaxed. + for label in _variant_labels(cfg, call): + if len(reads_of_call(cfg, name, label)) < 2: + return False, "reads fewer than two modules" + return True, "" + + +def _resolve_node(node, cfg, variant_module): + """A copy of ``node`` with threshold references replaced by their numbers and {step1} by the variant.""" + kind, arg = next(iter(node.items())) + if kind in ("and", "or"): + return {kind: [_resolve_node(c, cfg, variant_module) for c in arg]} + if kind == "not": + return {kind: _resolve_node(arg, cfg, variant_module)} + arg = copy.deepcopy(arg) + if kind == "test": + if isinstance(arg["value"], str) and arg["value"].startswith("$"): + arg["value"] = cfg.thresholds[arg["value"][1:]] + arg["module"] = arg["module"].replace("{step1}", variant_module or "{step1}") + elif kind in ("call", "flag"): + arg = arg.replace("{step1}", variant_module or "{step1}") + return {kind: arg} + + +def call_hash(cfg, name, variant=""): + """SHA-256 of what defines one call: its expression with the referenced thresholds as numbers, + the step 1 module of the variant, ``per_variant``, and ``ENGINE_SEMANTICS``.""" + call = cfg.call_by_name(name) + variant_module = "" + if variant: + variant_module = next(v for v in cfg.step1_variants if variant_label(v) == variant) + payload = { + "name": name, + "per_variant": bool(call.get("per_variant")), + "variant": variant, + "variant_module": variant_module, + "expr": _resolve_node(call["expr"], cfg, variant_module), + "semantics": ENGINE_SEMANTICS, + } + text = json.dumps(payload, sort_keys=True, separators=(",", ":"), allow_nan=False) + return hashlib.sha256(text.encode()).hexdigest() + + def collect_evidence(cfg, protein_ids, modules): """Rows (protein, module, field, value) for the configured evidence fields.""" rows = [] diff --git a/src/cellsurface_sorting_hat/outputs.py b/src/cellsurface_sorting_hat/outputs.py index d5e7020..cd6251c 100644 --- a/src/cellsurface_sorting_hat/outputs.py +++ b/src/cellsurface_sorting_hat/outputs.py @@ -68,6 +68,7 @@ class RunInfo: map_ids_not_in_fasta: int = 0 unmatched_module_ids: dict = field(default_factory=dict) # module -> rows with no FASTA ID calibration: list = field(default_factory=list) # rows from cli.calibration_rows + call_status_sources: list = field(default_factory=list) # rows from CallStatusResolver.rows() # one {name, version, params_hash, artefact_hash} per module that was loaded module_identities: list = field(default_factory=list) @@ -225,6 +226,33 @@ def render_report(info, records): f"| {c['calibration_set'] or '-'} | {n_pos} | {n_neg} " f"| {c['sensitivity']} | {c['specificity']} |" ) + if info.call_status_sources: + lines += [ + "", + "## Call calibration", + "", + "Calls that read several modules, measured as a whole (`status/calls/`). A valid file sets " + "the status of its call. Statuses of composite calls (for example " + "`cell_wall_adhesion_candidate`) are derived: the weakest status of the measured leaf " + "calls that decided them. A stale file is listed with its reason and is not used.", + "", + "| call | variant | taxon | status | calibration set | positives | negatives " + "| sensitivity [95% CI] | specificity [95% CI] | validity |", + "|---|---|---|---|---|---|---|---|---|---|", + ] + for c in info.call_status_sources: + if c["valid"]: + lines.append( + f"| {c['call']} | {c['variant'] or '-'} | {c['taxon']} | {c['status']} " + f"| {c['calibration_set'] or '-'} | {c['n_pos'] if c['n_pos'] != '' else '-'} " + f"| {c['n_neg'] if c['n_neg'] != '' else '-'} | {c['sensitivity']} " + f"| {c['specificity']} | valid |" + ) + else: + lines.append( + f"| {c['call']} | {c['variant'] or '-'} | - | - | - | - | - | - | - " + f"| stale: {c['reason']} |" + ) lines += [ "", "## Calls", diff --git a/src/cellsurface_sorting_hat/status.py b/src/cellsurface_sorting_hat/status.py index 02fb5a0..01b3a12 100644 --- a/src/cellsurface_sorting_hat/status.py +++ b/src/cellsurface_sorting_hat/status.py @@ -94,6 +94,45 @@ def _check_measure(measure, where): raise ValueError(f"{where}.{key}: must be a non-negative integer") +MIN_POSITIVES = 20 +MIN_NEGATIVES = 20 +MIN_CLUSTERS = 20 +MAX_HALF_WIDTH = 0.10 +# Floating-point subtraction can give 0.10000000000000003 for an interval of exactly 0.10. +_TOLERANCE = 1e-9 + + +def status_from_measure( + measure, + min_positives=MIN_POSITIVES, + min_negatives=MIN_NEGATIVES, + max_half_width=MAX_HALF_WIDTH, + min_clusters=MIN_CLUSTERS, +): + """``estimated`` needs at least 20 positives and 20 negatives (and, when recorded, at least 20 + independent clusters of each) and a 95% interval half-width of at most 0.10 for both + sensitivity and specificity. Phase C uses the same floor for recall. A measure with any + positive but without a specificity is at most ``smoke``: a rule that was never tested on + negatives is not an estimate. No sensitivity or no positive gives ``unvalidated``. + + A measure with a non-finite or out-of-range rate or count is refused with ``ValueError``.""" + _check_measure(measure, "measure") + sens, spec = measure.get("sensitivity"), measure.get("specificity") + if not sens or measure.get("n_pos", 0) < 1: + return UNVALIDATED + narrow = (sens["hi"] - sens["lo"]) / 2 <= max_half_width + _TOLERANCE + if spec: + narrow = narrow and (spec["hi"] - spec["lo"]) / 2 <= max_half_width + _TOLERANCE + enough = measure["n_pos"] >= min_positives and measure.get("n_neg", 0) >= min_negatives + # independent clusters, when the measure records them (older files may not) + for key in ("n_clusters_pos", "n_clusters_neg"): + if key in measure and measure[key] < min_clusters: + enough = False + if spec and enough and narrow: + return ESTIMATED + return SMOKE + + def load_status_source(path): data = json.loads(Path(path).read_text(encoding="utf-8-sig")) identity = ModuleIdentity( @@ -125,6 +164,19 @@ def load_status_source(path): return StatusRecord(identity, tuple(entries)) +def best_entry(entries, taxon, lineage): + """``(entry, tested_taxon)`` for the most specific tested taxon that ``taxon`` is, or descends + from, or None. Used for module status files and for call status files.""" + best = None # (depth, tested taxon, entry) + for entry in entries: + for tested in entry.taxa: + if lineage.is_descendant_or_self(taxon, tested): + depth = lineage.depth(tested) + if best is None or depth > best[0]: + best = (depth, tested, entry) + return None if best is None else (best[2], best[1]) + + def resolve_entry(record, running, taxon, lineage): """Return (entry, tested_taxon, reason). ``entry`` is None when nothing applies. @@ -135,16 +187,10 @@ def resolve_entry(record, running, taxon, lineage): for field in ("name", "version", "params_hash", "artefact_hash"): if getattr(record.identity, field) != getattr(running, field): return None, None, f"status_source stale: {field} differs" - best = None # (depth, tested taxon, entry) - for entry in record.entries: - for tested in entry.taxa: - if lineage.is_descendant_or_self(taxon, tested): - depth = lineage.depth(tested) - if best is None or depth > best[0]: - best = (depth, tested, entry) + best = best_entry(record.entries, taxon, lineage) if best is None: return None, None, "taxon not tested" - return best[2], best[1], "" + return best[0], best[1], "" def resolve_status(record, running, taxon, lineage): diff --git a/tests/cellsurface_sorting_hat/calibration/test_call_files.py b/tests/cellsurface_sorting_hat/calibration/test_call_files.py new file mode 100644 index 0000000..2861f9e --- /dev/null +++ b/tests/cellsurface_sorting_hat/calibration/test_call_files.py @@ -0,0 +1,165 @@ +"""Writer of call status files: validation, merge, lock, atomicity.""" + +import fcntl +import json + +import pytest + +from cellsurface_sorting_hat.calibration import call_files +from cellsurface_sorting_hat.calibration.measure import make_entry +from cellsurface_sorting_hat.call_status import load_call_source +from cellsurface_sorting_hat.engine import load_config + +CALL = "tandem_repeat_protein" +CFG_SHA = "c" * 64 + + +def measure(calibration_set="S1", n_pos=10, leakage="none"): + return { + "calibration_set": calibration_set, + "truth_source": "truth.tsv", + "n_pos": n_pos, + "n_neg": 30, + "n_clusters_pos": 8, + "n_clusters_neg": 25, + "sensitivity": {"value": 0.5, "lo": 0.3, "hi": 0.7}, + "specificity": {"value": 0.97, "lo": 0.9, "hi": 1.0}, + "notes": f"call={CALL}; leakage: {leakage}", + } + + +def entry(taxon=40, calibration_set="S1", **kw): + return make_entry([taxon], measure(calibration_set, **kw), source="truth.tsv") + + +@pytest.fixture +def cfg(): + return load_config() + + +@pytest.fixture +def workdir(tmp_path): + folder = tmp_path / "modules" + folder.mkdir() + for m in ("repeat02", "repeat14"): + # a numeric version, as an older module record may hold: it is written as a string + (folder / f"{m}.json").write_text( + json.dumps({"module": m, "version": 1, "params_hash": "p", "artefact_hash": "a"}) + ) + return tmp_path + + +def path_of(workdir): + return workdir / "status" / "calls" / f"{CALL}.json" + + +def write(workdir, cfg, entries, sha=CFG_SHA, call=CALL, variant=""): + return call_files.write_call_status(workdir, cfg, call, variant, sha, entries) + + +def test_writes_a_file_that_loads_and_has_string_identities(cfg, workdir): + path = write(workdir, cfg, [entry()]) + src = load_call_source(path, cfg) + assert [r.version for r in src.reads] == ["1", "1"] + assert [e.status for e in src.entries] == ["smoke"] + assert json.loads(path.read_text())["reads"][0]["version"] == "1" + + +def test_another_calibration_set_is_added_and_the_same_set_is_replaced(cfg, workdir): + write(workdir, cfg, [entry(40, "S1", n_pos=10)]) + write(workdir, cfg, [entry(41, "S2", n_pos=12)]) + src = load_call_source(path_of(workdir), cfg) + assert sorted(e.measure["calibration_set"] for e in src.entries) == ["S1", "S2"] + write(workdir, cfg, [entry(40, "S1", n_pos=15)]) + src = load_call_source(path_of(workdir), cfg) + sets = {e.measure["calibration_set"]: e.measure["n_pos"] for e in src.entries} + assert sets == {"S1": 15, "S2": 12} + + +def test_a_changed_module_identity_drops_the_old_entries_with_a_message(cfg, workdir, capsys): + write(workdir, cfg, [entry(40, "S1")]) + record = workdir / "modules" / "repeat02.json" + record.write_text( + json.dumps({"module": "repeat02", "version": "2", "params_hash": "p", "artefact_hash": "a"}) + ) + write(workdir, cfg, [entry(41, "S2")]) + assert "dropped" in capsys.readouterr().err + src = load_call_source(path_of(workdir), cfg) + assert [e.measure["calibration_set"] for e in src.entries] == ["S2"] + + +def test_a_changed_config_drops_the_old_entries(cfg, workdir, capsys): + write(workdir, cfg, [entry(40, "S1")]) + write(workdir, cfg, [entry(41, "S2")], sha="d" * 64) + assert "dropped" in capsys.readouterr().err + src = load_call_source(path_of(workdir), cfg) + assert [e.measure["calibration_set"] for e in src.entries] == ["S2"] + assert src.config_sha256 == "d" * 64 + + +def test_a_changed_call_hash_drops_the_old_entries(cfg, workdir, capsys, monkeypatch): + write(workdir, cfg, [entry(40, "S1")]) + monkeypatch.setattr(call_files, "call_hash", lambda *a, **k: "f" * 64) + write(workdir, cfg, [entry(41, "S2")]) + assert "dropped" in capsys.readouterr().err + + +def test_the_lock_is_held_while_the_file_is_written(cfg, workdir, monkeypatch): + seen = {} + original = call_files.write_atomic + lock_path = workdir / "status" / "calls" / f"{CALL}.json.lock" + + def probe(path, data): + with open(lock_path, "a") as other: + try: + fcntl.flock(other, fcntl.LOCK_EX | fcntl.LOCK_NB) + seen["blocked"] = False + fcntl.flock(other, fcntl.LOCK_UN) + except BlockingIOError: + seen["blocked"] = True + original(path, data) + + monkeypatch.setattr(call_files, "write_atomic", probe) + write(workdir, cfg, [entry()]) + assert seen == {"blocked": True} + with open(lock_path, "a") as after: # released afterwards + fcntl.flock(after, fcntl.LOCK_EX | fcntl.LOCK_NB) + + +@pytest.mark.parametrize( + "call", ["wall_family_domain", "cell_wall_adhesion_candidate", "other_not_surface", "nope"] +) +def test_ineligible_calls_are_refused(cfg, workdir, call): + with pytest.raises(ValueError, match="eligible|unknown call"): + write(workdir, cfg, [entry()], call=call) + + +def test_a_variant_for_a_plain_call_is_refused(cfg, workdir): + with pytest.raises(ValueError, match="variant"): + write(workdir, cfg, [entry()], variant="R0") + + +def test_an_entry_for_taxon_1_is_refused(cfg, workdir): + with pytest.raises(ValueError, match="taxa"): + write(workdir, cfg, [entry(1)]) + + +def test_a_missing_module_record_is_refused(cfg, workdir): + (workdir / "modules" / "repeat14.json").unlink() + with pytest.raises(ValueError, match="repeat14"): + write(workdir, cfg, [entry()]) + + +def test_an_invalid_update_leaves_the_existing_file_untouched(cfg, workdir): + path = write(workdir, cfg, [entry(40, "S1")]) + before = path.read_bytes() + with pytest.raises(ValueError): + write(workdir, cfg, [entry(1, "S9")]) + assert path.read_bytes() == before + + +@pytest.mark.parametrize("variant", ["R0", "../x", "a/b"]) +def test_a_bad_variant_is_refused_before_any_file_or_lock_is_made(cfg, workdir, variant): + with pytest.raises(ValueError, match="variant"): + write(workdir, cfg, [entry()], variant=variant) + assert not (workdir / "status").exists() diff --git a/tests/cellsurface_sorting_hat/calibration/test_truth_call_status.py b/tests/cellsurface_sorting_hat/calibration/test_truth_call_status.py new file mode 100644 index 0000000..7cfa977 --- /dev/null +++ b/tests/cellsurface_sorting_hat/calibration/test_truth_call_status.py @@ -0,0 +1,217 @@ +"""`calibrate truth --call-status`: a status for a call that reads several modules.""" + +import csv +import gzip +import json + +import pytest + +from cellsurface_sorting_hat.calibration.cli import main +from cellsurface_sorting_hat.call_status import CallStatusResolver, load_call_source +from cellsurface_sorting_hat.engine import load_config +from cellsurface_sorting_hat.modules.base import ModuleSpec, write_module +from cellsurface_sorting_hat.status import ModuleIdentity +from cellsurface_sorting_hat.taxonomy import Lineage + +CALL = "tandem_repeat_protein" +READS = ("repeat02", "repeat14") +NODE_ROWS = [(1, 1, "no rank"), (5052, 1, "genus"), (4932, 1, "species"), (9999, 4932, "strain")] + + +def write_nodes(tmp_path): + path = tmp_path / "nodes.dmp" + path.write_text("".join(f"{t}\t|\t{p}\t|\t{r}\t|\t\t|\n" for t, p, r in NODE_ROWS)) + return path + + +def write_run_json(folder, states=None, config_sha=None, drop=()): + """``run.json`` as a run writes it: module identities, run states and the config hash.""" + identities, found = [], {} + for p in sorted((folder / "modules").glob("*.json")): + rec = json.loads(p.read_text()) + found[rec["module"]] = rec.get("run_state", "ok") + identities.append( + { + "name": rec["module"], + "version": rec["version"], + "params_hash": rec["params_hash"], + "artefact_hash": rec["artefact_hash"], + } + ) + data = { + "module_identities": identities, + "module_states": {**found, **(states or {})}, + "config_sha256": config_sha or load_config().sha256, + } + for key in drop: + del data[key] + (folder / "run.json").write_text(json.dumps(data)) + + +def setup( + tmp_path, states=None, drop=(), config_sha=None, n_pos=20, n_neg=20, called_pos=12, called_neg=1 +): + for m in READS: + write_module(tmp_path, ModuleSpec(m, "1"), [], [{"id": "A", "state": "ok"}]) + ids = [f"P{k}" for k in range(n_pos)] + [f"N{k}" for k in range(n_neg)] + rows = [ + (f"P{k}", CALL, "", "called" if k < called_pos else "not_called") for k in range(n_pos) + ] + [(f"N{k}", CALL, "", "called" if k < called_neg else "not_called") for k in range(n_neg)] + write_run_json(tmp_path, states, config_sha, drop) + with gzip.open(tmp_path / "proteins.tsv.gz", "wt", newline="") as fh: + w = csv.writer(fh, delimiter="\t") + w.writerow( + ["id", "sha256", "taxon", "state", "note", "trailing_stop", "ambiguous_fraction"] + ) + for pid in ids: + w.writerow([pid, "x", 9999, "ok", "", 0, "0.0000"]) + with gzip.open(tmp_path / "c.tsv.gz", "wt", newline="") as fh: + w = csv.writer(fh, delimiter="\t") + w.writerow(["protein", "call", "variant", "value", "status", "status_basis", "other_basis"]) + for p, c, v, val in rows: + w.writerow([p, c, v, val, "unvalidated", "", ""]) + (tmp_path / "t.tsv").write_text( + "id\tlabel\tcluster\n" + + "".join(f"P{k}\t1\tp{k}\n" for k in range(n_pos)) + + "".join(f"N{k}\t0\tn{k}\n" for k in range(n_neg)) + ) + + +def args(tmp_path, *extra, call=CALL, taxa="4932", leakage="none", module_flag=("--call-status",)): + return [ + "truth", + "--workdir", + str(tmp_path), + *module_flag, + "--calls-long", + str(tmp_path / "c.tsv.gz"), + "--call", + call, + "--truth", + str(tmp_path / "t.tsv"), + "--calibration-set", + "toy", + "--nodes-dmp", + str(write_nodes(tmp_path)), + "--taxa", + *taxa.split(), + "--n-boot", + "200", + "--leakage", + leakage, + *extra, + ] + + +def call_file(tmp_path): + return tmp_path / "status" / "calls" / f"{CALL}.json" + + +def test_a_call_status_is_written_with_the_measured_rates_and_the_leakage_cap(tmp_path): + setup(tmp_path) + assert main(args(tmp_path, leakage="tuned_on_truth")) == 0 + cfg = load_config() + src = load_call_source(call_file(tmp_path), cfg) + entry = src.entries[0] + assert entry.taxa == (4932,) + assert entry.status == "smoke" # 20 positives would allow more; tuned_on_truth caps it + m = entry.measure + assert (m["n_pos"], m["n_neg"]) == (20, 20) + assert m["sensitivity"]["value"] == pytest.approx(12 / 20) + assert m["specificity"]["value"] == pytest.approx(19 / 20) + assert "call=tandem_repeat_protein" in m["notes"] and "reads=repeat02,repeat14" in m["notes"] + assert "leakage: tuned_on_truth" in m["notes"] + assert [r.name for r in src.reads] == list(READS) + + +def test_the_written_file_is_used_for_a_strain_of_the_tested_species(tmp_path): + setup(tmp_path) + assert main(args(tmp_path, leakage="tuned_on_truth")) == 0 + cfg = load_config() + ids = {m: ModuleIdentity(m, "1", *_hashes(tmp_path, m)) for m in READS} + lineage = Lineage({1: 1, 4932: 1, 9999: 4932, 5052: 1}) + r = CallStatusResolver(tmp_path, cfg, ids, dict.fromkeys(READS, "ok"), cfg.sha256, lineage) + assert r(CALL, "", 9999) == ("smoke", "call:tandem_repeat_protein:taxon:4932") + assert r(CALL, "", 5052) is None + + +def _hashes(tmp_path, module): + rec = json.loads((tmp_path / "modules" / f"{module}.json").read_text()) + return rec["params_hash"], rec["artefact_hash"] + + +@pytest.mark.parametrize("state", ["unavailable", "partial", "error", "not_run"]) +def test_a_read_module_that_is_not_ok_is_refused(tmp_path, capsys, state): + setup(tmp_path, states={"repeat14": state}) + assert main(args(tmp_path)) == 2 + err = capsys.readouterr().err + assert "repeat14" in err and state in err + assert not call_file(tmp_path).exists() + + +def test_a_run_json_without_module_states_is_refused(tmp_path, capsys): + setup(tmp_path, drop=("module_states",)) + assert main(args(tmp_path)) == 2 + assert "module_states" in capsys.readouterr().err + + +def test_a_run_json_without_a_config_hash_is_refused(tmp_path, capsys): + setup(tmp_path, drop=("config_sha256",)) + assert main(args(tmp_path)) == 2 + assert "config_sha256" in capsys.readouterr().err + + +def test_a_run_made_with_another_config_is_refused(tmp_path, capsys): + setup(tmp_path, config_sha="e" * 64) + assert main(args(tmp_path)) == 2 + assert "config" in capsys.readouterr().err + assert not call_file(tmp_path).exists() + + +def test_a_module_record_that_changed_after_the_run_is_refused(tmp_path, capsys): + setup(tmp_path) + record = tmp_path / "modules" / "repeat02.json" + data = json.loads(record.read_text()) + data["version"] = "2" + record.write_text(json.dumps(data)) + assert main(args(tmp_path)) == 2 + assert "repeat02" in capsys.readouterr().err + + +def test_a_genus_taxon_is_refused(tmp_path, capsys): + setup(tmp_path) + assert main(args(tmp_path, taxa="5052")) == 2 + assert "taxon" in capsys.readouterr().err + assert not call_file(tmp_path).exists() + + +@pytest.mark.parametrize( + "call", + [ + "wall_family_domain", + "signal_peptide_protein", + "cell_wall_adhesion_candidate", + "other_not_surface", + ], +) +def test_calls_that_cannot_have_a_call_file_are_refused(tmp_path, capsys, call): + setup(tmp_path) + assert main(args(tmp_path, call=call)) == 2 + assert "eligible" in capsys.readouterr().err + assert not call_file(tmp_path).exists() + + +def test_exactly_one_of_module_and_call_status_is_required(tmp_path): + setup(tmp_path) + with pytest.raises(SystemExit) as err: + main(args(tmp_path, module_flag=())) + assert err.value.code == 2 + with pytest.raises(SystemExit) as err: + main(args(tmp_path, module_flag=("--call-status", "--module", "repeat02"))) + assert err.value.code == 2 + + +def test_the_module_path_still_refuses_a_call_that_reads_several_modules(tmp_path, capsys): + setup(tmp_path) + assert main(args(tmp_path, module_flag=("--module", "repeat02"))) == 2 + assert "reads 2 modules" in capsys.readouterr().err diff --git a/tests/cellsurface_sorting_hat/golden/calls.long.expected.tsv b/tests/cellsurface_sorting_hat/golden/calls.long.expected.tsv new file mode 100644 index 0000000..7a3bc0d --- /dev/null +++ b/tests/cellsurface_sorting_hat/golden/calls.long.expected.tsv @@ -0,0 +1,51 @@ +protein call variant value status status_basis other_basis +SOW1 signal_peptide_protein R0 called unvalidated step1_rule@R0:taxon not tested +SOW1 tandem_repeat_protein called unvalidated repeat02:no status_source +SOW1 wall_family_domain not_called unvalidated pfam_adhesion:no status_source +SOW1 cell_wall_adhesion_candidate R0 called unvalidated repeat02:no status_source;step1_rule@R0:taxon not tested +SOW1 cocci_specificity_rank_top15 called unvalidated antigen_lookup:no status_source +SOW1 serodiagnostic_marker_candidate R0 called unvalidated antigen_lookup:no status_source;step1_rule@R0:taxon not tested +SOW1 iuis_allergen_similarity not_called unvalidated allergen_homology:no status_source +SOW1 iuis_allergen_homolog not_called unvalidated allergen_homology:no status_source;pfam_allergen:no status_source +SOW1 other_not_surface R0 not_called unvalidated step1_rule@R0:taxon not tested +SOW1 other_surface_no_mechanism R0 not_called unvalidated antigen_lookup:no status_source;repeat02:no status_source +ENZ1 signal_peptide_protein R0 not_called estimated step1_rule@R0:taxon:40 +ENZ1 tandem_repeat_protein not_called unvalidated repeat02:no status_source;repeat14:no status_source +ENZ1 wall_family_domain not_called unvalidated pfam_adhesion:no status_source +ENZ1 cell_wall_adhesion_candidate R0 not_called unvalidated pfam_adhesion:no status_source;repeat02:no status_source;repeat14:no status_source;step1_rule@R0:taxon:40 +ENZ1 cocci_specificity_rank_top15 not_assessable unvalidated +ENZ1 serodiagnostic_marker_candidate R0 not_called estimated step1_rule@R0:taxon:40 +ENZ1 iuis_allergen_similarity called unvalidated allergen_homology:no status_source +ENZ1 iuis_allergen_homolog called unvalidated allergen_homology:no status_source +ENZ1 other_not_surface R0 called unvalidated pfam_adhesion:no status_source;repeat02:no status_source;repeat14:no status_source;step1_rule@R0:taxon:40 cocci_specificity_rank_top15 +ENZ1 other_surface_no_mechanism R0 not_called estimated step1_rule@R0:taxon:40 +DUP1 signal_peptide_protein R0 called unvalidated step1_rule@R0:taxon not tested +DUP1 tandem_repeat_protein called unvalidated repeat02:no status_source +DUP1 wall_family_domain not_called unvalidated pfam_adhesion:no status_source +DUP1 cell_wall_adhesion_candidate R0 called unvalidated repeat02:no status_source;step1_rule@R0:taxon not tested +DUP1 cocci_specificity_rank_top15 called unvalidated antigen_lookup:no status_source +DUP1 serodiagnostic_marker_candidate R0 called unvalidated antigen_lookup:no status_source;step1_rule@R0:taxon not tested +DUP1 iuis_allergen_similarity not_called unvalidated allergen_homology:no status_source +DUP1 iuis_allergen_homolog not_called unvalidated allergen_homology:no status_source;pfam_allergen:no status_source +DUP1 other_not_surface R0 not_called unvalidated step1_rule@R0:taxon not tested +DUP1 other_surface_no_mechanism R0 not_called unvalidated antigen_lookup:no status_source;repeat02:no status_source +BAD1 signal_peptide_protein R0 not_assessable unvalidated +BAD1 tandem_repeat_protein not_assessable unvalidated +BAD1 wall_family_domain not_assessable unvalidated +BAD1 cell_wall_adhesion_candidate R0 not_assessable unvalidated +BAD1 cocci_specificity_rank_top15 not_assessable unvalidated +BAD1 serodiagnostic_marker_candidate R0 not_assessable unvalidated +BAD1 iuis_allergen_similarity not_assessable unvalidated +BAD1 iuis_allergen_homolog not_assessable unvalidated +BAD1 other_not_surface R0 not_assessable unvalidated +BAD1 other_surface_no_mechanism R0 not_assessable unvalidated +STAR1 signal_peptide_protein R0 called estimated step1_rule@R0:taxon:40 +STAR1 tandem_repeat_protein not_called unvalidated repeat02:no status_source;repeat14:no status_source +STAR1 wall_family_domain not_called unvalidated pfam_adhesion:no status_source +STAR1 cell_wall_adhesion_candidate R0 not_called unvalidated pfam_adhesion:no status_source;repeat02:no status_source;repeat14:no status_source +STAR1 cocci_specificity_rank_top15 not_assessable unvalidated +STAR1 serodiagnostic_marker_candidate R0 not_assessable unvalidated +STAR1 iuis_allergen_similarity called unvalidated allergen_homology:no status_source +STAR1 iuis_allergen_homolog not_called unvalidated allergen_homology:no status_source;pfam_allergen:no status_source +STAR1 other_not_surface R0 not_called estimated step1_rule@R0:taxon:40 +STAR1 other_surface_no_mechanism R0 called unvalidated pfam_adhesion:no status_source;repeat02:no status_source;repeat14:no status_source;step1_rule@R0:taxon:40 cocci_specificity_rank_top15 diff --git a/tests/cellsurface_sorting_hat/golden/report.expected.md b/tests/cellsurface_sorting_hat/golden/report.expected.md new file mode 100644 index 0000000..8237b95 --- /dev/null +++ b/tests/cellsurface_sorting_hat/golden/report.expected.md @@ -0,0 +1,89 @@ +# cellsurface_sorting_hat report + +- proteins: 5 (1 invalid, excluded from all modules; 1 had a trailing `*`, removed) +- taxa (taxon ID: proteins): 40: 3, 41: 2 +- taxonomy file sha256: 492f746e8af7ed537fe0bcf4920a583e583410d1ebf5b12cd6c1284e44d474df +- categories.yaml sha256: f97cb08508c13100cded294a41d86940d3907419f7d59d76f49bbcc278a08ade +- default gate: step1_rule@R0 +- thresholds: allergen_coverage_min = 80, allergen_hit_identity_min = 35, allergen_hit_length_min = 80, allergen_identity_min = 70, antigen_percentile_max = 15 + +## Invalid proteins + +- BAD1: internal stop codon + +## Module run states + +| module | run state | +|---|---| +| allergen_homology | ok | +| antigen_lookup | ok | +| pfam_adhesion | ok | +| pfam_allergen | ok | +| repeat02 | ok | +| repeat14 | ok | +| step1_rule@R0 | ok | + +Unavailable step 1 variants: step1_rule@R1, step1_rule@R2, step1_ml@card + +## Proteins that are not `ok` in a module + +| module | state | proteins | +|---|---|---| +| allergen_homology | na_invalid | 1 | +| antigen_lookup | na_invalid | 1 | +| antigen_lookup | not_applicable | 2 | +| pfam_adhesion | na_invalid | 1 | +| pfam_allergen | na_invalid | 1 | +| repeat02 | na_invalid | 1 | +| repeat14 | na_invalid | 1 | +| step1_rule@R0 | na_invalid | 1 | + +## Module calibration + +| module | taxon | status | measured on call | calibration set | positives | negatives | sensitivity [95% CI] | specificity [95% CI] | +|---|---|---|---|---|---|---|---|---| +| allergen_homology | 40 | unvalidated | - | - | - | - | not measured | not measured | +| allergen_homology | 41 | unvalidated | - | - | - | - | not measured | not measured | +| antigen_lookup | 40 | unvalidated | - | - | - | - | not measured | not measured | +| antigen_lookup | 41 | unvalidated | - | - | - | - | not measured | not measured | +| pfam_adhesion | 40 | unvalidated | - | - | - | - | not measured | not measured | +| pfam_adhesion | 41 | unvalidated | - | - | - | - | not measured | not measured | +| pfam_allergen | 40 | unvalidated | - | - | - | - | not measured | not measured | +| pfam_allergen | 41 | unvalidated | - | - | - | - | not measured | not measured | +| repeat02 | 40 | unvalidated | - | - | - | - | not measured | not measured | +| repeat02 | 41 | unvalidated | - | - | - | - | not measured | not measured | +| repeat14 | 40 | unvalidated | - | - | - | - | not measured | not measured | +| repeat14 | 41 | unvalidated | - | - | - | - | not measured | not measured | +| step1_rule@R0 | 40 | estimated | - | - | - | - | not measured | not measured | +| step1_rule@R0 | 41 | unvalidated | - | - | - | - | not measured | not measured | + +## Calls + +| call | variant | called | not_called | not_assessable | +|---|---|---|---|---| +| cell_wall_adhesion_candidate | R0 | 2 | 2 | 1 | +| cocci_specificity_rank_top15 | - | 2 | 0 | 3 | +| iuis_allergen_homolog | - | 1 | 3 | 1 | +| iuis_allergen_similarity | - | 2 | 2 | 1 | +| other_not_surface | R0 | 1 | 3 | 1 | +| other_surface_no_mechanism | R0 | 1 | 3 | 1 | +| serodiagnostic_marker_candidate | R0 | 2 | 1 | 2 | +| signal_peptide_protein | R0 | 3 | 1 | 1 | +| tandem_repeat_protein | - | 2 | 2 | 1 | +| wall_family_domain | - | 0 | 4 | 1 | + +## `other_basis` (categories left out because they were not assessable) + +- cocci_specificity_rank_top15: 2 + +## Known limits + +1. Research use only. This is not a regulatory allergenicity assessment and not a diagnostic result. No row is supported by an IgE, antibody or T-cell measurement. +2. `signal_peptide_protein` means that SignalP calls a signal peptide (rule R0) and nothing more. Such proteins are secreted, wall-bound or GPI-anchored. They are not shown to be exposed at the cell surface, and glycosylation is not assessed. Plasma membrane mucins can be missed. +3. GPI-anchored and secreted enzymes, and non-adhesive structural wall proteins, get no finer label in version 1. There is no `cell_wall_protein` call. +4. `tandem_repeat_protein` and `wall_family_domain` are evidence. Repeat proteins include intracellular ones (ubiquitin, calmodulin, ankyrin proteins). A domain of a family that is linked to adhesion or wall function in at least one species (CFEM, Bys1, hydrophobin, Als) is not shown to mediate adhesion here. The adhesion call needs a signal peptide. +5. `cocci_specificity_rank_top15` is the top 15% of a fixed Coccidioides immitis ranking (similarity to IEDB antigens, prevalence, absence of orthologs in confounder fungi). It is not epitope prediction. The cut was set after the four anchors were seen. The ranking prints NOT CALIBRATED. `serodiagnostic_marker_candidate` adds a signal peptide. Peptide level only; glycan epitopes are not assessed. +6. `iuis_allergen_similarity` and `iuis_allergen_homolog` are sequence similarity to allergens in the WHO/IUIS fungal set (IgE binding in patients). They suggest possible IgE cross-reactivity at most. A protein with no hit is not thereby a non-allergen. WHO/IUIS lists no Coccidioides allergen. +7. Cell wall integrity signaling, septation, polarized growth, polysaccharide chemistry, non-protein adhesins, moonlighting proteins and biofilm are not categories. +8. The taxon you give is recorded as given. It is not checked against the sequences. +9. Leakage: overlap between the Phase C positives and the SignalP 6 training data was not measured. The status of rule R0 does not account for it. diff --git a/tests/cellsurface_sorting_hat/test_call_helpers.py b/tests/cellsurface_sorting_hat/test_call_helpers.py new file mode 100644 index 0000000..bc33125 --- /dev/null +++ b/tests/cellsurface_sorting_hat/test_call_helpers.py @@ -0,0 +1,138 @@ +"""Call helpers of the engine: the modules a call reads, eligibility for a call status file, call_hash.""" + +import copy + +import pytest +import yaml + +from cellsurface_sorting_hat import engine +from cellsurface_sorting_hat.engine import ( + call_eligible, + call_hash, + load_config, + reads_of_call, +) + + +def _custom(tmp_path, mutate): + """The packaged config, changed by ``mutate(data)``, written to tmp_path and loaded.""" + data = yaml.safe_load(open(engine.__file__.replace("engine.py", "categories.yaml"))) + data = copy.deepcopy(data) + mutate(data) + path = tmp_path / "categories.yaml" + path.write_text(yaml.safe_dump(data, sort_keys=False)) + return load_config(path) + + +def test_reads_of_the_two_multi_module_calls(): + cfg = load_config() + assert reads_of_call(cfg, "tandem_repeat_protein") == ["repeat02", "repeat14"] + assert reads_of_call(cfg, "iuis_allergen_homolog") == ["allergen_homology", "pfam_allergen"] + + +def test_reads_of_a_per_variant_call_with_a_variant_keeps_only_that_variant(): + cfg = load_config() + assert reads_of_call(cfg, "signal_peptide_protein", "R0") == ["step1_rule@R0"] + assert len(reads_of_call(cfg, "signal_peptide_protein")) == 4 # no variant: every step 1 module + + +@pytest.mark.parametrize( + ("call", "ok", "reason"), + [ + ("tandem_repeat_protein", True, ""), + ("iuis_allergen_homolog", True, ""), + ("cell_wall_adhesion_candidate", False, "contains ref"), + ("other_not_surface", False, "kind other"), + ("signal_peptide_protein", False, "reads fewer than two modules"), + ("wall_family_domain", False, "reads fewer than two modules"), + ("no_such_call", False, "unknown call"), + ], +) +def test_call_eligible_for_the_packaged_calls(call, ok, reason): + assert call_eligible(load_config(), call) == (ok, reason) + + +def test_a_per_variant_call_with_step1_and_one_more_module_is_eligible(tmp_path): + def mutate(d): + d["calls"].append( + { + "name": "gated_pair", + "per_variant": True, + "expr": {"and": [{"call": "{step1}"}, {"call": "repeat02"}]}, + } + ) + + cfg = _custom(tmp_path, mutate) + assert call_eligible(cfg, "gated_pair") == (True, "") + + +def test_a_call_that_names_a_step1_module_literally_is_not_eligible(tmp_path): + def mutate(d): + d["calls"].append( + { + "name": "literal_pair", + "expr": {"or": [{"call": "step1_rule@R0"}, {"call": "repeat02"}]}, + } + ) + + cfg = _custom(tmp_path, mutate) + assert call_eligible(cfg, "literal_pair") == (False, "literal step1 module") + + +def test_a_two_module_call_with_a_ref_is_not_eligible(tmp_path): + def mutate(d): + d["calls"].append( + { + "name": "ref_pair", + "expr": {"or": [{"ref": "tandem_repeat_protein"}, {"call": "pfam_allergen"}]}, + } + ) + + cfg = _custom(tmp_path, mutate) + assert call_eligible(cfg, "ref_pair") == (False, "contains ref") + + +def test_call_hash_is_stable(): + cfg = load_config() + assert call_hash(cfg, "tandem_repeat_protein") == call_hash(cfg, "tandem_repeat_protein") + assert len(call_hash(cfg, "tandem_repeat_protein")) == 64 + + +def test_call_hash_changes_with_a_referenced_threshold_only(tmp_path): + base = call_hash(load_config(), "iuis_allergen_homolog") + changed = _custom(tmp_path, lambda d: d["thresholds"].update(allergen_identity_min=71)) + assert call_hash(changed, "iuis_allergen_homolog") != base + other = _custom(tmp_path, lambda d: d["thresholds"].update(antigen_percentile_max=10)) + assert call_hash(other, "iuis_allergen_homolog") == base + + +def test_call_hash_changes_with_the_engine_semantics(monkeypatch): + cfg = load_config() + before = call_hash(cfg, "tandem_repeat_protein") + monkeypatch.setattr(engine, "ENGINE_SEMANTICS", "2") + assert call_hash(cfg, "tandem_repeat_protein") != before + + +def test_call_hash_changes_with_the_expression(tmp_path): + base = call_hash(load_config(), "tandem_repeat_protein") + + def mutate(d): + for c in d["calls"]: + if c["name"] == "tandem_repeat_protein": + c["expr"] = {"and": c["expr"]["or"]} + + assert call_hash(_custom(tmp_path, mutate), "tandem_repeat_protein") != base + + +def test_call_hash_differs_between_variants_of_a_per_variant_call(tmp_path): + def mutate(d): + d["calls"].append( + { + "name": "gated_pair", + "per_variant": True, + "expr": {"and": [{"call": "{step1}"}, {"call": "repeat02"}]}, + } + ) + + cfg = _custom(tmp_path, mutate) + assert call_hash(cfg, "gated_pair", "R0") != call_hash(cfg, "gated_pair", "R2") diff --git a/tests/cellsurface_sorting_hat/test_call_status.py b/tests/cellsurface_sorting_hat/test_call_status.py new file mode 100644 index 0000000..d0766af --- /dev/null +++ b/tests/cellsurface_sorting_hat/test_call_status.py @@ -0,0 +1,313 @@ +"""Call status files: loader, validity against a run, resolver (lineage, stale reasons).""" + +import json + +import pytest + +from cellsurface_sorting_hat.call_status import ( + CallStatusError, + CallStatusResolver, + call_file_name, + load_call_source, + stale_reason, +) +from cellsurface_sorting_hat.engine import call_hash, load_config, reads_of_call +from cellsurface_sorting_hat.status import ModuleIdentity +from cellsurface_sorting_hat.taxonomy import Lineage + +CALL = "tandem_repeat_protein" +# 1 root, 10 fungi, 20 class, 40 species, 400 strain below it, 41 another species, 401 strain of 41 +LINEAGE = Lineage({1: 1, 10: 1, 20: 10, 40: 20, 400: 40, 41: 20, 401: 41}) +CFG_SHA = "c" * 64 + + +def measure(n_pos=10, notes="call=tandem_repeat_protein; leakage: none"): + return { + "calibration_set": "S1", + "truth_source": "truth.tsv", + "n_pos": n_pos, + "n_neg": 30, + "n_clusters_pos": 8, + "n_clusters_neg": 25, + "sensitivity": {"value": 0.5, "lo": 0.3, "hi": 0.7}, + "specificity": {"value": 0.97, "lo": 0.9, "hi": 1.0}, + "notes": notes, + } + + +def entry(taxa=(40,), status="smoke", **kw): + return {"taxa": list(taxa), "status": status, "source": "truth.tsv", "measure": measure(**kw)} + + +def identities(cfg, call=CALL, **changes): + out = {} + for m in reads_of_call(cfg, call): + fields = {"version": "1", "params_hash": "p", "artefact_hash": "a"} + fields.update(changes.get(m, {})) + out[m] = ModuleIdentity(m, **fields) + return out + + +def payload(cfg, call=CALL, variant="", entries=None, **over): + data = { + "call": call, + "variant": variant, + "config_sha256": CFG_SHA, + "call_hash": call_hash(cfg, call, variant), + "reads": [ + {"name": m, "version": "1", "params_hash": "p", "artefact_hash": "a"} + for m in reads_of_call(cfg, call, variant) + ], + "entries": entries if entries is not None else [entry()], + } + data.update(over) + return data + + +def write(tmp_path, data, name=None): + folder = tmp_path / "status" / "calls" + folder.mkdir(parents=True, exist_ok=True) + path = folder / (name or call_file_name(data["call"], data["variant"])) + path.write_text(json.dumps(data)) + return path + + +@pytest.fixture +def cfg(): + return load_config() + + +def states(cfg, call=CALL, **over): + out = dict.fromkeys(reads_of_call(cfg, call), "ok") + out.update(over) + return out + + +def test_a_valid_file_loads(cfg, tmp_path): + src = load_call_source(write(tmp_path, payload(cfg)), cfg) + assert (src.call, src.variant) == (CALL, "") + assert [e.status for e in src.entries] == ["smoke"] + assert [r.name for r in src.reads] == ["repeat02", "repeat14"] + + +def renamed(cfg, call, variant=""): + """A valid payload for the repeat call whose call and variant fields are changed (the helpers + cannot hash an unknown, `other` or single-module call).""" + data = payload(cfg) + data.update(call=call, variant=variant) + return data + + +def bad_entry(**changes): + e = entry() + e.update(changes) + return e + + +@pytest.mark.parametrize( + ("label", "build", "needle"), + [ + ( + "no measure", + lambda cfg: payload(cfg, entries=[{"taxa": [40], "status": "smoke"}]), + "measure", + ), + ( + "estimated without room", + lambda cfg: payload(cfg, entries=[bad_entry(status="estimated")]), + "stronger", + ), + ("taxon 1", lambda cfg: payload(cfg, entries=[bad_entry(taxa=[1])]), "taxa"), + ("taxon 0", lambda cfg: payload(cfg, entries=[bad_entry(taxa=[0])]), "taxa"), + ("duplicate taxon", lambda cfg: payload(cfg, entries=[entry((40,)), entry((40,))]), "40"), + ("unknown call", lambda cfg: renamed(cfg, "nope"), "unknown call"), + ("single-module call", lambda cfg: renamed(cfg, "wall_family_domain"), "not eligible"), + ( + "composite call", + lambda cfg: renamed(cfg, "cell_wall_adhesion_candidate"), + "not eligible", + ), + ("other call", lambda cfg: renamed(cfg, "other_not_surface"), "not eligible"), + ("variant for a plain call", lambda cfg: renamed(cfg, CALL, "R0"), "variant"), + ("unknown key", lambda cfg: payload(cfg, extra=1), "extra"), + ], +) +def test_loader_refusals(cfg, tmp_path, label, build, needle): + data = build(cfg) + path = write(tmp_path, data, call_file_name(data["call"], data["variant"])) + with pytest.raises(ValueError, match=needle): + load_call_source(path, cfg) + + +def test_loader_refuses_a_file_whose_name_differs_from_its_content(cfg, tmp_path): + path = write(tmp_path, payload(cfg), name="iuis_allergen_homolog.json") + with pytest.raises(ValueError, match="file name"): + load_call_source(path, cfg) + + +def test_loader_needs_the_leakage_note(cfg, tmp_path): + e = entry() + e["measure"]["notes"] = "call=tandem_repeat_protein" + with pytest.raises(ValueError, match="leakage"): + load_call_source(write(tmp_path, payload(cfg, entries=[e])), cfg) + + +def test_leakage_other_than_none_caps_the_status_at_smoke(cfg, tmp_path): + big = measure() + big.update(n_pos=40, n_neg=40, n_clusters_pos=30, n_clusters_neg=30) + big["sensitivity"] = {"value": 0.9, "lo": 0.85, "hi": 0.95} + big["notes"] = "call=tandem_repeat_protein; leakage: tuned_on_truth" + e = {"taxa": [40], "status": "estimated", "source": "t", "measure": big} + with pytest.raises(ValueError, match="leakage"): + load_call_source(write(tmp_path, payload(cfg, entries=[e])), cfg) + big["notes"] = "call=tandem_repeat_protein; leakage: none" + assert ( + load_call_source(write(tmp_path, payload(cfg, entries=[e])), cfg).entries[0].status + == "estimated" + ) + + +def test_a_hand_edit_that_raises_smoke_to_estimated_is_refused(cfg, tmp_path): + data = payload(cfg) + data["entries"][0]["status"] = "estimated" + with pytest.raises(ValueError, match="stronger"): + load_call_source(write(tmp_path, data), cfg) + + +def _stale(cfg, tmp_path, ids=None, st=None, sha=CFG_SHA, data=None): + src = load_call_source(write(tmp_path, data or payload(cfg)), cfg) + return stale_reason(src, cfg, ids or identities(cfg), st or states(cfg), sha) + + +def test_a_file_that_matches_the_run_is_not_stale(cfg, tmp_path): + assert _stale(cfg, tmp_path) == "" + + +def test_a_changed_config_makes_the_file_stale(cfg, tmp_path): + assert _stale(cfg, tmp_path, sha="d" * 64) == "config differs" + + +def test_reads_that_differ_from_the_modules_now_read_make_the_file_stale(cfg, tmp_path): + data = payload(cfg) + data["reads"] = data["reads"][:1] + assert _stale(cfg, tmp_path, data=data) == "reads differ" + + +def test_a_module_without_a_run_record_makes_the_file_stale(cfg, tmp_path): + ids = identities(cfg) + del ids["repeat14"] + assert _stale(cfg, tmp_path, ids=ids) == "no module run record: repeat14" + + +@pytest.mark.parametrize("state", ["unavailable", "error", "not_run", "partial", "missing"]) +def test_a_module_that_is_not_ok_makes_the_file_stale(cfg, tmp_path, state): + st = states(cfg) + if state == "missing": + del st["repeat14"] + else: + st["repeat14"] = state + assert _stale(cfg, tmp_path, st=st) == f"module state not ok: repeat14 ({state})" + + +@pytest.mark.parametrize("field", ["version", "params_hash", "artefact_hash"]) +def test_a_changed_module_identity_makes_the_file_stale(cfg, tmp_path, field): + ids = identities(cfg, repeat02={field: "other"}) + assert _stale(cfg, tmp_path, ids=ids) == "identity differs: repeat02" + + +def test_a_changed_call_hash_makes_the_file_stale(cfg, tmp_path): + data = payload(cfg, call_hash="0" * 64) + assert _stale(cfg, tmp_path, data=data) == "call_hash differs" + + +def resolver(cfg, tmp_path, **kw): + return CallStatusResolver( + tmp_path, + cfg, + kw.get("ids") or identities(cfg), + kw.get("st") or states(cfg), + kw.get("sha", CFG_SHA), + LINEAGE, + ) + + +def test_resolver_lineage(cfg, tmp_path): + write(tmp_path, payload(cfg, entries=[entry((40,))])) + r = resolver(cfg, tmp_path) + assert r(CALL, "", 40) == ("smoke", "call:tandem_repeat_protein:taxon:40") + assert r(CALL, "", 400) == ("smoke", "call:tandem_repeat_protein:taxon:40") # strain below it + assert r(CALL, "", 41) is None # sibling species + assert r(CALL, "", 401) is None # strain of the sibling + assert r(CALL, "", 20) is None # an ancestor of the tested species + + +def test_the_most_specific_tested_taxon_wins(cfg, tmp_path): + e_species = entry((40,), n_pos=10) + e_strain = entry((400,), n_pos=0, notes="call=tandem_repeat_protein; leakage: none") + e_strain["status"] = "unvalidated" + e_strain["measure"]["sensitivity"] = None + del e_strain["measure"]["sensitivity"] + write(tmp_path, payload(cfg, entries=[e_species, e_strain])) + assert resolver(cfg, tmp_path)(CALL, "", 400)[0] == "unvalidated" + assert resolver(cfg, tmp_path)(CALL, "", 40)[0] == "smoke" + + +def test_no_file_gives_none(cfg, tmp_path): + assert resolver(cfg, tmp_path)(CALL, "", 40) is None + + +def test_a_stale_file_gives_the_reason_and_no_status(cfg, tmp_path): + write(tmp_path, payload(cfg)) + r = resolver(cfg, tmp_path, ids=identities(cfg, repeat02={"version": "2"})) + assert r(CALL, "", 40) == (None, "identity differs: repeat02") + + +def test_a_malformed_file_stops_the_resolver_and_names_the_file(cfg, tmp_path): + folder = tmp_path / "status" / "calls" + folder.mkdir(parents=True) + (folder / "tandem_repeat_protein.json").write_text("{not json") + with pytest.raises(CallStatusError, match="tandem_repeat_protein.json"): + resolver(cfg, tmp_path) + + +def test_an_orphan_file_for_a_call_that_is_not_in_the_config_stops_the_resolver(cfg, tmp_path): + write(tmp_path, renamed(cfg, "gone"), name="gone.json") + with pytest.raises(CallStatusError, match="gone.json"): + resolver(cfg, tmp_path) + + +def test_rows_describe_valid_and_stale_files(cfg, tmp_path): + write(tmp_path, payload(cfg, entries=[entry((40,), n_pos=10)])) + rows = resolver(cfg, tmp_path).rows() + assert [(r["call"], r["taxon"], r["status"], r["valid"]) for r in rows] == [ + (CALL, 40, "smoke", True) + ] + assert rows[0]["calibration_set"] == "S1" and rows[0]["n_pos"] == 10 + stale = resolver(cfg, tmp_path, st=states(cfg, repeat14="unavailable")).rows() + assert stale[0]["valid"] is False and "module state not ok" in stale[0]["reason"] + + +def test_a_renamed_read_with_the_same_count_is_stale_not_an_error(cfg, tmp_path): + data = payload(cfg) + data["reads"][1]["name"] = "repeat99" + assert _stale(cfg, tmp_path, data=data) == "reads differ" + + +def test_check_variant_follows_the_call(cfg): + from cellsurface_sorting_hat.call_status import check_variant + + check_variant(cfg, CALL, "") + with pytest.raises(ValueError, match="no variants"): + check_variant(cfg, CALL, "R0") + with pytest.raises(ValueError, match="variant must be one of"): + check_variant(cfg, "signal_peptide_protein", "") + with pytest.raises(ValueError, match="variant must be one of"): + check_variant(cfg, "signal_peptide_protein", "../x") + check_variant(cfg, "signal_peptide_protein", "R0") + + +def test_a_structural_refusal_names_the_file_once(cfg, tmp_path): + write(tmp_path, renamed(cfg, "gone"), name="gone.json") + with pytest.raises(CallStatusError) as err: + resolver(cfg, tmp_path) + assert str(err.value).count("gone.json") == 1 diff --git a/tests/cellsurface_sorting_hat/test_cli.py b/tests/cellsurface_sorting_hat/test_cli.py index 3c2b157..466e034 100644 --- a/tests/cellsurface_sorting_hat/test_cli.py +++ b/tests/cellsurface_sorting_hat/test_cli.py @@ -3,6 +3,8 @@ import csv import gzip import json +import os +from pathlib import Path import pytest @@ -905,3 +907,167 @@ def test_a_legacy_entry_without_call_in_its_notes_keeps_its_status( code, out = _run(tmp_path, nodes_dmp, fasta, taxon_map, wd) assert code == 0 assert read_long(out)[("ENZ1", "signal_peptide_protein", "R0")]["status"] == "estimated" + + +GOLDEN = Path(__file__).parent / "golden" + + +def _golden_texts(out): + """The decompressed calls.long text and the report without the installed-version line.""" + with gzip.open(out / "calls.long.tsv.gz", "rt") as fh: + long_text = fh.read() + report = "".join( + line + for line in (out / "report.md").read_text().splitlines(keepends=True) + if not line.startswith("- version:") + ) + return long_text, report + + +def test_run_output_is_pinned(tmp_path, write_module, nodes_dmp): + """The whole output of the toy run, taken from the engine before call status files existed. + + A change here is a change in what every run reports. Regenerate on purpose only: + UPDATE_GOLDEN=1 pytest tests/cellsurface_sorting_hat/test_cli.py -k pinned + """ + code, out, _ = run_cli(tmp_path, write_module, nodes_dmp) + assert code == 0 + long_text, report = _golden_texts(out) + if os.environ.get("UPDATE_GOLDEN") == "1": + (GOLDEN / "calls.long.expected.tsv").write_text(long_text) + (GOLDEN / "report.expected.md").write_text(report) + assert long_text == (GOLDEN / "calls.long.expected.tsv").read_text() + assert report == (GOLDEN / "report.expected.md").read_text() + + +# ---- call status files ----------------------------------------------------------------------------- + +REPEAT = "tandem_repeat_protein" + + +def _call_measure(calibration_set="S1"): + return { + "calibration_set": calibration_set, + "truth_source": "truth.tsv", + "n_pos": 10, + "n_neg": 30, + "n_clusters_pos": 8, + "n_clusters_neg": 25, + "sensitivity": {"value": 0.5, "lo": 0.3, "hi": 0.7}, + "specificity": {"value": 0.97, "lo": 0.9, "hi": 1.0}, + "notes": f"call={REPEAT}; leakage: none", + } + + +def _write_call_file(wd, taxon=40): + from cellsurface_sorting_hat.calibration.call_files import write_call_status + from cellsurface_sorting_hat.calibration.measure import make_entry + from cellsurface_sorting_hat.engine import load_config + + cfg = load_config() + entry = make_entry([taxon], _call_measure(), source="truth.tsv") + return write_call_status(wd, cfg, REPEAT, "", cfg.sha256, [entry]) + + +def _run_with_call_file(tmp_path, write_module, nodes_dmp, before=None): + fasta, taxon_map, wd = build(tmp_path, write_module) + _write_call_file(wd) + if before: + before(wd) + out = tmp_path / "out" + argv = ["--fasta", str(fasta), "--taxon-map", str(taxon_map), "--taxdump", str(nodes_dmp)] + argv += ["--workdir", str(wd), "--out", str(out)] + return main(argv), out, wd + + +def test_a_call_status_file_sets_the_status_of_its_call(tmp_path, write_module, nodes_dmp): + code, out, _ = _run_with_call_file(tmp_path, write_module, nodes_dmp) + assert code == 0 + got = read_long(out) + for pid in ("ENZ1", "STAR1"): # taxon 40: tested + r = got[(pid, REPEAT, "")] + assert (r["status"], r["status_basis"]) == ("smoke", "call:tandem_repeat_protein:taxon:40") + assert got[("SOW1", REPEAT, "")]["status"] == "unvalidated" # taxon 41: not tested + # other calls are unchanged + assert got[("ENZ1", "signal_peptide_protein", "R0")]["status"] == "estimated" + run = json.loads((out / "run.json").read_text()) + rows = run["call_status_sources"] + assert [(r["call"], r["taxon"], r["status"], r["valid"]) for r in rows] == [ + (REPEAT, 40, "smoke", True) + ] + report = (out / "report.md").read_text() + assert "## Call calibration" in report + assert "derived" in report # the note on composite statuses + assert "| validity |" in report and "| valid |" in report + + +def test_a_stale_call_file_is_reported_and_not_used(tmp_path, write_module, nodes_dmp): + def bump_repeat14(wd): + meta = json.loads((wd / "modules" / "repeat14.json").read_text()) + meta["version"] = "2" + (wd / "modules" / "repeat14.json").write_text(json.dumps(meta)) + + code, out, _ = _run_with_call_file(tmp_path, write_module, nodes_dmp, bump_repeat14) + assert code == 0 + r = read_long(out)[("ENZ1", REPEAT, "")] + assert r["status"] == "unvalidated" # the module statuses are used; none exists + assert "call status stale (identity differs: repeat14)" in r["status_basis"] + rows = json.loads((out / "run.json").read_text())["call_status_sources"] + assert rows[0]["valid"] is False and rows[0]["reason"] == "identity differs: repeat14" + assert "identity differs: repeat14" in (out / "report.md").read_text() + + +def test_an_unusable_module_state_makes_the_call_file_stale(tmp_path, write_module, nodes_dmp): + def make_unavailable(wd): + meta = json.loads((wd / "modules" / "repeat14.json").read_text()) + meta["run_state"] = "unavailable" + (wd / "modules" / "repeat14.json").write_text(json.dumps(meta)) + + code, out, _ = _run_with_call_file(tmp_path, write_module, nodes_dmp, make_unavailable) + assert code == 0 + rows = json.loads((out / "run.json").read_text())["call_status_sources"] + assert ( + rows[0]["valid"] is False + and "module state not ok: repeat14 (unavailable)" in rows[0]["reason"] + ) + + +def test_a_call_file_for_an_unknown_call_stops_the_run(tmp_path, write_module, nodes_dmp, capsys): + def orphan(wd): + folder = wd / "status" / "calls" + (folder / "gone.json").write_text(json.dumps({"call": "gone"})) + + code, _, _ = _run_with_call_file(tmp_path, write_module, nodes_dmp, orphan) + assert code == 2 + assert "gone.json" in capsys.readouterr().err + + +def test_a_legacy_module_file_and_a_call_file_for_the_same_call_are_both_reported( + tmp_path, write_module, nodes_dmp +): + def legacy(wd): + entry = { + "taxa": [40], + "status": "unvalidated", + "source": "old", + "measure": {"calibration_set": "L", "n_pos": 0, "notes": f"call={REPEAT}"}, + } + (wd / "status").mkdir(exist_ok=True) + (wd / "status" / "repeat02.json").write_text( + json.dumps( + { + "module": "repeat02", + "version": "1", + "params_hash": "p", + "artefact_hash": "a", + "entries": [entry], + } + ) + ) + + code, out, _ = _run_with_call_file(tmp_path, write_module, nodes_dmp, legacy) + assert code == 0 + assert read_long(out)[("ENZ1", REPEAT, "")]["status"] == "smoke" # the call file wins + report = (out / "report.md").read_text() + assert "## Module calibration" in report and "## Call calibration" in report + assert "| repeat02 | 40 | unvalidated | tandem_repeat_protein | L |" in report diff --git a/tests/cellsurface_sorting_hat/test_engine.py b/tests/cellsurface_sorting_hat/test_engine.py index e34d6a2..6cc0b00 100644 --- a/tests/cellsurface_sorting_hat/test_engine.py +++ b/tests/cellsurface_sorting_hat/test_engine.py @@ -23,11 +23,17 @@ def table(name, rows): return ModuleTable(name, {k: dict(v) for k, v in rows.items()}) -def run(modules, status_of=None, ids=("P",), taxon=40, measured_call_of=None): +def run(modules, status_of=None, ids=("P",), taxon=40, measured_call_of=None, call_status_of=None): cfg = load_config() status_of = status_of or (lambda module, t: ("unvalidated", "x")) records = evaluate( - cfg, list(ids), dict.fromkeys(ids, taxon), modules, status_of, measured_call_of + cfg, + list(ids), + dict.fromkeys(ids, taxon), + modules, + status_of, + measured_call_of, + call_status_of, ) return {(r.protein, r.call, r.variant): r for r in records} @@ -493,3 +499,152 @@ def test_the_weakest_deciding_module_rule_still_holds_with_measured_calls(): ("P", "tandem_repeat_protein", "") ] assert (r.value, r.status) == ("called", "smoke") + + +# ---- call status hook (per-call status files) ---------------------------------------------------- + +REPEAT = "tandem_repeat_protein" + + +def _hook(table): + """A ``call_status_of`` hook from {(call, variant): result}; it records what it was asked.""" + asked = [] + + def hook(call, variant, taxon): + asked.append((call, variant, taxon)) + return table.get((call, variant)) + + hook.asked = asked + return hook + + +def _fields(res): + return {k: (r.value, r.status, r.status_basis, r.other_basis) for k, r in res.items()} + + +def test_a_hook_that_never_applies_changes_nothing(): + mods = base_modules(step1="called", repeat02=table("repeat02", {"P": ok(call="called")})) + plain = run(mods, _all_estimated, measured_call_of=_measured({R0: "signal_peptide_protein"})) + hooked = run( + mods, + _all_estimated, + measured_call_of=_measured({R0: "signal_peptide_protein"}), + call_status_of=_hook({}), + ) + assert _fields(hooked) == _fields(plain) + + +def test_a_call_status_replaces_the_module_statuses_of_that_call(): + mods = base_modules(repeat02=table("repeat02", {"P": ok(call="called")})) + hook = _hook({(REPEAT, ""): ("smoke", "call:tandem_repeat_protein:taxon:40")}) + r = run(mods, _all_estimated, call_status_of=hook)[("P", REPEAT, "")] + assert (r.value, r.status, r.status_basis) == ( + "called", + "smoke", + "call:tandem_repeat_protein:taxon:40", + ) + stronger = _hook({(REPEAT, ""): ("estimated", "call:tandem_repeat_protein:taxon:40")}) + r = run(mods, lambda m, t: ("unvalidated", "x"), call_status_of=stronger)[("P", REPEAT, "")] + assert r.status == "estimated" # the call was measured; the modules alone were unvalidated + + +def test_an_unknown_value_never_takes_a_call_status(): + bad = {"P": {"state": "error"}} + mods = base_modules(repeat02=table("repeat02", bad), repeat14=table("repeat14", bad)) + hook = _hook({(REPEAT, ""): ("estimated", "call:tandem_repeat_protein:taxon:40")}) + r = run(mods, _all_estimated, call_status_of=hook)[("P", REPEAT, "")] + assert (r.value, r.status, r.status_basis) == ("not_assessable", "unvalidated", "") + + +def test_a_composite_call_takes_the_weakest_status_over_its_measured_leaves(): + mods = base_modules(step1="called", repeat02=table("repeat02", {"P": ok(call="called")})) + hook = _hook({(REPEAT, ""): ("smoke", "call:tandem_repeat_protein:taxon:40")}) + res = run( + mods, + _all_estimated, + measured_call_of=_measured({R0: "signal_peptide_protein"}), + call_status_of=hook, + ) + r = res[("P", "cell_wall_adhesion_candidate", "R0")] + assert (r.value, r.status) == ("called", "smoke") + assert r.status_basis == "call:tandem_repeat_protein:taxon:40;step1_rule@R0:taxon:40" + # the R0 module measured on another call does not count for the R0 leaf + res = run( + mods, + _all_estimated, + measured_call_of=_measured({R0: "something_else"}), + call_status_of=hook, + ) + r = res[("P", "cell_wall_adhesion_candidate", "R0")] + assert r.status == "unvalidated" + assert r.status_basis == ( + "call:tandem_repeat_protein:taxon:40;step1_rule@R0:module measured on call something_else" + ) + + +def test_a_false_or_takes_its_status_from_all_its_false_inputs(): + mods = base_modules() # both repeat detectors not_called + hook = _hook({(REPEAT, ""): ("smoke", "call:tandem_repeat_protein:taxon:40")}) + r = run(mods, _all_estimated, call_status_of=hook)[("P", REPEAT, "")] + assert (r.value, r.status, r.status_basis) == ( + "not_called", + "smoke", + "call:tandem_repeat_protein:taxon:40", + ) + + +def test_a_false_and_takes_the_call_status_of_the_false_leaf_and_the_module_status_of_the_other(): + mods = base_modules(step1="called") # candidate is false because repeat and domain are false + hook = _hook({(REPEAT, ""): ("smoke", "call:tandem_repeat_protein:taxon:40")}) + res = run( + mods, + lambda m, t: ("estimated", "x") if m != "pfam_adhesion" else ("unvalidated", "x"), + measured_call_of=_measured({}), + call_status_of=hook, + ) + r = res[("P", "cell_wall_adhesion_candidate", "R0")] + assert r.value == "not_called" + assert r.status == "unvalidated" # the weakest of smoke (repeat call) and unvalidated (pfam) + # items follow the sorted (module, leaf) pairs; the call item stands where its first module would + assert r.status_basis == "pfam_adhesion:x;call:tandem_repeat_protein:taxon:40" + + +def test_other_surface_no_mechanism_takes_the_call_status_of_a_called_mechanism(): + mods = base_modules(step1="called", repeat02=table("repeat02", {"P": ok(call="called")})) + hook = _hook({(REPEAT, ""): ("smoke", "call:tandem_repeat_protein:taxon:40")}) + res = run( + mods, + _all_estimated, + measured_call_of=_measured({R0: "signal_peptide_protein"}), + call_status_of=hook, + ) + r = res[("P", "other_surface_no_mechanism", "R0")] + assert (r.value, r.status) == ("not_called", "smoke") + assert r.status_basis == "call:tandem_repeat_protein:taxon:40" + + +def test_the_variant_of_a_leaf_is_the_label_only_for_a_per_variant_leaf(): + mods = base_modules( + step1="called", + **{R2: table(R2, {"P": ok(call="called")})}, + repeat02=table("repeat02", {"P": ok(call="called")}), + ) + hook = _hook( + {("signal_peptide_protein", "R0"): ("smoke", "call:signal_peptide_protein:taxon:40")} + ) + res = run(mods, _all_estimated, measured_call_of=_measured({}), call_status_of=hook) + assert res[("P", "signal_peptide_protein", "R0")].status == "smoke" + assert res[("P", "signal_peptide_protein", "R2")].status == "estimated" # no file for R2 + candidate_r2 = res[("P", "cell_wall_adhesion_candidate", "R2")] + assert "call:signal_peptide_protein" not in candidate_r2.status_basis + asked = set(hook.asked) + assert ("signal_peptide_protein", "R2", 40) in asked + assert (REPEAT, "", 40) in asked and (REPEAT, "R0", 40) not in asked # plain leaf: no variant + + +def test_a_stale_call_status_falls_back_to_the_module_status_and_says_why(): + mods = base_modules(repeat02=table("repeat02", {"P": ok(call="called")})) + hook = _hook({(REPEAT, ""): (None, "reads differ")}) + r = run(mods, _all_estimated, call_status_of=hook)[("P", REPEAT, "")] + assert r.status == "estimated" + assert r.status_basis == "repeat02:call status stale (reads differ); taxon:40"