بیوانفورماتیک برای همه
104 subscribers
9 photos
1 file
12 links
بیوانفورماتیک برای همه
Download Telegram
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} در حال بررسی است.")
```
حلقه while:

حلقه while در پایتون تا زمانی که یک شرط خاص درست (True) باشد، به اجرای بلوک کد خود ادامه می‌دهد. این نوع حلقه زمانی مفید است که تعداد تکرارها از قبل مشخص نباشد و بخواهیم تا رسیدن به یک وضعیت خاص، کد را اجرا کنیم.

ساختار کلی حلقه while در پایتون به این صورت است:
while condition:
# کدهایی که تا زمانی که شرط درست باشد اجرا می‌شوند
# مهم است که در داخل حلقه، تغییری ایجاد شود که در نهایت شرط را نادرست کند،
# وگرنه حلقه برای همیشه ادامه پیدا می‌کند (حلقه بی‌نهایت)

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

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

counter = 1
while counter <= 5:
print(counter)
counter += 1


در این مثال، ابتدا متغیر counter با مقدار 1 (مقدار اولیه) تعریف می‌شود. سپس حلقه while شروع می‌شود. شرط counter <= 5 در ابتدا درست است، بنابراین مقدار counter چاپ می‌شود و سپس با 1 واحد افزایش می‌یابد. این فرآیند تکرار می‌شود تا زمانی که مقدار counter به 6 برسد. در این زمان، شرط counter <= 5 نادرست می‌شود و حلقه متوقف می‌شود.

حالا یک سناریو زیستی در نظر بگیرید. فرض کنید می‌خواهیم تعداد باکتری‌ها را در یک محیط کشت در طول زمان شبیه‌سازی کنیم. اگر تعداد باکتری‌ها در هر ساعت 10% افزایش یابد و ما با 100 باکتری شروع کنیم، می‌خواهیم ببینیم بعد از چند ساعت تعداد باکتری‌ها از 200 بیشتر می‌شود.

✍🏻 : چطور می‌توانیم با استفاده از حلقه while این را شبیه‌سازی کنیم؟ راهنمایی: یک متغیر برای تعداد باکتری‌ها و یک متغیر برای تعداد ساعات در نظر بگیرید. در هر تکرار حلقه، تعداد باکتری‌ها را 10% افزایش دهید و تعداد ساعات را یک واحد اضافه کنید. حلقه باید تا زمانی ادامه پیدا کند که تعداد باکتری‌ها از 200 بیشتر شود.

```
bac_n = 100
hours = 0
while bac_n < 200:
hours += 1
bac_n = bac_n + (bac_n * 0.1)
print(hours)
```




✍🏻 : خروجی برنامه چند خواهد بود؟ سعی کنید کد را ذهنی یا اگر پایتون روی سیستمتان نصب است، اجرا کنید:

```
8
```


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

سیستم عامل (Operating System - OS) نرم‌افزاری است که بین کاربر و سخت‌افزار کامپیوتر قرار می‌گیرد و منابع سخت‌افزاری را مدیریت می‌کند. ویندوز، macOS و لینوکس از سیستم عامل‌های رایج برای کامپیوترهای شخصی هستند.

خط فرمان (Command Line Interface - CLI) یک رابط کاربری متنی است که به شما اجازه می‌دهد با تایپ کردن دستورات، با سیستم عامل تعامل داشته باشید. در مقابل، رابط کاربری گرافیکی (Graphical User Interface - GUI) مانند آنچه که شما معمولاً در ویندوز یا macOS می‌بینید، از آیکون‌ها و منوها برای تعامل استفاده می‌کند.

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

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


چرا باید از خط فرمان استفاده کنیم؟

* قدرت و انعطاف‌پذیری: بسیاری از کارهای پیچیده و خودکارسازی فرایندها از طریق خط فرمان بسیار ساده‌تر و سریع‌تر انجام می‌شوند.
* دسترسی به ابزارهای تخصصی: بسیاری از ابزارهای بیوانفورماتیکی، به ویژه آن‌هایی که روی سرورها اجرا می‌شوند، فقط از طریق خط فرمان قابل استفاده هستند.
* مدیریت از راه دور: وقتی با سرورهای لینوکسی کار می‌کنید (که در بیوانفورماتیک رایج است)، معمولاً فقط از طریق خط فرمان به آن‌ها دسترسی خواهید داشت.

در سیستم عامل ویندوز، شما می‌توانید از برنامه‌ای به نام Command Prompt یا PowerShell برای دسترسی به خط فرمان استفاده کنید. در macOS و لینوکس، برنامه‌ای به نام Terminal این کار را انجام می‌دهد.


* Command Prompt (یا CMD)
رابط خط فرمان قدیمی‌تر در ویندوز است و بسیاری از دستورات اساسی را پشتیبانی می‌کند. برای باز کردن آن، می‌توانید در منوی استارت عبارت "cmd" را جستجو کرده و روی "Command Prompt" کلیک کنید. یک پنجره سیاه با یک مکان‌نما چشمک‌زن باز خواهد شد. این جایی است که شما دستورات خود را تایپ می‌کنید.

* PowerShell
یک رابط خط فرمان جدیدتر و قدرتمندتر است که امکانات بیشتری را نسبت به Command Prompt ارائه می‌دهد. برای باز کردن آن، می‌توانید در منوی استارت عبارت "powershell" را جستجو کرده و روی "Windows PowerShell" کلیک کنید. پنجره آن معمولاً پس‌زمینه آبی دارد.
برای شروع، چند دستور اساسی وجود دارد که در هر دو محیط (CMD و PowerShell) کار می‌کنند و برای ناوبری و مشاهده فایل‌ها و پوشه‌ها مفید هستند:

dir :
(یا ls در لینوکس/macOS): این دستور لیستی از تمام فایل‌ها و پوشه‌های موجود در پوشه فعلی (Current Directory) را نمایش می‌دهد. وقتی خط فرمان را باز می‌کنید، معمولاً در پوشه کاربری خود قرار دارید.

cd (Change Directory):
از این دستور برای تغییر پوشه فعلی استفاده می‌شود. به عنوان مثال، اگر بخواهید به پوشه‌ای به نام "Documents" بروید که در پوشه فعلی شما قرار دارد، تایپ کنید cd Documents و سپس Enter بزنید.

cd..:
این دستور شما را یک سطح به عقب در ساختار پوشه‌ها می‌برد (به پوشه والد).

mkdir (Make Directory):
از این دستور برای ایجاد یک پوشه جدید استفاده می‌شود. به عنوان مثال، برای ایجاد پوشه‌ای به نام "bioinformatics_project"، تایپ کنید mkdir bioinformatics_project و Enter بزنید.

type (یا cat در لینوکس/macOS):
از این دستور برای نمایش محتویات یک فایل متنی استفاده می‌شود. به عنوان مثال، برای دیدن محتویات فایلی به نام "sequence.txt"، تایپ کنید type sequence.txt و Enter بزنید.به فاصله بین نام فایل و دستور دقت کنید.

در ادامه چند دستور مفید دیگر در خط فرمان (هم برای ویندوز و هم برای لینوکس) به شما معرفی می‌کنم:

کپی کردن فایل‌ها
:

copy (ویندوز) / cp (لینوکس/macOS):

ویندوز:
copy source_file destination_file


لینوکس و macOS:

cp source_file destination_file


مثال:
copy sequence.txt backup.txt


یک کپی از فایل sequence.txt با نام backup.txt ایجاد می‌کند.

انتقال فایل‌ها یا تغییر نام آن‌ها:

move (ویندوز) / mv (لینوکس/macOS)

ویندوز (انتقال):
move source_file destination_directory


ویندوز (تغییر نام):
ren old_name new_name


لینوکس/macOS (انتقال):
mv source_file destination_directory


لینوکس/macOS (تغییر نام):
mv old_name new_name


مثال (ویندوز - انتقال):
move results.csv project_folder

فایل results.csv را به پوشه project_folder منتقل می‌کند.

مثال (لینوکس - تغییر نام):
mv data.txt processed_data.txt

نام فایل data.txt را به processed_data.txt تغییر می‌دهد.

حذف فایل‌ها:

del (ویندوز) / rm (لینوکس/macOS):
مراقب باشید! فایل‌های حذف شده با این دستور معمولاً قابل بازیابی نیستند.

ویندوز:
del filename


لینوکس/macOS:
rm filename


مثال:
del temp.log


فایل temp.log را حذف می‌کند.

دستورات سیستمی:

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


cls (ویندوز) / clear (لینوکس/macOS):

برای بستن پنجره خط فرمان:

exit

دستورات مربوط به کمک:

برای دریافت راهنما در مورد یک دستور خاص:

help (ویندوز) / man (لینوکس/macOS):
ویندوز:
help command_name
مثال:
help dir


لینوکس:/macOS:
man command_name
مثال:
man ls


این‌ها فقط چند نمونه از دستورات مفید هستند. با تمرین و کار بیشتر با خط فرمان، با دستورات بیشتری آشنا خواهید شد.
کاربردهای خط فرمان در بیوانفورماتیک :

1. مدیریت فایل‌ها و دایرکتوری‌های بزرگ داده‌های زیستی: داده‌های بیولوژیکی مانند فایل‌های توالی DNA یا RNA می‌توانند بسیار بزرگ باشند. خط فرمان به شما اجازه می‌دهد تا این فایل‌ها را به طور کارآمد کپی، انتقال، حذف یا سازماندهی کنید. برای مثال، ممکن است بخواهید تمام فایل‌های مربوط به یک نمونه خاص را در یک پوشه جداگانه جمع‌آوری کنید.فرض کنید شما تعداد زیادی فایل توالی DNA دارید که از یک آزمایش تعیین توالی به دست آمده‌اند و می‌خواهید تمام فایل‌هایی که پسوند .fastq.gz دارند را به یک پوشه به نام raw_reads منتقل کنید. در لینوکس می‌توانید از دستور mv به همراه wildcard (*) استفاده کنید:

mkdir raw_reads
mv *.fastq.gz raw_reads/


2. اجرای ابزارهای بیوانفورماتیکی: بسیاری از ابزارهای مهم بیوانفورماتیکی مانند BLAST (برای جستجوی توالی‌های مشابه)، SAMtools (برای کار با داده‌های تعیین توالی نسل بعد)، و GATK (برای تحلیل داده‌های ژنوم) از طریق خط فرمان اجرا می‌شوند. شما معمولاً دستور خاصی را با آرگومان‌های مختلف (مانند فایل ورودی، فایل خروجی، و پارامترهای تحلیل) تایپ می‌کنید تا ابزار کار خود را انجام دهد.
برای مثال، برای اجرای BLAST می‌توانید دستوری شبیه به این در خط فرمان وارد کنید:

blastn -query input.fasta -db nt -out output.txt -evalue 0.001


این دستور فایل توالی ورودی (input.fasta) را در پایگاه داده نوکلئوتیدی (nt) جستجو می‌کند و نتایج را در فایل output.txt ذخیره می‌کند. در مورد جزئیات بلاست بعدا صحبت خواهیم کرد.

3. خودکارسازی فرایندها (Scripting): شما می‌توانید مجموعه‌ای از دستورات خط فرمان را در یک فایل اسکریپت (مانند اسکریپت‌های Bash در لینوکس) ذخیره کنید و سپس آن اسکریپت را اجرا کنید تا یک سری کارها به صورت خودکار و بدون دخالت دستی انجام شوند. این برای تحلیل‌های تکراری یا پردازش دسته‌ای از فایل‌ها بسیار مفید است.تصور کنید شما هر روز یک فایل گزارش جدید دریافت می‌کنید و می‌خواهید به طور خودکار خطوط خاصی از آن را استخراج کرده و در یک فایل دیگر ذخیره کنید. می‌توانید یک اسکریپت ساده با استفاده از ابزارهایی مانند grep و redirection (>) در لینوکس بنویسید:

grep "ERROR" daily_report.log > error_log.txt


این اسکریپت تمام خطوطی که شامل کلمه "ERROR" در فایل daily_report.log هستند را پیدا کرده و در فایل error_log.txt ذخیره می‌کند. شما می‌توانید این اسکریپت را به صورت زمان‌بندی شده اجرا کنید.

4. دسترسی به سرورهای راه دور: بسیاری از محاسبات سنگین بیوانفورماتیکی روی سرورهای لینوکسی انجام می‌شوند. شما معمولاً از طریق خط فرمان و با استفاده از پروتکل‌هایی مانند SSH (Secure Shell) به این سرورها متصل می‌شوید و دستورات لازم را برای اجرای تحلیل‌ها وارد می‌کنید.

5. دستکاری و فیلتر کردن داده‌ها: ابزارهایی مانند grep (برای جستجوی الگو در فایل‌ها) و awk (برای پردازش و تحلیل ساختاریافته داده‌ها) در خط فرمان به شما اجازه می‌دهند تا به سرعت بخش‌های خاصی از فایل‌های متنی بزرگ را پیدا کرده یا تغییر دهید.فرض کنید یک فایل متنی بزرگ دارید که حاوی اطلاعات مربوط به ژن‌ها و عملکردهای آن‌ها است و می‌خواهید فقط خطوط مربوط به ژن‌هایی که با حرف "A" شروع می‌شوند را ببینید. می‌توانید از دستور grep استفاده کنید:

grep "^A" gene_functions.txt


علامت ^ در grep به معنای "شروع خط" است، بنابراین این دستور تمام خطوطی را که با حرف "A" شروع می‌شوند نمایش می‌دهد.
✍🏻تمرین:
فرض کنید شما در پوشه کاربری خود در سیستم عامل ویندوز قرار دارید. می‌خواهیم مراحل زیر را با استفاده از خط فرمان انجام دهید:
1. یک پوشه جدید به نام bio_data ایجاد کنید.
2. وارد پوشه bio_data شوید.
3. یک فایل متنی خالی به نام sequences.txt در داخل پوشه bio_data ایجاد کنید (راهنمایی: می‌توانید از دستور type nul > filename برای ایجاد یک فایل خالی در ویندوز استفاده کنید).
4. به یک سطح عقب برگردید (به پوشه کاربری خود).
5. پوشه bio_data را به biological_data تغییر نام دهید

mkdir bio_data
یک پوشه جدید به نام bio_data ایجاد می‌کند.
cd bio_data
شما را به داخل پوشه bio_data می‌برد.
type nul > sequences.txt
یک فایل متنی خالی به نام sequences.txt در پوشه فعلی ایجاد می‌کند.
cd ..
شما را یک سطح به عقب، به پوشه کاربری خود بازمی‌گرداند.


ren bio_data biological_data
نام پوشه bio_data را به biological_data تغییر می‌دهد.


معادل دستورات تمرین قبلی در سیستم عامل لینوکس به این صورت است:

1. mkdir bio_data
2. cd bio_data
3. touch sequences.txt
4. cd ..
5. mv bio_data biological_data



همانطور که می‌بینید، دستورات بسیار شبیه هستند. touch در لینوکس برای ایجاد یک فایل خالی استفاده می‌شود و mv هم برای انتقال و هم برای تغییر نام فایل‌ها و پوشه‌ها به کار می‌رود.
آمار و احتمالات در بیوانفورماتیک:


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

در مبانی آمار، ما معمولاً با دو شاخه اصلی سروکار داریم:

1. آمار توصیفی (Descriptive Statistics): این شاخه به جمع‌آوری، سازماندهی، خلاصه کردن و نمایش داده‌ها می‌پردازد. مفاهیمی مانند میانگین، میانه، مد، واریانس و انحراف معیار در این بخش مورد بحث قرار می‌گیرند. این‌ها به ما کمک می‌کنند تا یک تصویر کلی از داده‌هایمان به دست آوریم.
2. آمار استنباطی (Inferential Statistics): این شاخه از آمار به ما امکان می‌دهد تا بر اساس یک نمونه کوچک از داده‌ها، نتایجی را در مورد یک جمعیت بزرگتر استنباط کنیم. مفاهیمی مانند آزمون‌های فرضیه، فاصله اطمینان و رگرسیون در این بخش قرار می‌گیرند. این‌ها به ما کمک می‌کنند تا تصمیم‌گیری‌های آگاهانه بر اساس داده‌ها انجام دهیم.

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

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

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

به نظر شما، در یک مطالعه بیوانفورماتیکی که هدف آن شناسایی ژن‌های مرتبط با یک بیماری خاص است، کدام شاخه از آمار (توصیفی یا استنباطی) نقش مهم‌تری ایفا می‌کند؟ چرا؟


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

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

بنابراین، هر دو شاخه آمار، توصیفی و استنباطی، در تحلیل داده‌های بیوانفورماتیکی اهمیت دارند و مکمل یکدیگر هستند.
1