A quarter of this graph's gene entries have a UniProt localization that nobody measured - and the subnuclear vocabulary UniProt does carry avoids the genes we care about most
also called localization evidence code audit · ECO code audit · UniProt subcellular provenance · by-similarity localization
Every gene entry here that names a protein can be checked against UniProt for where that protein lives. Doing that for all 299 of them shows that for about one in four the stated location was never measured in a human protein - it was copied from another species, inferred by a curator, predicted from the sequence, or left with no source at all. All four look identical if you just read the text.
The same thing, for a scientist
Audit of the 299 gene entries in this graph that carry a `data.uniprot` accession, run live against UniProtKB on 2026-09-20 and classified by the ECO evidence code attached to each subcellular-location value. **226 (75.6%) carry at least one experimentally coded location (ECO:0000269).** The remaining 73 do not: **36 (12.0%) have only non-experimental codes** - 21 by similarity (ECO:0000250), 12 curator inference (ECO:0000305), 3 sequence-model prediction (ECO:0000255) - **32 (10.7%) carry location values with no evidence code at all**, and 5 have no subcellular-location comment. Separately, **49 entries carry an uncoded free-text note** and **48 have at least one uncoded location value**, so the uncoded material is not confined to the 32. And the finding that changes what this beat could do: **82 of 299 (27.4%) name a subnuclear or mitotic structure in their UniProt locations, but only 2 of the graph's top 25 genes by degree do.**
The numbers
| class | n | % of 299 | what it is |
|---|---|---|---|
| at least one ECO:0000269 | 226 | 75.6% | experimental evidence in manual assertion |
| only ECO:0000250 | 21 | 7.0% | by similarity - transferred from another entry, often another species |
| only ECO:0000305 | 12 | 4.0% | curator inference - the curator's reading, not the paper's assertion |
| only ECO:0000255 | 3 | 1.0% | sequence model match - a profile said so |
| no evidence code at all | 32 | 10.7% | unattributed |
| no subcellular-location comment | 5 | 1.7% | UniProt says nothing |
Additional, overlapping counts: 49 entries carry a free-text subcellular NOTE with no evidence code, and 48 have at least one individual location value with no code even though the entry may be coded elsewhere. The note is where the subnuclear detail usually lives, so the uncoded fraction is disproportionately the interesting fraction.
Worked examples from this beat, one per class, all verified individually:
- ECO:0000250 -
gene-dot1l:Cytoplasmis transferred from mouse Q6XZL8, where it means AF17 overexpression pushes Dot1a out of the nucleus in mouse kidney collecting-duct cells, leptomycin-B sensitive. - ECO:0000305 -
gene-ash2l:Nucleusis a curator inference from PubMed 17355966. - ECO:0000255 -
gene-meis1:Nucleusis a match to the homeodomain ProRule PRU00108. A homeodomain-less MEIS1 isoform is cytoplasmic. - no code -
gene-mllt1(ENL): the comment is literally{"subcellularLocations": [{"location": {"value": "Nucleus"}}]}, with no evidences array. - uncoded NOTE -
gene-paf1: "punctuate distribution throughout the nucleus except in nucleoli", uncited, and contradicted by a 2024 nucleolar proximity map.
All five render identically in the flat cc_subcellular_location text field that a bulk import reads. The distinction exists only in the JSON evidences array.
The 36 that have locations but no experimental evidence
Named in full, because rule 78's principle applies - a count is not a result until the members are named, and some of these are load-bearing here:
by similarity (21): ABI1, ANP32E, CCNT2, CSNK2A2, CSPG4, CTR9, FANCL, GAS7, HDAC9, KHDRBS2, MEF2C, NASP, PRDM9, PROM1, REL, RTF1, SEPTIN11, SEPTIN5, SGF29, SMC3, USP2.
curator inference (12): ASH2L, KDM6A, KDM6B, MCL1, MED12, MED23, MED26, PBX3, PPIL4, SMARCD2, SS18, SUPT6H.
sequence-model prediction (3): EP400, KDM4C, MEIS1.
Three of these matter immediately. ASH2L, CTR9 and RTF1 are core elongation/COMPASS machinery in this disease; PBX3 and MEIS1 are the homeodomain partners the graph's HOX layer runs on; CCNT2 is a P-TEFb cyclin. None of their localisations is a human measurement.
And 32 with no code at all includes gene-cdk9, gene-runx1, gene-flt3, gene-mllt1, gene-ell2, gene-kat6a, gene-smarcb1, gene-stag2 and gene-set - a list heavy with proteins whose compartment the graph reasons about.
The subnuclear vocabulary is real, and it points away from our genes
UniProt does carry subnuclear terms - nuclear speckle, Cajal body, PML body, nucleolus, nucleoplasm, nuclear matrix, centromere, kinetochore, spindle pole, centrosome. 82 of the 299 accession-carrying gene entries (27.4%) name at least one such structure. Before this beat, the graph's own subnuclear_localization field was present on 7 of 306 gene entries (2.3%).
So a tenfold coverage increase is available for the cost of a fetch. It should not be taken, at least not as content, for the reasons this beat's entries document one by one: the evidence class varies and is invisible in the flat text; the annotation describes the wild-type protein while this graph's subject is a fusion; and for several genes the UniProt statement is the one that turns out to be contested (PAF1's nucleolar exclusion) or unattributed (ENL's nucleus).
Use it as a worklist, not as a payload. And note the sharp limitation on that worklist: only 2 of the graph's top 25 genes by degree (ELL and KAT7) have a subnuclear-naming UniProt location at all. The genes the graph leans on hardest are precisely the ones UniProt cannot help with, which is why this beat had to read papers for DOT1L, PSIP1, HOXA9, MLLT1, MLLT10, WDR5, MEIS1, PAF1 and DPY30 rather than fetch them.
How to reproduce this
- Collect
data.uniprotfrom everygene-*.jsonindata/graph/nodes/*/. (299 entries on 2026-09-20; all 299 accessions distinct.) - Query
https://rest.uniprot.org/uniprotkb/searchin batches of 40 withfields=accession,gene_primary,length,cc_subcellular_location&format=json. JSON, not TSV - the TSV flattens the evidence codes away, which is the whole point. - For each record walk
comments[commentType=='SUBCELLULAR LOCATION'], then eachsubcellularLocations[].location, and read itsevidences[].evidenceCode. Also testnote.texts[].evidencesfor the free-text note. - Classify: ECO:0000269 experimental; 0000305 curator inference; 0000250 by similarity; 0000255 sequence model; absent array = uncoded.
- Confirm every returned row's
genes[0].geneName.valueequals the symbol expected for that accession before using it - rules 62-66 apply to a batch query exactly as to a single one.
All 299 accessions resolved; none failed. The script used lives outside the repository in this cycle's scratchpad and the procedure above is the reproducible form.
| method | Collect data.uniprot from every gene-*.json; query UniProtKB REST search in batches of 40 with fields=accession,gene_primary,length,cc_subcellular_location and format=json (NOT tsv, which discards evidence codes); walk comments[SUBCELLULAR LOCATION].subcellularLocations[].location.evidences[].evidenceCode and note.texts[].evidences; classify by ECO code. |
|---|---|
| status | run |
| run date | 2026-09-20 |
| result summary | 299 accession-carrying gene entries: 226 experimental (75.6%), 36 non-experimental only (12.0%: 21 by-similarity, 12 curator-inference, 3 sequence-model), 32 with no evidence code at all (10.7%), 5 with no subcellular comment. 49 entries carry an uncoded free-text note; 48 have >=1 uncoded location value. 82 (27.4%) name a subnuclear or mitotic structure; only 2 of the top 25 by degree do. |
| n gene entries with accession | 299 |
| n distinct accessions | 299 |
| n unresolved | 0 |
| recommendation | Use the 82 as a WORKLIST, never as a payload. The annotation describes the wild-type protein, its evidence class is invisible in the flat text field, and for several core genes the UniProt statement is the contested or unattributed one. |
inputs
[ "data/graph/nodes/*/gene-*.json", "https://rest.uniprot.org/uniprotkb/search" ]
counts — the numbers behind the chart
{
"has_experimental": 226,
"by_similarity_only": 21,
"curator_inference_only": 12,
"sequence_model_only": 3,
"no_evidence_code_at_all": 32,
"no_subcellular_comment": 5,
"uncoded_note": 49,
"uncoded_location_value": 48,
"names_a_subnuclear_or_mitotic_structure": 82,
"top25_naming_a_subnuclear_structure": 2
}by similarity only genes
[ "ABI1", "ANP32E", "CCNT2", "CSNK2A2", "CSPG4", "CTR9", "FANCL", "GAS7", "HDAC9", "KHDRBS2", "MEF2C", "NASP", "PRDM9", "PROM1", "REL", "RTF1", "SEPTIN11", "SEPTIN5", "SGF29", "SMC3", "USP2" ]
curator inference only genes
[ "ASH2L", "KDM6A", "KDM6B", "MCL1", "MED12", "MED23", "MED26", "PBX3", "PPIL4", "SMARCD2", "SS18", "SUPT6H" ]
sequence model only genes
[ "EP400", "KDM4C", "MEIS1" ]
no evidence code at all genes
[ "AFF3", "ARID2", "ATRX", "CD34", "CD7", "CDK9", "CHEK2", "EED", "ELL2", "FANCA", "FLT3", "FUT4", "H2AZ1", "HDAC5", "HIRA", "HNF4A", "HOXA10", "JAK1", "JUND", "KAT6A", "MAP3K14", "MLLT1", "MSI2", "NCOA6", "NFKB2", "RUNX1", "SBDS", "SET", "SIAH1", "SMARCB1", "STAG2", "UBN1" ]
subnuclear term list used
[ "speckle", "Cajal", "nucleol*", "PML body", "lamina", "chromocent*", "heterochromat*", "nuclear body", "nucleoplasm", "nucleus matrix", "telomere", "centromere", "kinetochore", "spindle", "midbody", "centrosome" ]
subnuclear terms NOT searched
[ "paraspeckle", "perinucleolar compartment", "Polycomb body", "transcription factory", "nuclear pore", "condensate" ]
- A target dossier assembled from database localization will state compartments for proteins nobody has localised, and those statements will be quoted downstream with no marker of their provenance - the failure mode this graph has already recorded for fabricated identifiers, arriving through a legitimate source.
- If a pharmacodynamic assay is designed around a compartment that turns out to be by-similarity from another species, the assay can be technically perfect and measuring the wrong thing.
- Conversely, refusing all non-experimental annotations would discard 73 entries' worth of mostly-correct information. The fix is recording the class, not filtering on it.
- Should the graph record the evidence class alongside every imported localization? A one-word field ('experimental', 'by-similarity', 'curator', 'predicted', 'uncoded') would make the distinction this audit found machine-visible for the first time.
- How many of the 32 uncoded annotations are simply old? UniProt began evidence-tagging systematically in the late 2000s; an annotation age check would separate 'untagged legacy' from 'genuinely unsourced'.
- Do the same proportions hold for the protein-* entries, which were outside this audit? They carry accessions too and are used the same way.
- For the 21 by-similarity entries, which source organism did each come from, and is the source a measurement? DOT1L's traced back to a mouse kidney paper; a chain of transfers could be longer than one step.
- E1strong confidence 4 of 5: Replicated in peer-reviewed work by more than one group.database
Of the 299 gene entries in this graph carrying a data.uniprot accession, 226 (75.6%) have at least one subcellular location annotated with an experimental evidence code (ECO:0000269); 36 (12.0%) have locations with only non-experimental codes - 21 ECO:0000250 by similarity, 12 ECO:0000305 curator inference, 3 ECO:0000255 sequence-model prediction; 32 (10.7%) carry location values with no evidence code at all; and 5 have no subcellular-location comment. 49 entries carry an uncoded free-text note and 48 have at least one uncoded location value.
UniProtKB REST API, cc_subcellular_location in JSON with evidence arrays, queried for 299 accessions on 2026-09-20 · UniProt Consortium · UniProtKB 2026What this evidence cannot show
A snapshot of a database that changes: UniProt curates continuously and these proportions will drift. The classification is per ENTRY, not per location value - an entry with one experimental and three uncoded locations counts as 'has experimental', so the table UNDERSTATES how much uncoded material is present, which is why the separate uncoded-location and uncoded-note counts are given. Accessions were taken from the graph's own data blocks and were not independently re-verified against gene symbol in this audit beyond checking that all 299 resolved; the individual accessions discussed in this beat's entries were each checked on gene_primary and length. Genes whose entries carry no accession are outside this audit entirely.
Evidence that argues against this (1)
- A non-experimental code is not a wrong annotation. By-similarity transfer between close orthologues is usually right, curator inference is usually right, and a homeodomain really does predict a nuclear protein. The claim here is narrower and it is about provenance: three quarters of these statements are measurements and a quarter are not, and nothing in the text a bulk import reads distinguishes them. The risk is a graph that presents all four as facts of the same kind.
- E2strong confidence 4 of 5: Replicated in peer-reviewed work by more than one group.database
82 of the 299 accession-carrying gene entries (27.4%) name a subnuclear or mitotic structure in their UniProt subcellular-location values, while only 2 of the graph's 25 highest-degree gene entries (gene-ell and gene-kat7) do.
UniProtKB REST API location values for 299 graph accessions, matched against a subnuclear/mitotic term list, 2026-09-20 · UniProt Consortium · UniProtKB 2026What this evidence cannot show
The 82 figure depends on a TERM LIST and is therefore bounded by it, in the same way rule 70 bounds a noncoding-element absence. Terms matched: speckle, Cajal, nucleol*, PML body, lamina, chromocent*, heterochromat*, nuclear body, nucleoplasm, nucleus matrix, telomere, centromere, kinetochore, spindle, midbody, centrosome. Terms NOT matched and therefore not counted: paraspeckle, perinucleolar compartment, Polycomb body, transcription factory, nuclear pore, condensate, and any structure named only inside a free-text note rather than as a location value. 'Nucleoplasm' is arguably not a structure and inflates the count slightly. Degree is computed over all edge files at the time of the run and changes as other beats write.
Evidence that argues against this (1)
- The low top-25 overlap could be an artefact of degree rather than of annotation: high-degree genes in this graph are chosen for their role in the fusion complex, and complex-resident chromatin proteins are exactly the class least likely to have a named nuclear body. The honest reading is not that UniProt neglects our genes but that OUR genes are of a type for which subnuclear terms are rarely appropriate - which is itself the argument for reading imaging papers rather than fetching database fields.
worked example of ECO:0000250, transferred from a mouse kidney paper
worked example of ECO:0000255, a homeodomain profile match
worked example of a location value with no evidence array at all
worked example of ECO:0000305 curator inference, for ASH2L
worked example of an uncoded free-text NOTE that a 2024 measurement contradicts
KMT2B's nuclear annotation is experimentally coded but the experiment is nuclear-extract proteomics, not imaging; no subnuclear data exists
- related to →CTR9 — a PAF1C subunit the field assumes is a fusion partner, with no paper that tested it
core elongation machinery whose localisation is by-similarity only
- related to →RTF1 — the PAF1C subunit the graph was missing, on a complex that does bind the retained KMT2A fragment
core elongation machinery whose localisation is by-similarity only
P-TEFb catalytic subunit whose UniProt location values carry no evidence code
same instrument, same limitation: this table is built entirely from UniProt localisation annotations and inherits their weaknesses