| name | remap-database |
| description | Query ReMap 2022 TF ChIP-seq peak database via REST API and BED downloads. Retrieve TF peaks overlapping a region (chr:start-end), peaks near a gene, TFs by species, peaks filtered by biotype (promoter, enhancer), and BED files for a TF-cell type pair. Use for TF co-occupancy, regulatory annotation, and TF binding atlases. Use jaspar-database for PWM motifs; encode-database for ENCODE tracks. |
| license | CC-BY-4.0 |
ReMap Database
Overview
ReMap 2022 is an integrative database of transcription factor (TF), cofactor, and chromatin regulator binding sites derived from uniformly reprocessed ChIP-seq experiments. The 2022 release catalogs 165 million non-redundant peaks from 8,113 ChIP-seq datasets covering 1,210 TFs across human (hg38/hg19), mouse (mm10), Drosophila, and Arabidopsis genomes. All peaks are called with a consistent pipeline from public GEO/ArrayExpress experiments. Access is via the ReMap 2022 REST API at https://remap2022.univ-amu.fr/api/ and bulk BED file downloads; no authentication required.
When to Use
- Finding all TFs with ChIP-seq peaks overlapping a genomic region of interest (e.g., a GWAS SNP locus or candidate enhancer)
- Retrieving TF peaks near a gene's transcription start site to map its proximal regulatory landscape
- Listing all TFs available in ReMap for human or mouse with their peak and dataset counts
- Filtering ChIP-seq peaks by regulatory biotype annotation (promoter, enhancer, exon, intron, intergenic) for a TF in a specific cell line
- Downloading a BED file of all binding peaks for a TF across all cell types for offline analysis
- Identifying co-binding TFs at a locus by querying all overlapping peaks and grouping by TF name
- Use
jaspar-database instead when you need PWM/PFM sequence models of TF binding specificity rather than ChIP-seq peak locations
- For ENCODE-specific regulatory tracks and accessibility data use
encode-database; ReMap aggregates TF binding peaks from many sources including ENCODE
Prerequisites
- Python packages:
requests, pandas, matplotlib
- Data requirements: genomic coordinates (GRCh38/hg38 or hg19), gene names, or TF names
- Environment: internet connection; no API key required
- Rate limits: no official published limits; use
time.sleep(0.5) between batch requests to avoid server overload
- Note: The ReMap API is a research API; endpoint availability may vary. All examples include a BED download fallback.
pip install requests pandas matplotlib
Quick Start
import requests
REMAP_API = "https://remap2022.univ-amu.fr/api/v1"
r = requests.get(f"{REMAP_API}/peaks/overlap/", params={
"chr": "chr17",
"start": 7_670_000,
"end": 7_690_000,
"assembly": "hg38"
}, timeout=30)
r.raise_for_status()
peaks = r.json()
print(f"Peaks overlapping TP53 locus: {len(peaks)}")
tfs = set(p.get("name", "").split(":")[0] for p in peaks)
print(f"Unique TFs: {len(tfs)}")
print(f"TF names (first 10): {sorted(tfs)[:10]}")
Core API
Query 1: Region Overlap
Find all TF ChIP-seq peaks overlapping a specified genomic window. Returns peak records including TF name, cell type, coordinates, and score.
import requests, time, pandas as pd
REMAP_API = "https://remap2022.univ-amu.fr/api/v1"
def query_region(chrom, start, end, assembly="hg38", timeout=30):
"""Return all ReMap peaks overlapping [chrom:start-end]."""
r = requests.get(f"{REMAP_API}/peaks/overlap/", params={
"chr": chrom, "start": start, "end": end, "assembly": assembly
}, timeout=timeout)
r.raise_for_status()
return r.json()
peaks = query_region("chr17", 7_670_000, 7_690_000, assembly="hg38")
print(f"Total peaks: {len(peaks)}")
rows = []
for p in peaks:
parts = p.get("name", "::").split(":")
tf = parts[0] if len(parts) > 0 else ""
exp = parts[1] if len(parts) > 1 else ""
cell = parts[2] if len(parts) > 2 else ""
rows.append({
: p.get(, p.get(, )),
: p.get(, ),
: p.get(, ),
: tf,
: exp,
: cell,
: p.get(, ),
})
df = pd.DataFrame(rows)
()
()
import pandas as pd
def query_region_from_bed(bed_file, chrom, start, end):
"""Filter a ReMap BED file for overlapping peaks."""
cols = ["chr", "start", "end", "name", "score", "strand",
"thick_start", "thick_end", "color"]
df = pd.read_csv(bed_file, sep="\t", header=None, names=cols,
compression="infer")
mask = (df["chr"] == chrom) & (df["end"] > start) & (df["start"] < end)
return df[mask].reset_index(drop=True)
Query 2: Gene-Centric Query
Retrieve all TF ChIP-seq peaks near a gene's TSS, providing a promoter-proximal regulatory landscape for the gene.
import requests, time, pandas as pd
REMAP_API = "https://remap2022.univ-amu.fr/api/v1"
def query_gene_peaks(gene_name, assembly="hg38", timeout=30):
"""Return all ReMap peaks near a gene TSS."""
r = requests.get(f"{REMAP_API}/peaks/gene/", params={
"gene": gene_name, "assembly": assembly
}, timeout=timeout)
r.raise_for_status()
return r.json()
peaks = query_gene_peaks("MYC", assembly="hg38")
print(f"Peaks near MYC TSS: {len(peaks)}")
rows = []
for p in peaks:
parts = p.get("name", "::").split(":")
rows.append({
"tf_name": parts[0] if parts else "",
"cell_type": parts[2] if len(parts) > 2 else "",
"chr": p.get("chr", p.get("chrom", "")),
"start": p.get("start", 0),
"end": p.get("end", 0),
"score": p.get("score", 0),
: p.get(, ),
})
df = pd.DataFrame(rows)
()
(df[].value_counts().head().to_string())
()
Query 3: TF Browser
List all TFs available in ReMap for a given genome assembly, with peak and experiment counts.
import requests, time, pandas as pd
REMAP_API = "https://remap2022.univ-amu.fr/api/v1"
def list_tfs(assembly="hg38", timeout=30):
"""Return all TFs in ReMap for the given assembly with statistics."""
r = requests.get(f"{REMAP_API}/tfbs/list/", params={"assembly": assembly}, timeout=timeout)
r.raise_for_status()
return r.json()
def get_database_stats(assembly="hg38", timeout=30):
"""Return overall database statistics for the assembly."""
r = requests.get(f"{REMAP_API}/stats/", params={"assembly": assembly}, timeout=timeout)
r.raise_for_status()
return r.json()
try:
stats = get_database_stats("hg38")
print(f"ReMap 2022 hg38 statistics:")
for k, v in stats.items():
print(f" {k}: {v}")
except Exception as e:
print(f"Stats endpoint unavailable: {e}")
print("ReMap 2022 hg38: 165M peaks, 1,210 TFs, 8,113 datasets (from publication)")
try:
tfs = list_tfs("hg38")
df_tfs = pd.DataFrame(tfs)
print(f"\nTFs available (hg38): ")
df_tfs.columns:
top = df_tfs.nlargest(, )[[, , ]]
()
(top.to_string(index=))
Exception e:
()
()
Query 4: TF-Specific Peak Query
Retrieve all peaks for a named TF in a given assembly, optionally filtered by cell type.
import requests, time, pandas as pd
REMAP_API = "https://remap2022.univ-amu.fr/api/v1"
def query_tf_peaks(tf_name, assembly="hg38", timeout=30):
"""Return all ChIP-seq peaks for a TF across all cell types."""
r = requests.get(f"{REMAP_API}/tfbs/name/", params={
"name": tf_name, "assembly": assembly
}, timeout=timeout)
r.raise_for_status()
return r.json()
peaks = query_tf_peaks("CTCF", assembly="hg38")
print(f"CTCF peaks (all cell types): {len(peaks)}")
rows = []
for p in peaks:
parts = p.get("name", "::").split(":")
rows.append({
"tf_name": parts[0] if parts else "",
"cell_type": parts[2] if len(parts) > 2 else "",
"chr": p.get("chr", p.get("chrom", "")),
"start": p.get("start", 0),
"end": p.get("end", 0),
"score": p.get(, ),
: p.get(, ),
})
df = pd.DataFrame(rows)
()
()
()
df[] = df[] - df[]
(
)
Query 5: Biotype Filter and Regulatory Annotation
Filter peaks by regulatory biotype annotation to identify binding at promoters, enhancers, or intergenic regions.
import requests, pandas as pd, matplotlib.pyplot as plt
REMAP_API = "https://remap2022.univ-amu.fr/api/v1"
def get_biotypes(assembly="hg38", timeout=30):
"""List all regulatory biotype categories available."""
r = requests.get(f"{REMAP_API}/biotypes/", params={"assembly": assembly}, timeout=timeout)
r.raise_for_status()
return r.json()
def query_tf_by_biotype(tf_name, biotype, assembly="hg38", timeout=30):
"""Retrieve TF peaks filtered by regulatory biotype."""
r = requests.get(f"{REMAP_API}/peaks/biotype/", params={
"name": tf_name, "biotype": biotype, "assembly": assembly
}, timeout=timeout)
r.raise_for_status()
return r.json()
try:
biotypes = get_biotypes("hg38")
print(f"Available biotypes: {biotypes}")
except Exception:
biotypes = ["promoter", "enhancer", "exon", "intron", "intergenic", "UTR"]
print(f"Using known biotypes: {biotypes}")
peaks = query_tf_peaks("CTCF", assembly="hg38")
():
r = requests.get(,
params={: tf_name, : assembly}, timeout=timeout)
r.raise_for_status()
r.json()
peaks = query_tf_peaks()
rows = [{: p.get(, ),
: p.get(, ).split()[] (p.get(,).split()) > }
p peaks]
df = pd.DataFrame(rows)
biotype_counts = df[].value_counts()
biotype_counts = biotype_counts[biotype_counts > ]
()
(biotype_counts.to_string())
top_cells = df[].value_counts().head().index.tolist()
pivot = (df[df[].isin(top_cells)]
.groupby([, ])
.size()
.unstack(fill_value=))
fig, ax = plt.subplots(figsize=(, ))
pivot.plot(kind=, stacked=, ax=ax, colormap=, edgecolor=)
ax.set_xlabel()
ax.set_ylabel()
ax.set_title()
ax.legend(title=, bbox_to_anchor=(, ), loc=, fontsize=)
plt.tight_layout()
plt.savefig(, dpi=, bbox_inches=)
()
Key Concepts
Peak Name Field Format
The name field in every ReMap peak record encodes three pieces of information as a colon-separated string:
TF_NAME:EXPERIMENT_ID:CELL_TYPE
For example: CTCF:GSE30263.SRX028592:GM12878
Always parse with .split(":") and guard against missing parts. Some records may have fewer than three components if metadata is incomplete.
Assemblies
| Assembly code | Organism | Notes |
|---|
hg38 | Homo sapiens (GRCh38) | Primary human assembly in ReMap 2022 |
hg19 | Homo sapiens (GRCh37) | Legacy human assembly; fewer datasets |
mm10 | Mus musculus | Primary mouse assembly |
dm6 | Drosophila melanogaster | Smaller dataset collection |
tair10 | Arabidopsis thaliana | Plant TF dataset |
BED File Download (API Fallback)
When the REST API is unavailable or for offline bulk analysis, ReMap provides pre-built BED files at https://remap2022.univ-amu.fr/download_page. Key files:
remap2022_all_macs2_hg38_v1_0.bed.gz — all peaks, hg38 (large, ~5 GB)
remap2022_{TF}_macs2_hg38_v1_0.bed.gz — per-TF peak files
remap2022_crm_macs2_hg38_v1_0.bed.gz — cis-regulatory modules (merged peaks)
import pandas as pd
def load_remap_bed(bed_path, chrom=None, start=None, end=None):
"""
Load a ReMap BED file with optional region filter.
Columns: chr, start, end, name (TF:exp:cell), score, strand,
thick_start, thick_end, itemRgb
"""
cols = ["chr", "start", "end", "name", "score", "strand",
"thick_start", "thick_end", "itemRgb"]
df = pd.read_csv(bed_path, sep="\t", header=None, names=cols,
compression="infer", low_memory=False)
if chrom:
df = df[df["chr"] == chrom]
if start is not None and end is not None:
df = df[(df["end"] > start) & (df["start"] < end)]
parts = df["name"].str.split(":", expand=True)
df["tf_name"] = parts[0]
df["experiment_id"] = parts[1] if 1 in parts.columns else ""
df["cell_type"] = parts[] parts.columns
df.reset_index(drop=)
Common Workflows
Workflow 1: TF Co-occupancy Analysis at a Locus
Goal: Identify all TFs with ChIP-seq evidence at a genomic locus and rank by peak count, then export a co-occupancy matrix.
import requests, time, pandas as pd, matplotlib.pyplot as plt
REMAP_API = "https://remap2022.univ-amu.fr/api/v1"
def query_region(chrom, start, end, assembly="hg38", timeout=30):
r = requests.get(f"{REMAP_API}/peaks/overlap/", params={
"chr": chrom, "start": start, "end": end, "assembly": assembly
}, timeout=timeout)
r.raise_for_status()
return r.json()
def parse_peaks(peaks):
rows = []
for p in peaks:
parts = p.get("name", "::").split(":")
rows.append({
"tf_name": parts[0] if len(parts) > 0 else "unknown",
"cell_type": parts[2] if len(parts) > 2 else "unknown",
"chr": p.get("chr", p.get("chrom", "")),
"start": p.get("start", 0),
"end": p.get("end", 0),
"score": p.get("score", ),
})
pd.DataFrame(rows)
peaks = query_region(, , , assembly=)
df = parse_peaks(peaks)
()
tf_summary = (df.groupby()
.agg(peak_count=(, ),
cell_types=(, ),
mean_score=(, ))
.sort_values(, ascending=))
()
(tf_summary.head().to_string())
tf_summary.to_csv()
top = tf_summary.head()
fig, ax = plt.subplots(figsize=(, ))
ax.barh(top.index[::-], top[][::-], color=, edgecolor=)
ax.set_xlabel()
ax.set_title()
plt.tight_layout()
plt.savefig(, dpi=, bbox_inches=)
()
Workflow 2: Gene Regulatory Profile — TSS-Proximal TF Binding Atlas
Goal: For a list of genes, retrieve their promoter-proximal TF binding profiles and compare the TF repertoires across genes.
import requests, time, pandas as pd
REMAP_API = "https://remap2022.univ-amu.fr/api/v1"
def query_gene_peaks(gene_name, assembly="hg38", timeout=30):
try:
r = requests.get(f"{REMAP_API}/peaks/gene/", params={
"gene": gene_name, "assembly": assembly
}, timeout=timeout)
r.raise_for_status()
return r.json()
except Exception as e:
print(f" Warning: {gene_name} failed — {e}")
return []
genes_of_interest = ["MYC", "TP53", "BRCA1", "EGFR", "CDK4"]
gene_tf_profiles = {}
for gene in genes_of_interest:
peaks = query_gene_peaks(gene, assembly="hg38")
if peaks:
tfs = set()
for p in peaks:
parts = p.get("name", "").split(":")
if parts:
tfs.add(parts[0])
gene_tf_profiles[gene] = tfs
print(f"{gene}: {len(peaks)} peaks, {len(tfs)} unique TFs")
time.sleep(0.5)
all_tfs = (().union(*gene_tf_profiles.values()))
matrix = pd.DataFrame(
{gene: [ tf gene_tf_profiles.get(gene, ()) tf all_tfs]
gene genes_of_interest},
index=all_tfs
)
()
()
matrix.to_csv()
()
Workflow 3: Download and Analyze TF Peak BED File
Goal: Download a TF-specific ReMap BED file and analyze its genomic distribution with pandas.
import requests, gzip, io, pandas as pd, time
REMAP_DOWNLOAD_BASE = "https://remap2022.univ-amu.fr/storage/remap2022/hg38/MACS2"
def download_tf_bed(tf_name, assembly="hg38", save_path=None):
"""
Attempt to download TF-specific BED file from ReMap.
Falls back to API region query if download unavailable.
"""
filename = f"remap2022_{tf_name}_macs2_{assembly}_v1_0.bed.gz"
url = f"{REMAP_DOWNLOAD_BASE}/{filename}"
print(f"Attempting download: {url}")
r = requests.get(url, stream=True, timeout=60)
if r.status_code == 200:
if save_path:
with open(save_path, "wb") as f:
for chunk in r.iter_content(chunk_size=8192):
f.write(chunk)
print(f"Saved: {save_path}")
return save_path
else:
content = b"".join(r.iter_content(chunk_size=8192))
cols = ["chr", "start", "end", "name", "score", "strand",
, , ]
gzip.(io.BytesIO(content), ) gz:
df = pd.read_csv(gz, sep=, header=, names=cols)
df
:
()
():
parts = df[]..split(, expand=)
df = df.copy()
df[] = parts[]
df[] = parts[] parts.columns
df[] = df[] - df[]
()
()
()
(
)
()
chr_counts = df[].value_counts().head()
(chr_counts.to_string())
df
Key Parameters
| Parameter | Endpoint | Default | Range / Options | Effect |
|---|
chr | /peaks/overlap/ | — | chr1–chrX, chrY, chrM | Chromosome for region query (include chr prefix) |
start | /peaks/overlap/ | — | Integer genomic coordinate | Region start (0-based) |
end | /peaks/overlap/ | — | Integer genomic coordinate | Region end (exclusive) |
assembly | All endpoints | — | hg38, hg19, mm10, dm6, tair10 | Genome assembly for coordinates and peak lookup |
gene | /peaks/gene/ | — | HGNC gene symbol (e.g., TP53, MYC) | Queries peaks near the gene's annotated TSS |
name | /tfbs/name/ | — | TF name as in ReMap (e.g., CTCF, SP1) | TF name is case-sensitive; match ReMap TF naming |
biotype | /peaks/biotype/ | — | promoter, enhancer, exon, intron, intergenic, UTR | Filters peaks by Ensembl regulatory biotype |
timeout | All requests | 30 | Integer seconds | Increase to 60–120 for large gene/TF queries |
Best Practices
-
Parse the name field defensively: The TF:experiment:cell_type format may have fewer than three components for some records. Always guard with parts[n] if len(parts) > n else "".
-
Use BED downloads for genome-wide analyses: Querying large genomic regions or all peaks for a TF via the REST API can time out. For whole-genome or per-chromosome scans, download the per-TF or per-assembly BED files from the ReMap download page and filter locally with pandas or bedtools.
-
Cross-reference with JASPAR for sequence evidence: ReMap peaks show where TF binding was detected by ChIP-seq (positional evidence); JASPAR PWMs show what sequence the TF prefers (motif evidence). For robust regulatory annotation, require both: a ReMap peak in the region AND a JASPAR motif hit within the peak.
-
Use time.sleep(0.5) in batch loops: The ReMap API serves a research community; polite request pacing prevents throttling.
-
Validate assembly coordinates: ReMap 2022 hg38 peaks use 0-based half-open BED coordinates ([start, end)). When comparing with VCF or 1-based GFF coordinates, add 1 to start.
Common Recipes
Recipe: Find TFs Binding at a GWAS SNP
When to use: Prioritize functional candidates from a GWAS hit by identifying which TFs bind at the SNP location.
import requests
REMAP_API = "https://remap2022.univ-amu.fr/api/v1"
def tfs_at_snp(chrom, pos, window=500, assembly="hg38"):
"""Find TFs with ChIP-seq peaks overlapping a SNP position ± window bp."""
r = requests.get(f"{REMAP_API}/peaks/overlap/", params={
"chr": chrom, "start": pos - window, "end": pos + window,
"assembly": assembly
}, timeout=30)
r.raise_for_status()
peaks = r.json()
tfs = {}
for p in peaks:
parts = p.get("name", "::").split(":")
tf = parts[0] if parts else "unknown"
tfs[tf] = tfs.get(tf, 0) + 1
return dict(sorted(tfs.items(), key=lambda x: -x[1]))
snp_tfs = tfs_at_snp("chr5", 1_286_401, window=500, assembly="hg38")
print(f"TFs at TERT GWAS SNP (±500 bp): {len(snp_tfs)}")
for tf, count in list(snp_tfs.items())[:10]:
print(f" {tf:<20s} {count:3d} peaks")
Recipe: Compare TF Binding Profiles of Two Genes
When to use: Check whether two co-regulated genes share the same upstream TF binding landscape.
import requests, time
REMAP_API = "https://remap2022.univ-amu.fr/api/v1"
def get_gene_tfs(gene, assembly="hg38"):
try:
r = requests.get(f"{REMAP_API}/peaks/gene/", params={"gene": gene, "assembly": assembly}, timeout=30)
r.raise_for_status()
peaks = r.json()
return set(p.get("name", "").split(":")[0] for p in peaks if p.get("name", ""))
except Exception as e:
print(f"Warning: {gene} → {e}")
return set()
gene_a, gene_b = "MYC", "MYCN"
tfs_a = get_gene_tfs(gene_a)
time.sleep(0.5)
tfs_b = get_gene_tfs(gene_b)
shared = tfs_a & tfs_b
only_a = tfs_a - tfs_b
only_b = tfs_b - tfs_a
print(f"{gene_a} TFs: {len(tfs_a)} | {gene_b} TFs: {len(tfs_b)}")
print(f"Shared: {len(shared)} | {gene_a}-only: {len(only_a)} | {gene_b}-only: {(only_b)}")
()
()
Recipe: Export Region Peaks as BED
When to use: Export ReMap query results to BED format for downstream bedtools intersection or IGV visualization.
import requests, pandas as pd
REMAP_API = "https://remap2022.univ-amu.fr/api/v1"
def export_region_as_bed(chrom, start, end, outfile, assembly="hg38"):
"""Query ReMap region and save as 6-column BED file."""
r = requests.get(f"{REMAP_API}/peaks/overlap/", params={
"chr": chrom, "start": start, "end": end, "assembly": assembly
}, timeout=30)
r.raise_for_status()
peaks = r.json()
rows = [{
"chr": p.get("chr", p.get("chrom", "")),
"start": p.get("start", 0),
"end": p.get("end", 0),
"name": p.get("name", "."),
"score": p.get("score", 0),
"strand": p.get("strand", "."),
} for p in peaks]
df = pd.DataFrame(rows)
df = df.sort_values(["chr", "start"])
df.to_csv(outfile, sep="\t", header=False, index=False)
print(f"Saved {len(df)} peaks to {outfile}")
return df
export_region_as_bed("chr17", , , )
Troubleshooting
| Problem | Cause | Solution |
|---|
404 Not Found from API | Endpoint path changed or unavailable | Check https://remap2022.univ-amu.fr/api/ for current endpoint list; fall back to BED download |
Empty JSON list [] from region query | No peaks in region, or assembly mismatch | Verify coordinates are on the correct assembly; try a wider window (±10 kb) |
| Gene query returns empty | Gene symbol not recognized by ReMap | Try Ensembl gene symbol; some aliases are not mapped — verify with HGNC |
requests.exceptions.Timeout | Large region or slow server | Increase timeout=60; for regions >1 Mb use BED file download instead |
name field has only one component | Incomplete metadata in ReMap for that experiment | Guard with parts[n] if len(parts) > n else "unknown" |
| BED download 404 | Per-TF files use exact ReMap TF naming | Check TF name case and spelling at https://remap2022.univ-amu.fr/download_page |
| Duplicate peaks for same TF | Multiple experiments per TF in a cell type | Group by tf_name and count unique experiments; deduplicate peaks with bedtools merge |
Related Skills
jaspar-database — TF binding motif matrices (PWMs/PFMs); use alongside ReMap peak evidence for sequence-level validation
encode-database — ENCODE regulatory tracks including TF ChIP-seq, DNase-seq, and ATAC-seq; partially overlaps with ReMap
homer-motif-analysis — de novo motif discovery in ChIP-seq peak sets from ReMap or MACS3
macs3-peak-calling — call peaks from raw ChIP-seq BAM files; ReMap provides pre-called peaks from the same approach
regulomedb-database — regulatory variant scoring that integrates TF binding evidence similar to ReMap
References