Source: https://github.com/aipoch/medical-research-skills
When to Use
- You have many BED files and need numeric features for clustering, similarity search, or downstream supervised learning (e.g., ChIP-seq/ATAC-seq region sets).
- You want unsupervised embeddings of genomic regions to compare region sets across experiments (Region2Vec).
- You need joint embeddings of regions and metadata labels (e.g., tissue/cell type/condition) to enable cross-modal queries like Region → Label or Label → Region (BEDspace).
- You are analyzing single-cell ATAC-seq and want cell embeddings for clustering/annotation and integration with Scanpy workflows (scEmbed).
- You need a consensus peak set (“universe”) built from multiple BED files to standardize tokenization and region definitions across datasets (Universe construction).
Key Features
- Region2Vec: Word2vec-style unsupervised embeddings for genomic regions from tokenized BED data.
- BEDspace: StarSpace-based joint embedding space for region sets and metadata labels; supports similarity search and cross-modal retrieval.
- scEmbed: Single-cell ATAC-seq embedding workflow (tokenize cells → train → encode cells) compatible with Scanpy.
- Universe (Consensus Peaks) Builder: Generates reference peak sets using multiple statistical approaches (CC, CCF, ML, HMM).
- Utilities:
- Tokenization: Universe-based tokenization (hard/soft tokenization patterns).
- Evaluation: Embedding quality metrics (e.g., silhouette, Davies–Bouldin).
- BEDshift: Region randomization/null-model generation while preserving genomic context.
- BBClient / caching: Faster repeated access to BED resources.
- Text2BedNN: Neural search backend for genomic queries.
Additional details are commonly documented in: references/region2vec.md, references/bedspace.md, references/scembed.md, references/consensus_peaks.md, references/utilities.md.
Dependencies
- Python: 3.9+ (recommended)
- geniml: latest from PyPI (or GitHub main)
- Optional ML extras:
geniml[ml] (typically pulls PyTorch and related ML dependencies)
- Scanpy stack (for scEmbed workflows):
scanpy (plus anndata, numpy, scipy)
- StarSpace (for BEDspace training): external binary from https://github.com/facebookresearch/StarSpace
- Universe coverage generation:
uniwig (used to generate coverage tracks in universe workflows)
Example Usage
1) Install
# Base install
uv pip install geniml
# With ML extras (e.g., PyTorch and related dependencies)
uv pip install "geniml[ml]"
# Development version
uv pip install git+https://github.com/databio/geniml.git
2) End-to-end: Build a universe → tokenize BEDs → train Region2Vec → evaluate
# (A) Build coverage tracks (example pattern)
cat bed_files/*.bed > combined.bed
uniwig -m 25 combined.bed chrom.sizes coverage/
# (B) Build a universe (coverage cutoff method)
geniml universe build cc \
--coverage-folder coverage/ \
--output-file universe.bed \
--cutoff 5 \
--merge 100 \
--filter-size 50
# (C) Tokenize BED files, train Region2Vec, and evaluate embeddings
from geniml.tokenization import hard_tokenization
from geniml.region2vec import region2vec
from geniml.evaluation import evaluate_embeddings
# 1) Tokenize BED files against the universe
hard_tokenization(
src_folder="bed_files/",
dst_folder="tokens/",
universe_file="universe.bed",
p_value_threshold=1e-9,
)
# 2) Train Region2Vec
region2vec(
token_folder="tokens/",
save_dir="model/",
num_shufflings=1000,
embedding_dim=100,
)
# 3) Evaluate (requires labels/metadata aligned to embeddings)
metrics = evaluate_embeddings(
embeddings_file="model/embeddings.npy",
labels_file="metadata.csv",
)
print(metrics)
3) Single-cell ATAC-seq: tokenize cells → train scEmbed → cluster with Scanpy
import scanpy as sc
from geniml.scembed import ScEmbed
from geniml.io import tokenize_cells
# 1) Load AnnData
adata = sc.read_h5ad("scatac_data.h5ad")
# 2) Tokenize cells using a universe
tokenize_cells(
adata="scatac_data.h5ad",
universe_file="universe.bed",
output="tokens.parquet",
)
# 3) Train scEmbed
model = ScEmbed(embedding_dim=100)
model.train(dataset="tokens.parquet", epochs=100)
# 4) Encode cells and attach embeddings to AnnData
embeddings = model.encode(adata)
adata.obsm["scembed_X"] = embeddings
# 5) Standard Scanpy neighborhood graph + clustering + UMAP
sc.pp.neighbors(adata, use_rep="scembed_X")
sc.tl.leiden(adata)
sc.tl.umap(adata)
Implementation Details
Tokenization (Universe-based)
- Goal: Convert genomic intervals into discrete “tokens” defined by a reference universe (consensus peak set).
- Hard tokenization: Assigns intervals to universe bins/peaks deterministically (commonly used for Region2Vec/scEmbed pipelines).
- Key parameter:
p_value_threshold controls stringency of mapping/overlap significance (lower is stricter; overly strict thresholds can reduce coverage).
Region2Vec (Region Embeddings)
- Core idea: Treat each BED file (or region set) like a “document” and each universe peak like a “word”; learn embeddings using a word2vec-style objective.
- Important knobs:
embedding_dim: dimensionality of learned vectors (e.g., 50–300).
num_shufflings: increases training signal by shuffling/co-occurrence augmentation; higher values increase runtime.
BEDspace (Joint Region + Label Embeddings)
- Core idea: Learn a shared vector space for region sets and metadata labels using StarSpace, enabling:
- Region → Label retrieval (predict likely labels for a query region set)
- Label → Region retrieval (find region sets associated with a label)
- Operational requirement: StarSpace must be installed and its path provided/configured for training.
scEmbed (Single-cell Embeddings)
- Core idea: Apply Region2Vec-like training on tokenized single-cell accessibility profiles to produce cell embeddings.
- Best practice: Pre-tokenize cells (e.g., to Parquet) to reduce repeated preprocessing and speed up training.
- Downstream: Use embeddings as
adata.obsm[...] and run standard Scanpy steps (neighbors, Leiden, UMAP).
Universe Construction (Consensus Peaks)
- Purpose: Create a stable reference peak set for tokenization and cross-dataset comparability.
- Methods:
- CC (Coverage Cutoff): threshold-based peak calling from coverage.
- CCF (Coverage Cutoff Flexible): cutoff with flexible boundaries/confidence intervals.
- ML (Maximum Likelihood): probabilistic modeling of peak positions.
- HMM (Hidden Markov Model): state-based segmentation; typically most computationally intensive.
- Typical parameters:
--cutoff: minimum coverage to call peaks (CC/CCF).
--merge: merge distance for nearby peaks.
--filter-size: minimum peak length to keep.
Source: aipoch/medical-research-skills — distributed by TomeVault.
1---2name: geniml-23description: Machine learning toolkit for genomic interval (BED) data; use it when you need to tokenize BED collections and train embeddings for regions/cells/labels, build consensus peak universes, or run similarity search and downstream ML on chromatin accessibility datasets. Use when this capability is needed.4---5> **Source**: [https://github.com/aipoch/medical-research-skills](https://github.com/aipoch/medical-research-skills)67## When to Use89- **You have many BED files and need numeric features** for clustering, similarity search, or downstream supervised learning (e.g., ChIP-seq/ATAC-seq region sets).10- **You want unsupervised embeddings of genomic regions** to compare region sets across experiments (Region2Vec).11- **You need joint embeddings of regions and metadata labels** (e.g., tissue/cell type/condition) to enable cross-modal queries like *Region → Label* or *Label → Region* (BEDspace).12- **You are analyzing single-cell ATAC-seq** and want cell embeddings for clustering/annotation and integration with Scanpy workflows (scEmbed).13- **You need a consensus peak set (“universe”)** built from multiple BED files to standardize tokenization and region definitions across datasets (Universe construction).1415## Key Features1617- **Region2Vec**: Word2vec-style unsupervised embeddings for genomic regions from tokenized BED data.18- **BEDspace**: StarSpace-based joint embedding space for region sets and metadata labels; supports similarity search and cross-modal retrieval.19- **scEmbed**: Single-cell ATAC-seq embedding workflow (tokenize cells → train → encode cells) compatible with Scanpy.20- **Universe (Consensus Peaks) Builder**: Generates reference peak sets using multiple statistical approaches (CC, CCF, ML, HMM).21- **Utilities**:22 - **Tokenization**: Universe-based tokenization (hard/soft tokenization patterns).23 - **Evaluation**: Embedding quality metrics (e.g., silhouette, Davies–Bouldin).24 - **BEDshift**: Region randomization/null-model generation while preserving genomic context.25 - **BBClient / caching**: Faster repeated access to BED resources.26 - **Text2BedNN**: Neural search backend for genomic queries.2728> Additional details are commonly documented in: `references/region2vec.md`, `references/bedspace.md`, `references/scembed.md`, `references/consensus_peaks.md`, `references/utilities.md`.2930## Dependencies3132- **Python**: 3.9+ (recommended)33- **geniml**: latest from PyPI (or GitHub main)34- **Optional ML extras**: `geniml[ml]` (typically pulls **PyTorch** and related ML dependencies)35- **Scanpy stack (for scEmbed workflows)**: `scanpy` (plus `anndata`, `numpy`, `scipy`)36- **StarSpace (for BEDspace training)**: external binary from https://github.com/facebookresearch/StarSpace37- **Universe coverage generation**: `uniwig` (used to generate coverage tracks in universe workflows)3839## Example Usage4041### 1) Install4243```bash44# Base install45uv pip install geniml4647# With ML extras (e.g., PyTorch and related dependencies)48uv pip install "geniml[ml]"4950# Development version51uv pip install git+https://github.com/databio/geniml.git52```5354### 2) End-to-end: Build a universe → tokenize BEDs → train Region2Vec → evaluate5556```bash57# (A) Build coverage tracks (example pattern)58cat bed_files/*.bed > combined.bed59uniwig -m 25 combined.bed chrom.sizes coverage/6061# (B) Build a universe (coverage cutoff method)62geniml universe build cc \63 --coverage-folder coverage/ \64 --output-file universe.bed \65 --cutoff 5 \66 --merge 100 \67 --filter-size 5068```6970```python71# (C) Tokenize BED files, train Region2Vec, and evaluate embeddings72from geniml.tokenization import hard_tokenization73from geniml.region2vec import region2vec74from geniml.evaluation import evaluate_embeddings7576# 1) Tokenize BED files against the universe77hard_tokenization(78 src_folder="bed_files/",79 dst_folder="tokens/",80 universe_file="universe.bed",81 p_value_threshold=1e-9,82)8384# 2) Train Region2Vec85region2vec(86 token_folder="tokens/",87 save_dir="model/",88 num_shufflings=1000,89 embedding_dim=100,90)9192# 3) Evaluate (requires labels/metadata aligned to embeddings)93metrics = evaluate_embeddings(94 embeddings_file="model/embeddings.npy",95 labels_file="metadata.csv",96)9798print(metrics)99```100101### 3) Single-cell ATAC-seq: tokenize cells → train scEmbed → cluster with Scanpy102103```python104import scanpy as sc105from geniml.scembed import ScEmbed106from geniml.io import tokenize_cells107108# 1) Load AnnData109adata = sc.read_h5ad("scatac_data.h5ad")110111# 2) Tokenize cells using a universe112tokenize_cells(113 adata="scatac_data.h5ad",114 universe_file="universe.bed",115 output="tokens.parquet",116)117118# 3) Train scEmbed119model = ScEmbed(embedding_dim=100)120model.train(dataset="tokens.parquet", epochs=100)121122# 4) Encode cells and attach embeddings to AnnData123embeddings = model.encode(adata)124adata.obsm["scembed_X"] = embeddings125126# 5) Standard Scanpy neighborhood graph + clustering + UMAP127sc.pp.neighbors(adata, use_rep="scembed_X")128sc.tl.leiden(adata)129sc.tl.umap(adata)130```131132## Implementation Details133134### Tokenization (Universe-based)135- **Goal**: Convert genomic intervals into discrete “tokens” defined by a reference **universe** (consensus peak set).136- **Hard tokenization**: Assigns intervals to universe bins/peaks deterministically (commonly used for Region2Vec/scEmbed pipelines).137- **Key parameter**: `p_value_threshold` controls stringency of mapping/overlap significance (lower is stricter; overly strict thresholds can reduce coverage).138139### Region2Vec (Region Embeddings)140- **Core idea**: Treat each BED file (or region set) like a “document” and each universe peak like a “word”; learn embeddings using a word2vec-style objective.141- **Important knobs**:142 - `embedding_dim`: dimensionality of learned vectors (e.g., 50–300).143 - `num_shufflings`: increases training signal by shuffling/co-occurrence augmentation; higher values increase runtime.144145### BEDspace (Joint Region + Label Embeddings)146- **Core idea**: Learn a shared vector space for region sets and metadata labels using **StarSpace**, enabling:147 - **Region → Label** retrieval (predict likely labels for a query region set)148 - **Label → Region** retrieval (find region sets associated with a label)149- **Operational requirement**: StarSpace must be installed and its path provided/configured for training.150151### scEmbed (Single-cell Embeddings)152- **Core idea**: Apply Region2Vec-like training on tokenized single-cell accessibility profiles to produce **cell embeddings**.153- **Best practice**: **Pre-tokenize** cells (e.g., to Parquet) to reduce repeated preprocessing and speed up training.154- **Downstream**: Use embeddings as `adata.obsm[...]` and run standard Scanpy steps (neighbors, Leiden, UMAP).155156### Universe Construction (Consensus Peaks)157- **Purpose**: Create a stable reference peak set for tokenization and cross-dataset comparability.158- **Methods**:159 - **CC (Coverage Cutoff)**: threshold-based peak calling from coverage.160 - **CCF (Coverage Cutoff Flexible)**: cutoff with flexible boundaries/confidence intervals.161 - **ML (Maximum Likelihood)**: probabilistic modeling of peak positions.162 - **HMM (Hidden Markov Model)**: state-based segmentation; typically most computationally intensive.163- **Typical parameters**:164 - `--cutoff`: minimum coverage to call peaks (CC/CCF).165 - `--merge`: merge distance for nearby peaks.166 - `--filter-size`: minimum peak length to keep.167168---169> Source: [aipoch/medical-research-skills](https://github.com/aipoch/medical-research-skills) — distributed by [TomeVault](https://tomevault.io).170<!-- tomevault:4.0:skill_md:2026-05-22 -->