ゲノム解読入門:30億ピースのパズルを解く
🎯 まず、この講義で何を学ぶのか
最終ゴール:ゲノム(DNAの全配列)を解読する方法を理解する
でも、ちょっと待ってください。そもそも「ゲノムを解読する」って何でしょう?
このコースで学ぶこと
- ゲノムアセンブリ:数百万のDNA断片から完全なゲノムを再構築
- グラフ理論の応用:ケーニヒスベルクの橋問題からゲノム解読へ
- 抗生物質の配列決定:質量分析を使った配列解読
🧬 ステップ1:ヒトゲノム計画の偉大さを理解する
1-1. 30億の文字を読むということ
2003年、人類は30億ヌクレオチド(A、T、G、C)からなるヒトゲノムの配列を解読しました。
# ヒトゲノムのサイズを実感してみよう
genome_size = 3_000_000_000 # 30億塩基対
seconds_per_base = 1 # 1塩基を1秒で読むとして
reading_time_years = (genome_size * seconds_per_base) / (365 * 24 * 60 * 60)
print(f"1塩基/秒で読むと: {reading_time_years:.1f}年かかる!")
# 出力: 1塩基/秒で読むと: 95.1年かかる!
1-2. なぜゲノム解読が医療を変えるのか
- 個別化医療:個人のゲノム情報に基づく治療
- 疾患の原因解明:遺伝的要因の特定
- 新薬開発:標的分子の発見
📰 ステップ2:新聞パズル問題で理解するゲノム配列決定
2-1. 奇妙な思考実験
なぜこんな例を? → ゲノム配列決定もまったく同じ問題だから!
2-2. DNAシーケンシングの現実
# DNAシーケンシングの制約
def explain_sequencing_limitation():
"""現在の技術の限界を説明"""
# 本のように最初から最後まで読めない!
full_genome_length = 3_000_000_000 # 30億塩基
readable_fragment = 1000 # 一度に読める長さ(約1000塩基)
fragments_needed = full_genome_length // readable_fragment
print(f"必要な断片数: {fragments_needed:,}個")
print(f"各断片の長さ: {readable_fragment}塩基")
print("問題:これらの断片がゲノムのどこにあるか分からない!")
return fragments_needed
fragments = explain_sequencing_limitation()
# 出力:
# 必要な断片数: 3,000,000個
# 各断片の長さ: 1000塩基
# 問題:これらの断片がゲノムのどこにあるか分からない!
2-3. ショットガン配列決定法
核心的な洞察:重なり合う部分を手がかりに、パズルのピースをつなげる!
🌉 ステップ3:ケーニヒスベルクの橋問題との意外な関係
3-1. 18世紀の数学パズル
問題:すべての橋を1回ずつ渡って元の場所に戻れるか?
3-2. オイラーの革命的発見(1736年)
def euler_path_exists(graph):
"""オイラー路が存在するか判定"""
odd_degree_nodes = 0
for node in graph:
degree = len(graph[node]) # 接続している辺の数
if degree % 2 == 1:
odd_degree_nodes += 1
# オイラー路の存在条件
if odd_degree_nodes == 0:
return "オイラー閉路が存在(すべての辺を1回ずつ通って戻れる)"
elif odd_degree_nodes == 2:
return "オイラー路が存在(すべての辺を1回ずつ通れる)"
else:
return "オイラー路は存在しない"
# ケーニヒスベルクの橋をグラフで表現
konigsberg = {
'北岸': ['島A', '島B'],
'島A': ['北岸', '島B', '島B', '南岸'],
'島B': ['北岸', '島A', '島A', '南岸', '南岸'],
'南岸': ['島A', '島B', '島B']
}
print(euler_path_exists(konigsberg))
# 出力: オイラー路は存在しない
3-3. ゲノムアセンブリへの応用
驚くべき洞察:ゲノムアセンブリ = 巨大な都市で数百万の橋を1回ずつ渡る問題!
⚗️ ステップ4:抗生物質の配列決定という別の挑戦
4-1. 小さいけど難しい問題
def compare_sequencing_difficulty():
"""配列決定の難易度比較"""
bacterial_genome = 1_000_000 # 100万塩基
antibiotic_peptide = 10 # 10アミノ酸
print(f"細菌ゲノム: {bacterial_genome:,}塩基 → 現在は簡単")
print(f"抗生物質ペプチド: {antibiotic_peptide}アミノ酸 → なぜか難しい!")
print("\n理由:読み取り方法が全く違うから")
compare_sequencing_difficulty()
4-2. 質量分析による配列決定
核心的な問題:
- DNAシーケンシング:文字を直接読める
- ペプチドシーケンシング:重さしか分からない!
4-3. ダプトマイシンの例
# アミノ酸の質量(ダルトン)
amino_acid_mass = {
'G': 57, 'A': 71, 'S': 87, 'P': 97,
'V': 99, 'T': 101, 'C': 103, 'L': 113,
'N': 114, 'D': 115, 'K': 128, 'E': 129,
'M': 131, 'H': 137, 'F': 147, 'R': 156,
'Y': 163, 'W': 186
}
def fragment_masses(peptide):
"""ペプチドの断片質量を計算"""
masses = []
for i in range(len(peptide)):
for j in range(i+1, len(peptide)+1):
fragment = peptide[i:j]
mass = sum(amino_acid_mass[aa] for aa in fragment)
masses.append((fragment, mass))
return masses
# ダプトマイシン(簡略化した例)
daptomycin_fragment = "WNDG" # 実際はもっと長い
fragments = fragment_masses(daptomycin_fragment)
print("断片と質量:")
for frag, mass in fragments[:5]:
print(f" {frag}: {mass} Da")
🎓 ステップ5:バイオインフォマティクスという学問
5-1. 講師紹介
- Pavel Pevzner博士(UCSD)
- バイオインフォマティクスの第一人者
- 「アルゴリズムの保安官」を自称
- Phillip Compeau博士(カーネギーメロン大学)
- 若手研究者
- アクティブラーニングの提唱者
5-2. なぜコンピュータサイエンスが必要か
def why_cs_needed():
"""なぜコンピュータが必要か"""
# 人間 vs コンピュータ
human_comparison_per_second = 1
computer_comparison_per_second = 1_000_000_000
fragments = 3_000_000 # 断片数
comparisons_needed = fragments * (fragments - 1) // 2 # 総比較回数
human_time = comparisons_needed / human_comparison_per_second / (365*24*60*60)
computer_time = comparisons_needed / computer_comparison_per_second / 60
print(f"必要な比較回数: {comparisons_needed:,}")
print(f"人間がやると: {human_time:,.0f}年")
print(f"コンピュータなら: {computer_time:.1f}分")
why_cs_needed()
📝 まとめ:今日学んだことを整理
レベル1:基礎理解
- ゲノム = 30億文字のテキスト
- 一度に短い断片しか読めない
- パズルのように組み立てる必要がある
レベル2:応用理解
- ケーニヒスベルクの橋問題 = グラフ理論
- オイラー路 = ゲノムアセンブリの数学的基礎
- 質量分析 = 重さから配列を推定
レベル3:実装理解
- ショットガン法の原理
- グラフアルゴリズムの応用
- 計算量の重要性
🚀 次回予告
次回は「de Bruijnグラフ」という革命的なアルゴリズムを学びます。 これにより、数百万の断片を効率的に組み立てる方法を理解します!
練習問題
- なぜDNAを最初から最後まで読めないのか説明してください
- ケーニヒスベルクの橋問題がなぜ不可能か、奇数次数の頂点から説明してください
- 100塩基の断片が1000個ある場合、総比較回数は何回になるか計算してください
📚 参考資料
- Coursera: Genome Sequencing
- Pevzner & Compeau 「Bioinformatics Algorithms: An Active Learning Approach」
- オイラー「ケーニヒスベルクの橋について」(1736年)