TCDB → GO Transporter-Activity Mapping & Gap Project

IN_PROGRESS PIPELINE

Species: ARATH, human

TCDB → GO Transporter-Activity Mapping & Gap Project

Bottom line: the Transporter Classification Database (TCDB) gives each
transport system a TC number, the transport analogue of an EC number, and GO
curators have already attached TC references to 170 molecular-function terms.
But GO has no tc2go annotation pipeline, so a protein's TC number never
becomes a GO annotation: half of the reviewed Swiss-Prot transporters with a TCDB
cross-reference (4,431 of 8,758) carry no transporter-activity term. We
extracted GO's 194 TC-to-GO leads and scored each against the reviewed proteins
that carry the TC id. 80 are safe to propagate, almost all at the level of a
single TC system; 18 would over-propagate at the family level; 67 point to
specific systems whose members lack the specific term; the other 29 are
whole-class leads (12), leads with no reviewed member (10) or uncertain (7). We
also filtered TCDB's
own noisy GO dump into 477 machine-derived candidate rows and hand-backed eight
exemplar mappings. All four SSSOM sets validate.

We did this because EC and RHEA each turn a classification into GO annotations
through a pipeline, and transporters have no equivalent. The evidence-scored
leads are a ready starter set for proposing a tc2go pipeline to GO.

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

Slides