SOFT files name experiment accessions that carry no data¶
Status: open, unreported Found: 2026-09-15 Archives: NCBI (GEO, SRA) Severity: resolves to zero files, silently
The most dangerous pathology found so far, because it afflicts the route that is otherwise the best one. A caller that trusts the SOFT family file alone can come away with a complete-looking list of experiment accessions that have no runs at all.
Symptom¶
A GEO series' SOFT family file names experiment accessions in
!Sample_relation = SRA:. The accessions exist in NCBI's db=sra — they are not typos
and they are not withdrawn — but they carry no runs, so nothing can be downloaded.
Meanwhile elink gds→sra names a different, disjoint set of experiments for the same
series, and those do carry runs.
Nothing in either answer signals which is which. Both look like ordinary successes.
Affected accessions¶
Found by comparing the two routes across all 13,045 series in reprocessed-gse. Three
series return sets of equal size with zero overlap:
| Series | SOFT names | ELink names | Overlap |
|---|---|---|---|
| GSE114373 | 25 experiments | 25 experiments | 0 |
| GSE150508 | 1 experiment | 1 experiment | 0 |
| GSE164404 | 1 experiment | 1 experiment | 0 |
Verified for the first two:
| Series | Accession | Source | In NCBI db=sra |
Runs in ENA |
|---|---|---|---|---|
| GSE114373 | SRX10584613 | SOFT | yes | 0 |
| GSE114373 | SRX10647230 | ELink | yes | 2 |
| GSE150508 | SRX7571191 | SOFT | yes | 0 |
| GSE150508 | SRX9670669 | ELink | yes | 2 |
In both cases the ELink experiments belong to the same BioProject the SOFT file itself
records — PRJNA471193 and PRJNA632602 respectively. So GEO knows the right project and
still points at the wrong experiments within it.
Prevalence¶
Measured directly, 2026-09-15: 3,000 experiments drawn in visit order from all 308,639 that the SOFT census returned, each asked for its runs through ENA.
| Value | |
|---|---|
| Experiments with no runs | 37 / 3,000 = 1.23% (95% CI 0.84–1.63%) |
| Extrapolated over all 308,639 | ~3,807 (CI 2,588–5,026) |
| Route failures | 0 |
An earlier figure of ~4,238 (1.37%) was reached indirectly, by sampling only the 23,546 experiments the BioProject→ENA route did not confirm and finding 18% of those dead. The two agree within their confidence intervals, but the direct measurement is the one to quote: it samples the whole population rather than a subset chosen for being suspicious, so it needs no assumption about how the subset relates to the rest.
The figure is from a seeded draw, so the corpus is reproducible from its name:
fetch survey run --route "experiment->run:ena_filereport" \
--corpus "sample:3000@results-of:gse->experiment:soft_family@reprocessed-gse"
It replaced an earlier --limit 3000 run recorded under the full corpus name
(why).
The two draws are disjoint, and both found 37 empty experiments out of 3,000.
What "no runs" means here¶
It means ENA's read_run report returns nothing for the accession. A separate 40-experiment
check found none of the run-less accessions had runs at NCBI either, so these are dead
rather than un-mirrored — though that sub-question rests on the smaller sample.
Diagnosis¶
The submission was replaced. The original experiment records persist in SRA as metadata shells with no runs attached, the replacements were registered under new accessions, and Entrez's link table was updated while the GEO SOFT record was not.
Two further series, GSE140021 and GSE195844, show a partial version of the same thing:
overlapping sets where each route holds accessions the other lacks (12 and 92 SOFT-only
respectively).
Reproducer¶
# What GEO's own record says
curl -s "https://ftp.ncbi.nlm.nih.gov/geo/series/GSE150nnn/GSE150508/soft/GSE150508_family.soft.gz" \
| gunzip | grep -oE 'SRX[0-9]+' | sort -u
# -> SRX7571191
# It exists in SRA...
curl -s "https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=sra&term=SRX7571191%5BACCN%5D&retmode=json" \
| jq -r '.esearchresult.count'
# -> 1
# ...but has no runs.
curl -s "https://www.ebi.ac.uk/ena/portal/api/filereport?accession=SRX7571191&result=read_run&fields=run_accession&format=tsv&limit=0"
# -> header only
# ELink names a different experiment, which does have runs.
curl -s "https://www.ebi.ac.uk/ena/portal/api/filereport?accession=SRX9670669&result=read_run&fields=run_accession&format=tsv&limit=0"
# -> two runs
Why this changes the recommendation¶
The route comparison shows SOFT finding experiments for 2,280 series that ELink cannot reach, against 10 the other way. On completeness alone SOFT wins overwhelmingly, and that remains true.
But completeness is not correctness. An experiment accession is not evidence that data exists. The resolver must verify that resolved experiments carry runs before reporting them, and prefer the live set where two routes disagree.
This is cheap to do — one ENA filereport call already needed for the file layer — and it converts a silent zero-file download into a diagnosable answer.
Workaround¶
Resolve experiments by whichever route, then confirm each carries runs. Where SOFT and ELink disagree and only one side has runs, take the side that does, and record the divergence: a series whose SOFT record is stale is worth reporting to GEO.