GEO series to GEO sample, via the SOFT family file¶
Route id: gse->geo_sample:soft_family
Provider: GEO FTP
Direction: GSE → GSM
The membership question: which samples belong to this series. It is the one thing the INSDC side cannot answer at all — a GSM is a GEO identity, and ENA has never heard of it.
curl -s 'https://ftp.ncbi.nlm.nih.gov/geo/series/GSE236nnn/GSE236084/soft/GSE236084_family.soft.gz' \
| gzip -dc | grep '^\^SAMPLE'
One request per series, returning every sample in it, from the same file that carries the BioProject relation and the per-sample SRA relations. The whole GEO half of the relation table comes out of this single download.
Measured¶
Corpus: reprocessed-gse, all 13,045 GEO series the reprocessing pipeline
has had to resolve. Surveyed: 2026-09-15.
| Resolved | 13,038 |
| Empty | 0 |
| Failed | 7 |
| Unique GEO samples | 319,023 |
Not one series that could be fetched named zero samples. That is worth stating because it is the exception in this project: every other census here has an empty column with something in it. A series is defined by its samples, and GEO's own record of them is complete.
The 7 failures are the same series whose SOFT family file cannot be fetched at all — GSE207991 among them, which is private on GEO, so the failure is the correct answer rather than a transport problem.
Compared with esummary db=gds: identical¶
Both routes over all 13,045 series (2026-09-15):
soft_family |
gds_summary |
|
|---|---|---|
| Resolved | 13,038 | 13,038 |
| Empty | 0 | 7 |
| Failed | 7 | 0 |
| Unique GEO samples | 319,023 | 319,023 |
| Agree exactly | 13,038 | 13,038 |
| Disagree on membership | 0 | 0 |
Sample for sample, the same 319,023. Not one series where the two surfaces
list different members. The only difference is the 7 series whose SOFT file
cannot be fetched at all, where gds_summary returns empty rather than failing.
That is worth stating because it is the exception. The same two surfaces, asked which BioProject a series belongs to, disagree on 466 series — and 41% of the extra answers are umbrella projects that must not be used. Membership is one of the few things GEO's own record and NCBI's index of it agree about completely.
Prefer gds_summary when a single series is the question: one API call
against a multi-megabyte gzip download, and it never fails. Prefer soft_family
when anything else about the samples is needed — the SRA relations, the
BioProject, the per-sample protocol text the assay layer
reads — because all of it comes out of the same download, and 319,023 samples
across 13,038 series is 24.5 per series, so the alternative is 24.5 further
requests.