# ============================================================
# 06_cellchat.R —— CellChat 基础通讯分析（对应教程第 11 章）
# 用法：Rscript code/06_cellchat.R（或 RStudio 逐段运行）
# 前置：已运行 04_annotation.R（有 celltype 列），或读取含注释的 rds
# ============================================================

library(Seurat)
library(CellChat)

obj <- readRDS("data/processed/visium_annotated.rds")
# 若已做生态位分析，可改读 visium_niche.rds
# obj <- readRDS("data/processed/visium_niche.rds")

## 1. 构建 CellChat 对象
# group.by 指定"细胞类型"列；Visium 场景下用注释/去卷积得到的主类型
cellchat <- createCellChat(object = obj, group.by = "celltype")

## 2. 载入配体-受体数据库（人类）
cellchat@DB <- CellChatDB.human

## 3. 预处理：只保留数据库涉及的基因，并标记过表达基因/互作
cellchat <- subsetData(cellchat)                       # 提取 L-R 相关基因表达
cellchat <- identifyOverExpressedGenes(cellchat)       # 找过表达基因
cellchat <- identifyOverExpressedInteractions(cellchat) # 找过表达互作

## 4. 推断通讯概率（核心步骤：质量作用定律 + 排列检验）
cellchat <- computeCommunProb(cellchat, type = "triMean")
cellchat <- filterCommunication(cellchat, min.cells = 10)  # 过滤小群体

## 5. 通路级聚合 + 网络聚合
cellchat <- computeCommunProbPathway(cellchat)
cellchat <- aggregateNet(cellchat)

## 6. 经典可视化
# (1) 圆形通讯网络
netVisual_circle(cellchat,
                 vertex.weight = as.numeric(table(cellchat@idents)),
                 weight.scale = TRUE, label.edge = FALSE,
                 title.name = "全局细胞通讯网络")
# (2) 气泡图（配体-受体对 × 细胞类型对）
netVisual_bubble(cellchat, remove.isolate = TRUE)
# (3) 通路排序（哪些通路通讯最强）
rankNet(cellchat)

## 7. 保存
saveRDS(cellchat, "data/processed/cellchat_global.rds")
cat("CellChat 全局分析完成，已保存 data/processed/cellchat_global.rds\n")
