# ============================================================
# 教程配套脚本 07：PPI 网络（STRING 导出 + R 网络图）
# 说明：本脚本演示从 STRING 下载的互作文件如何在 R 中处理；
#       Cytoscape + cytoHubba 的图形化操作见教程第 10 章。
# ============================================================

library(igraph)
library(tidyverse)

# ---- 1. STRING 网页操作（先做这一步）----
#   a. 打开 https://string-db.org
#   b. 输入差异/焦亡基因列表（多行，gene symbol）
#   c. Organism 选 Homo sapiens；继续 → 查看网络
#   d. "Exports" → 下载 "as tabular text output (protein links)"
#      （文件形如 9606.protein.links.v11.5.txt）
#   e. 保存到 data/raw/

# ---- 2. 读取 STRING 互作文件 ----
links <- read.delim("data/raw/9606.protein.links.v11.5.txt")
head(links)
# 列：protein1, protein2, combined_score
# 过滤置信度（STRING 分数 0-1000，0.4 置信度 ≈ 400）
links <- links %>% filter(combined_score >= 400)

# 去除版本号前缀（9606.ENSP... -> 基因名需借助 STRING 映射表）
# 简化演示：假设文件已是基因名（实际需用 STRING 的 aliases 映射）

# ---- 3. 构建 igraph 网络 ----
g <- graph_from_data_frame(links, directed = FALSE)
g <- simplify(g)                       # 去重自环

# 计算节点度（degree，即互作伙伴数）
deg_table <- sort(degree(g), decreasing = TRUE)
hub_genes <- names(deg_table)[1:20]    # 前 20 个高连接基因
cat("Top 20 hub genes (degree):\n"); print(hub_genes)

# ---- 4. 保存 hub 基因 ----
write.csv(data.frame(gene = hub_genes, degree = as.numeric(deg_table[1:20])),
          "results/hub_genes_degree.csv", row.names = FALSE)

# ---- 5. 画网络图（igraph 基础版）----
# 只画 hub 子网络，避免图太密
sub <- induced_subgraph(g, hub_genes)
png("figures/R_ppi_igraph.png", width = 900, height = 900, res = 150)
set.seed(1)
plot(sub,
     vertex.size = degree(sub) * 3 + 5,
     vertex.color = "#DD8452",
     vertex.label.cex = 0.8,
     edge.color = "grey70",
     main = "PPI network (hub genes)")
dev.off()

cat("PPI 分析完成！hub 基因已保存。\n")
cat("提示：正式分析建议用 Cytoscape + cytoHubba（MCC 算法），见教程第 10 章。\n")
