01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/01_module-1-introduction
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 برای پیدا کردن الگوها در رشتهها
DNA Sequencing فرآیندی است که ترتیب بازهای نوکلئوتیدی DNA را مشخص میکند.
DNA از چهار نوع باز تشکیل شده است:
- A → Adenine (آدنین)
- T → Thymine (تیمین)
- C → Cytosine (سیتوزین)
- G → Guanine (گوانین)
فناوریهای توالییابی تلاش میکنند ترتیب این حروف را در DNA مشخص کنند.
برای مثال:
ATCGGTAAC
یک نمایش رشتهای از بخشی از DNA است.
توالییابی DNA پایه بسیاری از کاربردهای زیستی است، از جمله:
- مطالعه ژنوم انسان
- تشخیص بیماریهای ژنتیکی
- بررسی جهشها (Mutations)
- تحقیقات تکاملی
ژنوم مجموعه کامل اطلاعات ژنتیکی یک موجود زنده است.
ژنوم شامل تمام DNA موجود در یک سلول است. از آنجا که DNA را میتوان به صورت دنبالهای از حروف نمایش داد، یک ژنوم را میتوان مانند یک متن بسیار طولانی در نظر گرفت.
مثلاً:
ACGTACGTTAGCA...
یک رشته بسیار بزرگ از حروف DNA است.
نمایش ژنوم به شکل رشته باعث میشود بتوانیم از ابزارهای علوم کامپیوتر برای تحلیل آن استفاده کنیم.
یک رشته (String) مجموعهای از کاراکترها در یک ترتیب مشخص است.
در علوم کامپیوتر، متنها، فایلها و صفحات وب به صورت رشته ذخیره میشوند.
مثلاً:
"hello world"
یک رشته متنی است.
DNA نیز میتواند مانند یک رشته در نظر گرفته شود:
"ATGCGTAC"
بنابراین:
- DNA → رشتهای از A,T,C,G
- کتاب → رشتهای از حروف الفبا
- فایل → رشتهای از دادهها
همه میتوانند با الگوریتمهای مشابه پردازش شوند.
این مفهوم، پایه اصلی کل دوره است؛ زیرا اجازه میدهد الگوریتمهای پردازش متن را برای دادههای ژنتیکی استفاده کنیم.
در این دوره دو مسئله اصلی بررسی میشوند:
پیدا کردن محل قرارگیری قطعات کوتاه DNA خواندهشده در ژنوم مرجع.
دستگاههای توالییابی معمولاً کل ژنوم را یکباره نمیخوانند، بلکه قطعات کوتاهی به نام Reads تولید میکنند.
هدف این است که مشخص کنیم هر Read در کدام قسمت ژنوم قرار دارد.
- تشخیص تغییرات ژنتیکی
- مقایسه ژنوم افراد
- شناسایی جهشها
بازسازی یک ژنوم کامل از روی قطعات کوتاه DNA.
در بسیاری از روشهای توالییابی، اطلاعات به شکل قطعات کوچک دریافت میشود. مسئله Assembly این است که این قطعات را دوباره کنار هم قرار دهیم تا ژنوم کامل ساخته شود.
مانند:
قطعات:
ATGC
TGCA
GCAT
بازسازی:
ATGCAT
- ساخت ژنوم موجودات جدید
- مطالعه گونههای ناشناخته
- تحقیقات زیستی
روشهای محاسباتی برای ذخیره، جستجو و پردازش اطلاعات.
چون DNA مانند رشته نمایش داده میشود، میتوان از الگوریتمهایی که برای رشتههای معمولی ساخته شدهاند استفاده کرد.
مثال:
الگوریتمهایی که برای:
- جستجوی کلمات در کتاب
- پیدا کردن فایلها
- تحلیل صفحات وب
ساخته شدهاند، میتوانند برای پیدا کردن الگوها در DNA نیز استفاده شوند.
این ارتباط بین علوم کامپیوتر و ژنتیک، اساس Bioinformatics (بیوانفورماتیک) است.
یک الگوریتم ابتدایی برای پیدا کردن یک الگو (Pattern) در یک متن (Text).
الگوریتم الگو را از ابتدای متن شروع کرده و هر موقعیت را بررسی میکند.
مثال:
متن:
ACGTACGT
الگو:
TAC
الگوریتم تمام موقعیتها را بررسی میکند تا تطابق کامل پیدا کند.
مزایا:
- ساده
- قابل فهم
- انعطافپذیر
معایب:
- سرعت پایین برای دادههای بسیار بزرگ
این الگوریتم نقطه شروع برای یادگیری روشهای سریعتر تطبیق رشتهها است.
-
DNA را میتوان مانند یک رشته متنی (String) نمایش داد.
-
این نمایش باعث میشود الگوریتمهای علوم کامپیوتر روی دادههای ژنتیکی قابل استفاده باشند.
-
کل دوره بر دو مسئله اصلی تمرکز دارد:
- Read Alignment
- 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 از چهار حرف A,T,C,G ساخته شده است.
همانطور که میتوان در یک کتاب دنبال یک کلمه خاص گشت، میتوان در DNA نیز دنبال یک الگوی خاص گشت.
فرض کنید یک کتاب بزرگ را خرد کردهایم و فقط صفحات یا تکههایی از آن را داریم.
وظیفه ما این است که:
- قطعات را بررسی کنیم.
- بخشهای مشترک را پیدا کنیم.
- کتاب اصلی را بازسازی کنیم.
این همان کاری است که در Genome Assembly انجام میشود.
-
DNA را میتوان به صورت یک رشته از چهار کاراکتر A,T,C,G نمایش داد.
-
تبدیل DNA به String امکان استفاده از الگوریتمهای علوم کامپیوتر را فراهم میکند.
-
بیوانفورماتیک از ترکیب زیستشناسی و علوم کامپیوتر ایجاد شده است.
-
توالییابی DNA اطلاعات مربوط به ترتیب بازهای DNA را تولید میکند.
-
دو مسئله اصلی این دوره:
- Read Alignment
- Genome Assembly
-
Read Alignment محل قطعات DNA را در ژنوم پیدا میکند.
-
Genome Assembly ژنوم کامل را از قطعات کوچک بازسازی میکند.
-
الگوریتمها و ساختارهای داده نقش اصلی در تحلیل دادههای ژنومی دارند.
-
Naive Exact Matching سادهترین روش برای یافتن الگو در رشتهها است.
-
روشهای سریعتر و پیشرفتهتر در ماژولهای بعدی بررسی خواهند شد.
چرا نمایش DNA به صورت String اهمیت زیادی دارد؟
پاسخ: زیرا اجازه میدهد الگوریتمهای موجود در علوم کامپیوتر که برای پردازش رشتهها طراحی شدهاند، برای تحلیل دادههای ژنتیکی نیز استفاده شوند.
Genome Assembly چیست؟
پاسخ: فرآیندی است که در آن قطعات کوتاه DNA حاصل از توالییابی کنار هم قرار داده میشوند تا ژنوم کامل بازسازی شود.
اگر یک دستگاه توالییابی میلیونها قطعه کوتاه DNA تولید کند، کدام مسئله محاسباتی باید حل شود؟
پاسخ: باید مسئله Genome Assembly یا Read Alignment حل شود، بسته به اینکه هدف بازسازی ژنوم یا پیدا کردن محل قطعات در ژنوم مرجع باشد.
چرا الگوریتم Naive Exact Matching برای دادههای بزرگ مناسب نیست؟
پاسخ: زیرا تمام موقعیتهای ممکن را بررسی میکند و برای رشتههای بسیار بزرگ سرعت پایینی دارد.
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
این درس به بررسی ارتباط میان علوم کامپیوتر (Computer Science) و علوم زیستی (Life Science)، بهخصوص در زمینه تحلیل دادههای توالییابی DNA (DNA Sequencing) میپردازد.
امروزه فناوری توالییابی DNA بسیار ارزانتر، سریعتر و دقیقتر شده است و حجم عظیمی از دادههای ژنتیکی تولید میکند. این دادهها در بسیاری از حوزهها مانند پزشکی، تکامل، مطالعه میکروبیوم و تحقیقات پایه زیستشناسی استفاده میشوند.
برای تحلیل این حجم عظیم از دادهها، به الگوریتمها و روشهای محاسباتی نیاز داریم. مطالعه ژنومیک محاسباتی (Computational Genomics) کمک میکند:
- بفهمیم الگوریتمهای موجود چه تواناییهایی دارند.
- محدودیتها و نقاط شکست آنها را بشناسیم.
- روشهای بهتر و سریعتر برای تحلیل دادههای ژنتیکی طراحی کنیم.
فرآیندی برای تعیین ترتیب بازهای DNA و تبدیل اطلاعات ژنتیکی به دادههای قابل تحلیل.
فناوریهای جدید توالییابی قادر هستند مقدار بسیار زیادی داده ژنتیکی را با سرعت بالا تولید کنند.
کاهش هزینه و افزایش کیفیت توالییابی باعث شده است که این فناوری به یک ابزار عمومی در علوم زیستی تبدیل شود.
دانشمندان با بررسی ژنوم کودکان مبتلا به بیماریهای نادر میتوانند تغییرات ژنتیکی مرتبط با بیماری را پیدا کنند.
با توالییابی DNA انسانهای باستانی میتوان درباره:
- منشأ انسان
- مسیرهای مهاجرت جمعیتها
- تغییرات تکاملی
اطلاعات به دست آورد.
توالییابی ژنوم تومورها کمک میکند:
- ویژگیهای ژنتیکی سرطان مشخص شود.
- درمان مناسبتر برای هر بیمار انتخاب شود.
بدن انسان، مخصوصاً روده، میزبان تعداد بسیار زیادی میکروب است.
توالییابی به دانشمندان کمک میکند نقش این میکروبها را در مواردی مانند:
- هضم غذا
- سلامت بدن
- بیماریها
بررسی کنند.
توالییابی برای پاسخ به پرسشهای بنیادی نیز استفاده میشود:
- ژنوم چگونه کار میکند؟
- بخشهای مختلف DNA چه نقشی دارند؟
- تمام DNA موجود در سلول چه کاری انجام میدهد؟
حوزهای میان علوم کامپیوتر و زیستشناسی که از الگوریتمها و روشهای محاسباتی برای تحلیل دادههای ژنومی استفاده میکند.
دادههای توالییابی DNA بسیار بزرگ هستند و روشهای دستی برای تحلیل آنها امکانپذیر نیست.
بنابراین نیاز داریم از:
- الگوریتمها (Algorithms)
- ساختارهای داده (Data Structures)
- روشهای پردازش داده
برای استخراج اطلاعات از ژنوم استفاده کنیم.
مطالعه الگوریتمهای ژنومیک به ما کمک میکند بدانیم:
- چه مسئلهای قابل حل است.
- چه روشی در عمل کارایی دارد.
- چه محدودیتهایی وجود دارد.
دانستن الگوریتمها به ما نشان میدهد یک روش محاسباتی چه کاری میتواند انجام دهد و در چه شرایطی شکست میخورد.
یک مثال تاریخی، پروژه تعیین توالی ژنوم انسان است.
در اواخر دهه ۱۹۹۰ دو گروه علمی به صورت همزمان تلاش کردند ژنوم انسان را تعیین توالی کنند.
یکی از اختلافهای اصلی آنها مربوط به یک مسئله محاسباتی مهم بود:
de novo shotgun assembly problem
یک گروه معتقد بود این مسئله در عمل قابل حل نیست.
گروه دیگر معتقد بود:
- مسئله سخت است،
- اما با استفاده از کامپیوترهای قدرتمند میتوان آن را حل کرد.
در نهایت دیدگاه گروه دوم درست بود و حل موفقیتآمیز این مسئله محاسباتی باعث شد آنها بتوانند سریعتر به هدف خود یعنی مونتاژ ژنوم انسان برسند.
درک الگوریتمها مشخص میکند:
- چه چیزی امکانپذیر است.
- چه چیزی عملی است.
- چه منابع محاسباتی مورد نیاز است.
بازسازی یک ژنوم کامل بدون داشتن ژنوم مرجع، با استفاده از قطعات کوتاه DNA.
در روش Shotgun Sequencing، ژنوم ابتدا به قطعات کوچک تقسیم میشود.
سپس:
- قطعات توالییابی میشوند.
- الگوریتمها ارتباط بین قطعات را پیدا میکنند.
- ژنوم کامل بازسازی میشود.
این کار از نظر محاسباتی بسیار پیچیده است.
حل این مسئله یکی از عوامل کلیدی موفقیت در پروژه ژنوم انسان بود.
تلاش علمی برای طراحی روشهای بهتر جهت تحلیل دادههای ژنتیکی.
ژنومیک محاسباتی یک حوزه فعال تحقیقاتی است که در:
- دانشگاهها
- شرکتهای فناوری
- آزمایشگاههای تحقیقاتی
در سراسر جهان دنبال میشود.
هدف اصلی:
- تحلیل سریعتر دادههای بزرگ DNA
- توسعه روشهای دقیقتر
- حل مسائل پیچیدهتر ژنومی
است.
الگوریتمها و ساختارهای دادهای که در ژنومیک استفاده میشوند، محدود به زیستشناسی نیستند.
همین روشها در حوزههایی مانند:
- 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 به دلیل کاهش هزینه و افزایش سرعت، به ابزاری اصلی در علوم زیستی تبدیل شده است.
- دادههای ژنومی در پزشکی، تکامل، سرطان و مطالعه میکروبها کاربرد دارند.
- ژنومیک محاسباتی ترکیب علوم کامپیوتر و زیستشناسی برای تحلیل دادههای ژنتیکی است.
- الگوریتمها مشخص میکنند چه مسائل ژنومی قابل حل و عملی هستند.
- پروژه ژنوم انسان نشان داد حل مسائل محاسباتی میتواند عامل موفقیت تحقیقات زیستی باشد.
- De novo shotgun assembly یکی از مسائل مهم محاسباتی در مونتاژ ژنوم است.
- پژوهش در الگوریتمهای ژنومی همچنان یک حوزه فعال جهانی است.
- متخصصان علوم کامپیوتر نقش مهمی در پروژههای ژنومیک دارند.
- الگوریتمهای ژنومیک در خارج از زیستشناسی نیز کاربرد دارند.
- تحلیل DNA شباهت زیادی به پردازش متنهای بسیار بزرگ دارد.
چرا توالییابی DNA امروزه اهمیت زیادی پیدا کرده است؟
پاسخ: زیرا فناوری توالییابی ارزانتر، سریعتر و دقیقتر شده و امکان تولید حجم عظیمی از دادههای ژنتیکی را فراهم کرده است.
Computational Genomics چیست؟
پاسخ: حوزهای است که از الگوریتمها و روشهای محاسباتی برای تحلیل دادههای ژنومی استفاده میکند.
چگونه توالییابی DNA میتواند به درمان سرطان کمک کند؟
پاسخ: با بررسی ژنوم تومور، تغییرات ژنتیکی سرطان مشخص میشود و میتوان درمان مناسبتری برای بیمار انتخاب کرد.
چرا شناخت الگوریتمها برای دانشمندان ژنومیک مهم است؟
پاسخ: زیرا کمک میکند بدانند یک روش چه تواناییها و محدودیتهایی دارد و آیا برای حل یک مسئله واقعی مناسب است یا خیر.
De novo shotgun assembly problem چیست؟
پاسخ: مسئله بازسازی یک ژنوم کامل از قطعات کوتاه DNA بدون استفاده از یک ژنوم مرجع است.
چرا الگوریتمهای ژنومیک میتوانند در پردازش زبان طبیعی نیز کاربرد داشته باشند؟
پاسخ: زیرا 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) یکی از مهمترین ابزارهای زیستشناسی مدرن است که امکان خواندن اطلاعات ژنتیکی موجود در 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 بهصورت همزمان، باعث کاهش شدید هزینه، افزایش سرعت و گسترش استفاده از توالییابی در علوم زیستی و پزشکی شدند.
اولین روش عملی و گسترده برای تعیین ترتیب بازهای DNA که توسط Fred Sanger و همکارانش در دهه ۱۹۷۰ توسعه یافت.
روش Chain Termination اساس تکنیک Sanger Sequencing است.
ایده اصلی این روش:
- DNA در حال تکثیر قرار میگیرد.
- در فرآیند ساخت رشته جدید، گاهی نوکلئوتیدهای خاصی وارد میشوند که باعث توقف ادامه زنجیره DNA میشوند.
- با بررسی طول قطعات ایجادشده، ترتیب بازهای DNA مشخص میشود.
در ابتدا این روش:
- نیازمند دخالت دستی انسان بود.
- زمانبر و پرهزینه بود.
اما در طول سالها:
- فرآیندها خودکار شدند.
- دستگاههای تجاری توالییابی ساخته شدند.
- سرعت و دقت افزایش یافت.
Sanger Sequencing:
- پایه اصلی توالییابی مدرن شد.
- روش غالب در پروژه ژنوم انسان بود.
- باعث شد Fred Sanger جایزه نوبل شیمی دریافت کند.
نامی برای فناوریهای اولیه توالییابی DNA که مهمترین نمونه آن Sanger Sequencing است.
در پروژه Human Genome Project از صدها دستگاه توالییابی نسل اول استفاده شد.
این فناوری امکان تعیین توالی ژنوم انسان را فراهم کرد، اما محدودیتهایی داشت:
- سرعت پایینتر
- هزینه بالا
- ظرفیت محدود تولید داده
اگرچه نسل اول محدودیت داشت، اما پایهای برای توسعه فناوریهای سریعتر بعدی شد.
یک پروژه علمی بزرگ برای تعیین توالی کامل ژنوم انسان.
پروژه ژنوم انسان یکی از بزرگترین پروژههای زیستی تاریخ بود.
فناوری توالییابی نقش اساسی در موفقیت آن داشت.
همچنین رقابت میان دو گروه تحقیقاتی برای تکمیل سریعتر ژنوم انسان، تا حد زیادی به تفاوت در روشهای محاسباتی و فناوری توالییابی مرتبط بود.
این پروژه نشان داد که:
- فناوری توالییابی میتواند پروژههای عظیم زیستی را ممکن کند.
- توسعه روشهای محاسباتی برای تحلیل دادههای ژنتیکی ضروری است.
نسل جدید فناوریهای توالییابی که امکان خواندن تعداد بسیار زیادی مولکول DNA بهصورت همزمان را فراهم میکنند.
حدود سال ۲۰۰۷، فناوری جدیدی وارد آزمایشگاههای زیستی شد که تحول بزرگی در توالییابی ایجاد کرد.
این فناوری به دلیل توانایی انجام:
Massively Parallel Sequencing
شناخته میشود.
یعنی:
به جای خواندن تعداد محدودی DNA در هر بار، میلیونها یا حتی میلیاردها مولکول DNA میتوانند همزمان توالییابی شوند.
NGS باعث شد:
- هزینه توالییابی کاهش چشمگیری پیدا کند.
- سرعت تولید داده افزایش یابد.
- مطالعات ژنومی در مقیاس بسیار بزرگ امکانپذیر شود.
روشی که در آن تعداد بسیار زیادی مولکول DNA به طور همزمان توالییابی میشوند.
دلیل اصلی ارزان شدن توالییابی در نسل جدید، امکان انجام تعداد بسیار زیادی واکنش توالییابی در یک زمان است.
در روشهای قدیمی:
- یک یا چند توالی محدود بررسی میشد.
در روشهای جدید:
- میلیونها تا میلیاردها قطعه DNA همزمان بررسی میشوند.
این قابلیت باعث تولید حجم عظیمی از دادههای ژنومی شده است.
پس از پروژه ژنوم انسان، هزینه توالییابی DNA به شدت کاهش یافت.
در نمودارهای مربوط به هزینه توالییابی:
- محور افقی: سالهای پس از ۲۰۰۱
- محور عمودی: هزینه تعیین توالی یک ژنوم انسانی
هزینه به صورت Logarithmic Scale (مقیاس لگاریتمی) نمایش داده میشود.
در این مقیاس، هر فاصله نشاندهنده افزایش یا کاهش دهبرابری است.
حدود سال ۲۰۰۷ کاهش چشمگیر هزینه مشاهده میشود که همزمان با ظهور فناوریهای نسل جدید است.
افزایش بسیار زیاد حجم دادههای تولیدشده توسط دستگاههای توالییابی.
نسل جدید دستگاههای توالییابی در سراسر جهان مستقر شدهاند و سالانه حجم عظیمی از داده تولید میکنند.
این دادهها در مقیاس:
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 را همزمان بررسی میکند.
- کاهش هزینه تنها یکی از مزایای نسل جدید توالییابی است.
- سرعت، دقت و سهولت استفاده نیز بهبود یافتند.
- دستگاههای توالییابی مدرن هزاران نمونه داده ژنتیکی تولید میکنند.
- حجم دادههای ژنومی امروزه به مقیاس پتابایت رسیده است.
- تحلیل این دادهها نیازمند الگوریتمها و ژنومیک محاسباتی است.
Sanger Sequencing چیست؟
پاسخ: یک روش نسل اول توالییابی DNA است که بر اساس روش Chain Termination برای تعیین ترتیب بازهای DNA طراحی شده است.
چرا فناوری NGS باعث کاهش شدید هزینه توالییابی شد؟
پاسخ: زیرا امکان توالییابی میلیونها یا میلیاردها مولکول DNA را به صورت موازی فراهم کرد و هزینه هر توالی کاهش یافت.
اگر بخواهیم ژنوم هزاران فرد را بررسی کنیم، چرا NGS مناسبتر از Sanger Sequencing است؟
پاسخ: زیرا NGS سرعت و ظرفیت بسیار بالاتری دارد و میتواند حجم عظیمی از داده را در زمان کوتاه تولید کند.
چه رابطهای بین افزایش توانایی توالییابی و نیاز به علوم کامپیوتر وجود دارد؟
پاسخ: هرچه دستگاههای توالییابی داده بیشتری تولید کنند، نیاز به الگوریتمها و روشهای محاسباتی برای ذخیره، پردازش و تحلیل این دادهها بیشتر میشود.
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 است:
ژنوم (Genome) را میتوان مانند یک رشته (String) بسیار طولانی از کاراکترها نمایش داد.
از آنجا که DNA از چهار نوع باز تشکیل شده است، میتوان اطلاعات ژنتیکی را به صورت دنبالهای از چهار حرف:
- A
- C
- G
- T
نمایش داد.
این دیدگاه اهمیت بسیار زیادی دارد، زیرا اجازه میدهد روشها و الگوریتمهای علوم کامپیوتر که برای پردازش رشتهها طراحی شدهاند، برای تحلیل دادههای ژنومی نیز استفاده شوند.
در ادامه توضیح داده میشود که دستگاههای توالییابی DNA چگونه به جای خواندن کل ژنوم، قطعات کوتاه DNA به نام Reads تولید میکنند و چگونه این قطعات برای مطالعه ژنوم استفاده میشوند.
ژنوم مجموعه کامل اطلاعات ژنتیکی یک موجود زنده است.
ژنوم شامل تمام دستورالعملهای لازم برای ساخت و نگهداری بدن است.
میتوان ژنوم را مانند یک کتاب دستور آشپزی (Recipe Book) تصور کرد:
- هر دستور غذا مانند یک ژن (Gene) است.
- هر دستور، اطلاعات لازم برای ساخت یک مولکول خاص در بدن را دارد.
- مجموعه تمام این دستورها، ژنوم را تشکیل میدهد.
البته این کتاب با زبان معمولی نوشته نشده است؛ بلکه با الفبای خاص DNA نوشته شده است.
نمایش ژنوم به صورت یک رشته، امکان استفاده از ابزارهای محاسباتی برای تحلیل آن را فراهم میکند.
مجموعه چهار حرفی که برای نمایش اطلاعات ژنتیکی استفاده میشود.
DNA از چهار نوع باز (Base) تشکیل شده است:
| حرف | نام باز |
|---|---|
| A | Adenine (آدنین) |
| C | Cytosine (سیتوزین) |
| G | Guanine (گوانین) |
| T | Thymine (تیمین) |
هر مولکول DNA مانند یک رشته نوشتهشده با این چهار حرف است.
مثال:
ACGTTGCA
یک قطعه DNA را نمایش میدهد.
ساختار سهبعدی DNA که شبیه یک نردبان پیچخورده است.
DNA از دو رشته تشکیل شده که به دور یکدیگر پیچیدهاند.
اجزای اصلی این ساختار:
- دو طرف نردبان → ستونهای DNA
- پلههای نردبان → جفتهای باز (Base Pairs)
بازها به صورت مکمل با هم جفت میشوند:
- A با T
- C با G
یعنی:
A ↔ T
C ↔ G
این رابطه مکملی، یکی از ویژگیهای اساسی DNA است.
تبدیل مولکول DNA به یک دنباله از حروف A,C,G,T.
اگر از یک طرف مارپیچ DNA شروع کنیم و بازها را یکییکی بخوانیم، میتوانیم DNA را به یک رشته تبدیل کنیم.
مثلاً:
ساختار DNA:
A-T
C-G
G-C
T-A
میتواند به شکل زیر نوشته شود:
ACGT
بنابراین:
DNA Molecule → String
این تبدیل، پایه تحلیل محاسباتی ژنوم است.
چون در علوم کامپیوتر، رشتهها (Strings) دادههایی هستند که میتوان:
- جستجو کرد.
- مقایسه کرد.
- مرتب کرد.
- با الگوریتمها پردازش کرد.
ژنوم انسان بسیار بزرگ است.
برای مثال:
- یک کروموزوم انسانی حدود صدها میلیون باز دارد.
- کل ژنوم انسان میلیاردها باز دارد.
اما حتی با این اندازه بسیار بزرگ، همچنان میتوان آن را یک رشته در نظر گرفت.
مانند یک متن بسیار طولانی که در چندین خط نوشته شده است.
بخشی از DNA که اطلاعات ساخت یک محصول زیستی خاص را دارد.
درون رشته بزرگ ژنوم، بخشهایی وجود دارند که اطلاعات مهمی را حمل میکنند.
برای مثال:
ژن HBB یکی از ژنهای انسانی است که در تولید پروتئین هموگلوبین نقش دارد.
این ژن ممکن است در چند بخش جدا از رشته ژنوم قرار گرفته باشد.
تحلیل ژنوم فقط خواندن کل رشته نیست؛ بلکه پیدا کردن و تفسیر بخشهای مهم آن مانند ژنها نیز اهمیت دارد.
دستگاهی که ترتیب بازهای DNA را تعیین میکند.
یک نکته مهم:
دستگاههای توالییابی امروزی معمولاً نمیتوانند رشتههای بسیار طولانی DNA را مستقیماً بخوانند.
آنها در خواندن:
- قطعات کوتاه DNA → بسیار خوب هستند.
- کل ژنوم طولانی → محدودیت دارند.
بنابراین به جای خواندن کل ژنوم، تعداد بسیار زیادی قطعه کوتاه تولید میکنند.
یک قطعه کوتاه DNA که توسط دستگاه توالییابی خوانده شده است.
فرآیند کلی:
- DNA ورودی (Input DNA) مانند ژنوم انسان وارد دستگاه میشود.
- دستگاه بخشهای کوتاه و تصادفی DNA را انتخاب میکند.
- این قطعات کوتاه را میخواند.
- خروجی، مجموعهای از Reads است.
به عبارت دیگر:
Genome
↓
Random Short Substrings
↓
Sequencing Reads
Reads:
- بسیار کوتاهتر از ژنوم اصلی هستند.
- تعداد بسیار زیادی دارند.
- بخشهای مختلف ژنوم را پوشش میدهند.
هر Read یک زیررشته کوتاه از رشته بزرگتر ژنوم است.
مثال:
ژنوم:
ACGTACGTTAGCA
یک Read:
TACGT
یک بخش کوچک از ژنوم اصلی است.
این مفهوم پایه بسیاری از الگوریتمهای:
- Genome Assembly
- Read Alignment
است.
میزان تکرار خوانده شدن بخشهای مختلف ژنوم.
چون دستگاه تعداد زیادی 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 نوشته شده است.
فرض کنید یک کتاب بسیار بزرگ را خرد کنیم و فقط بخشهای کوچکی از صفحات را بخوانیم.
هر قطعه کوچک:
- یک Read است.
- بخشی از متن اصلی را نشان میدهد.
با داشتن تعداد زیادی قطعه، میتوان دوباره اطلاعات کتاب اصلی را استخراج کرد.
-
ژنوم مجموعه کامل اطلاعات ژنتیکی یک موجود است.
-
DNA مانند رشتهای از چهار حرف A,C,G,T قابل نمایش است.
-
بازهای DNA به صورت مکمل جفت میشوند:
- A با T
- C با G
-
تبدیل DNA به String امکان تحلیل با الگوریتمهای کامپیوتری را فراهم میکند.
-
ژنوم انسان یک رشته بسیار طولانی از بازها است.
-
دستگاههای توالییابی کل ژنوم را یکجا نمیخوانند.
-
آنها تعداد زیادی Read کوتاه تولید میکنند.
-
هر Read یک Substring از ژنوم اصلی است.
-
تعداد زیاد Readها باعث ایجاد اطلاعات تکراری و افزایش دقت میشود.
-
تحلیل Reads پایه مسائل مهمی مانند Alignment و Assembly است.
چرا میتوان DNA را مانند یک String در نظر گرفت؟
پاسخ: زیرا DNA از ترتیب مشخصی از چهار کاراکتر A,C,G,T تشکیل شده و میتوان آن را مانند یک رشته متنی در علوم کامپیوتر نمایش داد.
Read چیست؟
پاسخ: یک قطعه کوتاه DNA است که دستگاه توالییابی آن را از ژنوم اصلی خوانده است.
چرا دستگاههای توالییابی به جای خواندن کل ژنوم، Reads کوتاه تولید میکنند؟
پاسخ: زیرا خواندن رشتههای بسیار طولانی DNA دشوار است، اما خواندن تعداد زیادی قطعه کوتاه DNA با دقت بالا امکانپذیر است.
اگر یک ژنوم میلیاردها باز داشته باشد، چگونه میتوان آن را تحلیل کرد؟
پاسخ: با تبدیل آن به یک رشته و استفاده از الگوریتمهای محاسباتی برای پردازش Reads و استخراج اطلاعات ژنتیکی.
Coverage در توالییابی DNA به چه معناست؟
پاسخ: تعداد دفعاتی است که یک بخش مشخص از ژنوم توسط Readهای مختلف مشاهده و بررسی میشود.
رابطه بین Read و Substring چیست؟
پاسخ: هر Read یک زیررشته کوتاه از رشته بزرگتر ژنوم است.
01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/05_lecture-string-definitions-and-python-examples
در این بخش، مفاهیم پایه مربوط به رشتهها (Strings) معرفی میشوند؛ زیرا در تحلیل دادههای ژنومی، DNA معمولاً به صورت یک رشته از حروف نمایش داده میشود.
از آنجا که بسیاری از الگوریتمهای این دوره با رشتههای DNA کار میکنند، لازم است مفاهیم زیر بهخوبی درک شوند:
- تعریف String و Alphabet
- طول رشته
- رشته خالی
- موقعیت کاراکترها (Offset)
- الحاق رشتهها (Concatenation)
- زیررشتهها (Substrings)
- پیشوندها (Prefixes)
- پسوندها (Suffixes)
همچنین نحوه پیادهسازی این مفاهیم در زبان برنامهنویسی Python بررسی میشود.
یک رشته، دنبالهای محدود از کاراکترها است که از یک مجموعه مشخص از کاراکترها ساخته شده است.
یک رشته با نماد S نمایش داده میشود:
[ S = s_1s_2s_3...s_n ]
که هر کاراکتر از یک مجموعه به نام Alphabet (الفبا) انتخاب میشود.
در ژنومیک، معمولاً الفبا برابر است با:
[ \Sigma = {A,C,G,T} ]
یعنی تمام رشتههای DNA فقط از چهار حرف تشکیل میشوند.
مثال:
S = "ACGTTA"
یک رشته DNA است.
تقریباً تمام دادههای DNA در بیوانفورماتیک به صورت رشته ذخیره و پردازش میشوند.
مجموعهای از کاراکترهایی که میتوانند در یک رشته استفاده شوند.
در مسائل مختلف، Alphabet میتواند متفاوت باشد.
مثلاً:
در متن انگلیسی:
[ \Sigma = {A,B,C,...,Z} ]
در DNA:
[ \Sigma = {A,C,G,T} ]
در این دوره، تمرکز اصلی روی الفبای DNA است.
تعداد کاراکترهای موجود در یک رشته.
طول رشته با نماد زیر نمایش داده میشود:
[ |S| ]
مثال:
S = "ACGT"
طول رشته:
[ |S| = 4 ]
برای محاسبه طول رشته از تابع داخلی len() استفاده میکنیم.
مثال:
len("ACGT")خروجی:
4
رشتهای که هیچ کاراکتری ندارد.
طول رشته خالی برابر صفر است:
[ |\epsilon| = 0 ]
نماد رایج آن:
[ \epsilon ]
است.
رشته خالی با دو علامت نقل قول بدون فاصله نوشته میشود:
""مثال:
s = ""شماره موقعیت یک کاراکتر در رشته.
در Python و بسیاری از زبانهای برنامهنویسی، شمارش موقعیتها از صفر شروع میشود.
مثال:
S = "ACGT"
موقعیتها:
| Offset | Character |
|---|---|
| 0 | A |
| 1 | C |
| 2 | G |
| 3 | T |
بنابراین:
- Offset صفر → اولین کاراکتر
- Offset دو → سومین کاراکتر
دسترسی به کاراکتر:
S[0]خروجی:
A
و:
S[2]خروجی:
G
قرار دادن دو رشته پشت سر هم برای ساخت یک رشته جدید.
اگر دو رشته داشته باشیم:
S = "ACG"
T = "TT"
الحاق آنها:
ACGTT
است.
از عملگر + استفاده میشود:
S + Tنتیجه:
"ACGTT"
بخشی از یک رشته بزرگتر که به صورت متوالی در آن وجود دارد.
رشته اصلی:
S = "AACCGGTT"
زیررشته:
CCGG
یک Substring از S است.
برای گرفتن زیررشته از Slicing استفاده میکنیم:
فرمت کلی:
S[start:end]نکته:
- start شامل میشود.
- end شامل نمیشود.
مثال:
S[2:6]اگر:
S = "AACCGGTT"
باشد، خروجی:
CCGG
خواهد بود.
زیررشتهای که از ابتدای رشته شروع میشود.
رشته:
S = "AACCGGTT"
پیشوند:
AACCGG
است.
زیرا از اولین کاراکتر شروع شده است.
S[0:6]یا کوتاهتر:
S[:6]هر دو یک معنی دارند.
وقتی عدد قبل از : حذف شود، Python به طور پیشفرض صفر را در نظر میگیرد.
زیررشتهای که در انتهای رشته قرار دارد.
رشته:
S = "AACCGGTT"
پسوند:
GGTT
است.
زیرا به انتهای رشته متصل است.
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 مانند یک کلمه بسیار طولانی است:
مثلاً:
ACGTTACG
- هر حرف → یک باز DNA
- کل رشته → بخشی از ژنوم
همانطور که میتوان بخشی از یک کلمه را جدا کرد، میتوان بخشی از DNA را نیز به عنوان Substring استخراج کرد.
- String مجموعهای از کاراکترها در یک ترتیب مشخص است.
- DNA را میتوان به صورت رشتهای از A,C,G,T نمایش داد.
- Alphabet مجموعه کاراکترهای مجاز برای ساخت رشته است.
- طول رشته با
len()در Python محاسبه میشود. - رشته خالی با
""نمایش داده میشود. - Python از اندیس صفرمبنا استفاده میکند.
- Concatenation دو رشته را به هم متصل میکند.
- Substring بخشی از یک رشته بزرگتر است.
- Prefix از ابتدای رشته شروع میشود.
- Suffix در انتهای رشته قرار دارد.
- در Python برای استخراج بخشهایی از رشته از Slicing استفاده میشود.
String چیست؟
پاسخ: رشته، دنبالهای محدود از کاراکترها است که از یک Alphabet مشخص ساخته شده است.
چرا DNA را میتوان به صورت String نمایش داد؟
پاسخ: زیرا DNA از ترتیب مشخصی از چهار باز A,C,G,T تشکیل شده و میتوان آن را مانند یک رشته کاراکتری ذخیره و پردازش کرد.
اگر در Python بخواهیم کاراکتر سوم یک رشته DNA را دریافت کنیم، چه دستوری استفاده میکنیم؟
پاسخ:
S[2]زیرا Python از اندیس صفر شروع میکند.
تفاوت Substring و Prefix چیست؟
پاسخ: Substring هر بخش متوالی از یک رشته است، اما Prefix حتماً باید از ابتدای رشته شروع شود.
خروجی دستور زیر چیست؟
S[-3:]پاسخ: سه کاراکتر آخر رشته را برمیگرداند و یک Suffix ایجاد میکند.
چرا مفهوم Substring در تحلیل DNA مهم است؟
پاسخ: زیرا بسیاری از مسائل ژنومیک مانند یافتن الگوها، تطبیق خوانشها و مونتاژ ژنوم بر اساس مقایسه زیررشتهها انجام میشوند.
01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/06_practical-string-basics
در این بخش عملی، اصول ایجاد و دستکاری رشتهها (Strings) در زبان برنامهنویسی Python بررسی میشود. از آنجا که دادههای DNA معمولاً به صورت رشتهای از نوکلئوتیدها (A, C, G, T) ذخیره میشوند، تسلط بر عملیات رشتهای برای تحلیل دادههای ژنومی ضروری است.
در این درس عملی، موارد زیر آموزش داده میشوند:
- ساخت رشتهها در Python
- دسترسی به کاراکترهای رشته
- مفهوم اندیسگذاری صفرمبنا (Zero-based Indexing)
- محاسبه طول رشته
- ایجاد رشته خالی
- اتصال رشتهها (Concatenation)
- تولید رشتههای تصادفی DNA
- استفاده از حلقهها برای ساخت توالیها
- استخراج Substring، Prefix و Suffix
رشته مجموعهای از کاراکترها است که در Python با علامت نقل قول تعریف میشود.
در Python دو روش برای تعریف String وجود دارد:
seq = 'ACGT'seq = "ACGT"هر دو روش کاملاً یکسان هستند.
یک توالی DNA را میتوان به صورت یک String ذخیره کرد:
sequence = "ATGCGT"هر حرف نشاندهنده یک نوکلئوتید است.
دریافت یک کاراکتر خاص از داخل رشته با استفاده از موقعیت آن.
در Python برای دسترسی به یک کاراکتر از براکت استفاده میکنیم:
seq[index]مثال:
seq = "ACGT"
seq[1]خروجی:
C
زیرا:
| Index | Character |
|---|---|
| 0 | A |
| 1 | C |
| 2 | G |
| 3 | T |
در Python اولین کاراکتر رشته دارای اندیس صفر است.
برخلاف شمارش معمول انسانها که از 1 شروع میشود، Python شمارش را از 0 آغاز میکند.
مثال:
ACGT
موقعیتها:
0 1 2 3
A C G T
بنابراین:
- اولین کاراکتر → index 0
- دومین کاراکتر → index 1
- سومین کاراکتر → index 2
بسیاری از خطاهای برنامهنویسی هنگام کار با رشتهها ناشی از اشتباه در اندیسگذاری است.
تعداد کاراکترهای موجود در یک رشته.
از تابع داخلی:
len()استفاده میشود.
مثال:
len("ACGT")خروجی:
4
طول یک توالی DNA برابر با تعداد نوکلئوتیدهای آن است.
مثلاً:
ATCGGA
طول:
6
رشتهای بدون هیچ کاراکتر.
empty = ""طول آن:
len(empty)نتیجه:
0
رشته خالی معمولاً برای ساخت تدریجی یک رشته جدید استفاده میشود.
مثلاً هنگام تولید یک توالی DNA تصادفی:
sequence = ""سپس نوکلئوتیدها به آن اضافه میشوند.
اتصال دو یا چند رشته برای ساخت یک رشته جدید.
مثال:
s1 = "AAA"
s2 = "CCC"
s1 + s2خروجی:
AAACCC
تابع join() برای اتصال عناصر یک لیست استفاده میشود.
مثال:
parts = ["A", "C", "G", "T"]
"".join(parts)خروجی:
ACGT
در این حالت هیچ جداکنندهای بین عناصر قرار نمیگیرد.
مثال:
",".join(parts)خروجی:
A,C,G,T
در اینجا کاما بین عناصر قرار میگیرد.
ساخت یک رشته DNA با انتخاب تصادفی نوکلئوتیدها.
ابتدا:
import randomسپس:
random.choice()برای انتخاب تصادفی یک عنصر استفاده میشود.
مثال:
random.choice("ACGT")خروجی ممکن است:
G
باشد.
هر بار اجرای دستور میتواند نتیجه متفاوتی ایجاد کند.
تنظیم یک مقدار ثابت برای تولید نتایج تصادفی قابل تکرار.
به صورت معمول:
random.choice("ACGT")هر بار نتیجه متفاوتی میدهد.
اما:
random.seed(10)باعث میشود تولید اعداد و انتخابهای تصادفی قابل تکرار باشند.
در تحقیقات علمی و تست برنامهها، قابلیت تکرار نتایج اهمیت زیادی دارد.
ابتدا یک رشته خالی ایجاد میکنیم:
sequence = ""سپس چند بار یک نوکلئوتید تصادفی انتخاب کرده و اضافه میکنیم.
مثال:
for _ in range(10):
sequence += random.choice("ACGT")نتیجه:
یک رشته DNA با طول 10 تولید میشود.
علامت _ برای زمانی استفاده میشود که مقدار شمارنده حلقه اهمیتی ندارد.
مثال:
for _ in range(10):
print("DNA")در اینجا:
- حلقه 10 بار اجرا میشود.
- اما شماره تکرار ذخیره نمیشود.
اگر به شماره تکرار نیاز داشته باشیم:
for i in range(10):استفاده میکنیم.
استخراج بخشی از یک رشته با استفاده از محدوده اندیسها.
string[start:end]نکته:
- start شامل میشود.
- end شامل نمیشود.
مثال:
seq[1:3]کاراکترهای اندیس 1 و 2 را برمیگرداند.
گرفتن بخش ابتدایی رشته.
مثال:
seq[:3]یعنی:
از ابتدا تا قبل از اندیس 3.
این دستور معادل است با:
seq[0:3]گرفتن بخش انتهایی رشته.
مثال:
seq[7:]یعنی:
از اندیس 7 تا انتهای رشته.
دسترسی به کاراکترها از انتهای رشته.
در Python:
آخرین کاراکتر:
seq[-1]دومین کاراکتر از انتها:
seq[-2]است.
مثال:
A C G T C A G
0 1 2 3 4 5 6
دستور:
seq[-3]سومین کاراکتر از انتها را میدهد.
برای گرفتن سه کاراکتر آخر:
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 مانند یک نوار طولانی از حروف است:
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 امکان دسترسی از انتهای رشته را فراهم میکند.
Zero-Based Indexing چیست؟
پاسخ: روشی برای شمارهگذاری عناصر رشته که در آن اولین عنصر دارای اندیس صفر است.
چگونه سه کاراکتر آخر یک رشته DNA را استخراج میکنیم؟
پاسخ:
sequence[-3:]چرا هنگام تولید توالی DNA تصادفی از رشته خالی شروع میکنیم؟
پاسخ: زیرا میتوانیم نوکلئوتیدهای جدید را به تدریج به آن اضافه کنیم تا رشته نهایی ساخته شود.
تفاوت + و join() در اتصال رشتهها چیست؟
پاسخ:
هر دو رشتهها را متصل میکنند، اما join() برای اتصال مجموعهای از رشتهها مانند عناصر یک لیست با یک جداکننده مشخص مناسبتر است.
خروجی دستور زیر چیست؟
"ACGT"[1:3]پاسخ:
CG
زیرا اندیس 1 شامل میشود و اندیس 3 شامل نمیشود.
چرا در تحلیل ژنومی یادگیری String Slicing اهمیت دارد؟
پاسخ: زیرا بسیاری از عملیات ژنومی مانند استخراج Readها، بررسی زیررشتهها و تحلیل الگوهای DNA بر اساس استخراج بخشهایی از رشته انجام میشوند.
01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/07_practical-manipulating-dna-strings
در این بخش عملی، با نوشتن چند تابع در Python برای پردازش رشتههای DNA آشنا میشویم. هدف اصلی، تمرین ساخت الگوریتمهایی است که روی توالیهای DNA عملیات انجام میدهند.
سه مسئله مهم بررسی میشود:
- پیدا کردن طولانیترین پیشوند مشترک (Longest Common Prefix) بین دو رشته DNA
- بررسی تطابق کامل دو رشته (Exact Matching)
- محاسبه مکمل معکوس DNA (Reverse Complement)
این عملیاتها پایه بسیاری از الگوریتمهای پیشرفتهتر در بیوانفورماتیک مانند تطبیق توالیها، جستجوی الگوها و مونتاژ ژنوم هستند.
تابع مجموعهای از دستورات است که برای انجام یک کار مشخص نوشته میشود و میتوان چندین بار آن را اجرا کرد.
در Python برای ساخت تابع از کلمه کلیدی def استفاده میکنیم:
def function_name(arguments):
statementsمثال:
def longest_common_prefix(s1, s2):در اینجا:
- نام تابع:
longest_common_prefix - ورودیها: دو رشته
s1وs2
در Python فاصلهگذاری (Indentation) بخشی از ساختار زبان است.
تمام دستوراتی که داخل تابع قرار دارند باید دارای تورفتگی باشند.
مثال صحیح:
def test():
print("DNA")بدون تورفتگی، Python خطا ایجاد میکند.
طولانیترین بخش ابتدایی که بین دو رشته مشترک است.
دو رشته:
S1 = ACCAGT
S2 = ACCATT
پیشوند مشترک:
ACCA
بنابراین:
[ LCP(S1,S2)=ACCA ]
ایده اصلی:
-
یک اندیس
iاز صفر شروع میکنیم. -
تا زمانی که:
- هر دو رشته هنوز کاراکتر دارند.
- کاراکترهای موقعیت
iبرابر هستند.
مقدار
iرا افزایش میدهیم. -
بخش قبل از
iرا برمیگردانیم.
i = 0
while:
characters at position i are equal:
increase i
return substring from beginning to i
Longest Common Prefix در بسیاری از الگوریتمهای مقایسه رشتهها استفاده میشود.
در ژنومیک میتواند برای بررسی شباهت بین توالیهای DNA کاربرد داشته باشد.
بررسی اینکه آیا دو رشته دقیقاً یکسان هستند یا خیر.
مثال:
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 TruePython خودش عملگر مقایسه رشته دارد:
s1 == s2مثال:
"ACGT" == "ACGT"خروجی:
True
و:
"ACGT" == "ACGA"خروجی:
False
ساختاری برای ذخیره اطلاعات به صورت زوجهای کلید-مقدار (Key-Value).
dictionary = {
key: value
}مثال:
complement = {
"A":"T",
"T":"A",
"C":"G",
"G":"C"
}در DNA هر باز یک باز مکمل دارد:
| Base | Complement |
|---|---|
| A | T |
| T | A |
| C | G |
| G | C |
دیکشنری این ارتباط را ذخیره میکند.
مثلاً:
complement["A"]نتیجه:
T
رشتهای که ابتدا مکمل هر باز گرفته شده و سپس ترتیب رشته برعکس میشود.
DNA دو رشتهای است.
اگر توالی یک رشته را بدانیم:
5' - ACGT - 3'
رشته مقابل:
3' - TGCA - 5'
است.
برای نمایش استاندارد از جهت 5' به 3' باید آن را معکوس کنیم:
ACGT → ACGT
برای هر باز:
- مکمل آن را پیدا کن.
- آن را به ابتدای رشته جدید اضافه کن.
مثال:
رشته ورودی:
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 دو مرحله دارد:
- گرفتن Complement
- Reverse کردن ترتیب
-
اضافه کردن عناصر به ابتدای رشته باعث ایجاد ترتیب معکوس میشود.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| Function | تابع | مجموعهای از دستورات قابل استفاده مجدد |
| Argument | آرگومان / ورودی تابع | دادهای که به تابع داده میشود |
| Indentation | تورفتگی | فاصلهگذاری برای مشخص کردن بلوکهای کد |
| Longest Common Prefix (LCP) | طولانیترین پیشوند مشترک | بزرگترین بخش ابتدایی مشترک دو رشته |
| Exact Matching | تطبیق کامل | بررسی برابر بودن کامل دو رشته |
| Boolean | مقدار منطقی | مقدار True یا False |
| Dictionary | دیکشنری | ساختار Key-Value در Python |
| Key | کلید | شناسه برای دسترسی به مقدار |
| Value | مقدار | داده مرتبط با کلید |
| Complement | مکمل | باز مقابل در DNA |
| Reverse Complement | مکمل معکوس | مکمل رشته با ترتیب معکوس |
| Prepending | افزودن به ابتدای رشته | اضافه کردن عنصر قبل از محتوای موجود |
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 دو رشتهای ضروری است.
Longest Common Prefix چیست؟
پاسخ: طولانیترین زیررشتهای است که از ابتدای دو رشته شروع شده و در هر دو مشترک است.
چرا در Reverse Complement فقط Complement گرفتن کافی نیست؟
پاسخ: زیرا دو رشته DNA در جهت مخالف قرار دارند و برای نمایش استاندارد باید ترتیب رشته نیز معکوس شود.
مکمل DNA باز C چیست؟
پاسخ:
G
اگر دو رشته طول متفاوت داشته باشند، آیا میتوانند Match باشند؟
پاسخ: خیر. رشتههای با طول متفاوت نمیتوانند کاملاً برابر باشند.
چرا در محاسبه Reverse Complement بازهای مکمل به ابتدای رشته اضافه میشوند؟
پاسخ: زیرا اضافه کردن به ابتدای رشته باعث معکوس شدن ترتیب خروجی و ایجاد Reverse Complement میشود.
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
در این بخش عملی، نحوه دریافت، خواندن و پردازش یک ژنوم مرجع (Reference Genome) با استفاده از Python آموزش داده میشود.
هدف این درس، آشنایی با مراحل اولیه کار با دادههای واقعی ژنومی است:
- دانلود فایلهای توالی DNA
- آشنایی با فرمت FASTA
- خواندن ژنوم از فایل
- حذف اطلاعات اضافی و استخراج توالی DNA
- ذخیره ژنوم به صورت String
- شمارش فراوانی بازهای DNA
در این تمرین از ژنوم ویروس Lambda Phage استفاده میشود.
ژنومی استاندارد و شناختهشده که به عنوان مرجع برای تحلیل دادههای ژنتیکی استفاده میشود.
در مطالعات ژنومی، معمولاً توالی DNA یک موجود زنده ابتدا تعیین و ذخیره میشود. این توالی به عنوان مرجع استفاده میشود تا دادههای جدید با آن مقایسه شوند.
در این تمرین:
- ژنوم مرجع مربوط به Lambda Phage Virus است.
- طول آن حدود:
[ 48,500 ]
باز DNA است.
ژنوم مرجع پایه بسیاری از تحلیلها مانند:
- مقایسه توالیها
- شناسایی جهشها
- نگاشت خوانشهای DNA (Read Mapping)
است.
فرمت استاندارد برای ذخیره توالیهای زیستی مانند DNA، RNA و پروتئین.
یک فایل FASTA معمولاً شامل دو بخش است:
با علامت > شروع میشود.
مثال:
>Enterobacteria phage lambda
این بخش شامل اطلاعات توصیفی مانند:
- نام موجود
- شناسه توالی
- اطلاعات آزمایشگاهی
است.
خطوط بعدی شامل حروف DNA هستند:
ACGTAGCTAGCT...
این بخش همان توالی واقعی ژنوم است.
در تحلیل ژنوم معمولاً اطلاعات Header مورد نیاز نیست و فقط توالی DNA استخراج میشود.
در محیط IPython میتوان دستورات خط فرمان را با علامت ! اجرا کرد.
مثال:
!wget URLدر IPython:
- اجرای دستورات سیستمعامل را امکانپذیر میکند.
- مانند اجرای دستور در Terminal است، اما داخل محیط Python.
مثال:
!lsفهرست فایلهای پوشه را نمایش میدهد.
برای باز کردن فایل از تابع:
open()استفاده میشود.
ساختار:
open(filename, 'r')که:
r→ خواندن فایل (read)w→ نوشتن فایل (write)
است.
هنگام باز کردن فایل معمولاً یک نام موقت برای دسترسی به فایل قرار میدهیم:
with open(filename, 'r') as f:در اینجا:
f
نماینده فایل باز شده است.
- یک String خالی ایجاد میکنیم:
genome = ""-
فایل را خط به خط میخوانیم.
-
اگر خط با
>شروع شود:
- آن را نادیده میگیریم.
- اگر خط شامل بازهای DNA باشد:
- آن را به رشته ژنوم اضافه میکنیم.
create empty genome string
for each line in file:
if line is not header:
add sequence to genome
return genome
تابعی برای حذف فاصلهها و کاراکترهای اضافی انتهای رشته.
در فایلها معمولاً هر خط با کاراکتر پایان خط (newline) تمام میشود.
مثلاً:
ACGT\n
تابع:
line.rstrip()آن را تبدیل میکند به:
ACGT
- فاصلهها
- Tab
- Newline
- White space اضافی
محاسبه تعداد دفعات ظاهر شدن هر باز در ژنوم.
چهار باز DNA:
| باز |
|---|
| A |
| C |
| G |
| T |
یک دیکشنری ایجاد میکنیم:
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 ]
یک ابزار آماده در 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 مانند یک کتاب است:
- Header → عنوان و مشخصات کتاب
- Sequence → متن اصلی کتاب
در تحلیل ژنوم:
- عنوان کتاب معمولاً کنار گذاشته میشود.
- فقط متن اصلی (DNA Sequence) خوانده میشود.
- ژنوم مرجع یک توالی استاندارد برای تحلیل ژنتیکی است.
- FASTA یکی از رایجترین فرمتهای ذخیره DNA است.
- خطوطی که با
>شروع میشوند Header هستند. - توالی DNA بعد از Header قرار دارد.
- در Python میتوان ژنوم را به صورت String ذخیره کرد.
- برای خواندن فایل از
open()استفاده میشود. - حالت
rبرای خواندن فایل است. rstrip()کاراکترهای اضافی انتهای خطوط را حذف میکند.- شمارش بازهای DNA با Dictionary امکانپذیر است.
collections.Counterروش سادهتر برای شمارش عناصر است.- مجموع فراوانی A,C,G,T باید برابر طول ژنوم باشد.
- پردازش فایلهای واقعی ژنومی یکی از مهارتهای پایه در بیوانفورماتیک است.
FASTA چیست؟
پاسخ: یک فرمت استاندارد برای ذخیره توالیهای DNA، RNA و پروتئین است که شامل Header و Sequence میشود.
چرا Header فایل FASTA را در تحلیل ژنوم حذف میکنیم؟
پاسخ: زیرا Header فقط شامل اطلاعات توصیفی است و بخشی از توالی واقعی DNA نیست.
اگر بخواهیم یک فایل را فقط برای خواندن باز کنیم، چه حالتهایی استفاده میکنیم؟
پاسخ:
open(filename, 'r')چرا مجموع تعداد A، C، G و T باید برابر طول ژنوم باشد؟
پاسخ: زیرا هر موقعیت در DNA دقیقاً یکی از این چهار باز را دارد.
وظیفه دستور زیر چیست؟
collections.Counter(genome)پاسخ: تعداد تکرار هر کاراکتر در رشته ژنوم را محاسبه میکند.
تفاوت 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 (Second Generation Sequencing) بررسی میشود. این فناوری که با نام Sequencing by Synthesis (توالییابی بر اساس سنتز) نیز شناخته میشود، از فرآیند طبیعی کپی شدن DNA در سلولها الهام گرفته است.
هدف یادگیری این بخش:
- درک نحوه تکثیر طبیعی DNA
- آشنایی با نقش آنزیم DNA Polymerase
- فهم این موضوع که چگونه دستگاههای توالییابی نسل دوم با مشاهده فرآیند ساخت رشته جدید DNA، توالی رشته اصلی را تشخیص میدهند.
فرآیندی که طی آن یک مولکول DNA دو رشتهای به دو نسخه مشابه تبدیل میشود.
هر سلول بدن تقریباً یک نسخه از ژنوم کامل خود را دارد. هنگامی که سلول تقسیم میشود، باید اطلاعات ژنتیکی خود را به سلولهای دختر منتقل کند.
مراحل کلی همانندسازی:
- DNA دو رشتهای اولیه وجود دارد.
- دو رشته از یکدیگر جدا میشوند.
- هر رشته به عنوان الگو (Template) برای ساخت یک رشته جدید استفاده میشود.
- در نهایت دو مولکول DNA دو رشتهای مشابه ایجاد میشود.
همانندسازی DNA اساس:
- رشد سلولها
- تقسیم سلولی
- انتقال اطلاعات ژنتیکی
است.
ساختاری از DNA که شامل دو رشته مکمل از نوکلئوتیدها است.
DNA به شکل یک Double Helix (مارپیچ دوگانه) وجود دارد.
دو رشته DNA توسط جفتهای مکمل بازها به هم متصل هستند:
| باز | باز مکمل |
|---|---|
| A (Adenine) | T (Thymine) |
| C (Cytosine) | G (Guanine) |
برای مثال:
- G همیشه با C جفت میشود.
- A همیشه با T جفت میشود.
خاصیت مکمل بودن بازها باعث میشود:
- اطلاعات DNA قابل کپی شدن باشد.
- هر رشته بتواند به عنوان الگو عمل کند.
رشتهای از DNA که اطلاعات لازم برای ساخت رشته مکمل جدید را فراهم میکند.
پس از جدا شدن دو رشته DNA:
هر رشته دارای اطلاعات کافی برای ساخت نسخه مکمل خود است.
مثلاً:
اگر یک رشته شامل:
G
باشد، رشته جدید باید:
C
در مقابل آن قرار دهد.
رشته الگو پایهای است که DNA Polymerase بر اساس آن رشته جدید را میسازد.
آنزیمی که رشته جدید DNA را با اضافه کردن نوکلئوتیدهای مکمل میسازد.
DNA Polymerase مانند یک ماشین مولکولی عمل میکند:
ورودیها:
- یک رشته DNA تکرشتهای (Template)
- نوکلئوتیدهای آزاد موجود در محیط
خروجی:
- یک رشته DNA مکمل جدید
مثال:
اگر رشته الگو:
G A T C
باشد، DNA Polymerase رشته مکمل:
C T A G
را میسازد.
DNA Polymerase نقش اصلی را در:
- تکثیر DNA
- فناوریهای توالییابی نسل دوم
دارد.
روشی برای تعیین توالی DNA با مشاهده فرآیند ساخت رشته جدید توسط DNA Polymerase.
نسل دوم دستگاههای توالییابی از فرآیند طبیعی همانندسازی DNA تقلید میکنند.
ایده اصلی:
- یک رشته DNA به عنوان Template قرار میگیرد.
- DNA Polymerase شروع به ساخت رشته مکمل میکند.
- دستگاه اضافه شدن هر نوکلئوتید را مشاهده میکند.
- از این اطلاعات، توالی DNA اولیه استخراج میشود.
این روش پایه بسیاری از فناوریهای مدرن توالییابی است و امکان تحلیل:
- میلیونها
- حتی میلیاردها
مولکول DNA به صورت همزمان را فراهم کرده است.
نسلی از فناوریهای توالییابی 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 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 است.
DNA Polymerase چیست و چه کاری انجام میدهد؟
پاسخ: DNA Polymerase آنزیمی است که با استفاده از یک رشته DNA به عنوان Template، رشته مکمل جدید را با اضافه کردن نوکلئوتیدها میسازد.
چرا هر رشته DNA میتواند به عنوان Template استفاده شود؟
پاسخ: زیرا دو رشته DNA مکمل یکدیگر هستند و اطلاعات یک رشته برای ساخت رشته دیگر کافی است.
Sequencing by Synthesis چگونه توالی DNA را مشخص میکند؟
پاسخ: با مشاهده فرآیند اضافه شدن نوکلئوتیدها توسط DNA Polymerase، توالی رشته DNA الگو را استخراج میکند.
تفاوت اصلی توالییابی نسل دوم با روشهای قدیمی چیست؟
پاسخ: نسل دوم میتواند تعداد بسیار زیادی مولکول DNA را به صورت موازی توالییابی کند، در حالی که روشهای قدیمی معمولاً تعداد محدودی مولکول را بررسی میکردند.
اگر در یک رشته 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
در این درس، جزئیات عملکرد توالییابی نسل دوم (Second Generation Sequencing) بررسی میشود. این فناوری که مبتنی بر روش Sequencing by Synthesis (SBS) است، با مشاهده فرآیند ساخت رشته جدید DNA توسط DNA Polymerase، توالی DNA را تعیین میکند.
ایده اصلی این روش:
- DNA ژنوم به قطعات کوچک تقسیم میشود.
- قطعات DNA به صورت رشتههای تکرشتهای روی یک سطح قرار میگیرند.
- DNA Polymerase شروع به ساخت رشته مکمل میکند.
- هر بار فقط یک نوکلئوتید اضافه میشود.
- اضافه شدن نوکلئوتید با رنگهای فلورسنت ثبت میشود.
- با تکرار این فرآیند، توالی کامل هر قطعه DNA استخراج میشود.
هدف یادگیری این بخش:
- درک معماری آزمایشگاهی Sequencing by Synthesis
- فهم نقش نوکلئوتیدهای اصلاحشده (Terminated Bases)
- شناخت مفهوم Sequencing Cycle
- درک دلیل توانایی توالییابی میلیونها یا میلیاردها DNA به صورت موازی
فرآیند شکستن DNA بزرگ (مانند ژنوم کامل انسان) به قطعات کوچکتر برای توالییابی.
دستگاههای توالییابی نسل دوم قادر به خواندن DNA بسیار طولانی نیستند؛ بنابراین ابتدا DNA به قطعات کوچک تقسیم میشود.
مراحل اولیه:
- نمونه زیستی (مثلاً خون) دریافت میشود.
- DNA استخراج میشود.
- DNA به قطعات کوتاه تقسیم میشود.
- قطعات به شکل رشتههای تکرشتهای درمیآیند.
این کار امکان خواندن میلیونها قطعه کوچک DNA را فراهم میکند که بعداً میتوان از آنها برای بازسازی اطلاعات ژنومی استفاده کرد.
قطعات DNA تکرشتهای که روی سطح دستگاه قرار میگیرند و قرار است توالی آنها تعیین شود.
پس از آمادهسازی DNA، قطعات تکرشتهای به صورت تصادفی روی یک سطح صاف مانند یک اسلاید قرار میگیرند.
هر قطعه:
- یک Template مستقل است.
- یک Read (خوانش توالی) تولید میکند.
در یک دستگاه واقعی:
- تعداد Templateها بسیار زیاد است.
- میلیونها یا میلیاردها قطعه DNA روی یک سطح قرار دارند.
قرار دادن تعداد زیادی Template در کنار هم، اساس Massively Parallel Sequencing است.
آنزیمی که با اضافه کردن نوکلئوتیدهای مکمل، رشته جدید DNA را میسازد.
در روش SBS:
به محیط واکنش اضافه میشود:
- DNA Polymerase
- نوکلئوتیدهای آزاد
DNA Polymerase:
- Template را میخواند.
- نوکلئوتید مکمل را انتخاب میکند.
- آن را به رشته جدید اضافه میکند.
مثال:
اگر Template دارای:
G
باشد، Polymerase:
C
را اضافه میکند.
فعالیت DNA Polymerase همان چیزی است که اطلاعات توالی DNA را قابل مشاهده میکند.
نوکلئوتیدهای اصلاحشدهای که پس از اضافه شدن، اجازه ادامه ساخت رشته DNA را نمیدهند.
در توالییابی نسل دوم، نوکلئوتیدهای معمولی استفاده نمیشوند، بلکه نوکلئوتیدهایی استفاده میشوند که دارای:
Terminator
هستند.
این بخش مانند یک مانع عمل میکند.
نتیجه:
- DNA Polymerase فقط یک نوکلئوتید اضافه میکند.
- سپس متوقف میشود.
اگر Polymerase بدون توقف ادامه دهد، نمیتوان فهمید در هر مرحله چه نوکلئوتیدی اضافه شده است.
Terminator باعث میشود همه Templateها در یک مرحله زمانی هماهنگ باقی بمانند.
تشخیص نوع نوکلئوتید اضافهشده با استفاده از رنگهای نوری.
هر نوع نوکلئوتید یک رنگ مخصوص دارد.
مثلاً:
| باز | رنگ فرضی |
|---|---|
| A | رنگ خاص |
| T | رنگ خاص |
| C | نارنجی |
| G | قرمز |
پس از اضافه شدن یک نوکلئوتید:
- Terminator آن نور تولید میکند.
- دوربین از سطح اسلاید عکس میگیرد.
- رنگ مشاهدهشده مشخص میکند چه بازی اضافه شده است.
این تصاویر داده اصلی برای تعیین توالی DNA هستند.
یک دور کامل از فرآیند اضافه کردن یک نوکلئوتید، تصویربرداری و آمادهسازی برای مرحله بعد.
اضافه کردن:
- DNA Polymerase
- Terminated Bases
اضافه شدن یک نوکلئوتید به هر Template
گرفتن تصویر از سطح
حذف Terminatorها
شروع چرخه بعدی
هر چرخه یک موقعیت از توالی DNA را مشخص میکند.
با تکرار چرخهها، رشته کامل خوانده میشود.
توانایی توالییابی تعداد بسیار زیادی 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 در مقیاس بسیار بزرگ است.
Sequencing by Synthesis چیست؟
پاسخ: روشی برای تعیین توالی DNA که در آن با مشاهده فرآیند ساخت رشته مکمل توسط DNA Polymerase، توالی DNA مشخص میشود.
چرا از Terminated Bases در توالییابی نسل دوم استفاده میشود؟
پاسخ: زیرا باعث میشوند DNA Polymerase فقط یک نوکلئوتید اضافه کند و امکان ثبت دقیق مرحله به مرحله توالی فراهم شود.
اگر در یک Sequencing Cycle رنگ یک نقطه مشخص شود، این اطلاعات چه چیزی را نشان میدهد؟
پاسخ: نشان میدهد چه نوکلئوتیدی به آن Template اضافه شده است.
چرا Second Generation Sequencing را Massively Parallel مینامند؟
پاسخ: زیرا میلیونها یا میلیاردها Template DNA را به صورت همزمان توالییابی میکند.
چگونه از مجموعه تصاویر چرخههای مختلف، توالی یک 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
در این درس، نحوه ایجاد خطا در فناوریهای نسل دوم توالییابی (Second Generation Sequencing) بررسی میشود. اگرچه روش Sequencing by Synthesis قادر است میلیاردها قطعه DNA را بهصورت موازی توالییابی کند، اما در طی فرآیند ممکن است خطاهایی رخ دهد.
هدف این بخش:
- شناخت علت ایجاد خطا در دادههای توالییابی
- آشنایی با مفهوم Base Calling
- درک مفهوم Base Quality Score و نحوه بیان میزان اطمینان به هر باز خواندهشده
قبل از شروع توالییابی، قطعات DNA روی سطح دستگاه تکثیر میشوند تا از هر قطعه، تعداد زیادی نسخه مشابه ایجاد شود.
در فرآیند Sequencing by Synthesis، ابتدا قطعات کوتاه DNA به سطح یک اسلاید متصل میشوند. اما یک مولکول DNA بهتنهایی نور کافی برای تشخیص توسط دوربین ایجاد نمیکند.
بنابراین دستگاه ابتدا از هر Template، تعداد زیادی نسخه مشابه تولید میکند که در نزدیکی یکدیگر قرار میگیرند. این مجموعه نسخههای مشابه یک Cluster تشکیل میدهد.
به این ترتیب، هنگام اضافه شدن بازهای فلورسنت، نور حاصل از میلیونها نسخه مشابه قابل تشخیص خواهد بود.
- افزایش شدت سیگنال نوری
- امکان تصویربرداری دقیق از باز اضافهشده
- فراهم کردن امکان توالییابی massively parallel
گروهی از نسخههای یکسان یک قطعه DNA که در یک نقطه از سطح توالییاب قرار گرفتهاند.
در دستگاههای نسل دوم، هر نقطه روی اسلاید نمایانگر یک DNA template است، اما در عمل آن نقطه شامل میلیونها نسخه مشابه از همان DNA است.
دوربین دستگاه نور منتشرشده از کل این خوشه را ثبت میکند.
اطلاعات یک Cluster باعث میشود دستگاه بتواند:
- باز اضافهشده را تشخیص دهد.
- شدت سیگنال را اندازهگیری کند.
- میزان اطمینان از نتیجه را تخمین بزند.
خطایی که باعث میشود برخی رشتههای DNA در یک Cluster از سایر رشتهها جلوتر یا عقبتر قرار گیرند.
در حالت ایدهآل، تمام DNAهای یک Cluster باید در هر Cycle یک باز دریافت کنند.
اما ممکن است در یکی از چرخهها، یک باز بهطور تصادفی Terminated نباشد.
در این حالت:
- DNA Polymerase آن باز را اضافه میکند.
- چون Terminator وجود ندارد، ساخت رشته متوقف نمیشود.
- Polymerase باز بعدی را نیز اضافه میکند.
- این رشته از سایر رشتههای Cluster جلو میافتد.
در چرخههای بعدی، بخشی از DNAها در یک مرحله و بخش دیگر در مرحله دیگری قرار دارند.
نتیجه:
- چند رنگ مختلف در یک تصویر مشاهده میشود.
- تشخیص باز صحیح دشوارتر میشود.
این خطا یکی از منابع اصلی کاهش کیفیت خوانشها در توالییابی نسل دوم است.
نرمافزاری که تصاویر حاصل از دستگاه توالییاب را تحلیل میکند و مشخص میکند هر موقعیت DNA چه بازی دارد.
دستگاه توالییابی در هر Cycle یک تصویر تولید میکند.
Base Caller:
- رنگ نورهای ثبتشده را بررسی میکند.
- رنگ غالب را به یک باز DNA تبدیل میکند.
- میزان اطمینان خود را نیز گزارش میدهد.
مثال:
اگر تمام نورهای یک Cluster نارنجی باشند:
→ احتمالاً باز مشخصشده قطعی است.
اما اگر ترکیبی از نارنجی و قرمز مشاهده شود:
→ احتمال خطا وجود دارد.
Base Caller رابط بین داده خام تصویری و داده قابل تحلیل ژنومی است.
عددی که نشان میدهد نرمافزار چقدر احتمال میدهد باز گزارششده اشتباه باشد.
برای هر باز خواندهشده، دستگاه یک مقدار کیفیت ارائه میکند.
این مقدار با رابطه زیر تعریف میشود:
[ Q = -10 \log_{10}(p) ]
که در آن:
- Q = امتیاز کیفیت باز (Base Quality)
- p = احتمال اشتباه بودن باز گزارششده
هرچه Q بزرگتر باشد:
- احتمال خطا کمتر است.
- اطمینان به باز بیشتر است.
| Base Quality (Q) | احتمال خطا |
|---|---|
| 10 | 1 در 10 |
| 20 | 1 در 100 |
| 30 | 1 در 1000 |
بنابراین:
- افزایش 10 واحد در Q یعنی کاهش 10 برابری احتمال خطا.
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 مشابه هستند.
اگر یکی از افراد به اشتباه قطعهای اضافه کند که نباید اضافه میشد، از بقیه جلو میافتد.
وقتی از همه عکس گرفته شود:
- بیشتر افراد یک وضعیت دارند.
- فرد اشتباهکرده وضعیت متفاوتی دارد.
در نتیجه تصویر شامل چند حالت مختلف خواهد بود.
در DNA sequencing نیز:
- رشتههای درست یک رنگ تولید میکنند.
- رشتههای جلو افتاده رنگ دیگری تولید میکنند.
و دستگاه در تعیین باز دچار عدم قطعیت میشود.
- در Sequencing by Synthesis، دستگاه از فرآیند ساخت رشته مکمل DNA برای تعیین توالی استفاده میکند.
- قبل از توالییابی، DNAها تکثیر میشوند تا Cluster ایجاد شود.
- Cluster باعث افزایش شدت سیگنال و امکان تصویربرداری میشود.
- اضافه شدن یک باز بدون Terminator باعث خطای همگامسازی میشود.
- خطای همگامسازی باعث ترکیب چند سیگنال رنگی در یک موقعیت میشود.
- Base Caller تصاویر را تحلیل کرده و بازها را تعیین میکند.
- هر Base Call دارای یک Base Quality Score است.
- Base Quality احتمال اشتباه بودن یک باز را تخمین میزند.
- کیفیت Q=20 یعنی احتمال خطا حدود ۱٪ است.
- کیفیت Q=30 یعنی احتمال خطا حدود ۰٫۱٪ است.
- مقیاس کیفیت باز به صورت لگاریتمی تعریف شده است.
پاسخ: زیرا یک مولکول DNA نور کافی تولید نمیکند. با ایجاد Clusterهای بزرگ، سیگنال فلورسنت تقویت شده و توسط دوربین قابل تشخیص میشود.
پاسخ: Base Caller تصاویر حاصل از چرخههای توالییابی را تحلیل کرده و باز DNA را تعیین میکند.
پاسخ: اگر یک باز بدون Terminator اضافه شود، Polymerase میتواند بازهای بیشتری اضافه کند و آن رشته از سایر رشتههای Cluster جلو بیفتد.
پاسخ: احتمال اشتباه بودن باز گزارششده را نشان میدهد.
پاسخ: در 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 که یکی از رایجترین فرمتها برای ذخیره دادههای حاصل از DNA Sequencing است آشنا میشویم.
هر Sequencing Read در FASTQ شامل چهار خط اطلاعاتی است که مهمترین آنها:
- توالی بازهای DNA خواندهشده توسط دستگاه
- کیفیت هر باز (Base Quality Score)
است.
هدف یادگیری این بخش:
- شناخت ساختار فایل FASTQ
- درک ارتباط بین Sequence و Base Quality
- آشنایی با نحوه ذخیره کیفیت بازها به صورت کاراکترهای ASCII
- آشنایی با استاندارد Phred+33 Encoding
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
...
شناسهای که به هر Sequencing Read اختصاص داده میشود.
خط اول FASTQ معمولاً اطلاعاتی مانند موارد زیر را شامل میشود:
- شناسه دستگاه توالییابی
- اطلاعات آزمایش
- موقعیت Cluster روی اسلاید
- سایر اطلاعات مربوط به اجرای آزمایش
اما در بسیاری از تحلیلهای بیوانفورماتیکی، این اطلاعات مستقیماً برای تحلیل توالی استفاده نمیشود.
اگرچه نام Read معمولاً در تحلیل اولیه نادیده گرفته میشود، اما برای:
- ردیابی دادهها
- بررسی منبع آزمایش
- کنترل کیفیت
میتواند مفید باشد.
خط دوم FASTQ که توالی بازهای DNA خواندهشده را نشان میدهد.
این خط خروجی نهایی Base Caller است.
مثلاً:
ACGTTAGCA
یعنی دستگاه تشخیص داده است که این Read شامل این توالی از بازهاست.
بازهای ممکن:
- A = Adenine
- C = Cytosine
- G = Guanine
- T = Thymine
این بخش همان داده اصلی DNA است که در تحلیلهای ژنومی استفاده میشود.
خط چهارم FASTQ که کیفیت هر باز موجود در Sequence را ذخیره میکند.
هر کاراکتر در خط کیفیت مربوط به یک باز در خط Sequence است.
مثلاً:
Sequence:
A C G T
Quality:
H I ! #
هر کاراکتر نشاندهنده کیفیت همان باز متناظر است.
هدف این خط:
نشان دادن میزان اطمینان دستگاه به هر Base Call.
عددی که احتمال اشتباه بودن باز تعیینشده را نشان میدهد.
کیفیت باز با مقدار Q بیان میشود.
رابطه:
[ Q=-10\log_{10}(p) ]
که:
- Q = Base Quality
- p = احتمال اشتباه بودن Base Call
بنابراین:
- Q بالا → اطمینان بیشتر
- Q پایین → احتمال خطای بیشتر
مثال:
| Q | احتمال خطا |
|---|---|
| 10 | ۱ از ۱۰ |
| 20 | ۱ از ۱۰۰ |
| 30 | ۱ از ۱۰۰۰ |
روش تبدیل اعداد کیفیت باز به کاراکترهای متنی.
در FASTQ کیفیت بازها به صورت عدد ذخیره نمیشود، بلکه به شکل کاراکتر ذخیره میشود.
برای مثال:
عدد:
109
میتواند به یک کاراکتر ASCII تبدیل شود.
جدول ASCII مشخص میکند هر کاراکتر چه عددی دارد.
بنابراین:
Base Quality (Q)
↓
عدد صحیح
↓
ASCII Character
استانداردی برای تبدیل مقدار کیفیت باز (Q) به کاراکتر ASCII در FASTQ.
در روش Phred+33:
- مقدار Q به نزدیکترین عدد صحیح گرد میشود.
- عدد 33 به آن اضافه میشود.
- نتیجه به کاراکتر ASCII تبدیل میشود.
فرمول:
[ Character = ASCII(Q+33) ]
مثال:
اگر:
[ Q=10 ]
آنگاه:
[ 10+33=43 ]
و عدد 43 به کاراکتر ASCII مربوط تبدیل میشود.
برای کار با این تبدیلها معمولاً دو تابع استفاده میشود:
ورودی:
- مقدار Q
خروجی:
- کاراکتر FASTQ متناظر
عمل:
Q → ASCII Character
ورودی:
- کاراکتر 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 | احتمال خطا | احتمال اشتباه بودن باز گزارششده |
یک 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 بدون توجه به کیفیت بازها میتواند باعث نتایج نادرست شود.
پاسخ: چهار خط دارد: نام Read، توالی DNA، خط جداکننده، و کیفیت بازها.
پاسخ: زیرا همه بازهای خواندهشده دارای اطمینان یکسان نیستند و باید میزان احتمال خطا مشخص باشد.
پاسخ: مقدار عددی کیفیت باز (Q) را با اضافه کردن 33 به یک کاراکتر ASCII تبدیل میکند.
پاسخ: احتمال اشتباه بودن Base Call کاهش مییابد و اطمینان به باز افزایش پیدا میکند.
پاسخ: هر کاراکتر در Quality Line مربوط به یک باز متناظر در Sequence Line است و کیفیت همان باز را نشان میدهد.
01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/13_practical-working-with-sequencing-reads
در این درس با دادههای واقعی حاصل از دستگاههای توالییابی DNA کار میکنیم. تمرکز اصلی بر روی قالب ذخیرهسازی دادههای توالییابی به نام FASTQ و نحوه پردازش آن با Python است.
اهداف یادگیری این بخش:
- آشنایی با ساختار فایلهای FASTQ
- خواندن و استخراج توالیها و کیفیتهای مربوط به آنها
- درک مفهوم Base Quality Score
- تبدیل امتیازهای کیفیت از قالب Phred+33
- تحلیل توزیع کیفیت خوانشها با استفاده از Histogram
FASTQ یک قالب استاندارد برای ذخیرهسازی دادههای حاصل از آزمایشهای DNA Sequencing است که علاوه بر توالی DNA، اطلاعات مربوط به کیفیت هر باز را نیز ذخیره میکند.
هر Sequencing Read در فایل FASTQ شامل چهار خط متوالی است:
| خط | محتوا | توضیح |
|---|---|---|
| خط اول | Read Identifier | نام یا شناسه خوانش |
| خط دوم | Sequence | توالی DNA گزارششده توسط Base Caller |
| خط سوم | Separator (+) | یک خط جداکننده که معمولاً نادیده گرفته میشود |
| خط چهارم | Quality String | کیفیت هر باز در قالب ASCII |
مثال:
@read123
ACGTGCA
+
HHHHHFF
فایل FASTQ اطلاعات خام مورد نیاز برای تحلیلهای ژنومی را فراهم میکند. هر Read شامل:
- خود توالی DNA
- میزان اطمینان از صحت هر باز
است.
یک Read یک قطعه کوتاه DNA است که دستگاه Sequencer آن را خوانده و توالی بازهای آن را گزارش کرده است.
در توالییابی نسل دوم (Second Generation Sequencing) میلیونها یا میلیاردها Read به صورت همزمان تولید میشوند.
هر Read شامل:
-
رشتهای از بازهای DNA:
- A
- C
- G
- T
-
کیفیت هر باز
است.
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 → کیفیت بسیار بالا
Phred+33 روشی برای ذخیرهسازی Quality Scoreها به صورت کاراکترهای ASCII است.
کامپیوتر میتواند اعداد را ذخیره کند، اما FASTQ برای کاهش حجم فایل، کیفیتها را به صورت کاراکتر ذخیره میکند.
مثلاً:
Quality Score → ASCII Character
برای تبدیل Quality به کاراکتر:
- مقدار Q را به نزدیکترین عدد صحیح گرد میکنیم.
- عدد 33 را اضافه میکنیم.
- مقدار حاصل را به کاراکتر ASCII تبدیل میکنیم.
فرمول:
[ ASCII = Q + 33 ]
برای برگشت به Q:
[ Q = ASCII - 33 ]
Parsing یعنی خواندن ساختار فایل و استخراج اطلاعات مورد نیاز.
برای هر Read:
- خط شناسه خوانده میشود ولی ذخیره نمیشود.
- توالی DNA ذخیره میشود.
- خط + نادیده گرفته میشود.
- رشته کیفیت ذخیره میشود.
در Python معمولاً دو لیست ساخته میشود:
sequences = []
qualities = []که شامل:
- تمام توالیها
- کیفیتهای مربوط به هر توالی
هستند.
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 | تجزیه و پردازش داده | استخراج اطلاعات از فایل |
یک 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 استفاده میشود.
پاسخ: FASTQ علاوه بر توالی DNA، کیفیت هر باز را نیز ذخیره میکند. هر Read شامل شناسه، توالی، خط جداکننده و رشته کیفیت است.
پاسخ: Quality Score بالا یعنی احتمال اشتباه بودن باز کمتر است و Base Caller اعتماد بیشتری به نتیجه دارد.
پاسخ: برای کاهش حجم داده، Quality Scoreها با استفاده از ASCII Encoding به کاراکتر تبدیل میشوند.
پاسخ: ابتدا Quality Score به نزدیکترین عدد صحیح گرد میشود، سپس 33 به آن اضافه شده و مقدار حاصل به یک کاراکتر ASCII تبدیل میشود.
پاسخ: با ادامه فرآیند خواندن DNA، خطاهای دستگاه و عدم هماهنگی سیگنالها افزایش مییابد، بنابراین اطمینان Base Caller کمتر میشود.
01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/14_practical-analyzing-reads-by-position
در این درس به تحلیل کیفیت دادههای Sequencing از زاویهای دیگر میپردازیم. پس از بررسی توزیع Base Quality Score، اکنون بررسی میکنیم که آیا ترکیب بازهای DNA در طول Readها ثابت باقی میماند یا خیر.
اهداف یادگیری این بخش:
- محاسبه GC Content در هر موقعیت از Read
- بررسی تغییرات ترکیب بازها در طول توالی
- تشخیص مشکلات احتمالی در فرآیند Sequencing
- شمارش فراوانی بازهای DNA در کل دادهها
- درک مفهوم باز نامشخص N
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 خاص باشد.
محاسبه میانگین GC Content برای هر موقعیت از Readهای مختلف.
فرض کنید همه Readها طول 100 باز دارند.
برای هر موقعیت:
- تعداد G و C را شمارش میکنیم.
- تعداد کل بازهای مشاهدهشده را شمارش میکنیم.
- نسبت آنها را محاسبه میکنیم.
مثلاً برای موقعیت شماره 10:
[ GC_{10} = \frac{\text{تعداد G و C در موقعیت 10}} {\text{تعداد کل بازهای موقعیت 10}} ]
دو آرایه نگه میداریم:
تعداد بازهای G و C در هر موقعیت:
GC[i]
تعداد کل بازهای مشاهدهشده در هر موقعیت:
Totals[i]
در پایان:
GC_Content[i] = GC[i] / Totals[i]
شمارش تعداد دفعات مشاهده هر باز DNA در کل مجموعه Readها.
بازهای بررسیشده:
- A
- T
- G
- C
با بررسی توزیع بازها میتوان فهمید:
- آیا ترکیب DNA طبیعی است؟
- آیا GC Content با مقدار مورد انتظار هماهنگ است؟
- آیا مشکلی در Sequencing وجود دارد؟
یک ابزار داخلی Python برای شمارش فراوانی عناصر است.
به جای نوشتن حلقه برای شمارش بازها، میتوان از:
collections.Counter()استفاده کرد.
مثال:
count.update(sequence)این دستور تعداد وقوع هر کاراکتر در توالی را ثبت میکند.
N یک باز واقعی DNA نیست، بلکه نشاندهنده عدم اطمینان دستگاه در تعیین باز است.
وقتی:
- سیگنالهای دستگاه واضح نیستند،
- 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 یک موجود |
فرض کنید در یک موقعیت خاص از Readها:
- 30 بار G یا C مشاهده شده است.
- مجموع بازهای مشاهدهشده 50 عدد است.
پس:
[ GC = \frac{30}{50}=0.6 ]
یعنی 60٪ بازهای آن موقعیت G یا C هستند.
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 قابل قبول است، اما تعداد زیاد آن نشانه مشکل در داده است.
پاسخ: GC Content نسبت بازهای Guanine و Cytosine به کل بازهای DNA است و نشاندهنده ترکیب نوکلئوتیدی یک توالی است.
پاسخ: برای بررسی اینکه آیا ترکیب بازها در طول Sequencing ثابت است یا تغییرات غیرعادی ناشی از خطا وجود دارد.
پاسخ: ممکن است نشاندهنده یک مشکل در یک Sequencing Cycle یا خطای تکنیکی باشد.
پاسخ: N نشان میدهد که Base Caller نتوانسته با اطمینان هیچکدام از بازهای A، T، G یا C را انتخاب کند.
پاسخ: برای شمارش سریع تعداد وقوع هر باز در مجموعه بزرگی از توالیهای DNA بدون نیاز به پیادهسازی دستی حلقههای شمارشی.
01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/15_lecture-sequencers-give-pieces-to-genomic-puzzles
در این درس بررسی میکنیم که پس از تولید دادههای خام توسط Sequencer چگونه میتوان از آنها برای تحلیل ژنوم استفاده کرد.
دستگاههای نسل دوم توالییابی (Second Generation Sequencers) قطعات کوتاهی از DNA به نام Reads (خوانشها) تولید میکنند. این قطعات بهتنهایی اطلاعات کافی برای درک کامل ژنوم ندارند، بنابراین باید آنها را به یکدیگر متصل کنیم تا توالی اصلی DNA را بازسازی کنیم.
دو مسئله اصلی در تحلیل دادههای توالییابی مطرح میشود:
-
Read Alignment (همترازی خوانشها) زمانی که یک ژنوم مرجع (Reference Genome) در اختیار داریم و میخواهیم مشخص کنیم هر Read در کدام بخش ژنوم قرار میگیرد.
-
Genome Assembly (مونتاژ ژنوم) زمانی که ژنوم مرجع وجود ندارد و باید خودمان از روی Readهای کوتاه، ژنوم کامل را بازسازی کنیم.
هدف یادگیری این درس:
- درک محدودیتهای Readهای کوتاه
- فهم نیاز به اتصال و بازسازی توالی DNA
- آشنایی با تفاوت Alignment و Assembly
- آماده شدن برای یادگیری الگوریتمهای پردازش دادههای ژنومی
Read یک قطعه کوتاه از DNA است که توسط دستگاه توالییابی خوانده شده و ترتیب بازهای آن مشخص شده است.
دستگاههای نسل دوم توالییابی معمولاً قطعاتی در حدود چند صد باز تولید میکنند، در حالی که:
- ژنهای انسان معمولاً هزاران باز طول دارند.
- کل ژنوم انسان حدود میلیاردها باز دارد.
بنابراین یک Read بهتنهایی تنها بخش کوچکی از اطلاعات ژنتیکی را نشان میدهد.
برای تحلیل ژنوم، باید هزاران یا میلیونها Read را کنار هم قرار داد تا تصویر بزرگتر ژنوم ساخته شود.
فرایند کنار هم قرار دادن Readهای کوتاه برای بازسازی توالی اصلی DNA.
از آنجا که Readها قطعات کوچکی از یک ژنوم بزرگ هستند، باید مشخص شود:
- هر Read مربوط به کدام قسمت ژنوم است.
- چگونه Readهای مختلف به یکدیگر متصل میشوند.
این کار مشابه حل کردن یک پازل بزرگ است.
بدون بازسازی Readها، نمیتوان اطلاعات زیستی مهم مانند:
- تفاوتهای ژنتیکی افراد
- جهشها
- استعداد ابتلا به بیماریها
را استخراج کرد.
مدرس تحلیل دادههای توالییابی را به حل یک پازل تشبیه میکند.
در یک پازل معمولی:
- قطعات کوچک داریم.
- تصویر روی جعبه، راهنمای ما است.
- با استفاده از تصویر میتوانیم جای هر قطعه را حدس بزنیم.
در ژنومیک:
- Readها = قطعات پازل
- ژنوم کامل = تصویر نهایی پازل
- Reference Genome = تصویر راهنمای روی جعبه
اگر تصویر را داشته باشیم، حل پازل آسانتر میشود.
یک توالی ژنومی استاندارد که به عنوان راهنما برای مقایسه و مکانیابی Readها استفاده میشود.
ژنوم افراد مختلف کاملاً یکسان نیست، اما انسانهای غیرمرتبط از نظر ژنتیکی بسیار شبیه هستند.
شباهت ژنوم انسانها:
- حدود 99.8 تا 99.9 درصد
یعنی تقریباً:
- 1 تا 2 تفاوت در هر 1000 باز
بنابراین میتوان ژنوم یک فرد یا ژنوم مرجع انسانی را مانند نقشهای برای یافتن محل Readهای فرد دیگر استفاده کرد.
Reference Genome برای گونههای مختلف وجود دارد، مانند:
- انسان (Human)
- موش (Mouse)
- مگس سرکه (Fruit Fly)
- گاو (Cow)
- مرغ (Chicken)
- ذرت (Corn)
پیدا کردن بهترین محل قرارگیری یک Read روی ژنوم مرجع.
در Alignment:
ورودیها:
- یک Read حاصل از Sequencing
- یک Reference Genome
هدف:
پیدا کردن موقعیتی در ژنوم مرجع که بیشترین شباهت را با Read دارد.
مراحل کلی:
- یک Read انتخاب میکنیم.
- آن را با ژنوم مرجع مقایسه میکنیم.
- بهترین تطابق را پیدا میکنیم.
- نتیجه میگیریم Read احتمالاً از آن قسمت ژنوم آمده است.
این مسئله پایه بسیاری از تحلیلهای ژنومی است، مانند:
- یافتن جهشها
- مقایسه ژنوم افراد
- مطالعات بیماریهای ژنتیکی
بازسازی ژنوم بدون استفاده از ژنوم مرجع.
گاهی ژنومی که مطالعه میکنیم قبلاً توالییابی نشده است.
مثلاً:
- یک گیاه ناشناخته
- یک گونه جدید
در این حالت:
- تصویر روی جعبه پازل وجود ندارد.
- باید فقط از خود قطعات پازل استفاده کنیم.
بنابراین باید 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 یک مسئله محاسباتی پیچیده و چالشبرانگیز است.
- الگوریتمها و ساختارهای داده نقش اصلی در حل مسائل توالییابی دارند.
پاسخ: زیرا Readها فقط قطعات کوتاهی از DNA هستند و معمولاً طول آنها بسیار کمتر از ژنها یا کل ژنوم است. بنابراین باید چندین Read کنار هم قرار گیرند تا اطلاعات کاملتری به دست آید.
پاسخ: Reference Genome به عنوان یک نقشه راه استفاده میشود تا مشخص شود هر Read متعلق به کدام بخش ژنوم است.
پاسخ: در Alignment یک ژنوم مرجع داریم و Readها را روی آن قرار میدهیم. در Assembly ژنوم مرجع نداریم و باید ژنوم را فقط از روی Readها بازسازی کنیم.
پاسخ: زیرا ژنوم انسانهای مختلف بسیار شبیه است و تنها حدود 0.1 تا 0.2 درصد تفاوت دارند.
پاسخ: از 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
در این درس با یکی از مسائل اساسی در تحلیل دادههای توالییابی DNA یعنی Read Alignment (همترازی خوانشها) آشنا میشویم.
پس از توالییابی نسل دوم، دستگاه Sequencer میلیاردها قطعه کوتاه DNA به نام Read تولید میکند. هدف ما این است که مشخص کنیم هر Read در کدام قسمت از ژنوم مرجع قرار دارد.
این کار مانند حل یک پازل است:
- Readها = قطعات پازل
- ژنوم مرجع = تصویر کامل پازل
اما برخلاف یک پازل معمولی، تعداد قطعات بسیار زیاد است و تصویر نهایی نیز بسیار بزرگ است.
هدف یادگیری این بخش:
- درک فرآیند Read Alignment
- شناخت مقیاس عظیم دادههای ژنومی
- فهم اینکه چرا پیدا کردن محل Readها یک مسئله محاسباتی دشوار است
- آشنایی با نقش الگوریتمها و ساختارهای داده در حل این مشکل
فرایند پیدا کردن بهترین محل قرارگیری یک Sequencing Read در یک Reference Genome.
در Read Alignment دو ورودی اصلی داریم:
-
Sequencing Read
- قطعه کوتاهی از DNA که توسط دستگاه توالییابی خوانده شده است.
-
Reference Genome
- توالی کامل و استاندارد یک گونه که به عنوان راهنما استفاده میشود.
هدف:
پیدا کردن موقعیتی از ژنوم مرجع که بیشترین شباهت را با Read داشته باشد.
به صورت ساده:
Read:
ACGTTA
Reference Genome:
...GGAACGTTAACC...
↑
محل احتمالی Read
الگوریتم Alignment باید مشخص کند Read احتمالاً از کدام بخش ژنوم آمده است.
Read Alignment پایه بسیاری از تحلیلهای ژنومی است، مانند:
- پیدا کردن تفاوتهای ژنتیکی افراد
- شناسایی جهشها
- بررسی ارتباط تغییرات DNA با بیماریها
یک توالی ژنومی استاندارد که برای مقایسه و مکانیابی Readها استفاده میشود.
در یک گونه مانند انسان، افراد مختلف ژنوم بسیار مشابهی دارند.
برای مثال:
- ژنوم دو انسان غیرمرتبط حدود 99.8 تا 99.9 درصد مشابه است.
بنابراین میتوان از یک ژنوم مرجع به عنوان نقشه استفاده کرد.
فرایند کلی:
- یک Read از DNA فرد مورد مطالعه داریم.
- آن را با ژنوم مرجع مقایسه میکنیم.
- جایی که بیشترین شباهت وجود دارد، محل احتمالی Read است.
وجود ژنوم مرجع باعث میشود مسئله بازسازی ژنوم سادهتر شود؛ زیرا به جای ساختن ژنوم از صفر، فقط باید قطعات را روی یک نقشه موجود قرار دهیم.
حجم بسیار زیاد دادهای که در یک آزمایش Sequencing تولید میشود.
یک دستگاه Second Generation Sequencer در یک اجرای آزمایش (Sequencing Run) میتواند:
- میلیاردها Read تولید کند.
بنابراین Alignment باید:
- میلیاردها بار تکرار شود.
- برای هر Read بهترین محل را پیدا کند.
از طرف دیگر، ژنوم مرجع نیز بسیار بزرگ است.
مثال:
ژنوم انسان:
- حدود 3 میلیارد باز (3 billion bases)
در حالی که یک نمایش ساده روی صفحه ممکن است فقط چند هزار کاراکتر را نشان دهد.
یعنی ژنوم واقعی انسان بیش از یک میلیون برابر بزرگتر از نمونههای کوچک آموزشی است.
پروژهای علمی که برای تعیین و ثبت توالی ژنوم انسان انجام شد.
در پایان این پروژه، نسخه مرجع ژنوم انسان تولید شد.
این توالی مرجع:
- شامل میلیاردها باز DNA است.
- برای مقایسه ژنوم افراد مختلف استفاده میشود.
برای نشان دادن بزرگی ژنوم انسان، نسخه چاپی آن نیز تولید شد.
این نسخه شامل:
- کتابهای متعدد
- صفحات پر از حروف A، C، G و T
بود.
پیدا کردن یک رشته کوتاه درون یک رشته بسیار بزرگتر.
از دیدگاه علوم کامپیوتر:
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 همچنان ادامه دارد.
پاسخ: Read Alignment محل احتمالی یک Sequencing Read را روی یک Reference Genome پیدا میکند.
پاسخ: زیرا Readها بسیار کوتاهتر از ژنها و کل ژنوم هستند و تنها بخش کوچکی از اطلاعات DNA را نشان میدهند.
پاسخ: زیرا به عنوان یک نقشه راه عمل میکند و کمک میکند محل قرارگیری Readها در ژنوم مشخص شود.
پاسخ: زیرا باید میلیاردها Read را در یک ژنوم بسیار بزرگ مانند ژنوم انسان که حدود 3 میلیارد باز دارد، جستجو و مقایسه کرد.
پاسخ: زیرا DNA را میتوان به صورت رشتهای از کاراکترها مدل کرد و از الگوریتمها و ساختارهای داده طراحیشده برای پردازش رشتهها برای تحلیل ژنوم استفاده کرد.
01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/17_lecture-naive-exact-matching
در این درس اولین مسئله محاسباتی مرتبط با همترازی خوانشهای DNA (Read Alignment) معرفی میشود: مسئله تطبیق دقیق رشتهها (Exact Matching Problem).
در این مسئله هدف این است که تمام موقعیتهایی را پیدا کنیم که یک رشته کوتاهتر (Pattern) درون یک رشته بلندتر (Text) ظاهر میشود.
این مسئله نسخه سادهشدهای از مسئله واقعی همترازی DNA است؛ زیرا در ژنومیک نیز باید پیدا کنیم که یک خوانش کوتاه DNA (Sequencing Read) در کدام بخش از ژنوم مرجع (Reference Genome) قرار میگیرد.
هدف یادگیری:
- آشنایی با مفهوم تطبیق رشتهها
- پیادهسازی سادهترین الگوریتم تطبیق
- تحلیل کارایی الگوریتم با استفاده از تعداد مقایسهها
- درک نقاط ضعف روشهای ساده برای مسائل بزرگ ژنومی
مسئلهای که در آن باید تمام موقعیتهایی را پیدا کنیم که یک رشته مشخص (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
شروع میشود.
پیدا کردن محل قرارگیری یک خوانش کوتاه DNA در یک ژنوم مرجع.
در تکنولوژیهای نسل دوم توالییابی (Second Generation Sequencing) خروجی دستگاه شامل میلیاردها قطعه کوتاه DNA است.
این قطعات:
- طول کمی دارند (معمولاً چند صد باز)
- به تنهایی اطلاعات کافی درباره ژنوم ندارند
بنابراین باید مشخص کنیم هر قطعه از کجای ژنوم آمده است.
این کار مشابه قرار دادن قطعات پازل با استفاده از تصویر روی جعبه پازل است.
در ژنومیک:
- قطعه DNA = قطعه پازل
- ژنوم مرجع = تصویر کامل پازل
در علوم کامپیوتر، توالی DNA را میتوان مانند یک رشته از کاراکترها در نظر گرفت.
برای DNA:
A C G T
مانند یک String معمولی پردازش میشود.
این موضوع بسیار مهم است زیرا علوم کامپیوتر الگوریتمها و ساختمان دادههای قدرتمندی برای کار با رشتهها توسعه داده است:
- جستجو در رشتهها
- فهرستسازی (Indexing)
- فشردهسازی (Compression)
- مقایسه رشتهها
این ابزارها پایه بسیاری از الگوریتمهای بیوانفورماتیک هستند.
سادهترین روش برای پیدا کردن Pattern در Text.
ایده اصلی:
تمام حالتهای ممکن قرار گرفتن Pattern روی Text را امتحان کن و ببین آیا همه کاراکترها برابر هستند یا خیر.
فرض کنید:
- طول Pattern برابر x است.
- طول Text برابر y است.
Pattern را از ابتدای Text تا انتها حرکت میدهیم.
برای هر موقعیت:
- Pattern را روی Text قرار میدهیم.
- کاراکترها را مقایسه میکنیم.
برای هر Alignment:
از اولین کاراکتر Pattern شروع میکنیم.
مثلاً:
Pattern:
A C G
Text:
A C G T A
مقایسه:
A = A ✓
C = C ✓
G = G ✓
پس Match داریم.
اما اگر:
A ≠ T
باشد:
- تطبیق شکست میخورد.
- دیگر نیازی به مقایسه باقی کاراکترها نیست.
تابع اصلی:
naive(pattern, text)ورودی:
pattern: رشته مورد جستجوtext: رشتهای که در آن جستجو میکنیم
خروجی:
- لیستی از Offsetهایی که Pattern پیدا شده است.
تمام موقعیتهای ممکن قرارگیری Pattern را بررسی میکند.
تعداد Alignmentها:
[ y-x+1 ]
زیرا Pattern نمیتواند بعد از انتهای Text قرار گیرد.
کاراکترهای Pattern را بررسی میکند.
برای هر Alignment:
حداکثر:
[ x ]
مقایسه انجام میشود.
فرمول:
[ (y-x+1)\times x ]
دلیل:
- تعداد Alignmentها:
[ y-x+1 ]
- برای هر Alignment ممکن است تمام x کاراکتر مقایسه شوند.
Pattern:
AAAA
Text:
AAAAAAAAAAAA
در این حالت:
- تمام کاراکترها با هم تطبیق دارند.
- الگوریتم مجبور است همه مقایسهها را انجام دهد.
فرمول:
[ 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 پردازش کرد.
- الگوریتمهای رشتهای نقش مهمی در بیوانفورماتیک دارند.
پاسخ:
پیدا کردن تمام موقعیتهایی است که یک Pattern به صورت دقیق در یک Text ظاهر میشود.
پاسخ:
زیرا در هر دو مسئله باید یک رشته کوتاه را درون یک رشته بزرگتر پیدا کنیم. در ژنومیک، Read نقش Pattern و ژنوم مرجع نقش Text را دارد.
پاسخ:
زیرا ژنوم انسان بسیار بزرگ است و تعداد Readها نیز میلیاردی است. بررسی تمام حالتهای ممکن زمان بسیار زیادی نیاز دارد.
پاسخ:
اگر طول Pattern برابر x و طول Text برابر y باشد:
[ y-x+1 ]
Alignment بررسی میشود.
پاسخ:
زمانی که تقریباً تمام کاراکترهای 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 که در درس قبل معرفی شد، در زبان Python پیادهسازی میشود و برای پیدا کردن محل قرارگیری خوانشهای مصنوعی DNA (Artificial Reads) در یک ژنوم واقعی استفاده میشود.
در این تمرین:
- یک ژنوم مرجع از ارگانیسم Phi X دانلود میشود.
- الگوریتم تطبیق دقیق برای پیدا کردن محل Readها در ژنوم نوشته میشود.
- تعدادی Read مصنوعی از ژنوم تولید میشود.
- بررسی میشود که آیا این Readها دقیقاً به ژنوم اصلی برمیگردند یا خیر.
هدف یادگیری:
- تبدیل مفهوم الگوریتم تطبیق رشتهها به کد عملی
- درک نقش Pattern و Text در مسائل ژنومی
- آزمایش صحت الگوریتم با دادههای کنترلشده
الگوریتمی برای پیدا کردن تمام موقعیتهایی که یک رشته کوتاه (Pattern) به صورت دقیق در یک رشته بلندتر (Text) ظاهر میشود.
در این مسئله:
- Pattern = Sequencing Read
- Text = Genome Reference
هدف:
پیدا کردن تمام موقعیتهایی که Read دقیقاً در ژنوم وجود دارد.
فرض کنیم:
P= ReadT= Genome
الگوریتم:
-
تمام موقعیتهای ممکن شروع Read در ژنوم بررسی میشوند.
-
در هر موقعیت، تمام بازهای Read با بازهای متناظر ژنوم مقایسه میشوند.
-
اگر حتی یک اختلاف وجود داشته باشد:
- آن موقعیت رد میشود.
-
اگر تمام بازها برابر باشند:
- موقعیت ذخیره میشود.
رشته کوتاهتری که دنبال آن هستیم.
در ژنومیک:
مثال:
AGCTTAG
یک Read توالییابی است.
رشته بزرگتری که جستجو در آن انجام میشود.
در ژنومیک:
مثال:
ACGTAGCTTAGGCTA...
ژنوم مرجع است.
قطعات DNA که به صورت مصنوعی از یک ژنوم موجود استخراج میشوند.
برای ساخت Read مصنوعی:
- یک موقعیت تصادفی در ژنوم انتخاب میشود.
- تعدادی باز پشت سر هم از آن نقطه برداشته میشود.
مثلاً:
ژنوم:
ACGTACGTTAGCTAAC
انتخاب تصادفی:
GTACG
این قطعه یک Read مصنوعی است.
چون این Readها:
- از همان ژنوم ساخته شدهاند.
- خطای توالییابی ندارند.
- جهش ندارند.
بنابراین انتظار داریم همیشه دقیقاً در ژنوم پیدا شوند.
تابع اصلی:
naive(P, T)ورودیها:
| پارامتر | مفهوم |
|---|---|
| P | Pattern یا Read |
| T | Text یا Genome |
خروجی:
لیستی از موقعیتهایی که Pattern در Text پیدا شده است.
ابتدا لیستی ساخته میشود:
occurrences = []این لیست موقعیتهای Match را نگه میدارد.
حلقه بیرونی:
for i in range(len(T)-len(P)+1):تمام موقعیتهایی را بررسی میکند که Pattern میتواند در Text شروع شود.
فرمول:
[ |T|-|P|+1 ]
برای هر موقعیت:
for j in range(len(P)):بازهای Pattern بررسی میشوند.
مقایسه:
T[i+j] == P[j]چرا i+j؟
زیرا:
iمشخصکننده موقعیت شروع Pattern در Text است.jمشخصکننده جایگاه باز داخل Pattern است.
بنابراین:
موقعیت واقعی در Text = i + j
اگر:
T[i+j] != P[j]باشد:
- Match شکست خورده است.
- ادامه مقایسه لازم نیست.
بنابراین:
breakاستفاده میشود.
اگر تمام مقایسهها موفق باشند:
occurrences.append(i)موقعیت ذخیره میشود.
Text:
AGCTAGAGTAG
Pattern:
AG
الگوریتم سه محل پیدا میکند:
- موقعیت 0
- موقعیت 5
- موقعیت 9
زیرا در این نقاط رشته AG وجود دارد.
ژنوم ارگانیسم:
Phi X
دانلود میشود.
تابعی استفاده میشود که:
- 100 Read تولید میکند.
- طول هر Read برابر 100 باز است.
برای هر 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 دقیقاً پیدا شدند.
- این آزمایش صحت پیادهسازی الگوریتم را تأیید میکند.
پاسخ:
Pattern رشتهای است که دنبال آن میگردیم و Text رشته بزرگتری است که جستجو در آن انجام میشود. در ژنومیک، Pattern همان Read و Text همان Genome است.
پاسخ:
زیرا محل واقعی آنها مشخص است و چون بدون خطا تولید شدهاند، انتظار داریم دقیقاً در ژنوم پیدا شوند. این موضوع امکان بررسی صحت الگوریتم را فراهم میکند.
پاسخ:
زیرا وجود حتی یک اختلاف کافی است تا ثابت کند Pattern در آن موقعیت برابر Text نیست، بنابراین مقایسه باقی کاراکترها بیفایده خواهد بود.
پاسخ:
زیرا i موقعیت شروع Pattern در Text را مشخص میکند و j موقعیت کاراکتر داخل Pattern است. جمع این دو، موقعیت واقعی کاراکتر متناظر در Text را میدهد.
پاسخ:
زیرا باید میلیاردها Read را در ژنومهای بسیار بزرگ بررسی کند و تعداد مقایسهها بسیار زیاد میشود. برای دادههای واقعی به الگوریتمهای سریعتر نیاز است.
01_dna-sequencing-strings-and-matching/02_module-1-dna-sequencing-strings-and-matching/19_practical-matching-real-reads
در این درس، الگوریتم Naive Exact Matching که در بخشهای قبل معرفی شد، برای تطبیق خوانشهای واقعی حاصل از توالییابی DNA با یک ژنوم مرجع استفاده میشود.
در ابتدا، انتظار داریم که خوانشهای واقعی دقیقاً مانند خوانشهای مصنوعی با ژنوم تطبیق پیدا کنند؛ اما در عمل مشاهده میشود که تعداد کمی از خوانشها تطبیق کامل دارند. دلیل این موضوع وجود خطاهای توالییابی، تفاوتهای ژنتیکی بین نمونه و ژنوم مرجع، و همچنین دو رشتهای بودن DNA است.
هدف اصلی این درس:
- بررسی محدودیتهای Exact Matching در دادههای واقعی.
- آشنایی با مفهوم Reverse Complement در تطبیق DNA.
- درک نیاز به الگوریتمهای Approximate Matching برای تحلیل دادههای واقعی ژنومی.
دنبالههای کوتاه DNA هستند که مستقیماً توسط دستگاه توالییابی از یک نمونه واقعی تولید شدهاند.
در درسهای قبلی، خوانشهای مصنوعی (Artificial Reads) ساخته شدند؛ این خوانشها مستقیماً از ژنوم استخراج شده بودند و هیچ خطا یا جهشی نداشتند، بنابراین انتظار میرفت همیشه دقیقاً با ژنوم تطبیق پیدا کنند.
اما در این درس از دادههای واقعی استفاده میشود:
- خوانشها از فایل FASTQ دریافت میشوند.
- هر خوانش معمولاً حدود 100 نوکلئوتید طول دارد.
- این خوانشها ممکن است دارای خطا باشند.
دادههای واقعی شرایط پیچیدهای دارند و الگوریتمهای ساده معمولاً برای آنها کافی نیستند.
روشی که در آن یک خوانش باید بدون حتی یک تفاوت، دقیقاً در ژنوم پیدا شود.
در الگوریتم Naive Exact Matching:
- خوانش (Read) به عنوان الگو (Pattern) در نظر گرفته میشود.
- ژنوم (Genome) به عنوان متن (Text) در نظر گرفته میشود.
- الگوریتم تمام موقعیتهای ممکن را بررسی میکند.
- فقط تطبیقی پذیرفته میشود که تمام بازهای DNA یکسان باشند.
مثال:
Read:
ACGT
Genome:
TTACGTAA
خوانش دقیقاً در موقعیت مناسب پیدا میشود.
اما اگر:
ACGT
ACGG
باشد، تطبیق رد میشود، زیرا یک باز متفاوت است.
این روش ساده است، اما برای دادههای واقعی DNA محدودیتهای زیادی دارد.
اشتباهاتی که دستگاه توالییابی هنگام تعیین بازهای DNA ایجاد میکند.
دستگاه Sequencer ممکن است یک باز را اشتباه گزارش کند.
مثلاً:
DNA واقعی:
ACGT
خوانش دستگاه:
ACCT
در این حالت Exact Matching شکست میخورد، زیرا تنها یک نوکلئوتید متفاوت است.
یکی از مهمترین دلایل عدم تطبیق کامل خوانشهای واقعی با ژنوم مرجع است.
یک توالی استاندارد ژنومی که برای مقایسه با نمونههای دیگر استفاده میشود.
در این درس، خوانشهای واقعی با ژنوم مرجع همان موجود مقایسه میشوند.
اما حتی اگر نمونه از همان گونه باشد، ممکن است:
- تفاوتهای ژنتیکی طبیعی وجود داشته باشد.
- جهشها باعث اختلاف شوند.
ژنوم مرجع یک راهنما برای پیدا کردن محل قرارگیری خوانشها است.
DNA از دو رشته مکمل تشکیل شده است و خوانش توالییابی میتواند از هر کدام از این دو رشته گرفته شود.
الگوریتم اولیه فقط یک جهت از DNA را بررسی میکند.
مثلاً اگر ژنوم:
5' - ACGT - 3'
باشد، دستگاه ممکن است رشته مقابل را بخواند:
3' - TGCA - 5'
بنابراین خوانش تولید شده ممکن است در جهت مخالف ژنوم باشد.
یکی از دلایل اصلی این است که بسیاری از خوانشها با ژنوم تطبیق پیدا نمیکنند.
تبدیل یک رشته DNA به رشتهای که نشاندهنده همان توالی در جهت مخالف است.
- جایگزینی بازها با مکمل آنها:
| باز | مکمل |
|---|---|
| A | T |
| T | A |
| C | G |
| G | C |
- معکوس کردن ترتیب رشته.
مثال:
رشته اصلی:
ACGT
مکمل:
TGCA
مکمل معکوس:
ACGT
برای بررسی خوانشهایی که از رشته مخالف DNA آمدهاند استفاده میشود.
روشی که اجازه میدهد خوانش و ژنوم کاملاً یکسان نباشند.
در دادههای واقعی، باید اجازه دهیم:
- چند باز اشتباه باشند.
- جهش وجود داشته باشد.
- خطای دستگاه رخ داده باشد.
بنابراین 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 | فرمت ذخیره خوانشها | فایل استاندارد ذخیره توالیها و کیفیت آنها. |
فرض کنید یک متن را از روی یک کتاب کپی کردهایم، اما چند حرف اشتباه تایپ شده است.
اگر دنبال جمله دقیق بگردیم:
The quick brown fox
ولی متن دارای:
The quick brawn fox
باشد، جستجوی دقیق شکست میخورد.
در DNA نیز یک تغییر کوچک باعث شکست Exact Matching میشود.
مانند خواندن یک متن از پشت آینه است.
اگر فقط متن مستقیم را جستجو کنیم، ممکن است نسخه آینهای آن را پیدا نکنیم.
بنابراین باید Reverse Complement را نیز بررسی کنیم.
- الگوریتم Naive Exact Matching برای پیدا کردن خوانشها در ژنوم استفاده میشود.
- خوانشهای مصنوعی همیشه دقیقاً با ژنوم تطبیق دارند.
- خوانشهای واقعی به دلیل خطاهای Sequencing معمولاً تطبیق کامل ندارند.
- اختلاف ژنتیکی بین نمونه و ژنوم مرجع نیز میتواند باعث عدم تطبیق شود.
- DNA دو رشتهای است، بنابراین باید Reverse Complement نیز بررسی شود.
- استفاده از فقط بخشی از خوانش احتمال تطبیق دقیق را افزایش میدهد.
- در آزمایش، فقط 7 از 1000 خوانش کامل تطبیق پیدا کردند.
- با استفاده از 30 باز ابتدایی و بررسی Reverse Complement، تعداد تطبیقها به 932 از 1000 رسید.
- Exact Matching برای دادههای واقعی کافی نیست.
- الگوریتمهای Approximate Matching برای تحمل خطا ضروری هستند.
پاسخ: به دلیل وجود خطاهای توالییابی، تفاوتهای ژنتیکی بین نمونه و ژنوم مرجع، و همچنین قرار گرفتن خوانش روی رشته مخالف DNA.
پاسخ: Artificial Read از ژنوم بدون خطا ساخته میشود و همیشه دقیقاً تطبیق دارد، اما Real Read حاصل دستگاه توالییابی است و ممکن است دارای خطا باشد.
پاسخ: زیرا DNA دو رشتهای است و دستگاه توالییابی میتواند خوانش را از هر کدام از دو رشته تولید کند.
پاسخ: زیرا حتی یک اختلاف کوچک بین خوانش و ژنوم باعث شکست تطبیق میشود، در حالی که خطا و جهش در دادههای واقعی طبیعی هستند.
پاسخ: اجازه میدهد خوانش و ژنوم با وجود تعداد مشخصی اختلاف همچنان به عنوان تطبیقپذیر شناخته شوند.
02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/01_week-2-introduction
در این بخش، مسیر حل مسئلهی Read Alignment (تطبیق خوانشهای DNA) با استفاده از الگوریتمها و ساختمان دادههای پیشرفتهتر ادامه پیدا میکند.
در بخشهای قبلی، الگوریتم Naive Exact Matching بررسی شد. این الگوریتم ساده است اما دو مشکل اساسی دارد:
- سرعت کافی برای حجم عظیم دادههای ژنومی ندارد.
- قادر به پیدا کردن تطبیقهایی که دارای خطا یا اختلاف هستند نیست.
برای حل مسئلهی واقعی تطبیق خوانشهای DNA، به الگوریتمهایی نیاز داریم که:
- سریع (Fast) باشند.
- تطبیق تقریبی (Approximate Matching) را پشتیبانی کنند.
در این ماژول سه ایدهی اصلی بررسی خواهد شد:
- الگوریتم Boyer-Moore به عنوان جایگزینی سریعتر برای جستجوی دقیق.
- مفهوم Indexing (ایندکسگذاری) برای افزایش سرعت جستجو در رشتههای بسیار بزرگ مانند ژنوم.
- استفاده از Pigeonhole Principle (اصل لانهکبوتری) برای تبدیل مسئلهی تطبیق تقریبی به مجموعهای از مسائل تطبیق دقیق.
پیدا کردن محل قرارگیری یک خوانش کوتاه DNA در داخل یک ژنوم مرجع.
در توالییابی نسل دوم (Second Generation Sequencing)، دستگاه تعداد بسیار زیادی خوانش کوتاه تولید میکند.
هدف این است که:
- هر Read را دریافت کنیم.
- محل احتمالی آن را در Genome Reference پیدا کنیم.
- تفاوتهای احتمالی بین نمونه و مرجع را تشخیص دهیم.
این کار نیازمند الگوریتمهایی است که بتوانند میلیاردها مقایسه را به سرعت انجام دهند.
حل این مسئله یکی از پایههای اصلی تحلیل دادههای ژنومی مانند:
- تشخیص جهشها
- مطالعه تنوع ژنتیکی
- تحلیل بیماریها
است.
الگوریتمی که یک الگو (Pattern) را بدون هیچ اختلافی در یک متن (Text) جستجو میکند.
در این روش:
- تمام موقعیتهای ممکن بررسی میشوند.
- تمام کاراکترها مقایسه میشوند.
- حتی یک اختلاف باعث رد شدن تطبیق میشود.
مثلاً:
Pattern:
ACGT
Text:
TTACGTAA
تطبیق پیدا میکند.
اما:
ACGT
ACGG
تطبیق ندارد.
ژنوم انسان حدود:
3 billion bases
طول دارد.
در حالی که هر آزمایش توالییابی میتواند میلیاردها Read تولید کند.
بنابراین بررسی تکتک موقعیتها بسیار پرهزینه است.
در دادههای واقعی:
- خطای Sequencing وجود دارد.
- تفاوتهای ژنتیکی وجود دارد.
بنابراین تطبیق کاملاً دقیق کافی نیست.
الگوریتمهایی که برای پیدا کردن سریعتر الگوها در رشتههای بزرگ طراحی شدهاند.
در علوم کامپیوتر، جستجو در رشتهها موضوعی بسیار قدیمی است.
الگوریتمها و ساختمان دادههای مختلفی برای:
- جستجوی الگو
- ساخت Index
- فشردهسازی رشتهها
طراحی شدهاند.
در این ماژول از این ایدهها برای ژنوم استفاده میشود.
یک الگوریتم سریع برای تطبیق دقیق رشتهها که نسبت به Naive Matching مقایسههای کمتری انجام میدهد.
Boyer-Moore به جای بررسی سادهی تمام موقعیتها:
- از اطلاعات موجود در Pattern استفاده میکند.
- هنگام مشاهدهی عدم تطابق، چندین موقعیت را رد میکند.
- بنابراین نیاز به بررسی همهی کاراکترها ندارد.
این الگوریتم:
- ساده است.
- سریع است.
- برای جستجوی رشتههای بزرگ بسیار کاربردی است.
در این درس به عنوان اولین جایگزین عملی برای Naive Matching معرفی میشود.
ساخت یک ساختار دادهی کمکی برای پیدا کردن سریع اطلاعات در یک مجموعهی بزرگ.
بدون Indexing، برای پیدا کردن یک کلمه در یک کتاب بزرگ باید تمام صفحات را بررسی کنیم.
اما اگر کتاب دارای فهرست باشد:
- مستقیماً به محل موردنظر میرویم.
موتورهای جستجو نیز از همین ایده استفاده میکنند.
مثلاً وقتی عبارتی را در اینترنت جستجو میکنیم:
- موتور جستجو کل اینترنت را دوباره بررسی نمیکند.
- از Index ساختهشده قبلی استفاده میکند.
در ژنوم نیز میتوان Index ساخت تا پیدا کردن Readها سریعتر شود.
Indexing دلیل اصلی امکان جستجوی سریع در دادههای عظیم است.
پیدا کردن تطبیقهایی که اجازه میدهند چند اختلاف بین Pattern و Text وجود داشته باشد.
در زیستشناسی، تطبیق کاملاً دقیق کافی نیست زیرا:
- دستگاه Sequencer خطا دارد.
- افراد مختلف ژنوم کاملاً یکسان ندارند.
- جهشها وجود دارند.
بنابراین باید بتوانیم مثلاً:
ACGT
را با:
ACCT
تطبیق دهیم، زیرا فقط یک اختلاف وجود دارد.
Approximate Matching برای حل واقعی مسئلهی Read Alignment ضروری است.
یک اصل ریاضی که بیان میکند اگر تعداد اشیا بیشتر از تعداد جایگاهها باشد، حداقل یک جایگاه باید بیش از یک شیء داشته باشد.
این اصل کمک میکند مسئلهی Approximate Matching را به Exact Matching تبدیل کنیم.
ایده:
فرض کنید یک Read طولانی داریم که اجازهی چند خطا دارد.
میتوانیم آن را به چند قطعه تقسیم کنیم.
اگر کل Read باید در Genome پیدا شود، حداقل یکی از این قطعات باید کاملاً بدون خطا تطبیق پیدا کند.
بنابراین:
- Read را به بخشهای کوچکتر تقسیم میکنیم.
- Exact Matching را روی هر بخش اجرا میکنیم.
- نتایج را ترکیب میکنیم.
با این روش میتوانیم الگوریتمهای 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 | ساختمان داده | روش سازماندهی داده برای پردازش سریع |
فرض کنید دنبال یک موضوع خاص در یک کتاب 5000 صفحهای هستید.
باید صفحه به صفحه جستجو کنید.
به فهرست مراجعه میکنید و مستقیماً به صفحه موردنظر میروید.
در ژنوم نیز Indexing همین نقش را دارد.
فرض کنید یک Read را به چند قسمت تقسیم کنیم.
اگر Read دارای تعداد محدودی خطا باشد، نمیتواند همهی قسمتها را خراب کند.
پس حداقل یک بخش باید کاملاً سالم باقی بماند و همان بخش میتواند برای پیدا کردن محل Read استفاده شود.
- Naive Exact Matching ساده است اما برای دادههای ژنومی بسیار کند است.
- Read Alignment واقعی نیازمند سرعت بالا و تحمل خطا است.
- Boyer-Moore یک الگوریتم سریعتر برای تطبیق دقیق است.
- Indexing جستجو در دادههای عظیم را امکانپذیر میکند.
- موتورهای جستجو نمونهای از کاربرد Indexing هستند.
- Approximate Matching اجازه وجود اختلاف بین Read و Genome را میدهد.
- خطاهای Sequencing و تفاوتهای ژنتیکی دلیل نیاز به Approximate Matching هستند.
- Pigeonhole Principle امکان استفاده مجدد از الگوریتمهای Exact Matching را فراهم میکند.
- الگوریتمهای رشتهای نقش مهمی در تحلیل دادههای ژنومی دارند.
پاسخ: زیرا تعداد Readها بسیار زیاد است و ژنومها بسیار طولانی هستند؛ بنابراین بررسی تمام موقعیتها زمان زیادی میبرد. همچنین این روش خطاهای توالییابی را تحمل نمیکند.
پاسخ: کاهش تعداد مقایسهها و انجام جستجوی سریعتر نسبت به الگوریتم ساده Naive Matching.
پاسخ: باعث میشود به جای بررسی کل داده، بتوان سریعاً به محل احتمالی اطلاعات دسترسی پیدا کرد.
پاسخ: زیرا دادههای توالییابی دارای خطا هستند و ژنوم افراد مختلف نیز کاملاً یکسان نیست.
پاسخ: با تقسیم Read به بخشهای کوچکتر، تضمین میکند که حداقل یکی از بخشها باید دقیقاً تطبیق پیدا کند؛ بنابراین میتوان از الگوریتمهای Exact Matching برای حل مسئله تقریبی استفاده کرد.
02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/02_lecture-boyer-moore-basics
در این درس، یک الگوریتم سریعتر برای حل مسئله تطبیق دقیق رشتهها (Exact Matching) معرفی میشود که یکی از پایههای مهم در حل مسئله همترازی خوانشهای DNA (Read Alignment) است.
الگوریتم ساده Naive Exact Matching تمام موقعیتهای ممکن را بررسی میکرد و در هر موقعیت تمام کاراکترها را مقایسه میکرد. این روش اگرچه ساده است، اما برای دادههای بزرگ ژنومی بسیار کند است.
الگوریتم Boyer-Moore با استفاده از اطلاعات حاصل از مقایسههای قبلی، برخی موقعیتهایی را که قطعاً نمیتوانند تطبیق ایجاد کنند حذف میکند و بنابراین تعداد زیادی مقایسه غیرضروری را انجام نمیدهد.
هدف یادگیری این بخش:
-
درک ایده اصلی Boyer-Moore
-
شناخت تفاوت آن با الگوریتم Naive Matching
-
آشنایی با دو قانون اصلی:
- Bad Character Rule
- Good Suffix Rule
-
فهم اینکه چگونه این قوانین باعث افزایش سرعت تطبیق رشتهها میشوند.
هدف این مسئله پیدا کردن تمام موقعیتهایی است که یک رشته کوتاهتر (Pattern) دقیقاً درون یک رشته بزرگتر (Text) ظاهر میشود.
در مسئله خواندن DNA:
- Pattern میتواند یک read حاصل از Sequencing باشد.
- Text میتواند ژنوم مرجع باشد.
برای مثال:
Pattern = ACTG
Text = AA ACTG TT
هدف پیدا کردن محل شروع Pattern در Text است.
الگوریتم Naive:
- Pattern را در هر موقعیت ممکن قرار میدهد.
- تمام کاراکترها را مقایسه میکند.
- اگر یک اختلاف پیدا شود، به موقعیت بعدی میرود.
مشکل:
- بسیاری از موقعیتها از قبل مشخص هستند که نمیتوانند تطبیق داشته باشند.
- ولی الگوریتم آنها را دوباره بررسی میکند.
Boyer-Moore تلاش میکند این بررسیهای اضافی را حذف کند.
Boyer-Moore یک الگوریتم تطبیق رشته است که با پرش هوشمندانه بین موقعیتها، تعداد مقایسهها را کاهش میدهد.
در الگوریتم Naive:
- تطبیقها از چپ به راست بررسی میشوند.
- هر شکست باعث حرکت فقط یک خانه به جلو میشود.
اما در Boyer-Moore:
- موقعیتهای شروع Pattern همچنان از چپ به راست بررسی میشوند.
- اما مقایسه کاراکترها از راست به چپ انجام میشود.
- هنگام مشاهده عدم تطبیق، الگوریتم بررسی میکند که چند موقعیت را میتوان بدون از دست دادن جواب حذف کرد.
زیرا اگر در انتهای Pattern یک اختلاف پیدا شود، اطلاعات بیشتری درباره بخشهای قبلی داریم.
این اطلاعات اجازه میدهد چندین alignment را حذف کنیم.
قرار دادن Pattern در یک موقعیت خاص از Text برای بررسی تطبیق.
مثال:
Text:
A C G T A C
Pattern:
T A C
هر جایگاهی که Pattern روی Text قرار میگیرد یک alignment است.
وقتی یک 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 مستقیماً جلو میرود.
این قانون باعث میشود:
- تعداد زیادی alignment بررسی نشود.
- سرعت جستجو افزایش یابد.
اگر بخشی از Pattern با Text تطبیق پیدا کرده باشد و سپس mismatch رخ دهد، الگوریتم تلاش میکند آن بخش تطبیقیافته را حفظ کند.
Suffix یعنی بخش انتهایی یک رشته.
مثلاً:
GENOME
پسوندها:
E
ME
OME
NOME
GENOME
فرض کنید بخشی از Pattern با Text تطبیق یافته است:
Text:
T A C
Pattern:
T A C
سپس mismatch رخ میدهد.
به جای شروع دوباره، الگوریتم:
- دنبال همان بخش تطبیقیافته در جای دیگری از Pattern میگردد.
- Pattern را طوری جابهجا میکند که دوباره آن بخش حفظ شود.
این قانون تلاش میکند:
- تطبیقهای قبلی از بین نروند.
- دوبارهکاری کاهش یابد.
| قانون | هدف اصلی |
|---|---|
| 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ها در ژنوم مرجع اهمیت زیادی دارند.
چرا Boyer-Moore از Naive Matching سریعتر است؟
پاسخ:
زیرا Boyer-Moore با استفاده از اطلاعات mismatchها، alignmentهایی را که امکان تطبیق ندارند حذف میکند و تعداد مقایسهها را کاهش میدهد.
Bad Character Rule چیست؟
پاسخ:
قانونی در Boyer-Moore است که هنگام mismatch، Pattern را طوری جابهجا میکند که یا کاراکتر اشتباه دوباره قابل تطبیق شود یا Pattern کاملاً از آن عبور کند.
Good Suffix Rule چه کاری انجام میدهد؟
پاسخ:
این قانون از بخشهایی که قبلاً تطبیق یافتهاند استفاده میکند تا هنگام جابهجایی Pattern، تطبیقهای قبلی حفظ شوند.
اگر هنگام مقایسه، کاراکتر اشتباه در Text اصلاً در Pattern وجود نداشته باشد، Boyer-Moore چه کاری انجام میدهد؟
پاسخ:
Pattern را کاملاً از آن کاراکتر عبور میدهد، زیرا هیچ alignment شامل آن کاراکتر نمیتواند تطبیق ایجاد کند.
چرا 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 Rule
- Good Suffix Rule
در این بخش یاد میگیریم که این دو قانون در عمل چگونه با هم ترکیب میشوند تا بیشترین پرش ممکن در هنگام جستجوی Pattern در Text انجام شود.
ایده اصلی Boyer-Moore این است که برخلاف الگوریتم ساده Naive Exact Matching، بسیاری از alignmentها را بدون بررسی حذف کند و تنها موقعیتهایی را آزمایش کند که احتمال تطبیق دارند.
هدف یادگیری:
- نحوه استفاده همزمان از دو قانون Boyer-Moore
- روش انتخاب مقدار پرش مناسب
- درک دلیل برتری Boyer-Moore نسبت به Naive Matching
- آشنایی با Lookup Tableهای مورد استفاده در پیادهسازی عملی
در Boyer-Moore هنگام وقوع mismatch، هر دو قانون بررسی میشوند و قانونی که اجازه بیشترین جابهجایی Pattern را میدهد انتخاب میشود.
فرض کنید هنگام مقایسه Pattern و Text به یک mismatch میرسیم.
هر قانون یک مقدار پیشنهاد میدهد:
- Bad Character Rule → چند alignment را میتوان حذف کرد؟
- Good Suffix Rule → چند alignment را میتوان حذف کرد؟
سپس:
[ Shift = max(BadCharacterShift, GoodSuffixShift) ]
یعنی بیشترین پرش انتخاب میشود.
استفاده همزمان از این دو قانون باعث میشود:
- هیچ تطبیق احتمالی از دست نرود.
- بیشترین تعداد alignment ممکن حذف شود.
- سرعت جستجو افزایش یابد.
فرض کنید اولین alignment بررسی میشود.
در اولین مقایسه:
Pattern: ...G...
Text: ...T...
یک mismatch رخ میدهد.
چون هیچ کاراکتری قبل از mismatch تطبیق پیدا نکرده است:
- هیچ suffix تطبیقیافتهای وجود ندارد.
- بنابراین Good Suffix Rule قابل استفاده نیست.
قانون Bad Character بررسی میکند که کاراکتر T در Pattern وجود دارد یا خیر.
اگر وجود داشته باشد:
- Pattern طوری جابهجا میشود که Tهای دو رشته روبهروی هم قرار گیرند.
اگر وجود نداشته باشد:
- Pattern کاملاً از آن موقعیت عبور میکند.
در مثال، Bad Character Rule اجازه میدهد:
- Pattern هفت خانه حرکت کند.
- شش alignment حذف شود.
در یک alignment دیگر ممکن است:
- Bad Character Rule پرش کوچک پیشنهاد دهد.
- Good Suffix Rule پرش بزرگتری پیشنهاد دهد.
مثلاً:
Bad Character:
Skip = 0 alignment
Good Suffix:
Skip = 2 alignments
در این حالت:
- Good Suffix انتخاب میشود.
- Pattern سه موقعیت جلو میرود.
در الگوریتم ساده:
- هر alignment بررسی میشود.
- هیچ alignment حذف نمیشود.
- تقریباً تمام کاراکترهای Text بررسی میشوند.
در Boyer-Moore:
- برخی alignmentها کاملاً حذف میشوند.
- بعضی کاراکترهای Text حتی هرگز بررسی نمیشوند.
در یک اجرای Boyer-Moore:
- 15 alignment بدون بررسی حذف شدند.
- تعدادی از کاراکترهای Text اصلاً وارد مقایسه نشدند.
این همان دلیل اصلی سرعت بیشتر Boyer-Moore است.
در پیادهسازی واقعی Boyer-Moore، مقدار پرش قوانین از قبل محاسبه و در جدول ذخیره میشود.
در مثالهای آموزشی، مقدار پرش را با نگاه کردن به Pattern و Text پیدا میکنیم.
اما در برنامه واقعی:
- تعداد مقایسهها بسیار زیاد است.
- محاسبه دوباره پرشها زمانبر است.
بنابراین قبل از شروع جستجو:
- Pattern بررسی میشود.
- جدولهای لازم ساخته میشوند.
- هنگام mismatch مقدار پرش سریعاً از جدول خوانده میشود.
این جدول مقدار پرش را برای Bad Character Rule ذخیره میکند.
برای استفاده از جدول به دو اطلاعات نیاز داریم:
مثلاً:
Pattern = TCGC
G در موقعیت 2 mismatch داده است.
پس ستون مربوط به offset 2 انتخاب میشود.
مثلاً:
Text character = T
پس ردیف مربوط به T انتخاب میشود.
مقدار داخل جدول:
- تعداد alignmentهایی است که میتوان حذف کرد.
برای اجرای کامل 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 وابسته هستند.
چرا Boyer-Moore از Naive Matching سریعتر است؟
پاسخ:
زیرا Boyer-Moore با استفاده از اطلاعات mismatch، alignmentهایی را که امکان تطبیق ندارند حذف میکند و تعداد مقایسهها را کاهش میدهد.
وقتی Bad Character Rule و Good Suffix Rule مقدارهای متفاوتی برای shift پیشنهاد دهند چه اتفاقی میافتد؟
پاسخ:
بیشترین مقدار shift انتخاب میشود تا بیشترین تعداد alignment ممکن حذف شود.
چرا برای اجرای Boyer-Moore از Lookup Table استفاده میکنیم؟
پاسخ:
زیرا محاسبه مقدار پرش در هر mismatch زمانبر است. جدولها اجازه میدهند مقدار پرش سریعاً پیدا شود.
برای ساخت جدولهای Boyer-Moore چه اطلاعاتی لازم است؟
پاسخ:
فقط Pattern لازم است. Text در ساخت این جدولها نقشی ندارد.
اگر 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) است.
این عناصر تکراری در بسیاری از روشهای تحلیل ژنومی، بهخصوص:
- همترازی خوانشها (Read Alignment)
- مونتاژ ژنوم (Genome Assembly)
ایجاد مشکل میکنند، زیرا باعث ایجاد ابهام (Ambiguity) در تعیین محل دقیق یک قطعه DNA میشوند.
هدف این درس:
- آشنایی با مفهوم عناصر تکراری در ژنوم
- درک منشأ ایجاد آنها
- فهمیدن اینکه چرا این عناصر برای الگوریتمهای زیستمحاسباتی چالش ایجاد میکنند
عناصر تکراری بخشهایی از DNA هستند که یک توالی مشابه یا تقریباً مشابه، چندین بار در ژنوم ظاهر شده است.
ژنوم انسان مانند یک رشته تصادفی از بازهای DNA نیست. فرایندهای تکاملی در طول زمان باعث ایجاد الگوهای خاصی شدهاند، از جمله:
- تکرار شدن بخشهایی از DNA
- جابهجایی قطعات DNA
- تکثیر بخشهایی از ژنوم
در نتیجه، بخش قابل توجهی از ژنوم انسان شامل توالیهایی است که بارها تکرار شدهاند.
وجود عناصر تکراری باعث میشود الگوریتمها نتوانند همیشه مشخص کنند یک قطعه DNA دقیقاً از کدام قسمت ژنوم آمده است.
Transposable Elements (TEs) قطعاتی از DNA هستند که توانایی حرکت یا تکثیر در بخشهای مختلف ژنوم را دارند.
این عناصر مانند قطعاتی از DNA هستند که میتوانند:
- خود را از یک محل جدا کنند (Cut and Paste)
- از خود نسخههای جدید بسازند و در مکانهای دیگر قرار دهند (Copy and Paste)
این فرایند معمولاً توسط پروتئینهایی مانند:
Transposase
انجام میشود.
Transposase آنزیمی است که به عنصر قابل جابهجایی کمک میکند تا در مکان جدیدی از ژنوم قرار گیرد.
فعالیت طولانیمدت عناصر قابل جابهجایی در تاریخ تکامل باعث شده است بخش بزرگی از ژنوم انسان از این عناصر تشکیل شود.
حدود:
45% از ژنوم انسان
با عناصر قابل جابهجایی پوشیده شده است.
Alu یکی از معروفترین و فراوانترین انواع عناصر تکراری در ژنوم انسان است.
Aluها نوعی عنصر قابل جابهجایی هستند که:
- بیش از یک میلیون نسخه در ژنوم انسان دارند.
- حدود 11% از کل ژنوم انسان را تشکیل میدهند.
به دلیل تعداد بسیار زیاد نسخههای مشابه، تشخیص منشأ یک خوانش DNA که از یک Alu آمده باشد، بسیار دشوار است.
اگر یک sequencing read از داخل یک عنصر Alu گرفته شود، ممکن است بتواند با چندین نقطه مختلف در ژنوم تطبیق پیدا کند.
بنابراین الگوریتم نمیتواند با اطمینان بگوید:
این read دقیقاً از کدام نسخه Alu آمده است.
ابهام یعنی یک read بتواند به چندین مکان مختلف در ژنوم متصل شود و مشخص نباشد محل واقعی آن کجاست.
در مسئله Read Alignment هدف این است که:
یک sequencing read کوتاه را پیدا کنیم و مشخص کنیم در کجای ژنوم قرار دارد.
اگر read از یک بخش منحصربهفرد ژنوم آمده باشد:
- فقط یک محل مناسب پیدا میشود.
- تعیین موقعیت آسان است.
اما اگر read از یک عنصر تکراری آمده باشد:
- چندین محل مشابه وجود دارد.
- الگوریتم نمیتواند محل اصلی را تشخیص دهد.
عناصر تکراری یکی از دلایل اصلی دشوار بودن مسئله Read Alignment هستند.
در 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 نیز تکرارها باعث دشوار شدن بازسازی ژنوم میشوند.
پاسخ: زیرا فرایندهای تکاملی باعث ایجاد الگوهای خاصی مانند عناصر تکراری و توالیهای محافظتشده در ژنوم شدهاند.
پاسخ: قطعهای از DNA است که توانایی حرکت یا ایجاد نسخههای جدید از خود در بخشهای مختلف ژنوم را دارد.
پاسخ: زیرا Aluها میلیونها نسخه مشابه در ژنوم دارند و یک read ممکن است بتواند به چندین نسخه مختلف متصل شود، بنابراین محل واقعی آن مشخص نیست.
پاسخ: read منحصربهفرد معمولاً فقط یک محل تطبیق دارد، اما read تکراری ممکن است چندین محل مشابه در ژنوم داشته باشد.
پاسخ: باعث میشوند الگوریتمها نتوانند بهراحتی تعیین کنند قطعات مشابه DNA باید در کدام قسمت ژنوم قرار گیرند، بنابراین مونتاژ دشوارتر میشود.
02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/05_practical-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
الگوریتمی برای پیدا کردن یک الگو (Pattern) در یک متن (Text) که با استفاده از پرشهای هوشمند، تعداد مقایسههای لازم را کاهش میدهد.
در الگوریتم Naive:
- الگو در تمام موقعیتهای ممکن امتحان میشود.
- پس از هر mismatch فقط یک خانه جلو میرویم.
اما در Boyer-Moore:
- موقعیتهای بررسی همچنان از چپ به راست حرکت میکنند.
- اما مقایسه کاراکترها از راست به چپ انجام میشود.
- هنگام mismatch، الگوریتم بررسی میکند که آیا میتوان چندین موقعیت را بدون بررسی رد کرد.
در دادههای بزرگ ژنومی که میلیاردها read وجود دارد، کاهش حتی چند مقایسه میتواند باعث افزایش چشمگیر سرعت شود.
مرحلهای قبل از شروع جستجو که در آن اطلاعات لازم برای پرشهای سریع محاسبه میشود.
برای اجرای سریع Boyer-Moore، ابتدا فقط با استفاده از Pattern جدولهایی ساخته میشوند.
این جدولها شامل اطلاعات مربوط به:
- Bad Character Rule
- Good Suffix Rule
هستند.
نکته مهم:
برای ساخت این جدولها فقط Pattern لازم است و Text نیازی نیست.
به جای اینکه هنگام هر mismatch دوباره محاسبه کنیم چند خانه جلو برویم، مقدار پرش را سریع از جدول پیدا میکنیم.
اگر در هنگام مقایسه یک mismatch رخ دهد، الگو را آنقدر جابهجا میکنیم تا:
- کاراکتر اشتباه در متن با همان کاراکتر در Pattern همراستا شود،
- یا Pattern کاملاً از آن کاراکتر عبور کند.
فرض کنید:
- در Pattern یک کاراکتر داریم که با کاراکتر Text تطبیق ندارد.
- این کاراکتر در Pattern وجود ندارد.
در این حالت هیچ تطبیقی نمیتواند شامل آن کاراکتر باشد، بنابراین میتوانیم Pattern را کاملاً از روی آن عبور دهیم.
اگر آن کاراکتر در Pattern وجود داشته باشد:
- Pattern را جابهجا میکنیم تا نزدیکترین نمونه آن کاراکتر در Pattern زیر mismatch قرار گیرد.
این قانون باعث میشود بسیاری از موقعیتهایی که قطعاً جواب نمیدهند، بررسی نشوند.
اگر بخشی از Pattern با Text تطبیق پیدا کرده باشد و سپس mismatch رخ دهد، Pattern را طوری جابهجا میکنیم که بخش تطبیقیافته دوباره حفظ شود.
در Boyer-Moore هنگام مقایسه از انتهای Pattern شروع میکنیم.
ممکن است:
- چند کاراکتر آخر Pattern با Text تطبیق پیدا کنند.
- سپس یک mismatch رخ دهد.
این بخش تطبیقیافته را:
Good Suffix
مینامیم.
الگوریتم دنبال موقعیتی در Pattern میگردد که:
- همان توالی دوباره ظاهر شده باشد،
- یا یک پیشوند Pattern با آن پسوند تطبیق داشته باشد.
سپس Pattern را به آن موقعیت منتقل میکند.
باعث میشود اطلاعاتی که از تطبیق قبلی به دست آمده، هدر نرود.
حالتی خاص از Good Suffix Rule است که وقتی کل Pattern با Text تطبیق پیدا کرده است، مشخص میکند چقدر میتوانیم جلو برویم تا تطبیق بعدی را پیدا کنیم.
اگر Pattern کاملاً پیدا شد، معمولاً لازم نیست فقط یک خانه جلو برویم.
با استفاده از ساختار Pattern میتوانیم:
- تطبیقهای بعدی را سریعتر پیدا کنیم.
ساختار کلی الگوریتم:
p→ Patternp_bm→ شیء Boyer-Moore شامل اطلاعات پیشپردازشt→ Text
- ایجاد متغیر موقعیت:
i = 0برای نگهداری محل فعلی در Text.
- ایجاد لیست رخدادها:
occurrences = []برای ذخیره محلهایی که Pattern پیدا شده است.
- حرکت روی Text:
تا زمانی که Pattern بتواند داخل Text قرار گیرد:
while i < len(t)-len(p)+1- مقایسه Pattern از راست به چپ:
for j in range(len(p)-1, -1, -1)- در صورت mismatch:
محاسبه:
- مقدار پرش Bad Character
- مقدار پرش Good Suffix
و انتخاب بزرگترین مقدار:
shift = max(shift, skip_bc, skip_gs)- اگر 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 |
فرض کنید Pattern:
TCGC
باشد.
اگر هنگام مقایسه:
- یک کاراکتر در Text برابر T باشد،
- اما این T در بخش مربوطه از Pattern نباشد،
میتوانیم Pattern را جلو ببریم تا این T با جای مناسب خودش در Pattern قرار گیرد.
اگر هیچ T دیگری در Pattern وجود نداشته باشد، Pattern را کاملاً از آن عبور میدهیم.
فرض کنید هنگام مقایسه از راست:
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 است.
پاسخ: Naive در هر mismatch فقط یک خانه جلو میرود، اما Boyer-Moore با استفاده از اطلاعات mismatch میتواند چندین موقعیت را حذف کند.
پاسخ: زیرا این کار امکان استفاده از Good Suffix Rule و Bad Character Rule را فراهم میکند و باعث پرشهای بزرگتر میشود.
پاسخ: هدف آن جابهجایی Pattern به شکلی است که کاراکتر mismatch شده دوباره تطبیق پیدا کند یا Pattern کاملاً از آن عبور کند.
پاسخ: بر اساس بخشهایی از Pattern که قبل از mismatch با Text تطبیق پیدا کردهاند و تلاش میکند این تطبیقها را حفظ کند.
پاسخ: زیرا جدولهای مربوط به قوانین پرش را از قبل محاسبه میکنیم تا هنگام جستجو بتوانیم مقدار shift را سریع پیدا کنیم.
02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/06_lecture-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 نیاز دارد
پیشپردازش یعنی انجام محاسبات اضافی قبل از شروع عملیات اصلی جستجو، بهگونهای که اجرای بعدی سریعتر شود.
در الگوریتمهای تطبیق رشته، معمولاً دو ورودی داریم:
- Pattern (P): رشتهای که دنبال آن میگردیم.
- Text (T): رشتهای که در آن جستجو انجام میشود.
یک الگوریتم میتواند قبل از دریافت کامل مسئله، بخشی از اطلاعات را آماده کند.
مثلاً در Boyer-Moore:
- ابتدا فقط Pattern را دریافت میکنیم.
- روی Pattern پردازش انجام میدهیم.
- جدولهای لازم برای پرشهای سریع ساخته میشوند.
- بعداً وقتی Text دریافت شد، از این جدولها برای جستجوی سریع استفاده میکنیم.
پیشپردازش باعث میشود هزینه اولیه یکبار پرداخت شود و در استفادههای متعدد، زمان زیادی صرفهجویی شود.
یعنی پردازش Pattern قبل از اینکه Text مشخص باشد.
در Boyer-Moore، فقط Pattern پردازش میشود.
از Pattern، جدولهایی ساخته میشود که مشخص میکنند هنگام عدم تطابق:
- چند موقعیت میتوانیم پرش کنیم.
- کدام بخشهای Text را اصلاً بررسی نکنیم.
دو جدول اصلی:
- Bad Character Table
- Good Suffix Table
پس اگر امروز Pattern را داشته باشیم ولی Text را فردا دریافت کنیم، هنوز میتوانیم کاری انجام دهیم.
یعنی هزینه یک عملیات گران را بین چندین استفاده تقسیم کنیم.
فرض کنید یک Pattern مشخص را باید در هزار Text مختلف جستجو کنیم.
اگر هر بار Pattern را دوباره پردازش کنیم، هزینه زیادی داریم.
اما در Boyer-Moore:
- Pattern فقط یکبار پردازش میشود.
- جدولها ذخیره میشوند.
- برای Textهای جدید دوباره استفاده میشوند.
بنابراین هزینه پیشپردازش در طول زمان جبران میشود.
اگر ساخت جدولها ۱ ثانیه طول بکشد:
- برای یک جستجو شاید هزینه زیادی باشد.
- برای یک میلیون جستجو، این هزینه تقریباً ناچیز میشود.
پردازش Text قبل از شروع جستجو برای افزایش سرعت تطبیقهای آینده.
در نگاه اول، پردازش Text سختتر به نظر میرسد، زیرا:
- Pattern معمولاً کوتاه است.
- Text ممکن است بسیار بزرگ باشد.
مثلاً:
- Pattern → یک رشته کوتاه DNA
- Text → کل ژنوم انسان با میلیاردها باز
اما در بعضی شرایط، Text ثابت است و Patternها مرتب تغییر میکنند.
در این حالت، پیشپردازش Text میتواند بسیار مفید باشد.
الگوریتمی که Text را قبل از جستجو پیشپردازش نمیکند.
- Text باید هنگام جستجو بررسی شود.
- نمیتواند از اطلاعات آمادهشده درباره Text استفاده کند.
- هیچ پیشپردازشی ندارد.
- نه Pattern و نه Text را پردازش نمیکند.
بنابراین Online است.
اگرچه پیشپردازش دارد، اما فقط Pattern را پردازش میکند.
بنابراین:
- Pattern preprocessing دارد.
- Text preprocessing ندارد.
پس همچنان یک الگوریتم Online محسوب میشود.
الگوریتمی که نسخهای پیشپردازششده از Text ایجاد میکند.
در Offline Algorithm:
- ابتدا Text بزرگ پردازش میشود.
- ساختاری برای جستجوی سریع ایجاد میشود.
- سپس Patternهای مختلف با سرعت بالا جستجو میشوند.
موتورهای جستجو مانند موتورهای جستجوی وب نمیتوانند هر بار کل اینترنت را بررسی کنند.
اگر چنین کاری انجام دهند:
- هر جستجو باید میلیاردها صفحه را بررسی کند.
- پاسخدهی چندین دقیقه یا ساعت طول میکشد.
در عوض:
- کل وب قبلاً پردازش شده است.
- اطلاعات در یک ساختار نمایهشده ذخیره شده است.
- هنگام جستجو، نتیجه سریع پیدا میشود.
بنابراین موتورهای جستجو Offline هستند.
در Read Alignment هدف این است که مشخص کنیم هر قطعه کوتاه DNA (Read) از کجای ژنوم آمده است.
در این مسئله:
- Pattern = Read
- Text = Reference Genome
زیرا:
- ژنوم مرجع ثابت است.
- 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 است.
ژنوم انسان مانند یک کتاب بسیار بزرگ است.
- ژنوم = Text
- قطعه DNA خواندهشده = Pattern
اگر هر بار بخواهیم کل کتاب را از ابتدا بگردیم، بسیار کند خواهد بود.
بهتر است:
- یک بار کتاب را نمایه کنیم.
- سپس میلیونها قطعه کوتاه را سریع پیدا کنیم.
- پیشپردازش یعنی آمادهسازی اطلاعات قبل از جستجو برای افزایش سرعت.
- Boyer-Moore با پیشپردازش Pattern جدولهای کمکی میسازد.
- هزینه پیشپردازش میتواند بین چندین جستجو تقسیم شود (Amortization).
- Online Algorithm متن را پیشپردازش نمیکند.
- Offline Algorithm نسخه پردازششدهای از Text ایجاد میکند.
- Naive Matching یک الگوریتم Online است.
- Boyer-Moore نیز Online است چون فقط Pattern را پردازش میکند.
- موتورهای جستجو نمونهای از الگوریتمهای Offline هستند.
- در Read Alignment، ژنوم مرجع ثابت است ولی Reads تغییر میکنند.
- بنابراین برای همترازی ژنومی، الگوریتمهای Offline انتخاب مناسبتری هستند.
پاسخ:
پیشپردازش انجام محاسبات قبل از جستجوی اصلی است که باعث میشود عملیاتهای بعدی سریعتر انجام شوند.
پاسخ:
زیرا فقط Pattern را پیشپردازش میکند و Text را قبل از جستجو پردازش نمیکند.
پاسخ:
تفاوت اصلی در این است که آیا Text پیشپردازش میشود یا خیر.
پاسخ:
زیرا Text آنها (کل اینترنت) بسیار بزرگ است و جستجوی مستقیم در هر بار امکانپذیر نیست؛ بنابراین باید قبلاً پردازش و نمایهسازی شود.
پاسخ:
زیرا ژنوم مرجع ثابت است ولی تعداد زیادی Read مختلف باید روی آن تطبیق داده شوند. بنابراین پیشپردازش ژنوم باعث افزایش شدید سرعت میشود.
02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/07_lecture-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 واقعی
الگوریتمی که قبل از انجام جستجو، متن اصلی (Text) را پردازش و آماده میکند.
در مسائل تطبیق رشته، دو جزء اصلی داریم:
- Pattern (P): رشتهای که دنبال آن میگردیم
- Text (T): رشته بزرگی که جستجو روی آن انجام میشود
در الگوریتمهای Offline، ابتدا Text پردازش میشود و یک ساختار کمکی ساخته میشود تا جستجوهای آینده سریعتر شوند.
در Read Alignment:
- Pattern = خوانشهای DNA (Reads)
- Text = ژنوم مرجع
از آنجا که ژنوم مرجع تغییر زیادی نمیکند ولی تعداد زیادی Read مختلف بررسی میشوند، منطقی است که ژنوم را یک بار پردازش کنیم و بارها از آن استفاده کنیم.
بدون Index، برای هر Read باید کل ژنوم بررسی شود که بسیار زمانبر است.
با Index:
- ژنوم یک بار آماده میشود.
- هر Read سریعتر مکان احتمالی خود را پیدا میکند.
ساخت یک ساختار داده که امکان پیدا کردن سریع محل وقوع یک عبارت یا الگو را فراهم میکند.
ایده Indexing شبیه نمایه انتهای کتاب است.
در کتاب:
| کلمه کلیدی | صفحات |
|---|---|
| Memory | 10، 50، 120 |
اگر دنبال کلمه Memory باشیم، لازم نیست کل کتاب را بخوانیم؛ فقط صفحات مشخصشده را بررسی میکنیم.
در ژنوم نیز همین ایده استفاده میشود، اما چون ژنوم شامل کلمات نیست، باید خودمان آن را به قطعات کوچک تقسیم کنیم.
یک زیررشته (Substring) از DNA با طول مشخص k.
مثال:
اگر:
DNA = ACTGAC
و:
k = 3
آنگاه K-merها:
ACT
CTG
TGA
GAC
هستند.
در ساخت Index ژنوم:
- تمام زیررشتههای طول k استخراج میشوند.
- برای هر K-mer، محلهای وقوع آن ذخیره میشود.
مثلاً برای:
k = 5
تمام 5-merهای ژنوم ذخیره میشوند.
K-merها واحدهای کوچک قابل جستجو هستند که باعث میشوند به جای جستجوی کل Read، ابتدا بخش کوچکی از آن بررسی شود.
ساختاری که هر 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 |
فرآیند پرسیدن از Index که یک K-mer در چه مکانهایی دیده شده است.
فرض کنیم Pattern داریم:
P = یک Read DNA
مراحل:
- یک K-mer از Pattern انتخاب میکنیم.
- آن را در Index جستجو میکنیم.
- Index محلهای احتمالی را برمیگرداند.
- در آن محلها بررسی دقیق انجام میدهیم.
بررسی کامل Pattern در محلهایی که Index پیشنهاد داده است.
Index فقط یک سرنخ میدهد.
مثلاً:
Index میگوید:
5-mer موردنظر در موقعیت 100 وجود دارد.
اما هنوز مشخص نیست کل Read در آنجا قرار دارد یا نه.
بنابراین باید:
- تمام کاراکترهای باقیمانده مقایسه شوند.
- تطبیق کامل بررسی شود.
این مرحله Verification نام دارد.
هر موقعیتی که 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 |
کتاب را مانند ژنوم در نظر بگیرید.
بدون Index:
- باید تمام صفحات را بخوانیم تا یک کلمه پیدا کنیم.
با Index:
- کلمه را پیدا میکنیم.
- مستقیم به صفحات مربوط میرویم.
در ژنوم:
- K-mer مانند کلمه کتاب است.
- موقعیتهای K-mer مانند شماره صفحات هستند.
در فروشگاه لازم نیست برای پیدا کردن شیر همه قفسهها را بررسی کنیم.
چرا؟
چون محصولات دستهبندی شدهاند:
- لبنیات
- نوشیدنیها
- شویندهها
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 باعث میشود به جای بررسی کل ژنوم، فقط مناطق احتمالی بررسی شوند.
پاسخ: زیرا ژنوم مرجع ثابت است و بارها با Reads مختلف مقایسه میشود. بنابراین میتوان ژنوم را یک بار پردازش و برای جستجوهای آینده استفاده کرد.
پاسخ: K-mer یک زیررشته از DNA با طول k است. برای مثال، یک 5-mer قطعهای از DNA با پنج نوکلئوتید است.
پاسخ: Index Hit فقط نشان میدهد که یک K-mer در یک موقعیت دیده شده است، اما Match یعنی کل Pattern در آن موقعیت به طور کامل تطبیق دارد.
پاسخ: زیرا ممکن است K-mer موردنظر وجود داشته باشد اما سایر بخشهای Pattern با Text تطبیق نداشته باشند.
پاسخ: میتوانیم نتیجه بگیریم که کل Read نمیتواند در Genome وجود داشته باشد، زیرا هر تطبیق کامل باید شامل آن K-mer باشد.
پاسخ: زیرا به جای بررسی کل ژنوم، ابتدا فقط موقعیتهای احتمالی با استفاده از Index پیدا میشوند و سپس فقط همان نقاط بررسی دقیق میشوند.
02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/08_lecture-ordered-structures-for-indexing
در درس قبل با مفهوم K-mer Index آشنا شدیم؛ ساختاری که تمام K-merهای موجود در یک ژنوم را ذخیره میکند و برای هر K-mer، تمام موقعیتهایی که در ژنوم ظاهر شدهاند را نگه میدارد.
در این درس بررسی میکنیم که چگونه میتوان این Index را بهصورت کارآمد پیادهسازی کرد.
از آنجا که یک K-mer ممکن است در چندین نقطه از ژنوم تکرار شده باشد، ساختار داده موردنیاز باید بتواند یک کلید را به چند مقدار مرتبط کند. این نوع ساختار Multimap نام دارد.
دو روش اصلی برای پیادهسازی Index بررسی میشود:
-
Ordering (مرتبسازی)
- مشابه Index کتاب
- استفاده از ترتیب الفبایی و جستجوی دودویی (Binary Search)
-
Grouping (گروهبندی)
- مشابه دستهبندی محصولات در فروشگاه
در این درس تمرکز اصلی روی روش اول یعنی Ordered Index است.
ساختار دادهای که اجازه میدهد یک کلید به چندین مقدار مرتبط شود.
در یک Map معمولی:
Key → Value
هر کلید معمولاً یک مقدار دارد.
اما در K-mer Index:
K-mer → چندین Offset
زیرا یک K-mer ممکن است بارها در ژنوم تکرار شده باشد.
مثال:
| K-mer | موقعیتها |
|---|---|
| ATG | 5, 100, 250 |
در اینجا:
- کلید = ATG
- مقادیر = موقعیتهای وقوع آن در ژنوم
بنابراین K-mer Index یک Multimap است.
بدون Multimap نمیتوانیم تکرارهای طبیعی موجود در ژنوم را ذخیره کنیم.
نمایهای که عناصر آن بر اساس ترتیب مشخصی مرتب شدهاند.
در این روش:
- تمام K-merهای ژنوم استخراج میشوند.
- برای هر K-mer یک جفت کلید-مقدار ساخته میشود:
(K-mer, Offset)
- تمام این جفتها بر اساس 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 |
اکنون میتوان سریعتر جستجو کرد.
الگوریتمی برای جستجو در یک لیست مرتب که در هر مرحله نصف فضای جستجو را حذف میکند.
در جستجوی خطی:
- از ابتدا شروع میکنیم.
- عنصر به عنصر بررسی میکنیم.
اما در Binary Search:
-
عنصر وسط لیست بررسی میشود.
-
اگر مقدار موردنظر:
- بزرگتر باشد → نیمه اول حذف میشود.
- کوچکتر باشد → نیمه دوم حذف میشود.
-
این فرآیند ادامه پیدا میکند.
فرض کنید دنبال کلمه:
memory
در Index کتاب هستیم.
ابتدا وسط Index را نگاه میکنیم.
اگر کلمه وسط:
light
باشد:
چون:
light < memory
میدانیم memory در نیمه اول نیست.
پس نیمه اول را حذف میکنیم و فقط نیمه دوم را بررسی میکنیم.
هر مرحله از Binary Search که در آن مسئله به دو بخش تقسیم میشود.
در هر مرحله:
اندازه مسئله → نصف
میشود.
اگر Index دارای N کلید باشد، تعداد مراحل لازم تقریباً:
[ log_2(N) ]
است.
زیرا در هر مرحله:
N → N/2 → N/4 → N/8 ...
میشود.
فرض کنیم یک Pattern داریم و یک K-mer از آن استخراج میکنیم.
مثلاً:
Pattern K-mer = TGG
مراحل:
TGG را با عنصر وسط Index مقایسه میکنیم.
مثلاً:
Middle = GTG
چون:
TGG > GTG
نیمه اول حذف میشود.
در نیمه باقیمانده:
TGG
را با عنصر وسط جدید مقایسه میکنیم.
مثلاً:
TGC
چون:
TGG > TGC
دوباره نیمه اول حذف میشود.
به K-mer موردنظر میرسیم.
این موقعیت یک:
Index Hit
محسوب میشود.
موقعیتی که Index گزارش میکند که K-mer موردنظر در آن وجود دارد.
Index فقط میگوید:
«این K-mer در این مکان دیده شده است.»
اما هنوز نمیدانیم کل Read تطبیق دارد یا نه.
بنابراین بعد از Index Hit باید:
- Verification انجام شود.
یک ماژول پایتون برای انجام عملیات مرتبط با Binary Search روی لیستهای مرتب.
ماژول:
bisectشامل توابعی برای پیدا کردن محل مناسب درج یک عنصر در لیست مرتب است.
مهمترین تابع:
bisect_left()محل اولین جایی را پیدا میکند که یک مقدار جدید میتواند در لیست مرتب قرار گیرد بدون اینکه ترتیب خراب شود.
bisect_left(a, x)که:
a= لیست مرتبx= مقدار موردنظر
خروجی:
- اندیس محل درج x
لیست:
[1,3,6,8]
bisect_left(a,2)خروجی:
1
زیرا 2 باید بین 1 و 3 قرار گیرد.
خروجی:
2
زیرا باید بین 3 و 6 قرار گیرد.
خروجی:
3
زیرا اولین محل ممکن قبل از اولین 8 است.
فرض کنید Index مرتب شده داریم:
| K-mer | Offset |
|---|---|
| GTG | 0 |
| GTG | 4 |
| GTG | 6 |
| TGA | 10 |
اگر بخواهیم تمام GTGها را پیدا کنیم:
- از:
bisect_left(index, GTG)استفاده میکنیم.
-
به اولین GTG میرسیم.
-
از آنجا به جلو حرکت میکنیم تا دیگر 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 | تابع جستجوی چپ | پیدا کردن اولین محل درج یک مقدار در لیست مرتب |
کتاب:
Memory → صفحات 10،50،120
مانند:
ژنوم:
ATG → موقعیتهای 5،100،250
است.
در فروشگاه:
- محصولات بر اساس گروهبندی پیدا میشوند.
در 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 فقط یک سرنخ است و نیاز به بررسی نهایی دارد.
پاسخ: زیرا یک K-mer ممکن است چندین بار در ژنوم تکرار شود و باید چندین Offset برای یک K-mer ذخیره شود.
پاسخ: با حذف نصف فضای جستجو در هر مرحله، تعداد مقایسهها را به حدود log₂(N) کاهش میدهد.
پاسخ: تمام K-merهای ژنوم استخراج میشوند، همراه با Offset ذخیره میشوند و سپس بر اساس K-mer مرتب میشوند.
پاسخ: اولین موقعیتی را پیدا میکند که یک مقدار میتواند در یک لیست مرتب وارد شود بدون اینکه ترتیب لیست تغییر کند.
پاسخ: زیرا ممکن است فقط K-mer تطبیق داشته باشد اما بخشهای دیگر Pattern با ژنوم هماهنگ نباشند؛ بنابراین Verification لازم است.
02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/09_lecture-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
Hash Table یک ساختار داده است که برای ذخیره و بازیابی سریع اطلاعات استفاده میشود. این ساختار داده، کلیدها (Keys) را به مقادیر (Values) مرتبط میکند.
در مسئله ایندکسگذاری ژنوم:
- کلید (Key) → یک k-mer مانند
GGGیاTGC - مقدار (Value) → لیست موقعیتهایی (Offsets) که آن k-mer در ژنوم ظاهر شده است.
یک Hash Table شامل:
- آرایهای از Bucketها
- یک تابع هش (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ها در ژنومهای بزرگ بسیار کاربرد دارد.
Multimap ساختاری است که اجازه میدهد یک کلید، چند مقدار داشته باشد.
در یک ژنوم، یک k-mer ممکن است چندین بار تکرار شده باشد.
مثلاً:
GGG → [8, 9, 10]
یعنی k-mer برابر با GGG در موقعیتهای 8، 9 و 10 دیده شده است.
بنابراین:
- یک k-mer
- چندین offset
دارد.
به همین دلیل برای ساخت k-mer index به یک Multimap نیاز داریم.
در مسئله Read Alignment:
وقتی یک read داریم، باید بدانیم بخشهایی از آن در چه نقاطی از ژنوم دیده شدهاند.
Multimap این امکان را فراهم میکند.
تابع هش، تابعی است که یک کلید را گرفته و آن را به یک Bucket مشخص نگاشت میکند.
برای مثال:
Input:
GGG
Hash Function:
GGG → Bucket 3
تابع هش تعیین میکند داده در کجا ذخیره شود.
مزیت اصلی:
هنگام جستجو، لازم نیست کل جدول را بررسی کنیم؛ فقط Bucket مربوط به آن کلید را بررسی میکنیم.
در مثال فروشگاه:
- Bucketها = راهروهای فروشگاه
- Hash Function = قانون تعیین اینکه هر کالا در کدام راهرو قرار گیرد
اگر دنبال شیر باشید:
لازم نیست کل فروشگاه را بگردید؛ فقط به راهروی لبنیات میروید.
Bucket محلی در Hash Table است که دادههای مرتبط در آن ذخیره میشوند.
هر Bucket معمولاً شامل یک لیست از زوجهای:
(Key, Value)
است.
مثلاً:
Bucket 2:
(TGC, 4)
(GGG, 8)
(GGG, 9)
Collision زمانی رخ میدهد که دو کلید متفاوت توسط Hash Function به یک Bucket یکسان نگاشت شوند.
فرض کنید:
AAA → Bucket 3
TGC → Bucket 3
این دو k-mer متفاوت هستند، اما در یک Bucket قرار گرفتهاند.
این اتفاق طبیعی است، زیرا:
- تعداد k-merهای ممکن بسیار زیاد است.
- تعداد Bucketها محدود است.
Collision باعث خراب شدن Hash Table نمیشود، اما:
- جستجو کمی کندتر میشود.
- باید داخل لیست همان Bucket، کلید موردنظر را پیدا کنیم.
Query یعنی پرسیدن از Index که یک k-mer در چه موقعیتهایی در ژنوم وجود دارد.
فرض کنید میخواهیم k-mer زیر را پیدا کنیم:
GGG
مراحل:
-
k-mer را به Hash Function میدهیم.
-
Hash Function Bucket مربوطه را پیدا میکند.
-
فقط همان Bucket بررسی میشود.
-
کلیدهای داخل Bucket مقایسه میشوند.
-
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
در 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 این است که به جای جستجوی کل ژنوم، سریعاً ناحیههای احتمالی تطابق را پیدا کنیم.
پاسخ:
زیرا یک k-mer ممکن است چندین بار در ژنوم تکرار شده باشد و باید بتوانیم چندین offset را برای یک k-mer ذخیره کنیم.
پاسخ:
یک k-mer را دریافت کرده و مشخص میکند که این k-mer در کدام Bucket از Hash Table ذخیره یا جستجو شود.
پاسخ:
وقتی دو k-mer متفاوت توسط Hash Function به یک Bucket یکسان نگاشت شوند، Collision رخ میدهد.
پاسخ:
زیرا به جای بررسی تمام k-merهای موجود، مستقیماً به Bucket مربوطه مراجعه میکند و فقط همان بخش را بررسی میکند.
پاسخ:
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
در این درس، یک Substring Index یا k-mer Index برای یک رشته DNA پیادهسازی میکنیم. هدف این ایندکس این است که بتوانیم یک الگوی DNA (Pattern) را سریعتر در یک متن بزرگتر (Text) جستجو کنیم.
ایده اصلی:
- ابتدا متن DNA را پیشپردازش (Preprocessing) میکنیم.
- تمام k-merهای موجود در متن را استخراج کرده و همراه با موقعیتشان ذخیره میکنیم.
- سپس هنگام جستجوی یک Pattern، فقط نواحی احتمالی را بررسی میکنیم.
- در پایان با مرحله Verification بررسی میکنیم که آیا تطابق کامل وجود دارد یا خیر.
این روش در مسائل بزرگ مانند Read Alignment در ژنومیک کاربرد زیادی دارد.
ساختاری دادهای است که برای هر زیررشته مشخص از متن، محلهایی را که آن زیررشته در متن ظاهر شده است ذخیره میکند.
فرض کنید متن 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 نقاط احتمالی تطابق را پیدا میکنیم.
ایندکسی است که تمام زیررشتههای با طول k از متن را ذخیره میکند.
برای ساخت k-mer Index:
- تمام k-merهای متن استخراج میشوند.
- هر k-mer همراه با موقعیت شروع آن ذخیره میشود.
- لیست نهایی مرتب میشود تا جستجو سریعتر شود.
در این پیادهسازی از ساختار زیر استفاده میشود:
(kmer, offset)مثال:
("ACG", 0)
("CGT", 1)
("ACG", 4)مرحلهای که قبل از جستجو انجام میشود تا دادهها برای Query آماده شوند.
در این درس، هنگام ساخت Index:
- متن
tدریافت میشود. - تمام k-merها استخراج میشوند.
- موقعیت هر k-mer ذخیره میشود.
- Index مرتب میشود.
این مرحله ممکن است برای متنهای بسیار بزرگ زمانبر باشد، اما هزینه آن فقط یکبار پرداخت میشود.
اگر بخواهیم چندین Pattern مختلف را روی یک متن جستجو کنیم، همین Index چندین بار استفاده میشود.
الگوریتمی برای پیدا کردن سریع یک مقدار در یک لیست مرتب.
چون Index مرتب شده است، برای پیدا کردن اولین موقعیت یک k-mer از:
bisect_left()استفاده میکنیم.
به جای بررسی تکتک عناصر:
- هر مرحله نصف فضای جستجو حذف میشود.
- زمان جستجو تقریباً:
[ O(log_2(n)) ]
است.
تابعی از ماژول bisect در Python است که محل قرار گرفتن یک مقدار در لیست مرتب را پیدا میکند.
Index شامل Tupleهایی مانند:
(kmer, offset)است.
برای پیدا کردن اولین k-mer موردنظر:
bisect_left(index, (kmer, -1))استفاده میشود.
عدد -1 باعث میشود قبل از تمام offsetها قرار بگیرد و اولین نمونه k-mer پیدا شود.
فرآیندی که طی آن یک Pattern را وارد Index میکنیم تا مکانهای احتمالی آن را پیدا کنیم.
فرض کنید Pattern برابر است با:
P = ACGTA
و:
k = 2
ابتدا اولین k-mer گرفته میشود:
AC
سپس:
ACدر Index جستجو میشود.- تمام offsetهایی که
ACدر آنها دیده شده برگردانده میشوند. - این offsetها کاندیدهای تطابق هستند.
خروجی Query:
مثلاً:
[0,4]
یعنی Pattern ممکن است از این نقاط شروع شده باشد.
بررسی اینکه آیا Pattern کامل در موقعیت پیدا شده واقعاً وجود دارد یا فقط k-mer اولیه تطابق داشته است.
Index فقط تضمین میکند که:
اولین k کاراکتر Pattern
در آن موقعیت وجود دارد.
اما ممکن است ادامه Pattern متفاوت باشد.
بنابراین باید باقی Pattern بررسی شود.
مثال:
Pattern:
ACGT
Index پیدا میکند:
AC
در موقعیت 5 وجود دارد.
اما باید بررسی کنیم:
GT
نیز بعد از آن قرار دارد یا خیر.
موقعیتی که Index گزارش میکند که k-mer در آنجا وجود دارد.
Index Hit الزاماً به معنی Match کامل نیست.
دو حالت ممکن است:
-
Index Hit → Match واقعی
-
Index Hit → عدم تطابق پس از Verification
در این درس یک کلاس Index ساخته میشود که دو وظیفه اصلی دارد:
وظیفه:
- دریافت متن
t - دریافت طول k
- ساخت Index
شبهکد:
for every position i:
extract k-mer
store (k-mer, i)
sort indexوظیفه:
- دریافت Pattern
- پیدا کردن k-mer اول
- جستجوی آن در Index
- برگرداندن offsetهای احتمالی
این تابع تطابق کامل Pattern را انجام میدهد.
ورودی:
- Pattern
p - Text
t - Index ساختهشده
مراحل:
- Query روی Index اجرا میشود.
- مکانهای احتمالی دریافت میشوند.
- باقی Pattern بررسی میشود.
- اگر تطابق کامل بود، 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 استفاده شود.
- این روش برای تحلیل ژنومهای بزرگ بسیار مهم است.
پاسخ:
زیرا ساخت Index یک هزینه اولیه دارد، اما بعد از آن میتوان تعداد زیادی Pattern را سریع جستجو کرد.
پاسخ:
Query فقط مکانهایی را پیدا میکند که k-mer اولیه در آنها وجود دارد، اما Verification بررسی میکند که کل Pattern در آن مکان تطابق دارد.
پاسخ:
تا بتوان از Binary Search برای یافتن سریع k-merها استفاده کرد.
پاسخ:
محل اولین درج ممکن یک مقدار در یک لیست مرتب را پیدا میکند؛ در اینجا برای پیدا کردن اولین k-mer موردنظر استفاده میشود.
پاسخ:
خیر. 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 Index بررسی میشود که هدف آنها بهبود کارایی نمایهسازی برای مسائل مانند Read Alignment است:
-
Sparse k-mer Index (نمایهسازی تنک k-mer) به جای ذخیره تمام k-merهای متن، فقط بخشی از آنها (مثلاً هر دومین یا هر nاُمین k-mer) ذخیره میشوند تا حافظه کمتر و جستجو سریعتر شود.
-
Subsequence Index (نمایهسازی زیرتوالیها) به جای استفاده از زیررشتههای پیوسته (Substring) از زیرتوالیهای غیرپیوسته (Subsequence) برای ساخت کلیدهای نمایه استفاده میشود تا قدرت فیلتر کردن افزایش یابد.
هدف اصلی این تغییرات، ایجاد تعادل بین:
- سرعت جستجو
- مصرف حافظه
- احتمال از دست دادن تطابقهای صحیح
- کاهش تطابقهای کاذب
است.
در 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:
چون تعداد k-merهای ذخیرهشده کمتر است، فضای کمتری نیاز دارد.
اگر از Binary Search استفاده کنیم، تعداد عناصر کمتر باعث میشود تعداد تقسیمهای لازم کاهش یابد.
برای مثال:
اگر اندازه index نصف شود:
- تقریباً یک مرحله از Binary Search کم میشود.
کاهش تعداد k-merها ممکن است باعث شود برخی تطابقها پیدا نشوند.
مثال:
فرض کنید الگوی P دارای تطابقی در متن است.
اگر فقط اولین k-mer از P را برای Query استفاده کنیم و آن k-mer در index وجود نداشته باشد:
Query → بدون Hit
ممکن است تصور کنیم که P در متن وجود ندارد.
اما اگر k-mer دوم یا سوم را امتحان کنیم، ممکن است تطابق پیدا شود.
برای جلوگیری از از دست دادن تطابقها، فقط یک k-mer از Pattern بررسی نمیشود.
بلکه چند k-mer با موقعیتهای مختلف استفاده میشود.
فرض کنید index شامل k-merهای offset زوج متن است.
برای Pattern:
P = ...
میتوانیم:
- k-mer در offset زوج Pattern
- k-mer در offset فرد Pattern
را بررسی کنیم.
چرا؟
زیرا یکی از آنها احتمالاً با k-merهای ذخیرهشده در index هماهنگ میشود.
این روش محدود به هر دومین k-mer نیست.
میتوانیم انتخاب کنیم:
- هر دومین k-mer
- هر سومین k-mer
- هر چهارمین k-mer
- هر nاُمین 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
تا احتمال پیدا کردن تطابق حفظ شود.
رشتهای که:
- از کاراکترهای پشت سر هم یک رشته اصلی ساخته شده باشد.
مثال:
رشته:
AAGCTTAG
زیررشته:
GCT
است، زیرا کاراکترها کنار هم قرار دارند.
رشتهای که:
- ترتیب کاراکترها حفظ شده باشد،
- اما کاراکترها لازم نیست پشت سر هم باشند.
مثال:
رشته:
AAGCTTAG
زیرتوالی:
AAGT
است.
زیرا:
A (offset 0)
A (offset 1)
G (offset 5)
T (offset 7)
انتخاب شدهاند.
اما:
AAGT
یک substring نیست، چون این حروف پشت سر هم نیستند.
نکته مهم:
هر Substring یک Subsequence است
اما:
هر Subsequence الزاماً Substring نیست
در این روش به جای استخراج k-merهای پیوسته از متن، یک الگوی انتخاب کاراکتر (Shape) تعریف میکنیم.
فرض کنید الگو این باشد:
XX-X-XX
یعنی:
- دو کاراکتر بردار
- یکی را رد کن
- یکی بردار
- یکی را رد کن
- دو کاراکتر بعدی را بردار
از متن:
G C A T T G A
کاراکترهای انتخابشده:
G C T G A
به عنوان کلید index ذخیره میشوند.
برای جستجوی Pattern:
- همان Shape روی Pattern اعمال میشود.
- Subsequence استخراج میشود.
- در index جستجو میشود.
مثلاً:
Pattern:
G C A T T G
با Shape:
XX-X-XX
به:
GCTTG
تبدیل میشود.
سپس در index جستجو میشود.
Specificity یعنی:
چقدر یک Index Hit احتمال دارد واقعاً به یک Match کامل منجر شود.
اگر از 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 استفاده میشود |
مانند این است که به جای شمارهگذاری تمام صفحات یک کتاب، فقط صفحات زوج را فهرست کنیم.
مزیت:
- فهرست کوچکتر است.
عیب:
- ممکن است موضوعی در صفحات فرد پیدا نشود.
برای حل مشکل، چند صفحه با الگوهای مختلف بررسی میکنیم.
مانند این است که به جای بررسی تمام کلمات یک جمله، فقط حروف خاصی را انتخاب کنیم.
اگر این حروف با فاصله مشخص انتخاب شوند، احتمال اینکه بهطور تصادفی مشابه باشند کمتر میشود.
- 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 است.
پاسخ: در k-mer Index معمولی تمام k-merهای متن ذخیره میشوند، اما در Sparse Index فقط بخشی از آنها مانند هر دومین یا هر nاُمین k-mer ذخیره میشوند.
پاسخ: زیرا ممکن است k-mer انتخابشده از Pattern در index وجود نداشته باشد، حتی اگر Pattern کامل در متن وجود داشته باشد.
پاسخ: با Query کردن چند k-mer از Pattern که در دستههای offset متفاوت قرار دارند.
پاسخ: Substring باید شامل کاراکترهای پشت سر هم باشد، اما Subsequence فقط ترتیب کاراکترها را حفظ میکند و میتواند فاصله داشته باشد.
پاسخ: زیرا الگوی انتخابی پیچیدهتر است و احتمال اینکه بهصورت تصادفی در نقاط مختلف ژنوم تکرار شود کمتر است؛ بنابراین Hitهای کاذب کاهش مییابند.
02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/12_lecture-genome-indexes-used-in-research
در این درس، کاربرد ساختارهای ایندکس (Indexing Structures) در تحلیل توالیهای زیستی، بهخصوص مسئله همترازی خوانشها (Read Alignment) بررسی میشود.
ایده اصلی این است که به جای جستجوی مستقیم در یک ژنوم بسیار بزرگ، ابتدا ژنوم را پیشپردازش (Preprocess) کنیم و یک ساختار دادهای بسازیم که امکان جستجوی سریع را فراهم کند.
در این درس چند نوع ایندکس ژنومی معرفی میشوند:
- K-mer Index
- Subsequence Index
- Suffix Array
- Suffix Tree
- FM Index
هدف یادگیری:
- درک نقش ایندکسها در تحلیل ژنوم
- شناخت تفاوت روشهای مختلف ذخیرهسازی و جستجوی ژنوم
- آشنایی با ساختارهایی که در ابزارهای واقعی همترازی مانند Bowtie و BWA استفاده میشوند
Genome Indexing فرآیندی است که طی آن ژنوم مرجع قبل از جستجو پردازش میشود تا بتوان توالیهای جدید را سریعتر در آن پیدا کرد.
در مسئله Read Alignment، ما تعداد زیادی خوانش کوتاه (Short Reads) داریم و میخواهیم محل مناسب آنها را در یک ژنوم مرجع پیدا کنیم.
از آنجا که:
- ژنوم مرجع ثابت است.
- خوانشها در هر آزمایش تغییر میکنند.
منطقی است که ژنوم را یک بار پردازش کنیم و یک ایندکس بسازیم.
این ایده مشابه موارد زیر است:
- ایندکس کتاب برای پیدا کردن کلمات
- موتورهای جستجو برای پیدا کردن صفحات وب
بدون ایندکس، باید کل ژنوم برای هر خوانش بررسی شود که بسیار کند است.
یک ساختار داده که تمام زیررشتههای طول K از ژنوم را ذخیره کرده و محل وقوع آنها را نگهداری میکند.
در K-mer Index:
- تمام رشتههای طول K از ژنوم استخراج میشوند.
- هر K-mer همراه با موقعیت (Offset) آن ذخیره میشود.
مثلاً:
ژنوم:
ACGTAC
برای K=3:
ACG → offset 0
CGT → offset 1
GTA → offset 2
TAC → offset 3
هنگام جستجوی یک Pattern:
- یک K-mer از Pattern استخراج میشود.
- در Index جستجو میشود.
- موقعیتهای احتمالی پیدا میشوند.
- با Verification بررسی میشود که کل Pattern تطابق دارد یا خیر.
K-mer Index یکی از سادهترین روشها برای:
- Read Alignment
- Sequence Analysis
است.
نسخهای از 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 کاهش مییابد.
نوعی Index که به جای ذخیره Substringهای پیوسته، از Subsequenceهای غیرپیوسته استفاده میکند.
بخش پیوستهای از رشته است.
مثال:
ABCDEFG
Substring:
CDE
زیرا حروف پشت سر هم هستند.
حروفی هستند که:
- ترتیبشان حفظ شده
- اما الزاماً کنار هم نیستند
مثال:
ABCDEFG
Subsequence:
ACEG
زیرا:
A → C → E → G
وجود دارند ولی پیوسته نیستند.
Subsequenceها معمولاً Specificity بیشتری ایجاد میکنند.
یعنی:
وقتی Index Hit ایجاد میشود، احتمال اینکه واقعاً یک Match کامل باشد بیشتر است.
به عبارت دیگر:
درصد بیشتری از Index Hitها به Match واقعی تبدیل میشوند.
خانوادهای از ساختارهای داده که تمام Suffixهای یک متن را سازماندهی میکنند.
Suffix یعنی بخشی از رشته که از یک نقطه شروع شده و تا انتهای رشته ادامه دارد.
مثلاً:
رشته:
BANANA
Suffixها:
BANANA
ANANA
NANA
ANA
NA
A
ساختاری که تمام Suffixهای ژنوم را به ترتیب الفبایی مرتب کرده و فقط موقعیت شروع آنها را ذخیره میکند.
اگر خود Suffixها ذخیره شوند، حجم بسیار بزرگی ایجاد میشود.
برای ژنوم انسان:
- طول ژنوم ≈ 3 میلیارد باز
- ذخیره همه Suffixها غیرعملی است.
به جای ذخیره رشته کامل:
فقط Offset ذخیره میشود.
مثلاً:
به جای:
AACGT...
ذخیره میکنیم:
position = 10024
و برای مشاهده رشته واقعی، به ژنوم اصلی مراجعه میکنیم.
حجم Suffix Array:
[ O(N) ]
است.
یعنی با طول ژنوم به صورت خطی افزایش مییابد.
در حالی که ذخیره واقعی Suffixها:
[ O(N^2) ]
حجم نیاز دارد.
ساختاری که Suffixهای ژنوم را با روش Grouping سازماندهی میکند.
| ساختار | روش سازماندهی |
|---|---|
| Suffix Array | Ordering (مرتبسازی) |
| Suffix Tree | Grouping (گروهبندی) |
Suffix Array:
مانند Index کتاب است:
- همه چیز مرتب شده است.
Suffix Tree:
مانند راهروهای فروشگاه است:
- موارد مشابه کنار هم قرار گرفتهاند.
مزیت:
- جستجوی بسیار سریع
عیب:
- مصرف حافظه زیاد
یک ساختار بسیار فشرده برای Index کردن ژنوم که بر پایه:
Burrows-Wheeler Transform (BWT)
ساخته میشود.
روشی که ابتدا برای فشردهسازی دادهها طراحی شد.
اما بعدها مشخص شد که میتوان از آن برای ساخت Indexهای بسیار کوچک استفاده کرد.
مزیت اصلی:
- حجم بسیار کم
- امکان ذخیره ژنوم در حافظه RAM
به همین دلیل در ابزارهای مدرن Read Alignment بسیار محبوب است.
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:
مستقیماً به بخش مرتبط میرویم.
دو روش سازماندهی داده:
مانند فهرست الفبایی کتاب:
A
B
C
D
مانند راهروهای فروشگاه:
لبنیات
نوشیدنی
مواد شوینده
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 استفاده میکنند.
- هدف اصلی همه این ساختارها: جستجوی سریع در ژنومهای بسیار بزرگ است.
پاسخ:
زیرا ژنوم بسیار بزرگ است و جستجوی مستقیم در آن برای هر Read بسیار کند خواهد بود. Index اجازه میدهد موقعیتهای احتمالی سریع پیدا شوند.
پاسخ:
Substring باید شامل کاراکترهای پشت سر هم باشد، اما Subsequence فقط ترتیب کاراکترها را حفظ میکند و لازم نیست پیوسته باشد.
پاسخ:
زیرا به جای ذخیره رشتههای کامل، فقط Offset آنها را نگه میدارد و حجم آن از (O(N^2)) به (O(N)) کاهش مییابد.
پاسخ:
FM 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
در درسهای قبل، مسئله Exact Matching (تطبیق دقیق) بررسی شد؛ یعنی پیدا کردن الگو (Pattern) در متن (Text) زمانی که تمام کاراکترها دقیقاً برابر باشند.
اما در مسائل واقعی زیستمحاسباتی، مانند Read Alignment، تطبیق کاملاً دقیق کافی نیست؛ زیرا بین خوانشهای توالییابی (Sequencing Reads) و ژنوم مرجع (Reference Genome) ممکن است اختلاف وجود داشته باشد.
دلایل اصلی این اختلاف:
- خطاهای دستگاه توالییابی (Sequencing Errors)
- تفاوت ژنوم فرد مورد مطالعه با ژنوم مرجع (Genetic Variation)
بنابراین به الگوریتمهایی نیاز داریم که بتوانند Approximate Matching (تطبیق تقریبی) انجام دهند؛ یعنی وجود برخی اختلافها را بپذیرند.
هدف یادگیری این درس:
- شناخت انواع اختلاف بین دو توالی
- آشنایی با معیارهای فاصله بین رشتهها
- درک تفاوت Hamming Distance و Edit Distance
- آشنایی با تغییر الگوریتم Exact Matching برای تطبیق تقریبی
روشی برای پیدا کردن یک Pattern در یک Text با اجازه دادن به تعداد مشخصی اختلاف.
در Exact Matching:
اگر حتی یک Base متفاوت باشد، تطبیق شکست میخورد.
مثلاً:
Pattern:
ACGT
Text:
ACGA
این دو برابر نیستند.
اما در Approximate Matching:
میتوان گفت این دو توالی با یک اختلاف تطبیق دارند.
در دادههای واقعی DNA، تطبیق دقیق معمولاً کافی نیست، زیرا:
دستگاه Sequencer ممکن است یک باز را اشتباه تشخیص دهد.
مثلاً:
ژنوم واقعی:
ACGT
Read:
ACGA
اختلاف ناشی از خطای توالییابی است.
ژنوم فرد مورد مطالعه دقیقاً مشابه Reference Genome نیست.
حتی دو انسان غیرمرتبط نیز حدود:
- 99.8 تا 99.9 درصد شباهت ژنتیکی دارند.
اما کاملاً یکسان نیستند.
برای مقایسه دو رشته، چند نوع تغییر مهم وجود دارد.
تغییر یک کاراکتر به کاراکتر دیگر.
مثال:
P: ACGT
T: ACCT
در موقعیت سوم:
G → C
یک Substitution رخ داده است.
اضافه شدن یک کاراکتر به یک رشته نسبت به رشته دیگر.
مثال:
P: ACGGT
T: ACGT
در Pattern یک G اضافه وجود دارد.
این تغییر به صورت یک Gap نمایش داده میشود.
حذف شدن یک کاراکتر از یک رشته نسبت به رشته دیگر.
مثال:
P: ACGT
T: ACGGT
در Pattern یک G حذف شده است.
تعداد حداقل جایگزینیها (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 مناسب است.
حداقل تعداد عملیات لازم برای تبدیل یک رشته به رشته دیگر.
عملیات مجاز:
- Substitution
- Insertion
- Deletion
| ویژگی | 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
الگوریتم Naive Exact Matching قبلاً با این منطق کار میکرد:
- کاراکترها را مقایسه کن.
- اگر یک اختلاف دیدی، آن Alignment را رد کن.
اما برای Approximate Matching:
نباید با اولین اختلاف متوقف شویم.
الگوریتم جدید:
- یک Alignment را شروع میکنیم.
- تعداد Mismatchها را شمارش میکنیم.
- اگر تعداد اختلافها از حد مجاز بیشتر شد، آن Alignment رد میشود.
- در غیر این صورت ادامه میدهیم.
فرض کنیم:
حداکثر اختلاف مجاز:
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 | همترازی | قرار دادن دو رشته برای مقایسه |
فرض کنید دو کلمه روی کاغذ نوشته شدهاند.
فقط اجازه دارید حروف را عوض کنید.
مثلاً:
CAT
CUT
یک حرف تغییر کرده است.
علاوه بر تغییر حرف، اجازه دارید:
- حرفی اضافه کنید.
- حرفی حذف کنید.
مثلاً:
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 تطبیق دارد.
پاسخ:
زیرا Readها ممکن است به دلیل خطاهای توالییابی یا تفاوتهای ژنتیکی با ژنوم مرجع دقیقاً یکسان نباشند.
پاسخ:
Hamming Distance فقط Substitution را شمارش میکند و طول رشتهها باید برابر باشد؛ اما Edit Distance شامل Substitution، Insertion و Deletion است و طول رشتهها میتواند متفاوت باشد.
پاسخ:
تبدیل:
ACGT
به:
ACGA
که در آن C یا G جایگزین نشده، بلکه T به A تغییر کرده است، یک Substitution است.
پاسخ:
زیرا یک اختلاف ممکن است قابل قبول باشد. باید تعداد کل اختلافها شمرده شود و فقط زمانی رد شود که از حد مجاز بیشتر شود.
پاسخ:
زیرا علاوه بر جایگزینی، امکان اضافه شدن یا حذف شدن کاراکترها را نیز در نظر میگیرد.
02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/14_lecture-pigeonhole-principle
در تطبیق تقریبی (Approximate Matching) هدف پیدا کردن الگو (Pattern) در متن (Text) است، حتی زمانی که بین آنها چند اختلاف وجود داشته باشد. مشکل اصلی این است که الگوریتمهای تطبیق دقیق (Exact Matching) مانند Naive Matching، Boyer-Moore و روشهای مبتنی بر ایندکس، فقط زمانی کار میکنند که الگو کاملاً با متن یکسان باشد.
در این درس، یک ایده مهم معرفی میشود که اجازه میدهد از همین الگوریتمهای تطبیق دقیق برای حل مسئله تطبیق تقریبی استفاده کنیم. این ایده Pigeonhole Principle یا اصل لانه کبوتری نام دارد.
هدف یادگیری:
- تبدیل مسئله تطبیق تقریبی به چند مسئله کوچکتر تطبیق دقیق
- استفاده از الگوریتمهای Exact Matching برای پیدا کردن تطبیقهایی با چند اختلاف
- درک نقش تقسیمبندی الگو (Pattern Partitioning) در الگوریتمهای Bioinformatics
تطبیق تقریبی یعنی پیدا کردن محلهایی که یک الگو در متن وجود دارد، حتی اگر چند تفاوت بین آنها وجود داشته باشد.
در دادههای ژنومی، معمولاً خوانشها (Reads) دقیقاً با ژنوم مرجع (Reference Genome) یکسان نیستند. دلیل این تفاوتها میتواند شامل موارد زیر باشد:
- خطاهای دستگاه توالییابی (Sequencing Errors)
- تفاوتهای واقعی بین ژنوم فرد مورد مطالعه و ژنوم مرجع (Genetic Variation)
بنابراین، به جای تطبیق کاملاً دقیق، باید اجازه دهیم تعداد مشخصی اختلاف وجود داشته باشد.
در مسئلههایی مانند:
- Read Alignment
- Mapping DNA Reads
- Variant Detection
استفاده میشود.
تقسیم یک الگو به چند بخش مستقل که مجموعاً کل الگو را تشکیل میدهند.
فرض کنید الگو:
[ P ]
را به دو قسمت تقسیم کنیم:
[ P = u + v ]
که در آن:
- u: بخش اول
- v: بخش دوم
این بخشها:
- همپوشانی ندارند.
- کل الگو را پوشش میدهند.
این بخشها را Partitions مینامیم.
اگر الگویی با حداکثر k اختلاف در متن وجود داشته باشد، وقتی آن را به k+1 بخش تقسیم کنیم، حداقل یکی از این بخشها باید بدون هیچ تغییری در متن ظاهر شود.
فرض کنید میخواهیم تطبیقی با حداکثر:
[ k ]
تغییر پیدا کنیم.
الگو را به:
[ k+1 ]
قسمت تقسیم میکنیم.
مثلاً:
- برای 1 اختلاف → تقسیم به 2 بخش
- برای 3 اختلاف → تقسیم به 4 بخش
- برای 10 اختلاف → تقسیم به 11 بخش
چرا این کار جواب میدهد؟
زیرا هر اختلاف میتواند حداکثر یک بخش را خراب کند.
اگر:
- 4 اختلاف داشته باشیم.
- الگو را به 5 بخش تقسیم کنیم.
چهار بخش ممکن است تغییر کنند، اما بخش پنجم نمیتواند تغییر کرده باشد.
پس حداقل یک بخش بدون اختلاف باقی میماند.
فرض کنید الگو:
[ P ]
به دو قسمت تقسیم شود:
P = [u][v]
اگر یک تغییر وجود داشته باشد:
حالت اول:
[u تغییر کرده][v سالم]
یا:
[u سالم][v تغییر کرده]
اما نمیتوان هر دو قسمت را خراب کرد، چون فقط یک تغییر داریم.
بنابراین:
حداقل یکی از دو بخش دقیقاً در متن پیدا میشود.
در این حالت:
[ k+1 = 4 ]
پس الگو را به چهار قسمت تقسیم میکنیم:
P = [P1][P2][P3][P4]
چهار تغییر میتوانند حداکثر چهار قسمت را تحت تأثیر قرار دهند.
اما اگر یک تطبیق واقعی با حداکثر سه اختلاف وجود داشته باشد:
حداقل یکی از چهار قسمت بدون تغییر باقی میماند.
فرآیند کلی:
الگو را به:
[ k+1 ]
بخش تقسیم میکنیم.
مثلاً برای حداکثر 4 اختلاف:
P1 | P2 | P3 | P4 | P5
برای هر بخش:
- از یک الگوریتم تطبیق دقیق استفاده میکنیم.
- دنبال وقوع دقیق آن بخش در متن میگردیم.
الگوریتم میتواند باشد:
- Naive Exact Matching
- Boyer-Moore
- Index-based Matching
اگر یک بخش پیدا شد:
مثلاً:
P3
در متن پیدا شد.
این محل یک کاندید احتمالی برای تطبیق کامل الگو است.
مانند روشهای ایندکس:
- فقط پیدا شدن یک بخش کافی نیست.
- باید بررسی کنیم آیا کل الگو در اطراف آن محل با حداکثر 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 فراهم میکند.
پاسخ:
زیرا توالی خوانششده ممکن است به دلیل خطاهای Sequencing یا تفاوت ژنتیکی با Reference Genome کاملاً مشابه نباشد.
پاسخ:
اگر الگویی با حداکثر k اختلاف در متن وجود داشته باشد، وقتی آن را به k+1 بخش تقسیم کنیم، حداقل یکی از بخشها باید بدون اختلاف در متن ظاهر شود.
پاسخ:
طبق رابطه:
[ k+1 ]
باید به:
[ 5+1=6 ]
بخش تقسیم شود.
پاسخ:
زیرا پیدا شدن یک بخش فقط نشان میدهد احتمال وجود تطبیق کامل وجود دارد. باید بررسی کنیم که کل Pattern با تعداد اختلاف مجاز در آن محل وجود دارد.
پاسخ:
با تقسیم Pattern به چند بخش، میتوان هر بخش را با Boyer-Moore به صورت دقیق پیدا کرد و سپس اطراف آن محلها را برای تطبیق تقریبی بررسی کرد.
02_preprocessing-indexing-and-approximate-matching/01_module-2-preprocessing-indexing-and-approximate-matching/15_practical-implementing-the-pigeonhole-principle
در این درس عملی، الگوریتم Approximate Matching با استفاده از الگوریتم Boyer-Moore پیادهسازی میشود. ایده اصلی این است که با استفاده از اصل لانه کبوتری (Pigeonhole Principle)، مسئله تطبیق تقریبی را به چند مسئله کوچکتر Exact Matching تبدیل کنیم.
به جای اینکه کل الگو (Pattern) را با امکان وجود اختلاف بررسی کنیم، آن را به چند بخش تقسیم میکنیم و با استفاده از Boyer-Moore فقط بخشهایی را که باید کاملاً تطبیق داشته باشند پیدا میکنیم. سپس در مرحله Verification بررسی میکنیم که آیا کل الگو با تعداد اختلاف مجاز در آن محل وجود دارد یا خیر.
هدف یادگیری:
- استفاده از Boyer-Moore برای Approximate Matching
- پیادهسازی اصل لانه کبوتری در کدنویسی
- درک مرحله Candidate Generation و Verification
- مدیریت چندین تطبیق تکراری با استفاده از Set
اگر الگویی با حداکثر 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 میکنیم.
تقسیم Pattern به چند بخش کوچکتر برای تبدیل Approximate Matching به Exact Matching.
طول هر بخش تقریباً برابر است با:
[ segment_length=\frac{|P|}{n+1} ]
اما طول Pattern همیشه مضرب دقیق n+1 نیست.
بنابراین:
- بخشهای ابتدایی طول تقریباً برابر دارند.
- بخش آخر ممکن است کمی بزرگتر یا کوچکتر شود.
برای جلوگیری از عبور از انتهای Pattern، در کد از محدود کردن اندیس پایان استفاده میشود.
مرحلهای که قبل از جستجو انجام میشود تا Boyer-Moore بتواند سریعتر تطبیق دهد.
در این مرحله جدولهای زیر ساخته میشوند:
بررسی میکند اگر عدم تطابق رخ داد، چقدر میتوان Pattern را جلو برد.
بر اساس بخشهای تطبیقیافته انتهایی Pattern، پرش مناسب را تعیین میکند.
در این عملی، برای هر Partition از Pattern، یک پیشپردازش Boyer-Moore انجام میشود.
پیدا کردن محلهایی که احتمال وجود تطبیق کامل Pattern در آنها وجود دارد.
برای هر Partition:
- آن بخش از Pattern انتخاب میشود.
- Boyer-Moore روی Text اجرا میشود.
- تمام محلهایی که آن Partition دقیقاً پیدا شده است ذخیره میشوند.
این محلها هنوز پاسخ نهایی نیستند.
آنها فقط:
Candidate Matches
هستند.
بررسی اینکه آیا کل Pattern با تعداد اختلاف مجاز در محل پیدا شده قرار دارد یا خیر.
وقتی یک Partition پیدا شد، باید بررسی کنیم:
- قسمت قبل از Partition
- خود Partition
- قسمت بعد از Partition
آیا مجموع mismatchها کمتر یا مساوی مقدار مجاز است؟
اگر:
[ mismatches \leq n ]
باشد، آن محل یک تطبیق معتبر است.
ساختاری که هر موقعیت را فقط یک بار ذخیره میکند.
ممکن است چند Partition مختلف یک Pattern را در یک محل پیدا کنند.
مثلاً:
برای:
[ n=2 ]
سه Partition داریم.
اگر Pattern دقیقاً در یک محل وجود داشته باشد:
- هر سه Partition ممکن است همان محل را گزارش کنند.
اگر از List استفاده کنیم:
[5,5,5]
دریافت میکنیم.
اما با Set:
{5}
فقط یک نتیجه ذخیره میشود.
- Pattern (P)
- Text (T)
- Maximum mismatches (n)
Pattern به:
[ n+1 ]
بخش تقسیم میشود.
برای هر بخش:
- Boyer-Moore اجرا میشود.
- محلهای تطبیق دقیق ذخیره میشوند.
برای هر محل:
- موقعیت شروع واقعی Pattern محاسبه میشود.
- بررسی میشود که Pattern از ابتدا یا انتهای Text خارج نشده باشد.
- تعداد mismatchها شمارش میشود.
اگر:
[ mismatches \leq n ]
باشد:
محل شروع Pattern به جواب اضافه میشود.
فرض کنید:
Pattern:
P
و میخواهیم تا دو mismatch را قبول کنیم.
پس:
[ n=2 ]
و Pattern به سه بخش تقسیم میشود.
پس از اجرای الگوریتم:
نتیجه:
[0,5]
یعنی Pattern در دو موقعیت پیدا شده است.
دو اختلاف وجود دارد:
- یک mismatch در ابتدای توالی
- یک mismatch در انتهای توالی
پس:
[ mismatches=2 ]
مجاز است.
فقط یک mismatch وجود دارد.
پس:
[ mismatches=1 ]
این تطبیق نیز معتبر است.
اگر مقدار مجاز را کاهش دهیم:
فقط موقعیت 5 باقی میماند.
هیچ نتیجهای وجود ندارد، زیرا تطبیق کاملاً دقیق نداریم.
- الگوریتم 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 استفاده شود.
پاسخ:
زیرا طبق اصل لانه کبوتری، اگر حداکثر n اختلاف وجود داشته باشد، حداقل یکی از n+1 بخشها بدون اختلاف باقی میماند و میتوان آن را با Exact Matching پیدا کرد.
پاسخ:
طبق رابطه:
[ n+1 ]
داریم:
[ 3+1=4 ]
پس Pattern به چهار بخش تقسیم میشود.
پاسخ:
زیرا پیدا شدن یک بخش فقط نشان میدهد احتمال وجود Pattern در آن ناحیه وجود دارد. باید بررسی کنیم که کل Pattern با تعداد mismatch مجاز تطبیق دارد.
پاسخ:
زیرا ممکن است چند Partition یک موقعیت یکسان را گزارش کنند. Set باعث میشود هر موقعیت فقط یک بار ذخیره شود.
پاسخ:
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).
روشی الگوریتمی برای حل مسائل پیچیده با تقسیم آنها به زیرمسئلههای کوچکتر و ذخیره نتایج محاسبات قبلی.
در مسائل مقایسه توالیها، بررسی تمام حالتهای ممکن برای تبدیل یک رشته به رشته دیگر بسیار پرهزینه است.
Dynamic Programming با ساختن یک جدول از نتایج جزئی، بهصورت سیستماتیک بهترین مسیر تبدیل یک توالی به توالی دیگر را پیدا میکند.
در زیستمحاسبات، این روش برای موارد زیر استفاده میشود:
- محاسبه Edit Distance
- همترازی توالیها (Sequence Alignment)
- یافتن بخشهای مشابه بین توالیها
Dynamic Programming پایه بسیاری از ابزارهای تحلیل توالی مانند ابزارهای جستوجوی شباهت توالی است.
حداقل تعداد تغییراتی که لازم است تا یک رشته به رشته دیگر تبدیل شود.
تغییرات مجاز شامل سه نوع عملیات هستند:
-
Substitution (جایگزینی) تغییر یک کاراکتر به کاراکتر دیگر.
مثال:
A → G
-
Insertion (درج) اضافه کردن یک کاراکتر جدید.
مثال:
ACGT → ACGGT
-
Deletion (حذف) حذف یک کاراکتر از رشته.
مثال:
ACGT → ACT
فاصله ویرایشی کمینه تعداد این عملیات برای تبدیل یک توالی به توالی دیگر است.
در دادههای توالییابی، خوانشها (Reads) معمولاً دقیقاً با ژنوم مرجع یکسان نیستند.
دلایل اختلاف:
- خطاهای دستگاه Sequencing
- تفاوت ژنتیکی بین افراد
- وجود جهشها
بنابراین Edit Distance معیار مناسبی برای اندازهگیری شباهت خوانش و ژنوم است.
اندازهگیری میزان شباهت بین دو توالی DNA، RNA یا پروتئین.
در تحلیل زیستی، فقط یافتن تطابق کامل کافی نیست. باید بتوانیم توالیهایی را پیدا کنیم که:
- بسیار شبیه هستند.
- اما دارای تعدادی تغییر کوچک میباشند.
Dynamic Programming امکان تعریف معیارهای انعطافپذیر برای شباهت را فراهم میکند.
برای مثال:
- برخی تغییرات ممکن است جریمه بیشتری داشته باشند.
- برخی تغییرات ممکن است در شرایط زیستی خاص مهم نباشند.
(تطبیق تقریبی با درج و حذف)
یافتن موقعیتهایی که یک الگوی مشخص با متن یا ژنوم با تعداد محدودی تغییر مطابقت دارد.
روشهای قبلی مانند:
- Naive Matching
- Boyer-Moore
- Index-based Matching
بیشتر برای تطبیقهایی مناسب بودند که اختلافها محدود به Mismatch بودند.
اما در مسائل واقعی زیستی ممکن است:
- یک باز اضافه شود.
- یک باز حذف شود.
Dynamic Programming اجازه میدهد این نوع اختلافها نیز در محاسبات وارد شوند.
پیدا کردن بخشهایی از دو توالی که بیشترین شباهت را به یکدیگر دارند.
گاهی دو توالی کامل شبیه نیستند، اما بخشهایی از آنها شباهت زیادی دارند.
این مسئله در بسیاری از ابزارهای تحلیل زیستی مهم است.
مثال:
- پیدا کردن نواحی مشابه در ژنها
- مقایسه پروتئینها
- شناسایی روابط تکاملی
یکی از ابزارهای مشهور در این زمینه:
BLAST (Basic Local Alignment Search Tool)
است.
فرآیند بازسازی یک ژنوم کامل از تعداد زیادی قطعه کوچک 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
سرهمبندی ژنوم مانند حل کردن یک پازل بزرگ است.
- هر 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 پایه بسیاری از روشهای پیشرفته تحلیل توالی است.
پاسخ: زیرا Readها ممکن است به دلیل خطاهای Sequencing یا تفاوت ژنتیکی فرد با ژنوم مرجع دارای اختلاف باشند.
پاسخ: Hamming Distance فقط تعداد جایگزینیها را حساب میکند و دو رشته باید طول برابر داشته باشند؛ اما Edit Distance علاوه بر جایگزینی، درج و حذف را نیز در نظر میگیرد و طول رشتهها میتواند متفاوت باشد.
پاسخ: با ذخیره نتایج محاسبات قبلی، امکان محاسبه سریع فاصله ویرایشی و بهترین همترازی بین توالیها را فراهم میکند.
پاسخ: در Read Alignment، ژنوم مرجع داریم و محل Readها را پیدا میکنیم؛ اما در Genome Assembly، ژنوم مرجع نداریم و باید ژنوم را از Readها بازسازی کنیم.
پاسخ: زیرا باید یک ژنوم بسیار بزرگ را از میلیونها قطعه کوتاه بدون داشتن نقشه مرجع بازسازی کنیم و وجود توالیهای تکراری کار را پیچیدهتر میکند.
03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/02_lecture-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
است.
Edit Distance کمترین تعداد عملیات لازم برای تبدیل یک رشته (String) به رشته دیگر است.
عملیات مجاز:
- Substitution (جایگزینی)
- Insertion (درج)
- Deletion (حذف)
فرض کنید دو رشته داریم:
X = ACGT
Y = AGGT
برای تبدیل X به Y:
C → G
یک عملیات جایگزینی کافی است.
بنابراین:
Edit Distance = 1
اما اگر اجازه داشته باشیم علاوه بر جایگزینی، درج و حذف نیز انجام دهیم، ممکن است تعداد تغییرات کمتر شود.
در دادههای زیستی، توالیها معمولاً دقیقاً برابر نیستند.
دلایل اختلاف:
- خطاهای Sequencing
- تفاوت ژنتیکی افراد
- جهشها
بنابراین Edit Distance معیار مناسبتری برای اندازهگیری شباهت واقعی توالیها است.
تعداد موقعیتهایی که دو رشته هماندازه در آنها با یکدیگر تفاوت دارند.
برای محاسبه Hamming Distance:
- دو رشته را کنار هم قرار میدهیم.
- هر موقعیت را مقایسه میکنیم.
- تعداد اختلافها را میشماریم.
مثال:
X = ACGTA
Y = ACCGA
هر جایگاه متفاوت یک واحد به فاصله اضافه میکند.
| ویژگی | Hamming Distance | Edit Distance |
|---|---|---|
| طول رشتهها | باید برابر باشد | میتواند متفاوت باشد |
| عملیات مجاز | فقط Substitution | Substitution + Insertion + Deletion |
| انعطافپذیری | کمتر | بیشتر |
اگر دو رشته طول یکسان داشته باشند:
[ EditDistance(X,Y) \leq HammingDistance(X,Y) ]
دلیل:
- Hamming فقط اجازه جایگزینی میدهد.
- Edit Distance علاوه بر آن، حذف و درج را نیز اجازه میدهد.
پس ممکن است مسیر کوتاهتری برای تبدیل دو رشته وجود داشته باشد.
فرض کنید دو رشته داریم که Hamming Distance آنها برابر ۱۰ است.
اگر فقط جایگزینی مجاز باشد:
10 substitution
لازم است.
اما اگر اجازه حذف و درج داشته باشیم، ممکن است فقط با:
1 deletion + 1 insertion
به رشته دیگر برسیم.
پس:
Edit Distance = 2
اگر طول دو رشته متفاوت باشد، حداقل فاصله ویرایشی برابر اختلاف طول آنها است.
فرمول:
[ EditDistance(X,Y) \geq |length(X)-length(Y)| ]
فرض کنید:
X = AB
طول = 2
و:
Y = ABCD
طول = 4
قبل از اینکه بتوانیم محتوا را مشابه کنیم، حداقل باید دو کاراکتر اضافه کنیم.
پس:
Edit Distance ≥ 2
برای محاسبه فاصله دو رشته، ابتدا فاصله بین بخشهای کوچکتر آنها را محاسبه میکنیم.
فرض کنید دو رشته داریم:
X = α + C
Y = β + A
که:
- α و β بخشهای ابتدایی رشتهها هستند.
- C و A آخرین کاراکترها هستند.
اگر بدانیم:
EditDistance(α,β)
چقدر است، میتوانیم فاصله کل رشتهها را محاسبه کنیم.
برای تبدیل:
αx → βy
سه حالت ممکن داریم:
ابتدا:
α → β
سپس:
x → y
هزینه:
[ ED(α,β)+δ(x,y) ]
ابتدا:
αx → β
سپس:
اضافه کردن y
هزینه:
[ ED(αx,β)+1 ]
ابتدا:
α → βy
سپس:
اضافه کردن x
هزینه:
[ ED(α,βy)+1 ]
فاصله نهایی برابر کمینه سه حالت است:
[ ED(αx,βy)=min ]
از میان:
- تطبیق/جایگزینی
- حذف
- درج
تابعی برای مشخص کردن اینکه آیا دو کاراکتر برابر هستند یا نه.
فرمول:
[ δ(x,y) ]
اگر:
x == y
آنگاه:
δ = 0
یعنی هیچ جایگزینی لازم نیست.
اگر:
x != y
آنگاه:
δ = 1
یعنی یک جایگزینی لازم است.
رابطه Edit Distance یک تابع بازگشتی است.
یعنی:
برای محاسبه فاصله دو رشته:
- مسئله را به فاصله بین پیشوندهای کوچکتر تبدیل میکنیم.
- همان تابع دوباره برای زیرمسئلهها فراخوانی میشود.
اگر یکی از رشتهها خالی باشد:
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
فرض کنید میخواهید مسیر رسیدن به مقصد را پیدا کنید.
به جای بررسی همه مسیرهای ممکن، ابتدا بهترین مسیرهای کوچکتر را پیدا میکنید و از آنها برای ساخت بهترین مسیر نهایی استفاده میکنید.
- Edit Distance تعداد کمینه تغییرات برای تبدیل دو رشته است.
- Hamming Distance فقط جایگزینیها را حساب میکند.
- Edit Distance شامل درج، حذف و جایگزینی است.
- برای رشتههای برابر:
[ ED \leq HD ]
- Dynamic Programming روش اصلی حل Edit Distance است.
- مسئله به مقایسه Prefixهای کوچکتر تقسیم میشود.
- رابطه بازگشتی Edit Distance سه حالت دارد.
- Delta Function مشخص میکند آیا آخرین کاراکترها برابر هستند.
- اگر یکی از رشتهها خالی باشد، فاصله برابر طول رشته دیگر است.
- الگوریتم بازگشتی ساده است اما محاسبات تکراری دارد.
- نسخه بهینهتر در ادامه با Memoization یا جدول Dynamic Programming معرفی خواهد شد.
پاسخ: Hamming Distance فقط تعداد جایگزینیها را بین دو رشته هماندازه محاسبه میکند، اما Edit Distance شامل جایگزینی، درج و حذف است و محدودیت طول ندارد.
پاسخ: زیرا Edit Distance علاوه بر جایگزینی، اجازه استفاده از حذف و درج را نیز میدهد؛ بنابراین ممکن است با تعداد عملیات کمتر به نتیجه برسد.
پاسخ: بررسی سه حالت:
- تطبیق یا جایگزینی آخرین کاراکترها
- حذف یک کاراکتر
- درج یک کاراکتر
و انتخاب کمینه هزینه این سه مسیر.
پاسخ: بررسی میکند آیا دو کاراکتر آخر برابر هستند یا نه. اگر برابر باشند مقدار صفر و اگر متفاوت باشند مقدار یک برمیگرداند.
پاسخ: زیرا بسیاری از زیرمسئلهها چندین بار محاسبه میشوند و باعث افزایش شدید زمان اجرا میشود. در Dynamic Programming با ذخیره نتایج این مشکل حل میشود.
03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/03_lecture-using-dynamic-programming-for-edit-distance
در این درس، روش محاسبه Edit Distance (فاصله ویرایشی) بین دو رشته با استفاده از Dynamic Programming (برنامهریزی پویا) معرفی میشود.
در درس قبل، یک الگوریتم بازگشتی (Recursive) برای محاسبه فاصله ویرایشی طراحی شد، اما این روش به دلیل انجام محاسبات تکراری بسیار کند بود.
هدف این درس:
- شناخت مشکل الگوریتم بازگشتی ساده
- معرفی ایده اصلی Dynamic Programming
- ساخت یک ماتریس برای ذخیره نتایج زیرمسئلهها
- محاسبه سریع فاصله ویرایشی بین دو توالی
- درک کاربرد این روش در تحلیل توالیهای زیستی
Edit Distance کمترین تعداد عملیات لازم برای تبدیل یک رشته به رشته دیگر است.
عملیات مجاز:
- Substitution (جایگزینی): تغییر یک کاراکتر به کاراکتر دیگر
- Insertion (درج): اضافه کردن یک کاراکتر
- Deletion (حذف): حذف یک کاراکتر
برای مثال، اگر دو رشته داشته باشیم:
X = GCG
Y = GCT
تنها یک جایگزینی لازم است:
GCG → GCT
بنابراین:
Edit Distance = 1
اما برای رشتههایی با طول بیشتر، پیدا کردن کمترین تعداد تغییرات ساده نیست و نیاز به الگوریتم دارد.
برای پیدا کردن فاصله ویرایشی دو رشته:
- مسئله اصلی به مسائل کوچکتر تقسیم میشود.
- فاصله ویرایشی پیشوندهای کوتاهتر محاسبه میشود.
- سپس جواب نهایی ساخته میشود.
اما مشکل اصلی:
یک زیرمسئله ممکن است بارها محاسبه شود.
مثلاً:
EditDistance(A,B)
ممکن است چندین بار با همان ورودی فراخوانی شود، در حالی که نتیجه آن قبلاً محاسبه شده است.
الگوریتم بازگشتی:
- از نظر منطقی درست است.
- اما بسیار کند است.
- برای رشتههای متوسط نیز زمان زیادی نیاز دارد.
مثال:
محاسبه فاصله دو رشته کوتاه ممکن است حدود 30 ثانیه طول بکشد، زیرا هزاران بار یک محاسبه مشابه انجام میشود.
Dynamic Programming یک روش طراحی الگوریتم است که:
- مسئله بزرگ را به زیرمسئلههای کوچکتر تقسیم میکند.
- نتیجه هر زیرمسئله را ذخیره میکند.
- از محاسبه دوباره همان زیرمسئله جلوگیری میکند.
به جای استفاده از فراخوانیهای بازگشتی، یک Matrix (ماتریس) ساخته میشود.
در این ماتریس:
- هر خانه نشاندهنده فاصله ویرایشی بین دو پیشوند است.
- هر مقدار فقط یک بار محاسبه میشود.
فرض کنید دو رشته داریم:
X
Y
ماتریس به شکل زیر ساخته میشود:
- سطرها → کاراکترهای X
- ستونها → کاراکترهای Y
همچنین اولین سطر و ستون مربوط به:
ε
هستند.
ε یعنی رشته خالی (Empty String).
هر خانه:
D[i][j]
نشاندهنده:
فاصله ویرایشی بین پیشوندی از X با طول i و پیشوندی از Y با طول j
است.
مثلاً:
اگر:
X = GCG
Y = GCT
خانه مربوط به این دو پیشوند:
GCG
GCT
مقدار:
1
خواهد داشت.
برای پر کردن هر خانه، سه حالت بررسی میشود:
فرض کنیم:
X = α + x
Y = β + y
یعنی:
- α و β پیشوندهای قبلی هستند.
- x و y آخرین کاراکترها هستند.
فاصله ویرایشی برابر است با کمینه سه حالت:
ابتدا فاصله:
EditDistance(α, β)
را داریم.
سپس:
- اگر x و y برابر باشند → هزینه اضافه صفر است.
- اگر متفاوت باشند → یک جایگزینی لازم است.
این هزینه با تابع:
δ(x,y)
نمایش داده میشود.
تعریف:
δ(x,y)=0 اگر x=y
δ(x,y)=1 اگر x≠y
پس:
D[i-1][j-1] + δ(x,y)
ابتدا رشته اول را کوتاهتر میکنیم:
α+x → β
سپس یک کاراکتر اضافه میکنیم.
هزینه:
D[i][j-1] + 1
برعکس حالت قبل:
α → β+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}
]
برای اولین سطر و ستون:
فاصله بین رشته خالی و یک رشته دیگر برابر طول آن رشته است.
مثلاً:
EditDistance("", "ABC")
برابر است با:
3
زیرا باید سه کاراکتر اضافه کنیم.
بنابراین:
اولین ستون:
0
1
2
3
4
...
اولین ردیف:
0
1
2
3
4
...
قرار میگیرد.
- یک زیرمسئله را بارها حل میکند.
- زمان اجرا بسیار زیاد است.
- هر زوج پیشوند فقط یک بار محاسبه میشود.
- نتیجه در ماتریس ذخیره میشود.
- سرعت بسیار بیشتر است.
- 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 (δ) | تابع دلتا | تعیین میکند دو کاراکتر برابر هستند یا نه |
فرض کنید:
X = GCG
Y = GCT
برای تبدیل X به Y:
GCG
GCT
فقط حرف آخر تغییر میکند:
C → T
پس:
Edit Distance = 1
دو رشته همطول ممکن است:
Hamming Distance = 10
داشته باشند.
اما اگر اجازه درج و حذف داشته باشیم، شاید فقط دو تغییر کافی باشد:
Edit Distance = 2
زیرا حذف و درج میتوانند باعث همتراز شدن بهتر رشتهها شوند.
- Edit Distance کمترین تعداد درج، حذف و جایگزینی برای تبدیل یک رشته به رشته دیگر است.
- Hamming Distance فقط تعداد جایگزینیها را حساب میکند.
- الگوریتم بازگشتی ساده Edit Distance بسیار کند است زیرا محاسبات تکراری انجام میدهد.
- Dynamic Programming با ذخیره نتایج زیرمسئلهها مشکل تکرار را حل میکند.
- ماتریس Edit Distance شامل فاصله بین تمام پیشوندهای دو رشته است.
- مقدار خانه پایین-راست ماتریس، فاصله ویرایشی کل دو رشته است.
- هر خانه با بررسی سه حالت درج، حذف و جایگزینی پر میشود.
- فاصله بین رشته خالی و یک رشته دیگر برابر طول رشته دیگر است.
- Dynamic Programming یکی از تکنیکهای مهم در طراحی الگوریتمهای زیستی است.
- این روش در تحلیل توالیهای DNA و پروتئین کاربرد گسترده دارد.
پاسخ: Hamming Distance فقط تعداد جایگزینیها را بین دو رشته همطول محاسبه میکند، اما Edit Distance علاوه بر جایگزینی، درج و حذف را نیز اجازه میدهد و برای رشتههایی با طول متفاوت هم قابل استفاده است.
پاسخ: زیرا بسیاری از زیرمسئلهها چندین بار با همان ورودی محاسبه میشوند و الگوریتم نتیجههای قبلی را ذخیره نمیکند.
پاسخ: تقسیم مسئله به زیرمسئلههای کوچکتر، ذخیره جواب آنها و استفاده دوباره از نتایج ذخیرهشده برای جلوگیری از محاسبات تکراری.
پاسخ: فاصله ویرایشی بین دو پیشوند مشخص از دو رشته اصلی.
پاسخ: زیرا تبدیل رشته خالی به یک رشته با طول n نیازمند n عملیات درج است.
03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/04_practical-implementing-dynamic-programming-for-edit-distance
در این درس، الگوریتم Edit Distance (فاصله ویرایشی) با استفاده از روش Dynamic Programming (برنامهریزی پویا) در پایتون پیادهسازی میشود.
در درسهای قبل، نسخه بازگشتی (Recursive) الگوریتم فاصله ویرایشی معرفی شد، اما این روش به دلیل محاسبات تکراری بسیار کند بود.
هدف این درس:
-
تبدیل الگوریتم بازگشتی Edit Distance به نسخه Dynamic Programming
-
ساخت ماتریسی برای ذخیره نتایج محاسبات قبلی
-
پر کردن ماتریس با استفاده از سه حالت:
- حذف (Deletion)
- درج (Insertion)
- جایگزینی (Substitution)
-
مقایسه سرعت الگوریتم بازگشتی و برنامهریزی پویا
Dynamic Programming روشی برای حل مسائل است که در آن:
- مسئله به زیرمسئلههای کوچکتر تقسیم میشود.
- جواب هر زیرمسئله ذخیره میشود.
- در صورت نیاز دوباره از همان جواب استفاده میشود.
برای محاسبه فاصله ویرایشی دو رشته:
به جای اینکه بارها فاصله بین پیشوندهای مشابه را محاسبه کنیم، یک ماتریس ایجاد میکنیم و نتایج را ذخیره میکنیم.
این کار باعث میشود هر زیرمسئله فقط یک بار حل شود.
یک ماتریس دوبعدی به نام:
[ D ]
ساخته میشود.
ابعاد ماتریس:
[ (length(x)+1) \times (length(y)+1) ]
است.
دلیل اضافه کردن 1:
زیرا باید حالت رشته خالی (ε) را نیز در نظر بگیریم.
هر خانه:
[ D[i][j] ]
نشاندهنده فاصله ویرایشی بین:
- پیشوندی از رشته
xبا طولi - پیشوندی از رشته
yبا طولj
است.
در پایان:
خانه پایین-راست ماتریس:
[ D[len(x)][len(y)] ]
فاصله ویرایشی کامل دو رشته را نشان میدهد.
اولین ستون نشاندهنده تبدیل یک پیشوند از رشته x به رشته خالی است.
مثلاً:
تبدیل:
ABC
به:
""
نیازمند حذف سه کاراکتر است.
بنابراین:
0
1
2
3
...
در ستون اول قرار میگیرد.
به همین شکل، تبدیل رشته خالی به یک رشته نیازمند عملیات درج است.
مثلاً:
""
→
ABC
نیازمند سه درج است.
پس اولین ردیف نیز:
0 1 2 3 ...
خواهد بود.
برای محاسبه هر خانه، سه مسیر ممکن بررسی میشود.
حرکت از خانه سمت چپ نشاندهنده:
Insertion (درج)
است.
یعنی یک کاراکتر از رشته y اضافه شده است.
فرمول:
[ D[i][j-1]+1 ]
حرکت از خانه بالایی نشاندهنده:
Deletion (حذف)
است.
یعنی یک کاراکتر از رشته x حذف شده است.
فرمول:
[ D[i-1][j]+1 ]
حرکت قطری نشاندهنده:
- تطبیق دو کاراکتر
- یا جایگزینی یک کاراکتر
است.
اگر:
[ x[i-1]=y[j-1] ]
باشد:
هزینه تغییر صفر است:
[ D[i-1][j-1] ]
اما اگر متفاوت باشند:
یک جایگزینی لازم است:
[ D[i-1][j-1]+1 ]
برای هر خانه:
سه مقدار بالا محاسبه میشوند و کوچکترین مقدار انتخاب میشود:
[ D[i][j]=min(horizontal, vertical, diagonal) ]
مراحل اصلی تابع:
یک ماتریس صفر ساخته میشود:
D = matrix of zerosبا اندازه:
(len(x)+1) × (len(y)+1)0,1,2,3,...قرار داده میشود.
ماتریس:
- ردیف به ردیف
- ستون به ستون
پر میشود.
برای هر سلول:
- هزینه حذف
- هزینه درج
- هزینه جایگزینی
محاسبه شده و کمینه انتخاب میشود.
پس از کامل شدن ماتریس:
آخرین خانه بازگردانده میشود:
D[-1][-1]این مقدار همان Edit Distance دو رشته است.
ویژگیها:
- سادهتر برای پیادهسازی
- اما بسیار کند
- دارای محاسبات تکراری زیاد
مثال:
برای دو رشته حدود 10 کاراکتری:
زمان اجرا:
حدود 5 ثانیه
ویژگیها:
- هر زیرمسئله فقط یک بار حل میشود.
- نتایج ذخیره میشوند.
- بسیار سریعتر است.
زمان اجرا در مثال:
حدود:
[ 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 بسیار سریعتر است.
تغییرات مورد نیاز شامل:
- تغییر یک حرف بزرگ و کوچک
- درج یک فاصله (Space)
- درج یک حرف دیگر
مجموع:
3 تغییر
- الگوریتم Recursive برای Edit Distance به دلیل محاسبات تکراری کند است.
- Dynamic Programming با ذخیره نتایج قبلی این مشکل را حل میکند.
- ماتریس D شامل فاصله ویرایشی تمام پیشوندهای دو رشته است.
- اندازه ماتریس برابر
(len(x)+1) × (len(y)+1)است. - ردیف و ستون اول مربوط به تبدیل رشته خالی و با طول رشته مقداردهی میشوند.
- هر خانه با بررسی سه حالت درج، حذف و جایگزینی پر میشود.
- مقدار نهایی Edit Distance در گوشه پایین-راست ماتریس قرار دارد.
- Dynamic Programming سرعت محاسبه را از چند ثانیه به کسری از میلیثانیه کاهش میدهد.
- این روش یکی از ابزارهای مهم در تحلیل توالیهای زیستی است.
پاسخ: زیرا یک زیرمسئله ممکن است بارها با همان ورودی محاسبه شود و الگوریتم نتیجههای قبلی را ذخیره نمیکند.
پاسخ:
زیرا باید حالت رشته خالی (ε) نیز در محاسبات وجود داشته باشد.
پاسخ:
- حرکت افقی → درج یک کاراکتر
- حرکت عمودی → حذف یک کاراکتر
- حرکت قطری → تطبیق یا جایگزینی
پاسخ: در آخرین خانه ماتریس، یعنی خانه پایین-راست:
[ D[len(x)][len(y)] ]
پاسخ: جلوگیری از محاسبات تکراری با ذخیره نتایج زیرمسئلهها، که باعث افزایش چشمگیر سرعت اجرا میشود.
03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/05_lecture-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) را استخراج کنیم.
یافتن محلهایی در یک متن که یک الگو با تعداد مشخصی اختلاف در آنها ظاهر میشود.
در تطبیق دقیق (Exact Matching) انتظار داریم:
[ P = T ]
اما در دادههای زیستی مانند توالیهای DNA، معمولاً اختلاف وجود دارد، زیرا:
- خطاهای Sequencing رخ میدهند.
- ژنوم نمونه با Reference Genome کاملاً یکسان نیست.
بنابراین به جای جستجوی تطبیق کاملاً یکسان، دنبال تطبیقهایی با حداکثر تعداد مشخصی تغییر هستیم.
این روش برای مسائل زیر مهم است:
- Read Alignment
- مقایسه توالیهای DNA
- تحلیل شباهت توالیها
Dynamic Programming روشی الگوریتمی است که یک مسئله بزرگ را به مسائل کوچکتر تقسیم میکند و پاسخ مسائل کوچک را ذخیره میکند تا دوباره محاسبه نشوند.
در روش بازگشتی (Recursive)، برای محاسبه فاصله ویرایشی دو رشته:
- مرتباً همان زیرمسئلهها دوباره محاسبه میشدند.
- زمان اجرا بسیار زیاد میشد.
مثلاً یک جفت prefix ممکن بود هزاران بار دوباره بررسی شود.
یک ماتریس ایجاد میکنیم که:
- هر خانه نشاندهنده فاصله ویرایشی بین دو prefix است.
- هر مقدار فقط یک بار محاسبه میشود.
این کار باعث افزایش شدید سرعت میشود.
برای Approximate Matching یک ماتریس جدید تعریف میکنیم:
- سطرها (Rows): کاراکترهای Pattern یعنی
P - ستونها (Columns): کاراکترهای Text یعنی
T
هر خانه:
[ D[i][j] ]
نشاندهنده فاصله ویرایشی بین:
- پیشوندی از Pattern تا موقعیت
i - پیشوندی از Text تا موقعیت
j
است.
یکی از مهمترین تغییرات نسبت به Edit Distance معمولی، مقداردهی ردیف اول است.
ردیف و ستون اول:
0 1 2 3 4 ...
زیرا فاصله یک رشته خالی با رشتهای به طول n برابر n است.
همان مقدار قبلی:
0
1
2
3
4
...
زیرا هنوز باید فاصله از رشته خالی را محاسبه کنیم.
تماماً صفر:
0 0 0 0 0 ...
ما نمیدانیم Pattern در کجای Text شروع میشود.
اگر ردیف اول را مانند Edit Distance مقداردهی کنیم، الگوریتم به یک موقعیت خاص در Text تمایل پیدا میکند.
قرار دادن صفرها باعث میشود:
- همه Offsetهای ممکن در Text برابر در نظر گرفته شوند.
- الگوریتم بتواند هر نقطهای از Text را به عنوان شروع احتمالی بررسی کند.
پس از مقداردهی اولیه، ماتریس مانند Edit Distance معمولی پر میشود.
برای هر خانه سه مسیر ممکن وجود دارد:
از خانه سمت چپ میآییم.
معادل:
- حذف یک کاراکتر از Text
- Insertion در Pattern
هزینه:
[ D[i][j-1]+1 ]
از خانه بالایی میآییم.
معادل:
- حذف یک کاراکتر از Pattern
- Deletion
هزینه:
[ D[i-1][j]+1 ]
از خانه بالا-چپ میآییم.
اگر کاراکترها برابر باشند:
[ \Delta(x,y)=0 ]
هزینه اضافه ندارد.
اگر متفاوت باشند:
[ \Delta(x,y)=1 ]
یعنی یک substitution داریم.
در نهایت:
[ D[i][j]=min(horizontal,vertical,diagonal) ]
پس از پر کردن ماتریس، برای پیدا کردن تطبیق Pattern در Text:
به آخرین ردیف ماتریس نگاه میکنیم.
دلیل:
آخرین ردیف نشاندهنده تطبیق کل Pattern با بخشهای مختلف Text است.
مثلاً اگر در آخرین ردیف مقدار:
2
وجود داشته باشد:
یعنی Pattern با یک زیررشته از Text با فاصله ویرایشی ۲ تطبیق دارد.
کمترین مقدار در آخرین ردیف:
- بهترین تطبیق تقریبی را نشان میدهد.
Traceback روشی برای پیدا کردن مسیر حرکت در ماتریس است که نشان میدهد چگونه به مقدار نهایی رسیدهایم.
بعد از پیدا کردن مقدار کمینه در آخرین ردیف:
- از آن خانه به عقب حرکت میکنیم.
- بررسی میکنیم که از کدام سلول آمدهایم.
حرکتها معنی زیستی دارند:
| حرکت | معنی |
|---|---|
| قطری | Match یا Substitution |
| افقی | Insertion / Deletion |
| عمودی | Gap |
با دنبال کردن مسیر، شکل Alignment مشخص میشود.
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 | موقعیت شروع | محل شروع تطبیق در متن |
ماتریس را میتوان مانند یک نقشه مسیر در نظر گرفت.
هر خانه نشان میدهد:
اگر تا این نقطه از 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 ترکیب میکنند.
چرا در Approximate Matching ردیف اول ماتریس Dynamic Programming با صفر پر میشود؟
پاسخ: زیرا محل شروع Pattern در Text از قبل مشخص نیست. صفر کردن ردیف اول باعث میشود همه موقعیتهای شروع در Text احتمال یکسان داشته باشند.
Traceback چیست؟
پاسخ: Traceback فرآیندی است که با دنبال کردن مسیر معکوس در ماتریس Dynamic Programming مشخص میکند چگونه مقدار نهایی فاصله ویرایشی به دست آمده و محل دقیق تطبیق و اختلافها را پیدا میکند.
اگر کمترین مقدار در آخرین ردیف ماتریس برابر ۳ باشد، چه مفهومی دارد؟
پاسخ: یعنی Pattern در یکی از بخشهای Text با حداقل ۳ تغییر (Insertion، Deletion یا Substitution) تطبیق پیدا میکند.
چرا 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
در درسهای قبل، الگوریتم Edit Distance با استفاده از Dynamic Programming برای اندازهگیری شباهت بین دو رشته و همچنین یافتن تطابقهای تقریبی در توالیها بررسی شد.
در این درس، مفهوم Edit Distance گسترش داده میشود تا مسائل پیچیدهتر زیستمحاسباتی مانند:
- Global Alignment (همترازی سراسری)
- Local Alignment (همترازی محلی)
حل شوند.
هدف اصلی این بخش، طراحی الگوریتمهایی است که بتوانند:
- تفاوتهای زیستی بین توالیها را با وزنهای مختلف در نظر بگیرند.
- اهمیت انواع مختلف جهشها (Mutation) را در محاسبات لحاظ کنند.
- نواحی مشابه بین دو توالی را پیدا کنند.
این روشها پایه بسیاری از ابزارهای تحلیل توالی مانند ابزارهای Read Alignment و Genome Assembly هستند.
Global Alignment روشی برای یافتن بهترین تطابق بین دو رشته است، بهگونهای که کل طول هر دو رشته در همترازی شرکت داشته باشد.
یعنی هدف این است که:
دو توالی از ابتدا تا انتها با یکدیگر مقایسه شوند.
در Edit Distance ساده، تمام تغییرات هزینه یکسان داشتند:
| نوع تغییر | هزینه |
|---|---|
| Substitution (جایگزینی) | 1 |
| Insertion (درج) | 1 |
| Deletion (حذف) | 1 |
اما در مسائل زیستی، این فرض همیشه درست نیست.
برای مثال:
- بعضی جایگزینیهای نوکلئوتیدی رایجتر از بقیه هستند.
- ایجاد Gap (شکاف ناشی از درج یا حذف) معمولاً کمتر اتفاق میافتد.
بنابراین باید برای هر نوع تغییر، هزینه متفاوتی تعریف کنیم.
ماتریسی که هزینه انواع مختلف تغییرات در توالی را مشخص میکند.
در Global Alignment، به جای استفاده از هزینه ثابت 1، از یک Penalty Matrix استفاده میکنیم.
این ماتریس مشخص میکند:
- تغییر A به G چه هزینهای دارد.
- تغییر A به T چه هزینهای دارد.
- ایجاد یک Gap چه هزینهای دارد.
بنابراین الگوریتم Dynamic Programming فقط یک تغییر کوچک نیاز دارد:
در هنگام پر کردن ماتریس، به جای اضافه کردن عدد ثابت 1، مقدار مناسب از Penalty Matrix خوانده میشود.
این روش اجازه میدهد الگوریتم با واقعیتهای زیستی هماهنگ شود.
مثلاً در DNA:
برخی تغییرات طبیعیتر هستند و باید جریمه کمتری داشته باشند.
برای درک تفاوت هزینه جایگزینیها، ابتدا باید انواع بازهای DNA را بدانیم.
شامل:
- A = Adenine
- G = Guanine
شامل:
- C = Cytosine
- T = Thymine
جایگزینی بین بازهایی از یک گروه مشابه.
مثال:
- A ↔ G
- C ↔ T
جایگزینی بین دو گروه متفاوت.
مثال:
- A ↔ C
- A ↔ T
- G ↔ C
- G ↔ T
از نظر تعداد حالتها:
- Transversionها دو برابر Transitionها هستند.
اما در ژنوم انسان:
- Transitionها تقریباً دو برابر Transversionها رخ میدهند.
بنابراین:
- Transition باید جریمه کمتری داشته باشد.
- Transversion باید جریمه بیشتری داشته باشد.
Indel مخفف:
Insertion + Deletion
یعنی تغییراتی که شامل اضافه یا حذف شدن چند نوکلئوتید هستند.
در مقایسه ژنوم انسانها:
-
نرخ Substitution حدوداً:
1 تغییر در هر 1000 باز
-
نرخ Indel حدوداً:
1 تغییر در هر 3000 باز
است.
بنابراین Indelها کمتر رخ میدهند و معمولاً باید جریمه بیشتری داشته باشند.
Local Alignment به دنبال یافتن:
مشابهترین زیررشتهها (Substrings) در دو رشته مختلف
است.
برخلاف Global Alignment، لازم نیست کل رشتهها با هم مقایسه شوند.
| ویژگی | Global Alignment | Local Alignment |
|---|---|---|
| هدف | مقایسه کل دو رشته | یافتن بهترین بخشهای مشابه |
| محدوده | کل توالی | زیرتوالیها |
| کاربرد | مقایسه دو توالی کامل | پیدا کردن نواحی مشابه |
| خروجی | بهترین همترازی کامل | بهترین همترازی جزئی |
در Local Alignment به جای Penalty Matrix از:
Scoring Matrix
استفاده میشود.
در Penalty Matrix:
- همه تغییرات دارای هزینه منفی هستند.
اما در Scoring Matrix:
- تطابقها امتیاز مثبت دارند.
- تفاوتها امتیاز منفی دارند.
مثال:
| رویداد | امتیاز |
|---|---|
| Match | +5 |
| Substitution | -4 |
| Gap | -6 |
هدف این است که مناطق مشابه امتیاز بالا ایجاد کنند.
در Local Alignment، ماتریس Dynamic Programming کمی متفاوت مقداردهی میشود.
ویژگی مهم:
- بسیاری از خانههای ماتریس مقدار صفر دارند.
علت:
الگوریتم میخواهد فقط بخشهایی را پیدا کند که واقعاً مشابه هستند و از پسزمینه نامشابه جدا میشوند.
روشی برای پیدا کردن مسیر حرکت در ماتریس Dynamic Programming و تعیین:
- محل دقیق همترازی
- نوع تغییرات
- Gapها و Mismatchها
Trace back:
- از خانه پایین-راست شروع میشود.
- تا رسیدن به ابتدای ماتریس ادامه پیدا میکند.
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 | زیررشته | بخشی از یک رشته کامل |
DNA را میتوان مانند دو خانواده باز تصور کرد:
-
خانواده Purine:
- A
- G
-
خانواده Pyrimidine:
- C
- T
اگر تغییر داخل یک خانواده باشد:
مثلاً:
A → G
یک Transition است.
اما اگر بین خانوادهها باشد:
مثلاً:
A → T
یک Transversion است.
فرض کنید دو جمله انگلیسی داریم:
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 کاربرد گسترده دارند.
پاسخ:
Global Alignment کل دو توالی را مقایسه میکند، اما Local Alignment فقط مشابهترین بخشهای دو توالی را پیدا میکند.
پاسخ:
زیرا در Edit Distance همه تغییرات هزینه یکسان دارند، در حالی که در زیستشناسی برخی تغییرات مانند Transition یا Gap احتمال وقوع متفاوتی دارند.
پاسخ:
Transition جایگزینی بین بازهای همگروه است:
- A ↔ G
- C ↔ T
پاسخ:
زیرا در ژنومها کمتر از جایگزینی رخ میدهد و بنابراین تغییر مهمتر و غیرمعمولتری محسوب میشود.
پاسخ:
زیرا الگوریتم باید بتواند از نقاط نامشابه صرفنظر کند و فقط نواحی با شباهت بالا را پیدا کند.
پاسخ:
Trace Back مشخص میکند:
- بهترین همترازی کجاست.
- کدام موقعیتها Match هستند.
- کجا Gap یا Mismatch رخ داده است.
03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/07_practical-implementing-global-alignment
در این درس، الگوریتم 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
- استفاده از هزینههای متفاوت برای انواع جهشها
Global Alignment الگوریتمی است که بهترین تطابق ممکن بین کل دو توالی را پیدا میکند و تمام بخشهای دو رشته را در همترازی قرار میدهد.
Global Alignment همان چارچوب Dynamic Programming در Edit Distance را حفظ میکند، اما یک تفاوت مهم دارد:
در Edit Distance:
[ Penalty = 1 ]
برای همه تغییرات.
اما در Global Alignment:
[ Penalty = \text{مقدار تعیینشده در Penalty Matrix} ]
است.
بنابراین الگوریتم میتواند تفاوتهای زیستی را بهتر مدل کند.
Global Alignment در مواردی استفاده میشود که:
- دو توالی تقریباً همطول هستند.
- میخواهیم کل توالیها را مقایسه کنیم.
- تفاوتهای ژنتیکی بین دو موجود یا دو ژن را بررسی کنیم.
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 |
مثلاً:
A → A
هزینه:
0
زیرا تغییری رخ نداده است.
مثلاً:
A → G
هر دو باز از گروه Purine هستند.
هزینه:
2
مثلاً:
A → C
بازها از گروههای متفاوت هستند.
هزینه:
4
مثلاً:
A → حذف
هزینه:
8
زیرا حذف یا درج معمولاً تغییر بزرگتری محسوب میشود.
تغییر بین بازهای مشابه:
Purine:
- A
- G
و
Pyrimidine:
- C
- T
مثال:
A ↔ G
C ↔ T
تغییر بین گروههای متفاوت:
مثال:
A ↔ C
A ↔ T
G ↔ C
G ↔ T
در ماتریس جریمه:
Transitionها معمولاً هزینه کمتری دارند.
زیرا:
- از نظر زیستی رایجتر هستند.
- تغییر ساختاری کمتری ایجاد میکنند.
| ویژگی | Edit Distance | Global Alignment |
|---|---|---|
| هزینه تغییرات | ثابت | متفاوت |
| Match | 0 | 0 |
| Mismatch | 1 | وابسته به نوع تغییر |
| Gap | 1 | معمولاً بیشتر |
| کاربرد زیستی | محدودتر | دقیقتر |
برای تبدیل Edit Distance به Global Alignment، تنها چند بخش الگوریتم تغییر میکند.
در Edit Distance:
ردیف اول و ستون اول:
0,1,2,3,...
بودند.
اما در Global Alignment:
به جای افزایش ساده یک واحد:
هر خانه با هزینه Gap پر میشود.
مثلاً:
اگر حذف یک باز هزینه 8 داشته باشد:
0,8,16,24,...
خواهیم داشت.
برای پر کردن هر خانه، سه مسیر بررسی میشود:
معادل:
- حذف یا Skip در توالی Y
هزینه:
Cell سمت چپ + Gap penalty
معادل:
- حذف یا Skip در توالی X
هزینه:
Cell بالایی + Gap penalty
معادل:
- Match یا Substitution
هزینه:
از Penalty Matrix گرفته میشود.
مثلاً:
A → G = 2
یا:
G → C = 4
در تبدیل تابع Edit Distance به Global Alignment:
تقریباً تمام ساختار قبلی حفظ میشود.
تغییرات اصلی:
- تعریف الفبای DNA:
alphabet = "ACGT"-
ایجاد Penalty Matrix
-
تغییر مقداردهی اولیه ردیف و ستون
-
استفاده از ماتریس جریمه در حرکتهای:
- افقی
- عمودی
- قطری
-
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 | الفبا | مجموعه کاراکترهای مورد استفاده |
تغییر:
G → C
یک Transversion است.
طبق Penalty Matrix:
Penalty = 4
پس امتیاز همترازی 4 واحد کاهش مییابد.
تغییر:
G → A
یک Transition است.
هزینه:
Penalty = 2
زیرا این تغییر از نظر زیستی محتملتر است.
اگر یک باز حذف شود:
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 تغییر میکند.
پاسخ:
در Edit Distance همه تغییرات هزینه برابر دارند، اما در Global Alignment هزینه هر تغییر با استفاده از Penalty Matrix تعیین میشود.
پاسخ:
زیرا Transitionها از نظر زیستی رایجتر هستند و تغییر ساختاری کمتری در DNA ایجاد میکنند.
پاسخ:
Penalty Matrix مشخص میکند هر نوع Match، Mismatch یا Gap چه مقدار جریمه داشته باشد.
پاسخ:
کمترین هزینه یا بهترین امتیاز برای همترازی کل دو توالی را نشان میدهد.
پاسخ:
سه مسیر:
- افقی (Horizontal)
- عمودی (Vertical)
- قطری (Diagonal)
بررسی میشوند.
03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/08_lecture-read-alignment-in-the-field
در این درس بررسی میکنیم که ابزارهای واقعی Read Alignment چگونه در عمل کار میکنند و چگونه دو ایده مهم را با یکدیگر ترکیب میکنند:
- Indexing (ایندکسگذاری ژنوم) برای پیدا کردن سریع نواحی احتمالی تطابق در ژنوم.
- Dynamic Programming Alignment (همترازی با برنامهریزی پویا) برای بررسی دقیق تطابق تقریبی شامل mismatch، insertion و deletion.
هدف اصلی این بخش، درک دلیل استفاده همزمان از این دو روش در ابزارهای مدرن همترازی ژنومی است. هیچکدام از این روشها بهتنهایی کافی نیستند:
- Index بسیار سریع است اما در برخورد با خطاهای توالی مانند جهشها و شکافها ضعیف است.
- Dynamic Programming بسیار دقیق و انعطافپذیر است اما برای کل ژنوم بسیار کند خواهد بود.
ترکیب این دو روش باعث میشود هم سرعت و هم دقت لازم برای تحلیل دادههای توالییابی فراهم شود.
فرایند پیدا کردن محل احتمالی یک read (قطعه کوتاه DNA حاصل از توالییابی) در یک ژنوم مرجع و تعیین میزان شباهت آن به آن ناحیه.
در دادههای توالییابی، میلیونها read کوتاه تولید میشوند. هدف ابزارهای read alignment این است که برای هر read مشخص کنند:
- این قطعه متعلق به کدام بخش ژنوم است؟
- چند mismatch دارد؟
- آیا insertion یا deletion وجود دارد؟
- بهترین محل تطابق کجاست؟
این کار برای کاربردهایی مانند:
- شناسایی واریانتها (Variant Calling)
- بررسی جهشها
- تحلیل RNA-seq
- مونتاژ ژنوم
ضروری است.
ساخت یک ساختار دادهای که امکان پیدا کردن سریع محلهایی از ژنوم را فراهم میکند که با بخشی از یک read مشترک هستند.
به جای اینکه هر read را با کل ژنوم مقایسه کنیم، ابتدا از یک index استفاده میکنیم تا نقاط احتمالی تطابق را پیدا کنیم.
Index معمولاً اطلاعاتی درباره زیررشتهها (substrings) ذخیره میکند.
فرایند کلی:
- یک read وارد ابزار میشود.
- index بررسی میکند که چه بخشهایی از ژنوم با قسمتهایی از read مشابه هستند.
- چند محل احتمالی بهعنوان candidate location انتخاب میشوند.
- فقط این نواحی کوچک با الگوریتم دقیقتر بررسی میشوند.
Index مانند یک فیلتر سریع عمل میکند.
به جای اینکه:
یک سوزن را در کل انبار کاه جستجو کنیم،
ابتدا چند مکان احتمالی برای سوزن پیدا میکنیم و سپس فقط همان نقاط را بررسی میکنیم.
روشی الگوریتمی برای محاسبه بهترین تطابق بین دو توالی با در نظر گرفتن:
- Substitution (جایگزینی)
- Insertion (درج)
- Deletion (حذف)
در روش Dynamic Programming یک ماتریس ساخته میشود:
- سطرها: بازهای read
- ستونها: بازهای ژنوم
هر خانه نشاندهنده بهترین امتیاز یا فاصله برای یک جفت prefix از دو توالی است.
این روش میتواند:
- mismatch را تشخیص دهد.
- gapها را مدیریت کند.
- برای انواع تغییرات DNA جریمههای متفاوت تعیین کند.
Dynamic Programming مرحله Verification (تأیید) را انجام میدهد.
یعنی بعد از اینکه index چند محل احتمالی را پیدا کرد، بررسی میکند:
آیا این محل واقعاً یک تطابق تقریبی معتبر برای read است؟
مرحلهای که در آن یک تطابق احتمالی پیدا شده توسط index با الگوریتم دقیق بررسی میشود.
Index فقط میگوید:
«احتمالاً این read در این چند نقطه قرار دارد.»
اما نمیتواند به خوبی مشخص کند:
- چند mismatch وجود دارد؟
- آیا gap وجود دارد؟
- کدام تطابق بهترین است؟
بنابراین Dynamic Programming وارد عمل میشود و تطابق کامل را محاسبه میکند.
یافتن بهترین تطابق بین تمام طول دو توالی.
برای مقایسه دقیق read با یک ناحیه مشخص از ژنوم استفاده میشود.
یافتن بهترین زیررشته مشترک بین دو توالی.
زمانی مفید است که فقط بخشی از توالیها مشابه باشند.
- ابزارهای واقعی 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:
- باید کل انبار کاه را بررسی کنیم.
- بسیار کند است.
با 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 بسیار کند است.
- ترکیب این دو روش دلیل اصلی کارایی ابزارهای مدرن همترازی ژنومی است.
پاسخ: زیرا باید برای هر read ماتریس بزرگی با کل ژنوم ساخته شود. از آنجا که ژنوم بسیار طولانی است، این کار زمان بسیار زیادی نیاز دارد.
پاسخ: Index با پیدا کردن محلهای احتمالی تطابق در ژنوم، فضای جستجو را کاهش میدهد و اجازه میدهد الگوریتم دقیق فقط روی بخشهای محدود اجرا شود.
پاسخ: زیرا Index فقط تطابقهای اولیه را پیدا میکند و نمیتواند mismatch، insertion و deletion را بهخوبی ارزیابی کند. Dynamic Programming این بررسی دقیق را انجام میدهد.
پاسخ:
| روش | مزیت | محدودیت |
|---|---|---|
| Index | بسیار سریع | مدیریت ضعیف mismatch و gap |
| Dynamic Programming | بسیار دقیق و انعطافپذیر | بسیار کند روی دادههای بزرگ |
پاسخ:
- استفاده از Index برای یافتن محلهای احتمالی.
- انتخاب candidate locationها.
- اجرای Dynamic Programming برای بررسی دقیق.
- انتخاب بهترین تطابق بر اساس امتیاز alignment.
03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/09_lecture-assembly-working-from-scratch
در این درس دو مسئله اصلی در تحلیل دادههای توالییابی مقایسه میشوند:
- Read Alignment (همترازی خوانشها)
- Genome Assembly / De novo Assembly (مونتاژ ژنوم از ابتدا)
هر دو مسئله زمانی مطرح میشوند که تعداد زیادی read (خوانش توالییابی) در اختیار داریم و میخواهیم بفهمیم این قطعات DNA از کجای ژنوم آمدهاند.
تشبیه اصلی این درس، مسئله پازل است:
- هر read مانند یک قطعه پازل است.
- هدف، کنار هم قرار دادن این قطعات برای بازسازی تصویر اصلی (ژنوم) است.
تفاوت اصلی:
- در Read Alignment تصویر نهایی پازل را داریم (ژنوم مرجع) و فقط باید قطعات را در جای مناسب قرار دهیم.
- در Assembly تصویر نهایی را نداریم و باید خودمان آن را از روی قطعات بازسازی کنیم.
قطعات کوتاهی از DNA هستند که توسط دستگاههای توالییابی تولید میشوند.
در فناوریهای توالییابی، کل ژنوم معمولاً به قطعات کوچکتر تقسیم میشود و دستگاه فقط توالی این قطعات را میخواند.
خروجی یک آزمایش توالییابی مجموعه بزرگی از readها است که باید تحلیل شوند.
این readها مانند قطعات یک پازل هستند که باید برای بازسازی ژنوم اصلی استفاده شوند.
قرار دادن readها روی یک ژنوم مرجع موجود برای پیدا کردن محل اصلی آنها.
در Read Alignment فرض میکنیم که یک نسخه کامل از ژنوم مورد نظر داریم.
مثلاً:
- ژنوم مرجع انسان (Human Reference Genome) موجود است.
- یک read جدید داریم.
- باید پیدا کنیم این read در کدام قسمت ژنوم قرار میگیرد.
فرایند شبیه این است:
یک پازل داریم و تصویر روی جعبه پازل را نیز در اختیار داریم.
در این حالت، تصویر جعبه همان ژنوم مرجع است.
- شناسایی جهشها (Variant Calling)
- مقایسه نمونههای مختلف با ژنوم مرجع
- تحلیل دادههای پزشکی و ژنتیکی
بازسازی یک ژنوم کامل فقط از روی مجموعهای از readها، بدون استفاده از ژنوم مرجع.
- De novo Assembly
- De novo Shotgun Assembly
کلمه:
De novo
به معنی:
از ابتدا / از صفر
است.
در این روش فرض میکنیم ژنوم مرجع موجود نیست.
بنابراین الگوریتم باید:
- شباهت بین readها را پیدا کند.
- آنها را به شکل درست کنار هم قرار دهد.
- توالی اصلی ژنوم را بازسازی کند.
این روش برای موجوداتی ضروری است که:
- قبلاً توالییابی نشدهاند.
- ژنوم مرجع ندارند.
روشی برای بازسازی ژنوم که در آن readها بهصورت تصادفی از بخشهای مختلف ژنوم گرفته شدهاند.
در روش Shotgun:
- ژنوم ابتدا به قطعات کوچک تقسیم میشود.
- قطعات به صورت تصادفی توالییابی میشوند.
- الگوریتم باید با پیدا کردن همپوشانی بین قطعات، ژنوم اصلی را بازسازی کند.
| ویژگی | 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ها
- تصویر جعبه = ژنوم مرجع
حالا تصور کنید:
- فقط قطعات پازل را دارید.
- هیچ تصویری از نتیجه نهایی ندارید.
باید با بررسی شکل و ارتباط قطعات، تصویر کامل را بسازید.
این همان De novo Assembly است.
- دادههای توالییابی معمولاً شامل میلیونها read کوتاه هستند.
- Readها مانند قطعات یک پازل ژنتیکی هستند.
- Read Alignment با استفاده از ژنوم مرجع، محل readها را پیدا میکند.
- Assembly بدون ژنوم مرجع، ژنوم کامل را بازسازی میکند.
- De novo به معنی «از ابتدا» است.
- De novo Shotgun Assembly بر اساس قطعات تصادفی DNA انجام میشود.
- Assembly از Alignment دشوارتر و پرهزینهتر است.
- پروژه Human Genome Project یکی از نمونههای مهم Assembly تاریخی بود.
- بعضی مشکلات Assembly با الگوریتمها حل میشوند، اما برخی محدودیتها بنیادی هستند.
- پیشرفت فناوری توالییابی میتواند Assembly را در آینده بهبود دهد.
پاسخ: در Read Alignment یک ژنوم مرجع داریم و فقط محل readها را پیدا میکنیم، اما در Assembly ژنوم مرجع نداریم و باید خود ژنوم را از روی readها بازسازی کنیم.
پاسخ: روشی برای مونتاژ ژنوم از ابتدا بدون استفاده از ژنوم مرجع است.
پاسخ: زیرا در Assembly الگوریتم باید ساختار کامل ژنوم را بدون داشتن تصویر نهایی بازسازی کند و علاوه بر هزینه محاسباتی زیاد، با مشکلات بنیادی دادههای زیستی روبهرو است.
پاسخ: زیرا هدف آن پیدا کردن محل readها در یک توالی شناختهشده است. بدون ژنوم مرجع، محلی برای مقایسه وجود ندارد.
پاسخ: در Alignment تصویر روی جعبه پازل وجود دارد و فقط باید قطعات را جایگذاری کنیم، اما در Assembly باید بدون تصویر، خودمان پازل را بازسازی کنیم.
03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/10_lecture-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
فرایند بازسازی توالی کامل یک ژنوم از مجموعهای از قطعات کوتاه DNA به نام Reads.
در فناوریهای Sequencing، دستگاه مستقیماً کل ژنوم را نمیخواند، بلکه تعداد زیادی قطعه کوتاه از DNA تولید میکند.
ورودی مسئله اسمبلی:
-
تعداد زیادی Read کوتاه
-
بدون اطلاع از:
- محل هر Read در ژنوم
- توالی واقعی ژنوم
خروجی مورد انتظار:
- بازسازی توالی اصلی ژنوم
این مسئله مانند حل کردن یک پازل است، اما با یک تفاوت مهم:
- در پازل معمولی، تصویر نهایی روی جعبه وجود دارد.
- در Assembly، تصویر نهایی وجود ندارد و باید خودمان آن را از قطعات پیدا کنیم.
Assembly برای موجوداتی که ژنوم مرجع ندارند ضروری است.
مثلاً هنگام تعیین توالی یک گونه جدید، نمیتوان از Reference Genome استفاده کرد و باید از De Novo Assembly کمک گرفت.
بازسازی ژنوم بدون استفاده از ژنوم مرجع.
عبارت De Novo به معنی «از ابتدا» یا «از صفر» است.
در این روش:
- هیچ Reference Genome وجود ندارد.
- ترتیب Readها باید فقط از روی شباهت بین خودشان مشخص شود.
| ویژگی | Read Alignment | De Novo Assembly |
|---|---|---|
| ژنوم مرجع | دارد | ندارد |
| هدف | پیدا کردن محل Read | بازسازی ژنوم |
| سختی محاسباتی | کمتر | بیشتر |
| مثال | قرار دادن قطعات روی نقشه | ساختن نقشه از قطعات |
Coverage میزان اطلاعات تکراریای است که درباره هر بخش از ژنوم داریم.
فرض کنید یک موقعیت خاص از ژنوم توسط چند Read مختلف پوشانده شده باشد.
اگر یک باز DNA توسط 5 Read خوانده شده باشد:
- Coverage آن موقعیت = 5
یعنی پنج مدرک مستقل درباره آن باز داریم.
به بیان دیگر، هر Read مانند یک رأی درباره هویت آن باز عمل میکند.
تعداد Readهایی که یک موقعیت مشخص از ژنوم را پوشش میدهند.
مثال:
اگر در یک موقعیت:
- 3 Read حرف G گزارش کنند.
- 2 Read حرف A گزارش کنند.
Coverage برابر 5 است، اما بین Readها اختلاف وجود دارد.
این اختلاف میتواند ناشی از:
- خطای Sequencing
- تفاوت واقعی بین نسخههای ژنوم باشد.
میانگین Coverage در کل ژنوم.
فرمول:
[ Coverage = \frac{\text{Total length of reads}}{\text{Genome length}} ]
مثال:
اگر:
- مجموع طول Readها = 177 باز
- طول ژنوم = 35 باز
آنگاه:
[ Coverage \approx 5 ]
(در مثال مدرس حدود 7-fold coverage ذکر شده است.)
بخشی مشترک بین دو Read که نشان میدهد احتمالاً از قسمتهای نزدیک ژنوم آمدهاند.
اگر انتهای یک Read (Suffix) شباهت زیادی به ابتدای Read دیگر (Prefix) داشته باشد، احتمال دارد این دو Read در ژنوم اصلی کنار هم قرار داشته باشند.
مثال:
Read A:
ATCGGCTA
Read B:
GGCTAAC
بخش:
GGCTA
در هر دو وجود دارد.
این شباهت نشان میدهد که این دو قطعه احتمالاً روی یک ناحیه از ژنوم همپوشانی دارند.
اگر:
- Suffix یک Read با Prefix یک Read دیگر شباهت زیادی داشته باشد،
آنگاه:
- احتمال دارد این دو Read در ژنوم اصلی با هم Overlap داشته باشند.
این قانون پایهایترین ایده برای کنار هم گذاشتن Readها است.
فرایند:
- پیدا کردن Readهای مشابه
- تشخیص Overlap
- چسباندن Readها به یکدیگر
- ساختن قطعات بزرگتر ژنوم
مانند کنار هم گذاشتن قطعات پازل.
در حالت ایدهآل، Readهای Overlap شده باید کاملاً مشابه باشند، اما در عمل ممکن است اختلاف وجود داشته باشد.
دو دلیل اصلی:
گاهی دستگاه Sequencing یک باز را اشتباه گزارش میکند.
مثال:
ژنوم واقعی:
A C G T
Read تولید شده:
A C A T
در این حالت اختلاف ناشی از خطای آزمایش است.
در موجوداتی مانند انسان:
- هر کروموزوم دو نسخه دارد.
- یک نسخه از مادر و یک نسخه از پدر دریافت میشود.
این دو نسخه کاملاً یکسان نیستند.
بنابراین ممکن است دو Read:
- واقعاً از دو نسخه متفاوت ژنوم آمده باشند.
- در یک موقعیت باز متفاوتی داشته باشند.
در این حالت اختلاف واقعی است، نه خطای Sequencing.
هرچه 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 را به حل یک پازل تشبیه میکند:
- Readها = قطعات پازل
- ژنوم = تصویر نهایی پازل
در Read Alignment:
- تصویر روی جعبه موجود است (Reference Genome).
- فقط باید قطعات را روی آن قرار دهیم.
در De Novo Assembly:
- تصویر وجود ندارد.
- باید خود تصویر را از قطعات بسازیم.
هر 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ها نقش «چسب» برای اتصال قطعات ژنوم را دارند.
پاسخ: در Read Alignment یک ژنوم مرجع وجود دارد و هدف پیدا کردن محل Readها روی آن است. اما در De Novo Assembly هیچ ژنوم مرجعی وجود ندارد و باید خود ژنوم از روی Readها بازسازی شود.
پاسخ: Coverage تعداد Readهایی است که یک موقعیت مشخص از ژنوم را پوشش میدهند. این مقدار نشاندهنده میزان اطلاعات تکراری درباره آن بخش از ژنوم است.
پاسخ: اگر Suffix یک Read با Prefix Read دیگری شباهت زیادی داشته باشد، احتمال دارد این دو Read از بخشهای Overlap شده یک ژنوم آمده باشند.
پاسخ: دو دلیل اصلی وجود دارد:
- خطای Sequencing
- تفاوت واقعی بین نسخههای مختلف ژنوم در موجودات Polyploid مانند انسان
پاسخ: زیرا با افزایش Coverage، Readهای بیشتری از هر بخش ژنوم داریم؛ در نتیجه Overlapهای بیشتر و طولانیتری ایجاد میشود و بازسازی ژنوم دقیقتر خواهد بود.
03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/11_lecture-overlap-graphs
در اسمبلی ژنوم، یکی از مهمترین اطلاعاتی که برای بازسازی توالی اصلی استفاده میکنیم، Overlap بین Readها است. در درسهای قبل یاد گرفتیم که شباهت بین انتهای یک Read و ابتدای Read دیگر میتواند نشاندهنده این باشد که این دو قطعه از بخشهای نزدیک ژنوم آمدهاند.
در این درس، برای مدیریت تعداد زیادی از این روابط، ساختاری به نام Overlap Graph (نمودار همپوشانی) معرفی میشود.
هدف یادگیری این بخش:
- درک مفهوم Graph و Directed Graph
- تبدیل روابط Overlap بین Readها به یک ساختار گرافی
- یادگیری اینکه چگونه مسیر موجود در گراف میتواند توالی اصلی ژنوم را نشان دهد
گراف یک ساختار دادهای برای نمایش مجموعهای از اشیا و ارتباط بین آنها است.
یک گراف از دو بخش اصلی تشکیل میشود:
- Nodes (گرهها)
- Edges (یالها)
در گراف:
- Node نماینده یک شیء یا مفهوم است.
- Edge رابطه بین دو Node را نشان میدهد.
مثال ساده:
در یک شبکه اجتماعی:
- افراد → Nodes
- رابطه دوستی → Edge
در مسئله اسمبلی:
- Readها → Nodes
- Overlap بین Readها → Edge
گراف به ما اجازه میدهد تعداد زیادی رابطه را همزمان نمایش داده و تحلیل کنیم.
در Assembly، به جای بررسی تکتک Overlapها، همه روابط را در یک ساختار واحد ذخیره میکنیم.
گرافی که در آن یالها دارای جهت هستند.
یعنی رابطه از یک Node به Node دیگر مشخص است.
در Directed Graph:
A → B
با:
B → A
یکسان نیست.
جهت یال معنی خاصی دارد.
مثال:
در نمایش روابط نمایشنامه Hamlet:
Hamlet → Polonius
میتواند معنی:
«هملت، پولونیوس را میکشد»
داشته باشد.
اما:
Polonius → Hamlet
معنی متفاوتی خواهد داشت.
در Overlap Graph:
جهت یال نشان میدهد:
- کدام Read دارای Suffix است.
- کدام Read دارای Prefix مشابه است.
یعنی:
Read A → Read B
یعنی:
Suffix مربوط به Read A با Prefix مربوط به Read B همپوشانی دارد.
گرافی که در آن:
- هر Node یک Read است.
- هر Edge نشاندهنده Overlap بین دو Read است.
برای ساخت Overlap Graph:
-
هر Read را به یک Node تبدیل میکنیم.
-
اگر دو Read دارای Overlap باشند:
- یک Edge جهتدار بین آنها رسم میکنیم.
جهت Edge:
از:
Read دارای Suffix
به:
Read دارای Prefix
است.
Overlap Graph ابزاری است برای:
- سازماندهی روابط بین Readها
- پیدا کردن ترتیب صحیح Readها
- بازسازی ژنوم اصلی
حداقل میزان شباهتی که برای پذیرفتن یک Overlap لازم است.
هر شباهتی بین دو Read الزاماً معنیدار نیست.
مثلاً:
اگر فقط یک نوکلئوتید مشترک داشته باشند:
A
A
ممکن است کاملاً تصادفی باشد.
بنابراین باید شرطی تعیین کنیم که فقط Overlapهای معتبر وارد گراف شوند.
برای سادهسازی:
یک Overlap باید:
- کاملاً Exact Match باشد.
- طول آن حداقل 4 نوکلئوتید باشد.
یعنی:
Suffix و Prefix باید:
- بدون اختلاف باشند.
- حداقل 4 باز طول داشته باشند.
Threshold باعث کاهش:
- Overlapهای تصادفی
- پیچیدگی گراف
میشود.
حرکت در مسیر مشخصی از Nodeها برای بازسازی توالی ژنوم.
در یک Overlap Graph ایدهآل:
مسیر درست در گراف:
- ترتیب واقعی Readها را نشان میدهد.
- با دنبال کردن آن میتوان ژنوم اصلی را بازسازی کرد.
فرض کنید Readها:
GTACGT
TACGTA
ACGTAC
باشند.
بین Readها Overlap پنجتایی وجود دارد:
GTACGT
|||||
TACGTA
پس مسیر:
GTACGT → TACGTA → ACGTAC
توالی اصلی را بازسازی میکند.
مدرس Assembly را مانند حل پازل توضیح میدهد.
در این تشبیه:
- Readها = قطعات پازل
- Overlapها = بخشهای مشترک قطعات
- Graph = نقشه ارتباط همه قطعات
اگر بدانیم کدام قطعه به کدام قطعه وصل میشود، میتوانیم تصویر نهایی را بازسازی کنیم.
برای نمایش ایده:
- یک ژنوم فرضی داریم.
- تمام زیررشتههای طول 6 (6-mer) را استخراج میکنیم.
- هر 6-mer تبدیل به یک Node میشود.
- هر دو 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 برای بازسازی ژنوم است.
پاسخ: زیرا تعداد Readها و روابط Overlap بین آنها بسیار زیاد است. Graph این روابط را در یک ساختار منظم نمایش میدهد و پیدا کردن ترتیب Readها را آسانتر میکند.
پاسخ:
- Nodeها نشاندهنده Readهای توالییابی هستند.
- Edgeها نشاندهنده وجود Overlap بین دو Read هستند.
پاسخ: زیرا Overlap دارای جهت است. اگر Suffix یک Read با Prefix Read دیگر تطبیق داشته باشد، رابطه از Read اول به Read دوم تعریف میشود.
پاسخ: زیرا شباهتهای کوتاه ممکن است تصادفی باشند. بنابراین باید Threshold تعیین کنیم تا فقط 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) بین دو توالی DNA است. این تابع یکی از اجزای پایهای در الگوریتمهای مونتاژ ژنوم (Genome Assembly) خواهد بود، زیرا برای کنار هم قرار دادن قطعات کوتاه DNA (Reads) باید بدانیم کدام خوانشها دارای بخشهای مشترک هستند.
هدف یادگیری:
- طراحی تابعی برای یافتن طول بیشترین همپوشانی بین دو رشته
- استفاده از عملیات جستجوی رشتهای در Python
- درک نقش overlap در مراحل بعدی مونتاژ ژنوم
Overlap بخشی مشترک بین دو توالی است که انتهای یک توالی با ابتدای توالی دیگر مطابقت دارد.
فرض کنید دو خوانش DNA داریم:
Read A: ATCGT
Read B: CGTAA
انتهای Read A:
CGT
با ابتدای Read B:
CGT
مطابقت دارد، بنابراین طول overlap برابر است با:
Overlap = 3
در این درس فرض میشود که:
- توالی اول (
a) باید قبل از توالی دوم (b) قرار گیرد. - بررسی میکنیم که suffix (پسوند) از
aبا prefix (پیشوند) ازbمطابقت دارد.
روشی برای پیدا کردن بخش مشترک بین انتهای یک رشته و ابتدای رشته دیگر.
در مونتاژ ژنوم:
- هر Read فقط بخشی از ژنوم اصلی است.
- اگر انتهای یک Read با ابتدای Read دیگر مشابه باشد، احتمال دارد این دو Read در ژنوم کنار هم قرار داشته باشند.
رابطه:
Suffix(read A) ≈ Prefix(read B)
نشاندهنده احتمال وجود overlap بین آنها است.
تابعی طراحی میشود که:
ورودی:
- رشته اول
a - رشته دوم
b - حداقل طول قابل قبول overlap
خروجی:
- طول overlap در صورت وجود
- مقدار صفر در صورت نبود overlap مناسب
شکل کلی:
overlap(a, b, min_length)تابع:
string.find(substring, start)برای پیدا کردن موقعیت یک زیررشته داخل یک رشته استفاده میشود.
در اینجا:
- پیشوندهای مختلف رشته
bدر رشتهaجستجو میشوند. - پارامتر
startمشخص میکند جستجو از کدام موقعیت ادامه پیدا کند.
مثال:
a.find("CGT", 2)یعنی:
- رشته
CGTرا درaپیدا کن. - جستجو را از اندیس 2 شروع کن.
از آنجا که ممکن است یک پیشوند از b چند بار در a ظاهر شود، الگوریتم از یک حلقه استفاده میکند:
مراحل:
- پیدا کردن اولین رخداد prefix از
bدرa - بررسی اینکه آیا ادامه رشتهها نیز مطابقت دارند یا خیر
- اگر تطبیق کامل نبود، جستجو از محل بعدی ادامه پیدا میکند
تابع:
startswith()بررسی میکند که آیا یک رشته با بخش مشخصی شروع میشود یا خیر.
در این الگوریتم:
- بعد از پیدا کردن موقعیت شروع overlap،
- بررسی میشود که ادامه
bبا ادامهaمطابقت دارد.
اگر:
b[start:]
با بخش انتهایی a برابر باشد:
→ یک overlap معتبر پیدا شده است.
مراحل:
- یک موقعیت شروع (
start) تعریف کن. - پیشوند
bرا درaجستجو کن. - اگر چیزی پیدا نشد:
return 0
-
اگر پیدا شد:
- بررسی کن که ادامه رشتهها نیز هماهنگ هستند.
-
اگر تطبیق کامل بود:
طول overlap را برگردان.
فرمول:
[ Overlap = |a| - start ]
-
اگر تطبیق کامل نبود:
- موقعیت جستجو را افزایش بده.
- دوباره جستجو کن.
- در مونتاژ ژنوم، 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() |
بررسی شروع رشته | بررسی اینکه آیا رشته با بخش مشخصی آغاز میشود |
دو 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 است.
چرا overlap در مونتاژ ژنوم اهمیت دارد؟
پاسخ: زیرا overlapها اطلاعات لازم برای تشخیص ترتیب قرارگیری Readها را فراهم میکنند و مانند اتصالدهندهای برای بازسازی ژنوم عمل میکنند.
Overlap بین دو Read چیست؟
پاسخ: بخشی از توالی است که suffix یک Read با prefix Read دیگر مطابقت دارد.
اگر دو Read دارای overlap به طول 3 باشند اما حداقل طول مورد نیاز 5 باشد، خروجی تابع چه خواهد بود؟
پاسخ: تابع مقدار 0 برمیگرداند، زیرا overlap کوتاهتر از حد مجاز است.
چرا الگوریتم فقط اولین تطبیق پیدا شده را قبول نمیکند؟
پاسخ: زیرا ممکن است یک prefix چندین بار در رشته وجود داشته باشد و برخی تطبیقها کامل نباشند. بنابراین باید همه موقعیتهای ممکن بررسی شوند تا بهترین overlap پیدا شود.
تابع find() چه نقشی در این الگوریتم دارد؟
پاسخ: برای پیدا کردن موقعیتهایی استفاده میشود که prefix یک Read در Read دیگر ظاهر شده است تا امکان بررسی overlap فراهم شود.
03_edit-distance-assembly-overlaps/01_module-3-edit-distance-assembly-overlaps/13_practical-finding-and-representing-all-overlaps
در این درس عملی، هدف توسعه تابع Overlap از درس قبل و استفاده از آن برای ساخت یک نقشه ساده از همپوشانیهای بین مجموعهای از Readهای DNA است.
در مونتاژ ژنوم، برای بازسازی توالی اصلی باید بدانیم:
- کدام Readها با هم همپوشانی دارند.
- ترتیب احتمالی قرارگیری آنها چگونه است.
در این بخش یک روش ساده و ابتدایی (Naive Overlap Mapping) پیادهسازی میشود که تمام جفتهای ممکن از Readها را بررسی میکند و اگر بین دو Read همپوشانی معتبر وجود داشت، آن را ذخیره میکند.
هدف یادگیری:
- استفاده از تابع overlap برای چندین Read
- تولید تمام جفتهای ممکن از Readها
- ذخیره روابط overlap در یک ساختار داده مناسب
- ایجاد پایهای برای ساخت گرافهای مونتاژ ژنوم
یک ساختار داده که تمام روابط همپوشانی بین 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 هستند.
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)
...
برای یافتن همه overlapها باید تمام جفتهای Readها بررسی شوند.
مثلاً اگر سه Read داشته باشیم:
A
B
C
باید بررسی کنیم:
A با B
A با C
B با A
B با C
C با A
C با B
تابع permutations() این جفتها را تولید میکند.
ایجاد نقشه همپوشانی برای یک مجموعه Read.
شکل کلی:
naive_overlap(reads, k)ورودیها:
reads: مجموعه Readهاk: حداقل طول overlap قابل قبول
خروجی:
- دیکشنری شامل تمام overlapهای معتبر
یک دیکشنری ساخته میشود:
overlaps = {}که روابط overlap را نگهداری میکند.
با استفاده از:
permutations(reads, 2)تمام جفتهای مرتبشده ایجاد میشوند.
مثلاً:
(read1, read2)
(read2, read1)
هر دو بررسی میشوند، زیرا جهت overlap مهم است.
برای هر جفت:
overlap(a,b)فراخوانی میشود.
این تابع بررسی میکند که آیا:
suffix(a)
با:
prefix(b)
مطابقت دارد یا خیر.
اگر:
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 1: ACGT
Read 2: GTAA
Read 3: TTAC
بررسیها:
Read 1: AC GT
Read 2: GT AA
Overlap:
GT
طول:
2
پس:
Read1 → Read2 = 2
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 در مونتاژ ژنوم است.
چرا باید همه جفتهای Readها بررسی شوند؟
پاسخ: زیرا قبل از ساخت گراف مونتاژ باید بدانیم کدام Readها با یکدیگر همپوشانی دارند و ترتیب قرارگیری آنها چگونه است.
Naive Overlap Map چیست؟
پاسخ: ساختاری است که تمام روابط همپوشانی بین جفتهای Read را با بررسی همه حالتهای ممکن ذخیره میکند.
اگر 1000 Read داشته باشیم، چرا روش naive مشکلساز میشود؟
پاسخ: زیرا باید تقریباً یک میلیون مقایسه انجام شود:
[ 1000 \times 999 ]
و این برای دادههای بزرگ توالییابی بسیار زمانبر است.
چرا (A,B) و (B,A) جداگانه بررسی میشوند؟
پاسخ: زیرا overlap جهت دارد؛ ممکن است انتهای A با ابتدای B تطبیق داشته باشد، اما برعکس آن وجود نداشته باشد.
اگر تابع overlap مقدار صفر برگرداند، چه چیزی در نقشه overlap ذخیره میشود؟
پاسخ: هیچ رابطهای ذخیره نمیشود، زیرا بین دو Read یک overlap معتبر وجود ندارد.
در این بخش، وارد مرحله جدیدی از مطالعه مونتاژ ژنوم (Genome Assembly) میشویم و بررسی میکنیم که چگونه میتوان این مسئله زیستی را با استفاده از الگوریتمهای محاسباتی حل کرد.
تا اینجا با اصول اولیه مونتاژ آشنا شدیم؛ از جمله:
- مفهوم Readها
- همپوشانی بین Readها (Overlap)
- ساختارهایی مانند گرافهای همپوشانی (Overlap Graphs)
اما سؤال اصلی این است:
چگونه میتوان یک الگوریتم کارآمد طراحی کرد که توالی اصلی ژنوم را از روی مجموعهای از Readها بازسازی کند؟
در این ماژول، چند رویکرد الگوریتمی مختلف بررسی خواهد شد:
- تبدیل مسئله مونتاژ به یک مسئله کلاسیک محاسباتی به نام Shortest Common Superstring (SCS).
- بررسی محدودیتهای بنیادی الگوریتمها در مواجهه با ژنومهای تکراری (Repetitive Genomes).
- معرفی روش مبتنی بر De Bruijn Graphs که رویکرد متفاوتی برای مونتاژ ارائه میدهد.
- بررسی اینکه نرمافزارهای واقعی مونتاژ ژنوم در عمل چگونه کار میکنند.
هدف یادگیری:
- درک ارتباط بین مسئله مونتاژ ژنوم و مسائل کلاسیک علوم کامپیوتر.
- شناخت نقاط قوت و ضعف الگوریتمهای مختلف مونتاژ.
- درک اینکه چرا هیچ الگوریتمی برای همه شرایط کامل نیست.
الگوریتمهایی هستند که تلاش میکنند توالی کامل یک ژنوم را از مجموعهای از Readهای کوتاه بازسازی کنند.
ورودی الگوریتم:
- تعداد زیادی Read کوتاه که از بخشهای مختلف ژنوم تولید شدهاند.
خروجی:
- یک یا چند توالی طولانیتر که نماینده ژنوم اصلی هستند.
چالش اصلی این است که:
- مکان اصلی هر Read مشخص نیست.
- توالی کامل ژنوم در اختیار نداریم.
- خطاهای توالییابی و تکرارهای ژنومی وجود دارند.
یک مسئله محاسباتی که هدف آن یافتن کوتاهترین رشتهای است که تمام رشتههای ورودی را به عنوان زیررشته در خود جای دهد.
فرض کنید چند Read داریم:
ACGT
CGTA
GTAA
هدف پیدا کردن کوتاهترین رشتهای است که همه آنها در آن وجود داشته باشند:
ACGTAA
زیرا:
ACGTدر آن وجود دارد.CGTAدر آن وجود دارد.GTAAدر آن وجود دارد.
در مونتاژ ژنوم:
- Readها همان رشتههای ورودی هستند.
- ژنوم اصلی همان Superstring موردنظر است.
بنابراین میتوان مونتاژ ژنوم را به شکل یک مسئله SCS مدل کرد.
این تبدیل، امکان استفاده از ابزارهای علوم کامپیوتر برای حل مسائل زیستی را فراهم میکند.
ژنومهایی که بخشهایی از توالی آنها چندین بار تکرار شده است.
یکی از مشکلات بزرگ مونتاژ این است که اگر یک توالی چند بار در ژنوم تکرار شده باشد، الگوریتم نمیتواند به راحتی تشخیص دهد که یک Read متعلق به کدام نسخه از آن تکرار است.
مثلاً:
ژنوم:
AAAACCCCCAAAACCCCC
دارای دو بخش مشابه است.
اگر Readی از یکی از این قسمتها دریافت شود، مشخص نیست باید در کدام موقعیت قرار گیرد.
ژنومهای تکراری باعث میشوند:
- حتی بهترین الگوریتمها اشتباه کنند.
- بازسازی کامل ژنوم همیشه امکانپذیر نباشد.
یک روش گرافی برای مونتاژ ژنوم که به جای استفاده مستقیم از 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 یک روش مهم جایگزین برای مونتاژ است.
- الگوریتمهای سریع معمولاً با مصالحه بین سرعت و دقت همراه هستند.
- نرمافزارهای واقعی مونتاژ از ترکیبی از روشهای مختلف استفاده میکنند.
- علوم کامپیوتر نقش مهمی در پیشرفت زیستشناسی مدرن دارد.
چرا مونتاژ ژنوم یک مسئله الگوریتمی محسوب میشود؟
پاسخ: زیرا نیازمند پیدا کردن ترتیب مناسب تعداد زیادی Read و بازسازی یک توالی بزرگ از دادههای پراکنده است؛ مسئلهای که با روشهای محاسباتی و الگوریتمها حل میشود.
Shortest Common Superstring چیست؟
پاسخ: کوتاهترین رشتهای است که تمام رشتههای ورودی را به عنوان زیررشته در خود جای میدهد.
چرا ژنومهای تکراری باعث مشکل در مونتاژ میشوند؟
پاسخ: زیرا Readهای مشابه ممکن است از چندین موقعیت مختلف ژنوم آمده باشند و الگوریتم نمیتواند محل دقیق آنها را تشخیص دهد.
اگر یک گونه جدید هیچ Reference Genome نداشته باشد، از چه نوع مونتاژی استفاده میشود؟
پاسخ: از De Novo Assembly استفاده میشود، زیرا توالی مرجع برای مقایسه وجود ندارد.
تفاوت اصلی 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 و محدودیتهای آن.
- فهمیدن اینکه چرا برخی مسائل مونتاژ ژنوم از نظر محاسباتی دشوار هستند.
Shortest Common Superstring رشتهای است که:
- همه رشتههای ورودی را بهعنوان زیررشته (Substring) شامل میکند.
- در میان تمام رشتههایی که این ویژگی را دارند، کوتاهترین است.
به عبارت دیگر:
کوتاهترین رشتهای که بتواند همه قطعات دادهشده را در خود جای دهد.
فرض کنید مجموعهای از رشتهها داریم:
S = {String1, String2, String3, ...}
هدف یافتن رشتهای مانند:
Superstring
است که:
- هر String موجود در S داخل آن وجود داشته باشد.
- طول Superstring حداقل ممکن باشد.
یک راه ساده برای ساخت چنین رشتهای، اتصال پشت سر هم تمام رشتهها است:
String1 + String2 + String3
اما این معمولاً کوتاهترین حالت نیست، زیرا رشتهها ممکن است بخشهای مشترک داشته باشند.
در توالییابی DNA، Readها قطعات کوتاهی از ژنوم هستند.
اگر بتوانیم کوتاهترین رشتهای را پیدا کنیم که همه Readها را شامل شود، این رشته میتواند همان ژنوم اصلی باشد.
بنابراین:
Sequencing Reads
↓
Shortest Common Superstring
↓
Genome Assembly
در Assembly:
-
ورودی:
- تعداد زیادی Read کوتاه DNA
-
خروجی:
- توالی کامل ژنوم
مسئله SCS تقریباً همین هدف را دنبال میکند:
- Readها = رشتههای ورودی
- ژنوم بازسازیشده = Superstring
فرض کنید Readهای زیر را داریم:
AAA
AAB
ABA
یک Superstring ممکن است:
AAABA
باشد، زیرا:
- AAA در آن وجود دارد.
- AAB در آن وجود دارد.
- ABA در آن وجود دارد.
اما ممکن است رشته کوتاهتر دیگری پیدا شود.
هدف SCS پیدا کردن کوتاهترین گزینه است.
برای ترکیب دو Read، به دنبال بیشترین تطابق بین:
- انتهای Read اول (Suffix)
- ابتدای Read دوم (Prefix)
میگردیم.
مثلاً:
Read A:
ACGTAA
Read B:
AATG
بخش مشترک:
AA
است.
بنابراین میتوانیم آنها را به شکل زیر ترکیب کنیم:
ACGTAATG
زیرا بخش مشترک دوبار نوشته نمیشود.
برای یافتن SCS:
-
همه ترتیبهای ممکن Readها را امتحان میکنیم.
-
در هر ترتیب:
- Readهای مجاور را بررسی میکنیم.
- بیشترین overlap را پیدا میکنیم.
- آنها را به هم متصل میکنیم.
-
کوتاهترین Superstring حاصل را انتخاب میکنیم.
فرض کنید ترتیب Readها:
AAA
AAB
ABA
باشد.
بین:
AAA
AAB
همپوشانی:
AA
است.
پس فقط قسمت جدید اضافه میشود:
AAAB
بین:
AAAB
ABA
همپوشانی:
AB
است.
پس نتیجه:
AAABA
خواهد بود.
برخی مسائل محاسباتی بهگونهای هستند که:
- پیدا کردن جواب دقیق آنها بسیار زمانبر است.
- با افزایش اندازه ورودی، زمان اجرا بهشدت افزایش مییابد.
مسئله 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 ایده خوبی است، اما در عمل مشکلاتی دارد:
به دلیل بررسی همه جایگشتها:
[ n! ]
زمان اجرا بسیار زیاد میشود.
Readهای واقعی ممکن است شامل:
- خطای توالییابی (Sequencing Error)
- تفاوتهای واقعی ژنتیکی
باشند.
بنابراین overlapها همیشه دقیق و کامل نیستند.
بخشهایی از ژنوم ممکن است چندین بار تکرار شده باشند.
این موضوع باعث ابهام در تعیین ترتیب درست 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 استفاده میکنند.
پاسخ:
مسئلهای است که در آن باید کوتاهترین رشتهای پیدا شود که تمام رشتههای ورودی را بهعنوان زیررشته شامل کند.
پاسخ:
زیرا Readهای توالییابی قطعاتی از ژنوم هستند و کوتاهترین رشتهای که همه آنها را شامل شود میتواند بازسازی ژنوم اصلی باشد.
پاسخ:
بخشی است که در آن انتهای یک Read (Suffix) با ابتدای Read دیگر (Prefix) تطابق دارد و اجازه میدهد دو Read به هم متصل شوند.
پاسخ:
زیرا باید تمام جایگشتهای ممکن Readها را بررسی کند و تعداد این حالتها برابر n! است که بسیار سریع رشد میکند.
پاسخ:
زیرا نشاندهنده سادهترین و کمفرضترین توضیح برای مجموعه Readهای موجود است و از نظر زیستی منطقیتر به نظر میرسد.
04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/03_practical-implementing-shortest-common-superstring
در این درس، الگوریتم Shortest Common Superstring (SCS) که در بخش قبل معرفی شد، به صورت عملی در Python پیادهسازی میشود.
هدف این الگوریتم:
- دریافت مجموعهای از Readها (رشتههای DNA یا رشتههای عمومی).
- بررسی تمام ترتیبهای ممکن Readها.
- ترکیب Readها بر اساس بیشترین میزان Overlap (همپوشانی).
- انتخاب کوتاهترین رشتهای که همه Readها را شامل میشود.
در این پیادهسازی از یک روش Brute Force (جستجوی کامل) استفاده میشود؛ یعنی تمام جایگشتهای ممکن بررسی میشوند تا بهترین جواب پیدا شود.
SCS کوتاهترین رشتهای است که تمام رشتههای ورودی را بهعنوان زیررشته در خود دارد.
فرض کنید مجموعهای از Readها داریم:
S = {read1, read2, read3, ...}
هدف پیدا کردن رشتهای است که:
- تمام Readها داخل آن وجود داشته باشند.
- طول آن حداقل باشد.
برای ساخت این رشته، Readها باید با استفاده از Overlap به یکدیگر متصل شوند.
در مونتاژ ژنوم:
- Readها قطعات کوچک DNA هستند.
- SCS تلاش میکند این قطعات را دوباره کنار هم قرار دهد.
- نتیجه میتواند تقریب خوبی از ژنوم اصلی باشد.
روش Brute Force تمام حالتهای ممکن را بررسی میکند تا بهترین پاسخ را پیدا کند.
در مسئله SCS:
- هر ترتیب ممکن Readها بررسی میشود.
- برای هر ترتیب، یک Superstring ساخته میشود.
- کوتاهترین Superstring انتخاب میشود.
مزیت:
- جواب دقیق (Optimal Solution) را پیدا میکند.
عیب:
- بسیار کند است.
زیرا تعداد ترتیبهای ممکن برای n رشته برابر است با:
[ n! ]
که با افزایش تعداد Readها بسیار سریع رشد میکند.
Permutation یعنی تمام ترتیبهای ممکن عناصر یک مجموعه.
مثلاً برای سه عنصر:
A, B, C
جایگشتها:
ABC
ACB
BAC
BCA
CAB
CBA
تعداد آنها:
[ 3! = 6 ]
است.
در Python از:
itertools.permutations()استفاده میشود تا تمام ترتیبهای ممکن Readها تولید شوند.
مثلاً:
ورودی:
["AAA", "AAB", "ABA"]خروجی شامل همه ترتیبهای ممکن این Readها است.
تابعی که میزان اشتراک بین دو رشته را محاسبه میکند.
یعنی بررسی میکند:
- آیا انتهای رشته اول (Suffix)
- با ابتدای رشته دوم (Prefix)
تطابق دارد یا خیر.
دو Read:
Read A:
AAACGT
Read B:
CGTAA
بخش مشترک:
CGT
است.
بنابراین طول Overlap برابر:
3
خواهد بود.
برای هر جایگشت Readها:
- اولین Read به عنوان شروع Superstring انتخاب میشود.
- Read بعدی اضافه میشود.
- فقط بخش غیرمشترک Read دوم اضافه میشود.
- این فرآیند تا پایان ادامه پیدا میکند.
فرض کنید:
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 داریم:
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 از الگوریتمهای سریعتر استفاده میکنند.
پاسخ:
تمام ترتیبهای ممکن Readها را بررسی میکند، برای هر ترتیب یک Superstring میسازد و کوتاهترین آنها را انتخاب میکند.
پاسخ:
زیرا ترتیب Readها روی طول Superstring نهایی تأثیر دارد و باید همه ترتیبهای ممکن بررسی شوند.
پاسخ:
فقط بخش غیرمشترک Read دوم اضافه میشود؛ زیرا بخش Overlap قبلاً در Superstring وجود دارد.
پاسخ:
زیرا تعداد جایگشتها برابر n! است و با افزایش تعداد Readها زمان اجرا بهصورت فاکتوریلی افزایش مییابد.
پاسخ:
تابع Overlap بیشترین تطابق بین انتهای یک Read و ابتدای Read دیگر را پیدا میکند تا Readها به شکل بهینه به هم متصل شوند.
04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/04_lecture-greedy-shortest-common-superstring
در درسهای قبل، مسئله کوتاهترین ابررشته مشترک (Shortest Common Superstring - SCS) معرفی شد؛ مسئلهای که هدف آن پیدا کردن کوتاهترین رشتهای است که تمام خوانشهای DNA (reads) را بهعنوان زیررشته (substring) در خود جای دهد.
اگرچه حل دقیق SCS میتواند مسئله مونتاژ ژنوم (Genome Assembly) را حل کند، اما الگوریتم کامل آن بسیار کند است، زیرا باید تمام ترتیبهای ممکن برای قرار دادن خوانشها بررسی شوند.
در این درس یک روش سریعتر معرفی میشود:
Greedy Shortest Common Superstring Algorithm
این الگوریتم با یک ایده ساده کار میکند:
در هر مرحله، بیشترین همپوشانی (maximum overlap) بین دو خوانش را انتخاب کن و آنها را به هم متصل کن.
هدف این روش کاهش سریع طول رشته نهایی است؛ اما مشکل آن این است که همیشه بهترین جواب ممکن (optimal solution) را پیدا نمیکند.
رشتهای است که:
- تمام رشتههای ورودی را در خود دارد.
- کوتاهترین رشته ممکن با این ویژگی است.
فرض کنید مجموعهای از خوانشهای DNA داریم:
read1
read2
read3
...
هدف یافتن رشتهای است که همه این خوانشها در آن ظاهر شوند، اما طول آن حداقل باشد.
در مونتاژ ژنوم:
- ورودی → مجموعهای از sequencing reads
- خروجی → توالی بازسازیشده ژنوم
اگر بتوانیم SCS را بهصورت سریع حل کنیم، میتوانیم ژنوم را از روی خوانشها بازسازی کنیم.
الگوریتمی که در هر مرحله بهترین تصمیم محلی (local optimal choice) را انتخاب میکند.
در این مسئله، بهترین تصمیم محلی یعنی:
انتخاب دو رشتهای که بیشترین overlap را دارند.
زیرا overlap بیشتر باعث میشود بخش کمتری از رشتهها دوباره نوشته شود و در نتیجه superstring کوتاهتر شود.
دو خوانش:
AAA
AAB
دارای overlap:
AA
هستند.
پس ترکیب آنها:
AAAB
است، نه:
AAAAAB
زیرا بخش مشترک فقط یک بار نوشته میشود.
یک ساختار گرافی برای نمایش رابطه بین خوانشهای DNA.
هر گره نشاندهنده یک read است.
مثلاً:
AAA
AAB
BBB
هر کدام یک node هستند.
یال جهتدار بین دو گره زمانی ایجاد میشود که:
- suffix یک read
- با prefix یک read دیگر
مطابقت داشته باشد.
مثال:
AAA
AAB
چون:
suffix AAA = AA
prefix AAB = AA
پس یک edge داریم:
AAA → AAB
مراحل الگوریتم:
در گراف:
- همه edgeها دارای وزن هستند.
- وزن = طول overlap
مثلاً:
A → B (length 5)
C → D (length 3)
انتخاب میکنیم:
A → B
زیرا overlap بزرگتر دارد.
دو خوانش با بیشترین overlap ترکیب میشوند.
مثال:
AAA
AAB
با overlap دو حرف:
AA
ادغام میشوند:
AAAB
سپس این دو node با یک node جدید جایگزین میشوند.
این مراحل ادامه پیدا میکنند:
- انتخاب بزرگترین overlap
- ادغام دو رشته
- سادهتر شدن گراف
تا زمانی که:
- فقط یک node باقی بماند.
برچسب این node، superstring نهایی است.
روش قبلی:
- تمام ترتیبهای ممکن خوانشها بررسی میشوند.
- بهترین جواب انتخاب میشود.
تعداد حالتها:
[ n! ]
برای n خوانش.
مثلاً:
اگر:
n = 10
تعداد حالتها:
10! = 3,628,800
است.
بنابراین بسیار کند است.
روش جدید:
- فقط بهترین 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های برابر میتواند نتایج متفاوتی ایجاد کند.
پاسخ:
رشتهای با کمترین طول است که تمام رشتههای ورودی را بهعنوان زیررشته در خود دارد.
پاسخ:
زیرا باید تمام ترتیبهای ممکن برای n رشته را بررسی کند که تعداد آنها:
[ n! ]
است و با افزایش n بسیار سریع رشد میکند.
پاسخ:
در هر مرحله دو رشتهای را انتخاب میکند که بیشترین overlap را دارند و آنها را ادغام میکند.
پاسخ:
زیرا بخش مشترک فقط یک بار در رشته نهایی نوشته میشود و تکرار کاهش مییابد.
پاسخ:
خیر. این الگوریتم ممکن است یک superstring معتبر تولید کند، اما طول آن بیشتر از کوتاهترین superstring واقعی باشد.
پاسخ:
این گراف تمام روابط همپوشانی بین reads را نمایش میدهد و کمک میکند مسیر احتمالی بازسازی ژنوم پیدا شود.
04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/05_practical-implementing-greedy-shortest-common-superstring
در درسهای قبل، دو روش برای حل مسئله Shortest Common Superstring (SCS) بررسی شد:
-
روش Brute Force
- تمام ترتیبهای ممکن برای قرارگیری reads را بررسی میکند.
- جواب دقیق و بهینه میدهد.
- اما با افزایش تعداد reads بسیار کند میشود.
-
روش Greedy
- یک روش تقریبی (Approximation Algorithm) است.
- در هر مرحله دو read با بیشترین overlap را انتخاب و ادغام میکند.
- بسیار سریعتر است، اما همیشه کوتاهترین superstring واقعی را تولید نمیکند.
در این جلسه، الگوریتم Greedy SCS در پایتون پیادهسازی میشود.
الگوریتمی که در هر مرحله:
- دو رشته با بیشترین همپوشانی (maximum overlap) را پیدا میکند.
- آنها را با حذف بخش مشترک ترکیب میکند.
- این کار را تا زمانی ادامه میدهد که همه رشتهها به یک رشته تبدیل شوند.
فرض کنید مجموعهای از reads داریم:
read1
read2
read3
...
الگوریتم:
- بهترین جفت reads را از نظر overlap پیدا میکند.
- آنها را به یک read جدید تبدیل میکند.
- readهای قبلی را حذف میکند.
- read جدید را به مجموعه اضافه میکند.
- دوباره همین کار را تکرار میکند.
در پایان فقط یک read باقی میماند که همان superstring نهایی است.
این روش در مونتاژ ژنوم اهمیت دارد زیرا:
- سرعت بسیار بالاتری نسبت به Brute Force دارد.
- برای دادههای بزرگتر قابل اجرا است.
- پایه بسیاری از روشهای عملی assembly است.
بزرگترین بخش مشترک بین:
- انتهای یک read (suffix)
- ابتدای read دیگر (prefix)
است.
دو read:
ACGTA
GTACC
دارند:
suffix(read1) = GTA
prefix(read2) = GTA
پس overlap برابر 3 است.
ترکیب:
ACGTACC
خواهد بود.
پیدا کردن دو read که بیشترین overlap را در کل مجموعه دارند.
- مجموعه reads
- حداقل طول overlap مجاز (minimum overlap K)
تابع سه مقدار برمیگرداند:
- read اول
- read دوم
- طول overlap
برای هر جفت ممکن از reads:
- overlap آنها محاسبه میشود.
- با بهترین overlap فعلی مقایسه میشود.
- اگر overlap بزرگتر باشد، این جفت ذخیره میشود.
ممکن است چند جفت read دارای بیشترین overlap یکسان باشند.
در این حالت:
- اولین جفتی که در حلقه پیدا شود انتخاب میشود.
- انتخاب بر اساس ترتیب پیمایش انجام میشود.
الگوریتم اصلی:
ابتدا بهترین دو read را پیدا کن:
read_a , read_b
که بیشترین overlap را دارند.
آنها را ادغام کن.
فرض کنید:
read_a = AAA
read_b = AAB
overlap:
AA
باشد.
نتیجه:
AAAB
خواهد بود.
زیرا بخش overlap دوباره اضافه نمیشود.
readهای قبلی حذف و رشته جدید اضافه میشود.
یعنی:
قبل:
AAA
AAB
BBB
بعد:
AAAB
BBB
این فرآیند تا زمانی ادامه پیدا میکند که:
- دیگر overlap وجود نداشته باشد.
- یا فقط یک read باقی بماند.
گاهی پس از چند ادغام:
- هنوز چند 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 | جواب بهینه | بهترین جواب ممکن از نظر معیار مسئله |
فرض کنید سه 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 واقعی را پیدا نمیکند.
- در مونتاژ واقعی ژنوم، سرعت معمولاً ارزش این تقریب را دارد.
پاسخ:
زیرا باید تمام جایگشتهای ممکن reads را بررسی کند و تعداد این حالتها با افزایش تعداد reads بهشدت رشد میکند.
پاسخ:
دو read با بیشترین overlap را پیدا کرده و آنها را با حذف بخش مشترک ترکیب میکند.
پاسخ:
تمام جفتهای ممکن reads را بررسی کرده و جفتی را که بیشترین overlap دارد پیدا میکند.
پاسخ:
زیرا انتخاب بهترین گزینه در یک مرحله ممکن است باعث شود در مراحل بعدی نتوانیم بهترین ترکیب کلی را ایجاد کنیم.
پاسخ:
وقتی دیگر overlap قابل قبول وجود نداشته باشد یا فقط یک رشته نهایی باقی مانده باشد.
پاسخ:
سرعت بسیار بالاتر و امکان اجرا روی مجموعه دادههای بزرگتر، هرچند با احتمال خطا در جواب نهایی.
04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/06_lecture-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
توالیهای DNA هستند که چندین بار در ژنوم تکرار شدهاند و نسخههای مشابه یا تقریباً مشابهی از آنها وجود دارد.
در یک ژنوم ممکن است یک قطعه DNA چندین بار تکرار شده باشد. هنگام Sequencing، دستگاه توالییابی فقط قطعات کوتاهی (Reads) تولید میکند.
اگر طول Readها کمتر از فاصله یا ساختار تکرارها باشد، الگوریتم Assembly نمیتواند تشخیص دهد:
- یک Read مربوط به کدام نسخه از Repeat است.
- چند نسخه واقعی از آن Repeat در ژنوم وجود دارد.
در نتیجه اطلاعات کافی برای بازسازی دقیق ژنوم وجود ندارد.
توالیهای تکراری یکی از اصلیترین دلایل دشواری Assembly در ژنومهای پیچیده مانند ژنوم انسان هستند.
Shortest Common Superstring مسئلهای است که در آن باید کوتاهترین رشتهای پیدا شود که تمام Readهای ورودی را به عنوان زیررشته (Substring) شامل شود.
فرض کنید ژنومی دارای سه نسخه از یک کلمه یا توالی تکراری باشد:
... LONG ... LONG ... LONG ...
اما Readهای کوتاه فقط نشان دهند که حداقل دو نسخه وجود دارد.
الگوریتم SCS برای توضیح Readها، کوتاهترین رشته ممکن را انتخاب میکند:
... LONG ... LONG ...
و یکی از نسخههای واقعی Repeat حذف میشود.
SCS یک Superstring تولید میکند که از نظر ریاضی درست است، اما از نظر زیستی ژنوم واقعی نیست.
یک الگوریتم سریعتر برای تولید Superstring است که در هر مرحله بهترین تصمیم محلی را انتخاب میکند.
در هر مرحله:
- دو Read با بیشترین Overlap پیدا میشوند.
- آنها با هم Merge میشوند.
- این کار تا زمانی ادامه پیدا میکند که همه Readها ترکیب شوند.
الگوریتم Greedy همیشه بیشترین Overlap را انتخاب میکند، اما این انتخاب ممکن است باعث شود:
- چند نسخه از یک Repeat با هم ادغام شوند.
- تعداد واقعی تکرارها کمتر از مقدار واقعی گزارش شود.
سرعت بیشتر → اما احتمال خطای Assembly
وضعیتی که اطلاعات موجود اجازه نمیدهد مشخص کنیم یک Read دقیقاً متعلق به کدام بخش ژنوم بوده است.
Repeats باعث میشوند چند مسیر Assembly ممکن وجود داشته باشد.
مثلاً اگر دو قسمت مختلف ژنوم دارای یک توالی مشابه باشند:
Genome region A:
AAAACCCCCGGG
Genome region B:
TTTAAAACCCCC
یک Read کوتاه از بخش تکراری ممکن است به هر دو قسمت تعلق داشته باشد.
Assembly در واقع حل یک مسئله ابهام است، و Repeats این ابهام را افزایش میدهند.
Repeats make assembly difficult. تکرارها باعث دشوار شدن Assembly میشوند.
هرچه ژنوم دارای توالیهای تکراری بیشتری باشد:
- بازسازی صحیح آن سختتر میشود.
- احتمال خطای Assembly افزایش مییابد.
- حتی بهترین الگوریتمها نیز ممکن است شکست بخورند.
- هدف Assembly فقط پیدا کردن یک Superstring کوتاه نیست؛ هدف بازسازی ژنوم واقعی است.
- در ژنومهای بدون Repeat، SCS میتواند تقریب خوبی از ژنوم اصلی باشد.
- در ژنومهای تکراری، کوتاهترین جواب الزاماً جواب درست نیست.
- الگوریتمهای SCS معمولاً Repeatها را Collapse میکنند.
یعنی:
چندین نسخه واقعی از یک توالی تکراری به یک نسخه یا تعداد کمتری نسخه تبدیل شوند.
مثال:
ژنوم واقعی:
Repeat Repeat Repeat
Assembly:
Repeat Repeat
یک نسخه از بین رفته است.
Repeats میتوانند باعث خطاهای مختلف شوند:
| نوع خطا | توضیح |
|---|---|
| Repeat Collapse | چند نسخه Repeat به تعداد کمتر تبدیل میشوند |
| Misassembly | بخشهای دور از هم ژنوم اشتباه به هم متصل میشوند |
| Incorrect Ordering | ترتیب قطعات ژنوم اشتباه بازسازی میشود |
برای توضیح مشکل 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 همچنان باقی است.
چرا Shortest Common Superstring در ژنومهای تکراری همیشه ژنوم واقعی را بازسازی نمیکند؟
پاسخ: زیرا Readهای کوتاه نمیتوانند تعداد واقعی نسخههای Repeat را مشخص کنند. بنابراین SCS کوتاهترین توضیح ممکن را انتخاب میکند و ممکن است برخی نسخههای واقعی Repeat را حذف کند.
Repeat Collapse چیست؟
پاسخ: حالتی که چندین نسخه واقعی از یک توالی تکراری در ژنوم، هنگام Assembly به تعداد کمتری نسخه تبدیل شوند.
چرا افزایش طول Readها میتواند به حل مشکل Repeat کمک کند؟
پاسخ: Readهای بلندتر احتمالاً از نواحی تکراری عبور میکنند و اطلاعات بیشتری درباره بخشهای اطراف Repeat فراهم میکنند؛ بنابراین تعیین محل صحیح Repeat آسانتر میشود.
قانون سوم Assembly چه چیزی بیان میکند؟
پاسخ: این قانون بیان میکند که وجود توالیهای تکراری باعث دشوار شدن Assembly ژنوم میشود و میتواند باعث خطا یا ابهام در بازسازی ژنوم شود.
04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/07_lecture-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 بهعنوان پایه یک الگوریتم جدید مونتاژ ژنوم
یک رشته کوتاه که تمام رشتههای ورودی را بهعنوان زیررشته (Substring) در خود جای دهد.
اگر ژنوم دارای توالیهای تکراری باشد، SCS تمایل دارد این تکرارها را در هم ادغام کند.
برای مثال:
اگر ژنوم واقعی شامل:
LONG LONG LONG
باشد، الگوریتم ممکن است خروجیای تولید کند که فقط شامل:
LONG LONG
باشد.
یعنی تعداد واقعی تکرارها را کمتر تخمین میزند.
این مشکل باعث شد دانشمندان به دنبال مدلهای دیگری برای مونتاژ ژنوم باشند؛ یکی از مهمترین آنها De Bruijn Graph است.
یک گراف جهتدار (Directed Graph) است که در آن:
- گرهها (Nodes) نشاندهنده k-1-merها هستند.
- یالها (Edges) نشاندهنده k-merها هستند.
برای هر k-mer:
- بخش ابتدایی آن (Prefix با طول k-1) یک گره ایجاد میکند.
- بخش انتهایی آن (Suffix با طول k-1) یک گره ایجاد میکند.
- یک یال جهتدار از Prefix به Suffix رسم میشود.
فرض کنیم:
k = 3
و یک k-mer داریم:
AAB
این k-mer شامل دو k-1-mer است:
AA → AB
بنابراین در گراف:
- یک گره برای AA
- یک گره برای AB
- یک یال از AA به AB
ایجاد میشود.
یک قطعه از DNA با طول مشخص k که از توالی ژنوم استخراج میشود.
مثال:
اگر:
Genome = AABBBA
و:
k = 3
باشد، k-merها عبارتاند از:
AAB
ABB
BBB
BBA
در این روش:
- هر k-mer → یک یال در گراف
- هر k-1-mer → یک گره در گراف
است.
بنابراین گراف اطلاعات لازم برای بازسازی ژنوم را در خود نگه میدارد.
برای ساخت گراف:
فرض میکنیم:
- تمام k-merهای موجود در ژنوم را داریم.
- هر k-mer دقیقاً یک بار مشاهده شده است.
برای هر k-mer:
مثلاً:
k-mer = ABB
پس:
Left k-1-mer = AB
Right k-1-mer = BB
اگر گرهها قبلاً وجود نداشته باشند، اضافه میشوند:
AB
BB
یک یال جهتدار اضافه میشود:
AB → BB
گرافی که ممکن است چندین یال بین دو گره یکسان داشته باشد.
در De Bruijn Graph این اتفاق ممکن است رخ دهد.
مثلاً:
Tomorrow → And
Tomorrow → And
دو یال جداگانه بین همان دو گره ایجاد میکنند.
چون یک k-mer ممکن است چند بار در ژنوم ظاهر شود، De Bruijn Graph باید بتواند چند مسیر مشابه را نمایش دهد.
اگر فقط گراف De Bruijn را داشته باشیم، میتوانیم ژنوم اولیه را دوباره بسازیم.
بازسازی ژنوم برابر است با:
پیدا کردن مسیری در گراف که تمام یالها را دقیقاً یک بار طی کند.
مسیر در یک گراف جهتدار که:
- از هر یال دقیقاً یک بار عبور کند.
- جهت یالها رعایت شود.
در De Bruijn Graph:
- هر یال = یک k-mer
- عبور از تمام یالها = استفاده از تمام k-merها
پس:
Eulerian Walk → بازسازی ژنوم اصلی
فرض کنیم گراف دارای این مسیر باشد:
AA → AA → AB → BB → BB → BA
با دنبال کردن مسیر:
- اولین k-mer تولید میشود.
- در هر حرکت فقط کاراکتر جدید اضافه میشود.
- در پایان توالی کامل ژنوم ساخته میشود.
-
روش 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 پایه بسیاری از الگوریتمهای مدرن مونتاژ ژنوم است.
- استفاده از گرافها باعث میشود مسئله مونتاژ از یک مشکل رشتهای به یک مسئله گرافی تبدیل شود.
چرا Shortest Common Superstring در ژنومهای دارای تکرار مشکل ایجاد میکند؟
پاسخ: زیرا الگوریتم تلاش میکند کوتاهترین توضیح ممکن برای دادهها را پیدا کند و در نتیجه بخشهای تکراری ژنوم را در نسخههای کمتر ادغام میکند.
در De Bruijn Graph، گرهها و یالها چه چیزی را نشان میدهند؟
پاسخ:
- گرهها نشاندهنده k-1-merها هستند.
- یالها نشاندهنده k-merها هستند.
اگر یک k-mer برابر ACG باشد، چه یالی در De Bruijn Graph ایجاد میشود؟
پاسخ:
برای:
k = 3
دو k-1-mer داریم:
AC
CG
پس یک یال ایجاد میشود:
AC → CG
چرا Eulerian Walk برای بازسازی ژنوم مناسب است؟
پاسخ: زیرا هر یال نماینده یک k-mer است و عبور از تمام یالها دقیقاً یک بار باعث استفاده از تمام اطلاعات توالییابی و بازسازی ژنوم اصلی میشود.
اگر یک 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 پیادهسازی میشود.
در بخشهای قبلی یاد گرفتیم که در گراف De Bruijn:
- هر k-mer از توالی ژنوم به یک یال (Edge) تبدیل میشود.
- هر k-1-mer به یک گره (Node) تبدیل میشود.
- جهت یال نشاندهنده ارتباط بین بخش ابتدایی و انتهایی k-mer است.
در این تمرین، یک تابع پایتون به نام de_bruijn_ize ساخته میشود که:
- یک توالی DNA و مقدار k را دریافت میکند.
- تمام k-merهای ممکن را از توالی استخراج میکند.
- برای هر k-mer، دو k-1-mer آن را پیدا میکند.
- گرهها و یالهای متناظر را ایجاد میکند.
- گراف De Bruijn ساختهشده را برمیگرداند.
هدف یادگیری:
- تبدیل یک توالی DNA به ساختار گرافی
- درک ارتباط عملی بین k-merها و گراف De Bruijn
- مشاهده مسیر Eulerian Walk در گراف ایجادشده
گرافی جهتدار است که توالی 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
این ساختار اجازه میدهد مسئله مونتاژ ژنوم به یک مسئله پیمایش گراف تبدیل شود.
یک 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
بخشهای ابتدایی و انتهایی یک k-mer هستند که طولشان یک واحد کمتر از k است.
مثال:
اگر:
k = 3
و:
k-mer = GCA
باشد:
Left k-1-mer = GC
Right k-1-mer = CA
این دو قطعه بهعنوان گرههای گراف استفاده میشوند.
در برنامه، هر یال به صورت یک Tuple ذخیره میشود.
مثلاً:
برای k-mer:
ACG
یال به شکل زیر ذخیره میشود:
("AC", "CG")یعنی:
AC → CG
در این پیادهسازی، گرهها در یک Set ذخیره میشوند.
ویژگی مهم Set:
اگر یک مقدار چند بار اضافه شود، فقط یک نسخه نگه داشته میشود.
مثال:
nodes.add("AC")
nodes.add("AC")نتیجه:
{"AC"}
یک k-1-mer ممکن است در چند k-mer مختلف ظاهر شود، اما باید فقط یک گره داشته باشد.
بنابراین استفاده از Set باعث جلوگیری از ایجاد گرههای تکراری میشود.
ورودی:
de_bruijn_ize(sequence, k)که شامل:
sequence: رشته DNAk: طول k-mer
است.
دو ساختار ایجاد میکنیم:
- لیست یالها:
edges
- مجموعه گرهها:
nodes
برای هر موقعیت:
یک k-mer استخراج میشود.
مثلاً:
ACGT
با:
k=3
ابتدا:
ACG
سپس:
CGT
برای هر k-mer:
قسمت چپ:
sequence[i:i+k-1]
قسمت راست:
sequence[i+1:i+k]
گرهها اضافه میشوند:
left k-1-mer
right k-1-mer
و یال ساخته میشود:
left → right
فرض کنیم توالی DNA:
ACGCGT
و:
k = 3
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
مسیر در گرافی که:
- از تمام یالها عبور میکند.
- هر یال دقیقاً یک بار استفاده میشود.
در مثال بالا:
مسیر:
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 پایه بسیاری از الگوریتمهای مدرن مونتاژ ژنوم است.
- پیادهسازی عملی این الگوریتم نشان میدهد چگونه مفاهیم ریاضی به کد تبدیل میشوند.
چرا در De Bruijn Graph به جای k-mer از k-1-mer برای گرهها استفاده میکنیم؟
پاسخ: زیرا دو k-1-mer ابتدا و انتهای k-mer هستند که ارتباط بین k-merها را مشخص میکنند و امکان اتصال قطعات را فراهم میکنند.
در De Bruijn Graph یک k-mer چه چیزی را ایجاد میکند؟
پاسخ: هر k-mer یک یال جهتدار ایجاد میکند که از k-1-mer ابتدایی به k-1-mer انتهایی میرود.
برای k-mer برابر با ATG چه یالی ساخته میشود؟
پاسخ:
k-1-merها:
AT
TG
پس یال:
AT → TG
خواهد بود.
چرا در تابع de_bruijn_ize از Set برای ذخیره Nodeها استفاده شده است؟
پاسخ: زیرا ممکن است یک k-1-mer چندین بار دیده شود، اما باید فقط یک Node در گراف داشته باشیم.
چگونه میتوان از De Bruijn Graph توالی ژنوم را بازسازی کرد؟
پاسخ: با پیدا کردن یک Eulerian Walk که تمام یالهای گراف را دقیقاً یک بار طی کند.
04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/09_lecture-when-eulerian-walks-go-wrong
در درسهای قبل، دو رویکرد برای حل مسئله مونتاژ ژنوم (Genome Assembly) بررسی شد:
-
Shortest Common Superstring (SCS)
- تلاش میکند کوتاهترین رشتهای را پیدا کند که همه Readها را در خود جای دهد.
- مشکل اصلی آن: در ژنومهای تکراری (Repetitive Genomes) معمولاً تکرارها را بیش از حد ادغام میکند (Over-collapse).
-
De Bruijn Graph + Eulerian Walk
- رویکردی جایگزین است که بسیاری از مشکلات SCS را کاهش میدهد.
- در شرایط ایدهآل میتواند ژنوم اصلی را بازسازی کند.
اما این درس نشان میدهد که حتی De Bruijn Graph نیز نمیتواند قانون سوم مونتاژ را حذف کند:
Third Law of Assembly: Repeats make assembly difficult تکرارهای ژنومی، مونتاژ را دشوار میکنند.
هدف این درس:
- بررسی محدودیتهای روش Eulerian Walk
- فهم اینکه چگونه تکرارهای ژنومی باعث ایجاد ابهام در De Bruijn Graph میشوند.
- آشنایی با مشکلات دادههای واقعی Sequencing.
یک مسیر در یک گراف جهتدار است که:
- از رأسها عبور میکند.
- هر یال (Edge) را دقیقاً یک بار طی میکند.
در مونتاژ ژنوم:
- هر یال در De Bruijn Graph نماینده یک k-mer است.
- پیدا کردن Eulerian Walk یعنی پیدا کردن ترتیبی از k-merها که ژنوم را بازسازی کند.
در حالت ایدهآل:
- تمام k-merهای ژنوم در اختیار داریم.
- هر k-mer فقط یک بار مشاهده شده است.
- De Bruijn Graph ساختهشده دارای مسیر اویلری است.
در این شرایط:
Eulerian Walk → بازسازی صحیح ژنوم
Eulerian Walk یک الگوریتم قدرتمند برای Genome Assembly است، اما تنها زمانی که گراف بدون ابهام باشد.
بخشهایی از ژنوم که چندین بار در نقاط مختلف تکرار شدهاند.
مثال:
long long long
کلمهی long سه بار تکرار شده است.
در DNA نیز توالیهای مشابهی وجود دارند:
- Repetitive DNA
- Transposable Elements
وقتی یک توالی چندین بار در ژنوم وجود دارد، Readها ممکن است نتوانند مشخص کنند:
- چند نسخه از آن وجود دارد؟
- هر نسخه دقیقاً در کجا قرار گرفته است؟
زمانی رخ میدهد که بیش از یک بازسازی ممکن از دادههای موجود وجود داشته باشد.
در De Bruijn Graph:
ممکن است چندین Eulerian Walk وجود داشته باشد.
اما:
- فقط یکی از آنها ژنوم واقعی است.
- مسیرهای دیگر بازسازیهای اشتباه هستند.
یک De Bruijn Graph ممکن است:
- فقط یک Eulerian Walk داشته باشد → بازسازی مشخص
- چند Eulerian Walk داشته باشد → ابهام در مونتاژ
علت اصلی:
وجود Repeatها.
فرض کنید یک بخش:
AB
در سه نقطه مختلف ژنوم وجود داشته باشد.
در گراف:
AB
/ \
X Y
\ /
AB
مشخص نیست بعد از عبور از AB باید به کدام بخش برویم.
در نتیجه:
چند مسیر مختلف ایجاد میشود.
مثلاً:
k = 3
مزایا:
- تعداد k-merهای بیشتری تولید میشود.
- پوشش ژنوم بهتر است.
معایب:
- احتمال تکراری بودن k-merها زیاد میشود.
- گراف پیچیدهتر میشود.
- تعداد Eulerian Walkهای ممکن افزایش مییابد.
مثلاً:
k = 50
مزایا:
- احتمال اینکه یک k-mer در چند جای ژنوم ظاهر شود کمتر است.
- ابهام کاهش مییابد.
معایب:
- ممکن است بعضی قسمتهای ژنوم پوشش کافی نداشته باشند.
در مثالهای آموزشی، فرضهای سادهای داشتیم:
فرض میکردیم:
- هر k-mer دقیقاً یک بار خوانده میشود.
- هیچ خطای Sequencing وجود ندارد.
- همه قسمتهای ژنوم پوشش برابر دارند.
اما در عمل:
این فرضها درست نیستند.
خطاهای خواندن DNA توسط دستگاه.
مثلاً:
ژنوم واقعی:
ACGT
Read دستگاه:
ACGG
پوشش یکنواخت نیست.
برخی قسمتها:
- Readهای زیاد دارند.
برخی قسمتها:
- Read کافی ندارند.
ممکن است بعضی k-merها اصلاً مشاهده نشوند.
ممکن است یک k-mer چند بار دیده شود.
در داده واقعی:
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 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 همچنان یک نمایش بسیار مهم است.
پاسخ: مسیر Eulerian Walk مسیری در گراف جهتدار است که هر یال را دقیقاً یک بار طی میکند. در Assembly، این مسیر برای بازسازی ترتیب k-merها استفاده میشود.
پاسخ: زیرا Readها نمیتوانند مشخص کنند یک توالی تکراری دقیقاً چند بار و در چه موقعیتی در ژنوم وجود دارد. این موضوع باعث ایجاد چند بازسازی ممکن میشود.
پاسخ: در SCS معمولاً Repeatها بیش از حد ادغام میشوند (Over-collapse)، اما در De Bruijn Graph مشکل اصلی ایجاد چند مسیر Eulerian و بازسازیهای اشتباه است.
پاسخ: زیرا k-merهای کوتاه احتمال بیشتری دارند که در چند نقطه ژنوم تکرار شوند، بنابراین گراف ابهام بیشتری پیدا میکند.
پاسخ: خیر. De Bruijn Graph بسیاری از مشکلات SCS را کاهش میدهد، اما همچنان با مشکل بنیادی Repeatها و دادههای ناقص Sequencing مواجه است.
در بخشهای قبلی، دو روش محاسباتی برای حل مسئله Genome Assembly بررسی شد:
- Shortest Common Superstring (SCS) مبتنی بر Overlap Graph
- Eulerian Walk مبتنی بر De Bruijn Graph
هر دو روش ایدههای مهمی ارائه میدهند، اما در عمل مشکلات جدی دارند، مخصوصاً در مواجهه با:
- خطاهای Sequencing
- ژنومهای تکراری (Repetitive Genomes)
- تفاوتهای طبیعی بین نسخههای کروموزومها (Polyploidy)
- حجم بسیار بزرگ دادههای واقعی
در این درس بررسی میشود که نرمافزارهای واقعی مونتاژ ژنوم (Genome Assemblers) چگونه با این مشکلات برخورد میکنند.
هدف یادگیری:
- شناخت دو خانواده اصلی نرمافزارهای Assembly
- درک دلیل پیچیده و نامرتب بودن گرافهای واقعی
- آشنایی با مفهوم Contig به عنوان خروجی عملی مونتاژگرها
نرمافزاری است که از مجموعهای از Readهای حاصل از Sequencing، تلاش میکند توالی اصلی ژنوم را بازسازی کند.
مونتاژگرها معمولاً ابتدا یک گراف ایجاد میکنند:
- Overlap Graph
- De Bruijn Graph
سپس تلاش میکنند مسیرهای مناسب در گراف را پیدا کنند و توالی ژنوم را بازسازی کنند.
اما در دادههای واقعی، گراف معمولاً:
- بزرگ
- پیچیده
- دارای شاخههای متعدد
- دارای ابهام
است.
یک خانواده از الگوریتمهای Assembly است که از Overlap Graph استفاده میکند.
پیدا کردن بخشهای مشترک بین Readها.
مثلاً:
Read A:
ACGTAAA
Read B:
TAAAGGC
دارای همپوشانی:
TAAA
قرار دادن Readها در ترتیب مناسب بر اساس Overlapها.
ایجاد توالی نهایی با استفاده از اطلاعات چند Read.
این روش بیشتر برای:
- Readهای بلند (Long Reads)
- ژنومهای بزرگ
استفاده میشود.
روش مونتاژی که از De Bruijn Graph برای نمایش روابط بین k-merها استفاده میکند.
در این روش:
- هر Read به k-merهای کوچکتر تقسیم میشود.
- k-merها به گراف تبدیل میشوند.
- مسیر مناسب در گراف، بازسازی ژنوم را ایجاد میکند.
برای دادههای کوتاه (Short Reads) بسیار مناسب است.
در مثالهای آموزشی، گرافها کوچک و ساده بودند.
اما در عمل:
یک De Bruijn Graph واقعی ممکن است هزاران یا میلیونها گره داشته باشد.
دلایل پیچیدگی:
- Sequencing Errors
- Transitive Edges
- Polyploidy
- Repeats
خطاهایی که دستگاه Sequencer هنگام خواندن DNA ایجاد میکند.
یک خطای کوچک میتواند باعث ایجاد:
- شاخههای غیرواقعی
- مسیرهای بنبست (Dead Ends)
- قطعات جداشده از گراف
شود.
فرض کنید توالی واقعی:
ACGTACGT
اما دستگاه بخواند:
ACGTTCGT
این یک k-mer اشتباه ایجاد میکند که در گراف یک مسیر اضافی میسازد.
مونتاژگر باید:
- این مسیرهای اشتباه را حذف کند.
- آنها را نادیده بگیرد.
یالهایی در گراف که اطلاعات جدیدی اضافه نمیکنند و از یالهای دیگر قابل پیشبینی هستند.
فرض کنید:
- Read A با Read B همپوشانی 6 دارد.
- Read B با Read C همپوشانی 6 دارد.
اگر طول Readها 7 باشد، احتمالاً:
- A و C نیز همپوشانی 5 دارند.
بنابراین یال A → C از قبل قابل پیشبینی است.
وجود تعداد زیاد این یالها باعث:
- بزرگ شدن غیرضروری گراف
- افزایش پیچیدگی محاسباتی
میشود.
وجود چند نسخه از یک کروموزوم یا ژنوم.
انسان:
- یک نسخه از مادر
- یک نسخه از پدر
دریافت میکند.
گاهی یک موقعیت DNA در این دو نسخه متفاوت است.
مثلاً:
نسخه مادری:
A
نسخه پدری:
G
این تفاوت باعث ایجاد ساختاری به نام:
در گراف میشود.
دو مسیر موازی که نشاندهنده دو نسخه متفاوت از یک ناحیه ژنوم هستند.
این یک خطا نیست؛ بلکه یک تفاوت واقعی ژنتیکی است.
مونتاژگر ممکن است:
- Bubble را ادغام کند.
- اطلاعات تفاوت را جداگانه نگه دارد.
توالیهایی که چندین بار در ژنوم تکرار شدهاند.
Repeatها باعث ایجاد:
در گراف میشوند.
زیرا مشخص نیست:
- چند بار باید از یک مسیر عبور کنیم.
- هر بخش متعلق به کدام موقعیت ژنوم است.
مشکل:
Over-collapse
یعنی:
تکرارها کمتر از مقدار واقعی بازسازی میشوند.
مشکل:
Genome Reshuffling
یعنی:
بخشهای بین Repeatها ممکن است جابهجا شوند.
یک بخش از ژنوم است که میتوان آن را بدون ابهام مونتاژ کرد.
نام 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 هستند.
پاسخ: دو دسته اصلی عبارتاند از:
- Overlap-Layout-Consensus (OLC) که از Overlap Graph استفاده میکند.
- De Bruijn Graph-based Assemblers که از De Bruijn Graph استفاده میکنند.
پاسخ: زیرا یک خطای کوچک میتواند k-merهای اشتباه ایجاد کند و باعث تشکیل شاخهها یا مسیرهای غیرواقعی در گراف شود.
پاسخ: Bubble معمولاً نشاندهنده تفاوت واقعی بین دو نسخه ژنوم، مانند نسخه مادری و پدری، در موجودات Diploid است.
پاسخ: زیرا Repeatها باعث ایجاد ابهام در گراف میشوند و بخشهایی از ژنوم قابل بازسازی قطعی نیستند.
پاسخ: توالیهای تکراری (Repeat Sequences)، زیرا باعث ایجاد ابهام و چندین مسیر ممکن در گراف میشوند.
در این درس به یکی از مهمترین چالشهای Genome Assembly (مونتاژ ژنوم) یعنی وجود DNAهای تکراری (Repetitive DNA) پرداخته میشود و بررسی میکنیم که چگونه افزایش طول خوانشهای توالییابی (Long Reads) میتواند این مشکل را کاهش دهد.
در درسهای قبل دیدیم که:
- الگوریتم Shortest Common Superstring میتواند تکرارها را بیش از حد ادغام کند (Over-collapse).
- الگوریتمهای مبتنی بر De Bruijn Graph نیز در حضور تکرارها ممکن است دچار ابهام شوند.
راهحل نظری این مشکل، استفاده از Reads طولانیتر است؛ زیرا خوانشهای بلند میتوانند نواحی تکراری را به بخشهای منحصربهفرد اطرافشان متصل کنند و جایگاه واقعی آنها را مشخص کنند.
هدف این درس:
- درک دلیل اهمیت طول خوانشها در مونتاژ ژنوم
- فهم اینکه چرا Reads کوتاه باعث ابهام میشوند
- آشنایی با فناوریهایی که امکان تولید Reads طولانیتر را فراهم کردهاند
بخشهایی از ژنوم که یک توالی مشابه چندین بار در نقاط مختلف ژنوم تکرار شده است.
در فرآیند مونتاژ ژنوم، الگوریتم باید مشخص کند که هر Read متعلق به کدام بخش ژنوم است.
اگر یک توالی در چندین نقطه تکرار شده باشد، یک Read کوتاه که فقط شامل آن بخش تکراری است، اطلاعات کافی برای تعیین محل واقعی خود ندارد.
مثلاً اگر در یک ژنوم سه بار کلمه:
LONG LONG LONG
وجود داشته باشد، یک Read کوتاه ممکن است فقط بگوید:
«من یک بخش LONG هستم»
اما نمیتواند مشخص کند که متعلق به کدام نسخه از LONG است.
DNAهای تکراری یکی از اصلیترین دلایل دشواری Assembly هستند.
خوانشهای توالییابی که تعداد بازهای بیشتری را شامل میشوند.
هرچه Read طولانیتر باشد، احتمال بیشتری وجود دارد که:
- بخشی از توالی تکراری را شامل شود.
- به نواحی غیرتکراری اطراف آن نیز برسد.
این نواحی غیرتکراری مانند «نشانههای مکانی» عمل میکنند و مشخص میکنند که تکرار باید در کدام قسمت ژنوم قرار گیرد.
Reads طولانی باعث کاهش ابهام در Assembly میشوند و میتوانند تکرارهای طولانی را بهتر حل کنند.
اتصال یک بخش تکراری به توالیهای منحصربهفرد اطراف آن برای تعیین محل صحیح آن.
فرض کنید در ژنوم یک بخش قرمز رنگ سه بار تکرار شده است:
Unique - Repeat - Unique
اگر Read فقط بخش Repeat را پوشش دهد، نمیدانیم این Repeat متعلق به کدام مکان است.
اما اگر Read به اندازهای بلند باشد که:
Unique - Repeat - Unique
را کامل پوشش دهد، میتوانیم جایگاه Repeat را دقیق مشخص کنیم.
این اصل دلیل اصلی مفید بودن Long Reads در Assembly است.
روشی که در آن به جای خواندن DNA فقط از یک انتها، هر دو انتهای یک مولکول DNA خوانده میشود.
در روش معمول:
DNA Template
============>
Read
====>
فقط یک طرف DNA خوانده میشود.
در Paired-End:
<==== ====>
Read 1 Read 2
هر دو انتهای مولکول توالییابی میشوند.
نتیجه:
- اطلاعات بیشتری از یک مولکول DNA دریافت میکنیم.
- طول مؤثر اطلاعات تقریباً دو برابر میشود.
گاهی بین دو Read یک فاصله ناشناخته وجود دارد:
Read ---- gap ---- Read
که Assembly باید آن را مدیریت کند.
Paired-End Sequencing یکی از رایجترین روشها برای افزایش اطلاعات هر Template است.
فناوریهایی که DNA را به صورت یک مولکول منفرد توالییابی میکنند.
برخلاف روشهای نسل دوم که تعداد زیادی مولکول مشابه را همزمان بررسی میکنند، در Single-Molecule Sequencing:
- هر مولکول DNA به صورت جداگانه خوانده میشود.
- امکان تولید Reads بسیار طولانی وجود دارد.
طول Read در این فناوریها میتواند:
- دهها هزار باز
- حتی صدها هزار باز
باشد.
این فناوریها توانایی حل بسیاری از تکرارهای ژنومی را دارند.
اشتباه دستگاه در تشخیص بازهای 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 بلند احتمال بیشتری دارند که هر دو را شامل شوند.
در مثال قبلی:
ژنوم دارای سه نسخه از:
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ها را کاملاً حل کند.
پاسخ: زیرا Reads کوتاه که فقط بخش تکراری را شامل میشوند، نمیتوانند مشخص کنند این Repeat متعلق به کدام بخش ژنوم است.
پاسخ: زیرا میتوانند Repeat را همراه با توالیهای غیرتکراری اطراف آن بخوانند و جایگاه دقیق Repeat را مشخص کنند.
پاسخ: Short Read طول کوتاه و معمولاً دقت بالاتر دارد، در حالی که Long Read اطلاعات طولانیتری ارائه میدهد اما ممکن است خطای بیشتری داشته باشد.
پاسخ: با خواندن هر دو انتهای یک مولکول DNA، اطلاعات بیشتری درباره همان Template فراهم میکند.
پاسخ: زیرا میتواند Reads بسیار طولانی تولید کند که بسیاری از Repeatهای پیچیده را قابل حل میکند.
پاسخ: زیرا Long Reads معمولاً خطای بیشتری دارند و الگوریتمها باید بتوانند این خطاها را مدیریت کنند.
04_algorithms-for-assembly/01_module-4-algorithms-for-assembly/12_lecture-computer-science-and-life-science
در این درس به نقش اساسی Computer Science (علوم کامپیوتر) در پیشرفت Life Science (علوم زیستی) پرداخته میشود.
امروزه زیستشناسی، بهخصوص حوزههایی مانند Computational Genomics (ژنومیک محاسباتی)، دیگر فقط یک علم آزمایشگاهی نیست؛ بلکه به شدت به الگوریتمها، ساختارهای داده، محاسبات بزرگ و تحلیل داده وابسته است.
دانشمندان کامپیوتر با تواناییهای خود در زمینههایی مانند:
- طراحی الگوریتمها
- مدیریت دادههای حجیم
- تحلیل آماری
- یادگیری ماشین
- مدلسازی شبکهها
میتوانند نقش رهبری در تحقیقات زیستی داشته باشند.
هدف این درس:
- درک ارتباط عمیق بین علوم کامپیوتر و علوم زیستی
- شناخت مفاهیم مشترک میان دو حوزه
- فهم اینکه چرا زیستشناسی مدرن به متخصصان محاسباتی نیاز دارد
شاخهای از زیستشناسی که از روشهای محاسباتی برای تحلیل دادههای ژنتیکی استفاده میکند.
با پیشرفت فناوریهای توالییابی DNA، حجم دادههای زیستی به شدت افزایش یافته است.
برای تحلیل این دادهها نیاز به:
- الگوریتمهای کارآمد
- ساختارهای داده مناسب
- توان پردازشی بالا
- روشهای آماری
وجود دارد.
بنابراین فردی که هم زیستشناسی و هم علوم کامپیوتر را بداند، میتواند مسائل پیچیده زیستی را حل کند.
بسیاری از پروژههای بزرگ ژنتیکی مانند Human Genome Project بدون مشارکت متخصصان کامپیوتر امکانپذیر نبودند.
روشهای مشابهی که هر دو حوزه برای سادهسازی و مدلسازی مسائل پیچیده استفاده میکنند.
علوم کامپیوتر و زیستشناسی، هر دو جهان واقعی را به مدلهای ریاضی و محاسباتی تبدیل میکنند.
سه مدل مهم مشترک عبارتاند از:
دنبالهای محدود از نمادها.
مولکولهای زیستی مانند:
- DNA
- RNA
- Protein
را میتوان به صورت رشتههایی از حروف نمایش داد.
مثلاً DNA:
A T G C A A T
یک رشته از نمادها است.
مسائل مربوط به رشتهها مانند:
- جستجوی الگو
- مقایسه رشتهها
- یافتن شباهتها
دهههاست که در علوم کامپیوتر مطالعه شدهاند.
ساختارهایی برای نمایش روابط سلسلهمراتبی.
مثالها:
روابط تکاملی بین گونهها را نشان میدهد.
نحوه انتقال صفات ژنتیکی در نسلها را نمایش میدهد.
درختها یکی از مهمترین ساختارهای داده هستند و برای:
- سازماندهی دادهها
- جستجو
- نمایش مسیرهای حل مسئله
استفاده میشوند.
مدلهایی شامل:
- Node (گره)
- Edge (یال)
برای نمایش ارتباطات.
مثلاً:
Protein Interaction Networks
شبکهای که نشان میدهد پروتئینها چگونه با یکدیگر تعامل دارند.
با بررسی بخشهایی از این شبکه میتوان فهمید:
- کدام پروتئینها همکاری میکنند.
- چگونه عملکردهای سلولی ایجاد میشوند.
گرافها برای مدلسازی مواردی مانند:
- شبکههای اجتماعی
- ارتباط صفحات وب
- مسیرهای محاسباتی
استفاده میشوند.
دادههایی که توسط فناوریهای مدرن با سرعت و حجم بسیار زیاد تولید میشوند.
ابزارهای زیستی جدید مانند:
DNA Sequencer
میتوانند میلیونها یا میلیاردها قطعه DNA تولید کنند.
این حجم داده بسیار بیشتر از توان تحلیل دستی انسان است.
بنابراین نیاز به:
- پردازش موازی
- محاسبات ابری
- الگوریتمهای مقیاسپذیر
وجود دارد.
یک پایگاه داده بزرگ برای ذخیره دادههای حاصل از توالییابی DNA.
میتوان آن را مانند:
«وب جهانی برای دادههای DNA»
در نظر گرفت.
حجم این پایگاه داده با سرعت بسیار زیادی افزایش یافته است.
مثلاً در سال 2014:
- حجم آن در حدود 10 ماه از 2 پتابایت به 3 پتابایت افزایش یافت.
برای تحلیل این حجم داده، زیستشناسان نیازمند متخصصان محاسباتی هستند.
استفاده از روشهای آماری و محاسباتی برای استخراج دانش از دادههای زیستی.
دادههای زیستی معمولاً:
- دارای خطا هستند.
- ناقص هستند.
- دارای سوگیری (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 | سوگیری | انحراف سیستماتیک در دادهها |
در علوم کامپیوتر، یک String مانند:
HELLO
است.
در ژنتیک، DNA نیز مشابه است:
ATGCCAT
بنابراین بسیاری از الگوریتمهای رشتهای میتوانند برای مسائل ژنتیکی استفاده شوند.
همانطور که اینترنت حجم عظیمی از اطلاعات را ذخیره میکند، Sequence Read Archive نیز حجم عظیمی از دادههای توالییابی را ذخیره میکند.
اما برای استفاده از این دادهها، نیاز به ابزارهای محاسباتی داریم.
- علوم کامپیوتر نقش مهمی در زیستشناسی مدرن دارد.
- ژنومیک محاسباتی ترکیبی از زیستشناسی و الگوریتمها است.
- DNA و پروتئینها را میتوان به صورت String مدل کرد.
- روابط تکاملی و ژنتیکی با Treeها نمایش داده میشوند.
- شبکههای پروتئینی نمونهای از کاربرد Graphها در زیستشناسی هستند.
- فناوریهای High-Throughput حجم عظیمی از داده تولید میکنند.
- تحلیل دادههای زیستی نیازمند مهارتهای Data Science است.
- خطا، ابهام و سوگیری بخش جداییناپذیر دادههای زیستی هستند.
- دانشمندان کامپیوتر میتوانند نقش کلیدی در تحقیقات زیستی داشته باشند.
پاسخ: زیرا فناوریهای جدید زیستی حجم بسیار زیادی داده تولید میکنند که بدون الگوریتمها و روشهای محاسباتی قابل تحلیل نیستند.
پاسخ: با نمایش DNA به صورت یک String، میتوان از الگوریتمهای مربوط به رشتهها برای تحلیل آن استفاده کرد.
پاسخ: Stringها، Treeها و Graphها.
پاسخ: زیرا حجم آنها بسیار زیاد است و علاوه بر آن دارای خطا، عدم قطعیت و سوگیری هستند.
پاسخ: زیرا مهارتهای او در الگوریتم، پردازش داده و مدلسازی دقیقاً برای حل مسائل پیچیده زیستی مورد نیاز است.
این بخش پایانی دوره به جمعبندی رسمی کلاس و تشکر از افراد و دانشجویانی اختصاص دارد که در ایجاد و توسعه دوره مشارکت داشتهاند.
- درک اهمیت بازخورد دانشجویان در بهبود دورههای آموزشی آنلاین
- آشنایی با نقش همکاری تیمی در تولید محتوای علمی
- قدردانی از مشارکت جامعه یادگیرندگان در شکلگیری یک دوره آموزشی
بازخورد دوره، نظرات و پیشنهادهایی است که دانشجویان درباره محتوای آموزشی، ساختار درس، روش تدریس و تجربه یادگیری ارائه میکنند.
در دورههای آموزشی جدید، بهخصوص دورههای آنلاین، بازخورد دانشجویان نقش مهمی در اصلاح و توسعه محتوا دارد. یک دوره آموزشی با دریافت نظرات کاربران میتواند:
- نقاط ضعف خود را شناسایی کند.
- مطالب دشوار را بهتر توضیح دهد.
- ساختار آموزشی را بهبود دهد.
- تجربه یادگیری دانشجویان آینده را ارتقا دهد.
از آنجا که این دوره یک دوره جدید بود، بازخورد دانشجویان برای شکل دادن به نسخههای آینده آن اهمیت ویژهای داشت.
فرآیندی که در آن افراد مختلف با تخصصها و نقشهای متفاوت برای ایجاد یک محصول آموزشی همکاری میکنند.
ساخت یک دوره دانشگاهی آنلاین تنها نتیجه کار یک مدرس نیست، بلکه نیازمند همکاری افراد مختلف مانند:
- مدرس اصلی
- تیم تولید محتوا
- متخصصان آموزشی
- همکاران فنی
- جامعه دانشجویان
است.
همکاری تیمی باعث میشود محتوای آموزشی کیفیت بالاتری داشته باشد و بتواند به تعداد زیادی از یادگیرندگان در سراسر جهان ارائه شود.
- یک دوره آموزشی موفق، محصول همکاری افراد مختلف است، نه فقط تلاش یک مدرس.
- بازخورد دانشجویان یکی از مهمترین ابزارهای بهبود آموزش آنلاین است.
- مشارکت دانشجویان در انجمنها و بحثهای دوره، بخشی از فرآیند یادگیری و توسعه دوره محسوب میشود.
- دورههای علمی جدید برای رشد و تکامل به تعامل مداوم با جامعه یادگیرندگان نیاز دارند.
| اصطلاح انگلیسی | ترجمه فارسی | توضیح |
|---|---|---|
| Feedback | بازخورد | نظرات و پیشنهادهای کاربران برای بهبود یک محصول یا فرآیند |
| Course Improvement | بهبود دوره | اصلاح و ارتقای محتوای آموزشی بر اساس تجربه کاربران |
| Online Learning Community | جامعه یادگیری آنلاین | گروهی از دانشجویان که برای یادگیری و تبادل نظر در فضای آنلاین تعامل دارند |
| Collaboration | همکاری | مشارکت چند فرد یا گروه برای رسیدن به یک هدف مشترک |
| Educational Content | محتوای آموزشی | مطالب، ویدیوها، تمرینها و منابع مورد استفاده برای آموزش |
یک دوره آموزشی را میتوان مانند یک نرمافزار در نظر گرفت که پس از انتشار همچنان نیاز به اصلاح و بهروزرسانی دارد.
همانطور که توسعهدهندگان نرمافزار از گزارش کاربران برای رفع مشکلات استفاده میکنند، مدرسان نیز از بازخورد دانشجویان برای بهتر کردن دوره استفاده میکنند.
- بازخورد دانشجویان نقش مهمی در توسعه و بهبود دورههای آموزشی دارد.
- دورههای آنلاین جدید معمولاً با دریافت نظرات کاربران تکامل پیدا میکنند.
- تولید یک دوره علمی نیازمند همکاری افراد با تخصصهای مختلف است.
- جامعه دانشجویان و مشارکت آنها بخشی از موفقیت یک دوره آموزشی محسوب میشود.
- آموزش علمی مدرن یک فرآیند تعاملی و پیوسته است.
- کیفیت یک دوره تنها به محتوای اولیه آن محدود نیست، بلکه به بهبودهای بعدی نیز وابسته است.
پاسخ: زیرا به تیم آموزشی کمک میکند مشکلات، نقاط ضعف و بخشهای نیازمند اصلاح را شناسایی کرده و دوره را برای دانشجویان آینده بهتر کند.
پاسخ: خیر. تولید یک دوره موفق نیازمند همکاری مدرس، تیم تولید محتوا، متخصصان آموزشی و جامعه دانشجویان است.
پاسخ: با ارائه بازخورد، شرکت در بحثهای انجمن دوره، گزارش مشکلات و پیشنهاد راهکارهای بهتر برای آموزش.
پاسخ: زیرا تجربه واقعی یادگیرندگان اطلاعات ارزشمندی درباره کیفیت محتوا و روش تدریس فراهم میکند و امکان بهبود مستمر دوره را ایجاد میکند.