Skip to main content

Overview

Cell-cell communication is fundamental to coordinated cardiac function. HeartMAP analyzes intercellular signaling by inferring ligand-receptor (L-R) interactions from single-cell RNA-seq co-expression patterns, revealing how different cell types communicate to maintain heart health and respond to disease.
Key Insight: Communication hubs in the heart include atrial cardiomyocytes and adipocytes with hub scores of 0.037 to 0.047, indicating their central role in coordinating cardiac signaling.

Ligand-Receptor Analysis

What Are Ligand-Receptor Interactions?

1

Ligand Production

A sender cell produces and secretes a signaling molecule (ligand):
  • Proteins (growth factors, cytokines)
  • Peptides (natriuretic peptides)
  • Small molecules
2

Receptor Binding

A receiver cell expresses a receptor protein that binds the ligand:
  • Transmembrane receptors
  • G-protein coupled receptors
  • Receptor tyrosine kinases
3

Signal Transduction

Binding triggers intracellular signaling cascades:
  • Gene expression changes
  • Metabolic shifts
  • Cellular responses

The L-R Database

HeartMAP uses curated ligand-receptor pair databases:
Ligand-receptor Inference FrameworkWhen available, HeartMAP uses LIANA’s consensus database:
  • ‘consensus’: Curated from multiple sources (recommended)
  • ‘cellphonedb’: CellPhoneDB database
  • ‘omnipath’: OmniPath database
  • ‘connectome’: Ramilowski 2015
  • ‘cellinker’: CellLinker database
# LIANA integration
from heartmap import Config
config = Config.default()
config.analysis.use_liana = True

Key Cardiac L-R Interactions

VEGF Family (Vascular Endothelial Growth Factor):
  • VEGFA → FLT1/KDR/NRP1: Blood vessel formation
  • VEGFC → FLT4: Lymphatic development
  • ANGPT1/2 → TEK: Vessel stabilization
Clinical Relevance: Coronary angiogenesis, therapeutic angiogenesis post-MI
Fibrosis and ECM Regulation:
  • TGFB1/2/3 → TGFBR1/TGFBR2: Fibroblast activation
  • BMP2/4/7 → BMPR1A/BMPR2: Cardiac development
Clinical Relevance: Cardiac fibrosis, remodeling after injury, heart failure progression
Cytokines:
  • IL6 → IL6R: Inflammation, cardiac remodeling
  • TNF → TNFRSF1A/B: Inflammatory response, apoptosis
  • IL1B → IL1R1: Acute inflammation
Chemokines:
  • CXCL12 → CXCR4/CXCR7: Immune cell recruitment
  • CCL2 → CCR2: Monocyte infiltration
Clinical Relevance: Myocarditis, post-MI inflammation, chronic heart failure
Neuregulin Signaling:
  • NRG1 → ERBB2/ERBB4: Cardiomyocyte survival, contractility
Endothelin System:
  • EDN1 → EDNRA/EDNRB: Vasoconstriction, remodeling
Natriuretic Peptides:
  • NPPA/NPPB → NPR1: Blood pressure regulation, diuresis
Clinical Relevance: Heart failure therapies (BNP), cardiotoxicity prevention (NRG1)
Growth Factors:
  • IGF1 → IGF1R: Cardiomyocyte growth, metabolism
  • FGF2 → FGFR1/2: Angiogenesis, cardioprotection
Metabolic Hormones:
  • LEP → LEPR: Leptin signaling, metabolic regulation
  • ADIPOQ → ADIPOR1: Adiponectin, cardioprotection
Clinical Relevance: Metabolic syndrome, diabetic cardiomyopathy

Communication Scoring Method

HeartMAP calculates communication strength using co-expression analysis:

Algorithm

1

Calculate Mean Expression per Cell Type

For each cell type, compute mean expression of all genes:
# Pseudocode
for cell_type in celltypes:
    cells = adata[adata.obs['leiden'] == cell_type]
    mean_expr[cell_type] = cells.X.mean(axis=0)
2

Filter L-R Pairs

Keep only pairs where both genes are expressed:
# Filter by expression threshold (e.g., > 0.1)
if ligand_expr > 0.1 and receptor_expr > 0.1:
    # Proceed with scoring
3

Calculate Communication Score

Use geometric mean of co-expression:
# Communication strength formula
score = sqrt(ligand_expr × receptor_expr)
Rationale:
  • Requires both ligand AND receptor to be expressed
  • Balanced weighting of sender and receiver
  • Dampens false positives from one-sided expression
4

Build Communication Matrix

Create cell-type × cell-type interaction matrix:
DataFrame columns:
- source: sender cell type
- target: receiver cell type  
- ligand: ligand gene
- receptor: receptor gene
- communication_score: strength (0-1)

Example Calculation

# Real example from HeartMAP source code
# src/heartmap/pipelines/__init__.py:216-268

for ligand, receptor in ligand_receptor_pairs:
    if ligand not in adata.var_names or receptor not in adata.var_names:
        continue
    
    ligand_idx = list(adata.var_names).index(ligand)
    receptor_idx = list(adata.var_names).index(receptor)
    
    for source_type in cell_types:
        ligand_expr = cell_type_expression[source_type][ligand_idx]
        
        if ligand_expr > 0.1:  # Expression threshold
            for target_type in cell_types:
                if source_type == target_type:
                    continue  # Skip self-communication
                
                receptor_expr = cell_type_expression[target_type][receptor_idx]
                
                if receptor_expr > 0.1:
                    # Calculate strength
                    strength = np.sqrt(ligand_expr * receptor_expr)
                    
                    communication_data.append({
                        'source': source_type,
                        'target': target_type,
                        'ligand': ligand,
                        'receptor': receptor,
                        'communication_score': strength
                    })

Communication Hub Analysis

What Are Communication Hubs?

Cells that send or receive many signals, acting as coordination centers in the cardiac communication network.

High Hub Score

Characteristics:
  • Express many ligands/receptors
  • Connect to many other cell types
  • Central to network topology
  • Potential therapeutic targets

Low Hub Score

Characteristics:
  • Specialized, limited communication
  • Peripheral network position
  • Focused signaling roles

Hub Score Calculation

HeartMAP uses expression variability to identify hubs:
# Hub score formula (from source code)
hub_score = (std × mean) / (variance + 1)
Components:
  • std: Standard deviation of expression (variability)
  • mean: Mean expression (overall level)
  • variance: Expression variance (normalized denominator)
Interpretation:
  • High variability + high expression = high hub score
  • Indicates dynamic signaling capacity
  • Normalized to prevent outlier dominance

Known Cardiac Hubs

Hub Score: 0.037 - 0.047Key Signaling:
  • NPPA/NPPB secretion (natriuretic peptides)
  • EDN1 production (endothelin)
  • Mechanical stretch sensing
  • Endocrine function
Why High Hub Score:
  • Central to hemodynamic regulation
  • Communicate with endothelial, fibroblasts, immune cells
  • Respond to volume/pressure changes

Pathway Analysis

HeartMAP identifies enriched signaling pathways in cardiac communication:
  • Notch signaling: DLL1/4, JAG1/2 → NOTCH1/2/3
  • Wnt signaling: WNT3A, WNT5A → FZD receptors
  • BMP/TGF-beta: Chamber formation, valve development
  • Natriuretic peptide pathway: NPPA/NPPB → NPR1
  • Endothelin system: EDN1 → EDNRA/EDNRB
  • Adrenergic signaling: Indirect (receptor expression)
  • VEGF pathway: VEGFA/C → FLT1/KDR/FLT4
  • FGF pathway: FGF2/7/9/10 → FGFR1/2/3
  • Integrin-ECM: Collagen, fibronectin, laminin interactions
  • Cytokine signaling: IL6, TNF, IL1B pathways
  • Chemokine gradients: CXCL12, CCL2, CCL5
  • Complement system: C3, C5 signaling

Running Communication Analysis

Basic Usage

from heartmap import Config
from heartmap.pipelines import AdvancedCommunicationPipeline

# Initialize configuration
config = Config.default()
config.analysis.use_liana = True  # Use LIANA if available

# Create pipeline
pipeline = AdvancedCommunicationPipeline(config)

# Run analysis (requires annotated data)
results = pipeline.run(
    data_path='results/basic/annotated_data.h5ad',
    output_dir='results/communication'
)

# Access results
comm_scores = results['results']['communication_scores']
hub_scores = results['results']['hub_scores']
pathway_scores = results['results']['pathway_scores']

print(f"Detected {len(comm_scores)} L-R interactions")
print(f"\nTop 5 interactions:")
print(comm_scores.nlargest(5, 'communication_score'))

Interpreting Results

DataFrame format:
# communication_scores.csv
source          target          ligand  receptor  communication_score
Cardiomyocyte  Fibroblast      TGFB1   TGFBR1    0.856
Endothelial    Cardiomyocyte   VEGFA   KDR       0.742
Fibroblast     Endothelial     FN1     ITGA5     0.689
...
Key columns:
  • source: Cell type sending signal
  • target: Cell type receiving signal
  • ligand: Ligand gene name
  • receptor: Receptor gene name
  • communication_score: Strength (0-1)

Visualizations

Automatically generated plots:

Communication Heatmap

Cell-type × cell-type matrix showing interaction strength

Hub Score Plot

UMAP colored by hub scores, highlighting communication centers

Pathway Scores

Bar plot of enriched pathways (when available)

Advanced: Custom L-R Analysis

Using Custom L-R Database

from heartmap.data import LigandReceptorDatabase
import scanpy as sc

# Load custom L-R pairs
db = LigandReceptorDatabase(resource='consensus')  # or 'cellphonedb'

# Filter to genes in your data
adata = sc.read_h5ad('annotated_data.h5ad')
available_genes = adata.var_names.tolist()

lr_pairs = db.get_pairs(
    confidence_threshold=0.8,  # High confidence only
    present_in_data=available_genes
)

print(f"Found {len(lr_pairs)} high-confidence L-R pairs in dataset")

# Export for review
db.save_to_csv('my_lr_database.csv')

Filtering by Specific Pathways

import pandas as pd

# Load communication results
comm = pd.read_csv('results/communication/communication_scores.csv')

# Filter for angiogenesis pathway
vegf_interactions = comm[
    comm['ligand'].str.contains('VEGF') | 
    comm['receptor'].str.contains('FLT|KDR')
]

print("VEGF pathway interactions:")
print(vegf_interactions)

# Filter for inflammatory signaling
inflam_ligands = ['IL6', 'TNF', 'IL1B', 'IFNG']
inflam_comm = comm[comm['ligand'].isin(inflam_ligands)]

Chamber-Specific Communication

Combine communication and chamber analysis:
# Requires chamber labels in data
adata = sc.read_h5ad('multi_chamber_annotated.h5ad')

# Subset to specific chamber
lv_cells = adata[adata.obs['chamber'] == 'LV']

# Run communication analysis on LV only
from heartmap.pipelines import AdvancedCommunicationPipeline
pipeline = AdvancedCommunicationPipeline(config)
lv_results = pipeline.run(lv_cells, 'results/lv_communication')

print("LV-specific communication hubs:")
print(lv_results['results']['hub_scores'].nlargest(10))

Clinical Applications

Drug Target Identification

Use communication hubs and pathways:
  • Block pathological signaling (TGF-beta in fibrosis)
  • Enhance protective signaling (NRG1-ERBB2)
  • Target cell-type specific receptors

Disease Mechanism Understanding

Compare healthy vs. diseased:
  • Altered communication networks in heart failure
  • Inflammatory pathway activation in myocarditis
  • Dysregulated angiogenesis post-MI

Biomarker Discovery

Communication-derived biomarkers:
  • NPPA/NPPB (already clinical: BNP test)
  • Ligands detectable in blood
  • Predict response to therapy

Precision Medicine

Personalized signaling maps:
  • Patient-specific communication networks
  • Targeted therapy selection
  • Predict drug response

Next Steps

Chamber Analysis

Combine communication with chamber-specific analysis

API Reference

Detailed API documentation

References

Method Reference:
  • LIANA: Dimitrov et al. (2022). Nature Methods.
  • CellPhoneDB: Efremova et al. (2020). Nature Protocols.
HeartMAP Application: Kgabeng, T., et al. (2025). HeartMAP: A Multi-Chamber Spatial Framework for Cardiac Cell-Cell Communication. Computational and Structural Biotechnology Journal.

Build docs developers (and LLMs) love