模組 13 · LongPhase-TO: tumour-only

LongPhase-TO(tumor-only)

沒有對照組時改看 read 上的鄰居關係:LOH 偵測、三位點投票、跨 LOH 的定相、腫瘤比例估計,以及這四步在原始碼裡的落點。

約 80 分鐘建議先修:LongPhase-S

本模組學習目標

  • 說出沒有配對正常樣本時,LongPhase-TO 改用什麼證據取代對照組
  • 解釋為什麼判斷候選變異的真假,要看「支持它的 read 落在哪一條染色體上」
  • 說明偵測 LOH 為什麼用雜合位點比例而不是 coverage,以及小事件為什麼要先扣掉
  • 讀懂一個 GT:GT2:GT3 字串,包含 LOH 區內的情況
  • 在原始碼裡指出這四個步驟各自寫在哪個函式

為什麼重要

上一章的做法需要兩份樣本:腫瘤一份、同一個病人的正常組織一份。 有了正常樣本,「這個變異是不是癌細胞才有的」就有直接的參照 —— 正常樣本裡也看得到的,本來就有,不是癌症造成的。

實務上常常只拿得到腫瘤那一份。這時候少掉的不只是一個檔案,是整個對照組。 看到一個候選變異,你沒有辦法直接回答「這個人本來就有嗎」。

換了一種證據:不比對兩個樣本,改看同一批 read 內部的結構。 一條 一次跨過好幾個位置,所以「哪些 allele 綁在同一條分子上」這件事, 只有腫瘤樣本時仍然看得見。這一章就是在講它怎麼把這個結構當成缺席的對照組來用。

概念與互動

先看整件事的形狀

這個工具只有一個主要指令,但它一次做完四件事。 先把這四件事的順序記住,後面每一節都是在把其中一格放大。

LongPhase-TO 一個指令做完的四件事,以及它的輸入與輸出 輸入有三樣:只有腫瘤樣本的 BAM、別的工具產生的候選變異 VCF, 以及一份族群常見遺傳變異的清單。沒有配對的正常樣本可以對照。 中間由上而下依序做四件事:先沿著染色體找出只剩一條染色體的 LOH 區段; 再逐一判斷每個候選變異是不是真的;接著把 germline 與 somatic 變異一起定相; 最後從兩條 haplotype 的 read 有多不平衡,估計樣本裡有多少比例來自腫瘤。 第四件事算出來的比例若超過 0.9,會用它回頭把第三步重跑一次, 圖上以右側往回的虛線表示。 輸出有三樣:帶 GT、GT2、GT3 的 VCF、標出 LOH 區段的 BED, 以及寫在 VCF 檔頭的腫瘤比例。 一個 phase 指令,由上而下做完四件事 沒有正常樣本可以對照,所以這四件事都只能從腫瘤自己的 read 推出來。 輸入 腫瘤樣本的 BAM 沒有配對的正常樣本 候選變異 VCF 由 ClairS-TO 或 DeepSomatic-TO 產生 族群資料庫(PON) 大家都有的遺傳變異清單 ① 哪些區段只剩一條染色體? 用 read 被剪斷的位置切出區段邊界, 再算每個區段裡「雜合位點佔多少」, 比例低到一定程度就標成 LOH。 ② 每個候選變異是真的嗎? 看支持它的 read 落在哪一條染色體上: 全落在同一條,像是從那一條長出來的; 散在兩條,比較像隨機出現的定序錯誤。 ③ 每個變異在哪一條染色體上? 把「同一條 read 上看到的 allele」連成圖, 一次定相 germline 與 somatic 變異。 LOH 區裡只剩一條,也要接得過去。 ④ 這個樣本有多少比例是腫瘤? 看兩條 haplotype 的 read 有多不平衡, 加上 LOH 佔了全基因體多少, 一起丟進一個事先訓練好的式子。 算出來超過 0.9 時,回頭把 ③ 重跑一次。 輸出 phased VCF 每個位置的 GT · GT2 · GT3 <prefix>_LOH.bed 哪些區段只剩一條染色體 ##tumor_purity= 寫在 VCF 的檔頭裡
由上而下就是程式實際跑的順序,不是隨便排的。 ③ 需要 ① 算出來的 LOH 區段才做得下去;④ 需要 ③ 的定相結果才算得出來。 而 ④ 算出來的數字如果很高,還會回頭把 ③ 重跑一次 —— 這條回饋線是這個流程唯一的循環。

第一件事:哪些區段只剩一條染色體

人的每個位置本來有兩份,一份來自父親、一份來自母親。 腫瘤細胞常常整段整段地弄丟其中一份,這叫 。 LOH 區段對後面每一步都有影響,所以要先找出來。

怎麼找?看一個很簡單的數字:這個區段裡,「兩份不一樣」的位置佔多少。 兩份都在的時候,一個人身上大約每一千個鹼基就有一個位置是一邊 A、一邊 G, 這種位置叫 。少了一份之後,這些位置只剩一種 allele,比例就會塌下來。

怎麼找出「只剩一條染色體」的區段:先切邊界,再算雜合比例,最後跳過小事件 第一層:read 的兩端如果對不上參考序列就會被剪掉,而斷點附近會有很多 read 在同一個位置被剪。 左端被剪與右端被剪各算一種訊號。兩個方向相反、距離又很近的訊號會被配成一對, 代表中間夾著一個小事件;配不成對的落單訊號則當成大區段的邊界。 第二層:對每個區段統計雜合位點佔所有變異的比例。 一條染色體整段消失時,原本一邊 A 一邊 G 的位置會只剩一種 allele,比例因此掉到門檻以下。 圖中一段真正連續的 LOH 被中間兩個小事件墊高了比例,於是被切成三段。 第三層:算比例時把小事件區間裡的變異先扣掉,三段就併回成一段連續的 LOH, 寫進 LOH.bed,第三步定相時會用到。 這一整套只用 read 與參考的對應關係,以及變異本身是雜合還是同型,不需要正常樣本。 ① read 被剪斷的位置,就是切區段的地方 read 的一端對不上參考序列時會被剪掉。同一個位置擠了很多剪痕,代表那裡有斷點。 read 右端被剪 左端被剪 右端被剪 配成對 方向相反又很近 → 中間夾著一個小事件 落單 → 大區段的邊界 ② 每個區段算一個數字:雜合位點佔多少 一條染色體整段不見了,原本能分出兩邊的位置只剩一種 allele,這個比例就會掉到門檻以下。 門檻 正常 正常 小事件 小事件 門檻以下的三段各自被標成 LOH 問題:本來是一段連續的 LOH,被兩個小事件切成三塊。 ③ 算比例時,先把小事件區間裡的變異扣掉 跳過 跳過 併回成一段:這一整段只剩一條染色體 寫進 <prefix>_LOH.bed,第三步定相時會用到
三層。① 區段的邊界不是憑空切的:read 的一端對不上參考序列時會被剪掉,M4 的 CIGAR S), 而斷點附近會有一整排 read 在同一個位置被剪。方向相反又靠得很近的兩個剪痕會被配成一對,代表中間夾著一個小事件;配不到對的落單剪痕就當成大區段的邊界。 ② 每個區段算一次雜合比例,低於門檻的標成 LOH。③ 關鍵的一步:算比例時先把小事件區間裡的變異扣掉,否則一段連續的 LOH 會被切成好幾塊。

為什麼不看 coverage 就好?

直覺上「少一份」應該等於「深度剩一半」。但 M8 的 LOH 模擬器示範過另一種情況: 一條 haplotype 遺失之後,另一條被複製補上,深度看起來完全正常, 可是兩份都來自同一個親代 —— 這叫 copy-neutral LOH。

只看 coverage 會整個漏掉這一類。雜合比例則對兩類都有反應: 不管是「少一份」還是「一份變兩份一樣的」,原本能分出兩邊的位置都會消失。

為什麼小事件非扣不可?因為一段大 LOH 裡面常常夾著幾個小的重排 ( 這類劇烈斷裂—融合就會製造這種局部訊號)。這些小區間裡雜合位點會短暫回來, 把比例墊到門檻之上。不處理的話,程式會以為那裡不是 LOH,於是把一段連續的區域報成三段不相干的區域。

第二件事:這個候選變異是真的嗎

候選變異不是 LongPhase-TO 自己叫出來的 —— 那是 -TO 或 DeepSomatic-TO 的工作。 LongPhase-TO 做的是再校正):把明顯不合理的候選挑掉。

第一關很直接:拿去對 這種族群資料庫比。 大家都有的變異,多半是這個人與生俱來的,不是癌症造成的,先排除掉。 但族群資料庫收不到每個人的私有變異,所以過了這一關還不夠。

第二關才是重點,而且它用的證據只有 long read 給得起: 看支持這個候選的 read,左右兩邊的鄰居是什麼

沒有正常樣本時,用「鄰居一不一致」分辨真變異與定序錯誤 上半部是同一個候選位置的兩種情況,各六條 read,而且兩邊帶候選 allele 的 read 都剛好三條 —— 所以光數數量分不出來,要看它們落在哪裡。 左邊:三條帶 T 的 read,左右鄰居都是 C 與 A,也就是三條全部落在同一條染色體(HP2)上。 右邊:三條帶 T 的 read,一條的鄰居是 HP1 的組合、一條是 HP2 的組合、 一條的組合在這個人身上根本不存在,因此無法歸屬。 下半部把同樣的資料畫成路徑圖:三個位置各有兩種 allele,一條 read 走出一條路徑。 左邊出現第三條完整的路徑,而且它跟 HP2 只差候選這一格,符合「變異從某一條既有染色體長出來」; 右邊帶 T 的 read 各走各的,沒有任何一條路徑被穩定支持。 同一個候選位置:它是真的變異,還是定序錯誤? 兩邊帶 T 的 read 都是三條 —— 數量分不出來。要看的是這些 read 的左右鄰居 ① 真的體細胞變異 三條帶 T 的 read,鄰居組合完全一樣 左鄰居 候選位置 右鄰居 A G T A G T C G A C T A C T A C T A HP2 HP2 HP2 → 它有固定的出身:長在 HP2 上 ② 定序錯誤 三條帶 T 的 read,鄰居組合各不相同 左鄰居 候選位置 右鄰居 A G T C G A A T T C T A A T A C G A HP1 HP2 → 它沒有固定的出身 把同一批 read 畫成路徑:三個位置,一條 read 走一條路 HP1 HP2 第三條路徑 A G T C T A 三條 read 走出同一條新路徑, 而它跟 HP2 只差候選這一格 —— 像是從 HP2 長出來的。 HP1 HP2 帶 T 的三條 A G T C T A 三條 read 各走各的 沒有哪一條新路徑被穩定支持 —— 這是隨機出現的訊號。
兩邊帶 T 的 read 刻意都是三條 —— 光數數量分不出真假,這正是重點。 差別在鄰居:左邊三條的鄰居都是 C 與 A,也就是三條全落在同一條染色體上;右邊三條各有各的鄰居,湊不出一致的來源。 下半部把同一批資料畫成路徑圖後更清楚:左邊多出一條完整的新路徑,而且它跟 HP2 只差候選這一格;右邊則沒有任何一條新路徑被穩定支持。

背後的理由是癌症怎麼發生的。一個體細胞變異只會發生在某一個細胞的某一條染色體上, 之後那個細胞分裂出來的後代才帶著它。所以真變異必然掛在一條既有的 haplotype 底下, 形成一條「跟母體只差一格」的新路徑。定序錯誤沒有這個身世,它落在哪條 read 上是隨機的。

為什麼要三個位置,兩個不夠?

M11 講過兩個位置之間的一條邊:它其實是四個計數(rr/ra/ar/aa), 能回答的是「這兩個位置該平行接還是交叉接」。

但這裡要問的是另一個問題:候選 allele 在左右兩側是不是都指向同一條 haplotype。 只有一個鄰居時,「跟左邊一致」很容易碰巧發生;要有左鄰居右鄰居, 才看得出「這條新路徑從頭到尾只跟某一條差一格」。所以最小單位是三個位置, 這個結構就叫

實際上一個候選點周圍不會只取一組三位點。程式會拿它左右幾個變異輪流搭配, 組出很多組三位點,每一組各自看一次、各投一票,最後看票數決定留不留。 一組看走眼不會定生死,這是把單一雜訊的影響攤掉的常見做法。

第三件事:把每個變異掛回染色體

前兩件事做完,才輪到定相本身。做法跟 M11 一樣 —— 把「同一條 read 上看到的 allele」連成一張圖,再沿著圖走出兩條 haplotype。 差別在這裡多做兩件事:somatic 變異也要一起掛上去,而且LOH 區要接得過去

定相的結果有三條軌道,以及它們怎麼寫成 VCF 的 GT、GT2、GT3 上半部是六個位置的定相結果。左邊四個位置在正常區,兩條 germline haplotype 都在; 右邊兩個位置落在 LOH 區,HP1 整段不存在,圖上畫成灰色虛線的空軌道。 第三條軌道 HP2-1 是 HP2 的體細胞後代:它跟 HP2 完全一樣,只有帶紅點的兩個位置不同。 下半部把其中三個位置的 VCF 欄位攤開來看。 一般的遺傳變異只有 GT;正常區的體細胞變異 GT 是 0 直槓 0,靠 GT2 說明它長在哪一條上; LOH 區的位置 GT 有一側寫成一個點,表示那一條 haplotype 不存在, 而 GT2 與 GT3 分別代表剩下那一條再往下分出來的兩支。 定相的結果:三條軌道,以及它們怎麼寫進 VCF 同一條 read 上看到的 allele 被連起來,就得到下面三條軌道。 正常區:兩條都在 LOH 區:只剩一條 HP1 整段不存在 HP2 HP2-1 A G A C G G T T G T G A T T A T 紅點 = 只有癌細胞才有的變異 HP2-1 跟 HP2 只差紅點那兩格 —— 它是 HP2 的後代 ① 一般的遺傳變異 GT 0|1 GT2 ./. GT3 ./. 兩條 haplotype 一邊 ref、 一邊 alt,跟癌症無關。 GT2、GT3 空著。 ② 正常區裡的體細胞變異 GT 0|0 GT2 .|1 GT3 ./. 兩條 germline 都是 ref, 所以 GT 是 0|0。 GT2 第二格是 1 = 長在 HP2 上。 ③ LOH 區裡的體細胞變異 GT 0|. GT2 1|. GT3 0|. GT 有一側是「.」,代表 那一條 haplotype 不存在。 GT2 與 GT3 是剩下那條的兩支。
三條軌道。HP1 與 HP2 是與生俱來的兩條;HP2-1 是 HP2 的體細胞後代 —— 它跟 HP2 完全一樣,只有帶紅點的位置不同,名字本身就記錄了來源。 進到 LOH 區之後 HP1 整段不存在,程式用 LOH 邊界兩側的連結判斷「留下來的是哪一條」,再讓它一路接過去。 下半部是同樣三個位置寫成 VCF 的樣子。

結果寫在 VCF 的 FORMAT 欄位,分成三層。用下面的解碼器把七種常見組合逐一看過一次:

互動練習
從下拉選單逐一檢視。最快的讀法是先看 GT 有沒有「.」—— 有就代表這裡是 LOH 區,那一側的 haplotype 不存在。
欄位回答的問題怎麼讀
GT與生俱來的兩條長什麼樣有一側是 . = 這裡是 LOH
GT2癌細胞才有的變異長在哪一條上哪一格是 1,就是長在那一條上;1|1 代表判不出來
GT3LOH 區裡,剩下那一條再往下分的第二支非 LOH 區通常用不到,寫 ./.

為什麼 LOH 區要多一層?因為那裡只剩一條 germline haplotype 可以掛, 但癌細胞在那一條上可能先後長出兩批不同的變異,屬於不同的細胞群。 只有 GT2 一格的話,這兩批會被混在一起;多一層 GT3 才分得開。

第四件事:這個樣本有多少比例是腫瘤

檢體不會是純的癌細胞,裡面一定混著正常細胞。混得多寡直接影響每個變異的訊號強度, 所以這個比例要估出來。M12 用的是 ;這裡的比值算法一樣,差別只在數的是帶 reference allele 的 read

從兩條 haplotype 的失衡程度,估計樣本裡有多少比例來自腫瘤 挑一個已經定相好的體細胞變異位置,只數「帶 reference allele」的 read。 這個變異長在 HP2 上,所以帶 alt 的 read 全是癌細胞貢獻的; 而帶 ref 的 read 有兩個來源:HP1 上的(癌細胞與正常細胞都有) 與 HP2 上的(只有正常細胞才有,因為癌細胞那一份已經變成 alt 了)。 三格由左到右是腫瘤佔兩成、六成、九成。 腫瘤越多,正常細胞越少,HP2 這一側帶 ref 的 read 就越少, 兩側的比值於是從接近 0.5 一路往 1.0 靠。 全基因體上每個體細胞變異都算一次這個比值, 再把分布的四分位數和 LOH 佔基因體的比例一起交給一條事先訓練好的迴歸式, 就得到最後那個腫瘤 DNA 比例。 怎麼從 read 看出這個樣本有多少比例是腫瘤 在一個長在 HP2 上的體細胞變異位置,只數「帶 reference allele」的 read 各有幾條。 腫瘤細胞佔 2 成 帶 ref 的 read 有幾條: HP1 10 HP2 8 10 / (10 + 8) = 0.56 兩邊差不多 腫瘤細胞佔 6 成 帶 ref 的 read 有幾條: HP1 10 HP2 4 10 / (10 + 4) = 0.71 開始偏向一邊 腫瘤細胞佔 9 成 帶 ref 的 read 有幾條: HP1 10 HP2 1 10 / (10 + 1) = 0.91 幾乎全偏到 HP1 HP2 這一側帶 ref 的 read 只有正常細胞才貢獻得出來 —— 腫瘤越多,它就越少。 全基因體每個位置都算一次,再交給一條事先訓練好的式子 所有位置的比值分布 (取它的四分位數) LOH 佔全基因體多少 (第一步就算好了) 腫瘤 DNA 比例 ##tumor_purity=0.62
挑一個長在 HP2 上的體細胞變異。帶 ref 的 read 有兩個來源:HP1 上的(癌細胞與正常細胞都給得出來) 與 HP2 上的(只有正常細胞給得出來,因為癌細胞那一份已經變成 alt 了)。 所以腫瘤越多,HP2 這一側就越薄,兩側的比值從接近 0.5 一路往 1.0 靠。

這個數字叫什麼,要小心

程式把它寫成 ##tumor_purity=,但它量到的其實是 ,不是腫瘤細胞佔的比例。

在實驗室依覆蓋度混出來的合成樣本裡,兩者恰好相等,所以平常不容易察覺差別。 但真實腫瘤如果是 或發生過全基因體加倍,一個癌細胞貢獻的 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_ssclairs_to_ssrsdeepsomatic_to,寫錯會直接報錯結束。 --pon-file 的值是一個用逗號分隔的字串,不是重複的旗標。 --strict-pon-file--pon-file 嚴格:它要求位置 ALT allele 都吻合才算命中。 --loh 不加就不會輸出 LOH 區間。

LongPhase-TO 在真實資料上訓練後的 somatic calling 效能
LongPhase-TO 的 somatic calling 結果。在此資料中,tumor-only 的絕對數值低於 tumor–normal;重點是相對於 baseline 的改善,實際差異取決於資料與評估設定。

怎麼看輸出

# 估出來的腫瘤比例寫在 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 欄位會出現 PASSLP_nonSomaticLP_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()
算雜合比例、判定 LOHClip::detectLOHRegion()(門檻就寫在這個函式裡)
建圖:節點是 allele,邊是 readVairiantGraph::addEdge()
三位點投票VairiantGraph::somaticCalling()patternMining()
定相本體VairiantGraph::phasingProcess()
估腫瘤比例PurityCalculator::getPurity()
寫出 GT / GT2 / GT3VairiantGraph::exportPhasingResult()

grep 的時候會踩到的兩件事

第一,圖的類別名稱是 VairiantGraph —— 原始碼裡就是這樣拼的, 搜 VariantGraph 會一無所獲。

第二,一個候選點會被拿去跟左右各幾個變異搭配成很多組三位點, 那個「幾個」是 --somaticConnectAdjacent(預設 6)。 它跟一般定相用的 --connectAdjacent(預設 35)是兩個不同的參數,別看錯。

實作查表:LongPhase-S 與 LongPhase-TO 的差異

在兩個工具之間切換時最容易搞混的六件事:

配對版(longphase-s)僅腫瘤版(longphase-to)
somatic haplotype 寫在哪BAM 的 HP:Z:1-1VCF FORMAT 的 GT2GT3
腫瘤比例寫在哪<prefix>_purity.out 檔案VCF 檔頭 ##tumor_purity=
指定比例的參數名--tumor-purity(0.1–1.0)--purity(0–1)
掛在哪個子命令somatic_haplotagphase
--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 的情況下會不一樣。