#!/usr/bin/env python3
"""敌意复核：专找能推翻"25 个基因跨队列复制"这个结论的地方。"""
import gzip, json
import numpy as np
from scipy.stats import mannwhitneyu

r = json.load(open("results.json"))
lab = json.load(open("cohort_labels.json"))

print("== 质疑 1：样本 ID 对得上吗（上一版就是这里空掉的）==")
import urllib.request
url = ("https://www.cbioportal.org/api/molecular-profiles/aml_ohsu_2018_rna_seq_mrna/"
       "molecular-data/fetch?projection=SUMMARY")
req = urllib.request.Request(url, data=json.dumps({"entrezGeneIds": [596],
      "sampleListId": "aml_ohsu_2018_all"}).encode(),
      headers={"Content-Type": "application/json"})
rows = json.load(urllib.request.urlopen(req, timeout=180))
expr_ids = {x["sampleId"] for x in rows}
lab_ids = set(lab["beataml_induction_response"])
print(f"  表达数据样本 {len(expr_ids)}｜标签样本 {len(lab_ids)}｜交集 {len(expr_ids & lab_ids)}")
print("  → " + ("✅ 对得上" if len(expr_ids & lab_ids) > 300 else "⚠️ 交集过小，结论存疑"))

print("\n== 质疑 2：发现层的显著性够不够 ==")
print(f"  TCGA top200 候选里最小 FDR = 4.41e-02 —— 这很弱。")
print("  含义：候选是「最像的 200 个」，不是「确证显著的 200 个」。复制这一步才是真正的筛子。")
print("  这一点必须写进报告，不能让读者以为候选本身已经站住。")

print("\n== 质疑 3：方向一致是不是被符号约定骗了 ==")
det = r["replicated"][:5]
for d in det:
    same = np.sign(d["tcga_delta"]) == np.sign(d["beataml_delta"])
    print(f"  {d['gene']:<10} TCGA Δ={d['tcga_delta']:+.3f}  BeatAML Δ={d['beataml_delta']:+.3f}  "
          f"{'同向 ✓' if same else '异向 ✗'}")
print("  两个 Δ 都定义为 耐药组中位 − 敏感组中位，符号可直接比。")

print("\n== 质疑 4：只取回 150/200 个基因，会不会偏 ==")
print(f"  候选 200 → cBioPortal 认得 166 → 实际有表达 150。缺的 50 个不是按结果挑的，")
print(f"  是基因符号版本差异造成的，与耐药无关。复制率按 150 算而非 200，报告里要写清分母。")

print("\n== 质疑 5：把复制阈值收紧，25 个还剩几个 ==")
# 用更严的 FDR<0.05 重算
import collections
strict = [d for d in r["replicated"] if d["beataml_fdr"] < 0.05]
print(f"  FDR<0.10: {len(r['replicated'])} 个｜收紧到 FDR<0.05: {len(strict)} 个")
print("  → " + ("✅ 收紧后仍有相当数量，结论不靠阈值撑着"
                if len(strict) >= 10 else "⚠️ 收紧后掉得多，说明贴着阈值"))
json.dump({"expr_label_overlap": len(expr_ids & lab_ids),
           "strict_fdr005_count": len(strict)}, open("adversarial.json", "w"), indent=1)
