TCDB → GO Transporter-Activity Mapping & Gap Project

SCOPING PIPELINE

Species: ARATH, human

TCDB → GO Transporter-Activity Mapping & Gap Project

Overview

This project examines the Transporter Classification Database (TCDB) as a
source of GO molecular-function annotations for membrane transport proteins
, in
the same spirit as the RHEA (reactions), EC/ec2go, and
CAZy source-audit projects. TCDB is the only transporter
classification adopted by the IUBMB
, organising transport systems into a
five-level TC number (class.subclass.family.subfamily.system, e.g.
2.A.69.1.1) that is the transport analogue of an EC number.

The defining fact of this project — and what makes it different from RHEA and EC
— is a missing annotation pipeline, not a missing mapping:

GO already curates TCDB cross-references on its terms, but there is no
tc2go external2go annotation pipeline.
GO curators have attached TC
references to 170 non-obsolete molecular-function terms (via xref: TC:
clauses and definition dbxrefs) — a real, high-quality partial TC→GO mapping
that lives inside the ontology. What is missing is the propagation half: TCDB
is absent from GO's external2go directory (which ships ec2go, rhea2go,
interpro2go, … but no tc2go), so unlike EC (GO_REF:0000003) and RHEA
(GO_REF:0000116) a protein's TCDB classification is not turned into a GAF
annotation. The correspondence exists on the terms; it just isn't applied to
proteins. Both facts confirmed live (GO release 2026-05-19; go-basic.obo).

So the analysis runs in two directions:

  1. Forward (candidate sources). GO's 170 TC xrefs are the best starting leads,
    but neglected and unreviewed. TCDB also publishes a per-protein GO dump
    (https://tcdb.org/cgi-bin/projectv/public/go.py), noisier but wider. Both are
    candidate pools; neither is safe to propagate without per-entry curation.
  2. Reverse (gap). Where does a UniProtKB entry carry a TCDB cross-reference
    (DR TCDB;) but no GO transmembrane-transporter-activity term at all?
    Because GO's xrefs sit on terms and are never propagated to proteins, this
    "falls through the cracks" gap is structural, not incidental.

See TCDB-METHODOLOGY.md for queries, the reproducible
probe script, and the closure caveat.

Key Findings (scoping pass)

GO's TCDB cross-references: neglected sources, not a ready mapping

GO carries TC references on molecular-function terms. Extracted live from
go-basic.obo (extract_go_tc_xrefs.py, obsolete
terms excluded):

Count
TC xref references on GO terms 202 (61 xref: TC: + 141 definition dbxref)
Distinct TC→GO source pairs (deduped) 194
Distinct GO terms (all molecular function) 170
Distinct TC systems (5-level) 185
Distinct TC families (3-level) 63

These are leads, not an asserted mapping. GO's TC xrefs are largely
neglected, and the term-xref: vs definition-dbxref distinction carries no
reliable signal, so they are treated alike. Crucially, an xref says "a curator
once linked this TC entry and this GO term"
not "every protein with this
TC number has this function"
. Whether a lead is safe to propagate (a protein
inheriting the GO term from its TC id) is a separate judgment that must be
curated by hand, per entry — see the propagation verdicts below.

They are shipped, inverted to TC→GO, as
tc2go.from_go.sssom.yaml — every row
skos:relatedMatch + semapv:UnspecifiedMatching (i.e. explicitly unreviewed
source
). Many are keyed at the specific TC system (e.g. GO:0005335 ← TC:2.A.22.1.1, SERT), where propagation is usually safe; others sit on a whole
family, where it usually is not. They cover only 63 of TCDB's 2,235 families
(3%)
and, being ontology annotations rather than an external2go mapping, are
not propagated to proteins — so they do not close the reverse gap below.

Propagation curation: every GO-xref lead scored by evidence

Whether a lead is safe to propagate — can a protein carrying the TC id inherit
the GO term? — is answered for all 194 source pairs with UniProt member
evidence
, not assertion. For each pair, curate_propagation.py
fetches the reviewed Swiss-Prot proteins carrying that TC id (level-aware: a
5-level system matched exactly, a coarser id by dot-bounded prefix) and measures
what fraction also carry the GO term (ontology-closure expanded, so a member with
a more specific child still counts). The fraction is the propagation signal:

Verdict (SSSOM predicate) Rule Count
JUSTIFIED (exactMatch) ≥2 members, ≥70% carry the term (or 1/1) 80
GAP_CANDIDATE (relatedMatch) specific system (≥4-level), member(s) exist but 0 carry it 67
NOT JUSTIFIED at this TC level (narrowMatch) ≥3 members, <50% carry it 18
CLASS_LEVEL (broadMatch) whole TC class/subclass (≤2-level); broad by construction 12
NO_REVIEWED_MEMBER (relatedMatch) no reviewed protein xref'd to the TC id 10
UNCERTAIN (relatedMatch) ambiguous small-n middle 7

The rows are listed in evaluation order, which matters for the two middle rules:
k=0 also satisfies "<50% carry it", so GAP_CANDIDATE is tested first. A specific
system whose members all lack the term is a reverse-gap lead (the members are
under-annotated), not evidence that the term fails to propagate — filing it as
narrowMatch would both hide it from the gap harvest and overstate the narrow count.

Shipped as tc2go.propagation.sssom.yaml
with the per-pair evidence (k/n) in every comment; the full table is
data/propagation_evidence.tsv. Findings:

TCDB's own go.py dump: usable seed, but only after filtering

Slice Count % of dump
Rows (GO ↔ TC-system) 34,497 100%
Distinct TC systems (5-level) 4,943
Distinct TC families (3-level) 589
Distinct GO terms 3,518
Rows whose GO term is a transporter-activity MF 4,557 13%
Distinct transporter-activity MF terms 424 12% of GO terms
TC systems with ≥1 transporter-activity MF term 2,866 58%
TC families with ≥1 transporter-activity MF term 222 / 589 37%

Rows by TC class: 1 channels/pores 7,984 · 2 electrochemical-potential-driven
11,959 · 3 primary active 10,290 · 4 group translocators 890 · 5
transmembrane electron carriers 693 · 8 accessory 1,092 · 9 incompletely
characterised 1,589. Computed live by
tcdb_go_probe.py (--tcdb-go); the transporter-activity
MF closure (1,042 terms, is_a GO:0022857 ∪ GO:0005215) comes from QuickGO.

The take-home: the clean, adoptable slice of go.py is the 13% that is
transporter-activity MF.
build_tc2go.py distils exactly
that slice into an SSSOM candidate set (below).

Reverse gap: half of reviewed transporters lack a transport MF term

Reviewed Swiss-Prot entries with a DR TCDB; xref Count %
Total 8,758 100%
…with GO:0022857 transmembrane transporter activity (closure) 4,208 48%
…with GO:0005215 transporter activity (closure) 4,327 49%
…with NO transporter-activity term (gap upper bound) 4,431 50.6%

Computed live against the UniProtKB REST API (database:tcdb AND reviewed:true,
GO-closure-expanded on the GO side) by tcdb_go_probe.py
(--gap). GO's curated term-xrefs do not help here — they sit on GO terms,
not on the proteins — so the only routes by which these transporters could get a
transport MF term are EC/ec2go (many transporters have no EC),
InterPro/interpro2go, or manual curation. A structural half-coverage is
therefore unsurprising, and is precisely the gap a tc2go propagation pipeline
would close.

Closure caveat (mandatory). The 50.6% is an exact-match upper bound: some
entries carry a transport-related term outside the GO:0005215 MF branch (a
transport process BP term, or a channel-complex CC term) that a closure-aware,
cross-branch audit would credit. As in RHEA/CAZy, high gap = candidate for
closure-filtered review
, not a confirmed missing annotation.

Specificity: the TC family is usually too general

The curated seed encodes this distinction directly (below).

Curated mappings (SSSOM)

Filling the gap is a curation deliverable, not just an audit. Four SSSOM files,
same format as RHEA and
CAZy:

Every GO id/label is validated non-obsolete and molecular-function; the GO object
is bound to the MF branch. Validate all four with just validate-tcdb-mappings
(SSSOM structural validation + GO term/label validation; generated nested views
tc2go.terms.yaml,
tc2go.generated.terms.yaml,
tc2go.propagation.terms.yaml,
tc2go.from_go.terms.yaml).

Across all sources, 173 of TCDB's 2,235 families (8%) have at least one
candidate GO transporter-activity mapping.

How this differs from EC, RHEA, and CAZy

EC (ec2go) RHEA (GO_REF:0000116) CAZy TCDB
GO aspect MF (enzyme activity) MF (enzyme activity) MF (glycoenzyme) MF (transporter activity)
external2go annotation pipeline yes yes no (built here from EC) no
TC/ID references in the ontology (term xrefs) some some some yes but neglected — 170 MF terms / 63 families, unreviewed
Source GO material curated mapping curated mapping via EC bridge GO's neglected term xrefs + noisy go.py dump (both = leads)
Dominant failure mode too-general term parent-vs-child specificity poly-specific family no propagation pipeline + over-general family + go.py aspect noise
Emphasis over-annotation audit both gap-filling gap-filling (structural half-coverage)

TCDB is the most under-connected of these sources: it has a real, curated
term-level correspondence to GO, but no pipeline to propagate it to proteins, so
half of TC-classified transporters still lack a transport MF term. The expected
verdict skew is heavily toward NEW / gap-filling, tempered by the family
over-generality problem (prefer the subfamily-specific child term).

Curation Recommendations (preliminary)

  1. Treat GO's TC xrefs (and go.py) as sources, then curate propagation
    per entry.
    An xref is a lead, not a licence to annotate: decide explicitly
    whether every protein at that TC level truly has the GO function before
    propagating. Record the verdict (exactMatch = propagate, narrowMatch =
    subfamily-only) as in tc2go.sssom.yaml.
  2. Propagation is safe at the level that is mono-specific. A 5-level TC system
    is usually mono-specific (2.A.22.1.1 SERT → GO:0005335) → propagate; a
    3-level family is usually poly-specific (1.A.8 MIP mixes water channels and
    glycerol-permeable aquaglyceroporins; 2.A.22 NSS mixes serotonin/dopamine/GABA)
    → do not propagate the substrate-specific term to the whole family.
  3. Filter go.py to transporter-activity MF before use. 87% of the dump is
    CC/BP/generic/noise; only the 13% MF-activity slice is adoptable, and even
    that needs specificity review.
  4. Always closure-filter (cross-branch) before calling a gap. The 50.6% is an
    upper bound; subtract entries carrying any transport-related descendant/BP/CC
    term first.
  5. Prefer EC-bridge support where it exists. Some transporters (e.g. primary
    active 3.A ATPases) carry an EC and reach GO via ec2go; use that as
    corroboration and to avoid duplicating an existing route.

Follow-Up Targets

Target Rationale
Closure-aware (cross-branch) reverse gap Separate true gaps from transport-BP/channel-CC coverage in the 4,431 reviewed no-MF entries; promote real gaps to gene reviews.
Subfamily-level tc2go from go.py Rebuild the generated set at 4/5-level TC ids so poly-specific families resolve to substrate-specific MF children.
Exemplar gene reviews Run the full review workflow on 2–3 confirmed-gap transporters already in this repo (353 candidates), mirroring the RHEA/UniPathway exemplar pattern.
"No transporter-activity MF at all" family set The 367 TC families with no MF-activity term in go.py → candidates for proposed_new_terms or accessory (class 8/9) exclusion.
Propose a tc2go propagation pipeline to GO The strategic deliverable: the 80 evidence-JUSTIFIED leads (mostly 5-level systems) are a ready external2go starter set; package them (plus reviewed extensions) so a protein's TC number yields a GAF annotation.
Promote the 67 GAP_CANDIDATE leads Specific systems whose reviewed member carries only a parent term — run them through the gene-review workflow to add the specific GO term.
Chase the 10 NO_REVIEWED_MEMBER cases Reviewed protein exists but lacks the DR TCDB xref (e.g. MelB) — a UniProt cross-reference gap to report upstream.
Extend GO's 63 xref'd families Promote the 110 novel go.py-generated families (and the 16 GO-xref families go.py misses) toward curated term-xrefs.

Project Status