Lesson 14 of 20 · 10 min
GEO and Functional-Genomics Archives
By the end of this lesson you will be able to walk into the world's largest store of published gene-expression data, read its accessions on sight, and pull down a study someone else generated so you can re-analyze it yourself — no new wet-lab work required.
What GEO is, and why it exists
Every database in this module so far has been about a thing: a pathway in KEGG and Reactome, an interaction edge in STRING. This one is about a measurement. Functional genomics is the branch of biology that measures what genes are actually doing in a sample — which are switched on, how strongly, under what condition. When a lab measures the expression of every gene at once, by microarray or RNA-seq, and publishes the paper, the raw numbers have to live somewhere permanent. For most of the world, that somewhere is GEO.
GEO — the Gene Expression Omnibus — is NCBI's public archive for functional-genomics data. Recall the two hubs from The Two Hubs: NCBI Entrez and EMBL-EBI: GEO is the NCBI-side archive, searchable with the same E-utilities you have used all course.
It exists because most journals now enforce a rule: if a paper's conclusion rests on an expression experiment, the data must be deposited publicly first, under a stable accession the paper cites. That single policy is why GEO holds hundreds of thousands of studies — and why, when you want to re-analyze a published dataset, GEO is the first place you look.
Reading GEO accessions: GSE, GSM, GPL
GEO uses three core accession prefixes, nesting the same way the raw-data accessions did in Project and Sample Accessions Across INSDC. An accession is a stable, permanent ID for one database record; the prefix tells you which layer of a study you are looking at.
| Prefix | Object | What it names |
|---|---|---|
GSE | Series | One whole study — all samples, one publication |
GSM | Sample | The measurements from one biological sample |
GPL | Platform | The chip or sequencer design the samples were run on |
A Series (GSE) is the umbrella: "we profiled 286 breast tumours." Inside it sit many Samples (GSM…), one per tumour. Every sample declares which Platform (GPL…) produced it — for example GPL96, the Affymetrix Human Genome U133A microarray, a heavily used platform in breast-cancer literature. A fourth prefix, GDS (DataSet), names a curated, cleaned-up version of a Series that GEO staff assemble for a subset of studies; you search GDS records but download GSE records.
The rule to hold onto: you cite a GSE, you download a GSE, and the GSM samples come bundled inside it. A Platform is shared across thousands of studies — GPL96 is referenced by an enormous number of Series, because it describes hardware, not any one experiment.
SOFT and MINiML: the formats GEO emits
GEO hands you a study in one of two structured text formats, and knowing which is which saves confusion later.
- SOFT (Simple Omnibus Format in Text) — a flat, line-oriented text format. Metadata lines begin with a caret or exclamation mark, and the expression matrix follows as tab-delimited rows. It is easy to stream and easy to parse.
- MINiML (MIAME Notation in Markup Language, pronounced "minimal") — the same information expressed as XML, better when you want a strict, machine-validated tree.
Both carry the same content; SOFT is what most parsing libraries expect. The Python package GEOparse reads a SOFT file straight into pandas-style tables and is the everyday tool for this job:
import GEOparse
# Download and parse a whole Series in one call.
gse = GEOparse.get_GEO(geo="GSE2034", destdir="./geo_data")
print(gse.metadata["title"]) # the study's title
print(len(gse.gsms), "samples") # each GSM is one tumour
print(gse.gpls.keys()) # -> platform GPL96A trap that catches first-timers: a GSE file gives you the expression matrix keyed by the platform's own probe IDs, not by gene symbols. On GPL96 the BRCA1 measurement is filed under Affymetrix probe-set 204531_s_at, not under "BRCA1". Before you can say anything about BRCA1 you must map probes to genes using the GPL platform annotation table — which GEOparse loads for you as gse.gpls["GPL96"].table. Skip that step and you will silently plot the wrong gene.
Finding BRCA1 studies with E-utilities
Say you want every GEO study that profiled BRCA1 (NCBI Gene 672, RefSeq mRNA NM_007294, UniProt P38398). Search the gds Entrez database with the same Biopython ESearch you met earlier, respecting the unauthenticated 3 req/s cap:
from Bio import Entrez
Entrez.email = "[email protected]" # NCBI requires a contact address
handle = Entrez.esearch(
db="gds", # the GEO DataSets Entrez database
term="BRCA1[Gene Name] AND Homo sapiens[Organism] AND GSE[Entry Type]",
)
record = Entrez.read(handle)
print(record["Count"], "series mention BRCA1")Each hit resolves to a GSE accession you can hand to GEOparse. A classic example is GSE2034, the 286-sample breast-cancer series on GPL96 — exactly the kind of published dataset you would pull to check how BRCA1 behaves across tumours without running a single new array.
ArrayExpress, now folded into BioStudies
GEO is the NCBI archive; Europe historically ran its own equivalent, ArrayExpress, at EMBL-EBI. In 2022 EBI retired the standalone ArrayExpress interface and folded its holdings into BioStudies, EBI's general-purpose archive for the supplementary data behind a paper. ArrayExpress accessions (E-MTAB-…) still resolve; they now live as a collection inside BioStudies rather than a separate system.
Practically: GEO and the BioStudies ArrayExpress collection are the two front doors for expression data, and — like the INSDC mirrors — a study deposited in one is often brokered to the other, so the same experiment can carry both a GSE and an E-MTAB- label.
| GEO | ArrayExpress / BioStudies | |
|---|---|---|
| Home | NCBI | EMBL-EBI |
| Series accession | GSE… | E-MTAB-… |
| Status | Active, primary | Folded into BioStudies |
When you actually come here
You come to GEO for one reason above all: to re-analyze data you did not generate. A paper reports a result; you want to run your own differential-expression test, check a gene the authors ignored, or pool their samples with yours. The GSE cited in the methods section is your door back to the raw numbers.
Downloading and parsing is only step one. Normalizing counts and testing which genes change, so a threshold like q ≤ 0.05 means something, is the subject of our RNA-seq differential expression guide. GEO gives you the input; that pipeline turns it into a finding.
You can now read a GEO accession on sight, know a GSE is what you fetch, choose SOFT over MINiML with a reason, and find every published BRCA1 study without leaving your terminal.