如果你玩過 GarageBand、Logic Pro 或是看過音樂製作人混音,你一定知道一首歌裡面可能包含了 100 多個不同的音軌——有鼓聲、貝斯、電吉他、鋼琴,還有主唱。如果所有聲音同時炸開,你很難聽清楚鋼琴到底有沒有彈錯音。
這時候,混音師會按下 「Solo(獨奏)」 按鈕,把其他樂器通通靜音(Mute),只單獨聆聽鋼琴的軌跡。
在 DNA 數據的世界裡也是完全一樣的道理!AlphaGenome API 雖然會一口氣回傳幾千條跨器官(大腦、血液、肝臟、皮膚等)的預測波形,但如果我們只關心那名六週大癲癇嬰兒的 「大腦神經元 RNA 剪接」,我們就必須像混音師一樣,精準按下 Solo 鍵,把無關器官的數據通通過濾掉!
今天,我們就要教大家如何用 Python 篩選特定組織的波形數據,並用最簡單的「減法」算出突變帶來的破壞力——Delta Score!
在之前的癲癇案例中,我們學到了一個殘酷的經驗:致命的隱藏剪接只發生在大腦神經元中,血液裡完全測不到。

圖 | AlphaGenome 架構(來源:https://storage.googleapis.com/deepmind-media/papers/alphagenome.pdf)
當我們向 AlphaGenome API 發送查詢後,回傳的 JSON 數據包裡有一個名為 tracks(軌跡波形)的龐大陣列。這就像是一整排未經處理的音樂音軌,裡面裝滿了模型對不同組織與細胞系的預測數值。
我們的資料處理腳本必須具備「精準過濾」的能力:
tissue == 'brain'(目標器官:大腦)assay_type == 'splicing'(目標模態:RNA 剪接)把其他像血液、肝臟等無關的軌跡通通靜音,我們就能只專注看大腦神經元裡的波形變化!
拿到大腦神經元的波形後,我們會看到兩組數據陣列(一維數字串):
為了量化這個突變到底造成了多大的改變,我們不需要什麼高深的微積分,只需要做簡單的 「陣列減法」:
[\text{Delta Score} = \text{Alt (突變後波形)} - \text{Ref (突變前波形)}]
算出來的落差(Delta Score),就是這個突變帶來的 「淨破壞力」!
| 軌跡類型 | 生物學白話意義 | 數據特徵(數字會長怎樣?) | 在六週大嬰兒癲癇案例中的表現 |
|---|---|---|---|
| Reference (Ref) | 未突變前,一般人的正常生理狀態。 | 一維數字陣列,代表每個位置的訊號強度。 | 在深層內含子區域,正常剪接機率趨近於 0.00。 |
| Alternative (Alt) | 突變發生後,病患體內的預測狀態。 | 同等長度的一維數字陣列。 | 突變點附近的剪接機率異常狂飆至 0.85! |
| Delta Score (Alt - Ref) | 突變造成的「淨破壞力(Net Impact)」。 | 將兩個陣列相減得到的差值陣列。 | 算出來出現高達 +0.85 的巨型正峰值(隱藏剪接抓包)! |
extract_track_delta.py)現在,打開程式碼編輯器,建立腳本 extract_track_delta.py。我們將使用 Python 科學運算庫 NumPy,在一秒鐘之內完成數千個座標點的矩陣相減:
import os
from dotenv import load_dotenv
import alphagenome as ag
import numpy as np
# 載入隱藏設定檔中的憑證
load_dotenv()
def extract_and_calculate_delta(variant_query, target_tissue, target_assay):
client = ag.Client()
print(f"🔍 正在向 1 PB 資料庫提取 {variant_query} 的 [{target_tissue} - {target_assay}] 軌跡...")
try:
# 1. 呼叫 API 並要求帶回詳細的波形軌跡 (include_tracks=True)
response = client.get_variant_annotation(variant_query, include_tracks=True)
tracks = response.get('tracks', [])
# 2. 像混音師一樣,過濾出目標組織與模態 (例如:brain, splicing)
target_data = next((t for t in tracks if t['tissue'] == target_tissue and t['assay_type'] == target_assay), None)
if not target_data:
print(f"⚠️ 提示:在回傳資料中找不到指定組織 ({target_tissue}) 的 {target_assay} 軌跡。")
return
# 3. 轉為 NumPy 矩陣,準備進行超高速數學運算
ref_array = np.array(target_data.get('ref_signal', []))
alt_array = np.array(target_data.get('alt_signal', []))
# 4. 計算 Delta Score(突變後的淨落差矩陣)
delta_array = alt_array - ref_array
# 5. 找出落差最大的那個絕對波峰位置
max_delta_index = np.argmax(np.abs(delta_array))
max_delta_value = delta_array[max_delta_index]
# 6. 印出清楚的分析報告
print("\n" + "="*45)
print(f"🧠 目標器官 : {target_tissue} | 實驗模態 : {target_assay}")
print(f"📊 軌跡範圍 : 涵蓋周圍 {len(delta_array)} 個鹼基位置")
print(f"⚠️ 最大訊號波峰 (Max Delta) : {max_delta_value:+.4f} (發生在相對索引 {max_delta_index})")
# 臨床自動警報邏輯
if max_delta_value > 0.5:
print("🚨 警告:偵測到極強烈的正向訊號突增!極可能創造了致命的隱藏剪接點 (Cryptic Splice Site)!")
print("="*45 + "\n")
except Exception as e:
print(f"❌ 軌跡提取失敗!錯誤訊息: {e}")
if __name__ == "__main__":
# 測試查詢:第 9 號染色體的單點突變
test_query = "chr9:13345678:A:G"
# 鎖定大腦組織 (brain) 的 RNA 剪接 (splicing) 數據
extract_and_calculate_delta(test_query, target_tissue="brain", target_assay="splicing")
這段程式碼算出來的 delta_array 乾淨數據,前端工程師可以直接傳給 Recharts 或 Chart.js 圖表套件,在網頁畫面上繪製出 「紅色(突變後)vs. 藍色(正常)」 的動態對比波形圖!
在臨床情境中,一名病患的 VCF 基因檔案動輒包含幾百個候選變異,要一個個手動去點擊執行腳本是不可能的。
明天,我們將介紹程式工程裡的 「批次處理(Batch Processing)」,並實作非同步架構與 指數退避機制(Exponential Backoff),學習如何在 1 秒鐘之內穩定吞吐數百個變異查詢,還不會被 Google 伺服器當成駭客阻擋!