Skip to content

Instantly share code, notes, and snippets.

@amir-saniyan
Last active August 7, 2026 00:27
Show Gist options
  • Select an option

  • Save amir-saniyan/3d845f73270f45d91e264935e3cd936e to your computer and use it in GitHub Desktop.

Select an option

Save amir-saniyan/3d845f73270f45d91e264935e3cd936e to your computer and use it in GitHub Desktop.
Algorithms for DNA Sequencing

01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/01_module-1-introduction

مقدمه‌ای بر توالی‌یابی DNA، رشته‌ها و تطبیق الگوها

Introduction to DNA Sequencing, Strings and Matching


خلاصه کلی

در این بخش، مسیر کلی درس درباره الگوریتم‌های تحلیل داده‌های توالی‌یابی DNA (DNA Sequencing Data Analysis Algorithms) معرفی می‌شود.

هدف اصلی این ماژول، ایجاد ارتباط بین زیست‌شناسی مولکولی و علوم کامپیوتر است. ایده کلیدی این است که DNA را می‌توان به شکل یک رشته (String) نمایش داد و سپس از الگوریتم‌ها و ساختارهای داده‌ای که برای پردازش متن، فایل‌ها و صفحات وب طراحی شده‌اند، برای تحلیل اطلاعات ژنتیکی استفاده کرد.

در این ماژول دانشجو با موارد زیر آشنا می‌شود:

  • فناوری توالی‌یابی DNA و نحوه تکامل آن

  • ساختار DNA و ژنوم‌ها (Genomes)

  • نمایش ژنوم به صورت رشته‌های متنی

  • دو مسئله محاسباتی اصلی در تحلیل توالی‌یابی:

    • Read Alignment (هم‌ترازی خوانش‌ها)
    • Genome Assembly (سرهم‌بندی ژنوم)
  • الگوریتم ساده‌ی Naive Exact Matching برای پیدا کردن الگوها در رشته‌ها


مفاهیم کلیدی

1. DNA Sequencing (توالی‌یابی DNA)

تعریف ساده

DNA Sequencing فرآیندی است که ترتیب بازهای نوکلئوتیدی DNA را مشخص می‌کند.

توضیح دقیق

DNA از چهار نوع باز تشکیل شده است:

  • A → Adenine (آدنین)
  • T → Thymine (تیمین)
  • C → Cytosine (سیتوزین)
  • G → Guanine (گوانین)

فناوری‌های توالی‌یابی تلاش می‌کنند ترتیب این حروف را در DNA مشخص کنند.

برای مثال:

ATCGGTAAC

یک نمایش رشته‌ای از بخشی از DNA است.

اهمیت و کاربرد

توالی‌یابی DNA پایه بسیاری از کاربردهای زیستی است، از جمله:

  • مطالعه ژنوم انسان
  • تشخیص بیماری‌های ژنتیکی
  • بررسی جهش‌ها (Mutations)
  • تحقیقات تکاملی

2. Genome (ژنوم)

تعریف ساده

ژنوم مجموعه کامل اطلاعات ژنتیکی یک موجود زنده است.

توضیح دقیق

ژنوم شامل تمام DNA موجود در یک سلول است. از آنجا که DNA را می‌توان به صورت دنباله‌ای از حروف نمایش داد، یک ژنوم را می‌توان مانند یک متن بسیار طولانی در نظر گرفت.

مثلاً:

ACGTACGTTAGCA...

یک رشته بسیار بزرگ از حروف DNA است.

اهمیت یا کاربرد

نمایش ژنوم به شکل رشته باعث می‌شود بتوانیم از ابزارهای علوم کامپیوتر برای تحلیل آن استفاده کنیم.


3. DNA as Strings (نمایش DNA به صورت رشته)

تعریف ساده

یک رشته (String) مجموعه‌ای از کاراکترها در یک ترتیب مشخص است.

توضیح دقیق

در علوم کامپیوتر، متن‌ها، فایل‌ها و صفحات وب به صورت رشته ذخیره می‌شوند.

مثلاً:

"hello world"

یک رشته متنی است.

DNA نیز می‌تواند مانند یک رشته در نظر گرفته شود:

"ATGCGTAC"

بنابراین:

  • DNA → رشته‌ای از A,T,C,G
  • کتاب → رشته‌ای از حروف الفبا
  • فایل → رشته‌ای از داده‌ها

همه می‌توانند با الگوریتم‌های مشابه پردازش شوند.

اهمیت

این مفهوم، پایه اصلی کل دوره است؛ زیرا اجازه می‌دهد الگوریتم‌های پردازش متن را برای داده‌های ژنتیکی استفاده کنیم.


4. Computational Problems in Genome Analysis

مسائل محاسباتی اصلی در تحلیل ژنوم

در این دوره دو مسئله اصلی بررسی می‌شوند:


الف) Read Alignment (هم‌ترازی خوانش‌ها)

تعریف ساده

پیدا کردن محل قرارگیری قطعات کوتاه DNA خوانده‌شده در ژنوم مرجع.

توضیح

دستگاه‌های توالی‌یابی معمولاً کل ژنوم را یک‌باره نمی‌خوانند، بلکه قطعات کوتاهی به نام Reads تولید می‌کنند.

هدف این است که مشخص کنیم هر Read در کدام قسمت ژنوم قرار دارد.

کاربرد

  • تشخیص تغییرات ژنتیکی
  • مقایسه ژنوم افراد
  • شناسایی جهش‌ها

ب) Genome Assembly (سرهم‌بندی ژنوم)

تعریف ساده

بازسازی یک ژنوم کامل از روی قطعات کوتاه DNA.

توضیح

در بسیاری از روش‌های توالی‌یابی، اطلاعات به شکل قطعات کوچک دریافت می‌شود. مسئله Assembly این است که این قطعات را دوباره کنار هم قرار دهیم تا ژنوم کامل ساخته شود.

مانند:

قطعات:

ATGC
TGCA
GCAT

بازسازی:

ATGCAT

کاربرد

  • ساخت ژنوم موجودات جدید
  • مطالعه گونه‌های ناشناخته
  • تحقیقات زیستی

5. Algorithms and Data Structures (الگوریتم‌ها و ساختارهای داده)

تعریف ساده

روش‌های محاسباتی برای ذخیره، جستجو و پردازش اطلاعات.

توضیح

چون DNA مانند رشته نمایش داده می‌شود، می‌توان از الگوریتم‌هایی که برای رشته‌های معمولی ساخته شده‌اند استفاده کرد.

مثال:

الگوریتم‌هایی که برای:

  • جستجوی کلمات در کتاب
  • پیدا کردن فایل‌ها
  • تحلیل صفحات وب

ساخته شده‌اند، می‌توانند برای پیدا کردن الگوها در DNA نیز استفاده شوند.

اهمیت

این ارتباط بین علوم کامپیوتر و ژنتیک، اساس Bioinformatics (بیوانفورماتیک) است.


6. Naive Exact Matching Algorithm

الگوریتم تطبیق دقیق ساده

تعریف ساده

یک الگوریتم ابتدایی برای پیدا کردن یک الگو (Pattern) در یک متن (Text).

ایده اصلی

الگوریتم الگو را از ابتدای متن شروع کرده و هر موقعیت را بررسی می‌کند.

مثال:

متن:

ACGTACGT

الگو:

TAC

الگوریتم تمام موقعیت‌ها را بررسی می‌کند تا تطابق کامل پیدا کند.

ویژگی‌ها

مزایا:

  • ساده
  • قابل فهم
  • انعطاف‌پذیر

معایب:

  • سرعت پایین برای داده‌های بسیار بزرگ

کاربرد

این الگوریتم نقطه شروع برای یادگیری روش‌های سریع‌تر تطبیق رشته‌ها است.


نکات مهم

  • DNA را می‌توان مانند یک رشته متنی (String) نمایش داد.

  • این نمایش باعث می‌شود الگوریتم‌های علوم کامپیوتر روی داده‌های ژنتیکی قابل استفاده باشند.

  • کل دوره بر دو مسئله اصلی تمرکز دارد:

    1. Read Alignment
    2. Genome Assembly
  • داده‌های واقعی ژنوم و توالی‌یابی در تمرین‌های عملی استفاده خواهند شد.

  • دانشجو با فرمت‌های فایل رایج در داده‌های ژنتیکی کار خواهد کرد.

  • الگوریتم Naive Exact Matching یک روش ساده برای جستجوی الگو در رشته است.

  • الگوریتم‌های پیشرفته‌تر در ماژول‌های بعدی معرفی می‌شوند.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
DNA Sequencing توالی‌یابی DNA تعیین ترتیب بازهای DNA
Genome ژنوم مجموعه کامل اطلاعات ژنتیکی یک موجود
String رشته دنباله‌ای از کاراکترها در علوم کامپیوتر
Algorithm الگوریتم مجموعه‌ای از مراحل برای حل یک مسئله
Data Structure ساختار داده روش سازمان‌دهی و ذخیره داده‌ها
Bioinformatics بیوانفورماتیک ترکیب زیست‌شناسی، علوم کامپیوتر و تحلیل داده
Read خوانش DNA قطعه کوتاهی از DNA که توسط دستگاه توالی‌یابی خوانده شده است
Read Alignment هم‌ترازی خوانش‌ها یافتن محل Readها در ژنوم
Genome Assembly سرهم‌بندی ژنوم بازسازی ژنوم از قطعات DNA
Pattern Matching تطبیق الگو پیدا کردن یک رشته کوچک‌تر داخل یک رشته بزرگ‌تر
Naive Exact Matching تطبیق دقیق ساده الگوریتم ابتدایی برای جستجوی الگو

مثال‌ها و تشبیه‌ها

تشبیه DNA به کتاب

مدرس توضیح می‌دهد که DNA را می‌توان مانند یک کتاب بسیار بزرگ در نظر گرفت:

  • کتاب از حروف ساخته شده است.
  • DNA از چهار حرف A,T,C,G ساخته شده است.

همان‌طور که می‌توان در یک کتاب دنبال یک کلمه خاص گشت، می‌توان در DNA نیز دنبال یک الگوی خاص گشت.


تشبیه Genome Assembly

فرض کنید یک کتاب بزرگ را خرد کرده‌ایم و فقط صفحات یا تکه‌هایی از آن را داریم.

وظیفه ما این است که:

  1. قطعات را بررسی کنیم.
  2. بخش‌های مشترک را پیدا کنیم.
  3. کتاب اصلی را بازسازی کنیم.

این همان کاری است که در Genome Assembly انجام می‌شود.


خلاصه نهایی مرور سریع

  • DNA را می‌توان به صورت یک رشته از چهار کاراکتر A,T,C,G نمایش داد.

  • تبدیل DNA به String امکان استفاده از الگوریتم‌های علوم کامپیوتر را فراهم می‌کند.

  • بیوانفورماتیک از ترکیب زیست‌شناسی و علوم کامپیوتر ایجاد شده است.

  • توالی‌یابی DNA اطلاعات مربوط به ترتیب بازهای DNA را تولید می‌کند.

  • دو مسئله اصلی این دوره:

    • Read Alignment
    • Genome Assembly
  • Read Alignment محل قطعات DNA را در ژنوم پیدا می‌کند.

  • Genome Assembly ژنوم کامل را از قطعات کوچک بازسازی می‌کند.

  • الگوریتم‌ها و ساختارهای داده نقش اصلی در تحلیل داده‌های ژنومی دارند.

  • Naive Exact Matching ساده‌ترین روش برای یافتن الگو در رشته‌ها است.

  • روش‌های سریع‌تر و پیشرفته‌تر در ماژول‌های بعدی بررسی خواهند شد.


سوالات مرور

1. سوال مفهومی:

چرا نمایش DNA به صورت String اهمیت زیادی دارد؟

پاسخ: زیرا اجازه می‌دهد الگوریتم‌های موجود در علوم کامپیوتر که برای پردازش رشته‌ها طراحی شده‌اند، برای تحلیل داده‌های ژنتیکی نیز استفاده شوند.


2. سوال تعریفی:

Genome Assembly چیست؟

پاسخ: فرآیندی است که در آن قطعات کوتاه DNA حاصل از توالی‌یابی کنار هم قرار داده می‌شوند تا ژنوم کامل بازسازی شود.


3. سوال کاربردی:

اگر یک دستگاه توالی‌یابی میلیون‌ها قطعه کوتاه DNA تولید کند، کدام مسئله محاسباتی باید حل شود؟

پاسخ: باید مسئله Genome Assembly یا Read Alignment حل شود، بسته به اینکه هدف بازسازی ژنوم یا پیدا کردن محل قطعات در ژنوم مرجع باشد.


4. سوال مفهومی:

چرا الگوریتم Naive Exact Matching برای داده‌های بزرگ مناسب نیست؟

پاسخ: زیرا تمام موقعیت‌های ممکن را بررسی می‌کند و برای رشته‌های بسیار بزرگ سرعت پایینی دارد.


5. سوال تعریفی:

Read در داده‌های توالی‌یابی DNA به چه معناست؟

پاسخ: یک قطعه کوتاه DNA است که دستگاه توالی‌یابی آن را خوانده و به صورت رشته‌ای از حروف A,T,C,G ذخیره کرده است.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/02_lecture-why-study-this

چرا باید ژنومیک محاسباتی را مطالعه کنیم؟

Why Study Computational Genomics?


خلاصه کلی

این درس به بررسی ارتباط میان علوم کامپیوتر (Computer Science) و علوم زیستی (Life Science)، به‌خصوص در زمینه تحلیل داده‌های توالی‌یابی DNA (DNA Sequencing) می‌پردازد.

امروزه فناوری توالی‌یابی DNA بسیار ارزان‌تر، سریع‌تر و دقیق‌تر شده است و حجم عظیمی از داده‌های ژنتیکی تولید می‌کند. این داده‌ها در بسیاری از حوزه‌ها مانند پزشکی، تکامل، مطالعه میکروبیوم و تحقیقات پایه زیست‌شناسی استفاده می‌شوند.

برای تحلیل این حجم عظیم از داده‌ها، به الگوریتم‌ها و روش‌های محاسباتی نیاز داریم. مطالعه ژنومیک محاسباتی (Computational Genomics) کمک می‌کند:

  • بفهمیم الگوریتم‌های موجود چه توانایی‌هایی دارند.
  • محدودیت‌ها و نقاط شکست آن‌ها را بشناسیم.
  • روش‌های بهتر و سریع‌تر برای تحلیل داده‌های ژنتیکی طراحی کنیم.

مفاهیم کلیدی


1. DNA Sequencing (توالی‌یابی DNA)

تعریف ساده

فرآیندی برای تعیین ترتیب بازهای DNA و تبدیل اطلاعات ژنتیکی به داده‌های قابل تحلیل.

توضیح دقیق

فناوری‌های جدید توالی‌یابی قادر هستند مقدار بسیار زیادی داده ژنتیکی را با سرعت بالا تولید کنند.

کاهش هزینه و افزایش کیفیت توالی‌یابی باعث شده است که این فناوری به یک ابزار عمومی در علوم زیستی تبدیل شود.

کاربردها

1. مطالعه بیماری‌های ژنتیکی نادر

دانشمندان با بررسی ژنوم کودکان مبتلا به بیماری‌های نادر می‌توانند تغییرات ژنتیکی مرتبط با بیماری را پیدا کنند.


2. مطالعه تاریخ انسان و تکامل

با توالی‌یابی DNA انسان‌های باستانی می‌توان درباره:

  • منشأ انسان
  • مسیرهای مهاجرت جمعیت‌ها
  • تغییرات تکاملی

اطلاعات به دست آورد.


3. پزشکی شخصی و سرطان

توالی‌یابی ژنوم تومورها کمک می‌کند:

  • ویژگی‌های ژنتیکی سرطان مشخص شود.
  • درمان مناسب‌تر برای هر بیمار انتخاب شود.

4. مطالعه میکروبیوم (Microbiome)

بدن انسان، مخصوصاً روده، میزبان تعداد بسیار زیادی میکروب است.

توالی‌یابی به دانشمندان کمک می‌کند نقش این میکروب‌ها را در مواردی مانند:

  • هضم غذا
  • سلامت بدن
  • بیماری‌ها

بررسی کنند.


5. شناخت عملکرد ژنوم

توالی‌یابی برای پاسخ به پرسش‌های بنیادی نیز استفاده می‌شود:

  • ژنوم چگونه کار می‌کند؟
  • بخش‌های مختلف DNA چه نقشی دارند؟
  • تمام DNA موجود در سلول چه کاری انجام می‌دهد؟

2. Computational Genomics (ژنومیک محاسباتی)

تعریف ساده

حوزه‌ای میان علوم کامپیوتر و زیست‌شناسی که از الگوریتم‌ها و روش‌های محاسباتی برای تحلیل داده‌های ژنومی استفاده می‌کند.

توضیح دقیق

داده‌های توالی‌یابی DNA بسیار بزرگ هستند و روش‌های دستی برای تحلیل آن‌ها امکان‌پذیر نیست.

بنابراین نیاز داریم از:

  • الگوریتم‌ها (Algorithms)
  • ساختارهای داده (Data Structures)
  • روش‌های پردازش داده

برای استخراج اطلاعات از ژنوم استفاده کنیم.

اهمیت

مطالعه الگوریتم‌های ژنومیک به ما کمک می‌کند بدانیم:

  • چه مسئله‌ای قابل حل است.
  • چه روشی در عمل کارایی دارد.
  • چه محدودیت‌هایی وجود دارد.

3. Importance of Understanding Algorithms

اهمیت درک الگوریتم‌ها

تعریف ساده

دانستن الگوریتم‌ها به ما نشان می‌دهد یک روش محاسباتی چه کاری می‌تواند انجام دهد و در چه شرایطی شکست می‌خورد.

توضیح دقیق

یک مثال تاریخی، پروژه تعیین توالی ژنوم انسان است.

در اواخر دهه ۱۹۹۰ دو گروه علمی به صورت هم‌زمان تلاش کردند ژنوم انسان را تعیین توالی کنند.

یکی از اختلاف‌های اصلی آن‌ها مربوط به یک مسئله محاسباتی مهم بود:

de novo shotgun assembly problem

یک گروه معتقد بود این مسئله در عمل قابل حل نیست.

گروه دیگر معتقد بود:

  • مسئله سخت است،
  • اما با استفاده از کامپیوترهای قدرتمند می‌توان آن را حل کرد.

در نهایت دیدگاه گروه دوم درست بود و حل موفقیت‌آمیز این مسئله محاسباتی باعث شد آن‌ها بتوانند سریع‌تر به هدف خود یعنی مونتاژ ژنوم انسان برسند.

نتیجه مهم

درک الگوریتم‌ها مشخص می‌کند:

  • چه چیزی امکان‌پذیر است.
  • چه چیزی عملی است.
  • چه منابع محاسباتی مورد نیاز است.

4. De Novo Shotgun Assembly Problem

مسئله مونتاژ شاتگان از ابتدا

تعریف ساده

بازسازی یک ژنوم کامل بدون داشتن ژنوم مرجع، با استفاده از قطعات کوتاه DNA.

توضیح

در روش Shotgun Sequencing، ژنوم ابتدا به قطعات کوچک تقسیم می‌شود.

سپس:

  1. قطعات توالی‌یابی می‌شوند.
  2. الگوریتم‌ها ارتباط بین قطعات را پیدا می‌کنند.
  3. ژنوم کامل بازسازی می‌شود.

این کار از نظر محاسباتی بسیار پیچیده است.

اهمیت

حل این مسئله یکی از عوامل کلیدی موفقیت در پروژه ژنوم انسان بود.


5. Algorithm Research in Genomics

پژوهش الگوریتمی در ژنومیک

تعریف ساده

تلاش علمی برای طراحی روش‌های بهتر جهت تحلیل داده‌های ژنتیکی.

توضیح

ژنومیک محاسباتی یک حوزه فعال تحقیقاتی است که در:

  • دانشگاه‌ها
  • شرکت‌های فناوری
  • آزمایشگاه‌های تحقیقاتی

در سراسر جهان دنبال می‌شود.

هدف اصلی:

  • تحلیل سریع‌تر داده‌های بزرگ DNA
  • توسعه روش‌های دقیق‌تر
  • حل مسائل پیچیده‌تر ژنومی

است.


6. کاربرد گسترده الگوریتم‌ها خارج از ژنومیک

توضیح

الگوریتم‌ها و ساختارهای داده‌ای که در ژنومیک استفاده می‌شوند، محدود به زیست‌شناسی نیستند.

همین روش‌ها در حوزه‌هایی مانند:

  • Information Retrieval (بازیابی اطلاعات)
  • Natural Language Processing (پردازش زبان طبیعی)
  • تحلیل متن‌های بسیار بزرگ

نیز کاربرد دارند.

زیرا DNA نیز در نهایت مانند یک متن بسیار بزرگ از کاراکترها قابل پردازش است.


نکات مهم

  • کاهش هزینه توالی‌یابی DNA باعث گسترش استفاده از آن در علوم زیستی شده است.
  • امروزه تقریباً تمام پروژه‌های بزرگ ژنومیک به متخصصان علوم کامپیوتر نیاز دارند.
  • حجم داده‌های ژنتیکی آن‌قدر زیاد است که بدون الگوریتم‌ها قابل تحلیل نیست.
  • فهم الگوریتم‌ها به ما کمک می‌کند محدودیت‌های روش‌های موجود را بشناسیم.
  • حل مسائل محاسباتی پیچیده می‌تواند مسیر تحقیقات زیستی را تغییر دهد.
  • ژنومیک محاسباتی یکی از حوزه‌های فعال و رو به رشد پژوهشی است.
  • بسیاری از الگوریتم‌های مورد استفاده در ژنومیک، در سایر حوزه‌های پردازش داده نیز کاربرد دارند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
DNA Sequencing توالی‌یابی DNA تعیین ترتیب بازهای DNA
Computational Genomics ژنومیک محاسباتی استفاده از روش‌های محاسباتی برای تحلیل ژنوم
Life Science علوم زیستی حوزه‌های علمی مرتبط با موجودات زنده
Genome ژنوم کل اطلاعات ژنتیکی یک موجود
Algorithm الگوریتم روش مرحله‌به‌مرحله برای حل مسئله
Data Structure ساختار داده روش سازمان‌دهی داده‌ها برای پردازش بهتر
De Novo Assembly مونتاژ از ابتدا بازسازی ژنوم بدون ژنوم مرجع
Shotgun Sequencing توالی‌یابی شاتگان تقسیم ژنوم به قطعات کوچک و توالی‌یابی آن‌ها
Genome Assembly سرهم‌بندی ژنوم کنار هم قرار دادن قطعات DNA برای ساخت ژنوم
Microbiome میکروبیوم مجموعه میکروارگانیسم‌های موجود در یک محیط مانند روده
Information Retrieval بازیابی اطلاعات جستجو و استخراج اطلاعات از حجم زیادی داده
Natural Language Processing پردازش زبان طبیعی تحلیل زبان انسانی با روش‌های محاسباتی

مثال‌ها و تشبیه‌ها

تشبیه توالی‌یابی DNA به فناوری کامپیوتر

مدرس اشاره می‌کند که توالی‌یابی DNA امروزه شبیه کامپیوتر شده است.

زمانی که کامپیوترها گران و محدود بودند، کاربردهای کمی داشتند؛ اما پس از ارزان و قدرتمند شدن، در تقریباً همه زمینه‌ها استفاده شدند.

همین اتفاق برای توالی‌یابی DNA رخ داده است:

  • هزینه کمتر شده.
  • سرعت افزایش یافته.
  • کاربردهای جدید دائماً کشف می‌شوند.

مثال پروژه ژنوم انسان

دو گروه علمی تلاش کردند ژنوم انسان را تعیین کنند.

اختلاف اصلی آن‌ها درباره امکان حل یک مشکل محاسباتی پیچیده بود.

این مثال نشان می‌دهد که:

توانایی حل مسائل زیستی بزرگ، به پیشرفت الگوریتم‌های محاسباتی وابسته است.


خلاصه نهایی مرور سریع

  • توالی‌یابی DNA به دلیل کاهش هزینه و افزایش سرعت، به ابزاری اصلی در علوم زیستی تبدیل شده است.
  • داده‌های ژنومی در پزشکی، تکامل، سرطان و مطالعه میکروب‌ها کاربرد دارند.
  • ژنومیک محاسباتی ترکیب علوم کامپیوتر و زیست‌شناسی برای تحلیل داده‌های ژنتیکی است.
  • الگوریتم‌ها مشخص می‌کنند چه مسائل ژنومی قابل حل و عملی هستند.
  • پروژه ژنوم انسان نشان داد حل مسائل محاسباتی می‌تواند عامل موفقیت تحقیقات زیستی باشد.
  • De novo shotgun assembly یکی از مسائل مهم محاسباتی در مونتاژ ژنوم است.
  • پژوهش در الگوریتم‌های ژنومی همچنان یک حوزه فعال جهانی است.
  • متخصصان علوم کامپیوتر نقش مهمی در پروژه‌های ژنومیک دارند.
  • الگوریتم‌های ژنومیک در خارج از زیست‌شناسی نیز کاربرد دارند.
  • تحلیل DNA شباهت زیادی به پردازش متن‌های بسیار بزرگ دارد.

سوالات مرور

1. سوال مفهومی:

چرا توالی‌یابی DNA امروزه اهمیت زیادی پیدا کرده است؟

پاسخ: زیرا فناوری توالی‌یابی ارزان‌تر، سریع‌تر و دقیق‌تر شده و امکان تولید حجم عظیمی از داده‌های ژنتیکی را فراهم کرده است.


2. سوال تعریفی:

Computational Genomics چیست؟

پاسخ: حوزه‌ای است که از الگوریتم‌ها و روش‌های محاسباتی برای تحلیل داده‌های ژنومی استفاده می‌کند.


3. سوال کاربردی:

چگونه توالی‌یابی DNA می‌تواند به درمان سرطان کمک کند؟

پاسخ: با بررسی ژنوم تومور، تغییرات ژنتیکی سرطان مشخص می‌شود و می‌توان درمان مناسب‌تری برای بیمار انتخاب کرد.


4. سوال مفهومی:

چرا شناخت الگوریتم‌ها برای دانشمندان ژنومیک مهم است؟

پاسخ: زیرا کمک می‌کند بدانند یک روش چه توانایی‌ها و محدودیت‌هایی دارد و آیا برای حل یک مسئله واقعی مناسب است یا خیر.


5. سوال تعریفی:

De novo shotgun assembly problem چیست؟

پاسخ: مسئله بازسازی یک ژنوم کامل از قطعات کوتاه DNA بدون استفاده از یک ژنوم مرجع است.


6. سوال کاربردی:

چرا الگوریتم‌های ژنومیک می‌توانند در پردازش زبان طبیعی نیز کاربرد داشته باشند؟

پاسخ: زیرا DNA مانند متن از رشته‌ای از کاراکترها تشکیل شده و بسیاری از مسائل آن مشابه جستجو و پردازش رشته‌های متنی هستند.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/03_lecture-dna-sequencing-past-and-present

تاریخچه و تکامل فناوری توالی‌یابی DNA

DNA Sequencing: Past and Present


خلاصه کلی

فناوری توالی‌یابی DNA (DNA Sequencing) یکی از مهم‌ترین ابزارهای زیست‌شناسی مدرن است که امکان خواندن اطلاعات ژنتیکی موجود در DNA را فراهم می‌کند.

توسعه این فناوری با معرفی روش Chain Termination Method توسط Fred Sanger در دهه ۱۹۷۰ آغاز شد. این روش که به Sanger Sequencing یا First Generation Sequencing معروف است، برای سال‌ها روش اصلی توالی‌یابی DNA بود و نقش مهمی در پروژه‌هایی مانند Human Genome Project داشت.

پس از پایان پروژه ژنوم انسان، نسل جدیدی از فناوری‌های توالی‌یابی ظهور کردند که با نام‌هایی مانند:

  • Next-Generation Sequencing (NGS)
  • Second-Generation Sequencing
  • Massively Parallel Sequencing

شناخته می‌شوند.

این فناوری‌ها با امکان خواندن میلیون‌ها یا میلیاردها مولکول DNA به‌صورت هم‌زمان، باعث کاهش شدید هزینه، افزایش سرعت و گسترش استفاده از توالی‌یابی در علوم زیستی و پزشکی شدند.


مفاهیم کلیدی


1. Sanger Sequencing (توالی‌یابی سنگر)

تعریف ساده

اولین روش عملی و گسترده برای تعیین ترتیب بازهای DNA که توسط Fred Sanger و همکارانش در دهه ۱۹۷۰ توسعه یافت.

توضیح دقیق

روش Chain Termination اساس تکنیک Sanger Sequencing است.

ایده اصلی این روش:

  • DNA در حال تکثیر قرار می‌گیرد.
  • در فرآیند ساخت رشته جدید، گاهی نوکلئوتیدهای خاصی وارد می‌شوند که باعث توقف ادامه زنجیره DNA می‌شوند.
  • با بررسی طول قطعات ایجادشده، ترتیب بازهای DNA مشخص می‌شود.

در ابتدا این روش:

  • نیازمند دخالت دستی انسان بود.
  • زمان‌بر و پرهزینه بود.

اما در طول سال‌ها:

  • فرآیندها خودکار شدند.
  • دستگاه‌های تجاری توالی‌یابی ساخته شدند.
  • سرعت و دقت افزایش یافت.

اهمیت و کاربرد

Sanger Sequencing:

  • پایه اصلی توالی‌یابی مدرن شد.
  • روش غالب در پروژه ژنوم انسان بود.
  • باعث شد Fred Sanger جایزه نوبل شیمی دریافت کند.

2. First Generation Sequencing

نسل اول توالی‌یابی

تعریف ساده

نامی برای فناوری‌های اولیه توالی‌یابی DNA که مهم‌ترین نمونه آن Sanger Sequencing است.

توضیح دقیق

در پروژه Human Genome Project از صدها دستگاه توالی‌یابی نسل اول استفاده شد.

این فناوری امکان تعیین توالی ژنوم انسان را فراهم کرد، اما محدودیت‌هایی داشت:

  • سرعت پایین‌تر
  • هزینه بالا
  • ظرفیت محدود تولید داده

اهمیت

اگرچه نسل اول محدودیت داشت، اما پایه‌ای برای توسعه فناوری‌های سریع‌تر بعدی شد.


3. Human Genome Project (پروژه ژنوم انسان)

تعریف ساده

یک پروژه علمی بزرگ برای تعیین توالی کامل ژنوم انسان.

توضیح دقیق

پروژه ژنوم انسان یکی از بزرگ‌ترین پروژه‌های زیستی تاریخ بود.

فناوری توالی‌یابی نقش اساسی در موفقیت آن داشت.

همچنین رقابت میان دو گروه تحقیقاتی برای تکمیل سریع‌تر ژنوم انسان، تا حد زیادی به تفاوت در روش‌های محاسباتی و فناوری توالی‌یابی مرتبط بود.

اهمیت

این پروژه نشان داد که:

  • فناوری توالی‌یابی می‌تواند پروژه‌های عظیم زیستی را ممکن کند.
  • توسعه روش‌های محاسباتی برای تحلیل داده‌های ژنتیکی ضروری است.

4. Next-Generation Sequencing (NGS)

توالی‌یابی نسل جدید

تعریف ساده

نسل جدید فناوری‌های توالی‌یابی که امکان خواندن تعداد بسیار زیادی مولکول DNA به‌صورت هم‌زمان را فراهم می‌کنند.

توضیح دقیق

حدود سال ۲۰۰۷، فناوری جدیدی وارد آزمایشگاه‌های زیستی شد که تحول بزرگی در توالی‌یابی ایجاد کرد.

این فناوری به دلیل توانایی انجام:

Massively Parallel Sequencing

شناخته می‌شود.

یعنی:

به جای خواندن تعداد محدودی DNA در هر بار، میلیون‌ها یا حتی میلیاردها مولکول DNA می‌توانند هم‌زمان توالی‌یابی شوند.

اهمیت و کاربرد

NGS باعث شد:

  • هزینه توالی‌یابی کاهش چشمگیری پیدا کند.
  • سرعت تولید داده افزایش یابد.
  • مطالعات ژنومی در مقیاس بسیار بزرگ امکان‌پذیر شود.

5. Massively Parallel Sequencing

توالی‌یابی موازی گسترده

تعریف ساده

روشی که در آن تعداد بسیار زیادی مولکول DNA به طور هم‌زمان توالی‌یابی می‌شوند.

توضیح دقیق

دلیل اصلی ارزان شدن توالی‌یابی در نسل جدید، امکان انجام تعداد بسیار زیادی واکنش توالی‌یابی در یک زمان است.

در روش‌های قدیمی:

  • یک یا چند توالی محدود بررسی می‌شد.

در روش‌های جدید:

  • میلیون‌ها تا میلیاردها قطعه DNA هم‌زمان بررسی می‌شوند.

اهمیت

این قابلیت باعث تولید حجم عظیمی از داده‌های ژنومی شده است.


6. Growth of Sequencing Technology

رشد فناوری توالی‌یابی

توضیح

پس از پروژه ژنوم انسان، هزینه توالی‌یابی DNA به شدت کاهش یافت.

در نمودارهای مربوط به هزینه توالی‌یابی:

  • محور افقی: سال‌های پس از ۲۰۰۱
  • محور عمودی: هزینه تعیین توالی یک ژنوم انسانی

هزینه به صورت Logarithmic Scale (مقیاس لگاریتمی) نمایش داده می‌شود.

در این مقیاس، هر فاصله نشان‌دهنده افزایش یا کاهش ده‌برابری است.

حدود سال ۲۰۰۷ کاهش چشمگیر هزینه مشاهده می‌شود که هم‌زمان با ظهور فناوری‌های نسل جدید است.


7. Sequencing Data Explosion

انفجار داده‌های توالی‌یابی

تعریف ساده

افزایش بسیار زیاد حجم داده‌های تولیدشده توسط دستگاه‌های توالی‌یابی.

توضیح دقیق

نسل جدید دستگاه‌های توالی‌یابی در سراسر جهان مستقر شده‌اند و سالانه حجم عظیمی از داده تولید می‌کنند.

این داده‌ها در مقیاس:

Petabytes (پتابایت)

اندازه‌گیری می‌شوند.

هر پتابایت برابر است با:

[ 10^{15} ]

بایت داده.

اهمیت

این حجم داده نیازمند:

  • الگوریتم‌های قدرتمند
  • روش‌های ذخیره‌سازی
  • ابزارهای تحلیل محاسباتی

است.


نکات مهم

  • Sanger Sequencing اولین روش موفق و عملی برای توالی‌یابی DNA بود.
  • Fred Sanger به دلیل توسعه این روش جایزه نوبل شیمی دریافت کرد.
  • پروژه ژنوم انسان با استفاده گسترده از دستگاه‌های نسل اول انجام شد.
  • حدود سال ۲۰۰۷ فناوری Next-Generation Sequencing وارد استفاده گسترده شد.
  • دلیل اصلی کاهش هزینه در NGS، توانایی توالی‌یابی موازی میلیون‌ها مولکول DNA است.
  • افزایش سرعت، دقت و سهولت استفاده نیز مانند کاهش هزینه اهمیت داشت.
  • دستگاه‌های مدرن توالی‌یابی امروزه حجم عظیمی از داده تولید می‌کنند.
  • تحلیل این داده‌ها بدون الگوریتم‌ها و روش‌های محاسباتی امکان‌پذیر نیست.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
DNA Sequencing توالی‌یابی DNA تعیین ترتیب بازهای موجود در DNA
Chain Termination Method روش پایان‌دهی زنجیره روش مبتنی بر توقف کنترل‌شده ساخت DNA
Sanger Sequencing توالی‌یابی سنگر روش نسل اول توالی‌یابی DNA
First Generation Sequencing توالی‌یابی نسل اول فناوری‌های اولیه توالی‌یابی
Human Genome Project پروژه ژنوم انسان پروژه تعیین توالی کامل ژنوم انسان
Next-Generation Sequencing (NGS) توالی‌یابی نسل جدید فناوری‌های سریع و پرظرفیت توالی‌یابی
Second Generation Sequencing توالی‌یابی نسل دوم نام دیگر برخی فناوری‌های NGS
Massively Parallel Sequencing توالی‌یابی موازی گسترده توالی‌یابی میلیون‌ها DNA به‌صورت هم‌زمان
Sequencer دستگاه توالی‌یاب دستگاهی که ترتیب DNA را تعیین می‌کند
Logarithmic Scale مقیاس لگاریتمی مقیاسی که تغییرات ده‌برابری را نشان می‌دهد
Petabyte پتابایت واحد بسیار بزرگ اندازه‌گیری داده
Nucleic Acids اسیدهای نوکلئیک DNA و RNA

مثال‌ها و تشبیه‌ها

تشبیه فناوری توالی‌یابی به کارخانه تولید اطلاعات

در روش‌های قدیمی مانند Sanger Sequencing، توالی‌یابی مانند یک کارخانه کوچک بود که هر بار تعداد محدودی محصول تولید می‌کرد.

اما NGS مانند یک کارخانه عظیم و خودکار است که:

  • میلیون‌ها فرآیند را هم‌زمان انجام می‌دهد.
  • حجم بسیار زیادی محصول (داده ژنتیکی) تولید می‌کند.
  • هزینه تولید هر واحد را کاهش می‌دهد.

خلاصه نهایی مرور سریع

  • Sanger Sequencing اولین روش عملی توالی‌یابی DNA بود.
  • روش Chain Termination پایه فناوری Sanger است.
  • پروژه ژنوم انسان با استفاده از صدها دستگاه نسل اول انجام شد.
  • پس از سال ۲۰۰۷، فناوری Next-Generation Sequencing تحول بزرگی ایجاد کرد.
  • NGS با Massively Parallel Sequencing میلیون‌ها DNA را هم‌زمان بررسی می‌کند.
  • کاهش هزینه تنها یکی از مزایای نسل جدید توالی‌یابی است.
  • سرعت، دقت و سهولت استفاده نیز بهبود یافتند.
  • دستگاه‌های توالی‌یابی مدرن هزاران نمونه داده ژنتیکی تولید می‌کنند.
  • حجم داده‌های ژنومی امروزه به مقیاس پتابایت رسیده است.
  • تحلیل این داده‌ها نیازمند الگوریتم‌ها و ژنومیک محاسباتی است.

سوالات مرور

1. سوال تعریفی:

Sanger Sequencing چیست؟

پاسخ: یک روش نسل اول توالی‌یابی DNA است که بر اساس روش Chain Termination برای تعیین ترتیب بازهای DNA طراحی شده است.


2. سوال مفهومی:

چرا فناوری NGS باعث کاهش شدید هزینه توالی‌یابی شد؟

پاسخ: زیرا امکان توالی‌یابی میلیون‌ها یا میلیاردها مولکول DNA را به صورت موازی فراهم کرد و هزینه هر توالی کاهش یافت.


3. سوال کاربردی:

اگر بخواهیم ژنوم هزاران فرد را بررسی کنیم، چرا NGS مناسب‌تر از Sanger Sequencing است؟

پاسخ: زیرا NGS سرعت و ظرفیت بسیار بالاتری دارد و می‌تواند حجم عظیمی از داده را در زمان کوتاه تولید کند.


4. سوال مفهومی:

چه رابطه‌ای بین افزایش توانایی توالی‌یابی و نیاز به علوم کامپیوتر وجود دارد؟

پاسخ: هرچه دستگاه‌های توالی‌یابی داده بیشتری تولید کنند، نیاز به الگوریتم‌ها و روش‌های محاسباتی برای ذخیره، پردازش و تحلیل این داده‌ها بیشتر می‌شود.


5. سوال تعریفی:

Massively Parallel Sequencing به چه معناست؟

پاسخ: یعنی انجام تعداد بسیار زیادی فرآیند توالی‌یابی DNA به صورت هم‌زمان، که باعث افزایش سرعت و کاهش هزینه می‌شود.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/04_lecture-genomes-as-strings-reads-as-substrings

ژنوم‌ها به‌عنوان رشته‌ها و خوانش‌های DNA به‌عنوان زیررشته‌ها

Genomes as Strings & Reads as Substrings


خلاصه کلی

در این درس، مفهوم مهمی معرفی می‌شود که پایه اصلی تحلیل محاسباتی DNA است:

ژنوم (Genome) را می‌توان مانند یک رشته (String) بسیار طولانی از کاراکترها نمایش داد.

از آنجا که DNA از چهار نوع باز تشکیل شده است، می‌توان اطلاعات ژنتیکی را به صورت دنباله‌ای از چهار حرف:

  • A
  • C
  • G
  • T

نمایش داد.

این دیدگاه اهمیت بسیار زیادی دارد، زیرا اجازه می‌دهد روش‌ها و الگوریتم‌های علوم کامپیوتر که برای پردازش رشته‌ها طراحی شده‌اند، برای تحلیل داده‌های ژنومی نیز استفاده شوند.

در ادامه توضیح داده می‌شود که دستگاه‌های توالی‌یابی DNA چگونه به جای خواندن کل ژنوم، قطعات کوتاه DNA به نام Reads تولید می‌کنند و چگونه این قطعات برای مطالعه ژنوم استفاده می‌شوند.


مفاهیم کلیدی


1. Genome (ژنوم)

تعریف ساده

ژنوم مجموعه کامل اطلاعات ژنتیکی یک موجود زنده است.

توضیح دقیق

ژنوم شامل تمام دستورالعمل‌های لازم برای ساخت و نگهداری بدن است.

می‌توان ژنوم را مانند یک کتاب دستور آشپزی (Recipe Book) تصور کرد:

  • هر دستور غذا مانند یک ژن (Gene) است.
  • هر دستور، اطلاعات لازم برای ساخت یک مولکول خاص در بدن را دارد.
  • مجموعه تمام این دستورها، ژنوم را تشکیل می‌دهد.

البته این کتاب با زبان معمولی نوشته نشده است؛ بلکه با الفبای خاص DNA نوشته شده است.

اهمیت

نمایش ژنوم به صورت یک رشته، امکان استفاده از ابزارهای محاسباتی برای تحلیل آن را فراهم می‌کند.


2. DNA Alphabet (الفبای DNA)

تعریف ساده

مجموعه چهار حرفی که برای نمایش اطلاعات ژنتیکی استفاده می‌شود.

توضیح دقیق

DNA از چهار نوع باز (Base) تشکیل شده است:

حرف نام باز
A Adenine (آدنین)
C Cytosine (سیتوزین)
G Guanine (گوانین)
T Thymine (تیمین)

هر مولکول DNA مانند یک رشته نوشته‌شده با این چهار حرف است.

مثال:

ACGTTGCA

یک قطعه DNA را نمایش می‌دهد.


3. DNA Double Helix (مارپیچ دوگانه DNA)

تعریف ساده

ساختار سه‌بعدی DNA که شبیه یک نردبان پیچ‌خورده است.

توضیح دقیق

DNA از دو رشته تشکیل شده که به دور یکدیگر پیچیده‌اند.

اجزای اصلی این ساختار:

  • دو طرف نردبان → ستون‌های DNA
  • پله‌های نردبان → جفت‌های باز (Base Pairs)

بازها به صورت مکمل با هم جفت می‌شوند:

  • A با T
  • C با G

یعنی:

A ↔ T

C ↔ G

این رابطه مکملی، یکی از ویژگی‌های اساسی DNA است.


4. DNA as a String (DNA به‌عنوان رشته)

تعریف ساده

تبدیل مولکول DNA به یک دنباله از حروف A,C,G,T.

توضیح دقیق

اگر از یک طرف مارپیچ DNA شروع کنیم و بازها را یکی‌یکی بخوانیم، می‌توانیم DNA را به یک رشته تبدیل کنیم.

مثلاً:

ساختار DNA:

A-T
C-G
G-C
T-A

می‌تواند به شکل زیر نوشته شود:

ACGT

بنابراین:

DNA Molecule → String

اهمیت

این تبدیل، پایه تحلیل محاسباتی ژنوم است.

چون در علوم کامپیوتر، رشته‌ها (Strings) داده‌هایی هستند که می‌توان:

  • جستجو کرد.
  • مقایسه کرد.
  • مرتب کرد.
  • با الگوریتم‌ها پردازش کرد.

5. Genome as a Very Long String

ژنوم به‌عنوان رشته‌ای بسیار طولانی

توضیح

ژنوم انسان بسیار بزرگ است.

برای مثال:

  • یک کروموزوم انسانی حدود صدها میلیون باز دارد.
  • کل ژنوم انسان میلیاردها باز دارد.

اما حتی با این اندازه بسیار بزرگ، همچنان می‌توان آن را یک رشته در نظر گرفت.

مانند یک متن بسیار طولانی که در چندین خط نوشته شده است.


6. Gene (ژن)

تعریف ساده

بخشی از DNA که اطلاعات ساخت یک محصول زیستی خاص را دارد.

توضیح

درون رشته بزرگ ژنوم، بخش‌هایی وجود دارند که اطلاعات مهمی را حمل می‌کنند.

برای مثال:

ژن HBB یکی از ژن‌های انسانی است که در تولید پروتئین هموگلوبین نقش دارد.

این ژن ممکن است در چند بخش جدا از رشته ژنوم قرار گرفته باشد.

اهمیت

تحلیل ژنوم فقط خواندن کل رشته نیست؛ بلکه پیدا کردن و تفسیر بخش‌های مهم آن مانند ژن‌ها نیز اهمیت دارد.


7. DNA Sequencer (دستگاه توالی‌یاب DNA)

تعریف ساده

دستگاهی که ترتیب بازهای DNA را تعیین می‌کند.

توضیح دقیق

یک نکته مهم:

دستگاه‌های توالی‌یابی امروزی معمولاً نمی‌توانند رشته‌های بسیار طولانی DNA را مستقیماً بخوانند.

آن‌ها در خواندن:

  • قطعات کوتاه DNA → بسیار خوب هستند.
  • کل ژنوم طولانی → محدودیت دارند.

بنابراین به جای خواندن کل ژنوم، تعداد بسیار زیادی قطعه کوتاه تولید می‌کنند.


8. Read (خوانش DNA)

تعریف ساده

یک قطعه کوتاه DNA که توسط دستگاه توالی‌یابی خوانده شده است.

توضیح دقیق

فرآیند کلی:

  1. DNA ورودی (Input DNA) مانند ژنوم انسان وارد دستگاه می‌شود.
  2. دستگاه بخش‌های کوتاه و تصادفی DNA را انتخاب می‌کند.
  3. این قطعات کوتاه را می‌خواند.
  4. خروجی، مجموعه‌ای از Reads است.

به عبارت دیگر:

Genome
   ↓
Random Short Substrings
   ↓
Sequencing Reads

ویژگی‌ها

Reads:

  • بسیار کوتاه‌تر از ژنوم اصلی هستند.
  • تعداد بسیار زیادی دارند.
  • بخش‌های مختلف ژنوم را پوشش می‌دهند.

9. Read as a Substring (خوانش به‌عنوان زیررشته)

تعریف ساده

هر Read یک زیررشته کوتاه از رشته بزرگ‌تر ژنوم است.

مثال:

ژنوم:

ACGTACGTTAGCA

یک Read:

TACGT

یک بخش کوچک از ژنوم اصلی است.

اهمیت

این مفهوم پایه بسیاری از الگوریتم‌های:

  • Genome Assembly
  • Read Alignment

است.


10. Coverage (پوشش توالی‌یابی)

تعریف ساده

میزان تکرار خوانده شدن بخش‌های مختلف ژنوم.

توضیح دقیق

چون دستگاه تعداد زیادی Read تولید می‌کند، معمولاً هر موقعیت از ژنوم چندین بار خوانده می‌شود.

این اطلاعات اضافی باعث افزایش اطمینان می‌شود.

مثلاً:

یک باز DNA ممکن است در:

  • 10 Read مختلف
  • 50 Read مختلف

مشاهده شود.

اهمیت

پوشش بیشتر باعث:

  • کاهش خطا
  • افزایش اعتماد به نتیجه توالی‌یابی

می‌شود.


نکات مهم

  • DNA از چهار باز A,C,G,T ساخته شده است.
  • ژنوم را می‌توان به صورت یک رشته بسیار طولانی نمایش داد.
  • این نمایش امکان استفاده از الگوریتم‌های پردازش رشته را فراهم می‌کند.
  • DNA Sequencer معمولاً کل ژنوم را مستقیم نمی‌خواند.
  • دستگاه‌های مدرن تعداد زیادی قطعه کوتاه DNA تولید می‌کنند.
  • هر Read یک زیررشته از ژنوم اصلی است.
  • Reads بسیار کوتاه‌تر از ژنوم هستند، اما تعداد بسیار زیادی از آن‌ها تولید می‌شود.
  • وجود اطلاعات تکراری (Redundancy) باعث افزایش دقت تحلیل ژنوم می‌شود.
  • مفهوم String یکی از پایه‌های اصلی این دوره است.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Genome ژنوم مجموعه کامل اطلاعات ژنتیکی یک موجود
Gene ژن بخش عملکردی از DNA که اطلاعات زیستی دارد
DNA دی‌ان‌ای مولکول حامل اطلاعات ژنتیکی
Base باز واحد سازنده DNA مانند A,T,C,G
Base Pair جفت باز اتصال مکمل دو باز در DNA
Double Helix مارپیچ دوگانه ساختار سه‌بعدی DNA
String رشته دنباله‌ای از کاراکترها در علوم کامپیوتر
Substring زیررشته بخشی از یک رشته بزرگ‌تر
DNA Sequencer دستگاه توالی‌یاب DNA دستگاه تولیدکننده توالی DNA
Read خوانش قطعه کوتاه DNA حاصل از توالی‌یابی
Input DNA DNA ورودی DNA اولیه‌ای که قرار است توالی‌یابی شود
Sequencing Coverage پوشش توالی‌یابی تعداد دفعات مشاهده هر بخش از ژنوم
Redundancy افزونگی اطلاعات وجود چندین مشاهده از یک بخش DNA

مثال‌ها و تشبیه‌ها

تشبیه ژنوم به کتاب دستور آشپزی

ژنوم مانند یک کتاب بزرگ دستور آشپزی است:

  • هر دستور → یک ژن
  • کل کتاب → ژنوم
  • حروف کتاب → A,C,G,T

اما برخلاف کتاب معمولی، این کتاب با زبان چهارحرفی DNA نوشته شده است.


تشبیه Reads به تکه‌های یک کتاب

فرض کنید یک کتاب بسیار بزرگ را خرد کنیم و فقط بخش‌های کوچکی از صفحات را بخوانیم.

هر قطعه کوچک:

  • یک Read است.
  • بخشی از متن اصلی را نشان می‌دهد.

با داشتن تعداد زیادی قطعه، می‌توان دوباره اطلاعات کتاب اصلی را استخراج کرد.


خلاصه نهایی مرور سریع

  • ژنوم مجموعه کامل اطلاعات ژنتیکی یک موجود است.

  • DNA مانند رشته‌ای از چهار حرف A,C,G,T قابل نمایش است.

  • بازهای DNA به صورت مکمل جفت می‌شوند:

    • A با T
    • C با G
  • تبدیل DNA به String امکان تحلیل با الگوریتم‌های کامپیوتری را فراهم می‌کند.

  • ژنوم انسان یک رشته بسیار طولانی از بازها است.

  • دستگاه‌های توالی‌یابی کل ژنوم را یک‌جا نمی‌خوانند.

  • آن‌ها تعداد زیادی Read کوتاه تولید می‌کنند.

  • هر Read یک Substring از ژنوم اصلی است.

  • تعداد زیاد Readها باعث ایجاد اطلاعات تکراری و افزایش دقت می‌شود.

  • تحلیل Reads پایه مسائل مهمی مانند Alignment و Assembly است.


سوالات مرور

1. سوال مفهومی:

چرا می‌توان DNA را مانند یک String در نظر گرفت؟

پاسخ: زیرا DNA از ترتیب مشخصی از چهار کاراکتر A,C,G,T تشکیل شده و می‌توان آن را مانند یک رشته متنی در علوم کامپیوتر نمایش داد.


2. سوال تعریفی:

Read چیست؟

پاسخ: یک قطعه کوتاه DNA است که دستگاه توالی‌یابی آن را از ژنوم اصلی خوانده است.


3. سوال مفهومی:

چرا دستگاه‌های توالی‌یابی به جای خواندن کل ژنوم، Reads کوتاه تولید می‌کنند؟

پاسخ: زیرا خواندن رشته‌های بسیار طولانی DNA دشوار است، اما خواندن تعداد زیادی قطعه کوتاه DNA با دقت بالا امکان‌پذیر است.


4. سوال کاربردی:

اگر یک ژنوم میلیاردها باز داشته باشد، چگونه می‌توان آن را تحلیل کرد؟

پاسخ: با تبدیل آن به یک رشته و استفاده از الگوریتم‌های محاسباتی برای پردازش Reads و استخراج اطلاعات ژنتیکی.


5. سوال تعریفی:

Coverage در توالی‌یابی DNA به چه معناست؟

پاسخ: تعداد دفعاتی است که یک بخش مشخص از ژنوم توسط Readهای مختلف مشاهده و بررسی می‌شود.


6. سوال مفهومی:

رابطه بین Read و Substring چیست؟

پاسخ: هر Read یک زیررشته کوتاه از رشته بزرگ‌تر ژنوم است.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/05_lecture-string-definitions-and-python-examples

تعریف رشته‌ها و مثال‌های پایتون برای پردازش DNA

String Definitions and Python Examples


خلاصه کلی

در این بخش، مفاهیم پایه مربوط به رشته‌ها (Strings) معرفی می‌شوند؛ زیرا در تحلیل داده‌های ژنومی، DNA معمولاً به صورت یک رشته از حروف نمایش داده می‌شود.

از آنجا که بسیاری از الگوریتم‌های این دوره با رشته‌های DNA کار می‌کنند، لازم است مفاهیم زیر به‌خوبی درک شوند:

  • تعریف String و Alphabet
  • طول رشته
  • رشته خالی
  • موقعیت کاراکترها (Offset)
  • الحاق رشته‌ها (Concatenation)
  • زیررشته‌ها (Substrings)
  • پیشوندها (Prefixes)
  • پسوندها (Suffixes)

همچنین نحوه پیاده‌سازی این مفاهیم در زبان برنامه‌نویسی Python بررسی می‌شود.


مفاهیم کلیدی


1. String (رشته)

تعریف ساده

یک رشته، دنباله‌ای محدود از کاراکترها است که از یک مجموعه مشخص از کاراکترها ساخته شده است.

تعریف دقیق

یک رشته با نماد S نمایش داده می‌شود:

[ S = s_1s_2s_3...s_n ]

که هر کاراکتر از یک مجموعه به نام Alphabet (الفبا) انتخاب می‌شود.

در ژنومیک، معمولاً الفبا برابر است با:

[ \Sigma = {A,C,G,T} ]

یعنی تمام رشته‌های DNA فقط از چهار حرف تشکیل می‌شوند.

مثال:

S = "ACGTTA"

یک رشته DNA است.

اهمیت

تقریباً تمام داده‌های DNA در بیوانفورماتیک به صورت رشته ذخیره و پردازش می‌شوند.


2. Alphabet (الفبا)

تعریف ساده

مجموعه‌ای از کاراکترهایی که می‌توانند در یک رشته استفاده شوند.

توضیح دقیق

در مسائل مختلف، Alphabet می‌تواند متفاوت باشد.

مثلاً:

در متن انگلیسی:

[ \Sigma = {A,B,C,...,Z} ]

در DNA:

[ \Sigma = {A,C,G,T} ]

در این دوره، تمرکز اصلی روی الفبای DNA است.


3. Length of String (طول رشته)

تعریف ساده

تعداد کاراکترهای موجود در یک رشته.

توضیح

طول رشته با نماد زیر نمایش داده می‌شود:

[ |S| ]

مثال:

S = "ACGT"

طول رشته:

[ |S| = 4 ]

در Python

برای محاسبه طول رشته از تابع داخلی len() استفاده می‌کنیم.

مثال:

len("ACGT")

خروجی:

4

4. Empty String (رشته خالی)

تعریف ساده

رشته‌ای که هیچ کاراکتری ندارد.

ویژگی

طول رشته خالی برابر صفر است:

[ |\epsilon| = 0 ]

نماد رایج آن:

[ \epsilon ]

است.

در Python

رشته خالی با دو علامت نقل قول بدون فاصله نوشته می‌شود:

""

مثال:

s = ""

5. Offset (موقعیت کاراکتر)

تعریف ساده

شماره موقعیت یک کاراکتر در رشته.

توضیح مهم

در Python و بسیاری از زبان‌های برنامه‌نویسی، شمارش موقعیت‌ها از صفر شروع می‌شود.

مثال:

S = "ACGT"

موقعیت‌ها:

Offset Character
0 A
1 C
2 G
3 T

بنابراین:

  • Offset صفر → اولین کاراکتر
  • Offset دو → سومین کاراکتر

در Python

دسترسی به کاراکتر:

S[0]

خروجی:

A

و:

S[2]

خروجی:

G

6. Concatenation (الحاق رشته‌ها)

تعریف ساده

قرار دادن دو رشته پشت سر هم برای ساخت یک رشته جدید.

توضیح

اگر دو رشته داشته باشیم:

S = "ACG"

T = "TT"

الحاق آن‌ها:

ACGTT

است.

در Python

از عملگر + استفاده می‌شود:

S + T

نتیجه:

"ACGTT"

7. Substring (زیررشته)

تعریف ساده

بخشی از یک رشته بزرگ‌تر که به صورت متوالی در آن وجود دارد.

مثال

رشته اصلی:

S = "AACCGGTT"

زیررشته:

CCGG

یک Substring از S است.


در Python

برای گرفتن زیررشته از Slicing استفاده می‌کنیم:

فرمت کلی:

S[start:end]

نکته:

  • start شامل می‌شود.
  • end شامل نمی‌شود.

مثال:

S[2:6]

اگر:

S = "AACCGGTT"

باشد، خروجی:

CCGG

خواهد بود.


8. Prefix (پیشوند)

تعریف ساده

زیررشته‌ای که از ابتدای رشته شروع می‌شود.

مثال

رشته:

S = "AACCGGTT"

پیشوند:

AACCGG

است.

زیرا از اولین کاراکتر شروع شده است.

در Python

S[0:6]

یا کوتاه‌تر:

S[:6]

هر دو یک معنی دارند.

وقتی عدد قبل از : حذف شود، Python به طور پیش‌فرض صفر را در نظر می‌گیرد.


9. Suffix (پسوند)

تعریف ساده

زیررشته‌ای که در انتهای رشته قرار دارد.

مثال

رشته:

S = "AACCGGTT"

پسوند:

GGTT

است.

زیرا به انتهای رشته متصل است.

در Python

S[4:8]

یا:

S[-4:]

هر دو:

GGTT

را تولید می‌کنند.


نکات مهم

  • در ژنومیک، DNA معمولاً به صورت String ذخیره می‌شود.
  • الفبای DNA شامل چهار کاراکتر A,C,G,T است.
  • Python برای کار با رشته‌ها از Indexing و Slicing استفاده می‌کند.
  • اندیس‌ها در Python از صفر شروع می‌شوند.
  • در slicing، نقطه پایان شامل نمی‌شود.

مثال:

S[2:6]

چهار کاراکتر با موقعیت‌های:

2,3,4,5

را انتخاب می‌کند.

  • Prefix همیشه از ابتدای رشته شروع می‌شود.
  • Suffix همیشه به انتهای رشته ختم می‌شود.
  • Substring مفهوم عمومی‌تری است و Prefix و Suffix زیرمجموعه آن هستند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
String رشته دنباله‌ای از کاراکترها
Alphabet الفبا مجموعه کاراکترهای مجاز برای ساخت رشته
DNA Alphabet الفبای DNA مجموعه A,C,G,T
Length طول تعداد کاراکترهای رشته
Empty String رشته خالی رشته‌ای با طول صفر
Offset موقعیت شماره جایگاه یک کاراکتر در رشته
Index اندیس شماره دسترسی به عناصر رشته
Concatenation الحاق اتصال دو رشته به یکدیگر
Substring زیررشته بخشی از یک رشته بزرگ‌تر
Prefix پیشوند زیررشته‌ای که از ابتدای رشته شروع می‌شود
Suffix پسوند زیررشته‌ای که در انتهای رشته قرار دارد
Slicing برش رشته روش استخراج بخش‌هایی از رشته در Python

مثال‌ها و تشبیه‌ها

تشبیه رشته DNA به یک کلمه

یک رشته DNA مانند یک کلمه بسیار طولانی است:

مثلاً:

ACGTTACG
  • هر حرف → یک باز DNA
  • کل رشته → بخشی از ژنوم

همان‌طور که می‌توان بخشی از یک کلمه را جدا کرد، می‌توان بخشی از DNA را نیز به عنوان Substring استخراج کرد.


خلاصه نهایی مرور سریع

  • String مجموعه‌ای از کاراکترها در یک ترتیب مشخص است.
  • DNA را می‌توان به صورت رشته‌ای از A,C,G,T نمایش داد.
  • Alphabet مجموعه کاراکترهای مجاز برای ساخت رشته است.
  • طول رشته با len() در Python محاسبه می‌شود.
  • رشته خالی با "" نمایش داده می‌شود.
  • Python از اندیس صفرمبنا استفاده می‌کند.
  • Concatenation دو رشته را به هم متصل می‌کند.
  • Substring بخشی از یک رشته بزرگ‌تر است.
  • Prefix از ابتدای رشته شروع می‌شود.
  • Suffix در انتهای رشته قرار دارد.
  • در Python برای استخراج بخش‌هایی از رشته از Slicing استفاده می‌شود.

سوالات مرور

1. سوال تعریفی:

String چیست؟

پاسخ: رشته، دنباله‌ای محدود از کاراکترها است که از یک Alphabet مشخص ساخته شده است.


2. سوال مفهومی:

چرا DNA را می‌توان به صورت String نمایش داد؟

پاسخ: زیرا DNA از ترتیب مشخصی از چهار باز A,C,G,T تشکیل شده و می‌توان آن را مانند یک رشته کاراکتری ذخیره و پردازش کرد.


3. سوال کاربردی:

اگر در Python بخواهیم کاراکتر سوم یک رشته DNA را دریافت کنیم، چه دستوری استفاده می‌کنیم؟

پاسخ:

S[2]

زیرا Python از اندیس صفر شروع می‌کند.


4. سوال تعریفی:

تفاوت Substring و Prefix چیست؟

پاسخ: Substring هر بخش متوالی از یک رشته است، اما Prefix حتماً باید از ابتدای رشته شروع شود.


5. سوال کاربردی:

خروجی دستور زیر چیست؟

S[-3:]

پاسخ: سه کاراکتر آخر رشته را برمی‌گرداند و یک Suffix ایجاد می‌کند.


6. سوال مفهومی:

چرا مفهوم Substring در تحلیل DNA مهم است؟

پاسخ: زیرا بسیاری از مسائل ژنومیک مانند یافتن الگوها، تطبیق خوانش‌ها و مونتاژ ژنوم بر اساس مقایسه زیررشته‌ها انجام می‌شوند.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/06_practical-string-basics

مبانی کار با رشته‌ها در پایتون برای داده‌های DNA

Practical: String Basics in Python


خلاصه کلی

در این بخش عملی، اصول ایجاد و دستکاری رشته‌ها (Strings) در زبان برنامه‌نویسی Python بررسی می‌شود. از آنجا که داده‌های DNA معمولاً به صورت رشته‌ای از نوکلئوتیدها (A, C, G, T) ذخیره می‌شوند، تسلط بر عملیات رشته‌ای برای تحلیل داده‌های ژنومی ضروری است.

در این درس عملی، موارد زیر آموزش داده می‌شوند:

  • ساخت رشته‌ها در Python
  • دسترسی به کاراکترهای رشته
  • مفهوم اندیس‌گذاری صفرمبنا (Zero-based Indexing)
  • محاسبه طول رشته
  • ایجاد رشته خالی
  • اتصال رشته‌ها (Concatenation)
  • تولید رشته‌های تصادفی DNA
  • استفاده از حلقه‌ها برای ساخت توالی‌ها
  • استخراج Substring، Prefix و Suffix

مفاهیم کلیدی


1. Creating Strings in Python

ایجاد رشته در پایتون

تعریف ساده

رشته مجموعه‌ای از کاراکترها است که در Python با علامت نقل قول تعریف می‌شود.

توضیح دقیق

در Python دو روش برای تعریف String وجود دارد:

استفاده از Single Quote

seq = 'ACGT'

استفاده از Double Quote

seq = "ACGT"

هر دو روش کاملاً یکسان هستند.

کاربرد در ژنومیک

یک توالی DNA را می‌توان به صورت یک String ذخیره کرد:

sequence = "ATGCGT"

هر حرف نشان‌دهنده یک نوکلئوتید است.


2. Accessing Characters

دسترسی به کاراکترهای رشته

تعریف ساده

دریافت یک کاراکتر خاص از داخل رشته با استفاده از موقعیت آن.

توضیح دقیق

در Python برای دسترسی به یک کاراکتر از براکت استفاده می‌کنیم:

seq[index]

مثال:

seq = "ACGT"

seq[1]

خروجی:

C

زیرا:

Index Character
0 A
1 C
2 G
3 T

3. Zero-Based Indexing

اندیس‌گذاری از صفر

تعریف ساده

در Python اولین کاراکتر رشته دارای اندیس صفر است.

توضیح دقیق

برخلاف شمارش معمول انسان‌ها که از 1 شروع می‌شود، Python شمارش را از 0 آغاز می‌کند.

مثال:

ACGT

موقعیت‌ها:

0 1 2 3
A C G T

بنابراین:

  • اولین کاراکتر → index 0
  • دومین کاراکتر → index 1
  • سومین کاراکتر → index 2

اهمیت

بسیاری از خطاهای برنامه‌نویسی هنگام کار با رشته‌ها ناشی از اشتباه در اندیس‌گذاری است.


4. String Length

طول رشته

تعریف ساده

تعداد کاراکترهای موجود در یک رشته.

در Python

از تابع داخلی:

len()

استفاده می‌شود.

مثال:

len("ACGT")

خروجی:

4

کاربرد در DNA

طول یک توالی DNA برابر با تعداد نوکلئوتیدهای آن است.

مثلاً:

ATCGGA

طول:

6

5. Empty String

رشته خالی

تعریف ساده

رشته‌ای بدون هیچ کاراکتر.

ایجاد در Python

empty = ""

طول آن:

len(empty)

نتیجه:

0

کاربرد

رشته خالی معمولاً برای ساخت تدریجی یک رشته جدید استفاده می‌شود.

مثلاً هنگام تولید یک توالی DNA تصادفی:

sequence = ""

سپس نوکلئوتیدها به آن اضافه می‌شوند.


6. String Concatenation

الحاق رشته‌ها

تعریف ساده

اتصال دو یا چند رشته برای ساخت یک رشته جدید.

روش اول: استفاده از +

مثال:

s1 = "AAA"
s2 = "CCC"

s1 + s2

خروجی:

AAACCC

روش دوم: استفاده از join()

تابع join() برای اتصال عناصر یک لیست استفاده می‌شود.

مثال:

parts = ["A", "C", "G", "T"]

"".join(parts)

خروجی:

ACGT

در این حالت هیچ جداکننده‌ای بین عناصر قرار نمی‌گیرد.


استفاده از جداکننده

مثال:

",".join(parts)

خروجی:

A,C,G,T

در اینجا کاما بین عناصر قرار می‌گیرد.


7. Random DNA Sequence Generation

تولید توالی DNA تصادفی

تعریف ساده

ساخت یک رشته DNA با انتخاب تصادفی نوکلئوتیدها.

استفاده از ماژول Random

ابتدا:

import random

سپس:

random.choice()

برای انتخاب تصادفی یک عنصر استفاده می‌شود.

مثال:

random.choice("ACGT")

خروجی ممکن است:

G

باشد.

هر بار اجرای دستور می‌تواند نتیجه متفاوتی ایجاد کند.


8. Random Seed

تعیین مقدار اولیه تصادفی

تعریف ساده

تنظیم یک مقدار ثابت برای تولید نتایج تصادفی قابل تکرار.

توضیح

به صورت معمول:

random.choice("ACGT")

هر بار نتیجه متفاوتی می‌دهد.

اما:

random.seed(10)

باعث می‌شود تولید اعداد و انتخاب‌های تصادفی قابل تکرار باشند.

اهمیت

در تحقیقات علمی و تست برنامه‌ها، قابلیت تکرار نتایج اهمیت زیادی دارد.


9. Generating Random DNA with Loops

تولید توالی DNA با حلقه

روش کلی

ابتدا یک رشته خالی ایجاد می‌کنیم:

sequence = ""

سپس چند بار یک نوکلئوتید تصادفی انتخاب کرده و اضافه می‌کنیم.

مثال:

for _ in range(10):
    sequence += random.choice("ACGT")

نتیجه:

یک رشته DNA با طول 10 تولید می‌شود.


10. Underscore in Python Loops

استفاده از _ در حلقه‌ها

تعریف ساده

علامت _ برای زمانی استفاده می‌شود که مقدار شمارنده حلقه اهمیتی ندارد.

مثال:

for _ in range(10):
    print("DNA")

در اینجا:

  • حلقه 10 بار اجرا می‌شود.
  • اما شماره تکرار ذخیره نمی‌شود.

اگر به شماره تکرار نیاز داشته باشیم:

for i in range(10):

استفاده می‌کنیم.


11. String Slicing

برش رشته

تعریف ساده

استخراج بخشی از یک رشته با استفاده از محدوده اندیس‌ها.

ساختار:

string[start:end]

نکته:

  • start شامل می‌شود.
  • end شامل نمی‌شود.

مثال:

seq[1:3]

کاراکترهای اندیس 1 و 2 را برمی‌گرداند.


12. Prefix Extraction

استخراج پیشوند

تعریف ساده

گرفتن بخش ابتدایی رشته.

مثال:

seq[:3]

یعنی:

از ابتدا تا قبل از اندیس 3.

این دستور معادل است با:

seq[0:3]

13. Suffix Extraction

استخراج پسوند

تعریف ساده

گرفتن بخش انتهایی رشته.

مثال:

seq[7:]

یعنی:

از اندیس 7 تا انتهای رشته.


14. Negative Indexing

اندیس منفی

تعریف ساده

دسترسی به کاراکترها از انتهای رشته.

توضیح

در Python:

آخرین کاراکتر:

seq[-1]

دومین کاراکتر از انتها:

seq[-2]

است.

مثال:

A C G T C A G
0 1 2 3 4 5 6

دستور:

seq[-3]

سومین کاراکتر از انتها را می‌دهد.


15. Extracting Suffix with Negative Index

برای گرفتن سه کاراکتر آخر:

seq[-3:]

استفاده می‌شود.

این روش یک راه ساده برای گرفتن Suffix با طول مشخص است.


نکات مهم

  • رشته‌ها در Python با ' ' یا " " تعریف می‌شوند.
  • Python از اندیس صفرمبنا استفاده می‌کند.
  • طول رشته با len() محاسبه می‌شود.
  • رشته خالی با "" ساخته می‌شود.
  • برای اتصال رشته‌ها می‌توان از + یا join() استفاده کرد.
  • تابع random.choice() یک عنصر تصادفی از یک رشته انتخاب می‌کند.
  • random.seed() باعث قابل تکرار شدن نتایج تصادفی می‌شود.
  • در حلقه‌ها، _ زمانی استفاده می‌شود که مقدار شمارنده لازم نیست.
  • در Slicing، انتهای محدوده شامل نمی‌شود.
  • Prefix از ابتدای رشته و Suffix از انتهای رشته استخراج می‌شود.
  • اندیس‌های منفی برای دسترسی سریع به انتهای رشته کاربرد دارند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
String رشته دنباله‌ای از کاراکترها
Character کاراکتر یک عنصر از رشته
Index اندیس موقعیت یک کاراکتر در رشته
Zero-Based Indexing اندیس‌گذاری صفرمبنا شروع شمارش موقعیت‌ها از صفر
Length طول تعداد کاراکترهای رشته
Empty String رشته خالی رشته بدون کاراکتر
Concatenation الحاق اتصال چند رشته
Join Function تابع اتصال روش ترکیب عناصر یک لیست رشته‌ای
Random Module ماژول تصادفی کتابخانه تولید انتخاب‌های تصادفی
Random Choice انتخاب تصادفی انتخاب یک عنصر به صورت تصادفی
Seed مقدار اولیه تصادفی برای تکرارپذیری نتایج
Loop حلقه اجرای تکراری دستورات
Slicing برش رشته استخراج بخشی از رشته
Prefix پیشوند بخش ابتدایی رشته
Suffix پسوند بخش انتهایی رشته
Negative Index اندیس منفی شمارش موقعیت از انتهای رشته

مثال‌ها و تشبیه‌ها

تشبیه رشته DNA به یک نوار

یک رشته DNA مانند یک نوار طولانی از حروف است:

A C G T A A G

هر حرف یک موقعیت دارد.

Python مانند دستگاهی است که می‌تواند:

  • یک حرف خاص را بخواند.
  • بخشی از نوار را جدا کند.
  • چند نوار را به هم وصل کند.

خلاصه نهایی مرور سریع

  • DNA در Python به صورت String ذخیره می‌شود.
  • رشته‌ها می‌توانند با علامت نقل قول ساخته شوند.
  • Python برای دسترسی به کاراکترها از Index استفاده می‌کند.
  • اولین کاراکتر همیشه Index صفر دارد.
  • len() طول رشته را محاسبه می‌کند.
  • + و join() برای Concatenation استفاده می‌شوند.
  • random.choice("ACGT") یک نوکلئوتید تصادفی تولید می‌کند.
  • random.seed() برای تکرارپذیری نتایج تصادفی است.
  • حلقه for _ in range() برای تکرار بدون نیاز به شمارنده استفاده می‌شود.
  • Slicing با start:end بخش‌هایی از رشته را استخراج می‌کند.
  • Prefix با [:n] و Suffix با [n:] استخراج می‌شوند.
  • Negative Index امکان دسترسی از انتهای رشته را فراهم می‌کند.

سوالات مرور

1. سوال تعریفی:

Zero-Based Indexing چیست؟

پاسخ: روشی برای شماره‌گذاری عناصر رشته که در آن اولین عنصر دارای اندیس صفر است.


2. سوال کاربردی:

چگونه سه کاراکتر آخر یک رشته DNA را استخراج می‌کنیم؟

پاسخ:

sequence[-3:]

3. سوال مفهومی:

چرا هنگام تولید توالی DNA تصادفی از رشته خالی شروع می‌کنیم؟

پاسخ: زیرا می‌توانیم نوکلئوتیدهای جدید را به تدریج به آن اضافه کنیم تا رشته نهایی ساخته شود.


4. سوال تعریفی:

تفاوت + و join() در اتصال رشته‌ها چیست؟

پاسخ: هر دو رشته‌ها را متصل می‌کنند، اما join() برای اتصال مجموعه‌ای از رشته‌ها مانند عناصر یک لیست با یک جداکننده مشخص مناسب‌تر است.


5. سوال کاربردی:

خروجی دستور زیر چیست؟

"ACGT"[1:3]

پاسخ:

CG

زیرا اندیس 1 شامل می‌شود و اندیس 3 شامل نمی‌شود.


6. سوال مفهومی:

چرا در تحلیل ژنومی یادگیری String Slicing اهمیت دارد؟

پاسخ: زیرا بسیاری از عملیات ژنومی مانند استخراج Readها، بررسی زیررشته‌ها و تحلیل الگوهای DNA بر اساس استخراج بخش‌هایی از رشته انجام می‌شوند.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/07_practical-manipulating-dna-strings

دستکاری رشته‌های DNA در پایتون

Manipulating DNA Strings in Python


خلاصه کلی

در این بخش عملی، با نوشتن چند تابع در Python برای پردازش رشته‌های DNA آشنا می‌شویم. هدف اصلی، تمرین ساخت الگوریتم‌هایی است که روی توالی‌های DNA عملیات انجام می‌دهند.

سه مسئله مهم بررسی می‌شود:

  1. پیدا کردن طولانی‌ترین پیشوند مشترک (Longest Common Prefix) بین دو رشته DNA
  2. بررسی تطابق کامل دو رشته (Exact Matching)
  3. محاسبه مکمل معکوس DNA (Reverse Complement)

این عملیات‌ها پایه بسیاری از الگوریتم‌های پیشرفته‌تر در بیوانفورماتیک مانند تطبیق توالی‌ها، جستجوی الگوها و مونتاژ ژنوم هستند.


مفاهیم کلیدی


1. Function Definition in Python

تعریف تابع در پایتون

تعریف ساده

تابع مجموعه‌ای از دستورات است که برای انجام یک کار مشخص نوشته می‌شود و می‌توان چندین بار آن را اجرا کرد.

ساختار کلی

در Python برای ساخت تابع از کلمه کلیدی def استفاده می‌کنیم:

def function_name(arguments):
    statements

مثال:

def longest_common_prefix(s1, s2):

در اینجا:

  • نام تابع: longest_common_prefix
  • ورودی‌ها: دو رشته s1 و s2

نکته مهم: Indentation

در Python فاصله‌گذاری (Indentation) بخشی از ساختار زبان است.

تمام دستوراتی که داخل تابع قرار دارند باید دارای تورفتگی باشند.

مثال صحیح:

def test():
    print("DNA")

بدون تورفتگی، Python خطا ایجاد می‌کند.


2. Longest Common Prefix (LCP)

طولانی‌ترین پیشوند مشترک

تعریف ساده

طولانی‌ترین بخش ابتدایی که بین دو رشته مشترک است.

مثال

دو رشته:

S1 = ACCAGT
S2 = ACCATT

پیشوند مشترک:

ACCA

بنابراین:

[ LCP(S1,S2)=ACCA ]


الگوریتم پیاده‌سازی

ایده اصلی:

  1. یک اندیس i از صفر شروع می‌کنیم.

  2. تا زمانی که:

    • هر دو رشته هنوز کاراکتر دارند.
    • کاراکترهای موقعیت i برابر هستند.

    مقدار i را افزایش می‌دهیم.

  3. بخش قبل از i را برمی‌گردانیم.


شبه‌کد

i = 0

while:
    characters at position i are equal:
        increase i

return substring from beginning to i

اهمیت

Longest Common Prefix در بسیاری از الگوریتم‌های مقایسه رشته‌ها استفاده می‌شود.

در ژنومیک می‌تواند برای بررسی شباهت بین توالی‌های DNA کاربرد داشته باشد.


3. Exact Matching

تطبیق کامل رشته‌ها

تعریف ساده

بررسی اینکه آیا دو رشته دقیقاً یکسان هستند یا خیر.

مثال:

S1 = ACGT
S2 = ACGT

نتیجه:

Match = True

اما:

S1 = ACGT
S2 = ACGA

نتیجه:

Match = False

الگوریتم دستی

مرحله اول:

بررسی طول رشته‌ها

اگر:

[ |S1| \neq |S2| ]

باشد، دو رشته نمی‌توانند برابر باشند.

پس:

return False

مرحله دوم:

مقایسه تک‌تک کاراکترها

با یک حلقه:

for i in range(length):

تمام موقعیت‌ها بررسی می‌شوند.

اگر حتی یک کاراکتر متفاوت باشد:

return False

اگر حلقه کامل شود:

return True

روش ساده‌تر در Python

Python خودش عملگر مقایسه رشته دارد:

s1 == s2

مثال:

"ACGT" == "ACGT"

خروجی:

True

و:

"ACGT" == "ACGA"

خروجی:

False

4. Dictionary in Python

دیکشنری در پایتون

تعریف ساده

ساختاری برای ذخیره اطلاعات به صورت زوج‌های کلید-مقدار (Key-Value).

ساختار:

dictionary = {
    key: value
}

مثال:

complement = {
    "A":"T",
    "T":"A",
    "C":"G",
    "G":"C"
}

کاربرد در DNA

در DNA هر باز یک باز مکمل دارد:

Base Complement
A T
T A
C G
G C

دیکشنری این ارتباط را ذخیره می‌کند.

مثلاً:

complement["A"]

نتیجه:

T

5. Reverse Complement

مکمل معکوس DNA

تعریف ساده

رشته‌ای که ابتدا مکمل هر باز گرفته شده و سپس ترتیب رشته برعکس می‌شود.


مفهوم زیستی

DNA دو رشته‌ای است.

اگر توالی یک رشته را بدانیم:

5' - ACGT - 3'

رشته مقابل:

3' - TGCA - 5'

است.

برای نمایش استاندارد از جهت 5' به 3' باید آن را معکوس کنیم:

ACGT → ACGT

مراحل محاسبه

برای هر باز:

  1. مکمل آن را پیدا کن.
  2. آن را به ابتدای رشته جدید اضافه کن.

مثال:

رشته ورودی:

ACG

مکمل‌ها:

TGC

معکوس:

CGT

پس:

Reverse Complement = CGT

پیاده‌سازی الگوریتم

ابتدا دیکشنری مکمل ساخته می‌شود:

complement = {
    "A":"T",
    "T":"A",
    "C":"G",
    "G":"C"
}

سپس:

t = ""

برای هر باز در رشته:

t = complement[base] + t

نکته مهم:

مکمل هر باز به ابتدای t اضافه می‌شود، نه انتهای آن.

این کار باعث معکوس شدن ترتیب رشته می‌شود.


نکات مهم

  • Python برای ساخت توابع از def استفاده می‌کند.

  • Indentation در Python الزامی است.

  • Longest Common Prefix بخش ابتدایی مشترک دو رشته است.

  • برای پیدا کردن LCP باید کاراکترها را از ابتدا مقایسه کرد.

  • در تطبیق کامل، ابتدا طول رشته‌ها بررسی می‌شود.

  • Python دارای عملگر داخلی == برای مقایسه رشته‌ها است.

  • Dictionary برای نگهداری رابطه بین بازهای DNA و مکمل آن‌ها بسیار مناسب است.

  • Reverse Complement دو مرحله دارد:

    1. گرفتن Complement
    2. Reverse کردن ترتیب
  • اضافه کردن عناصر به ابتدای رشته باعث ایجاد ترتیب معکوس می‌شود.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Function تابع مجموعه‌ای از دستورات قابل استفاده مجدد
Argument آرگومان / ورودی تابع داده‌ای که به تابع داده می‌شود
Indentation تورفتگی فاصله‌گذاری برای مشخص کردن بلوک‌های کد
Longest Common Prefix (LCP) طولانی‌ترین پیشوند مشترک بزرگ‌ترین بخش ابتدایی مشترک دو رشته
Exact Matching تطبیق کامل بررسی برابر بودن کامل دو رشته
Boolean مقدار منطقی مقدار True یا False
Dictionary دیکشنری ساختار Key-Value در Python
Key کلید شناسه برای دسترسی به مقدار
Value مقدار داده مرتبط با کلید
Complement مکمل باز مقابل در DNA
Reverse Complement مکمل معکوس مکمل رشته با ترتیب معکوس
Prepending افزودن به ابتدای رشته اضافه کردن عنصر قبل از محتوای موجود

مثال‌ها و تشبیه‌ها

تشبیه Reverse Complement

DNA مانند یک زیپ دوطرفه است.

اگر یک طرف زیپ را داشته باشیم:

A C G T

طرف دیگر:

  • A مقابل T
  • C مقابل G

قرار می‌گیرد.

اما چون دو طرف زیپ در جهت مخالف حرکت می‌کنند، باید ترتیب را نیز برعکس کنیم.

بنابراین فقط Complement کافی نیست؛ Reverse Complement لازم است.


خلاصه نهایی مرور سریع

  • تابع‌ها برای سازمان‌دهی عملیات‌های تکراری استفاده می‌شوند.

  • Longest Common Prefix بخش مشترک ابتدایی دو رشته است.

  • LCP با مقایسه کاراکترها از ابتدای رشته پیدا می‌شود.

  • برای Match کامل، طول و سپس تک‌تک کاراکترها بررسی می‌شوند.

  • Python با == مقایسه رشته‌ای را ساده می‌کند.

  • Dictionary برای نگهداری رابطه Base → Complement استفاده می‌شود.

  • مکمل DNA:

    • A ↔ T
    • C ↔ G
  • Reverse Complement شامل Complement کردن و سپس Reverse کردن است.

  • اضافه کردن عناصر به ابتدای رشته باعث معکوس شدن ترتیب می‌شود.

  • Reverse Complement برای تحلیل DNA دو رشته‌ای ضروری است.


سوالات مرور

1. سوال تعریفی:

Longest Common Prefix چیست؟

پاسخ: طولانی‌ترین زیررشته‌ای است که از ابتدای دو رشته شروع شده و در هر دو مشترک است.


2. سوال مفهومی:

چرا در Reverse Complement فقط Complement گرفتن کافی نیست؟

پاسخ: زیرا دو رشته DNA در جهت مخالف قرار دارند و برای نمایش استاندارد باید ترتیب رشته نیز معکوس شود.


3. سوال کاربردی:

مکمل DNA باز C چیست؟

پاسخ:

G

4. سوال کاربردی:

اگر دو رشته طول متفاوت داشته باشند، آیا می‌توانند Match باشند؟

پاسخ: خیر. رشته‌های با طول متفاوت نمی‌توانند کاملاً برابر باشند.


5. سوال مفهومی:

چرا در محاسبه Reverse Complement بازهای مکمل به ابتدای رشته اضافه می‌شوند؟

پاسخ: زیرا اضافه کردن به ابتدای رشته باعث معکوس شدن ترتیب خروجی و ایجاد Reverse Complement می‌شود.


6. سوال کاربردی:

Reverse Complement رشته زیر چیست؟

ACG

پاسخ:

Complement:

TGC

Reverse:

CGT

بنابراین:

CGT

01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/08_practical-downloading-and-parsing-a-genome

دانلود و پردازش ژنوم مرجع با پایتون

Downloading and Parsing a Genome


خلاصه کلی

در این بخش عملی، نحوه دریافت، خواندن و پردازش یک ژنوم مرجع (Reference Genome) با استفاده از Python آموزش داده می‌شود.

هدف این درس، آشنایی با مراحل اولیه کار با داده‌های واقعی ژنومی است:

  • دانلود فایل‌های توالی DNA
  • آشنایی با فرمت FASTA
  • خواندن ژنوم از فایل
  • حذف اطلاعات اضافی و استخراج توالی DNA
  • ذخیره ژنوم به صورت String
  • شمارش فراوانی بازهای DNA

در این تمرین از ژنوم ویروس Lambda Phage استفاده می‌شود.


مفاهیم کلیدی


1. Reference Genome

ژنوم مرجع

تعریف ساده

ژنومی استاندارد و شناخته‌شده که به عنوان مرجع برای تحلیل داده‌های ژنتیکی استفاده می‌شود.

توضیح دقیق

در مطالعات ژنومی، معمولاً توالی DNA یک موجود زنده ابتدا تعیین و ذخیره می‌شود. این توالی به عنوان مرجع استفاده می‌شود تا داده‌های جدید با آن مقایسه شوند.

در این تمرین:

  • ژنوم مرجع مربوط به Lambda Phage Virus است.
  • طول آن حدود:

[ 48,500 ]

باز DNA است.

اهمیت

ژنوم مرجع پایه بسیاری از تحلیل‌ها مانند:

  • مقایسه توالی‌ها
  • شناسایی جهش‌ها
  • نگاشت خوانش‌های DNA (Read Mapping)

است.


2. FASTA File Format

فرمت فایل FASTA

تعریف ساده

فرمت استاندارد برای ذخیره توالی‌های زیستی مانند DNA، RNA و پروتئین.

ساختار فایل FASTA

یک فایل FASTA معمولاً شامل دو بخش است:

1. Header (سرآیند)

با علامت > شروع می‌شود.

مثال:

>Enterobacteria phage lambda

این بخش شامل اطلاعات توصیفی مانند:

  • نام موجود
  • شناسه توالی
  • اطلاعات آزمایشگاهی

است.


2. Sequence (توالی)

خطوط بعدی شامل حروف DNA هستند:

ACGTAGCTAGCT...

این بخش همان توالی واقعی ژنوم است.


نکته مهم

در تحلیل ژنوم معمولاً اطلاعات Header مورد نیاز نیست و فقط توالی DNA استخراج می‌شود.


3. Downloading Data in Python

دانلود داده با Python

استفاده از wget

در محیط IPython می‌توان دستورات خط فرمان را با علامت ! اجرا کرد.

مثال:

!wget URL

مفهوم علامت !

در IPython:

  • اجرای دستورات سیستم‌عامل را امکان‌پذیر می‌کند.
  • مانند اجرای دستور در Terminal است، اما داخل محیط Python.

مثال:

!ls

فهرست فایل‌های پوشه را نمایش می‌دهد.


4. Reading Files in Python

خواندن فایل در Python

برای باز کردن فایل از تابع:

open()

استفاده می‌شود.

ساختار:

open(filename, 'r')

که:

  • r → خواندن فایل (read)
  • w → نوشتن فایل (write)

است.


File Handle

هنگام باز کردن فایل معمولاً یک نام موقت برای دسترسی به فایل قرار می‌دهیم:

with open(filename, 'r') as f:

در اینجا:

f

نماینده فایل باز شده است.


5. Reading FASTA Genome

خواندن ژنوم از فایل FASTA

الگوریتم کلی

  1. یک String خالی ایجاد می‌کنیم:
genome = ""
  1. فایل را خط به خط می‌خوانیم.

  2. اگر خط با > شروع شود:

  • آن را نادیده می‌گیریم.
  1. اگر خط شامل بازهای DNA باشد:
  • آن را به رشته ژنوم اضافه می‌کنیم.

شبه‌کد

create empty genome string

for each line in file:
    if line is not header:
        add sequence to genome

return genome

6. String Cleaning with rstrip()

حذف فاصله‌های اضافی با rstrip

تعریف ساده

تابعی برای حذف فاصله‌ها و کاراکترهای اضافی انتهای رشته.


کاربرد در FASTA

در فایل‌ها معمولاً هر خط با کاراکتر پایان خط (newline) تمام می‌شود.

مثلاً:

ACGT\n

تابع:

line.rstrip()

آن را تبدیل می‌کند به:

ACGT

چه چیزهایی حذف می‌شوند؟

  • فاصله‌ها
  • Tab
  • Newline
  • White space اضافی

7. Counting DNA Bases

شمارش بازهای DNA

تعریف ساده

محاسبه تعداد دفعات ظاهر شدن هر باز در ژنوم.

چهار باز DNA:

باز
A
C
G
T

روش اول: Dictionary

یک دیکشنری ایجاد می‌کنیم:

counts = {
    "A":0,
    "C":0,
    "G":0,
    "T":0
}

سپس کل ژنوم را پیمایش می‌کنیم:

for base in genome:
    counts[base] += 1

نتیجه

خروجی چیزی شبیه:

A : 12000
C : 11000
G : 13000
T : 12500

خواهد بود.

مجموع همه مقادیر باید برابر طول ژنوم باشد.

برای Lambda Phage:

[ A+C+G+T = 48502 ]


8. Collections.Counter

شمارش خودکار با Counter

تعریف ساده

یک ابزار آماده در Python برای شمارش تعداد عناصر موجود در یک مجموعه.


استفاده

ابتدا:

import collections

سپس:

collections.Counter(genome)

عملکرد

Counter:

  • تمام کاراکترهای رشته را بررسی می‌کند.
  • تعداد تکرار هر کاراکتر را ذخیره می‌کند.

خروجی مشابه Dictionary است:

Counter({
'A':12000,
'T':12000,
'G':13000,
'C':11500
})

نکات مهم

  • داده‌های ژنومی معمولاً در فایل‌های FASTA ذخیره می‌شوند.
  • فایل FASTA شامل Header و Sequence است.
  • Header با > مشخص می‌شود.
  • برای تحلیل DNA معمولاً فقط بخش Sequence مورد نیاز است.
  • ژنوم را می‌توان به صورت یک String بزرگ در Python ذخیره کرد.
  • تابع open() برای خواندن فایل استفاده می‌شود.
  • حالت r برای خواندن فایل است.
  • حلقه for line in f فایل را خط به خط پردازش می‌کند.
  • rstrip() کاراکترهای اضافی انتهای خطوط را حذف می‌کند.
  • شمارش بازها را می‌توان با Dictionary یا Counter انجام داد.
  • مجموع تعداد A، C، G و T باید برابر طول ژنوم باشد.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Reference Genome ژنوم مرجع توالی استاندارد برای مقایسه‌های ژنتیکی
FASTA فرمت FASTA قالب ذخیره توالی‌های زیستی
Header سرآیند اطلاعات توصیفی ابتدای فایل FASTA
Sequence توالی بخش شامل بازهای DNA
Genome ژنوم کل اطلاعات ژنتیکی یک موجود
Lambda Phage فاژ لامبدا ویروس مورد استفاده در این تمرین
File Handle شناسه فایل متغیری برای دسترسی به فایل بازشده
Read Mode حالت خواندن باز کردن فایل برای خواندن
Write Mode حالت نوشتن باز کردن فایل برای ذخیره داده
rstrip() حذف انتهای رشته حذف فاصله‌ها و newline از انتهای String
Dictionary دیکشنری ساختار Key-Value در Python
Counter شمارنده ابزار آماده Python برای شمارش عناصر
Base Frequency فراوانی باز تعداد تکرار هر نوکلئوتید

مثال‌ها و تشبیه‌ها

تشبیه فایل FASTA به کتاب ژنتیکی

یک فایل FASTA مانند یک کتاب است:

  • Header → عنوان و مشخصات کتاب
  • Sequence → متن اصلی کتاب

در تحلیل ژنوم:

  • عنوان کتاب معمولاً کنار گذاشته می‌شود.
  • فقط متن اصلی (DNA Sequence) خوانده می‌شود.

خلاصه نهایی مرور سریع

  • ژنوم مرجع یک توالی استاندارد برای تحلیل ژنتیکی است.
  • FASTA یکی از رایج‌ترین فرمت‌های ذخیره DNA است.
  • خطوطی که با > شروع می‌شوند Header هستند.
  • توالی DNA بعد از Header قرار دارد.
  • در Python می‌توان ژنوم را به صورت String ذخیره کرد.
  • برای خواندن فایل از open() استفاده می‌شود.
  • حالت r برای خواندن فایل است.
  • rstrip() کاراکترهای اضافی انتهای خطوط را حذف می‌کند.
  • شمارش بازهای DNA با Dictionary امکان‌پذیر است.
  • collections.Counter روش ساده‌تر برای شمارش عناصر است.
  • مجموع فراوانی A,C,G,T باید برابر طول ژنوم باشد.
  • پردازش فایل‌های واقعی ژنومی یکی از مهارت‌های پایه در بیوانفورماتیک است.

سوالات مرور

1. سوال تعریفی:

FASTA چیست؟

پاسخ: یک فرمت استاندارد برای ذخیره توالی‌های DNA، RNA و پروتئین است که شامل Header و Sequence می‌شود.


2. سوال مفهومی:

چرا Header فایل FASTA را در تحلیل ژنوم حذف می‌کنیم؟

پاسخ: زیرا Header فقط شامل اطلاعات توصیفی است و بخشی از توالی واقعی DNA نیست.


3. سوال کاربردی:

اگر بخواهیم یک فایل را فقط برای خواندن باز کنیم، چه حالت‌هایی استفاده می‌کنیم؟

پاسخ:

open(filename, 'r')

4. سوال مفهومی:

چرا مجموع تعداد A، C، G و T باید برابر طول ژنوم باشد؟

پاسخ: زیرا هر موقعیت در DNA دقیقاً یکی از این چهار باز را دارد.


5. سوال کاربردی:

وظیفه دستور زیر چیست؟

collections.Counter(genome)

پاسخ: تعداد تکرار هر کاراکتر در رشته ژنوم را محاسبه می‌کند.


6. سوال مفهومی:

تفاوت Dictionary و Counter در این مثال چیست؟

پاسخ: هر دو برای شمارش بازها استفاده می‌شوند، اما Dictionary نیاز به پیاده‌سازی دستی دارد، در حالی که Counter این عملیات را به صورت آماده انجام می‌دهد.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/09_lecture-how-dna-gets-copied

نحوه کپی شدن DNA و اساس عملکرد Sequencing by Synthesis


خلاصه کلی

در این درس، سازوکار اصلی نسل دوم فناوری‌های توالی‌یابی DNA (Second Generation Sequencing) بررسی می‌شود. این فناوری که با نام Sequencing by Synthesis (توالی‌یابی بر اساس سنتز) نیز شناخته می‌شود، از فرآیند طبیعی کپی شدن DNA در سلول‌ها الهام گرفته است.

هدف یادگیری این بخش:

  • درک نحوه تکثیر طبیعی DNA
  • آشنایی با نقش آنزیم DNA Polymerase
  • فهم این موضوع که چگونه دستگاه‌های توالی‌یابی نسل دوم با مشاهده فرآیند ساخت رشته جدید DNA، توالی رشته اصلی را تشخیص می‌دهند.

مفاهیم کلیدی


1. DNA Replication

همانندسازی DNA

تعریف ساده

فرآیندی که طی آن یک مولکول DNA دو رشته‌ای به دو نسخه مشابه تبدیل می‌شود.

توضیح دقیق

هر سلول بدن تقریباً یک نسخه از ژنوم کامل خود را دارد. هنگامی که سلول تقسیم می‌شود، باید اطلاعات ژنتیکی خود را به سلول‌های دختر منتقل کند.

مراحل کلی همانندسازی:

  1. DNA دو رشته‌ای اولیه وجود دارد.
  2. دو رشته از یکدیگر جدا می‌شوند.
  3. هر رشته به عنوان الگو (Template) برای ساخت یک رشته جدید استفاده می‌شود.
  4. در نهایت دو مولکول DNA دو رشته‌ای مشابه ایجاد می‌شود.

اهمیت

همانندسازی DNA اساس:

  • رشد سلول‌ها
  • تقسیم سلولی
  • انتقال اطلاعات ژنتیکی

است.


2. Double-Stranded DNA

DNA دو رشته‌ای

تعریف ساده

ساختاری از DNA که شامل دو رشته مکمل از نوکلئوتیدها است.

توضیح دقیق

DNA به شکل یک Double Helix (مارپیچ دوگانه) وجود دارد.

دو رشته DNA توسط جفت‌های مکمل بازها به هم متصل هستند:

باز باز مکمل
A (Adenine) T (Thymine)
C (Cytosine) G (Guanine)

برای مثال:

  • G همیشه با C جفت می‌شود.
  • A همیشه با T جفت می‌شود.

اهمیت

خاصیت مکمل بودن بازها باعث می‌شود:

  • اطلاعات DNA قابل کپی شدن باشد.
  • هر رشته بتواند به عنوان الگو عمل کند.

3. DNA Template Strand

رشته الگو DNA

تعریف ساده

رشته‌ای از DNA که اطلاعات لازم برای ساخت رشته مکمل جدید را فراهم می‌کند.

توضیح دقیق

پس از جدا شدن دو رشته DNA:

هر رشته دارای اطلاعات کافی برای ساخت نسخه مکمل خود است.

مثلاً:

اگر یک رشته شامل:

G

باشد، رشته جدید باید:

C

در مقابل آن قرار دهد.


اهمیت

رشته الگو پایه‌ای است که DNA Polymerase بر اساس آن رشته جدید را می‌سازد.


4. DNA Polymerase

آنزیم DNA پلی‌مراز

تعریف ساده

آنزیمی که رشته جدید DNA را با اضافه کردن نوکلئوتیدهای مکمل می‌سازد.


توضیح دقیق

DNA Polymerase مانند یک ماشین مولکولی عمل می‌کند:

ورودی‌ها:

  • یک رشته DNA تک‌رشته‌ای (Template)
  • نوکلئوتیدهای آزاد موجود در محیط

خروجی:

  • یک رشته DNA مکمل جدید

مثال:

اگر رشته الگو:

G A T C

باشد، DNA Polymerase رشته مکمل:

C T A G

را می‌سازد.


اهمیت

DNA Polymerase نقش اصلی را در:

  • تکثیر DNA
  • فناوری‌های توالی‌یابی نسل دوم

دارد.


5. Sequencing by Synthesis (SBS)

توالی‌یابی بر اساس سنتز

تعریف ساده

روشی برای تعیین توالی DNA با مشاهده فرآیند ساخت رشته جدید توسط DNA Polymerase.


توضیح دقیق

نسل دوم دستگاه‌های توالی‌یابی از فرآیند طبیعی همانندسازی DNA تقلید می‌کنند.

ایده اصلی:

  1. یک رشته DNA به عنوان Template قرار می‌گیرد.
  2. DNA Polymerase شروع به ساخت رشته مکمل می‌کند.
  3. دستگاه اضافه شدن هر نوکلئوتید را مشاهده می‌کند.
  4. از این اطلاعات، توالی DNA اولیه استخراج می‌شود.

اهمیت

این روش پایه بسیاری از فناوری‌های مدرن توالی‌یابی است و امکان تحلیل:

  • میلیون‌ها
  • حتی میلیاردها

مولکول DNA به صورت همزمان را فراهم کرده است.


6. Second Generation Sequencing

توالی‌یابی نسل دوم

تعریف ساده

نسلی از فناوری‌های توالی‌یابی DNA که قادر است تعداد بسیار زیادی قطعه DNA را به صورت موازی بررسی کند.


توضیح دقیق

این فناوری به جای خواندن یک مولکول DNA در هر لحظه، تعداد بسیار زیادی Template را همزمان بررسی می‌کند.

مزیت اصلی:

Massively Parallel Sequencing

یعنی:

انجام میلیون‌ها فرآیند توالی‌یابی به طور همزمان.


اهمیت

باعث شد:

  • هزینه توالی‌یابی کاهش یابد.
  • سرعت افزایش پیدا کند.
  • پروژه‌های بزرگ ژنومی امکان‌پذیر شوند.

نکات مهم

  • DNA دو رشته‌ای از دو رشته مکمل تشکیل شده است.
  • مکمل بودن بازها اساس کپی شدن DNA است.
  • هنگام تقسیم سلولی، DNA ابتدا به دو رشته جدا تقسیم می‌شود.
  • هر رشته DNA می‌تواند Template باشد.
  • DNA Polymerase رشته مکمل را می‌سازد.
  • فناوری Sequencing by Synthesis از همین فرآیند طبیعی تقلید می‌کند.
  • دستگاه توالی‌یابی مستقیماً DNA را «نمی‌خواند»، بلکه فرآیند ساخت رشته جدید را مشاهده می‌کند.
  • هدف نهایی این است که این مشاهده برای تعداد بسیار زیادی DNA Template به صورت همزمان انجام شود.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
DNA Replication همانندسازی DNA فرآیند ایجاد نسخه جدید از DNA
Double-Stranded DNA DNA دو رشته‌ای DNA شامل دو رشته مکمل
Single-Stranded DNA DNA تک‌رشته‌ای یک رشته جداشده از DNA دو رشته‌ای
Template Strand رشته الگو رشته‌ای که برای ساخت رشته مکمل استفاده می‌شود
Complementary Base Pair جفت باز مکمل ارتباط A-T و C-G در DNA
DNA Polymerase DNA پلی‌مراز آنزیم سازنده رشته جدید DNA
Nucleotide نوکلئوتید واحد سازنده DNA
Sequencing by Synthesis (SBS) توالی‌یابی بر اساس سنتز روش تعیین توالی با مشاهده سنتز DNA
Second Generation Sequencing توالی‌یابی نسل دوم فناوری‌های سریع و موازی توالی‌یابی
Massively Parallel Sequencing توالی‌یابی بسیار موازی انجام تعداد بسیار زیادی واکنش توالی‌یابی همزمان

مثال‌ها و تشبیه‌ها

تشبیه DNA به نردبان لگویی

مدرس DNA دو رشته‌ای را مانند دو برج لگویی کنار هم توضیح می‌دهد:

  • دو ستون لگو → دو رشته DNA
  • قطعات متصل‌کننده → جفت بازهای مکمل

وقتی DNA کپی می‌شود:

  • این نردبان از وسط جدا می‌شود.
  • هر نیمه تبدیل به الگو می‌شود.
  • قطعات جدید لگو بر اساس مکمل بودن اضافه می‌شوند.
  • در نهایت دو نردبان کامل مشابه ساخته می‌شود.

تشبیه DNA Polymerase

DNA Polymerase مانند یک دستگاه ساخت‌وساز است:

  • نقشه ساختمان → رشته Template
  • مصالح → نوکلئوتیدها
  • کارگر سازنده → DNA Polymerase

این آنزیم بر اساس نقشه، ساختمان جدید DNA را می‌سازد.


خلاصه نهایی مرور سریع

  • DNA دارای ساختار دو رشته‌ای و مارپیچ دوگانه است.
  • بازهای DNA به صورت مکمل جفت می‌شوند: A-T و C-G.
  • همانندسازی DNA با جدا شدن دو رشته آغاز می‌شود.
  • هر رشته جداشده به عنوان Template عمل می‌کند.
  • DNA Polymerase رشته مکمل جدید را می‌سازد.
  • Sequencing by Synthesis از فرآیند طبیعی کپی DNA استفاده می‌کند.
  • در این روش، فعالیت DNA Polymerase مشاهده می‌شود تا توالی DNA تعیین شود.
  • توالی‌یابی نسل دوم قادر است میلیون‌ها DNA Template را همزمان بررسی کند.
  • مزیت اصلی این فناوری، سرعت بالا و هزینه کمتر است.
  • اساس بسیاری از فناوری‌های مدرن ژنومیک، مشاهده فرآیند سنتز DNA است.

سوالات مرور

1. سوال تعریفی:

DNA Polymerase چیست و چه کاری انجام می‌دهد؟

پاسخ: DNA Polymerase آنزیمی است که با استفاده از یک رشته DNA به عنوان Template، رشته مکمل جدید را با اضافه کردن نوکلئوتیدها می‌سازد.


2. سوال مفهومی:

چرا هر رشته DNA می‌تواند به عنوان Template استفاده شود؟

پاسخ: زیرا دو رشته DNA مکمل یکدیگر هستند و اطلاعات یک رشته برای ساخت رشته دیگر کافی است.


3. سوال کاربردی:

Sequencing by Synthesis چگونه توالی DNA را مشخص می‌کند؟

پاسخ: با مشاهده فرآیند اضافه شدن نوکلئوتیدها توسط DNA Polymerase، توالی رشته DNA الگو را استخراج می‌کند.


4. سوال مفهومی:

تفاوت اصلی توالی‌یابی نسل دوم با روش‌های قدیمی چیست؟

پاسخ: نسل دوم می‌تواند تعداد بسیار زیادی مولکول DNA را به صورت موازی توالی‌یابی کند، در حالی که روش‌های قدیمی معمولاً تعداد محدودی مولکول را بررسی می‌کردند.


5. سوال کاربردی:

اگر در یک رشته DNA باز G وجود داشته باشد، DNA Polymerase چه نوکلئوتیدی را اضافه می‌کند؟

پاسخ: نوکلئوتید C، زیرا G و C مکمل یکدیگر هستند.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/10_optional-lecture-how-second-generation-sequencers-work

نحوه عملکرد Sequencing by Synthesis در توالی‌یابی نسل دوم

How Second Generation Sequencers Work


خلاصه کلی

در این درس، جزئیات عملکرد توالی‌یابی نسل دوم (Second Generation Sequencing) بررسی می‌شود. این فناوری که مبتنی بر روش Sequencing by Synthesis (SBS) است، با مشاهده فرآیند ساخت رشته جدید DNA توسط DNA Polymerase، توالی DNA را تعیین می‌کند.

ایده اصلی این روش:

  • DNA ژنوم به قطعات کوچک تقسیم می‌شود.
  • قطعات DNA به صورت رشته‌های تک‌رشته‌ای روی یک سطح قرار می‌گیرند.
  • DNA Polymerase شروع به ساخت رشته مکمل می‌کند.
  • هر بار فقط یک نوکلئوتید اضافه می‌شود.
  • اضافه شدن نوکلئوتید با رنگ‌های فلورسنت ثبت می‌شود.
  • با تکرار این فرآیند، توالی کامل هر قطعه DNA استخراج می‌شود.

هدف یادگیری این بخش:

  • درک معماری آزمایشگاهی Sequencing by Synthesis
  • فهم نقش نوکلئوتیدهای اصلاح‌شده (Terminated Bases)
  • شناخت مفهوم Sequencing Cycle
  • درک دلیل توانایی توالی‌یابی میلیون‌ها یا میلیاردها DNA به صورت موازی

مفاهیم کلیدی


1. DNA Fragmentation

قطعه‌قطعه کردن DNA

تعریف ساده

فرآیند شکستن DNA بزرگ (مانند ژنوم کامل انسان) به قطعات کوچک‌تر برای توالی‌یابی.


توضیح دقیق

دستگاه‌های توالی‌یابی نسل دوم قادر به خواندن DNA بسیار طولانی نیستند؛ بنابراین ابتدا DNA به قطعات کوچک تقسیم می‌شود.

مراحل اولیه:

  1. نمونه زیستی (مثلاً خون) دریافت می‌شود.
  2. DNA استخراج می‌شود.
  3. DNA به قطعات کوتاه تقسیم می‌شود.
  4. قطعات به شکل رشته‌های تک‌رشته‌ای درمی‌آیند.

اهمیت

این کار امکان خواندن میلیون‌ها قطعه کوچک DNA را فراهم می‌کند که بعداً می‌توان از آن‌ها برای بازسازی اطلاعات ژنومی استفاده کرد.


2. Single-Stranded DNA Templates

الگوهای DNA تک‌رشته‌ای

تعریف ساده

قطعات DNA تک‌رشته‌ای که روی سطح دستگاه قرار می‌گیرند و قرار است توالی آن‌ها تعیین شود.


توضیح دقیق

پس از آماده‌سازی DNA، قطعات تک‌رشته‌ای به صورت تصادفی روی یک سطح صاف مانند یک اسلاید قرار می‌گیرند.

هر قطعه:

  • یک Template مستقل است.
  • یک Read (خوانش توالی) تولید می‌کند.

در یک دستگاه واقعی:

  • تعداد Templateها بسیار زیاد است.
  • میلیون‌ها یا میلیاردها قطعه DNA روی یک سطح قرار دارند.

اهمیت

قرار دادن تعداد زیادی Template در کنار هم، اساس Massively Parallel Sequencing است.


3. DNA Polymerase in Sequencing

نقش DNA Polymerase در توالی‌یابی

تعریف ساده

آنزیمی که با اضافه کردن نوکلئوتیدهای مکمل، رشته جدید DNA را می‌سازد.


توضیح دقیق

در روش SBS:

به محیط واکنش اضافه می‌شود:

  • DNA Polymerase
  • نوکلئوتیدهای آزاد

DNA Polymerase:

  1. Template را می‌خواند.
  2. نوکلئوتید مکمل را انتخاب می‌کند.
  3. آن را به رشته جدید اضافه می‌کند.

مثال:

اگر Template دارای:

G

باشد، Polymerase:

C

را اضافه می‌کند.


اهمیت

فعالیت DNA Polymerase همان چیزی است که اطلاعات توالی DNA را قابل مشاهده می‌کند.


4. Terminated Bases

نوکلئوتیدهای متوقف‌کننده

تعریف ساده

نوکلئوتیدهای اصلاح‌شده‌ای که پس از اضافه شدن، اجازه ادامه ساخت رشته DNA را نمی‌دهند.


توضیح دقیق

در توالی‌یابی نسل دوم، نوکلئوتیدهای معمولی استفاده نمی‌شوند، بلکه نوکلئوتیدهایی استفاده می‌شوند که دارای:

Terminator

هستند.

این بخش مانند یک مانع عمل می‌کند.

نتیجه:

  • DNA Polymerase فقط یک نوکلئوتید اضافه می‌کند.
  • سپس متوقف می‌شود.

اهمیت

اگر Polymerase بدون توقف ادامه دهد، نمی‌توان فهمید در هر مرحله چه نوکلئوتیدی اضافه شده است.

Terminator باعث می‌شود همه Templateها در یک مرحله زمانی هماهنگ باقی بمانند.


5. Fluorescent Detection

شناسایی فلورسنت

تعریف ساده

تشخیص نوع نوکلئوتید اضافه‌شده با استفاده از رنگ‌های نوری.


توضیح دقیق

هر نوع نوکلئوتید یک رنگ مخصوص دارد.

مثلاً:

باز رنگ فرضی
A رنگ خاص
T رنگ خاص
C نارنجی
G قرمز

پس از اضافه شدن یک نوکلئوتید:

  • Terminator آن نور تولید می‌کند.
  • دوربین از سطح اسلاید عکس می‌گیرد.
  • رنگ مشاهده‌شده مشخص می‌کند چه بازی اضافه شده است.

اهمیت

این تصاویر داده اصلی برای تعیین توالی DNA هستند.


6. Sequencing Cycle

چرخه توالی‌یابی

تعریف ساده

یک دور کامل از فرآیند اضافه کردن یک نوکلئوتید، تصویربرداری و آماده‌سازی برای مرحله بعد.


مراحل یک Sequencing Cycle

مرحله 1:

اضافه کردن:

  • DNA Polymerase
  • Terminated Bases

مرحله 2:

اضافه شدن یک نوکلئوتید به هر Template

مرحله 3:

گرفتن تصویر از سطح

مرحله 4:

حذف Terminatorها

مرحله 5:

شروع چرخه بعدی


اهمیت

هر چرخه یک موقعیت از توالی DNA را مشخص می‌کند.

با تکرار چرخه‌ها، رشته کامل خوانده می‌شود.


7. Massively Parallel Sequencing

توالی‌یابی بسیار موازی

تعریف ساده

توانایی توالی‌یابی تعداد بسیار زیادی DNA Template به صورت همزمان.


توضیح دقیق

در یک سطح بزرگ:

  • هر نقطه روی تصویر مربوط به یک Template است.
  • دوربین می‌تواند میلیون‌ها نقطه را همزمان ثبت کند.
  • هر نقطه یک توالی مستقل تولید می‌کند.

اهمیت

این ویژگی باعث شده است که:

  • ژنوم انسان سریع‌تر خوانده شود.
  • هزینه توالی‌یابی کاهش یابد.
  • پروژه‌های بزرگ ژنومی امکان‌پذیر شوند.

نکات مهم

  • Sequencing by Synthesis از فرآیند طبیعی DNA Replication تقلید می‌کند.
  • DNA ابتدا به قطعات کوچک تقسیم می‌شود.
  • هر قطعه DNA یک Template مستقل ایجاد می‌کند.
  • میلیون‌ها Template روی یک سطح قرار می‌گیرند.
  • DNA Polymerase رشته مکمل را می‌سازد.
  • نوکلئوتیدهای Terminator باعث توقف موقت سنتز می‌شوند.
  • رنگ فلورسنت هر نوکلئوتید اطلاعات مربوط به آن را ثبت می‌کند.
  • هر عکس مربوط به یک Sequencing Cycle است.
  • توالی یک Template از دنبال کردن رنگ‌های آن در چرخه‌های مختلف استخراج می‌شود.
  • Terminatorها باعث هماهنگی تمام واکنش‌ها می‌شوند.

مثال‌ها و تشبیه‌ها

تشبیه اسلاید به صفحه لگو

مدرس فرآیند را با لگو توضیح می‌دهد:

  • اسلاید → صفحه بزرگ لگو
  • Templateهای DNA → قطعات اولیه لگو روی صفحه
  • DNA Polymerase → سازنده لگو
  • نوکلئوتیدها → قطعات جدید لگو
  • Terminator → قطعه‌ای که اجازه قرار گرفتن قطعه بعدی را نمی‌دهد

هر بار فقط یک قطعه اضافه می‌شود، سپس از کل صفحه عکس گرفته می‌شود.


مثال استخراج یک توالی

فرض کنیم یک Template در چند چرخه این رنگ‌ها را نشان دهد:

Orange → Green → Blue → Green → Red → Red

هر رنگ نشان‌دهنده یک باز DNA است.

با تبدیل رنگ‌ها به بازها و گرفتن مکمل آن‌ها، توالی Template به دست می‌آید.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Second Generation Sequencing توالی‌یابی نسل دوم فناوری سریع و موازی تعیین توالی DNA
Sequencing by Synthesis (SBS) توالی‌یابی بر اساس سنتز تعیین توالی با مشاهده ساخت رشته جدید
Template Strand رشته الگو رشته‌ای که Polymerase بر اساس آن DNA جدید می‌سازد
DNA Fragmentation قطعه‌قطعه شدن DNA تقسیم DNA بزرگ به قطعات کوچک‌تر
DNA Polymerase DNA پلی‌مراز آنزیم سازنده رشته مکمل
Terminated Base نوکلئوتید متوقف‌کننده نوکلئوتیدی که سنتز را پس از اضافه شدن متوقف می‌کند
Terminator عامل توقف بخش اصلاح‌شده نوکلئوتید که مانع ادامه سنتز می‌شود
Fluorescence فلورسانس تولید نور توسط مولکول‌های رنگی
Sequencing Cycle چرخه توالی‌یابی یک مرحله کامل از اضافه کردن باز و تصویربرداری
Read خوانش توالی کوتاهی که از یک Template به دست می‌آید
Massively Parallel Sequencing توالی‌یابی بسیار موازی بررسی تعداد بسیار زیادی DNA همزمان

خلاصه نهایی مرور سریع

  • نسل دوم توالی‌یابی بر پایه Sequencing by Synthesis کار می‌کند.
  • DNA ژنوم ابتدا استخراج و به قطعات کوچک تقسیم می‌شود.
  • قطعات DNA به صورت Templateهای تک‌رشته‌ای روی سطح قرار می‌گیرند.
  • DNA Polymerase رشته مکمل را می‌سازد.
  • نوکلئوتیدهای Terminator باعث توقف پس از اضافه شدن یک باز می‌شوند.
  • هر باز دارای رنگ فلورسنت مخصوص است.
  • دوربین از سطح تصویر می‌گیرد تا باز اضافه‌شده مشخص شود.
  • حذف Terminator امکان ادامه چرخه را فراهم می‌کند.
  • هر Sequencing Cycle یک موقعیت از توالی DNA را مشخص می‌کند.
  • میلیون‌ها Template می‌توانند همزمان توالی‌یابی شوند.
  • دلیل قدرت نسل دوم Sequencing، Parallel Processing در مقیاس بسیار بزرگ است.

سوالات مرور

1. سوال تعریفی:

Sequencing by Synthesis چیست؟

پاسخ: روشی برای تعیین توالی DNA که در آن با مشاهده فرآیند ساخت رشته مکمل توسط DNA Polymerase، توالی DNA مشخص می‌شود.


2. سوال مفهومی:

چرا از Terminated Bases در توالی‌یابی نسل دوم استفاده می‌شود؟

پاسخ: زیرا باعث می‌شوند DNA Polymerase فقط یک نوکلئوتید اضافه کند و امکان ثبت دقیق مرحله به مرحله توالی فراهم شود.


3. سوال کاربردی:

اگر در یک Sequencing Cycle رنگ یک نقطه مشخص شود، این اطلاعات چه چیزی را نشان می‌دهد؟

پاسخ: نشان می‌دهد چه نوکلئوتیدی به آن Template اضافه شده است.


4. سوال مفهومی:

چرا Second Generation Sequencing را Massively Parallel می‌نامند؟

پاسخ: زیرا میلیون‌ها یا میلیاردها Template DNA را به صورت همزمان توالی‌یابی می‌کند.


5. سوال کاربردی:

چگونه از مجموعه تصاویر چرخه‌های مختلف، توالی یک Template استخراج می‌شود؟

پاسخ: رنگ‌های ثبت‌شده در هر چرخه به بازهای DNA تبدیل می‌شوند و با استفاده از مکمل بودن بازها، توالی Template مشخص می‌شود.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/11_optional-lecture-sequencing-errors-and-base-qualities

خطاهای توالی‌یابی و کیفیت بازها

Sequencing Errors and Base Qualities


خلاصه کلی

در این درس، نحوه ایجاد خطا در فناوری‌های نسل دوم توالی‌یابی (Second Generation Sequencing) بررسی می‌شود. اگرچه روش Sequencing by Synthesis قادر است میلیاردها قطعه DNA را به‌صورت موازی توالی‌یابی کند، اما در طی فرآیند ممکن است خطاهایی رخ دهد.

هدف این بخش:

  • شناخت علت ایجاد خطا در داده‌های توالی‌یابی
  • آشنایی با مفهوم Base Calling
  • درک مفهوم Base Quality Score و نحوه بیان میزان اطمینان به هر باز خوانده‌شده

مفاهیم کلیدی

1. Template Amplification (تکثیر قالب‌ها)

تعریف ساده

قبل از شروع توالی‌یابی، قطعات DNA روی سطح دستگاه تکثیر می‌شوند تا از هر قطعه، تعداد زیادی نسخه مشابه ایجاد شود.

توضیح دقیق

در فرآیند Sequencing by Synthesis، ابتدا قطعات کوتاه DNA به سطح یک اسلاید متصل می‌شوند. اما یک مولکول DNA به‌تنهایی نور کافی برای تشخیص توسط دوربین ایجاد نمی‌کند.

بنابراین دستگاه ابتدا از هر Template، تعداد زیادی نسخه مشابه تولید می‌کند که در نزدیکی یکدیگر قرار می‌گیرند. این مجموعه نسخه‌های مشابه یک Cluster تشکیل می‌دهد.

به این ترتیب، هنگام اضافه شدن بازهای فلورسنت، نور حاصل از میلیون‌ها نسخه مشابه قابل تشخیص خواهد بود.

اهمیت

  • افزایش شدت سیگنال نوری
  • امکان تصویربرداری دقیق از باز اضافه‌شده
  • فراهم کردن امکان توالی‌یابی massively parallel

2. Cluster (خوشه DNA)

تعریف ساده

گروهی از نسخه‌های یکسان یک قطعه DNA که در یک نقطه از سطح توالی‌یاب قرار گرفته‌اند.

توضیح دقیق

در دستگاه‌های نسل دوم، هر نقطه روی اسلاید نمایانگر یک DNA template است، اما در عمل آن نقطه شامل میلیون‌ها نسخه مشابه از همان DNA است.

دوربین دستگاه نور منتشرشده از کل این خوشه را ثبت می‌کند.

اهمیت

اطلاعات یک Cluster باعث می‌شود دستگاه بتواند:

  • باز اضافه‌شده را تشخیص دهد.
  • شدت سیگنال را اندازه‌گیری کند.
  • میزان اطمینان از نتیجه را تخمین بزند.

3. Synchronization Error (خطای همگام‌سازی)

تعریف ساده

خطایی که باعث می‌شود برخی رشته‌های DNA در یک Cluster از سایر رشته‌ها جلوتر یا عقب‌تر قرار گیرند.

توضیح دقیق

در حالت ایده‌آل، تمام DNAهای یک Cluster باید در هر Cycle یک باز دریافت کنند.

اما ممکن است در یکی از چرخه‌ها، یک باز به‌طور تصادفی Terminated نباشد.

در این حالت:

  1. DNA Polymerase آن باز را اضافه می‌کند.
  2. چون Terminator وجود ندارد، ساخت رشته متوقف نمی‌شود.
  3. Polymerase باز بعدی را نیز اضافه می‌کند.
  4. این رشته از سایر رشته‌های Cluster جلو می‌افتد.

در چرخه‌های بعدی، بخشی از DNAها در یک مرحله و بخش دیگر در مرحله دیگری قرار دارند.

نتیجه:

  • چند رنگ مختلف در یک تصویر مشاهده می‌شود.
  • تشخیص باز صحیح دشوارتر می‌شود.

اهمیت

این خطا یکی از منابع اصلی کاهش کیفیت خوانش‌ها در توالی‌یابی نسل دوم است.


4. Base Caller (تشخیص‌دهنده باز)

تعریف ساده

نرم‌افزاری که تصاویر حاصل از دستگاه توالی‌یاب را تحلیل می‌کند و مشخص می‌کند هر موقعیت DNA چه بازی دارد.

توضیح دقیق

دستگاه توالی‌یابی در هر Cycle یک تصویر تولید می‌کند.

Base Caller:

  • رنگ نورهای ثبت‌شده را بررسی می‌کند.
  • رنگ غالب را به یک باز DNA تبدیل می‌کند.
  • میزان اطمینان خود را نیز گزارش می‌دهد.

مثال:

اگر تمام نورهای یک Cluster نارنجی باشند:

→ احتمالاً باز مشخص‌شده قطعی است.

اما اگر ترکیبی از نارنجی و قرمز مشاهده شود:

→ احتمال خطا وجود دارد.

اهمیت

Base Caller رابط بین داده خام تصویری و داده قابل تحلیل ژنومی است.


5. Base Quality Score (امتیاز کیفیت باز)

تعریف ساده

عددی که نشان می‌دهد نرم‌افزار چقدر احتمال می‌دهد باز گزارش‌شده اشتباه باشد.

توضیح دقیق

برای هر باز خوانده‌شده، دستگاه یک مقدار کیفیت ارائه می‌کند.

این مقدار با رابطه زیر تعریف می‌شود:

[ Q = -10 \log_{10}(p) ]

که در آن:

  • Q = امتیاز کیفیت باز (Base Quality)
  • p = احتمال اشتباه بودن باز گزارش‌شده

هرچه Q بزرگ‌تر باشد:

  • احتمال خطا کمتر است.
  • اطمینان به باز بیشتر است.

تفسیر Base Quality

Base Quality (Q) احتمال خطا
10 1 در 10
20 1 در 100
30 1 در 1000

بنابراین:

  • افزایش 10 واحد در Q یعنی کاهش 10 برابری احتمال خطا.

6. تخمین احتمال خطا از شدت نور

توضیح

Base Caller برای تعیین کیفیت، میزان تضاد بین رنگ مشاهده‌شده و رنگ‌های مخالف را بررسی می‌کند.

مثلاً:

فرض کنیم رنگ غالب نارنجی است و نارنجی نشان‌دهنده باز C است.

اما مقداری نور سبز نیز وجود دارد.

اگر:

  • نور نارنجی = سیگنال موافق با C
  • نور سبز = سیگنال مخالف

باشد، مقدار نور مخالف می‌تواند برای تخمین احتمال خطا استفاده شود.

یک روش ساده:

[ p = \frac{\text{نور مخالف}}{\text{کل نور}} ]

مثال:

اگر:

  • 3 واحد نور مخالف وجود داشته باشد.
  • کل نور 9 واحد باشد.

آنگاه:

[ p=\frac{3}{9}=\frac{1}{3} ]

و کیفیت باز:

[ Q=-10\log_{10}(1/3) ]

تقریباً:

[ Q=4.77 ]

یعنی احتمال خطا نسبتاً بالا است.


نکات مهم

  • فناوری‌های نسل دوم توالی‌یابی بر اساس مشاهده فرآیند ساخت رشته مکمل DNA کار می‌کنند.
  • قبل از خواندن DNA، Templateها تکثیر می‌شوند تا Cluster تشکیل شود.
  • هر Cluster شامل تعداد زیادی نسخه مشابه از یک DNA است.
  • خطای بدون Terminator باعث می‌شود برخی رشته‌ها از بقیه جلو بیفتند.
  • همگام نبودن رشته‌ها باعث ایجاد چند رنگ در یک تصویر می‌شود.
  • Base Caller تصاویر را به توالی DNA تبدیل می‌کند.
  • هر Base Call همراه با یک Base Quality ارائه می‌شود.
  • Base Quality احتمال اشتباه بودن باز گزارش‌شده را نشان می‌دهد.
  • مقدار Q در مقیاس لگاریتمی بیان می‌شود تا تفسیر آن آسان‌تر باشد.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Sequencing by Synthesis توالی‌یابی با سنتز روشی که در آن با مشاهده اضافه شدن بازهای جدید، توالی DNA تعیین می‌شود.
Template Strand رشته قالب رشته DNA که برای ساخت رشته مکمل استفاده می‌شود.
Amplification تکثیر ایجاد نسخه‌های متعدد از یک قطعه DNA.
Cluster خوشه مجموعه‌ای از نسخه‌های یکسان DNA در یک نقطه از اسلاید.
Terminator پایان‌دهنده مولکولی که مانع اضافه شدن باز بعدی می‌شود.
Sequencing Cycle چرخه توالی‌یابی یک مرحله از اضافه شدن باز، تصویربرداری و ثبت اطلاعات.
Base Caller تشخیص‌دهنده باز نرم‌افزار تبدیل تصاویر به توالی DNA.
Base Call باز تعیین‌شده باز نهایی گزارش‌شده برای یک موقعیت DNA.
Base Quality Score امتیاز کیفیت باز مقدار نشان‌دهنده میزان اطمینان به یک Base Call.
Synchronization Error خطای همگام‌سازی خارج شدن رشته‌های یک Cluster از هماهنگی با یکدیگر.

مثال‌ها و تشبیه‌ها

مثال LEGO برای خطای توالی‌یابی

فرض کنید چند نفر همزمان در حال ساختن یک دیوار LEGO مشابه هستند.

اگر یکی از افراد به اشتباه قطعه‌ای اضافه کند که نباید اضافه می‌شد، از بقیه جلو می‌افتد.

وقتی از همه عکس گرفته شود:

  • بیشتر افراد یک وضعیت دارند.
  • فرد اشتباه‌کرده وضعیت متفاوتی دارد.

در نتیجه تصویر شامل چند حالت مختلف خواهد بود.

در DNA sequencing نیز:

  • رشته‌های درست یک رنگ تولید می‌کنند.
  • رشته‌های جلو افتاده رنگ دیگری تولید می‌کنند.

و دستگاه در تعیین باز دچار عدم قطعیت می‌شود.


خلاصه نهایی مرور سریع

  • در Sequencing by Synthesis، دستگاه از فرآیند ساخت رشته مکمل DNA برای تعیین توالی استفاده می‌کند.
  • قبل از توالی‌یابی، DNAها تکثیر می‌شوند تا Cluster ایجاد شود.
  • Cluster باعث افزایش شدت سیگنال و امکان تصویربرداری می‌شود.
  • اضافه شدن یک باز بدون Terminator باعث خطای همگام‌سازی می‌شود.
  • خطای همگام‌سازی باعث ترکیب چند سیگنال رنگی در یک موقعیت می‌شود.
  • Base Caller تصاویر را تحلیل کرده و بازها را تعیین می‌کند.
  • هر Base Call دارای یک Base Quality Score است.
  • Base Quality احتمال اشتباه بودن یک باز را تخمین می‌زند.
  • کیفیت Q=20 یعنی احتمال خطا حدود ۱٪ است.
  • کیفیت Q=30 یعنی احتمال خطا حدود ۰٫۱٪ است.
  • مقیاس کیفیت باز به صورت لگاریتمی تعریف شده است.

سوالات مرور

1. چرا قبل از توالی‌یابی DNA، Templateها تکثیر می‌شوند؟

پاسخ: زیرا یک مولکول DNA نور کافی تولید نمی‌کند. با ایجاد Clusterهای بزرگ، سیگنال فلورسنت تقویت شده و توسط دوربین قابل تشخیص می‌شود.


2. Base Caller چه کاری انجام می‌دهد؟

پاسخ: Base Caller تصاویر حاصل از چرخه‌های توالی‌یابی را تحلیل کرده و باز DNA را تعیین می‌کند.


3. علت ایجاد Synchronization Error چیست؟

پاسخ: اگر یک باز بدون Terminator اضافه شود، Polymerase می‌تواند بازهای بیشتری اضافه کند و آن رشته از سایر رشته‌های Cluster جلو بیفتد.


4. Base Quality Score چه چیزی را نشان می‌دهد؟

پاسخ: احتمال اشتباه بودن باز گزارش‌شده را نشان می‌دهد.


5. تفاوت Q=10 و Q=30 چیست؟

پاسخ: در Q=10 احتمال خطا ۱ در ۱۰ است، اما در Q=30 احتمال خطا ۱ در ۱۰۰۰ است؛ بنابراین Q=30 بسیار قابل اعتمادتر است.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/12_lecture-sequencing-reads-in-fastq-format

فرمت FASTQ و نمایش کیفیت خوانش‌های توالی‌یابی

Sequencing Reads in FASTQ Format


خلاصه کلی

در این درس با ساختار فایل‌های FASTQ که یکی از رایج‌ترین فرمت‌ها برای ذخیره داده‌های حاصل از DNA Sequencing است آشنا می‌شویم.

هر Sequencing Read در FASTQ شامل چهار خط اطلاعاتی است که مهم‌ترین آن‌ها:

  1. توالی بازهای DNA خوانده‌شده توسط دستگاه
  2. کیفیت هر باز (Base Quality Score)

است.

هدف یادگیری این بخش:

  • شناخت ساختار فایل FASTQ
  • درک ارتباط بین Sequence و Base Quality
  • آشنایی با نحوه ذخیره کیفیت بازها به صورت کاراکترهای ASCII
  • آشنایی با استاندارد Phred+33 Encoding

مفاهیم کلیدی


1. FASTQ Format (فرمت FASTQ)

تعریف ساده

FASTQ یک فرمت استاندارد برای ذخیره اطلاعات مربوط به خوانش‌های توالی‌یابی (Sequencing Reads) است.

توضیح دقیق

هر Read در فایل FASTQ دقیقاً شامل چهار خط متوالی است:

Line 1: نام Read
Line 2: توالی DNA
Line 3: خط جداکننده (Placeholder)
Line 4: کیفیت بازها

یک فایل FASTQ بزرگ از تعداد زیادی Read تشکیل شده است که پشت سر هم قرار گرفته‌اند.

ساختار کلی:

Read 1
 ├── نام
 ├── Sequence
 ├── +
 └── Quality

Read 2
 ├── نام
 ├── Sequence
 ├── +
 └── Quality
...

2. Read Name (نام خوانش)

تعریف ساده

شناسه‌ای که به هر Sequencing Read اختصاص داده می‌شود.

توضیح دقیق

خط اول FASTQ معمولاً اطلاعاتی مانند موارد زیر را شامل می‌شود:

  • شناسه دستگاه توالی‌یابی
  • اطلاعات آزمایش
  • موقعیت Cluster روی اسلاید
  • سایر اطلاعات مربوط به اجرای آزمایش

اما در بسیاری از تحلیل‌های بیوانفورماتیکی، این اطلاعات مستقیماً برای تحلیل توالی استفاده نمی‌شود.

اهمیت

اگرچه نام Read معمولاً در تحلیل اولیه نادیده گرفته می‌شود، اما برای:

  • ردیابی داده‌ها
  • بررسی منبع آزمایش
  • کنترل کیفیت

می‌تواند مفید باشد.


3. Sequence Line (خط توالی)

تعریف ساده

خط دوم FASTQ که توالی بازهای DNA خوانده‌شده را نشان می‌دهد.

توضیح دقیق

این خط خروجی نهایی Base Caller است.

مثلاً:

ACGTTAGCA

یعنی دستگاه تشخیص داده است که این Read شامل این توالی از بازهاست.

بازهای ممکن:

  • A = Adenine
  • C = Cytosine
  • G = Guanine
  • T = Thymine

اهمیت

این بخش همان داده اصلی DNA است که در تحلیل‌های ژنومی استفاده می‌شود.


4. Quality Line (خط کیفیت)

تعریف ساده

خط چهارم FASTQ که کیفیت هر باز موجود در Sequence را ذخیره می‌کند.

توضیح دقیق

هر کاراکتر در خط کیفیت مربوط به یک باز در خط Sequence است.

مثلاً:

Sequence:

A C G T

Quality:

H I ! #

هر کاراکتر نشان‌دهنده کیفیت همان باز متناظر است.

هدف این خط:

نشان دادن میزان اطمینان دستگاه به هر Base Call.


5. Base Quality Score (امتیاز کیفیت باز)

تعریف ساده

عددی که احتمال اشتباه بودن باز تعیین‌شده را نشان می‌دهد.

توضیح دقیق

کیفیت باز با مقدار Q بیان می‌شود.

رابطه:

[ Q=-10\log_{10}(p) ]

که:

  • Q = Base Quality
  • p = احتمال اشتباه بودن Base Call

بنابراین:

  • Q بالا → اطمینان بیشتر
  • Q پایین → احتمال خطای بیشتر

مثال:

Q احتمال خطا
10 ۱ از ۱۰
20 ۱ از ۱۰۰
30 ۱ از ۱۰۰۰

6. ASCII Encoding (کدگذاری ASCII)

تعریف ساده

روش تبدیل اعداد کیفیت باز به کاراکترهای متنی.

توضیح دقیق

در FASTQ کیفیت بازها به صورت عدد ذخیره نمی‌شود، بلکه به شکل کاراکتر ذخیره می‌شود.

برای مثال:

عدد:

109

می‌تواند به یک کاراکتر ASCII تبدیل شود.

جدول ASCII مشخص می‌کند هر کاراکتر چه عددی دارد.

بنابراین:

Base Quality (Q)
        ↓
عدد صحیح
        ↓
ASCII Character

7. Phred+33 Encoding

تعریف ساده

استانداردی برای تبدیل مقدار کیفیت باز (Q) به کاراکتر ASCII در FASTQ.

توضیح دقیق

در روش Phred+33:

  1. مقدار Q به نزدیک‌ترین عدد صحیح گرد می‌شود.
  2. عدد 33 به آن اضافه می‌شود.
  3. نتیجه به کاراکتر ASCII تبدیل می‌شود.

فرمول:

[ Character = ASCII(Q+33) ]

مثال:

اگر:

[ Q=10 ]

آنگاه:

[ 10+33=43 ]

و عدد 43 به کاراکتر ASCII مربوط تبدیل می‌شود.


8. تبدیل رفت و برگشتی Quality Values

برای کار با این تبدیل‌ها معمولاً دو تابع استفاده می‌شود:

QtoPhred33

ورودی:

  • مقدار Q

خروجی:

  • کاراکتر FASTQ متناظر

عمل:

Q → ASCII Character

phred33ToQ

ورودی:

  • کاراکتر FASTQ

خروجی:

  • مقدار Q اصلی

عمل:

ASCII Character → Q

این دو تابع معکوس یکدیگر هستند.


نکات مهم

  • FASTQ یکی از اصلی‌ترین فرمت‌های ذخیره داده‌های Sequencing است.
  • هر Read در FASTQ شامل چهار خط است.
  • خط دوم، توالی DNA خوانده‌شده را نشان می‌دهد.
  • خط چهارم، کیفیت هر باز را ذخیره می‌کند.
  • هر کاراکتر کیفیت متناظر با یک باز در Sequence است.
  • Quality Score نشان‌دهنده احتمال خطای Base Call است.
  • کیفیت بازها با مقیاس Phred بیان می‌شود.
  • در FASTQ مقادیر عددی کیفیت به کاراکترهای ASCII تبدیل می‌شوند.
  • استاندارد رایج مورد استفاده Phred+33 است.
  • برای تحلیل دقیق داده‌های ژنومی، توجه به Quality بسیار مهم است.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
FASTQ Format فرمت FASTQ قالب استاندارد ذخیره داده‌های Sequencing
Sequencing Read خوانش توالی‌یابی قطعه کوتاهی از DNA که دستگاه خوانده است
Read Name نام خوانش شناسه مربوط به یک Read
Sequence Line خط توالی خط شامل بازهای DNA خوانده‌شده
Quality Line خط کیفیت خط شامل کیفیت هر باز
Base Quality Score امتیاز کیفیت باز میزان اطمینان به یک Base Call
Base Caller تشخیص‌دهنده باز نرم‌افزاری که تصویر را به توالی تبدیل می‌کند
ASCII Encoding کدگذاری ASCII تبدیل اعداد به کاراکترها
Phred+33 استاندارد Phred+33 روش تبدیل Quality Score به کاراکتر
Probability of Error احتمال خطا احتمال اشتباه بودن باز گزارش‌شده

مثال‌ها و تشبیه‌ها

تشبیه FASTQ به گزارش آزمایش

یک Sequencing Read را می‌توان مانند یک گزارش آزمایش تصور کرد:

  • خط اول: شماره پرونده یا شناسه نمونه
  • خط دوم: نتیجه اصلی آزمایش (Sequence)
  • خط سوم: خط جداکننده
  • خط چهارم: میزان اطمینان به هر نتیجه (Quality)

بنابراین فقط دانستن نتیجه کافی نیست؛ باید بدانیم دستگاه چقدر به آن نتیجه اعتماد دارد.


خلاصه نهایی مرور سریع

  • FASTQ فرمت اصلی ذخیره Sequencing Reads است.
  • هر Read در FASTQ شامل چهار خط است.
  • Sequence Line توالی DNA گزارش‌شده توسط Base Caller است.
  • Quality Line میزان اطمینان به هر باز را ذخیره می‌کند.
  • Quality Score با مقدار Q نشان داده می‌شود.
  • Q بالا یعنی احتمال خطای کمتر.
  • FASTQ کیفیت‌ها را به صورت کاراکترهای ASCII ذخیره می‌کند.
  • Phred+33 استاندارد رایج تبدیل Q به کاراکتر است.
  • در Phred+33 مقدار 33 به Q اضافه شده و سپس به ASCII تبدیل می‌شود.
  • تحلیل داده‌های Sequencing بدون توجه به کیفیت بازها می‌تواند باعث نتایج نادرست شود.

سوالات مرور

1. یک رکورد FASTQ شامل چه اطلاعاتی است؟

پاسخ: چهار خط دارد: نام Read، توالی DNA، خط جداکننده، و کیفیت بازها.


2. چرا FASTQ علاوه بر Sequence، Quality را نیز ذخیره می‌کند؟

پاسخ: زیرا همه بازهای خوانده‌شده دارای اطمینان یکسان نیستند و باید میزان احتمال خطا مشخص باشد.


3. Phred+33 چه کاری انجام می‌دهد؟

پاسخ: مقدار عددی کیفیت باز (Q) را با اضافه کردن 33 به یک کاراکتر ASCII تبدیل می‌کند.


4. اگر مقدار Q افزایش یابد چه اتفاقی می‌افتد؟

پاسخ: احتمال اشتباه بودن Base Call کاهش می‌یابد و اطمینان به باز افزایش پیدا می‌کند.


5. رابطه بین Sequence Line و Quality Line چیست؟

پاسخ: هر کاراکتر در Quality Line مربوط به یک باز متناظر در Sequence Line است و کیفیت همان باز را نشان می‌دهد.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/13_practical-working-with-sequencing-reads

کار با داده‌های خوانش‌های توالی‌یابی (Sequencing Reads) و تحلیل کیفیت آن‌ها در FASTQ

خلاصه کلی

در این درس با داده‌های واقعی حاصل از دستگاه‌های توالی‌یابی DNA کار می‌کنیم. تمرکز اصلی بر روی قالب ذخیره‌سازی داده‌های توالی‌یابی به نام FASTQ و نحوه پردازش آن با Python است.

اهداف یادگیری این بخش:

  • آشنایی با ساختار فایل‌های FASTQ
  • خواندن و استخراج توالی‌ها و کیفیت‌های مربوط به آن‌ها
  • درک مفهوم Base Quality Score
  • تبدیل امتیازهای کیفیت از قالب Phred+33
  • تحلیل توزیع کیفیت خوانش‌ها با استفاده از Histogram

مفاهیم کلیدی

1. FASTQ Format (قالب FASTQ)

تعریف ساده

FASTQ یک قالب استاندارد برای ذخیره‌سازی داده‌های حاصل از آزمایش‌های DNA Sequencing است که علاوه بر توالی DNA، اطلاعات مربوط به کیفیت هر باز را نیز ذخیره می‌کند.

ساختار دقیق

هر Sequencing Read در فایل FASTQ شامل چهار خط متوالی است:

خط محتوا توضیح
خط اول Read Identifier نام یا شناسه خوانش
خط دوم Sequence توالی DNA گزارش‌شده توسط Base Caller
خط سوم Separator (+) یک خط جداکننده که معمولاً نادیده گرفته می‌شود
خط چهارم Quality String کیفیت هر باز در قالب ASCII

مثال:

@read123
ACGTGCA
+
HHHHHFF

اهمیت

فایل FASTQ اطلاعات خام مورد نیاز برای تحلیل‌های ژنومی را فراهم می‌کند. هر Read شامل:

  • خود توالی DNA
  • میزان اطمینان از صحت هر باز

است.


2. Sequencing Read (خوانش توالی‌یابی)

تعریف ساده

یک Read یک قطعه کوتاه DNA است که دستگاه Sequencer آن را خوانده و توالی بازهای آن را گزارش کرده است.

توضیح دقیق

در توالی‌یابی نسل دوم (Second Generation Sequencing) میلیون‌ها یا میلیاردها Read به صورت همزمان تولید می‌شوند.

هر Read شامل:

  • رشته‌ای از بازهای DNA:

    • A
    • C
    • G
    • T
  • کیفیت هر باز

است.


3. Base Quality Score (امتیاز کیفیت باز)

تعریف ساده

Base Quality نشان می‌دهد که دستگاه توالی‌یاب تا چه حد به درست بودن یک باز خاص اطمینان دارد.

توضیح دقیق

Base Caller برای هر باز یک مقدار کیفیت محاسبه می‌کند.

این مقدار با پارامتر Q نمایش داده می‌شود:

[ Q = -10 \log_{10}(p) ]

که در آن:

  • p = احتمال اشتباه بودن باز گزارش‌شده
  • Q = امتیاز کیفیت

هرچه Q بزرگ‌تر باشد:

  • احتمال خطا کمتر است.
  • اعتماد به باز بیشتر است.

مثال

Quality (Q) احتمال خطا
10 1 در 10
20 1 در 100
30 1 در 1000
40 1 در 10000

بنابراین:

  • Q=2 → کیفیت بسیار پایین
  • Q=41 → کیفیت بسیار بالا

4. Phred+33 Encoding

تعریف ساده

Phred+33 روشی برای ذخیره‌سازی Quality Scoreها به صورت کاراکترهای ASCII است.

چرا نیاز به Encoding داریم؟

کامپیوتر می‌تواند اعداد را ذخیره کند، اما FASTQ برای کاهش حجم فایل، کیفیت‌ها را به صورت کاراکتر ذخیره می‌کند.

مثلاً:

Quality Score → ASCII Character

روش تبدیل

برای تبدیل Quality به کاراکتر:

  1. مقدار Q را به نزدیک‌ترین عدد صحیح گرد می‌کنیم.
  2. عدد 33 را اضافه می‌کنیم.
  3. مقدار حاصل را به کاراکتر ASCII تبدیل می‌کنیم.

فرمول:

[ ASCII = Q + 33 ]

تبدیل معکوس

برای برگشت به Q:

[ Q = ASCII - 33 ]


5. Parsing FASTQ Files (پردازش فایل FASTQ)

تعریف ساده

Parsing یعنی خواندن ساختار فایل و استخراج اطلاعات مورد نیاز.

روش پردازش

برای هر Read:

  1. خط شناسه خوانده می‌شود ولی ذخیره نمی‌شود.
  2. توالی DNA ذخیره می‌شود.
  3. خط + نادیده گرفته می‌شود.
  4. رشته کیفیت ذخیره می‌شود.

در Python معمولاً دو لیست ساخته می‌شود:

sequences = []
qualities = []

که شامل:

  • تمام توالی‌ها
  • کیفیت‌های مربوط به هر توالی

هستند.


6. Histogram of Quality Scores (هیستوگرام کیفیت‌ها)

تعریف ساده

Histogram نشان می‌دهد هر مقدار Quality Score چند بار در کل داده‌ها مشاهده شده است.

کاربرد

با استفاده از Histogram می‌توان فهمید:

  • کیفیت کلی داده‌ها چگونه است.
  • کدام بخش‌های Read مشکل بیشتری دارند.
  • آیا خطاها بیشتر در انتهای Read رخ می‌دهند یا خیر.

نکات مهم

  • فایل FASTQ برخلاف FASTA فقط توالی DNA را ذخیره نمی‌کند، بلکه کیفیت هر باز را نیز نگه می‌دارد.
  • هر Read دقیقاً چهار خط اطلاعات دارد.
  • خط دوم FASTQ مهم‌ترین بخش است، زیرا توالی DNA را نگه می‌دارد.
  • خط چهارم شامل Quality Scoreهای مربوط به هر باز است.
  • Quality Scoreها به صورت مستقیم ذخیره نمی‌شوند، بلکه با ASCII Encoding ذخیره می‌شوند.
  • در قالب Phred+33 مقدار 33 به Quality اضافه می‌شود.
  • کیفیت پایین معمولاً در انتهای Readها بیشتر دیده می‌شود.
  • افزایش خطا در انتهای Readها یک ویژگی شناخته‌شده در Sequencing است.
  • Base Caller مسئول تبدیل سیگنال‌های دستگاه Sequencer به توالی DNA است.
  • Histogram کیفیت به بررسی سلامت داده‌های Sequencing کمک می‌کند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
FASTQ قالب FASTQ فرمت استاندارد ذخیره Readهای توالی‌یابی همراه با کیفیت
Sequencing Read خوانش توالی‌یابی قطعه DNA خوانده‌شده توسط دستگاه Sequencer
Read Identifier شناسه خوانش نام یا اطلاعات مربوط به یک Read
Sequence توالی رشته بازهای DNA گزارش‌شده
Base Caller تعیین‌کننده باز نرم‌افزاری که از داده خام دستگاه، بازهای DNA را استخراج می‌کند
Base Quality Score امتیاز کیفیت باز میزان اطمینان از صحت یک باز
Phred Score امتیاز Phred مقیاسی برای نمایش احتمال خطای باز
Phred+33 رمزگذاری Phred+33 روش ذخیره Quality Score به شکل ASCII
ASCII Encoding کدگذاری ASCII تبدیل عدد به کاراکتر
Quality String رشته کیفیت مجموعه کاراکترهایی که کیفیت بازها را نشان می‌دهد
Histogram نمودار فراوانی نمایش تعداد وقوع مقادیر مختلف
Parsing تجزیه و پردازش داده استخراج اطلاعات از فایل

مثال‌ها و تشبیه‌ها

مثال FASTQ

یک Read را می‌توان مانند یک گزارش آزمایش در نظر گرفت:

@read001
ACGTACGT
+
HHHHFFFF

که:

  • خط اول → نام نمونه
  • خط دوم → نتیجه خواندن DNA
  • خط چهارم → میزان اعتماد به هر حرف

مانند این است که دستگاه علاوه بر گفتن جواب، میزان اطمینان خود را نیز اعلام کند.


مثال کیفیت پایین

اگر دستگاه در یک موقعیت DNA مطمئن نباشد، مثلاً سیگنال‌های رنگی مختلف دریافت کند:

  • Base Caller نمی‌تواند با اطمینان یک باز را انتخاب کند.
  • Quality Score پایین خواهد بود.

مثلاً:

Q = 2

یعنی احتمال خطا زیاد است.


خلاصه نهایی مرور سریع

  • FASTQ قالب اصلی ذخیره داده‌های Sequencing است.
  • هر Read در FASTQ شامل چهار خط اطلاعات است.
  • خط دوم FASTQ توالی DNA را نگه می‌دارد.
  • خط چهارم شامل Quality Scoreهای هر باز است.
  • Quality Score با معیار Phred اندازه‌گیری می‌شود.
  • مقدار بالاتر Q نشان‌دهنده اعتماد بیشتر به باز است.
  • Phred+33 برای ذخیره Quality Score به شکل کاراکتر ASCII استفاده می‌شود.
  • تبدیل Phred به ASCII با افزودن عدد 33 انجام می‌شود.
  • Base Caller مسئول تعیین بازها و کیفیت آن‌ها است.
  • کیفیت Readها معمولاً در انتهای توالی کاهش می‌یابد.
  • Histogram کیفیت برای ارزیابی کیفیت کلی داده‌های Sequencing استفاده می‌شود.

سوالات مرور

سوال 1: فایل FASTQ چه اطلاعاتی را ذخیره می‌کند؟

پاسخ: FASTQ علاوه بر توالی DNA، کیفیت هر باز را نیز ذخیره می‌کند. هر Read شامل شناسه، توالی، خط جداکننده و رشته کیفیت است.


سوال 2: Quality Score بالا چه مفهومی دارد؟

پاسخ: Quality Score بالا یعنی احتمال اشتباه بودن باز کمتر است و Base Caller اعتماد بیشتری به نتیجه دارد.


سوال 3: چرا Quality Scoreها به صورت مستقیم ذخیره نمی‌شوند؟

پاسخ: برای کاهش حجم داده، Quality Scoreها با استفاده از ASCII Encoding به کاراکتر تبدیل می‌شوند.


سوال 4: Phred+33 چگونه یک Quality Score را ذخیره می‌کند؟

پاسخ: ابتدا Quality Score به نزدیک‌ترین عدد صحیح گرد می‌شود، سپس 33 به آن اضافه شده و مقدار حاصل به یک کاراکتر ASCII تبدیل می‌شود.


سوال 5: چرا کیفیت Sequencing معمولاً در انتهای Read کاهش پیدا می‌کند؟

پاسخ: با ادامه فرآیند خواندن DNA، خطاهای دستگاه و عدم هماهنگی سیگنال‌ها افزایش می‌یابد، بنابراین اطمینان Base Caller کمتر می‌شود.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/14_practical-analyzing-reads-by-position

تحلیل توزیع GC Content و بازهای DNA در موقعیت‌های مختلف Read

خلاصه کلی

در این درس به تحلیل کیفیت داده‌های Sequencing از زاویه‌ای دیگر می‌پردازیم. پس از بررسی توزیع Base Quality Score، اکنون بررسی می‌کنیم که آیا ترکیب بازهای DNA در طول Readها ثابت باقی می‌ماند یا خیر.

اهداف یادگیری این بخش:

  • محاسبه GC Content در هر موقعیت از Read
  • بررسی تغییرات ترکیب بازها در طول توالی
  • تشخیص مشکلات احتمالی در فرآیند Sequencing
  • شمارش فراوانی بازهای DNA در کل داده‌ها
  • درک مفهوم باز نامشخص N

مفاهیم کلیدی

1. GC Content (محتوای GC)

تعریف ساده

GC Content درصد یا نسبت بازهای Guanine (G) و Cytosine (C) در یک توالی DNA است.

فرمول:

[ GC\ Content = \frac{G+C}{A+T+G+C} ]

توضیح دقیق

ترکیب بازهای DNA در گونه‌های مختلف متفاوت است. بعضی موجودات ژنومی با GC بالا دارند و برخی دیگر GC پایین.

در این درس، هدف اصلی بررسی ویژگی گونه نیست، بلکه بررسی این موضوع است که:

آیا ترکیب بازها در طول Read تغییر غیرعادی دارد یا خیر؟

در یک Sequencing سالم انتظار داریم:

  • GC Content در طول Read تقریباً ثابت باشد.
  • تغییرات کوچک ناشی از نویز طبیعی باشد.

اهمیت و کاربرد

اگر در یک موقعیت خاص از Read:

  • مقدار GC ناگهان تغییر کند،
  • یا نسبت بازها غیرطبیعی شود،

ممکن است نشان‌دهنده مشکل در یک Sequencing Cycle خاص باشد.


2. GC Content by Position (محتوای GC بر اساس موقعیت)

تعریف ساده

محاسبه میانگین GC Content برای هر موقعیت از Readهای مختلف.

روش محاسبه

فرض کنید همه Readها طول 100 باز دارند.

برای هر موقعیت:

  1. تعداد G و C را شمارش می‌کنیم.
  2. تعداد کل بازهای مشاهده‌شده را شمارش می‌کنیم.
  3. نسبت آن‌ها را محاسبه می‌کنیم.

مثلاً برای موقعیت شماره 10:

[ GC_{10} = \frac{\text{تعداد G و C در موقعیت 10}} {\text{تعداد کل بازهای موقعیت 10}} ]


پیاده‌سازی الگوریتمی

دو آرایه نگه می‌داریم:

GC Array

تعداد بازهای G و C در هر موقعیت:

GC[i]

Total Array

تعداد کل بازهای مشاهده‌شده در هر موقعیت:

Totals[i]

در پایان:

GC_Content[i] = GC[i] / Totals[i]

3. Base Distribution (توزیع بازها)

تعریف ساده

شمارش تعداد دفعات مشاهده هر باز DNA در کل مجموعه Readها.

بازهای بررسی‌شده:

  • A
  • T
  • G
  • C

کاربرد

با بررسی توزیع بازها می‌توان فهمید:

  • آیا ترکیب DNA طبیعی است؟
  • آیا GC Content با مقدار مورد انتظار هماهنگ است؟
  • آیا مشکلی در Sequencing وجود دارد؟

4. collections.Counter در Python

تعریف ساده

یک ابزار داخلی Python برای شمارش فراوانی عناصر است.

کاربرد در ژنومیک

به جای نوشتن حلقه برای شمارش بازها، می‌توان از:

collections.Counter()

استفاده کرد.

مثال:

count.update(sequence)

این دستور تعداد وقوع هر کاراکتر در توالی را ثبت می‌کند.


5. N Base (باز نامشخص)

تعریف ساده

N یک باز واقعی DNA نیست، بلکه نشان‌دهنده عدم اطمینان دستگاه در تعیین باز است.

چرا N ایجاد می‌شود؟

وقتی:

  • سیگنال‌های دستگاه واضح نیستند،
  • Base Caller نمی‌تواند بین A، T، C و G تصمیم بگیرد،

به جای انتخاب تصادفی یک باز، مقدار:

N

گزارش می‌شود.

اهمیت

وجود تعداد کمی N طبیعی است.

اما تعداد زیاد N نشان‌دهنده:

  • مشکل در Sequencing
  • کیفیت پایین داده
  • عدم توانایی دستگاه در تشخیص بازها

است.


نکات مهم

  • GC Content یکی از معیارهای مهم برای بررسی کیفیت داده‌های Sequencing است.
  • در یک Sequencing سالم، GC Content در طول Read تقریباً ثابت باقی می‌ماند.
  • تغییرات کوچک در نمودار GC معمولاً ناشی از نویز آماری هستند.
  • تغییر شدید GC در یک موقعیت خاص می‌تواند نشانه خطای Sequencing باشد.
  • برای محاسبه GC Content باید تعداد G و C را نسبت به کل بازها محاسبه کرد.
  • استفاده از Float در تقسیم ضروری است تا مقدار اعشاری درست محاسبه شود.
  • باید مراقب تقسیم بر صفر بود؛ زیرا ممکن است در یک موقعیت هیچ باز خوانده نشده باشد.
  • مقدار GC Content ژنوم انسان معمولاً بیشتر از 0.5 است.
  • در داده بررسی‌شده، GC Content حدود 0.56 تا 0.58 بود.
  • وجود N نشان‌دهنده عدم اطمینان کامل Base Caller است.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
GC Content محتوای GC نسبت بازهای G و C در DNA
GC Content by Position محتوای GC بر اساس موقعیت بررسی تغییر GC در طول Read
Base Distribution توزیع بازها فراوانی بازهای A,T,G,C در داده
N Base باز نامشخص علامتی برای عدم توانایی تعیین باز
Sequencing Cycle چرخه توالی‌یابی یک مرحله از فرآیند خواندن DNA
Read خوانش قطعه DNA تولیدشده توسط Sequencer
Noise نویز تغییرات تصادفی ناشی از محدودیت داده
Base Caller تعیین‌کننده باز نرم‌افزار استخراج بازها از سیگنال دستگاه
collections.Counter شمارنده Python ابزار شمارش فراوانی عناصر
Genome ژنوم مجموعه کامل DNA یک موجود

مثال‌ها و تشبیه‌ها

مثال بررسی GC Content

فرض کنید در یک موقعیت خاص از Readها:

  • 30 بار G یا C مشاهده شده است.
  • مجموع بازهای مشاهده‌شده 50 عدد است.

پس:

[ GC = \frac{30}{50}=0.6 ]

یعنی 60٪ بازهای آن موقعیت G یا C هستند.


تشبیه GC Content

GC Content مانند بررسی ترکیب مواد در یک مخلوط است.

اگر در طول نمونه‌گیری ترکیب مخلوط ثابت باشد، انتظار داریم نتایج مشابه باشند.

اما اگر ناگهان مقدار یک ماده افزایش زیادی پیدا کند، ممکن است مشکلی در فرآیند نمونه‌گیری وجود داشته باشد.


خلاصه نهایی مرور سریع

  • GC Content درصد بازهای G و C در DNA است.
  • بررسی GC Content می‌تواند مشکلات Sequencing را آشکار کند.
  • انتظار داریم GC Content در طول یک Read تقریباً ثابت باشد.
  • تغییر شدید GC در یک موقعیت می‌تواند نشانه خطا باشد.
  • برای هر موقعیت از Read، تعداد G/C و تعداد کل بازها شمارش می‌شوند.
  • مقدار GC Content از تقسیم GC بر کل بازها به دست می‌آید.
  • Python با collections.Counter شمارش بازها را ساده می‌کند.
  • در ژنوم انسان GC Content معمولاً بالاتر از 50٪ است.
  • باز N زمانی گزارش می‌شود که Base Caller نتواند باز را تعیین کند.
  • تعداد کم N قابل قبول است، اما تعداد زیاد آن نشانه مشکل در داده است.

سوالات مرور

سوال 1: GC Content چیست؟

پاسخ: GC Content نسبت بازهای Guanine و Cytosine به کل بازهای DNA است و نشان‌دهنده ترکیب نوکلئوتیدی یک توالی است.


سوال 2: چرا GC Content را در هر موقعیت از Read بررسی می‌کنیم؟

پاسخ: برای بررسی اینکه آیا ترکیب بازها در طول Sequencing ثابت است یا تغییرات غیرعادی ناشی از خطا وجود دارد.


سوال 3: اگر در یک موقعیت خاص GC Content ناگهان افزایش یابد چه مفهومی دارد؟

پاسخ: ممکن است نشان‌دهنده یک مشکل در یک Sequencing Cycle یا خطای تکنیکی باشد.


سوال 4: باز N در فایل Sequencing چه مفهومی دارد؟

پاسخ: N نشان می‌دهد که Base Caller نتوانسته با اطمینان هیچ‌کدام از بازهای A، T، G یا C را انتخاب کند.


سوال 5: چرا از collections.Counter استفاده می‌کنیم؟

پاسخ: برای شمارش سریع تعداد وقوع هر باز در مجموعه بزرگی از توالی‌های DNA بدون نیاز به پیاده‌سازی دستی حلقه‌های شمارشی.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/15_lecture-sequencers-give-pieces-to-genomic-puzzles

درس: توالی‌یابی ژنوم و مسئله اتصال خوانش‌ها (Sequencers Give Pieces to Genomic Puzzles)

خلاصه کلی

در این درس بررسی می‌کنیم که پس از تولید داده‌های خام توسط Sequencer چگونه می‌توان از آن‌ها برای تحلیل ژنوم استفاده کرد.

دستگاه‌های نسل دوم توالی‌یابی (Second Generation Sequencers) قطعات کوتاهی از DNA به نام Reads (خوانش‌ها) تولید می‌کنند. این قطعات به‌تنهایی اطلاعات کافی برای درک کامل ژنوم ندارند، بنابراین باید آن‌ها را به یکدیگر متصل کنیم تا توالی اصلی DNA را بازسازی کنیم.

دو مسئله اصلی در تحلیل داده‌های توالی‌یابی مطرح می‌شود:

  1. Read Alignment (هم‌ترازی خوانش‌ها) زمانی که یک ژنوم مرجع (Reference Genome) در اختیار داریم و می‌خواهیم مشخص کنیم هر Read در کدام بخش ژنوم قرار می‌گیرد.

  2. Genome Assembly (مونتاژ ژنوم) زمانی که ژنوم مرجع وجود ندارد و باید خودمان از روی Readهای کوتاه، ژنوم کامل را بازسازی کنیم.

هدف یادگیری این درس:

  • درک محدودیت‌های Readهای کوتاه
  • فهم نیاز به اتصال و بازسازی توالی DNA
  • آشنایی با تفاوت Alignment و Assembly
  • آماده شدن برای یادگیری الگوریتم‌های پردازش داده‌های ژنومی

مفاهیم کلیدی

1. Sequencing Reads (خوانش‌های توالی‌یابی)

تعریف ساده

Read یک قطعه کوتاه از DNA است که توسط دستگاه توالی‌یابی خوانده شده و ترتیب بازهای آن مشخص شده است.

توضیح دقیق

دستگاه‌های نسل دوم توالی‌یابی معمولاً قطعاتی در حدود چند صد باز تولید می‌کنند، در حالی که:

  • ژن‌های انسان معمولاً هزاران باز طول دارند.
  • کل ژنوم انسان حدود میلیاردها باز دارد.

بنابراین یک Read به‌تنهایی تنها بخش کوچکی از اطلاعات ژنتیکی را نشان می‌دهد.

اهمیت

برای تحلیل ژنوم، باید هزاران یا میلیون‌ها Read را کنار هم قرار داد تا تصویر بزرگ‌تر ژنوم ساخته شود.


2. Genome Reconstruction (بازسازی ژنوم)

تعریف ساده

فرایند کنار هم قرار دادن Readهای کوتاه برای بازسازی توالی اصلی DNA.

توضیح دقیق

از آنجا که Readها قطعات کوچکی از یک ژنوم بزرگ هستند، باید مشخص شود:

  • هر Read مربوط به کدام قسمت ژنوم است.
  • چگونه Readهای مختلف به یکدیگر متصل می‌شوند.

این کار مشابه حل کردن یک پازل بزرگ است.

اهمیت

بدون بازسازی Readها، نمی‌توان اطلاعات زیستی مهم مانند:

  • تفاوت‌های ژنتیکی افراد
  • جهش‌ها
  • استعداد ابتلا به بیماری‌ها

را استخراج کرد.


3. Puzzle Analogy (تشبیه پازل)

مفهوم

مدرس تحلیل داده‌های توالی‌یابی را به حل یک پازل تشبیه می‌کند.

توضیح

در یک پازل معمولی:

  • قطعات کوچک داریم.
  • تصویر روی جعبه، راهنمای ما است.
  • با استفاده از تصویر می‌توانیم جای هر قطعه را حدس بزنیم.

در ژنومیک:

  • Readها = قطعات پازل
  • ژنوم کامل = تصویر نهایی پازل
  • Reference Genome = تصویر راهنمای روی جعبه

اگر تصویر را داشته باشیم، حل پازل آسان‌تر می‌شود.


4. Reference Genome (ژنوم مرجع)

تعریف ساده

یک توالی ژنومی استاندارد که به عنوان راهنما برای مقایسه و مکان‌یابی Readها استفاده می‌شود.

توضیح دقیق

ژنوم افراد مختلف کاملاً یکسان نیست، اما انسان‌های غیرمرتبط از نظر ژنتیکی بسیار شبیه هستند.

شباهت ژنوم انسان‌ها:

  • حدود 99.8 تا 99.9 درصد

یعنی تقریباً:

  • 1 تا 2 تفاوت در هر 1000 باز

بنابراین می‌توان ژنوم یک فرد یا ژنوم مرجع انسانی را مانند نقشه‌ای برای یافتن محل Readهای فرد دیگر استفاده کرد.

کاربرد

Reference Genome برای گونه‌های مختلف وجود دارد، مانند:

  • انسان (Human)
  • موش (Mouse)
  • مگس سرکه (Fruit Fly)
  • گاو (Cow)
  • مرغ (Chicken)
  • ذرت (Corn)

5. Read Alignment (هم‌ترازی خوانش‌ها)

تعریف ساده

پیدا کردن بهترین محل قرارگیری یک Read روی ژنوم مرجع.

توضیح دقیق

در Alignment:

ورودی‌ها:

  1. یک Read حاصل از Sequencing
  2. یک Reference Genome

هدف:

پیدا کردن موقعیتی در ژنوم مرجع که بیشترین شباهت را با Read دارد.

مراحل کلی:

  1. یک Read انتخاب می‌کنیم.
  2. آن را با ژنوم مرجع مقایسه می‌کنیم.
  3. بهترین تطابق را پیدا می‌کنیم.
  4. نتیجه می‌گیریم Read احتمالاً از آن قسمت ژنوم آمده است.

اهمیت

این مسئله پایه بسیاری از تحلیل‌های ژنومی است، مانند:

  • یافتن جهش‌ها
  • مقایسه ژنوم افراد
  • مطالعات بیماری‌های ژنتیکی

6. Genome Assembly (مونتاژ ژنوم)

تعریف ساده

بازسازی ژنوم بدون استفاده از ژنوم مرجع.

توضیح دقیق

گاهی ژنومی که مطالعه می‌کنیم قبلاً توالی‌یابی نشده است.

مثلاً:

  • یک گیاه ناشناخته
  • یک گونه جدید

در این حالت:

  • تصویر روی جعبه پازل وجود ندارد.
  • باید فقط از خود قطعات پازل استفاده کنیم.

بنابراین باید Readهایی را پیدا کنیم که الگوهای مشترک دارند و آن‌ها را به هم متصل کنیم.

اهمیت

Assembly برای مطالعه موجوداتی که ژنوم مرجع ندارند ضروری است.


نکات مهم

  • Sequencer مستقیماً ژنوم کامل را تولید نمی‌کند؛ بلکه میلیون‌ها قطعه کوتاه DNA تولید می‌کند.
  • یک Read به تنهایی اطلاعات کافی برای تحلیل ژنوم ندارد.
  • برای استخراج اطلاعات زیستی باید Readها را کنار هم قرار داد.
  • شباهت زیاد ژنوم انسان‌ها امکان استفاده از Reference Genome را فراهم می‌کند.
  • در Read Alignment، ژنوم مرجع مانند نقشه راه عمل می‌کند.
  • در Genome Assembly، چنین نقشه‌ای وجود ندارد و باید ژنوم از روی خود Readها ساخته شود.
  • Alignment معمولاً ساده‌تر از Assembly است.
  • Assembly یک مسئله محاسباتی دشوارتر است و نیاز به الگوریتم‌ها و ساختارهای داده پیچیده‌تری دارد.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Sequencer دستگاه توالی‌یابی دستگاهی که ترتیب بازهای DNA را مشخص می‌کند
Sequencing Read خوانش توالی‌یابی قطعه کوتاهی از DNA که توسط Sequencer خوانده شده است
Second Generation Sequencing توالی‌یابی نسل دوم فناوری توالی‌یابی با تولید تعداد بسیار زیادی Read کوتاه
Reference Genome ژنوم مرجع توالی استاندارد ژنوم که برای مقایسه استفاده می‌شود
Read Alignment هم‌ترازی خوانش‌ها یافتن محل یک Read در ژنوم مرجع
Genome Assembly مونتاژ ژنوم بازسازی ژنوم بدون ژنوم مرجع
Human Genome Project پروژه ژنوم انسان پروژه‌ای که اولین نسخه مرجع ژنوم انسان را تولید کرد
Genome Reconstruction بازسازی ژنوم ایجاد دوباره توالی کامل DNA از قطعات کوتاه
Template الگو توالی مرجعی که برای مقایسه یا ساخت استفاده می‌شود

مثال‌ها و تشبیه‌ها

تشبیه حل پازل

تحلیل داده‌های توالی‌یابی مانند حل یک پازل بزرگ است:

حالت اول: داشتن تصویر پازل

اگر تصویر کامل را داشته باشیم:

  • می‌توانیم هر قطعه را در جای مناسب قرار دهیم.
  • این مشابه Read Alignment است.

در ژنومیک:

  • تصویر پازل = Reference Genome
  • قطعات پازل = Sequencing Reads

حالت دوم: بدون تصویر پازل

اگر تصویر روی جعبه وجود نداشته باشد:

  • باید قطعاتی که الگوهای مشترک دارند پیدا کنیم.
  • سپس آن‌ها را به تدریج کنار هم قرار دهیم.

این مشابه Genome Assembly است.


خلاصه نهایی مرور سریع

  • Sequencerها ژنوم کامل را نمی‌خوانند، بلکه میلیون‌ها Read کوتاه تولید می‌کنند.
  • Readها برای تحلیل ژنومی به تنهایی کافی نیستند.
  • هدف اصلی، اتصال Readها و بازسازی توالی DNA است.
  • ژنوم انسان‌های مختلف حدود 99.8 تا 99.9 درصد مشابه است.
  • Reference Genome مانند تصویر روی جعبه پازل عمل می‌کند.
  • Read Alignment یعنی یافتن محل یک Read روی ژنوم مرجع.
  • Genome Assembly زمانی استفاده می‌شود که ژنوم مرجع وجود ندارد.
  • Alignment از Assembly ساده‌تر است.
  • Assembly یک مسئله محاسباتی پیچیده و چالش‌برانگیز است.
  • الگوریتم‌ها و ساختارهای داده نقش اصلی در حل مسائل توالی‌یابی دارند.

سوالات مرور

1. چرا یک Sequencing Read به تنهایی برای تحلیل ژنوم کافی نیست؟

پاسخ: زیرا Readها فقط قطعات کوتاهی از DNA هستند و معمولاً طول آن‌ها بسیار کمتر از ژن‌ها یا کل ژنوم است. بنابراین باید چندین Read کنار هم قرار گیرند تا اطلاعات کامل‌تری به دست آید.


2. Reference Genome چه کاربردی دارد؟

پاسخ: Reference Genome به عنوان یک نقشه راه استفاده می‌شود تا مشخص شود هر Read متعلق به کدام بخش ژنوم است.


3. تفاوت اصلی بین Read Alignment و Genome Assembly چیست؟

پاسخ: در Alignment یک ژنوم مرجع داریم و Readها را روی آن قرار می‌دهیم. در Assembly ژنوم مرجع نداریم و باید ژنوم را فقط از روی Readها بازسازی کنیم.


4. چرا انسان‌ها می‌توانند از ژنوم مرجع مشترک استفاده کنند؟

پاسخ: زیرا ژنوم انسان‌های مختلف بسیار شبیه است و تنها حدود 0.1 تا 0.2 درصد تفاوت دارند.


5. اگر یک گونه جدید را بررسی کنیم که ژنوم مرجع ندارد، از چه روشی استفاده می‌کنیم؟

پاسخ: از Genome Assembly استفاده می‌کنیم؛ یعنی Readهای کوتاه را با پیدا کردن همپوشانی‌ها به یک توالی بزرگ‌تر تبدیل می‌کنیم.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/16_lecture-read-alignment-and-why-its-hard

درس: مسئله هم‌ترازی خوانش‌ها (Read Alignment) و دلیل دشواری آن

خلاصه کلی

در این درس با یکی از مسائل اساسی در تحلیل داده‌های توالی‌یابی DNA یعنی Read Alignment (هم‌ترازی خوانش‌ها) آشنا می‌شویم.

پس از توالی‌یابی نسل دوم، دستگاه Sequencer میلیاردها قطعه کوتاه DNA به نام Read تولید می‌کند. هدف ما این است که مشخص کنیم هر Read در کدام قسمت از ژنوم مرجع قرار دارد.

این کار مانند حل یک پازل است:

  • Readها = قطعات پازل
  • ژنوم مرجع = تصویر کامل پازل

اما برخلاف یک پازل معمولی، تعداد قطعات بسیار زیاد است و تصویر نهایی نیز بسیار بزرگ است.

هدف یادگیری این بخش:

  • درک فرآیند Read Alignment
  • شناخت مقیاس عظیم داده‌های ژنومی
  • فهم اینکه چرا پیدا کردن محل Readها یک مسئله محاسباتی دشوار است
  • آشنایی با نقش الگوریتم‌ها و ساختارهای داده در حل این مشکل

مفاهیم کلیدی

1. Read Alignment (هم‌ترازی خوانش‌ها)

تعریف ساده

فرایند پیدا کردن بهترین محل قرارگیری یک Sequencing Read در یک Reference Genome.

توضیح دقیق

در Read Alignment دو ورودی اصلی داریم:

  1. Sequencing Read

    • قطعه کوتاهی از DNA که توسط دستگاه توالی‌یابی خوانده شده است.
  2. Reference Genome

    • توالی کامل و استاندارد یک گونه که به عنوان راهنما استفاده می‌شود.

هدف:

پیدا کردن موقعیتی از ژنوم مرجع که بیشترین شباهت را با Read داشته باشد.

به صورت ساده:

Read:
ACGTTA

Reference Genome:
...GGAACGTTAACC...
        ↑
     محل احتمالی Read

الگوریتم Alignment باید مشخص کند Read احتمالاً از کدام بخش ژنوم آمده است.

اهمیت

Read Alignment پایه بسیاری از تحلیل‌های ژنومی است، مانند:

  • پیدا کردن تفاوت‌های ژنتیکی افراد
  • شناسایی جهش‌ها
  • بررسی ارتباط تغییرات DNA با بیماری‌ها

2. Reference Genome (ژنوم مرجع)

تعریف ساده

یک توالی ژنومی استاندارد که برای مقایسه و مکان‌یابی Readها استفاده می‌شود.

توضیح دقیق

در یک گونه مانند انسان، افراد مختلف ژنوم بسیار مشابهی دارند.

برای مثال:

  • ژنوم دو انسان غیرمرتبط حدود 99.8 تا 99.9 درصد مشابه است.

بنابراین می‌توان از یک ژنوم مرجع به عنوان نقشه استفاده کرد.

فرایند کلی:

  1. یک Read از DNA فرد مورد مطالعه داریم.
  2. آن را با ژنوم مرجع مقایسه می‌کنیم.
  3. جایی که بیشترین شباهت وجود دارد، محل احتمالی Read است.

اهمیت

وجود ژنوم مرجع باعث می‌شود مسئله بازسازی ژنوم ساده‌تر شود؛ زیرا به جای ساختن ژنوم از صفر، فقط باید قطعات را روی یک نقشه موجود قرار دهیم.


3. مقیاس داده‌های توالی‌یابی (Scale of Sequencing Data)

تعریف ساده

حجم بسیار زیاد داده‌ای که در یک آزمایش Sequencing تولید می‌شود.

توضیح دقیق

یک دستگاه Second Generation Sequencer در یک اجرای آزمایش (Sequencing Run) می‌تواند:

  • میلیاردها Read تولید کند.

بنابراین Alignment باید:

  • میلیاردها بار تکرار شود.
  • برای هر Read بهترین محل را پیدا کند.

از طرف دیگر، ژنوم مرجع نیز بسیار بزرگ است.

مثال:

ژنوم انسان:

  • حدود 3 میلیارد باز (3 billion bases)

در حالی که یک نمایش ساده روی صفحه ممکن است فقط چند هزار کاراکتر را نشان دهد.

یعنی ژنوم واقعی انسان بیش از یک میلیون برابر بزرگ‌تر از نمونه‌های کوچک آموزشی است.


4. Human Genome Project (پروژه ژنوم انسان)

تعریف ساده

پروژه‌ای علمی که برای تعیین و ثبت توالی ژنوم انسان انجام شد.

توضیح دقیق

در پایان این پروژه، نسخه مرجع ژنوم انسان تولید شد.

این توالی مرجع:

  • شامل میلیاردها باز DNA است.
  • برای مقایسه ژنوم افراد مختلف استفاده می‌شود.

برای نشان دادن بزرگی ژنوم انسان، نسخه چاپی آن نیز تولید شد.

این نسخه شامل:

  • کتاب‌های متعدد
  • صفحات پر از حروف A، C، G و T

بود.


5. String Matching Problem (مسئله تطبیق رشته‌ها)

تعریف ساده

پیدا کردن یک رشته کوتاه درون یک رشته بسیار بزرگ‌تر.

توضیح دقیق

از دیدگاه علوم کامپیوتر:

DNA را می‌توان به صورت یک رشته از حروف دید:

DNA = ACGTACGT...

بنابراین:

  • Read یک رشته کوتاه است.
  • Genome یک رشته بسیار طولانی است.

مسئله Alignment در واقع نوعی مسئله جستجو در رشته‌ها (String Search) است.

علوم کامپیوتر سال‌ها روی این نوع مسائل کار کرده و الگوریتم‌های زیادی برای:

  • جستجوی الگو
  • فهرست‌سازی رشته‌ها
  • فشرده‌سازی رشته‌ها

توسعه داده است.

اهمیت

ماهیت رشته‌ای DNA باعث شده بتوان از تکنیک‌های علوم کامپیوتر برای حل مسائل ژنومیک استفاده کرد.


نکات مهم

  • Read Alignment یعنی پیدا کردن محل احتمالی یک Read روی ژنوم مرجع.
  • یک Sequencing Run می‌تواند میلیاردها Read تولید کند.
  • ژنوم انسان حدود 3 میلیارد باز دارد.
  • Alignment باید میلیاردها بار انجام شود، بنابراین روش‌های ساده بسیار کند خواهند بود.
  • DNA را می‌توان مانند یک String (رشته) در علوم کامپیوتر مدل کرد.
  • الگوریتم‌های String Processing نقش مهمی در تحلیل داده‌های ژنومی دارند.
  • Read Alignment هنوز یک حوزه فعال تحقیقاتی است، زیرا حجم داده‌های ژنومی همچنان در حال افزایش است.
  • شباهت زیاد ژنوم افراد یک گونه امکان استفاده از Reference Genome را فراهم می‌کند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Read Alignment هم‌ترازی خوانش‌ها پیدا کردن محل یک Read در ژنوم مرجع
Sequencing Read خوانش توالی‌یابی قطعه کوتاه DNA تولیدشده توسط Sequencer
Reference Genome ژنوم مرجع توالی استاندارد برای مقایسه ژنوم‌ها
Second Generation Sequencing توالی‌یابی نسل دوم فناوری تولید تعداد بسیار زیاد Readهای کوتاه
Sequencing Run اجرای توالی‌یابی یک نوبت انجام آزمایش Sequencing
String رشته دنباله‌ای از کاراکترها مانند A,C,G,T در DNA
String Matching تطبیق رشته‌ها پیدا کردن یک رشته کوچک در یک رشته بزرگ‌تر
Algorithm الگوریتم روش محاسباتی برای حل یک مسئله
Data Structure ساختار داده روش سازمان‌دهی داده برای پردازش سریع‌تر
Human Genome Project پروژه ژنوم انسان پروژه تعیین توالی مرجع ژنوم انسان

مثال‌ها و تشبیه‌ها

تشبیه پازل

فرایند Alignment مانند حل یک پازل بزرگ است:

در پازل:

  • قطعات کوچک داریم.
  • تصویر روی جعبه راهنما است.
  • هر قطعه را در محل مناسب قرار می‌دهیم.

در ژنومیک:

  • Readها قطعات پازل هستند.
  • Reference Genome تصویر کامل است.
  • Alignment مشخص می‌کند هر قطعه کجا قرار دارد.

اما تفاوت مهم:

در ژنومیک:

  • تعداد قطعات میلیاردها عدد است.
  • تصویر نهایی میلیاردها حرف طول دارد.

بنابراین حل آن نیازمند الگوریتم‌های بسیار سریع است.


خلاصه نهایی مرور سریع

  • Read Alignment مسئله یافتن محل Readها روی ژنوم مرجع است.
  • Sequencerهای نسل دوم میلیاردها Read تولید می‌کنند.
  • ژنوم انسان حدود 3 میلیارد باز دارد.
  • Alignment باید برای هر Read به صورت جداگانه انجام شود.
  • Reference Genome مانند نقشه‌ای برای قرار دادن Readها عمل می‌کند.
  • DNA را می‌توان به صورت String در علوم کامپیوتر مدل کرد.
  • مسائل ژنومی اغلب به مسائل پردازش رشته‌ها تبدیل می‌شوند.
  • الگوریتم‌ها و ساختارهای داده برای پردازش سریع DNA ضروری هستند.
  • Read Alignment به دلیل حجم عظیم داده‌ها یک مسئله محاسباتی چالش‌برانگیز است.
  • تحقیقات در زمینه الگوریتم‌های بهتر برای Alignment همچنان ادامه دارد.

سوالات مرور

1. Read Alignment چه کاری انجام می‌دهد؟

پاسخ: Read Alignment محل احتمالی یک Sequencing Read را روی یک Reference Genome پیدا می‌کند.


2. چرا نمی‌توان فقط با نگاه کردن به یک Read اطلاعات زیادی درباره ژنوم به دست آورد؟

پاسخ: زیرا Readها بسیار کوتاه‌تر از ژن‌ها و کل ژنوم هستند و تنها بخش کوچکی از اطلاعات DNA را نشان می‌دهند.


3. چرا ژنوم مرجع برای Alignment مفید است؟

پاسخ: زیرا به عنوان یک نقشه راه عمل می‌کند و کمک می‌کند محل قرارگیری Readها در ژنوم مشخص شود.


4. چرا Read Alignment یک مسئله سخت محاسباتی است؟

پاسخ: زیرا باید میلیاردها Read را در یک ژنوم بسیار بزرگ مانند ژنوم انسان که حدود 3 میلیارد باز دارد، جستجو و مقایسه کرد.


5. چرا ارتباط بین ژنومیک و علوم کامپیوتر مهم است؟

پاسخ: زیرا DNA را می‌توان به صورت رشته‌ای از کاراکترها مدل کرد و از الگوریتم‌ها و ساختارهای داده طراحی‌شده برای پردازش رشته‌ها برای تحلیل ژنوم استفاده کرد.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/17_lecture-naive-exact-matching

الگوریتم تطبیق دقیق رشته‌ها (Naive Exact Matching)

خلاصه کلی

در این درس اولین مسئله محاسباتی مرتبط با هم‌ترازی خوانش‌های DNA (Read Alignment) معرفی می‌شود: مسئله تطبیق دقیق رشته‌ها (Exact Matching Problem).

در این مسئله هدف این است که تمام موقعیت‌هایی را پیدا کنیم که یک رشته کوتاه‌تر (Pattern) درون یک رشته بلندتر (Text) ظاهر می‌شود.

این مسئله نسخه ساده‌شده‌ای از مسئله واقعی هم‌ترازی DNA است؛ زیرا در ژنومیک نیز باید پیدا کنیم که یک خوانش کوتاه DNA (Sequencing Read) در کدام بخش از ژنوم مرجع (Reference Genome) قرار می‌گیرد.

هدف یادگیری:

  • آشنایی با مفهوم تطبیق رشته‌ها
  • پیاده‌سازی ساده‌ترین الگوریتم تطبیق
  • تحلیل کارایی الگوریتم با استفاده از تعداد مقایسه‌ها
  • درک نقاط ضعف روش‌های ساده برای مسائل بزرگ ژنومی

مفاهیم کلیدی

1. Exact Matching Problem (مسئله تطبیق دقیق)

تعریف ساده

مسئله‌ای که در آن باید تمام موقعیت‌هایی را پیدا کنیم که یک رشته مشخص (Pattern) دقیقاً در یک رشته بزرگ‌تر (Text) وجود دارد.

توضیح دقیق

دو رشته داریم:

  • Pattern (P): رشته‌ای که می‌خواهیم پیدا کنیم.
  • Text (T): رشته‌ای که در آن جستجو انجام می‌دهیم.

هدف:

پیدا کردن تمام Offsetها (موقعیت‌های شروع) که در آن‌ها:

[ P = T ]

یعنی تمام کاراکترهای Pattern دقیقاً با بخش متناظر در Text برابر باشند.

مثال

Pattern:

word

Text:

there would have been a time for such a word

در این مثال، رشته word در موقعیت:

offset = 40

شروع می‌شود.


2. Read Alignment Problem (مسئله هم‌ترازی خوانش‌ها)

تعریف ساده

پیدا کردن محل قرارگیری یک خوانش کوتاه DNA در یک ژنوم مرجع.

توضیح دقیق

در تکنولوژی‌های نسل دوم توالی‌یابی (Second Generation Sequencing) خروجی دستگاه شامل میلیاردها قطعه کوتاه DNA است.

این قطعات:

  • طول کمی دارند (معمولاً چند صد باز)
  • به تنهایی اطلاعات کافی درباره ژنوم ندارند

بنابراین باید مشخص کنیم هر قطعه از کجای ژنوم آمده است.

این کار مشابه قرار دادن قطعات پازل با استفاده از تصویر روی جعبه پازل است.

در ژنومیک:

  • قطعه DNA = قطعه پازل
  • ژنوم مرجع = تصویر کامل پازل

3. Pattern و Text به عنوان رشته (Strings)

تعریف ساده

در علوم کامپیوتر، توالی DNA را می‌توان مانند یک رشته از کاراکترها در نظر گرفت.

برای DNA:

A C G T

مانند یک String معمولی پردازش می‌شود.

اهمیت

این موضوع بسیار مهم است زیرا علوم کامپیوتر الگوریتم‌ها و ساختمان داده‌های قدرتمندی برای کار با رشته‌ها توسعه داده است:

  • جستجو در رشته‌ها
  • فهرست‌سازی (Indexing)
  • فشرده‌سازی (Compression)
  • مقایسه رشته‌ها

این ابزارها پایه بسیاری از الگوریتم‌های بیوانفورماتیک هستند.


الگوریتم Naive Exact Matching

تعریف

ساده‌ترین روش برای پیدا کردن Pattern در Text.

ایده اصلی:

تمام حالت‌های ممکن قرار گرفتن Pattern روی Text را امتحان کن و ببین آیا همه کاراکترها برابر هستند یا خیر.


مراحل الگوریتم

فرض کنید:

  • طول Pattern برابر x است.
  • طول Text برابر y است.

مرحله 1: بررسی تمام Alignmentها

Pattern را از ابتدای Text تا انتها حرکت می‌دهیم.

برای هر موقعیت:

  • Pattern را روی Text قرار می‌دهیم.
  • کاراکترها را مقایسه می‌کنیم.

مرحله 2: مقایسه کاراکترها

برای هر Alignment:

از اولین کاراکتر Pattern شروع می‌کنیم.

مثلاً:

Pattern:
A C G

Text:
A C G T A

مقایسه:

A = A ✓
C = C ✓
G = G ✓

پس Match داریم.

اما اگر:

A ≠ T

باشد:

  • تطبیق شکست می‌خورد.
  • دیگر نیازی به مقایسه باقی کاراکترها نیست.

پیاده‌سازی الگوریتم در Python

تابع اصلی:

naive(pattern, text)

ورودی:

  • pattern: رشته مورد جستجو
  • text: رشته‌ای که در آن جستجو می‌کنیم

خروجی:

  • لیستی از Offsetهایی که Pattern پیدا شده است.

ساختار الگوریتم

حلقه بیرونی (Outer Loop)

تمام موقعیت‌های ممکن قرارگیری Pattern را بررسی می‌کند.

تعداد Alignmentها:

[ y-x+1 ]

زیرا Pattern نمی‌تواند بعد از انتهای Text قرار گیرد.


حلقه داخلی (Inner Loop)

کاراکترهای Pattern را بررسی می‌کند.

برای هر Alignment:

حداکثر:

[ x ]

مقایسه انجام می‌شود.


تحلیل عملکرد الگوریتم

1. بیشترین تعداد مقایسه‌ها (Worst Case)

فرمول:

[ (y-x+1)\times x ]

دلیل:

  • تعداد Alignmentها:

[ y-x+1 ]

  • برای هر Alignment ممکن است تمام x کاراکتر مقایسه شوند.

مثال Worst Case

Pattern:

AAAA

Text:

AAAAAAAAAAAA

در این حالت:

  • تمام کاراکترها با هم تطبیق دارند.
  • الگوریتم مجبور است همه مقایسه‌ها را انجام دهد.

2. کمترین تعداد مقایسه‌ها (Best Case)

فرمول:

[ y-x+1 ]

زیرا در هر Alignment ممکن است اولین کاراکتر متفاوت باشد.

مثال:

Pattern:

AABC

Text:

BBBBBBBB

در هر موقعیت:

A ≠ B

پس الگوریتم بعد از فقط یک مقایسه متوقف می‌شود.


نکات مهم

  • مسئله Exact Matching نسخه ساده‌شده‌ای از Read Alignment است.
  • در توالی‌یابی DNA باید میلیاردها Read بررسی شوند.
  • ژنوم انسان حدود 3 میلیارد باز (Base) دارد.
  • یک Read معمولی فقط چند صد باز طول دارد.
  • به دلیل شباهت زیاد ژنوم افراد، ژنوم مرجع می‌تواند مانند نقشه راه برای پیدا کردن محل Read استفاده شود.
  • الگوریتم Naive ساده است اما برای داده‌های عظیم ژنومی ناکارآمد است.
  • الگوریتم‌های پیشرفته‌تر برای کاهش زمان جستجو مورد نیاز هستند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Exact Matching تطبیق دقیق پیدا کردن یک رشته که کاملاً با بخش دیگری برابر باشد
Pattern الگو / رشته جستجو رشته‌ای که به دنبال آن هستیم
Text متن / رشته مرجع رشته بزرگ‌تری که جستجو در آن انجام می‌شود
Offset موقعیت شروع شماره مکانی که Pattern در Text آغاز می‌شود
Read Alignment هم‌ترازی خوانش پیدا کردن محل Read در ژنوم مرجع
Sequencing Read خوانش توالی‌یابی قطعه کوتاه DNA تولیدشده توسط دستگاه توالی‌یابی
Reference Genome ژنوم مرجع توالی استاندارد ژنوم یک گونه
Naive Algorithm الگوریتم ساده‌لوحانه روشی ابتدایی که همه حالت‌ها را بررسی می‌کند
Alignment هم‌ترازی قرار دادن دو رشته مقابل هم برای مقایسه
String رشته مجموعه‌ای از کاراکترها مانند توالی DNA

مثال‌ها و تشبیه‌ها

تشبیه پازل

مسئله Read Alignment مانند حل یک پازل است:

حالت اول: داشتن تصویر پازل

اگر تصویر کامل را داشته باشیم:

  • هر قطعه را با تصویر مقایسه می‌کنیم.
  • جای آن را پیدا می‌کنیم.

این همان استفاده از Reference Genome است.


حالت دوم: بدون تصویر پازل

اگر تصویر را نداشته باشیم:

  • باید قطعات را با یکدیگر مقایسه کنیم.
  • قطعاتی که الگوهای مشترک دارند کنار هم قرار دهیم.

این حالت مشابه Genome Assembly است که زمانی استفاده می‌شود که ژنوم مرجع نداریم.


خلاصه نهایی مرور سریع

  • Exact Matching یعنی پیدا کردن تمام محل‌هایی که یک Pattern در یک Text ظاهر می‌شود.
  • Read Alignment نسخه ژنومی همین مسئله است.
  • Sequencing Readها کوتاه هستند و باید به ژنوم مرجع متصل شوند.
  • ژنوم مرجع مانند تصویر کامل یک پازل عمل می‌کند.
  • الگوریتم Naive همه Alignmentهای ممکن را بررسی می‌کند.
  • تعداد Alignmentها برابر است با:

[ y-x+1 ]

  • بدترین حالت تعداد مقایسه‌ها:

[ (y-x+1)x ]

  • بهترین حالت زمانی رخ می‌دهد که اولین کاراکتر در هر Alignment سریعاً شکست بخورد.
  • DNA را می‌توان به صورت String پردازش کرد.
  • الگوریتم‌های رشته‌ای نقش مهمی در بیوانفورماتیک دارند.

سوالات مرور

سوال 1: مسئله Exact Matching چیست؟

پاسخ:

پیدا کردن تمام موقعیت‌هایی است که یک Pattern به صورت دقیق در یک Text ظاهر می‌شود.


سوال 2: چرا Read Alignment شبیه مسئله تطبیق رشته‌ها است؟

پاسخ:

زیرا در هر دو مسئله باید یک رشته کوتاه را درون یک رشته بزرگ‌تر پیدا کنیم. در ژنومیک، Read نقش Pattern و ژنوم مرجع نقش Text را دارد.


سوال 3: چرا الگوریتم Naive برای ژنوم انسان مناسب نیست؟

پاسخ:

زیرا ژنوم انسان بسیار بزرگ است و تعداد Readها نیز میلیاردی است. بررسی تمام حالت‌های ممکن زمان بسیار زیادی نیاز دارد.


سوال 4: در الگوریتم Naive چند Alignment بررسی می‌شود؟

پاسخ:

اگر طول Pattern برابر x و طول Text برابر y باشد:

[ y-x+1 ]

Alignment بررسی می‌شود.


سوال 5: چه زمانی بدترین حالت الگوریتم Naive رخ می‌دهد؟

پاسخ:

زمانی که تقریباً تمام کاراکترهای Pattern و Text در همه Alignmentها با هم تطبیق داشته باشند و الگوریتم مجبور شود بیشترین تعداد مقایسه را انجام دهد.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/18_practical-matching-artificial-reads

پیاده‌سازی الگوریتم Naive Exact Matching برای تطبیق Readهای مصنوعی با ژنوم

خلاصه کلی

در این درس عملی، الگوریتم Naive Exact Matching که در درس قبل معرفی شد، در زبان Python پیاده‌سازی می‌شود و برای پیدا کردن محل قرارگیری خوانش‌های مصنوعی DNA (Artificial Reads) در یک ژنوم واقعی استفاده می‌شود.

در این تمرین:

  • یک ژنوم مرجع از ارگانیسم Phi X دانلود می‌شود.
  • الگوریتم تطبیق دقیق برای پیدا کردن محل Readها در ژنوم نوشته می‌شود.
  • تعدادی Read مصنوعی از ژنوم تولید می‌شود.
  • بررسی می‌شود که آیا این Readها دقیقاً به ژنوم اصلی برمی‌گردند یا خیر.

هدف یادگیری:

  • تبدیل مفهوم الگوریتم تطبیق رشته‌ها به کد عملی
  • درک نقش Pattern و Text در مسائل ژنومی
  • آزمایش صحت الگوریتم با داده‌های کنترل‌شده

مفاهیم کلیدی

1. Naive Exact Matching Algorithm (الگوریتم تطبیق دقیق ساده)

تعریف ساده

الگوریتمی برای پیدا کردن تمام موقعیت‌هایی که یک رشته کوتاه (Pattern) به صورت دقیق در یک رشته بلندتر (Text) ظاهر می‌شود.


کاربرد در ژنومیک

در این مسئله:

  • Pattern = Sequencing Read
  • Text = Genome Reference

هدف:

پیدا کردن تمام موقعیت‌هایی که Read دقیقاً در ژنوم وجود دارد.


روند الگوریتم

فرض کنیم:

  • P = Read
  • T = Genome

الگوریتم:

  1. تمام موقعیت‌های ممکن شروع Read در ژنوم بررسی می‌شوند.

  2. در هر موقعیت، تمام بازهای Read با بازهای متناظر ژنوم مقایسه می‌شوند.

  3. اگر حتی یک اختلاف وجود داشته باشد:

    • آن موقعیت رد می‌شود.
  4. اگر تمام بازها برابر باشند:

    • موقعیت ذخیره می‌شود.

2. Pattern و Text در تطبیق DNA

Pattern (الگو)

رشته کوتاه‌تری که دنبال آن هستیم.

در ژنومیک:

مثال:

AGCTTAG

یک Read توالی‌یابی است.


Text (متن)

رشته بزرگ‌تری که جستجو در آن انجام می‌شود.

در ژنومیک:

مثال:

ACGTAGCTTAGGCTA...

ژنوم مرجع است.


3. Artificial Reads (خوانش‌های مصنوعی)

تعریف ساده

قطعات DNA که به صورت مصنوعی از یک ژنوم موجود استخراج می‌شوند.


روش تولید

برای ساخت Read مصنوعی:

  • یک موقعیت تصادفی در ژنوم انتخاب می‌شود.
  • تعدادی باز پشت سر هم از آن نقطه برداشته می‌شود.

مثلاً:

ژنوم:

ACGTACGTTAGCTAAC

انتخاب تصادفی:

GTACG

این قطعه یک Read مصنوعی است.


اهمیت

چون این Readها:

  • از همان ژنوم ساخته شده‌اند.
  • خطای توالی‌یابی ندارند.
  • جهش ندارند.

بنابراین انتظار داریم همیشه دقیقاً در ژنوم پیدا شوند.


پیاده‌سازی الگوریتم در Python

تعریف تابع

تابع اصلی:

naive(P, T)

ورودی‌ها:

پارامتر مفهوم
P Pattern یا Read
T Text یا Genome

خروجی:

لیستی از موقعیت‌هایی که Pattern در Text پیدا شده است.


مراحل کدنویسی

1. ایجاد لیست ذخیره نتایج

ابتدا لیستی ساخته می‌شود:

occurrences = []

این لیست موقعیت‌های Match را نگه می‌دارد.


2. بررسی تمام موقعیت‌های ممکن

حلقه بیرونی:

for i in range(len(T)-len(P)+1):

تمام موقعیت‌هایی را بررسی می‌کند که Pattern می‌تواند در Text شروع شود.

فرمول:

[ |T|-|P|+1 ]


3. مقایسه کاراکترها

برای هر موقعیت:

for j in range(len(P)):

بازهای Pattern بررسی می‌شوند.

مقایسه:

T[i+j] == P[j]

چرا i+j؟

زیرا:

  • i مشخص‌کننده موقعیت شروع Pattern در Text است.
  • j مشخص‌کننده جایگاه باز داخل Pattern است.

بنابراین:

موقعیت واقعی در Text = i + j

4. توقف هنگام اختلاف

اگر:

T[i+j] != P[j]

باشد:

  • Match شکست خورده است.
  • ادامه مقایسه لازم نیست.

بنابراین:

break

استفاده می‌شود.


5. ذخیره Match موفق

اگر تمام مقایسه‌ها موفق باشند:

occurrences.append(i)

موقعیت ذخیره می‌شود.


آزمایش الگوریتم

مثال ساده

Text:

AGCTAGAGTAG

Pattern:

AG

الگوریتم سه محل پیدا می‌کند:

  • موقعیت 0
  • موقعیت 5
  • موقعیت 9

زیرا در این نقاط رشته AG وجود دارد.


آزمایش با Readهای مصنوعی

مراحل آزمایش

مرحله 1: دانلود ژنوم

ژنوم ارگانیسم:

Phi X

دانلود می‌شود.


مرحله 2: تولید Read مصنوعی

تابعی استفاده می‌شود که:

  • 100 Read تولید می‌کند.
  • طول هر Read برابر 100 باز است.

مرحله 3: بررسی تطبیق

برای هر Read:

الگوریتم:

naive(read, genome)

اجرا می‌شود.

اگر خروجی خالی نباشد:

یعنی Read در ژنوم پیدا شده است.


نتیجه آزمایش

تمام Readهای مصنوعی پیدا شدند:

100 / 100 reads matched exactly

یعنی:

  • 100٪ Readها تطبیق دقیق داشتند.
  • الگوریتم درست کار می‌کند.
  • چون Readها بدون خطا از ژنوم ساخته شده بودند، انتظار چنین نتیجه‌ای وجود داشت.

نکات مهم

  • در الگوریتم Naive، Read نقش Pattern و Genome نقش Text را دارد.
  • Readهای مصنوعی ابزار خوبی برای تست الگوریتم‌ها هستند زیرا جواب صحیح آن‌ها مشخص است.
  • در داده واقعی توالی‌یابی، خطاهای Sequencing و جهش‌ها باعث می‌شوند Exact Matching همیشه موفق نباشد.
  • الگوریتم Naive برای یادگیری مناسب است اما برای ژنوم‌های بزرگ و میلیاردها Read، بسیار کند خواهد بود.
  • توقف زودهنگام هنگام مشاهده اولین mismatch باعث بهبود عملکرد عملی الگوریتم می‌شود.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Naive Exact Matching تطبیق دقیق ساده الگوریتم بررسی تمام موقعیت‌های ممکن برای پیدا کردن یک رشته
Artificial Read خوانش مصنوعی قطعه DNA تولیدشده از یک ژنوم شناخته‌شده
Genome ژنوم کل اطلاعات ژنتیکی یک موجود زنده
Pattern الگو رشته‌ای که به دنبال آن هستیم
Text متن مرجع رشته‌ای که جستجو در آن انجام می‌شود
Reference Genome ژنوم مرجع توالی استاندارد برای مقایسه
Occurrence رخداد / موقعیت تطبیق محلی که Pattern در Text پیدا می‌شود
Mismatch عدم تطابق تفاوت بین دو باز در مقایسه
Match تطبیق برابر بودن کامل دو رشته
Index اندیس / موقعیت شماره جایگاه یک کاراکتر در رشته

مثال‌ها و تشبیه‌ها

مثال پازل

در این تمرین:

  • ژنوم مانند تصویر کامل پازل است.
  • Read مصنوعی مانند یک قطعه پازل است.
  • الگوریتم Naive تلاش می‌کند قطعه را در تمام نقاط تصویر امتحان کند.

اگر قطعه دقیقاً از همان پازل گرفته شده باشد، باید در یک نقطه خاص قرار بگیرد.


خلاصه نهایی مرور سریع

  • الگوریتم Naive Exact Matching برای یافتن یک رشته در رشته بزرگ‌تر استفاده می‌شود.
  • در ژنومیک، Read به عنوان Pattern و Genome به عنوان Text در نظر گرفته می‌شود.
  • الگوریتم تمام موقعیت‌های ممکن را بررسی می‌کند.
  • در هر موقعیت، تمام بازها مقایسه می‌شوند.
  • اولین mismatch باعث توقف بررسی آن موقعیت می‌شود.
  • Artificial Reads از ژنوم واقعی بدون خطا تولید می‌شوند.
  • چون Read مصنوعی مستقیماً از ژنوم گرفته شده است، باید Exact Match داشته باشد.
  • در آزمایش انجام‌شده، 100 از 100 Read دقیقاً پیدا شدند.
  • این آزمایش صحت پیاده‌سازی الگوریتم را تأیید می‌کند.

سوالات مرور

سوال 1: در الگوریتم Naive Exact Matching، Pattern و Text چه معنایی دارند؟

پاسخ:

Pattern رشته‌ای است که دنبال آن می‌گردیم و Text رشته بزرگ‌تری است که جستجو در آن انجام می‌شود. در ژنومیک، Pattern همان Read و Text همان Genome است.


سوال 2: چرا در این تمرین از Readهای مصنوعی استفاده شد؟

پاسخ:

زیرا محل واقعی آن‌ها مشخص است و چون بدون خطا تولید شده‌اند، انتظار داریم دقیقاً در ژنوم پیدا شوند. این موضوع امکان بررسی صحت الگوریتم را فراهم می‌کند.


سوال 3: چرا پس از اولین mismatch دیگر ادامه مقایسه انجام نمی‌شود؟

پاسخ:

زیرا وجود حتی یک اختلاف کافی است تا ثابت کند Pattern در آن موقعیت برابر Text نیست، بنابراین مقایسه باقی کاراکترها بی‌فایده خواهد بود.


سوال 4: در این الگوریتم چرا موقعیت مقایسه در Text برابر i+j است؟

پاسخ:

زیرا i موقعیت شروع Pattern در Text را مشخص می‌کند و j موقعیت کاراکتر داخل Pattern است. جمع این دو، موقعیت واقعی کاراکتر متناظر در Text را می‌دهد.


سوال 5: چرا الگوریتم Naive برای پروژه‌های بزرگ ژنومی مناسب نیست؟

پاسخ:

زیرا باید میلیاردها Read را در ژنوم‌های بسیار بزرگ بررسی کند و تعداد مقایسه‌ها بسیار زیاد می‌شود. برای داده‌های واقعی به الگوریتم‌های سریع‌تر نیاز است.


01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/19_practical-matching-real-reads

درس 19: تطبیق خوانش‌های واقعی DNA با ژنوم (Matching Real Sequencing Reads)

خلاصه کلی

در این درس، الگوریتم Naive Exact Matching که در بخش‌های قبل معرفی شد، برای تطبیق خوانش‌های واقعی حاصل از توالی‌یابی DNA با یک ژنوم مرجع استفاده می‌شود.

در ابتدا، انتظار داریم که خوانش‌های واقعی دقیقاً مانند خوانش‌های مصنوعی با ژنوم تطبیق پیدا کنند؛ اما در عمل مشاهده می‌شود که تعداد کمی از خوانش‌ها تطبیق کامل دارند. دلیل این موضوع وجود خطاهای توالی‌یابی، تفاوت‌های ژنتیکی بین نمونه و ژنوم مرجع، و همچنین دو رشته‌ای بودن DNA است.

هدف اصلی این درس:

  • بررسی محدودیت‌های Exact Matching در داده‌های واقعی.
  • آشنایی با مفهوم Reverse Complement در تطبیق DNA.
  • درک نیاز به الگوریتم‌های Approximate Matching برای تحلیل داده‌های واقعی ژنومی.

مفاهیم کلیدی

1. Real Sequencing Reads (خوانش‌های واقعی توالی‌یابی)

تعریف ساده

دنباله‌های کوتاه DNA هستند که مستقیماً توسط دستگاه توالی‌یابی از یک نمونه واقعی تولید شده‌اند.

توضیح دقیق

در درس‌های قبلی، خوانش‌های مصنوعی (Artificial Reads) ساخته شدند؛ این خوانش‌ها مستقیماً از ژنوم استخراج شده بودند و هیچ خطا یا جهشی نداشتند، بنابراین انتظار می‌رفت همیشه دقیقاً با ژنوم تطبیق پیدا کنند.

اما در این درس از داده‌های واقعی استفاده می‌شود:

  • خوانش‌ها از فایل FASTQ دریافت می‌شوند.
  • هر خوانش معمولاً حدود 100 نوکلئوتید طول دارد.
  • این خوانش‌ها ممکن است دارای خطا باشند.

اهمیت

داده‌های واقعی شرایط پیچیده‌ای دارند و الگوریتم‌های ساده معمولاً برای آن‌ها کافی نیستند.


2. Exact Matching (تطبیق دقیق)

تعریف ساده

روشی که در آن یک خوانش باید بدون حتی یک تفاوت، دقیقاً در ژنوم پیدا شود.

توضیح دقیق

در الگوریتم Naive Exact Matching:

  • خوانش (Read) به عنوان الگو (Pattern) در نظر گرفته می‌شود.
  • ژنوم (Genome) به عنوان متن (Text) در نظر گرفته می‌شود.
  • الگوریتم تمام موقعیت‌های ممکن را بررسی می‌کند.
  • فقط تطبیقی پذیرفته می‌شود که تمام بازهای DNA یکسان باشند.

مثال:

Read:
ACGT

Genome:
TTACGTAA

خوانش دقیقاً در موقعیت مناسب پیدا می‌شود.

اما اگر:

ACGT

ACGG

باشد، تطبیق رد می‌شود، زیرا یک باز متفاوت است.

اهمیت

این روش ساده است، اما برای داده‌های واقعی DNA محدودیت‌های زیادی دارد.


3. Sequencing Errors (خطاهای توالی‌یابی)

تعریف ساده

اشتباهاتی که دستگاه توالی‌یابی هنگام تعیین بازهای DNA ایجاد می‌کند.

توضیح دقیق

دستگاه Sequencer ممکن است یک باز را اشتباه گزارش کند.

مثلاً:

DNA واقعی:

ACGT

خوانش دستگاه:

ACCT

در این حالت Exact Matching شکست می‌خورد، زیرا تنها یک نوکلئوتید متفاوت است.

اهمیت

یکی از مهم‌ترین دلایل عدم تطبیق کامل خوانش‌های واقعی با ژنوم مرجع است.


4. Reference Genome (ژنوم مرجع)

تعریف ساده

یک توالی استاندارد ژنومی که برای مقایسه با نمونه‌های دیگر استفاده می‌شود.

توضیح دقیق

در این درس، خوانش‌های واقعی با ژنوم مرجع همان موجود مقایسه می‌شوند.

اما حتی اگر نمونه از همان گونه باشد، ممکن است:

  • تفاوت‌های ژنتیکی طبیعی وجود داشته باشد.
  • جهش‌ها باعث اختلاف شوند.

اهمیت

ژنوم مرجع یک راهنما برای پیدا کردن محل قرارگیری خوانش‌ها است.


5. Double-Stranded DNA (DNA دو رشته‌ای)

تعریف ساده

DNA از دو رشته مکمل تشکیل شده است و خوانش توالی‌یابی می‌تواند از هر کدام از این دو رشته گرفته شود.

توضیح دقیق

الگوریتم اولیه فقط یک جهت از DNA را بررسی می‌کند.

مثلاً اگر ژنوم:

5' - ACGT - 3'

باشد، دستگاه ممکن است رشته مقابل را بخواند:

3' - TGCA - 5'

بنابراین خوانش تولید شده ممکن است در جهت مخالف ژنوم باشد.

اهمیت

یکی از دلایل اصلی این است که بسیاری از خوانش‌ها با ژنوم تطبیق پیدا نمی‌کنند.


6. Reverse Complement (مکمل معکوس)

تعریف ساده

تبدیل یک رشته DNA به رشته‌ای که نشان‌دهنده همان توالی در جهت مخالف است.

مراحل:

  1. جایگزینی بازها با مکمل آن‌ها:
باز مکمل
A T
T A
C G
G C
  1. معکوس کردن ترتیب رشته.

مثال:

رشته اصلی:

ACGT

مکمل:

TGCA

مکمل معکوس:

ACGT

کاربرد

برای بررسی خوانش‌هایی که از رشته مخالف DNA آمده‌اند استفاده می‌شود.


7. Approximate Matching (تطبیق تقریبی)

تعریف ساده

روشی که اجازه می‌دهد خوانش و ژنوم کاملاً یکسان نباشند.

توضیح دقیق

در داده‌های واقعی، باید اجازه دهیم:

  • چند باز اشتباه باشند.
  • جهش وجود داشته باشد.
  • خطای دستگاه رخ داده باشد.

بنابراین Exact Matching کافی نیست و باید از الگوریتم‌هایی استفاده کنیم که اختلاف‌ها را تحمل کنند.

اهمیت

این موضوع در ادامه درس‌های این دوره بررسی خواهد شد.


نکات مهم

  • خوانش‌های مصنوعی همیشه دقیقاً با ژنوم تطبیق پیدا می‌کنند، زیرا بدون خطا تولید شده‌اند.
  • خوانش‌های واقعی ممکن است به دلیل خطاهای Sequencer با ژنوم متفاوت باشند.
  • استفاده از کل طول خوانش برای Exact Matching باعث کاهش شدید تعداد تطبیق‌ها می‌شود.
  • کوتاه کردن خوانش (مثلاً استفاده از 30 باز اول) احتمال تطبیق دقیق را افزایش می‌دهد.
  • DNA دو رشته‌ای است؛ بنابراین باید هم رشته اصلی و هم Reverse Complement بررسی شوند.
  • بعد از بررسی هر دو جهت و استفاده از بخشی از خوانش، حدود 93٪ خوانش‌ها تطبیق پیدا کردند.
  • باقی اختلاف‌ها عمدتاً ناشی از خطاهای توالی‌یابی هستند.
  • این آزمایش نشان می‌دهد که Exact Matching برای داده‌های واقعی کافی نیست.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Sequencing Read خوانش توالی‌یابی قطعه کوتاهی از DNA که توسط دستگاه Sequencer تولید شده است.
Artificial Read خوانش مصنوعی خوانشی که از ژنوم بدون خطا ساخته شده است.
Real Read خوانش واقعی داده واقعی حاصل از آزمایش توالی‌یابی.
Exact Matching تطبیق دقیق پیدا کردن یک رشته بدون هیچ اختلاف.
Approximate Matching تطبیق تقریبی تطبیقی که اجازه اختلاف بین رشته‌ها را می‌دهد.
Genome Reference ژنوم مرجع توالی استاندارد برای مقایسه ژنوم‌ها.
Sequencing Error خطای توالی‌یابی اشتباه دستگاه در تعیین باز DNA.
Reverse Complement مکمل معکوس رشته مکمل DNA در جهت مخالف.
Double-Stranded DNA DNA دو رشته‌ای ساختار DNA شامل دو رشته مکمل.
FASTQ فرمت ذخیره خوانش‌ها فایل استاندارد ذخیره توالی‌ها و کیفیت آن‌ها.

مثال‌ها و تشبیه‌ها

مثال 1: مشکل تطبیق دقیق

فرض کنید یک متن را از روی یک کتاب کپی کرده‌ایم، اما چند حرف اشتباه تایپ شده است.

اگر دنبال جمله دقیق بگردیم:

The quick brown fox

ولی متن دارای:

The quick brawn fox

باشد، جستجوی دقیق شکست می‌خورد.

در DNA نیز یک تغییر کوچک باعث شکست Exact Matching می‌شود.


مثال 2: رشته مخالف DNA

مانند خواندن یک متن از پشت آینه است.

اگر فقط متن مستقیم را جستجو کنیم، ممکن است نسخه آینه‌ای آن را پیدا نکنیم.

بنابراین باید Reverse Complement را نیز بررسی کنیم.


خلاصه نهایی مرور سریع

  • الگوریتم Naive Exact Matching برای پیدا کردن خوانش‌ها در ژنوم استفاده می‌شود.
  • خوانش‌های مصنوعی همیشه دقیقاً با ژنوم تطبیق دارند.
  • خوانش‌های واقعی به دلیل خطاهای Sequencing معمولاً تطبیق کامل ندارند.
  • اختلاف ژنتیکی بین نمونه و ژنوم مرجع نیز می‌تواند باعث عدم تطبیق شود.
  • DNA دو رشته‌ای است، بنابراین باید Reverse Complement نیز بررسی شود.
  • استفاده از فقط بخشی از خوانش احتمال تطبیق دقیق را افزایش می‌دهد.
  • در آزمایش، فقط 7 از 1000 خوانش کامل تطبیق پیدا کردند.
  • با استفاده از 30 باز ابتدایی و بررسی Reverse Complement، تعداد تطبیق‌ها به 932 از 1000 رسید.
  • Exact Matching برای داده‌های واقعی کافی نیست.
  • الگوریتم‌های Approximate Matching برای تحمل خطا ضروری هستند.

سوالات مرور

سوال 1: چرا خوانش‌های واقعی همیشه با ژنوم مرجع دقیقاً تطبیق پیدا نمی‌کنند؟

پاسخ: به دلیل وجود خطاهای توالی‌یابی، تفاوت‌های ژنتیکی بین نمونه و ژنوم مرجع، و همچنین قرار گرفتن خوانش روی رشته مخالف DNA.


سوال 2: تفاوت Artificial Read و Real Sequencing Read چیست؟

پاسخ: Artificial Read از ژنوم بدون خطا ساخته می‌شود و همیشه دقیقاً تطبیق دارد، اما Real Read حاصل دستگاه توالی‌یابی است و ممکن است دارای خطا باشد.


سوال 3: چرا بررسی Reverse Complement ضروری است؟

پاسخ: زیرا DNA دو رشته‌ای است و دستگاه توالی‌یابی می‌تواند خوانش را از هر کدام از دو رشته تولید کند.


سوال 4: چرا Exact Matching برای داده‌های ژنومی واقعی مناسب نیست؟

پاسخ: زیرا حتی یک اختلاف کوچک بین خوانش و ژنوم باعث شکست تطبیق می‌شود، در حالی که خطا و جهش در داده‌های واقعی طبیعی هستند.


سوال 5: Approximate Matching چه مشکلی را حل می‌کند؟

پاسخ: اجازه می‌دهد خوانش و ژنوم با وجود تعداد مشخصی اختلاف همچنان به عنوان تطبیق‌پذیر شناخته شوند.


02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/01_week-2-introduction

درس 01: مقدمه‌ای بر پیش‌پردازش، ایندکس‌گذاری و تطبیق تقریبی

Introduction to Preprocessing, Indexing, and Approximate Matching


خلاصه کلی

در این بخش، مسیر حل مسئله‌ی Read Alignment (تطبیق خوانش‌های DNA) با استفاده از الگوریتم‌ها و ساختمان داده‌های پیشرفته‌تر ادامه پیدا می‌کند.

در بخش‌های قبلی، الگوریتم Naive Exact Matching بررسی شد. این الگوریتم ساده است اما دو مشکل اساسی دارد:

  1. سرعت کافی برای حجم عظیم داده‌های ژنومی ندارد.
  2. قادر به پیدا کردن تطبیق‌هایی که دارای خطا یا اختلاف هستند نیست.

برای حل مسئله‌ی واقعی تطبیق خوانش‌های DNA، به الگوریتم‌هایی نیاز داریم که:

  • سریع (Fast) باشند.
  • تطبیق تقریبی (Approximate Matching) را پشتیبانی کنند.

در این ماژول سه ایده‌ی اصلی بررسی خواهد شد:

  1. الگوریتم Boyer-Moore به عنوان جایگزینی سریع‌تر برای جستجوی دقیق.
  2. مفهوم Indexing (ایندکس‌گذاری) برای افزایش سرعت جستجو در رشته‌های بسیار بزرگ مانند ژنوم.
  3. استفاده از Pigeonhole Principle (اصل لانه‌کبوتری) برای تبدیل مسئله‌ی تطبیق تقریبی به مجموعه‌ای از مسائل تطبیق دقیق.

مفاهیم کلیدی


1. Read Alignment Problem (مسئله تطبیق خوانش‌ها)

تعریف ساده

پیدا کردن محل قرارگیری یک خوانش کوتاه DNA در داخل یک ژنوم مرجع.

توضیح دقیق

در توالی‌یابی نسل دوم (Second Generation Sequencing)، دستگاه تعداد بسیار زیادی خوانش کوتاه تولید می‌کند.

هدف این است که:

  • هر Read را دریافت کنیم.
  • محل احتمالی آن را در Genome Reference پیدا کنیم.
  • تفاوت‌های احتمالی بین نمونه و مرجع را تشخیص دهیم.

این کار نیازمند الگوریتم‌هایی است که بتوانند میلیاردها مقایسه را به سرعت انجام دهند.

اهمیت

حل این مسئله یکی از پایه‌های اصلی تحلیل داده‌های ژنومی مانند:

  • تشخیص جهش‌ها
  • مطالعه تنوع ژنتیکی
  • تحلیل بیماری‌ها

است.


2. Naive Exact Matching (تطبیق دقیق ساده)

تعریف ساده

الگوریتمی که یک الگو (Pattern) را بدون هیچ اختلافی در یک متن (Text) جستجو می‌کند.

توضیح دقیق

در این روش:

  • تمام موقعیت‌های ممکن بررسی می‌شوند.
  • تمام کاراکترها مقایسه می‌شوند.
  • حتی یک اختلاف باعث رد شدن تطبیق می‌شود.

مثلاً:

Pattern:

ACGT

Text:

TTACGTAA

تطبیق پیدا می‌کند.

اما:

ACGT
ACGG

تطبیق ندارد.

محدودیت‌ها

1. کند بودن

ژنوم انسان حدود:

3 billion bases

طول دارد.

در حالی که هر آزمایش توالی‌یابی می‌تواند میلیاردها Read تولید کند.

بنابراین بررسی تک‌تک موقعیت‌ها بسیار پرهزینه است.

2. عدم تحمل خطا

در داده‌های واقعی:

  • خطای Sequencing وجود دارد.
  • تفاوت‌های ژنتیکی وجود دارد.

بنابراین تطبیق کاملاً دقیق کافی نیست.


3. Fast Pattern Matching Algorithms (الگوریتم‌های سریع تطبیق الگو)

تعریف ساده

الگوریتم‌هایی که برای پیدا کردن سریع‌تر الگوها در رشته‌های بزرگ طراحی شده‌اند.

توضیح دقیق

در علوم کامپیوتر، جستجو در رشته‌ها موضوعی بسیار قدیمی است.

الگوریتم‌ها و ساختمان داده‌های مختلفی برای:

  • جستجوی الگو
  • ساخت Index
  • فشرده‌سازی رشته‌ها

طراحی شده‌اند.

در این ماژول از این ایده‌ها برای ژنوم استفاده می‌شود.


4. Boyer-Moore Algorithm (الگوریتم بویِر-مور)

تعریف ساده

یک الگوریتم سریع برای تطبیق دقیق رشته‌ها که نسبت به Naive Matching مقایسه‌های کمتری انجام می‌دهد.

توضیح دقیق

Boyer-Moore به جای بررسی ساده‌ی تمام موقعیت‌ها:

  • از اطلاعات موجود در Pattern استفاده می‌کند.
  • هنگام مشاهده‌ی عدم تطابق، چندین موقعیت را رد می‌کند.
  • بنابراین نیاز به بررسی همه‌ی کاراکترها ندارد.

اهمیت

این الگوریتم:

  • ساده است.
  • سریع است.
  • برای جستجوی رشته‌های بزرگ بسیار کاربردی است.

در این درس به عنوان اولین جایگزین عملی برای Naive Matching معرفی می‌شود.


5. Indexing (ایندکس‌گذاری)

تعریف ساده

ساخت یک ساختار داده‌ی کمکی برای پیدا کردن سریع اطلاعات در یک مجموعه‌ی بزرگ.

توضیح دقیق

بدون Indexing، برای پیدا کردن یک کلمه در یک کتاب بزرگ باید تمام صفحات را بررسی کنیم.

اما اگر کتاب دارای فهرست باشد:

  • مستقیماً به محل موردنظر می‌رویم.

موتورهای جستجو نیز از همین ایده استفاده می‌کنند.

مثلاً وقتی عبارتی را در اینترنت جستجو می‌کنیم:

  • موتور جستجو کل اینترنت را دوباره بررسی نمی‌کند.
  • از Index ساخته‌شده قبلی استفاده می‌کند.

در ژنوم نیز می‌توان Index ساخت تا پیدا کردن Readها سریع‌تر شود.

اهمیت

Indexing دلیل اصلی امکان جستجوی سریع در داده‌های عظیم است.


6. Approximate Matching (تطبیق تقریبی)

تعریف ساده

پیدا کردن تطبیق‌هایی که اجازه می‌دهند چند اختلاف بین Pattern و Text وجود داشته باشد.

توضیح دقیق

در زیست‌شناسی، تطبیق کاملاً دقیق کافی نیست زیرا:

  • دستگاه Sequencer خطا دارد.
  • افراد مختلف ژنوم کاملاً یکسان ندارند.
  • جهش‌ها وجود دارند.

بنابراین باید بتوانیم مثلاً:

ACGT

را با:

ACCT

تطبیق دهیم، زیرا فقط یک اختلاف وجود دارد.

اهمیت

Approximate Matching برای حل واقعی مسئله‌ی Read Alignment ضروری است.


7. Pigeonhole Principle (اصل لانه‌کبوتری)

تعریف ساده

یک اصل ریاضی که بیان می‌کند اگر تعداد اشیا بیشتر از تعداد جایگاه‌ها باشد، حداقل یک جایگاه باید بیش از یک شیء داشته باشد.

کاربرد در ژنوم

این اصل کمک می‌کند مسئله‌ی Approximate Matching را به Exact Matching تبدیل کنیم.

ایده:

فرض کنید یک Read طولانی داریم که اجازه‌ی چند خطا دارد.

می‌توانیم آن را به چند قطعه تقسیم کنیم.

اگر کل Read باید در Genome پیدا شود، حداقل یکی از این قطعات باید کاملاً بدون خطا تطبیق پیدا کند.

بنابراین:

  1. Read را به بخش‌های کوچک‌تر تقسیم می‌کنیم.
  2. Exact Matching را روی هر بخش اجرا می‌کنیم.
  3. نتایج را ترکیب می‌کنیم.

اهمیت

با این روش می‌توانیم الگوریتم‌های Exact Matching قبلی را دوباره استفاده کنیم.


نکات مهم

  • مسئله‌ی Read Alignment نیازمند الگوریتم‌هایی سریع‌تر از Naive Matching است.
  • الگوریتم مناسب باید هم سرعت بالا داشته باشد و هم خطاها را تحمل کند.
  • Boyer-Moore یک الگوریتم سریع برای Exact Matching است.
  • Indexing باعث می‌شود جستجو در داده‌های بسیار بزرگ مانند Genome عملی شود.
  • موتورهای جستجو نمونه‌ای واقعی از کاربرد Indexing هستند.
  • Approximate Matching برای داده‌های زیستی ضروری است زیرا داده‌های واقعی کامل نیستند.
  • Pigeonhole Principle پلی بین Exact Matching و Approximate Matching ایجاد می‌کند.
  • بسیاری از الگوریتم‌های Exact Matching می‌توانند در حل Approximate Matching نیز استفاده شوند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Read Alignment تطبیق خوانش پیدا کردن محل Read در ژنوم مرجع
Pattern Matching تطبیق الگو پیدا کردن یک رشته در رشته دیگر
Exact Matching تطبیق دقیق تطبیق بدون هیچ اختلاف
Approximate Matching تطبیق تقریبی تطبیق با اجازه اختلاف
Naive Exact Matching تطبیق دقیق ساده الگوریتم ابتدایی بررسی تمام موقعیت‌ها
Boyer-Moore Algorithm الگوریتم بویِر-مور الگوریتم سریع برای تطبیق رشته‌ها
Indexing ایندکس‌گذاری ساخت ساختار داده برای جستجوی سریع
Pattern الگو رشته‌ای که دنبال آن می‌گردیم
Text متن رشته‌ای که جستجو در آن انجام می‌شود
Pigeonhole Principle اصل لانه‌کبوتری اصل ریاضی برای تقسیم مسئله تطبیق تقریبی
Data Structure ساختمان داده روش سازمان‌دهی داده برای پردازش سریع

مثال‌ها و تشبیه‌ها

تشبیه Indexing با کتاب

فرض کنید دنبال یک موضوع خاص در یک کتاب 5000 صفحه‌ای هستید.

بدون Index:

باید صفحه به صفحه جستجو کنید.

با Index:

به فهرست مراجعه می‌کنید و مستقیماً به صفحه موردنظر می‌روید.

در ژنوم نیز Indexing همین نقش را دارد.


تشبیه Pigeonhole Principle

فرض کنید یک Read را به چند قسمت تقسیم کنیم.

اگر Read دارای تعداد محدودی خطا باشد، نمی‌تواند همه‌ی قسمت‌ها را خراب کند.

پس حداقل یک بخش باید کاملاً سالم باقی بماند و همان بخش می‌تواند برای پیدا کردن محل Read استفاده شود.


خلاصه نهایی مرور سریع

  • Naive Exact Matching ساده است اما برای داده‌های ژنومی بسیار کند است.
  • Read Alignment واقعی نیازمند سرعت بالا و تحمل خطا است.
  • Boyer-Moore یک الگوریتم سریع‌تر برای تطبیق دقیق است.
  • Indexing جستجو در داده‌های عظیم را امکان‌پذیر می‌کند.
  • موتورهای جستجو نمونه‌ای از کاربرد Indexing هستند.
  • Approximate Matching اجازه وجود اختلاف بین Read و Genome را می‌دهد.
  • خطاهای Sequencing و تفاوت‌های ژنتیکی دلیل نیاز به Approximate Matching هستند.
  • Pigeonhole Principle امکان استفاده مجدد از الگوریتم‌های Exact Matching را فراهم می‌کند.
  • الگوریتم‌های رشته‌ای نقش مهمی در تحلیل داده‌های ژنومی دارند.

سوالات مرور

سوال 1: چرا Naive Exact Matching برای مسئله Read Alignment کافی نیست؟

پاسخ: زیرا تعداد Readها بسیار زیاد است و ژنوم‌ها بسیار طولانی هستند؛ بنابراین بررسی تمام موقعیت‌ها زمان زیادی می‌برد. همچنین این روش خطاهای توالی‌یابی را تحمل نمی‌کند.


سوال 2: هدف الگوریتم Boyer-Moore چیست؟

پاسخ: کاهش تعداد مقایسه‌ها و انجام جستجوی سریع‌تر نسبت به الگوریتم ساده Naive Matching.


سوال 3: Indexing چه مشکلی را حل می‌کند؟

پاسخ: باعث می‌شود به جای بررسی کل داده، بتوان سریعاً به محل احتمالی اطلاعات دسترسی پیدا کرد.


سوال 4: چرا Approximate Matching در ژنومیک ضروری است؟

پاسخ: زیرا داده‌های توالی‌یابی دارای خطا هستند و ژنوم افراد مختلف نیز کاملاً یکسان نیست.


سوال 5: چگونه Pigeonhole Principle به Approximate Matching کمک می‌کند؟

پاسخ: با تقسیم Read به بخش‌های کوچک‌تر، تضمین می‌کند که حداقل یکی از بخش‌ها باید دقیقاً تطبیق پیدا کند؛ بنابراین می‌توان از الگوریتم‌های Exact Matching برای حل مسئله تقریبی استفاده کرد.


02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/02_lecture-boyer-moore-basics

الگوریتم Boyer-Moore برای تطبیق الگو (Boyer-Moore Pattern Matching)

خلاصه کلی

در این درس، یک الگوریتم سریع‌تر برای حل مسئله تطبیق دقیق رشته‌ها (Exact Matching) معرفی می‌شود که یکی از پایه‌های مهم در حل مسئله هم‌ترازی خوانش‌های DNA (Read Alignment) است.

الگوریتم ساده Naive Exact Matching تمام موقعیت‌های ممکن را بررسی می‌کرد و در هر موقعیت تمام کاراکترها را مقایسه می‌کرد. این روش اگرچه ساده است، اما برای داده‌های بزرگ ژنومی بسیار کند است.

الگوریتم Boyer-Moore با استفاده از اطلاعات حاصل از مقایسه‌های قبلی، برخی موقعیت‌هایی را که قطعاً نمی‌توانند تطبیق ایجاد کنند حذف می‌کند و بنابراین تعداد زیادی مقایسه غیرضروری را انجام نمی‌دهد.

هدف یادگیری این بخش:

  • درک ایده اصلی Boyer-Moore

  • شناخت تفاوت آن با الگوریتم Naive Matching

  • آشنایی با دو قانون اصلی:

    • Bad Character Rule
    • Good Suffix Rule
  • فهم اینکه چگونه این قوانین باعث افزایش سرعت تطبیق رشته‌ها می‌شوند.


مفاهیم کلیدی

1. Exact Matching Problem (مسئله تطبیق دقیق)

تعریف ساده

هدف این مسئله پیدا کردن تمام موقعیت‌هایی است که یک رشته کوتاه‌تر (Pattern) دقیقاً درون یک رشته بزرگ‌تر (Text) ظاهر می‌شود.

توضیح دقیق

در مسئله خواندن DNA:

  • Pattern می‌تواند یک read حاصل از Sequencing باشد.
  • Text می‌تواند ژنوم مرجع باشد.

برای مثال:

Pattern = ACTG
Text = AA ACTG TT

هدف پیدا کردن محل شروع Pattern در Text است.


مشکل الگوریتم Naive Matching

الگوریتم Naive:

  1. Pattern را در هر موقعیت ممکن قرار می‌دهد.
  2. تمام کاراکترها را مقایسه می‌کند.
  3. اگر یک اختلاف پیدا شود، به موقعیت بعدی می‌رود.

مشکل:

  • بسیاری از موقعیت‌ها از قبل مشخص هستند که نمی‌توانند تطبیق داشته باشند.
  • ولی الگوریتم آن‌ها را دوباره بررسی می‌کند.

Boyer-Moore تلاش می‌کند این بررسی‌های اضافی را حذف کند.


2. Boyer-Moore Algorithm (الگوریتم بویِر-مور)

تعریف ساده

Boyer-Moore یک الگوریتم تطبیق رشته است که با پرش هوشمندانه بین موقعیت‌ها، تعداد مقایسه‌ها را کاهش می‌دهد.


ایده اصلی

در الگوریتم Naive:

  • تطبیق‌ها از چپ به راست بررسی می‌شوند.
  • هر شکست باعث حرکت فقط یک خانه به جلو می‌شود.

اما در Boyer-Moore:

  • موقعیت‌های شروع Pattern همچنان از چپ به راست بررسی می‌شوند.
  • اما مقایسه کاراکترها از راست به چپ انجام می‌شود.
  • هنگام مشاهده عدم تطبیق، الگوریتم بررسی می‌کند که چند موقعیت را می‌توان بدون از دست دادن جواب حذف کرد.

چرا مقایسه از راست به چپ است؟

زیرا اگر در انتهای Pattern یک اختلاف پیدا شود، اطلاعات بیشتری درباره بخش‌های قبلی داریم.

این اطلاعات اجازه می‌دهد چندین alignment را حذف کنیم.


3. Alignment (هم‌ترازی)

تعریف

قرار دادن Pattern در یک موقعیت خاص از Text برای بررسی تطبیق.

مثال:

Text:
A C G T A C

Pattern:
      T A C

هر جایگاهی که Pattern روی Text قرار می‌گیرد یک alignment است.


4. Bad Character Rule (قانون کاراکتر بد)

تعریف ساده

وقتی یک mismatch رخ می‌دهد، Pattern را طوری جابه‌جا می‌کنیم که:

  • یا کاراکتر اشتباه دوباره بتواند با یک کاراکتر مشابه در Pattern تطبیق پیدا کند،
  • یا Pattern کاملاً از آن کاراکتر عبور کند.

ایده اصلی

فرض کنید هنگام مقایسه:

Pattern:  ...T...
Text:     ...C...

به اختلاف می‌رسیم.

اگر کاراکتر C:

  • در بخش باقی‌مانده Pattern وجود داشته باشد → Pattern را طوری حرکت می‌دهیم که آن Cها روبه‌روی هم قرار بگیرند.
  • اگر C اصلاً در Pattern وجود نداشته باشد → Pattern را کاملاً از روی C عبور می‌دهیم.

مثال

Pattern:

ACGTTC

Text:

ACGTAC

مقایسه از راست:

Pattern: A C G T T C
Text:    A C G T A C
              ↑
          mismatch

در Text کاراکتر A باعث شکست شده است.

اگر A در سمت چپ Pattern وجود نداشته باشد:

  • تمام alignmentهایی که A را روبه‌روی این موقعیت قرار می‌دهند حذف می‌شوند.
  • Pattern مستقیماً جلو می‌رود.

اهمیت Bad Character Rule

این قانون باعث می‌شود:

  • تعداد زیادی alignment بررسی نشود.
  • سرعت جستجو افزایش یابد.

5. Good Suffix Rule (قانون پسوند خوب)

تعریف ساده

اگر بخشی از Pattern با Text تطبیق پیدا کرده باشد و سپس mismatch رخ دهد، الگوریتم تلاش می‌کند آن بخش تطبیق‌یافته را حفظ کند.


مفهوم Suffix

Suffix یعنی بخش انتهایی یک رشته.

مثلاً:

GENOME

پسوندها:

E
ME
OME
NOME
GENOME

ایده Good Suffix Rule

فرض کنید بخشی از Pattern با Text تطبیق یافته است:

Text:
      T A C

Pattern:
      T A C

سپس mismatch رخ می‌دهد.

به جای شروع دوباره، الگوریتم:

  • دنبال همان بخش تطبیق‌یافته در جای دیگری از Pattern می‌گردد.
  • Pattern را طوری جابه‌جا می‌کند که دوباره آن بخش حفظ شود.

هدف Good Suffix Rule

این قانون تلاش می‌کند:

  • تطبیق‌های قبلی از بین نروند.
  • دوباره‌کاری کاهش یابد.

مقایسه دو قانون اصلی Boyer-Moore

قانون هدف اصلی
Bad Character Rule تبدیل mismatch به match
Good Suffix Rule حفظ matchهای قبلی هنگام جابه‌جایی

نکات مهم

  • Boyer-Moore هنوز یک الگوریتم Exact Matching است؛ یعنی خطاهای توالی‌یابی را تحمل نمی‌کند.
  • برخلاف Naive Matching، تمام alignmentها بررسی نمی‌شوند.
  • مقایسه کاراکترها در Boyer-Moore از راست به چپ انجام می‌شود.
  • اطلاعات حاصل از mismatchها برای پرش‌های بزرگ استفاده می‌شود.
  • Boyer-Moore یکی از الگوریتم‌های استاندارد و بسیار رایج برای جستجوی متن است.
  • بسیاری از سیستم‌های جستجوی فایل و متن از نسخه‌هایی از این الگوریتم استفاده می‌کنند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Pattern الگو رشته‌ای که به دنبال آن هستیم
Text متن رشته بزرگ‌تری که در آن جستجو انجام می‌شود
Exact Matching تطبیق دقیق پیدا کردن تطبیق بدون هیچ اختلاف
Alignment هم‌ترازی قرار دادن Pattern در یک موقعیت از Text
Naive Matching تطبیق ساده/ابتدایی الگوریتمی که همه موقعیت‌ها را بررسی می‌کند
Boyer-Moore Algorithm الگوریتم بویِر-مور الگوریتم سریع برای تطبیق رشته
Mismatch عدم تطابق اختلاف بین دو کاراکتر
Bad Character Rule قانون کاراکتر بد قانون پرش بر اساس کاراکتر اشتباه
Good Suffix Rule قانون پسوند خوب قانون پرش بر اساس بخش تطبیق‌یافته
Suffix پسوند بخش انتهایی یک رشته
Prefix پیشوند بخش ابتدایی یک رشته

مثال‌ها و تشبیه‌ها

تشبیه با جستجوی کلمه در متن

فرض کنید دنبال کلمه‌ای در یک کتاب هستید.

روش ساده:

  • هر صفحه را خط به خط بررسی کنید.

روش Boyer-Moore:

  • ابتدا انتهای کلمه را بررسی کنید.
  • اگر یک حرف پیدا شد که اصلاً در کلمه وجود ندارد، چندین محل احتمالی را حذف کنید.

مانند این است که هنگام پیدا کردن یک قطعه پازل، وقتی متوجه می‌شوید رنگی در قطعه وجود ندارد، چند جای ممکن را فوراً کنار بگذارید.


خلاصه نهایی مرور سریع

  • Boyer-Moore یک الگوریتم سریع‌تر برای Exact Matching است.
  • برخلاف Naive Matching، همه alignmentها را بررسی نمی‌کند.
  • مقایسه کاراکترها در Boyer-Moore از راست به چپ انجام می‌شود.
  • هنگام mismatch، الگوریتم از اطلاعات موجود برای پرش استفاده می‌کند.
  • Bad Character Rule بر اساس کاراکتر اشتباه تصمیم می‌گیرد.
  • Good Suffix Rule بر اساس بخش تطبیق‌یافته قبلی تصمیم می‌گیرد.
  • هدف هر دو قانون کاهش تعداد مقایسه‌ها است.
  • Boyer-Moore پایه بسیاری از الگوریتم‌های جستجوی متن است.
  • در ژنومیک، چنین الگوریتم‌هایی برای پیدا کردن readها در ژنوم مرجع اهمیت زیادی دارند.

سوالات مرور

1. سوال مفهومی:

چرا Boyer-Moore از Naive Matching سریع‌تر است؟

پاسخ:

زیرا Boyer-Moore با استفاده از اطلاعات mismatchها، alignmentهایی را که امکان تطبیق ندارند حذف می‌کند و تعداد مقایسه‌ها را کاهش می‌دهد.


2. سوال تعریفی:

Bad Character Rule چیست؟

پاسخ:

قانونی در Boyer-Moore است که هنگام mismatch، Pattern را طوری جابه‌جا می‌کند که یا کاراکتر اشتباه دوباره قابل تطبیق شود یا Pattern کاملاً از آن عبور کند.


3. سوال تعریفی:

Good Suffix Rule چه کاری انجام می‌دهد؟

پاسخ:

این قانون از بخش‌هایی که قبلاً تطبیق یافته‌اند استفاده می‌کند تا هنگام جابه‌جایی Pattern، تطبیق‌های قبلی حفظ شوند.


4. سوال کاربردی:

اگر هنگام مقایسه، کاراکتر اشتباه در Text اصلاً در Pattern وجود نداشته باشد، Boyer-Moore چه کاری انجام می‌دهد؟

پاسخ:

Pattern را کاملاً از آن کاراکتر عبور می‌دهد، زیرا هیچ alignment شامل آن کاراکتر نمی‌تواند تطبیق ایجاد کند.


5. سوال کاربردی:

چرا Boyer-Moore برای تحلیل داده‌های ژنومی مفید است؟

پاسخ:

زیرا داده‌های ژنومی شامل رشته‌های بسیار طولانی DNA هستند و نیاز به الگوریتم‌هایی داریم که بتوانند میلیون‌ها read را سریع‌تر در ژنوم جستجو کنند.


02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/03_lecture-boyer-moore-putting-it-all-together

الگوریتم Boyer-Moore: ترکیب قوانین Bad Character و Good Suffix

خلاصه کلی

در این درس، ادامه الگوریتم Boyer-Moore بررسی می‌شود. در بخش‌های قبل دو قانون اصلی این الگوریتم معرفی شدند:

  • Bad Character Rule
  • Good Suffix Rule

در این بخش یاد می‌گیریم که این دو قانون در عمل چگونه با هم ترکیب می‌شوند تا بیشترین پرش ممکن در هنگام جستجوی Pattern در Text انجام شود.

ایده اصلی Boyer-Moore این است که برخلاف الگوریتم ساده Naive Exact Matching، بسیاری از alignmentها را بدون بررسی حذف کند و تنها موقعیت‌هایی را آزمایش کند که احتمال تطبیق دارند.

هدف یادگیری:

  • نحوه استفاده هم‌زمان از دو قانون Boyer-Moore
  • روش انتخاب مقدار پرش مناسب
  • درک دلیل برتری Boyer-Moore نسبت به Naive Matching
  • آشنایی با Lookup Tableهای مورد استفاده در پیاده‌سازی عملی

مفاهیم کلیدی

1. ترکیب Bad Character Rule و Good Suffix Rule

تعریف ساده

در Boyer-Moore هنگام وقوع mismatch، هر دو قانون بررسی می‌شوند و قانونی که اجازه بیشترین جابه‌جایی Pattern را می‌دهد انتخاب می‌شود.


توضیح دقیق

فرض کنید هنگام مقایسه Pattern و Text به یک mismatch می‌رسیم.

هر قانون یک مقدار پیشنهاد می‌دهد:

  • Bad Character Rule → چند alignment را می‌توان حذف کرد؟
  • Good Suffix Rule → چند alignment را می‌توان حذف کرد؟

سپس:

[ Shift = max(BadCharacterShift, GoodSuffixShift) ]

یعنی بیشترین پرش انتخاب می‌شود.


اهمیت

استفاده هم‌زمان از این دو قانون باعث می‌شود:

  • هیچ تطبیق احتمالی از دست نرود.
  • بیشترین تعداد alignment ممکن حذف شود.
  • سرعت جستجو افزایش یابد.

2. مثال ترکیب دو قانون

فرض کنید اولین alignment بررسی می‌شود.

در اولین مقایسه:

Pattern: ...G...
Text:    ...T...

یک mismatch رخ می‌دهد.

استفاده از Good Suffix Rule

چون هیچ کاراکتری قبل از mismatch تطبیق پیدا نکرده است:

  • هیچ suffix تطبیق‌یافته‌ای وجود ندارد.
  • بنابراین Good Suffix Rule قابل استفاده نیست.

استفاده از Bad Character Rule

قانون Bad Character بررسی می‌کند که کاراکتر T در Pattern وجود دارد یا خیر.

اگر وجود داشته باشد:

  • Pattern طوری جابه‌جا می‌شود که Tهای دو رشته روبه‌روی هم قرار گیرند.

اگر وجود نداشته باشد:

  • Pattern کاملاً از آن موقعیت عبور می‌کند.

در مثال، Bad Character Rule اجازه می‌دهد:

  • Pattern هفت خانه حرکت کند.
  • شش alignment حذف شود.

3. انتخاب بهترین پرش (Maximum Shift)

در یک alignment دیگر ممکن است:

  • Bad Character Rule پرش کوچک پیشنهاد دهد.
  • Good Suffix Rule پرش بزرگ‌تری پیشنهاد دهد.

مثلاً:

Bad Character:

Skip = 0 alignment

Good Suffix:

Skip = 2 alignments

در این حالت:

  • Good Suffix انتخاب می‌شود.
  • Pattern سه موقعیت جلو می‌رود.

4. مزیت Boyer-Moore نسبت به Naive Matching

Naive Exact Matching

در الگوریتم ساده:

  • هر alignment بررسی می‌شود.
  • هیچ alignment حذف نمی‌شود.
  • تقریباً تمام کاراکترهای Text بررسی می‌شوند.

Boyer-Moore

در Boyer-Moore:

  • برخی alignmentها کاملاً حذف می‌شوند.
  • بعضی کاراکترهای Text حتی هرگز بررسی نمی‌شوند.

مثال

در یک اجرای Boyer-Moore:

  • 15 alignment بدون بررسی حذف شدند.
  • تعدادی از کاراکترهای Text اصلاً وارد مقایسه نشدند.

این همان دلیل اصلی سرعت بیشتر Boyer-Moore است.


5. Lookup Tables (جدول‌های جستجو)

تعریف ساده

در پیاده‌سازی واقعی Boyer-Moore، مقدار پرش قوانین از قبل محاسبه و در جدول ذخیره می‌شود.


چرا به جدول نیاز داریم؟

در مثال‌های آموزشی، مقدار پرش را با نگاه کردن به Pattern و Text پیدا می‌کنیم.

اما در برنامه واقعی:

  • تعداد مقایسه‌ها بسیار زیاد است.
  • محاسبه دوباره پرش‌ها زمان‌بر است.

بنابراین قبل از شروع جستجو:

  1. Pattern بررسی می‌شود.
  2. جدول‌های لازم ساخته می‌شوند.
  3. هنگام mismatch مقدار پرش سریعاً از جدول خوانده می‌شود.

6. Bad Character Lookup Table

کاربرد

این جدول مقدار پرش را برای Bad Character Rule ذخیره می‌کند.


نحوه استفاده

برای استفاده از جدول به دو اطلاعات نیاز داریم:

1. موقعیت mismatch در Pattern

مثلاً:

Pattern = TCGC

G در موقعیت 2 mismatch داده است.

پس ستون مربوط به offset 2 انتخاب می‌شود.


2. کاراکتر اشتباه در Text

مثلاً:

Text character = T

پس ردیف مربوط به T انتخاب می‌شود.

مقدار داخل جدول:

  • تعداد alignmentهایی است که می‌توان حذف کرد.

7. ساخت جدول‌های Boyer-Moore

برای اجرای کامل Boyer-Moore باید قبل از شروع:

  • جدول Bad Character ساخته شود.
  • جدول Good Suffix ساخته شود.

نکته مهم:

برای ساخت این جدول‌ها فقط به Pattern نیاز داریم.

نیازی به Text نداریم.


نکات مهم

  • Boyer-Moore همچنان یک الگوریتم Exact Matching است.
  • هنگام mismatch، هر دو قانون بررسی می‌شوند.
  • همیشه بیشترین مقدار shift انتخاب می‌شود.
  • Bad Character Rule روی کاراکتر mismatch تمرکز دارد.
  • Good Suffix Rule روی بخش‌هایی تمرکز دارد که قبلاً match شده‌اند.
  • در پیاده‌سازی واقعی، قوانین به کمک Lookup Table اجرا می‌شوند.
  • جدول‌ها فقط از Pattern ساخته می‌شوند، نه از Text.
  • دلیل اصلی سرعت Boyer-Moore، حذف alignmentهای غیرممکن است.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Boyer-Moore Algorithm الگوریتم بویِر-مور الگوریتم سریع تطبیق رشته
Bad Character Rule قانون کاراکتر بد قانون پرش بر اساس کاراکتر mismatch
Good Suffix Rule قانون پسوند خوب قانون پرش بر اساس بخش match شده
Shift جابه‌جایی مقدار حرکت Pattern روی Text
Skip Alignment حذف هم‌ترازی عبور از موقعیت‌هایی که بررسی نمی‌شوند
Lookup Table جدول جستجو جدول آماده برای یافتن مقدار پرش
Pattern الگو رشته مورد جستجو
Text متن رشته‌ای که جستجو در آن انجام می‌شود
Offset موقعیت/اندیس محل یک کاراکتر در رشته
Mismatch عدم تطابق اختلاف بین دو کاراکتر

مثال‌ها و تشبیه‌ها

تشبیه جستجوی یک کلمه در کتاب

فرض کنید دنبال کلمه‌ای در یک کتاب هستید.

روش ساده:

  • هر حرف را در هر موقعیت بررسی می‌کنید.

روش Boyer-Moore:

اگر در انتهای کلمه متوجه شوید حرفی وجود دارد که در کلمه هدف نیست:

  • چندین موقعیت را سریع حذف می‌کنید.

مانند این است که هنگام پیدا کردن قطعه پازل، وقتی متوجه می‌شوید یک رنگ خاص اصلاً در تصویر وجود ندارد، تمام محل‌هایی که آن رنگ را لازم دارند کنار بگذارید.


خلاصه نهایی مرور سریع

  • Boyer-Moore نسخه سریع‌تر Exact Matching است.
  • دو قانون اصلی آن Bad Character و Good Suffix هستند.
  • هنگام mismatch، هر دو قانون مقدار shift پیشنهاد می‌کنند.
  • بیشترین shift انتخاب می‌شود.
  • Bad Character تلاش می‌کند mismatch را به match تبدیل کند.
  • Good Suffix تلاش می‌کند matchهای قبلی حفظ شوند.
  • Boyer-Moore می‌تواند alignmentهای زیادی را حذف کند.
  • برخلاف Naive Matching، همه موقعیت‌ها بررسی نمی‌شوند.
  • برای سرعت بیشتر، جدول‌های Lookup قبل از جستجو ساخته می‌شوند.
  • این جدول‌ها فقط به Pattern وابسته هستند.

سوالات مرور

1. سوال مفهومی:

چرا Boyer-Moore از Naive Matching سریع‌تر است؟

پاسخ:

زیرا Boyer-Moore با استفاده از اطلاعات mismatch، alignmentهایی را که امکان تطبیق ندارند حذف می‌کند و تعداد مقایسه‌ها را کاهش می‌دهد.


2. سوال تعریفی:

وقتی Bad Character Rule و Good Suffix Rule مقدارهای متفاوتی برای shift پیشنهاد دهند چه اتفاقی می‌افتد؟

پاسخ:

بیشترین مقدار shift انتخاب می‌شود تا بیشترین تعداد alignment ممکن حذف شود.


3. سوال کاربردی:

چرا برای اجرای Boyer-Moore از Lookup Table استفاده می‌کنیم؟

پاسخ:

زیرا محاسبه مقدار پرش در هر mismatch زمان‌بر است. جدول‌ها اجازه می‌دهند مقدار پرش سریعاً پیدا شود.


4. سوال مفهومی:

برای ساخت جدول‌های Boyer-Moore چه اطلاعاتی لازم است؟

پاسخ:

فقط Pattern لازم است. Text در ساخت این جدول‌ها نقشی ندارد.


5. سوال کاربردی:

اگر Good Suffix Rule بتواند ۷ alignment را حذف کند و Bad Character Rule فقط ۲ alignment را حذف کند، کدام انتخاب می‌شود؟

پاسخ:

Good Suffix Rule انتخاب می‌شود، زیرا مقدار پرش بزرگ‌تری ایجاد می‌کند.


02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/04_lecture-diversion-repetitive-elements

عناصر تکراری در ژنوم (Repetitive Elements) و تأثیر آن‌ها بر تحلیل داده‌های ژنومی

خلاصه کلی

ژنوم انسان نتیجه میلیاردها سال فرایندهای تکاملی است و برخلاف یک رشته کاملاً تصادفی، دارای الگوها و ساختارهای خاصی است. یکی از مهم‌ترین ویژگی‌های ژنوم انسان، وجود تعداد بسیار زیادی عناصر تکراری (Repetitive Elements) است.

این عناصر تکراری در بسیاری از روش‌های تحلیل ژنومی، به‌خصوص:

  • هم‌ترازی خوانش‌ها (Read Alignment)
  • مونتاژ ژنوم (Genome Assembly)

ایجاد مشکل می‌کنند، زیرا باعث ایجاد ابهام (Ambiguity) در تعیین محل دقیق یک قطعه DNA می‌شوند.

هدف این درس:

  • آشنایی با مفهوم عناصر تکراری در ژنوم
  • درک منشأ ایجاد آن‌ها
  • فهمیدن اینکه چرا این عناصر برای الگوریتم‌های زیست‌محاسباتی چالش ایجاد می‌کنند

مفاهیم کلیدی

1. Repetitive Elements — عناصر تکراری

تعریف ساده

عناصر تکراری بخش‌هایی از DNA هستند که یک توالی مشابه یا تقریباً مشابه، چندین بار در ژنوم ظاهر شده است.

توضیح دقیق

ژنوم انسان مانند یک رشته تصادفی از بازهای DNA نیست. فرایندهای تکاملی در طول زمان باعث ایجاد الگوهای خاصی شده‌اند، از جمله:

  • تکرار شدن بخش‌هایی از DNA
  • جابه‌جایی قطعات DNA
  • تکثیر بخش‌هایی از ژنوم

در نتیجه، بخش قابل توجهی از ژنوم انسان شامل توالی‌هایی است که بارها تکرار شده‌اند.

اهمیت

وجود عناصر تکراری باعث می‌شود الگوریتم‌ها نتوانند همیشه مشخص کنند یک قطعه DNA دقیقاً از کدام قسمت ژنوم آمده است.


2. Transposable Elements — عناصر قابل جابه‌جایی

تعریف ساده

Transposable Elements (TEs) قطعاتی از DNA هستند که توانایی حرکت یا تکثیر در بخش‌های مختلف ژنوم را دارند.

توضیح دقیق

این عناصر مانند قطعاتی از DNA هستند که می‌توانند:

  • خود را از یک محل جدا کنند (Cut and Paste)
  • از خود نسخه‌های جدید بسازند و در مکان‌های دیگر قرار دهند (Copy and Paste)

این فرایند معمولاً توسط پروتئین‌هایی مانند:

Transposase

انجام می‌شود.

Transposase آنزیمی است که به عنصر قابل جابه‌جایی کمک می‌کند تا در مکان جدیدی از ژنوم قرار گیرد.

اهمیت

فعالیت طولانی‌مدت عناصر قابل جابه‌جایی در تاریخ تکامل باعث شده است بخش بزرگی از ژنوم انسان از این عناصر تشکیل شود.

حدود:

45% از ژنوم انسان

با عناصر قابل جابه‌جایی پوشیده شده است.


3. Alu Elements — عناصر Alu

تعریف ساده

Alu یکی از معروف‌ترین و فراوان‌ترین انواع عناصر تکراری در ژنوم انسان است.

توضیح دقیق

Aluها نوعی عنصر قابل جابه‌جایی هستند که:

  • بیش از یک میلیون نسخه در ژنوم انسان دارند.
  • حدود 11% از کل ژنوم انسان را تشکیل می‌دهند.

به دلیل تعداد بسیار زیاد نسخه‌های مشابه، تشخیص منشأ یک خوانش DNA که از یک Alu آمده باشد، بسیار دشوار است.

اهمیت در تحلیل ژنوم

اگر یک sequencing read از داخل یک عنصر Alu گرفته شود، ممکن است بتواند با چندین نقطه مختلف در ژنوم تطبیق پیدا کند.

بنابراین الگوریتم نمی‌تواند با اطمینان بگوید:

این read دقیقاً از کدام نسخه Alu آمده است.


4. Ambiguity in Read Alignment — ابهام در هم‌ترازی خوانش‌ها

تعریف ساده

ابهام یعنی یک read بتواند به چندین مکان مختلف در ژنوم متصل شود و مشخص نباشد محل واقعی آن کجاست.

توضیح دقیق

در مسئله Read Alignment هدف این است که:

یک sequencing read کوتاه را پیدا کنیم و مشخص کنیم در کجای ژنوم قرار دارد.

اگر read از یک بخش منحصربه‌فرد ژنوم آمده باشد:

  • فقط یک محل مناسب پیدا می‌شود.
  • تعیین موقعیت آسان است.

اما اگر read از یک عنصر تکراری آمده باشد:

  • چندین محل مشابه وجود دارد.
  • الگوریتم نمی‌تواند محل اصلی را تشخیص دهد.

اهمیت

عناصر تکراری یکی از دلایل اصلی دشوار بودن مسئله Read Alignment هستند.


5. تأثیر عناصر تکراری بر Genome Assembly — مونتاژ ژنوم

تعریف ساده

در Genome Assembly هدف این است که قطعات کوتاه DNA بدون استفاده از یک ژنوم مرجع، دوباره کنار هم قرار گیرند.

توضیح

عناصر تکراری این فرایند را سخت‌تر می‌کنند، زیرا الگوریتم نمی‌داند قطعات مشابه باید در کدام قسمت مونتاژ شوند.

در آینده، هنگام بررسی Assembly خواهیم دید که تکرارهای ژنومی مشکلات دیگری نیز ایجاد می‌کنند.


نکات مهم

  • ژنوم انسان یک رشته تصادفی نیست؛ ساختارهای تکاملی خاصی در آن وجود دارد.
  • یکی از مهم‌ترین ویژگی‌های ژنوم انسان، وجود مقدار زیادی توالی‌های تکراری است.
  • حدود 45% ژنوم انسان مربوط به عناصر قابل جابه‌جایی است.
  • عنصر Alu یکی از فراوان‌ترین عناصر تکراری انسان است و بیش از یک میلیون نسخه دارد.
  • عناصر تکراری باعث ایجاد مشکل در Read Alignment می‌شوند، زیرا یک read ممکن است چندین محل احتمالی داشته باشد.
  • الگوریتم‌های تحلیل ژنومی باید بتوانند با این ابهام مقابله کنند.
  • در مونتاژ ژنوم، تکرارها باعث دشواری بیشتری نسبت به هم‌ترازی با مرجع می‌شوند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Repetitive Elements عناصر تکراری بخش‌هایی از DNA که چندین بار در ژنوم تکرار شده‌اند
Transposable Elements (TEs) عناصر قابل جابه‌جایی قطعات DNA که قادر به حرکت یا تکثیر در ژنوم هستند
Transposase ترانسپوزاز پروتئینی که جابه‌جایی عناصر DNA را امکان‌پذیر می‌کند
Alu Elements عناصر Alu نوعی عنصر تکراری بسیار فراوان در ژنوم انسان
Read Alignment هم‌ترازی خوانش‌ها یافتن محل یک sequencing read در ژنوم مرجع
Genome Assembly مونتاژ ژنوم بازسازی ژنوم از قطعات کوتاه DNA بدون مرجع
Ambiguity ابهام وجود چندین موقعیت احتمالی برای یک read
Reference Genome ژنوم مرجع توالی استاندارد ژنوم که برای مقایسه استفاده می‌شود
Sequencing Read خوانش توالی‌یابی قطعه کوتاهی از DNA که توسط دستگاه توالی‌یاب تولید شده است

مثال‌ها و تشبیه‌ها

تشبیه پازل

برای درک مشکل عناصر تکراری می‌توان ژنوم را مانند یک پازل تصور کرد.

حالت ساده:

فرض کنید بیشتر قطعات پازل دارای تصویرهای منحصربه‌فرد هستند.

مثلاً:

  • یک قطعه شامل تصویر یک گل است.
  • یک قطعه شامل تصویر یک حیوان است.

در این حالت، پیدا کردن محل هر قطعه آسان است.

حالت دشوار:

حال تصور کنید نیمی از قطعات فقط آسمان آبی ساده باشند.

اگر یک قطعه آبی پیدا کنید، نمی‌توانید بفهمید دقیقاً از کدام قسمت آسمان آمده است.

عناصر تکراری در ژنوم مانند همین قطعات آسمان آبی هستند.


خلاصه نهایی مرور سریع

  • ژنوم انسان حاصل فرایندهای تکاملی پیچیده است و تصادفی نیست.
  • بخش بزرگی از ژنوم شامل عناصر تکراری است.
  • Transposable Elements قطعات DNA هستند که می‌توانند در ژنوم حرکت یا تکثیر شوند.
  • حدود 45% از ژنوم انسان توسط عناصر قابل جابه‌جایی پوشیده شده است.
  • Alu یکی از مهم‌ترین عناصر تکراری انسان است و بیش از یک میلیون نسخه دارد.
  • عناصر تکراری باعث ایجاد ابهام در Read Alignment می‌شوند.
  • یک read از یک ناحیه تکراری ممکن است به چندین مکان ژنوم متصل شود.
  • عناصر تکراری یکی از چالش‌های اصلی در طراحی الگوریتم‌های ژنومی هستند.
  • در Genome Assembly نیز تکرارها باعث دشوار شدن بازسازی ژنوم می‌شوند.

سوالات مرور

1. چرا ژنوم انسان را نمی‌توان یک رشته کاملاً تصادفی در نظر گرفت؟

پاسخ: زیرا فرایندهای تکاملی باعث ایجاد الگوهای خاصی مانند عناصر تکراری و توالی‌های محافظت‌شده در ژنوم شده‌اند.


2. Transposable Element چیست؟

پاسخ: قطعه‌ای از DNA است که توانایی حرکت یا ایجاد نسخه‌های جدید از خود در بخش‌های مختلف ژنوم را دارد.


3. چرا عناصر Alu برای Read Alignment مشکل ایجاد می‌کنند؟

پاسخ: زیرا Aluها میلیون‌ها نسخه مشابه در ژنوم دارند و یک read ممکن است بتواند به چندین نسخه مختلف متصل شود، بنابراین محل واقعی آن مشخص نیست.


4. تفاوت بین یک read از ناحیه منحصربه‌فرد و یک read از ناحیه تکراری چیست؟

پاسخ: read منحصربه‌فرد معمولاً فقط یک محل تطبیق دارد، اما read تکراری ممکن است چندین محل مشابه در ژنوم داشته باشد.


5. چگونه عناصر تکراری روی Genome Assembly اثر می‌گذارند؟

پاسخ: باعث می‌شوند الگوریتم‌ها نتوانند به‌راحتی تعیین کنند قطعات مشابه DNA باید در کدام قسمت ژنوم قرار گیرند، بنابراین مونتاژ دشوارتر می‌شود.


02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/05_practical-implementing-boyer-moore

پیاده‌سازی الگوریتم Boyer-Moore برای تطبیق الگو (Implementing Boyer-Moore)

خلاصه کلی

در این درس، الگوریتم Boyer-Moore به‌صورت عملی پیاده‌سازی می‌شود. این الگوریتم یکی از روش‌های سریع برای حل مسئله Exact Matching (تطبیق دقیق رشته‌ها) است و نسبت به الگوریتم ساده Naive Exact Matching با کاهش تعداد مقایسه‌ها، سرعت بیشتری دارد.

ایده اصلی Boyer-Moore این است که:

  • هنگام پیدا شدن عدم تطابق (Mismatch) به جای حرکت یک مرحله‌ای، از اطلاعات موجود استفاده کنیم.

  • با کمک دو قانون:

    • Bad Character Rule
    • Good Suffix Rule

بفهمیم چند موقعیت را می‌توانیم رد کنیم و الگو (Pattern) را چند خانه جلو ببریم.

هدف یادگیری این بخش:

  • آشنایی با ساختار پیاده‌سازی Boyer-Moore
  • درک نقش مرحله پیش‌پردازش (Preprocessing)
  • نحوه استفاده هم‌زمان از قوانین Bad Character و Good Suffix
  • پیاده‌سازی الگوریتم جستجوی سریع در متن DNA

مفاهیم کلیدی

1. Boyer-Moore Algorithm — الگوریتم بویِر-مور

تعریف ساده

الگوریتمی برای پیدا کردن یک الگو (Pattern) در یک متن (Text) که با استفاده از پرش‌های هوشمند، تعداد مقایسه‌های لازم را کاهش می‌دهد.

توضیح دقیق

در الگوریتم Naive:

  • الگو در تمام موقعیت‌های ممکن امتحان می‌شود.
  • پس از هر mismatch فقط یک خانه جلو می‌رویم.

اما در Boyer-Moore:

  • موقعیت‌های بررسی همچنان از چپ به راست حرکت می‌کنند.
  • اما مقایسه کاراکترها از راست به چپ انجام می‌شود.
  • هنگام mismatch، الگوریتم بررسی می‌کند که آیا می‌توان چندین موقعیت را بدون بررسی رد کرد.

اهمیت

در داده‌های بزرگ ژنومی که میلیاردها read وجود دارد، کاهش حتی چند مقایسه می‌تواند باعث افزایش چشمگیر سرعت شود.


2. Preprocessing — پیش‌پردازش

تعریف ساده

مرحله‌ای قبل از شروع جستجو که در آن اطلاعات لازم برای پرش‌های سریع محاسبه می‌شود.

توضیح دقیق

برای اجرای سریع Boyer-Moore، ابتدا فقط با استفاده از Pattern جدول‌هایی ساخته می‌شوند.

این جدول‌ها شامل اطلاعات مربوط به:

  • Bad Character Rule
  • Good Suffix Rule

هستند.

نکته مهم:

برای ساخت این جدول‌ها فقط Pattern لازم است و Text نیازی نیست.

اهمیت

به جای اینکه هنگام هر mismatch دوباره محاسبه کنیم چند خانه جلو برویم، مقدار پرش را سریع از جدول پیدا می‌کنیم.


3. Bad Character Rule — قانون کاراکتر بد

تعریف ساده

اگر در هنگام مقایسه یک mismatch رخ دهد، الگو را آن‌قدر جابه‌جا می‌کنیم تا:

  • کاراکتر اشتباه در متن با همان کاراکتر در Pattern هم‌راستا شود،
  • یا Pattern کاملاً از آن کاراکتر عبور کند.

توضیح دقیق

فرض کنید:

  • در Pattern یک کاراکتر داریم که با کاراکتر Text تطبیق ندارد.
  • این کاراکتر در Pattern وجود ندارد.

در این حالت هیچ تطبیقی نمی‌تواند شامل آن کاراکتر باشد، بنابراین می‌توانیم Pattern را کاملاً از روی آن عبور دهیم.

اگر آن کاراکتر در Pattern وجود داشته باشد:

  • Pattern را جابه‌جا می‌کنیم تا نزدیک‌ترین نمونه آن کاراکتر در Pattern زیر mismatch قرار گیرد.

اهمیت

این قانون باعث می‌شود بسیاری از موقعیت‌هایی که قطعاً جواب نمی‌دهند، بررسی نشوند.


4. Good Suffix Rule — قانون پسوند خوب

تعریف ساده

اگر بخشی از Pattern با Text تطبیق پیدا کرده باشد و سپس mismatch رخ دهد، Pattern را طوری جابه‌جا می‌کنیم که بخش تطبیق‌یافته دوباره حفظ شود.

توضیح دقیق

در Boyer-Moore هنگام مقایسه از انتهای Pattern شروع می‌کنیم.

ممکن است:

  • چند کاراکتر آخر Pattern با Text تطبیق پیدا کنند.
  • سپس یک mismatch رخ دهد.

این بخش تطبیق‌یافته را:

Good Suffix

می‌نامیم.

الگوریتم دنبال موقعیتی در Pattern می‌گردد که:

  • همان توالی دوباره ظاهر شده باشد،
  • یا یک پیشوند Pattern با آن پسوند تطبیق داشته باشد.

سپس Pattern را به آن موقعیت منتقل می‌کند.

اهمیت

باعث می‌شود اطلاعاتی که از تطبیق قبلی به دست آمده، هدر نرود.


5. Match Skip — پرش پس از تطبیق کامل

تعریف ساده

حالتی خاص از Good Suffix Rule است که وقتی کل Pattern با Text تطبیق پیدا کرده است، مشخص می‌کند چقدر می‌توانیم جلو برویم تا تطبیق بعدی را پیدا کنیم.

توضیح دقیق

اگر Pattern کاملاً پیدا شد، معمولاً لازم نیست فقط یک خانه جلو برویم.

با استفاده از ساختار Pattern می‌توانیم:

  • تطبیق‌های بعدی را سریع‌تر پیدا کنیم.

6. پیاده‌سازی تابع Boyer-Moore

ساختار کلی الگوریتم:

ورودی‌ها:

  • p → Pattern
  • p_bm → شیء Boyer-Moore شامل اطلاعات پیش‌پردازش
  • t → Text

مراحل:

  1. ایجاد متغیر موقعیت:
i = 0

برای نگهداری محل فعلی در Text.

  1. ایجاد لیست رخدادها:
occurrences = []

برای ذخیره محل‌هایی که Pattern پیدا شده است.

  1. حرکت روی Text:

تا زمانی که Pattern بتواند داخل Text قرار گیرد:

while i < len(t)-len(p)+1
  1. مقایسه Pattern از راست به چپ:
for j in range(len(p)-1, -1, -1)
  1. در صورت mismatch:

محاسبه:

  • مقدار پرش Bad Character
  • مقدار پرش Good Suffix

و انتخاب بزرگ‌ترین مقدار:

shift = max(shift, skip_bc, skip_gs)
  1. اگر mismatch وجود نداشت:

Pattern پیدا شده است:

  • موقعیت ذخیره می‌شود.
  • مقدار پرش Match Skip محاسبه می‌شود.

نکات مهم

  • برخلاف Naive Matching، Boyer-Moore مقایسه کاراکترها را از راست به چپ انجام می‌دهد.

  • حرکت بین alignmentها همچنان از چپ به راست است.

  • در هر mismatch دو قانون بررسی می‌شوند:

    • Bad Character Rule
    • Good Suffix Rule
  • همیشه بزرگ‌ترین مقدار پرش انتخاب می‌شود.

  • جدول‌های پیش‌پردازش فقط به Pattern وابسته هستند.

  • اگر Pattern کاملاً Match شود، Match Skip برای یافتن تطبیق بعدی استفاده می‌شود.

  • هدف اصلی Boyer-Moore کاهش تعداد مقایسه‌های غیرضروری است.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Boyer-Moore Algorithm الگوریتم بویِر-مور الگوریتم سریع برای تطبیق رشته‌ها
Pattern الگو رشته‌ای که به دنبال آن هستیم
Text متن رشته‌ای که در آن جستجو انجام می‌شود
Preprocessing پیش‌پردازش آماده‌سازی اطلاعات قبل از جستجو
Bad Character Rule قانون کاراکتر بد قانون پرش بر اساس کاراکتر mismatch شده
Good Suffix Rule قانون پسوند خوب قانون پرش بر اساس بخش تطبیق‌یافته Pattern
Match Skip پرش پس از تطبیق پرش بعد از پیدا شدن کامل Pattern
Mismatch عدم تطابق زمانی که دو کاراکتر برابر نیستند
Alignment هم‌ترازی قرار دادن Pattern مقابل بخشی از Text
Offset افست / موقعیت محل شروع یک تطبیق در Text

مثال‌ها و تشبیه‌ها

مثال استفاده از Bad Character Rule

فرض کنید Pattern:

TCGC

باشد.

اگر هنگام مقایسه:

  • یک کاراکتر در Text برابر T باشد،
  • اما این T در بخش مربوطه از Pattern نباشد،

می‌توانیم Pattern را جلو ببریم تا این T با جای مناسب خودش در Pattern قرار گیرد.

اگر هیچ T دیگری در Pattern وجود نداشته باشد، Pattern را کاملاً از آن عبور می‌دهیم.


مثال Good Suffix Rule

فرض کنید هنگام مقایسه از راست:

GCG

در Text و Pattern تطبیق پیدا کرده است.

اگر mismatch رخ دهد، الگوریتم دنبال یک نمونه دیگر از:

GCG

در Pattern می‌گردد.

اگر پیدا شود، Pattern مستقیماً به آن موقعیت منتقل می‌شود.


خلاصه نهایی مرور سریع

  • Boyer-Moore نسخه سریع‌تر Exact Matching است.
  • تفاوت اصلی آن با Naive Matching استفاده از پرش‌های هوشمند است.
  • مقایسه کاراکترها در Boyer-Moore از راست به چپ انجام می‌شود.
  • Bad Character Rule بر اساس کاراکتر mismatch شده تصمیم می‌گیرد.
  • Good Suffix Rule از بخش‌هایی که قبلاً Match شده‌اند استفاده می‌کند.
  • همیشه بیشترین مقدار پرش بین قوانین مختلف انتخاب می‌شود.
  • قبل از جستجو، جدول‌های Preprocessing ساخته می‌شوند.
  • این جدول‌ها فقط به Pattern وابسته‌اند.
  • Match Skip حالت خاصی از Good Suffix Rule است.
  • کاهش تعداد مقایسه‌ها دلیل اصلی سرعت Boyer-Moore است.

سوالات مرور

1. تفاوت اصلی Boyer-Moore و Naive Exact Matching چیست؟

پاسخ: Naive در هر mismatch فقط یک خانه جلو می‌رود، اما Boyer-Moore با استفاده از اطلاعات mismatch می‌تواند چندین موقعیت را حذف کند.


2. چرا Boyer-Moore مقایسه‌ها را از راست به چپ انجام می‌دهد؟

پاسخ: زیرا این کار امکان استفاده از Good Suffix Rule و Bad Character Rule را فراهم می‌کند و باعث پرش‌های بزرگ‌تر می‌شود.


3. Bad Character Rule چه هدفی دارد؟

پاسخ: هدف آن جابه‌جایی Pattern به شکلی است که کاراکتر mismatch شده دوباره تطبیق پیدا کند یا Pattern کاملاً از آن عبور کند.


4. Good Suffix Rule بر چه اساسی عمل می‌کند؟

پاسخ: بر اساس بخش‌هایی از Pattern که قبل از mismatch با Text تطبیق پیدا کرده‌اند و تلاش می‌کند این تطبیق‌ها را حفظ کند.


5. چرا قبل از اجرای Boyer-Moore به Preprocessing نیاز داریم؟

پاسخ: زیرا جدول‌های مربوط به قوانین پرش را از قبل محاسبه می‌کنیم تا هنگام جستجو بتوانیم مقدار shift را سریع پیدا کنیم.


02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/06_lecture-preprocessing

پیش‌پردازش (Preprocessing) در الگوریتم‌های تطبیق الگو

خلاصه کلی

در این درس مفهوم پیش‌پردازش (Preprocessing) در الگوریتم‌های تطبیق رشته (Pattern Matching) معرفی می‌شود و تفاوت بین الگوریتم‌های Online و Offline بررسی می‌گردد.

الگوریتم ساده Naive Exact Matching هیچ مرحله پیش‌پردازشی ندارد، اما الگوریتم Boyer-Moore قبل از شروع جستجو، الگوی موردنظر (Pattern) را پردازش می‌کند تا جدول‌هایی برای قوانین Bad Character Rule و Good Suffix Rule بسازد.

هدف اصلی این درس:

  • درک مفهوم پیش‌پردازش و مزیت آن
  • شناخت تفاوت پردازش الگو (Pattern Preprocessing) و پردازش متن (Text Preprocessing)
  • آشنایی با الگوریتم‌های Online و Offline
  • درک اینکه چرا مسئله Read Alignment در ژنومیک به الگوریتم‌های Offline نیاز دارد

مفاهیم کلیدی

1. Preprocessing (پیش‌پردازش)

تعریف ساده

پیش‌پردازش یعنی انجام محاسبات اضافی قبل از شروع عملیات اصلی جستجو، به‌گونه‌ای که اجرای بعدی سریع‌تر شود.

توضیح دقیق

در الگوریتم‌های تطبیق رشته، معمولاً دو ورودی داریم:

  • Pattern (P): رشته‌ای که دنبال آن می‌گردیم.
  • Text (T): رشته‌ای که در آن جستجو انجام می‌شود.

یک الگوریتم می‌تواند قبل از دریافت کامل مسئله، بخشی از اطلاعات را آماده کند.

مثلاً در Boyer-Moore:

  1. ابتدا فقط Pattern را دریافت می‌کنیم.
  2. روی Pattern پردازش انجام می‌دهیم.
  3. جدول‌های لازم برای پرش‌های سریع ساخته می‌شوند.
  4. بعداً وقتی Text دریافت شد، از این جدول‌ها برای جستجوی سریع استفاده می‌کنیم.

اهمیت

پیش‌پردازش باعث می‌شود هزینه اولیه یک‌بار پرداخت شود و در استفاده‌های متعدد، زمان زیادی صرفه‌جویی شود.


2. Pattern Preprocessing (پیش‌پردازش الگو)

تعریف ساده

یعنی پردازش Pattern قبل از اینکه Text مشخص باشد.

توضیح دقیق

در Boyer-Moore، فقط Pattern پردازش می‌شود.

از Pattern، جدول‌هایی ساخته می‌شود که مشخص می‌کنند هنگام عدم تطابق:

  • چند موقعیت می‌توانیم پرش کنیم.
  • کدام بخش‌های Text را اصلاً بررسی نکنیم.

دو جدول اصلی:

  1. Bad Character Table
  2. Good Suffix Table

پس اگر امروز Pattern را داشته باشیم ولی Text را فردا دریافت کنیم، هنوز می‌توانیم کاری انجام دهیم.


3. Amortization (سرشکن کردن هزینه)

تعریف ساده

یعنی هزینه یک عملیات گران را بین چندین استفاده تقسیم کنیم.

توضیح دقیق

فرض کنید یک Pattern مشخص را باید در هزار Text مختلف جستجو کنیم.

اگر هر بار Pattern را دوباره پردازش کنیم، هزینه زیادی داریم.

اما در Boyer-Moore:

  • Pattern فقط یک‌بار پردازش می‌شود.
  • جدول‌ها ذخیره می‌شوند.
  • برای Textهای جدید دوباره استفاده می‌شوند.

بنابراین هزینه پیش‌پردازش در طول زمان جبران می‌شود.

مثال

اگر ساخت جدول‌ها ۱ ثانیه طول بکشد:

  • برای یک جستجو شاید هزینه زیادی باشد.
  • برای یک میلیون جستجو، این هزینه تقریباً ناچیز می‌شود.

4. Text Preprocessing (پیش‌پردازش متن)

تعریف ساده

پردازش Text قبل از شروع جستجو برای افزایش سرعت تطبیق‌های آینده.

توضیح دقیق

در نگاه اول، پردازش Text سخت‌تر به نظر می‌رسد، زیرا:

  • Pattern معمولاً کوتاه است.
  • Text ممکن است بسیار بزرگ باشد.

مثلاً:

  • Pattern → یک رشته کوتاه DNA
  • Text → کل ژنوم انسان با میلیاردها باز

اما در بعضی شرایط، Text ثابت است و Patternها مرتب تغییر می‌کنند.

در این حالت، پیش‌پردازش Text می‌تواند بسیار مفید باشد.


5. Online Algorithm (الگوریتم آنلاین)

تعریف ساده

الگوریتمی که Text را قبل از جستجو پیش‌پردازش نمی‌کند.

ویژگی‌ها

  • Text باید هنگام جستجو بررسی شود.
  • نمی‌تواند از اطلاعات آماده‌شده درباره Text استفاده کند.

مثال‌ها

Naive Exact Matching

  • هیچ پیش‌پردازشی ندارد.
  • نه Pattern و نه Text را پردازش نمی‌کند.

بنابراین Online است.


Boyer-Moore

اگرچه پیش‌پردازش دارد، اما فقط Pattern را پردازش می‌کند.

بنابراین:

  • Pattern preprocessing دارد.
  • Text preprocessing ندارد.

پس همچنان یک الگوریتم Online محسوب می‌شود.


6. Offline Algorithm (الگوریتم آفلاین)

تعریف ساده

الگوریتمی که نسخه‌ای پیش‌پردازش‌شده از Text ایجاد می‌کند.

توضیح دقیق

در Offline Algorithm:

  1. ابتدا Text بزرگ پردازش می‌شود.
  2. ساختاری برای جستجوی سریع ایجاد می‌شود.
  3. سپس Patternهای مختلف با سرعت بالا جستجو می‌شوند.

مثال معروف

Search Engine

موتورهای جستجو مانند موتورهای جستجوی وب نمی‌توانند هر بار کل اینترنت را بررسی کنند.

اگر چنین کاری انجام دهند:

  • هر جستجو باید میلیاردها صفحه را بررسی کند.
  • پاسخ‌دهی چندین دقیقه یا ساعت طول می‌کشد.

در عوض:

  1. کل وب قبلاً پردازش شده است.
  2. اطلاعات در یک ساختار نمایه‌شده ذخیره شده است.
  3. هنگام جستجو، نتیجه سریع پیدا می‌شود.

بنابراین موتورهای جستجو Offline هستند.


7. Read Alignment و نیاز به الگوریتم Offline

تعریف مسئله

در Read Alignment هدف این است که مشخص کنیم هر قطعه کوتاه DNA (Read) از کجای ژنوم آمده است.

در این مسئله:

  • Pattern = Read
  • Text = Reference Genome

چرا Offline مناسب‌تر است؟

زیرا:

  • ژنوم مرجع ثابت است.
  • Reads مرتب تغییر می‌کنند.

مثلاً:

هفته اول:

  • یک داده توالی‌یابی انسان داریم.

هفته دوم:

  • داده جدید داریم.

هفته سوم:

  • داده جدید دیگری داریم.

اما:

ژنوم مرجع تقریباً همان باقی می‌ماند.

بنابراین منطقی است که:

  • یک بار ژنوم را پردازش کنیم.
  • سپس هزاران یا میلیون‌ها Read را سریع تطبیق دهیم.

نکات مهم

  • Preprocessing یعنی انجام محاسبات قبل از جستجوی اصلی برای افزایش سرعت.
  • Boyer-Moore از Pattern Preprocessing استفاده می‌کند.
  • داشتن پیش‌پردازش Pattern باعث می‌شود یک Pattern در چند Text مختلف سریع‌تر جستجو شود.
  • پیش‌پردازش Text زمانی مفید است که یک Text ثابت با Patternهای مختلف بررسی شود.
  • تفاوت Online و Offline به این بستگی دارد که آیا Text پیش‌پردازش شده است یا خیر.
  • پردازش Pattern به‌تنهایی باعث Offline شدن الگوریتم نمی‌شود.
  • موتورهای جستجو نمونه‌ای از الگوریتم‌های Offline هستند.
  • مسئله Read Alignment ذاتاً به سمت الگوریتم‌های Offline گرایش دارد، زیرا ژنوم مرجع ثابت و Reads متغیر هستند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Preprocessing پیش‌پردازش آماده‌سازی اطلاعات قبل از اجرای الگوریتم اصلی
Pattern الگو رشته‌ای که قصد پیدا کردن آن را داریم
Text متن رشته‌ای که در آن جستجو انجام می‌شود
Pattern Preprocessing پیش‌پردازش الگو پردازش Pattern برای ساخت جدول‌های کمکی
Text Preprocessing پیش‌پردازش متن پردازش Text برای جستجوی سریع‌تر Patternها
Online Algorithm الگوریتم آنلاین الگوریتمی که Text را پیش‌پردازش نمی‌کند
Offline Algorithm الگوریتم آفلاین الگوریتمی که Text را قبل از جستجو پردازش می‌کند
Lookup Table جدول جستجو ساختار ذخیره‌شده برای دسترسی سریع به اطلاعات
Amortization سرشکن‌سازی هزینه تقسیم هزینه یک عملیات بین استفاده‌های متعدد
Reference Genome ژنوم مرجع توالی استاندارد ژنوم که برای مقایسه استفاده می‌شود
Read Alignment هم‌ترازی خوانش‌ها تعیین محل قرارگیری قطعات DNA روی ژنوم

مثال‌ها و تشبیه‌ها

مثال موتور جستجوی اینترنت

فرض کنید هر بار که عبارتی را جستجو می‌کنید، موتور جستجو مجبور باشد تمام صفحات اینترنت را دوباره بخواند.

نتیجه:

  • سرعت بسیار پایین خواهد بود.

اما موتورهای جستجو قبلاً اینترنت را بررسی کرده‌اند و یک نمایه (Index) ساخته‌اند.

بنابراین پاسخ تقریباً فوری ارائه می‌شود.

این همان ایده اصلی الگوریتم‌های Offline است.


مثال Read Alignment

ژنوم انسان مانند یک کتاب بسیار بزرگ است.

  • ژنوم = Text
  • قطعه DNA خوانده‌شده = Pattern

اگر هر بار بخواهیم کل کتاب را از ابتدا بگردیم، بسیار کند خواهد بود.

بهتر است:

  • یک بار کتاب را نمایه کنیم.
  • سپس میلیون‌ها قطعه کوتاه را سریع پیدا کنیم.

خلاصه نهایی مرور سریع

  • پیش‌پردازش یعنی آماده‌سازی اطلاعات قبل از جستجو برای افزایش سرعت.
  • Boyer-Moore با پیش‌پردازش Pattern جدول‌های کمکی می‌سازد.
  • هزینه پیش‌پردازش می‌تواند بین چندین جستجو تقسیم شود (Amortization).
  • Online Algorithm متن را پیش‌پردازش نمی‌کند.
  • Offline Algorithm نسخه پردازش‌شده‌ای از Text ایجاد می‌کند.
  • Naive Matching یک الگوریتم Online است.
  • Boyer-Moore نیز Online است چون فقط Pattern را پردازش می‌کند.
  • موتورهای جستجو نمونه‌ای از الگوریتم‌های Offline هستند.
  • در Read Alignment، ژنوم مرجع ثابت است ولی Reads تغییر می‌کنند.
  • بنابراین برای هم‌ترازی ژنومی، الگوریتم‌های Offline انتخاب مناسب‌تری هستند.

سوالات مرور

1. پیش‌پردازش چیست و چه فایده‌ای دارد؟

پاسخ:

پیش‌پردازش انجام محاسبات قبل از جستجوی اصلی است که باعث می‌شود عملیات‌های بعدی سریع‌تر انجام شوند.


2. چرا Boyer-Moore یک الگوریتم Online محسوب می‌شود؟

پاسخ:

زیرا فقط Pattern را پیش‌پردازش می‌کند و Text را قبل از جستجو پردازش نمی‌کند.


3. تفاوت اصلی Online و Offline چیست؟

پاسخ:

تفاوت اصلی در این است که آیا Text پیش‌پردازش می‌شود یا خیر.


4. چرا موتورهای جستجو باید Offline باشند؟

پاسخ:

زیرا Text آن‌ها (کل اینترنت) بسیار بزرگ است و جستجوی مستقیم در هر بار امکان‌پذیر نیست؛ بنابراین باید قبلاً پردازش و نمایه‌سازی شود.


5. چرا Read Alignment به الگوریتم Offline نیاز دارد؟

پاسخ:

زیرا ژنوم مرجع ثابت است ولی تعداد زیادی Read مختلف باید روی آن تطبیق داده شوند. بنابراین پیش‌پردازش ژنوم باعث افزایش شدید سرعت می‌شود.


02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/07_lecture-indexing-and-the-k-mer-index

Indexing و K-mer Index برای حل مسئله تطبیق توالی

Indexing and the K-mer Index


خلاصه کلی

در این درس مفهوم Indexing (نمایه‌سازی) به‌عنوان یک روش قدرتمند برای افزایش سرعت جستجوی الگوها در توالی‌های بزرگ DNA معرفی می‌شود.

در مسئله Read Alignment (هم‌ترازی خوانش‌ها)، هدف پیدا کردن محل قرارگیری میلیون‌ها قطعه کوتاه DNA (Reads) در یک ژنوم مرجع بسیار بزرگ است. از آنجا که ژنوم مرجع ثابت است ولی Readها در هر آزمایش تغییر می‌کنند، استفاده از روش‌های Offline Algorithm که ژنوم را از قبل پردازش می‌کنند، بسیار مناسب‌تر است.

در این درس یاد می‌گیریم چگونه با ساخت یک K-mer Index از ژنوم، فرآیند جستجوی Readها را سریع‌تر کنیم.

اهداف یادگیری:

  • درک مفهوم Offline Algorithm و دلیل استفاده از آن در Read Alignment
  • آشنایی با مفهوم Indexing
  • ساخت یک K-mer Index برای DNA
  • استفاده از Index برای پیدا کردن محل احتمالی یک Pattern
  • تفاوت بین Index Hit و Match واقعی

مفاهیم کلیدی

1. Offline Algorithm (الگوریتم آفلاین)

تعریف ساده

الگوریتمی که قبل از انجام جستجو، متن اصلی (Text) را پردازش و آماده می‌کند.

توضیح دقیق

در مسائل تطبیق رشته، دو جزء اصلی داریم:

  • Pattern (P): رشته‌ای که دنبال آن می‌گردیم
  • Text (T): رشته بزرگی که جستجو روی آن انجام می‌شود

در الگوریتم‌های Offline، ابتدا Text پردازش می‌شود و یک ساختار کمکی ساخته می‌شود تا جستجوهای آینده سریع‌تر شوند.

در Read Alignment:

  • Pattern = خوانش‌های DNA (Reads)
  • Text = ژنوم مرجع

از آنجا که ژنوم مرجع تغییر زیادی نمی‌کند ولی تعداد زیادی Read مختلف بررسی می‌شوند، منطقی است که ژنوم را یک بار پردازش کنیم و بارها از آن استفاده کنیم.

اهمیت

بدون Index، برای هر Read باید کل ژنوم بررسی شود که بسیار زمان‌بر است.

با Index:

  • ژنوم یک بار آماده می‌شود.
  • هر Read سریع‌تر مکان احتمالی خود را پیدا می‌کند.

2. Indexing (نمایه‌سازی)

تعریف ساده

ساخت یک ساختار داده که امکان پیدا کردن سریع محل وقوع یک عبارت یا الگو را فراهم می‌کند.

توضیح دقیق

ایده Indexing شبیه نمایه انتهای کتاب است.

در کتاب:

کلمه کلیدی صفحات
Memory 10، 50، 120

اگر دنبال کلمه Memory باشیم، لازم نیست کل کتاب را بخوانیم؛ فقط صفحات مشخص‌شده را بررسی می‌کنیم.

در ژنوم نیز همین ایده استفاده می‌شود، اما چون ژنوم شامل کلمات نیست، باید خودمان آن را به قطعات کوچک تقسیم کنیم.


3. K-mer (قطعه‌ای با طول k)

تعریف ساده

یک زیررشته (Substring) از DNA با طول مشخص k.

مثال:

اگر:

DNA = ACTGAC

و:

k = 3

آنگاه K-merها:

ACT
CTG
TGA
GAC

هستند.

توضیح دقیق

در ساخت Index ژنوم:

  • تمام زیررشته‌های طول k استخراج می‌شوند.
  • برای هر K-mer، محل‌های وقوع آن ذخیره می‌شود.

مثلاً برای:

k = 5

تمام 5-merهای ژنوم ذخیره می‌شوند.

اهمیت

K-merها واحدهای کوچک قابل جستجو هستند که باعث می‌شوند به جای جستجوی کل Read، ابتدا بخش کوچکی از آن بررسی شود.


4. K-mer Index (نمایه K-mer)

تعریف ساده

ساختاری که هر K-mer را به تمام موقعیت‌هایی که در ژنوم دیده شده است، مرتبط می‌کند.

مثال

فرض کنیم ژنوم:

ACTGACCTGA

باشد.

اگر k=5 باشد:

K-merها:

K-mer موقعیت
ACTGA 0
CTGAC 1
TGACC 2
GACCT 3
ACCTG 4
CCTGA 5

اگر یک K-mer چند بار تکرار شود، همه موقعیت‌ها ذخیره می‌شوند.

مثلاً:

K-mer موقعیت‌ها
ACTGA 0, 25, 100

5. Querying the Index (جستجو در Index)

تعریف ساده

فرآیند پرسیدن از Index که یک K-mer در چه مکان‌هایی دیده شده است.

روند کار:

فرض کنیم Pattern داریم:

P = یک Read DNA

مراحل:

  1. یک K-mer از Pattern انتخاب می‌کنیم.
  2. آن را در Index جستجو می‌کنیم.
  3. Index محل‌های احتمالی را برمی‌گرداند.
  4. در آن محل‌ها بررسی دقیق انجام می‌دهیم.

6. Verification (تأیید تطبیق)

تعریف ساده

بررسی کامل Pattern در محل‌هایی که Index پیشنهاد داده است.

توضیح دقیق

Index فقط یک سرنخ می‌دهد.

مثلاً:

Index می‌گوید:

5-mer موردنظر در موقعیت 100 وجود دارد.

اما هنوز مشخص نیست کل Read در آنجا قرار دارد یا نه.

بنابراین باید:

  • تمام کاراکترهای باقی‌مانده مقایسه شوند.
  • تطبیق کامل بررسی شود.

این مرحله Verification نام دارد.


7. Index Hit (برخورد با Index)

تعریف ساده

هر موقعیتی که Index به عنوان محل احتمالی وجود K-mer گزارش می‌کند.

نکته مهم

Index Hit الزاماً Match نیست.

یعنی:

Index Hit ≠ Match

ممکن است:

  • K-mer وجود داشته باشد.
  • اما کل Pattern وجود نداشته باشد.

بنابراین هر Index Hit نیاز به Verification دارد.


نکات مهم

  • الگوریتم‌های Offline زمانی مفید هستند که Text ثابت و Patternهای زیادی وجود داشته باشند.

  • در Read Alignment:

    • ژنوم مرجع = Text ثابت
    • Reads = Patternهای متغیر
  • ساخت Index هزینه اولیه دارد، اما این هزینه بین تعداد زیادی جستجو تقسیم می‌شود.

  • K-merها مانند "کلمات مصنوعی" در DNA عمل می‌کنند.

  • هرچه K بزرگ‌تر باشد:

    • تعداد برخوردها کمتر می‌شود.
    • اما احتمال از دست دادن تطبیق‌های تقریبی بیشتر می‌شود.
  • Index فقط محل‌های احتمالی را پیدا می‌کند؛ تصمیم نهایی با Verification انجام می‌شود.

  • وجود یک K-mer در Pattern که در Genome وجود ندارد، می‌تواند سریعاً عدم وجود کل Pattern را ثابت کند.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Offline Algorithm الگوریتم آفلاین الگوریتمی که متن را قبل از جستجو پردازش می‌کند
Online Algorithm الگوریتم آنلاین الگوریتمی که بدون پردازش قبلی Text کار می‌کند
Indexing نمایه‌سازی ایجاد ساختار داده برای جستجوی سریع
Index نمایه ساختاری برای نگهداری ارتباط بین کلیدها و موقعیت‌ها
Pattern (P) الگو رشته‌ای که به دنبال آن هستیم
Text (T) متن رشته بزرگی که جستجو روی آن انجام می‌شود
K-mer قطعه DNA با طول k زیررشته‌ای از DNA با اندازه k
5-mer قطعه پنج‌نوکلئوتیدی K-mer با k=5
K-mer Index نمایه K-mer Index ساخته‌شده بر اساس قطعات DNA
Query پرس‌وجو درخواست یافتن محل یک رشته در Index
Verification تأیید بررسی کامل تطبیق پس از پیدا شدن محل احتمالی
Index Hit برخورد Index موقعیتی که Index پیشنهاد می‌دهد
Match تطبیق واقعی وجود کامل Pattern در Text

مثال‌ها و تشبیه‌ها

1. نمایه کتاب

کتاب را مانند ژنوم در نظر بگیرید.

بدون Index:

  • باید تمام صفحات را بخوانیم تا یک کلمه پیدا کنیم.

با Index:

  • کلمه را پیدا می‌کنیم.
  • مستقیم به صفحات مربوط می‌رویم.

در ژنوم:

  • K-mer مانند کلمه کتاب است.
  • موقعیت‌های K-mer مانند شماره صفحات هستند.

2. فروشگاه مواد غذایی

در فروشگاه لازم نیست برای پیدا کردن شیر همه قفسه‌ها را بررسی کنیم.

چرا؟

چون محصولات دسته‌بندی شده‌اند:

  • لبنیات
  • نوشیدنی‌ها
  • شوینده‌ها

Index نیز همین کار را برای داده‌ها انجام می‌دهد: سازمان‌دهی برای دسترسی سریع.


خلاصه نهایی مرور سریع

  • Read Alignment یک مسئله مناسب برای الگوریتم‌های Offline است زیرا ژنوم مرجع ثابت ولی Reads متغیر هستند.
  • Offline Algorithm ابتدا Text را پردازش می‌کند تا جستجوهای بعدی سریع‌تر شوند.
  • Indexing روشی برای سازمان‌دهی داده‌ها جهت جستجوی سریع است.
  • در DNA، به جای کلمات از K-merها استفاده می‌کنیم.
  • K-mer یک زیررشته DNA با طول k است.
  • K-mer Index هر K-mer را به موقعیت‌های آن در ژنوم مرتبط می‌کند.
  • برای جستجو ابتدا یک K-mer از Read انتخاب و در Index جستجو می‌شود.
  • نتیجه Index فقط یک Index Hit است و هنوز Match قطعی نیست.
  • Verification برای بررسی تطبیق کامل انجام می‌شود.
  • اگر یک K-mer از Pattern اصلاً در Index نباشد، کل Pattern نمی‌تواند در Genome وجود داشته باشد.
  • Index باعث می‌شود به جای بررسی کل ژنوم، فقط مناطق احتمالی بررسی شوند.

سوالات مرور

1. چرا Read Alignment بیشتر به الگوریتم Offline نیاز دارد؟

پاسخ: زیرا ژنوم مرجع ثابت است و بارها با Reads مختلف مقایسه می‌شود. بنابراین می‌توان ژنوم را یک بار پردازش و برای جستجوهای آینده استفاده کرد.


2. K-mer چیست؟

پاسخ: K-mer یک زیررشته از DNA با طول k است. برای مثال، یک 5-mer قطعه‌ای از DNA با پنج نوکلئوتید است.


3. تفاوت Index Hit و Match چیست؟

پاسخ: Index Hit فقط نشان می‌دهد که یک K-mer در یک موقعیت دیده شده است، اما Match یعنی کل Pattern در آن موقعیت به طور کامل تطبیق دارد.


4. چرا بعد از پیدا کردن Index Hit هنوز Verification لازم است؟

پاسخ: زیرا ممکن است K-mer موردنظر وجود داشته باشد اما سایر بخش‌های Pattern با Text تطبیق نداشته باشند.


5. اگر اولین K-mer یک Read در Index وجود نداشته باشد چه نتیجه‌ای می‌گیریم؟

پاسخ: می‌توانیم نتیجه بگیریم که کل Read نمی‌تواند در Genome وجود داشته باشد، زیرا هر تطبیق کامل باید شامل آن K-mer باشد.


6. چرا Indexing باعث افزایش سرعت جستجو می‌شود؟

پاسخ: زیرا به جای بررسی کل ژنوم، ابتدا فقط موقعیت‌های احتمالی با استفاده از Index پیدا می‌شوند و سپس فقط همان نقاط بررسی دقیق می‌شوند.


02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/08_lecture-ordered-structures-for-indexing

ساختارهای مرتب برای Indexing در ژنوم

Ordered Structures for Indexing


خلاصه کلی

در درس قبل با مفهوم K-mer Index آشنا شدیم؛ ساختاری که تمام K-merهای موجود در یک ژنوم را ذخیره می‌کند و برای هر K-mer، تمام موقعیت‌هایی که در ژنوم ظاهر شده‌اند را نگه می‌دارد.

در این درس بررسی می‌کنیم که چگونه می‌توان این Index را به‌صورت کارآمد پیاده‌سازی کرد.

از آنجا که یک K-mer ممکن است در چندین نقطه از ژنوم تکرار شده باشد، ساختار داده موردنیاز باید بتواند یک کلید را به چند مقدار مرتبط کند. این نوع ساختار Multimap نام دارد.

دو روش اصلی برای پیاده‌سازی Index بررسی می‌شود:

  1. Ordering (مرتب‌سازی)

    • مشابه Index کتاب
    • استفاده از ترتیب الفبایی و جستجوی دودویی (Binary Search)
  2. Grouping (گروه‌بندی)

    • مشابه دسته‌بندی محصولات در فروشگاه

در این درس تمرکز اصلی روی روش اول یعنی Ordered Index است.


مفاهیم کلیدی


1. Multimap (نگاشت چندگانه)

تعریف ساده

ساختار داده‌ای که اجازه می‌دهد یک کلید به چندین مقدار مرتبط شود.

توضیح دقیق

در یک Map معمولی:

Key → Value

هر کلید معمولاً یک مقدار دارد.

اما در K-mer Index:

K-mer → چندین Offset

زیرا یک K-mer ممکن است بارها در ژنوم تکرار شده باشد.

مثال:

K-mer موقعیت‌ها
ATG 5, 100, 250

در اینجا:

  • کلید = ATG
  • مقادیر = موقعیت‌های وقوع آن در ژنوم

بنابراین K-mer Index یک Multimap است.

اهمیت

بدون Multimap نمی‌توانیم تکرارهای طبیعی موجود در ژنوم را ذخیره کنیم.


2. Ordered Index (نمایه مرتب‌شده)

تعریف ساده

نمایه‌ای که عناصر آن بر اساس ترتیب مشخصی مرتب شده‌اند.

توضیح دقیق

در این روش:

  1. تمام K-merهای ژنوم استخراج می‌شوند.
  2. برای هر K-mer یک جفت کلید-مقدار ساخته می‌شود:
(K-mer, Offset)
  1. تمام این جفت‌ها بر اساس K-mer مرتب می‌شوند.

مثال:

فرض کنید K-merها:

K-mer Offset
TGA 2
ACT 0
GGC 5
ACT 10

بعد از مرتب‌سازی:

K-mer Offset
ACT 0
ACT 10
GGC 5
TGA 2

اکنون می‌توان سریع‌تر جستجو کرد.


3. Binary Search (جستجوی دودویی)

تعریف ساده

الگوریتمی برای جستجو در یک لیست مرتب که در هر مرحله نصف فضای جستجو را حذف می‌کند.

توضیح دقیق

در جستجوی خطی:

  • از ابتدا شروع می‌کنیم.
  • عنصر به عنصر بررسی می‌کنیم.

اما در Binary Search:

  1. عنصر وسط لیست بررسی می‌شود.

  2. اگر مقدار موردنظر:

    • بزرگ‌تر باشد → نیمه اول حذف می‌شود.
    • کوچک‌تر باشد → نیمه دوم حذف می‌شود.
  3. این فرآیند ادامه پیدا می‌کند.


مثال کتاب

فرض کنید دنبال کلمه:

memory

در Index کتاب هستیم.

ابتدا وسط Index را نگاه می‌کنیم.

اگر کلمه وسط:

light

باشد:

چون:

light < memory

می‌دانیم memory در نیمه اول نیست.

پس نیمه اول را حذف می‌کنیم و فقط نیمه دوم را بررسی می‌کنیم.


4. Bisection (تقسیم دوگانه)

تعریف ساده

هر مرحله از Binary Search که در آن مسئله به دو بخش تقسیم می‌شود.

توضیح

در هر مرحله:

اندازه مسئله → نصف

می‌شود.

اگر Index دارای N کلید باشد، تعداد مراحل لازم تقریباً:

[ log_2(N) ]

است.

دلیل

زیرا در هر مرحله:

N → N/2 → N/4 → N/8 ...

می‌شود.


5. Querying an Ordered Index (جستجو در نمایه مرتب)

روند کلی

فرض کنیم یک Pattern داریم و یک K-mer از آن استخراج می‌کنیم.

مثلاً:

Pattern K-mer = TGG

مراحل:

مرحله 1:

TGG را با عنصر وسط Index مقایسه می‌کنیم.

مثلاً:

Middle = GTG

چون:

TGG > GTG

نیمه اول حذف می‌شود.


مرحله 2:

در نیمه باقی‌مانده:

TGG

را با عنصر وسط جدید مقایسه می‌کنیم.

مثلاً:

TGC

چون:

TGG > TGC

دوباره نیمه اول حذف می‌شود.


مرحله 3:

به K-mer موردنظر می‌رسیم.

این موقعیت یک:

Index Hit

محسوب می‌شود.


6. Index Hit (برخورد با Index)

تعریف ساده

موقعیتی که Index گزارش می‌کند که K-mer موردنظر در آن وجود دارد.

توضیح

Index فقط می‌گوید:

«این K-mer در این مکان دیده شده است.»

اما هنوز نمی‌دانیم کل Read تطبیق دارد یا نه.

بنابراین بعد از Index Hit باید:

  • Verification انجام شود.

7. Python bisect Module

تعریف ساده

یک ماژول پایتون برای انجام عملیات مرتبط با Binary Search روی لیست‌های مرتب.

توضیح دقیق

ماژول:

bisect

شامل توابعی برای پیدا کردن محل مناسب درج یک عنصر در لیست مرتب است.

مهم‌ترین تابع:

bisect_left()

8. bisect_left()

تعریف ساده

محل اولین جایی را پیدا می‌کند که یک مقدار جدید می‌تواند در لیست مرتب قرار گیرد بدون اینکه ترتیب خراب شود.

ورودی‌ها:

bisect_left(a, x)

که:

  • a = لیست مرتب
  • x = مقدار موردنظر

خروجی:

  • اندیس محل درج x

مثال

لیست:

[1,3,6,8]

جستجوی 2:

bisect_left(a,2)

خروجی:

1

زیرا 2 باید بین 1 و 3 قرار گیرد.


جستجوی 4:

خروجی:

2

زیرا باید بین 3 و 6 قرار گیرد.


جستجوی 8:

خروجی:

3

زیرا اولین محل ممکن قبل از اولین 8 است.


استفاده از bisect_left در K-mer Index

فرض کنید Index مرتب شده داریم:

K-mer Offset
GTG 0
GTG 4
GTG 6
TGA 10

اگر بخواهیم تمام GTGها را پیدا کنیم:

  1. از:
bisect_left(index, GTG)

استفاده می‌کنیم.

  1. به اولین GTG می‌رسیم.

  2. از آنجا به جلو حرکت می‌کنیم تا دیگر GTG نبینیم.

نتیجه:

GTG → offsets 0,4,6

نکات مهم

  • K-mer Index یک Multimap است، زیرا هر K-mer ممکن است چندین موقعیت داشته باشد.
  • در Ordered Index، داده‌ها بر اساس K-mer مرتب می‌شوند.
  • مرتب‌سازی اجازه استفاده از Binary Search را می‌دهد.
  • Binary Search در هر مرحله نصف فضای جستجو را حذف می‌کند.
  • پیچیدگی جستجو در Index مرتب:

[ O(log_2 N) ]

است.

  • Python تابع bisect_left() را برای پیدا کردن اولین محل یک مقدار در لیست مرتب فراهم می‌کند.
  • بعد از پیدا کردن اولین K-mer، باید تمام نمونه‌های مشابه بعدی بررسی شوند.
  • Index Hit فقط محل احتمالی است و الزاماً Match کامل نیست.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Multimap نگاشت چندگانه ساختاری که یک کلید را به چند مقدار مرتبط می‌کند
Map نگاشت ارتباط بین کلید و مقدار
Key کلید مقدار جستجو، مانند K-mer
Value مقدار داده مرتبط با کلید، مانند Offset
Offset موقعیت محل شروع یک رشته در ژنوم
Ordered Index نمایه مرتب Index مرتب‌شده بر اساس کلید
Binary Search جستجوی دودویی جستجوی سریع در داده مرتب
Bisection تقسیم دوگانه تقسیم مسئله به دو بخش در Binary Search
Query پرس‌وجو درخواست یافتن یک K-mer
Index Hit برخورد Index موقعیت احتمالی یافت‌شده توسط Index
bisect_left تابع جستجوی چپ پیدا کردن اولین محل درج یک مقدار در لیست مرتب

مثال‌ها و تشبیه‌ها

1. Index کتاب

کتاب:

Memory → صفحات 10،50،120

مانند:

ژنوم:

ATG → موقعیت‌های 5،100،250

است.


2. فروشگاه مواد غذایی

در فروشگاه:

  • محصولات بر اساس گروه‌بندی پیدا می‌شوند.

در Ordered Index:

  • داده‌ها بر اساس ترتیب مرتب می‌شوند.

هر دو روش باعث می‌شوند پیدا کردن اطلاعات سریع‌تر شود.


خلاصه نهایی مرور سریع

  • K-mer Index یک Multimap است که K-merها را به Offsetهایشان متصل می‌کند.
  • برای ساخت Ordered Index، تمام K-merها استخراج و مرتب می‌شوند.
  • Binary Search برای جستجوی سریع در Index مرتب استفاده می‌شود.
  • هر مرحله Binary Search یک Bisection نام دارد.
  • تعداد مراحل جستجو تقریباً برابر با log₂ تعداد کلیدها است.
  • Index مرتب مشابه نمایه کتاب عمل می‌کند.
  • bisect_left() در پایتون اولین محل ممکن برای یک مقدار در لیست مرتب را پیدا می‌کند.
  • برای یافتن همه رخدادهای یک K-mer، ابتدا با bisect_left اولین مورد پیدا می‌شود و سپس موارد بعدی بررسی می‌شوند.
  • Index Hit فقط یک سرنخ است و نیاز به بررسی نهایی دارد.

سوالات مرور

1. چرا K-mer Index به Multimap نیاز دارد؟

پاسخ: زیرا یک K-mer ممکن است چندین بار در ژنوم تکرار شود و باید چندین Offset برای یک K-mer ذخیره شود.


2. Binary Search چگونه سرعت جستجو را افزایش می‌دهد؟

پاسخ: با حذف نصف فضای جستجو در هر مرحله، تعداد مقایسه‌ها را به حدود log₂(N) کاهش می‌دهد.


3. Ordered Index چگونه ساخته می‌شود؟

پاسخ: تمام K-merهای ژنوم استخراج می‌شوند، همراه با Offset ذخیره می‌شوند و سپس بر اساس K-mer مرتب می‌شوند.


4. تابع bisect_left چه کاری انجام می‌دهد؟

پاسخ: اولین موقعیتی را پیدا می‌کند که یک مقدار می‌تواند در یک لیست مرتب وارد شود بدون اینکه ترتیب لیست تغییر کند.


5. چرا پیدا کردن Index Hit به معنی Match کامل نیست؟

پاسخ: زیرا ممکن است فقط K-mer تطبیق داشته باشد اما بخش‌های دیگر Pattern با ژنوم هماهنگ نباشند؛ بنابراین Verification لازم است.


02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/09_lecture-hash-tables-for-indexing

جدول‌های درهم‌سازی برای ایندکس‌گذاری (Hash Tables for Indexing)

خلاصه کلی

در این درس، روش دیگری برای پیاده‌سازی ساختار داده‌ای چندنگاشتی (Multimap) برای ایندکس‌گذاری k-merها معرفی می‌شود: استفاده از Hash Table.

در درس‌های قبل، ایندکس k-mer با استفاده از یک لیست مرتب و جستجوی دودویی پیاده‌سازی شد. در این بخش، روش مبتنی بر تابع هش (Hash Function) معرفی می‌شود که معمولاً در عمل سریع‌تر و رایج‌تر است.

هدف اصلی این درس:

  • درک نحوه استفاده از Hash Table برای ساخت k-mer index
  • آشنایی با مفهوم Bucket، Hash Function و Collision
  • درک نحوه جستجوی k-merها در یک Hash Table
  • ارتباط دادن این مفاهیم با پیاده‌سازی آن‌ها در Python Dictionary

مفاهیم کلیدی

1. Hash Table (جدول درهم‌سازی)

تعریف ساده

Hash Table یک ساختار داده است که برای ذخیره و بازیابی سریع اطلاعات استفاده می‌شود. این ساختار داده، کلیدها (Keys) را به مقادیر (Values) مرتبط می‌کند.

در مسئله ایندکس‌گذاری ژنوم:

  • کلید (Key) → یک k-mer مانند GGG یا TGC
  • مقدار (Value) → لیست موقعیت‌هایی (Offsets) که آن k-mer در ژنوم ظاهر شده است.

توضیح دقیق

یک Hash Table شامل:

  1. آرایه‌ای از Bucketها
  2. یک تابع هش (Hash Function)

است.

تابع هش، هر کلید را دریافت کرده و مشخص می‌کند که این کلید باید در کدام Bucket قرار بگیرد.

به صورت مفهومی:

k-mer → Hash Function → Bucket

برای مثال:

GGG → Hash Function → Bucket 5
TGC → Hash Function → Bucket 2

در هر Bucket، اطلاعات مربوط به کلیدهای قرار گرفته در آن ذخیره می‌شود.


اهمیت و کاربرد

Hash Table به دلیل سرعت بالا، یکی از رایج‌ترین ساختارهای داده برای:

  • جستجو
  • ذخیره‌سازی نگاشت‌ها (Mappings)
  • ساخت Indexها
  • تحلیل داده‌های ژنومی

است.

در پروژه‌های Bioinformatics، برای جستجوی سریع k-merها در ژنوم‌های بزرگ بسیار کاربرد دارد.


2. Multimap (چندنگاشتی)

تعریف ساده

Multimap ساختاری است که اجازه می‌دهد یک کلید، چند مقدار داشته باشد.


توضیح دقیق

در یک ژنوم، یک k-mer ممکن است چندین بار تکرار شده باشد.

مثلاً:

GGG → [8, 9, 10]

یعنی k-mer برابر با GGG در موقعیت‌های 8، 9 و 10 دیده شده است.

بنابراین:

  • یک k-mer
  • چندین offset

دارد.

به همین دلیل برای ساخت k-mer index به یک Multimap نیاز داریم.


اهمیت

در مسئله Read Alignment:

وقتی یک read داریم، باید بدانیم بخش‌هایی از آن در چه نقاطی از ژنوم دیده شده‌اند.

Multimap این امکان را فراهم می‌کند.


3. Hash Function (تابع هش)

تعریف ساده

تابع هش، تابعی است که یک کلید را گرفته و آن را به یک Bucket مشخص نگاشت می‌کند.


توضیح دقیق

برای مثال:

Input:
GGG

Hash Function:

GGG → Bucket 3

تابع هش تعیین می‌کند داده در کجا ذخیره شود.

مزیت اصلی:

هنگام جستجو، لازم نیست کل جدول را بررسی کنیم؛ فقط Bucket مربوط به آن کلید را بررسی می‌کنیم.


تشبیه

در مثال فروشگاه:

  • Bucketها = راهروهای فروشگاه
  • Hash Function = قانون تعیین اینکه هر کالا در کدام راهرو قرار گیرد

اگر دنبال شیر باشید:

لازم نیست کل فروشگاه را بگردید؛ فقط به راهروی لبنیات می‌روید.


4. Bucket (سطل ذخیره‌سازی)

تعریف ساده

Bucket محلی در Hash Table است که داده‌های مرتبط در آن ذخیره می‌شوند.


توضیح دقیق

هر Bucket معمولاً شامل یک لیست از زوج‌های:

(Key, Value)

است.

مثلاً:

Bucket 2:

(TGC, 4)
(GGG, 8)
(GGG, 9)

5. Collision (برخورد هش)

تعریف ساده

Collision زمانی رخ می‌دهد که دو کلید متفاوت توسط Hash Function به یک Bucket یکسان نگاشت شوند.


توضیح دقیق

فرض کنید:

AAA → Bucket 3

TGC → Bucket 3

این دو k-mer متفاوت هستند، اما در یک Bucket قرار گرفته‌اند.

این اتفاق طبیعی است، زیرا:

  • تعداد k-merهای ممکن بسیار زیاد است.
  • تعداد Bucketها محدود است.

اثر Collision

Collision باعث خراب شدن Hash Table نمی‌شود، اما:

  • جستجو کمی کندتر می‌شود.
  • باید داخل لیست همان Bucket، کلید موردنظر را پیدا کنیم.

6. Query کردن Hash Index

تعریف ساده

Query یعنی پرسیدن از Index که یک k-mer در چه موقعیت‌هایی در ژنوم وجود دارد.


مراحل Query:

فرض کنید می‌خواهیم k-mer زیر را پیدا کنیم:

GGG

مراحل:

  1. k-mer را به Hash Function می‌دهیم.

  2. Hash Function Bucket مربوطه را پیدا می‌کند.

  3. فقط همان Bucket بررسی می‌شود.

  4. کلیدهای داخل Bucket مقایسه می‌شوند.

  5. Offsetهای مربوط به k-mer موردنظر برگردانده می‌شوند.


مثال:

Query:

GGG


Hash Function:

GGG → Bucket 4


Bucket 4:

CGT → 3
GGG → 8
GGG → 9
GGG → 10

نتیجه:

GGG occurs at:
8, 9, 10

7. Python Dictionary و Hash Table

تعریف ساده

در Python، ساختار dictionary در واقع یک پیاده‌سازی از Hash Table است.


مثال:

index = {
    "GGG": [8, 9, 10],
    "CGT": [3]
}

اینجا:

  • Key = k-mer
  • Value = لیست offsetها

برای جستجو:

index["GGG"]

خروجی:

[8, 9, 10]

Python تمام جزئیات داخلی مانند:

  • Hash Function
  • تعداد Bucketها
  • مدیریت Collision

را خودش مدیریت می‌کند.


نکات مهم

  • Hash Table یکی از روش‌های اصلی برای پیاده‌سازی k-mer index است.
  • برخلاف روش مرتب‌سازی و Binary Search، در Hash Table نیاز به جستجوی دودویی نداریم.
  • هر k-mer به وسیله Hash Function به یک Bucket خاص هدایت می‌شود.
  • یک k-mer می‌تواند چندین موقعیت در ژنوم داشته باشد؛ بنابراین Index باید Multimap باشد.
  • Collision زمانی رخ می‌دهد که چند k-mer مختلف در یک Bucket قرار گیرند.
  • Collision طبیعی است و فقط باعث افزایش زمان جستجو می‌شود.
  • در Python، Dictionary همان ایده Hash Table را پیاده‌سازی می‌کند.
  • هنگام Query، فقط Bucket مربوط به k-mer بررسی می‌شود، نه کل ژنوم.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Hash Table جدول درهم‌سازی ساختار داده برای نگاشت سریع کلید به مقدار
Hash Function تابع هش تابعی که کلید را به یک Bucket تبدیل می‌کند
Bucket سطل ذخیره‌سازی محل نگهداری داده‌هایی که به یک موقعیت هش نگاشت شده‌اند
Multimap چندنگاشتی ساختاری که یک کلید را به چند مقدار مرتبط می‌کند
Key کلید شناسه اصلی داده، مانند یک k-mer
Value مقدار اطلاعات مرتبط با کلید، مانند offset
Offset موقعیت محل شروع یک k-mer در رشته DNA
Collision برخورد قرار گرفتن چند کلید متفاوت در یک Bucket
Index ایندکس ساختاری برای یافتن سریع موقعیت داده‌ها
Query پرس‌وجو درخواست برای یافتن اطلاعات از Index
k-mer زیررشته با طول k قطعه‌ای از DNA با طول مشخص

مثال‌ها و تشبیه‌ها

تشبیه فروشگاه

برای درک Hash Table:

  • فروشگاه = کل ژنوم
  • راهروها = Bucketها
  • دسته‌بندی کالاها = Hash Function

وقتی دنبال یک کالا هستید، ابتدا به راهروی درست می‌روید و سپس داخل آن جستجو می‌کنید.

مشابه همین:

k-mer → Bucket → Offsetها

خلاصه نهایی مرور سریع

  • Hash Table ساختاری برای ذخیره و بازیابی سریع داده‌ها است.
  • در k-mer indexing، هر k-mer یک Key و موقعیت‌های آن Value هستند.
  • چون یک k-mer می‌تواند چندین بار در ژنوم دیده شود، از Multimap استفاده می‌کنیم.
  • Hash Function تعیین می‌کند هر k-mer در کدام Bucket ذخیره شود.
  • هنگام Query فقط Bucket مربوط به k-mer بررسی می‌شود.
  • Collision زمانی رخ می‌دهد که چند k-mer مختلف در یک Bucket قرار بگیرند.
  • Collision مشکل اساسی نیست، اما سرعت جستجو را کاهش می‌دهد.
  • Python Dictionary نمونه‌ای از Hash Table است.
  • Hash Table یکی از روش‌های رایج برای ساخت Indexهای ژنومی است.
  • هدف Index این است که به جای جستجوی کل ژنوم، سریعاً ناحیه‌های احتمالی تطابق را پیدا کنیم.

سوالات مرور

1. چرا برای k-mer indexing به Multimap نیاز داریم؟

پاسخ:

زیرا یک k-mer ممکن است چندین بار در ژنوم تکرار شده باشد و باید بتوانیم چندین offset را برای یک k-mer ذخیره کنیم.


2. Hash Function چه کاری انجام می‌دهد؟

پاسخ:

یک k-mer را دریافت کرده و مشخص می‌کند که این k-mer در کدام Bucket از Hash Table ذخیره یا جستجو شود.


3. Collision چیست؟

پاسخ:

وقتی دو k-mer متفاوت توسط Hash Function به یک Bucket یکسان نگاشت شوند، Collision رخ می‌دهد.


4. چرا Hash Table برای جستجوی k-mer سریع است؟

پاسخ:

زیرا به جای بررسی تمام k-merهای موجود، مستقیماً به Bucket مربوطه مراجعه می‌کند و فقط همان بخش را بررسی می‌کند.


5. رابطه Python Dictionary با Hash Table چیست؟

پاسخ:

Dictionary در Python یک پیاده‌سازی داخلی از Hash Table است که امکان ذخیره و بازیابی سریع Key-Valueها را فراهم می‌کند.


02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/10_practical-implementing-a-k-mer-index

پیاده‌سازی ایندکس k-mer در Python (Implementing a k-mer Index)

خلاصه کلی

در این درس، یک Substring Index یا k-mer Index برای یک رشته DNA پیاده‌سازی می‌کنیم. هدف این ایندکس این است که بتوانیم یک الگوی DNA (Pattern) را سریع‌تر در یک متن بزرگ‌تر (Text) جستجو کنیم.

ایده اصلی:

  • ابتدا متن DNA را پیش‌پردازش (Preprocessing) می‌کنیم.
  • تمام k-merهای موجود در متن را استخراج کرده و همراه با موقعیتشان ذخیره می‌کنیم.
  • سپس هنگام جستجوی یک Pattern، فقط نواحی احتمالی را بررسی می‌کنیم.
  • در پایان با مرحله Verification بررسی می‌کنیم که آیا تطابق کامل وجود دارد یا خیر.

این روش در مسائل بزرگ مانند Read Alignment در ژنومیک کاربرد زیادی دارد.


مفاهیم کلیدی

1. Substring Index (ایندکس زیررشته)

تعریف ساده

ساختاری داده‌ای است که برای هر زیررشته مشخص از متن، محل‌هایی را که آن زیررشته در متن ظاهر شده است ذخیره می‌کند.


توضیح دقیق

فرض کنید متن DNA برابر باشد با:

T = ACGTACGT

و طول k برابر 3 باشد.

k-merهای متن:

ACG → offset 0
CGT → offset 1
GTA → offset 2
TAC → offset 3
ACG → offset 4
CGT → offset 5

ایندکس، این اطلاعات را ذخیره می‌کند:

ACG → [0,4]
CGT → [1,5]
GTA → [2]
TAC → [3]

اهمیت

به جای اینکه هر بار کل متن را جستجو کنیم، ابتدا به کمک Index نقاط احتمالی تطابق را پیدا می‌کنیم.


2. k-mer Index (ایندکس k-mer)

تعریف ساده

ایندکسی است که تمام زیررشته‌های با طول k از متن را ذخیره می‌کند.


توضیح دقیق

برای ساخت k-mer Index:

  1. تمام k-merهای متن استخراج می‌شوند.
  2. هر k-mer همراه با موقعیت شروع آن ذخیره می‌شود.
  3. لیست نهایی مرتب می‌شود تا جستجو سریع‌تر شود.

در این پیاده‌سازی از ساختار زیر استفاده می‌شود:

(kmer, offset)

مثال:

("ACG", 0)
("CGT", 1)
("ACG", 4)

3. Preprocessing (پیش‌پردازش)

تعریف ساده

مرحله‌ای که قبل از جستجو انجام می‌شود تا داده‌ها برای Query آماده شوند.


توضیح دقیق

در این درس، هنگام ساخت Index:

  • متن t دریافت می‌شود.
  • تمام k-merها استخراج می‌شوند.
  • موقعیت هر k-mer ذخیره می‌شود.
  • Index مرتب می‌شود.

این مرحله ممکن است برای متن‌های بسیار بزرگ زمان‌بر باشد، اما هزینه آن فقط یک‌بار پرداخت می‌شود.


اهمیت

اگر بخواهیم چندین Pattern مختلف را روی یک متن جستجو کنیم، همین Index چندین بار استفاده می‌شود.


4. Binary Search (جستجوی دودویی)

تعریف ساده

الگوریتمی برای پیدا کردن سریع یک مقدار در یک لیست مرتب.


کاربرد در این درس

چون Index مرتب شده است، برای پیدا کردن اولین موقعیت یک k-mer از:

bisect_left()

استفاده می‌کنیم.


چرا سریع است؟

به جای بررسی تک‌تک عناصر:

  • هر مرحله نصف فضای جستجو حذف می‌شود.
  • زمان جستجو تقریباً:

[ O(log_2(n)) ]

است.


5. bisect_left در Python

تعریف ساده

تابعی از ماژول bisect در Python است که محل قرار گرفتن یک مقدار در لیست مرتب را پیدا می‌کند.


در این پیاده‌سازی:

Index شامل Tupleهایی مانند:

(kmer, offset)

است.

برای پیدا کردن اولین k-mer موردنظر:

bisect_left(index, (kmer, -1))

استفاده می‌شود.

عدد -1 باعث می‌شود قبل از تمام offsetها قرار بگیرد و اولین نمونه k-mer پیدا شود.


6. Query (پرس‌وجو)

تعریف ساده

فرآیندی که طی آن یک Pattern را وارد Index می‌کنیم تا مکان‌های احتمالی آن را پیدا کنیم.


مراحل Query:

فرض کنید Pattern برابر است با:

P = ACGTA

و:

k = 2

ابتدا اولین k-mer گرفته می‌شود:

AC

سپس:

  1. AC در Index جستجو می‌شود.
  2. تمام offsetهایی که AC در آن‌ها دیده شده برگردانده می‌شوند.
  3. این offsetها کاندیدهای تطابق هستند.

خروجی Query:

مثلاً:

[0,4]

یعنی Pattern ممکن است از این نقاط شروع شده باشد.


7. Verification (تأیید تطابق)

تعریف ساده

بررسی اینکه آیا Pattern کامل در موقعیت پیدا شده واقعاً وجود دارد یا فقط k-mer اولیه تطابق داشته است.


توضیح دقیق

Index فقط تضمین می‌کند که:

اولین k کاراکتر Pattern

در آن موقعیت وجود دارد.

اما ممکن است ادامه Pattern متفاوت باشد.

بنابراین باید باقی Pattern بررسی شود.

مثال:

Pattern:

ACGT

Index پیدا می‌کند:

AC

در موقعیت 5 وجود دارد.

اما باید بررسی کنیم:

GT

نیز بعد از آن قرار دارد یا خیر.


8. Index Hit (برخورد ایندکس)

تعریف ساده

موقعیتی که Index گزارش می‌کند که k-mer در آنجا وجود دارد.


نکته مهم

Index Hit الزاماً به معنی Match کامل نیست.

دو حالت ممکن است:

  1. Index Hit → Match واقعی

  2. Index Hit → عدم تطابق پس از Verification


ساختار کلاس Index در Python

در این درس یک کلاس Index ساخته می‌شود که دو وظیفه اصلی دارد:


متد اول: Initialization

وظیفه:

  • دریافت متن t
  • دریافت طول k
  • ساخت Index

شبه‌کد:

for every position i:
    extract k-mer
    store (k-mer, i)

sort index

متد دوم: Query

وظیفه:

  • دریافت Pattern
  • پیدا کردن k-mer اول
  • جستجوی آن در Index
  • برگرداندن offsetهای احتمالی

تابع QueryIndex

این تابع تطابق کامل Pattern را انجام می‌دهد.

ورودی:

  • Pattern p
  • Text t
  • Index ساخته‌شده

مراحل:

  1. Query روی Index اجرا می‌شود.
  2. مکان‌های احتمالی دریافت می‌شوند.
  3. باقی Pattern بررسی می‌شود.
  4. اگر تطابق کامل بود، offset ذخیره می‌شود.

مثال عملی

فرض کنید:

Text:

T = ACGTACGTACGT

Pattern:

P = GTAC

ابتدا Index ساخته می‌شود.

Query:

GT

را پیدا می‌کند:

offset = 2
offset = 6

سپس Verification انجام می‌شود:

در هر دو موقعیت:

GTAC

وجود دارد.

نتیجه:

[2,6]

نکات مهم

  • Index برای کاهش تعداد مقایسه‌ها ساخته می‌شود.
  • k-merها به صورت (kmer, offset) ذخیره می‌شوند.
  • مرتب‌سازی Index امکان استفاده از Binary Search را فراهم می‌کند.
  • تابع bisect_left اولین محل یک k-mer را پیدا می‌کند.
  • Query فقط مکان‌های احتمالی را پیدا می‌کند، نه تطابق قطعی.
  • Verification مرحله‌ای است که تطابق کامل Pattern را بررسی می‌کند.
  • هزینه ساخت Index یک بار پرداخت می‌شود و برای Queryهای متعدد قابل استفاده است.
  • این روش پایه بسیاری از الگوریتم‌های سریع Read Alignment است.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Substring Index ایندکس زیررشته ساختاری برای ذخیره موقعیت زیررشته‌ها
k-mer Index ایندکس k-mer ایندکس ساخته‌شده از قطعات طول k DNA
Preprocessing پیش‌پردازش آماده‌سازی داده قبل از جستجو
Query پرس‌وجو جستجو در Index برای یافتن موقعیت‌ها
Verification تأیید بررسی تطابق کامل Pattern
Binary Search جستجوی دودویی الگوریتم جستجو در داده مرتب
bisect_left تابع یافتن محل درج چپ تابع Python برای Binary Search
Offset موقعیت شروع محل قرارگیری k-mer در متن
Pattern الگو رشته‌ای که قصد یافتن آن را داریم
Text متن مرجع رشته‌ای که در آن جستجو انجام می‌شود
Index Hit برخورد ایندکس موقعیتی که Index به عنوان کاندید معرفی می‌کند
Tuple تاپل ساختار Python برای ذخیره چند مقدار مرتبط

مثال‌ها و تشبیه‌ها

مثال کتاب

Index ژنومی مشابه Index یک کتاب است:

در کتاب:

Memory → صفحات 10، 25، 50

در ژنوم:

ACG → موقعیت‌های 0، 4، 10

هدف هر دو:

پیدا کردن سریع محل اطلاعات بدون خواندن کل متن.


خلاصه نهایی مرور سریع

  • k-mer Index تمام قطعات kتایی متن DNA را ذخیره می‌کند.
  • هر k-mer همراه با موقعیت شروع آن ذخیره می‌شود.
  • Index ابتدا ساخته و مرتب می‌شود.
  • Binary Search برای پیدا کردن سریع k-mer استفاده می‌شود.
  • تابع bisect_left اولین محل یک k-mer را پیدا می‌کند.
  • Query فقط مکان‌های احتمالی تطابق را پیدا می‌کند.
  • Verification بررسی می‌کند که Pattern کامل واقعاً وجود دارد.
  • Index Hit همیشه به معنی Match کامل نیست.
  • یک Index ساخته‌شده می‌تواند برای تعداد زیادی Query استفاده شود.
  • این روش برای تحلیل ژنوم‌های بزرگ بسیار مهم است.

سوالات مرور

1. چرا قبل از جستجو Index ساخته می‌شود؟

پاسخ:

زیرا ساخت Index یک هزینه اولیه دارد، اما بعد از آن می‌توان تعداد زیادی Pattern را سریع جستجو کرد.


2. تفاوت Query و Verification چیست؟

پاسخ:

Query فقط مکان‌هایی را پیدا می‌کند که k-mer اولیه در آن‌ها وجود دارد، اما Verification بررسی می‌کند که کل Pattern در آن مکان تطابق دارد.


3. چرا Index باید مرتب شود؟

پاسخ:

تا بتوان از Binary Search برای یافتن سریع k-merها استفاده کرد.


4. bisect_left چه کاری انجام می‌دهد؟

پاسخ:

محل اولین درج ممکن یک مقدار در یک لیست مرتب را پیدا می‌کند؛ در اینجا برای پیدا کردن اولین k-mer موردنظر استفاده می‌شود.


5. آیا هر Index Hit یک Match واقعی است؟

پاسخ:

خیر. Index Hit فقط نشان می‌دهد که بخشی از Pattern (معمولاً k-mer اولیه) در آن موقعیت وجود دارد و باید با Verification بررسی شود.


02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/11_lecture-variations-on-k-mer-indexes

تغییرات و بهبودهای مختلف در نمایه‌سازی k-mer

Variations on k-mer Indexes


خلاصه کلی

در این درس، دو تغییر مهم روی k-mer Index بررسی می‌شود که هدف آن‌ها بهبود کارایی نمایه‌سازی برای مسائل مانند Read Alignment است:

  1. Sparse k-mer Index (نمایه‌سازی تنک k-mer) به جای ذخیره تمام k-merهای متن، فقط بخشی از آن‌ها (مثلاً هر دومین یا هر nاُمین k-mer) ذخیره می‌شوند تا حافظه کمتر و جستجو سریع‌تر شود.

  2. Subsequence Index (نمایه‌سازی زیرتوالی‌ها) به جای استفاده از زیررشته‌های پیوسته (Substring) از زیرتوالی‌های غیرپیوسته (Subsequence) برای ساخت کلیدهای نمایه استفاده می‌شود تا قدرت فیلتر کردن افزایش یابد.

هدف اصلی این تغییرات، ایجاد تعادل بین:

  • سرعت جستجو
  • مصرف حافظه
  • احتمال از دست دادن تطابق‌های صحیح
  • کاهش تطابق‌های کاذب

است.


مفاهیم کلیدی


1. Sparse k-mer Index — نمایه‌سازی تنک k-mer

تعریف ساده

در k-mer Index معمولی، تمام k-merهای موجود در متن T ذخیره می‌شوند.

اما در Sparse k-mer Index فقط تعدادی از k-merها ذخیره می‌شوند؛ برای مثال:

  • فقط k-merهای با offset زوج
  • فقط هر سومین k-mer
  • فقط هر nاُمین k-mer

توضیح دقیق

در نمایه معمولی:

فرض کنید متن T شامل k-merهای زیر باشد:

offset 0 → k-mer
offset 1 → k-mer
offset 2 → k-mer
offset 3 → k-mer
...

تمام این موارد وارد index می‌شوند.

اما در نمایه تنک، مثلاً اگر فقط offsetهای زوج را انتخاب کنیم:

offset 0 → ذخیره می‌شود
offset 1 → حذف می‌شود
offset 2 → ذخیره می‌شود
offset 3 → حذف می‌شود
offset 4 → ذخیره می‌شود

بنابراین اندازه index تقریباً نصف می‌شود.


اهمیت و کاربرد

مزایای Sparse Index:

1. کاهش مصرف حافظه

چون تعداد k-merهای ذخیره‌شده کمتر است، فضای کمتری نیاز دارد.

2. جستجوی سریع‌تر

اگر از Binary Search استفاده کنیم، تعداد عناصر کمتر باعث می‌شود تعداد تقسیم‌های لازم کاهش یابد.

برای مثال:

اگر اندازه index نصف شود:

  • تقریباً یک مرحله از Binary Search کم می‌شود.

مشکل اصلی Sparse Index

کاهش تعداد k-merها ممکن است باعث شود برخی تطابق‌ها پیدا نشوند.

مثال:

فرض کنید الگوی P دارای تطابقی در متن است.

اگر فقط اولین k-mer از P را برای Query استفاده کنیم و آن k-mer در index وجود نداشته باشد:

Query → بدون Hit

ممکن است تصور کنیم که P در متن وجود ندارد.

اما اگر k-mer دوم یا سوم را امتحان کنیم، ممکن است تطابق پیدا شود.


2. Query کردن Sparse k-mer Index

ایده اصلی

برای جلوگیری از از دست دادن تطابق‌ها، فقط یک k-mer از Pattern بررسی نمی‌شود.

بلکه چند k-mer با موقعیت‌های مختلف استفاده می‌شود.


مثال

فرض کنید index شامل k-merهای offset زوج متن است.

برای Pattern:

P = ...

می‌توانیم:

  • k-mer در offset زوج Pattern
  • k-mer در offset فرد Pattern

را بررسی کنیم.

چرا؟

زیرا یکی از آن‌ها احتمالاً با k-merهای ذخیره‌شده در index هماهنگ می‌شود.


تعمیم به هر nاُمین k-mer

این روش محدود به هر دومین k-mer نیست.

می‌توانیم انتخاب کنیم:

  • هر دومین k-mer
  • هر سومین k-mer
  • هر چهارمین k-mer
  • هر nاُمین k-mer

مثال: هر سومین k-mer

اگر:

n = 3

index شامل:

offset 0
offset 3
offset 6
offset 9
...

خواهد بود.

برای Query نیز باید سه k-mer با باقی‌مانده‌های متفاوت نسبت به 3 انتخاب کنیم:

مثلاً:

offset 0 mod 3
offset 1 mod 3
offset 2 mod 3

تا احتمال پیدا کردن تطابق حفظ شود.


3. Substring و Subsequence

Substring — زیررشته

تعریف:

رشته‌ای که:

  • از کاراکترهای پشت سر هم یک رشته اصلی ساخته شده باشد.

مثال:

رشته:

AAGCTTAG

زیررشته:

GCT

است، زیرا کاراکترها کنار هم قرار دارند.


Subsequence — زیرتوالی

تعریف:

رشته‌ای که:

  • ترتیب کاراکترها حفظ شده باشد،
  • اما کاراکترها لازم نیست پشت سر هم باشند.

مثال:

رشته:

AAGCTTAG

زیرتوالی:

AAGT

است.

زیرا:

A (offset 0)
A (offset 1)
G (offset 5)
T (offset 7)

انتخاب شده‌اند.

اما:

AAGT

یک substring نیست، چون این حروف پشت سر هم نیستند.


رابطه Substring و Subsequence

نکته مهم:

هر Substring یک Subsequence است

اما:

هر Subsequence الزاماً Substring نیست

4. Subsequence Index — نمایه‌سازی زیرتوالی

تعریف

در این روش به جای استخراج k-merهای پیوسته از متن، یک الگوی انتخاب کاراکتر (Shape) تعریف می‌کنیم.


مثال Shape

فرض کنید الگو این باشد:

XX-X-XX

یعنی:

  • دو کاراکتر بردار
  • یکی را رد کن
  • یکی بردار
  • یکی را رد کن
  • دو کاراکتر بعدی را بردار

از متن:

G C A T T G A

کاراکترهای انتخاب‌شده:

G C T G A

به عنوان کلید index ذخیره می‌شوند.


Query کردن Subsequence Index

برای جستجوی Pattern:

  1. همان Shape روی Pattern اعمال می‌شود.
  2. Subsequence استخراج می‌شود.
  3. در index جستجو می‌شود.

مثلاً:

Pattern:

G C A T T G

با Shape:

XX-X-XX

به:

GCTTG

تبدیل می‌شود.

سپس در index جستجو می‌شود.


5. افزایش Specificity با Subsequence Index

مفهوم Specificity

Specificity یعنی:

چقدر یک Index Hit احتمال دارد واقعاً به یک Match کامل منجر شود.


چرا Subsequence بهتر فیلتر می‌کند؟

اگر از substring استفاده کنیم:

مثلاً:

ACGT

ممکن است در نقاط زیادی از ژنوم دیده شود.

اما اگر از فاصله‌های مشخص استفاده کنیم:

A C _ G _ T

احتمال تکرار تصادفی کمتر می‌شود.

بنابراین:

  • تعداد Hitهای اشتباه کاهش می‌یابد.
  • Verification موفق‌تر خواهد بود.

نکات مهم

  • k-mer Index معمولی تمام k-merهای متن را ذخیره می‌کند.
  • Sparse Index با حذف بخشی از k-merها حافظه و زمان Query را کاهش می‌دهد.
  • کاهش k-merها ممکن است باعث از دست رفتن Match شود.
  • برای جلوگیری از این مشکل باید چند k-mer با موقعیت‌های متفاوت از Pattern بررسی شود.
  • در Sparse Index با انتخاب هر nاُمین k-mer، باید n Query مختلف انجام شود.
  • Substring الزاماً باید پیوسته باشد، ولی Subsequence فقط ترتیب را حفظ می‌کند.
  • Subsequence Index معمولاً Hitهای کاذب کمتری تولید می‌کند.
  • کاهش False Positive باعث کاهش تعداد Verificationهای لازم می‌شود.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
k-mer Index نمایه k-mer ساختاری که k-merهای متن را به محل وقوع آن‌ها نگاشت می‌کند
Sparse Index نمایه تنک نمایه‌ای که فقط بخشی از k-merها را ذخیره می‌کند
Offset موقعیت محل شروع یک k-mer در متن
Query پرس‌وجو استفاده از یک الگو برای جستجو در index
Index Hit برخورد نمایه موقعیتی که k-mer مورد نظر در index پیدا می‌شود
Verification بررسی نهایی بررسی اینکه آیا کل Pattern واقعاً تطابق دارد یا خیر
Substring زیررشته بخش پیوسته‌ای از یک رشته
Subsequence زیرتوالی رشته‌ای با حفظ ترتیب ولی بدون الزام پیوستگی
Shape الگوی انتخاب مشخص می‌کند کدام کاراکترها انتخاب یا حذف شوند
Specificity اختصاصیت احتمال اینکه یک Hit واقعاً Match باشد
False Positive مثبت کاذب Hitی که به تطابق واقعی منجر نمی‌شود
Modulo باقی‌مانده تقسیم برای تقسیم‌بندی offsetها در Sparse Index استفاده می‌شود

مثال‌ها و تشبیه‌ها

تشبیه Sparse Index

مانند این است که به جای شماره‌گذاری تمام صفحات یک کتاب، فقط صفحات زوج را فهرست کنیم.

مزیت:

  • فهرست کوچک‌تر است.

عیب:

  • ممکن است موضوعی در صفحات فرد پیدا نشود.

برای حل مشکل، چند صفحه با الگوهای مختلف بررسی می‌کنیم.


تشبیه Subsequence Index

مانند این است که به جای بررسی تمام کلمات یک جمله، فقط حروف خاصی را انتخاب کنیم.

اگر این حروف با فاصله مشخص انتخاب شوند، احتمال اینکه به‌طور تصادفی مشابه باشند کمتر می‌شود.


خلاصه نهایی مرور سریع

  • k-mer Index معمولی تمام k-merهای متن را ذخیره می‌کند.
  • Sparse k-mer Index تنها بخشی از k-merها را ذخیره می‌کند.
  • Sparse Index باعث کاهش حافظه و افزایش سرعت Query می‌شود.
  • مشکل Sparse Index احتمال از دست دادن برخی Matchها است.
  • برای حل این مشکل باید چند k-mer با offsetهای مختلف بررسی شود.
  • انتخاب هر nاُمین k-mer یک حالت عمومی از Sparse Index است.
  • Substring شامل کاراکترهای متوالی است.
  • Subsequence ترتیب کاراکترها را حفظ می‌کند ولی نیاز به پیوستگی ندارد.
  • Subsequence Index می‌تواند تعداد Hitهای کاذب را کاهش دهد.
  • هدف اصلی همه این روش‌ها، افزایش سرعت Read Alignment است.

سوالات مرور

1. تفاوت k-mer Index معمولی و Sparse k-mer Index چیست؟

پاسخ: در k-mer Index معمولی تمام k-merهای متن ذخیره می‌شوند، اما در Sparse Index فقط بخشی از آن‌ها مانند هر دومین یا هر nاُمین k-mer ذخیره می‌شوند.


2. چرا Sparse Index می‌تواند باعث از دست رفتن Match شود؟

پاسخ: زیرا ممکن است k-mer انتخاب‌شده از Pattern در index وجود نداشته باشد، حتی اگر Pattern کامل در متن وجود داشته باشد.


3. چگونه مشکل از دست دادن Match در Sparse Index حل می‌شود؟

پاسخ: با Query کردن چند k-mer از Pattern که در دسته‌های offset متفاوت قرار دارند.


4. تفاوت Substring و Subsequence چیست؟

پاسخ: Substring باید شامل کاراکترهای پشت سر هم باشد، اما Subsequence فقط ترتیب کاراکترها را حفظ می‌کند و می‌تواند فاصله داشته باشد.


5. چرا Subsequence Index می‌تواند بهتر از Substring Index فیلتر کند؟

پاسخ: زیرا الگوی انتخابی پیچیده‌تر است و احتمال اینکه به‌صورت تصادفی در نقاط مختلف ژنوم تکرار شود کمتر است؛ بنابراین Hitهای کاذب کاهش می‌یابند.


02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/12_lecture-genome-indexes-used-in-research

درس ۱۲: Genome Indexes Used in Research

ایندکس‌های ژنومی مورد استفاده در پژوهش


خلاصه کلی

در این درس، کاربرد ساختارهای ایندکس (Indexing Structures) در تحلیل توالی‌های زیستی، به‌خصوص مسئله هم‌ترازی خوانش‌ها (Read Alignment) بررسی می‌شود.

ایده اصلی این است که به جای جستجوی مستقیم در یک ژنوم بسیار بزرگ، ابتدا ژنوم را پیش‌پردازش (Preprocess) کنیم و یک ساختار داده‌ای بسازیم که امکان جستجوی سریع را فراهم کند.

در این درس چند نوع ایندکس ژنومی معرفی می‌شوند:

  • K-mer Index
  • Subsequence Index
  • Suffix Array
  • Suffix Tree
  • FM Index

هدف یادگیری:

  • درک نقش ایندکس‌ها در تحلیل ژنوم
  • شناخت تفاوت روش‌های مختلف ذخیره‌سازی و جستجوی ژنوم
  • آشنایی با ساختارهایی که در ابزارهای واقعی هم‌ترازی مانند Bowtie و BWA استفاده می‌شوند

مفاهیم کلیدی


1. Genome Indexing (ایندکس‌گذاری ژنوم)

تعریف ساده

Genome Indexing فرآیندی است که طی آن ژنوم مرجع قبل از جستجو پردازش می‌شود تا بتوان توالی‌های جدید را سریع‌تر در آن پیدا کرد.

توضیح دقیق

در مسئله Read Alignment، ما تعداد زیادی خوانش کوتاه (Short Reads) داریم و می‌خواهیم محل مناسب آن‌ها را در یک ژنوم مرجع پیدا کنیم.

از آنجا که:

  • ژنوم مرجع ثابت است.
  • خوانش‌ها در هر آزمایش تغییر می‌کنند.

منطقی است که ژنوم را یک بار پردازش کنیم و یک ایندکس بسازیم.

این ایده مشابه موارد زیر است:

  • ایندکس کتاب برای پیدا کردن کلمات
  • موتورهای جستجو برای پیدا کردن صفحات وب

اهمیت

بدون ایندکس، باید کل ژنوم برای هر خوانش بررسی شود که بسیار کند است.


2. K-mer Index (ایندکس K-mer)

تعریف ساده

یک ساختار داده که تمام زیررشته‌های طول K از ژنوم را ذخیره کرده و محل وقوع آن‌ها را نگهداری می‌کند.

توضیح دقیق

در K-mer Index:

  • تمام رشته‌های طول K از ژنوم استخراج می‌شوند.
  • هر K-mer همراه با موقعیت (Offset) آن ذخیره می‌شود.

مثلاً:

ژنوم:

ACGTAC

برای K=3:

ACG → offset 0
CGT → offset 1
GTA → offset 2
TAC → offset 3

هنگام جستجوی یک Pattern:

  1. یک K-mer از Pattern استخراج می‌شود.
  2. در Index جستجو می‌شود.
  3. موقعیت‌های احتمالی پیدا می‌شوند.
  4. با Verification بررسی می‌شود که کل Pattern تطابق دارد یا خیر.

کاربرد

K-mer Index یکی از ساده‌ترین روش‌ها برای:

  • Read Alignment
  • Sequence Analysis

است.


3. Sparse K-mer Index (ایندکس K-mer تنک)

تعریف ساده

نسخه‌ای از K-mer Index که به جای ذخیره همه K-merها، فقط بخشی از آن‌ها را ذخیره می‌کند.

ایده اصلی

در K-mer Index معمولی:

تمام K-merها ذخیره می‌شوند.

اما در Sparse Index:

مثلاً فقط K-merهایی با Offset زوج ذخیره می‌شوند:

offset 0 ✔
offset 1 ✘
offset 2 ✔
offset 3 ✘
offset 4 ✔

مزایا

  • کاهش مصرف حافظه
  • جستجوی سریع‌تر

زیرا اندازه Index کوچک‌تر است.

مشکل

ممکن است بعضی Matchها از دست بروند.

راه‌حل:

به جای یک K-mer از Pattern، چند K-mer با Offsetهای مختلف بررسی می‌شوند.

مثلاً:

  • یک K-mer از Offset زوج
  • یک K-mer از Offset فرد

به این ترتیب احتمال از دست دادن Match کاهش می‌یابد.


4. Subsequence Index (ایندکس زیرتوالی)

تعریف ساده

نوعی Index که به جای ذخیره Substringهای پیوسته، از Subsequenceهای غیرپیوسته استفاده می‌کند.


تفاوت Substring و Subsequence

Substring

بخش پیوسته‌ای از رشته است.

مثال:

ABCDEFG

Substring:

CDE

زیرا حروف پشت سر هم هستند.


Subsequence

حروفی هستند که:

  • ترتیبشان حفظ شده
  • اما الزاماً کنار هم نیستند

مثال:

ABCDEFG

Subsequence:

ACEG

زیرا:

A → C → E → G

وجود دارند ولی پیوسته نیستند.


مزیت Subsequence Index

Subsequenceها معمولاً Specificity بیشتری ایجاد می‌کنند.

یعنی:

وقتی Index Hit ایجاد می‌شود، احتمال اینکه واقعاً یک Match کامل باشد بیشتر است.

به عبارت دیگر:

درصد بیشتری از Index Hitها به Match واقعی تبدیل می‌شوند.


5. Suffix Indexes (ایندکس‌های پسوندی)

تعریف کلی

خانواده‌ای از ساختارهای داده که تمام Suffixهای یک متن را سازمان‌دهی می‌کنند.


Suffix چیست؟

Suffix یعنی بخشی از رشته که از یک نقطه شروع شده و تا انتهای رشته ادامه دارد.

مثلاً:

رشته:

BANANA

Suffixها:

BANANA
ANANA
NANA
ANA
NA
A

6. Suffix Array (آرایه پسوندی)

تعریف ساده

ساختاری که تمام Suffixهای ژنوم را به ترتیب الفبایی مرتب کرده و فقط موقعیت شروع آن‌ها را ذخیره می‌کند.


مشکل اولیه

اگر خود Suffixها ذخیره شوند، حجم بسیار بزرگی ایجاد می‌شود.

برای ژنوم انسان:

  • طول ژنوم ≈ 3 میلیارد باز
  • ذخیره همه Suffixها غیرعملی است.

راه‌حل

به جای ذخیره رشته کامل:

فقط Offset ذخیره می‌شود.

مثلاً:

به جای:

AACGT...

ذخیره می‌کنیم:

position = 10024

و برای مشاهده رشته واقعی، به ژنوم اصلی مراجعه می‌کنیم.


ویژگی مهم

حجم Suffix Array:

[ O(N) ]

است.

یعنی با طول ژنوم به صورت خطی افزایش می‌یابد.

در حالی که ذخیره واقعی Suffixها:

[ O(N^2) ]

حجم نیاز دارد.


7. Suffix Tree (درخت پسوندی)

تعریف ساده

ساختاری که Suffixهای ژنوم را با روش Grouping سازمان‌دهی می‌کند.

تفاوت با Suffix Array

ساختار روش سازمان‌دهی
Suffix Array Ordering (مرتب‌سازی)
Suffix Tree Grouping (گروه‌بندی)

تشبیه

Suffix Array:

مانند Index کتاب است:

  • همه چیز مرتب شده است.

Suffix Tree:

مانند راهروهای فروشگاه است:

  • موارد مشابه کنار هم قرار گرفته‌اند.

ویژگی

مزیت:

  • جستجوی بسیار سریع

عیب:

  • مصرف حافظه زیاد

8. FM Index (ایندکس FM)

تعریف ساده

یک ساختار بسیار فشرده برای Index کردن ژنوم که بر پایه:

Burrows-Wheeler Transform (BWT)

ساخته می‌شود.


Burrows-Wheeler Transform (BWT)

تعریف

روشی که ابتدا برای فشرده‌سازی داده‌ها طراحی شد.

اما بعدها مشخص شد که می‌توان از آن برای ساخت Indexهای بسیار کوچک استفاده کرد.


ویژگی FM Index

مزیت اصلی:

  • حجم بسیار کم
  • امکان ذخیره ژنوم در حافظه RAM

به همین دلیل در ابزارهای مدرن Read Alignment بسیار محبوب است.


ابزارهای واقعی استفاده‌کننده از FM Index

FM Index در ابزارهای معروف زیر استفاده می‌شود:

  • Bowtie
  • Bowtie 2
  • BWA
  • BWA-SW
  • BWA-MEM

این ابزارها برای:

  • Mapping Reads
  • Genome Alignment

استفاده می‌شوند.


نکات مهم

  • ایندکس‌گذاری باعث می‌شود جستجوی توالی‌ها سریع شود.
  • ژنوم مرجع معمولاً یک بار پیش‌پردازش می‌شود.
  • K-mer Index ساده‌ترین نوع ایندکس ژنومی است.
  • Sparse K-mer Index با کاهش تعداد K-merها، حافظه را کاهش می‌دهد.
  • Subsequence Index باعث افزایش Specificity فیلتر می‌شود.
  • Suffix Array تمام Suffixها را ذخیره نمی‌کند؛ فقط Offset آن‌ها را نگهداری می‌کند.
  • حجم Suffix Array خطی است، اما ذخیره کامل Suffixها مربعی است.
  • Suffix Tree سریع ولی حافظه‌بر است.
  • FM Index یکی از فشرده‌ترین Indexهای ژنومی است.
  • ابزارهای محبوب هم‌ترازی مانند BWA و Bowtie از FM Index استفاده می‌کنند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Indexing ایندکس‌گذاری ایجاد ساختاری برای جستجوی سریع داده
Genome Index ایندکس ژنوم ساختار داده برای جستجوی سریع در ژنوم
Read Alignment هم‌ترازی خوانش‌ها پیدا کردن محل Readها در ژنوم مرجع
K-mer زیررشته طول K قطعه‌ای از DNA با طول مشخص
Sparse Index ایندکس تنک ایندکسی که فقط بخشی از داده را ذخیره می‌کند
Substring زیررشته پیوسته بخشی از رشته که حروف آن پشت سر هم هستند
Subsequence زیرتوالی رشته‌ای با حفظ ترتیب ولی بدون الزام پیوستگی
Suffix پسوند بخشی از رشته که از یک نقطه تا انتها ادامه دارد
Suffix Array آرایه پسوندی آرایه‌ای از موقعیت شروع Suffixهای مرتب‌شده
Suffix Tree درخت پسوندی ساختار درختی برای گروه‌بندی Suffixها
FM Index ایندکس FM ایندکس فشرده مبتنی بر BWT
Burrows-Wheeler Transform (BWT) تبدیل بوروز-ویلر روش تبدیل رشته برای فشرده‌سازی و ایندکس
Specificity اختصاصیت توانایی یک روش برای کاهش تطابق‌های اشتباه
Offset موقعیت شروع شماره محل آغاز یک قطعه در رشته

مثال‌ها و تشبیه‌ها

مثال ایندکس کتاب

ژنوم مانند یک کتاب بسیار بزرگ است.

بدون Index:

باید تمام کتاب را صفحه‌به‌صفحه جستجو کنیم.

با Index:

مستقیماً به بخش مرتبط می‌رویم.


مثال فروشگاه

دو روش سازمان‌دهی داده:

Ordering

مانند فهرست الفبایی کتاب:

A
B
C
D

Grouping

مانند راهروهای فروشگاه:

لبنیات
نوشیدنی
مواد شوینده

Suffix Array از Ordering استفاده می‌کند.

Suffix Tree از Grouping استفاده می‌کند.


خلاصه نهایی مرور سریع

  • Indexing پایه بسیاری از روش‌های تحلیل ژنوم و موتورهای جستجو است.
  • K-mer Index با ذخیره قطعات طول K از ژنوم ساخته می‌شود.
  • Sparse K-mer Index تنها بخشی از K-merها را ذخیره می‌کند تا حافظه کاهش یابد.
  • برای جلوگیری از از دست دادن Match در Sparse Index باید چند K-mer از Pattern بررسی شود.
  • Subsequence Index به جای قطعات پیوسته، الگوهای غیرپیوسته را ذخیره می‌کند.
  • Suffix Array تمام Suffixها را با Offset نمایش می‌دهد و حافظه کمی مصرف می‌کند.
  • Suffix Tree از گروه‌بندی Suffixها استفاده می‌کند و حافظه بیشتری نیاز دارد.
  • FM Index یک ساختار بسیار فشرده مبتنی بر BWT است.
  • ابزارهایی مانند Bowtie و BWA از FM Index برای Read Alignment استفاده می‌کنند.
  • هدف اصلی همه این ساختارها: جستجوی سریع در ژنوم‌های بسیار بزرگ است.

سوالات مرور

1. چرا در تحلیل ژنوم به Index نیاز داریم؟

پاسخ:

زیرا ژنوم بسیار بزرگ است و جستجوی مستقیم در آن برای هر Read بسیار کند خواهد بود. Index اجازه می‌دهد موقعیت‌های احتمالی سریع پیدا شوند.


2. تفاوت Substring و Subsequence چیست؟

پاسخ:

Substring باید شامل کاراکترهای پشت سر هم باشد، اما Subsequence فقط ترتیب کاراکترها را حفظ می‌کند و لازم نیست پیوسته باشد.


3. چرا Suffix Array نسبت به ذخیره کامل Suffixها بهتر است؟

پاسخ:

زیرا به جای ذخیره رشته‌های کامل، فقط Offset آن‌ها را نگه می‌دارد و حجم آن از (O(N^2)) به (O(N)) کاهش می‌یابد.


4. مزیت اصلی FM Index چیست؟

پاسخ:

FM Index بسیار فشرده است و می‌تواند ژنوم‌های بزرگ مانند ژنوم انسان را در حافظه نگهداری کند.


5. چرا Sparse K-mer Index ممکن است خطرناک باشد؟

پاسخ:

زیرا حذف بعضی K-merها ممکن است باعث شود برخی Matchهای واقعی پیدا نشوند؛ بنابراین باید چند K-mer مختلف از Pattern بررسی شود.


02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/13_lecture-approximate-matching-hamming-and-edit-distance

درس ۱۳: Approximate Matching — Hamming Distance و Edit Distance

تطبیق تقریبی توالی‌ها و معیارهای فاصله بین رشته‌ها


خلاصه کلی

در درس‌های قبل، مسئله Exact Matching (تطبیق دقیق) بررسی شد؛ یعنی پیدا کردن الگو (Pattern) در متن (Text) زمانی که تمام کاراکترها دقیقاً برابر باشند.

اما در مسائل واقعی زیست‌محاسباتی، مانند Read Alignment، تطبیق کاملاً دقیق کافی نیست؛ زیرا بین خوانش‌های توالی‌یابی (Sequencing Reads) و ژنوم مرجع (Reference Genome) ممکن است اختلاف وجود داشته باشد.

دلایل اصلی این اختلاف:

  • خطاهای دستگاه توالی‌یابی (Sequencing Errors)
  • تفاوت ژنوم فرد مورد مطالعه با ژنوم مرجع (Genetic Variation)

بنابراین به الگوریتم‌هایی نیاز داریم که بتوانند Approximate Matching (تطبیق تقریبی) انجام دهند؛ یعنی وجود برخی اختلاف‌ها را بپذیرند.

هدف یادگیری این درس:

  • شناخت انواع اختلاف بین دو توالی
  • آشنایی با معیارهای فاصله بین رشته‌ها
  • درک تفاوت Hamming Distance و Edit Distance
  • آشنایی با تغییر الگوریتم Exact Matching برای تطبیق تقریبی

مفاهیم کلیدی


1. Approximate Matching (تطبیق تقریبی)

تعریف ساده

روشی برای پیدا کردن یک Pattern در یک Text با اجازه دادن به تعداد مشخصی اختلاف.


توضیح دقیق

در Exact Matching:

اگر حتی یک Base متفاوت باشد، تطبیق شکست می‌خورد.

مثلاً:

Pattern:

ACGT

Text:

ACGA

این دو برابر نیستند.

اما در Approximate Matching:

می‌توان گفت این دو توالی با یک اختلاف تطبیق دارند.


اهمیت در ژنومیک

در داده‌های واقعی DNA، تطبیق دقیق معمولاً کافی نیست، زیرا:

1. Sequencing Error

دستگاه Sequencer ممکن است یک باز را اشتباه تشخیص دهد.

مثلاً:

ژنوم واقعی:

ACGT

Read:

ACGA

اختلاف ناشی از خطای توالی‌یابی است.


2. Genetic Variation

ژنوم فرد مورد مطالعه دقیقاً مشابه Reference Genome نیست.

حتی دو انسان غیرمرتبط نیز حدود:

  • 99.8 تا 99.9 درصد شباهت ژنتیکی دارند.

اما کاملاً یکسان نیستند.


2. انواع اختلاف بین دو توالی

برای مقایسه دو رشته، چند نوع تغییر مهم وجود دارد.


A. Mismatch / Substitution

عدم تطابق / جایگزینی

تعریف

تغییر یک کاراکتر به کاراکتر دیگر.

مثال:

P: ACGT
T: ACCT

در موقعیت سوم:

G → C

یک Substitution رخ داده است.


B. Insertion

درج

تعریف

اضافه شدن یک کاراکتر به یک رشته نسبت به رشته دیگر.

مثال:

P: ACGGT
T: ACGT

در Pattern یک G اضافه وجود دارد.

این تغییر به صورت یک Gap نمایش داده می‌شود.


C. Deletion

حذف

تعریف

حذف شدن یک کاراکتر از یک رشته نسبت به رشته دیگر.

مثال:

P: ACGT
T: ACGGT

در Pattern یک G حذف شده است.


3. Hamming Distance (فاصله همینگ)

تعریف ساده

تعداد حداقل جایگزینی‌ها (Substitution) که لازم است تا یک رشته به رشته دیگر تبدیل شود.


شرط مهم

دو رشته باید:

  • طول یکسان داشته باشند.

مثال

دو رشته:

X = ACGTA
Y = ACCGA

مقایسه:

موقعیت X Y اختلاف
1 A A خیر
2 C C خیر
3 G C بله
4 T G بله
5 A A خیر

تعداد اختلاف‌ها:

2

پس:

[ Hamming(X,Y)=2 ]


کاربرد

در Read Alignment زمانی که فقط خطاهای جایگزینی را در نظر می‌گیریم، Hamming Distance مناسب است.


4. Edit Distance / Levenshtein Distance

فاصله ویرایشی

تعریف ساده

حداقل تعداد عملیات لازم برای تبدیل یک رشته به رشته دیگر.

عملیات مجاز:

  1. Substitution
  2. Insertion
  3. Deletion

تفاوت با Hamming Distance

ویژگی Hamming Distance Edit Distance
جایگزینی دارد دارد
درج ندارد دارد
حذف ندارد دارد
طول رشته‌ها باید برابر باشد می‌تواند متفاوت باشد

مثال

فرض کنید:

X = ACCT
Y = ACT

برای تبدیل X به Y:

یک C حذف می‌شود:

ACCT → ACT

پس:

Edit Distance = 1

مثال ترکیبی

فرض کنید:

X = ACGTA
Y = ACCTA

تغییر:

G → C

یک Substitution

همچنین:

X = ACGGTA
Y = ACGTA

یک G اضافه دارد.

پس:

Edit Distance:

1 substitution + 1 insertion = 2

5. تطبیق تقریبی با الگوریتم Naive Matching

ایده اصلی

الگوریتم Naive Exact Matching قبلاً با این منطق کار می‌کرد:

  • کاراکترها را مقایسه کن.
  • اگر یک اختلاف دیدی، آن Alignment را رد کن.

اما برای Approximate Matching:

نباید با اولین اختلاف متوقف شویم.


تغییر الگوریتم

الگوریتم جدید:

  1. یک Alignment را شروع می‌کنیم.
  2. تعداد Mismatchها را شمارش می‌کنیم.
  3. اگر تعداد اختلاف‌ها از حد مجاز بیشتر شد، آن Alignment رد می‌شود.
  4. در غیر این صورت ادامه می‌دهیم.

مثال

فرض کنیم:

حداکثر اختلاف مجاز:

k = 2

اگر هنگام مقایسه:

Mismatch = 1

هنوز ادامه می‌دهیم.

اما اگر:

Mismatch = 3

دیگر تطبیق قابل قبول نیست.


نکات مهم

  • Exact Matching برای داده‌های واقعی ژنومی کافی نیست.
  • Sequencing Error و Genetic Variation باعث اختلاف Read و Reference می‌شوند.
  • Mismatch همان Substitution است.
  • Hamming Distance فقط برای رشته‌های هم‌اندازه کاربرد دارد.
  • Edit Distance عمومی‌تر است و Insert/Delete را نیز شامل می‌شود.
  • در این مرحله از درس، تمرکز روی Hamming Distance است.
  • Approximate Matching را می‌توان با تغییر Naive Algorithm پیاده‌سازی کرد.
  • Boyer-Moore برای Exact Matching بسیار مناسب است، اما تعمیم آن به Approximate Matching دشوارتر است.
  • در ادامه روش‌هایی معرفی می‌شوند که اجازه می‌دهند الگوریتم‌های Exact Matching به عنوان ابزار Approximate Matching استفاده شوند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Approximate Matching تطبیق تقریبی یافتن تطابق با اجازه وجود اختلاف
Exact Matching تطبیق دقیق تطابق بدون هیچ اختلاف
Pattern الگو رشته‌ای که دنبال آن می‌گردیم
Text متن رشته مرجع که جستجو در آن انجام می‌شود
Sequencing Error خطای توالی‌یابی اشتباه دستگاه در تعیین Base
Reference Genome ژنوم مرجع ژنومی که Readها با آن مقایسه می‌شوند
Mismatch عدم تطابق تفاوت یک Base در دو رشته
Substitution جایگزینی تغییر یک کاراکتر به کاراکتر دیگر
Insertion درج اضافه شدن یک کاراکتر
Deletion حذف حذف شدن یک کاراکتر
Gap شکاف محل نشان‌دهنده درج یا حذف
Hamming Distance فاصله همینگ تعداد Substitutionهای لازم برای تبدیل دو رشته
Edit Distance فاصله ویرایشی حداقل تعداد عملیات درج، حذف و جایگزینی
Levenshtein Distance فاصله لونشتاین نام دیگر Edit Distance
Alignment هم‌ترازی قرار دادن دو رشته برای مقایسه

مثال‌ها و تشبیه‌ها

تشبیه فاصله رشته‌ها

فرض کنید دو کلمه روی کاغذ نوشته شده‌اند.

Hamming Distance

فقط اجازه دارید حروف را عوض کنید.

مثلاً:

CAT
CUT

یک حرف تغییر کرده است.


Edit Distance

علاوه بر تغییر حرف، اجازه دارید:

  • حرفی اضافه کنید.
  • حرفی حذف کنید.

مثلاً:

CART
CAT

با حذف R به هم تبدیل می‌شوند.


خلاصه نهایی مرور سریع

  • تطبیق دقیق برای داده‌های زیستی واقعی کافی نیست.
  • اختلاف بین Read و Reference می‌تواند ناشی از خطای Sequencing یا تفاوت ژنتیکی باشد.
  • سه نوع تغییر اصلی: Substitution، Insertion و Deletion هستند.
  • Hamming Distance فقط تعداد جایگزینی‌ها را حساب می‌کند.
  • Hamming Distance نیازمند طول برابر دو رشته است.
  • Edit Distance شامل Substitution، Insertion و Deletion است.
  • Edit Distance برای رشته‌های با طول متفاوت نیز قابل استفاده است.
  • Approximate Matching اجازه می‌دهد تعداد مشخصی اختلاف وجود داشته باشد.
  • الگوریتم Naive Matching را می‌توان با شمارش Mismatchها به Approximate Matching تبدیل کرد.
  • هدف نهایی در Read Alignment پیدا کردن محل‌هایی است که Read با کمترین اختلاف با Reference Genome تطبیق دارد.

سوالات مرور

1. چرا Exact Matching برای Read Alignment کافی نیست؟

پاسخ:

زیرا Readها ممکن است به دلیل خطاهای توالی‌یابی یا تفاوت‌های ژنتیکی با ژنوم مرجع دقیقاً یکسان نباشند.


2. تفاوت اصلی Hamming Distance و Edit Distance چیست؟

پاسخ:

Hamming Distance فقط Substitution را شمارش می‌کند و طول رشته‌ها باید برابر باشد؛ اما Edit Distance شامل Substitution، Insertion و Deletion است و طول رشته‌ها می‌تواند متفاوت باشد.


3. یک مثال از Substitution بزنید.

پاسخ:

تبدیل:

ACGT

به:

ACGA

که در آن C یا G جایگزین نشده، بلکه T به A تغییر کرده است، یک Substitution است.


4. چرا در Approximate Matching الگوریتم Naive را نمی‌توان با اولین اختلاف متوقف کرد؟

پاسخ:

زیرا یک اختلاف ممکن است قابل قبول باشد. باید تعداد کل اختلاف‌ها شمرده شود و فقط زمانی رد شود که از حد مجاز بیشتر شود.


5. چرا Edit Distance عمومی‌تر از Hamming Distance است؟

پاسخ:

زیرا علاوه بر جایگزینی، امکان اضافه شدن یا حذف شدن کاراکترها را نیز در نظر می‌گیرد.


02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/14_lecture-pigeonhole-principle

اصل لانه کبوتری (Pigeonhole Principle) در تطبیق تقریبی توالی‌ها

خلاصه کلی

در تطبیق تقریبی (Approximate Matching) هدف پیدا کردن الگو (Pattern) در متن (Text) است، حتی زمانی که بین آن‌ها چند اختلاف وجود داشته باشد. مشکل اصلی این است که الگوریتم‌های تطبیق دقیق (Exact Matching) مانند Naive Matching، Boyer-Moore و روش‌های مبتنی بر ایندکس، فقط زمانی کار می‌کنند که الگو کاملاً با متن یکسان باشد.

در این درس، یک ایده مهم معرفی می‌شود که اجازه می‌دهد از همین الگوریتم‌های تطبیق دقیق برای حل مسئله تطبیق تقریبی استفاده کنیم. این ایده Pigeonhole Principle یا اصل لانه کبوتری نام دارد.

هدف یادگیری:

  • تبدیل مسئله تطبیق تقریبی به چند مسئله کوچک‌تر تطبیق دقیق
  • استفاده از الگوریتم‌های Exact Matching برای پیدا کردن تطبیق‌هایی با چند اختلاف
  • درک نقش تقسیم‌بندی الگو (Pattern Partitioning) در الگوریتم‌های Bioinformatics

مفاهیم کلیدی

1. Approximate Matching (تطبیق تقریبی)

تعریف ساده

تطبیق تقریبی یعنی پیدا کردن محل‌هایی که یک الگو در متن وجود دارد، حتی اگر چند تفاوت بین آن‌ها وجود داشته باشد.

توضیح دقیق

در داده‌های ژنومی، معمولاً خوانش‌ها (Reads) دقیقاً با ژنوم مرجع (Reference Genome) یکسان نیستند. دلیل این تفاوت‌ها می‌تواند شامل موارد زیر باشد:

  • خطاهای دستگاه توالی‌یابی (Sequencing Errors)
  • تفاوت‌های واقعی بین ژنوم فرد مورد مطالعه و ژنوم مرجع (Genetic Variation)

بنابراین، به جای تطبیق کاملاً دقیق، باید اجازه دهیم تعداد مشخصی اختلاف وجود داشته باشد.

کاربرد

در مسئله‌هایی مانند:

  • Read Alignment
  • Mapping DNA Reads
  • Variant Detection

استفاده می‌شود.


2. Partitioning of Pattern (تقسیم‌بندی الگو)

تعریف ساده

تقسیم یک الگو به چند بخش مستقل که مجموعاً کل الگو را تشکیل می‌دهند.

توضیح دقیق

فرض کنید الگو:

[ P ]

را به دو قسمت تقسیم کنیم:

[ P = u + v ]

که در آن:

  • u: بخش اول
  • v: بخش دوم

این بخش‌ها:

  • همپوشانی ندارند.
  • کل الگو را پوشش می‌دهند.

این بخش‌ها را Partitions می‌نامیم.


3. اصل لانه کبوتری (Pigeonhole Principle)

تعریف ساده

اگر الگویی با حداکثر k اختلاف در متن وجود داشته باشد، وقتی آن را به k+1 بخش تقسیم کنیم، حداقل یکی از این بخش‌ها باید بدون هیچ تغییری در متن ظاهر شود.


توضیح دقیق

فرض کنید می‌خواهیم تطبیقی با حداکثر:

[ k ]

تغییر پیدا کنیم.

الگو را به:

[ k+1 ]

قسمت تقسیم می‌کنیم.

مثلاً:

  • برای 1 اختلاف → تقسیم به 2 بخش
  • برای 3 اختلاف → تقسیم به 4 بخش
  • برای 10 اختلاف → تقسیم به 11 بخش

چرا این کار جواب می‌دهد؟

زیرا هر اختلاف می‌تواند حداکثر یک بخش را خراب کند.

اگر:

  • 4 اختلاف داشته باشیم.
  • الگو را به 5 بخش تقسیم کنیم.

چهار بخش ممکن است تغییر کنند، اما بخش پنجم نمی‌تواند تغییر کرده باشد.

پس حداقل یک بخش بدون اختلاف باقی می‌ماند.


مثال‌ها و تشبیه‌ها

مثال 1: یک اختلاف (k=1)

فرض کنید الگو:

[ P ]

به دو قسمت تقسیم شود:

P = [u][v]

اگر یک تغییر وجود داشته باشد:

حالت اول:

[u تغییر کرده][v سالم]

یا:

[u سالم][v تغییر کرده]

اما نمی‌توان هر دو قسمت را خراب کرد، چون فقط یک تغییر داریم.

بنابراین:

حداقل یکی از دو بخش دقیقاً در متن پیدا می‌شود.


مثال 2: سه اختلاف (k=3)

در این حالت:

[ k+1 = 4 ]

پس الگو را به چهار قسمت تقسیم می‌کنیم:

P = [P1][P2][P3][P4]

چهار تغییر می‌توانند حداکثر چهار قسمت را تحت تأثیر قرار دهند.

اما اگر یک تطبیق واقعی با حداکثر سه اختلاف وجود داشته باشد:

حداقل یکی از چهار قسمت بدون تغییر باقی می‌ماند.


الگوریتم استفاده از اصل لانه کبوتری

فرآیند کلی:

مرحله 1: تقسیم الگو

الگو را به:

[ k+1 ]

بخش تقسیم می‌کنیم.

مثلاً برای حداکثر 4 اختلاف:

P1 | P2 | P3 | P4 | P5

مرحله 2: اجرای Exact Matching

برای هر بخش:

  • از یک الگوریتم تطبیق دقیق استفاده می‌کنیم.
  • دنبال وقوع دقیق آن بخش در متن می‌گردیم.

الگوریتم می‌تواند باشد:

  • Naive Exact Matching
  • Boyer-Moore
  • Index-based Matching

مرحله 3: ایجاد Candidate Match

اگر یک بخش پیدا شد:

مثلاً:

P3

در متن پیدا شد.

این محل یک کاندید احتمالی برای تطبیق کامل الگو است.


مرحله 4: Verification (تأیید)

مانند روش‌های ایندکس:

  • فقط پیدا شدن یک بخش کافی نیست.
  • باید بررسی کنیم آیا کل الگو در اطراف آن محل با حداکثر k اختلاف وجود دارد یا خیر.

این مرحله:

Verification

نام دارد.


نکات مهم

  • الگوریتم‌های Exact Matching به تنهایی برای داده‌های زیستی کافی نیستند، زیرا خطا و تنوع ژنتیکی وجود دارد.
  • اصل لانه کبوتری یک پل بین Exact Matching و Approximate Matching ایجاد می‌کند.
  • برای تحمل k اختلاف، الگو باید به k+1 بخش تقسیم شود.
  • هر اختلاف می‌تواند یک بخش را خراب کند، اما نمی‌تواند تمام k+1 بخش را تغییر دهد.
  • پیدا شدن یک Partition فقط یک سرنخ است؛ مرحله Verification ضروری است.
  • این روش اجازه می‌دهد الگوریتم‌های سریع مانند Boyer-Moore برای تطبیق تقریبی نیز استفاده شوند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Approximate Matching تطبیق تقریبی پیدا کردن تطبیق با اجازه وجود اختلاف
Exact Matching تطبیق دقیق تطبیقی که هیچ اختلافی ندارد
Pattern (P) الگو توالی مورد جستجو
Text (T) متن توالی مرجع که جستجو در آن انجام می‌شود
Partition بخش‌بندی قسمتی از یک الگو که برای جستجو جدا می‌شود
Pigeonhole Principle اصل لانه کبوتری اصلی که تضمین می‌کند حداقل یک بخش بدون اختلاف باقی می‌ماند
Edit تغییر عملی مانند جایگزینی، حذف یا اضافه کردن کاراکتر
Verification تأیید بررسی نهایی اینکه آیا کل الگو تطبیق دارد
Mismatch عدم تطابق اختلاف یک کاراکتر بین دو توالی

خلاصه نهایی مرور سریع

  • تطبیق دقیق برای داده‌های ژنومی کافی نیست، زیرا Readها ممکن است خطا یا تفاوت ژنتیکی داشته باشند.
  • در Approximate Matching اجازه وجود چند اختلاف داده می‌شود.
  • برای استفاده از الگوریتم‌های Exact Matching در حالت تقریبی، از تقسیم‌بندی الگو استفاده می‌کنیم.
  • اگر حداکثر k اختلاف مجاز باشد، الگو را به k+1 بخش تقسیم می‌کنیم.
  • طبق اصل لانه کبوتری، حداقل یکی از این k+1 بخش‌ها بدون اختلاف باقی می‌ماند.
  • ابتدا هر بخش با یک الگوریتم Exact Matching جستجو می‌شود.
  • محل‌های پیدا شده فقط Candidate هستند و نیاز به Verification دارند.
  • این روش امکان استفاده از Naive Matching، Boyer-Moore و Indexها را در Approximate Matching فراهم می‌کند.

سوالات مرور

سوال 1: چرا Exact Matching برای Read Alignment کافی نیست؟

پاسخ:

زیرا توالی خوانش‌شده ممکن است به دلیل خطاهای Sequencing یا تفاوت ژنتیکی با Reference Genome کاملاً مشابه نباشد.


سوال 2: اصل لانه کبوتری در تطبیق تقریبی چه می‌گوید؟

پاسخ:

اگر الگویی با حداکثر k اختلاف در متن وجود داشته باشد، وقتی آن را به k+1 بخش تقسیم کنیم، حداقل یکی از بخش‌ها باید بدون اختلاف در متن ظاهر شود.


سوال 3: اگر اجازه 5 اختلاف داشته باشیم، الگو را به چند بخش تقسیم می‌کنیم؟

پاسخ:

طبق رابطه:

[ k+1 ]

باید به:

[ 5+1=6 ]

بخش تقسیم شود.


سوال 4: چرا بعد از پیدا کردن یک Partition هنوز نیاز به Verification داریم؟

پاسخ:

زیرا پیدا شدن یک بخش فقط نشان می‌دهد احتمال وجود تطبیق کامل وجود دارد. باید بررسی کنیم که کل Pattern با تعداد اختلاف مجاز در آن محل وجود دارد.


سوال 5: اصل لانه کبوتری چگونه باعث استفاده از Boyer-Moore در Approximate Matching می‌شود؟

پاسخ:

با تقسیم Pattern به چند بخش، می‌توان هر بخش را با Boyer-Moore به صورت دقیق پیدا کرد و سپس اطراف آن محل‌ها را برای تطبیق تقریبی بررسی کرد.


02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/15_practical-implementing-the-pigeonhole-principle

پیاده‌سازی اصل لانه کبوتری برای تطبیق تقریبی با الگوریتم Boyer-Moore

خلاصه کلی

در این درس عملی، الگوریتم Approximate Matching با استفاده از الگوریتم Boyer-Moore پیاده‌سازی می‌شود. ایده اصلی این است که با استفاده از اصل لانه کبوتری (Pigeonhole Principle)، مسئله تطبیق تقریبی را به چند مسئله کوچک‌تر Exact Matching تبدیل کنیم.

به جای اینکه کل الگو (Pattern) را با امکان وجود اختلاف بررسی کنیم، آن را به چند بخش تقسیم می‌کنیم و با استفاده از Boyer-Moore فقط بخش‌هایی را که باید کاملاً تطبیق داشته باشند پیدا می‌کنیم. سپس در مرحله Verification بررسی می‌کنیم که آیا کل الگو با تعداد اختلاف مجاز در آن محل وجود دارد یا خیر.

هدف یادگیری:

  • استفاده از Boyer-Moore برای Approximate Matching
  • پیاده‌سازی اصل لانه کبوتری در کدنویسی
  • درک مرحله Candidate Generation و Verification
  • مدیریت چندین تطبیق تکراری با استفاده از Set

مفاهیم کلیدی

1. Pigeonhole Principle (اصل لانه کبوتری)

تعریف ساده

اگر الگویی با حداکثر n اختلاف در متن وجود داشته باشد، با تقسیم آن به:

[ n+1 ]

بخش، حداقل یکی از این بخش‌ها باید بدون اختلاف در متن پیدا شود.


توضیح دقیق

فرض کنید:

  • Pattern = P
  • Maximum mismatches = n

ابتدا P را به:

[ n+1 ]

قطعه تقسیم می‌کنیم.

مثلاً:

اگر اجازه دو mismatch داشته باشیم:

[ n=2 ]

پس:

[ n+1=3 ]

بخش خواهیم داشت:

P = [P1][P2][P3]

طبق اصل لانه کبوتری، حداقل یکی از این سه قسمت باید دقیقاً در Text ظاهر شود.

بنابراین:

  • با Boyer-Moore هر بخش را جستجو می‌کنیم.
  • محل‌هایی که پیدا می‌شوند را بررسی می‌کنیم.
  • سپس کل Pattern را در اطراف آن محل Verification می‌کنیم.

2. Pattern Partitioning (تقسیم‌بندی الگو)

تعریف ساده

تقسیم Pattern به چند بخش کوچک‌تر برای تبدیل Approximate Matching به Exact Matching.


توضیح دقیق

طول هر بخش تقریباً برابر است با:

[ segment_length=\frac{|P|}{n+1} ]

اما طول Pattern همیشه مضرب دقیق n+1 نیست.

بنابراین:

  • بخش‌های ابتدایی طول تقریباً برابر دارند.
  • بخش آخر ممکن است کمی بزرگ‌تر یا کوچک‌تر شود.

برای جلوگیری از عبور از انتهای Pattern، در کد از محدود کردن اندیس پایان استفاده می‌شود.


3. Boyer-Moore Preprocessing (پیش‌پردازش Boyer-Moore)

تعریف ساده

مرحله‌ای که قبل از جستجو انجام می‌شود تا Boyer-Moore بتواند سریع‌تر تطبیق دهد.


توضیح دقیق

در این مرحله جدول‌های زیر ساخته می‌شوند:

Bad Character Rule

بررسی می‌کند اگر عدم تطابق رخ داد، چقدر می‌توان Pattern را جلو برد.

Good Suffix Rule

بر اساس بخش‌های تطبیق‌یافته انتهایی Pattern، پرش مناسب را تعیین می‌کند.

در این عملی، برای هر Partition از Pattern، یک پیش‌پردازش Boyer-Moore انجام می‌شود.


4. Candidate Generation (تولید کاندیدها)

تعریف ساده

پیدا کردن محل‌هایی که احتمال وجود تطبیق کامل Pattern در آن‌ها وجود دارد.


توضیح دقیق

برای هر Partition:

  1. آن بخش از Pattern انتخاب می‌شود.
  2. Boyer-Moore روی Text اجرا می‌شود.
  3. تمام محل‌هایی که آن Partition دقیقاً پیدا شده است ذخیره می‌شوند.

این محل‌ها هنوز پاسخ نهایی نیستند.

آن‌ها فقط:

Candidate Matches

هستند.


5. Verification (تأیید تطبیق)

تعریف ساده

بررسی اینکه آیا کل Pattern با تعداد اختلاف مجاز در محل پیدا شده قرار دارد یا خیر.


توضیح دقیق

وقتی یک Partition پیدا شد، باید بررسی کنیم:

  • قسمت قبل از Partition
  • خود Partition
  • قسمت بعد از Partition

آیا مجموع mismatchها کمتر یا مساوی مقدار مجاز است؟

اگر:

[ mismatches \leq n ]

باشد، آن محل یک تطبیق معتبر است.


6. Set برای حذف نتایج تکراری

تعریف ساده

ساختاری که هر موقعیت را فقط یک بار ذخیره می‌کند.


توضیح دقیق

ممکن است چند Partition مختلف یک Pattern را در یک محل پیدا کنند.

مثلاً:

برای:

[ n=2 ]

سه Partition داریم.

اگر Pattern دقیقاً در یک محل وجود داشته باشد:

  • هر سه Partition ممکن است همان محل را گزارش کنند.

اگر از List استفاده کنیم:

[5,5,5]

دریافت می‌کنیم.

اما با Set:

{5}

فقط یک نتیجه ذخیره می‌شود.


روند کلی الگوریتم

ورودی:

  • Pattern (P)
  • Text (T)
  • Maximum mismatches (n)

مرحله 1: تقسیم Pattern

Pattern به:

[ n+1 ]

بخش تقسیم می‌شود.


مرحله 2: جستجوی هر Partition

برای هر بخش:

  • Boyer-Moore اجرا می‌شود.
  • محل‌های تطبیق دقیق ذخیره می‌شوند.

مرحله 3: بررسی اطراف هر Hit

برای هر محل:

  • موقعیت شروع واقعی Pattern محاسبه می‌شود.
  • بررسی می‌شود که Pattern از ابتدا یا انتهای Text خارج نشده باشد.
  • تعداد mismatchها شمارش می‌شود.

مرحله 4: ذخیره نتیجه

اگر:

[ mismatches \leq n ]

باشد:

محل شروع Pattern به جواب اضافه می‌شود.


مثال عملی

فرض کنید:

Pattern:

P

و می‌خواهیم تا دو mismatch را قبول کنیم.

پس:

[ n=2 ]

و Pattern به سه بخش تقسیم می‌شود.

پس از اجرای الگوریتم:

نتیجه:

[0,5]

یعنی Pattern در دو موقعیت پیدا شده است.


بررسی موقعیت 0

دو اختلاف وجود دارد:

  • یک mismatch در ابتدای توالی
  • یک mismatch در انتهای توالی

پس:

[ mismatches=2 ]

مجاز است.


بررسی موقعیت 5

فقط یک mismatch وجود دارد.

پس:

[ mismatches=1 ]

این تطبیق نیز معتبر است.


اگر مقدار مجاز را کاهش دهیم:

حداکثر 1 mismatch:

فقط موقعیت 5 باقی می‌ماند.

حداکثر 0 mismatch:

هیچ نتیجه‌ای وجود ندارد، زیرا تطبیق کاملاً دقیق نداریم.


نکات مهم

  • الگوریتم Boyer-Moore ذاتاً برای Exact Matching طراحی شده است.
  • اصل لانه کبوتری اجازه می‌دهد Boyer-Moore در Approximate Matching نیز استفاده شود.
  • برای n mismatch، باید Pattern به n+1 بخش تقسیم شود.
  • هر Partition با Exact Matching بررسی می‌شود.
  • پیدا شدن Partition به معنی وجود قطعی Pattern نیست.
  • مرحله Verification ضروری است.
  • استفاده از Set باعث حذف نتایج تکراری می‌شود.
  • آخرین Partition ممکن است طول متفاوتی داشته باشد، زیرا طول Pattern همیشه بر n+1 بخش‌پذیر نیست.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Approximate Matching تطبیق تقریبی پیدا کردن Pattern با اجازه وجود اختلاف
Exact Matching تطبیق دقیق تطبیق بدون هیچ اختلاف
Boyer-Moore Algorithm الگوریتم بویِر-مور الگوریتم سریع جستجوی رشته
Pigeonhole Principle اصل لانه کبوتری تضمین وجود حداقل یک بخش بدون اختلاف
Partition بخش قسمتی از Pattern پس از تقسیم‌بندی
Segment قطعه بخش ایجاد شده از Pattern
Mismatch عدم تطابق اختلاف بین دو کاراکتر
Verification تأیید بررسی نهایی تطبیق کامل
Candidate Match تطبیق کاندید محل احتمالی تطبیق قبل از بررسی نهایی
Preprocessing پیش‌پردازش آماده‌سازی داده برای اجرای سریع الگوریتم
Bad Character Rule قانون کاراکتر بد قانون پرش در Boyer-Moore
Good Suffix Rule قانون پسوند خوب قانون پرش بر اساس پسوند تطبیق‌یافته

خلاصه نهایی مرور سریع

  • Approximate Matching با اجازه mismatch قابل حل است.
  • برای تبدیل آن به Exact Matching از Pigeonhole Principle استفاده می‌کنیم.
  • اگر حداکثر n اختلاف مجاز باشد، Pattern را به n+1 بخش تقسیم می‌کنیم.
  • هر بخش با Boyer-Moore جستجو می‌شود.
  • محل‌های پیدا شده Candidate هستند.
  • سپس کل Pattern با Verification بررسی می‌شود.
  • تعداد mismatchها باید کمتر یا مساوی مقدار مجاز باشد.
  • Set برای جلوگیری از ذخیره نتایج تکراری استفاده می‌شود.
  • Boyer-Moore با این روش می‌تواند در مسائل Read Alignment استفاده شود.

سوالات مرور

سوال 1: چرا Pattern را به n+1 بخش تقسیم می‌کنیم؟

پاسخ:

زیرا طبق اصل لانه کبوتری، اگر حداکثر n اختلاف وجود داشته باشد، حداقل یکی از n+1 بخش‌ها بدون اختلاف باقی می‌ماند و می‌توان آن را با Exact Matching پیدا کرد.


سوال 2: اگر اجازه 3 mismatch داشته باشیم، چند Partition ایجاد می‌کنیم؟

پاسخ:

طبق رابطه:

[ n+1 ]

داریم:

[ 3+1=4 ]

پس Pattern به چهار بخش تقسیم می‌شود.


سوال 3: چرا پس از پیدا کردن یک Partition باید Verification انجام دهیم؟

پاسخ:

زیرا پیدا شدن یک بخش فقط نشان می‌دهد احتمال وجود Pattern در آن ناحیه وجود دارد. باید بررسی کنیم که کل Pattern با تعداد mismatch مجاز تطبیق دارد.


سوال 4: چرا از Set به جای List استفاده می‌کنیم؟

پاسخ:

زیرا ممکن است چند Partition یک موقعیت یکسان را گزارش کنند. Set باعث می‌شود هر موقعیت فقط یک بار ذخیره شود.


سوال 5: نقش Boyer-Moore در این الگوریتم چیست؟

پاسخ:

Boyer-Moore برای پیدا کردن دقیق Partitionهای Pattern در Text استفاده می‌شود. سپس Verification بررسی می‌کند که آیا کل Pattern با اختلاف مجاز در آن محل وجود دارد یا خیر.


03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/01_module-3-introduction

عنوان درس: مقدمه‌ای بر فاصله ویرایشی، هم‌ترازی توالی و سرهم‌بندی ژنوم (Edit Distance, Alignment & Genome Assembly)

خلاصه کلی

در این بخش، مسیر یادگیری از مسئله هم‌ترازی خوانش‌ها (Read Alignment) به سمت مسائل پیشرفته‌تر تحلیل توالی‌های زیستی معرفی می‌شود.

تا این مرحله، روش‌های مختلفی برای تطبیق دقیق یا تقریبی توالی‌ها بررسی شده‌اند؛ اما در این بخش، تمرکز بر الگوریتم‌های برنامه‌نویسی پویا (Dynamic Programming) است که امکان محاسبه دقیق‌تر شباهت بین توالی‌ها را فراهم می‌کنند.

اهداف اصلی این درس:

  • آشنایی با الگوریتم‌های Dynamic Programming برای محاسبه فاصله ویرایشی (Edit Distance).

  • حل مسئله تطبیق تقریبی توالی‌ها با درنظر گرفتن:

    • جایگزینی‌ها (Substitution)
    • درج‌ها (Insertion)
    • حذف‌ها (Deletion)
  • محاسبه میزان شباهت انعطاف‌پذیر بین توالی‌های زیستی.

  • آماده‌سازی برای ورود به مسئله پیچیده‌تر سرهم‌بندی ژنوم (Genome Assembly).


مفاهیم کلیدی

1. Dynamic Programming (برنامه‌نویسی پویا)

تعریف ساده

روشی الگوریتمی برای حل مسائل پیچیده با تقسیم آن‌ها به زیرمسئله‌های کوچک‌تر و ذخیره نتایج محاسبات قبلی.

توضیح دقیق

در مسائل مقایسه توالی‌ها، بررسی تمام حالت‌های ممکن برای تبدیل یک رشته به رشته دیگر بسیار پرهزینه است.

Dynamic Programming با ساختن یک جدول از نتایج جزئی، به‌صورت سیستماتیک بهترین مسیر تبدیل یک توالی به توالی دیگر را پیدا می‌کند.

در زیست‌محاسبات، این روش برای موارد زیر استفاده می‌شود:

  • محاسبه Edit Distance
  • هم‌ترازی توالی‌ها (Sequence Alignment)
  • یافتن بخش‌های مشابه بین توالی‌ها

اهمیت

Dynamic Programming پایه بسیاری از ابزارهای تحلیل توالی مانند ابزارهای جست‌وجوی شباهت توالی است.


2. Edit Distance (فاصله ویرایشی)

تعریف ساده

حداقل تعداد تغییراتی که لازم است تا یک رشته به رشته دیگر تبدیل شود.

توضیح دقیق

تغییرات مجاز شامل سه نوع عملیات هستند:

  1. Substitution (جایگزینی) تغییر یک کاراکتر به کاراکتر دیگر.

    مثال:

A → G
  1. Insertion (درج) اضافه کردن یک کاراکتر جدید.

    مثال:

ACGT → ACGGT
  1. Deletion (حذف) حذف یک کاراکتر از رشته.

    مثال:

ACGT → ACT

فاصله ویرایشی کمینه تعداد این عملیات برای تبدیل یک توالی به توالی دیگر است.

اهمیت در زیست‌شناسی

در داده‌های توالی‌یابی، خوانش‌ها (Reads) معمولاً دقیقاً با ژنوم مرجع یکسان نیستند.

دلایل اختلاف:

  • خطاهای دستگاه Sequencing
  • تفاوت ژنتیکی بین افراد
  • وجود جهش‌ها

بنابراین Edit Distance معیار مناسبی برای اندازه‌گیری شباهت خوانش و ژنوم است.


3. Sequence Similarity (شباهت توالی)

تعریف ساده

اندازه‌گیری میزان شباهت بین دو توالی DNA، RNA یا پروتئین.

توضیح دقیق

در تحلیل زیستی، فقط یافتن تطابق کامل کافی نیست. باید بتوانیم توالی‌هایی را پیدا کنیم که:

  • بسیار شبیه هستند.
  • اما دارای تعدادی تغییر کوچک می‌باشند.

Dynamic Programming امکان تعریف معیارهای انعطاف‌پذیر برای شباهت را فراهم می‌کند.

برای مثال:

  • برخی تغییرات ممکن است جریمه بیشتری داشته باشند.
  • برخی تغییرات ممکن است در شرایط زیستی خاص مهم نباشند.

4. Approximate Matching with Insertions and Deletions

(تطبیق تقریبی با درج و حذف)

تعریف ساده

یافتن موقعیت‌هایی که یک الگوی مشخص با متن یا ژنوم با تعداد محدودی تغییر مطابقت دارد.

توضیح دقیق

روش‌های قبلی مانند:

  • Naive Matching
  • Boyer-Moore
  • Index-based Matching

بیشتر برای تطبیق‌هایی مناسب بودند که اختلاف‌ها محدود به Mismatch بودند.

اما در مسائل واقعی زیستی ممکن است:

  • یک باز اضافه شود.
  • یک باز حذف شود.

Dynamic Programming اجازه می‌دهد این نوع اختلاف‌ها نیز در محاسبات وارد شوند.


5. Local Sequence Alignment (هم‌ترازی موضعی توالی)

تعریف ساده

پیدا کردن بخش‌هایی از دو توالی که بیشترین شباهت را به یکدیگر دارند.

توضیح دقیق

گاهی دو توالی کامل شبیه نیستند، اما بخش‌هایی از آن‌ها شباهت زیادی دارند.

این مسئله در بسیاری از ابزارهای تحلیل زیستی مهم است.

مثال:

  • پیدا کردن نواحی مشابه در ژن‌ها
  • مقایسه پروتئین‌ها
  • شناسایی روابط تکاملی

یکی از ابزارهای مشهور در این زمینه:

BLAST (Basic Local Alignment Search Tool)

است.


6. Genome Assembly (سرهم‌بندی ژنوم)

تعریف ساده

فرآیند بازسازی یک ژنوم کامل از تعداد زیادی قطعه کوچک DNA که از طریق Sequencing تولید شده‌اند.

توضیح دقیق

در Read Alignment، ما یک ژنوم مرجع داریم و تلاش می‌کنیم مشخص کنیم هر Read در کجای آن قرار دارد.

اما در Genome Assembly:

  • ژنوم مرجع در اختیار نداریم.
  • باید ژنوم را از صفر بازسازی کنیم.

این مسئله بسیار دشوار است زیرا:

  • تعداد Readها بسیار زیاد است.
  • طول Readها کوتاه است.
  • بخش‌های تکراری در ژنوم وجود دارند.

اهمیت تاریخی

پروژه ژنوم انسان (Human Genome Project) مجبور بود این مشکل را حل کند، زیرا هدف آن ساخت اولین مرجع ژنوم انسان بود.


نکات مهم

  • الگوریتم‌های Exact Matching برای داده‌های واقعی زیستی کافی نیستند، زیرا Readها معمولاً دارای خطا یا تفاوت ژنتیکی هستند.
  • Edit Distance یک معیار عمومی‌تر از Hamming Distance است، زیرا علاوه بر جایگزینی، درج و حذف را نیز شامل می‌شود.
  • Dynamic Programming ابزار اصلی برای محاسبه Edit Distance و Alignment است.
  • بسیاری از ابزارهای زیست‌محاسباتی برای مقایسه توالی‌ها بر پایه Dynamic Programming ساخته شده‌اند.
  • Local Alignment به دنبال یافتن بخش‌های مشابه بین دو توالی است، نه الزاماً کل توالی.
  • BLAST یکی از ابزارهای مهم مبتنی بر ایده شباهت توالی است.
  • Genome Assembly زمانی استفاده می‌شود که ژنوم مرجع موجود نیست.
  • مسئله Assembly یکی از چالش‌برانگیزترین مسائل محاسباتی در ژنومیک است.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Dynamic Programming برنامه‌نویسی پویا روش حل مسئله با ذخیره نتایج زیرمسئله‌ها
Edit Distance فاصله ویرایشی حداقل تعداد تغییرات برای تبدیل یک رشته به رشته دیگر
Substitution جایگزینی تغییر یک کاراکتر با کاراکتر دیگر
Insertion درج اضافه کردن یک کاراکتر جدید
Deletion حذف حذف یک کاراکتر از رشته
Sequence Alignment هم‌ترازی توالی قرار دادن دو توالی برای مقایسه شباهت آن‌ها
Approximate Matching تطبیق تقریبی یافتن تطابق با اجازه وجود اختلاف
Local Alignment هم‌ترازی موضعی یافتن بخش‌های مشابه بین دو توالی
Genome Assembly سرهم‌بندی ژنوم بازسازی ژنوم از قطعات توالی‌یابی‌شده
Read Alignment هم‌ترازی خوانش‌ها یافتن محل قرارگیری Readها روی ژنوم مرجع
BLAST ابزار جستجوی شباهت توالی ابزار معروف برای یافتن توالی‌های مشابه

مثال‌ها و تشبیه‌ها

مثال فاصله ویرایشی

فرض کنید دو رشته داریم:

X = ACGT
Y = AGGT

برای تبدیل X به Y:

C → G

فقط یک جایگزینی لازم است.

پس:

Edit Distance = 1

تشبیه Genome Assembly

سرهم‌بندی ژنوم مانند حل کردن یک پازل بزرگ است.

  • هر Read یک قطعه کوچک از پازل است.
  • قطعات دارای بخش‌های مشترک هستند.
  • هدف پیدا کردن ترتیب صحیح قطعات و ساخت تصویر کامل ژنوم است.

تفاوت مهم:

در Read Alignment، تصویر کامل (ژنوم مرجع) را داریم و فقط جای قطعات را پیدا می‌کنیم.

در Genome Assembly، ابتدا باید خود تصویر را بسازیم.


خلاصه نهایی مرور سریع

  • Dynamic Programming روش اصلی برای حل مسائل پیچیده مقایسه توالی است.
  • Edit Distance تعداد کمینه تغییرات برای تبدیل یک توالی به توالی دیگر است.
  • Edit Distance شامل Substitution، Insertion و Deletion می‌شود.
  • برخلاف Hamming Distance، طول دو رشته در Edit Distance لازم نیست برابر باشد.
  • الگوریتم‌های تقریبی برای تحلیل داده‌های واقعی Sequencing ضروری هستند.
  • Local Alignment بخش‌های مشابه بین دو توالی را پیدا می‌کند.
  • BLAST یکی از ابزارهای معروف تحلیل شباهت توالی است.
  • Genome Assembly زمانی استفاده می‌شود که ژنوم مرجع وجود ندارد.
  • Assembly یکی از سخت‌ترین مسائل محاسباتی در ژنومیک است.
  • Dynamic Programming پایه بسیاری از روش‌های پیشرفته تحلیل توالی است.

سوالات مرور

1. چرا تطبیق دقیق (Exact Matching) برای داده‌های Sequencing کافی نیست؟

پاسخ: زیرا Readها ممکن است به دلیل خطاهای Sequencing یا تفاوت ژنتیکی فرد با ژنوم مرجع دارای اختلاف باشند.


2. تفاوت اصلی بین Hamming Distance و Edit Distance چیست؟

پاسخ: Hamming Distance فقط تعداد جایگزینی‌ها را حساب می‌کند و دو رشته باید طول برابر داشته باشند؛ اما Edit Distance علاوه بر جایگزینی، درج و حذف را نیز در نظر می‌گیرد و طول رشته‌ها می‌تواند متفاوت باشد.


3. Dynamic Programming چه کمکی به تحلیل توالی‌ها می‌کند؟

پاسخ: با ذخیره نتایج محاسبات قبلی، امکان محاسبه سریع فاصله ویرایشی و بهترین هم‌ترازی بین توالی‌ها را فراهم می‌کند.


4. تفاوت Read Alignment و Genome Assembly چیست؟

پاسخ: در Read Alignment، ژنوم مرجع داریم و محل Readها را پیدا می‌کنیم؛ اما در Genome Assembly، ژنوم مرجع نداریم و باید ژنوم را از Readها بازسازی کنیم.


5. چرا Genome Assembly مسئله دشواری است؟

پاسخ: زیرا باید یک ژنوم بسیار بزرگ را از میلیون‌ها قطعه کوتاه بدون داشتن نقشه مرجع بازسازی کنیم و وجود توالی‌های تکراری کار را پیچیده‌تر می‌کند.


03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/02_lecture-solving-the-edit-distance-problem

عنوان درس: حل مسئله فاصله ویرایشی با برنامه‌نویسی پویا (Solving the Edit Distance Problem)

خلاصه کلی

در این درس، یک روش جدید برای حل مسئله تطبیق تقریبی (Approximate Matching) معرفی می‌شود که برخلاف روش Pigeonhole Principle، به الگوریتم‌های تطبیق دقیق وابسته نیست و بر پایه‌ی Dynamic Programming و مفهوم Edit Distance کار می‌کند.

هدف این بخش:

  • درک تفاوت Hamming Distance و Edit Distance
  • معرفی ایده اصلی الگوریتم محاسبه Edit Distance
  • یادگیری رابطه بازگشتی (Recursive Formula) برای حل مسئله
  • آشنایی با پیاده‌سازی بازگشتی الگوریتم Edit Distance

این روش پایه بسیاری از مسائل مهم در تحلیل توالی‌های زیستی مانند:

  • Global Alignment
  • Local Alignment
  • Sequence Similarity Analysis

است.


مفاهیم کلیدی

1. Edit Distance (فاصله ویرایشی)

تعریف ساده

Edit Distance کمترین تعداد عملیات لازم برای تبدیل یک رشته (String) به رشته دیگر است.

عملیات مجاز:

  • Substitution (جایگزینی)
  • Insertion (درج)
  • Deletion (حذف)

توضیح دقیق

فرض کنید دو رشته داریم:

X = ACGT
Y = AGGT

برای تبدیل X به Y:

C → G

یک عملیات جایگزینی کافی است.

بنابراین:

Edit Distance = 1

اما اگر اجازه داشته باشیم علاوه بر جایگزینی، درج و حذف نیز انجام دهیم، ممکن است تعداد تغییرات کمتر شود.


اهمیت

در داده‌های زیستی، توالی‌ها معمولاً دقیقاً برابر نیستند.

دلایل اختلاف:

  • خطاهای Sequencing
  • تفاوت ژنتیکی افراد
  • جهش‌ها

بنابراین Edit Distance معیار مناسب‌تری برای اندازه‌گیری شباهت واقعی توالی‌ها است.


2. Hamming Distance (فاصله همینگ)

تعریف ساده

تعداد موقعیت‌هایی که دو رشته هم‌اندازه در آن‌ها با یکدیگر تفاوت دارند.


توضیح دقیق

برای محاسبه Hamming Distance:

  1. دو رشته را کنار هم قرار می‌دهیم.
  2. هر موقعیت را مقایسه می‌کنیم.
  3. تعداد اختلاف‌ها را می‌شماریم.

مثال:

X = ACGTA
Y = ACCGA

هر جایگاه متفاوت یک واحد به فاصله اضافه می‌کند.


تفاوت با Edit Distance

ویژگی Hamming Distance Edit Distance
طول رشته‌ها باید برابر باشد می‌تواند متفاوت باشد
عملیات مجاز فقط Substitution Substitution + Insertion + Deletion
انعطاف‌پذیری کمتر بیشتر

رابطه Hamming Distance و Edit Distance

اگر دو رشته طول یکسان داشته باشند:

[ EditDistance(X,Y) \leq HammingDistance(X,Y) ]

دلیل:

  • Hamming فقط اجازه جایگزینی می‌دهد.
  • Edit Distance علاوه بر آن، حذف و درج را نیز اجازه می‌دهد.

پس ممکن است مسیر کوتاه‌تری برای تبدیل دو رشته وجود داشته باشد.


مثال

فرض کنید دو رشته داریم که Hamming Distance آن‌ها برابر ۱۰ است.

اگر فقط جایگزینی مجاز باشد:

10 substitution

لازم است.

اما اگر اجازه حذف و درج داشته باشیم، ممکن است فقط با:

1 deletion + 1 insertion

به رشته دیگر برسیم.

پس:

Edit Distance = 2

3. کران پایین Edit Distance

مفهوم

اگر طول دو رشته متفاوت باشد، حداقل فاصله ویرایشی برابر اختلاف طول آن‌ها است.

فرمول:

[ EditDistance(X,Y) \geq |length(X)-length(Y)| ]


دلیل

فرض کنید:

X = AB

طول = 2

و:

Y = ABCD

طول = 4

قبل از اینکه بتوانیم محتوا را مشابه کنیم، حداقل باید دو کاراکتر اضافه کنیم.

پس:

Edit Distance ≥ 2

4. ایده اصلی الگوریتم Edit Distance

تعریف ساده

برای محاسبه فاصله دو رشته، ابتدا فاصله بین بخش‌های کوچک‌تر آن‌ها را محاسبه می‌کنیم.


Prefix-Based Approach (رویکرد مبتنی بر پیشوند)

فرض کنید دو رشته داریم:

X = α + C
Y = β + A

که:

  • α و β بخش‌های ابتدایی رشته‌ها هستند.
  • C و A آخرین کاراکترها هستند.

اگر بدانیم:

EditDistance(α,β)

چقدر است، می‌توانیم فاصله کل رشته‌ها را محاسبه کنیم.


5. رابطه بازگشتی Edit Distance

برای تبدیل:

αx → βy

سه حالت ممکن داریم:


حالت اول: جایگزینی یا تطبیق آخرین کاراکترها

ابتدا:

α → β

سپس:

x → y

هزینه:

[ ED(α,β)+δ(x,y) ]


حالت دوم: حذف یا درج

ابتدا:

αx → β

سپس:

اضافه کردن y

هزینه:

[ ED(αx,β)+1 ]


حالت سوم: مسیر برعکس

ابتدا:

α → βy

سپس:

اضافه کردن x

هزینه:

[ ED(α,βy)+1 ]


انتخاب بهترین مسیر

فاصله نهایی برابر کمینه سه حالت است:

[ ED(αx,βy)=min ]

از میان:

  1. تطبیق/جایگزینی
  2. حذف
  3. درج

6. Delta Function (تابع دلتا)

تعریف

تابعی برای مشخص کردن اینکه آیا دو کاراکتر برابر هستند یا نه.

فرمول:

[ δ(x,y) ]

اگر:

x == y

آنگاه:

δ = 0

یعنی هیچ جایگزینی لازم نیست.

اگر:

x != y

آنگاه:

δ = 1

یعنی یک جایگزینی لازم است.


7. Recursive Edit Distance (فاصله ویرایشی بازگشتی)

مفهوم

رابطه Edit Distance یک تابع بازگشتی است.

یعنی:

برای محاسبه فاصله دو رشته:

  • مسئله را به فاصله بین پیشوندهای کوچک‌تر تبدیل می‌کنیم.
  • همان تابع دوباره برای زیرمسئله‌ها فراخوانی می‌شود.

شرط توقف (Base Case)

اگر یکی از رشته‌ها خالی باشد:

ED("",X)=length(X)

زیرا تنها راه تبدیل رشته خالی به X، اضافه کردن تمام کاراکترهای X است.

مثال:

ED("",ABC)=3

نکات مهم

  • Hamming Distance فقط برای رشته‌های هم‌اندازه کاربرد دارد.

  • Edit Distance معیار عمومی‌تری برای مقایسه توالی‌ها است.

  • Edit Distance اجازه استفاده از سه عملیات را می‌دهد:

    • Substitution
    • Insertion
    • Deletion
  • برای رشته‌های هم‌اندازه:

[ EditDistance \leq HammingDistance ]

  • ایده اصلی Dynamic Programming این است که مسئله بزرگ را به فاصله بین Prefixها تبدیل کنیم.
  • رابطه بازگشتی Edit Distance بر اساس سه انتخاب ساخته شده است.
  • تابع Delta تعیین می‌کند آیا آخرین کاراکترها نیاز به جایگزینی دارند یا خیر.
  • پیاده‌سازی بازگشتی ساده است، اما در حالت فعلی مشکل کارایی دارد زیرا محاسبات تکراری انجام می‌دهد.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Edit Distance فاصله ویرایشی حداقل تعداد عملیات برای تبدیل یک رشته به رشته دیگر
Hamming Distance فاصله همینگ تعداد اختلاف موقعیت‌ها در دو رشته هم‌اندازه
Dynamic Programming برنامه‌نویسی پویا حل مسئله با ذخیره نتایج زیرمسئله‌ها
Approximate Matching تطبیق تقریبی یافتن تطابق با وجود اختلاف‌ها
Substitution جایگزینی تغییر یک کاراکتر به کاراکتر دیگر
Insertion درج اضافه کردن کاراکتر
Deletion حذف حذف کاراکتر
Prefix پیشوند بخش ابتدایی یک رشته
Recursive Function تابع بازگشتی تابعی که خودش را فراخوانی می‌کند
Delta Function تابع دلتا تابع تعیین‌کننده وجود یا عدم وجود اختلاف بین دو کاراکتر
Global Alignment هم‌ترازی سراسری مقایسه کل دو توالی
Local Alignment هم‌ترازی موضعی یافتن بخش‌های مشابه بین دو توالی

مثال‌ها و تشبیه‌ها

تشبیه تبدیل رشته‌ها

تبدیل یک رشته به رشته دیگر مانند ویرایش یک متن در نرم‌افزار Word است.

برای تبدیل:

CAT

به:

CART

می‌توان:

  • حرف A را نگه داشت.
  • حرف R را درج کرد.

پس:

Edit Distance = 1

تشبیه Dynamic Programming

فرض کنید می‌خواهید مسیر رسیدن به مقصد را پیدا کنید.

به جای بررسی همه مسیرهای ممکن، ابتدا بهترین مسیرهای کوچک‌تر را پیدا می‌کنید و از آن‌ها برای ساخت بهترین مسیر نهایی استفاده می‌کنید.


خلاصه نهایی مرور سریع

  • Edit Distance تعداد کمینه تغییرات برای تبدیل دو رشته است.
  • Hamming Distance فقط جایگزینی‌ها را حساب می‌کند.
  • Edit Distance شامل درج، حذف و جایگزینی است.
  • برای رشته‌های برابر:

[ ED \leq HD ]

  • Dynamic Programming روش اصلی حل Edit Distance است.
  • مسئله به مقایسه Prefixهای کوچک‌تر تقسیم می‌شود.
  • رابطه بازگشتی Edit Distance سه حالت دارد.
  • Delta Function مشخص می‌کند آیا آخرین کاراکترها برابر هستند.
  • اگر یکی از رشته‌ها خالی باشد، فاصله برابر طول رشته دیگر است.
  • الگوریتم بازگشتی ساده است اما محاسبات تکراری دارد.
  • نسخه بهینه‌تر در ادامه با Memoization یا جدول Dynamic Programming معرفی خواهد شد.

سوالات مرور

1. تفاوت اصلی Hamming Distance و Edit Distance چیست؟

پاسخ: Hamming Distance فقط تعداد جایگزینی‌ها را بین دو رشته هم‌اندازه محاسبه می‌کند، اما Edit Distance شامل جایگزینی، درج و حذف است و محدودیت طول ندارد.


2. چرا Edit Distance همیشه کمتر یا مساوی Hamming Distance است؟

پاسخ: زیرا Edit Distance علاوه بر جایگزینی، اجازه استفاده از حذف و درج را نیز می‌دهد؛ بنابراین ممکن است با تعداد عملیات کمتر به نتیجه برسد.


3. رابطه بازگشتی Edit Distance بر چه اساسی ساخته شده است؟

پاسخ: بررسی سه حالت:

  1. تطبیق یا جایگزینی آخرین کاراکترها
  2. حذف یک کاراکتر
  3. درج یک کاراکتر

و انتخاب کمینه هزینه این سه مسیر.


4. تابع Delta چه کاری انجام می‌دهد؟

پاسخ: بررسی می‌کند آیا دو کاراکتر آخر برابر هستند یا نه. اگر برابر باشند مقدار صفر و اگر متفاوت باشند مقدار یک برمی‌گرداند.


5. چرا نسخه بازگشتی ساده Edit Distance مشکل کارایی دارد؟

پاسخ: زیرا بسیاری از زیرمسئله‌ها چندین بار محاسبه می‌شوند و باعث افزایش شدید زمان اجرا می‌شود. در Dynamic Programming با ذخیره نتایج این مشکل حل می‌شود.


03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/03_lecture-using-dynamic-programming-for-edit-distance

حل مسئله فاصله ویرایشی با استفاده از برنامه‌ریزی پویا

Solving the Edit Distance Problem Using Dynamic Programming


خلاصه کلی

در این درس، روش محاسبه Edit Distance (فاصله ویرایشی) بین دو رشته با استفاده از Dynamic Programming (برنامه‌ریزی پویا) معرفی می‌شود.

در درس قبل، یک الگوریتم بازگشتی (Recursive) برای محاسبه فاصله ویرایشی طراحی شد، اما این روش به دلیل انجام محاسبات تکراری بسیار کند بود.

هدف این درس:

  • شناخت مشکل الگوریتم بازگشتی ساده
  • معرفی ایده اصلی Dynamic Programming
  • ساخت یک ماتریس برای ذخیره نتایج زیرمسئله‌ها
  • محاسبه سریع فاصله ویرایشی بین دو توالی
  • درک کاربرد این روش در تحلیل توالی‌های زیستی

مفاهیم کلیدی

1. Edit Distance (فاصله ویرایشی)

تعریف ساده

Edit Distance کمترین تعداد عملیات لازم برای تبدیل یک رشته به رشته دیگر است.

عملیات مجاز:

  • Substitution (جایگزینی): تغییر یک کاراکتر به کاراکتر دیگر
  • Insertion (درج): اضافه کردن یک کاراکتر
  • Deletion (حذف): حذف یک کاراکتر

توضیح دقیق

برای مثال، اگر دو رشته داشته باشیم:

X = GCG
Y = GCT

تنها یک جایگزینی لازم است:

GCG → GCT

بنابراین:

Edit Distance = 1

اما برای رشته‌هایی با طول بیشتر، پیدا کردن کمترین تعداد تغییرات ساده نیست و نیاز به الگوریتم دارد.


2. مشکل الگوریتم بازگشتی (Recursive Algorithm Problem)

ایده الگوریتم بازگشتی قبلی

برای پیدا کردن فاصله ویرایشی دو رشته:

  • مسئله اصلی به مسائل کوچک‌تر تقسیم می‌شود.
  • فاصله ویرایشی پیشوندهای کوتاه‌تر محاسبه می‌شود.
  • سپس جواب نهایی ساخته می‌شود.

اما مشکل اصلی:

محاسبات تکراری (Redundant Computation)

یک زیرمسئله ممکن است بارها محاسبه شود.

مثلاً:

EditDistance(A,B)

ممکن است چندین بار با همان ورودی فراخوانی شود، در حالی که نتیجه آن قبلاً محاسبه شده است.


نتیجه

الگوریتم بازگشتی:

  • از نظر منطقی درست است.
  • اما بسیار کند است.
  • برای رشته‌های متوسط نیز زمان زیادی نیاز دارد.

مثال:

محاسبه فاصله دو رشته کوتاه ممکن است حدود 30 ثانیه طول بکشد، زیرا هزاران بار یک محاسبه مشابه انجام می‌شود.


3. Dynamic Programming (برنامه‌ریزی پویا)

تعریف ساده

Dynamic Programming یک روش طراحی الگوریتم است که:

  1. مسئله بزرگ را به زیرمسئله‌های کوچک‌تر تقسیم می‌کند.
  2. نتیجه هر زیرمسئله را ذخیره می‌کند.
  3. از محاسبه دوباره همان زیرمسئله جلوگیری می‌کند.

ایده اصلی در Edit Distance

به جای استفاده از فراخوانی‌های بازگشتی، یک Matrix (ماتریس) ساخته می‌شود.

در این ماتریس:

  • هر خانه نشان‌دهنده فاصله ویرایشی بین دو پیشوند است.
  • هر مقدار فقط یک بار محاسبه می‌شود.

4. Edit Distance Matrix (ماتریس فاصله ویرایشی)

فرض کنید دو رشته داریم:

X
Y

ماتریس به شکل زیر ساخته می‌شود:

  • سطرها → کاراکترهای X
  • ستون‌ها → کاراکترهای Y

همچنین اولین سطر و ستون مربوط به:

ε

هستند.

ε یعنی رشته خالی (Empty String).


معنی هر خانه ماتریس

هر خانه:

D[i][j]

نشان‌دهنده:

فاصله ویرایشی بین پیشوندی از X با طول i و پیشوندی از Y با طول j

است.

مثلاً:

اگر:

X = GCG
Y = GCT

خانه مربوط به این دو پیشوند:

GCG
GCT

مقدار:

1

خواهد داشت.


5. رابطه بازگشتی Edit Distance

برای پر کردن هر خانه، سه حالت بررسی می‌شود:

فرض کنیم:

X = α + x
Y = β + y

یعنی:

  • α و β پیشوندهای قبلی هستند.
  • x و y آخرین کاراکترها هستند.

فاصله ویرایشی برابر است با کمینه سه حالت:


حالت اول: جایگزینی یا تطبیق (Diagonal)

ابتدا فاصله:

EditDistance(α, β)

را داریم.

سپس:

  • اگر x و y برابر باشند → هزینه اضافه صفر است.
  • اگر متفاوت باشند → یک جایگزینی لازم است.

این هزینه با تابع:

δ(x,y)

نمایش داده می‌شود.

تعریف:

δ(x,y)=0  اگر x=y

δ(x,y)=1  اگر x≠y

پس:

D[i-1][j-1] + δ(x,y)

حالت دوم: حذف (Deletion)

ابتدا رشته اول را کوتاه‌تر می‌کنیم:

α+x → β

سپس یک کاراکتر اضافه می‌کنیم.

هزینه:

D[i][j-1] + 1

حالت سوم: درج (Insertion)

برعکس حالت قبل:

α → β+y

هزینه:

D[i-1][j] + 1

در نهایت:

[ D[i][j] = min \begin{cases} D[i-1][j-1]+\delta(x,y)
D[i][j-1]+1
D[i-1][j]+1 \end{cases} ]


6. مقداردهی اولیه ماتریس

برای اولین سطر و ستون:

فاصله بین رشته خالی و یک رشته دیگر برابر طول آن رشته است.

مثلاً:

EditDistance("", "ABC")

برابر است با:

3

زیرا باید سه کاراکتر اضافه کنیم.

بنابراین:

اولین ستون:

0
1
2
3
4
...

اولین ردیف:

0
1
2
3
4
...

قرار می‌گیرد.


7. مزیت Dynamic Programming

روش بازگشتی:

  • یک زیرمسئله را بارها حل می‌کند.
  • زمان اجرا بسیار زیاد است.

روش Dynamic Programming:

  • هر زوج پیشوند فقط یک بار محاسبه می‌شود.
  • نتیجه در ماتریس ذخیره می‌شود.
  • سرعت بسیار بیشتر است.

نکات مهم

  • Hamming Distance فقط برای رشته‌هایی با طول برابر کاربرد دارد.
  • Edit Distance عمومی‌تر است و درج، حذف و جایگزینی را شامل می‌شود.
  • برای رشته‌های هم‌طول:

[ EditDistance \leq HammingDistance ]

زیرا Edit Distance اجازه عملیات بیشتری می‌دهد.

  • اگر دو رشته طول متفاوت داشته باشند:

[ EditDistance \geq |Length(X)-Length(Y)| ]

زیرا حداقل باید اختلاف طول جبران شود.

  • Dynamic Programming با ذخیره نتایج قبلی، مشکل محاسبات تکراری Recursive را حل می‌کند.
  • همین روش پایه بسیاری از الگوریتم‌های مقایسه توالی‌های زیستی است.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Edit Distance فاصله ویرایشی کمترین تعداد عملیات لازم برای تبدیل یک رشته به رشته دیگر
Dynamic Programming برنامه‌ریزی پویا روش حل مسئله با ذخیره نتایج زیرمسئله‌ها
Recursive Algorithm الگوریتم بازگشتی الگوریتمی که خودش را با ورودی کوچک‌تر فراخوانی می‌کند
Redundant Computation محاسبه تکراری انجام دوباره محاسباتی که قبلاً انجام شده است
Matrix ماتریس ساختاری دوبعدی برای ذخیره فاصله پیشوندها
Prefix پیشوند بخش ابتدایی یک رشته
Empty String (ε) رشته خالی رشته‌ای بدون هیچ کاراکتر
Substitution جایگزینی تغییر یک کاراکتر به کاراکتر دیگر
Insertion درج اضافه کردن یک کاراکتر
Deletion حذف حذف یک کاراکتر
Delta Function (δ) تابع دلتا تعیین می‌کند دو کاراکتر برابر هستند یا نه

مثال‌ها و تشبیه‌ها

مثال 1: مقایسه دو رشته

فرض کنید:

X = GCG
Y = GCT

برای تبدیل X به Y:

GCG
GCT

فقط حرف آخر تغییر می‌کند:

C → T

پس:

Edit Distance = 1

مثال 2: تفاوت Hamming و Edit Distance

دو رشته هم‌طول ممکن است:

Hamming Distance = 10

داشته باشند.

اما اگر اجازه درج و حذف داشته باشیم، شاید فقط دو تغییر کافی باشد:

Edit Distance = 2

زیرا حذف و درج می‌توانند باعث هم‌تراز شدن بهتر رشته‌ها شوند.


خلاصه نهایی مرور سریع

  • Edit Distance کمترین تعداد درج، حذف و جایگزینی برای تبدیل یک رشته به رشته دیگر است.
  • Hamming Distance فقط تعداد جایگزینی‌ها را حساب می‌کند.
  • الگوریتم بازگشتی ساده Edit Distance بسیار کند است زیرا محاسبات تکراری انجام می‌دهد.
  • Dynamic Programming با ذخیره نتایج زیرمسئله‌ها مشکل تکرار را حل می‌کند.
  • ماتریس Edit Distance شامل فاصله بین تمام پیشوندهای دو رشته است.
  • مقدار خانه پایین-راست ماتریس، فاصله ویرایشی کل دو رشته است.
  • هر خانه با بررسی سه حالت درج، حذف و جایگزینی پر می‌شود.
  • فاصله بین رشته خالی و یک رشته دیگر برابر طول رشته دیگر است.
  • Dynamic Programming یکی از تکنیک‌های مهم در طراحی الگوریتم‌های زیستی است.
  • این روش در تحلیل توالی‌های DNA و پروتئین کاربرد گسترده دارد.

سوالات مرور

سوال 1: تفاوت اصلی Hamming Distance و Edit Distance چیست؟

پاسخ: Hamming Distance فقط تعداد جایگزینی‌ها را بین دو رشته هم‌طول محاسبه می‌کند، اما Edit Distance علاوه بر جایگزینی، درج و حذف را نیز اجازه می‌دهد و برای رشته‌هایی با طول متفاوت هم قابل استفاده است.


سوال 2: چرا الگوریتم بازگشتی Edit Distance کند است؟

پاسخ: زیرا بسیاری از زیرمسئله‌ها چندین بار با همان ورودی محاسبه می‌شوند و الگوریتم نتیجه‌های قبلی را ذخیره نمی‌کند.


سوال 3: ایده اصلی Dynamic Programming چیست؟

پاسخ: تقسیم مسئله به زیرمسئله‌های کوچک‌تر، ذخیره جواب آن‌ها و استفاده دوباره از نتایج ذخیره‌شده برای جلوگیری از محاسبات تکراری.


سوال 4: هر خانه در ماتریس Edit Distance چه چیزی را نشان می‌دهد؟

پاسخ: فاصله ویرایشی بین دو پیشوند مشخص از دو رشته اصلی.


سوال 5: چرا اولین سطر و ستون ماتریس با اعداد 0،1،2،3,... پر می‌شوند؟

پاسخ: زیرا تبدیل رشته خالی به یک رشته با طول n نیازمند n عملیات درج است.


03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/04_practical-implementing-dynamic-programming-for-edit-distance

پیاده‌سازی برنامه‌ریزی پویا برای محاسبه فاصله ویرایشی

Implementing Dynamic Programming for Edit Distance


خلاصه کلی

در این درس، الگوریتم Edit Distance (فاصله ویرایشی) با استفاده از روش Dynamic Programming (برنامه‌ریزی پویا) در پایتون پیاده‌سازی می‌شود.

در درس‌های قبل، نسخه بازگشتی (Recursive) الگوریتم فاصله ویرایشی معرفی شد، اما این روش به دلیل محاسبات تکراری بسیار کند بود.

هدف این درس:

  • تبدیل الگوریتم بازگشتی Edit Distance به نسخه Dynamic Programming

  • ساخت ماتریسی برای ذخیره نتایج محاسبات قبلی

  • پر کردن ماتریس با استفاده از سه حالت:

    • حذف (Deletion)
    • درج (Insertion)
    • جایگزینی (Substitution)
  • مقایسه سرعت الگوریتم بازگشتی و برنامه‌ریزی پویا


مفاهیم کلیدی


1. Dynamic Programming (برنامه‌ریزی پویا)

تعریف ساده

Dynamic Programming روشی برای حل مسائل است که در آن:

  1. مسئله به زیرمسئله‌های کوچک‌تر تقسیم می‌شود.
  2. جواب هر زیرمسئله ذخیره می‌شود.
  3. در صورت نیاز دوباره از همان جواب استفاده می‌شود.

کاربرد در Edit Distance

برای محاسبه فاصله ویرایشی دو رشته:

به جای اینکه بارها فاصله بین پیشوندهای مشابه را محاسبه کنیم، یک ماتریس ایجاد می‌کنیم و نتایج را ذخیره می‌کنیم.

این کار باعث می‌شود هر زیرمسئله فقط یک بار حل شود.


2. Edit Distance Matrix (ماتریس فاصله ویرایشی)

تعریف

یک ماتریس دوبعدی به نام:

[ D ]

ساخته می‌شود.

ابعاد ماتریس:

[ (length(x)+1) \times (length(y)+1) ]

است.

دلیل اضافه کردن 1:

زیرا باید حالت رشته خالی (ε) را نیز در نظر بگیریم.


مفهوم هر خانه ماتریس

هر خانه:

[ D[i][j] ]

نشان‌دهنده فاصله ویرایشی بین:

  • پیشوندی از رشته x با طول i
  • پیشوندی از رشته y با طول j

است.

در پایان:

خانه پایین-راست ماتریس:

[ D[len(x)][len(y)] ]

فاصله ویرایشی کامل دو رشته را نشان می‌دهد.


3. مقداردهی اولیه ماتریس

اولین ستون

اولین ستون نشان‌دهنده تبدیل یک پیشوند از رشته x به رشته خالی است.

مثلاً:

تبدیل:

ABC

به:

""

نیازمند حذف سه کاراکتر است.

بنابراین:

0
1
2
3
...

در ستون اول قرار می‌گیرد.


اولین ردیف

به همین شکل، تبدیل رشته خالی به یک رشته نیازمند عملیات درج است.

مثلاً:

""
→
ABC

نیازمند سه درج است.

پس اولین ردیف نیز:

0 1 2 3 ...

خواهد بود.


4. پر کردن ماتریس Edit Distance

برای محاسبه هر خانه، سه مسیر ممکن بررسی می‌شود.


حالت اول: حرکت افقی (Horizontal)

حرکت از خانه سمت چپ نشان‌دهنده:

Insertion (درج)

است.

یعنی یک کاراکتر از رشته y اضافه شده است.

فرمول:

[ D[i][j-1]+1 ]


حالت دوم: حرکت عمودی (Vertical)

حرکت از خانه بالایی نشان‌دهنده:

Deletion (حذف)

است.

یعنی یک کاراکتر از رشته x حذف شده است.

فرمول:

[ D[i-1][j]+1 ]


حالت سوم: حرکت قطری (Diagonal)

حرکت قطری نشان‌دهنده:

  • تطبیق دو کاراکتر
  • یا جایگزینی یک کاراکتر

است.

اگر:

[ x[i-1]=y[j-1] ]

باشد:

هزینه تغییر صفر است:

[ D[i-1][j-1] ]

اما اگر متفاوت باشند:

یک جایگزینی لازم است:

[ D[i-1][j-1]+1 ]


انتخاب بهترین مقدار

برای هر خانه:

سه مقدار بالا محاسبه می‌شوند و کوچک‌ترین مقدار انتخاب می‌شود:

[ D[i][j]=min(horizontal, vertical, diagonal) ]


5. پیاده‌سازی الگوریتم در پایتون

مراحل اصلی تابع:


مرحله 1: ایجاد ماتریس

یک ماتریس صفر ساخته می‌شود:

D = matrix of zeros

با اندازه:

(len(x)+1) × (len(y)+1)

مرحله 2: مقداردهی ردیف و ستون اول

0,1,2,3,...

قرار داده می‌شود.


مرحله 3: پیمایش ماتریس

ماتریس:

  • ردیف به ردیف
  • ستون به ستون

پر می‌شود.

برای هر سلول:

  • هزینه حذف
  • هزینه درج
  • هزینه جایگزینی

محاسبه شده و کمینه انتخاب می‌شود.


مرحله 4: استخراج جواب نهایی

پس از کامل شدن ماتریس:

آخرین خانه بازگردانده می‌شود:

D[-1][-1]

این مقدار همان Edit Distance دو رشته است.


مقایسه الگوریتم بازگشتی و Dynamic Programming

الگوریتم بازگشتی

ویژگی‌ها:

  • ساده‌تر برای پیاده‌سازی
  • اما بسیار کند
  • دارای محاسبات تکراری زیاد

مثال:

برای دو رشته حدود 10 کاراکتری:

زمان اجرا:

حدود 5 ثانیه


الگوریتم Dynamic Programming

ویژگی‌ها:

  • هر زیرمسئله فقط یک بار حل می‌شود.
  • نتایج ذخیره می‌شوند.
  • بسیار سریع‌تر است.

زمان اجرا در مثال:

حدود:

[ 200 \mu s ]

(حدود 200 میکروثانیه)


نکات مهم

  • ماتریس Dynamic Programming جایگزین درخت بزرگ فراخوانی‌های بازگشتی می‌شود.

  • هر خانه ماتریس یک زیرمسئله مستقل را ذخیره می‌کند.

  • سه حرکت اصلی در ماتریس معادل سه عملیات ویرایشی هستند:

    • افقی → درج
    • عمودی → حذف
    • قطری → تطبیق یا جایگزینی
  • مقدار خانه پایین-راست، فاصله ویرایشی نهایی است.

  • Dynamic Programming باعث کاهش شدید زمان اجرا می‌شود.

  • این روش پایه بسیاری از الگوریتم‌های مقایسه توالی‌های DNA و پروتئین است.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Dynamic Programming برنامه‌ریزی پویا روش ذخیره نتایج زیرمسئله‌ها برای جلوگیری از محاسبه دوباره
Edit Distance فاصله ویرایشی تعداد کمینه عملیات برای تبدیل یک رشته به رشته دیگر
Recursive Algorithm الگوریتم بازگشتی الگوریتمی که خودش را با ورودی کوچک‌تر فراخوانی می‌کند
Matrix ماتریس ساختار دوبعدی برای ذخیره فاصله‌ها
Prefix پیشوند بخش ابتدایی یک رشته
Insertion درج اضافه کردن یک کاراکتر
Deletion حذف حذف یک کاراکتر
Substitution جایگزینی تغییر یک کاراکتر به کاراکتر دیگر
Horizontal Move حرکت افقی مسیر متناظر با درج
Vertical Move حرکت عمودی مسیر متناظر با حذف
Diagonal Move حرکت قطری مسیر متناظر با تطبیق یا جایگزینی
Empty String (ε) رشته خالی رشته بدون هیچ کاراکتری

مثال‌ها و تشبیه‌ها

مثال مقایسه سرعت

دو رشته نسبتاً مشابه:

  • الگوریتم بازگشتی:
حدود 5 ثانیه
  • الگوریتم Dynamic Programming:
حدود 200 میکروثانیه

هر دو نتیجه یکسانی تولید می‌کنند:

Edit Distance = 3

اما روش Dynamic Programming بسیار سریع‌تر است.


دلیل Edit Distance = 3 در مثال

تغییرات مورد نیاز شامل:

  1. تغییر یک حرف بزرگ و کوچک
  2. درج یک فاصله (Space)
  3. درج یک حرف دیگر

مجموع:

3 تغییر

خلاصه نهایی مرور سریع

  • الگوریتم Recursive برای Edit Distance به دلیل محاسبات تکراری کند است.
  • Dynamic Programming با ذخیره نتایج قبلی این مشکل را حل می‌کند.
  • ماتریس D شامل فاصله ویرایشی تمام پیشوندهای دو رشته است.
  • اندازه ماتریس برابر (len(x)+1) × (len(y)+1) است.
  • ردیف و ستون اول مربوط به تبدیل رشته خالی و با طول رشته مقداردهی می‌شوند.
  • هر خانه با بررسی سه حالت درج، حذف و جایگزینی پر می‌شود.
  • مقدار نهایی Edit Distance در گوشه پایین-راست ماتریس قرار دارد.
  • Dynamic Programming سرعت محاسبه را از چند ثانیه به کسری از میلی‌ثانیه کاهش می‌دهد.
  • این روش یکی از ابزارهای مهم در تحلیل توالی‌های زیستی است.

سوالات مرور

سوال 1: چرا نسخه بازگشتی Edit Distance کند است؟

پاسخ: زیرا یک زیرمسئله ممکن است بارها با همان ورودی محاسبه شود و الگوریتم نتیجه‌های قبلی را ذخیره نمی‌کند.


سوال 2: چرا اندازه ماتریس Edit Distance یک واحد بزرگ‌تر از طول رشته‌هاست؟

پاسخ: زیرا باید حالت رشته خالی (ε) نیز در محاسبات وجود داشته باشد.


سوال 3: سه مسیر اصلی برای پر کردن یک خانه ماتریس چه مفهومی دارند؟

پاسخ:

  • حرکت افقی → درج یک کاراکتر
  • حرکت عمودی → حذف یک کاراکتر
  • حرکت قطری → تطبیق یا جایگزینی

سوال 4: جواب نهایی Edit Distance در کدام قسمت ماتریس قرار دارد؟

پاسخ: در آخرین خانه ماتریس، یعنی خانه پایین-راست:

[ D[len(x)][len(y)] ]


سوال 5: مهم‌ترین مزیت Dynamic Programming نسبت به روش بازگشتی چیست؟

پاسخ: جلوگیری از محاسبات تکراری با ذخیره نتایج زیرمسئله‌ها، که باعث افزایش چشمگیر سرعت اجرا می‌شود.


03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/05_lecture-a-new-solution-to-approximate-matching

حل جدید برای مسئله تطبیق تقریبی (A New Solution to Approximate Matching)

خلاصه کلی

در این درس، از الگوریتم Edit Distance با استفاده از Dynamic Programming برای حل مسئله Approximate Matching (تطبیق تقریبی) استفاده می‌شود.

در روش‌های قبلی مانند Pigeonhole Principle، برای یافتن تطبیق‌های تقریبی ابتدا بخش‌هایی از الگو (Pattern) را با الگوریتم‌های تطبیق دقیق پیدا می‌کردیم. اما روش جدید مستقیماً از برنامه‌ریزی پویا استفاده می‌کند و می‌تواند:

  • اختلاف‌های جایگزینی (Substitution / Mismatch)
  • درج (Insertion)
  • حذف (Deletion)

را هم‌زمان مدیریت کند.

هدف این بخش یادگیری این است که چگونه با تغییر کوچک در الگوریتم Edit Distance، بتوانیم محل وقوع تقریبی یک الگو P را در یک متن T پیدا کنیم و سپس با استفاده از Traceback محل دقیق و شکل هم‌ترازی (Alignment) را استخراج کنیم.


مفاهیم کلیدی

1. Approximate Matching (تطبیق تقریبی)

تعریف ساده

یافتن محل‌هایی در یک متن که یک الگو با تعداد مشخصی اختلاف در آن‌ها ظاهر می‌شود.

توضیح دقیق

در تطبیق دقیق (Exact Matching) انتظار داریم:

[ P = T ]

اما در داده‌های زیستی مانند توالی‌های DNA، معمولاً اختلاف وجود دارد، زیرا:

  • خطاهای Sequencing رخ می‌دهند.
  • ژنوم نمونه با Reference Genome کاملاً یکسان نیست.

بنابراین به جای جستجوی تطبیق کاملاً یکسان، دنبال تطبیق‌هایی با حداکثر تعداد مشخصی تغییر هستیم.

اهمیت

این روش برای مسائل زیر مهم است:

  • Read Alignment
  • مقایسه توالی‌های DNA
  • تحلیل شباهت توالی‌ها

2. Dynamic Programming for Edit Distance

برنامه‌ریزی پویا برای فاصله ویرایشی

تعریف ساده

Dynamic Programming روشی الگوریتمی است که یک مسئله بزرگ را به مسائل کوچک‌تر تقسیم می‌کند و پاسخ مسائل کوچک را ذخیره می‌کند تا دوباره محاسبه نشوند.

مشکل روش Recursive قبلی

در روش بازگشتی (Recursive)، برای محاسبه فاصله ویرایشی دو رشته:

  • مرتباً همان زیرمسئله‌ها دوباره محاسبه می‌شدند.
  • زمان اجرا بسیار زیاد می‌شد.

مثلاً یک جفت prefix ممکن بود هزاران بار دوباره بررسی شود.

راه‌حل

یک ماتریس ایجاد می‌کنیم که:

  • هر خانه نشان‌دهنده فاصله ویرایشی بین دو prefix است.
  • هر مقدار فقط یک بار محاسبه می‌شود.

این کار باعث افزایش شدید سرعت می‌شود.


3. Matrix Representation (نمایش ماتریسی)

برای Approximate Matching یک ماتریس جدید تعریف می‌کنیم:

  • سطرها (Rows): کاراکترهای Pattern یعنی P
  • ستون‌ها (Columns): کاراکترهای Text یعنی T

هر خانه:

[ D[i][j] ]

نشان‌دهنده فاصله ویرایشی بین:

  • پیشوندی از Pattern تا موقعیت i
  • پیشوندی از Text تا موقعیت j

است.


4. تفاوت مقداردهی اولیه ماتریس در Edit Distance و Approximate Matching

یکی از مهم‌ترین تغییرات نسبت به Edit Distance معمولی، مقداردهی ردیف اول است.

در Edit Distance معمولی:

ردیف و ستون اول:

0 1 2 3 4 ...

زیرا فاصله یک رشته خالی با رشته‌ای به طول n برابر n است.


در Approximate Matching:

ستون اول:

همان مقدار قبلی:

0
1
2
3
4
...

زیرا هنوز باید فاصله از رشته خالی را محاسبه کنیم.

ردیف اول:

تماماً صفر:

0 0 0 0 0 ...

دلیل:

ما نمی‌دانیم Pattern در کجای Text شروع می‌شود.

اگر ردیف اول را مانند Edit Distance مقداردهی کنیم، الگوریتم به یک موقعیت خاص در Text تمایل پیدا می‌کند.

قرار دادن صفرها باعث می‌شود:

  • همه Offsetهای ممکن در Text برابر در نظر گرفته شوند.
  • الگوریتم بتواند هر نقطه‌ای از Text را به عنوان شروع احتمالی بررسی کند.

5. Filling the Matrix (پر کردن ماتریس)

پس از مقداردهی اولیه، ماتریس مانند Edit Distance معمولی پر می‌شود.

برای هر خانه سه مسیر ممکن وجود دارد:


مسیر 1: حرکت افقی (Horizontal)

از خانه سمت چپ می‌آییم.

معادل:

  • حذف یک کاراکتر از Text
  • Insertion در Pattern

هزینه:

[ D[i][j-1]+1 ]


مسیر 2: حرکت عمودی (Vertical)

از خانه بالایی می‌آییم.

معادل:

  • حذف یک کاراکتر از Pattern
  • Deletion

هزینه:

[ D[i-1][j]+1 ]


مسیر 3: حرکت قطری (Diagonal)

از خانه بالا-چپ می‌آییم.

اگر کاراکترها برابر باشند:

[ \Delta(x,y)=0 ]

هزینه اضافه ندارد.

اگر متفاوت باشند:

[ \Delta(x,y)=1 ]

یعنی یک substitution داریم.


در نهایت:

[ D[i][j]=min(horizontal,vertical,diagonal) ]


6. Detecting Approximate Matches

تشخیص تطبیق‌های تقریبی

پس از پر کردن ماتریس، برای پیدا کردن تطبیق Pattern در Text:

به آخرین ردیف ماتریس نگاه می‌کنیم.

دلیل:

آخرین ردیف نشان‌دهنده تطبیق کل Pattern با بخش‌های مختلف Text است.

مثلاً اگر در آخرین ردیف مقدار:

2

وجود داشته باشد:

یعنی Pattern با یک زیررشته از Text با فاصله ویرایشی ۲ تطبیق دارد.

کمترین مقدار در آخرین ردیف:

  • بهترین تطبیق تقریبی را نشان می‌دهد.

7. Traceback (بازگشت مسیر)

تعریف ساده

Traceback روشی برای پیدا کردن مسیر حرکت در ماتریس است که نشان می‌دهد چگونه به مقدار نهایی رسیده‌ایم.

توضیح دقیق

بعد از پیدا کردن مقدار کمینه در آخرین ردیف:

  • از آن خانه به عقب حرکت می‌کنیم.
  • بررسی می‌کنیم که از کدام سلول آمده‌ایم.

حرکت‌ها معنی زیستی دارند:

حرکت معنی
قطری Match یا Substitution
افقی Insertion / Deletion
عمودی Gap

با دنبال کردن مسیر، شکل Alignment مشخص می‌شود.


8. Alignment Reconstruction

بازسازی هم‌ترازی

Traceback علاوه بر محل تطبیق، نشان می‌دهد:

  • اختلاف‌ها کجا هستند.
  • Gapها کجا ایجاد شده‌اند.
  • کدام بازها Match هستند.

مثلاً:

Pattern : ACG-T
Text    : ACGGT

وجود یک Gap نشان‌دهنده یک Insertion یا Deletion است.


نکات مهم

  • Edit Distance یک معیار انعطاف‌پذیر برای اندازه‌گیری تفاوت دو توالی است.
  • برخلاف Hamming Distance، طول دو رشته لازم نیست برابر باشد.
  • Dynamic Programming مشکل محاسبات تکراری در روش Recursive را حل می‌کند.
  • در Approximate Matching، تنها تغییر مهم نسبت به Edit Distance معمولی، مقداردهی ردیف اول ماتریس است.
  • مقدار کمینه در آخرین ردیف نشان‌دهنده بهترین محل تطبیق Pattern در Text است.
  • Traceback مسیر رسیدن به مقدار نهایی را مشخص می‌کند.
  • هر مسیر در ماتریس یک Alignment ممکن را نشان می‌دهد.
  • الگوریتم Edit Distance بسیار انعطاف‌پذیر است، اما نسبت به الگوریتم‌هایی مانند Boyer-Moore کندتر است.
  • در کاربردهای واقعی، معمولاً Edit Distance همراه با Indexing یا Pigeonhole Principle استفاده می‌شود.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Approximate Matching تطبیق تقریبی پیدا کردن تطبیق‌هایی با اجازه چند اختلاف
Exact Matching تطبیق دقیق تطبیق بدون هیچ اختلاف
Dynamic Programming برنامه‌ریزی پویا حل مسئله با ذخیره نتایج زیرمسئله‌ها
Edit Distance فاصله ویرایشی حداقل تعداد تغییرات برای تبدیل یک رشته به رشته دیگر
Substitution جایگزینی تغییر یک کاراکتر به کاراکتر دیگر
Insertion درج اضافه کردن یک کاراکتر
Deletion حذف حذف یک کاراکتر
Matrix ماتریس ساختار ذخیره فاصله بین prefixها
Prefix پیشوند بخش ابتدایی یک رشته
Traceback بازگشت مسیر پیدا کردن مسیر رسیدن به جواب در ماتریس
Alignment هم‌ترازی قرار دادن دو توالی برای مقایسه
Gap شکاف موقعیتی که یک رشته کاراکتری ندارد
Offset موقعیت شروع محل شروع تطبیق در متن

مثال‌ها و تشبیه‌ها

تشبیه ماتریس Dynamic Programming

ماتریس را می‌توان مانند یک نقشه مسیر در نظر گرفت.

هر خانه نشان می‌دهد:

اگر تا این نقطه از Pattern و Text پیش برویم، کمترین هزینه تغییر چقدر است؟

برای رسیدن به خانه نهایی، سه مسیر داریم:

  • حرکت مستقیم → حذف یا اضافه کردن
  • حرکت مورب → تطبیق یا جایگزینی

Traceback مانند برگشتن روی مسیر طی‌شده در یک نقشه است تا بفهمیم چگونه به مقصد رسیده‌ایم.


خلاصه نهایی مرور سریع

  • Approximate Matching برای یافتن تطبیق‌هایی با وجود خطا و اختلاف استفاده می‌شود.
  • Dynamic Programming مشکل محاسبات تکراری روش Recursive را حل می‌کند.
  • ماتریس DP شامل فاصله ویرایشی بین prefixهای Pattern و Text است.
  • در Approximate Matching ردیف اول ماتریس با صفر مقداردهی می‌شود.
  • آخرین ردیف ماتریس نشان‌دهنده تطبیق Pattern با نقاط مختلف Text است.
  • کوچک‌ترین مقدار در آخرین ردیف بهترین تطبیق تقریبی را مشخص می‌کند.
  • Traceback مسیر ایجاد Alignment را پیدا می‌کند.
  • مسیر قطری نشان‌دهنده Match یا Substitution است.
  • مسیر افقی یا عمودی نشان‌دهنده Gap و Insertion/Deletion است.
  • Edit Distance انعطاف‌پذیر است اما نسبت به روش‌های Index-based کندتر است.
  • روش‌های عملی معمولاً Edit Distance را با Indexing یا Pigeonhole Principle ترکیب می‌کنند.

سوالات مرور

1. سوال مفهومی:

چرا در Approximate Matching ردیف اول ماتریس Dynamic Programming با صفر پر می‌شود؟

پاسخ: زیرا محل شروع Pattern در Text از قبل مشخص نیست. صفر کردن ردیف اول باعث می‌شود همه موقعیت‌های شروع در Text احتمال یکسان داشته باشند.


2. سوال تعریفی:

Traceback چیست؟

پاسخ: Traceback فرآیندی است که با دنبال کردن مسیر معکوس در ماتریس Dynamic Programming مشخص می‌کند چگونه مقدار نهایی فاصله ویرایشی به دست آمده و محل دقیق تطبیق و اختلاف‌ها را پیدا می‌کند.


3. سوال کاربردی:

اگر کمترین مقدار در آخرین ردیف ماتریس برابر ۳ باشد، چه مفهومی دارد؟

پاسخ: یعنی Pattern در یکی از بخش‌های Text با حداقل ۳ تغییر (Insertion، Deletion یا Substitution) تطبیق پیدا می‌کند.


4. سوال مقایسه‌ای:

چرا Edit Distance از Hamming Distance انعطاف‌پذیرتر است؟

پاسخ: زیرا Hamming Distance فقط جایگزینی را اجازه می‌دهد و طول دو رشته باید برابر باشد، اما Edit Distance علاوه بر جایگزینی، درج و حذف را نیز اجازه می‌دهد.


03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/06_lecture-meet-the-family-global-and-local-alignment

درس 03: هم‌ترازی سراسری و محلی (Global and Local Alignment)

خلاصه کلی

در درس‌های قبل، الگوریتم Edit Distance با استفاده از Dynamic Programming برای اندازه‌گیری شباهت بین دو رشته و همچنین یافتن تطابق‌های تقریبی در توالی‌ها بررسی شد.

در این درس، مفهوم Edit Distance گسترش داده می‌شود تا مسائل پیچیده‌تر زیست‌محاسباتی مانند:

  • Global Alignment (هم‌ترازی سراسری)
  • Local Alignment (هم‌ترازی محلی)

حل شوند.

هدف اصلی این بخش، طراحی الگوریتم‌هایی است که بتوانند:

  • تفاوت‌های زیستی بین توالی‌ها را با وزن‌های مختلف در نظر بگیرند.
  • اهمیت انواع مختلف جهش‌ها (Mutation) را در محاسبات لحاظ کنند.
  • نواحی مشابه بین دو توالی را پیدا کنند.

این روش‌ها پایه بسیاری از ابزارهای تحلیل توالی مانند ابزارهای Read Alignment و Genome Assembly هستند.


مفاهیم کلیدی

1. Global Alignment (هم‌ترازی سراسری)

تعریف ساده

Global Alignment روشی برای یافتن بهترین تطابق بین دو رشته است، به‌گونه‌ای که کل طول هر دو رشته در هم‌ترازی شرکت داشته باشد.

یعنی هدف این است که:

دو توالی از ابتدا تا انتها با یکدیگر مقایسه شوند.


توضیح دقیق

در Edit Distance ساده، تمام تغییرات هزینه یکسان داشتند:

نوع تغییر هزینه
Substitution (جایگزینی) 1
Insertion (درج) 1
Deletion (حذف) 1

اما در مسائل زیستی، این فرض همیشه درست نیست.

برای مثال:

  • بعضی جایگزینی‌های نوکلئوتیدی رایج‌تر از بقیه هستند.
  • ایجاد Gap (شکاف ناشی از درج یا حذف) معمولاً کمتر اتفاق می‌افتد.

بنابراین باید برای هر نوع تغییر، هزینه متفاوتی تعریف کنیم.


2. Penalty Matrix (ماتریس جریمه)

تعریف ساده

ماتریسی که هزینه انواع مختلف تغییرات در توالی را مشخص می‌کند.


توضیح دقیق

در Global Alignment، به جای استفاده از هزینه ثابت 1، از یک Penalty Matrix استفاده می‌کنیم.

این ماتریس مشخص می‌کند:

  • تغییر A به G چه هزینه‌ای دارد.
  • تغییر A به T چه هزینه‌ای دارد.
  • ایجاد یک Gap چه هزینه‌ای دارد.

بنابراین الگوریتم Dynamic Programming فقط یک تغییر کوچک نیاز دارد:

در هنگام پر کردن ماتریس، به جای اضافه کردن عدد ثابت 1، مقدار مناسب از Penalty Matrix خوانده می‌شود.


اهمیت زیستی

این روش اجازه می‌دهد الگوریتم با واقعیت‌های زیستی هماهنگ شود.

مثلاً در DNA:

برخی تغییرات طبیعی‌تر هستند و باید جریمه کمتری داشته باشند.


3. Transition و Transversion (گذار و تبدیل)

برای درک تفاوت هزینه جایگزینی‌ها، ابتدا باید انواع بازهای DNA را بدانیم.

Purines (پورین‌ها)

شامل:

  • A = Adenine
  • G = Guanine

Pyrimidines (پیریمیدین‌ها)

شامل:

  • C = Cytosine
  • T = Thymine

Transition (گذار)

تعریف

جایگزینی بین بازهایی از یک گروه مشابه.

مثال:

  • A ↔ G
  • C ↔ T

Transversion (تبدیل)

تعریف

جایگزینی بین دو گروه متفاوت.

مثال:

  • A ↔ C
  • A ↔ T
  • G ↔ C
  • G ↔ T

نکته مهم

از نظر تعداد حالت‌ها:

  • Transversionها دو برابر Transitionها هستند.

اما در ژنوم انسان:

  • Transitionها تقریباً دو برابر Transversionها رخ می‌دهند.

بنابراین:

  • Transition باید جریمه کمتری داشته باشد.
  • Transversion باید جریمه بیشتری داشته باشد.

4. Indel (Insertion/Deletion)

تعریف

Indel مخفف:

Insertion + Deletion

یعنی تغییراتی که شامل اضافه یا حذف شدن چند نوکلئوتید هستند.


اهمیت

در مقایسه ژنوم انسان‌ها:

  • نرخ Substitution حدوداً:

    1 تغییر در هر 1000 باز

  • نرخ Indel حدوداً:

    1 تغییر در هر 3000 باز

است.

بنابراین Indelها کمتر رخ می‌دهند و معمولاً باید جریمه بیشتری داشته باشند.


5. Local Alignment (هم‌ترازی محلی)

تعریف ساده

Local Alignment به دنبال یافتن:

مشابه‌ترین زیررشته‌ها (Substrings) در دو رشته مختلف

است.

برخلاف Global Alignment، لازم نیست کل رشته‌ها با هم مقایسه شوند.


تفاوت Global و Local Alignment

ویژگی Global Alignment Local Alignment
هدف مقایسه کل دو رشته یافتن بهترین بخش‌های مشابه
محدوده کل توالی زیرتوالی‌ها
کاربرد مقایسه دو توالی کامل پیدا کردن نواحی مشابه
خروجی بهترین هم‌ترازی کامل بهترین هم‌ترازی جزئی

6. Scoring Matrix (ماتریس امتیازدهی)

تعریف

در Local Alignment به جای Penalty Matrix از:

Scoring Matrix

استفاده می‌شود.


تفاوت با Penalty Matrix

در Penalty Matrix:

  • همه تغییرات دارای هزینه منفی هستند.

اما در Scoring Matrix:

  • تطابق‌ها امتیاز مثبت دارند.
  • تفاوت‌ها امتیاز منفی دارند.

مثال:

رویداد امتیاز
Match +5
Substitution -4
Gap -6

هدف این است که مناطق مشابه امتیاز بالا ایجاد کنند.


7. Dynamic Programming Matrix در Local Alignment

در Local Alignment، ماتریس Dynamic Programming کمی متفاوت مقداردهی می‌شود.

ویژگی مهم:

  • بسیاری از خانه‌های ماتریس مقدار صفر دارند.

علت:

الگوریتم می‌خواهد فقط بخش‌هایی را پیدا کند که واقعاً مشابه هستند و از پس‌زمینه نامشابه جدا می‌شوند.


8. Trace Back (بازگشت مسیر)

تعریف

روشی برای پیدا کردن مسیر حرکت در ماتریس Dynamic Programming و تعیین:

  • محل دقیق هم‌ترازی
  • نوع تغییرات
  • Gapها و Mismatchها

در Global Alignment

Trace back:

  • از خانه پایین-راست شروع می‌شود.
  • تا رسیدن به ابتدای ماتریس ادامه پیدا می‌کند.

در Local Alignment

Trace back:

  • از خانه‌ای با بیشترین امتیاز شروع می‌شود.
  • تا رسیدن به خانه‌ای با مقدار صفر ادامه پیدا می‌کند.

نکات مهم

  • Edit Distance فرض می‌کند همه تغییرات هزینه برابر دارند، اما در زیست‌شناسی این فرض معمولاً صحیح نیست.

  • Global Alignment کل دو توالی را با هم مقایسه می‌کند.

  • Local Alignment فقط بهترین بخش‌های مشابه دو توالی را پیدا می‌کند.

  • Penalty Matrix امکان تنظیم هزینه تغییرات مختلف را فراهم می‌کند.

  • Transitionها شامل تغییرات:

    • A↔G
    • C↔T هستند.
  • Transversionها تغییر بین Purine و Pyrimidine هستند.

  • Indelها معمولاً کمتر از Substitution رخ می‌دهند، بنابراین هزینه بیشتری دارند.

  • در Local Alignment مقدار صفر نقش مهمی دارد و باعث می‌شود فقط نواحی مشابه برجسته شوند.

  • هر دو الگوریتم از Dynamic Programming و Trace Back استفاده می‌کنند.

  • این روش‌ها در ابزارهای تحلیل توالی مانند Read Alignment و Assembly کاربرد دارند.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Global Alignment هم‌ترازی سراسری مقایسه کامل دو توالی از ابتدا تا انتها
Local Alignment هم‌ترازی محلی یافتن مشابه‌ترین زیرتوالی‌ها
Penalty Matrix ماتریس جریمه تعیین هزینه انواع تغییرات
Scoring Matrix ماتریس امتیازدهی تعیین امتیاز تطابق‌ها و جریمه تفاوت‌ها
Transition گذار جایگزینی بین بازهای هم‌گروه
Transversion تبدیل جایگزینی بین بازهای گروه‌های مختلف
Purine پورین بازهای A و G
Pyrimidine پیریمیدین بازهای C و T
Indel درج/حذف اضافه یا حذف نوکلئوتید
Gap شکاف موقعیتی که ناشی از Insertion یا Deletion است
Trace Back بازگشت مسیر بازسازی مسیر ایجاد مقدار نهایی در ماتریس
Substring زیررشته بخشی از یک رشته کامل

مثال‌ها و تشبیه‌ها

مثال Transition و Transversion

DNA را می‌توان مانند دو خانواده باز تصور کرد:

  • خانواده Purine:

    • A
    • G
  • خانواده Pyrimidine:

    • C
    • T

اگر تغییر داخل یک خانواده باشد:

مثلاً:

A → G

یک Transition است.

اما اگر بین خانواده‌ها باشد:

مثلاً:

A → T

یک Transversion است.


مثال Local Alignment

فرض کنید دو جمله انگلیسی داریم:

The quick brown fox jumps
A fast brown fox runs

ممکن است کل جمله‌ها مشابه نباشند، اما بخش:

brown fox

در هر دو وجود دارد.

Local Alignment همین بخش مشترک را پیدا می‌کند.


خلاصه نهایی مرور سریع

  • Edit Distance پایه‌ای برای بسیاری از الگوریتم‌های مقایسه توالی است.
  • در Global Alignment کل دو رشته باید هم‌تراز شوند.
  • در Local Alignment فقط بهترین زیررشته‌های مشابه پیدا می‌شوند.
  • Penalty Matrix اجازه می‌دهد هزینه تغییرات زیستی متفاوت باشد.
  • Transition شامل تغییرات A↔G و C↔T است.
  • Transversion شامل تغییر بین Purine و Pyrimidine است.
  • Indelها معمولاً کمتر از جایگزینی‌ها رخ می‌دهند و جریمه بیشتری دارند.
  • Global Alignment از ماتریس Dynamic Programming مشابه Edit Distance استفاده می‌کند.
  • Local Alignment از Scoring Matrix با امتیاز مثبت برای Match استفاده می‌کند.
  • Trace Back مسیر ایجاد بهترین هم‌ترازی را مشخص می‌کند.
  • این الگوریتم‌ها در Read Alignment و Genome Assembly کاربرد گسترده دارند.

سوالات مرور

سوال 1: تفاوت اصلی Global Alignment و Local Alignment چیست؟

پاسخ:

Global Alignment کل دو توالی را مقایسه می‌کند، اما Local Alignment فقط مشابه‌ترین بخش‌های دو توالی را پیدا می‌کند.


سوال 2: چرا Edit Distance ساده برای کاربردهای زیستی کافی نیست؟

پاسخ:

زیرا در Edit Distance همه تغییرات هزینه یکسان دارند، در حالی که در زیست‌شناسی برخی تغییرات مانند Transition یا Gap احتمال وقوع متفاوتی دارند.


سوال 3: Transition چیست؟

پاسخ:

Transition جایگزینی بین بازهای هم‌گروه است:

  • A ↔ G
  • C ↔ T

سوال 4: چرا Indel معمولاً جریمه بیشتری از Substitution دارد؟

پاسخ:

زیرا در ژنوم‌ها کمتر از جایگزینی رخ می‌دهد و بنابراین تغییر مهم‌تر و غیرمعمول‌تری محسوب می‌شود.


سوال 5: در Local Alignment چرا مقدار صفر در ماتریس وجود دارد؟

پاسخ:

زیرا الگوریتم باید بتواند از نقاط نامشابه صرف‌نظر کند و فقط نواحی با شباهت بالا را پیدا کند.


سوال 6: Trace Back چه اطلاعاتی به ما می‌دهد؟

پاسخ:

Trace Back مشخص می‌کند:

  • بهترین هم‌ترازی کجاست.
  • کدام موقعیت‌ها Match هستند.
  • کجا Gap یا Mismatch رخ داده است.

03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/07_practical-implementing-global-alignment

درس 03: پیاده‌سازی Global Alignment با استفاده از Dynamic Programming

خلاصه کلی

در این درس، الگوریتم Edit Distance که در بخش‌های قبل پیاده‌سازی شد، به یک الگوریتم کامل‌تر برای Global Alignment (هم‌ترازی سراسری) تبدیل می‌شود.

در Edit Distance معمولی:

  • تمام خطاها (Mismatch، Insertion، Deletion) هزینه یکسان داشتند.
  • هر تغییر برابر با یک واحد جریمه می‌شد.

اما در مسائل زیستی، همه تغییرات اهمیت یکسان ندارند. برای مثال:

  • تغییر A به G احتمال بیشتری از A به C دارد.
  • ایجاد Gap (حذف یا درج باز) معمولاً کمتر رخ می‌دهد و باید جریمه بیشتری داشته باشد.

بنابراین در Global Alignment از یک Penalty Matrix (ماتریس جریمه) استفاده می‌کنیم تا هزینه هر نوع تغییر را مطابق با شرایط زیستی تنظیم کنیم.

هدف این درس:

  • تبدیل Edit Distance به Global Alignment
  • ساخت Penalty Matrix برای DNA
  • استفاده از هزینه‌های متفاوت برای انواع جهش‌ها

مفاهیم کلیدی


1. Global Alignment (هم‌ترازی سراسری)

تعریف ساده

Global Alignment الگوریتمی است که بهترین تطابق ممکن بین کل دو توالی را پیدا می‌کند و تمام بخش‌های دو رشته را در هم‌ترازی قرار می‌دهد.


توضیح دقیق

Global Alignment همان چارچوب Dynamic Programming در Edit Distance را حفظ می‌کند، اما یک تفاوت مهم دارد:

در Edit Distance:

[ Penalty = 1 ]

برای همه تغییرات.

اما در Global Alignment:

[ Penalty = \text{مقدار تعیین‌شده در Penalty Matrix} ]

است.

بنابراین الگوریتم می‌تواند تفاوت‌های زیستی را بهتر مدل کند.


اهمیت و کاربرد

Global Alignment در مواردی استفاده می‌شود که:

  • دو توالی تقریباً هم‌طول هستند.
  • می‌خواهیم کل توالی‌ها را مقایسه کنیم.
  • تفاوت‌های ژنتیکی بین دو موجود یا دو ژن را بررسی کنیم.

2. Penalty Matrix (ماتریس جریمه)

تعریف ساده

Penalty Matrix جدولی است که مشخص می‌کند هر نوع تغییر بین دو کاراکتر چه مقدار جریمه دارد.


ساختار ماتریس

برای DNA، الفبای مورد استفاده شامل:

  • A
  • C
  • G
  • T

است.

برای Global Alignment یک ماتریس 5×5 ساخته می‌شود:

  • 4 ردیف و ستون اول:

    • مقایسه بازهای DNA با یکدیگر
  • ردیف و ستون آخر:

    • هزینه Gap یا Skip

نمونه ساختار:

A C G T Gap
A 0 4 2 4 8
C 4 0 4 2 8
G 2 4 0 4 8
T 4 2 4 0 8
Gap 8 8 8 8 0

تفسیر ماتریس

تطابق (Match)

مثلاً:

A → A

هزینه:

0

زیرا تغییری رخ نداده است.


Transition

مثلاً:

A → G

هر دو باز از گروه Purine هستند.

هزینه:

2

Transversion

مثلاً:

A → C

بازها از گروه‌های متفاوت هستند.

هزینه:

4

Gap

مثلاً:

A → حذف

هزینه:

8

زیرا حذف یا درج معمولاً تغییر بزرگ‌تری محسوب می‌شود.


3. Transition و Transversion در Penalty Matrix

Transition

تغییر بین بازهای مشابه:

Purine:

  • A
  • G

و

Pyrimidine:

  • C
  • T

مثال:

A ↔ G
C ↔ T

Transversion

تغییر بین گروه‌های متفاوت:

مثال:

A ↔ C
A ↔ T
G ↔ C
G ↔ T

نکته مهم

در ماتریس جریمه:

Transitionها معمولاً هزینه کمتری دارند.

زیرا:

  • از نظر زیستی رایج‌تر هستند.
  • تغییر ساختاری کمتری ایجاد می‌کنند.

4. تفاوت Edit Distance و Global Alignment

ویژگی Edit Distance Global Alignment
هزینه تغییرات ثابت متفاوت
Match 0 0
Mismatch 1 وابسته به نوع تغییر
Gap 1 معمولاً بیشتر
کاربرد زیستی محدودتر دقیق‌تر

5. تغییرات الگوریتم Dynamic Programming

تعریف

برای تبدیل Edit Distance به Global Alignment، تنها چند بخش الگوریتم تغییر می‌کند.


مقداردهی اولیه ماتریس

در Edit Distance:

ردیف اول و ستون اول:

0,1,2,3,...

بودند.

اما در Global Alignment:

به جای افزایش ساده یک واحد:

هر خانه با هزینه Gap پر می‌شود.

مثلاً:

اگر حذف یک باز هزینه 8 داشته باشد:

0,8,16,24,...

خواهیم داشت.


6. محاسبه سه مسیر در ماتریس

برای پر کردن هر خانه، سه مسیر بررسی می‌شود:


مسیر افقی (Horizontal)

معادل:

  • حذف یا Skip در توالی Y

هزینه:

Cell سمت چپ + Gap penalty

مسیر عمودی (Vertical)

معادل:

  • حذف یا Skip در توالی X

هزینه:

Cell بالایی + Gap penalty

مسیر قطری (Diagonal)

معادل:

  • Match یا Substitution

هزینه:

از Penalty Matrix گرفته می‌شود.

مثلاً:

A → G = 2

یا:

G → C = 4

7. پیاده‌سازی در Python

در تبدیل تابع Edit Distance به Global Alignment:

تقریباً تمام ساختار قبلی حفظ می‌شود.

تغییرات اصلی:

  1. تعریف الفبای DNA:
alphabet = "ACGT"
  1. ایجاد Penalty Matrix

  2. تغییر مقداردهی اولیه ردیف و ستون

  3. استفاده از ماتریس جریمه در حرکت‌های:

  • افقی
  • عمودی
  • قطری

نکات مهم

  • Global Alignment نسخه زیستی‌تر Edit Distance است.

  • تفاوت اصلی آن استفاده از هزینه‌های متفاوت برای تغییرات مختلف است.

  • Penalty Matrix اجازه می‌دهد الگوریتم با نوع موجود زنده یا مسئله موردنظر تنظیم شود.

  • Match همیشه هزینه صفر دارد.

  • Transitionها معمولاً هزینه کمتری از Transversionها دارند.

  • Gapها معمولاً بیشترین جریمه را دارند.

  • ساختار Dynamic Programming تغییر نمی‌کند؛ فقط نحوه محاسبه هزینه تغییر می‌کند.

  • برای هر خانه سه مقدار بررسی می‌شود:

    • Horizontal
    • Vertical
    • Diagonal
  • جواب نهایی همچنان در خانه پایین-راست ماتریس قرار دارد.

  • Global Alignment برای مقایسه کامل دو توالی استفاده می‌شود.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Global Alignment هم‌ترازی سراسری مقایسه کامل دو توالی
Edit Distance فاصله ویرایشی حداقل تعداد تغییر برای تبدیل دو رشته
Penalty Matrix ماتریس جریمه جدول هزینه تغییرات
Match تطابق یکسان بودن دو کاراکتر
Mismatch عدم تطابق متفاوت بودن دو کاراکتر
Gap شکاف درج یا حذف یک کاراکتر
Skip Character رد کردن کاراکتر حذف یا عبور از یک باز
Transition گذار تغییر A↔G یا C↔T
Transversion تبدیل تغییر بین گروه‌های مختلف بازها
Purine پورین A و G
Pyrimidine پیریمیدین C و T
Dynamic Programming Matrix ماتریس برنامه‌ریزی پویا ساختار ذخیره نتایج محاسبات
Alphabet الفبا مجموعه کاراکترهای مورد استفاده

مثال‌ها و تشبیه‌ها

مثال 1: جایگزینی G با C

تغییر:

G → C

یک Transversion است.

طبق Penalty Matrix:

Penalty = 4

پس امتیاز هم‌ترازی 4 واحد کاهش می‌یابد.


مثال 2: جایگزینی G با A

تغییر:

G → A

یک Transition است.

هزینه:

Penalty = 2

زیرا این تغییر از نظر زیستی محتمل‌تر است.


مثال 3: حذف یک باز

اگر یک باز حذف شود:

ACGT
AC-T

هزینه:

Gap penalty = 8

خواهد بود.


خلاصه نهایی مرور سریع

  • Global Alignment برای مقایسه کامل دو توالی استفاده می‌شود.
  • این الگوریتم توسعه‌ای از Edit Distance است.
  • تفاوت اصلی استفاده از Penalty Matrix است.
  • همه تغییرات در Edit Distance هزینه یکسان دارند، اما در Global Alignment متفاوت هستند.
  • Transitionها شامل A↔G و C↔T هستند.
  • Transversionها تغییر بین Purine و Pyrimidine هستند.
  • Gap معمولاً جریمه بیشتری نسبت به Substitution دارد.
  • ماتریس Dynamic Programming همچنان استفاده می‌شود.
  • هر خانه با بررسی سه مسیر افقی، عمودی و قطری محاسبه می‌شود.
  • مقدار نهایی در گوشه پایین-راست ماتریس قرار دارد.
  • فقط چند خط از کد Edit Distance برای تبدیل به Global Alignment تغییر می‌کند.

سوالات مرور

سوال 1: تفاوت اصلی Global Alignment با Edit Distance چیست؟

پاسخ:

در Edit Distance همه تغییرات هزینه برابر دارند، اما در Global Alignment هزینه هر تغییر با استفاده از Penalty Matrix تعیین می‌شود.


سوال 2: چرا Transition هزینه کمتری از Transversion دارد؟

پاسخ:

زیرا Transitionها از نظر زیستی رایج‌تر هستند و تغییر ساختاری کمتری در DNA ایجاد می‌کنند.


سوال 3: Penalty Matrix چه کاری انجام می‌دهد؟

پاسخ:

Penalty Matrix مشخص می‌کند هر نوع Match، Mismatch یا Gap چه مقدار جریمه داشته باشد.


سوال 4: در Global Alignment مقدار خانه پایین-راست ماتریس چه چیزی را نشان می‌دهد؟

پاسخ:

کمترین هزینه یا بهترین امتیاز برای هم‌ترازی کل دو توالی را نشان می‌دهد.


سوال 5: برای پر کردن هر خانه در ماتریس Dynamic Programming چه مسیرهایی بررسی می‌شوند؟

پاسخ:

سه مسیر:

  1. افقی (Horizontal)
  2. عمودی (Vertical)
  3. قطری (Diagonal)

بررسی می‌شوند.


03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/08_lecture-read-alignment-in-the-field

هم‌ترازی خوانش‌ها در عمل (Read Alignment in Practice)

خلاصه کلی

در این درس بررسی می‌کنیم که ابزارهای واقعی Read Alignment چگونه در عمل کار می‌کنند و چگونه دو ایده مهم را با یکدیگر ترکیب می‌کنند:

  1. Indexing (ایندکس‌گذاری ژنوم) برای پیدا کردن سریع نواحی احتمالی تطابق در ژنوم.
  2. Dynamic Programming Alignment (هم‌ترازی با برنامه‌ریزی پویا) برای بررسی دقیق تطابق تقریبی شامل mismatch، insertion و deletion.

هدف اصلی این بخش، درک دلیل استفاده هم‌زمان از این دو روش در ابزارهای مدرن هم‌ترازی ژنومی است. هیچ‌کدام از این روش‌ها به‌تنهایی کافی نیستند:

  • Index بسیار سریع است اما در برخورد با خطاهای توالی مانند جهش‌ها و شکاف‌ها ضعیف است.
  • Dynamic Programming بسیار دقیق و انعطاف‌پذیر است اما برای کل ژنوم بسیار کند خواهد بود.

ترکیب این دو روش باعث می‌شود هم سرعت و هم دقت لازم برای تحلیل داده‌های توالی‌یابی فراهم شود.


مفاهیم کلیدی

1. Read Alignment (هم‌ترازی خوانش)

تعریف ساده

فرایند پیدا کردن محل احتمالی یک read (قطعه کوتاه DNA حاصل از توالی‌یابی) در یک ژنوم مرجع و تعیین میزان شباهت آن به آن ناحیه.

توضیح دقیق

در داده‌های توالی‌یابی، میلیون‌ها read کوتاه تولید می‌شوند. هدف ابزارهای read alignment این است که برای هر read مشخص کنند:

  • این قطعه متعلق به کدام بخش ژنوم است؟
  • چند mismatch دارد؟
  • آیا insertion یا deletion وجود دارد؟
  • بهترین محل تطابق کجاست؟

این کار برای کاربردهایی مانند:

  • شناسایی واریانت‌ها (Variant Calling)
  • بررسی جهش‌ها
  • تحلیل RNA-seq
  • مونتاژ ژنوم

ضروری است.


2. Indexing (ایندکس‌گذاری)

تعریف ساده

ساخت یک ساختار داده‌ای که امکان پیدا کردن سریع محل‌هایی از ژنوم را فراهم می‌کند که با بخشی از یک read مشترک هستند.

توضیح دقیق

به جای اینکه هر read را با کل ژنوم مقایسه کنیم، ابتدا از یک index استفاده می‌کنیم تا نقاط احتمالی تطابق را پیدا کنیم.

Index معمولاً اطلاعاتی درباره زیررشته‌ها (substrings) ذخیره می‌کند.

فرایند کلی:

  1. یک read وارد ابزار می‌شود.
  2. index بررسی می‌کند که چه بخش‌هایی از ژنوم با قسمت‌هایی از read مشابه هستند.
  3. چند محل احتمالی به‌عنوان candidate location انتخاب می‌شوند.
  4. فقط این نواحی کوچک با الگوریتم دقیق‌تر بررسی می‌شوند.

اهمیت و کاربرد

Index مانند یک فیلتر سریع عمل می‌کند.

به جای اینکه:

یک سوزن را در کل انبار کاه جستجو کنیم،

ابتدا چند مکان احتمالی برای سوزن پیدا می‌کنیم و سپس فقط همان نقاط را بررسی می‌کنیم.


3. Dynamic Programming Alignment (هم‌ترازی با برنامه‌ریزی پویا)

تعریف ساده

روشی الگوریتمی برای محاسبه بهترین تطابق بین دو توالی با در نظر گرفتن:

  • Substitution (جایگزینی)
  • Insertion (درج)
  • Deletion (حذف)

توضیح دقیق

در روش Dynamic Programming یک ماتریس ساخته می‌شود:

  • سطرها: بازهای read
  • ستون‌ها: بازهای ژنوم

هر خانه نشان‌دهنده بهترین امتیاز یا فاصله برای یک جفت prefix از دو توالی است.

این روش می‌تواند:

  • mismatch را تشخیص دهد.
  • gapها را مدیریت کند.
  • برای انواع تغییرات DNA جریمه‌های متفاوت تعیین کند.

اهمیت و کاربرد

Dynamic Programming مرحله Verification (تأیید) را انجام می‌دهد.

یعنی بعد از اینکه index چند محل احتمالی را پیدا کرد، بررسی می‌کند:

آیا این محل واقعاً یک تطابق تقریبی معتبر برای read است؟


4. Verification Step (مرحله تأیید)

تعریف ساده

مرحله‌ای که در آن یک تطابق احتمالی پیدا شده توسط index با الگوریتم دقیق بررسی می‌شود.

توضیح دقیق

Index فقط می‌گوید:

«احتمالاً این read در این چند نقطه قرار دارد.»

اما نمی‌تواند به خوبی مشخص کند:

  • چند mismatch وجود دارد؟
  • آیا gap وجود دارد؟
  • کدام تطابق بهترین است؟

بنابراین Dynamic Programming وارد عمل می‌شود و تطابق کامل را محاسبه می‌کند.


5. Global Alignment و Local Alignment

Global Alignment (هم‌ترازی سراسری)

تعریف

یافتن بهترین تطابق بین تمام طول دو توالی.

کاربرد در Read Alignment

برای مقایسه دقیق read با یک ناحیه مشخص از ژنوم استفاده می‌شود.


Local Alignment (هم‌ترازی موضعی)

تعریف

یافتن بهترین زیررشته مشترک بین دو توالی.

کاربرد

زمانی مفید است که فقط بخشی از توالی‌ها مشابه باشند.


نکات مهم

  • ابزارهای واقعی read alignment معمولاً ترکیبی از Indexing + Dynamic Programming هستند.
  • Index به‌تنهایی برای تطابق دقیق عالی است، اما برای mismatch و gap مناسب نیست.
  • Dynamic Programming به‌تنهایی دقیق است، اما روی کل ژنوم بسیار کند است.
  • ژنوم انسان حدود 3 میلیارد باز دارد؛ بنابراین ساخت ماتریس Dynamic Programming بین یک read و کل ژنوم بسیار بزرگ خواهد بود.
  • طول readها معمولاً حدود صدها باز است، اما طول ژنوم میلیون‌ها تا میلیاردها باز است.
  • استفاده از Dynamic Programming روی کل ژنوم برای هر read می‌تواند سال‌ها زمان ببرد.
  • Index مانند یک مرحله کاهش فضای جستجو (Search Space Reduction) عمل می‌کند.
  • Dynamic Programming انعطاف لازم برای مدیریت تغییرات واقعی DNA را فراهم می‌کند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Read Alignment هم‌ترازی خوانش پیدا کردن محل read در ژنوم مرجع
Read خوانش قطعه کوتاه DNA تولیدشده توسط دستگاه توالی‌یابی
Reference Genome ژنوم مرجع توالی استاندارد برای مقایسه
Indexing ایندکس‌گذاری ساخت ساختار داده برای جستجوی سریع
Index نمایه / فهرست جستجو ساختاری برای یافتن سریع موقعیت‌های احتمالی
Candidate Location محل کاندید ناحیه‌ای که احتمال تطابق دارد
Dynamic Programming برنامه‌ریزی پویا الگوریتم حل مسائل با استفاده از زیرمسئله‌ها
Approximate Matching تطابق تقریبی تطابق همراه با خطاهای مجاز
Mismatch عدم تطابق تفاوت یک باز بین دو توالی
Insertion درج اضافه شدن یک یا چند باز
Deletion حذف حذف یک یا چند باز
Gap شکاف فضای ایجادشده به دلیل insertion/deletion
Verification تأیید بررسی دقیق یک تطابق احتمالی
Global Alignment هم‌ترازی سراسری مقایسه کل دو توالی
Local Alignment هم‌ترازی موضعی یافتن مشابه‌ترین بخش‌های دو توالی

مثال‌ها و تشبیه‌ها

تشبیه Index و Dynamic Programming

مدرس از مثال جستجوی سوزن در انبار کاه استفاده می‌کند.

بدون Index:

  • باید کل انبار کاه را بررسی کنیم.
  • بسیار کند است.

با Index:

  • ابتدا چند نقطه احتمالی که ممکن است سوزن وجود داشته باشد پیدا می‌کنیم.
  • سپس فقط همان نقاط را دقیق بررسی می‌کنیم.

در read alignment:

  • Index = پیدا کردن محل‌های احتمالی read در ژنوم
  • Dynamic Programming = بررسی دقیق اینکه آیا واقعاً همان محل درست است

خلاصه نهایی مرور سریع

  • ابزارهای Read Alignment معمولاً از ترکیب Indexing و Dynamic Programming استفاده می‌کنند.
  • Index برای پیدا کردن سریع محل‌های احتمالی تطابق در ژنوم استفاده می‌شود.
  • Dynamic Programming برای بررسی دقیق تطابق و محاسبه mismatch و gap استفاده می‌شود.
  • انجام Dynamic Programming روی کل ژنوم بسیار پرهزینه است.
  • ژنوم انسان حدود 3 میلیارد باز دارد و ایجاد ماتریس کامل بسیار بزرگ خواهد بود.
  • Index مانند یک فیلتر عمل می‌کند و فضای جستجو را کاهش می‌دهد.
  • Dynamic Programming انعطاف بالایی در مدیریت خطاهای توالی دارد.
  • Index سریع است اما در برابر تغییرات توالی محدودیت دارد.
  • Dynamic Programming دقیق است اما بدون Index بسیار کند است.
  • ترکیب این دو روش دلیل اصلی کارایی ابزارهای مدرن هم‌ترازی ژنومی است.

سوالات مرور

1. چرا استفاده از Dynamic Programming به تنهایی برای Read Alignment مناسب نیست؟

پاسخ: زیرا باید برای هر read ماتریس بزرگی با کل ژنوم ساخته شود. از آنجا که ژنوم بسیار طولانی است، این کار زمان بسیار زیادی نیاز دارد.


2. نقش اصلی Index در Read Alignment چیست؟

پاسخ: Index با پیدا کردن محل‌های احتمالی تطابق در ژنوم، فضای جستجو را کاهش می‌دهد و اجازه می‌دهد الگوریتم دقیق فقط روی بخش‌های محدود اجرا شود.


3. چرا Dynamic Programming بعد از Index استفاده می‌شود؟

پاسخ: زیرا Index فقط تطابق‌های اولیه را پیدا می‌کند و نمی‌تواند mismatch، insertion و deletion را به‌خوبی ارزیابی کند. Dynamic Programming این بررسی دقیق را انجام می‌دهد.


4. تفاوت اصلی Index و Dynamic Programming چیست؟

پاسخ:

روش مزیت محدودیت
Index بسیار سریع مدیریت ضعیف mismatch و gap
Dynamic Programming بسیار دقیق و انعطاف‌پذیر بسیار کند روی داده‌های بزرگ

5. در یک ابزار واقعی Read Alignment چه مراحلی انجام می‌شود؟

پاسخ:

  1. استفاده از Index برای یافتن محل‌های احتمالی.
  2. انتخاب candidate locationها.
  3. اجرای Dynamic Programming برای بررسی دقیق.
  4. انتخاب بهترین تطابق بر اساس امتیاز alignment.

03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/09_lecture-assembly-working-from-scratch

مونتاژ ژنوم از ابتدا (Genome Assembly from Scratch)

خلاصه کلی

در این درس دو مسئله اصلی در تحلیل داده‌های توالی‌یابی مقایسه می‌شوند:

  1. Read Alignment (هم‌ترازی خوانش‌ها)
  2. Genome Assembly / De novo Assembly (مونتاژ ژنوم از ابتدا)

هر دو مسئله زمانی مطرح می‌شوند که تعداد زیادی read (خوانش توالی‌یابی) در اختیار داریم و می‌خواهیم بفهمیم این قطعات DNA از کجای ژنوم آمده‌اند.

تشبیه اصلی این درس، مسئله پازل است:

  • هر read مانند یک قطعه پازل است.
  • هدف، کنار هم قرار دادن این قطعات برای بازسازی تصویر اصلی (ژنوم) است.

تفاوت اصلی:

  • در Read Alignment تصویر نهایی پازل را داریم (ژنوم مرجع) و فقط باید قطعات را در جای مناسب قرار دهیم.
  • در Assembly تصویر نهایی را نداریم و باید خودمان آن را از روی قطعات بازسازی کنیم.

مفاهیم کلیدی

1. Sequencing Reads (خوانش‌های توالی‌یابی)

تعریف ساده

قطعات کوتاهی از DNA هستند که توسط دستگاه‌های توالی‌یابی تولید می‌شوند.

توضیح دقیق

در فناوری‌های توالی‌یابی، کل ژنوم معمولاً به قطعات کوچک‌تر تقسیم می‌شود و دستگاه فقط توالی این قطعات را می‌خواند.

خروجی یک آزمایش توالی‌یابی مجموعه بزرگی از readها است که باید تحلیل شوند.

اهمیت

این readها مانند قطعات یک پازل هستند که باید برای بازسازی ژنوم اصلی استفاده شوند.


2. Read Alignment (هم‌ترازی خوانش‌ها)

تعریف ساده

قرار دادن readها روی یک ژنوم مرجع موجود برای پیدا کردن محل اصلی آن‌ها.

توضیح دقیق

در Read Alignment فرض می‌کنیم که یک نسخه کامل از ژنوم مورد نظر داریم.

مثلاً:

  • ژنوم مرجع انسان (Human Reference Genome) موجود است.
  • یک read جدید داریم.
  • باید پیدا کنیم این read در کدام قسمت ژنوم قرار می‌گیرد.

فرایند شبیه این است:

یک پازل داریم و تصویر روی جعبه پازل را نیز در اختیار داریم.

در این حالت، تصویر جعبه همان ژنوم مرجع است.

کاربردها

  • شناسایی جهش‌ها (Variant Calling)
  • مقایسه نمونه‌های مختلف با ژنوم مرجع
  • تحلیل داده‌های پزشکی و ژنتیکی

3. Genome Assembly (مونتاژ ژنوم)

تعریف ساده

بازسازی یک ژنوم کامل فقط از روی مجموعه‌ای از readها، بدون استفاده از ژنوم مرجع.

نام‌های دیگر

  • De novo Assembly
  • De novo Shotgun Assembly

توضیح دقیق

کلمه:

De novo

به معنی:

از ابتدا / از صفر

است.

در این روش فرض می‌کنیم ژنوم مرجع موجود نیست.

بنابراین الگوریتم باید:

  1. شباهت بین readها را پیدا کند.
  2. آن‌ها را به شکل درست کنار هم قرار دهد.
  3. توالی اصلی ژنوم را بازسازی کند.

اهمیت

این روش برای موجوداتی ضروری است که:

  • قبلاً توالی‌یابی نشده‌اند.
  • ژنوم مرجع ندارند.

4. De novo Shotgun Assembly (مونتاژ شاتگان از ابتدا)

تعریف ساده

روشی برای بازسازی ژنوم که در آن readها به‌صورت تصادفی از بخش‌های مختلف ژنوم گرفته شده‌اند.

توضیح دقیق

در روش Shotgun:

  • ژنوم ابتدا به قطعات کوچک تقسیم می‌شود.
  • قطعات به صورت تصادفی توالی‌یابی می‌شوند.
  • الگوریتم باید با پیدا کردن همپوشانی بین قطعات، ژنوم اصلی را بازسازی کند.

تفاوت Read Alignment و Assembly

ویژگی Read Alignment De novo Assembly
ژنوم مرجع دارد ندارد
هدف پیدا کردن محل readها بازسازی ژنوم
تشبیه حل پازل با تصویر روی جعبه حل پازل بدون تصویر
سختی محاسباتی کمتر بیشتر
کاربرد اصلی بررسی تفاوت با ژنوم مرجع مطالعه گونه‌های جدید

نکات مهم

  • هر دو مسئله از یک مجموعه read شروع می‌شوند، اما هدف متفاوتی دارند.
  • Read Alignment به یک Reference Genome نیاز دارد.
  • Assembly زمانی استفاده می‌شود که ژنوم مرجع وجود ندارد.
  • مسئله Assembly از نظر محاسباتی بسیار سخت‌تر از Alignment است.
  • سختی Assembly فقط به حجم محاسبات محدود نمی‌شود؛ ماهیت مسئله نیز دشوار است.
  • پروژه Human Genome Project یکی از نمونه‌های تاریخی مهم Assembly بود، زیرا اولین بار ژنوم کامل انسان باید بازسازی می‌شد.
  • برخی مشکلات Assembly با الگوریتم‌های بهتر حل می‌شوند، اما بعضی محدودیت‌ها ناشی از ماهیت خود داده‌های زیستی هستند.
  • توسعه فناوری‌های جدید توالی‌یابی می‌تواند Assembly را در آینده بهتر و دقیق‌تر کند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Sequencing Read خوانش توالی‌یابی قطعه کوتاه DNA تولیدشده توسط دستگاه توالی‌یابی
Read Alignment هم‌ترازی خوانش‌ها یافتن محل readها روی ژنوم مرجع
Genome Assembly مونتاژ ژنوم بازسازی ژنوم از مجموعه readها
De novo Assembly مونتاژ از ابتدا ساخت ژنوم بدون استفاده از مرجع
De novo Shotgun Assembly مونتاژ شاتگان از ابتدا بازسازی ژنوم از قطعات تصادفی DNA
Reference Genome ژنوم مرجع توالی استاندارد برای مقایسه
Human Genome Project پروژه ژنوم انسان پروژه‌ای برای تعیین توالی کامل ژنوم انسان
Puzzle Analogy تشبیه پازل مدل ذهنی برای توضیح Assembly

مثال‌ها و تشبیه‌ها

تشبیه پازل

Read Alignment

فرض کنید یک پازل دارید که:

  • همه قطعات را دارید.
  • تصویر روی جعبه پازل را هم دارید.

پس فقط باید بدانید هر قطعه کجا قرار می‌گیرد.

این همان Read Alignment است:

  • قطعات = readها
  • تصویر جعبه = ژنوم مرجع

Assembly

حالا تصور کنید:

  • فقط قطعات پازل را دارید.
  • هیچ تصویری از نتیجه نهایی ندارید.

باید با بررسی شکل و ارتباط قطعات، تصویر کامل را بسازید.

این همان De novo Assembly است.


خلاصه نهایی مرور سریع

  • داده‌های توالی‌یابی معمولاً شامل میلیون‌ها read کوتاه هستند.
  • Readها مانند قطعات یک پازل ژنتیکی هستند.
  • Read Alignment با استفاده از ژنوم مرجع، محل readها را پیدا می‌کند.
  • Assembly بدون ژنوم مرجع، ژنوم کامل را بازسازی می‌کند.
  • De novo به معنی «از ابتدا» است.
  • De novo Shotgun Assembly بر اساس قطعات تصادفی DNA انجام می‌شود.
  • Assembly از Alignment دشوارتر و پرهزینه‌تر است.
  • پروژه Human Genome Project یکی از نمونه‌های مهم Assembly تاریخی بود.
  • بعضی مشکلات Assembly با الگوریتم‌ها حل می‌شوند، اما برخی محدودیت‌ها بنیادی هستند.
  • پیشرفت فناوری توالی‌یابی می‌تواند Assembly را در آینده بهبود دهد.

سوالات مرور

1. تفاوت اصلی بین Read Alignment و Genome Assembly چیست؟

پاسخ: در Read Alignment یک ژنوم مرجع داریم و فقط محل readها را پیدا می‌کنیم، اما در Assembly ژنوم مرجع نداریم و باید خود ژنوم را از روی readها بازسازی کنیم.


2. مفهوم De novo Assembly چیست؟

پاسخ: روشی برای مونتاژ ژنوم از ابتدا بدون استفاده از ژنوم مرجع است.


3. چرا Assembly مسئله سخت‌تری نسبت به Alignment است؟

پاسخ: زیرا در Assembly الگوریتم باید ساختار کامل ژنوم را بدون داشتن تصویر نهایی بازسازی کند و علاوه بر هزینه محاسباتی زیاد، با مشکلات بنیادی داده‌های زیستی روبه‌رو است.


4. چرا Read Alignment به ژنوم مرجع نیاز دارد؟

پاسخ: زیرا هدف آن پیدا کردن محل readها در یک توالی شناخته‌شده است. بدون ژنوم مرجع، محلی برای مقایسه وجود ندارد.


5. تشبیه پازل چگونه تفاوت Alignment و Assembly را توضیح می‌دهد؟

پاسخ: در Alignment تصویر روی جعبه پازل وجود دارد و فقط باید قطعات را جای‌گذاری کنیم، اما در Assembly باید بدون تصویر، خودمان پازل را بازسازی کنیم.


03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/10_lecture-first-and-second-laws-of-assembly

قوانین اول و دوم اسمبلی ژنوم (First and Second Laws of Assembly)

خلاصه کلی

در این درس، مسئله Genome Assembly (اسمبلی ژنوم) معرفی می‌شود؛ مسئله‌ای که هدف آن بازسازی توالی کامل یک ژنوم از مجموعه‌ای از Sequencing Reads است.

برخلاف Read Alignment که در آن یک ژنوم مرجع داریم و خوانش‌ها را روی آن قرار می‌دهیم، در De Novo Assembly هیچ اطلاعاتی درباره توالی ژنوم یا محل قرارگیری خوانش‌ها نداریم و باید ژنوم را از روی خود Readها بازسازی کنیم.

هدف اصلی این بخش:

  • تعریف مفهوم Coverage

  • درک نقش Overlap بین Readها در کنار هم گذاشتن قطعات ژنوم

  • معرفی دو اصل مهم اسمبلی:

    • First Law of Assembly
    • Second Law of Assembly

مفاهیم کلیدی

1. Genome Assembly (اسمبلی ژنوم)

تعریف ساده

فرایند بازسازی توالی کامل یک ژنوم از مجموعه‌ای از قطعات کوتاه DNA به نام Reads.

توضیح دقیق

در فناوری‌های Sequencing، دستگاه مستقیماً کل ژنوم را نمی‌خواند، بلکه تعداد زیادی قطعه کوتاه از DNA تولید می‌کند.

ورودی مسئله اسمبلی:

  • تعداد زیادی Read کوتاه

  • بدون اطلاع از:

    • محل هر Read در ژنوم
    • توالی واقعی ژنوم

خروجی مورد انتظار:

  • بازسازی توالی اصلی ژنوم

این مسئله مانند حل کردن یک پازل است، اما با یک تفاوت مهم:

  • در پازل معمولی، تصویر نهایی روی جعبه وجود دارد.
  • در Assembly، تصویر نهایی وجود ندارد و باید خودمان آن را از قطعات پیدا کنیم.

اهمیت

Assembly برای موجوداتی که ژنوم مرجع ندارند ضروری است.

مثلاً هنگام تعیین توالی یک گونه جدید، نمی‌توان از Reference Genome استفاده کرد و باید از De Novo Assembly کمک گرفت.


2. De Novo Assembly (اسمبلی از صفر)

تعریف ساده

بازسازی ژنوم بدون استفاده از ژنوم مرجع.

توضیح دقیق

عبارت De Novo به معنی «از ابتدا» یا «از صفر» است.

در این روش:

  • هیچ Reference Genome وجود ندارد.
  • ترتیب Readها باید فقط از روی شباهت بین خودشان مشخص شود.

مقایسه با Read Alignment

ویژگی Read Alignment De Novo Assembly
ژنوم مرجع دارد ندارد
هدف پیدا کردن محل Read بازسازی ژنوم
سختی محاسباتی کمتر بیشتر
مثال قرار دادن قطعات روی نقشه ساختن نقشه از قطعات

3. Coverage (پوشش توالی‌یابی)

تعریف ساده

Coverage میزان اطلاعات تکراری‌ای است که درباره هر بخش از ژنوم داریم.

توضیح دقیق

فرض کنید یک موقعیت خاص از ژنوم توسط چند Read مختلف پوشانده شده باشد.

اگر یک باز DNA توسط 5 Read خوانده شده باشد:

  • Coverage آن موقعیت = 5

یعنی پنج مدرک مستقل درباره آن باز داریم.

به بیان دیگر، هر Read مانند یک رأی درباره هویت آن باز عمل می‌کند.


انواع Coverage

1. Per-base Coverage (پوشش در یک موقعیت خاص)

تعداد Readهایی که یک موقعیت مشخص از ژنوم را پوشش می‌دهند.

مثال:

اگر در یک موقعیت:

  • 3 Read حرف G گزارش کنند.
  • 2 Read حرف A گزارش کنند.

Coverage برابر 5 است، اما بین Readها اختلاف وجود دارد.

این اختلاف می‌تواند ناشی از:

  • خطای Sequencing
  • تفاوت واقعی بین نسخه‌های ژنوم باشد.

2. Average Coverage / Overall Coverage (پوشش متوسط)

میانگین Coverage در کل ژنوم.

فرمول:

[ Coverage = \frac{\text{Total length of reads}}{\text{Genome length}} ]

مثال:

اگر:

  • مجموع طول Readها = 177 باز
  • طول ژنوم = 35 باز

آنگاه:

[ Coverage \approx 5 ]

(در مثال مدرس حدود 7-fold coverage ذکر شده است.)


4. Read Overlap (همپوشانی Readها)

تعریف ساده

بخشی مشترک بین دو Read که نشان می‌دهد احتمالاً از قسمت‌های نزدیک ژنوم آمده‌اند.

توضیح دقیق

اگر انتهای یک Read (Suffix) شباهت زیادی به ابتدای Read دیگر (Prefix) داشته باشد، احتمال دارد این دو Read در ژنوم اصلی کنار هم قرار داشته باشند.

مثال:

Read A:
        ATCGGCTA

Read B:
          GGCTAAC

بخش:

GGCTA

در هر دو وجود دارد.

این شباهت نشان می‌دهد که این دو قطعه احتمالاً روی یک ناحیه از ژنوم همپوشانی دارند.


5. First Law of Assembly (قانون اول اسمبلی)

تعریف

اگر:

  • Suffix یک Read با Prefix یک Read دیگر شباهت زیادی داشته باشد،

آنگاه:

  • احتمال دارد این دو Read در ژنوم اصلی با هم Overlap داشته باشند.

توضیح دقیق

این قانون پایه‌ای‌ترین ایده برای کنار هم گذاشتن Readها است.

فرایند:

  1. پیدا کردن Readهای مشابه
  2. تشخیص Overlap
  3. چسباندن Readها به یکدیگر
  4. ساختن قطعات بزرگ‌تر ژنوم

مانند کنار هم گذاشتن قطعات پازل.


6. علت وجود اختلاف در Overlapها

در حالت ایده‌آل، Readهای Overlap شده باید کاملاً مشابه باشند، اما در عمل ممکن است اختلاف وجود داشته باشد.

دو دلیل اصلی:


الف) Sequencing Errors (خطاهای توالی‌یابی)

گاهی دستگاه Sequencing یک باز را اشتباه گزارش می‌کند.

مثال:

ژنوم واقعی:

A C G T

Read تولید شده:

A C A T

در این حالت اختلاف ناشی از خطای آزمایش است.


ب) Polyploidy (چندکروموزومی بودن / وجود نسخه‌های مختلف ژنوم)

در موجوداتی مانند انسان:

  • هر کروموزوم دو نسخه دارد.
  • یک نسخه از مادر و یک نسخه از پدر دریافت می‌شود.

این دو نسخه کاملاً یکسان نیستند.

بنابراین ممکن است دو Read:

  • واقعاً از دو نسخه متفاوت ژنوم آمده باشند.
  • در یک موقعیت باز متفاوتی داشته باشند.

در این حالت اختلاف واقعی است، نه خطای Sequencing.


7. Second Law of Assembly (قانون دوم اسمبلی)

تعریف

هرچه Coverage بیشتر باشد:

  • تعداد Overlapها بیشتر می‌شود.
  • طول Overlapها نیز افزایش می‌یابد.

توضیح دقیق

Coverage بالاتر یعنی:

  • Readهای بیشتری از هر قسمت ژنوم داریم.
  • Readها فاصله کمتری از یکدیگر دارند.
  • احتمال پیدا کردن بخش‌های مشترک بیشتر است.

بنابراین Assembly با Coverage بالاتر معمولاً بهتر انجام می‌شود.


نکات مهم

  • در Assembly، برخلاف Alignment، ژنوم مرجع وجود ندارد.
  • هدف Assembly ساختن توالی ژنوم از روی Readهای پراکنده است.
  • Overlap بین Readها مانند چسبی است که قطعات ژنوم را به هم متصل می‌کند.
  • قانون اول اسمبلی بیان می‌کند که شباهت Suffix-Prefix نشانه وجود Overlap ژنومی است.
  • Coverage تعداد شواهدی است که برای هر موقعیت ژنوم داریم.
  • Coverage بالا باعث افزایش تعداد و طول Overlapها می‌شود.
  • اختلاف بین Readهای Overlap شده همیشه خطا نیست؛ ممکن است ناشی از Polyploidy باشد.
  • Assembly معمولاً از Alignment سخت‌تر است، زیرا هم محل Readها و هم توالی ژنوم ناشناخته است.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Genome Assembly اسمبلی ژنوم بازسازی ژنوم کامل از مجموعه Readها
De Novo Assembly اسمبلی از صفر بازسازی ژنوم بدون Reference Genome
Read خوانش توالی‌یابی قطعه کوتاهی از DNA که توسط Sequencer خوانده شده است
Reference Genome ژنوم مرجع توالی استاندارد برای مقایسه و Alignment
Coverage پوشش تعداد Readهایی که یک بخش از ژنوم را پوشش می‌دهند
Average Coverage پوشش متوسط میانگین Coverage در کل ژنوم
Overlap همپوشانی بخش مشترک بین دو Read
Suffix پسوند / انتهای رشته بخش انتهایی یک توالی
Prefix پیشوند / ابتدای رشته بخش ابتدایی یک توالی
Sequencing Error خطای توالی‌یابی اشتباه دستگاه در گزارش یک باز
Polyploidy چندنسخه‌ای بودن ژنوم وجود چند نسخه از کروموزوم‌ها
First Law of Assembly قانون اول اسمبلی ارتباط بین Suffix-Prefix similarity و Overlap
Second Law of Assembly قانون دوم اسمبلی ارتباط Coverage بیشتر با Overlap بیشتر

مثال‌ها و تشبیه‌ها

Assembly به عنوان حل پازل

مدرس Assembly را به حل یک پازل تشبیه می‌کند:

  • Readها = قطعات پازل
  • ژنوم = تصویر نهایی پازل

در Read Alignment:

  • تصویر روی جعبه موجود است (Reference Genome).
  • فقط باید قطعات را روی آن قرار دهیم.

در De Novo Assembly:

  • تصویر وجود ندارد.
  • باید خود تصویر را از قطعات بسازیم.

Coverage به عنوان رأی‌گیری

هر Read مانند یک رأی درباره یک موقعیت ژنومی است.

مثلاً:

5 Read یک موقعیت را پوشش داده‌اند:

  • 3 رأی برای G
  • 2 رأی برای A

Coverage = 5

اما هنوز درباره باز صحیح اختلاف وجود دارد.


خلاصه نهایی مرور سریع

  • Assembly یعنی بازسازی ژنوم از روی Readهای کوتاه.
  • De Novo Assembly زمانی استفاده می‌شود که ژنوم مرجع نداریم.
  • Coverage تعداد دفعاتی است که یک موقعیت ژنوم توسط Readها مشاهده شده است.
  • Coverage متوسط از تقسیم مجموع طول Readها بر طول ژنوم به دست می‌آید.
  • Overlap بین Readها اساس کنار هم قرار دادن قطعات ژنوم است.
  • قانون اول اسمبلی: شباهت Suffix یک Read با Prefix Read دیگر نشان‌دهنده احتمال Overlap است.
  • اختلاف بین Readهای Overlap شده می‌تواند ناشی از خطای Sequencing یا Polyploidy باشد.
  • قانون دوم اسمبلی: Coverage بیشتر باعث Overlapهای بیشتر و طولانی‌تر می‌شود.
  • Assembly سخت‌تر از Alignment است زیرا هیچ نقشه مرجعی در اختیار نداریم.
  • Overlapها نقش «چسب» برای اتصال قطعات ژنوم را دارند.

سوالات مرور

1. تفاوت اصلی بین Read Alignment و De Novo Assembly چیست؟

پاسخ: در Read Alignment یک ژنوم مرجع وجود دارد و هدف پیدا کردن محل Readها روی آن است. اما در De Novo Assembly هیچ ژنوم مرجعی وجود ندارد و باید خود ژنوم از روی Readها بازسازی شود.


2. Coverage چیست و چه اطلاعاتی به ما می‌دهد؟

پاسخ: Coverage تعداد Readهایی است که یک موقعیت مشخص از ژنوم را پوشش می‌دهند. این مقدار نشان‌دهنده میزان اطلاعات تکراری درباره آن بخش از ژنوم است.


3. قانون اول اسمبلی چه چیزی بیان می‌کند؟

پاسخ: اگر Suffix یک Read با Prefix Read دیگری شباهت زیادی داشته باشد، احتمال دارد این دو Read از بخش‌های Overlap شده یک ژنوم آمده باشند.


4. چرا ممکن است دو Read که Overlap دارند دقیقاً یکسان نباشند؟

پاسخ: دو دلیل اصلی وجود دارد:

  1. خطای Sequencing
  2. تفاوت واقعی بین نسخه‌های مختلف ژنوم در موجودات Polyploid مانند انسان

5. چرا Coverage بالا برای Assembly مفید است؟

پاسخ: زیرا با افزایش Coverage، Readهای بیشتری از هر بخش ژنوم داریم؛ در نتیجه Overlapهای بیشتر و طولانی‌تری ایجاد می‌شود و بازسازی ژنوم دقیق‌تر خواهد بود.


03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/11_lecture-overlap-graphs

نمودارهای همپوشانی (Overlap Graphs) در اسمبلی ژنوم

خلاصه کلی

در اسمبلی ژنوم، یکی از مهم‌ترین اطلاعاتی که برای بازسازی توالی اصلی استفاده می‌کنیم، Overlap بین Readها است. در درس‌های قبل یاد گرفتیم که شباهت بین انتهای یک Read و ابتدای Read دیگر می‌تواند نشان‌دهنده این باشد که این دو قطعه از بخش‌های نزدیک ژنوم آمده‌اند.

در این درس، برای مدیریت تعداد زیادی از این روابط، ساختاری به نام Overlap Graph (نمودار همپوشانی) معرفی می‌شود.

هدف یادگیری این بخش:

  • درک مفهوم Graph و Directed Graph
  • تبدیل روابط Overlap بین Readها به یک ساختار گرافی
  • یادگیری اینکه چگونه مسیر موجود در گراف می‌تواند توالی اصلی ژنوم را نشان دهد

مفاهیم کلیدی

1. Graph (گراف)

تعریف ساده

گراف یک ساختار داده‌ای برای نمایش مجموعه‌ای از اشیا و ارتباط بین آن‌ها است.

یک گراف از دو بخش اصلی تشکیل می‌شود:

  1. Nodes (گره‌ها)
  2. Edges (یال‌ها)

توضیح دقیق

در گراف:

  • Node نماینده یک شیء یا مفهوم است.
  • Edge رابطه بین دو Node را نشان می‌دهد.

مثال ساده:

در یک شبکه اجتماعی:

  • افراد → Nodes
  • رابطه دوستی → Edge

در مسئله اسمبلی:

  • Readها → Nodes
  • Overlap بین Readها → Edge

اهمیت

گراف به ما اجازه می‌دهد تعداد زیادی رابطه را هم‌زمان نمایش داده و تحلیل کنیم.

در Assembly، به جای بررسی تک‌تک Overlapها، همه روابط را در یک ساختار واحد ذخیره می‌کنیم.


2. Directed Graph (گراف جهت‌دار)

تعریف ساده

گرافی که در آن یال‌ها دارای جهت هستند.

یعنی رابطه از یک Node به Node دیگر مشخص است.


توضیح دقیق

در Directed Graph:

A → B

با:

B → A

یکسان نیست.

جهت یال معنی خاصی دارد.

مثال:

در نمایش روابط نمایشنامه Hamlet:

Hamlet → Polonius

می‌تواند معنی:

«هملت، پولونیوس را می‌کشد»

داشته باشد.

اما:

Polonius → Hamlet

معنی متفاوتی خواهد داشت.


کاربرد در Assembly

در Overlap Graph:

جهت یال نشان می‌دهد:

  • کدام Read دارای Suffix است.
  • کدام Read دارای Prefix مشابه است.

یعنی:

Read A → Read B

یعنی:

Suffix مربوط به Read A با Prefix مربوط به Read B همپوشانی دارد.


3. Overlap Graph (نمودار همپوشانی)

تعریف ساده

گرافی که در آن:

  • هر Node یک Read است.
  • هر Edge نشان‌دهنده Overlap بین دو Read است.

ساختار گراف

برای ساخت Overlap Graph:

  1. هر Read را به یک Node تبدیل می‌کنیم.

  2. اگر دو Read دارای Overlap باشند:

    • یک Edge جهت‌دار بین آن‌ها رسم می‌کنیم.

جهت Edge:

از:

Read دارای Suffix

به:

Read دارای Prefix

است.


اهمیت

Overlap Graph ابزاری است برای:

  • سازمان‌دهی روابط بین Readها
  • پیدا کردن ترتیب صحیح Readها
  • بازسازی ژنوم اصلی

4. Overlap Threshold (آستانه همپوشانی)

تعریف ساده

حداقل میزان شباهتی که برای پذیرفتن یک Overlap لازم است.


توضیح دقیق

هر شباهتی بین دو Read الزاماً معنی‌دار نیست.

مثلاً:

اگر فقط یک نوکلئوتید مشترک داشته باشند:

A

A

ممکن است کاملاً تصادفی باشد.

بنابراین باید شرطی تعیین کنیم که فقط Overlapهای معتبر وارد گراف شوند.


مثال مطرح‌شده در درس

برای ساده‌سازی:

یک Overlap باید:

  1. کاملاً Exact Match باشد.
  2. طول آن حداقل 4 نوکلئوتید باشد.

یعنی:

Suffix و Prefix باید:

  • بدون اختلاف باشند.
  • حداقل 4 باز طول داشته باشند.

اهمیت

Threshold باعث کاهش:

  • Overlapهای تصادفی
  • پیچیدگی گراف

می‌شود.


5. Walking Through the Graph (پیمایش گراف)

تعریف ساده

حرکت در مسیر مشخصی از Nodeها برای بازسازی توالی ژنوم.


توضیح دقیق

در یک Overlap Graph ایده‌آل:

مسیر درست در گراف:

  • ترتیب واقعی Readها را نشان می‌دهد.
  • با دنبال کردن آن می‌توان ژنوم اصلی را بازسازی کرد.

مثال

فرض کنید Readها:

GTACGT
TACGTA
ACGTAC

باشند.

بین Readها Overlap پنج‌تایی وجود دارد:

GTACGT
   |||||
TACGTA

پس مسیر:

GTACGT → TACGTA → ACGTAC

توالی اصلی را بازسازی می‌کند.


مثال‌ها و تشبیه‌ها

Overlap Graph مانند اتصال قطعات پازل

مدرس Assembly را مانند حل پازل توضیح می‌دهد.

در این تشبیه:

  • Readها = قطعات پازل
  • Overlapها = بخش‌های مشترک قطعات
  • Graph = نقشه ارتباط همه قطعات

اگر بدانیم کدام قطعه به کدام قطعه وصل می‌شود، می‌توانیم تصویر نهایی را بازسازی کنیم.


مثال ساخت گراف از 6-merها

برای نمایش ایده:

  1. یک ژنوم فرضی داریم.
  2. تمام زیررشته‌های طول 6 (6-mer) را استخراج می‌کنیم.
  3. هر 6-mer تبدیل به یک Node می‌شود.
  4. هر دو Node که Overlap معتبر دارند، با Edge وصل می‌شوند.

مثلاً:

GTACGT
TACGTA

دارای Overlap:

TACGT

هستند.

پس یک Edge بین آن‌ها ایجاد می‌شود.


نکات مهم

  • Overlapها اطلاعات اصلی برای اتصال Readها هستند.

  • Graph روشی مناسب برای نمایش تعداد زیادی رابطه بین Readها است.

  • در Overlap Graph:

    • Node = Read
    • Edge = Overlap
  • جهت Edge اهمیت دارد و نشان‌دهنده ترتیب احتمالی Readها است.

  • همه Overlapها قابل اعتماد نیستند؛ باید Threshold تعریف شود.

  • مسیر درست در Overlap Graph می‌تواند توالی ژنوم اصلی را بازسازی کند.

  • مثال‌های آموزشی معمولاً ایده‌آل هستند، اما داده واقعی پیچیده‌تر است.

  • در داده واقعی مشکلاتی مانند:

    • Sequencing Error
    • Polyploidy
    • Overlapهای اشتباه

وجود دارند.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Graph گراف ساختاری برای نمایش اشیا و روابط بین آن‌ها
Node گره عنصر اصلی یک گراف که نماینده یک شیء است
Edge یال رابطه بین دو Node
Directed Graph گراف جهت‌دار گرافی که یال‌های آن جهت دارند
Overlap Graph نمودار همپوشانی گرافی که روابط Overlap بین Readها را نمایش می‌دهد
Read خوانش قطعه کوتاه DNA حاصل از Sequencing
Suffix انتهای رشته بخش پایانی یک توالی
Prefix ابتدای رشته بخش ابتدایی یک توالی
Overlap همپوشانی بخش مشترک بین دو Read
Threshold آستانه حداقل شرط لازم برای قبول یک Overlap
6-mer زیررشته 6 نوکلئوتیدی قطعه‌ای از DNA با طول 6 باز
Path مسیر ترتیب حرکت از Nodeهای مختلف در گراف

خلاصه نهایی مرور سریع

  • Overlapها نقش اتصال‌دهنده Readها در Assembly را دارند.
  • برای مدیریت تعداد زیاد Overlapها از Overlap Graph استفاده می‌شود.
  • در Overlap Graph، Readها به عنوان Node و Overlapها به عنوان Edge نمایش داده می‌شوند.
  • چون رابطه Overlap جهت دارد، از Directed Graph استفاده می‌شود.
  • جهت Edge از Read دارای Suffix به Read دارای Prefix مشابه است.
  • برای جلوگیری از Overlapهای تصادفی، Threshold تعیین می‌شود.
  • در مثال ساده، مسیر خاصی در Graph همان ترتیب واقعی Readها و ژنوم اصلی را نشان می‌دهد.
  • داده‌های واقعی بسیار پیچیده‌تر از مثال‌های آموزشی هستند.
  • Sequencing Error و Polyploidy می‌توانند باعث ایجاد گراف‌های پیچیده شوند.
  • هدف نهایی پیمایش صحیح Graph برای بازسازی ژنوم است.

سوالات مرور

1. چرا در Assembly به Overlap Graph نیاز داریم؟

پاسخ: زیرا تعداد Readها و روابط Overlap بین آن‌ها بسیار زیاد است. Graph این روابط را در یک ساختار منظم نمایش می‌دهد و پیدا کردن ترتیب Readها را آسان‌تر می‌کند.


2. در Overlap Graph، Node و Edge چه چیزی را نشان می‌دهند؟

پاسخ:

  • Nodeها نشان‌دهنده Readهای توالی‌یابی هستند.
  • Edgeها نشان‌دهنده وجود Overlap بین دو Read هستند.

3. چرا از Directed Graph استفاده می‌کنیم؟

پاسخ: زیرا Overlap دارای جهت است. اگر Suffix یک Read با Prefix Read دیگر تطبیق داشته باشد، رابطه از Read اول به Read دوم تعریف می‌شود.


4. چرا نمی‌توانیم هر شباهت کوتاه بین دو Read را Overlap در نظر بگیریم؟

پاسخ: زیرا شباهت‌های کوتاه ممکن است تصادفی باشند. بنابراین باید Threshold تعیین کنیم تا فقط Overlapهای قابل اعتماد وارد Graph شوند.


5. چگونه مسیر موجود در Overlap Graph به بازسازی ژنوم کمک می‌کند؟

پاسخ: مسیر صحیح در Graph ترتیب قرارگیری Readها را نشان می‌دهد. با دنبال کردن این مسیر و ترکیب بخش‌های Overlap شده، می‌توان توالی اصلی ژنوم را بازسازی کرد.


03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/12_practical-overlaps-between-pairs-of-reads

پیاده‌سازی یافتن هم‌پوشانی بین جفت خوانش‌ها (Overlap Between Pairs of Reads)

خلاصه کلی

در این درس عملی، هدف پیاده‌سازی تابعی برای پیدا کردن هم‌پوشانی (Overlap) بین دو توالی DNA است. این تابع یکی از اجزای پایه‌ای در الگوریتم‌های مونتاژ ژنوم (Genome Assembly) خواهد بود، زیرا برای کنار هم قرار دادن قطعات کوتاه DNA (Reads) باید بدانیم کدام خوانش‌ها دارای بخش‌های مشترک هستند.

هدف یادگیری:

  • طراحی تابعی برای یافتن طول بیشترین هم‌پوشانی بین دو رشته
  • استفاده از عملیات جستجوی رشته‌ای در Python
  • درک نقش overlap در مراحل بعدی مونتاژ ژنوم

مفاهیم کلیدی

1. Overlap (هم‌پوشانی)

تعریف ساده

Overlap بخشی مشترک بین دو توالی است که انتهای یک توالی با ابتدای توالی دیگر مطابقت دارد.

توضیح دقیق

فرض کنید دو خوانش DNA داریم:

Read A: ATCGT
Read B: CGTAA

انتهای Read A:

CGT

با ابتدای Read B:

CGT

مطابقت دارد، بنابراین طول overlap برابر است با:

Overlap = 3

در این درس فرض می‌شود که:

  • توالی اول (a) باید قبل از توالی دوم (b) قرار گیرد.
  • بررسی می‌کنیم که suffix (پسوند) از a با prefix (پیشوند) از b مطابقت دارد.

2. Suffix-Prefix Matching (تطبیق پسوند-پیشوند)

تعریف ساده

روشی برای پیدا کردن بخش مشترک بین انتهای یک رشته و ابتدای رشته دیگر.

توضیح دقیق

در مونتاژ ژنوم:

  • هر Read فقط بخشی از ژنوم اصلی است.
  • اگر انتهای یک Read با ابتدای Read دیگر مشابه باشد، احتمال دارد این دو Read در ژنوم کنار هم قرار داشته باشند.

رابطه:

Suffix(read A) ≈ Prefix(read B)

نشان‌دهنده احتمال وجود overlap بین آن‌ها است.


3. تابع Overlap

هدف تابع

تابعی طراحی می‌شود که:

ورودی:

  • رشته اول a
  • رشته دوم b
  • حداقل طول قابل قبول overlap

خروجی:

  • طول overlap در صورت وجود
  • مقدار صفر در صورت نبود overlap مناسب

شکل کلی:

overlap(a, b, min_length)

4. استفاده از تابع find() در Python

تعریف

تابع:

string.find(substring, start)

برای پیدا کردن موقعیت یک زیررشته داخل یک رشته استفاده می‌شود.

عملکرد در این الگوریتم

در اینجا:

  • پیشوندهای مختلف رشته b در رشته a جستجو می‌شوند.
  • پارامتر start مشخص می‌کند جستجو از کدام موقعیت ادامه پیدا کند.

مثال:

a.find("CGT", 2)

یعنی:

  • رشته CGT را در a پیدا کن.
  • جستجو را از اندیس 2 شروع کن.

5. حلقه جستجوی تکراری (Iterative Search)

از آنجا که ممکن است یک پیشوند از b چند بار در a ظاهر شود، الگوریتم از یک حلقه استفاده می‌کند:

مراحل:

  1. پیدا کردن اولین رخداد prefix از b در a
  2. بررسی اینکه آیا ادامه رشته‌ها نیز مطابقت دارند یا خیر
  3. اگر تطبیق کامل نبود، جستجو از محل بعدی ادامه پیدا می‌کند

6. بررسی ادامه تطبیق با startswith()

تابع:

startswith()

بررسی می‌کند که آیا یک رشته با بخش مشخصی شروع می‌شود یا خیر.

در این الگوریتم:

  • بعد از پیدا کردن موقعیت شروع overlap،
  • بررسی می‌شود که ادامه b با ادامه a مطابقت دارد.

اگر:

b[start:]

با بخش انتهایی a برابر باشد:

→ یک overlap معتبر پیدا شده است.


الگوریتم کلی یافتن Overlap

مراحل:

  1. یک موقعیت شروع (start) تعریف کن.
  2. پیشوند b را در a جستجو کن.
  3. اگر چیزی پیدا نشد:
return 0
  1. اگر پیدا شد:

    • بررسی کن که ادامه رشته‌ها نیز هماهنگ هستند.
  2. اگر تطبیق کامل بود:

طول overlap را برگردان.

فرمول:

[ Overlap = |a| - start ]

  1. اگر تطبیق کامل نبود:

    • موقعیت جستجو را افزایش بده.
    • دوباره جستجو کن.

نکات مهم

  • در مونتاژ ژنوم، overlapها مانند چسب (Glue) عمل می‌کنند و به اتصال Readها کمک می‌کنند.
  • تابع طراحی‌شده فقط حالتی را بررسی می‌کند که:
a → b

یعنی b بعد از a قرار می‌گیرد.

  • اگر overlap کمتر از حداقل تعیین‌شده باشد، آن overlap معتبر نیست.
  • استفاده از حداقل طول overlap باعث کاهش احتمال تطبیق‌های تصادفی می‌شود.
  • بیشترین overlap معمولاً بهترین نشانه برای کنار هم قرار گرفتن دو Read است.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Overlap هم‌پوشانی بخش مشترک بین انتهای یک Read و ابتدای Read دیگر
Read خوانش قطعه کوتاهی از DNA که توسط دستگاه توالی‌یابی تولید شده است
Genome Assembly مونتاژ ژنوم فرآیند بازسازی توالی ژنوم از روی Readها
Suffix پسوند بخش انتهایی یک رشته
Prefix پیشوند بخش ابتدایی یک رشته
String رشته توالی کاراکترها مانند DNA sequence
Minimum overlap length حداقل طول هم‌پوشانی کمترین اندازه قابل قبول برای overlap
Index اندیس موقعیت یک کاراکتر در رشته
find() تابع جستجو تابع Python برای یافتن زیررشته
startswith() بررسی شروع رشته بررسی اینکه آیا رشته با بخش مشخصی آغاز می‌شود

مثال‌ها و تشبیه‌ها

مثال DNA

دو Read زیر را در نظر بگیرید:

a = ATCGT
b = CGTAA

انتهای a:

CGT

ابتدای b:

CGT

بنابراین:

overlap = 3

اما اگر حداقل overlap برابر 4 باشد:

3 < 4

پس این هم‌پوشانی رد می‌شود و خروجی:

0

خواهد بود.


تشبیه پازل

Readها مانند قطعات پازل هستند.

برای کنار هم قرار دادن دو قطعه:

  • باید لبه‌های آن‌ها با هم جور شود.
  • هرچه بخش مشترک بزرگ‌تر باشد، احتمال اتصال صحیح بیشتر است.

Overlap همان بخشی است که دو قطعه پازل را به هم وصل می‌کند.


خلاصه نهایی مرور سریع

  • Overlap یعنی تطبیق انتهای یک Read با ابتدای Read دیگر.
  • در مونتاژ ژنوم، overlapها برای اتصال Readها استفاده می‌شوند.
  • تابع overlap(a,b,min_length) طول بیشترین overlap معتبر را محاسبه می‌کند.
  • الگوریتم ابتدا prefix رشته b را در رشته a جستجو می‌کند.
  • تابع find() برای پیدا کردن موقعیت شروع تطبیق استفاده می‌شود.
  • تابع startswith() برای بررسی ادامه تطبیق استفاده می‌شود.
  • اگر هیچ overlap معتبر پیدا نشود، خروجی صفر است.
  • تعیین حداقل طول overlap از پذیرش تطبیق‌های تصادفی جلوگیری می‌کند.
  • overlapهای طولانی‌تر معمولاً شواهد قوی‌تری برای اتصال دو Read هستند.
  • این تابع یک بلوک پایه برای الگوریتم‌های پیشرفته‌تر Genome Assembly است.

سوالات مرور

1. سوال مفهومی:

چرا overlap در مونتاژ ژنوم اهمیت دارد؟

پاسخ: زیرا overlapها اطلاعات لازم برای تشخیص ترتیب قرارگیری Readها را فراهم می‌کنند و مانند اتصال‌دهنده‌ای برای بازسازی ژنوم عمل می‌کنند.


2. سوال تعریفی:

Overlap بین دو Read چیست؟

پاسخ: بخشی از توالی است که suffix یک Read با prefix Read دیگر مطابقت دارد.


3. سوال کاربردی:

اگر دو Read دارای overlap به طول 3 باشند اما حداقل طول مورد نیاز 5 باشد، خروجی تابع چه خواهد بود؟

پاسخ: تابع مقدار 0 برمی‌گرداند، زیرا overlap کوتاه‌تر از حد مجاز است.


4. سوال مفهومی:

چرا الگوریتم فقط اولین تطبیق پیدا شده را قبول نمی‌کند؟

پاسخ: زیرا ممکن است یک prefix چندین بار در رشته وجود داشته باشد و برخی تطبیق‌ها کامل نباشند. بنابراین باید همه موقعیت‌های ممکن بررسی شوند تا بهترین overlap پیدا شود.


5. سوال کاربردی:

تابع find() چه نقشی در این الگوریتم دارد؟

پاسخ: برای پیدا کردن موقعیت‌هایی استفاده می‌شود که prefix یک Read در Read دیگر ظاهر شده است تا امکان بررسی overlap فراهم شود.


03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/13_practical-finding-and-representing-all-overlaps

ساخت و نمایش همه هم‌پوشانی‌ها بین مجموعه‌ای از Readها (Finding and Representing All Overlaps)

خلاصه کلی

در این درس عملی، هدف توسعه تابع Overlap از درس قبل و استفاده از آن برای ساخت یک نقشه ساده از هم‌پوشانی‌های بین مجموعه‌ای از Readهای DNA است.

در مونتاژ ژنوم، برای بازسازی توالی اصلی باید بدانیم:

  • کدام Readها با هم هم‌پوشانی دارند.
  • ترتیب احتمالی قرارگیری آن‌ها چگونه است.

در این بخش یک روش ساده و ابتدایی (Naive Overlap Mapping) پیاده‌سازی می‌شود که تمام جفت‌های ممکن از Readها را بررسی می‌کند و اگر بین دو Read هم‌پوشانی معتبر وجود داشت، آن را ذخیره می‌کند.

هدف یادگیری:

  • استفاده از تابع overlap برای چندین Read
  • تولید تمام جفت‌های ممکن از Readها
  • ذخیره روابط overlap در یک ساختار داده مناسب
  • ایجاد پایه‌ای برای ساخت گراف‌های مونتاژ ژنوم

مفاهیم کلیدی

1. Naive Overlap Map (نقشه ساده هم‌پوشانی)

تعریف ساده

یک ساختار داده که تمام روابط هم‌پوشانی بین Readها را ذخیره می‌کند.

توضیح دقیق

برای مجموعه‌ای از Readها:

Reads = {A, B, C, ...}

الگوریتم تمام جفت‌های ممکن را بررسی می‌کند:

A → B
A → C
B → A
B → C
...

اگر:

suffix(Read A) = prefix(Read B)

و طول overlap از حداقل تعیین‌شده بیشتر باشد، این رابطه ثبت می‌شود.

خروجی معمولاً به صورت یک دیکشنری ذخیره می‌شود:

{
(read1, read2): overlap_length
}

مثال:

{
("ATTGC", "GCAAA"): 2
}

یعنی دو Read دارای overlap به طول 2 هستند.


2. Permutations (جایگشت‌ها)

تعریف ساده

Permutation تمام حالت‌های ممکن انتخاب عناصر از یک مجموعه با در نظر گرفتن ترتیب است.

توضیح دقیق

در Python از کتابخانه:

itertools

برای تولید جایگشت‌ها استفاده می‌شود.

مثلاً:

from itertools import permutations

اگر مجموعه داشته باشیم:

[1,2,3]

جایگشت‌های طول 1:

(1)
(2)
(3)

جایگشت‌های طول 2:

(1,2)
(1,3)
(2,1)
(2,3)
(3,1)
(3,2)

جایگشت‌های طول 3:

(1,2,3)
(1,3,2)
...

اهمیت Permutation در مونتاژ ژنوم

برای یافتن همه overlapها باید تمام جفت‌های Readها بررسی شوند.

مثلاً اگر سه Read داشته باشیم:

A
B
C

باید بررسی کنیم:

A با B
A با C
B با A
B با C
C با A
C با B

تابع permutations() این جفت‌ها را تولید می‌کند.


3. تابع naive_overlap()

هدف تابع

ایجاد نقشه هم‌پوشانی برای یک مجموعه Read.

شکل کلی:

naive_overlap(reads, k)

ورودی‌ها:

  • reads: مجموعه Readها
  • k: حداقل طول overlap قابل قبول

خروجی:

  • دیکشنری شامل تمام overlapهای معتبر

الگوریتم تابع naive_overlap

مرحله 1: ایجاد ساختار ذخیره‌سازی

یک دیکشنری ساخته می‌شود:

overlaps = {}

که روابط overlap را نگهداری می‌کند.


مرحله 2: تولید تمام جفت‌های Read

با استفاده از:

permutations(reads, 2)

تمام جفت‌های مرتب‌شده ایجاد می‌شوند.

مثلاً:

(read1, read2)
(read2, read1)

هر دو بررسی می‌شوند، زیرا جهت overlap مهم است.


مرحله 3: محاسبه طول overlap

برای هر جفت:

overlap(a,b)

فراخوانی می‌شود.

این تابع بررسی می‌کند که آیا:

suffix(a)

با:

prefix(b)

مطابقت دارد یا خیر.


مرحله 4: ذخیره overlapهای معتبر

اگر:

overlap_length > 0

باشد:

رابطه در دیکشنری ذخیره می‌شود:

overlaps[(a,b)] = overlap_length

نکات مهم

  • در این الگوریتم، جهت رابطه مهم است:

    A → B
    

    الزاماً برابر با:

    B → A
    

    نیست.

  • دلیل استفاده از جایگشت‌های مرتب این است که در مونتاژ ژنوم، ترتیب قرارگیری Readها اهمیت دارد.

  • این روش یک روش Naive (ساده و ابتدایی) است، زیرا تمام جفت‌های ممکن را بررسی می‌کند.

  • اگر تعداد Readها زیاد باشد، تعداد مقایسه‌ها بسیار افزایش می‌یابد.

برای n Read:

تعداد جفت‌های بررسی‌شده تقریباً:

[ n(n-1) ]

است.

بنابراین برای داده‌های واقعی توالی‌یابی، این روش به تنهایی کارآمد نیست.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Overlap Map نقشه هم‌پوشانی ساختاری برای ذخیره روابط overlap بین Readها
Naive Algorithm الگوریتم ساده/ابتدایی روشی که بدون بهینه‌سازی همه حالت‌ها را بررسی می‌کند
Permutation جایگشت تمام ترتیب‌های ممکن از عناصر یک مجموعه
Read Pair جفت خوانش دو Read که برای بررسی overlap مقایسه می‌شوند
Overlap Length طول هم‌پوشانی تعداد بازهای مشترک بین دو Read
Dictionary دیکشنری ساختار داده Python برای ذخیره کلید-مقدار
Key کلید شناسه رابطه ذخیره‌شده در دیکشنری
Value مقدار داده مرتبط با کلید، مانند طول overlap
Genome Assembly مونتاژ ژنوم بازسازی ژنوم از روی Readها

مثال‌ها و تشبیه‌ها

مثال ساده با Readها

فرض کنید سه Read داریم:

Read 1: ACGT
Read 2: GTAA
Read 3: TTAC

بررسی‌ها:

Read 1 و Read 2:

Read 1: AC GT
Read 2: GT AA

Overlap:

GT

طول:

2

پس:

Read1 → Read2 = 2

Read 3 و Read 1:

Read3: TT AC
Read1: AC GT

Overlap:

AC

پس:

Read3 → Read1 = 2

نتیجه:

{
(Read1, Read2): 2,
(Read3, Read1): 2
}

تشبیه پازل

هر Read مانند یک قطعه پازل است.

برای پیدا کردن اینکه کدام قطعات کنار هم قرار می‌گیرند:

  • همه قطعات را دو به دو امتحان می‌کنیم.
  • اگر لبه‌های آن‌ها هماهنگ بود، رابطه را ذخیره می‌کنیم.

نقشه overlap در واقع فهرستی از اتصالات احتمالی بین قطعات پازل ژنوم است.


خلاصه نهایی مرور سریع

  • هدف این درس ساخت یک نقشه ساده از overlap بین Readها است.
  • تابع overlap از درس قبل برای مقایسه Readها استفاده می‌شود.
  • permutations() تمام جفت‌های ممکن Readها را تولید می‌کند.
  • ترتیب Readها مهم است؛ بنابراین از جایگشت مرتب استفاده می‌شود.
  • خروجی در یک دیکشنری ذخیره می‌شود.
  • کلید دیکشنری یک جفت Read است.
  • مقدار دیکشنری طول overlap بین آن دو Read است.
  • الگوریتم naive تمام جفت‌های ممکن را بررسی می‌کند.
  • پیچیدگی آن برای داده‌های بزرگ زیاد است.
  • این روش پایه‌ای برای ساخت Overlap Graph در مونتاژ ژنوم است.

سوالات مرور

1. سوال مفهومی:

چرا باید همه جفت‌های Readها بررسی شوند؟

پاسخ: زیرا قبل از ساخت گراف مونتاژ باید بدانیم کدام Readها با یکدیگر هم‌پوشانی دارند و ترتیب قرارگیری آن‌ها چگونه است.


2. سوال تعریفی:

Naive Overlap Map چیست؟

پاسخ: ساختاری است که تمام روابط هم‌پوشانی بین جفت‌های Read را با بررسی همه حالت‌های ممکن ذخیره می‌کند.


3. سوال کاربردی:

اگر 1000 Read داشته باشیم، چرا روش naive مشکل‌ساز می‌شود؟

پاسخ: زیرا باید تقریباً یک میلیون مقایسه انجام شود:

[ 1000 \times 999 ]

و این برای داده‌های بزرگ توالی‌یابی بسیار زمان‌بر است.


4. سوال مفهومی:

چرا (A,B) و (B,A) جداگانه بررسی می‌شوند؟

پاسخ: زیرا overlap جهت دارد؛ ممکن است انتهای A با ابتدای B تطبیق داشته باشد، اما برعکس آن وجود نداشته باشد.


5. سوال کاربردی:

اگر تابع overlap مقدار صفر برگرداند، چه چیزی در نقشه overlap ذخیره می‌شود؟

پاسخ: هیچ رابطه‌ای ذخیره نمی‌شود، زیرا بین دو Read یک overlap معتبر وجود ندارد.


04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/01_module-4-introduction

مقدمه‌ای بر الگوریتم‌های مونتاژ ژنوم (Introduction to Algorithms for Assembly)

خلاصه کلی

در این بخش، وارد مرحله جدیدی از مطالعه مونتاژ ژنوم (Genome Assembly) می‌شویم و بررسی می‌کنیم که چگونه می‌توان این مسئله زیستی را با استفاده از الگوریتم‌های محاسباتی حل کرد.

تا اینجا با اصول اولیه مونتاژ آشنا شدیم؛ از جمله:

  • مفهوم Readها
  • هم‌پوشانی بین Readها (Overlap)
  • ساختارهایی مانند گراف‌های هم‌پوشانی (Overlap Graphs)

اما سؤال اصلی این است:

چگونه می‌توان یک الگوریتم کارآمد طراحی کرد که توالی اصلی ژنوم را از روی مجموعه‌ای از Readها بازسازی کند؟

در این ماژول، چند رویکرد الگوریتمی مختلف بررسی خواهد شد:

  1. تبدیل مسئله مونتاژ به یک مسئله کلاسیک محاسباتی به نام Shortest Common Superstring (SCS).
  2. بررسی محدودیت‌های بنیادی الگوریتم‌ها در مواجهه با ژنوم‌های تکراری (Repetitive Genomes).
  3. معرفی روش مبتنی بر De Bruijn Graphs که رویکرد متفاوتی برای مونتاژ ارائه می‌دهد.
  4. بررسی اینکه نرم‌افزارهای واقعی مونتاژ ژنوم در عمل چگونه کار می‌کنند.

هدف یادگیری:

  • درک ارتباط بین مسئله مونتاژ ژنوم و مسائل کلاسیک علوم کامپیوتر.
  • شناخت نقاط قوت و ضعف الگوریتم‌های مختلف مونتاژ.
  • درک اینکه چرا هیچ الگوریتمی برای همه شرایط کامل نیست.

مفاهیم کلیدی

1. Genome Assembly Algorithms (الگوریتم‌های مونتاژ ژنوم)

تعریف ساده

الگوریتم‌هایی هستند که تلاش می‌کنند توالی کامل یک ژنوم را از مجموعه‌ای از Readهای کوتاه بازسازی کنند.

توضیح دقیق

ورودی الگوریتم:

  • تعداد زیادی Read کوتاه که از بخش‌های مختلف ژنوم تولید شده‌اند.

خروجی:

  • یک یا چند توالی طولانی‌تر که نماینده ژنوم اصلی هستند.

چالش اصلی این است که:

  • مکان اصلی هر Read مشخص نیست.
  • توالی کامل ژنوم در اختیار نداریم.
  • خطاهای توالی‌یابی و تکرارهای ژنومی وجود دارند.

2. Shortest Common Superstring (SCS)

کوتاه‌ترین رشته مشترک فراگیر

تعریف ساده

یک مسئله محاسباتی که هدف آن یافتن کوتاه‌ترین رشته‌ای است که تمام رشته‌های ورودی را به عنوان زیررشته در خود جای دهد.

توضیح دقیق

فرض کنید چند Read داریم:

ACGT
CGTA
GTAA

هدف پیدا کردن کوتاه‌ترین رشته‌ای است که همه آن‌ها در آن وجود داشته باشند:

ACGTAA

زیرا:

  • ACGT در آن وجود دارد.
  • CGTA در آن وجود دارد.
  • GTAA در آن وجود دارد.

ارتباط با مونتاژ ژنوم

در مونتاژ ژنوم:

  • Readها همان رشته‌های ورودی هستند.
  • ژنوم اصلی همان Superstring موردنظر است.

بنابراین می‌توان مونتاژ ژنوم را به شکل یک مسئله SCS مدل کرد.

اهمیت

این تبدیل، امکان استفاده از ابزارهای علوم کامپیوتر برای حل مسائل زیستی را فراهم می‌کند.


3. Repetitive Genomes (ژنوم‌های تکراری)

تعریف ساده

ژنوم‌هایی که بخش‌هایی از توالی آن‌ها چندین بار تکرار شده است.

توضیح دقیق

یکی از مشکلات بزرگ مونتاژ این است که اگر یک توالی چند بار در ژنوم تکرار شده باشد، الگوریتم نمی‌تواند به راحتی تشخیص دهد که یک Read متعلق به کدام نسخه از آن تکرار است.

مثلاً:

ژنوم:

AAAACCCCCAAAACCCCC

دارای دو بخش مشابه است.

اگر Readی از یکی از این قسمت‌ها دریافت شود، مشخص نیست باید در کدام موقعیت قرار گیرد.

اهمیت

ژنوم‌های تکراری باعث می‌شوند:

  • حتی بهترین الگوریتم‌ها اشتباه کنند.
  • بازسازی کامل ژنوم همیشه امکان‌پذیر نباشد.

4. De Bruijn Graph (گراف دی‌بروین)

تعریف ساده

یک روش گرافی برای مونتاژ ژنوم که به جای استفاده مستقیم از Readها، آن‌ها را به قطعات کوچک‌تر تقسیم می‌کند.

توضیح دقیق

در این روش:

  • Readها به قطعات کوتاه‌تر به نام k-mer تقسیم می‌شوند.
  • این k-merها در یک گراف نمایش داده می‌شوند.
  • مسیر مناسب در گراف، توالی ژنوم را بازسازی می‌کند.

این روش نسبت به Overlap Graph رویکرد متفاوتی دارد.

اهمیت

De Bruijn Graph پایه بسیاری از مونتاژکننده‌های مدرن ژنوم است.


نکات مهم

  • مسئله مونتاژ ژنوم یک مسئله زیستی صرف نیست؛ بلکه یک مسئله مهم الگوریتمی و محاسباتی است.
  • تبدیل مونتاژ ژنوم به مسئله Shortest Common Superstring باعث می‌شود بتوان آن را با مفاهیم علوم کامپیوتر مطالعه کرد.
  • الگوریتم سریع همیشه بهترین الگوریتم نیست؛ گاهی افزایش سرعت با کاهش دقت همراه است.
  • ژنوم‌های دارای تکرار، محدودیت بنیادی برای تمام الگوریتم‌های مونتاژ ایجاد می‌کنند.
  • بعضی مشکلات مونتاژ ناشی از محدودیت الگوریتم نیستند، بلکه ذاتاً از اطلاعات ناکافی داده‌ها ناشی می‌شوند.
  • روش‌های مختلف مونتاژ، مانند Overlap Graph و De Bruijn Graph، هرکدام برای شرایط خاصی مناسب هستند.
  • نرم‌افزارهای واقعی مونتاژ ژنوم معمولاً ترکیبی از چندین ایده الگوریتمی هستند و دقیقاً مشابه مدل‌های ساده آموزشی عمل نمی‌کنند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Genome Assembly مونتاژ ژنوم بازسازی توالی کامل ژنوم از روی Readهای کوتاه
Assembly Algorithm الگوریتم مونتاژ روش محاسباتی برای اتصال Readها
Shortest Common Superstring (SCS) کوتاه‌ترین رشته مشترک فراگیر مسئله یافتن کوتاه‌ترین رشته شامل تمام رشته‌های ورودی
Repetitive Genome ژنوم تکراری ژنومی که دارای بخش‌های مشابه و تکرارشونده است
De Bruijn Graph گراف دی‌بروین ساختار گرافی مبتنی بر k-mer برای مونتاژ ژنوم
k-mer قطعه‌ای با طول k زیررشته‌ای کوتاه که از Read استخراج می‌شود
Algorithmic Problem مسئله الگوریتمی مسئله‌ای که با روش‌های محاسباتی حل می‌شود
Computational Biology زیست‌شناسی محاسباتی استفاده از روش‌های محاسباتی برای حل مسائل زیستی

مثال‌ها و تشبیه‌ها

تشبیه مونتاژ ژنوم به پازل

مونتاژ ژنوم مانند حل یک پازل بزرگ است.

در حالت Read Alignment:

  • تصویر روی جعبه پازل وجود دارد.
  • می‌دانیم قطعات باید کجا قرار گیرند.

این تصویر همان Reference Genome است.

اما در De Novo Assembly:

  • تصویر جعبه وجود ندارد.
  • فقط قطعات پراکنده پازل را داریم.
  • باید خودمان تصویر نهایی را بازسازی کنیم.

به همین دلیل De Novo Assembly دشوارتر است.


خلاصه نهایی مرور سریع

  • مونتاژ ژنوم یعنی بازسازی توالی ژنوم از روی Readهای کوتاه.
  • برای حل مونتاژ می‌توان آن را به مسائل کلاسیک علوم کامپیوتر تبدیل کرد.
  • یکی از این مسائل Shortest Common Superstring است.
  • ژنوم‌های تکراری باعث ایجاد ابهام در مونتاژ می‌شوند.
  • هیچ الگوریتمی نمی‌تواند تمام مشکلات ناشی از تکرارهای ژنومی را حذف کند.
  • De Bruijn Graph یک روش مهم جایگزین برای مونتاژ است.
  • الگوریتم‌های سریع معمولاً با مصالحه بین سرعت و دقت همراه هستند.
  • نرم‌افزارهای واقعی مونتاژ از ترکیبی از روش‌های مختلف استفاده می‌کنند.
  • علوم کامپیوتر نقش مهمی در پیشرفت زیست‌شناسی مدرن دارد.

سوالات مرور

1. سوال مفهومی:

چرا مونتاژ ژنوم یک مسئله الگوریتمی محسوب می‌شود؟

پاسخ: زیرا نیازمند پیدا کردن ترتیب مناسب تعداد زیادی Read و بازسازی یک توالی بزرگ از داده‌های پراکنده است؛ مسئله‌ای که با روش‌های محاسباتی و الگوریتم‌ها حل می‌شود.


2. سوال تعریفی:

Shortest Common Superstring چیست؟

پاسخ: کوتاه‌ترین رشته‌ای است که تمام رشته‌های ورودی را به عنوان زیررشته در خود جای می‌دهد.


3. سوال مفهومی:

چرا ژنوم‌های تکراری باعث مشکل در مونتاژ می‌شوند؟

پاسخ: زیرا Readهای مشابه ممکن است از چندین موقعیت مختلف ژنوم آمده باشند و الگوریتم نمی‌تواند محل دقیق آن‌ها را تشخیص دهد.


4. سوال کاربردی:

اگر یک گونه جدید هیچ Reference Genome نداشته باشد، از چه نوع مونتاژی استفاده می‌شود؟

پاسخ: از De Novo Assembly استفاده می‌شود، زیرا توالی مرجع برای مقایسه وجود ندارد.


5. سوال مقایسه‌ای:

تفاوت اصلی Read Alignment و De Novo Assembly چیست؟

پاسخ:

  • در Read Alignment، یک ژنوم مرجع موجود است و Readها روی آن قرار داده می‌شوند.
  • در De Novo Assembly، ژنوم مرجع وجود ندارد و توالی باید از ابتدا بازسازی شود.

04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/02_lecture-the-shortest-common-superstring-problem

مسئله کوتاه‌ترین ابررشته مشترک (Shortest Common Superstring Problem - SCS) و ارتباط آن با مونتاژ ژنوم

خلاصه کلی

در این درس، مسئله Assembly (مونتاژ ژنوم) به یک مسئله محاسباتی کلاسیک تبدیل می‌شود تا بتوان برای آن الگوریتم طراحی کرد. این مسئله با نام Shortest Common Superstring Problem (SCS) شناخته می‌شود.

ایده اصلی این است که اگر بتوانیم کوتاه‌ترین رشته‌ای را پیدا کنیم که تمام خوانش‌های توالی‌یابی (Sequencing Reads) را در خود به‌عنوان زیررشته داشته باشد، احتمالاً می‌توانیم توالی اصلی ژنوم را بازسازی کنیم.

هدف یادگیری این بخش:

  • تبدیل مسئله زیستی Assembly به یک مسئله الگوریتمی.
  • درک ارتباط بین SCS و بازسازی ژنوم.
  • آشنایی با یک روش اولیه برای حل SCS و محدودیت‌های آن.
  • فهمیدن اینکه چرا برخی مسائل مونتاژ ژنوم از نظر محاسباتی دشوار هستند.

مفاهیم کلیدی

1. Shortest Common Superstring (SCS) — کوتاه‌ترین ابررشته مشترک

تعریف ساده

Shortest Common Superstring رشته‌ای است که:

  • همه رشته‌های ورودی را به‌عنوان زیررشته (Substring) شامل می‌کند.
  • در میان تمام رشته‌هایی که این ویژگی را دارند، کوتاه‌ترین است.

به عبارت دیگر:

کوتاه‌ترین رشته‌ای که بتواند همه قطعات داده‌شده را در خود جای دهد.


توضیح دقیق

فرض کنید مجموعه‌ای از رشته‌ها داریم:

S = {String1, String2, String3, ...}

هدف یافتن رشته‌ای مانند:

Superstring

است که:

  • هر String موجود در S داخل آن وجود داشته باشد.
  • طول Superstring حداقل ممکن باشد.

یک راه ساده برای ساخت چنین رشته‌ای، اتصال پشت سر هم تمام رشته‌ها است:

String1 + String2 + String3

اما این معمولاً کوتاه‌ترین حالت نیست، زیرا رشته‌ها ممکن است بخش‌های مشترک داشته باشند.


اهمیت در Assembly ژنوم

در توالی‌یابی DNA، Readها قطعات کوتاهی از ژنوم هستند.

اگر بتوانیم کوتاه‌ترین رشته‌ای را پیدا کنیم که همه Readها را شامل شود، این رشته می‌تواند همان ژنوم اصلی باشد.

بنابراین:

Sequencing Reads
        ↓
Shortest Common Superstring
        ↓
Genome Assembly

2. ارتباط SCS با Genome Assembly — ارتباط با مونتاژ ژنوم

ایده اصلی

در Assembly:

  • ورودی:

    • تعداد زیادی Read کوتاه DNA
  • خروجی:

    • توالی کامل ژنوم

مسئله SCS تقریباً همین هدف را دنبال می‌کند:

  • Readها = رشته‌های ورودی
  • ژنوم بازسازی‌شده = Superstring

مثال

فرض کنید Readهای زیر را داریم:

AAA
AAB
ABA

یک Superstring ممکن است:

AAABA

باشد، زیرا:

  • AAA در آن وجود دارد.
  • AAB در آن وجود دارد.
  • ABA در آن وجود دارد.

اما ممکن است رشته کوتاه‌تر دیگری پیدا شود.

هدف SCS پیدا کردن کوتاه‌ترین گزینه است.


3. Maximum Overlap — بیشترین هم‌پوشانی

تعریف

برای ترکیب دو Read، به دنبال بیشترین تطابق بین:

  • انتهای Read اول (Suffix)
  • ابتدای Read دوم (Prefix)

می‌گردیم.

مثلاً:

Read A:
ACGTAA

Read B:
AATG

بخش مشترک:

AA

است.

بنابراین می‌توانیم آن‌ها را به شکل زیر ترکیب کنیم:

ACGTAATG

زیرا بخش مشترک دوبار نوشته نمی‌شود.


4. الگوریتم ابتدایی حل SCS

ایده الگوریتم

برای یافتن SCS:

  1. همه ترتیب‌های ممکن Readها را امتحان می‌کنیم.

  2. در هر ترتیب:

    • Readهای مجاور را بررسی می‌کنیم.
    • بیشترین overlap را پیدا می‌کنیم.
    • آن‌ها را به هم متصل می‌کنیم.
  3. کوتاه‌ترین Superstring حاصل را انتخاب می‌کنیم.


مثال

فرض کنید ترتیب Readها:

AAA
AAB
ABA

باشد.

مرحله اول:

بین:

AAA
AAB

همپوشانی:

AA

است.

پس فقط قسمت جدید اضافه می‌شود:

AAAB

مرحله دوم:

بین:

AAAB
ABA

همپوشانی:

AB

است.

پس نتیجه:

AAABA

خواهد بود.


5. NP-Complete Problem — مسئله NP کامل

تعریف ساده

برخی مسائل محاسباتی به‌گونه‌ای هستند که:

  • پیدا کردن جواب دقیق آن‌ها بسیار زمان‌بر است.
  • با افزایش اندازه ورودی، زمان اجرا به‌شدت افزایش می‌یابد.

مسئله SCS یکی از این مسائل است.


چرا SCS سخت است؟

برای n رشته، تعداد ترتیب‌های ممکن برابر است با:

[ n! ]

یعنی فاکتوریل n.

مثلاً:

برای 5 رشته:

[ 5! = 120 ]

ترتیب مختلف وجود دارد.

برای 20 رشته:

[ 20! ]

که عدد بسیار بزرگی است.

بنابراین بررسی همه حالت‌ها خیلی سریع غیرعملی می‌شود.


نکات مهم

  • مسئله Assembly را می‌توان به صورت یک مسئله SCS مدل کرد.
  • SCS یک مدل ساده و قابل فهم برای شروع مطالعه Assembly است.
  • بهترین Superstring الزاماً با اولین ترتیب Readها به دست نمی‌آید.
  • برای پیدا کردن جواب دقیق باید تمام ترتیب‌های ممکن Readها بررسی شوند.
  • تعداد ترتیب‌های ممکن برای n رشته برابر n! است.
  • رشد فاکتوریلی باعث می‌شود الگوریتم ساده SCS برای داده‌های بزرگ غیرقابل استفاده باشد.
  • مشکل اصلی در Assembly واقعی فقط یافتن overlap نیست، بلکه مدیریت حجم بسیار زیاد داده‌ها است.
  • الگوریتم‌های واقعی Assembly معمولاً از روش‌های پیچیده‌تر مانند De Bruijn Graph استفاده می‌کنند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Shortest Common Superstring (SCS) کوتاه‌ترین ابررشته مشترک کوتاه‌ترین رشته‌ای که همه رشته‌های ورودی را شامل می‌شود.
Superstring ابررشته رشته‌ای که شامل چند رشته دیگر به‌عنوان زیررشته باشد.
Substring زیررشته بخشی از یک رشته که به صورت پیوسته در آن وجود دارد.
Genome Assembly مونتاژ ژنوم بازسازی توالی کامل ژنوم از روی Readهای کوتاه.
Sequencing Read خوانش توالی‌یابی قطعه کوتاهی از DNA که توسط دستگاه توالی‌یابی تولید می‌شود.
Overlap هم‌پوشانی بخش مشترک بین انتهای یک Read و ابتدای Read دیگر.
Suffix پسوند بخش انتهایی یک رشته.
Prefix پیشوند بخش ابتدایی یک رشته.
NP-Complete NP کامل دسته‌ای از مسائل که حل دقیق آن‌ها معمولاً بسیار دشوار است.
Permutation جایگشت یک ترتیب ممکن از مجموعه‌ای از عناصر.
Parsimony اصل کمینه‌گرایی انتخاب ساده‌ترین توضیح ممکن برای داده‌ها.

مثال‌ها و تشبیه‌ها

تشبیه پازل

Assembly مانند کنار هم گذاشتن قطعات یک پازل است.

  • Readها = قطعات پازل
  • ژنوم کامل = تصویر نهایی پازل

اما در Assembly واقعی:

  • تصویر روی جعبه پازل وجود ندارد.
  • باید فقط با استفاده از شکل قطعات، تصویر را بازسازی کنیم.

SCS تلاش می‌کند کوتاه‌ترین تصویری را پیدا کند که همه قطعات را در خود جای دهد.


محدودیت SCS در Assembly واقعی

اگرچه SCS ایده خوبی است، اما در عمل مشکلاتی دارد:

1. سرعت پایین

به دلیل بررسی همه جایگشت‌ها:

[ n! ]

زمان اجرا بسیار زیاد می‌شود.


2. وجود خطا در داده‌ها

Readهای واقعی ممکن است شامل:

  • خطای توالی‌یابی (Sequencing Error)
  • تفاوت‌های واقعی ژنتیکی

باشند.

بنابراین overlapها همیشه دقیق و کامل نیستند.


3. تکرارهای ژنومی (Genome Repeats)

بخش‌هایی از ژنوم ممکن است چندین بار تکرار شده باشند.

این موضوع باعث ابهام در تعیین ترتیب درست Readها می‌شود.


خلاصه نهایی مرور سریع

  • Assembly یعنی بازسازی ژنوم از روی مجموعه‌ای از Sequencing Readها.
  • یکی از مدل‌های محاسباتی Assembly، مسئله Shortest Common Superstring است.
  • هدف SCS یافتن کوتاه‌ترین رشته‌ای است که همه رشته‌های ورودی را شامل شود.
  • در Assembly، Readها مانند قطعات پازل هستند که باید با overlap کنار هم قرار گیرند.
  • Maximum overlap بین Suffix یک Read و Prefix Read دیگر برای اتصال آن‌ها استفاده می‌شود.
  • الگوریتم ساده SCS تمام ترتیب‌های ممکن Readها را بررسی می‌کند.
  • تعداد جایگشت‌های n رشته برابر n! است.
  • رشد فاکتوریلی باعث می‌شود SCS برای ژنوم‌های بزرگ عملی نباشد.
  • مسئله SCS یک مسئله NP-Complete است.
  • الگوریتم‌های مدرن Assembly از روش‌های پیشرفته‌تر مانند De Bruijn Graph استفاده می‌کنند.

سوالات مرور

سوال 1: مسئله Shortest Common Superstring چیست؟

پاسخ:

مسئله‌ای است که در آن باید کوتاه‌ترین رشته‌ای پیدا شود که تمام رشته‌های ورودی را به‌عنوان زیررشته شامل کند.


سوال 2: چرا SCS می‌تواند برای Assembly ژنوم استفاده شود؟

پاسخ:

زیرا Readهای توالی‌یابی قطعاتی از ژنوم هستند و کوتاه‌ترین رشته‌ای که همه آن‌ها را شامل شود می‌تواند بازسازی ژنوم اصلی باشد.


سوال 3: منظور از Overlap بین دو Read چیست؟

پاسخ:

بخشی است که در آن انتهای یک Read (Suffix) با ابتدای Read دیگر (Prefix) تطابق دارد و اجازه می‌دهد دو Read به هم متصل شوند.


سوال 4: چرا الگوریتم ساده SCS برای ژنوم‌های بزرگ مناسب نیست؟

پاسخ:

زیرا باید تمام جایگشت‌های ممکن Readها را بررسی کند و تعداد این حالت‌ها برابر n! است که بسیار سریع رشد می‌کند.


سوال 5: چرا داشتن کوتاه‌ترین Superstring ویژگی مطلوبی است؟

پاسخ:

زیرا نشان‌دهنده ساده‌ترین و کم‌فرض‌ترین توضیح برای مجموعه Readهای موجود است و از نظر زیستی منطقی‌تر به نظر می‌رسد.


04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/03_practical-implementing-shortest-common-superstring

پیاده‌سازی مسئله Shortest Common Superstring با روش Brute Force

خلاصه کلی

در این درس، الگوریتم Shortest Common Superstring (SCS) که در بخش قبل معرفی شد، به صورت عملی در Python پیاده‌سازی می‌شود.

هدف این الگوریتم:

  • دریافت مجموعه‌ای از Readها (رشته‌های DNA یا رشته‌های عمومی).
  • بررسی تمام ترتیب‌های ممکن Readها.
  • ترکیب Readها بر اساس بیشترین میزان Overlap (هم‌پوشانی).
  • انتخاب کوتاه‌ترین رشته‌ای که همه Readها را شامل می‌شود.

در این پیاده‌سازی از یک روش Brute Force (جستجوی کامل) استفاده می‌شود؛ یعنی تمام جایگشت‌های ممکن بررسی می‌شوند تا بهترین جواب پیدا شود.


مفاهیم کلیدی

1. Shortest Common Superstring (SCS) — کوتاه‌ترین ابررشته مشترک

تعریف ساده

SCS کوتاه‌ترین رشته‌ای است که تمام رشته‌های ورودی را به‌عنوان زیررشته در خود دارد.


توضیح دقیق

فرض کنید مجموعه‌ای از Readها داریم:

S = {read1, read2, read3, ...}

هدف پیدا کردن رشته‌ای است که:

  • تمام Readها داخل آن وجود داشته باشند.
  • طول آن حداقل باشد.

برای ساخت این رشته، Readها باید با استفاده از Overlap به یکدیگر متصل شوند.


کاربرد در Assembly

در مونتاژ ژنوم:

  • Readها قطعات کوچک DNA هستند.
  • SCS تلاش می‌کند این قطعات را دوباره کنار هم قرار دهد.
  • نتیجه می‌تواند تقریب خوبی از ژنوم اصلی باشد.

2. Brute Force Algorithm — الگوریتم جستجوی کامل

تعریف

روش Brute Force تمام حالت‌های ممکن را بررسی می‌کند تا بهترین پاسخ را پیدا کند.

در مسئله SCS:

  • هر ترتیب ممکن Readها بررسی می‌شود.
  • برای هر ترتیب، یک Superstring ساخته می‌شود.
  • کوتاه‌ترین Superstring انتخاب می‌شود.

چرا از Brute Force استفاده می‌کنیم؟

مزیت:

  • جواب دقیق (Optimal Solution) را پیدا می‌کند.

عیب:

  • بسیار کند است.

زیرا تعداد ترتیب‌های ممکن برای n رشته برابر است با:

[ n! ]

که با افزایش تعداد Readها بسیار سریع رشد می‌کند.


3. Permutation — جایگشت

تعریف

Permutation یعنی تمام ترتیب‌های ممکن عناصر یک مجموعه.

مثلاً برای سه عنصر:

A, B, C

جایگشت‌ها:

ABC
ACB
BAC
BCA
CAB
CBA

تعداد آن‌ها:

[ 3! = 6 ]

است.


نقش در الگوریتم SCS

در Python از:

itertools.permutations()

استفاده می‌شود تا تمام ترتیب‌های ممکن Readها تولید شوند.

مثلاً:

ورودی:

["AAA", "AAB", "ABA"]

خروجی شامل همه ترتیب‌های ممکن این Readها است.


4. Overlap Function — تابع هم‌پوشانی

تعریف

تابعی که میزان اشتراک بین دو رشته را محاسبه می‌کند.

یعنی بررسی می‌کند:

  • آیا انتهای رشته اول (Suffix)
  • با ابتدای رشته دوم (Prefix)

تطابق دارد یا خیر.


مثال

دو Read:

Read A:
AAACGT

Read B:
CGTAA

بخش مشترک:

CGT

است.

بنابراین طول Overlap برابر:

3

خواهد بود.


5. ساخت Superstring برای یک ترتیب مشخص

برای هر جایگشت Readها:

  1. اولین Read به عنوان شروع Superstring انتخاب می‌شود.
  2. Read بعدی اضافه می‌شود.
  3. فقط بخش غیرمشترک Read دوم اضافه می‌شود.
  4. این فرآیند تا پایان ادامه پیدا می‌کند.

مثال

فرض کنید:

Read1:
AAA

Read2:
AAB

Overlap:

AA

است.

پس:

به جای:

AAAAAB

می‌سازیم:

AAAB

زیرا بخش مشترک دوباره نوشته نمی‌شود.


روند اجرای الگوریتم

الگوریتم کلی:

Input:
List of Reads

↓

Generate all permutations

↓

For each permutation:

    Start with first read
    
    For each next read:
        Find overlap
        Add non-overlapping part

↓

Compare length of generated superstrings

↓

Return shortest one

نکات مهم

  • تابع scs() ورودی مجموعه‌ای از رشته‌ها را دریافت می‌کند.

  • ابتدا مقدار کوتاه‌ترین Superstring برابر None قرار داده می‌شود.

  • برای هر جایگشت:

    • یک Superstring جدید ساخته می‌شود.
    • طول آن با بهترین جواب فعلی مقایسه می‌شود.
  • اگر Superstring جدید کوتاه‌تر باشد، جایگزین جواب قبلی می‌شود.

  • در پایان، کوتاه‌ترین رشته برگردانده می‌شود.


پیچیدگی زمانی الگوریتم

اگر تعداد Readها برابر n باشد:

تعداد جایگشت‌ها:

[ n! ]

است.

برای هر جایگشت باید Readها ترکیب شوند.

بنابراین زمان اجرا تقریباً:

[ O(n!) ]

خواهد بود.

این دلیل اصلی غیرعملی بودن این روش برای داده‌های واقعی ژنوم است.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Shortest Common Superstring (SCS) کوتاه‌ترین ابررشته مشترک کوتاه‌ترین رشته شامل تمام رشته‌های ورودی
Brute Force جستجوی کامل بررسی همه حالت‌های ممکن برای یافتن جواب دقیق
Permutation جایگشت تمام ترتیب‌های ممکن عناصر
itertools.permutations تابع تولید جایگشت در Python برای ایجاد همه ترتیب‌های ممکن استفاده می‌شود
Overlap هم‌پوشانی بخش مشترک بین دو رشته
Suffix پسوند قسمت انتهایی رشته
Prefix پیشوند قسمت ابتدایی رشته
Superstring ابررشته رشته‌ای که شامل رشته‌های دیگر است
Optimal Solution جواب بهینه بهترین جواب ممکن از نظر معیار موردنظر
Sequencing Read خوانش توالی‌یابی قطعه کوتاه DNA تولیدشده توسط دستگاه توالی‌یابی

مثال‌ها و تشبیه‌ها

مثال اتصال Readها

فرض کنید سه Read داریم:

Read1 = ABCD
Read2 = CDEF
Read3 = EFGH

ترتیب مناسب:

ABCD → CDEF → EFGH

است.

زیرا:

ABCD
  CDEF
    EFGH

بیشترین overlap را دارد.

نتیجه:

ABCDEFGH

خواهد بود.


تشبیه پازل

این الگوریتم مانند حل یک پازل است:

  • هر Read یک قطعه پازل است.
  • باید همه ترتیب‌های ممکن قطعات را امتحان کنیم.
  • بهترین چیدمان، تصویری با کمترین طول اضافی ایجاد می‌کند.

مشکل این است که تعداد حالت‌ها برای پازل‌های بزرگ بسیار زیاد می‌شود.


خلاصه نهایی مرور سریع

  • الگوریتم SCS برای بازسازی ژنوم از Readها استفاده می‌شود.
  • در این درس نسخه Brute Force الگوریتم پیاده‌سازی شد.
  • تمام جایگشت‌های Readها با itertools.permutations تولید می‌شوند.
  • برای هر ترتیب، Readها با استفاده از بیشترین Overlap به هم متصل می‌شوند.
  • بخش مشترک دو Read دوباره در Superstring نوشته نمی‌شود.
  • کوتاه‌ترین Superstring حاصل به عنوان جواب انتخاب می‌شود.
  • تعداد حالت‌ها برای n Read برابر n! است.
  • این الگوریتم جواب دقیق می‌دهد اما برای داده‌های بزرگ بسیار کند است.
  • روش‌های مدرن Assembly از الگوریتم‌های سریع‌تر استفاده می‌کنند.

سوالات مرور

سوال 1: الگوریتم Brute Force در SCS چگونه کار می‌کند؟

پاسخ:

تمام ترتیب‌های ممکن Readها را بررسی می‌کند، برای هر ترتیب یک Superstring می‌سازد و کوتاه‌ترین آن‌ها را انتخاب می‌کند.


سوال 2: چرا از تابع Permutation استفاده می‌کنیم؟

پاسخ:

زیرا ترتیب Readها روی طول Superstring نهایی تأثیر دارد و باید همه ترتیب‌های ممکن بررسی شوند.


سوال 3: هنگام اتصال دو Read چه بخشی به Superstring اضافه می‌شود؟

پاسخ:

فقط بخش غیرمشترک Read دوم اضافه می‌شود؛ زیرا بخش Overlap قبلاً در Superstring وجود دارد.


سوال 4: چرا الگوریتم SCS با روش Brute Force برای ژنوم‌های بزرگ مناسب نیست؟

پاسخ:

زیرا تعداد جایگشت‌ها برابر n! است و با افزایش تعداد Readها زمان اجرا به‌صورت فاکتوریلی افزایش می‌یابد.


سوال 5: نقش تابع Overlap در این الگوریتم چیست؟

پاسخ:

تابع Overlap بیشترین تطابق بین انتهای یک Read و ابتدای Read دیگر را پیدا می‌کند تا Readها به شکل بهینه به هم متصل شوند.


04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/04_lecture-greedy-shortest-common-superstring

الگوریتم حریصانه برای یافتن کوتاه‌ترین ابررشته مشترک

Greedy Shortest Common Superstring Algorithm


خلاصه کلی

در درس‌های قبل، مسئله کوتاه‌ترین ابررشته مشترک (Shortest Common Superstring - SCS) معرفی شد؛ مسئله‌ای که هدف آن پیدا کردن کوتاه‌ترین رشته‌ای است که تمام خوانش‌های DNA (reads) را به‌عنوان زیررشته (substring) در خود جای دهد.

اگرچه حل دقیق SCS می‌تواند مسئله مونتاژ ژنوم (Genome Assembly) را حل کند، اما الگوریتم کامل آن بسیار کند است، زیرا باید تمام ترتیب‌های ممکن برای قرار دادن خوانش‌ها بررسی شوند.

در این درس یک روش سریع‌تر معرفی می‌شود:

Greedy Shortest Common Superstring Algorithm

این الگوریتم با یک ایده ساده کار می‌کند:

در هر مرحله، بیشترین همپوشانی (maximum overlap) بین دو خوانش را انتخاب کن و آن‌ها را به هم متصل کن.

هدف این روش کاهش سریع طول رشته نهایی است؛ اما مشکل آن این است که همیشه بهترین جواب ممکن (optimal solution) را پیدا نمی‌کند.


مفاهیم کلیدی


1. Shortest Common Superstring (SCS) — کوتاه‌ترین ابررشته مشترک

تعریف ساده

رشته‌ای است که:

  • تمام رشته‌های ورودی را در خود دارد.
  • کوتاه‌ترین رشته ممکن با این ویژگی است.

توضیح دقیق

فرض کنید مجموعه‌ای از خوانش‌های DNA داریم:

read1
read2
read3
...

هدف یافتن رشته‌ای است که همه این خوانش‌ها در آن ظاهر شوند، اما طول آن حداقل باشد.

در مونتاژ ژنوم:

  • ورودی → مجموعه‌ای از sequencing reads
  • خروجی → توالی بازسازی‌شده ژنوم

اهمیت

اگر بتوانیم SCS را به‌صورت سریع حل کنیم، می‌توانیم ژنوم را از روی خوانش‌ها بازسازی کنیم.


2. Greedy Algorithm — الگوریتم حریصانه

تعریف ساده

الگوریتمی که در هر مرحله بهترین تصمیم محلی (local optimal choice) را انتخاب می‌کند.

توضیح دقیق

در این مسئله، بهترین تصمیم محلی یعنی:

انتخاب دو رشته‌ای که بیشترین overlap را دارند.

زیرا overlap بیشتر باعث می‌شود بخش کمتری از رشته‌ها دوباره نوشته شود و در نتیجه superstring کوتاه‌تر شود.

مثال

دو خوانش:

AAA
AAB

دارای overlap:

AA

هستند.

پس ترکیب آن‌ها:

AAAB

است، نه:

AAAAAB

زیرا بخش مشترک فقط یک بار نوشته می‌شود.


3. Overlap Graph — گراف همپوشانی

تعریف ساده

یک ساختار گرافی برای نمایش رابطه بین خوانش‌های DNA.

اجزای گراف:

Nodes (گره‌ها)

هر گره نشان‌دهنده یک read است.

مثلاً:

AAA
AAB
BBB

هر کدام یک node هستند.


Edges (یال‌ها)

یال جهت‌دار بین دو گره زمانی ایجاد می‌شود که:

  • suffix یک read
  • با prefix یک read دیگر

مطابقت داشته باشد.

مثال:

AAA
AAB

چون:

suffix AAA = AA
prefix AAB = AA

پس یک edge داریم:

AAA → AAB

4. عملکرد الگوریتم Greedy SCS با Overlap Graph

مراحل الگوریتم:

مرحله 1: پیدا کردن بزرگ‌ترین overlap

در گراف:

  • همه edgeها دارای وزن هستند.
  • وزن = طول overlap

مثلاً:

A → B  (length 5)
C → D  (length 3)

انتخاب می‌کنیم:

A → B

زیرا overlap بزرگ‌تر دارد.


مرحله 2: ادغام دو node

دو خوانش با بیشترین overlap ترکیب می‌شوند.

مثال:

AAA
AAB

با overlap دو حرف:

AA

ادغام می‌شوند:

AAAB

سپس این دو node با یک node جدید جایگزین می‌شوند.


مرحله 3: تکرار

این مراحل ادامه پیدا می‌کنند:

  1. انتخاب بزرگ‌ترین overlap
  2. ادغام دو رشته
  3. ساده‌تر شدن گراف

تا زمانی که:

  • فقط یک node باقی بماند.

برچسب این node، superstring نهایی است.


5. تفاوت Greedy SCS و Brute Force SCS

Brute Force SCS

روش قبلی:

  • تمام ترتیب‌های ممکن خوانش‌ها بررسی می‌شوند.
  • بهترین جواب انتخاب می‌شود.

تعداد حالت‌ها:

[ n! ]

برای n خوانش.

مثلاً:

اگر:

n = 10

تعداد حالت‌ها:

10! = 3,628,800

است.

بنابراین بسیار کند است.


Greedy SCS

روش جدید:

  • فقط بهترین overlap فعلی را انتخاب می‌کند.
  • نیاز به بررسی همه ترتیب‌ها ندارد.

مزیت:

✅ بسیار سریع‌تر

عیب:

❌ همیشه جواب بهینه نمی‌دهد.


نکات مهم

  • الگوریتم Greedy بر اساس انتخاب بهترین تصمیم در هر مرحله کار می‌کند.
  • در مونتاژ ژنوم، overlap مانند «چسب» بین قطعات DNA عمل می‌کند.
  • طولانی‌ترین overlap معمولاً باعث کوتاه‌تر شدن superstring می‌شود.
  • در الگوریتم Greedy، انتخاب‌های اولیه می‌توانند روی نتیجه نهایی تأثیر زیادی داشته باشند.
  • اگر چند overlap طول یکسان داشته باشند، انتخاب تصادفی یا ترتیب انتخاب می‌تواند جواب را تغییر دهد.
  • Greedy ممکن است یک superstring معتبر تولید کند، اما الزاماً کوتاه‌ترین superstring نباشد.
  • سرعت بیشتر Greedy با هزینه کاهش تضمین جواب بهینه به دست می‌آید.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Shortest Common Superstring (SCS) کوتاه‌ترین ابررشته مشترک کوتاه‌ترین رشته‌ای که تمام رشته‌های ورودی را شامل می‌شود
Greedy Algorithm الگوریتم حریصانه الگوریتمی که در هر مرحله بهترین انتخاب محلی را انجام می‌دهد
Overlap همپوشانی بخش مشترک بین انتهای یک رشته و ابتدای رشته دیگر
Maximum Overlap بیشترین همپوشانی بزرگ‌ترین تطابق suffix-prefix بین دو read
Overlap Graph گراف همپوشانی گرافی که روابط overlap بین reads را نمایش می‌دهد
Node گره نماینده یک read در گراف
Edge یال رابطه بین دو read دارای overlap
Weight وزن مقدار عددی روی edge که طول overlap را نشان می‌دهد
Local Optimum بهینه محلی بهترین انتخاب در یک مرحله خاص
Global Optimum بهینه کلی بهترین جواب ممکن در کل مسئله
Superstring ابررشته رشته‌ای که شامل چند رشته دیگر به‌عنوان substring است

مثال‌ها و تشبیه‌ها

تشبیه پازل

مونتاژ ژنوم شبیه کنار هم گذاشتن قطعات یک پازل است.

در الگوریتم Greedy:

  • هر قطعه پازل که بیشترین بخش مشترک را با قطعه دیگر دارد، ابتدا به آن متصل می‌شود.
  • این کار سریع است.
  • اما ممکن است در نهایت متوجه شویم که انتخاب‌های اولیه بهترین مسیر را ایجاد نکرده‌اند.

مثال ساده

خوانش‌ها:

AAA
AAB
ABB
BBB

ابتدا:

AAA + AAB

زیرا overlap برابر:

AA

است.

نتیجه:

AAAB

سپس:

AAAB + ABB

و همین روند ادامه پیدا می‌کند تا یک رشته نهایی ساخته شود.


خلاصه نهایی مرور سریع

  • مسئله SCS به دنبال کوتاه‌ترین رشته‌ای است که تمام reads را شامل شود.
  • حل دقیق SCS با بررسی تمام ترتیب‌ها بسیار کند است.
  • الگوریتم Greedy SCS برای افزایش سرعت معرفی شد.
  • در Greedy، همیشه بزرگ‌ترین overlap انتخاب می‌شود.
  • Overlap Graph روابط بین reads را نمایش می‌دهد.
  • Nodeها نشان‌دهنده reads و Edgeها نشان‌دهنده overlap هستند.
  • در هر مرحله دو node با بیشترین overlap ادغام می‌شوند.
  • این فرآیند تا باقی ماندن یک node ادامه پیدا می‌کند.
  • Greedy سریع‌تر از Brute Force است.
  • Greedy تضمین نمی‌کند که کوتاه‌ترین superstring واقعی را پیدا کند.
  • انتخاب‌های متفاوت هنگام وجود overlapهای برابر می‌تواند نتایج متفاوتی ایجاد کند.

سوالات مرور

سوال 1: Shortest Common Superstring چیست؟

پاسخ:

رشته‌ای با کمترین طول است که تمام رشته‌های ورودی را به‌عنوان زیررشته در خود دارد.


سوال 2: چرا الگوریتم Brute Force برای SCS کند است؟

پاسخ:

زیرا باید تمام ترتیب‌های ممکن برای n رشته را بررسی کند که تعداد آن‌ها:

[ n! ]

است و با افزایش n بسیار سریع رشد می‌کند.


سوال 3: ایده اصلی الگوریتم Greedy SCS چیست؟

پاسخ:

در هر مرحله دو رشته‌ای را انتخاب می‌کند که بیشترین overlap را دارند و آن‌ها را ادغام می‌کند.


سوال 4: چرا overlap بزرگ‌تر معمولاً باعث superstring کوتاه‌تر می‌شود؟

پاسخ:

زیرا بخش مشترک فقط یک بار در رشته نهایی نوشته می‌شود و تکرار کاهش می‌یابد.


سوال 5: آیا Greedy SCS همیشه جواب بهینه می‌دهد؟

پاسخ:

خیر. این الگوریتم ممکن است یک superstring معتبر تولید کند، اما طول آن بیشتر از کوتاه‌ترین superstring واقعی باشد.


سوال 6: نقش Overlap Graph در مونتاژ ژنوم چیست؟

پاسخ:

این گراف تمام روابط همپوشانی بین reads را نمایش می‌دهد و کمک می‌کند مسیر احتمالی بازسازی ژنوم پیدا شود.


04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/05_practical-implementing-greedy-shortest-common-superstring

پیاده‌سازی الگوریتم حریصانه کوتاه‌ترین ابررشته مشترک

Implementing Greedy Shortest Common Superstring


خلاصه کلی

در درس‌های قبل، دو روش برای حل مسئله Shortest Common Superstring (SCS) بررسی شد:

  1. روش Brute Force

    • تمام ترتیب‌های ممکن برای قرارگیری reads را بررسی می‌کند.
    • جواب دقیق و بهینه می‌دهد.
    • اما با افزایش تعداد reads بسیار کند می‌شود.
  2. روش Greedy

    • یک روش تقریبی (Approximation Algorithm) است.
    • در هر مرحله دو read با بیشترین overlap را انتخاب و ادغام می‌کند.
    • بسیار سریع‌تر است، اما همیشه کوتاه‌ترین superstring واقعی را تولید نمی‌کند.

در این جلسه، الگوریتم Greedy SCS در پایتون پیاده‌سازی می‌شود.


مفاهیم کلیدی


1. Greedy Shortest Common Superstring — الگوریتم حریصانه کوتاه‌ترین ابررشته مشترک

تعریف ساده

الگوریتمی که در هر مرحله:

  1. دو رشته با بیشترین همپوشانی (maximum overlap) را پیدا می‌کند.
  2. آن‌ها را با حذف بخش مشترک ترکیب می‌کند.
  3. این کار را تا زمانی ادامه می‌دهد که همه رشته‌ها به یک رشته تبدیل شوند.

توضیح دقیق

فرض کنید مجموعه‌ای از reads داریم:

read1
read2
read3
...

الگوریتم:

  1. بهترین جفت reads را از نظر overlap پیدا می‌کند.
  2. آن‌ها را به یک read جدید تبدیل می‌کند.
  3. readهای قبلی را حذف می‌کند.
  4. read جدید را به مجموعه اضافه می‌کند.
  5. دوباره همین کار را تکرار می‌کند.

در پایان فقط یک read باقی می‌ماند که همان superstring نهایی است.


اهمیت و کاربرد

این روش در مونتاژ ژنوم اهمیت دارد زیرا:

  • سرعت بسیار بالاتری نسبت به Brute Force دارد.
  • برای داده‌های بزرگ‌تر قابل اجرا است.
  • پایه بسیاری از روش‌های عملی assembly است.

2. Maximum Overlap — بیشترین همپوشانی

تعریف ساده

بزرگ‌ترین بخش مشترک بین:

  • انتهای یک read (suffix)
  • ابتدای read دیگر (prefix)

است.


مثال

دو read:

ACGTA
GTACC

دارند:

suffix(read1) = GTA
prefix(read2) = GTA

پس overlap برابر 3 است.

ترکیب:

ACGTACC

خواهد بود.


3. تابع Pick Maximal Overlap

هدف تابع

پیدا کردن دو read که بیشترین overlap را در کل مجموعه دارند.


ورودی‌ها

  • مجموعه reads
  • حداقل طول overlap مجاز (minimum overlap K)

خروجی‌ها

تابع سه مقدار برمی‌گرداند:

  1. read اول
  2. read دوم
  3. طول overlap

منطق عملکرد

برای هر جفت ممکن از reads:

  1. overlap آن‌ها محاسبه می‌شود.
  2. با بهترین overlap فعلی مقایسه می‌شود.
  3. اگر overlap بزرگ‌تر باشد، این جفت ذخیره می‌شود.

نکته مهم

ممکن است چند جفت read دارای بیشترین overlap یکسان باشند.

در این حالت:

  • اولین جفتی که در حلقه پیدا شود انتخاب می‌شود.
  • انتخاب بر اساس ترتیب پیمایش انجام می‌شود.

4. پیاده‌سازی Greedy SCS

الگوریتم اصلی:

مرحله 1

ابتدا بهترین دو read را پیدا کن:

read_a , read_b

که بیشترین overlap را دارند.


مرحله 2

آن‌ها را ادغام کن.

فرض کنید:

read_a = AAA
read_b = AAB

overlap:

AA

باشد.

نتیجه:

AAAB

خواهد بود.

زیرا بخش overlap دوباره اضافه نمی‌شود.


مرحله 3

readهای قبلی حذف و رشته جدید اضافه می‌شود.

یعنی:

قبل:

AAA
AAB
BBB

بعد:

AAAB
BBB

مرحله 4

این فرآیند تا زمانی ادامه پیدا می‌کند که:

  • دیگر overlap وجود نداشته باشد.
  • یا فقط یک read باقی بماند.

5. زمانی که دیگر Overlap وجود ندارد

گاهی پس از چند ادغام:

  • هنوز چند read باقی مانده‌اند.
  • اما هیچ overlap بین آن‌ها وجود ندارد.

در این حالت:

آن‌ها فقط پشت سر هم قرار داده می‌شوند.

مثلاً:

AAA
CCC

تبدیل می‌شود به:

AAACCC

زیرا هیچ بخش مشترکی وجود ندارد.


نکات مهم

  • Greedy SCS به جای بررسی تمام حالت‌ها، فقط بهترین انتخاب فعلی را انجام می‌دهد.
  • این روش سرعت را بسیار افزایش می‌دهد.
  • سرعت بیشتر با کاهش تضمین جواب بهینه همراه است.
  • در صورت وجود چند overlap برابر، ترتیب انتخاب می‌تواند نتیجه را تغییر دهد.
  • الگوریتم Greedy ممکن است ابتدا انتخابی انجام دهد که بعداً مانع رسیدن به بهترین جواب شود.
  • Brute Force همیشه جواب بهینه را پیدا می‌کند، اما برای داده‌های بزرگ غیرعملی است.
  • Greedy در عمل معمولاً انتخاب مناسب‌تری است زیرا صرفه‌جویی زمانی زیادی ایجاد می‌کند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Greedy Algorithm الگوریتم حریصانه الگوریتمی که در هر مرحله بهترین انتخاب محلی را انجام می‌دهد
Shortest Common Superstring (SCS) کوتاه‌ترین ابررشته مشترک کوتاه‌ترین رشته شامل تمام رشته‌های ورودی
Approximation Algorithm الگوریتم تقریبی الگوریتمی که جواب نزدیک به بهینه تولید می‌کند اما تضمین بهینه بودن ندارد
Maximum Overlap بیشترین همپوشانی بزرگ‌ترین تطابق بین suffix و prefix دو read
Read خوانش قطعه کوتاهی از DNA که توسط sequencing تولید شده است
Prefix پیشوند بخش ابتدایی یک رشته
Suffix پسوند بخش انتهایی یک رشته
Overlap Length طول همپوشانی تعداد کاراکترهای مشترک بین دو رشته
Permutation جایگشت یک ترتیب ممکن از عناصر یک مجموعه
Brute Force جستجوی کامل بررسی همه حالت‌های ممکن برای یافتن جواب
Optimal Solution جواب بهینه بهترین جواب ممکن از نظر معیار مسئله

مثال‌ها و تشبیه‌ها

مثال شکست الگوریتم Greedy

فرض کنید سه read داریم:

A
B
C

و:

  • A با B دارای overlap برابر 2 است.
  • B با C دارای overlap برابر 2 است.
  • A با C دارای overlap برابر 3 است.

الگوریتم Greedy ابتدا:

A + C

را انتخاب می‌کند چون overlap بزرگ‌تر دارد.

اما بعد ممکن است B دیگر overlap مناسبی نداشته باشد و مجبور شویم آن را جداگانه اضافه کنیم.

در حالی که اگر ابتدا:

A + B + C

را انتخاب می‌کردیم، superstring کوتاه‌تری ساخته می‌شد.


تشبیه

Greedy مانند حل کردن پازل است:

  • در هر لحظه دو قطعه‌ای را انتخاب می‌کنیم که بیشترین بخش مشترک را دارند.
  • این کار معمولاً سریع است.
  • اما ممکن است یک قطعه را زود به جای اشتباه وصل کنیم و در ادامه مشکل ایجاد شود.

خلاصه نهایی مرور سریع

  • الگوریتم Brute Force برای SCS دقیق اما بسیار کند است.
  • Greedy SCS برای افزایش سرعت معرفی شد.
  • در هر مرحله، بیشترین overlap انتخاب می‌شود.
  • دو read با بیشترین overlap ادغام می‌شوند.
  • تابع Pick Maximal Overlap بهترین جفت read را پیدا می‌کند.
  • الگوریتم تا زمانی که یک رشته باقی بماند ادامه پیدا می‌کند.
  • اگر overlap باقی نماند، رشته‌های باقی‌مانده به هم متصل می‌شوند.
  • Greedy بسیار سریع‌تر از بررسی تمام جایگشت‌ها است.
  • Greedy همیشه کوتاه‌ترین superstring واقعی را پیدا نمی‌کند.
  • در مونتاژ واقعی ژنوم، سرعت معمولاً ارزش این تقریب را دارد.

سوالات مرور

سوال 1: چرا الگوریتم Brute Force برای مونتاژ ژنوم مناسب نیست؟

پاسخ:

زیرا باید تمام جایگشت‌های ممکن reads را بررسی کند و تعداد این حالت‌ها با افزایش تعداد reads به‌شدت رشد می‌کند.


سوال 2: الگوریتم Greedy SCS چگونه دو read را انتخاب می‌کند؟

پاسخ:

دو read با بیشترین overlap را پیدا کرده و آن‌ها را با حذف بخش مشترک ترکیب می‌کند.


سوال 3: تابع Pick Maximal Overlap چه کاری انجام می‌دهد؟

پاسخ:

تمام جفت‌های ممکن reads را بررسی کرده و جفتی را که بیشترین overlap دارد پیدا می‌کند.


سوال 4: چرا Greedy همیشه جواب بهینه نمی‌دهد؟

پاسخ:

زیرا انتخاب بهترین گزینه در یک مرحله ممکن است باعث شود در مراحل بعدی نتوانیم بهترین ترکیب کلی را ایجاد کنیم.


سوال 5: چه زمانی الگوریتم Greedy پایان می‌یابد؟

پاسخ:

وقتی دیگر overlap قابل قبول وجود نداشته باشد یا فقط یک رشته نهایی باقی مانده باشد.


سوال 6: مزیت اصلی Greedy نسبت به Brute Force چیست؟

پاسخ:

سرعت بسیار بالاتر و امکان اجرا روی مجموعه داده‌های بزرگ‌تر، هرچند با احتمال خطا در جواب نهایی.


04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/06_lecture-third-law-of-assembly-repeats-are-bad

قانون سوم اسمبلی ژنوم: تکرارها باعث دشواری Assembly می‌شوند

Third Law of Assembly: Repeats Are Bad


خلاصه کلی

در این درس یکی از مهم‌ترین چالش‌های Genome Assembly معرفی می‌شود: وجود توالی‌های تکراری (Repetitive Sequences / Repeats) در ژنوم.

تا این مرحله دو روش برای حل مسئله اسمبلی بررسی شد:

  • Shortest Common Superstring (SCS) با روش جستجوی کامل (Brute Force)
  • Greedy Shortest Common Superstring که سریع‌تر است اما همیشه جواب بهینه نمی‌دهد

هر دو روش در مواجهه با ژنوم‌های تکراری با مشکل اساسی روبه‌رو می‌شوند. حتی اگر الگوریتم کاملاً درست اجرا شود، ممکن است نتیجه آن بازسازی صحیح ژنوم واقعی نباشد.

هدف این درس:

  • درک اثر توالی‌های تکراری بر Assembly
  • فهم اینکه چرا کوتاه‌ترین Superstring همیشه پاسخ درست نیست
  • آشنایی با سومین قانون اسمبلی: Repeats make assembly difficult

مفاهیم کلیدی


1. Repetitive Sequences (توالی‌های تکراری)

تعریف ساده

توالی‌های DNA هستند که چندین بار در ژنوم تکرار شده‌اند و نسخه‌های مشابه یا تقریباً مشابهی از آن‌ها وجود دارد.

توضیح دقیق

در یک ژنوم ممکن است یک قطعه DNA چندین بار تکرار شده باشد. هنگام Sequencing، دستگاه توالی‌یابی فقط قطعات کوتاهی (Reads) تولید می‌کند.

اگر طول Readها کمتر از فاصله یا ساختار تکرارها باشد، الگوریتم Assembly نمی‌تواند تشخیص دهد:

  • یک Read مربوط به کدام نسخه از Repeat است.
  • چند نسخه واقعی از آن Repeat در ژنوم وجود دارد.

در نتیجه اطلاعات کافی برای بازسازی دقیق ژنوم وجود ندارد.

اهمیت

توالی‌های تکراری یکی از اصلی‌ترین دلایل دشواری Assembly در ژنوم‌های پیچیده مانند ژنوم انسان هستند.


2. Shortest Common Superstring (SCS) و مشکل Repeats

تعریف ساده

Shortest Common Superstring مسئله‌ای است که در آن باید کوتاه‌ترین رشته‌ای پیدا شود که تمام Readهای ورودی را به عنوان زیررشته (Substring) شامل شود.

مشکل در ژنوم‌های تکراری

فرض کنید ژنومی دارای سه نسخه از یک کلمه یا توالی تکراری باشد:

... LONG ... LONG ... LONG ...

اما Readهای کوتاه فقط نشان دهند که حداقل دو نسخه وجود دارد.

الگوریتم SCS برای توضیح Readها، کوتاه‌ترین رشته ممکن را انتخاب می‌کند:

... LONG ... LONG ...

و یکی از نسخه‌های واقعی Repeat حذف می‌شود.

نتیجه

SCS یک Superstring تولید می‌کند که از نظر ریاضی درست است، اما از نظر زیستی ژنوم واقعی نیست.


3. Greedy Shortest Common Superstring

تعریف ساده

یک الگوریتم سریع‌تر برای تولید Superstring است که در هر مرحله بهترین تصمیم محلی را انتخاب می‌کند.

ایده اصلی

در هر مرحله:

  1. دو Read با بیشترین Overlap پیدا می‌شوند.
  2. آن‌ها با هم Merge می‌شوند.
  3. این کار تا زمانی ادامه پیدا می‌کند که همه Readها ترکیب شوند.

مشکل هنگام وجود Repeat

الگوریتم Greedy همیشه بیشترین Overlap را انتخاب می‌کند، اما این انتخاب ممکن است باعث شود:

  • چند نسخه از یک Repeat با هم ادغام شوند.
  • تعداد واقعی تکرارها کمتر از مقدار واقعی گزارش شود.

نتیجه

سرعت بیشتر → اما احتمال خطای Assembly


4. Ambiguity (ابهام در Assembly)

تعریف ساده

وضعیتی که اطلاعات موجود اجازه نمی‌دهد مشخص کنیم یک Read دقیقاً متعلق به کدام بخش ژنوم بوده است.

علت اصلی

Repeats باعث می‌شوند چند مسیر Assembly ممکن وجود داشته باشد.

مثلاً اگر دو قسمت مختلف ژنوم دارای یک توالی مشابه باشند:

Genome region A:
AAAACCCCCGGG

Genome region B:
TTTAAAACCCCC

یک Read کوتاه از بخش تکراری ممکن است به هر دو قسمت تعلق داشته باشد.

اهمیت

Assembly در واقع حل یک مسئله ابهام است، و Repeats این ابهام را افزایش می‌دهند.


5. Third Law of Assembly (قانون سوم اسمبلی)

بیان قانون:

Repeats make assembly difficult. تکرارها باعث دشوار شدن Assembly می‌شوند.

مفهوم قانون

هرچه ژنوم دارای توالی‌های تکراری بیشتری باشد:

  • بازسازی صحیح آن سخت‌تر می‌شود.
  • احتمال خطای Assembly افزایش می‌یابد.
  • حتی بهترین الگوریتم‌ها نیز ممکن است شکست بخورند.

نکات مهم

  • هدف Assembly فقط پیدا کردن یک Superstring کوتاه نیست؛ هدف بازسازی ژنوم واقعی است.
  • در ژنوم‌های بدون Repeat، SCS می‌تواند تقریب خوبی از ژنوم اصلی باشد.
  • در ژنوم‌های تکراری، کوتاه‌ترین جواب الزاماً جواب درست نیست.
  • الگوریتم‌های SCS معمولاً Repeatها را Collapse می‌کنند.

Repeat Collapse

یعنی:

چندین نسخه واقعی از یک توالی تکراری به یک نسخه یا تعداد کمتری نسخه تبدیل شوند.

مثال:

ژنوم واقعی:

Repeat Repeat Repeat

Assembly:

Repeat Repeat

یک نسخه از بین رفته است.


تفاوت انواع خطا در Assembly

Repeats می‌توانند باعث خطاهای مختلف شوند:

نوع خطا توضیح
Repeat Collapse چند نسخه Repeat به تعداد کمتر تبدیل می‌شوند
Misassembly بخش‌های دور از هم ژنوم اشتباه به هم متصل می‌شوند
Incorrect Ordering ترتیب قطعات ژنوم اشتباه بازسازی می‌شود

مثال‌ها و تشبیه‌ها

مثال کلمه LONG

برای توضیح مشکل Repeat، مدرس از مثال یک کلمه تکراری در یک متن استفاده می‌کند.

فرض کنید متن اصلی:

The LONG story contains LONG examples and LONG explanations.

اما فقط قطعات کوتاه متن را داریم.

از روی این قطعات نمی‌توانیم بفهمیم کلمه LONG دقیقاً چند بار تکرار شده است.

ممکن است:

  • دو بار باشد.
  • سه بار باشد.
  • پنج بار باشد.

اطلاعات موجود کافی نیست.

بنابراین الگوریتم کوتاه‌ترین توضیح ممکن را انتخاب می‌کند.


تشبیه پازل

Assembly مانند حل یک پازل است.

اگر پازل دارای قطعات منحصربه‌فرد باشد، حل آن آسان است.

اما اگر نیمی از قطعات شبیه آسمان آبی باشند:

  • تشخیص جای درست قطعات سخت می‌شود.
  • چندین حالت ممکن ایجاد می‌شود.

Repeats در ژنوم مانند همین قطعات مشابه پازل هستند.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Genome Assembly مونتاژ ژنوم بازسازی توالی اصلی ژنوم از روی Reads
Repeat توالی تکراری بخشی از DNA که چندین بار در ژنوم وجود دارد
Repetitive Sequence توالی تکرارشونده DNA با نسخه‌های مشابه متعدد
Shortest Common Superstring (SCS) کوتاه‌ترین رشته مشترک کوتاه‌ترین رشته شامل تمام Readها
Greedy Algorithm الگوریتم حریصانه الگوریتمی که در هر مرحله بهترین انتخاب محلی را انجام می‌دهد
Collapse فروپاشی / ادغام تبدیل چند نسخه واقعی به تعداد کمتر در Assembly
Ambiguity ابهام ناتوانی در تعیین جایگاه دقیق یک Read
Transposable Element عنصر قابل انتقال توالی DNA تکراری که می‌تواند در ژنوم جابه‌جا شود
Misassembly مونتاژ اشتباه اتصال یا ترتیب غلط قطعات ژنوم
Read قطعه خوانده‌شده DNA توالی کوتاهی که توسط Sequencer تولید می‌شود

خلاصه نهایی مرور سریع

  • Shortest Common Superstring یک مدل محاسباتی برای Assembly است، اما در ژنوم‌های تکراری مشکل دارد.
  • الگوریتم Greedy سریع‌تر از Brute Force است ولی همیشه جواب بهینه نمی‌دهد.
  • وجود Repeat باعث می‌شود اطلاعات Reads کوتاه برای تعیین تعداد واقعی نسخه‌های تکرار کافی نباشد.
  • SCS معمولاً Repeatها را کمتر از مقدار واقعی بازسازی می‌کند (Repeat Collapse).
  • سومین قانون Assembly می‌گوید: Repeats make assembly difficult.
  • بخش بزرگی از ژنوم انسان شامل توالی‌های تکراری است، بنابراین Assembly آن بسیار دشوار است.
  • مشکل اصلی Repeatها ایجاد Ambiguity در تعیین محل Reads است.
  • الگوریتم‌های مختلف ممکن است در برابر Repeatها به شکل‌های متفاوتی شکست بخورند.
  • روش‌های دیگری مانند de Bruijn Graph تلاش می‌کنند برخی مشکلات SCS را کاهش دهند، اما مشکل کلی Repeat همچنان باقی است.

سوالات مرور

1. سوال مفهومی:

چرا Shortest Common Superstring در ژنوم‌های تکراری همیشه ژنوم واقعی را بازسازی نمی‌کند؟

پاسخ: زیرا Readهای کوتاه نمی‌توانند تعداد واقعی نسخه‌های Repeat را مشخص کنند. بنابراین SCS کوتاه‌ترین توضیح ممکن را انتخاب می‌کند و ممکن است برخی نسخه‌های واقعی Repeat را حذف کند.


2. سوال تعریفی:

Repeat Collapse چیست؟

پاسخ: حالتی که چندین نسخه واقعی از یک توالی تکراری در ژنوم، هنگام Assembly به تعداد کمتری نسخه تبدیل شوند.


3. سوال کاربردی:

چرا افزایش طول Readها می‌تواند به حل مشکل Repeat کمک کند؟

پاسخ: Readهای بلندتر احتمالاً از نواحی تکراری عبور می‌کنند و اطلاعات بیشتری درباره بخش‌های اطراف Repeat فراهم می‌کنند؛ بنابراین تعیین محل صحیح Repeat آسان‌تر می‌شود.


4. سوال مفهومی:

قانون سوم Assembly چه چیزی بیان می‌کند؟

پاسخ: این قانون بیان می‌کند که وجود توالی‌های تکراری باعث دشوار شدن Assembly ژنوم می‌شود و می‌تواند باعث خطا یا ابهام در بازسازی ژنوم شود.


04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/07_lecture-de-bruijn-graphs-and-eulerian-walks

الگوریتم‌های مونتاژ ژنوم: گراف‌های De Bruijn و مسیر اویلری

De Bruijn Graphs and Eulerian Walks


خلاصه کلی

در بخش‌های قبلی، مسئله Shortest Common Superstring (SCS) به‌عنوان یک مدل محاسباتی برای حل مسئله مونتاژ ژنوم معرفی شد. این روش اگرچه از نظر تئوری مناسب بود، اما در ژنوم‌های تکراری (Repetitive Genomes) دچار مشکل ادغام بیش از حد توالی‌های تکراری (Over-collapse of Repeats) می‌شد.

در این درس، یک روش جایگزین معرفی می‌شود که بر پایه گراف De Bruijn و مسیر اویلری (Eulerian Walk) است.

هدف اصلی این بخش:

  • معرفی ساختار گراف De Bruijn برای نمایش داده‌های توالی‌یابی
  • نشان دادن رابطه بین k-merها و یال‌های گراف
  • توضیح اینکه چگونه می‌توان توالی ژنوم اصلی را با پیمایش گراف بازسازی کرد
  • معرفی مفهوم Eulerian Walk به‌عنوان پایه یک الگوریتم جدید مونتاژ ژنوم

مفاهیم کلیدی


1. Shortest Common Superstring (SCS) — کوتاه‌ترین رشته مشترک

تعریف ساده

یک رشته کوتاه که تمام رشته‌های ورودی را به‌عنوان زیررشته (Substring) در خود جای دهد.

مشکل اصلی

اگر ژنوم دارای توالی‌های تکراری باشد، SCS تمایل دارد این تکرارها را در هم ادغام کند.

برای مثال:

اگر ژنوم واقعی شامل:

LONG LONG LONG

باشد، الگوریتم ممکن است خروجی‌ای تولید کند که فقط شامل:

LONG LONG

باشد.

یعنی تعداد واقعی تکرارها را کمتر تخمین می‌زند.

اهمیت

این مشکل باعث شد دانشمندان به دنبال مدل‌های دیگری برای مونتاژ ژنوم باشند؛ یکی از مهم‌ترین آن‌ها De Bruijn Graph است.


2. De Bruijn Graph — گراف دی‌بروین

تعریف ساده

یک گراف جهت‌دار (Directed Graph) است که در آن:

  • گره‌ها (Nodes) نشان‌دهنده k-1-merها هستند.
  • یال‌ها (Edges) نشان‌دهنده k-merها هستند.

ساختار کلی

برای هر k-mer:

  1. بخش ابتدایی آن (Prefix با طول k-1) یک گره ایجاد می‌کند.
  2. بخش انتهایی آن (Suffix با طول k-1) یک گره ایجاد می‌کند.
  3. یک یال جهت‌دار از Prefix به Suffix رسم می‌شود.

مثال ساده

فرض کنیم:

k = 3

و یک k-mer داریم:

AAB

این k-mer شامل دو k-1-mer است:

AA → AB

بنابراین در گراف:

  • یک گره برای AA
  • یک گره برای AB
  • یک یال از AA به AB

ایجاد می‌شود.


3. k-mer — زیررشته با طول k

تعریف

یک قطعه از DNA با طول مشخص k که از توالی ژنوم استخراج می‌شود.

مثال:

اگر:

Genome = AABBBA

و:

k = 3

باشد، k-merها عبارت‌اند از:

AAB
ABB
BBB
BBA

اهمیت در De Bruijn Graph

در این روش:

  • هر k-mer → یک یال در گراف
  • هر k-1-mer → یک گره در گراف

است.

بنابراین گراف اطلاعات لازم برای بازسازی ژنوم را در خود نگه می‌دارد.


4. ساخت De Bruijn Graph از داده‌های توالی‌یابی

برای ساخت گراف:

فرض می‌کنیم:

  • تمام k-merهای موجود در ژنوم را داریم.
  • هر k-mer دقیقاً یک بار مشاهده شده است.

برای هر k-mer:

مرحله 1: استخراج k-1-merهای چپ و راست

مثلاً:

k-mer = ABB

پس:

Left k-1-mer = AB
Right k-1-mer = BB

مرحله 2: ایجاد گره‌ها

اگر گره‌ها قبلاً وجود نداشته باشند، اضافه می‌شوند:

AB
BB

مرحله 3: ایجاد یال

یک یال جهت‌دار اضافه می‌شود:

AB → BB

5. Multigraph — گراف چندیاله

تعریف

گرافی که ممکن است چندین یال بین دو گره یکسان داشته باشد.

در De Bruijn Graph این اتفاق ممکن است رخ دهد.

مثلاً:

Tomorrow → And
Tomorrow → And

دو یال جداگانه بین همان دو گره ایجاد می‌کنند.

اهمیت

چون یک k-mer ممکن است چند بار در ژنوم ظاهر شود، De Bruijn Graph باید بتواند چند مسیر مشابه را نمایش دهد.


6. Genome Reconstruction — بازسازی ژنوم

ایده اصلی

اگر فقط گراف De Bruijn را داشته باشیم، می‌توانیم ژنوم اولیه را دوباره بسازیم.

بازسازی ژنوم برابر است با:

پیدا کردن مسیری در گراف که تمام یال‌ها را دقیقاً یک بار طی کند.


7. Eulerian Walk — مسیر اویلری

تعریف ساده

مسیر در یک گراف جهت‌دار که:

  • از هر یال دقیقاً یک بار عبور کند.
  • جهت یال‌ها رعایت شود.

ارتباط با مونتاژ ژنوم

در De Bruijn Graph:

  • هر یال = یک k-mer
  • عبور از تمام یال‌ها = استفاده از تمام k-merها

پس:

Eulerian Walk → بازسازی ژنوم اصلی


مثال بازسازی

فرض کنیم گراف دارای این مسیر باشد:

AA → AA → AB → BB → BB → BA

با دنبال کردن مسیر:

  1. اولین k-mer تولید می‌شود.
  2. در هر حرکت فقط کاراکتر جدید اضافه می‌شود.
  3. در پایان توالی کامل ژنوم ساخته می‌شود.

نکات مهم

  • روش Shortest Common Superstring در ژنوم‌های تکراری مشکل دارد، زیرا توالی‌های مشابه را بیش از حد ادغام می‌کند.

  • De Bruijn Graph یک نمایش متفاوت از داده‌های توالی‌یابی ارائه می‌دهد.

  • در De Bruijn Graph:

    • گره‌ها = k-1-merها
    • یال‌ها = k-merها
  • هر k-mer ژنوم دقیقاً یک یال متناظر در گراف دارد.

  • هر k-1-mer منحصر‌به‌فرد یک گره ایجاد می‌کند.

  • بازسازی ژنوم به پیدا کردن مسیر اویلری در گراف تبدیل می‌شود.

  • اگر تمام k-merهای ژنوم را دقیقاً یک بار داشته باشیم، گراف De Bruijn یک گراف اویلری خواهد بود.

  • Eulerian Walk یک راه‌حل محاسباتی برای مسئله مونتاژ ژنوم فراهم می‌کند.

  • De Bruijn Graph مشکل Over-collapse در SCS را کاهش می‌دهد، اما همه مشکلات تکرارهای ژنومی را حذف نمی‌کند.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Genome Assembly مونتاژ ژنوم بازسازی توالی کامل ژنوم از قطعات خوانده‌شده
Shortest Common Superstring (SCS) کوتاه‌ترین رشته مشترک کوتاه‌ترین رشته‌ای که همه رشته‌های ورودی را شامل شود
De Bruijn Graph گراف دی‌بروین گرافی برای نمایش k-merهای حاصل از توالی‌یابی
Directed Graph گراف جهت‌دار گرافی که یال‌ها دارای جهت هستند
Node گره عنصر اصلی گراف که معمولاً نماینده k-1-mer است
Edge یال اتصال جهت‌دار بین دو گره که نماینده k-mer است
k-mer قطعه با طول k زیررشته‌ای از DNA با طول مشخص
k-1-mer قطعه با طول k-1 بخش Prefix یا Suffix یک k-mer
Multigraph گراف چندیاله گرافی که چند یال مشابه بین دو گره دارد
Eulerian Walk مسیر اویلری پیمایشی که هر یال را دقیقاً یک بار طی می‌کند
Eulerian Graph گراف اویلری گرافی که دارای مسیر اویلری است
Repeat Sequence توالی تکراری بخش‌هایی از ژنوم که چندین بار تکرار شده‌اند
Over-collapse ادغام بیش از حد کاهش مصنوعی تعداد نسخه‌های توالی‌های تکراری

مثال‌ها و تشبیه‌ها

مثال عبارت انگلیسی

عبارت:

Tomorrow and tomorrow and tomorrow

برای نشان دادن ساخت گراف استفاده شد.

ابتدا:

گره‌ها:

Tomorrow
And

سپس برای هر دو کلمه پشت سر هم، یک یال ایجاد می‌شود:

Tomorrow → And
And → Tomorrow

چون این ارتباط چند بار تکرار می‌شود، ممکن است چند یال مشابه بین دو گره ایجاد شود؛ بنابراین گراف یک Multigraph خواهد بود.


خلاصه نهایی مرور سریع

  • مسئله SCS برای مونتاژ ژنوم ساده و قابل فهم است، اما در ژنوم‌های تکراری مشکل ایجاد می‌کند.
  • مشکل اصلی SCS، حذف یا ادغام اشتباه نسخه‌های تکراری ژنوم است.
  • De Bruijn Graph یک روش جایگزین برای نمایش k-merهای ژنوم است.
  • در این گراف، هر k-mer به یک یال تبدیل می‌شود.
  • هر k-1-mer منحصر‌به‌فرد یک گره ایجاد می‌کند.
  • بازسازی ژنوم به پیدا کردن مسیر عبوری از تمام یال‌ها تبدیل می‌شود.
  • این مسیر، Eulerian Walk نام دارد.
  • اگر داده‌های توالی‌یابی شامل تمام k-merها باشند، گراف ساخته‌شده دارای مسیر اویلری خواهد بود.
  • De Bruijn Graph پایه بسیاری از الگوریتم‌های مدرن مونتاژ ژنوم است.
  • استفاده از گراف‌ها باعث می‌شود مسئله مونتاژ از یک مشکل رشته‌ای به یک مسئله گرافی تبدیل شود.

سوالات مرور

1. سوال مفهومی:

چرا Shortest Common Superstring در ژنوم‌های دارای تکرار مشکل ایجاد می‌کند؟

پاسخ: زیرا الگوریتم تلاش می‌کند کوتاه‌ترین توضیح ممکن برای داده‌ها را پیدا کند و در نتیجه بخش‌های تکراری ژنوم را در نسخه‌های کمتر ادغام می‌کند.


2. سوال تعریفی:

در De Bruijn Graph، گره‌ها و یال‌ها چه چیزی را نشان می‌دهند؟

پاسخ:

  • گره‌ها نشان‌دهنده k-1-merها هستند.
  • یال‌ها نشان‌دهنده k-merها هستند.

3. سوال کاربردی:

اگر یک k-mer برابر ACG باشد، چه یالی در De Bruijn Graph ایجاد می‌شود؟

پاسخ:

برای:

k = 3

دو k-1-mer داریم:

AC
CG

پس یک یال ایجاد می‌شود:

AC → CG

4. سوال مفهومی:

چرا Eulerian Walk برای بازسازی ژنوم مناسب است؟

پاسخ: زیرا هر یال نماینده یک k-mer است و عبور از تمام یال‌ها دقیقاً یک بار باعث استفاده از تمام اطلاعات توالی‌یابی و بازسازی ژنوم اصلی می‌شود.


5. سوال کاربردی:

اگر یک k-mer چند بار در ژنوم وجود داشته باشد، چه اثری روی De Bruijn Graph دارد؟

پاسخ: ممکن است چند یال مشابه بین دو گره ایجاد شود و گراف به شکل یک Multigraph درآید.


04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/08_practical-building-a-de-bruijn-graph

ساخت گراف De Bruijn از یک توالی DNA

Building a De Bruijn Graph


خلاصه کلی

در این درس عملی، نحوه ساخت یک گراف De Bruijn از یک رشته DNA پیاده‌سازی می‌شود.

در بخش‌های قبلی یاد گرفتیم که در گراف De Bruijn:

  • هر k-mer از توالی ژنوم به یک یال (Edge) تبدیل می‌شود.
  • هر k-1-mer به یک گره (Node) تبدیل می‌شود.
  • جهت یال نشان‌دهنده ارتباط بین بخش ابتدایی و انتهایی k-mer است.

در این تمرین، یک تابع پایتون به نام de_bruijn_ize ساخته می‌شود که:

  1. یک توالی DNA و مقدار k را دریافت می‌کند.
  2. تمام k-merهای ممکن را از توالی استخراج می‌کند.
  3. برای هر k-mer، دو k-1-mer آن را پیدا می‌کند.
  4. گره‌ها و یال‌های متناظر را ایجاد می‌کند.
  5. گراف De Bruijn ساخته‌شده را برمی‌گرداند.

هدف یادگیری:

  • تبدیل یک توالی DNA به ساختار گرافی
  • درک ارتباط عملی بین k-merها و گراف De Bruijn
  • مشاهده مسیر Eulerian Walk در گراف ایجادشده

مفاهیم کلیدی


1. De Bruijn Graph — گراف دی‌بروین

تعریف ساده

گرافی جهت‌دار است که توالی DNA را به شکل مجموعه‌ای از گره‌ها و یال‌ها نمایش می‌دهد.

در این گراف:

  • Node = k-1-mer
  • Edge = k-mer

است.


نحوه ساخت

برای هر k-mer:

مثلاً:

k-mer = ACG

ابتدا آن را به دو بخش تقسیم می‌کنیم:

Left k-1-mer  = AC
Right k-1-mer = CG

سپس:

  • یک یال از AC به CG ایجاد می‌کنیم:
AC → CG

اهمیت

این ساختار اجازه می‌دهد مسئله مونتاژ ژنوم به یک مسئله پیمایش گراف تبدیل شود.


2. k-mer Extraction — استخراج k-merها

تعریف

یک k-mer زیررشته‌ای از DNA با طول k است.

مثلاً:

رشته:

ACGT

با:

k = 3

دارای k-merهای زیر است:

ACG
CGT

در پیاده‌سازی

برای پیمایش تمام k-merها:

از اولین موقعیت شروع می‌کنیم و تا آخرین جایی که یک k-mer کامل وجود دارد ادامه می‌دهیم.

به صورت مفهومی:

for i in range(0, last_possible_position):
    extract k-mer starting at i

3. k-1-mer — قطعات با طول k-1

تعریف

بخش‌های ابتدایی و انتهایی یک k-mer هستند که طولشان یک واحد کمتر از k است.

مثال:

اگر:

k = 3

و:

k-mer = GCA

باشد:

Left k-1-mer  = GC
Right k-1-mer = CA

این دو قطعه به‌عنوان گره‌های گراف استفاده می‌شوند.


4. Edge Representation — نمایش یال‌ها

در برنامه، هر یال به صورت یک Tuple ذخیره می‌شود.

مثلاً:

برای k-mer:

ACG

یال به شکل زیر ذخیره می‌شود:

("AC", "CG")

یعنی:

AC → CG

5. استفاده از Set در Python

مفهوم

در این پیاده‌سازی، گره‌ها در یک Set ذخیره می‌شوند.

ویژگی مهم Set:

اگر یک مقدار چند بار اضافه شود، فقط یک نسخه نگه داشته می‌شود.

مثال:

nodes.add("AC")
nodes.add("AC")

نتیجه:

{"AC"}

اهمیت در گراف De Bruijn

یک k-1-mer ممکن است در چند k-mer مختلف ظاهر شود، اما باید فقط یک گره داشته باشد.

بنابراین استفاده از Set باعث جلوگیری از ایجاد گره‌های تکراری می‌شود.


الگوریتم تابع de_bruijn_ize

ورودی:

de_bruijn_ize(sequence, k)

که شامل:

  • sequence: رشته DNA
  • k: طول k-mer

است.


مراحل الگوریتم

مرحله 1: ایجاد ساختارهای ذخیره‌سازی

دو ساختار ایجاد می‌کنیم:

  • لیست یال‌ها:
edges
  • مجموعه گره‌ها:
nodes

مرحله 2: پیمایش k-merها

برای هر موقعیت:

یک k-mer استخراج می‌شود.

مثلاً:

ACGT

با:

k=3

ابتدا:

ACG

سپس:

CGT

مرحله 3: استخراج k-1-merها

برای هر k-mer:

قسمت چپ:

sequence[i:i+k-1]

قسمت راست:

sequence[i+1:i+k]

مرحله 4: افزودن به گراف

گره‌ها اضافه می‌شوند:

left k-1-mer
right k-1-mer

و یال ساخته می‌شود:

left → right

مثال عملی

فرض کنیم توالی DNA:

ACGCGT

و:

k = 3

k-merها:

ACG
CGC
GCG
CGT

تبدیل به یال:

k-mer Left k-1-mer Right k-1-mer Edge
ACG AC CG AC → CG
CGC CG GC CG → GC
GCG GC CG GC → CG
CGT CG GT CG → GT

گره‌ها:

AC
CG
GC
GT

یال‌ها:

AC → CG
CG → GC
GC → CG
CG → GT

6. Eulerian Walk — مسیر اویلری

تعریف

مسیر در گرافی که:

  • از تمام یال‌ها عبور می‌کند.
  • هر یال دقیقاً یک بار استفاده می‌شود.

ارتباط با De Bruijn Graph

در مثال بالا:

مسیر:

AC → CG → GC → CG → GT

یک مسیر اویلری است.

زیرا تمام یال‌ها را دقیقاً یک بار طی می‌کند.


نکات مهم

  • تابع de_bruijn_ize مستقیماً مفهوم نظری گراف De Bruijn را به کد تبدیل می‌کند.
  • هر k-mer دقیقاً یک یال در گراف ایجاد می‌کند.
  • هر k-1-mer منحصر‌به‌فرد فقط یک Node خواهد داشت.
  • استفاده از Python Set باعث حذف خودکار گره‌های تکراری می‌شود.
  • ترتیب یال‌های ایجادشده در مثال عملی همان مسیر Eulerian Walk را تشکیل می‌دهد.
  • در مونتاژ ژنوم، پیدا کردن مسیر اویلری روی این گراف باعث بازسازی توالی اصلی می‌شود.
  • نمایش گراف به شکل تصویری کمک می‌کند مسیر بازسازی ژنوم بهتر دیده شود.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
De Bruijn Graph گراف دی‌بروین نمایش گرافی k-merهای DNA برای مونتاژ ژنوم
k-mer قطعه با طول k زیررشته‌ای از DNA با اندازه k
k-1-mer قطعه با طول k-1 بخش ابتدایی یا انتهایی k-mer
Node گره عنصر گراف که نماینده k-1-mer است
Edge یال اتصال جهت‌دار بین دو k-1-mer
Directed Graph گراف جهت‌دار گرافی که یال‌های آن جهت دارند
Tuple تاپل ساختار داده پایتون برای ذخیره زوج مقادیر
Set مجموعه ساختار داده‌ای که اعضای تکراری را حذف می‌کند
Eulerian Walk مسیر اویلری پیمایش تمام یال‌های گراف دقیقاً یک بار
Genome Assembly مونتاژ ژنوم بازسازی ژنوم از قطعات کوتاه DNA

مثال‌ها و تشبیه‌ها

تشبیه ساخت پازل

در روش De Bruijn:

  • هر k-mer مانند یک قطعه کوچک از پازل است.
  • بخش‌های k-1-mer مانند نقاط اتصال قطعات هستند.
  • گراف نشان می‌دهد کدام قطعات باید کنار هم قرار گیرند.

با دنبال کردن مسیر درست در گراف، تصویر کامل (ژنوم) بازسازی می‌شود.


خلاصه نهایی مرور سریع

  • De Bruijn Graph برای تبدیل داده‌های توالی‌یابی به یک مسئله گرافی استفاده می‌شود.
  • در این گراف، k-merها به یال تبدیل می‌شوند.
  • k-1-merها به گره تبدیل می‌شوند.
  • تابع de_bruijn_ize با استخراج k-merها گراف را می‌سازد.
  • هر k-mer یک اتصال جهت‌دار بین دو k-1-mer ایجاد می‌کند.
  • گره‌ها با Set ذخیره می‌شوند تا تکراری نباشند.
  • بازسازی ژنوم با یافتن Eulerian Walk انجام می‌شود.
  • مسیر اویلری تمام k-merها را دقیقاً یک بار مصرف می‌کند.
  • De Bruijn Graph پایه بسیاری از الگوریتم‌های مدرن مونتاژ ژنوم است.
  • پیاده‌سازی عملی این الگوریتم نشان می‌دهد چگونه مفاهیم ریاضی به کد تبدیل می‌شوند.

سوالات مرور

1. سوال مفهومی:

چرا در De Bruijn Graph به جای k-mer از k-1-mer برای گره‌ها استفاده می‌کنیم؟

پاسخ: زیرا دو k-1-mer ابتدا و انتهای k-mer هستند که ارتباط بین k-merها را مشخص می‌کنند و امکان اتصال قطعات را فراهم می‌کنند.


2. سوال تعریفی:

در De Bruijn Graph یک k-mer چه چیزی را ایجاد می‌کند؟

پاسخ: هر k-mer یک یال جهت‌دار ایجاد می‌کند که از k-1-mer ابتدایی به k-1-mer انتهایی می‌رود.


3. سوال کاربردی:

برای k-mer برابر با ATG چه یالی ساخته می‌شود؟

پاسخ:

k-1-merها:

AT
TG

پس یال:

AT → TG

خواهد بود.


4. سوال برنامه‌نویسی:

چرا در تابع de_bruijn_ize از Set برای ذخیره Nodeها استفاده شده است؟

پاسخ: زیرا ممکن است یک k-1-mer چندین بار دیده شود، اما باید فقط یک Node در گراف داشته باشیم.


5. سوال مفهومی:

چگونه می‌توان از De Bruijn Graph توالی ژنوم را بازسازی کرد؟

پاسخ: با پیدا کردن یک Eulerian Walk که تمام یال‌های گراف را دقیقاً یک بار طی کند.


04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/09_lecture-when-eulerian-walks-go-wrong

الگوریتم‌های مونتاژ ژنوم (Genome Assembly Algorithms)

چه زمانی مسیرهای اویلری (Eulerian Walks) شکست می‌خورند؟


خلاصه کلی

در درس‌های قبل، دو رویکرد برای حل مسئله مونتاژ ژنوم (Genome Assembly) بررسی شد:

  1. Shortest Common Superstring (SCS)

    • تلاش می‌کند کوتاه‌ترین رشته‌ای را پیدا کند که همه Readها را در خود جای دهد.
    • مشکل اصلی آن: در ژنوم‌های تکراری (Repetitive Genomes) معمولاً تکرارها را بیش از حد ادغام می‌کند (Over-collapse).
  2. De Bruijn Graph + Eulerian Walk

    • رویکردی جایگزین است که بسیاری از مشکلات SCS را کاهش می‌دهد.
    • در شرایط ایده‌آل می‌تواند ژنوم اصلی را بازسازی کند.

اما این درس نشان می‌دهد که حتی De Bruijn Graph نیز نمی‌تواند قانون سوم مونتاژ را حذف کند:

Third Law of Assembly: Repeats make assembly difficult تکرارهای ژنومی، مونتاژ را دشوار می‌کنند.

هدف این درس:

  • بررسی محدودیت‌های روش Eulerian Walk
  • فهم اینکه چگونه تکرارهای ژنومی باعث ایجاد ابهام در De Bruijn Graph می‌شوند.
  • آشنایی با مشکلات داده‌های واقعی Sequencing.

مفاهیم کلیدی


1. Eulerian Walk (مسیر اویلری)

تعریف ساده

یک مسیر در یک گراف جهت‌دار است که:

  • از رأس‌ها عبور می‌کند.
  • هر یال (Edge) را دقیقاً یک بار طی می‌کند.

در مونتاژ ژنوم:

  • هر یال در De Bruijn Graph نماینده یک k-mer است.
  • پیدا کردن Eulerian Walk یعنی پیدا کردن ترتیبی از k-merها که ژنوم را بازسازی کند.

توضیح دقیق

در حالت ایده‌آل:

  1. تمام k-merهای ژنوم در اختیار داریم.
  2. هر k-mer فقط یک بار مشاهده شده است.
  3. De Bruijn Graph ساخته‌شده دارای مسیر اویلری است.

در این شرایط:

Eulerian Walk → بازسازی صحیح ژنوم

اهمیت

Eulerian Walk یک الگوریتم قدرتمند برای Genome Assembly است، اما تنها زمانی که گراف بدون ابهام باشد.


2. Repeat Sequences (توالی‌های تکراری)

تعریف ساده

بخش‌هایی از ژنوم که چندین بار در نقاط مختلف تکرار شده‌اند.

مثال:

long long long

کلمه‌ی long سه بار تکرار شده است.

در DNA نیز توالی‌های مشابهی وجود دارند:

  • Repetitive DNA
  • Transposable Elements

مشکل اصلی

وقتی یک توالی چندین بار در ژنوم وجود دارد، Readها ممکن است نتوانند مشخص کنند:

  • چند نسخه از آن وجود دارد؟
  • هر نسخه دقیقاً در کجا قرار گرفته است؟

3. Ambiguity in Assembly (ابهام در مونتاژ)

تعریف

زمانی رخ می‌دهد که بیش از یک بازسازی ممکن از داده‌های موجود وجود داشته باشد.

در De Bruijn Graph:

ممکن است چندین Eulerian Walk وجود داشته باشد.

اما:

  • فقط یکی از آن‌ها ژنوم واقعی است.
  • مسیرهای دیگر بازسازی‌های اشتباه هستند.

4. Multiple Eulerian Walks (چند مسیر اویلری)

توضیح

یک De Bruijn Graph ممکن است:

  • فقط یک Eulerian Walk داشته باشد → بازسازی مشخص
  • چند Eulerian Walk داشته باشد → ابهام در مونتاژ

علت اصلی:

وجود Repeatها.


مثال مفهومی

فرض کنید یک بخش:

AB

در سه نقطه مختلف ژنوم وجود داشته باشد.

در گراف:

      AB
     /  \
    X    Y
     \  /
      AB

مشخص نیست بعد از عبور از AB باید به کدام بخش برویم.

در نتیجه:

چند مسیر مختلف ایجاد می‌شود.


5. Effect of k-mer Size (تأثیر اندازه k-mer)

k کوچک

مثلاً:

k = 3

مزایا:

  • تعداد k-merهای بیشتری تولید می‌شود.
  • پوشش ژنوم بهتر است.

معایب:

  • احتمال تکراری بودن k-merها زیاد می‌شود.
  • گراف پیچیده‌تر می‌شود.
  • تعداد Eulerian Walkهای ممکن افزایش می‌یابد.

k بزرگ

مثلاً:

k = 50

مزایا:

  • احتمال اینکه یک k-mer در چند جای ژنوم ظاهر شود کمتر است.
  • ابهام کاهش می‌یابد.

معایب:

  • ممکن است بعضی قسمت‌های ژنوم پوشش کافی نداشته باشند.

6. Sequencing Data در دنیای واقعی

در مثال‌های آموزشی، فرض‌های ساده‌ای داشتیم:

فرض می‌کردیم:

  • هر k-mer دقیقاً یک بار خوانده می‌شود.
  • هیچ خطای Sequencing وجود ندارد.
  • همه قسمت‌های ژنوم پوشش برابر دارند.

اما در عمل:

این فرض‌ها درست نیستند.


مشکلات داده واقعی:

1. Sequencing Errors

خطاهای خواندن DNA توسط دستگاه.

مثلاً:

ژنوم واقعی:

ACGT

Read دستگاه:

ACGG

2. Uneven Coverage

پوشش یکنواخت نیست.

برخی قسمت‌ها:

  • Readهای زیاد دارند.

برخی قسمت‌ها:

  • Read کافی ندارند.

3. Missing k-mers

ممکن است بعضی k-merها اصلاً مشاهده نشوند.


4. Duplicate k-mers

ممکن است یک k-mer چند بار دیده شود.


7. تقریباً Eulerian بودن گراف

در داده واقعی:

De Bruijn Graph معمولاً کاملاً Eulerian نیست.

چون:

  • بعضی یال‌ها کم هستند.
  • بعضی یال‌ها بیش از حد وجود دارند.
  • خطای Sequencing وجود دارد.

بنابراین:

Real De Bruijn Graph ≠ Perfect Eulerian Graph

اما اغلب:

Real Graph ≈ Almost Eulerian

است.


نکات مهم

  • روش Shortest Common Superstring در ژنوم‌های تکراری دچار Over-collapse می‌شود.
  • De Bruijn Graph این مشکل خاص را بهتر حل می‌کند.
  • Eulerian Walk می‌تواند ژنوم را بازسازی کند، اما فقط وقتی مسیر مشخص باشد.
  • Repeatها باعث ایجاد چند مسیر اویلری ممکن می‌شوند.
  • فقط یکی از این مسیرها معمولاً ژنوم واقعی است.
  • کاهش اندازه k باعث افزایش احتمال تکرار و ابهام می‌شود.
  • افزایش k می‌تواند ابهام را کم کند، اما ممکن است باعث کمبود پوشش شود.
  • در داده‌های واقعی، گراف‌ها معمولاً Eulerian کامل نیستند.
  • بسیاری از ابزارهای مدرن Assembly هنوز از De Bruijn Graph به عنوان نمایش داخلی استفاده می‌کنند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Eulerian Walk مسیر اویلری پیمایش گراف که هر یال را دقیقاً یک بار طی می‌کند
Eulerian Graph گراف اویلری گرافی که دارای مسیر اویلری است
De Bruijn Graph گراف دی‌بروین نمایش گرافی k-merها برای مونتاژ ژنوم
Repeat Sequence توالی تکراری بخشی از DNA که چندین بار در ژنوم وجود دارد
Repetitive Genome ژنوم تکراری ژنومی با مقدار زیادی توالی تکراری
Over-collapse ادغام بیش از حد کاهش تعداد نسخه‌های Repeat در بازسازی
Ambiguity ابهام وجود چند پاسخ ممکن برای مونتاژ
k-mer قطعه‌ای با طول k زیررشته‌ای از DNA با اندازه k
Sequencing Error خطای توالی‌یابی اشتباه دستگاه در خواندن DNA
Coverage پوشش تعداد دفعاتی که یک ناحیه ژنوم خوانده شده است
Uneven Coverage پوشش غیر یکنواخت تفاوت تعداد Readها در بخش‌های مختلف ژنوم

مثال‌ها و تشبیه‌ها

مثال تکرار کلمه Long

فرض کنید ژنوم مانند یک متن باشد:

long long long time

اگر فقط قطعات کوتاه متن را داشته باشیم:

long
long
long

نمی‌توانیم بفهمیم چند بار "long" در متن اصلی وجود داشته است.

Shortest Common Superstring ممکن است بگوید:

long long time

و یکی از تکرارها را حذف کند.

اما De Bruijn Graph ممکن است:

  • تعداد بیشتری از تکرارها را حفظ کند.
  • ولی هنوز ممکن است چند مسیر مختلف ایجاد شود.

تشبیه پازل

مونتاژ ژنوم مانند کنار هم گذاشتن یک پازل است.

اگر قطعات پازل ویژگی خاصی داشته باشند:

آسمان آبی
آسمان آبی
آسمان آبی

نمی‌دانیم هر قطعه دقیقاً متعلق به کدام بخش تصویر است.

توالی‌های تکراری DNA نیز همین مشکل را ایجاد می‌کنند.


خلاصه نهایی مرور سریع

  • De Bruijn Graph یک روش جایگزین برای Shortest Common Superstring در مونتاژ ژنوم است.
  • در شرایط ایده‌آل، Eulerian Walk می‌تواند ژنوم اصلی را بازسازی کند.
  • هر Eulerian Walk یک بازسازی احتمالی از ژنوم است.
  • وجود Repeatها باعث ایجاد چند Eulerian Walk ممکن می‌شود.
  • فقط یکی از مسیرها معمولاً ترتیب واقعی ژنوم را نشان می‌دهد.
  • Repeatها قانون سوم Assembly را ایجاد می‌کنند: «تکرارها مونتاژ را دشوار می‌کنند».
  • k کوچک باعث افزایش ابهام در گراف می‌شود.
  • k بزرگ می‌تواند باعث کاهش پوشش شود.
  • داده‌های واقعی Sequencing دارای خطا و پوشش غیر یکنواخت هستند.
  • De Bruijn Graph در نرم‌افزارهای واقعی Assembly همچنان یک نمایش بسیار مهم است.

سوالات مرور

سوال 1: مسیر Eulerian Walk چیست؟

پاسخ: مسیر Eulerian Walk مسیری در گراف جهت‌دار است که هر یال را دقیقاً یک بار طی می‌کند. در Assembly، این مسیر برای بازسازی ترتیب k-merها استفاده می‌شود.


سوال 2: چرا Repeatها باعث مشکل در Assembly می‌شوند؟

پاسخ: زیرا Readها نمی‌توانند مشخص کنند یک توالی تکراری دقیقاً چند بار و در چه موقعیتی در ژنوم وجود دارد. این موضوع باعث ایجاد چند بازسازی ممکن می‌شود.


سوال 3: تفاوت مشکل Repeat در SCS و De Bruijn Graph چیست؟

پاسخ: در SCS معمولاً Repeatها بیش از حد ادغام می‌شوند (Over-collapse)، اما در De Bruijn Graph مشکل اصلی ایجاد چند مسیر Eulerian و بازسازی‌های اشتباه است.


سوال 4: چرا کاهش k باعث افزایش مشکل Assembly می‌شود؟

پاسخ: زیرا k-merهای کوتاه احتمال بیشتری دارند که در چند نقطه ژنوم تکرار شوند، بنابراین گراف ابهام بیشتری پیدا می‌کند.


سوال 5: آیا De Bruijn Graph مشکل Assembly را کاملاً حل کرده است؟

پاسخ: خیر. De Bruijn Graph بسیاری از مشکلات SCS را کاهش می‌دهد، اما همچنان با مشکل بنیادی Repeatها و داده‌های ناقص Sequencing مواجه است.


04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/10_lecture-assemblers-in-practice

مونتاژگرهای واقعی ژنوم (Assemblers in Practice)

خلاصه کلی

در بخش‌های قبلی، دو روش محاسباتی برای حل مسئله Genome Assembly بررسی شد:

  1. Shortest Common Superstring (SCS) مبتنی بر Overlap Graph
  2. Eulerian Walk مبتنی بر De Bruijn Graph

هر دو روش ایده‌های مهمی ارائه می‌دهند، اما در عمل مشکلات جدی دارند، مخصوصاً در مواجهه با:

  • خطاهای Sequencing
  • ژنوم‌های تکراری (Repetitive Genomes)
  • تفاوت‌های طبیعی بین نسخه‌های کروموزوم‌ها (Polyploidy)
  • حجم بسیار بزرگ داده‌های واقعی

در این درس بررسی می‌شود که نرم‌افزارهای واقعی مونتاژ ژنوم (Genome Assemblers) چگونه با این مشکلات برخورد می‌کنند.

هدف یادگیری:

  • شناخت دو خانواده اصلی نرم‌افزارهای Assembly
  • درک دلیل پیچیده و نامرتب بودن گراف‌های واقعی
  • آشنایی با مفهوم Contig به عنوان خروجی عملی مونتاژگرها

مفاهیم کلیدی


1. Genome Assembler (مونتاژگر ژنوم)

تعریف ساده

نرم‌افزاری است که از مجموعه‌ای از Readهای حاصل از Sequencing، تلاش می‌کند توالی اصلی ژنوم را بازسازی کند.


توضیح دقیق

مونتاژگرها معمولاً ابتدا یک گراف ایجاد می‌کنند:

  • Overlap Graph
  • De Bruijn Graph

سپس تلاش می‌کنند مسیرهای مناسب در گراف را پیدا کنند و توالی ژنوم را بازسازی کنند.

اما در داده‌های واقعی، گراف معمولاً:

  • بزرگ
  • پیچیده
  • دارای شاخه‌های متعدد
  • دارای ابهام

است.


2. Overlap-Layout-Consensus (OLC)

Overlap-Layout-Consensus Assembly

تعریف ساده

یک خانواده از الگوریتم‌های Assembly است که از Overlap Graph استفاده می‌کند.


مراحل اصلی:

1. Overlap

پیدا کردن بخش‌های مشترک بین Readها.

مثلاً:

Read A:
ACGTAAA

Read B:
TAAAGGC

دارای همپوشانی:

TAAA

2. Layout

قرار دادن Readها در ترتیب مناسب بر اساس Overlapها.


3. Consensus

ایجاد توالی نهایی با استفاده از اطلاعات چند Read.


کاربرد

این روش بیشتر برای:

  • Readهای بلند (Long Reads)
  • ژنوم‌های بزرگ

استفاده می‌شود.


3. De Bruijn Graph-based Assembly

تعریف ساده

روش مونتاژی که از De Bruijn Graph برای نمایش روابط بین k-merها استفاده می‌کند.


توضیح دقیق

در این روش:

  • هر Read به k-merهای کوچک‌تر تقسیم می‌شود.
  • k-merها به گراف تبدیل می‌شوند.
  • مسیر مناسب در گراف، بازسازی ژنوم را ایجاد می‌کند.

مزیت

برای داده‌های کوتاه (Short Reads) بسیار مناسب است.


4. Complexity of Real Assembly Graphs

پیچیدگی گراف‌های واقعی Assembly

در مثال‌های آموزشی، گراف‌ها کوچک و ساده بودند.

اما در عمل:

یک De Bruijn Graph واقعی ممکن است هزاران یا میلیون‌ها گره داشته باشد.

دلایل پیچیدگی:

  1. Sequencing Errors
  2. Transitive Edges
  3. Polyploidy
  4. Repeats

5. Sequencing Errors (خطاهای توالی‌یابی)

تعریف

خطاهایی که دستگاه Sequencer هنگام خواندن DNA ایجاد می‌کند.


اثر روی گراف

یک خطای کوچک می‌تواند باعث ایجاد:

  • شاخه‌های غیرواقعی
  • مسیرهای بن‌بست (Dead Ends)
  • قطعات جداشده از گراف

شود.


مثال

فرض کنید توالی واقعی:

ACGTACGT

اما دستگاه بخواند:

ACGTTCGT

این یک k-mer اشتباه ایجاد می‌کند که در گراف یک مسیر اضافی می‌سازد.


وظیفه Assembly

مونتاژگر باید:

  • این مسیرهای اشتباه را حذف کند.
  • آن‌ها را نادیده بگیرد.

6. Transitive Edges (یال‌های قابل استنتاج)

تعریف ساده

یال‌هایی در گراف که اطلاعات جدیدی اضافه نمی‌کنند و از یال‌های دیگر قابل پیش‌بینی هستند.


مثال

فرض کنید:

  • Read A با Read B همپوشانی 6 دارد.
  • Read B با Read C همپوشانی 6 دارد.

اگر طول Readها 7 باشد، احتمالاً:

  • A و C نیز همپوشانی 5 دارند.

بنابراین یال A → C از قبل قابل پیش‌بینی است.


اهمیت

وجود تعداد زیاد این یال‌ها باعث:

  • بزرگ شدن غیرضروری گراف
  • افزایش پیچیدگی محاسباتی

می‌شود.


7. Polyploidy (چندنسخه‌ای بودن ژنوم)

تعریف

وجود چند نسخه از یک کروموزوم یا ژنوم.


مثال در انسان

انسان:

  • یک نسخه از مادر
  • یک نسخه از پدر

دریافت می‌کند.

گاهی یک موقعیت DNA در این دو نسخه متفاوت است.

مثلاً:

نسخه مادری:

A

نسخه پدری:

G

اثر در De Bruijn Graph

این تفاوت باعث ایجاد ساختاری به نام:

Bubble (حباب)

در گراف می‌شود.


Bubble چیست؟

دو مسیر موازی که نشان‌دهنده دو نسخه متفاوت از یک ناحیه ژنوم هستند.

این یک خطا نیست؛ بلکه یک تفاوت واقعی ژنتیکی است.


روش برخورد

مونتاژگر ممکن است:

  • Bubble را ادغام کند.
  • اطلاعات تفاوت را جداگانه نگه دارد.

8. Repeat Sequences (توالی‌های تکراری)

تعریف

توالی‌هایی که چندین بار در ژنوم تکرار شده‌اند.


مشکل

Repeatها باعث ایجاد:

Ambiguity (ابهام)

در گراف می‌شوند.

زیرا مشخص نیست:

  • چند بار باید از یک مسیر عبور کنیم.
  • هر بخش متعلق به کدام موقعیت ژنوم است.

اثر در الگوریتم‌ها

Shortest Common Superstring:

مشکل:

Over-collapse

یعنی:

تکرارها کمتر از مقدار واقعی بازسازی می‌شوند.


Eulerian Walk:

مشکل:

Genome Reshuffling

یعنی:

بخش‌های بین Repeatها ممکن است جابه‌جا شوند.


9. Contig (قطعه پیوسته ژنوم)

تعریف ساده

یک بخش از ژنوم است که می‌توان آن را بدون ابهام مونتاژ کرد.

نام Contig کوتاه‌شده:

Contiguous Sequence


توضیح دقیق

در ژنوم‌های واقعی:

معمولاً نمی‌توان کل ژنوم را به صورت یک رشته کامل بازسازی کرد.

اما بخش‌هایی از گراف ممکن است بدون ابهام باشند.

این بخش‌ها:

Contigs

نامیده می‌شوند.


اهمیت

خروجی واقعی بیشتر Assemblyها:

یک ژنوم کامل نیست، بلکه:

Genome Assembly = مجموعه‌ای از Contigs

است.


نکات مهم

  • دو دسته اصلی Assembly Software:

    • OLC-based Assemblers
    • De Bruijn Graph-based Assemblers
  • ساخت گراف فقط مرحله اول Assembly است؛ حل مسیر گراف مرحله دشوارتر است.

  • گراف‌های واقعی به دلیل خطاها و Repeatها بسیار پیچیده هستند.

  • Sequencing Errors باعث ایجاد مسیرهای جعلی در گراف می‌شوند.

  • Polyploidy باعث ایجاد Bubble در De Bruijn Graph می‌شود.

  • Repeatها مهم‌ترین عامل محدودکننده Assembly هستند.

  • در بسیاری از موارد نمی‌توان یک ژنوم کامل تولید کرد.

  • خروجی عملی Assembly معمولاً مجموعه‌ای از Contigها است.

  • حتی ژنوم مرجع انسان نیز دارای شکاف‌های Assembly است.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Genome Assembler مونتاژگر ژنوم نرم‌افزار بازسازی ژنوم از Readها
Overlap Graph گراف همپوشانی گرافی که روابط Overlap بین Readها را نشان می‌دهد
De Bruijn Graph گراف دی‌بروین گراف مبتنی بر k-merها
Overlap-Layout-Consensus (OLC) همپوشانی-چیدمان-اجماع روش Assembly مبتنی بر Overlap Graph
Sequencing Error خطای توالی‌یابی اشتباه در خواندن DNA
Dead End بن‌بست مسیر غیرواقعی ایجادشده در گراف
Transitive Edge یال قابل استنتاج یالی که اطلاعات جدیدی ندارد
Polyploidy چندنسخه‌ای بودن ژنوم داشتن چند نسخه از کروموزوم‌ها
Bubble حباب گرافی دو مسیر موازی ناشی از تفاوت ژنتیکی
Repeat Sequence توالی تکراری توالی DNA با چندین کپی
Contig قطعه پیوسته بخش مونتاژشده بدون ابهام از ژنوم
Consensus Sequence توالی اجماع توالی نهایی حاصل از چند Read

مثال‌ها و تشبیه‌ها

تشبیه پازل

Assembly ژنوم مانند حل کردن یک پازل بسیار بزرگ است.

در یک پازل معمولی:

  • هر قطعه جای مشخصی دارد.

اما در ژنوم:

  • قطعات مشابه زیادی وجود دارند.
  • بعضی قطعات ممکن است متعلق به چند جای مختلف باشند.

بنابراین:

ممکن است بتوانیم بخش‌هایی از پازل را بسازیم، اما نه کل تصویر را.

این بخش‌های کامل‌شده همان:

Contig

هستند.


خلاصه نهایی مرور سریع

  • Assembly واقعی پیچیده‌تر از مثال‌های ساده آموزشی است.
  • دو خانواده اصلی مونتاژگرها OLC و De Bruijn Graph-based هستند.
  • گراف‌های واقعی به علت خطاهای Sequencing بسیار نامرتب هستند.
  • Transitive Edges باعث افزایش غیرضروری پیچیدگی گراف می‌شوند.
  • Polyploidy باعث ایجاد Bubble در گراف می‌شود.
  • Repeatها بزرگ‌ترین مانع Assembly هستند.
  • به دلیل Repeatها معمولاً نمی‌توان ژنوم کامل را بازسازی کرد.
  • مونتاژگرها معمولاً Contig تولید می‌کنند نه یک ژنوم کامل.
  • حتی ژنوم مرجع انسان هنوز دارای Gap است.
  • De Bruijn Graph و Overlap Graph همچنان ابزارهای اصلی نمایش Assembly هستند.

سوالات مرور

سوال 1: دو دسته اصلی نرم‌افزارهای Assembly چیستند؟

پاسخ: دو دسته اصلی عبارت‌اند از:

  1. Overlap-Layout-Consensus (OLC) که از Overlap Graph استفاده می‌کند.
  2. De Bruijn Graph-based Assemblers که از De Bruijn Graph استفاده می‌کنند.

سوال 2: چرا Sequencing Error باعث پیچیدگی گراف می‌شود؟

پاسخ: زیرا یک خطای کوچک می‌تواند k-merهای اشتباه ایجاد کند و باعث تشکیل شاخه‌ها یا مسیرهای غیرواقعی در گراف شود.


سوال 3: Bubble در De Bruijn Graph نشان‌دهنده چیست؟

پاسخ: Bubble معمولاً نشان‌دهنده تفاوت واقعی بین دو نسخه ژنوم، مانند نسخه مادری و پدری، در موجودات Diploid است.


سوال 4: چرا Assembly معمولاً به جای یک ژنوم کامل، Contig تولید می‌کند؟

پاسخ: زیرا Repeatها باعث ایجاد ابهام در گراف می‌شوند و بخش‌هایی از ژنوم قابل بازسازی قطعی نیستند.


سوال 5: مهم‌ترین عامل دشواری Assembly چیست؟

پاسخ: توالی‌های تکراری (Repeat Sequences)، زیرا باعث ایجاد ابهام و چندین مسیر ممکن در گراف می‌شوند.


04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/11_lecture-the-future-is-long

درس 11: آینده مونتاژ ژنوم به خوانش‌های طولانی وابسته است

The Future Is Long


خلاصه کلی

در این درس به یکی از مهم‌ترین چالش‌های Genome Assembly (مونتاژ ژنوم) یعنی وجود DNAهای تکراری (Repetitive DNA) پرداخته می‌شود و بررسی می‌کنیم که چگونه افزایش طول خوانش‌های توالی‌یابی (Long Reads) می‌تواند این مشکل را کاهش دهد.

در درس‌های قبل دیدیم که:

  • الگوریتم Shortest Common Superstring می‌تواند تکرارها را بیش از حد ادغام کند (Over-collapse).
  • الگوریتم‌های مبتنی بر De Bruijn Graph نیز در حضور تکرارها ممکن است دچار ابهام شوند.

راه‌حل نظری این مشکل، استفاده از Reads طولانی‌تر است؛ زیرا خوانش‌های بلند می‌توانند نواحی تکراری را به بخش‌های منحصربه‌فرد اطرافشان متصل کنند و جایگاه واقعی آن‌ها را مشخص کنند.

هدف این درس:

  • درک دلیل اهمیت طول خوانش‌ها در مونتاژ ژنوم
  • فهم اینکه چرا Reads کوتاه باعث ابهام می‌شوند
  • آشنایی با فناوری‌هایی که امکان تولید Reads طولانی‌تر را فراهم کرده‌اند

مفاهیم کلیدی


1. Repetitive DNA — DNA تکراری

تعریف ساده:

بخش‌هایی از ژنوم که یک توالی مشابه چندین بار در نقاط مختلف ژنوم تکرار شده است.

توضیح دقیق:

در فرآیند مونتاژ ژنوم، الگوریتم باید مشخص کند که هر Read متعلق به کدام بخش ژنوم است.

اگر یک توالی در چندین نقطه تکرار شده باشد، یک Read کوتاه که فقط شامل آن بخش تکراری است، اطلاعات کافی برای تعیین محل واقعی خود ندارد.

مثلاً اگر در یک ژنوم سه بار کلمه:

LONG LONG LONG

وجود داشته باشد، یک Read کوتاه ممکن است فقط بگوید:

«من یک بخش LONG هستم»

اما نمی‌تواند مشخص کند که متعلق به کدام نسخه از LONG است.

اهمیت:

DNAهای تکراری یکی از اصلی‌ترین دلایل دشواری Assembly هستند.


2. Long Reads — خوانش‌های طولانی

تعریف ساده:

خوانش‌های توالی‌یابی که تعداد بازهای بیشتری را شامل می‌شوند.

توضیح دقیق:

هرچه Read طولانی‌تر باشد، احتمال بیشتری وجود دارد که:

  • بخشی از توالی تکراری را شامل شود.
  • به نواحی غیرتکراری اطراف آن نیز برسد.

این نواحی غیرتکراری مانند «نشانه‌های مکانی» عمل می‌کنند و مشخص می‌کنند که تکرار باید در کدام قسمت ژنوم قرار گیرد.

اهمیت:

Reads طولانی باعث کاهش ابهام در Assembly می‌شوند و می‌توانند تکرارهای طولانی را بهتر حل کنند.


3. Repeat Anchoring — لنگر کردن توالی‌های تکراری

تعریف:

اتصال یک بخش تکراری به توالی‌های منحصربه‌فرد اطراف آن برای تعیین محل صحیح آن.

توضیح:

فرض کنید در ژنوم یک بخش قرمز رنگ سه بار تکرار شده است:

Unique - Repeat - Unique

اگر Read فقط بخش Repeat را پوشش دهد، نمی‌دانیم این Repeat متعلق به کدام مکان است.

اما اگر Read به اندازه‌ای بلند باشد که:

Unique - Repeat - Unique

را کامل پوشش دهد، می‌توانیم جایگاه Repeat را دقیق مشخص کنیم.

اهمیت:

این اصل دلیل اصلی مفید بودن Long Reads در Assembly است.


4. Paired-End Sequencing — توالی‌یابی دو سر

تعریف ساده:

روشی که در آن به جای خواندن DNA فقط از یک انتها، هر دو انتهای یک مولکول DNA خوانده می‌شود.

توضیح دقیق:

در روش معمول:

DNA Template
============>

Read
====>

فقط یک طرف DNA خوانده می‌شود.

در Paired-End:

<====       ====>
Read 1     Read 2

هر دو انتهای مولکول توالی‌یابی می‌شوند.

نتیجه:

  • اطلاعات بیشتری از یک مولکول DNA دریافت می‌کنیم.
  • طول مؤثر اطلاعات تقریباً دو برابر می‌شود.

گاهی بین دو Read یک فاصله ناشناخته وجود دارد:

Read ---- gap ---- Read

که Assembly باید آن را مدیریت کند.

اهمیت:

Paired-End Sequencing یکی از رایج‌ترین روش‌ها برای افزایش اطلاعات هر Template است.


5. Single-Molecule Sequencing — توالی‌یابی تک‌مولکولی

تعریف:

فناوری‌هایی که DNA را به صورت یک مولکول منفرد توالی‌یابی می‌کنند.

توضیح:

برخلاف روش‌های نسل دوم که تعداد زیادی مولکول مشابه را همزمان بررسی می‌کنند، در Single-Molecule Sequencing:

  • هر مولکول DNA به صورت جداگانه خوانده می‌شود.
  • امکان تولید Reads بسیار طولانی وجود دارد.

طول Read در این فناوری‌ها می‌تواند:

  • ده‌ها هزار باز
  • حتی صدها هزار باز

باشد.

اهمیت:

این فناوری‌ها توانایی حل بسیاری از تکرارهای ژنومی را دارند.


6. Sequencing Error — خطای توالی‌یابی

تعریف:

اشتباه دستگاه در تشخیص بازهای DNA.

توضیح:

فناوری‌های Long Read اگرچه Reads بسیار طولانی تولید می‌کنند، اما معمولاً خطای بیشتری دارند.

در برخی فناوری‌ها:

  • حدود 10 تا 15 درصد بازخوانی‌ها ممکن است اشتباه باشند.

بنابراین:

  • الگوریتم‌های Assembly باید انعطاف‌پذیرتر باشند.
  • باید بتوانند با mismatch و gap مقابله کنند.

نکات مهم

  • مشکل اصلی Assembly فقط کمبود داده نیست؛ بلکه ابهام ناشی از تکرارها است.

  • افزایش طول Read باعث می‌شود Repeatها به توالی‌های منحصربه‌فرد اطرافشان متصل شوند.

  • Read کوتاه ممکن است فقط یک Repeat را ببیند و نتواند محل آن را تعیین کند.

  • Read بلند می‌تواند یک Repeat را همراه با Context اطرافش مشاهده کند.

  • الگوریتم‌های Assembly با Reads کوتاه معمولاً در ژنوم‌های تکراری شکست می‌خورند.

  • فناوری‌های جدید Long Read مشکل Repeatها را کاهش داده‌اند، اما معمولاً خطای بیشتری دارند.

  • هیچ فناوری کاملاً بدون مشکل نیست؛ Assembly همیشه یک مصالحه بین:

    • طول Read
    • دقت
    • سرعت
    • هزینه

است.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Repetitive DNA DNA تکراری بخش‌هایی از ژنوم که چندین بار تکرار شده‌اند
Long Read خوانش طولانی Read با تعداد باز زیاد
Short Read خوانش کوتاه Readهای کوتاه حاصل از فناوری‌های قدیمی‌تر
Repeat Anchoring لنگر کردن تکرار اتصال Repeat به توالی‌های منحصربه‌فرد اطراف
Unique Sequence توالی منحصربه‌فرد بخشی از ژنوم که فقط یک بار وجود دارد
Paired-End Sequencing توالی‌یابی دو سر خواندن هر دو انتهای DNA Template
Single-Molecule Sequencing توالی‌یابی تک‌مولکولی خواندن مستقیم یک مولکول DNA
Template Molecule مولکول الگو DNA اولیه‌ای که توالی‌یابی می‌شود
Sequencing Cycle چرخه توالی‌یابی یک مرحله از خواندن بازهای DNA
Nanopore Sequencing توالی‌یابی نانوحفره‌ای روش خواندن DNA با اندازه‌گیری جریان الکتریکی
DNA Polymerase DNA پلی‌مراز آنزیمی که رشته مکمل DNA را می‌سازد
Over-collapse ادغام بیش از حد کاهش مصنوعی تعداد Repeatها در Assembly
Assembly مونتاژ ژنوم بازسازی توالی اصلی ژنوم از Reads

مثال‌ها و تشبیه‌ها

تشبیه پازل

مونتاژ ژنوم شبیه کنار هم گذاشتن یک پازل است.

اگر پازل قسمت‌هایی کاملاً مشابه داشته باشد (مثل آسمان آبی):

  • پیدا کردن محل هر قطعه سخت می‌شود.

اما اگر قطعات بزرگ‌تر باشند:

  • احتمال دارد بخشی از ابر یا ساختمان نیز داخل قطعه باشد.
  • این ویژگی منحصربه‌فرد کمک می‌کند جای درست قطعه پیدا شود.

در ژنوم نیز:

  • Repeatها مانند قطعات آسمان هستند.
  • توالی‌های منحصربه‌فرد مانند ابرها هستند.
  • Reads بلند احتمال بیشتری دارند که هر دو را شامل شوند.

مثال DNA: چرا 8-mer بهتر از 6-mer عمل می‌کند؟

در مثال قبلی:

ژنوم دارای سه نسخه از:

LONG

بود.

با Reads شش‌تایی:

6-mer

الگوریتم نمی‌توانست بفهمد سه نسخه وجود دارد و فقط دو نسخه را بازسازی کرد.

اما با Reads هشت‌تایی:

8-mer

یک Read خاص وجود داشت که هر سه Repeat را پوشش می‌داد.

این Read ثابت می‌کرد که حداقل سه نسخه از Repeat وجود دارد.

بنابراین Assembly درست انجام شد.


خلاصه نهایی مرور سریع

  • مشکل اصلی Assembly در ژنوم‌های بزرگ، وجود DNAهای تکراری است.
  • Reads کوتاه معمولاً نمی‌توانند Repeatها را در جای درست قرار دهند.
  • Reads بلند می‌توانند Repeat را به توالی‌های منحصربه‌فرد اطراف متصل کنند.
  • Long Reads باعث کاهش Over-collapse و ابهام Assembly می‌شوند.
  • Paired-End Sequencing با خواندن دو انتهای DNA اطلاعات بیشتری تولید می‌کند.
  • فناوری‌های Single-Molecule Sequencing قادر به تولید Reads بسیار طولانی هستند.
  • فناوری‌های Long Read معمولاً دقت کمتری نسبت به Short Read دارند.
  • Assembly مدرن نیازمند ایجاد تعادل بین طول Read و خطای توالی‌یابی است.
  • هیچ الگوریتمی بدون داده مناسب نمی‌تواند مشکل Repeatها را کاملاً حل کند.

سوالات مرور

1. چرا DNAهای تکراری باعث دشواری Assembly می‌شوند؟

پاسخ: زیرا Reads کوتاه که فقط بخش تکراری را شامل می‌شوند، نمی‌توانند مشخص کنند این Repeat متعلق به کدام بخش ژنوم است.


2. چگونه Long Reads مشکل Repeatها را کاهش می‌دهند؟

پاسخ: زیرا می‌توانند Repeat را همراه با توالی‌های غیرتکراری اطراف آن بخوانند و جایگاه دقیق Repeat را مشخص کنند.


3. تفاوت اصلی Short Read و Long Read چیست؟

پاسخ: Short Read طول کوتاه و معمولاً دقت بالاتر دارد، در حالی که Long Read اطلاعات طولانی‌تری ارائه می‌دهد اما ممکن است خطای بیشتری داشته باشد.


4. Paired-End Sequencing چگونه اطلاعات بیشتری تولید می‌کند؟

پاسخ: با خواندن هر دو انتهای یک مولکول DNA، اطلاعات بیشتری درباره همان Template فراهم می‌کند.


5. چرا فناوری Single-Molecule Sequencing مهم است؟

پاسخ: زیرا می‌تواند Reads بسیار طولانی تولید کند که بسیاری از Repeatهای پیچیده را قابل حل می‌کند.


6. چرا حتی با Long Reads هنوز Assembly چالش‌برانگیز است؟

پاسخ: زیرا Long Reads معمولاً خطای بیشتری دارند و الگوریتم‌ها باید بتوانند این خطاها را مدیریت کنند.


04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/12_lecture-computer-science-and-life-science

درس 12: علوم کامپیوتر و علوم زیستی

Computer Science and Life Science


خلاصه کلی

در این درس به نقش اساسی Computer Science (علوم کامپیوتر) در پیشرفت Life Science (علوم زیستی) پرداخته می‌شود.

امروزه زیست‌شناسی، به‌خصوص حوزه‌هایی مانند Computational Genomics (ژنومیک محاسباتی)، دیگر فقط یک علم آزمایشگاهی نیست؛ بلکه به شدت به الگوریتم‌ها، ساختارهای داده، محاسبات بزرگ و تحلیل داده وابسته است.

دانشمندان کامپیوتر با توانایی‌های خود در زمینه‌هایی مانند:

  • طراحی الگوریتم‌ها
  • مدیریت داده‌های حجیم
  • تحلیل آماری
  • یادگیری ماشین
  • مدل‌سازی شبکه‌ها

می‌توانند نقش رهبری در تحقیقات زیستی داشته باشند.

هدف این درس:

  • درک ارتباط عمیق بین علوم کامپیوتر و علوم زیستی
  • شناخت مفاهیم مشترک میان دو حوزه
  • فهم اینکه چرا زیست‌شناسی مدرن به متخصصان محاسباتی نیاز دارد

مفاهیم کلیدی


1. Computational Genomics — ژنومیک محاسباتی

تعریف ساده:

شاخه‌ای از زیست‌شناسی که از روش‌های محاسباتی برای تحلیل داده‌های ژنتیکی استفاده می‌کند.

توضیح دقیق:

با پیشرفت فناوری‌های توالی‌یابی DNA، حجم داده‌های زیستی به شدت افزایش یافته است.

برای تحلیل این داده‌ها نیاز به:

  • الگوریتم‌های کارآمد
  • ساختارهای داده مناسب
  • توان پردازشی بالا
  • روش‌های آماری

وجود دارد.

بنابراین فردی که هم زیست‌شناسی و هم علوم کامپیوتر را بداند، می‌تواند مسائل پیچیده زیستی را حل کند.

اهمیت:

بسیاری از پروژه‌های بزرگ ژنتیکی مانند Human Genome Project بدون مشارکت متخصصان کامپیوتر امکان‌پذیر نبودند.


2. Shared Abstractions — انتزاع‌های مشترک بین علوم کامپیوتر و زیست‌شناسی

تعریف:

روش‌های مشابهی که هر دو حوزه برای ساده‌سازی و مدل‌سازی مسائل پیچیده استفاده می‌کنند.

علوم کامپیوتر و زیست‌شناسی، هر دو جهان واقعی را به مدل‌های ریاضی و محاسباتی تبدیل می‌کنند.

سه مدل مهم مشترک عبارت‌اند از:


الف) Strings — رشته‌ها

تعریف:

دنباله‌ای محدود از نمادها.

کاربرد در زیست‌شناسی:

مولکول‌های زیستی مانند:

  • DNA
  • RNA
  • Protein

را می‌توان به صورت رشته‌هایی از حروف نمایش داد.

مثلاً DNA:

A T G C A A T

یک رشته از نمادها است.

ارتباط با علوم کامپیوتر:

مسائل مربوط به رشته‌ها مانند:

  • جستجوی الگو
  • مقایسه رشته‌ها
  • یافتن شباهت‌ها

دهه‌هاست که در علوم کامپیوتر مطالعه شده‌اند.


ب) Trees — درخت‌ها

تعریف:

ساختارهایی برای نمایش روابط سلسله‌مراتبی.

کاربرد در زیست‌شناسی:

مثال‌ها:

Tree of Life — درخت زندگی

روابط تکاملی بین گونه‌ها را نشان می‌دهد.

Pedigree — شجره‌نامه ژنتیکی

نحوه انتقال صفات ژنتیکی در نسل‌ها را نمایش می‌دهد.

ارتباط با علوم کامپیوتر:

درخت‌ها یکی از مهم‌ترین ساختارهای داده هستند و برای:

  • سازمان‌دهی داده‌ها
  • جستجو
  • نمایش مسیرهای حل مسئله

استفاده می‌شوند.


ج) Graphs / Networks — گراف‌ها / شبکه‌ها

تعریف:

مدل‌هایی شامل:

  • Node (گره)
  • Edge (یال)

برای نمایش ارتباطات.

کاربرد در زیست‌شناسی:

مثلاً:

Protein Interaction Networks

شبکه‌ای که نشان می‌دهد پروتئین‌ها چگونه با یکدیگر تعامل دارند.

با بررسی بخش‌هایی از این شبکه می‌توان فهمید:

  • کدام پروتئین‌ها همکاری می‌کنند.
  • چگونه عملکردهای سلولی ایجاد می‌شوند.

ارتباط با علوم کامپیوتر:

گراف‌ها برای مدل‌سازی مواردی مانند:

  • شبکه‌های اجتماعی
  • ارتباط صفحات وب
  • مسیرهای محاسباتی

استفاده می‌شوند.


3. High-Throughput Data — داده‌های با توان عملیاتی بالا

تعریف:

داده‌هایی که توسط فناوری‌های مدرن با سرعت و حجم بسیار زیاد تولید می‌شوند.

توضیح:

ابزارهای زیستی جدید مانند:

DNA Sequencer

می‌توانند میلیون‌ها یا میلیاردها قطعه DNA تولید کنند.

این حجم داده بسیار بیشتر از توان تحلیل دستی انسان است.

بنابراین نیاز به:

  • پردازش موازی
  • محاسبات ابری
  • الگوریتم‌های مقیاس‌پذیر

وجود دارد.


4. Sequence Read Archive (SRA) — آرشیو داده‌های توالی‌یابی

تعریف:

یک پایگاه داده بزرگ برای ذخیره داده‌های حاصل از توالی‌یابی DNA.

توضیح:

می‌توان آن را مانند:

«وب جهانی برای داده‌های DNA»

در نظر گرفت.

حجم این پایگاه داده با سرعت بسیار زیادی افزایش یافته است.

مثلاً در سال 2014:

  • حجم آن در حدود 10 ماه از 2 پتابایت به 3 پتابایت افزایش یافت.

اهمیت:

برای تحلیل این حجم داده، زیست‌شناسان نیازمند متخصصان محاسباتی هستند.


5. Data Science in Biology — علم داده در زیست‌شناسی

تعریف:

استفاده از روش‌های آماری و محاسباتی برای استخراج دانش از داده‌های زیستی.

چرا مهم است؟

داده‌های زیستی معمولاً:

  • دارای خطا هستند.
  • ناقص هستند.
  • دارای سوگیری (Bias) هستند.
  • ابهام دارند.

بنابراین تحلیل ساده کافی نیست.

نیاز به مهارت‌هایی مانند:

  • Machine Learning
  • Statistics
  • Applied Mathematics

وجود دارد.


نکات مهم

  • زیست‌شناسی مدرن بدون محاسبات دیگر قابل تصور نیست.

  • DNA، RNA و Protein را می‌توان به صورت String مدل کرد.

  • روابط تکاملی و ژنتیکی با Treeها نمایش داده می‌شوند.

  • تعاملات مولکولی با Graphها مدل‌سازی می‌شوند.

  • افزایش حجم داده‌های زیستی باعث ایجاد نیاز شدید به متخصصان کامپیوتر شده است.

  • داده‌های High-Throughput همیشه دارای خطا و عدم قطعیت هستند.

  • متخصص موفق در ژنومیک محاسباتی باید ترکیبی از مهارت‌های:

    • زیست‌شناسی
    • برنامه‌نویسی
    • الگوریتم
    • آمار

را داشته باشد.


اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Computational Genomics ژنومیک محاسباتی استفاده از روش‌های محاسباتی برای تحلیل داده‌های ژنومی
Computer Science علوم کامپیوتر مطالعه الگوریتم‌ها، داده‌ها و محاسبات
Life Science علوم زیستی مطالعه موجودات زنده و فرآیندهای زیستی
Algorithm الگوریتم مجموعه‌ای از مراحل برای حل یک مسئله
Data Structure ساختار داده روش سازمان‌دهی و ذخیره داده‌ها
String رشته دنباله‌ای از نمادها مانند توالی DNA
Tree درخت ساختار داده یا مدل روابط سلسله‌مراتبی
Graph گراف مدل شبکه‌ای شامل گره‌ها و یال‌ها
Network شبکه مجموعه‌ای از ارتباطات بین عناصر
High-Throughput Data داده با توان عملیاتی بالا داده‌هایی که در حجم بسیار زیاد تولید می‌شوند
DNA Sequencer دستگاه توالی‌یاب DNA فناوری تولید داده‌های DNA
Sequence Read Archive (SRA) آرشیو داده‌های توالی‌یابی مخزن داده‌های توالی DNA
Machine Learning یادگیری ماشین روش‌های یادگیری الگوها از داده‌ها
Statistics آمار علم تحلیل داده و عدم قطعیت
Bias سوگیری انحراف سیستماتیک در داده‌ها

مثال‌ها و تشبیه‌ها

1. DNA به عنوان String

در علوم کامپیوتر، یک String مانند:

HELLO

است.

در ژنتیک، DNA نیز مشابه است:

ATGCCAT

بنابراین بسیاری از الگوریتم‌های رشته‌ای می‌توانند برای مسائل ژنتیکی استفاده شوند.


2. SRA مانند اینترنت داده‌های DNA

همان‌طور که اینترنت حجم عظیمی از اطلاعات را ذخیره می‌کند، Sequence Read Archive نیز حجم عظیمی از داده‌های توالی‌یابی را ذخیره می‌کند.

اما برای استفاده از این داده‌ها، نیاز به ابزارهای محاسباتی داریم.


خلاصه نهایی مرور سریع

  • علوم کامپیوتر نقش مهمی در زیست‌شناسی مدرن دارد.
  • ژنومیک محاسباتی ترکیبی از زیست‌شناسی و الگوریتم‌ها است.
  • DNA و پروتئین‌ها را می‌توان به صورت String مدل کرد.
  • روابط تکاملی و ژنتیکی با Treeها نمایش داده می‌شوند.
  • شبکه‌های پروتئینی نمونه‌ای از کاربرد Graphها در زیست‌شناسی هستند.
  • فناوری‌های High-Throughput حجم عظیمی از داده تولید می‌کنند.
  • تحلیل داده‌های زیستی نیازمند مهارت‌های Data Science است.
  • خطا، ابهام و سوگیری بخش جدایی‌ناپذیر داده‌های زیستی هستند.
  • دانشمندان کامپیوتر می‌توانند نقش کلیدی در تحقیقات زیستی داشته باشند.

سوالات مرور

1. چرا علوم کامپیوتر برای زیست‌شناسی مدرن ضروری شده است؟

پاسخ: زیرا فناوری‌های جدید زیستی حجم بسیار زیادی داده تولید می‌کنند که بدون الگوریتم‌ها و روش‌های محاسباتی قابل تحلیل نیستند.


2. چگونه DNA را می‌توان به یک مسئله علوم کامپیوتر تبدیل کرد؟

پاسخ: با نمایش DNA به صورت یک String، می‌توان از الگوریتم‌های مربوط به رشته‌ها برای تحلیل آن استفاده کرد.


3. سه مدل مشترک بین علوم کامپیوتر و زیست‌شناسی چیست؟

پاسخ: Stringها، Treeها و Graphها.


4. چرا داده‌های High-Throughput چالش‌برانگیز هستند؟

پاسخ: زیرا حجم آن‌ها بسیار زیاد است و علاوه بر آن دارای خطا، عدم قطعیت و سوگیری هستند.


5. چرا یک متخصص علوم کامپیوتر می‌تواند در علوم زیستی موفق باشد؟

پاسخ: زیرا مهارت‌های او در الگوریتم، پردازش داده و مدل‌سازی دقیقاً برای حل مسائل پیچیده زیستی مورد نیاز است.


04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/13_lecture-thank-yous

عنوان درس:

پایان دوره و اهمیت بازخورد در بهبود آموزش


خلاصه کلی

این بخش پایانی دوره به جمع‌بندی رسمی کلاس و تشکر از افراد و دانشجویانی اختصاص دارد که در ایجاد و توسعه دوره مشارکت داشته‌اند.

هدف یادگیری این بخش

  • درک اهمیت بازخورد دانشجویان در بهبود دوره‌های آموزشی آنلاین
  • آشنایی با نقش همکاری تیمی در تولید محتوای علمی
  • قدردانی از مشارکت جامعه یادگیرندگان در شکل‌گیری یک دوره آموزشی

مفاهیم کلیدی

1. Course Feedback (بازخورد دوره)

تعریف ساده

بازخورد دوره، نظرات و پیشنهادهایی است که دانشجویان درباره محتوای آموزشی، ساختار درس، روش تدریس و تجربه یادگیری ارائه می‌کنند.

توضیح دقیق

در دوره‌های آموزشی جدید، به‌خصوص دوره‌های آنلاین، بازخورد دانشجویان نقش مهمی در اصلاح و توسعه محتوا دارد. یک دوره آموزشی با دریافت نظرات کاربران می‌تواند:

  • نقاط ضعف خود را شناسایی کند.
  • مطالب دشوار را بهتر توضیح دهد.
  • ساختار آموزشی را بهبود دهد.
  • تجربه یادگیری دانشجویان آینده را ارتقا دهد.

اهمیت

از آنجا که این دوره یک دوره جدید بود، بازخورد دانشجویان برای شکل دادن به نسخه‌های آینده آن اهمیت ویژه‌ای داشت.


2. Collaborative Course Development (توسعه مشارکتی دوره)

تعریف ساده

فرآیندی که در آن افراد مختلف با تخصص‌ها و نقش‌های متفاوت برای ایجاد یک محصول آموزشی همکاری می‌کنند.

توضیح دقیق

ساخت یک دوره دانشگاهی آنلاین تنها نتیجه کار یک مدرس نیست، بلکه نیازمند همکاری افراد مختلف مانند:

  • مدرس اصلی
  • تیم تولید محتوا
  • متخصصان آموزشی
  • همکاران فنی
  • جامعه دانشجویان

است.

اهمیت

همکاری تیمی باعث می‌شود محتوای آموزشی کیفیت بالاتری داشته باشد و بتواند به تعداد زیادی از یادگیرندگان در سراسر جهان ارائه شود.


نکات مهم

  • یک دوره آموزشی موفق، محصول همکاری افراد مختلف است، نه فقط تلاش یک مدرس.
  • بازخورد دانشجویان یکی از مهم‌ترین ابزارهای بهبود آموزش آنلاین است.
  • مشارکت دانشجویان در انجمن‌ها و بحث‌های دوره، بخشی از فرآیند یادگیری و توسعه دوره محسوب می‌شود.
  • دوره‌های علمی جدید برای رشد و تکامل به تعامل مداوم با جامعه یادگیرندگان نیاز دارند.

اصطلاحات تخصصی

اصطلاح انگلیسی ترجمه فارسی توضیح
Feedback بازخورد نظرات و پیشنهادهای کاربران برای بهبود یک محصول یا فرآیند
Course Improvement بهبود دوره اصلاح و ارتقای محتوای آموزشی بر اساس تجربه کاربران
Online Learning Community جامعه یادگیری آنلاین گروهی از دانشجویان که برای یادگیری و تبادل نظر در فضای آنلاین تعامل دارند
Collaboration همکاری مشارکت چند فرد یا گروه برای رسیدن به یک هدف مشترک
Educational Content محتوای آموزشی مطالب، ویدیوها، تمرین‌ها و منابع مورد استفاده برای آموزش

مثال‌ها و تشبیه‌ها

دوره آموزشی به‌عنوان یک پروژه زنده

یک دوره آموزشی را می‌توان مانند یک نرم‌افزار در نظر گرفت که پس از انتشار همچنان نیاز به اصلاح و به‌روزرسانی دارد.

همان‌طور که توسعه‌دهندگان نرم‌افزار از گزارش کاربران برای رفع مشکلات استفاده می‌کنند، مدرسان نیز از بازخورد دانشجویان برای بهتر کردن دوره استفاده می‌کنند.


خلاصه نهایی مرور سریع

  • بازخورد دانشجویان نقش مهمی در توسعه و بهبود دوره‌های آموزشی دارد.
  • دوره‌های آنلاین جدید معمولاً با دریافت نظرات کاربران تکامل پیدا می‌کنند.
  • تولید یک دوره علمی نیازمند همکاری افراد با تخصص‌های مختلف است.
  • جامعه دانشجویان و مشارکت آن‌ها بخشی از موفقیت یک دوره آموزشی محسوب می‌شود.
  • آموزش علمی مدرن یک فرآیند تعاملی و پیوسته است.
  • کیفیت یک دوره تنها به محتوای اولیه آن محدود نیست، بلکه به بهبودهای بعدی نیز وابسته است.

سوالات مرور

سوال 1: چرا بازخورد دانشجویان برای یک دوره جدید اهمیت زیادی دارد؟

پاسخ: زیرا به تیم آموزشی کمک می‌کند مشکلات، نقاط ضعف و بخش‌های نیازمند اصلاح را شناسایی کرده و دوره را برای دانشجویان آینده بهتر کند.


سوال 2: آیا ایجاد یک دوره آموزشی فقط به مدرس وابسته است؟

پاسخ: خیر. تولید یک دوره موفق نیازمند همکاری مدرس، تیم تولید محتوا، متخصصان آموزشی و جامعه دانشجویان است.


سوال 3: چگونه دانشجویان می‌توانند در بهبود یک دوره آموزشی مشارکت کنند؟

پاسخ: با ارائه بازخورد، شرکت در بحث‌های انجمن دوره، گزارش مشکلات و پیشنهاد راهکارهای بهتر برای آموزش.


سوال 4: چرا دوره‌های آنلاین به تعامل با دانشجویان نیاز دارند؟

پاسخ: زیرا تجربه واقعی یادگیرندگان اطلاعات ارزشمندی درباره کیفیت محتوا و روش تدریس فراهم می‌کند و امکان بهبود مستمر دوره را ایجاد می‌کند.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment