模組 13 · LongPhase-TO: tumour-only
LongPhase-TO(tumor-only)
沒有對照組時改看 read 上的鄰居關係:LOH 偵測、三位點投票、跨 LOH 的定相、腫瘤比例估計,以及這四步在原始碼裡的落點。
本模組學習目標
- 說出沒有配對正常樣本時,LongPhase-TO 改用什麼證據取代對照組
- 解釋為什麼判斷候選變異的真假,要看「支持它的 read 落在哪一條染色體上」
- 說明偵測 LOH 為什麼用雜合位點比例而不是 coverage,以及小事件為什麼要先扣掉
- 讀懂一個 GT:GT2:GT3 字串,包含 LOH 區內的情況
- 在原始碼裡指出這四個步驟各自寫在哪個函式
為什麼重要
上一章的做法需要兩份樣本:腫瘤一份、同一個病人的正常組織一份。 有了正常樣本,「這個變異是不是癌細胞才有的」就有直接的參照 —— 正常樣本裡也看得到的,本來就有,不是癌症造成的。
實務上常常只拿得到腫瘤那一份。這時候少掉的不只是一個檔案,是整個對照組。 看到一個候選變異,你沒有辦法直接回答「這個人本來就有嗎」。
LongPhase-TOLongPhase-TOtumor-only 版本。做染色體等級的 LOH 偵測、triplet graph 再校正、somatic phasing 與腫瘤 DNA 比例估計。The tumour-only version: chromosome-scale LOH detection, triplet-graph recalibration, somatic phasing and purity estimation.完整條目 → 換了一種證據:不比對兩個樣本,改看同一批 read 內部的結構。 一條 long readlong read 長讀單條可達數千至數萬鹼基的定序片段(例如 ONT、PacBio)。若可靠地同時覆蓋多個 variant,可提供它們位於同一 DNA 分子上的直接觀測證據。A sequencing read thousands to tens of thousands of bases long. Its length lets one molecule link multiple variants directly.完整條目 → 一次跨過好幾個位置,所以「哪些 allele 綁在同一條分子上」這件事, 只有腫瘤樣本時仍然看得見。這一章就是在講它怎麼把這個結構當成缺席的對照組來用。
概念與互動
先看整件事的形狀
這個工具只有一個主要指令,但它一次做完四件事。 先把這四件事的順序記住,後面每一節都是在把其中一格放大。
第一件事:哪些區段只剩一條染色體
人的每個位置本來有兩份,一份來自父親、一份來自母親。 腫瘤細胞常常整段整段地弄丟其中一份,這叫 LOHLOH 異型合子性喪失原本 heterozygous 的區域變成只剩一種 allele。LOH 不等於缺失 —— 也可能是一條 haplotype 遺失後另一條被複製(copy-neutral LOH)。Loss of heterozygosity: a formerly het region retains only one allele. Not necessarily a deletion.完整條目 →。 LOH 區段對後面每一步都有影響,所以要先找出來。
怎麼找?看一個很簡單的數字:這個區段裡,「兩份不一樣」的位置佔多少。 兩份都在的時候,一個人身上大約每一千個鹼基就有一個位置是一邊 A、一邊 G, 這種位置叫 雜合heterozygous 異型合子在一般二倍體位點上,兩份 allele 不同(例如一份 A、一份 G)。此類位點可作為區分 haplotype 的資訊錨點;複雜拷貝數情況需另行解讀。At a typical diploid locus, carrying two different allele copies (for example A and G). These sites can anchor phasing; copy-number changes require separate interpretation.完整條目 →。少了一份之後,這些位置只剩一種 allele,比例就會塌下來。
S)。大量 clipping 集中於同一位置時,可能提示結構變異斷點,仍需其他證據確認。A read end that failed to align but is retained in the BAM (CIGAR S). Clipping clustered at one position may suggest a structural breakpoint and needs corroborating evidence.完整條目 →,M4 的 CIGAR S),
而斷點附近會有一整排 read 在同一個位置被剪。方向相反又靠得很近的兩個剪痕會被配成一對,代表中間夾著一個小事件;配不到對的落單剪痕就當成大區段的邊界。
② 每個區段算一次雜合比例,低於門檻的標成 LOH。③ 關鍵的一步:算比例時先把小事件區間裡的變異扣掉,否則一段連續的 LOH 會被切成好幾塊。為什麼不看 coverage 就好?
直覺上「少一份」應該等於「深度剩一半」。但 M8 的 LOH 模擬器示範過另一種情況: 一條 haplotype 遺失之後,另一條被複製補上,深度看起來完全正常, 可是兩份都來自同一個親代 —— 這叫 copy-neutral LOH。
只看 coverage 會整個漏掉這一類。雜合比例則對兩類都有反應: 不管是「少一份」還是「一份變兩份一樣的」,原本能分出兩邊的位置都會消失。
為什麼小事件非扣不可?因為一段大 LOH 裡面常常夾著幾個小的重排 (BFBBFB 斷裂—融合—橋循環Breakage-fusion-bridge:染色體反覆斷裂與融合造成的劇烈重排,在 coverage 上呈現特殊的階梯形狀。Breakage-fusion-bridge: repeated chromosome breakage and fusion producing characteristic coverage staircases.完整條目 → 這類劇烈斷裂—融合就會製造這種局部訊號)。這些小區間裡雜合位點會短暫回來, 把比例墊到門檻之上。不處理的話,程式會以為那裡不是 LOH,於是把一段連續的區域報成三段不相干的區域。
第二件事:這個候選變異是真的嗎
候選變異不是 LongPhase-TO 自己叫出來的 —— 那是 ClairSClairS配對 tumor–normal 的 somatic variant caller。tumor-only 版本叫 ClairS-TO。A somatic variant caller for matched tumour–normal data; ClairS-TO is the tumour-only version.完整條目 →-TO 或 DeepSomatic-TO 的工作。 LongPhase-TO 做的是再校正(recalibrationrecalibration 再校正以額外證據重新評估 caller 已輸出的 candidates。若僅處理既有候選,可移除 false positives,但不能恢復 caller 未輸出的變異。Re-judging a caller's candidates with extra evidence. When the candidate set is fixed, it can remove false positives but cannot recover variants the caller never emitted.完整條目 →):把明顯不合理的候選挑掉。
第一關很直接:拿去對 PONPON 正常樣本面板/族群資料庫(依流程而異)PON 依分析流程有兩種用法,兩者不可互換:本教材的 tumor-only 流程以它指稱 population germline database set(如 1000G、CoLoRSdb、dbSNP、gnomAD 的聯集);GATK Mutect2 的 Panel of Normals(PoN)則由多個正常樣本建立,用來標記反覆出現的技術性 artifact。兩者都不能完全取代同一病人的 matched normal。The abbreviation is workflow-dependent and the two uses are not interchangeable. In this tutorial's tumour-only workflows, PON denotes a population germline database set; in GATK Mutect2, a Panel of Normals (PoN) is built from multiple normal samples to flag recurrent technical artifacts. Either can miss a private germline variant or an unseen artifact, so neither replaces a patient's matched normal.完整條目 → 這種族群資料庫比。 大家都有的變異,多半是這個人與生俱來的,不是癌症造成的,先排除掉。 但族群資料庫收不到每個人的私有變異,所以過了這一關還不夠。
第二關才是重點,而且它用的證據只有 long read 給得起: 看支持這個候選的 read,左右兩邊的鄰居是什麼。
背後的理由是癌症怎麼發生的。一個體細胞變異只會發生在某一個細胞的某一條染色體上, 之後那個細胞分裂出來的後代才帶著它。所以真變異必然掛在一條既有的 haplotype 底下, 形成一條「跟母體只差一格」的新路徑。定序錯誤沒有這個身世,它落在哪條 read 上是隨機的。
為什麼要三個位置,兩個不夠?
M11 講過兩個位置之間的一條邊:它其實是四個計數(rr/ra/ar/aa), 能回答的是「這兩個位置該平行接還是交叉接」。
但這裡要問的是另一個問題:候選 allele 在左右兩側是不是都指向同一條 haplotype。 只有一個鄰居時,「跟左邊一致」很容易碰巧發生;要有左鄰居和右鄰居, 才看得出「這條新路徑從頭到尾只跟某一條差一格」。所以最小單位是三個位置, 這個結構就叫 triplet graphtriplet graphLongPhase-TO 判斷候選變異真假時用的最小結構:候選位置加上左右各一個變異,共三個位置。把 read 上看到的 allele 組合畫成路徑後,真的 somatic 變異會形成一條「跟某一條 germline haplotype 只差候選這一格」的新路徑;定序錯誤則湊不出一致的路徑。因為左右兩側都要對得上,所以三個位置是最小單位。LongPhase-TO's minimal unit for judging a candidate: the candidate plus one flanking variant on each side. A true somatic allele forms a third path differing from one parental haplotype at the candidate alone; artifacts show no consistent path.完整條目 →。
實際上一個候選點周圍不會只取一組三位點。程式會拿它左右幾個變異輪流搭配, 組出很多組三位點,每一組各自看一次、各投一票,最後看票數決定留不留。 一組看走眼不會定生死,這是把單一雜訊的影響攤掉的常見做法。
第三件事:把每個變異掛回染色體
前兩件事做完,才輪到定相本身。做法跟 M11 一樣 —— 把「同一條 read 上看到的 allele」連成一張圖,再沿著圖走出兩條 haplotype。 差別在這裡多做兩件事:somatic 變異也要一起掛上去,而且LOH 區要接得過去。
結果寫在 VCF 的 FORMAT 欄位,分成三層。用下面的解碼器把七種常見組合逐一看過一次:
GT 有沒有「.」——
有就代表這裡是 LOH 區,那一側的 haplotype 不存在。| 欄位 | 回答的問題 | 怎麼讀 |
|---|---|---|
GT | 與生俱來的兩條長什麼樣 | 有一側是 . = 這裡是 LOH |
GT2 | 癌細胞才有的變異長在哪一條上 | 哪一格是 1,就是長在那一條上;1|1 代表判不出來 |
GT3 | LOH 區裡,剩下那一條再往下分的第二支 | 非 LOH 區通常用不到,寫 ./. |
為什麼 LOH 區要多一層?因為那裡只剩一條 germline haplotype 可以掛,
但癌細胞在那一條上可能先後長出兩批不同的變異,屬於不同的細胞群。
只有 GT2 一格的話,這兩批會被混在一起;多一層 GT3 才分得開。
第四件事:這個樣本有多少比例是腫瘤
檢體不會是純的癌細胞,裡面一定混著正常細胞。混得多寡直接影響每個變異的訊號強度, 所以這個比例要估出來。M12 用的是 GHIRGHIR 生殖系單倍型失衡比Germline Haplotype Imbalance Ratio:在候選 somatic 位點上,取標為 HP1 與 HP2 的 read 數中較大者除以兩者之和,值域為 0.5 至 1。須注意兩件事:分母只含這兩個 germline 計數,HP1-1/HP2-1/HP3 皆不在內;且這些標籤是整條 read 的判定(該 read 任一處帶 somatic 等位即離開 germline 計數),並非該位點的等位計數。它不是直接的 purity 讀數:拷貝數變異、LOH、read 跨距內的突變密度、標記錯誤與抽樣不足都會使它偏移。Germline Haplotype Imbalance Ratio: at a candidate somatic locus, the larger of the HP1 and HP2 tagged read counts divided by their sum, ranging from 0.5 to 1. Two caveats: the denominator contains only those two germline counts, excluding HP1-1/HP2-1/HP3; and those tags are whole-read decisions (a read carrying a somatic allele anywhere leaves the germline counts), not per-locus allele counts. It is not a direct purity readout — copy number, LOH, mutation density within the read span, tagging error and sparse sampling all shift it.完整條目 →;這裡的比值算法一樣,差別只在數的是帶 reference allele 的 read。
這個數字叫什麼,要小心
程式把它寫成 ##tumor_purity=,但它量到的其實是
腫瘤 DNA 佔的比例tumour DNA fraction 腫瘤 DNA 比例樣本 DNA 中源自腫瘤的比例。與 tumor purity(細胞比例)在 aneuploid 或 WGD 的情況下會不一樣。The fraction of DNA originating from tumour cells; diverges from cellular purity under aneuploidy or WGD.完整條目 →,不是腫瘤細胞佔的比例。
在實驗室依覆蓋度混出來的合成樣本裡,兩者恰好相等,所以平常不容易察覺差別。 但真實腫瘤如果是 非整倍體aneuploidy 非整倍體染色體數目異常。腫瘤裡非常普遍,也可能使 cellular purity 與 DNA fraction 不一致。An abnormal chromosome count. It is common in tumours and can make cellular purity differ from tumour DNA fraction.完整條目 →或發生過全基因體加倍,一個癌細胞貢獻的 DNA 比正常細胞多, 兩個數字就會分開。報告數字時要說清楚是哪一個。
最後一步是把兩樣東西交給一條事先訓練好的式子:全基因體所有位置的比值分布, 加上 LOH 佔了基因體多少。為什麼要加 LOH 這一項?因為 LOH 區本身就會把比值推向 1.0 (那裡本來就只剩一條),只看比值分布會高估。兩個特徵一起看,才對得起來。
模型邊界:預訓練係數何時可能失準
這條式子的係數是在幾個已知答案的細胞株資料上配出來後固定下來的, 之後每個樣本都用同一組係數。所以它的可靠度取決於新樣本跟當初那些細胞株像不像 —— 這是所有預訓練模型共通的邊界條件,不是這個工具特有的問題。
真實資料與證據
longphase-to phase \
-s SNP.vcf \
-b tumor.bam \
-r reference.fasta \
-t 8 \
-o phased_prefix \
--caller clairs_to_ssrs \
--pon-file PoN/gnomad.vcf.gz,PoN/dbsnp.vcf.gz \
--strict-pon-file PoN/1000g-pon.vcf.gz \
--loh
指令提醒:四個常見參數錯誤
--caller 只接受
clairs_to_ss、clairs_to_ssrs、deepsomatic_to,寫錯會直接報錯結束。
--pon-file 的值是一個用逗號分隔的字串,不是重複的旗標。
--strict-pon-file 比 --pon-file 嚴格:它要求位置與 ALT allele 都吻合才算命中。
--loh 不加就不會輸出 LOH 區間。

怎麼看輸出
# 估出來的腫瘤比例寫在 VCF 檔頭
grep '##tumor_purity' phased_prefix.vcf
# LongPhase-TO 加上去的 FILTER 標籤分布
awk '!/^#/ {print $7}' phased_prefix.vcf | sort | uniq -c
# LOH 區間
head phased_prefix_LOH.bed
FILTER 欄位會出現 PASS、LP_nonSomatic 或 LP_PON:
分別是留下來的、被三位點投票否決的、被族群資料庫擋掉的。
加上 --disable-refine-somatic 就不做這一步,可以用來看再校正到底改了哪些位置。
預測與結果檢視
你在輸出的 VCF 裡看到一列的 FORMAT 是 0|0:1|1:./.。
這代表什麼?這個位置的資訊完整嗎?
展開答案
一層一層拆:
GT = 0|0—— 與生俱來的兩條在這裡都是 reference。 沒有.,所以這裡不是 LOH 區。GT2 = 1|1—— 有 somatic 事件,但兩格都寫成 1。 依定義這代表來源判不出來,也就是hp3。GT3 = ./.—— 沒用到第三層,符合「這裡不是 LOH 區」。
所以資訊不完整:工具認定這裡有 somatic 事件, 但沒辦法說它長在 HP1 還是 HP2 上。
最常見的原因是這附近沒有可用的錨點 —— 附近沒有雜合位點, 或者跨過去的 read 太短,兩邊都連不到能區分 HP1/HP2 的位置。 回到第二件事那張圖就懂了:沒有鄰居可看,就沒有辦法判斷出身。
留意它沒有隨便挑一條寫上去。證據不足時保留「不確定」, 跟 M12 對 HP3 的處理是同一個原則:不要把猜測寫成結論。
實作練習
跑一次,然後檢查四個輸出
longphase-to phase \
-s tumor_snv.vcf \
-b tumor.bam \
-r reference.fasta \
-t 8 \
-o phased_prefix \
--caller clairs_to_ssrs \
--pon-file PoN/gnomad.vcf.gz,PoN/dbsnp.vcf.gz \
--strict-pon-file PoN/1000g-pon.vcf.gz \
--loh
# ① LOH 一共佔了多少基因體?
awk '{s+=$3-$2} END {print "LOH 總長度:", s/1e6, "Mb"}' phased_prefix_LOH.bed
# ② 估出來的腫瘤比例
grep '##tumor_purity' phased_prefix.vcf
# ③ 有 somatic 事件的位置(GT2 不是 ./.)
bcftools query -f '%POS\t[%GT\t%GT2\t%GT3]\n' phased_prefix.vcf | \
awk '$3 != "./."' | head -20
# ④ 其中有幾個落在 LOH 區裡(GT 帶點)
bcftools query -f '[%GT\t%GT2]\n' phased_prefix.vcf | \
awk '$2 != "./." && $1 ~ /\./' | wc -l
③ 跑出來如果有一堆 1|1,代表很多位置判不出來源,
通常是覆蓋度或 read 長度不足;④ 的數字跟 ① 的 LOH 長度應該是相關的,
兩者兜不起來就值得回頭看 LOH 是不是切得太碎。
把圖印出來看
longphase-to phase ... --dot -o phased_prefix
加 --dot 會另外輸出一個 Graphviz 的 .dot 檔,
裡面就是這一章講的那張「節點是 allele、邊是 read 支持」的圖。
自己畫出一小段來看,比讀十遍說明有用。
追程式碼時的對照表
四件事在原始碼裡各有明確的落點。PhasingProcess.cpp 的建構子
從上往下讀就是整個流程,其他檔案都是被它叫起來的:
| 這一章講的 | 程式裡的位置 |
|---|---|
| 整個流程的順序 | PhasingProcess.cpp 建構子,由上而下 |
| 讀 BAM、順便數剪痕 | BamParser::direct_detect_alleles() → clipCount |
| 由剪痕切出區段與小事件 | Clip::detectGenomicEventInterval() |
| 算雜合比例、判定 LOH | Clip::detectLOHRegion()(門檻就寫在這個函式裡) |
| 建圖:節點是 allele,邊是 read | VairiantGraph::addEdge() |
| 三位點投票 | VairiantGraph::somaticCalling() → patternMining() |
| 定相本體 | VairiantGraph::phasingProcess() |
| 估腫瘤比例 | PurityCalculator::getPurity() |
| 寫出 GT / GT2 / GT3 | VairiantGraph::exportPhasingResult() |
grep 的時候會踩到的兩件事
第一,圖的類別名稱是 VairiantGraph —— 原始碼裡就是這樣拼的,
搜 VariantGraph 會一無所獲。
第二,一個候選點會被拿去跟左右各幾個變異搭配成很多組三位點,
那個「幾個」是 --somaticConnectAdjacent(預設 6)。
它跟一般定相用的 --connectAdjacent(預設 35)是兩個不同的參數,別看錯。
實作查表:LongPhase-S 與 LongPhase-TO 的差異
在兩個工具之間切換時最容易搞混的六件事:
| 配對版(longphase-s) | 僅腫瘤版(longphase-to) | |
|---|---|---|
| somatic haplotype 寫在哪 | BAM 的 HP:Z:1-1 | VCF FORMAT 的 GT2/GT3 |
| 腫瘤比例寫在哪 | <prefix>_purity.out 檔案 | VCF 檔頭 ##tumor_purity= |
| 指定比例的參數名 | --tumor-purity(0.1–1.0) | --purity(0–1) |
| 掛在哪個子命令 | somatic_haplotag | phase |
--caller | 沒有這個參數 | 實質必填 |
--loh | 沒有 | 有,輸出 _LOH.bed |
學習檢核
程式碼
LongPhase-TO 的程式碼在
github.com/CCU-Bioinformatics-Lab/longphase-to;
截至本教材撰寫時尚未有對應論文,參數與行為以原始碼的 longopts 表為準。
本模組術語
- BFB(斷裂—融合—橋循環)
- Breakage-fusion-bridge:染色體反覆斷裂與融合造成的劇烈重排,在 coverage 上呈現特殊的階梯形狀。
- ClairS
- 配對 tumor–normal 的 somatic variant caller。tumor-only 版本叫 ClairS-TO。
- GHIR(生殖系單倍型失衡比)
- Germline Haplotype Imbalance Ratio:在候選 somatic 位點上,取標為 HP1 與 HP2 的 read 數中較大者除以兩者之和,值域為 0.5 至 1。須注意兩件事:分母只含這兩個 germline 計數,HP1-1/HP2-1/HP3 皆不在內;且這些標籤是整條 read 的判定(該 read 任一處帶 somatic 等位即離開 germline 計數),並非該位點的等位計數。它不是直接的 purity 讀數:拷貝數變異、LOH、read 跨距內的突變密度、標記錯誤與抽樣不足都會使它偏移。
- LOH(異型合子性喪失)
- 原本 heterozygous 的區域變成只剩一種 allele。LOH 不等於缺失 —— 也可能是一條 haplotype 遺失後另一條被複製(copy-neutral LOH)。
- LongPhase-TO
- tumor-only 版本。做染色體等級的 LOH 偵測、triplet graph 再校正、somatic phasing 與腫瘤 DNA 比例估計。
- PON(正常樣本面板/族群資料庫(依流程而異))
- PON 依分析流程有兩種用法,兩者不可互換:本教材的 tumor-only 流程以它指稱 population germline database set(如 1000G、CoLoRSdb、dbSNP、gnomAD 的聯集);GATK Mutect2 的 Panel of Normals(PoN)則由多個正常樣本建立,用來標記反覆出現的技術性 artifact。兩者都不能完全取代同一病人的 matched normal。
- aneuploidy(非整倍體)
- 染色體數目異常。腫瘤裡非常普遍,也可能使 cellular purity 與 DNA fraction 不一致。
- heterozygous(異型合子)
- 在一般二倍體位點上,兩份 allele 不同(例如一份 A、一份 G)。此類位點可作為區分 haplotype 的資訊錨點;複雜拷貝數情況需另行解讀。
- long read(長讀)
- 單條可達數千至數萬鹼基的定序片段(例如 ONT、PacBio)。若可靠地同時覆蓋多個 variant,可提供它們位於同一 DNA 分子上的直接觀測證據。
- recalibration(再校正)
- 以額外證據重新評估 caller 已輸出的 candidates。若僅處理既有候選,可移除 false positives,但不能恢復 caller 未輸出的變異。
- soft clipping
- read 端部未與參考序列對齊,但序列仍保留在 BAM 中(CIGAR 為
S)。大量 clipping 集中於同一位置時,可能提示結構變異斷點,仍需其他證據確認。 - triplet graph
- LongPhase-TO 判斷候選變異真假時用的最小結構:候選位置加上左右各一個變異,共三個位置。把 read 上看到的 allele 組合畫成路徑後,真的 somatic 變異會形成一條「跟某一條 germline haplotype 只差候選這一格」的新路徑;定序錯誤則湊不出一致的路徑。因為左右兩側都要對得上,所以三個位置是最小單位。
- tumour DNA fraction(腫瘤 DNA 比例)
- 樣本 DNA 中源自腫瘤的比例。與 tumor purity(細胞比例)在 aneuploid 或 WGD 的情況下會不一樣。