Complex Portal Annotation Correctness

SCOPING PIPELINE

Species: human, yeast, DROME, worm, SCHPO, mouse, ECOLI, ARATH, rat

Genes: gaa1 CHMP3 BAK1 DFFB ced-3 PPP3CA SDHB ESPL1 MBL2 PDGFA CLCN7 TERT CAC2 pstS DYNC2H1 RPL18A Actb

Complex Portal Annotation Correctness

Bottom line: Complex Portal (CP) annotates protein complexes, and GOA copies each complex's
process (BP) and location (CC) terms, but not its function (MF), to every subunit, under
assigned_by: ComplexPortal. This project checks whether those subunit rows are correct. The
5,005 such rows in this repo's cached GOA files all belong to reviewed genes, and 88% of them
survive review (95% of CC, 83% of BP). Fewer than 1% are outright wrong; most rejected rows are
imprecise. The typical failures are regulation terms in the wrong direction (the inhibited subunit
annotated as the inhibitor), downstream processes, a partner's activity, and promiscuous subunits
such as actin inheriting every complex's terms. Simple rules raise the rejection rate among
flagged rows to about 29% against a 10% base, so they help triage but cannot replace reading.
Corroboration works the other way: rows another group also annotated from the same paper were
almost never rejected (2 of 445). 41% of the papers CP cites are cited by no other group in GOA,
and a quarter of those are reviews; 20 rows give a review an experimental evidence code. We also
found a direct contradiction, CHMP3, where CP and UniProt draw opposite conclusions from the same
paper. The review verdicts judge terms, not references, so reference problems are under-counted.
The gaa1 case shows one: the fission-yeast GPI transamidase record rests on a paper that only
predicts GPI-modification sites.

Scope and questions

For each CP complex, and for each GO row it generates, we ask:

  1. Existence and membership. Is the complex shown to exist in this species, or carried over
    from an ortholog complex? Are the participant accessions the right orthologs?
  2. Reference support. Does the cited PMID say anything about this complex in this organism?
    CP uses ECO:0005547 ("inferred by curator") as the evidence for the complex, and the GO rows
    it pushes are NAS against the complex's reference. This is the main point to check.
  3. Term distribution. Is every subunit annotated with every complex-level BP and CC term? This
    is the same over-propagation problem as in PROTEIN_COMPLEX_FUNCTIONS,
    but at the BP level.
  4. Process specificity. Is a BP term the process the complex performs, or a downstream
    consequence (for example, cell wall organization for an anchoring enzyme)?

Two annotation layers

CP annotates in GOA at two levels (checked in QuickGO for CPX-10141 and CPX-2687):

So the MF over-propagation issue does not arise from CP, but every BP and CC on the complex
reaches every subunit unchanged, with the complex's evidence code and reference. In this
repo's gene reviews only the subunit layer is visible, because *-goa.tsv is fetched per
UniProt accession.

GO/GOA pipeline status (from GOA and IEA working-group minutes, April to May 2026; not
independently verified here):

That proposal speaks to this project's reference-support question (question 2). In the gaa1 case
the PMID is weak even for the complex, so changing the evidence code alone would not fix the
pombe rows.

Size of the problem in this repo

These counts come from the *-goa.tsv files under genes/, filtered to ASSIGNED BY = ComplexPortal
(snapshot of 2026-10-11):

Evidence Rows
NAS 3,131
IDA 984
IPI 686
IMP 153
ISS / EXP / ISO 51
Total 5,005 (2,814 BP, 2,191 CC)

By species: human 3,820; S. cerevisiae 382; D. melanogaster 228; C. elegans 215;
S. pombe 105; mouse 103; E. coli 100; A. thaliana 48; rat 4.

First accuracy estimate from existing gene reviews

Every one of the 5,005 CP subunit rows in the cached GOA files belongs to a gene that already
has a review (1,093 genes). Each row was matched to its review action on (GO term, evidence
code, reference) using scripts/cp_review_join.py,
and all rows matched. "Acceptable" means ACCEPT or KEEP_AS_NON_CORE.

Slice Rows Acceptable Over-annotated Modify Remove Undecided
All 5,005 88.0% 4.6% 4.6% 0.8% 1.9%
CC 2,191 95.0% 1.2% 2.3% 0.5% 1.0%
BP 2,814 82.6% 7.2% 6.3% 1.1% 2.7%
IPI 686 94.9% 1.9% 2.9% 0 0.3%
IDA 984 90.4% 3.2% 4.5% 0.8% 1.1%
NAS 3,131 85.6% 5.9% 5.0% 1.0% 2.5%
IMP 153 89.5% 1.3% 3.9% 1.3% 3.9%

By species, the acceptable share is 88.0% for human (3,820 rows), 86.6% for budding yeast (382),
94.7% for fly (228), 90.2% for worm (215), 94.3% for pombe (105), 86.0% for E. coli (100),
97.9% for Arabidopsis (48), 100% for rat (4) and 65.0% for mouse (103). The mouse figure comes almost entirely
from Actb: 27 of its 36 rejected rows are β-actin inheriting the processes of every complex it
belongs to.

How to read this. About 88% of CP-derived subunit annotations survive review, 95% for CC and
83% for BP. Outright wrong rows are under 1%; most problems are imprecision (wrong-direction
regulation terms, downstream outcomes, over-general terms). All 502 rejected rows, with the
review's reason, are in data/cp_rejected_rows.yaml.

Examples of rejected rows

Pattern Gene CP-derived term Evidence Why rejected (from the gene review)
Regulation in the wrong direction human/BAK1 negative regulation of release of cytochrome c from mitochondria (GO:0090201) IDA PMID:15901672 BAK is the restrained target, not the negative regulator, in the anti-apoptotic complex
Regulation in the wrong direction human/DFFB negative regulation of apoptotic DNA fragmentation (GO:1902511) IDA PMID:11371636 DFFB is the nuclease being inhibited, not the inhibitor
Regulation in the wrong direction worm/ced-3 negative regulation of execution phase of apoptosis (GO:1900118) IMP PMID:10101135 The inhibitor is MAC-1; CED-3 is the inhibited protease (ced-4 likewise)
Regulation in the wrong direction human/PPP3CA positive regulation of calcium ion import across plasma membrane (GO:1905665) NAS PMID:17640527 Anchored calcineurin suppresses PKA enhancement of CaV1.2 current
Downstream or neighbouring process human/SDHB proton motive force-driven mitochondrial ATP synthesis (GO:0042776) NAS PMID:30030361 Complex II pumps no protons (SDHA and SDHC likewise; 20 rows of this term rejected)
Downstream or neighbouring process human/ESPL1 maintenance of mitotic sister chromatid cohesion (GO:0034088) NAS PMID:34290405 Separase cleaves cohesin; cohesion is maintained by cohesin, shugoshin-PP2A and separase inhibitors
Activity of a partner human/MBL2 proteolysis (GO:0006508) IDA PMID:22691502 The MASP proteases cleave C4/C2; MBL has no protease activity
Activity of a partner human/PDGFA peptidyl-tyrosine autophosphorylation (GO:0038083) NAS PMID:11297552 Autophosphorylation is done by the receptor, not the ligand
Wrong process for the protein human/CLCN7 transepithelial chloride transport (GO:0030321) IDA PMID:32851177 ClC-7 is an endolysosomal antiporter
Wrong process for the protein human/TERT telomere maintenance via recombination (GO:0000722) NAS PMID:20351177 Recombination-based telomere maintenance (ALT) is the telomerase-independent pathway
Wrong location for a subunit yeast/CAC2 nucleosome (GO:0000786) IDA PMID:30239791 (a review) CAF-1 deposits histones but is not part of the nucleosome (MSI1, RLF2 likewise)
Wrong location for a subunit ECOLI/pstS membrane (GO:0016020) NAS PMID:3881386 PstS is a periplasmic binding protein
Reference does not cover the subunit human/DYNC2H1 male germ cell nucleus (GO:0001673) NAS PMID:36973253 Paper is about dynein-1 (DYNLRB1/2) complexes and does not mention dynein-2
Reference does not cover the subunit human/RPL18A striated muscle contraction (GO:0006941) NAS PMID:34081545 Paper studies RPL3L, not RPL18A
Promiscuous subunit mouse/Actb kinetochore (GO:0000776) NAS PMID:11078522 Transferred from chromatin-remodeller complexes that contain actin; 27 Actb rows rejected

Limitations.

Rules for flagging suspect rows

Spot checks do not scale, so we tested simple rules that could flag CP rows for review. Each rule
was scored against the same review verdicts: precision is the share of flagged rows that the
review rejected, compared with a base rate of 10.0% (502 of 5,005). Script:
scripts/cp_flag_rules.py; full output with examples:
data/cp_rule_eval.yaml.

Rule Flagged Rejected Precision Lift Recall
Outcome-type BP term (regulation, response to, development, morphogenesis, differentiation) and subunit has ≥5 CP references 396 116 29.3% 2.9× 23%
"response to" term 85 20 23.5% 2.4× 4%
Regulation term not corroborated by another group 720 164 22.8% 2.3× 33%
Regulation term (any) 751 164 21.8% 2.2× 33%
Outcome-type term, paper cited only by CP 396 89 22.5% 2.2× 18%
Outcome-type term, paper is a review 119 25 21.0% 2.1× 5%
BP, subunit has ≥5 CP references 960 182 19.0% 1.9× 36%
BP, gene not named in the cached full text 345 77 22.3% 2.2× 15%
Any BP 2,814 414 14.7% 1.5× 82%
Gene not named in cached full text 572 88 15.4% 1.5× 18%
Paper is a review 812 105 12.9% 1.3× 21%
Paper cited only by CP anywhere in GOA 2,121 229 10.8% 1.1× 46%
Same gene, term and paper also annotated by another group 445 2 0.4% 0.04× —

What this shows:

Direct conflicts with other annotations

Only 4 CP rows clash with a NOT annotation on the same gene and term. Three of them are a direct
contradiction from the same paper with the same evidence code:

Gene Term CP row Contradicting row
human/CHMP3 nucleus organization (GO:0006997) IMP PMID:20616062 NOT, UniProt, IMP PMID:20616062
human/CHMP3 mitotic metaphase chromosome alignment (GO:0007080) IMP PMID:20616062 NOT, UniProt, IMP PMID:20616062
human/CHMP3 regulation of mitotic spindle assembly (GO:1901673) IMP PMID:20616062 NOT, UniProt, IMP PMID:20616062
human/SIRT1 nucleolus (GO:0005730) IDA PMID:18485871 NOT, UniProt, IDA PMID:16079181 (a different paper)

PMID:20616062 (Morita et al. 2010) depleted each of the 11 human ESCRT-III proteins and reports
spindle and nuclear defects for "most" of them. The per-protein results are in figures that the
cached text does not include, so we cannot tell from here which curator is right for CHMP3.
UniProt's NOT suggests CHMP3 depletion was one of the exceptions, and CP's positive rows look
like the ESCRT-III complex-level result rolled down to every subunit. The CHMP3 review currently
accepts or keeps all three rows. They should be re-examined against the figures, and this check
should run routinely.

Papers cited only by Complex Portal

QuickGO was queried for every PMID cited on a CP row, counting all annotations in GOA that cite
it and how many of those are CP's. PubMed publication types were added from NCBI E-utilities.
Data: data/cp_pmid_usage.yaml; scripts:
cp_pmid_usage.py,
cp_pmid_pubtypes.py.

A deterministic evidence-code check. 812 CP rows cite a review, and almost all of them are NAS,
which is the right code. But 20 rows assign an experimental code to a review:

Most of these terms are biologically fine, but the evidence code says an experiment was reported
in a paper that only reviews experiments. This needs no biological judgement to check, though
PubMed's Review tag should be confirmed for each paper, since some primary papers carry it too.

Case 1: Gaa1 in the GPI-anchor transamidase complex

Records were fetched from the CP web service on 2026-10-11 (/intact/complex-ws/complex/<CPX>).
A search for gaa1 returns four curated GPI-T complexes (human CPX-6503, fly CPX-2687, pombe CPX-10141,
budding yeast CPX-1275) and four predicted human complexes containing GPAA1.

SCHPO: CPX-10141 (curated by UniProt, released 2024-11-29)

Assessment:

DROME: CPX-2687 (curated by IntAct, released 2022-07-11)

Assessment:

Cross-cutting observations from case 1

Plan

Reproduce

Run from the repo root. Step 1 parses every gene review (about 2 minutes) and writes an
intermediate file that is not committed. Steps 2 and 3 call QuickGO and NCBI E-utilities, so
their output is a snapshot (2026-10-11 for the committed copy).

D=projects/COMPLEXPORTAL
uv run python $D/scripts/cp_review_join.py /tmp/cp_joined.json $D/data/cp_rejected_rows.yaml  # CP rows + review actions
uv run python $D/scripts/cp_pmid_usage.py $D/data/cp_pmid_usage.yaml        # GOA-wide PMID usage
uv run python $D/scripts/cp_pmid_pubtypes.py $D/data/cp_pmid_usage.yaml     # add PubMed types
uv run python $D/scripts/cp_flag_rules.py /tmp/cp_joined.json $D/data/cp_pmid_usage.yaml $D/data/cp_rule_eval.yaml

Step 1 also writes data/cp_rejected_rows.yaml (rows whose action is MARK_AS_OVER_ANNOTATED,
MODIFY or REMOVE). It matches review annotations on (term, evidence, reference), skips
negated review rows so that a CP row cannot inherit the verdict on a NOT row with the same key,
and reports any remaining ambiguous matches.

Sources