Skip to main content

Overview

LigandReceptorDatabase manages ligand-receptor (L-R) interaction databases for analyzing cell-cell communication in single-cell data. It supports multiple curated resources via LIANA and provides a comprehensive fallback cardiac-focused database.

Class: LigandReceptorDatabase

Constructor

from heartmap.data import LigandReceptorDatabase

db = LigandReceptorDatabase(resource='consensus')
resource
str
default:"consensus"
Database resource to use. Available options:
  • consensus - Curated from multiple sources (recommended)
  • cellphonedb - CellPhoneDB database
  • omnipath - OmniPath database
  • connectome - Ramilowski 2015 dataset
  • cellinker - CellLinker database
Requires LIANA installed. Falls back to cardiac database if unavailable.

Attributes

resource
str
Name of the loaded database resource
lr_pairs
pd.DataFrame
DataFrame containing ligand-receptor pairs with columns:
  • ligand - Ligand gene symbol
  • receptor - Receptor gene symbol
  • confidence - Confidence score (0-1)

Methods

get_pairs

Retrieve L-R pairs as a list of tuples, with optional filtering.
pairs = db.get_pairs(
    confidence_threshold=0.8,
    present_in_data=['VEGFA', 'FLT1', 'KDR', 'TGFB1']
)
# Output: [('VEGFA', 'FLT1'), ('VEGFA', 'KDR')]
confidence_threshold
float
default:"0.0"
Minimum confidence score (0-1) to include. Higher values return only well-validated interactions.
present_in_data
List[str] | None
default:"None"
List of gene names present in your dataset. Filters to only return pairs where both ligand and receptor are available.Typically: adata.var_names.tolist()
returns
List[Tuple[str, str]]
List of (ligand, receptor) tuples matching the filter criteria

Example

import scanpy as sc
from heartmap.data import LigandReceptorDatabase

# Load your data
adata = sc.read_h5ad('heart_data.h5ad')
available_genes = adata.var_names.tolist()

# Get high-confidence pairs present in data
db = LigandReceptorDatabase(resource='consensus')
pairs = db.get_pairs(
    confidence_threshold=0.85,
    present_in_data=available_genes
)

print(f"Found {len(pairs)} L-R pairs in dataset")
for ligand, receptor in pairs[:5]:
    print(f"  {ligand}{receptor}")

get_dataframe

Retrieve L-R pairs as a pandas DataFrame.
df = db.get_dataframe(confidence_threshold=0.8)
print(df.head())
#    ligand receptor  confidence
# 0   VEGFA     FLT1        0.95
# 1   VEGFA      KDR        0.98
confidence_threshold
float
default:"0.0"
Minimum confidence score to include
returns
pd.DataFrame
DataFrame with columns: ligand, receptor, confidence

Example

# Get all high-confidence pairs for export
df = db.get_dataframe(confidence_threshold=0.9)

# Analyze by pathway
vegf_pairs = df[df['ligand'].str.startswith('VEGF')]
print(f"VEGF family interactions: {len(vegf_pairs)}")

# Find receptors for specific ligand
tgfb1_receptors = df[df['ligand'] == 'TGFB1']['receptor'].tolist()
print(f"TGFB1 receptors: {tgfb1_receptors}")

save_to_csv

Export the database to a CSV file.
db.save_to_csv('lr_database_export.csv')
# ✓ Saved L-R database to lr_database_export.csv
filepath
str
required
Path where CSV file will be written

load_database

Load L-R database from LIANA or fallback. Called automatically in __init__.
db = LigandReceptorDatabase(resource='omnipath')
# ✓ LIANA v0.1.10 loaded successfully
# ✓ Loaded 2483 L-R pairs from LIANA omnipath
If LIANA is not available:
# ⚠ LIANA not available - will use fallback database
# ✓ Loaded 107 L-R pairs from fallback cardiac database

Convenience Function: get_ligand_receptor_pairs

Quickly retrieve L-R pairs filtered to genes in your AnnData object.
from heartmap.data import get_ligand_receptor_pairs
import scanpy as sc

adata = sc.read_h5ad('heart_data.h5ad')

pairs = get_ligand_receptor_pairs(
    adata,
    resource='consensus',
    confidence_threshold=0.7
)
# ✓ Loaded 2134 L-R pairs from LIANA consensus
# ✓ Found 487 L-R pairs present in dataset (from 2134 total)
adata
AnnData
required
Annotated data object with gene names in adata.var_names
resource
str
default:"consensus"
Database resource to use (same options as LigandReceptorDatabase)
confidence_threshold
float
default:"0.7"
Minimum confidence score (0-1)
returns
List[Tuple[str, str]]
List of (ligand, receptor) tuples present in the dataset

Example

from heartmap.data import get_ligand_receptor_pairs
import scanpy as sc

adata = sc.read_h5ad('processed_data.h5ad')

# Quick retrieval for analysis
pairs = get_ligand_receptor_pairs(
    adata,
    resource='cellphonedb',
    confidence_threshold=0.8
)

# Use in downstream analysis
for ligand, receptor in pairs:
    if ligand in adata.var_names and receptor in adata.var_names:
        print(f"Analyzing {ligand}{receptor}")

Available Database Resources

LIANA Resources (when installed)

ResourceDescriptionTypical SizeBest For
consensusCurated from multiple sources~2000+ pairsGeneral use (recommended)
cellphonedbCellPhoneDB v4.0~1600 pairsWell-validated interactions
omnipathOmniPath database~2400 pairsComprehensive coverage
connectomeRamilowski 2015~2500 pairsLiterature-based
cellinkerCellLinker database~1800 pairsSpecialized interactions

Fallback Cardiac Database

When LIANA is unavailable, HeartMAP provides a curated cardiac-focused database with 107 high-confidence interactions including: Pathways included:
  • Angiogenesis & Vascular (VEGF, ANGPT, PGF)
  • TGF-beta superfamily (TGFB, BMP, INHBA)
  • FGF signaling (FGF1/2/7/9/10)
  • PDGF signaling (PDGFA/B/C/D)
  • Inflammatory cytokines (IL6, IL1B, TNF, IFNG)
  • Chemokines (CXCL12, CCL2/5, CXCL8)
  • Growth factors (EGF, IGF, HGF, NGF)
  • Notch signaling (DLL, JAG)
  • Wnt signaling (WNT3A/5A/7A)
  • Extracellular matrix (COL, FN1, LAMB1)
  • Cardiac specific (NRG1, EDN1, NPPA/B)
  • Semaphorins, Ephrins, Adhesion molecules
# Accessing fallback database
db = LigandReceptorDatabase()  # Uses fallback if LIANA unavailable
print(f"Loaded {len(db.lr_pairs)} pairs")

# View cardiac-specific pairs
cardiac_df = db.get_dataframe()
vegf_pairs = cardiac_df[cardiac_df['ligand'].str.startswith('VEGF')]
print(vegf_pairs)
#    ligand receptor  confidence
# 0   VEGFA     FLT1        0.95
# 1   VEGFA      KDR        0.98
# 2   VEGFA     NRP1        0.85
# 3   VEGFB     FLT1        0.90
# 4   VEGFC     FLT4        0.95

Installation

pip install liana
pip install heartmap

Without LIANA (Fallback Database Only)

pip install heartmap
The fallback database provides comprehensive cardiac coverage without external dependencies.

Complete Example

import scanpy as sc
from heartmap.data import LigandReceptorDatabase, get_ligand_receptor_pairs

# Load processed single-cell data
adata = sc.read_h5ad('heart_processed.h5ad')
print(f"Dataset: {adata.n_obs} cells × {adata.n_vars} genes")

# Method 1: Using the convenience function
pairs = get_ligand_receptor_pairs(
    adata,
    resource='consensus',
    confidence_threshold=0.85
)
print(f"Found {len(pairs)} high-confidence pairs")

# Method 2: Using the class directly
db = LigandReceptorDatabase(resource='consensus')
print(f"Total database size: {len(db.lr_pairs)} pairs")

# Filter by confidence
high_conf_pairs = db.get_pairs(
    confidence_threshold=0.9,
    present_in_data=adata.var_names.tolist()
)
print(f"High confidence pairs in data: {len(high_conf_pairs)}")

# Analyze specific pathway
df = db.get_dataframe()
vegf_signaling = df[df['ligand'].str.contains('VEGF')]
print(f"\nVEGF pathway interactions:")
print(vegf_signaling)

# Export for external analysis
db.save_to_csv('cardiac_lr_database.csv')

# Use pairs in communication analysis
for ligand, receptor in pairs[:10]:
    ligand_exp = adata[:, ligand].X.mean()
    receptor_exp = adata[:, receptor].X.mean()
    print(f"{ligand}{receptor}: L={ligand_exp:.2f}, R={receptor_exp:.2f}")

Confidence Scores

Confidence scores (0-1) indicate interaction validation level:
Score RangeInterpretationRecommendation
0.90 - 1.00Highly validatedUse for critical analyses
0.75 - 0.89Well-supportedStandard threshold
0.50 - 0.74Moderate evidenceExploratory analysis
0.00 - 0.49Limited evidenceUse with caution
# Conservative analysis (high confidence only)
conservative_pairs = db.get_pairs(confidence_threshold=0.9)

# Standard analysis
standard_pairs = db.get_pairs(confidence_threshold=0.75)

# Exploratory analysis (include more pairs)
exploratory_pairs = db.get_pairs(confidence_threshold=0.5)

Filtering by Gene Availability

# Get genes detected in your data
expressed_genes = adata.var_names[adata.var['n_cells'] > 10].tolist()

# Filter to expressed pairs only
expressed_pairs = db.get_pairs(
    confidence_threshold=0.7,
    present_in_data=expressed_genes
)

print(f"Pairs with both genes expressed: {len(expressed_pairs)}")

Error Handling

try:
    db = LigandReceptorDatabase(resource='invalid_resource')
except Exception as e:
    print(f"Failed to load database: {e}")
    # Falls back to cardiac database automatically
Common warnings:
⚠ LIANA not available - will use fallback database
✓ Loaded 107 L-R pairs from fallback cardiac database

Integration with HeartMAP

from heartmap.data import DataProcessor, get_ligand_receptor_pairs
from heartmap.config import Config

# Process data
config = Config()
processor = DataProcessor(config)
adata = processor.process_from_raw('heart_data.h5ad')

# Get L-R pairs for communication analysis
pairs = get_ligand_receptor_pairs(
    adata,
    resource='consensus',
    confidence_threshold=0.8
)

# Use in HeartMAP analysis pipeline
print(f"Ready for communication analysis with {len(pairs)} interactions")

See Also

Build docs developers (and LLMs) love