{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ff94284b",
   "metadata": {},
   "source": [
    "# 层次聚类细胞亚型注释\n",
    "\n",
    "基因集模块打分 + 层次聚类 + 切树 + 按均值归类\n",
    "\n",
    "**输入**：`h5ad_path`（某细胞大类的 h5ad，`X` 视为原始 counts）、`marker_dict`（亚型 → marker 字典）。\n",
    "\n",
    "**流程**：read_h5ad → normalize_total+log1p → score_genes → z-score → 层次聚类 → 切树 → 按均值归类 → 画图 → dotplot 质控。\n",
    "\n",
    "**关键参数**：`linkage_method` 默认 `average`（稀疏 ST 稳健，推荐；备选 `ward` 簇更紧凑，`complete` 对离群点敏感、稀疏数据慎用）；`ctrl_size=100`、`n_bins=25`；`k_init=round(n/30)`（目标每簇 ~30个细胞）；`z_clip=4`；`threshold=0.05`。\n",
    "\n",
    "> **调参提示（k_init 与 threshold 联动）**\n",
    "> - k_init 越大 → 簇越多越细（每簇细胞越少）；k_init 越小 → 簇越少越粗。\n",
    "> - other 太多 → 多半是 k_init 偏大（切得太细，每簇均值偏噪、低信号细胞单独成簇）或 threshold 偏高 → **调小 k_init**（即调大 `target_cluster_size`）或**调低 threshold**。\n",
    "> - other 太少 → 多半是 k_init 偏小（切得太粗，混合细胞被并入亚型）或 threshold 偏低 → **调大 k_init**（即调小 `target_cluster_size`）或**调高 threshold**。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "e44c09c8",
   "metadata": {},
   "outputs": [],
   "source": [
    "import json\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import scanpy as sc\n",
    "import seaborn as sns\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib import rc_context\n",
    "from scipy.cluster.hierarchy import linkage, dendrogram, cut_tree\n",
    "from scipy.spatial.distance import pdist\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "sc.settings.verbosity = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "402a2d80",
   "metadata": {},
   "outputs": [],
   "source": [
    "# ============ 输入与参数配置 ============\n",
    "h5ad_path = \"Y00282K3_Bcell_raw.h5ad\"       # 某个细胞大类的h5ad（X 视为原始 counts）\n",
    "\n",
    "# 细胞类型 -> marker 基因字典（也可从 JSON 读取：marker_dict = json.load(open(\"markers.json\"))）\n",
    "marker_dict = {\n",
    "    'NaiveB': [\"FCER2\", \"IGHD\", \"YBX3\", \"CD72\", \"CLEC2B\", \"TCL1A\", \"BACH2\", \"IL4R\", \"FCRL1\"],\n",
    "    'MKI67_GCB': [\"HMGB2\", \"STMN1\", \"HIST1H4C\", \"TUBB\", \"HMGN2\", \"TUBA1B\", \"MKI67\", \"UBE2C\", \"TOP2A\"],\n",
    "    'GCB': [\"BCL6\", \"AICDA\", \"RGS13\", \"LMO2\", \"MARCKSL1\", \"LRMP\", \"RFTN1\", \"CR2\"],\n",
    "    'MemoryB': [\"EGR1\", \"FOSB\", \"NR4A2\", \"DNAJB1\", \"NR4A1\", \"MYC\", \"ZFP36\", \"IER5\", \"GPR183\", \"CRIP1\", \"TNFRSF13B\", \"LTB\", \"S100A4\", \"ITGB1\", \"SAMSN1\", \"BANK1\"],\n",
    "    'ISGB': [\"IFIT3\", \"IFIT1\", \"ISG15\", \"IFITM2\", \"IFIT2\", \"IFI6\", \"IFI44\"],\n",
    "    'Bact': [\"DUSP4\", \"RGCC\", \"IFITM1\", \"RGS2\", \"RGS1\", \"CXCR3\", \"CAPG\", \"FCRL4\"]\n",
    "    # ... 按需补充\n",
    "}\n",
    "\n",
    "# 标志基因 dotplot 质控用的基因列表（经典 marker，独立于打分集，建议手挑）\n",
    "qc_genes = [ \"FCER2\", \"IGHD\", \"BACH2\", \"IL4R\", \"FCRL1\",\n",
    "             \"HMGB2\", \"STMN1\", \"HIST1H4C\", \"TUBB\", \"HMGN2\", \"TUBA1B\", \"MKI67\",\n",
    "             \"BCL6\",  \"MARCKSL1\", \"LRMP\", \"RFTN1\", \"CR2\",\n",
    "             \"S100A4\", \"ITGB1\", \"SAMSN1\", \"BANK1\",\n",
    "             \"IFIT3\", \"IFIT1\", \"ISG15\", \"IFITM2\", \"IFIT2\", \"IFI6\", \"IFI44\",\n",
    "             \"DUSP4\", \"RGCC\", \"IFITM1\", \"RGS2\", \"RGS1\", \"CXCR3\", \"CAPG\"]\n",
    "\n",
    "# --- 打分参数 ---\n",
    "ctrl_size  = 100      # 每表达 bin 抽样的对照基因数\n",
    "n_bins     = 25       # scanpy score_genes 默认分箱数\n",
    "# --- 聚类 / 判别参数 ---\n",
    "linkage_method      = \"average\"   # 连锁：average(推荐,ST稳健) | ward(紧凑均衡) | complete(对离群敏感,慎用)\n",
    "metric              = \"euclidean\"\n",
    "z_clip              = 4            # z-score 裁剪上下限；设 None 则不裁剪\n",
    "threshold           = 0.05         # 判别 other 阈值（簇内最大均值 z-score < 此值 -> other）\n",
    "target_cluster_size = 30           # 切树目标每簇细胞数 -> k_init = round(n / target)\n",
    "other_label          = \"B_Other\"     # 无法判别类的标签名（可按大类命名，如 \"B_Other\"）\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "56cad76a",
   "metadata": {},
   "source": [
    "## 1. 载入与归一化\n",
    "\n",
    "假设 `X` 为原始 counts（已 log 归一化则跳过）；若 `var['real_gene_name']` 存在则改名 `var_names` 并按均值最高去重；若 h5ad 含全部细胞，先 subset 出目标大类。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "f9f9dab4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(9650, 31885)\n"
     ]
    }
   ],
   "source": [
    "adata = sc.read_h5ad(h5ad_path)\n",
    "print(adata.shape)\n",
    "\n",
    "# 原始 counts 存档，再做 log 归一化\n",
    "adata.layers[\"counts\"] = adata.X.copy()\n",
    "sc.pp.normalize_total(adata)\n",
    "sc.pp.log1p(adata)\n",
    "\n",
    "# 若 var_names 不是基因 symbol，用 var['real_gene_name'] 改名（重复 symbol 按表达均值最高去重）\n",
    "if \"real_gene_name\" in adata.var.columns:\n",
    "    sym = adata.var[\"real_gene_name\"].fillna(\"\").astype(str)\n",
    "    mean_expr = np.asarray(adata.X.mean(axis=0)).ravel()\n",
    "    vdf = pd.DataFrame({\"sym\": sym.values, \"mean\": mean_expr}, index=adata.var_names)\n",
    "    vdf = vdf[vdf[\"sym\"].ne(\"\")].sort_values(\"mean\", ascending=False)\n",
    "    keep = vdf[~vdf[\"sym\"].duplicated(keep=\"first\")].index\n",
    "    adata = adata[:, list(keep)].copy()\n",
    "    adata.var_names = vdf.loc[keep, \"sym\"].values\n",
    "    adata.var_names_make_unique()\n",
    "    print(f\"real_gene_name 改名去重后：{adata.n_vars} 个基因\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ded81883",
   "metadata": {},
   "source": [
    "## 2. 模块打分\n",
    "\n",
    "先校验 marker 是否在 `var_names`（全缺失则报错并打印 5 个）；`score_genes`（`ctrl_size=100`，`n_bins=25`）。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "3e2a8ef0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>NaiveB</th>\n",
       "      <th>MKI67_GCB</th>\n",
       "      <th>GCB</th>\n",
       "      <th>MemoryB</th>\n",
       "      <th>ISGB</th>\n",
       "      <th>Bact</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>78065325577605</th>\n",
       "      <td>-0.017002</td>\n",
       "      <td>-0.004564</td>\n",
       "      <td>-0.013019</td>\n",
       "      <td>-0.003432</td>\n",
       "      <td>-0.001521</td>\n",
       "      <td>-0.001524</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>84954453120651</th>\n",
       "      <td>-0.015169</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-0.010821</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>-0.001533</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>89210765711011</th>\n",
       "      <td>0.239481</td>\n",
       "      <td>-0.002525</td>\n",
       "      <td>-0.011364</td>\n",
       "      <td>-0.012833</td>\n",
       "      <td>-0.006313</td>\n",
       "      <td>-0.006323</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>79688823215908</th>\n",
       "      <td>0.046686</td>\n",
       "      <td>-0.003955</td>\n",
       "      <td>-0.009563</td>\n",
       "      <td>-0.011614</td>\n",
       "      <td>-0.006921</td>\n",
       "      <td>-0.000990</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>80491982100320</th>\n",
       "      <td>0.150098</td>\n",
       "      <td>-0.002503</td>\n",
       "      <td>-0.010061</td>\n",
       "      <td>-0.014234</td>\n",
       "      <td>-0.002503</td>\n",
       "      <td>-0.003760</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                  NaiveB  MKI67_GCB       GCB   MemoryB      ISGB      Bact\n",
       "78065325577605 -0.017002  -0.004564 -0.013019 -0.003432 -0.001521 -0.001524\n",
       "84954453120651 -0.015169   0.000000 -0.010821  0.000000 -0.001533  0.000000\n",
       "89210765711011  0.239481  -0.002525 -0.011364 -0.012833 -0.006313 -0.006323\n",
       "79688823215908  0.046686  -0.003955 -0.009563 -0.011614 -0.006921 -0.000990\n",
       "80491982100320  0.150098  -0.002503 -0.010061 -0.014234 -0.002503 -0.003760"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def cal_module_scores(adata, marker_dict, ctrl_size=100, n_bins=25):\n",
    "    \"\"\"对每个亚型用 score_genes 计算模块打分，返回 [cell x subtype] 的 DataFrame。\"\"\"\n",
    "    for name, genes in marker_dict.items():\n",
    "        genes_use = [g for g in genes if g in adata.var_names]\n",
    "        missing = set(genes) - set(genes_use)\n",
    "        if missing:\n",
    "            print(f\"[{name}] 缺失 {len(missing)} 个基因：{missing}\")\n",
    "        sc.tl.score_genes(\n",
    "            adata, gene_list=genes_use,\n",
    "            ctrl_size=ctrl_size, n_bins=n_bins,\n",
    "            score_name=f\"score_{name}\", random_state=0,\n",
    "        )\n",
    "    cols = [f\"score_{n}\" for n in marker_dict]\n",
    "    df = adata.obs[cols].copy()\n",
    "    df.columns = list(marker_dict)   # 列名改回亚型原名（去 score_ 前缀），后续 z-score/归类/Categorical 都用原名\n",
    "    return df\n",
    "\n",
    "\n",
    "# 校验 marker 是否在 var_names（全缺失则报错并打印 5 个 var_names，便于排查 ID 类型）\n",
    "all_markers = sorted(set().union(*marker_dict.values()))\n",
    "if not any(g in adata.var_names for g in all_markers):\n",
    "    raise ValueError(\n",
    "        f\"所有 marker 都不在 adata.var_names 里，可能基因 ID 类型不符。\"\n",
    "        f\" var_names 示例（前 5 个）：{list(adata.var_names[:5])}\"\n",
    "    )\n",
    "\n",
    "df_heatmap = cal_module_scores(adata, marker_dict, ctrl_size=ctrl_size, n_bins=n_bins)\n",
    "df_heatmap.head()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2a82eae1",
   "metadata": {},
   "source": [
    "## 3. z-score（±4 裁剪）\n",
    "\n",
    "按亚型标准化后转置为 [亚型 × 细胞]。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "afab9cc7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>78065325577605</th>\n",
       "      <th>84954453120651</th>\n",
       "      <th>89210765711011</th>\n",
       "      <th>79688823215908</th>\n",
       "      <th>80491982100320</th>\n",
       "      <th>83799106918632</th>\n",
       "      <th>80942953666930</th>\n",
       "      <th>85864986188124</th>\n",
       "      <th>85774791874883</th>\n",
       "      <th>70179765623507</th>\n",
       "      <th>...</th>\n",
       "      <th>15169824511253</th>\n",
       "      <th>15139759740250</th>\n",
       "      <th>15083925165338</th>\n",
       "      <th>14998025819487</th>\n",
       "      <th>14920716408150</th>\n",
       "      <th>14877766735162</th>\n",
       "      <th>14628658632062</th>\n",
       "      <th>14624363664730</th>\n",
       "      <th>14478334776632</th>\n",
       "      <th>14306536084846</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>NaiveB</th>\n",
       "      <td>-0.675246</td>\n",
       "      <td>-0.643347</td>\n",
       "      <td>3.786487</td>\n",
       "      <td>0.432673</td>\n",
       "      <td>2.231597</td>\n",
       "      <td>-0.584417</td>\n",
       "      <td>0.632290</td>\n",
       "      <td>3.356539</td>\n",
       "      <td>1.000266</td>\n",
       "      <td>-0.526293</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.528307</td>\n",
       "      <td>-0.691132</td>\n",
       "      <td>1.004715</td>\n",
       "      <td>0.856357</td>\n",
       "      <td>1.306525</td>\n",
       "      <td>2.030466</td>\n",
       "      <td>0.661669</td>\n",
       "      <td>-0.636485</td>\n",
       "      <td>-0.775153</td>\n",
       "      <td>0.052213</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>MKI67_GCB</th>\n",
       "      <td>-0.225175</td>\n",
       "      <td>-0.023267</td>\n",
       "      <td>-0.134967</td>\n",
       "      <td>-0.198207</td>\n",
       "      <td>-0.133968</td>\n",
       "      <td>-0.629513</td>\n",
       "      <td>-0.161521</td>\n",
       "      <td>-0.405962</td>\n",
       "      <td>-0.472801</td>\n",
       "      <td>-0.209399</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.211952</td>\n",
       "      <td>-0.323691</td>\n",
       "      <td>-0.381758</td>\n",
       "      <td>-0.319859</td>\n",
       "      <td>-0.329201</td>\n",
       "      <td>-0.424107</td>\n",
       "      <td>-0.276511</td>\n",
       "      <td>-0.184519</td>\n",
       "      <td>-0.350330</td>\n",
       "      <td>-0.211417</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>GCB</th>\n",
       "      <td>-0.366641</td>\n",
       "      <td>-0.314897</td>\n",
       "      <td>-0.327683</td>\n",
       "      <td>-0.285280</td>\n",
       "      <td>-0.297005</td>\n",
       "      <td>-0.245460</td>\n",
       "      <td>1.290305</td>\n",
       "      <td>1.025320</td>\n",
       "      <td>2.020235</td>\n",
       "      <td>-0.261615</td>\n",
       "      <td>...</td>\n",
       "      <td>2.145159</td>\n",
       "      <td>1.997021</td>\n",
       "      <td>-0.387025</td>\n",
       "      <td>-0.396999</td>\n",
       "      <td>2.464680</td>\n",
       "      <td>-0.610106</td>\n",
       "      <td>0.825314</td>\n",
       "      <td>-0.294311</td>\n",
       "      <td>-0.405123</td>\n",
       "      <td>0.770439</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>MemoryB</th>\n",
       "      <td>-0.696900</td>\n",
       "      <td>-0.606530</td>\n",
       "      <td>-0.944444</td>\n",
       "      <td>-0.912359</td>\n",
       "      <td>-0.981344</td>\n",
       "      <td>1.171753</td>\n",
       "      <td>0.978973</td>\n",
       "      <td>0.974642</td>\n",
       "      <td>-0.880346</td>\n",
       "      <td>0.447950</td>\n",
       "      <td>...</td>\n",
       "      <td>0.585469</td>\n",
       "      <td>-0.961502</td>\n",
       "      <td>0.408605</td>\n",
       "      <td>-0.954779</td>\n",
       "      <td>1.978782</td>\n",
       "      <td>-0.218348</td>\n",
       "      <td>1.657020</td>\n",
       "      <td>1.384800</td>\n",
       "      <td>-0.819535</td>\n",
       "      <td>1.190883</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>ISGB</th>\n",
       "      <td>-0.063480</td>\n",
       "      <td>-0.064016</td>\n",
       "      <td>-0.289281</td>\n",
       "      <td>-0.317934</td>\n",
       "      <td>-0.109715</td>\n",
       "      <td>-0.084046</td>\n",
       "      <td>-0.040876</td>\n",
       "      <td>-0.446517</td>\n",
       "      <td>-0.197029</td>\n",
       "      <td>-0.322275</td>\n",
       "      <td>...</td>\n",
       "      <td>-0.192797</td>\n",
       "      <td>-0.224058</td>\n",
       "      <td>0.008221</td>\n",
       "      <td>-0.228762</td>\n",
       "      <td>-0.280727</td>\n",
       "      <td>-0.188059</td>\n",
       "      <td>-0.294288</td>\n",
       "      <td>-0.106307</td>\n",
       "      <td>0.008221</td>\n",
       "      <td>-0.259043</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 9650 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "           78065325577605  84954453120651  89210765711011  79688823215908  \\\n",
       "NaiveB          -0.675246       -0.643347        3.786487        0.432673   \n",
       "MKI67_GCB       -0.225175       -0.023267       -0.134967       -0.198207   \n",
       "GCB             -0.366641       -0.314897       -0.327683       -0.285280   \n",
       "MemoryB         -0.696900       -0.606530       -0.944444       -0.912359   \n",
       "ISGB            -0.063480       -0.064016       -0.289281       -0.317934   \n",
       "\n",
       "           80491982100320  83799106918632  80942953666930  85864986188124  \\\n",
       "NaiveB           2.231597       -0.584417        0.632290        3.356539   \n",
       "MKI67_GCB       -0.133968       -0.629513       -0.161521       -0.405962   \n",
       "GCB             -0.297005       -0.245460        1.290305        1.025320   \n",
       "MemoryB         -0.981344        1.171753        0.978973        0.974642   \n",
       "ISGB            -0.109715       -0.084046       -0.040876       -0.446517   \n",
       "\n",
       "           85774791874883  70179765623507  ...  15169824511253  \\\n",
       "NaiveB           1.000266       -0.526293  ...       -0.528307   \n",
       "MKI67_GCB       -0.472801       -0.209399  ...       -0.211952   \n",
       "GCB              2.020235       -0.261615  ...        2.145159   \n",
       "MemoryB         -0.880346        0.447950  ...        0.585469   \n",
       "ISGB            -0.197029       -0.322275  ...       -0.192797   \n",
       "\n",
       "           15139759740250  15083925165338  14998025819487  14920716408150  \\\n",
       "NaiveB          -0.691132        1.004715        0.856357        1.306525   \n",
       "MKI67_GCB       -0.323691       -0.381758       -0.319859       -0.329201   \n",
       "GCB              1.997021       -0.387025       -0.396999        2.464680   \n",
       "MemoryB         -0.961502        0.408605       -0.954779        1.978782   \n",
       "ISGB            -0.224058        0.008221       -0.228762       -0.280727   \n",
       "\n",
       "           14877766735162  14628658632062  14624363664730  14478334776632  \\\n",
       "NaiveB           2.030466        0.661669       -0.636485       -0.775153   \n",
       "MKI67_GCB       -0.424107       -0.276511       -0.184519       -0.350330   \n",
       "GCB             -0.610106        0.825314       -0.294311       -0.405123   \n",
       "MemoryB         -0.218348        1.657020        1.384800       -0.819535   \n",
       "ISGB            -0.188059       -0.294288       -0.106307        0.008221   \n",
       "\n",
       "           14306536084846  \n",
       "NaiveB           0.052213  \n",
       "MKI67_GCB       -0.211417  \n",
       "GCB              0.770439  \n",
       "MemoryB          1.190883  \n",
       "ISGB            -0.259043  \n",
       "\n",
       "[5 rows x 9650 columns]"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "scaler = StandardScaler()\n",
    "df_scaled = pd.DataFrame(\n",
    "    scaler.fit_transform(df_heatmap),\n",
    "    index=df_heatmap.index, columns=df_heatmap.columns,\n",
    ")\n",
    "if z_clip is not None:\n",
    "    df_scaled = df_scaled.clip(-z_clip, z_clip)\n",
    "df_heatmap_scaled = df_scaled.T   # 行=亚型，列=细胞\n",
    "df_heatmap_scaled.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bc64cc18",
   "metadata": {},
   "source": [
    "## 4. 层次聚类\n",
    "\n",
    "欧氏 + `average`（scipy linkage）；推荐 `average`，备选 `ward`。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "740b6b59",
   "metadata": {},
   "outputs": [],
   "source": [
    "def hier_cluster(df, method=\"average\", metric=\"euclidean\"):\n",
    "    \"\"\"对行(亚型)和列(细胞)做层次聚类，返回重排索引与 linkage 矩阵。\"\"\"\n",
    "    row_dist = pdist(df.values, metric=metric)\n",
    "    row_link = linkage(row_dist, method=method)\n",
    "    row_order = dendrogram(row_link, no_plot=True)[\"leaves\"]\n",
    "\n",
    "    col_dist = pdist(df.T.values, metric=metric)\n",
    "    col_link = linkage(col_dist, method=method)\n",
    "    col_order = dendrogram(col_link, no_plot=True)[\"leaves\"]\n",
    "    return row_order, col_order, row_link, col_link\n",
    "\n",
    "\n",
    "row_order, col_order, row_link, col_link = hier_cluster(\n",
    "    df_heatmap_scaled, method=linkage_method, metric=metric\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cae2115c",
   "metadata": {},
   "source": [
    "## 5. 切树（k_init 按细胞数缩放）\n",
    "\n",
    "`k_init = clamp(round(n/30), lo=max(10×亚型数, 50), hi=n−1)`，目标每簇 ~30：簇数远多于亚型数，均值估得稳。\n",
    "\n",
    "> **调参提示（k_init 与 threshold 联动）**\n",
    "> - k_init 越大 → 簇越多越细（每簇细胞越少）；k_init 越小 → 簇越少越粗。\n",
    "> - other 太多 → 多半是 k_init 偏大（切得太细，每簇均值偏噪、低信号细胞单独成簇）或 threshold 偏高 → **调小 k_init**（即调大 `target_cluster_size`）或**调低 threshold**。\n",
    "> - other 太少 → 多半是 k_init 偏小（切得太粗，混合细胞被并入亚型）或 threshold 偏低 → **调大 k_init**（即调小 `target_cluster_size`）或**调高 threshold**。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "2c0e239b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "n_cells=9650  ->  k_init=322  (平均每簇 30.0 细胞)\n"
     ]
    }
   ],
   "source": [
    "n_cells    = df_heatmap_scaled.shape[1]\n",
    "n_subtypes = len(marker_dict)\n",
    "\n",
    "k_init = int(round(n_cells / target_cluster_size))\n",
    "k_init = max(k_init, max(10 * n_subtypes, 50))   # 下限：至少 10×亚型数且 >=50\n",
    "k_init = min(k_init, n_cells - 1)                # 上限：不超过总细胞数-1\n",
    "k_init = max(k_init, 1)\n",
    "print(f\"n_cells={n_cells}  ->  k_init={k_init}  (平均每簇 {n_cells/k_init:.1f} 细胞)\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d9396f20",
   "metadata": {},
   "source": [
    "## 6. 切树中间热图\n",
    "\n",
    "按聚类叶子顺序画热图 + 顶部簇 ID 色条，目检粒度。\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "76cc3918",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/storeData/USER/data/05.Stomics_FAR/01.user/shentuxinyi/01.software/miniforge3/envs/tumor/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 39030 (\\N{CJK UNIFIED IDEOGRAPH-9876}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/storeData/USER/data/05.Stomics_FAR/01.user/shentuxinyi/01.software/miniforge3/envs/tumor/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 37096 (\\N{CJK UNIFIED IDEOGRAPH-90E8}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/storeData/USER/data/05.Stomics_FAR/01.user/shentuxinyi/01.software/miniforge3/envs/tumor/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 33394 (\\N{CJK UNIFIED IDEOGRAPH-8272}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/storeData/USER/data/05.Stomics_FAR/01.user/shentuxinyi/01.software/miniforge3/envs/tumor/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 26465 (\\N{CJK UNIFIED IDEOGRAPH-6761}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n",
      "/storeData/USER/data/05.Stomics_FAR/01.user/shentuxinyi/01.software/miniforge3/envs/tumor/lib/python3.12/site-packages/IPython/core/pylabtools.py:170: UserWarning: Glyph 31751 (\\N{CJK UNIFIED IDEOGRAPH-7C07}) missing from font(s) DejaVu Sans.\n",
      "  fig.canvas.print_figure(bytes_io, **kw)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABKoAAAEuCAYAAACu+fp6AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAbilJREFUeJzt3QV4ZNX5x/F3fCZu674ssrC4FofiUKC0UFqkaHGKFSlQpDilaKFIkVKsFC0t/ofixd1l3ZONj8/8n9/J3mkSkuwCWTby/TzPPJvcuXLusTt595wzvnw+nzcAAAAAAABgOfMv7wQAAAAAAAAAQqAKAAAAAAAAfQKBKgAAAAAAAPQJBKoAAAAAAADQJxCoAgAAAAAAQJ9AoAoAAAAAAAB9AoEqAAAAAAAA9AkEqgAAAAAAANAnEKgCAAAAAABAn0CgCgCAfmTq1Knm8/ns1ltvXSbnnz17tp199tn29ttvW190wAEH2Pjx45e4n/bZZZddbHm49tprl1n5fJ/S6bStssoqdtFFFxW2qW6o/i1cuPA7nfvZZ59159G/34aOVVo8H374oftd7aO3XHXVVbbRRhtZTU2NRSIRGzt2rO299972wQcfdNjv008/tZNOOsnWXXddq6iosKqqKttkk03sH//4x9fOef/999vPf/5zmzRpksViMVdP99lnH/vss8++VRpbWlrcNXt6Pf3008ttv2/ro48+WuL5vTxTW1N9eP31179WT71XUVGRjR492rbffnu7+uqrramp6WvX3G+//Wz33Xf/1mkGAPSeYC+eCwAA9HMKVJ1zzjnuD+i11lpreSenX1KgSsENBdX6+30sWrTIjjnmmF4/9zrrrGMvv/yyrbrqqt/qeB2rwEP7QJXq7ZZbbrlUgcylUVtbazvuuKOtueaaVllZaV9++aUL2m244Yb2xhtv2Morr+z2e+KJJ+xf//qXC3Ssv/76lslk7J577rE999zTpel3v/td4ZwXX3yxDR8+3E4//XSbOHGizZgxwy644AKXH6+88oqtttpq3yiN+XzeSkpKbObMmV2+v++++7qA4/La79vKZrM2ZcoUe+GFF7p8f9NNN3X7LMljjz1m5eXllkqlXN+m4NnJJ59sl156qf3zn/90Zds+uKXA7P/93//Z1ltv/a3TDgD47ghUAQDwPdIfb/of/mBwcD2C4/G4RaNRd+/o+xRs0R/zBx10kBUXF/f6+cvKytxopW/ruxy7tBRkam+LLbZw11Vw7Y477rBzzz3Xbdcoq6OOOqpD3VaAS6POFJg65ZRT3IgsUXBk6NChHc6roIiCa5dffrnddNNNy/y+BhONclPQ2KOyOvroo11Z7rrrrm40nFc2K6ywgu2www4uGEmgCgCWL6b+AQAGBf3P/A9/+EMrLS1100A23nhjNwrC884777g/NP/yl7987dhHH33Uvffwww8XtmnayS9+8Qv3R6f+0Jk8ebL96U9/6nJ60+23324nnniijRo1yu37+eefd5vOWbNm2a9+9SsbM2aMhcNhGzlypP30pz+1efPmfePpcN70l/buvfdeNyJEowyUDxrVoWCEl16NCJEDDzywMG2m/RQrTa/RH3ia3qTA09prr21///vfO1zDm4qjkSY695AhQ9y1ksmke1+jTX7wgx+4AIhGZWg6zltvvfW19Os8GrXi5e9f//pX+6Y0okKjVTTNSqMlbr755q/tM3fuXDvssMPcCB3l+YQJE1yQQsGa9rRNead7V6BF51V90egSj8pBU8P+85//FPLPKxuvPtx5550ueDFixAh3/z/60Y9c+Wo6kspef1jrpTJobm7ukAbVsc0339zVO+Xf6quvbpdccsnXRq9oZJFGpDz//PMuuKL7V/0788wzl2okiuq66qJGCS3Jxx9/7OqR8mb+/PlL3L+7qX+qx8oPtY+ddtrJ/ax2oLbj1R1P+3qpeqLRS7LVVlsV8n1ZTL9UXZb2gWaVVVcB2A022MBaW1utrq6usK1zkErUxlX3NLoKy55GUWlE2/Tp011f1J7q+1NPPWVffPEFRQEAyxGBKgDAgKeggf6HvKGhwQUW7rrrLhewUoDA+0NFf7wo6HLLLbd87Xj9was/MPXHszfNSAGd999/3y677DJ75JFHbOedd7Zjjz32a6Mw5LTTTnN/FP35z3/uckSFR4EBnfeBBx6wE044wQXIrrjiChdU0hSs70rTpX72s5+5oMLdd9/tAnWaluQFZBR48e7/jDPOcPvrdcghh7htzzzzjFt7p76+3t3LQw895KYH6pxdBQUUpAqFQi5Qp/V69LOmOWmNHo1KUYBL7ylAs9lmm7l8bZ/nCtQoQHXfffe59Pz+979303KWloKPCnIcf/zxLq1rrLGGHXzwwfbcc891CFIpoPD444+7vFCea58LL7zQDj300A7n0/pHCmgp3VpraI899nDT4pQuj8pO+au65OWftrX329/+1gV0dI+qPwrWKE9+8pOfuLJW/dT0JOWN9m1Pf0ArQKr3VO+UVo18Uro6071pBInWQNL9K+B53nnn2a9//esl5p3qhurpkqbmqW0p6Ku8Vf3orm4vLQXcFAhVUFlpVh3SSCONTOqO2p7qlRfI8/Jd2yWXy7k6vqRXdwE8bVegTAE5tQXdo+rmkig/FNhaUp5oSuG0adO+8bS//mRp8l+v9kHfZUl1TNr3BV6AV2n497///b2kAwDQjTwAAAPcRhttlB86dGi+qampsC2TyeSnTJmSHz16dD6Xy7ltV111lf5Kyn/yySeF/erq6vKRSCR/4oknFrZtv/327riGhoYO1zn66KPz0WjUHSPPPPOMO9/mm2++VOk86KCD8qFQKP/hhx92u89XX33lznnLLbcUtv3yl7/Mjxs37mv7nnXWWW5fzx/+8Af3e319fbfnf+211752fs8qq6ySX3vttfPpdLrD9l122SU/YsSIfDabdb/rWJ1j//3377Df9OnT88FgMH/MMcd02K5yGT58eH6vvfZyv+s8I0eOzK+zzjqFspGpU6e6/OnqXjvTPiqLadOmFbbF4/F8VVVV/rDDDits088lJSUd9mufVx988EGX51calQ/nnntuvrq6ukM6V1tttfwWW2zxtWO8+vCjH/2ow/bjjjvObT/22GM7bN99991dervjpeGvf/1rPhAIFOqd6Po650MPPdThmEMPPTTv9/u/dr+dTZ48Ob/DDjt0W6cWLFiQv/322/PhcNil2yv7peXlhf5tX4+17e9//3uHfXfaaaf8yiuv3GGb9lNaPPfee+/Xztc5zUt6dVev1P69fVZaaaUe26fnxhtvdPtfeeWVPe6n8ttyyy3zZWVlrn18U2o7o0aN6vb9ffbZJ//oo48ut/3a91lL8/LK77333stvsskm3Z5f73300Ucd+hv1XV3V066oL9D7O+6449fe03397Gc/6/baAIBljxFVAIABTd9O9d///teNJtFUIk8gEHDTPLQY8CeffOK2aeSJppm1Hx2k0S0aTeGNoEgkEm5B3h//+MduOlv70QAacaX3tShyexop0153owg0mkdTlzSKaFnwpvXttddeblSQRnAtLU3H0ogS5VHne9B9z5kzp5CP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9lUUdsdEYkFrrk8Unhn5XNbVG9VZ1RVfIOD6OW1XG/L6TmleON9Kaoa6etvW/4fcdXSe4rKoNde3WDYZt5KaKmtZ1GDFleWFuqx9VO76HP/SC9NcPfb6Kt2b+mHt0759uWfX4n5e6X/3oCKbdNUid/9q7w+fta37PLD56U8U+nKVgfdc1bO2rKbctRvdj17hWMydz7t++3rr2lo+b+NWGWLjh5bYs89+aUfts5Zd//f33DPI49Vjr821PbPa6rXe07YTDt7IfrnmcPvza7NsYnWxNacyNq221Z54Y5b958jVbUG+2GqCafvT27U2qbrYNn7qUqvcbX/7MDzeVi5K2yetIZucnWn5YNRmBodaXTxr5dGAVdx1tlX+aB+bctVMV/5qP3pefLz7Qpv88DD3THj4zK3dZ8e9znva5WFr3QIrqhri0q42pLqizwiPXLCrPfjBXNt5lWGubhxwxQtt7ao5aV/d8NMObR3A948RVQAAAAAAAOgTCFQBAAAAAACgTyBQBQAAAAAAgD6BQBUAAAAAAAD6BAJVAAAAAAAA6BMIVAEAAAAAAKBPIFAFAAAAAACAPoFAFQAAAAAAAPoEAlUAAAAAAADoEwhUAQAAAAAAoE8gUAUAAAAAAIA+YdAFqrbccks77rjjlncyAAAAAAAA0F8DVQcccID5fD676KKLOmx/8MEH3faldf/999vvf//7Xk2bru+9gsGgjR071k444QRLJpO9eh0AAAAAAICBrN8EqiQajdrFF19sixYt+tbnqKqqstLSUuttt9xyi82ZM8e++uoru/baa+3222+38847r9evAwAAAAAAMFD1q0DVNttsY8OHD7cLL7ywy/dra2vt5z//uY0ePdqKiops9dVXt7vuuqvbqX+nnXaabbTRRl87zxprrGFnnXVWhyDU5MmTXaBslVVWcYGozioqKlzaxowZY7vssovtuuuu9uabb/bCXQMAAAAAAAwO/SpQFQgE7IILLrCrr77aZs6c+bX3E4mErbvuuvbII4/Y+++/b7/61a9sv/32s//+979dnm+fffZx733xxReFbR988IG999577j258cYb7fTTT7fzzz/fPvroI3f9M88802677bZu0/npp5/aM888YxtuuGGv3DcAAAAAAMBg0K8CVfLjH//Y1lprrQ4jnjyjRo2yk046yb0/ceJEO+aYY2z77be3e++9t8tzTZkyxY2euvPOOwvb7rjjDlt//fVtpZVWcr9rPavLLrvM9thjD5swYYL79/jjj7frr7++w7k0kqukpMSNulp55ZVttdVWcyO2AAAAAAAAMEADVaJ1qjSi6cMPP+ywPZvNupFPCj5VV1e7wNETTzxh06dP7/ZcGjml4JTk83k3VdAbTbVgwQKbMWOGHXzwwe5c3ktrT7UfhSWXX365vf322/bOO++4EV0aVaXRXD3RYuuNjY0dXikWYAcAAAAAAINU0PqhzTff3I2U+u1vf+u+DdCjkU8KGF1xxRVufari4mK3HlUqler2XL/4xS/s1FNPdetJxeNxF5jae++93Xu5XK4w/a/zND5NQ2xP61NNmjTJ/awRVU1NTW6UlYJa3vbOtNbWOeec02HbESecaqN2OvAb5wkAAAAAAEB/1y8DVXLRRRe5KX7eFD15/vnnbbfddrN99923EGj67LPP3ELo3dHC6wp8aVSVAlVasH3YsGHuPf2r6YRffvllYZTV0vICWTpndzQ18IQTTuiw7Yu6pP37i2//rYYAAAAAAAD9Vb8NVGnElIJHWljdo5FL9913n7300ktWWVlpf/zjH23u3Lk9BqpE5zn77LPdyCuNyGpP24899lgrKyuzHXfc0U3Xe/31123RokUdgkz19fXuWl5w7Nxzz3VBtJ6uHYlE3Ku9cEvjt8gNAAAAAACA/q9frlHl0ULnWlfKo2/jW2edddy0wC233NJNx9t9992XeJ4999zTamtrrbW19Wv7H3LIIXbTTTfZrbfe6oJjW2yxhftZC6u3d+CBB9qIESPcCC1N+dNi6o8++qgFg/02FggAAAAAAPC96jdRFAWHOhs3bpwlEonC71VVVfbggw/2eJ5nn332a9sqKio6nKerdaz06k77YBkAAAAAAAAG4YgqAAAAAAAADBwEqgAAAAAAANAnEKgCAAAAAABAn0CgCgAAAAAAAH0CgSoAAAAAAAD0CQSqAAAAAAAA0CcQqAIAAAAAAN/YhRdeaD6fz4477jhyD72GQBUAAAAAAPhGXnvtNbvhhhtsjTXWIOfQqwhUAQAAAACApdbc3Gz77LOP3XjjjVZZWUnOoVcRqAIAAAAAYBBLJpPW2NjY4aVt3TnqqKNs5513tm222eZ7TScGh+DyTgAAAAAAAFh2DveN7/H94WcdYOecc06HbWeddZadffbZX9v37rvvtjfffNNN/QOWBQJVAAAAAAAMYAFfz++fdtppdsIJJ3TYFolEvrbfjBkz7Ne//rU98cQTFo1GezuZgEOgCgAAAACAASzs7zlSpaBUV4Gpzt544w2bP3++rbvuuoVt2WzWnnvuObvmmmvcdMFAINAracbgRaAKAAAAAIBBHKhaWj/84Q/tvffe67DtwAMPtFVWWcVOOeUUglToFb58Pp/vnVOhN2RmfWR/WGlXO/6h39pOH04qbG9tTlkqnrZwLGSZdNbKKmPW0pi0htpWW3m1oTb1yzorKY+ZV5zjRpbaF1Przef3Wbw5ZUVlEQsE/JZOZiwUCVog6LNsJm+hSFu0OxD0Wz6Xt1wub02L4hYtCrtzRYtCloxn3D76vbwiatlc2zUS8bRLV92cJiutilmsJGKVVTH3XkN9wnw+n2WzOctlcu79+gUtLj2RaMidS2msb01bMpV114jEglYUDVoqk7Ppn9XapMlDbP7cZndsNpOzxtpWqxhSbMFg23cAZDK5wjnLq4usdm6TO7d+HzK02BYtSlgw7HfpGFEVs/mNSSuJBm1hbdxtj0SCNn9Wow0dVeb+jcRCLn+ixWF3jPKorDRiM6fVu20TRpfZvPqEpZIZKy2NWEVRyGYtaLFRQ4qtNZV15020pqxhYauNmzzEpVn3qXxXmlReUlQSdmXYXJ9weabrJFrS7rzFZW3DZ5UXkXDA4omMlZeErSgccNfWtqampGXSOZfWkoqoNdXF3THBUMBdJ1occufWdaV6aLHVzm9x55+8ck3hPMpnr8xz2ZwrA6XfS4M/oDzwu/Mo7Uqz8lll5GluTbt9dK+J1rT5/T6Xd9pX6VH5x5uTNmx0eaHeDC2L2OzaVnc9pb1yWLHlc+aO0Utl7Mo3nXXnUtp0Lq8eiuqtrqXzp5PZxXkXcfet+q16q/RoW8Dvs4a6uNtXqoYUW92CFhs+otQam5Juf+Vl7ZxmK68pcvlRVhG1VCrr8v6dV2e68qwojbg8U7lPm93krqXrBMMBd/86fzgStFhJ2F2ndk6Ty0vlafWwEmtuTLr3VGeV72rLiZaUy7/27UL7hIN+a2lJuTZaXBp26U/G066Oqm401sXdz7o/tUGdT3lUWRl1ZaLz6Hfdl+6nojzq7lX1eeHCVlembXmXcfmtPmLhrEaXpuoRJTayusimz2n+Wpmo7Dxz6uKuXakNq2x1f1VVMWvSPQX8rp6URoOubaj+aj+VhbbNmNdsqXjGYqVtbS0WDVpjQ1sdU7rURqKxkLtvlbXqu/JK9+y1bVk0r9nVd73v8/+vDShf1KaUt61Nbe1OP6uuqC8MhvyufijPk4l0oa3oWPVXqhPqI+JNKfez1/95bUJ1UfVPv+uaSndbnW1rU7qHtr6obZvqieqxzq9rqcx0vNJRtrheqcyVdzreH/C7c3rtQufTdZQvKk/3TGhsq7t6X3XGa3PhcMCdS+dUuXhtvP32ZDLj8t2lQW1c/VNLylLJrIUjAZf3qv8lRaFCffLSpZ91rPJP6c9l8xZWv53IuPzQ7177y6Ta2qbrF/w+dw7lh47z8kvlqvrl1QWVkauXNUWu/FXfdV9en6C80/PP+13vqX/Sfjqf0qDr6WddW21S6dBxqtteH6E2rmeYjld/qDyob0i4/b0+TnnVWJ9w6W6fDvee0lje9jxcVBd3dXHEhLZvPPKeN6I89+jn+qakO5/yuLok7PpC7xmhdtiWBxnXr3jpV7tS+1V/MHZEiTUlMi6t7jncmnZ11h/0uzqvY0evWO3yROdV+1Fd0fvK9+rKmEuz7tc9j8IBq21Oueep6kJLU8pqqmO2YGGrK1flZeOiuJWURwt1UvVR+ad91T/VL2x1eaq6UVIWcecaVhEtnLe0KOTu2z0TlNbF13ZtPRZydU/P0U+/qHP5oD5a9a+5oa2P1f6qm0q/ytW1R91D0O/KVveq+qN6oXvQsXpPfXBRacTVf6VdednSmHDp0Mu1jcXPaOWT8kZlHgsHrEH1Ppd3ZVBU3Nan67xqx177dM9J9TfFYfesVlnoXPoMpeea+g/dj87trpfPu88dqlMe7a/PcbqW+nh91tB9Kt2uT/L5XN3TPmrn3mc1T/2C1sL59azRZwqVjeuT6xNWXhVz7aiqpsha4233pPR7z3z3/Flc58IxPQuzhbaq97zPgPqcojbkPTdVF3WM6pXqn/JRafCurXLWNWoqYzZ7brPLJ7V19b9KV1lVrJCPY4aV2Cef1brnj9f/qE5pv5pRpa7MVa9UZ1U28xa0unv12o2rj5Uxdy61AaWzalhxoT/QedSe1H9WlketSW0mp/S3laF3Ln1WqlvYdm71SV5d9T4rqw/12omedzq3Vwe8fVRn9fzRsbq+105UhspHpVH55j2nlAf6nNHQ3PZZQMfpX6+Oe/2s8kTXXPf0gy21uPx3Gl5ifp/Ptn/ofLNczo7Z6DjrbO91R9jCGY0Wz+bsxdq2z4q/PXUr84eD9s8rn7d3FvcjnqP2XtVmvjzLVn3jRRsezljr3y6y4ilrWfKrjy08eqL5p2xucy4/x4pH1Vi0utwiK61t+dGrtvXH//2nhdbd1tJvPGn5dMqlyV9ebf5YsdW+8LyVTxxtC7Y5xppTOdMjd8i9v7fTj7nXHXvYbivZvY9+YXWptjKR9Suj9sNDN7SxvzrKNr6r0YYPL7FZsxrde6NGlbm2+tDa8y25+va2202v28LZTTZhUpUr3zr32SDsylz9+YL5La6eeH8H6bOzV89VdvqcqvdrRpa19ffhgP378I1tIPptZIUe378g+cW3PveWW25pa621ll1xxRXf+hxAe4yoAgAAAABgAOutEVXA94FAFQAAAAAAA9j/xvj2vmeffXYZnh2DEYEqAAAAAAAGMEZUoT8hUAUAAAAAwABGoAr9CYEqAAAAAAAGsICPNarQfxCoAgAAAABgAGNEFfoTAlUAAAAAAAxgAQZUoR8hUAUAAAAAwADGiCr0JwSqAAAAAAAYwAhUoT8hUAUAAAAAwADG1D/0JwSqAAAAAAAYwBhRhf6EQBUAAAAAAANYwMdq6ug//N9k5wMOOMB8Pp8dfvjhX3vvyCOPdO9pH2/f3XffvcM+//jHPywajdoll1zifj/77LNtrbXW6rBPfX29HXXUUTZixAi37+TJk+3f//534f3x48e763R+6Zil9fnnn9tBBx1kY8eOtUgkYqNGjbIf/vCHdscdd1gmk+mw7zPPPGM77bSTVVdXW1FRka266qp24okn2qxZs9z7zz77bId0xGIxW2211eyGG25Y6vQAAAAAALCsBIL+Hl9AX/KNa+SYMWPs7rvvtng8XtiWSCTsrrvucoGf7tx00022zz772DXXXGMnn3xyl/ukUinbdtttberUqS6o9cknn9iNN97oAkme1157zebMmVN4Pfnkk277nnvuuVTpf/XVV22dddaxjz76yP70pz/Z+++/b4888ogLXP35z3+2Dz74oLDv9ddfb9tss40NHz7c7rvvPvvwww/dPg0NDXbZZZd1OK/SqvRon8MOO8yOOOIIe/rpp5cqTQAAAAAALCv+gK/HF9Cvp/4pyPPll1/a/fff7wJPop8VwJo4cWKXx2gE1e9+9zu788477Sc/+Um357755putrq7OXnrpJQuFQm7buHHjOuwzZMiQDr9fdNFFtsIKK9gWW2yxxLTn83k30mullVayF1980fz+/8Xp1l57bXc/2kdmzpxpxx57rHtdfvnlHUZ0bb755m7kV3tDhw61iooK97OOufLKK+3NN990I7UAAAAAAFhe/OEAmY9+41uN8TvwwAPtlltu6RBg0oikrpx66qn2+9//3o1a6ilIJQ8//LD94Ac/cNP4hg0bZlOmTLELLrjAstlstyOw/va3v7lra9rdkrz99ttuJNVJJ53UIUjVnneee++9152/u9FfXlCqMwW6HnvsMZsxY4ZtuOGGS0wTAAAAAADLUiAU6PEF9PtA1X777WcvvPCCm6I3bdo0Nzpp3333/dp+jz76qF188cX20EMPuSl0S6KRWpryp8CU1qU644wz3BS7888/v8v9H3zwQTeyyVsXa0k+/fRT9+/KK69c2DZ//nwrKSkpvK699lq3/bPPPrOysjK3VtbSGD16tDs+HA7bzjvvbGeddZYbeQUAAAAAwPLE1D8M+G/9q6mpccGY2267zY0g0s/a1tkaa6xhCxcudNP+1l9/fSstLe3xvLlczk2h00LkgUDA1l13XZs9e7Zdeuml7hyd/eUvf7Edd9zRRo4c+Y3S3370lRZJ10gr2XLLLd0oKtF9Lc0oLc/zzz/v7i+ZTLp1sI4++mirqqpya1V1R/vq1V4g2XZ9AAAAAAB6A1P/0J986+X9Nd3u1ltvdcGq7qb9aRH0//znP26R8R122MGampp6PKdGL2n9KAWpPPrWv7lz5xYCSB6N5HrqqafskEMOWeo0r7jiiu7fjz/+uLBN15o0aZJ7BYP/i9spHVo0XWlfGhMmTHDn0Df+aWqkRp11NxLMc+GFF1p5eXmH18XX8G2BAAAAAIDew4gqDIpAlQJPCh7ptf3223e7n74JUMEqTbHbbrvtrLGxsdt9N9lkE/v888/dyKr20/UUwNKUuva0RpZGX2k019LSgumrrLKK/eEPf+hwja789Kc/ddfUQvBd6byYemcKgLX/ZsSunHbaaS4Y1v51ytG/Woo7AQAAAABg6bBGFQb81D8vEKOFyb2fl7R+07PPPmtbbbWVC1Y9/vjjbvRQZ5omd/XVV9uvf/1rO+aYY9w6UVpMXd+i156CTApU/fKXv+wwCmpJNJVPx2277bYuKKZAkUZspdNpe+6552zBggWFe9G3GOrb/jSFT8G1/fff333jn74N8K9//atbj0rrZ3kUiEskEoWpf7fffrsLdvUkEom4V3uZpo4BOQAAAAAAvgt/+FuPUQH6T6BKtNj40vKmASpYpUDRE0888bV9FBzS9uOPP96tb6VjFLQ65ZRTOuynKX/Tp0/vdsphTzbaaCN74403XABM3y6oaYXFxcW25pprusBU+3MeeeSRbgqgRmD9+Mc/diOkFKzaZZdd7IQTTuhwXm+BdgXOdB+HHXaYnX322d84fQAAAAAA9CZ/gEAVBmigSmtS9UTfwtfTvprC1359KAVyOgdzfvCDH9grr7zS43U0KkuLnX9bCj4t6V48+rbCnr6xUAuwf5e0AAAAAACwLAVCBKowSEZUAQAAAACAvs3HiCr0IwMqUPX888/bjjvu2O37zc3N32t6AAAAAABY3gKsUYV+ZEAFqtZbbz17++23l3cyAAAAAADoMwLhnr8ADehLBlSgKhaL2aRJk5Z3MgAAAAAA6DN8ft/yTgIwOANVAAAAAACgI0ZUoT8hUAUAAAAAwADGYuroTwhUAQAAAAAwgAVC/OmP/oPaCgAAAADAAMaIKvQnBKoAAAAAABjA/IyoQj9CoAoAAAAAgAHMHw4t7yQAS41AFQAAAAAAA5jf71/eSQCWGoEqAAAAAAAGMH+YP/3Rf1BbAQAAAAAYwHyMqEI/QqAKAAAAAIABjBFV6E98+Xw+v7wTgf95aWqtHXrVS/be0SMsH4pYbdlEi2fytuulz7n3rzp0Azv1nndszpcLrbSqxEoqopZJZy2XyVmiJW3+oN/CkYClklmrGFJkTYviFgwFLN6Usmhx2wJ6oUhbfLKlMWnFZRGLN6csGU9beXWRvbxvpb1oE+zIP79idx6/qYUDPgv7fVZ86xn2k/zuFgj6LatrtaYtEPC7Y0ORgEuHrqG0tDan3HklEgtZa1PS7T90dJk11sXdtkRryl1Ppn00z1Zdb4zVzm+xXD5vcz6dYRUjhlkkFrRcLu+u2VyfcNdIxjNWM7LUmhsS7hr1C1qspDxm8eak29fv97l9/u/MrWz7S56zYDhgkWjIva98UP5Ei/R7ynx+n7uHQNBndfNaXHp0vsphxdZYG7dMKmuhaMAdp31F23LZvJVWxqyhttWqR5RYw8JWKy6Lut9T8bSV1RRZPpd3+aS063idV9dSeoKhtvnhKiOVWyqZseHjK2zRvBZ3z9HisMsnlVc6mXHpV76EI0F3/cZFcasYUuyupXvWvShPdV7dn/JlzpeLLFYaNp/PVygr/a73lDadX7z0if5VfQnHglZUEraFs5rc+ZTG0qqYqy/KI6Uxm81Zk0tj2F3Xq0vKJ9UDva9tZZUxt011ZO7UeisqjbhyVLpVT7OZvC2a11yom9peXlPkzqFr6x5VnjqH0qFjlV9eurVd59E+bb9b4X6VBh0TK4m4fFQe6rzBsN9tmzt1kZVVFblrevmycHajjZhQZeoWdR3lufJK73ltTT/rGOW5zqtr6/5U92rnNFi0OFqoq2VVMZs/o6HtnrN5lz7ds9KsdlI1rGRxe0q57TqH8l/lnE5mF58nbal4xpWfq2vlEXdulZHasvJZ9bB2TrO7nvbXOZXXSmdbOYVc/6BztNV5v7tGMpF259D5Xd5XF1nt3CbXRnR8oiVlRWXKq3qL19dZ+bChrg7HSsLuHG35EHRpVR7o3Mo319b8Ppdfuq/i0rAlkxmXdyoz/esP+N1xKiftq7qq/NG2qpoiWzCv2YYMK7GmpqRl0jl3jFcOuobSrH5hyJgyV64qX5WH0qB06Rivrak8Veau3cXTLs/UhpTv6URbO9fvXj+pvNJ9ivJAx+pelHalVefXtZQerwxc+1vcT4RjIbe/8ljpUD3UedvqtOpzWz+stKYX51fdvGZX37SPjhWVh/JVFsxsdOfQcTqf14eo/8qkcq4cdC3trzxUPfLagcpT9a+t308U2oTr01w6247z+k/VE+99r36oH/fqntKpexCVm9dmVZ90TZWL7kn5qvpXUhEzf8Dn0qC6qfamdqpnlOqB0uD1k+pL1Q/p/Pmc2ktb3nl9jO7N65tbGpKuHaocVA90vNKj+1C61Tdq34qhxa7MWhuT7rzDRpdby+K+QOnzngu6T51jyOhyVzeULvX12u7qQmva/d728//6XdVx9f9Vw9quozR6/ZHUL2h1Zam8V14pj2Th7CbXlpR+3Z/rh8N+975Xlq7fWVy+SpvKU88E184W11GPV/9VL7y25p4hi9OpeunVX9Vr9d/qf5UGbVe9V157z91okdq5z4qLw64dKh/0LFCeqY4oXTq/8kX3qnTpml55Kv3Kc5WFtnn/ep9X2tpK0N2j6ozSoON0PqVJfZm2lS3+rKCflU/KA/f8CvjdPuqrVE/0s/JN9Uplr3S2PX+Cbf1Rqq1dqI6prrp2HvK7/sHLY+WJ+lkd11bfMq5+eNfTecuqY4Uy1mcLncfr11QvvXMpv3W80qxj257pbX1lW9/SdpzKQs8CL+/a6kRbeapfU7rdZyzV58V9quubSyOuf9bPaltvHVpj2bq5Nv1vd9qwDVa1uS+/b9Fzb7aSsN8WxrP28owGd74pQ0utTM/k5pQtSqRtkzFl1pzKWSqbt3GfPWrB4eMtM/tLC4xZxXyZhKVHrGa+VIvlQzHLPXWzBTf+sc267CwbfczJVnvnn23hfufbyvk5lqkc6+5rZnPGMrm8zW5K2srVRRbP5Kw5lbXHPl1gJ6xZbE2hCivJJyzw1evmCwQsn0yYr3qU5SPFZrmM+dJJS739jPm2P9xa1LbUn/l9Vh4NWMhn5k80WC5Sav5kk/31s6RNGVZqw4pDtrA1Y63prK1cE7O42s/iY4Lqt1Otlg7GLNI8z/wtdZZvXGj5kau4c80qnmD1iawtiqetIZmxN2bU246rDLUPFzTbBpcfYRN33dSaps22qq22tWztXAuNXcmS771sM55+zZpmNtjYux62UvWfqVZr9kXtxRmNtsZtp9jYg39lyY/fsMDme5sv2WJnjd3GNhtRYg9Na3D5dOLh69mCD+dbpCxi89+bb1vfdJyl581wI158wbDNf/0Du+Pql2xGvK2tyDVv/tlyiRab/eDDNuaI4y2/aK75y6osu3C2rXVPwLVLtVu1R7XX9u1Odc/rh/W+6qTXPlSHvOeP2uxdx21qk2Ipq83HXL2oigXs09qkHX7zq4XPPfoMojagtuvqrZ7z8Yw7lz5b6Vpqd3pf7UrXVNtQO3nw1C0tFvTZbpe/4NqH0qD25n0e1TXaPmOXuvb4xk519urp19vCr+qtfGix+cMBO2nns931Tt57Tfv50Abb9NY59tzhq9i8K86yWYdeahukP7W1b6pzbV7n0zVKyqM2+4s6d99qU0qL+suG+XU2dvJom/HJHJu4xmibP73BPvjjjwbkn6fz//DrHt8fetKV31tagCVhRBUAAAAAAAOYb/F/lAD9AYEqAAAAAAAGMH+IP/3Rf1BbAQAAAAAYwPyBjlPGgb6MQBUAAAAAAAMYi6mjPyFQBQAAAADAAMbUP/QnBKoAAAAAABjAWEwd/QmBKgAAAAAABjB/MLS8kwAsNQJVAAAAAAAMZH4WU0f/QaAKAAAAAIABzBdiRBX6DwJVAAAAAAAMZIyoQj9CoAoAAAAAgAHMxxpV6EcIVAEAAAAAMJAFw8s7BcBSI1AFAAAAAMAA5vP7l3cSgKU2qGvr3Llz7de//rVNmjTJotGoDRs2zDbddFP785//bK2trYX93nrrLdtzzz3d+9pvpZVWskMPPdQ+/fRT9/7UqVPN5/MVXuFw2J3zvPPOs3w+vxzvEAAAAAAw6GlEVU8voA8ZtCOqvvzyS9tkk02soqLCLrjgAlt99dUtk8m44NPNN99sI0eOtF133dUeeeQR+8lPfmLbb7+93XHHHbbCCivY/Pnz7d5777UzzzzT7rnnnsI5n3rqKVtttdUsmUzaCy+8YIcccoiNGDHCDj744OV6rwAAAACAwcsXCCzvJABLbdAGqo488kgLBoP2+uuvW3FxcWG7AlYKTGkklEZVHXjggbbTTjvZAw88UNhnwoQJtuGGG1p9fX2Hc1ZXV9vw4cPdz+PGjXMBrzfffJNAFQAAAABg+enFxdQvvPBCu//+++3jjz+2WCxmG2+8sV188cW28sor99o1MLgNyql/tbW19sQTT9hRRx3VIUjVnqbwPf7447Zw4UI7+eSTu9xHo7G6owCYglQKaAEAAAAAsDy/9a+n1zfxn//8x/0t/corr9iTTz7pZiZtt9121tLSsszSj8FlUI6o+vzzz92Iqc4R35qaGkskEu5nNTyNkJJVVlllqc6rSLLf77dUKmXpdNp+9atf2f77778M7gAAAAAAgKXj8/fe1L/HHnusw++33HKLDR061N544w3bfPPNKRJ8Z4MyUNV+1FR7r776quVyOdtnn33cOlPfdCF0rVc1efJkF6R677337Nhjj7XKykq76KKLutxf19CrvVSn3wEAAAAA+E6WMGqqq79NI5GIey1JQ0OD+7eqqopCQq8YlFP/9I18ClJpTm17EydOdO9pnq3o2/2k837dGTNmjDtewaq99trLjjvuOLvssssKo7S6mttbXl7e4XX7dVd85/sDAAAAAKD9Yuo9vbr621TblkSDO0444QTbdNNNbcqUKWQ4esWgDFRpSt+2225r11xzTY/zaDXPVtMBL7nkki7f77yYemeBQMDN19VUwK6cdtppLvrc/rXfEcd9w7sBAAAAAKAHwXCPr67+NtW2JTn66KPt3XfftbvuuovsR68ZtFP/rr32Wttkk01svfXWs7PPPtvWWGMNt77Ua6+95kZQrbvuum6h9Ztuusn23HNP23XXXd1UPo2Y0gLrf//732369Ol29913d1ikfe7cuS44pal/V155pW211VZWVlbWZRq6GkoZrksv83sHAAAAAAweS1owfWmn+bV3zDHH2MMPP2zPPfecjR49+jumEPifQRuoWmGFFeytt96yCy64wEWKZ86c6RrmqquuaieddJIdeeSRbr/ddtvNXnrpJTfs8Re/+IU1Nja6KX5bb721nXfeeR3Ouc022xRGUo0YMcJ22mknO//885fL/QEAAAAA4Ph6bzKVpvspSPXAAw/Ys88+axMmTCCT0asGbaBKFEy6+uqr3asnGnV13333dfv++PHjv/HC6wAAAAAAfB/y/t770/+oo46yO++80x566CErLS11s4pE61p56z0D38WgXKMKAAAAAIBBNaKqp9c3cN1117k1rLbccks3+MN73XPPPcss+RhcBvWIKgAAAAAABrxAoNdOxWwiLGsEqgAAAAAAGMDyvbhGFbCsEagCAAAAAGAg68U1qoBljdoKAAAAAMAA1puLqQPLGrUVAAAAAICBjKl/6EcIVAEAAAAAMJD5e28xdWBZI1AFAAAAAMAAxmLq6E8IVAEAAAAAMJAF+NMf/Qe1FQAAAACAgYzF1NGPEKgCAAAAAGAAY+of+hMCVQAAAAAADGQspo5+hEAVAAAAAAADmc+/vFMALDUCVQAAAAAADGB51qhCP+LL5/P55Z0I/E/ldmfZdZf+yo74zQ0WKa0yfzBs067e0U7/b4uVF4XswRem2qwPv7BkU535Q2Hz+QOWz2XdsbNv3NNmB2rM5zNTqf53VqNFg377ZEGz1TWnbMtJNXbDi1/Zfx54xlJNi6x4yBj73Ym72KiyqN3x6nR7+r7/s+n7+812OdZW/tXdFq+faz/40RY2tCxqT/zrHWtZMN2i5UMsGCux+KK5hWvr32wy7tKbScUtE2+2TKLFIuU1Ll2haImlE83uX70fDMfc9qY5X1jJsPHu+HBpldV9/qZFK4fZZ387wv74wjRbY2SZrT2i1EZ/8qhla+dawxYHu+OqkwssWzLEgvUz7dWfH2rrXXC0+cJR8w8dZ6n3XrDwaj+wugdvt9jQSgsUl1p60SKLrrJmWwZn0u4ff1mV+YvLzHJZy2fSlpk/y3yhkAXKqy3X0mT5VML8JRVW9/Sj5g8HrfGrOVa50ljLJJJ265n/si9aUrbT8BIbNmWIBaNBm/7abKseV24/HflTd3/KH+WN8kr5oftLNiy0cGmle1/3rDJUfioflFfKw1jlcMtlUm1pDLaVb6q1wRKL5ln5mMmuTJSP2q79spmUpVsarGTYBGutnWWBSMxy6ZR7T9fXOSSbSpjP73fp0DXz2awlGhe49yIlVRYprbDGOV+6n3Vs87yp7hqxymEWKip351305Ttu/6Lqke493Vuqqc69n1H5Fpe78zbN+dzdh8pc9SyTjFvF2MmFeqo0K090fPGQsdYw/cNCXdcx4aJyl7ai6lFuP20LBMPuON278i1cXO5+13alRb647cC2fEu1WtwftUWJrBWH/Pb89AYrj4asIZG2NYaVWn0iY63prIUCPiuNBG1Macjimbw9+nmtJTM5G14SsVw+bw3JjAV8PvtsfrNre2pD4aDf4qm2+wj4fe7VlMjY6Kq2Ol0SCVpzMmOxcMBe/2qRjSiP2pOvzrBgKGDZbM5GjSqzSNBvU6c3WKw0bJlUzmqqY9bUmrZIOGCpTM7WGFNhC5oSls3lrSQasvmNCasuibhzv/7JAltxbIVNm99sa4yrdNdabVSZTagsstrWlG04psLd82e1cZe2SMBvzamMpXN5e/qTBbbvuqPtkY/m2fpjK+2ihz+0ysqoja4qsobWlL347GcWikated4Ml6ettbML7Vv11v1bVG7J5jpXh6OVwy0Q9FuyqdGyqbi7f9Uv1Qkd57V1r32rLEX1S2WtY1SG2ifRsMBKR05yddnVSdVRtc1c1rULHROrHGqpliZLtza44/VSvdN1lC7VJ+941UW1QZ3buwftp/qtn1W/vD5L74cW35fql/o57eO9xBcItF1T7W5xurx703a1PdVJvae0en2cV0fT8WYLxdrarbZ59+WdX++1p/MoLbontWe3fypeuG9dw50rFbdAOObyQeXRPO8rt7/S4p1b9y1Kk1cOOk5p0n1Fy4a4/PD6KV1L+ZhqaXTt30tfqqXBPXPUxtOtjW679g2Eo5bLpC0YLXb5GYy23YvyxHtG6Xwurxb/rntXn/LeX4+0VDZvsaDf/D6zRCZvIb9ZbnE+hP0+S+Xyrk43JnNWHPJZ1J+3T+sz7ph4JufaaDqXs/JIwBqSWde2I4GAxUJ+y+TyVhTyu31b021nDfrN9KGnJOS3bN7c9SNBn8XTOddmwgGfLWjNWMjvc8fqnPrZtXmf2rxZSzpnqUze9RNqzxXRgI1q+sLqKld0+5UG8+bLpi0ViFjIcuZPxy0VKm67vs8s0DDb8qo/KptAqK3MY+WF/+n2t9RaPlJieb2Xz1ugcY7lw8XmS8fNl2wxC4bMF2+0XFGFfR4aY7m82bvzmqxEz6pE2sZXxmxmY9ICPiv0Y7oHpdX14aGAy6fKmPrFjCWzOdf3lUWCrq9ou1dz26QsGrK56pPyZi2pjOunhpZGLJfLu22SyGRdfxry+60unrLiUFv9m1rbakPKIq7fbGhN29jqImuItz2HvX50jeFlVh4Nuvyc15xy/w4tjix+39x9aVs2Z7Yo0Xas+nPdh+6pPBJqez+fd2nW/rq/pz5b4M4/rbbVHaM0q19VvSiNBt178xuTVlEUcn17bXPKbYunsy7PZi5qdZ9/mhNp1xfrvquKw+4cuq6O0bZptS3uZ213z4FoyGbWtbptFUVhq21OWlNLyoZVxmx+fcJaG5NWUhG1YNDvnhXq/2vKIja8PObOu8qIUmtKZmzawlYbV1Pk8k73oH9HV8bc8+j+F6dZvDlp0aKwe77oo/zHz73snr3q+/Sv2vnaP1zHXrj7IffZauK6a9iXb7xbaH/6XOEPhlwfoj5D/bD6Tq9tu/xXf7O4X1Pb/ccfD7ST/vamBQJ+d90Td17Fdlyhwra95hXbdNVhLi+2WXWYjS2P2RMfz7falpTNqY9bPJGxzScPtS1WqHblVRkL2Np7Xej6D/Vz6lvVd6gfdvVp0TyrGDfF9U3e5xLXpy/uR73niX7XZyudR/ek9K6//QaufIeURt0zMp7KWHlR2JW/jKyIufo9uyFhL3620G1THZi3KG7pZNa2WXuk22fjsRV2ydOf2SojymyrFart44UtVlMUdm0pFPDbiJKIlUb8tqAlYw3Jtvo4pixiQ7KLLNA032aVr+T6mZJMo+Wi5ZbMmTv2h5e/aJutPtzu+vtrroxaFsywslEruf5bn4m8z2Z6rqm/9565eiZrv1t+t7Ptdcx1hf547Z22sHefftV9thP1t/qc5OWHnjkq87l3H27ZF+61+T/4pY1Z9L5NrVjN9ZuzmtKuvch/Z9a7drzeyHI76o437YhtVrTDfn2FhYrKbKu9trerfjzFVv3J+e5zoOqN0rrKphvaAVtNtLVHlLv2eu2LU1399z4jvfb0u+4elFaZtNEG1lDbauusO9LV+b3WGmkPvT/Xbr/zZXc+la/KXD/r/mfcdoClgjH3mW69g29w93T04dvZldc8Yvf+YX/b45jrbe4tv7Ah+/zFSkdMsscv3cM22f8yu+DcA+3uF6fa569/6j5Hqo7pWb/Lbmu3fbab12QfvPixe36ed8ruru/b8YGzbMzRJ9m02HibWFNqA1FrPNHj+0Wx6PeWFmBJGFEFAAAAAMAApqA+0F8QqAIAAAAAYADzRsEC/QGBKgAAAAAABjBW/EF/QqAKAAAAAIABjBFV6E8IVAEAAAAAMIAt/s4HoF8gUAUAAAAAwACmb0cF+gsCVQAAAAAADGDZ3PJOAbD0CFQBAAAAADCAsZg6+hMCVQAAAAAADGAspo7+hEAVAAAAAAADWI41qtCPEKgCAAAAAGAAY0QV+hMCVQAAAAAADGB86x/6E//3cZEDDjjAfD6fHX744V9778gjj3TvaZ/+aOrUqS793iscDtukSZPsvPPOY8E6AAAAAMByp5l/Pb2AQReokjFjxtjdd99t8Xi8sC2RSNhdd91lY8eOtb74rQiZTGap93/qqadszpw59tlnn9k555xj559/vt18883LNI0AAAAAACxJNtfzCxiUgap11lnHBaTuv//+wjb9rADW2muv3SFAdMkll9jEiRMtFovZmmuuaf/4xz8K7z/77LNu5NLjjz/ujtM+W2+9tc2fP98effRRmzx5spWVldnPf/5za21tLRyXTCbt2GOPtaFDh1o0GrVNN93UXnvttS7Pu95661kkErHbb7/d/H6/vf766x3u5eqrr7Zx48Z1GDFVXV1tw4cPd9v32Wcf23jjje3NN99cJnkJAAAAAMDSylm+xxcwKANVcuCBB9ott9xS+F0jjg466KAO+5xxxhlun+uuu84++OADO/74423fffe1//znPx32O/vss+2aa66xl156yWbMmGF77bWXXXHFFXbnnXfav/71L3vyySddQMlz8skn23333We33XabCyBpet72229vdXV1Hc6r/S688EL76KOPbNddd7VtttmmQ5pFv3vTGbuiwJauseGGG36n/AIAAAAA4LvK5vI9voBBG6jab7/97IUXXnDrOk2bNs1efPFFF4TytLS02B//+EcXwFIQSaOqFBDSPtdff32Hc2kNqE022cSNqjr44INdIEvBLf2+2Wab2U9/+lN75plnCufVe5deeqntuOOOtuqqq9qNN97oRmP95S9/6XDec88917bddltbYYUV3CipQw45xE1P1Igseeedd+ztt992Qbf2NIKqpKTErVG1/vrru8DZ/vvvvwxzEwAAAACAJUtn8z2+gEH7rX81NTW28847u1FNmjann7XN8+GHH7p1qxQoai+VSnWYHihrrLFG4edhw4ZZUVGRC2y13/bqq6+6n7/44gtLp9MusOUJhUK2wQYbuJFT7WnaX3u77767HX300fbAAw/Y3nvv7YJoW221lY0fP77Dfvfcc4+bdqjrvPfee26aYWVlpV100UXd5oeCX14AzJPPLf26WAAAAAAALAnf+of+5HsNVImm+inwI3/60586vJfLta3ipql7o0aN6vCe1oxqT4Emj6bgtf/d2+adz1tLqvNUPW3vvK24uLjD7xohpZFgmu63xx57uKmFmmLYmdba0nRCUcDqyy+/tDPPPNNNUdSaWF3RFEMtvN7hPiduru9C7HJ/AAAAAAC+KUZNoT/5Xqf+yQ477OBGSOml6X3taUqeAlLTp093QZ/2LwWCvi0dr4CTph16NPJJa0kpqLQkmv6nb/W79tpr3XEKWC1JIBBw3xqo++zOaaedZg0NDR1e0QmbfoM7AwAAAACgZ7l8vscXMKhHVCmA402308/tlZaW2kknneQWUNdoKH0zX2Njo1swXes//fKXv/xW19QoqSOOOMJ+85vfWFVVlfv2QX2zoL4VUOtbLYmCWRtttJGdcsopbkSY1rbqrLa21ubOneuCU5r6d+WVV7opgvoGwu4oKNd5pJjP/70XCQAAAABgAEuzYDr6keUSFekpePP73//ehg4d6qbFafpcRUWFrbPOOvbb3/72O11Ta0Up+KVpfE1NTW4tqscff9ytI7U0FNBSwKzztxR69O2AXvBtxIgRttNOO9n555//ndIMAAAAAMB3xTf7oT/5XgJVt956a4/vP/jgg4WftWaUFiLXqytbbrllYc0pj74ZUK/2tDaUXh6tE3XVVVe519Ket705c+bYlClT3Df6tadF1Xs6DgAAAACA5YkRVehPmGe2BM3NzW6q4tVXX+1G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dDptt912m02cONHmzZtnTz/9tNXV1RX2eeihh2yvvfaybbbZxu23wgoruMXi3n33XTvjjDNss802s4qKisL+Tz31lK222mqWTCbthRdesEMOOcQFuA4++ODldJcAAAAAAGhEFVP/0H8MukBVfX29CyQ9++yztsUWW7htGim1wQYbFPZpaWlxAaadd97Z7r///sJ2Bau0n4JQnaPO1dXVbmSWd76bb77Z3nzzTQJVAAAAAIDlKr8MFlMHlpVBM/XPU1JS4l4PPvigG/3UlSeeeMKNnjr55JO7PY+m+XXn9ddfd0GqDTfcsFfSDAAAAADAt5XN5np8AX3JoAtUBYNBu/XWW910Pk3d22STTey3v/2tm9Ln+fTTT92/K6+8cmHba6+9Vghy6fXII490OO/GG2/stmuNqvXXX99NG9x///17TIsCZY2NjR1eyXSm1+8ZAAAAADC4R1T19AL6kkEXqPLWqJo9e7Y9/PDDbhF1TQNcZ511XACrO2ussYa9/fbb7qWpgZlMx4DSPffc495755133M9a4+rUU0/tMR0XXnihlZeXd3hd9sgLvXafAAAAAAAwogr9yaAMVEk0GrVtt93Wfve739lLL73kvhXwrLPOcu+tuOKK7t9PPvmksL++9U/f5qdXV8aMGePemzx5shtNddxxx9lll11miUSi2zScdtpp1tDQ0OF14i6b9vq9AgAAAAAGr2wm3+ML6EsGbaCqs1VXXdWNlJLtttvOqqqq7OKLL/7W5wsEAm7UVSqV6nYfBb/Kyso6vCKhQbe+PQAAAABgGWLqH/qTQRcV0SLpe+65px100EFuOl9paalb/PySSy6x3Xbbze2jtaZuuukm+9nPfua++e/YY491o6yam5vtscceKwSiOp937ty5Ljj13nvv2ZVXXmlbbbWVCz4BAAAAALC8sGA6+pNBF6hSEErfxnf55ZfbF198Yel02k3bO/TQQ92i6p4f//jHbkqgRlVpUfS6ujq3htR6661nd999t+2yyy4dzrvNNtsUAlgjRoywnXbayc4///zv/f4AAAAAAGiPBdPRnwyaQFX7hdK1iLleS6Kg1L333tvjPuPHj7d8njm9AAAAAIC+KZvJLe8kAEtt0ASqAAAAAAAYjHJZAlXoPwhUAQAAAAAwgOVyzAJC/0GgCgAAAACAASyX6f7b6IG+hkAVAAAAAAADWD6X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",
      "text/plain": [
       "<Figure size 1400x340 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 切树 + 中间热图（顶部色条 = k_init 簇 ID）\n",
    "cluster_id_disp = pd.Series(cut_tree(col_link, n_clusters=k_init).flatten(),\n",
    "                            index=df_heatmap_scaled.columns)\n",
    "df_sort = df_heatmap_scaled.iloc[:, col_order]   # 按聚类叶子顺序\n",
    "\n",
    "cats = sorted(cluster_id_disp.unique())\n",
    "strip_colors = plt.get_cmap(\"hsv\")(np.linspace(0, 1, len(cats) + 1)[:-1])\n",
    "cmap_disp = dict(zip(cats, strip_colors))\n",
    "strip = np.array([cmap_disp[c] for c in cluster_id_disp.loc[df_sort.columns].values])\n",
    "\n",
    "fig = plt.figure(figsize=(14, 3.4))\n",
    "gs = fig.add_gridspec(2, 1, height_ratios=[0.12, 1], hspace=0.03)\n",
    "ax0 = fig.add_subplot(gs[0]); ax1 = fig.add_subplot(gs[1], sharex=ax0)\n",
    "ax0.imshow(strip[None, :, :], aspect=\"auto\"); ax0.set_yticks([])\n",
    "for sp in ax0.spines.values():\n",
    "    sp.set_visible(False)\n",
    "sns.heatmap(df_sort, ax=ax1, cmap=\"RdBu_r\", xticklabels=False, yticklabels=True,\n",
    "            cbar_kws={\"shrink\": 0.7})\n",
    "ax0.set_title(f\"over-clustered heatmap (k_init={k_init}, 顶部色条=簇ID)\")\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3e52ea40",
   "metadata": {},
   "source": [
    "## 7. 按均值归类\n",
    "\n",
    "每簇各亚型均值取 argmax；最大值 < `threshold` → other；组内按对应打分降序。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "d3710ed4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "hier_cluster\n",
      "MemoryB      2958\n",
      "NaiveB       2309\n",
      "B_Other      1751\n",
      "GCB          1339\n",
      "MKI67_GCB     658\n",
      "ISGB          378\n",
      "Bact          257\n",
      "Name: count, dtype: int64\n",
      "B_Other 比例: 18.1%\n"
     ]
    }
   ],
   "source": [
    "def assign_by_mean(df_scaled, col_link, k_init, threshold=0.05, other_label=\"Other\"):\n",
    "    \"\"\"切树到 k_init 簇，每簇按各亚型均值取 argmax；<threshold 归 other。\"\"\"\n",
    "    subtypes = list(df_scaled.index)\n",
    "    cluster_id = pd.Series(\n",
    "        cut_tree(col_link, n_clusters=k_init).flatten(),\n",
    "        index=df_scaled.columns,\n",
    "    )\n",
    "    mean_scores = df_scaled.T.groupby(cluster_id).mean()   # 行=簇，列=亚型\n",
    "\n",
    "    cluster_to_subtype = {}\n",
    "    for cid, row in mean_scores.iterrows():\n",
    "        j = int(np.argmax(row.values))\n",
    "        cluster_to_subtype[cid] = subtypes[j] if row.iloc[j] > threshold else other_label\n",
    "\n",
    "    labels = cluster_id.map(cluster_to_subtype)\n",
    "\n",
    "    # 组内按对应亚型打分降序；other 保持原序\n",
    "    ordered = []\n",
    "    for st in subtypes + [other_label]:\n",
    "        cells = labels.index[labels == st]\n",
    "        if len(cells) == 0:\n",
    "            continue\n",
    "        if st != other_label:\n",
    "            cells = df_scaled.loc[st, cells].sort_values(ascending=False).index\n",
    "        ordered.extend(cells)\n",
    "    return labels, cluster_id, ordered\n",
    "\n",
    "\n",
    "labels, cluster_id, ordered_cells = assign_by_mean(\n",
    "    df_heatmap_scaled, col_link, k_init, threshold=threshold, other_label=other_label\n",
    ")\n",
    "adata.obs[\"hier_cluster\"] = labels.reindex(adata.obs_names).fillna(other_label).values\n",
    "adata.obs[\"hier_cluster\"] = pd.Categorical(\n",
    "    adata.obs[\"hier_cluster\"], categories=list(marker_dict) + [other_label]\n",
    ")\n",
    "\n",
    "# 质控：各类细胞数与 other 比例\n",
    "print(adata.obs[\"hier_cluster\"].value_counts())\n",
    "print(f\"{other_label} 比例: {(adata.obs['hier_cluster'] == other_label).mean():.1%}\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c254fa6a",
   "metadata": {},
   "source": [
    "## 8. 可视化与保存\n",
    "\n",
    "热图（列按归类顺序）+ 空间图（若有 x/y）+ 保存。\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "e41d0759",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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3RSvvvoqvvvuO5x88sk46qij8Nlnn7W6vSOOOMI+mz59enLe999/j2+//dY+o3vvvReXXHIJxo0bhx9//NH2f9lll+Hhhx9uM5w///wz3nvvPQwfPnylHLeIiIiIiIhIV7FaNUTQ/vvvj4022qhZjwVHr169cP7559vnAwcOxJlnnomRI0fi2WefbXVb66+/vvV+eOKJJ5LzHn/8cWy++eYYMmSIved4EjfccAMOOOAADBgwwP6fc845uPvuu5ttiz0xsrKyrNfE2muvjfXWW896XIiIiIiIiIjIatwQQRwngj0Sfvjhh2bzY7GY9Vxg40JhYaE1DLz11luYNWtWm9tizwc2PlAikbBbOZzeEIsXL8bs2bNxwgkn2LaciWM/pPaioJtuugnTpk3D119/bT0y2CuCvTHaw8EsKysrm00xJP5EzIiIiIiIiIh0bl6shrbffnvr6XDxxRfb0zQc7LnABoGbb77ZxofIzMy08SAikUib2zr88MNx0UUX2XgOdXV11vBw2GGH2WfxeDx5e0bL2yx4m0gqjg8xePBge80eEVVVVdZLgo0WzvyWONbFFVdc0WzepsjFZshb7jgRERERERERWR2slg0RxMd48hYM5xYK+vDDD7HvvvviyCOPTDYk/PLLLzbQZFs4sCUbNtgrgg0RHBCzuLjYPuN/3u7x22+/JXtJdJTTUMFttoW3bvAxn6nOy91gufYjIiIiIiIisjpZbRsi2OOBjQMcuNLBngfPP/88Jk+ejPz8fNx4441YsGBBuw0RxO2MHTvWek6wR0Uqzj/rrLOQk5ODPfbYw26n+PLLL+0RoqmNCOXl5bYvp/HjyiuvtEaS9vYdCARsSuWBawViQ0RERERERGT1sFqOEeHgQJIc18HBp1lssskmdtsGH9PJ2yX222+/ZW7n4IMPtkd/1tbW/mH5E088Effddx8eeugha/zYYYcd7DUHrkx13HHHoaSkxHpY8JYMDlb5+uuvw+tdbdt6RERERERERFa61eZbMr/8t9SvXz97ZKejoKAAL730UrvbmTRp0h/m5eXlNdtOa+NIcGpLamOIiIiIiIiIiHTRHhEiIiIiIiIisnpRQ4SIiIiIiIiIpI0aIkREREREREQkbdQQISIiIiIiIiJpo4YIEREREREREUkbNUSIiIiIiIiISNqoIUJEREREREREltv48ePhcrkw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6+fX4fytRzee67xuyw/M38wLjI8X3S9gj+p9kF+caXHhXDMxnAwbw89zRlHPbMuvxLTgMozX3KIMi5/ayrAtw/ksa5xHTj3GfMYwcbvOda1TD3x8UACHTPbjqb2LsdODMywP8ni5HZYZ5k3Gd7fumVZ3M354buK27XUp08Bvr4vzglhYXm/nFG6bZYb5qKzpOpLlqHfvHCxcXNt0DRq1uGM+YTlmvejUGcXdM7FwUY39Z7xZucn02fmM5Y7s+sDnseso5j1eD2fnh5JpO2RQgZUh1id+XjN43XYd/Pu8KtTXRCzcln+rwpb/GI/MH6GsgMUVz89OvcY8y3w/oHcOaiMxq8e4PS7Hepjp68SPU1+x3FfXNli5Y5mkn6eXWd7gMTKMuQUhq0OZ91hv9euZbfHBcJZWR6x+5zmB52bug/UB14tFE5YPeZ3ZtyTLrr8Z76w3eHzcvnMMDCfrDebdOb+UWv3MOsDJB853A+dYeR3ifLdguFj/MG54XcEyyDjitlm2mBbMG9lBr4WBYWM6sbxyH4xbXnOzzizgd5SldXatzfRgGeU2G8+ncauzv7xiJLqiiwOD2v38mvD0Fd72jjvuiI022gg333xzh9dRjwgRERERERGRLszTfoeItFNDhIiIiIiIiEgX5lvGrRl/xqRJk5Z7HTVEiIiIiIiIiKzBY0SkmxoiRERERERERNbgp2akmxoiRERERERERLowvxoiRERERERERCRdNFiliIiIiIiIiKSNekSIiIiIiIiISNqoR4SIiIiIiIiIpI16RIiIiIiIiIhI2qghQkRERERERETSxuPS4ztFREREREREJE3UI0JERERERERE0sbdyXpEuJdn4WOPPRYulwunnHLKHz477bTT7DMu4yy73377NVvmueeeQzAYxIQJE+z92LFjsdFGGzVbpry8HKeffjpKSkps2aFDh+I///lP8vP+/fvbflpOXKejfv31Vxx//PHo27cvAoEAevXqhV122QWPP/44otFos2Xfe+897LnnnigsLERGRgbWXXddnHfeeZg7d659PmnSpGbhCIVCWG+99XDPPfd0ODwiIiIiIiIifxWP393ulG7Lvcc+ffrgqaeeQl1dXXJefX09nnzySfti35b77rsPRxxxBG6//XZccMEFrS4TiUSw6667YubMmdZo8dNPP+Hee++1hgLHF198gfnz5yent99+2+YffPDBHQr/559/jk022QQ//vgj7rjjDnz33Xd49dVXrWHirrvuwvfff59c9u6778aIESPQo0cPPP/88/jhhx9smYqKCtxwww3NtsuwMjxc5h//+AdOPfVUvPvuux0Kk4iIiIiIiMhfxeVxtzulm3d5V+CX+N9++w0vvPCCNSwQX7OBYuDAga2uwx4Ql19+OZ544gkceOCBbW77gQceQFlZGSZPngyfz2fz+vXr12yZbt26NXt/7bXXYtCgQdhhhx2WGfZEImE9NYYMGYKPP/4Ybvf/InzjjTe24+EyNGfOHJx11lk23XTTTc16ZGy//fbWcyNV9+7dkZeXZ6+5zi233IIpU6ZYTwsRERERERGRVcWzCno9tGeFQnPcccfhwQcfbNaAwB4Frbnoootw1VVXWa+D9hoh6JVXXsFWW21lt1kUFxdj/fXXxzXXXINYLNZmD4rHHnvM9s3bIpZl2rRp1hPi/PPPb9YIkcrZzrPPPmvbb6v3htPo0BIbMt544w3Mnj0bw4cPX2aYRERERERERP5KHp+n3Wm1aIg46qij8NFHH9ktFL///rv1LjjyyCP/sNzrr7+O6667Di+//LLd4rAs7GnBWzLY8MBxIS699FK7BWLcuHGtLv/SSy9ZzwRnXIpl+fnnn+3/2muvnZy3aNEiZGVlJaeJEyfa/F9++QU5OTk2VkVH9O7d29b3+/3Ya6+9MGbMGOs5ISIiIiIiIrIquTyudqdOf2sGFRUV2Zfthx9+2HoA8DXntTRs2DAsWbLEbsvYfPPNkZ2d3e524/G43eLAgR49Hg823XRTzJs3D9dff71to6X7778fe+yxB3r27Llc4U/tPcFBKNlTgnbccUfrBUE8ro70snB8+OGHdnzhcNjGoTjjjDNQUFBgY0W0hctyShWPRuDxB5breERERERERETa4vGnv9dDe1b4RhHeDvHQQw9ZY0Rbt2VwkMn333/fBnHcfffdUVVV1e422fuA4zewEcLBp2YsWLAg2UDgYE+Md955ByeeeGKHw7zWWmvZ///7v/9LzuO+Bg8ebJPX+792GYaDg1Iy7B0xYMAA2wafmMFbV9hrpK2eHI7x48cjNze32TTvg6c6fDwiIiIiIiIiy+Jyu9qdVpuGCDYssHGA08iRI9tcjk/SYGMEb4HYbbfdUFlZ2eay22yzjT1akz0jUm+nYAMFb3lIxTEq2HuCvTE6igNSrrPOOvjXv/7VbB+tOeigg2yfzqNGW2o5WGVLbOBIfbJIa0aPHm2NHalTz+0P68CRiIiIiIiIiHS8R0R702pxa4bzRZsDPzqvlzV+wqRJk7DTTjtZY8Sbb75pv/63xNsYbrvtNpx99tk488wzbZwGDlbJp1CkYiMCGyKOOeaYZr0YloW3WnA9PiKUjR5sCGCPi4aGBnzwwQdYvHhx8lj4FBA+LYO3WLDx5Oijj7YnZvBpGo888oiNB5H6CE82tPAxps6tGY8++qg1ZrQnEAjYlMrtbd7gIiIiIiIiItKVbs1Y4YYI4mCOHeXcpsHGCDYEvPXWW39Yhl/+Of+cc86x8SW4DhslLrzwwmbL8ZaMWbNmtXlLSHu23HJLfPXVV9bAwadz8LaPzMxMbLjhhtbwkLrN0047zW7RYA+K/fff33o4sDFi7733xrnnnttsu84AmGwY4XH84x//wNixY5c7fCIiIiIiIiIr06oYkHKlNURwTIj28CkW7S3LWyxSx2fgF/WWX9b5+M5PP/203f2wVwUHk1xRbFxY1rE4+LSP9p74wQEu/0xYRERERERERP5Kq+IRnX9ZjwgRERERERER6dzcq3OPiM6Oj9Dk4zzbUl1dndbwiIiIiIiIiKxq7q40RkRns9lmm2HatGmrOhgiIiIiIiIinYZbPSL+OqFQCIMHD/4L9yAiIiIiIiKyevFojAgRERERERERSRfdmiEiIiIiIiIiaeNyu9GZdKkxIkRERERERESkOY+/c33171yhEREREREREZGVyuVRjwgRERERERERSRO3z4fORD0iRERERERERLowj69zffXvXKERERERERERkZVKt2aIiIiIiIiISNq41SNCRERERERERNJFPSJEREREREREZI19fKcrkUgkVnUg5H8iHz+DLV7Lgsfjhj/kw/unb4gNx05GRpYfT5+1DY576Et4vG40hGOoWFKLULbflo02xOD1eRCua7DPCkuyUFsdQTDDh2hDHPU1EVvPF/CirjqMWDRhy9TXNMDldtm8op459t7jdWHm9/PQo3+3xm1k+hCPxlFTGbbXX5yzPra4+XvEYwl8MmZnbH/t+whl+VFZWmf7KRmYj6qyOgtP+eIa5HXLRFZeEAtmliO7IIS66giKemajdEEVQlkBC3sinmg6Zq+F/9IDN8CF934Ot9dtx84wcv+2HOflBFBbGYbX58Z5B6yP3QcXYNcJHyC/OAtLF1ZbXHKfEw/fBEfe/rG95n5j0TgCIZ9tw+I7HLVjZnj4uS/gsePg8cRicbxy9jY4/KGvUFlai5zCDNvnm+dug53Gv9+4fl0U9bUR2y+Pl+s0hKN2LJFwzF4zzsJ1UYsHxouTZtXl9ba/jOwA3B4XXj1tS+x1+6eorqizdHK7XBY+FlFuu64qgpyiDIsvpgfTleFkmvN1IOS19Zz9xxMJiy9inHJbmTkBCwvXz8gN2GdclulkcVQVsfBxf9wPJ+YVxrNTVSTisPC63S5LPye83A6Pj8fL9OI8bpfh4j5z8kMWBoaVcgszEK5vQG1F2NLdSROGmetz35k5QctT8XjC9s+wMOxev8fCwDxIfF21tA7deufa5+/9czucm7GOfTbtqvsw5r7zMPb4f9k2nXTkPh6cfiv2zznB5vcZUoTqinpsOvZkfD/hQTtOlxtYurAGL9Y8hMN7nIxbjtkUZ97/haUl8++XZ66FD2rycM59X1j8vXv2Vtjssnfh9bvhcrkszK9fsAP2u3UyKpc2lgmmAfNydXkdinrlIBqJwR9oPDHU17I8NsbxA6dvjbOfmGr5mWHl5A948OjpW+PgCe9ju5vObLXq9LtdyPW5kelxI8vbOPF9KNOPQI4f3qAX3pAX/ky//fcFvXD7PTaAkTczZK3l3iDLnBtuvxe+zKC99vh99hm79fE/57ncHsDL+fzvh8vrY2LYZ/ae8y2B3I3zuSzXscnd+HnT/MbM6LNITzASOJHLZcsm5zXNT7i9jduxZZo+9zSdYJuWs3nJ967GdZrmxeFqLCMAYk3lhNmJL2NOXm96z3SMJ983rtM4n9th3mz+ntuLxRuXdbbVEEvY+wb7rPG/fd70OhqLoz4WR21DDGXVETz8/HeWV1kuWGexvmB55/sP/l6Idf81AwUl2Zbf3zpvW+wy4QPLxyx3LGvMY41lP2p5h/Uc82V+9ywsXVRt5ZXLsnzyM5ZBlgvOY73E/SyZW2X5df5vC9BnnV6oLKuzPMhlmC9Z13M/Tn3BfbGss2yz7HfrnYOMTL8dIz+f+2sZMnMDCGb4rZ5g2fpfMrvsOFkPMyysW/nfKRs83/Xon4eK0lqrp3hMrINyCkNW9rlf5zzSvW+ulaVIU91IPCaGlecTnoe4LI+bx8I63P7XRJBTELL5PPc01vENVq8zfCzjLJs8X1p6NNWVPB6GITs/ZMfN7bMudM6xTGcuz30HM/1WD/L4mJ4MB4+zbH611cnOebN77xwLE9dj3PG4GA4uz/+sexfMXIqcggyrn5lXnHhgOJkWxLDxnM54s/QO8pogZuHzBT32nnHJ8wjXc+LLyTdWT9c1WHzyWJzrAZ7zmFYMA8NCzEsMe++1Cu3aweq0pmsKZ78MH/MW0905b3D7nOccY2N6eS19ec5mHBT1yrZtcVnGnYWjqdxyOcYbl+MxMKxMb4a/bH6VnRecNOZ5lZ/ndcuw/M3tcJ+MJ4ad+Z3HY9dJsbiFiXnB8vuAfLs+4PmGx850Tl678RxXyPSvtW0y/qKRuB0X08fZh3NeZXiZ32sq65vKdsDyH8sH13M458XGayOew4MoW1htx8H98DqR8284elOcff/ntizXd64BWVbeynsN+8b2t3Qr7pWDxQur8Xr+m9ivbm/LF8yX/O/E+ydjd8Z24ybhmbO3xcE3f2h539IiFrf9M8wN9TGLa57XnGs0HhN9dGwJNrp5hsUPj9XCH/Baei2eU2Hp8d9zt4G3ahG2nvh/dg0wdf8a7PZlCe44bGMccdtHdq5nvuE2mQd5LNwPyw7DwnzE8HDdvO6Zlk+YN1i+mGass51rHqYrr2/5n8sxj7Mea6wTPVZu504vRVZeyJbnsbCcMV6Z9kxbXnPyfWN5iFr+YNi4PuOHZY9Ypp00dsqfcx3G9OJxLJlbaed+Xp/zGobpT8wnzjUxw+CE3a69M/533crtMW6dY3HKurN/bpN5pLhvrpVzxntBcZalFddlvmNdzvAwf3B/znW6c/3MY2MYiPFaWNJ4jcxjZbowzE75YB50rse5HutFxhHrTm7XOUcsmVeZPC5ek/KYuJ3UspxblIHpU2age/8ejefkWNzyJK+TmPd4DmusU9x2/Iwfrp8a13zPZZww8nhZ3/Bz7p/lwMm7XK6xXm88RzHcBcWNYf7yipHoihb96+x2P+9+/i1Ip87VLCIiIiIiIiIiKxV/YOpMOldoRERERERERGSl8viaeqB2EmqIEBEREREREenCXJ6m+yE7CTVEiIiIiIiIiHRhbj2+U0RERERERETSRT0iRERERERERCRt1CNCRERERERERNLG5fWjM9EYESIiIiIiIiJdmVuDVYqIiIiIiIhImrh86hEhIiIiIiIiIuni9qAz0a0ZIiIiIiIiIl2Yy+tDZ6KGCBEREREREZGuzN25ekR0rhEr0mzBggU4++yzMXjwYASDQRQXF2PbbbfFXXfdhdra2uRyU6dOxcEHH2yfc7khQ4bgpJNOws8//2yfz5w5Ey6XKzn5/X7b5tVXX41EIrEKj1BERERERETWdC6vr90p3dbYHhG//fYbttlmG+Tl5eGaa67BBhtsgGg0ao0LDzzwAHr27Im//e1vePXVV3HggQdi5MiRePzxxzFo0CAsWrQIzz77LC677DI8/fTTyW2+8847WG+99RAOh/HRRx/hxBNPRElJCU444YRVeqwiIiIiIiKy5nJpsMrO4bTTToPX68WXX36JzMzM5Hw2SLDhgT0Z2CviuOOOw5577okXX3wxucyAAQMwfPhwlJeXN9tmYWEhevToYa/79etnDRpTpkxRQ4SIiIiIiIh0icd3jh8/Hi+88AL+7//+D6FQCFtvvTWuu+46rL322h0PDtZApaWleOutt3D66ac3a4RIxVss3nzzTSxZsgQXXHBBq8uwN0Vb2MDBRgg2WIiIiIiIiIisKi6vv91pebz//vv2XfrTTz/F22+/bXcW7LbbbqipqenwNtbIWzN+/fVX6/HQssWmqKgI9fX19poRyx4OtM4663Rou2wJcrvdiEQiaGhowMknn4yjjz76LzgCERERERERkfT3iHjjjTeavX/wwQfRvXt3fPXVV9h+++07tI01siEitddDqs8//xzxeBxHHHGEjfOwvANNcryIoUOHWiPEt99+i7POOgv5+fm49tprW12e++DULEyRhhU4EhEREREREZHWLW+vh+VRUVFh/wsKCjq8zhp5awafaMFGCN7TkmrgwIH2Ge9zIT4dg1ou15Y+ffrY+myMOOSQQzBq1CjccMMNyV4Wrd1bk5ub22ya8OhLf/r4RERERERERBwun6/diT+QV1ZWNpta/mjeGv54f+6559rTJ9dff3101BrZEMFbLnbddVfcfvvt7d7HwvtceLvGhAkTWv285WCVLXk8HrtfhrdqtGb06NHWepQ6XXDUfst5NCIiIiIiIiLtcHvanVr7kZzzluWMM87AN998gyeffBLLY429NWPixIn2+M7NNtsMY8eOxbBhw2x8hy+++MJ6QGy66aY2kOV9992Hgw8+2B7lyVst2OOBA1g+88wzmDVrFp566qlmg2AuWLDAGh94a8Ytt9yCnXbaCTk5Oa2GIRAI2JQq4k//M1xFRERERESk63J52/+eyR/J2bMhVcvvqi2deeaZeOWVV/DBBx+gd+/eyxWeNbYhYtCgQZg6dSquueYai/Q5c+ZYRK+77ro4//zz7fGetO+++2Ly5MnWGnT44YdbFxXegrHzzjvj6quvbrbNESNGJHtClJSU2GM/x40bt0qOT0RERERERMSw50M7WvuRvL3bMdgI8eKLL2LSpEkYMGAAltca2xBBbCy47bbbbGoPe008//zzbX7ev3//5R7YUkRERERERCQt3Cvvqz+fMPnEE0/g5ZdfRnZ2tt0VQLydwxlvcZnBWWmhEREREREREZFOJ+FytzstjzvvvNPGN9xxxx3tx31n4lMkO2qN7hEhIiIiIiIisqbfmrE8VsbdAGqIEBEREREREenCEp7O9dW/c4VGRERERERERFau5bz94q+mhggRERERERGRrszdub76d67QiIiIiIiIiMhKtbwDUv7V1BAhIiIiIiIi0pW5V95glSuDGiJEREREREREurCEbs0QERERERERkbRx69YMEREREREREUkX9YgQERERERERkbTRYJUiIiIiIiIiki4aI0JERERERERE0sflQmeip2aIiIiIiIiIdGGJTjZGhCuRSCRWdSDkfw596HM8PjIfvc/4D7zBLNSWzkUiHkNGYS/895bDsMs5zyKYm49vbtgTvfefAG8oC7FwHXyhLMTjMbjdHhx65M549c2fEampQl35AgSyCtB/w8H4/dsZiEcj+O6+Y7DusfciFo3gtNP2wcW+z9H7loUI5ffAN7cfiHVPeBgz/pGJys0OwoYnPYy6pQuS+1k0blN812Mb7HzCrXD7/HC5PagtnYfSS4divGt7XD6kFoUnvYBDTj4IP8xYihdPHY5NTn/GjuHww7bEE099iqr505HZrQ/cXr9t2+XxYMNdt8H370/B3Bt2wMmfJpAb8uH+W57A43ecjbUKQ9jisGsx5ooTUJjhx4XXvIDMbr3x49XD0fcfz2ObvbbExbuujUPGvYuKub9g4rijMbRbJnY761GLU+67vmIxPP4QgrndcPfl+yLodePv5z+EhpoKXHHF8bju1jfx73/9HbufcS+COd3wxBX74IBzHsBBR+2GEWt3Qzgax9ljn4QvmIXy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1slaItQQISIiIiIiItKFxTtXO4QaIkRERERERES6slgna4lQjwgRERERERGRLizWudoh1BAhIiIiIiIi0pUlNEaEiIiIiIiIiKSLekSIiIiIiIiISNp0siEidGuGiIiIiIiISFcW060ZIiIiIiIiIpIunawdQj0iRERERERERLqyWCdridDjO0VERERERES6sFgcnYoaIkRERERERES6sDg6V48Idzp2cuyxx8LlcuGUU075w2ennXaafcZlVkczZ8608DuT3+/H4MGDcfXVV3e6Z7WKiIiIiIjImtkjItbO1CUbIqhPnz546qmnUFdXl5xXX1+PJ598En379kVnw0aEaDTa4eXfeecdzJ8/H7/88guuuOIKjBs3Dg888MBfGkYRERERERGRZeFv5O1NXbYhYpNNNrEGhxdeeCE5j6/ZQLHxxhs3awCYMGECBg4ciFAohA033BDPPfdc8vNJkyZZz4M333zT1uMyO++8MxYtWoTXX38dQ4cORU5ODv7+97+jtrY2uV44HMZZZ52F7t27IxgMYtttt8UXX3zR6nY322wzBAIBPProo3C73fjyyy+bHcttt92Gfv36NevxUFhYiB49etj8I444AltvvTWmTJnyl8SliIiIiIiIyPIMVtne1GUbIui4447Dgw8+mHzPHgPHH398s2UuvfRSW+bOO+/E999/j3POOQdHHnkk3n///WbLjR07FrfffjsmT56M2bNn45BDDsHNN9+MJ554Aq+99hrefvttazBwXHDBBXj++efx8MMPWwMBb58YOXIkysrKmm2Xy40fPx4//vgj/va3v2HEiBHNwkx879xu0ho2XHAfw4cP/1PxJSIiIiIiIvJnNcQS7U5duiHiqKOOwkcffWTjKvz+++/4+OOPrZHBUVNTgxtvvNEaKNhIwF4R/MLPZe6+++5m2+IYDNtss431ijjhhBOsoYKNF3y/3Xbb4aCDDsJ7772X3C4/u/7667HHHntg3XXXxb333mu9Ke6///5m273yyiux6667YtCgQdbL4cQTT7TbR9ijgr7++mtMmzbNGlVSsQdEVlaWjRGx+eabW8PI0Ucf/RfGpoiIiIiIiMiyxROJdqcu/dSMoqIi7LXXXtYrgbc18DXnOX744QcbN4INAakikUiz2zdo2LBhydfFxcXIyMiwhovUeZ9//rm9nj59OhoaGqzhwuHz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KCjOsnJNjEfmEdbTXMc5n/IcynTldQivcZm2rJc4/+OLdkZXdO7L37X7+Y37rr/c25w4cSKuv/56zJ8/H+uttx5uvvlmbLfddh1at/EsIiIiIiIiIiJdUiQab3daXk8//TRGjRqFSy65BFOnTrUGiD322AOzZs3q0PpqiBARERERERHpwmKJRLvT8rrxxhtxwgkn4MQTT8TQoUOtN0SfPn1w5513dmh9NUSIiIiIiIiIdGGRldgjIhKJ4KuvvsJuu+3WbD7fT548uUPbaLw5UURERERERES6pEi0cZyVtoTDYZtSBQIBm1pasmQJYrEYiouLm83n+wULFnQoPOoRISIiIiIiItKFxeKJdqfx48cjNze32cR57eHgwqk4eHzLeW1RjwgRERERERGRLiy8jNsvRo8ejXPPPbfZvNZ6Q1BRURE8Hs8fej8sWrToD70k2qIeESIiIiIiIiJrcI+IQCCAnJycZlNbDRF+vx+bbrop3n777Wbz+X7rrbfuUHjUI0JERERERESkC4uswCM628PeE0cddRQ222wzbLXVVrjnnnvs0Z2nnHJKh9ZXQ4SIiIiIiIhIFxZZyQ0Rhx56KEpLS3HllVdi/vz5WH/99fGf//wH/fr169D6aogQERERERER6cIS8cRK3+Zpp51m04pQQ4SIiIiIiIhIFxaLrdweEX+WGiJEREREREREurDEX9Aj4s9YY56aceyxx2K//fZLPlbkH//4B/r27Wsjgfbo0QMjR47EJ5980mydqVOn2r0vJSUlthzvd9l7773x73//256RSjNnzrRnpToTRxAdPHgwrr766uQyIiIiIiIiIqtKLJpod0q3NbJHxIEHHoiGhgY8/PDDGDhwIBYuXIh3330XZWVlyWVefvllHHLIIRgxYoQtN2jQIBuM45tvvsGll16K7bbbDnl5ecnl33nnHay33noIh8P46KOPcOKJJ1oDxgknnLCKjlJEREREREQEne5H8jWuIaK8vNwaCiZNmoQddtjB5rGnwxZbbJFcpqamxhoQ9tprL7zwwgvJ+WyM4HJsZGiZkIWFhdazwtneAw88gClTpqghQkRERERERFap2Ep+asaftcbcmuHIysqy6aWXXrLeC6156623rPfDBRdc0OZ2eBtGW7788ktrhBg+fPhKCbOIiIiIiIjInxmssr0p3da4hgiv14uHHnrIbrfgrRXbbLMNLr74YrvlwvHzzz/b/7XXXjs574svvkg2YnB69dVXm2136623tvkcI2LzzTe32zqOPvroNB6ZiIiIiIiISOuDVbY3pdsa1xDhjBExb948vPLKKzZIJW/T2GSTTayBoi3Dhg3DtGnTbOKtG9FotNnnTz/9tH329ddf22uOMXHRRRe1Gw72yKisrGw2xRoiK+04RURERERERGLReLtTuq2RDREUDAax66674vLLL8fkyZPtqRpjxoyxz9Zaay37/9NPPyWX51Mz+DQMTq3p06ePfTZ06FDrDTFq1CjccMMNqK+vbzMM48ePR25ubrPptzcfXenHKiIiIiIiImuuRCLR7pRua2xDREvrrruu9XSg3XbbDQUFBbjuuutWeHsej8d6TUQibfdwGD16NCoqKppNA0cetcL7FBEREREREWlJj+9cxTgI5cEHH4zjjz/ebrfIzs62wSUnTJiAfffd15bhWA/33XcfDj30UHtyxllnnWW9JKqrq/HGG28kGxpabnfBggXW+PDtt9/illtuwU477YScnJw2w8JeFpxSeXx+AA1/ybGLiIiIiIjImifeyZ6ascY9vpONDHyaxU033YTp06ejoaHBbqs46aSTbNBKx/7772+3bLBXBAedLCsrs1snNttsMzz11FPYe++9m213xIgRyQaKkpIS7Lnnnhg3blzaj09EREREREQkVXwV3H7RnjWmISJ1IEqOzcBpWdjo8Oyzz7a7TP/+/VfJPTUiIiIiIiIiHaEeESIiIiIiIiKSNvFV8IjO9qwxPSJERERERERE1kTxmMaIEBEREREREZE0UY8IEREREREREUmbeDSCzkS3ZoiIiIiIiIh0YfEGNUSIiIiIiIiISJok4jF0JuoRISIiIiIiItKFxXVrhoiIiIiIiIiki3pEiIiIiIiIiEjaxNQjQkRERERERETSRbdmiIiIiIiIiEjaJGIarFJERERERERE0kQ9IkREREREREQkbTRYpYiIiIiIiIikTTzagM7Eu6oDIM1FonHkFWWgbHENcnIDKK9tQO+iDPw2pxK9++UhFk8gL8Nnyy2cU4GiwhBKF1TZukU9cxDye+zzljJzAujTLdNe10Vi8Lhdtg2324V4PIHaSMzeRxti6NUz2/ZTVduAjEw/KsvrEQh50bNPLpZW1KMoP4S5ZXU2j9vhNrg+X3N5ht3jzkBN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/utdELJzB+sX1pPO9S3j5fupSzBs056Yy2vuzD9+j+oqEnGNESEiIiIiIiIiaRJriKAzUY8IERERERERkS4sHlVDhIiIiIiIiIikiW7NEBEREREREZG0CX91LzqTxhFSRERERERERETSQA0RIiIiIiIiIpI2aogQERERERERkbRRQ4SIiIiIiIiIpI0aIkREREREREQkbdQQISIiIiIiIiJpo4YIEREREREREUkbNUSIiIiIiIiISNqoIUJERERERERE0maNa4g49thj4XK5klNhYSF23313fPPNNyttH/3798fNN9+80rYnIiIiIiIi0lWscQ0RxIaH+fPn2/Tuu+/C6/Vi7733XtXBEhEREREREeny1siGiEAggB49eti00UYb4cILL8Ts2bOxePFi+5zvhwwZgoyMDAwcOBCXXXYZGhoamm3jlVdewWabbYZgMIiioiIccMABNn/HHXfE77//jnPOOSfZ60JERERERERE1uCGiFTV1dV4/PHHMXjwYLtNg7Kzs/HQQw/hhx9+wC233IJ7770XN910U3Kd1157zRoe9tprL0ydOtV6VbBRgl544QX07t0bV155ZbLXhYiIiIiIiIg08mIN9OqrryIrK8te19TUoKSkxOa53Y3tMpdeemmz8R7OO+88PP3007jgggts3rhx43DYYYfhiiuuSC634YYb2v+CggJ4PB5rzGCPCxERERERERFZwxsidtppJ9x55532uqysDBMnTsQee+yBzz//HP369cNzzz1ng03++uuv1mMiGo0iJycnuf60adNw0kkn/elwhMNhm1LFGyLwBAJ/etsiIiIiIiIindEaeWtGZmam3YrBaYsttsD9999vPSN4C8ann35qvR3YMMFeErz14pJLLkEkEkmuHwqFVko4xo8fj9zc3GbTzLcfWynbFhEREREREemM1siGiJY4oCRvy6irq8PHH39svSLY+MBxH9Zaay0bfDLVsGHDbFyItvj9fsRisWXud/To0aioqGg29d/1yJVyTCIiIiIiIiKd0Rp5awZvh1iwYIG9Xrp0KW6//Xa7BWOfffaxxoBZs2bhqaeewuabb24DU7744ovN1h8zZgx22WUXDBo0yHpP8NaN119/PTmGBMeV+OCDD+wzPqGDT9VoDT/jlMrt8/9lxy0iIiIiIiKyqq2RPSLeeOMNG6CS0/Dhw/HFF1/g2WeftUdv7rvvvvbozTPOOMMe7Tl58mR7fGcqLsfl+QhPLrPzzjvjs88+S37OJ2bMnDnTGiq6deu2Co5QREREREREpHNa43pE8LGcnNozYcIEm1KNGjWq2Xs+vpNTa7bcckt8/fXXKyG0IiIiIiIiIl3LGtkjQkRERERERERWDTVEiIiIiIiIiEjaqCFCRERERERERNJGDREiIiIiIiIikjZqiBARERERERGRtFFDhIiIiIiIiIikjRoiRERERERERCRt1BAhIiIiIiIiImmjhggRERERERERSRs1RIiIiIiIiIhI2qghQkRERERERETSRg0RIiIiIiIiIpI2aogQERERERERkbRRQ4SIiIiIiIiIpI0rkUgk0rc7EREREREREVmTqUeEiIiIiIiIiKSNGiJEREREREREJG3UECEiIiIiIiIiaaOGCBERERERERFJGzVEiIiIiIiIiEjaqCFCRETadOyxx2K//fZLvt9xxx0xatSoPxVjRx11FK655pq/JNb79++Pm2++GavC2LFjsdFGGyXfn3/++TjrrLNWaFsulwszZ87s8PJclutMmzZthff30ksvdXj5hx56CHl5eVjTrKrjbpm3VsSkSZMsncvLy9tcZk1NVxERST81RIiISNp88803eO2113DmmWd2+Vi/4IIL8OCDD2LGjBno7ObPn4899tijw8sfeuih+Pnnn1fqF+XS0lLsvvvu6NmzJwKBAPr06YMzzjgDlZWVzb5M77vvvigpKUFmZqbt8/HHH2+2nRdeeAG77rorunXrhpycHGy11VZ48803V6tGrdXZxIkTMWDAAASDQWy66ab48MMPl7nO+++/b8tynYEDB+Kuu+76QwMJG1FaTvX19X/hkYiIyF9JDREiIpI2t99+Ow4++GBkZ2ev8DZisRji8Tj+Cg0NDSttW927d8duu+32hy9VnVGPHj3sy39HhUIhO76Vye12WyPDK6+8Yo0c/PL5zjvv4JRTTkkuM3nyZAwbNgzPP/+8NWodf/zxOProo/Hvf/87ucwHH3xgDRH/+c9/8NVXX2GnnXbCPvvsg6lTp2JViEQiWFM8/fTT1mPqkksusfjebrvtrIFr1qxZba7Dhro999zTluU6F198sfUkYhqnYqMSG8xSJzZciIjI6kkNESIiXRi/sF933XUYPHiwfdHs27cvxo0bl/x87ty59ut2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5/Pnz08cffTRiaKiIhvYcuDAgYmTTjrJBllc1mCVHBiR7/Pz823guGHDhiWefvrpdsNz1113Jbbccstm88rKyhJHHXWUDZLH7YwcObLZIHQtB0ZMDftee+1l4eZxPfLII38YYJCD+5155pk2aB+Pv0+fPokjjjgiMWvWrHYHWVzWesQB9hhvWVlZFk8XXHDBH7bFQfqefPLJxPJa0cEqp06dmpx3ww03JLKzs/8weGBHB6tM3RYHOOQ8DnjYWppwYE8OIJiXl2fL8fPl9d///tcGAeV2g8GgDWJ44YUXJgdXJMYzt99yYj508HVry3BdhzNwY3txzAESmaeZv5zLpdbyIuMt9XKqZZnpSFlbsGBBYr/99kuUlJTY4JvMx5dffrmV37byKfM5l3NwUE/mWWf7HLD0888//8Mxp8YnB9Hs3bu3lTsODPqvf/2r1bK2PDh4J8PF49hkk00S77//frPPGT+p6UUcpHPjjTe2dfr375+48847m30+atQoK+P8vFu3bonddtstMXny5D8VThERWbVc/LOqG0NERGTNwMH52MPgqaeesl9MuzLeGsFfqPk4RvbYWB68r589DJbnlhLpuIceesgevcpeF211/xcREZG/jvsv3LaIiMgfbhdhl+wlS5Z0+ZipqamxAQiXtxFC/nq8BeGaa65RI4SIiMgqoh4RIiIinczK7BHB8Sv+8Y9/tPoZH13KsS1ERERE0kk/04iIiHQyzhNIVgYOgDh8+PBWP9NtCSIiIrIqqEeEiIiIiIiIiKSNxogQERERERERkbRRQ4SIiIiIiIiIpI0aIkREREREREQkbdQQISIiIiIiIiJpo4YIEREREREREUkbNUSIiIiIiIiISNqoIUJERERERERE0kYNESIiIiIiIiKCdPl/e56ELxLeK2IAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 1400x300 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "obs 中未检测到 x/y，跳过空间图\n"
     ]
    }
   ],
   "source": [
    "# 热图：列按归类后的顺序\n",
    "df_plot = df_heatmap_scaled.loc[:, ordered_cells]\n",
    "with rc_context({\"figure.figsize\": (14, 3)}):\n",
    "    fig, ax = plt.subplots()\n",
    "    sns.heatmap(df_plot, ax=ax, cmap=\"RdBu_r\", cbar_kws={\"shrink\": 0.7},\n",
    "                xticklabels=False, yticklabels=True)\n",
    "    ax.set_xlabel(f\"cells (ordered)  |  k_init={k_init}, threshold={threshold}\")\n",
    "    plt.show()\n",
    "\n",
    "# 空间分布（若 obs 含 x, y）\n",
    "if {\"x\", \"y\"}.issubset(adata.obs.columns):\n",
    "    df = adata.obs[[\"x\", \"y\", \"hier_cluster\"]].copy()\n",
    "    vals = df[\"hier_cluster\"].astype(object).values          # 转 object，避开 Categorical.map 的数组 categories 报错\n",
    "    cats = [c for c in list(marker_dict) + [other_label] if c in set(vals)]\n",
    "    colors = plt.get_cmap(\"tab20\")(np.linspace(0, 1, max(len(cats), 1)))\n",
    "    cmap_map = dict(zip(cats, colors))\n",
    "    gray = np.array([0.8, 0.8, 0.8, 1.0])\n",
    "    cvec = np.array([cmap_map.get(v, gray) for v in vals])    # NaN / 未知 -> 灰\n",
    "    fig, ax = plt.subplots(figsize=(7, 7))\n",
    "    ax.scatter(df[\"x\"], df[\"y\"], s=max(1, 1.2e5 / len(df) / 10),\n",
    "               c=cvec, edgecolor=\"none\")\n",
    "    ax.invert_yaxis(); ax.set_aspect(1); ax.axis(\"off\")\n",
    "    for c in cats:\n",
    "        ax.scatter([], [], color=cmap_map[c], label=c)\n",
    "    ax.legend(bbox_to_anchor=(1, 1), loc=\"upper left\", framealpha=0)\n",
    "    plt.show()\n",
    "else:\n",
    "    print(\"obs 中未检测到 x/y，跳过空间图\")\n",
    "\n",
    "# 保存标签\n",
    "adata.obs[[\"hier_cluster\"]].to_csv(\"hier_cluster_labels.csv\")\n",
    "adata.write(\"hier_clustered.h5ad\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "71e329b6",
   "metadata": {},
   "source": [
    "## 9. dotplot 质控\n",
    "\n",
    "用传入的 `qc_genes` 验证 marker 富集到对应簇。\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "03430281",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABPMAAAFlCAYAAACOZ61XAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAo/JJREFUeJzt3Qd4FFUXBuATEjqE3nvvvUsREJBeRERAmiggoKCCgv4CioKNJqiAikjv0nvvvffee08ogSTzP9+FWTfLpsHMZGfzvTz7kOxu9s7Ozk4599xzfTRN04SIiIiIiIiIiIg8XpyYXgAiIiIiIiIiIiKKGgbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCQbziIiIiIiIiIiIbILBPCIiIiIiIiIiIptgMI+IiIiIiIiIiMgmGMwjIiIiIiIiIiKyCb+YXgBvFBoaKpcuXZKkSZOKj49PTC8OERERERERkW1omiYBAQGSMWNGiROHOUhErhjMMwECeVmyZDHjpYmIiIiIiIhihfPnz0vmzJljejGIPA6DeSZARp6+4/H39zejCSIiIiIiIiKvdO/ePZUgo19bE1FYDOaZQB9ai0Aeg3lEREREREREL35tTURhcfA5ERERERERERGRTTCYR0REREREREREZBMM5hEREREREREREdkEg3lEREREREREREQ2wWAeERERERERERGRTTCYR0REREREREREZBMM5hEREREREREREdkEg3lEREREREREREQ2wWAeERERERERERGRTTCYR0REREREREREZBMM5hEREREREREREdkEg3lEREREREREREQ24RfTC0DkzUJDQ+XOnTvy8OFDSZ48uSROnDimF4mIiIiIiIiIbIzBPCITXL9+Xab88qscXLxMAo6dFC3oifj4J5HM5UtL+WZNpFGrluLr68t1T0RERERERETR4qNpmha9P6HI3Lt3T5IlSyZ3794Vf39/rrAowLp69OiRpEqVSvz87B1jXjxzlkz95AtJcP6S+IjPc48/Fk0SVK0gfSeNk/QZM8bIMhIREREREXkqXlMTRYw18yhGzRo3Xj55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kwxZuVgGTBwn6ZxGWlD0lHqlggxZOl9+3bJOPh82WGV/mM2qoNabHdrLqL3b5Lczh2TkmuVSsFgxQ99Dicb15cmzDNGIPEwYX2q1sy4jnYiMh+GXGCqPYJrzz6jPj9lOMSQViUIYEYj7jIDhnMhSw/8oETBr1ixVKqxy5cqmtotEJgzpxVwACK4NHTpUxU+Q/GRmu4DZY9Fh/corYbNXzW53//796v0igQuz2aKsWuHChU1v10jG5J17kG+//VaN78bwWmyIo0ePVsODkGWGoBw2EmTqYRw6Pix8KRFtDQ8CgcuWLXNMkUzGw3j1Ws1aeuWqLVu5mghuRERENocM25QN2sjuJROlhL/7DLITAY/lVtk68loR44IoRNEN/JqVTdn+kx5ydNsOuTNzgfiGUz8vyM9XSn3aVV6pWtWUZSAia7z//vuqDj+sX79e2rRpowJr9erVU5NDYHIKTHqI57Vv396wToO//vpLunbtqsoz5c6dW2WNIbaBm1ntIliJ0mGY5RUjahDYQpANIw7NfL+A4GXLli2f6/Qxu92xY8fK33//rdYzSq6NGzfOknaN5KOZXUXbItmzZ5epU6eqiDIKGKJuHbIJEE3+6aefHDOSoMBw//79Zdq0aWoYbtq0aVWk+8svv1SFENesWSPVq1dXw3UB/9evX19++eWXKI+VxrhqRJdRP8+sIbdEREREMWH/1k1yasm/ku3OBSmS4mlNsFP3HsmhBKkl/at1pFzNOvxgyGshW2ZIz8/l0OwFEu/8JYnzLKiHjD2fgnmkUoc20u6THjG9mES2x2tqolgSzPMk3PEQERGRtzt17Kgc27UdsztJ5vwFpXCJUjG9SESWwdCs6aPGyO0LlySObxzJXLCANGnb2vS6h0SxBa+piSLGYJ4JuOMhIiIiIiIi4jU1kRm8egIMIiIiIiIiIiIib8JgHhERERERERERkU0wmEdERERERERERGQTDOYRERERERERERHZBIN5RERERERERERENsFgHhERERERERERkU0wmEdERERERERERGQTDOYRERERERERERHZBIN5RERERERERERENuEX0wtARERERPbz5MkTuXz5soSEhEiGDBkkQYIEMb1IRERERLECg3lEREREFGWXzp+T7f9OFb/TByVryH01zGOtT3x5lDW/FKzTRPIULMy1SURERGQiH03TNDMb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W2hoqKxYsUKVQsPQW/I8HhPMQzbc5MmTVQYdMvDCGypbqVIlleqJDD2kbGLjQmQZs+BiemTAazhHoiNSv359lQmI1wkJCZGHDx/KkiVL1HBZIiIiIiIiIqLYAHEQlB5DmbEuXbrI6NGjJV++fDG9WOSJw2yRbYcgHFIsCxUqpLLswsuEw/14HDXsENRDFh2y8UaNGiXNmzd3PK9v375qllsM3UVgLiKYsALjszGeGymjcePGlYoVKzomziAiIiIiIiIi8naIhZw4ccL0dtwN2aXo8dE0TYvm31Ak7t27p4KEiGr7+/tzfRERERERERFFEa+piWwyzJaIiIiIiIiIiIhsFsy7dOmSJEmS5Lkbx2kTEREREREREVFsF+M181xlzJhRAgMDY3oxiIiIiIiIiMjLPXr0SE2uSWSGePHiSYIECbw/mEdEREREREREZEUgL0f27HLl6lWubDJF+vTp5fTp04YH9BjMIyIiIiIiIqJYBxl5COSdP7pf/JMkEcH8oKGhIoL/NRHt2c9aqGj4GY+r/0OfPu78PP2x0JCnr6E9/V/NORoS/Ox+3DSn5zx9vobf9b8NCflvOdTPz57r/FhIqMtrPfv7EP118Zxnz1eP6c979rqO1372vGfvWVM/a88/5vj7p+9bC8Ht6f34X/2s/h6v+/R3terUz1gvmmhYF2q5//v56arUJFTTJFT/PwQ/4080CcF9+qoNefa4/tzQZ4+FPnsePlD8jaAJDZ+MoOlQLBfeiuBvn37u6udnz3P+/+nfaI6/w//Bqk38//T1gp89FvzsMfzN08f05+l/L/JAQmXSlStqO2Mwj4iIiIiIiIjIIP5Jk6rb04BaqNsg3fPBPPfP+y/o9TSQFn4w778AnPtgnlMw7rlgnstrhTgH85ye4/q7HshzF8xTgblnP4fEefZYHKfgYBynYF7o88E8/BwnVCROqPpfBfOe/fz0eT6i+fg8C+Y9/fnpanwWmPN5FqhDoM3nWTAP9/k8Dcap+/WAn+g3FUJ0BOe0KATz9ICdCuLpQT3Haz19XvCz+/Bawc8eC37289PH9N+f/uyr/u6/nx3P0XxM+4563AQYRERERERERERE5B6DeURERERERERERDbBYB4REREREREREZFNMJhHRERERERERERkEwzmERERERERERER2QSDeURERERERERERDbBYB4REREREREREZFNMJhHRERERERERERkEwzmERERERERERER2YRfTC+AN9I0Tf1/7969mF4UIiIiIiIiIlvRr6X1a2vT2wsIQGNPb6GhaFkkFL8/+1kLFQ0/q+fg/9Cnjzs/T38sNOTpa2hP/1fvIST42f24aU7Pefp8Db/rfxsS8t9yqJ+fPdf5sZBQl9d69vch+uviOc+erx7Tn/fsdR2v/ex5z96zpn7Wnn/M8fdP37cWgtvT+/G/+ln9PV736e9q1amfn65XDetCLfd/Pz9dlZqEapqE6v+H4Oenn30I7tNXbcizx/Xnhj57LPTZ855uMBIiaELDJyNoOhTLhbci+Nunn7f6+dnznP9/+jea4+/wf7BqE/8/fb3gZ48FP3sMf/P0Mf15+t+LPFaPmoPBPBMEYEcgIlmyZDHj5YmIiIiIiIhixbV1smTJTHt9BIySJEkiWfIVMa0Nit2SJEliSlCawTwTZMyYUc6fPy9JkyYVHx8fQ3snECDEa/v7+xv2up7QHt+bPdelN39uVrfH92bPdcnPzZ7r0ps/N6vb43uz57rk52bPdenNn5vV7fG9ef66RPADgTxcW5sJ1+uBgYGWbeeeuo1GFZfrxdaXkXEhHYN5JogTJ45kzpxZzIIvs5VfaCvb43uz57r05s/N6vb43uy5Lvm52XNdevPnZnV7fG/2XJf83Oy5Lr35c7O6Pb43z16XZmbkxfS2EFVcLu9YX2bgBBhEREREREREREQ2wWAeERERERERERGRTTCYZyPx48eXfv36qf+9rT2+N3uuS2/+3Kxuj+/NnuuSn5s916U3f25Wt8f3Zs91yc/NnuvSmz83q9vje7Pvuowty8/l4vqKjI9m1VzPRERERERERERE9FKYmUdERERERERERGQTDOYRERERERERERHZBIN5RERERERERERENsFgHhERERERERERkU0wmEdEREREREREXuP69etSr149SZQokeTLl09Wrlzp9nkPHz6Ud955R5ImTSpZs2aVKVOmhHl83LhxkjlzZvH395f27dvL48ePLVmuTz75RHLmzKmWq3Tp0rJu3TrHY2vWrJE4ceJIkiRJHLf169dbslzt2rVTM+3q7RYqVMgj1lehQoXCrA+sn8GDB5uyvjD7ccGCBdVrTp06Ndznmb1tMZhHRCQix44dk/nz58v58+fV+vj111+lYcOG0rt3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",
      "text/plain": [
       "<Figure size 1495x345 with 4 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 用传入的 qc_genes（经典 marker）做 dotplot；只保留存在于 adata 的基因\n",
    "qc_genes_use = [g for g in qc_genes if g in adata.var_names]\n",
    "missing = [g for g in qc_genes if g not in adata.var_names]\n",
    "if missing:\n",
    "    print(f\"qc_genes 缺失 {len(missing)} 个：{missing}\")\n",
    "sc.pl.dotplot(adata, var_names=qc_genes_use, groupby=\"hier_cluster\",\n",
    "              standard_scale=\"var\", )\n",
    "#cmap=\"viridis\"\n",
    "#swap_axes=True"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3d6dbc8a",
   "metadata": {},
   "source": [
    "## 备注\n",
    "\n",
    "- `linkage_method` 推荐 `average`（稀疏 ST 稳健）；备选 `ward`（簇更紧凑）；`complete` 对离群点敏感、慎用。\n",
    "- other 过多/过少优先调 `k_init` 与 `threshold`。\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "tumor_py",
   "language": "python",
   "name": "tumor_py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
