بیوانفورماتیک برای همه
104 subscribers
9 photos
1 file
12 links
بیوانفورماتیک برای همه
Download Telegram
بسم الله الرحمن الرحیم


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

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

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

موفق و سربلند باشید.
3
مبانی بیوانفورماتیک به زبان ساده



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

برای شروع یادگیری بیوانفورماتیک، یک برنامه آموزشی گام به گام برای شما آماده کرده‌ام:


1. مبانی زیست‌شناسی (پست اول )

2. مبانی علوم کامپیوتر : نصب ؛ متغیرها ؛ عملگرها ؛ ساختارهای کنترلی : شرطی و حلقه ها ( for و while) ؛ سیستم عامل و چند دستور کاربردی در آن ، کاربردهای خط فرمان در بیوانفورماتیک

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

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

این آموزش در سطح مقدماتی است و با کمک نرم افزار پایتون عرضه می شود.
1. مبانی زیست شناسی

بخش اول:

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

یوکاریوت‌ها eukaryotes : این سلول‌ها دارای هسته هستند، یک اندامک غشادار که DNA سلول را در خود جای می‌دهد. سلول‌های گیاهان، جانوران، قارچ‌ها و آغازیان از نوع یوکاریوتی هستند. ما قبلاً در مورد اجزای یک سلول یوکاریوتی صحبت کردیم.

پروکاریوت‌ها prokaryote : این سلول‌ها هسته ندارند. ماده ژنتیکی آن‌ها، که معمولاً یک مولکول DNA حلقوی است، در ناحیه‌ای از سیتوپلاسم به نام نوکلئوئید قرار دارد. باکتری‌ها و آرکئ‌ها از نوع پروکاریوتی هستند.
3
1. مبانی زیست شناسی

بخش دوم:

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

1. تصور کنید DNA دفترچه راهنمای یک موجود زنده است. این مولکول حاوی تمام اطلاعات ژنتیکی لازم برای ساخت و عملکرد یک ارگانیسم است در پروکاریوت‌ها DNA معمولاً به صورت یک مولکول حلقوی است و در سیتوپلاسم قرار دارد. پروکاریوت‌ها همچنین ممکن است مولکول‌های DNA کوچک حلقوی دیگری به نام پلاسمید داشته باشند که می‌توانند ژن‌های مفیدی مانند مقاومت به آنتی‌بیوتیک‌ها را حمل کنند.برخلاف پروکاریوت‌ها، DNA یوکاریوتی به صورت خطی و بسیار طویل است و به شدت با پروتئین‌هایی به نام هیستون‌ها پیچیده شده و ساختارهایی به نام کروموزوم‌ها را تشکیل می‌دهد. DNA در داخل هسته سلول قرار دارد و از سیتوپلاسم توسط غشای هسته محافظت می‌شود.
1
2. از RNA برای انتقال اطلاعات ژنتیکی از DNA به ریبوزوم‌ها (برای ساخت پروتئین) استفاده می‌کنند. انواع مختلفی از RNA در پروکاریوت‌ها و یوکاریوت ها وجود دارد، از جمله mRNA(پیام‌رسان)، tRNA )انتقال‌دهنده) و rRNA (ریبوزومی) . یک تفاوت مهم در یوکاریوت‌ها این است که mRNA قبل از خروج از هسته و ترجمه به پروتئین، تحت فرآیندهای پردازشی پیچیده‌ای مانند پیرایش (splicing) قرار می‌گیرد اما در پروکاریوت‌ها این فرآیندها همزمان در سیتوپلاسم رخ می‌دهند.

3.پروتئین‌ها: پروتئین‌ها نقش‌های بسیار متنوعی ایفا می‌کنند، از کاتالیز واکنش‌های شیمیایی (آنزیم‌ها) گرفته تا ساختاردهی سلول و انتقال مواد. پروتئین‌ها را بر اساس دستورالعمل‌های موجود در mRNA می‌سازند. تفاوت : علاوه بر ابعاد کوچکتر ریبوزوم‌های پروکاریوتی نسبت به ریبوزوم‌های یوکاریوتی, در سلول‌های پروکاریوتی- به دلیل عدم وجود هسته- فرآیند سنتز پروتئین (ترجمه) در سیتوپلاسم انجام می‌شود اما در سلول های یوکاریوتی در سیتوپلاسم و همچنین روی شبکه آندوپلاسمی رخ می دهد.
1
1. مبانی زیست‌شناسی

بخش سوم:

برخی اندامک های مهم دیگر در سلول های یوکاریوتی عبارتند از :

1. شبکه آندوپلاسمی (endoplasmic reticulum - ER)که یک شبکه گسترده از لوله‌ها و کیسه‌های به هم پیوسته است که در سراسر سیتوپلاسم سلول یوکاریوتی گسترده شده است.

دو نوع اصلی شبکه آندوپلاسمی وجود دارد: شبکه آندوپلاسمی زبر (rough ER) و شبکه آندوپلاسمی صاف (smooth ER).

شبکه آندوپلاسمی زبر به این دلیل زبر به نظر می‌رسد که ریبوزوم‌ها به سطح آن متصل هستند. این ریبوزوم‌ها پروتئین‌هایی را سنتز می‌کنند که قرار است از سلول خارج شوند یا در غشاها قرار بگیرند.

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

به نظر شما، با توجه به نقشی که قبلاً برای ریبوزوم‌ها گفتیم، کدام نوع شبکه آندوپلاسمی در ساخت پروتئین‌های صادراتی نقش دارد؟

شبکه آندوپلاسمی زبر به دلیل داشتن ریبوزوم‌ها نقش کلیدی در ساخت پروتئین‌هایی دارد که قرار است از سلول خارج شوند یا در غشاها قرار بگیرند.
1
2. میتوکندری‌ها اندامک‌های بسیار مهمی در سلول هستند که وظیفه اصلی آن‌ها تولید انرژی است. آن‌ها اغلب به عنوان "نیروگاه سلول" شناخته می‌شوند، زیرا فرآیندی به نام تنفس سلولی را انجام می‌دهند که در آن گلوکز (قند) و اکسیژن برای تولید ATP (آدنوزین تری‌فسفات)، که منبع اصلی انرژی سلول است، استفاده می‌شوند.

میتوکندری‌ها ساختار جالبی دارند؛ آن‌ها دو غشا دارند، یک غشای بیرونی صاف و یک غشای داخلی که چین‌خورده است و کریستا (cristae) نامیده می‌شود. این چین‌خوردگی سطح بیشتری را برای انجام واکنش‌های تنفس سلولی فراهم می‌کند.
همچنین دارای ماده ژنتیکی مخصوص خود نیز هستند.
1
پست ذخیره
2. مبانی علوم کامپیوتر:

بخش اول :

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

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

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

برای اینکه بتوانید با پایتون برنامه‌نویسی کنید، باید آن را روی کامپیوتر خود نصب داشته باشید.

مراحل نصب پایتون:

1. به وب‌سایت رسمی پایتون بروید

2. آخرین نسخه پایتون برای ویندوز را دانلود کنید (معمولاً با دکمه زرد رنگ "Download Python X.Y.Z" مشخص شده است).

3. فایل دانلودی را اجرا کنید.

4. در پنجره نصب، حتماً تیک گزینه "Add Python X.Y to PATH" را بزنید. این کار باعث می‌شود که بتوانید پایتون را از هر جایی در خط فرمان ویندوز اجرا کنید.

5. روی "Install Now" کلیک کنید تا نصب آغاز شود.

پس از اتمام نصب، ممکن است پیامی مبنی بر موفقیت‌آمیز بودن نصب ببینید. می‌توانید پنجره را ببندید.

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

محیط‌های توسعه یکپارچه (Integrated Development Environments) یا به اختصار IDE، نرم‌افزارهای کاربردی هستند که ابزارها و امکانات مورد نیاز برنامه‌نویسان را برای توسعه نرم‌افزار در یک مکان واحد گردآوری می‌کنند. هدف اصلی یک IDE افزایش بهره‌وری برنامه‌نویسان با ارائه یک رابط کاربری منسجم و دسترسی آسان به ابزارهای ضروری است.

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

یکی از محبوب‌ترین و کاربرپسندترین این ها VS Code (Visual Studio Code) است. VS Code یک ویرایشگر کد رایگان است که امکانات بسیار زیادی مانند برجسته‌سازی syntax، اشکال‌زدایی (debugging) و پشتیبانی از افزونه‌های مختلف را دارد که می‌توانید برای پایتون نصب کنید.

مراحل نصب VS Code:

1. به وب‌سایت رسمی VS Code بروید

2.نسخه مناسب با سیستم عامل خود (احتمالاً ویندوز) را دانلود کنید.

3. فایل دانلودی را اجرا کنید و مراحل نصب را بپذیرید. معمولاً با چند بار زدن "Next" و در نهایت "Install" نصب به پایان می‌رسد.

4. بعد از اینکه VS Code نصب شد، برای اینکه بتوانید به راحتی کد پایتون را در آن اجرا کنید، بهتر است افزونه پایتون را هم نصب کنید:

4.1. VS Code را باز کنید.

4.2. در نوار سمت چپ، روی آیکون Extensions (شبیه چهار مربع کوچک) کلیک کنید.

4.3. در نوار جستجو، عبارت "Python" را تایپ کنید.

4.4 اولین نتیجه‌ای که معمولاً توسط Microsoft ارائه شده است را پیدا کنید و روی دکمه "Install" در کنار آن کلیک کنید.
4.5 پس از نصب این افزونه، VS Code برای توسعه پایتون آماده خواهد بود.
👍21
بیوانفورماتیک برای همه pinned «بسم الله الرحمن الرحیم در این کانال قصد دارم تا به صورت کلاس های متعدد کارگاهی، مفاهیم بیوانفورماتیکی و برخی تکنیک های مورد استفاده در آنها را به زبان ساده توضیح دهم. بدیهی است که چون تجربه جدیدی برای بنده است و در محیط تلگرام انجام می شود، عاری از ایراد…»
2. مبانی علوم کامپیوتر:

بخش دوم :

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

اولین مفهومی که در برنامه‌نویسی پایتون با آن آشنا می‌شویم، "متغیرها" هستند. متغیرها مانند جعبه‌هایی هستند که می‌توانیم مقادیر مختلفی (مانند اعداد یا متن) را در آن‌ها ذخیره کنیم و بعداً از آن‌ها استفاده کنیم.

برای مثال، در پایتون می‌توانیم بنویسیم:

name = "Ali"
age = 30

در اینجا، name و age متغیر هستند و "Ali" و 30 مقادیری هستند که در این متغیرها ذخیره شده‌اند.

✍🏻 یک متغیر به نام your_age تعریف کنید و سن خودتان را در آن قرار دهید. چطور این کار را انجام می‌دهید؟

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

your_age = 30


✍🏻 یک متغیر به نام city تعریف کنید و نام شهری که در آن زندگی می‌کنید را به آن اختصاص دهید:

City = "Mashhad"

توجه داشته باشید که در پایتون، بزرگی و کوچکی حروف در نام متغیرها مهم است، بنابراین City با city متفاوت است.


حالا که با مفهوم متغیرها آشنا شدید، می‌خواهیم به یکی دیگر از مفاهیم اساسی برنامه‌نویسی برویم: انواع داده‌ها. متغیرها می‌توانند مقادیر مختلفی را نگه دارند، و این مقادیر می‌توانند از انواع مختلفی باشند، مانند اعداد، متن، یا مقادیر منطقی (درست یا نادرست).

سه نوع داده رایج در پایتون عبارتند از:

int: برای اعداد صحیح (مثل 10، -5، 0).
str: برای رشته‌ها یا متن (مثل "Hello"، "Mashhad").
bool: برای مقادیر منطقی (یا True است یا False).

وقتی شما متغیری مثل "City = "Mashhad" تعریف می‌کنید، در واقع نوع داده این متغیر از نوع str (رشته) است، چون مقدار آن داخل علامت نقل قول قرار گرفته است. وقتی می‌نویسید your_age = 30، نوع داده your_age از نوع int (عدد صحیح) است.معمولا مقادیر منطقی در پاسخ به یک آنالیز ایجاد می شوند که پیشتر به آن خواهیم پرداخت.

✍️: من چند مقدار به شما می‌دهم و شما بگویید نوع داده هر کدام در پایتون ( int، str یا bool ) چیست:

123

"Hi"

True

3

"7-"

پاسخ:

پاسخ‌ها:

123 یک عدد صحیح (int) است.

"Hi" یک رشته (str) است.

متن Trueیک مقدار منطقی (bool) است.

3 یک عدد صحیح (int) است.

"7-" یک رشته (str) است (چون داخل علامت نقل قول قرار دارد).


در پایتون علاوه بر int، str و bool، انواع داده‌های دیگری هم وجود دارند که در بیوانفورماتیک بسیار مفید هستند. برخی از رایج‌ترین آن‌ها عبارتند از:

float:
برای اعداد اعشاری (مثل 3.14، -0.5) ; در بیوانفورماتیک، ممکن است با مقادیری مانند غلظت‌ها یا نسبت‌ها که اعشاری هستند، زیاد سروکار داشته باشید.

list:
برای نگهداری مجموعه‌ای از آیتم‌ها به ترتیب مشخص طراحی شده اند (مثل [1, 2, 3] یا ["apple", "banana", "cherry"]). لیست‌ها می‌توانند شامل آیتم‌هایی با انواع داده‌های مختلف باشند. لیست‌ها با استفاده از کروشه [] ایجاد می‌شوند و آیتم‌ها با کاما از هم جدا می‌شوند. مثال:

temperatures = [25.5, 26.0, 24.8]
genes = ["BRCA1", "TP53", "EGFR"]
mixed = [1, "hello", True, 3.14]


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


tuple:
مشابه لیست‌ها، اما تغییرناپذیر هستند (بعد از ایجاد نمی‌توانید آیتم‌های آن‌ها را تغییر دهید) و معمولاً با پرانتز ایجاد می‌شوند (مثل (1, 2, 3)) :

coordinates = (10, 20)
colors = ("red", "green", "blue")


تاپل‌ها زمانی کاربرد دارند که بخواهید مجموعه‌ای از آیتم‌ها را نگه دارید که نباید تغییر کنند.

dict:
برای نگهداری مجموعه‌ای از جفت‌های کلید-مقدار (مثل :
{"name": "Ali", "age": 30})
هر مقدار در یک دیکشنری با یک کلید یکتا مرتبط است. دیکشنری‌ها با استفاده از آکولاد {} ایجاد می‌شوند. دیکشنری‌ها برای دسترسی سریع به مقادیر بر اساس کلیدها بسیار مفید هستند.

gene_info = {"name": "BRCA1", "type": "protein-coding", "chromosome": 17}
results = {"sample1": 0.85, "sample2": 0.92}


فرض کنید می‌خواهید اطلاعات مربوط به چند ژن را ذخیره کنید، جایی که نام ژن کلید و اطلاعات آن مقدار است:

gene_data = {
"BRCA1": {"full_name": "Breast Cancer 1", "chromosome": 17},
"TP53": {"full_name": "Tumor Protein p53", "chromosome": 17}
}


در اینجا با استفاده از نام ژن می‌توانید به اطلاعات مربوط به آن دسترسی پیدا کنید. دقت کنید که برای هر ژن مقادیر متعددی اطلاعات درون آکولاد قرار گرفته که هر مقدار از مقدار دیگر با : جدا شده است. همچنین تعداد مقادیر بین دو ژن یکسان است و حتی در صورت عدم وجود هر یک، لازم است این روند حفظ شود.
👍1
2. مبانی علوم کامپیوتر:

بخش سوم :

حالا که با متغیرها و انواع داده‌های اصلی در پایتون آشنا شدیم، نوبت به عملگرها می‌رسد. عملگرها نمادهایی هستند که برای انجام عملیات مختلف روی متغیرها و مقادیر استفاده می‌شوند.

چند دسته اصلی از عملگرها در پایتون وجود دارد:

عملگرهای حسابی: برای انجام محاسبات ریاضی مانند جمع (+)، تفریق (-)، ضرب (*)، تقسیم (/)، توان (**) و باقیمانده تقسیم (%).

عملگرهای مقایسه‌ای: برای مقایسه دو مقدار و تعیین رابطه بین آن‌ها. این عملگرها شامل بزرگتر از (>)، کوچکتر از (<)، بزرگتر یا مساوی (>=)، کوچکتر یا مساوی (<=)، مساوی (==) و نامساوی (!=) هستند. نتیجه این عملگرها یک مقدار منطقی (True یا False) است.

عملگرهای منطقی: برای ترکیب یا تغییر مقادیر منطقی. این عملگرها شامل and (و)، or (یا) و not (نقیض) هستند.

عملگرهای انتساب: برای اختصاص دادن یک مقدار به یک متغیر استفاده می‌شوند. ساده‌ترین آن‌ها = است، اما عملگرهای ترکیبی دیگری هم وجود دارند مانند +=, -=, *=, /=. برای مثال، x += 5 معادل x = x + 5 است.


عملگرهای حسابی:

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

+: جمع (مثال: 2 + 3 نتیجه‌اش 5 می‌شود)
-: تفریق (مثال: 5 - 2 نتیجه‌اش 3 می‌شود)
*: ضرب (مثال: 4 * 3 نتیجه‌اش 12 می‌شود)
/: تقسیم (مثال: 10 / 2 نتیجه‌اش 5.0 می‌شود. توجه کنید که نتیجه تقسیم همیشه یک عدد اعشاری (float) است.)
: توان (مثال: 2 3 نتیجه‌اش 3 به توان 2 یعنی 8 می‌شود)
%: باقیمانده تقسیم (مثال: 10 % 3 نتیجه‌اش 1 می‌شود، چون باقیمانده تقسیم 10 بر 3 برابر 1 است).

برای اینکه این موضوع را بهتر درک کنید، یک مثال مرتبط با زیست‌شناسی می‌زنیم. فرض کنید در یک آزمایش، تعداد دو نوع باکتری را در دو ظرف جداگانه شمارش کرده‌ایم. در ظرف اول 500 باکتری از نوع A و در ظرف دوم 300 باکتری از نوع B وجود دارد.

چطور می‌توانیم با استفاده از عملگر جمع (+) در پایتون، مجموع کل باکتری‌ها را محاسبه کنیم؟

total_bacteria = 500 + 300
print(total_bacteria)


در اینجا متغیر total_bacteria را تعریف کرده و با دستور print محتوای آن را در صفحه نمایش مشاهده کردیم.

عملگرهای مقایسه‌ای:

این عملگرها برای مقایسه دو مقدار استفاده می‌شوند و نتیجه آن‌ها یک مقدار منطقی (True یا False) است.

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

> (بزرگتر از): آیا میانگین سطح بیان در گروه دوم بزرگتر از گروه اول است؟ (4.5 > 3.2 نتیجه‌اش True خواهد بود.)
< (کوچکتر از): آیا میانگین سطح بیان در گروه اول کوچکتر از گروه دوم است؟ (3.2 < 4.5 نتیجه‌اش True خواهد بود.)
== (مساوی): آیا میانگین سطح بیان در گروه اول با گروه دوم برابر است؟ (3.2 == 4.5 نتیجه‌اش False خواهد بود.)
!= (نامساوی): آیا میانگین سطح بیان در گروه اول با گروه دوم نابرابر است؟ (3.2 != 4.5 نتیجه‌اش True خواهد بود.)
>= (بزرگتر یا مساوی): آیا میانگین سطح بیان در گروه دوم بزرگتر یا مساوی گروه اول است؟ (4.5 >= 3.2 نتیجه‌اش True خواهد بود.)
<= (کوچکتر یا مساوی): آیا میانگین سطح بیان در گروه اول کوچکتر یا مساوی گروه دوم است؟ (3.2 <= 4.5 نتیجه‌اش True خواهد بود.)

مثال در پایتون:

gene_expression_group1 = 3.2
gene_expression_group2 = 4.5

is_higher = gene_expression_group2 > gene_expression_group1
print(f"آیا بیان ژن در گروه دوم بیشتر از گروه اول است؟ {is_higher}")

are_equal = gene_expression_group1 == gene_expression_group2
print(f"آیا بیان ژن در دو گروه برابر است؟ {are_equal}")


در این کد، ما دو متغیر برای سطح بیان ژن در دو گروه تعریف کردیم و سپس با استفاده از عملگرهای > و == آن‌ها را مقایسه کردیم و نتیجه را چاپ کردیم. فعلا از جزئیات کد و به خصوص شیوه (style) f گذر میکنیم.
عملگرهای منطقی :

این عملگرها برای ترکیب یا تغییر مقادیر منطقی (True یا False) استفاده می‌شوند:

and: اگر هر دو طرف عملگر True باشند، نتیجه True خواهد بود. (مثال: True and True نتیجه‌اش True است، اما True and False نتیجه‌اش False است.)
or: اگر حداقل یکی از طرفین عملگر True باشد، نتیجه True خواهد بود. (مثال: True or False نتیجه‌اش True است، False or False نتیجه‌اش False است.)
not: مقدار منطقی را معکوس می‌کند. (مثال: not True نتیجه‌اش False است، not False نتیجه‌اش True است.)

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

expression_level = 6.0
threshold = 5.0
chromosome = 17
is_high_and_correct_chromosome = expression_level > threshold and chromosome == 17
print(f"آیا بیان ژن بالا است و در کروموزوم 17 قرار دارد؟ {is_high_and_correct_chromosome}")



عملگرهای انتساب :

این عملگرها برای اختصاص دادن یک مقدار به یک متغیر استفاده می‌شوند. ساده‌ترین آن‌ها علامت مساوی (=) است که قبلاً هم از آن استفاده کرده‌ایم.

اما عملگرهای انتسابِ ترکیبی دیگری هم وجود دارند که یک عملگر حسابی را با عملگر انتساب ترکیب می‌کنند. این‌ها می‌توانند کد را کوتاه‌تر و خواناتر کنند:

+=: مقدار سمت راست را با مقدار فعلی متغیر جمع می‌کند و نتیجه را در همان متغیر ذخیره می‌کند. (مثال: x += 5 معادل x = x + 5)
-=: مقدار سمت راست را از مقدار فعلی متغیر کم می‌کند و نتیجه را در همان متغیر ذخیره می‌کند. (مثال: x -= 2 معادل x = x - 2)
*=: مقدار فعلی متغیر را در مقدار سمت راست ضرب می‌کند و نتیجه را در همان متغیر ذخیره می‌کند. (مثال: x *= 3 معادل x = x * 3)
/=: مقدار فعلی متغیر را بر مقدار سمت راست تقسیم می‌کند و نتیجه را در همان متغیر ذخیره می‌کند. (مثال: x /= 4 معادل x = x / 4)

فرض کنید در یک شبیه‌سازی رشد باکتری، در هر مرحله تعداد باکتری‌ها 10 واحد افزایش می‌یابد. می‌توانیم از عملگر += برای به‌روزرسانی تعداد باکتری‌ها استفاده کنیم:
bacteria_count = 100
bacteria_count += 10 # معادل bacteria_count = bacteria_count + 10
print(bacteria_count) # خروجی: 110


یا اگر بخواهیم در هر مرحله 5 واحد از تعداد مولکول‌های یک ماده کم شود:



molecule_count = 50
molecule_count -= 5 # معادل molecule_count = molecule_count - 5
print(molecule_count) # خروجی: 45
ساختارهای کنترلی :

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

الف- دستورات شرطی (Conditional Statements): این دستورات به ما امکان می‌دهند بر اساس یک شرط خاص، یک بلوک از کد را اجرا کنیم یا از آن رد شویم. مهم‌ترین دستور شرطی در پایتون if است که می‌تواند با elif (مخفف else if) و else همراه شود.

ب- حلقه‌ها (Loops): حلقه‌ها به ما امکان می‌دهند یک بلوک از کد را چندین بار تکرار کنیم. دو نوع اصلی حلقه در پایتون وجود دارد: for و while.

الف- دستورات شرطی
:

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

ساختار کلی دستور if در پایتون به این صورت است:


if condition:
# کدهایی که اگر شرط درست باشد اجرا می‌شوند


در اینجا، condition یک عبارت منطقی است که می‌تواند True یا False باشد. اگر condition ارزیابی شود و مقدار آن True باشد، کدهایی که داخل بلوک if (با یک تورفتگی مشخص می‌شوند) اجرا خواهند شد. اگر condition False باشد، آن بلوک از کد نادیده گرفته می‌شود و برنامه به خط بعدی بعد از بلوک if می‌رود.

یک مثال ساده در نظر بگیرید. فرض کنید می‌خواهیم بررسی کنیم که آیا سطح بیان یک ژن از یک مقدار آستانه بیشتر است یا نه، و اگر بیشتر بود، یک پیام چاپ کنیم:

gene_expression = 7.5
threshold = 5.0

if gene_expression > threshold:
print("سطح بیان ژن بالاتر از آستانه است.")


در این مثال، چون مقدار gene_expression (7.5) بزرگتر از threshold (5.0) است، شرط gene_expression > threshold درست ارزیابی می‌شود و پیام داخل دستور print() چاپ خواهد شد.

حالا یک سوال برای شما: اگر مقدار gene_expression برابر با 4.0 باشد، آیا پیام چاپ خواهد شد؟ چرا؟

اگر مقدار gene_expression برابر با 4.0 باشد، شرط gene_expression > threshold (یعنی 4.0 > 5.0) نادرست (False) ارزیابی می‌شود، و در نتیجه، دستور print() که داخل بلوک if قرار دارد، اجرا نخواهد شد.


حالا بیایید حالت دیگری را در نظر بگیریم. اگر بخواهیم در صورتی که شرط درست نباشد (یعنی سطح بیان ژن از آستانه کمتر یا مساوی باشد) هم یک کار دیگر انجام دهیم، می‌توانیم از دستور else به همراه if استفاده کنیم. ساختار آن به این صورت است:

if condition:
# کدهایی که اگر شرط درست باشد اجرا می‌شوند
else:
# کدهایی که اگر شرط نادرست باشد اجرا می‌شوند


مثال قبلی را با اضافه کردن else تغییر می‌دهیم:

gene_expression = 4.0
threshold = 5.0

if gene_expression > threshold:
print("سطح بیان ژن بالاتر از آستانه است.")
else:
print("سطح بیان ژن از آستانه کمتر یا مساوی است.")


در این حالت، چون gene_expression (4.0) از threshold (5.0) بزرگتر نیست، شرط False ارزیابی می‌شود و کدهای داخل بلوک else اجرا خواهند شد.

مثال دیگر:
فرض کنید در یک آزمایش PCR (واکنش زنجیره‌ای پلیمراز)، ما می‌خواهیم بررسی کنیم که آیا یک ژن خاص در نمونه DNA تکثیر شده است یا نه. یک راه برای این کار، بررسی اندازه قطعه DNA تولید شده است. فرض کنید اگر اندازه قطعه 500 جفت باز باشد، ژن مورد نظر تکثیر شده است.

می‌توانیم از ساختار if-else برای چاپ پیام مناسب بر اساس اندازه قطعه استفاده کنیم:

fragment_size = 500
expected_size = 500

if fragment_size == expected_size:
print("ژن مورد نظر با اندازه صحیح تکثیر شده است.")
else:
print("اندازه قطعه با اندازه مورد انتظار مطابقت ندارد.")


در این سناریو، چون fragment_size (500) با expected_size (500) برابر است، شرط fragment_size == expected_size درست ارزیابی می‌شود و پیام داخل بلوک if چاپ خواهد شد.

حالا شما یک تمرین انجام دهید. فرض کنید fragment_size برابر با 450 باشد. چه پیامی چاپ خواهد شد؟ چرا؟

اگر مقدار fragment_size برابر با 450 باشد، شرط fragment_size == expected_size (یعنی 450 == 500) نادرست (False) ارزیابی می‌شود، و در نتیجه، پیام داخل بلوک else چاپ خواهد شد: "اندازه قطعه DNA با اندازه مورد انتظار مطابقت ندارد."
حالا می‌خواهیم یک سطح بالاتر برویم و با دستور elif آشنا شویم. elif مخفف "else if" است و به ما امکان می‌دهد چندین شرط را به صورت متوالی بررسی کنیم. ساختار کلی آن به این صورت است:

if condition1:
# کدهایی که اگر
# condition1
# درست باشد اجرا می‌شوند
elif condition2:
# کدهایی که اگر
# condition2
# درست باشد و
# condition1
# نادرست، اجرا می‌شوند
elif condition3:
# کدهایی که اگر
# condition3
# درست باشد و
# condition1 و condition2
# نادرست، اجرا می‌شوند
...
else:
# کدهایی که اگر هیچکدام از شرایط قبلی درست نباشند اجرا می‌شوند


ما می‌توانیم هر چند تا که بخواهیم elif داشته باشیم. بلوک else در انتها اختیاری است و در صورتی اجرا می‌شود که هیچکدام از شرایط if و elif درست نباشند.

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

gene_expression = 3.5

if gene_expression > 5.0:
print("سطح بیان ژن بالا است.")
elif gene_expression > 2.0:
print("سطح بیان ژن متوسط است.")
else:
print("سطح بیان ژن پایین است.")


با توجه به مقدار gene_expression که 3.5 است، کدام پیام چاپ خواهد شد؟ چرا؟


مقدار gene_expression (3.5) از 5.0 بزرگتر نیست، بنابراین شرط اول (gene_expression > 5.0) نادرست است. سپس به شرط elif می‌رسیم که بررسی می‌کند آیا gene_expression از 2.0 بزرگتر است (3.5 > 2.0). این شرط درست است، بنابراین پیام "سطح بیان ژن متوسط است." چاپ می‌شود و بقیه بلوک‌های elif و else نادیده گرفته می‌شوند.
مثال دیگر:
فرض کنید در یک آزمایش PCR (واکنش زنجیره‌ای پلیمراز)، ما می‌خواهیم بررسی کنیم که آیا یک ژن خاص در نمونه DNA تکثیر شده است یا نه. یک راه برای این کار، بررسی اندازه قطعه DNA تولید شده است. فرض کنید اگر اندازه قطعه 500 جفت باز باشد، ژن مورد نظر تکثیر شده است.

می‌توانیم از ساختار if-else برای چاپ پیام مناسب بر اساس اندازه قطعه استفاده کنیم:

fragment_size = 500
expected_size = 500

if fragment_size == expected_size:
print("ژن مورد نظر با اندازه صحیح تکثیر شده است.")
else:
print("اندازه قطعه با اندازه مورد انتظار مطابقت ندارد.")


در این سناریو، چون fragment_size (500) با expected_size (500) برابر است، شرط fragment_size == expected_size درست ارزیابی می‌شود و پیام داخل بلوک if چاپ خواهد شد.

حالا شما یک تمرین انجام دهید. فرض کنید fragment_size برابر با 450 باشد. چه پیامی چاپ خواهد شد؟ چرا؟

اگر مقدار fragment_size برابر با 450 باشد، شرط fragment_size == expected_size (یعنی 450 == 500) نادرست (False) ارزیابی می‌شود، و در نتیجه، پیام داخل بلوک else چاپ خواهد شد: "اندازه قطعه DNA با اندازه مورد انتظار مطابقت ندارد."


حالا می‌خواهیم یک سطح بالاتر برویم و با دستور elif آشنا شویم. elif مخفف "else if" است و به ما امکان می‌دهد چندین شرط را به صورت متوالی بررسی کنیم. ساختار کلی آن به این صورت است:

if condition1:
# کدهایی که اگر condition1 درست باشد اجرا می‌شوند
elif condition2:
# کدهایی که اگر condition1 نادرست باشد و condition2 درست باشد اجرا می‌شوند
elif condition3:
# کدهایی که اگر condition1 و condition2 نادرست باشند و condition3 درست باشد اجرا می‌شوند
...
else:
# کدهایی که اگر هیچکدام از شرایط قبلی درست نباشند اجرا می‌شوند


ما می‌توانیم هر چند تا که بخواهیم elif داشته باشیم. بلوک else در انتها اختیاری است و در صورتی اجرا می‌شود که هیچکدام از شرایط if و elif درست نباشند.

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

gene_expression = 3.5

if gene_expression > 5.0:
print("سطح بیان ژن بالا است.")
elif gene_expression > 2.0:
print("سطح بیان ژن متوسط است.")
else:
print("سطح بیان ژن پایین است.")


با توجه به مقدار gene_expression که 3.5 است، کدام پیام چاپ خواهد شد؟ چرا؟


مقدار gene_expression (3.5) از 5.0 بزرگتر نیست، بنابراین شرط اول (gene_expression > 5.0) نادرست است. سپس به شرط elif می‌رسیم که بررسی می‌کند آیا gene_expression از 2.0 بزرگتر است (3.5 > 2.0). این شرط درست است، بنابراین پیام "سطح بیان ژن متوسط است." چاپ می‌شود و بقیه بلوک‌های elif و else نادیده گرفته می‌شوند.


ادامه مبحث مبانی علوم کامپیوتر
2
پادکست های تولید شده با هوش مصنوعی:


در این بخش با استفاده از هوش مصنوعی و به صورت صوتی، مقاله های مروری ارزشمندی را به شما به اشتراک می گذارم. براساس تجربه و برای استفاده بهتر، پادکست ها به زبان انگلیسی تولید می شوند و متن مقاله هم در اختیار شما قرار می گیرد.

1. RNA sequencing the teenage

2. DNA sequencing at 40: past, present and future
3
Audio
مقاله منتشر شده در سال ۲۰۱۹ توسط استارک، گرزلاک و هادفیلد، با عنوان "RNA sequencing the teenage years"، یک مرور جامع از تاریخچه، روش‌ها و کاربردهای تکنیک RNA sequencing (RNA-seq) ارائه می‌دهد. این مقاله ابتدا به کاربرد اصلی RNA-seq یعنی تجزیه و تحلیل بیان ژن افتراقی (DGE) و مراحل استاندارد آن می‌پردازد. سپس روش‌های نوین RNA-seq از جمله RNA-seq تک سلولی (scRNA-seq)، ترانسکریپتومیکس مکانی (spatialomics) و RNA-seq طولانی‌خوان (long-read RNA-seq) را شرح می‌دهد و مزایا و معایب هر کدام را در مقایسه با روش‌های کوتاه‌خوان سنتی بررسی می‌کند. این مقاله همچنین به اهمیت طراحی آزمایشگاهی مناسب و تحلیل داده‌های بیوانفورماتیکی در مطالعات RNA-seq اشاره دارد و در نهایت به کاربردهای پیشرفته‌تر این تکنیک در بررسی ساختار RNA (structurome) و برهم‌کنش‌های RNA-پروتئین و RNA-RNA (interactome) می‌پردازد.

متن مقاله در بخش نظرات قرار دارد.
👏3
حلقه‌ها (Loops) :


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

دو نوع اصلی حلقه در پایتون وجود دارد:

حلقه for: این حلقه برای تکرار روی یک دنباله (مانند یک لیست، یک رشته، یا یک محدوده از اعداد) استفاده می‌شود.

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


حلقه for:


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

ساختار کلی حلقه for در پایتون به این صورت است:

for item in sequence:
# کدهایی که برای هر آیتم در دنباله اجرا می‌شوند

در اینجا، item یک متغیر است که در هر بار تکرار حلقه، به مقدار آیتم بعدی در sequence اختصاص داده می‌شود. sequence دنباله‌ای است که می‌خواهیم روی آن پیمایش کنیم. کدهایی که داخل بلوک for (با تورفتگی) قرار دارند، برای هر آیتم در دنباله یک بار اجرا می‌شوند.

یک مثال ساده در نظر بگیرید. فرض کنید یک لیست از نام ژن‌ها داریم و می‌خواهیم هر کدام از آن‌ها را چاپ کنیم:


gene_list = ["BRCA1", "TP53", "EGFR"]

for gene in gene_list:
print(gene)


در این مثال، حلقه for سه بار تکرار می‌شود. در تکرار اول، متغیر gene مقدار "BRCA1" را می‌گیرد و چاپ می‌شود. در تکرار دوم، gene مقدار "TP53" را می‌گیرد و چاپ می‌شود، و در تکرار سوم، gene مقدار "EGFR" را می‌گیرد و چاپ می‌شود.

✍🏻 تمرین: یک لیست از سه نوع مختلف سلول (مثلاً "neuron", "muscle", "epithelial") ایجاد کنید و سپس با استفاده از یک حلقه for، هر کدام از آن‌ها را چاپ کنید. چطور این کار را انجام می‌دهید؟

```
cell_type = ["epithelial", "muscle", "neuron"]

for cell in cell_type :

    print(cell)

```


حالا می‌خواهیم کمی بیشتر با حلقه for کار کنیم و ببینیم چطور می‌توانیم از آن برای انجام کارهای مفیدتری استفاده کنیم.

فرض کنید یک لیست از طول RNAهای مختلف داریم:

rna_lengths = [150, 200, 180, 220]


می‌خواهیم برای هر طول RNA یک پیام چاپ کنیم که نشان دهد طول آن چند نوکلئوتید است. چطور می‌توانیم از حلقه for برای این کار استفاده کنیم؟ راهنمایی: در داخل حلقه، می‌توانید از متغیر rna_length (یا هر نام دیگری که انتخاب می‌کنید) برای دسترسی به طول هر RNA استفاده کنید و سپس آن را در یک دستور print() قرار دهید.

```
rna_lengths = [150, 200, 180, 220]

for RNA in rna_lengths :

print(RNA)
```


حالا چطور می‌توانیم پیام چاپ شده را کمی informative‌تر کنیم؟ به جای اینکه فقط عدد طول را چاپ کنیم، می‌خواهیم بگوییم "طول RNA برابر است با [طول]". برای این کار، می‌توانیم از f-strings (رشته‌های قالبی) در پایتون استفاده کنیم:


rna_lengths = [150, 200, 180, 220]

for rna_length in rna_lengths:
print(f"طول RNA برابر است با {rna_length}")



در این مثال، در هر بار تکرار حلقه، مقدار متغیر rna_length در داخل رشته‌ای که با f شروع می‌شود و مقدار متغیر در داخل {} قرار می‌گیرد، جایگزین می‌شود.

حالا شما امتحان کنید. لیست gene_list = ["BRCA1", "TP53", "EGFR"] را در نظر بگیرید. با استفاده از یک حلقه for، برای هر ژن یک پیام چاپ کنید که بگوید "ژن [نام ژن] در حال بررسی است." چطور این کار را انجام می‌دهید؟

```
gene_list = ["BRCA1", "TP53", "EGFR"]

for gene in gene_list:
print(f"ژن {gene} در حال بررسی است.")
```