#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
复现：Oropouche virus causes severe congenital disease in embryonic mice
      (Nature Communications 2026, doi:10.1038/s41467-026-77294-6)
      Fig. 7a —— OROV 胎内感染 E17.5 小鼠胚胎各器官细胞因子 log2 表达变化热图

数据：orov_cytokines_fig7a.csv（156 行真实胚胎级数据，直接取自论文补充材料
Source Data MOESM4，sheet 'Figure 7'，非模拟；其中 CCL5 列有 1 个缺失值，
论文原数据即如此）。作图时按细胞因子×器官取均值（与原图每个格子颜色单调一致）。

输出：repro_python.png（300 dpi）
"""
import numpy as np
import pandas as pd
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap
from matplotlib.font_manager import FontProperties, fontManager

# ---- 中文字体（随附 NotoSansSC）----
FONT_PATH = "/home/hatch/workspace/arbovirus-site/day1-figure/NotoSansSC-Regular.ttf"
fontManager.addfont(FONT_PATH)
ZH = FontProperties(fname=FONT_PATH)

# ---- 读数据并聚合均值 ----
df = pd.read_csv("orov_cytokines_fig7a.csv")
cyto_order = ["IL6", "IL1b", "CCL5", "TNFa", "IFNg"]
cyto_label = {"IL6": "IL6", "IL1b": "IL1β", "CCL5": "CCL5", "TNFa": "TNFα", "IFNg": "IFNγ"}
org_order = ["Brain", "Lungs", "Heart", "Liver"]

means = df.groupby(["cytokine", "organ"])["log2_fold_change"].mean()
print("每格样本数：")
print(df.groupby(["cytokine", "organ"]).size().unstack())
print("\n每格 log2FC 均值（=热图颜色映射值）：")
mat = np.array([[means[(c, o)] for o in org_order] for c in cyto_order])
for c, row in zip(cyto_order, mat):
    print(f"  {cyto_label[c]:>5}: " + " ".join(f"{v:6.2f}" for v in row))

# ---- 配色：与原图一致的蓝单色标（浅→深）----
NAVY = "#010184"   # 深端：藏青（原图最深格 ~#010180 附近采样）
PALE = "#FCFCFF"   # 浅端：近白淡蓝（原图最浅格近乎白色）
cmap = LinearSegmentedColormap.from_list("orov_blue", [PALE, NAVY], N=256)
GRID = "#000000"   # 格线/外框黑

# ---- 作图 ----
fig, ax = plt.subplots(figsize=(6.4, 4.6), dpi=300)
im = ax.imshow(mat, cmap=cmap, vmin=0, vmax=8, aspect="auto", interpolation="nearest")

ax.set_xticks(range(len(org_order)))
ax.set_xticklabels(org_order, fontsize=11)
ax.set_yticks(range(len(cyto_order)))
ax.set_yticklabels([cyto_label[c] for c in cyto_order], fontsize=11)
ax.tick_params(length=0, pad=7)

# 黑色格线 + 外框
for i in range(len(org_order) + 1):
    ax.axvline(i - 0.5, color=GRID, lw=1.0)
for j in range(len(cyto_order) + 1):
    ax.axhline(j - 0.5, color=GRID, lw=1.0)
for spine in ax.spines.values():
    spine.set_visible(True)
    spine.set_edgecolor(GRID)
    spine.set_linewidth(1.2)

# colorbar：刻度 2/4/6，纵向标签
cbar = fig.colorbar(im, ax=ax, shrink=0.82, pad=0.03,
                    ticks=[2, 4, 6], drawedges=True)
cbar.ax.tick_params(length=4, width=1, color=GRID)
cbar.outline.set_edgecolor(GRID)
cbar.outline.set_linewidth(1.2)
cbar.set_label("Log2 Fold change", fontsize=12, rotation=270, labelpad=18)
cbar.ax.tick_params(labelsize=10)

# 面板标号 + 中文标题
ax.text(-0.13, 1.04, "a", fontsize=16, fontweight="bold", va="bottom",
        ha="right", transform=ax.transAxes, clip_on=False)
ax.set_title("OROV 胎内感染小鼠胚胎各器官细胞因子表达变化（log2 差异倍数）",
             fontproperties=ZH, fontsize=13, pad=14)

fig.tight_layout()
fig.savefig("repro_python.png", dpi=300, bbox_inches="tight")
print("\n已输出 repro_python.png")
