وبلاگ
مبانی کار با پایگاههای داده بیولوژیکی از طریق بیوپایتون
فهرست مطالب
“تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”
"تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"
"با شرکت در این دوره جامع و کاربردی، به راحتی مهارتهای برنامهنویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر میسازد تا به سرعت الگوریتمهای پیچیده را درک کرده و اپلیکیشنهای هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفهای و امکان دانلود و تماشای آنلاین."
ویژگیهای کلیدی:
بدون نیاز به تجربه قبلی برنامهنویسی
زیرنویس فارسی با ترجمه حرفهای
۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان
0 تا 100 عطرسازی + (30 فرمولاسیون اختصاصی حامی صنعت)
دوره آموزش Flutter و برنامه نویسی Dart [پروژه محور]
دوره جامع آموزش برنامهنویسی پایتون + هک اخلاقی [با همکاری شاهک]
دوره جامع آموزش فرمولاسیون لوازم آرایشی
دوره جامع علم داده، یادگیری ماشین، یادگیری عمیق و NLP
دوره فوق فشرده مکالمه زبان انگلیسی (ویژه بزرگسالان)
شمع سازی و عودسازی با محوریت رایحه درمانی
صابون سازی (دستساز و صنعتی)
صفر تا صد طراحی دارو
متخصص طب سنتی و گیاهان دارویی
متخصص کنترل کیفی شرکت دارویی
مقدمه: دروازهای به دنیای دادههای بیولوژیکی
در دوران معاصر، زیستشناسی به طور فزایندهای به یک علم دادهمحور تبدیل شده است. از زمانی که توالیبرداری DNA به سرعت و با هزینه کمتری قابل انجام شد، حجم بیسابقهای از دادههای بیولوژیکی تولید شده است. این دادهها شامل توالیهای ژنومی، ترانسکریپتومی، پروتئومی، ساختارهای سهبعدی مولکولهای زیستی، مسیرهای متابولیکی، دادههای بیان ژن، واریانتهای ژنتیکی و بسیاری دیگر هستند. برای سازماندهی، ذخیرهسازی و دسترسی کارآمد به این اقیانوس اطلاعات، پایگاههای داده بیولوژیکی جهانی ایجاد و نگهداری میشوند. این پایگاهها، ستون فقرات تحقیقات مدرن در حوزههایی مانند بیوتکنولوژی، پزشکی شخصی، کشاورزی و علوم دارویی را تشکیل میدهند. بدون قابلیت تعامل موثر با این منابع داده، پیشبرد پژوهشهای بیولوژیکی در مقیاسهای بزرگ تقریباً غیرممکن است.
با این حال، چالش اصلی در استفاده از این پایگاههای داده، پیچیدگی فرمتهای داده، حجم عظیم اطلاعات و تنوع پروتکلهای دسترسی است. محققان و برنامهنویسان بیوانفورماتیک اغلب با نیاز به نوشتن کدهای پیچیده برای تجزیه و تحلیل، فیلتر کردن و استخراج اطلاعات از این منابع مواجه هستند. اینجاست که زبان برنامهنویسی پایتون و به طور خاص، کتابخانه Biopython (بیوپایتون) وارد عمل میشود. پایتون به دلیل خوانایی بالا، سینتکس ساده، جامعه کاربری گسترده و کتابخانههای متنوع، به ابزار انتخابی برای بسیاری از کارهای بیوانفورماتیکی تبدیل شده است. بیوپایتون، به عنوان یک لایه انتزاعی قدرتمند، این فرآیند پیچیده را سادهسازی میکند و به کاربران امکان میدهد تا با حداقل تلاش، به پایگاههای داده بیولوژیکی جهانی دسترسی پیدا کنند، دادهها را بازیابی کنند، و تجزیه و تحلیلهای خود را به صورت خودکار انجام دهند.
هدف این مقاله، ارائه یک راهنمای جامع و تخصصی برای درک مبانی و تکنیکهای پیشرفته کار با پایگاههای داده بیولوژیکی از طریق بیوپایتون است. ما به بررسی معماری بیوپایتون برای تعامل با دادههای آنلاین، ماژولهای کلیدی آن و نحوه استفاده عملی از آنها برای جستجو، بازیابی و پردازش انواع مختلف دادهها خواهیم پرداخت. این نوشتار برای دانشجویان، محققان و متخصصان بیوانفورماتیک طراحی شده است که به دنبال تقویت مهارتهای خود در استفاده از ابزارهای محاسباتی برای حل مسائل بیولوژیکی هستند. از معرفی مفاهیم پایهای مانند پایگاههای داده توالی و ساختار گرفته تا راهکارهای پیشرفته برای مدیریت خطا، بهینهسازی عملکرد و تضمین بازتولیدپذیری، تلاش میکنیم تا یک چارچوب کامل برای استفاده موثر از بیوپایتون در اکوسیستم دادههای بیولوژیکی ارائه دهیم. این دانش نه تنها بهرهوری شما را افزایش میدهد، بلکه دروازهای به سوی اکتشافات جدید در دنیای زیستشناسی محاسباتی خواهد گشود.
بیوپایتون: اکوسیستم ابزارهای بیوانفورماتیکی برای پایتون
Biopython مجموعهای گسترده و آزاد از ابزارهای پایتونی است که برای پاسخگویی به نیازهای محاسباتی در بیولوژی مولکولی و بیوانفورماتیک توسعه یافته است. این کتابخانه به گونهای طراحی شده که کار با دادههای بیولوژیکی رایج مانند توالیها، ساختارهای پروتئینی، همترازیها و نتایج آنالیزهای بیوانفورماتیکی را تسهیل کند. فلسفه اصلی پشت طراحی بیوپایتون، ارائه یک رابط کاربری پایتونی آسان و یکپارچه برای فرمتهای داده استاندارد و ابزارهای پرکاربرد بیوانفورماتیک است که محققان را از پیچیدگیهای فرمتبندی و پروتکلهای ارتباطی پنهان میکند. این کتابخانه توسط یک جامعه فعال و گسترده از توسعهدهندگان و کاربران نگهداری و بهروزرسانی میشود و به طور مداوم با آخرین تحولات در علم بیولوژی و استانداردهای داده همگام میشود.
ماژولهای کلیدی بیوپایتون برای تعامل با پایگاههای داده
بیوپایتون از ماژولهای متعددی تشکیل شده است که هر کدام وظیفه خاصی را بر عهده دارند. برای هدف تعامل با پایگاههای داده بیولوژیکی آنلاین و پردازش دادههای حاصل، برخی از این ماژولها از اهمیت ویژهای برخوردارند:
Bio.Entrez: این ماژول رابط برنامهنویسی کاربردی (API) برای سیستم Entrez از مرکز ملی اطلاعات بیوتکنولوژی (NCBI) را فراهم میکند. Entrez یک موتور جستجو و بازیابی جامع است که دسترسی به بیش از 40 پایگاه داده زیستپزشکی مختلف، از جمله GenBank (توالیهای نوکلئوتیدی)، Protein (توالیهای پروتئینی)، PubMed (مقالات علمی)، PDB (ساختارهای سهبعدی)، Gene (اطلاعات ژنی)، OMIM (ارتباط ژن و بیماری) و بسیاری دیگر را فراهم میآورد.Bio.Entrezهسته اصلی برای هرگونه عملیات جستجو، بازیابی خلاصه یا رکورد کامل از این منابع جهانی است.Bio.SeqوBio.SeqRecord:Bio.Seqیک کلاس پایه برای نمایش توالیهای بیولوژیکی (DNA، RNA، پروتئین) است. این کلاس متدهای مفیدی برای دستکاری توالی مانند گرفتن مکمل، مکمل معکوس یا ترجمه را ارائه میدهد.Bio.SeqRecordیک شیء سطح بالاتر است که نه تنها خود توالی را (به عنوان یک شیءSeq) در بر میگیرد، بلکه ابردادههای غنی مرتبط با آن مانند شناسه (ID)، نام، توضیحات، ویژگیها (features) و حاشیهنویسیها (annotations) را نیز شامل میشود. این دو ماژول اساس کار با توالیها در بیوپایتون را تشکیل میدهند.Bio.SeqIO: این ماژول برای خواندن و نوشتن فایلهای توالی در فرمتهای متنوع و رایج بیوانفورماتیکی (مانند FASTA، GenBank، PDB، EMBL، SwissProt، PIR و غیره) طراحی شده است.Bio.SeqIOیک رابط کاربری یکپارچه برای پردازش توالیها بدون توجه به فرمت فایل اصلی آنها فراهم میکند و به طور گسترده برای تجزیه خروجیBio.Entrez.efetchبه اشیاءSeqRecordاستفاده میشود.Bio.PDB: این ماژول ابزارهایی جامع برای کار با دادههای ساختار پروتئین سهبعدی که عمدتاً از Protein Data Bank (PDB) گرفته شدهاند، فراهم میکند. این شامل قابلیتهایی برای دانلود فایلهای PDB، تجزیه آنها به اجزای ساختاری (مانند مدلها، زنجیرهها، باقیماندهها و اتمها) و انجام تحلیلهای پایه ساختاری میشود.Bio.PDBبرای بیولوژیستهای ساختاری و هر کسی که به درک عملکرد پروتئینها از طریق ساختار سهبعدی آنها علاقهمند است، ضروری است.Bio.Blast: این ماژول برای اجرای جستجوهای BLAST (Basic Local Alignment Search Tool) به صورت راه دور از طریق سرورهای NCBI (باBio.Blast.NCBIWWW) و همچنین تجزیه نتایج BLAST (باBio.Blast.NCBIXML) استفاده میشود. همچنین قابلیتهایی برای اجرای BLAST به صورت محلی (باBio.Blast.Applications) و تجزیه نتایج آن را نیز فراهم میآورد. BLAST ابزاری اساسی برای کشف شباهتهای توالی و استنتاج روابط عملکردی و تکاملی است.Bio.AlignIO: مشابهBio.SeqIO، این ماژول برای خواندن و نوشتن فایلهای همترازی توالی (Alignment) در فرمتهای مختلف (مانند ClustalW، PHYLIP، Stockholm، Nexus و AXT) طراحی شده است. این ماژول امکان مدیریت و دستکاری همترازیهای چندگانه را به صورت شیءگرا فراهم میکند.
درک این ماژولها و نحوه همافزایی آنها، اساس توانایی ما در تعامل موثر با پایگاههای داده بیولوژیکی را شکل میدهد. بیوپایتون با این رویکرد ماژولار، به محققان اجازه میدهد تا کدهای تمیزتر، قابل نگهداریتر و کارآمدتری برای کارهای بیوانفورماتیکی خود بنویسند.
اصول و انواع پایگاههای داده بیولوژیکی: نقشه راه دادهها
پیش از پرداختن به جزئیات پیادهسازی با بیوپایتون، درک مفاهیم پایهای پشت پایگاههای داده بیولوژیکی و طبقهبندی آنها حیاتی است. این پایگاهها به عنوان مخازن متمرکز اطلاعات بیولوژیکی، برای تسهیل ذخیرهسازی، سازماندهی، دسترسی، و تحلیل دادهها برای جامعه علمی جهانی توسعه یافتهاند. تنوع بینظیر دادههای بیولوژیکی، نیاز به ایجاد پایگاههایی با ساختار و اهداف متفاوت را ایجاب کرده است.
طبقهبندی و انواع اصلی پایگاههای داده بیولوژیکی
پایگاههای داده بیولوژیکی را میتوان بر اساس نوع دادهای که ذخیره میکنند، طبقهبندی کرد:
- پایگاههای داده توالی (Sequence Databases):
این گروه، از پرکاربردترین پایگاهها هستند و هسته اصلی بیوانفورماتیک را تشکیل میدهند. آنها شامل توالیهای نوکلئوتیدی (DNA و RNA) و توالیهای پروتئینی هستند.- توالیهای نوکلئوتیدی: GenBank (NCBI)، EMBL-Bank (EMBL-EBI) و DDBJ (DNA Data Bank of Japan) سه پایگاه داده اصلی جهانی هستند که به صورت روزانه با یکدیگر همگام میشوند و توالیهای DNA و RNA را از پروژههای توالیبرداری سراسر جهان ذخیره میکنند. این پایگاهها علاوه بر توالی خام، اطلاعات متادیتای غنی مانند نام ارگانیسم، ژن مربوطه، مراجع مقالات علمی و ویژگیهای ژنومیک (مانند مناطق کدکننده، پروموترها و اگزونها) را نیز شامل میشوند.
- توالیهای پروتئینی: UniProt (Universal Protein Resource) جامعترین و معتبرترین منبع برای توالیهای پروتئینی و اطلاعات عملکردی آنها است. UniProt خود از سه جزء اصلی تشکیل شده است: Swiss-Prot (توالیهای حاشیهنویسی شده دستی و دقیق)، TrEMBL (توالیهای حاشیهنویسی شده خودکار) و PIR (Protein Information Resource). این پایگاهها جزئیاتی مانند عملکرد پروتئین، دامنههای عملکردی، تعاملات، واریانتها و مراجع مقالات را فراهم میکنند.
- پایگاههای داده ساختار (Structure Databases):
این پایگاهها اطلاعات سهبعدی مولکولهای زیستی، به ویژه پروتئینها و اسیدهای نوکلئیک را که از طریق روشهایی مانند کریستالوگرافی اشعه ایکس، طیفسنجی NMR و میکروسکوپ الکترونی کریو (Cryo-EM) تعیین شدهاند، ذخیره میکنند.- Protein Data Bank (PDB): مهمترین و جامعترین پایگاه داده برای ساختارهای سهبعدی ماکرومولکولهای زیستی. هر ورودی PDB شامل مختصات اتمها، اطلاعات مدلسازی، و ابردادههای مربوط به روش تعیین ساختار و ویژگیهای بیولوژیکی مولکول است. PDB به محققان کمک میکند تا عملکرد مولکولها را از طریق شکل سهبعدی آنها درک کنند.
- پایگاههای داده بیان ژن (Gene Expression Databases):
این پایگاهها دادههای مربوط به سطح بیان ژن در بافتها، سلولها، شرایط فیزیولوژیکی و بیماریهای مختلف، یا در پاسخ به درمانهای دارویی را جمعآوری میکنند.- Gene Expression Omnibus (GEO) در NCBI و ArrayExpress در EMBL-EBI دو مثال برجسته هستند که دادههای حاصل از ریزآرایهها (microarrays) و توالیبرداری RNA (RNA-seq) را نگهداری میکنند. این دادهها برای شناسایی بیومارکرها، درک مکانیسمهای بیماری و کشف دارو بسیار ارزشمند هستند.
- پایگاههای داده مسیر و تعاملات (Pathway and Interaction Databases):
این پایگاهها تعاملات پیچیده بین مولکولهای زیستی (مانند پروتئینها، ژنها، متابولیتها و مولکولهای سیگنالینگ) را در قالب مسیرهای بیوشیمیایی، مسیرهای سیگنالینگ و شبکههای تعاملی ذخیره میکنند.- KEGG (Kyoto Encyclopedia of Genes and Genomes) و Reactome دو پایگاه داده معروف هستند که نقشههایی از مسیرهای بیوشیمیایی و سیگنالینگ را ارائه میدهند و به محققان در درک سیستمهای بیولوژیکی کمک میکنند.
- STRING (Search Tool for the Retrieval of Interacting Genes/Proteins) یک پایگاه داده برای تعاملات پروتئین-پروتئین است.
- پایگاههای داده واریانت ژنتیکی (Genetic Variant Databases):
این پایگاهها واریانتهای ژنتیکی (مانند پلیمورفیسمهای تک نوکلئوتیدی (SNPs)، جهشها، indels) را ذخیره میکنند که در جمعیتها مشاهده میشوند یا با بیماریهای خاصی مرتبط هستند.- dbSNP (Database of Single Nucleotide Polymorphisms) و ClinVar در NCBI نمونههایی از این پایگاهها هستند که برای مطالعات ژنتیک پزشکی و جمعیت کاربرد فراوان دارند.
- پایگاههای داده ادبیات علمی (Scientific Literature Databases):
هرچند به طور مستقیم دادههای بیولوژیکی خام را ذخیره نمیکنند، اما این پایگاهها برای کشف زمینه بیولوژیکی، روشهای آزمایشگاهی و تفسیر نتایج هر داده بیولوژیکی حیاتی هستند.- PubMed از NCBI جامعترین پایگاه داده برای مقالات علمی در علوم زیستپزشکی و زندگی است.
شناسهها (Identifiers) و فرمتهای رایج داده
برای دسترسی و ارجاع منحصر به فرد به هر رکورد در پایگاههای داده بیولوژیکی، از شناسههای خاصی استفاده میشود:
- Accession ID: یک شناسه منحصر به فرد برای یک رکورد توالی (مثلاً NM_000546.5 برای ژن TP53 در GenBank). اغلب شامل یک شماره نسخه است که نشاندهنده بهروزرسانیهای توالی است.
- GI (Gene Identifier): یک شناسه عددی منحصر به فرد در NCBI که به یک توالی خاص اشاره دارد، اگرچه کمتر از Accession ID استفاده میشود.
- PDB ID: یک شناسه چهار حرفی برای هر ساختار در Protein Data Bank (مثلاً 1FAT).
- UniProt Accession: شناسه منحصر به فرد برای هر ورودی پروتئینی در UniProt (مثلاً P04637 برای پروتئین p53 انسان).
دادههای بیولوژیکی در فرمتهای استاندارد مختلفی ذخیره و تبادل میشوند. درک این فرمتها و توانایی کار با آنها بسیار مهم است:
- FASTA: سادهترین و گستردهترین فرمت برای نمایش توالیهای نوکلئوتیدی و پروتئینی. هر رکورد با یک خط هدر شروع میشود (با
>) که به دنبال آن توصیف توالی قرار میگیرد و سپس خود توالی در خطوط بعدی. - GenBank / EMBL / DDBJ: فرمتهای متنی غنی که علاوه بر توالی، شامل ابردادههای مفصل (مانند مراجع، تاکسونومی، ویژگیهای ژنومیک و حاشیهنویسیها) هستند. این فرمتها برای دادههای توالی نوکلئوتیدی بسیار رایج هستند.
- PDB (Protein Data Bank): یک فرمت متنی برای ذخیره اطلاعات سهبعدی ساختارهای ماکرومولکولی، شامل مختصات اتمها، اطلاعات مدلسازی و ابردادههای تجربی.
- GFF/GTF (General Feature Format/Gene Transfer Format): فرمتهای مورد استفاده برای حاشیهنویسی ژنومیک، مانند موقعیت ژنها، اگزونها، اینترونها و مناطق کدکننده پروتئین.
- Newick / Nexus: فرمتهایی برای نمایش درختان فیلوژنتیک.
بیوپایتون با ارائه ابزارهای قدرتمند و انعطافپذیر برای تجزیه (parsing) و تولید (writing) این فرمتها، کار با دادههای بیولوژیکی را به شدت ساده میکند و محققان را از نیاز به مدیریت دستی پیچیدگیهای فرمتبندی رها میسازد. این قابلیت به کاربران اجازه میدهد تا بر تحلیل بیولوژیکی تمرکز کنند، نه بر مسائل فنی پردازش داده.
دسترسی به پایگاههای داده توالی از طریق Bio.Entrez
ماژول Bio.Entrez در بیوپایتون یک رابط برنامهنویسی برای سیستم Entrez از مرکز ملی اطلاعات بیوتکنولوژی (NCBI) فراهم میکند. Entrez در واقع یک سیستم یکپارچه بازیابی اطلاعات است که دسترسی به پایگاههای داده متنوع NCBI را از طریق یک رابط واحد ممکن میسازد. با استفاده از Bio.Entrez، میتوانیم به صورت برنامهنویسی به این پایگاهها متصل شویم، جستجو انجام دهیم، خلاصهای از رکوردهای مرتبط را دریافت کنیم و رکوردهای کامل را در فرمتهای مختلف بازیابی کنیم. این ماژول یکی از پرکاربردترین قسمتهای بیوپایتون برای هرگونه تعامل با منابع داده NCBI است.
پیکربندی اولیه و الزام Entrez.email
قبل از انجام هرگونه عملیات با Bio.Entrez، لازم است یک آدرس ایمیل را به عنوان پارامتر Entrez.email تنظیم کنیم. این ایمیل برای شناسایی شما در سرورهای NCBI استفاده میشود و در صورت بروز هرگونه مشکل یا سوء استفاده (مانند ارسال درخواستهای بیش از حد)، NCBI میتواند با شما تماس بگیرد. این یک الزام مهم برای استفاده مودبانه و پایبندی به دستورالعملهای استفاده از API عمومی NCBI است.
from Bio import Entrez
Entrez.email = "Your.Email@example.com" # ایمیل واقعی خود را اینجا وارد کنید
# توصیه میشود از یک ایمیل معتبر استفاده کنید، مثلاً ایمیل دانشگاهی یا کاری
print(f"ایمیل Entrez تنظیم شد: {Entrez.email}")
عدم تنظیم ایمیل ممکن است منجر به خطاهایی از جانب سرور NCBI یا حتی مسدود شدن موقت IP شما شود.
جستجو در پایگاههای داده (Entrez.esearch)
اولین گام برای بازیابی دادهها، معمولاً جستجو در پایگاه داده مورد نظر است. تابع Entrez.esearch() برای این منظور استفاده میشود. این تابع یک دسته (handle) را برمیگرداند که شامل پاسخ XML از NCBI است. سپس باید این پاسخ را با Entrez.read() تجزیه کنیم تا به لیست شناسههای (IDs) رکوردهایی که با عبارت جستجوی شما مطابقت دارند، دسترسی پیدا کنیم.
پارامترهای کلیدی تابع esearch:
db: نام پایگاه داده NCBI مورد نظر. مثالها: “pubmed” (برای مقالات)، “nucleotide” (برای توالیهای DNA/RNA)، “protein” (برای توالیهای پروتئینی)، “gene” (برای اطلاعات ژنها)، “snp” (برای پلیمورفیسمهای تک نوکلئوتیدی)، “structure” (برای ساختارهای سهبعدی).term: عبارت جستجو. این عبارت میتواند یک کلمه کلیدی، نام ژن، نام ارگانیسم، یا ترکیبی از عملگرهای بولی (مانند AND، OR، NOT) باشد. مثالها: “human p53 gene”, “Mycobacterium tuberculosis AND genome”, “COVID-19 vaccine”.retmax: حداکثر تعداد شناسههایی که باید برگردانده شوند. پیشفرض 20 است. برای دریافت تعداد بیشتری از نتایج، باید این پارامتر را افزایش دهید. NCBI تا سقف 100000 ID را پشتیبانی میکند.retstart: این پارامتر برای صفحهبندی نتایج استفاده میشود. با تنظیمretstartبه عددی بزرگتر از صفر، میتوانید از یک نقطه شروع خاص (برای دریافت “صفحات” بعدی نتایج) شناسهها را دریافت کنید.
مثال: جستجوی توالی ژنوم انسان برای ژن TP53 در پایگاه داده Nucleotide
from Bio import Entrez
Entrez.email = "Your.Email@example.com"
# جستجو در پایگاه داده "nucleotide" برای "human TP53 gene" و دریافت 10 ID اول
try:
handle = Entrez.esearch(db="nucleotide", term="human TP53 gene", retmax="10")
record = Entrez.read(handle) # تجزیه پاسخ XML به یک دیکشنری پایتون
handle.close() # بستن handle پس از استفاده برای آزاد کردن منابع
tp53_ids = record["IdList"] # IdList حاوی لیست شناسههای یافت شده است
print(f"شناسههای توالی یافت شده برای ژن TP53 انسان در Nucleotide: {tp53_ids}")
except Exception as e:
print(f"خطا در جستجو با Entrez.esearch: {e}")
print("لطفاً اتصال اینترنت خود را بررسی کرده و مطمئن شوید ایمیل Entrez تنظیم شده است.")
خروجی Entrez.read() یک دیکشنری پایتون است که شامل اطلاعاتی مانند IdList (لیست شناسهها)، Count (تعداد کل نتایج), RetMax و RetStart است.
بازیابی خلاصهای از رکوردها (Entrez.esummary)
در برخی موارد، ممکن است نیازی به بازیابی کل رکورد نداشته باشید و فقط خلاصهای از اطلاعات آن (مانند عنوان، تاریخ انتشار، نام نویسندگان یا یک توضیح کوتاه) کافی باشد. Entrez.esummary() این امکان را فراهم میکند. این تابع لیستی از شناسهها را به عنوان ورودی میگیرد و خلاصهای از هر رکورد را برمیگرداند.
مثال: دریافت خلاصهای از مقالات PubMed مرتبط با “cancer therapy”
from Bio import Entrez
Entrez.email = "Your.Email@example.com"
print("در حال جستجو برای مقالات مرتبط با 'cancer therapy' در PubMed...")
try:
# ابتدا 5 ID مقاله مرتبط را از PubMed جستجو میکنیم
search_handle = Entrez.esearch(db="pubmed", term="cancer therapy", retmax="5")
search_record = Entrez.read(search_handle)
search_handle.close()
pubmed_ids = search_record["IdList"]
if pubmed_ids:
print(f"شناسههای PubMed یافت شده: {pubmed_ids}")
# سپس خلاصهای از این مقالات را با استفاده از شناسهها دریافت میکنیم
# شناسهها باید با کاما جدا شوند
summary_handle = Entrez.esummary(db="pubmed", id=",".join(pubmed_ids))
summaries = Entrez.read(summary_handle)
summary_handle.close()
print("\nخلاصه 5 مقاله برتر:")
for summary_item in summaries:
print(f" Title: {summary_item.get('Title', 'N/A')}")
# AuthorList ممکن است در برخی موارد وجود نداشته باشد
authors = summary_item.get('AuthorList', [])
print(f" Authors: {', '.join(authors)}")
print(f" Publication Date: {summary_item.get('PubDate', 'N/A')}")
print(" ---")
else:
print("هیچ ID مقالهای برای خلاصه سازی یافت نشد.")
except Exception as e:
print(f"خطا در بازیابی خلاصه مقالات: {e}")
بازیابی رکورد کامل (Entrez.efetch)
برای بازیابی رکورد کامل یک یا چند ورودی در فرمتهای مختلف (مانند GenBank، FASTA، XML یا PDB)، از Entrez.efetch() استفاده میشود. این تابع قدرتمندترین ابزار برای دسترسی به محتوای کامل پایگاههای داده است.
پارامترهای کلیدی:
db: نام پایگاه داده.id: لیست شناسههایی که با کاما از هم جدا شدهاند.rettype: نوع رکورد بازگشتی. این پارامتر فرمت دادههای بیولوژیکی را مشخص میکند. مثالها: “fasta”, “gb” (برای GenBank), “protein” (برای فرمت پروتئین), “pubmed” (برای PubMed), “snp”, “structure”.retmode: فرمت بازگشتی داده. این پارامتر نحوه ارائه دادهها را مشخص میکند. مثالها: “text” (برای فرمتهای متنی مانند FASTA یا GenBank), “xml” (برای XML), “html”.
مثال: بازیابی یک توالی پروتئینی به فرمت FASTA
from Bio import Entrez
from Bio import SeqIO
import time # برای مدیریت نرخ درخواست ها
Entrez.email = "Your.Email@example.com"
# یک ID معتبر برای پروتئین p53 انسان
# فرض کنید ما این ID را از قبل داریم یا با esearch آن را بدست آوردهایم
# مثال: NP_000537.3 (ورژن RefSeq برای پروتئین p53 انسان)
protein_accession_id = "NP_000537.3"
print(f"در حال بازیابی توالی پروتئینی با ID: {protein_accession_id} به فرمت FASTA...")
try:
# ارسال درخواست efetch
fetch_handle = Entrez.efetch(db="protein", id=protein_accession_id, rettype="fasta", retmode="text")
fasta_record_text = fetch_handle.read() # خواندن کل محتوای پاسخ
fetch_handle.close()
print("\n200 کاراکتر اول توالی پروتئینی دریافت شده:")
print(fasta_record_text[:200]) # نمایش 200 کاراکتر اول برای بررسی
# میتوانیم این توالی را با Bio.SeqIO تجزیه کنیم
# لازم است که شیء stringIO برای SeqIO ایجاد کنیم چون fetch_handle بسته شده است
from io import StringIO
fasta_io = StringIO(fasta_record_text)
seq_record = SeqIO.read(fasta_io, "fasta")
print(f"\nID توالی تجزیه شده: {seq_record.id}")
print(f"طول توالی: {len(seq_record.seq)} آمینو اسید")
print(f"چند آمینو اسید اول: {seq_record.seq[:20]}")
except Exception as e:
print(f"خطا در بازیابی یا تجزیه توالی پروتئینی: {e}")
print("اطمینان حاصل کنید که ID پروتئین صحیح است و ایمیل Entrez تنظیم شده است.")
همانطور که مشاهده شد، خروجی Entrez.efetch یک دسته (handle) است که میتوان محتوای آن را خواند (مانند یک فایل) و سپس با ماژولهای دیگر بیوپایتون (مانند Bio.SeqIO) تجزیه کرد. این انعطافپذیری، بیوپایتون را به ابزاری قدرتمند برای اتوماسیون وظایف بازیابی داده تبدیل میکند.
نکات مهم برای استفاده از Bio.Entrez:
- مدیریت نرخ درخواست (Rate Limiting): NCBI توصیه میکند که بیش از 3 درخواست در ثانیه به سرورهای Entrez ارسال نکنید. برای جلوگیری از مسدود شدن IP خود، در کدهای حلقهای که درخواستهای متوالی ارسال میکنند، از
time.sleep(0.34)یا بیشتر استفاده کنید. - کنترل خطا: همیشه درخواستهای شبکه را در بلوکهای
try-exceptقرار دهید تا خطاهای شبکه (مانندURLError) یا خطاهای سرور (مانندHTTPError) را به درستی مدیریت کنید. - بستن handleها: همیشه پس از استفاده از یک handle برگشتی از توابع
Entrez(مانندesearchیاefetch)، آن را باhandle.close()ببندید تا منابع سیستم آزاد شوند.
تجزیه و تحلیل توالیها با Bio.SeqIO و Bio.Seq
پس از اینکه توالیها از پایگاههای داده بیولوژیکی بازیابی شدند، مرحله بعدی معمولاً تجزیه و تحلیل و دستکاری این توالیها است. بیوپایتون ابزارهای قدرتمندی را در ماژولهای Bio.Seq و Bio.SeqIO برای این منظور فراهم میکند که امکان کار با توالیها در فرمتهای مختلف و با ابردادههای غنی را به شکلی شیءگرا فراهم میآورد.
مفهوم و ساختار Seq و SeqRecord
در هسته کار با توالیها در بیوپایتون، دو کلاس مهم قرار دارند: Seq و SeqRecord.
Bio.Seq.Seq:
این کلاس یک نمایش شیءگرا از خود توالیهای بیولوژیکی (DNA، RNA، پروتئین) را فراهم میکند. یک شیءSeqبه سادگی یک رشته از نوکلئوتیدها یا آمینو اسیدها را در خود نگهداری میکند. اما برخلاف یک رشته پایتونی معمولی، شیءSeqدارای متدهای بیولوژیکی مفیدی است. برای مثال، میتوانید به راحتی مکمل (complement)، مکمل معکوس (reverse_complement) یک توالی DNA/RNA را بگیرید یا یک توالی DNA/RNA را به پروتئین ترجمه کنید.from Bio.Seq import Seq dna_seq = Seq("ATGCGTACGTACGTACGT") print(f"توالی DNA: {dna_seq}") print(f"مکمل توالی: {dna_seq.complement()}") print(f"مکمل معکوس توالی: {dna_seq.reverse_complement()}") # مثال ترجمه (کوتاه برای مثال) mrna_seq = Seq("AUGGCUGCAUGAGUGA") # شروع با AUG و پایان با UGA protein_seq = mrna_seq.translate() print(f"توالی پروتئین: {protein_seq}") # انتظار داریم: M A A *Bio.SeqRecord.SeqRecord:
SeqRecordیک لایه انتزاعی بالاتر است که یک توالی (شیءSeq) را به همراه تمام ابردادههای مرتبط با آن نمایش میدهد. این ابردادهها برای درک زمینه و منبع توالی بسیار مهم هستند و از فایلهای فرمتهای غنی مانند GenBank یا UniProt استخراج میشوند. یک شیءSeqRecordدارای ویژگیهای کلیدی زیر است:id: شناسه اصلی توالی، معمولاً یک Accession ID پایگاه داده (مانند “NM_000546.5”).name: یک نام کوتاه و قابل تشخیص برای توالی (مانند “TP53_HUMAN”).description: یک توضیح مفصلتر از توالی (مانند “Homo sapiens tumor protein p53 (TP53), transcript variant 1, mRNA”).seq: شیءSeqحاوی خود توالی بیولوژیکی.features: لیستی از اشیاءSeqFeatureکه حاشیهنویسیهای ساختاری و عملکردی را نمایش میدهند (مانند موقعیت ژنها، مناطق کدکننده (CDS)، اگزونها، سایتهای اتصال). هرSeqFeatureدارای یک نوع (type) و یک موقعیت (location) است.annotations: یک دیکشنری حاوی حاشیهنویسیهای عمومیتر که به کل رکورد اعمال میشوند (مانند تاکسونومی ارگانیسم، مراجع، تاریخ ایجاد).letter_annotations: دیکشنریای برای حاشیهنویسی هر نوکلئوتید/آمینو اسید در توالی (کمتر رایج).
SeqRecordرویکرد استاندارد بیوپایتون برای نمایش یک “رکورد” توالی از هر فایل یا پایگاه دادهای است و به عنوان یک کانتینر جامع عمل میکند.خواندن و نوشتن توالیها با
Bio.SeqIOماژول
Bio.SeqIOمهمترین ابزار برای کار با فایلهای توالی است. این ماژول یک رابط کاربری یکپارچه برای خواندن (parsing) و نوشتن (writing) توالیها در فرمتهای مختلف فایل (مانند FASTA، GenBank، PDB، EMBL، SwissProt و غیره) فراهم میکند.خواندن توالیها از فایل
تابع
Bio.SeqIO.parse()برای خواندن چندین رکورد توالی از یک فایل استفاده میشود. این تابع یک ژنراتور برمیگرداند که اجازه میدهد تا رکوردها را یکی یکی پردازش کنید، که برای فایلهای بسیار بزرگ که نمیتوانند به طور کامل در حافظه بارگذاری شوند، بسیار کارآمد است.مثال: خواندن یک فایل FASTA حاوی چندین توالی
from Bio import SeqIO import os # ایجاد یک فایل FASTA موقت برای مثال fasta_content = """>seq1_description_long ATGCATGCATGCATGCATGC >seq2_another_gene GCTAGCTAGCTAGCTAGCTA """ fasta_file = "example_sequences.fasta" with open(fasta_file, "w") as f: f.write(fasta_content) print(f"در حال خواندن توالیها از فایل {fasta_file}:") try: for record in SeqIO.parse(fasta_file, "fasta"): print(f" ID: {record.id}") print(f" Name: {record.name}") print(f" Description: {record.description}") print(f" Sequence (first 10 chars): {record.seq[:10]}") print(f" Length: {len(record.seq)}") print(" ---") except Exception as e: print(f"خطا در خواندن فایل FASTA: {e}") finally: if os.path.exists(fasta_file): os.remove(fasta_file) # پاک کردن فایل موقتبرای خواندن یک تک رکورد از یک فایل که انتظار میرود فقط یک توالی داشته باشد، از
Bio.SeqIO.read()استفاده کنید. اگر فایل بیش از یک رکورد داشته باشد، این تابع خطا میدهد.خواندن توالیها از خروجی
Entrez.efetchیکی از کاربردهای حیاتی
Bio.SeqIO، تجزیه خروجیEntrez.efetchاست که اغلب در فرمتهای GenBank یا FASTA دریافت میشود. همانطور که قبلاً دیدیم،Entrez.efetchیک handle برمیگرداند کهBio.SeqIOمیتواند مستقیماً آن را پردازش کند.from Bio import Entrez from Bio import SeqIO import time Entrez.email = "Your.Email@example.com" # بازیابی یک توالی ژنومی GenBank برای mRNA ژن TP53 (NM_000546.5) accession_id = "NM_000546.5" print(f"در حال بازیابی رکورد GenBank برای ID: {accession_id}...") try: # Entrez.efetch یک handle فایل مانند را برمی گرداند fetch_handle = Entrez.efetch(db="nucleotide", id=accession_id, rettype="gb", retmode="text") # Bio.SeqIO.read() این handle را پردازش کرده و یک شیء SeqRecord برمی گرداند record = SeqIO.read(fetch_handle, "genbank") fetch_handle.close() # بستن handle پس از استفاده print(f"\nرکورد GenBank با موفقیت تجزیه شد:") print(f" ID: {record.id}") print(f" Name: {record.name}") print(f" Description: {record.description}") print(f" طول توالی: {len(record.seq)} bp") print(f" ارگانیسم: {record.annotations.get('organism', 'N/A')}") print(f" تاریخ ایجاد: {record.annotations.get('date', 'N/A')}") print(f" تعداد ویژگیها: {len(record.features)}") # دسترسی به ویژگیها (features) و ابردادهها (annotations) print("\nچند ویژگی اول:") for feature in record.features[:5]: # نمایش 5 ویژگی اول print(f" Type: {feature.type}, Location: {feature.location}") # اگر ویژگی از نوع CDS باشد، میتوانیم محصول پروتئینی را استخراج کنیم if feature.type == "CDS" and "product" in feature.qualifiers: print(f" Product: {feature.qualifiers['product'][0]}") print(f" Protein ID: {feature.qualifiers.get('protein_id', ['N/A'])[0]}") print("\nچند حاشیهنویسی (annotation) کلیدی:") for key, value in list(record.annotations.items())[:5]: # نمایش 5 حاشیهنویسی اول print(f" {key}: {value}") except Exception as e: print(f"خطا در بازیابی یا تجزیه رکورد GenBank: {e}") print("لطفاً ID را بررسی کرده و مطمئن شوید ایمیل Entrez تنظیم شده است.") time.sleep(1) # تاخیر برای رعایت نرخ درخواستنوشتن توالیها به فایل
تابع
Bio.SeqIO.write()برای ذخیره یک یا چند شیءSeqRecordبه یک فایل در فرمت مشخص استفاده میشود. این برای ذخیره نتایج تحلیلها، یا تبدیل فرمت فایلها بسیار مفید است.from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord from Bio import SeqIO import os # ساخت چند شیء SeqRecord برای نوشتن record1 = SeqRecord( Seq("ATGCAGTAGCAAGGCTAA"), id="geneX", name="my_gene_X", description="Hypothetical gene X from synthetic genome" ) record1.annotations["organism"] = "Syntheticus artificialis" record1.annotations["mol_type"] = "genomic DNA" record2 = SeqRecord( Seq("GCTAGCTACGTAGCTGCA"), id="geneY", name="my_gene_Y", description="Another hypothetical gene Y" ) record2.annotations["organism"] = "Syntheticus artificialis" record2.annotations["mol_type"] = "genomic DNA" records_to_write = [record1, record2] # نوشتن به فایل FASTA output_fasta_file = "my_synthetic_genes.fasta" try: count = SeqIO.write(records_to_write, output_fasta_file, "fasta") print(f"تعداد {count} توالی در فایل {output_fasta_file} (فرمت FASTA) نوشته شد.") # خواندن مجدد فایل برای تأیید print("\nمحتوای فایل FASTA تولید شده:") with open(output_fasta_file, "r") as f: print(f.read()) except Exception as e: print(f"خطا در نوشتن فایل FASTA: {e}") finally: if os.path.exists(output_fasta_file): os.remove(output_fasta_file) print("\n----------------------------------") # مثال: نوشتن به فرمت GenBank (به دلیل پیچیدگی فرمت GenBank، حاشیهنویسیها به طور کامل پشتیبانی نمیشوند مگر اینکه به طور کامل تعریف شده باشند) # این مثال برای نشان دادن قابلیت است، نه تولید یک فایل GenBank کامل و معتبر. output_genbank_file = "my_synthetic_genes.gb" try: # Bio.SeqIO میتواند بسیاری از فرمتها را بنویسد، اما کیفیت خروجی GenBank بستگی به کامل بودن اطلاعات SeqRecord دارد # برای مثالهای ساده، ممکن است همه ابردادهها منتقل نشوند count_gb = SeqIO.write(records_to_write, output_genbank_file, "genbank") print(f"تعداد {count_gb} توالی در فایل {output_genbank_file} (فرمت GenBank) نوشته شد.") # خواندن مجدد فایل برای تأیید (ممکن است کامل نباشد) print("\nمحتوای فایل GenBank تولید شده (ممکن است ساده شده باشد):") with open(output_genbank_file, "r") as f: print(f.read()) except Exception as e: print(f"خطا در نوشتن فایل GenBank: {e}") finally: if os.path.exists(output_genbank_file): os.remove(output_genbank_file)Bio.SeqIOبه عنوان یک ابزار اساسی و همه کاره برای مدیریت فایلهای توالی، در هر پروژه بیوانفورماتیکی که شامل خواندن، پردازش و ذخیره توالیها باشد، نقش محوری ایفا میکند. این ماژول، همراه باBio.SeqوBio.SeqRecord، یک چارچوب قدرتمند و انعطافپذیر برای کار با دادههای توالی در پایتون فراهم میآورد.تعامل با پایگاههای داده ساختار سهبعدی (PDB)
Protein Data Bank (PDB) یکی از حیاتیترین منابع اطلاعاتی در بیولوژی ساختاری است. این پایگاه داده، اطلاعات سهبعدی بیش از 200,000 ساختار ماکرومولکول زیستی (عمدتاً پروتئینها و اسیدهای نوکلئیک) را که از طریق روشهایی مانند کریستالوگرافی اشعه ایکس، NMR و میکروسکوپ الکترونی کریو (Cryo-EM) تعیین شدهاند، جمعآوری و در دسترس قرار میدهد. درک ساختار سهبعدی مولکولها برای فهم عملکرد آنها، طراحی دارو و مهندسی پروتئین بسیار مهم است. ماژول
Bio.PDBدر بیوپایتون ابزارهایی جامع برای دانلود، تجزیه و تحلیل این ساختارها فراهم میکند.دانلود فایلهای PDB با
PDBListکلاس
PDBListبه شما امکان میدهد تا به صورت برنامهنویسی فایلهای PDB را از سرورهای PDB (که توسط WWPDB مدیریت میشود) دانلود کنید. این فایلها معمولاً در فرمت PDB (یک فرمت متنی قدیمیتر) یا PDBx/mmCIF (یک فرمت جدیدتر و ساختاریافتهتر) ذخیره میشوند.from Bio.PDB import PDBList import os import time # تنظیم پوشهای برای ذخیره فایلهای PDB دانلود شده pdb_folder = "pdb_files" # اطمینان حاصل کنید که پوشه وجود دارد if not os.path.exists(pdb_folder): os.makedirs(pdb_folder) print(f"پوشه '{pdb_folder}' ایجاد شد.") # ایجاد یک نمونه از PDBList. پارامتر 'pdb' مسیر پوشه دانلود را مشخص میکند. pdbl = PDBList(pdb=pdb_folder) # دانلود یک ساختار PDB خاص (مثلاً 1FAT - فاکتور Xa انسانی) pdb_id_1 = "1fat" print(f"\nدر حال دانلود ساختار PDB با ID: {pdb_id_1}...") try: # retrieve_pdb_file() فایل را دانلود کرده و مسیر آن را برمیگرداند. # 'pdir' مسیر پوشه را مشخص میکند و 'file_format' فرمت فایل (pdb یا mmCif) را. file_path_1 = pdbl.retrieve_pdb_file(pdb_id_1, pdir=pdb_folder, file_format="pdb") print(f"فایل {pdb_id_1} به مسیر: {file_path_1} دانلود شد.") except Exception as e: print(f"خطا در دانلود فایل PDB {pdb_id_1}: {e}") time.sleep(1) # تاخیر برای رعایت نرخ درخواست # دانلود یک ساختار PDB دیگر (مثلاً 4HHB - هموگلوبین انسان) pdb_id_2 = "4hhb" print(f"\nدر حال دانلود ساختار PDB با ID: {pdb_id_2}...") try: file_path_2 = pdbl.retrieve_pdb_file(pdb_id_2, pdir=pdb_folder, file_format="mmCif") print(f"فایل {pdb_id_2} به مسیر: {file_path_2} دانلود شد (با فرمت mmCif).") except Exception as e: print(f"خطا در دانلود فایل PDB {pdb_id_2}: {e}") # فهرست کردن فایلهای دانلود شده print(f"\nمحتویات پوشه '{pdb_folder}':") for f_name in os.listdir(pdb_folder): print(f" - {f_name}")تجزیه فایلهای PDB با
PDBParserپس از دانلود فایل PDB، باید آن را تجزیه کنیم تا به اطلاعات ساختاری آن دسترسی پیدا کنیم.
PDBParser(یاMMCIFParserبرای فرمت mmCIF) این وظیفه را بر عهده دارد. بیوپایتون یک سلسله مراتب شیءگرا برای نمایش ساختارهای سهبعدی تعریف میکند:Structure: بالاترین سطح در سلسله مراتب، که یک ساختار کامل را نمایندگی میکند و ممکن است شامل چندین مدل باشد (به خصوص در مورد ساختارهای NMR که چندین مدل را ارائه میدهند).Model: یک مدل واحد از ساختار را نمایش میدهد. هرStructureحداقل یکModelدارد.Chain: هرModelشامل یک یا چند زنجیره پپتیدی (یا اسید نوکلئیک) است که با شناسههای منحصر به فرد (معمولاً حروف بزرگ) مشخص میشوند.Residue: هرChainشامل یک سری از باقیماندهها (آمینو اسیدها در پروتئینها یا نوکلئوتیدها در اسیدهای نوکلئیک) است. هرResidueبا نام (مثلاً “GLY”، “ALA”) و شماره شناسایی (مثلاً 1، 2، 3) مشخص میشود.Atom: هرResidueاز یک سریAtomتشکیل شده است. هرAtomدارای یک نام (مثلاً “N”، “CA”، “C”، “O” برای اتمهای اصلی اسکلت پپتیدی) و مختصات سهبعدی (x, y, z) است.
مثال: تجزیه یک فایل PDB و دسترسی به اجزای ساختاری
from Bio.PDB import PDBParser, MMCIFParser import os # فرض میکنیم فایل 1fat.pdb از قبل در 'pdb_files' دانلود شده است pdb_file_path_1fat = os.path.join(pdb_folder, "pdb1fat.ent") # نام فایل PDB معمولاً به این شکل است if os.path.exists(pdb_file_path_1fat): parser = PDBParser(QUIET=True) # QUIET=True برای ساکت کردن هشدارها # get_structure(structure_id, filename) یک شیء Structure برمیگرداند structure_1fat = parser.get_structure("1fat", pdb_file_path_1fat) print(f"\nتجزیه ساختار: {structure_1fat.id}") print(f"نوع روش تعیین ساختار: {structure_1fat.header.get('deposition_date', 'N/A')}") # مثال دسترسی به هدر for model in structure_1fat: print(f" Model ID: {model.id}") for chain in model: print(f" Chain ID: {chain.id}") # دسترسی به چند باقیمانده اول for i, residue in enumerate(chain): if i >= 3: # فقط 3 باقیمانده اول را نمایش دهید break # residue.get_resname() نام آمینو اسید را برمیگرداند (مثلاً "GLY") # residue.id[1] شماره باقیمانده در زنجیره را برمیگرداند print(f" Residue: {residue.get_resname()} {residue.id[1]}") # دسترسی به چند اتم اول در باقیمانده for j, atom in enumerate(residue): if j >= 2: # فقط 2 اتم اول را نمایش دهید break # atom.get_name() نام اتم را برمیگرداند (مثلاً "CA") # atom.get_coord() مختصات سهبعدی (x, y, z) را برمیگرداند print(f" Atom: {atom.get_name()} at {atom.get_coord()}") if len(model) > 1: # اگر زنجیرههای زیادی وجود دارد، فقط اولین زنجیره را برای سادگی نمایش دهید break if len(structure_1fat) > 1: # اگر مدلهای زیادی وجود دارد، فقط اولین مدل را برای سادگی نمایش دهید break else: print(f"فایل PDB برای {pdb_id_1} در مسیر {pdb_file_path_1fat} یافت نشد. لطفاً ابتدا آن را دانلود کنید.") print("\n----------------------------------") # مثال تجزیه فایل mmCif (برای 4HHB) pdb_file_path_4hhb_cif = os.path.join(pdb_folder, "4hhb.cif") # نام فایل mmCif معمولاً به این شکل است if os.path.exists(pdb_file_path_4hhb_cif): cif_parser = MMCIFParser(QUIET=True) structure_4hhb = cif_parser.get_structure("4hhb", pdb_file_path_4hhb_cif) print(f"\nتجزیه ساختار: {structure_4hhb.id} (از فایل mmCif)") for model in structure_4hhb: print(f" Model ID: {model.id}") for chain in model: print(f" Chain ID: {chain.id}") # میتوانیم طول زنجیره (تعداد باقیماندهها) را بگیریم print(f" Length of Chain: {len(chain)}") break # فقط اولین زنجیره break # فقط اولین مدل else: print(f"فایل mmCif برای {pdb_id_2} در مسیر {pdb_file_path_4hhb_cif} یافت نشد. لطفاً ابتدا آن را دانلود کنید.") # پاک کردن پوشه فایلهای PDB پس از اتمام مثال (اختیاری) # try: # if os.path.exists(pdb_folder): # for f_name in os.listdir(pdb_folder): # os.remove(os.path.join(pdb_folder, f_name)) # os.rmdir(pdb_folder) # print(f"\nپوشه '{pdb_folder}' و محتویات آن پاک شدند.") # except Exception as e: # print(f"خطا در پاک کردن پوشه: {e}")Bio.PDBهمچنین ابزارهایی برای انجام تحلیلهای ساختاری پیشرفتهتر فراهم میکند، مانند:- محاسبه فواصل و زوایا: با دسترسی به مختصات اتمها، میتوان فواصل بین دو اتم یا زوایا را محاسبه کرد.
- انتخاب اجزای ساختاری: امکان انتخاب زیرمجموعهای از اتمها، باقیماندهها یا زنجیرهها بر اساس معیارهای خاص (مثلاً همه اتمهای کربن آلفا).
- تبدیلات هندسی: چرخاندن یا انتقال ساختارها.
- پیدا کردن تماسها: شناسایی اتمهایی که در فاصله مشخصی از یکدیگر قرار دارند (مفید برای تحلیل تعاملات).
برای بیولوژیستهای ساختاری، بیوفیزیکدانان، و هر کسی که به درک عملکرد مولکولها از طریق ساختار سهبعدی آنها علاقهمند است،
Bio.PDBیک ابزار ضروری و قدرتمند است. این ماژول امکان اتوماسیون وظایف تکراری و انجام تحلیلهای پیچیده را فراهم میآورد.کار با همترازیهای توالی (Sequence Alignments) با
Bio.AlignIOهمترازی توالیها (Sequence Alignment) یکی از تحلیلهای بنیادی و بسیار مهم در بیوانفورماتیک است. این فرآیند شامل مرتبسازی توالیهای DNA، RNA یا پروتئین به گونهای است که نواحی مشابه (مشخص کننده همولوژی یا مناطق حفاظتشده) و تفاوتها (مشخص کننده واریانتها یا مناطق متفاوت) به وضوح مشخص شوند. همترازیها برای کشف شباهتها، استنتاج روابط تکاملی، شناسایی دامنههای عملکردی، پیشبینی ساختار و بسیاری دیگر از کاربردهای بیولوژیکی حیاتی هستند. ابزارهای نرمافزاری متعددی مانند Clustal Omega، MAFFT، Muscle و T-Coffee برای ایجاد همترازیهای چندگانه (Multiple Sequence Alignment – MSA) به صورت گستردهای استفاده میشوند. ماژول
Bio.AlignIOدر بیوپایتون ابزاری کارآمد برای خواندن، نوشتن و دستکاری این فایلهای همترازی در فرمتهای مختلف فراهم میکند.مفهوم
MultipleSeqAlignmentدر بیوپایتون، یک همترازی چندگانه توسط کلاس
Bio.Align.MultipleSeqAlignmentنمایش داده میشود. این کلاس شامل لیستی از اشیاءSeqRecordاست که همه طول یکسانی دارند. طول یکسان به این دلیل است که شکافها (gaps) به توالیها اضافه میشوند تا همترازی حفظ شود و همه توالیها به یک اندازه “کشش” پیدا کنند. هرSeqRecordدر یکMultipleSeqAlignment، یک توالی ورودی را پس از همترازی نشان میدهد و شامل توالی (شیءSeq) به همراه ID و توضیحات آن است.خواندن همترازیها با
Bio.AlignIO.parseمشابه
Bio.SeqIO.parseبرای توالیهای منفرد، تابعBio.AlignIO.parse()یک ژنراتور برمیگرداند که اجازه میدهد همترازیها را یکی یکی از فایل بخوانید. این رویکرد برای کار با فایلهای همترازی بزرگ یا فایلهایی که شامل چندین همترازی هستند، بسیار کارآمد است.فرمتهای رایج پشتیبانی شده توسط
Bio.AlignIOعبارتند از:clustal: فرمت استاندارد خروجی بسیاری از ابزارهای همترازی مانند Clustal Omega.fasta: اگرچه FASTA به طور ذاتی فرمت همترازی نیست، اما بسیاری از ابزارها خروجی همتراز شده را به فرمت FASTA (با شکافهای مشخص) ارائه میدهند.phylip: فرمت PHYLIP، که برای نرمافزارهای فیلوژنتیک رایج است.stockholm: فرمت Stockholm، که اغلب برای مدلهای پنهان مارکوف (HMM) و پایگاههای داده مانند Pfam استفاده میشود.nexus: فرمت Nexus، که توسط برنامههای فیلوژنتیک مانند PAUP* و MrBayes استفاده میشود.emboss: فرمت عمومی EMBL.maf: فرمت MAF (Multiple Alignment Format) برای همترازیهای ژنومی.
مثال: خواندن یک فایل همترازی Clustal
from Bio import AlignIO from Bio.Align import MultipleSeqAlignment from Bio.SeqRecord import SeqRecord from Bio.Seq import Seq import os # ایجاد یک فایل همترازی Clustal موقت برای مثال clustal_content = """CLUSTAL O(1.2.4) multiple sequence alignment seq1 ATGC-GTAC--GAT---TTA seq2 ATGCGGTA-ACGATGGGCTA seq3 ATGCGGT--ACGAT--GCTA seq4 ATGCGGT--ACGAT---CTA """ alignment_file_clustal = "example_alignment.aln" with open(alignment_file_clustal, "w") as f: f.write(clustal_content) print(f"در حال خواندن همترازی از فایل {alignment_file_clustal} (فرمت Clustal)...") try: with open(alignment_file_clustal, "r") as aln_handle: # AlignIO.parse() یک ژنراتور برمیگرداند alignments = AlignIO.parse(aln_handle, "clustal") for i, alignment in enumerate(alignments): print(f" همترازی {i+1}:") print(f" تعداد توالیها: {len(alignment)}") print(f" طول همترازی (شامل شکافها): {alignment.get_alignment_length()}") print(" توالیها:") for record in alignment: print(f" ID: {record.id}, توالی: {record.seq}") # میتوان به توالی مانند یک رشته دسترسی پیدا کرد # print(f" {record.seq[5:10]}") # استخراج زیرتوالی except Exception as e: print(f"خطا در خواندن فایل همترازی Clustal: {e}") finally: if os.path.exists(alignment_file_clustal): os.remove(alignment_file_clustal) print("\n----------------------------------") # مثال: خواندن یک فایل FASTA (که ممکن است همتراز شده باشد) fasta_aligned_content = """>seqA_aligned ATGC---GTA-C >seqB_aligned ATGCGGCTAGC- """ alignment_file_fasta = "example_aligned.fasta" with open(alignment_file_fasta, "w") as f: f.write(fasta_aligned_content) print(f"در حال خواندن همترازی از فایل {alignment_file_fasta} (فرمت FASTA)...") try: with open(alignment_file_fasta, "r") as aln_handle_fasta: alignments_fasta = AlignIO.parse(aln_handle_fasta, "fasta") for i, alignment_fa in enumerate(alignments_fasta): print(f" همترازی {i+1}:") print(f" تعداد توالیها: {len(alignment_fa)}") print(f" طول همترازی: {alignment_fa.get_alignment_length()}") print(" توالیها:") for record_fa in alignment_fa: print(f" ID: {record_fa.id}, توالی: {record_fa.seq}") except Exception as e: print(f"خطا در خواندن فایل همترازی FASTA: {e}") finally: if os.path.exists(alignment_file_fasta): os.remove(alignment_file_fasta)نوشتن همترازیها با
Bio.AlignIO.writeشما میتوانید یک شیء
MultipleSeqAlignment(یا لیستی از آنها) را به فرمتهای مختلف خروجی بنویسید. این قابلیت برای تبدیل فرمت فایلهای همترازی یا ذخیره همترازیهایی که به صورت برنامهنویسی ایجاد یا دستکاری شدهاند، بسیار مفید است.مثال: ساخت یک همترازی و نوشتن آن به فرمت PHYLIP
from Bio.SeqRecord import SeqRecord from Bio.Seq import Seq from Bio.Align import MultipleSeqAlignment from Bio import AlignIO import os # ساخت چند شیء SeqRecord که طول همترازی دارند align_records = [ SeqRecord(Seq("ATGCAGTA-GCA"), id="gene1", description="Human gene 1"), SeqRecord(Seq("ATGCA-TA-GCT"), id="gene2", description="Mouse gene 2"), SeqRecord(Seq("ATGCAGTA-GCT"), id="gene3", description="Rat gene 3") ] # ایجاد یک شیء MultipleSeqAlignment از لیست SeqRecord ها my_alignment = MultipleSeqAlignment(align_records) output_phylip_file = "output.phylip" print(f"در حال نوشتن همترازی به فایل {output_phylip_file} (فرمت PHYLIP)...") try: # AlignIO.write() شیء همترازی را به فایل با فرمت مشخص مینویسد count = AlignIO.write(my_alignment, output_phylip_file, "phylip") print(f"تعداد {count} همترازی در فایل {output_phylip_file} نوشته شد.") # خواندن مجدد فایل برای تأیید print("\nمحتوای فایل PHYLIP تولید شده:") with open(output_phylip_file, "r") as f: print(f.read()) except Exception as e: print(f"خطا در نوشتن فایل همترازی PHYLIP: {e}") finally: if os.path.exists(output_phylip_file): os.remove(output_phylip_file) print("\n----------------------------------") # مثال: تبدیل فرمت از Clustal به FASTA (همتراز شده) # فرض میکنیم فایل clustal_content از قبل موجود است و میخواهیم آن را تبدیل کنیم clustal_content_for_conversion = """CLUSTAL O(1.2.4) multiple sequence alignment seq_A ATGC-GTAC--GAT---TTA seq_B ATGCGGTA-ACGATGGGCTA seq_C ATGCGGT--ACGAT--GCTA """ input_clustal_file = "input_for_conversion.aln" with open(input_clustal_file, "w") as f: f.write(clustal_content_for_conversion) output_fasta_aligned_file = "output_converted.fasta" print(f"در حال تبدیل فرمت از {input_clustal_file} (Clustal) به {output_fasta_aligned_file} (FASTA)...") try: with open(input_clustal_file, "r") as in_handle: with open(output_fasta_aligned_file, "w") as out_handle: # از SeqIO.parse برای خواندن و SeqIO.write برای نوشتن استفاده میکنیم # این روش برای تبدیل فرمتها بسیار قدرتمند است alignments_to_convert = AlignIO.parse(in_handle, "clustal") count_converted = AlignIO.write(alignments_to_convert, out_handle, "fasta") print(f"تعداد {count_converted} همترازی تبدیل شد.") print("\nمحتوای فایل FASTA تبدیل شده:") with open(output_fasta_aligned_file, "r") as f: print(f.read()) except Exception as e: print(f"خطا در تبدیل فرمت همترازی: {e}") finally: if os.path.exists(input_clustal_file): os.remove(input_clustal_file) if os.path.exists(output_fasta_aligned_file): os.remove(output_fasta_aligned_file)Bio.AlignIOیک نقطه شروع ضروری برای هر گونه تحلیل پسا-همترازی است. با استفاده از این ماژول، میتوانید به راحتی به توالیهای همتراز شده دسترسی پیدا کنید، مناطق حفاظتشده را شناسایی کنید، فاصله همولوگها را محاسبه کنید و دادهها را برای نرمافزارهای فیلوژنتیک یا سایر تحلیلهای پاییندستی آماده کنید. این قابلیت به محققان امکان میدهد تا به سرعت و به طور موثر به بینشهای بیولوژیکی از دادههای همتراز شده دست یابند.استفاده از NCBI BLAST از طریق بیوپایتون
BLAST (Basic Local Alignment Search Tool) یکی از مهمترین و پرکاربردترین ابزارها در بیوانفورماتیک است. این الگوریتم برای مقایسه یک توالی نوکلئوتیدی یا پروتئینی (query sequence) با پایگاههای داده عظیم توالیها (subject sequences) طراحی شده است تا نواحی با شباهت محلی بالا را شناسایی کند. نتایج BLAST به محققان کمک میکند تا توالیهای مشابه را کشف کنند، روابط تکاملی را استنتاج کنند، دامنههای عملکردی را شناسایی کنند، ژنها را در گونههای مختلف پیدا کنند، و بسیاری از سوالات بیولوژیکی دیگر را پاسخ دهند. بیوپایتون ابزارهایی را برای اجرای BLAST به دو صورت فراهم میکند: BLAST از راه دور (با استفاده از سرورهای NCBI) و BLAST محلی (با استفاده از نصب محلی ابزارهای BLAST+).
BLAST از راه دور با
Bio.Blast.NCBIWWWماژول
Bio.Blast.NCBIWWWبه شما امکان میدهد تا توالیهای خود را به سرورهای BLAST NCBI ارسال کرده و نتایج را مستقیماً دریافت کنید. این روش سادهترین راه برای انجام جستجوهای BLAST بدون نیاز به نصب هیچ نرمافزار اضافی به صورت محلی است.تابع اصلی در این ماژول،
Bio.Blast.NCBIWWW.qblast()است.پارامترهای کلیدی تابع
qblast:program: نوع برنامه BLAST مورد استفاده. مثالها:- “blastn”: توالی DNA به توالی DNA.
- “blastp”: توالی پروتئین به توالی پروتئین.
- “blastx”: توالی DNA (با ترجمه شش چارچوب) به توالی پروتئین.
- “tblastn”: توالی پروتئین به توالی DNA (با ترجمه شش چارچوب).
- “tblastx”: توالی DNA (با ترجمه شش چارچوب) به توالی DNA (با ترجمه شش چارچوب).
database: پایگاه داده مورد جستجو. مثالها:- “nr”: پایگاه داده غیرتکراری NCBI (شامل توالیهای نوکلئوتیدی و پروتئینی).
- “nt”: پایگاه داده نوکلئوتیدی NCBI.
- “swissprot”: زیرمجموعه UniProtKB/Swiss-Prot (پروتئینهای حاشیهنویسی شده).
- “pdb”: پایگاه داده Protein Data Bank (ساختارهای پروتئینی).
- “refseq_rna”, “refseq_protein”: توالیهای RefSeq.
sequence: توالی ورودی شما. این میتواند یک رشته حاوی توالی (ترجیحاً در فرمت FASTA) یا یک شیءBio.SeqRecordباشد.entrez_query: یک عبارت جستجوی Entrez برای فیلتر کردن پایگاه داده هدف قبل از اجرای BLAST (مثلاً برای جستجو فقط در یک گونه خاص).expect: حد انتظار یا E-value. این یک آستانه آماری است که تعداد همترازیهای تصادفی با امتیاز مشابه یا بهتر از آن را در یک پایگاه داده با اندازه مشخص نشان میدهد. مقادیر کوچکتر (مثلاً 1e-10) به معنی همترازیهای معنادارتر هستند.format_type: نوع فرمت خروجی. پیشفرض “XML” است که برای تجزیه توسطBio.Blast.NCBIXMLدر بیوپایتون بسیار مناسب است.
مثال: اجرای BLASTP از راه دور برای یک توالی پروتئینی
from Bio.Blast import NCBIWWW from Bio.Blast import NCBIXML from Bio.Seq import Seq from Bio.SeqRecord import SeqRecord import time from Bio import Entrez from urllib.error import URLError, HTTPError # تنظیم ایمیل Entrez (ضروری برای استفاده از سرویسهای NCBI) Entrez.email = "Your.Email@example.com" # یک توالی پروتئینی مثال (توالی کوتاه انسانی برای سرعت) # این توالی مربوط به قسمتی از پروتئین هموگلوبین بتا است my_protein_sequence_str = "VLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHF" my_protein_seq_record = SeqRecord(Seq(my_protein_sequence_str), id="My_Query_Hemoglobin_Beta") print("در حال ارسال درخواست BLASTP به سرور NCBI... لطفاً صبر کنید (این ممکن است چند ثانیه طول بکشد).") try: # ارسال درخواست BLASTP به پایگاه داده "pdb" برای جستجوی پروتئینهای با ساختار مشخص result_handle = NCBIWWW.qblast( program="blastp", database="pdb", sequence=my_protein_seq_record.format("fasta"), # توالی باید در فرمت FASTA باشد expect=1e-5, # حد انتظار alignments=10, # تعداد همترازیهای برتر برای نمایش descriptions=10 # تعداد توضیحات برتر برای نمایش ) print("درخواست BLAST ارسال شد و نتیجه دریافت گردید. در حال تجزیه نتایج...") # تجزیه نتایج BLAST از فرمت XML # NCBIXML.parse() یک ژنراتور برمیگرداند که اجازه میدهد به هر نتیجه BLAST به صورت جداگانه دسترسی پیدا کنیم # این برای زمانی که چندین توالی را در یک درخواست BLAST میکنید مفید است blast_records = NCBIXML.parse(result_handle) # برای هر نتیجه BLAST (اگر چندین توالی جستجو کرده باشید، هر کدام یک blast_record خواهند داشت) found_hits = False for blast_record in blast_records: print(f"\n--- نتایج BLAST برای توالی Query: {blast_record.query[:50]}... ---") if blast_record.alignments: found_hits = True # نمایش 5 تا از بهترین همسانها (hits) for i, alignment in enumerate(blast_record.alignments): if i >= 5: # فقط 5 همسان اول را نمایش دهید break print(f" **** همسان {i+1} ****") print(f" عنوان موضوع: {alignment.title}") print(f" طول موضوع: {alignment.length}") # هر همسان میتواند شامل چندین HSP (High-scoring Segment Pair) باشد for hsp in alignment.hsps: print(f" E-value: {hsp.expect}") print(f" امتیاز بیت (Bit Score): {hsp.bits}") # درصد هویت را محاسبه میکنیم identity_percent = round(hsp.identities / hsp.align_length * 100, 2) if hsp.align_length > 0 else 0 print(f" درصد هویت: {identity_percent}%") print(f" طول همترازی: {hsp.align_length}") # نمایش بخشهای همتراز شده print(f" Query: {hsp.query[0:75]}...") print(f" Match: {hsp.match[0:75]}...") print(f" Sbjct: {hsp.sbjct[0:75]}...") print(f" شکافها (Gaps): {hsp.gaps}") else: print(" هیچ همسان معناداری در پایگاه داده یافت نشد.") if not found_hits: print("\nهیچ همسان معناداری در تمام نتایج BLAST یافت نشد.") result_handle.close() # بستن handle پس از استفاده except (URLError, HTTPError) as e: print(f"خطا در ارتباط با سرور BLAST NCBI: {e}") print("لطفاً اتصال اینترنت خود را بررسی کرده و اطمینان حاصل کنید که ایمیل Entrez تنظیم شده است.") print("همچنین، ممکن است سرور NCBI شلوغ باشد. چند لحظه صبر کنید و دوباره امتحان کنید.") except Exception as e: print(f"خطای ناشناخته در اجرای BLAST یا تجزیه نتایج: {e}") ```استفاده از
NCBIWWW.qblastبرای جستجوهای متناوب و کوچک بسیار مناسب است. اما برای حجم زیادی از جستجوها، این روش دارای محدودیتهایی است: شما به زمان پاسخگویی و قدرت پردازش سرورهای NCBI وابسته هستید و ممکن است با محدودیتهای نرخ (rate limiting) مواجه شوید.BLAST محلی با
Bio.Blast.ApplicationsوBio.Blast.NCBIStandalone(مقدماتی)برای انجام جستجوهای BLAST در مقیاس بزرگ، خودکارسازی وظایف پیچیده یا برای زمانی که نیاز به کنترل دقیق بر روی پایگاه دادهها و پارامترهای BLAST دارید، معمولاً نصب و اجرای BLAST+ به صورت محلی (روی رایانه یا سرور خودتان) ترجیح داده میشود. این فرآیند نیازمند مراحل زیر است:
- دانلود و نصب ابزارهای خط فرمان BLAST+: این ابزارها از وبسایت NCBI در دسترس هستند و شامل برنامههایی مانند
blastn,blastp,makeblastdbو غیره میشوند. - ساخت پایگاههای داده محلی: با استفاده از ابزار
makeblastdb، باید پایگاههای داده توالی خود را (از توالیهای FASTA) بسازید. این پایگاههای داده میتوانند شامل کل ژنوم یک ارگانیسم، مجموعهای از پروتئینهای خاص یا هر مجموعه توالی دیگری باشند. - اجرای BLAST: با استفاده از برنامههای خط فرمان BLAST+ (مانند
blastpیاblastn) توالیهای query خود را در برابر پایگاه داده محلی جستجو کنید.
ماژول
Bio.Blast.Applicationsدر بیوپایتون یک رابط برنامهنویسی برای اجرای این برنامههای خط فرمان فراهم میکند. این ماژول کلاسهایی مانندNcbiblastpCommandlineیاNcbiblastnCommandlineرا ارائه میدهد که به شما اجازه میدهند تا دستورات خط فرمان BLAST را به صورت شیءگرا بسازید و اجرا کنید. برای تجزیه نتایج، میتوان ازBio.Blast.NCBIStandaloneاستفاده کرد.از آنجایی که این یک فرآیند پیچیدهتر با پیشنیازهای نرمافزاری خارجی (نصب BLAST+ و ساخت پایگاه داده محلی) است و فراتر از پوشش عمیق در یک مقاله عمومی است، در اینجا تنها به ذکر آن بسنده میکنیم و یک مثال کد فرضی ارائه میدهیم. اما اصل کار این است که شما دستورات خط فرمان BLAST را با استفاده از بیوپایتون میسازید و اجرا میکنید، سپس خروجی آنها را که اغلب در فرمت XML یا متنی قابل تجزیه است، پردازش میکنید.
# این کد فرضی است و تنها نشاندهنده نحوه استفاده از ماژولهاست. # برای اجرای واقعی، نیاز به نصب محلی BLAST+ و ساخت پایگاه داده دارید. # from Bio.Blast.Applications import NcbiblastpCommandline # from Bio.Blast import NCBIXML # import os # # # فرض کنید فایل پروتئینی ورودی (query.fasta) و پایگاه داده پروتئینی محلی (my_local_db) دارید # # و مسیر ابزارهای BLAST+ در PATH سیستم شما قرار دارد # query_file = "query.fasta" # db_name = "my_local_protein_db" # نام پایگاه داده ای که با makeblastdb ساختهاید # output_file = "local_blast_results.xml" # # # ایجاد یک فایل query ساده برای مثال # with open(query_file, "w") as f: # f.write(">my_test_protein_local\nMVLSPADKTNVKAAWGKVGAHAGEYGAEALERMFLSFPTTKTYFPHF\n") # # # ساخت دستور خط فرمان BLASTP # blastp_cline = NcbiblastpCommandline( # query=query_file, # db=db_name, # outfmt=5, # فرمت 5 معادل XML است # evalue=0.001, # out=output_file # ) # # # اجرای دستور BLAST # print(f"در حال اجرای دستور BLAST محلی: {str(blastp_cline)}") # try: # stdout, stderr = blastp_cline() # if stderr: # print(f"خطاهای استاندارد در BLAST محلی: {stderr}") # # # تجزیه نتایج از فایل XML # with open(output_file, "r") as result_handle: # blast_records_local = NCBIXML.parse(result_handle) # for blast_record_local in blast_records_local: # print(f"\nQuery: {blast_record_local.query}") # if blast_record_local.alignments: # for i, alignment in enumerate(blast_record_local.alignments[:3]): # نمایش 3 همسان اول # print(f" Match {i+1}: {alignment.title} (E-value: {alignment.hsps[0].expect})") # else: # print(" هیچ همسان معناداری یافت نشد.") # # except FileNotFoundError: # print("خطا: ابزار 'blastp' یا 'makeblastdb' یافت نشد. اطمینان حاصل کنید BLAST+ نصب شده و در PATH قرار دارد.") # except Exception as e: # print(f"خطا در اجرای BLAST محلی: {e}") # finally: # if os.path.exists(query_file): # os.remove(query_file) # if os.path.exists(output_file): # os.remove(output_file) # # همچنین باید فایلهای پایگاه داده محلی را پاک کنید اگر موقتی هستند (مثلاً my_local_protein_db.*)استفاده از BLAST محلی به دلیل سرعت بالا، توانایی پردازش حجم عظیمی از دادهها، و امکان سفارشیسازی پایگاههای داده و پارامترها، برای پروژههای بزرگ تحقیقاتی یا کاربردهای صنعتی بیوانفورماتیک بسیار مفید و حتی ضروری است.
Bio.Blastدر بیوپایتون این امکان را فراهم میکند تا این فرآیندهای پیچیده را به صورت خودکار و یکپارچه در گردش کار پایتونی خود ادغام کنید.ملاحظات پیشرفته و بهترین شیوهها در کار با پایگاههای داده بیولوژیکی
کار با حجم عظیمی از دادههای بیولوژیکی، به ویژه هنگام تعامل با پایگاههای داده آنلاین از طریق بیوپایتون، نیازمند فراتر رفتن از صرفاً فراخوانی توابع است. برای اطمینان از کارایی، پایداری، قابلیت اطمینان، و صحت تحلیلها، رعایت برخی ملاحظات پیشرفته و بهترین شیوهها ضروری است. این رویکردها به شما کمک میکنند تا کدهای خود را قویتر کرده و از مشکلات رایج جلوگیری کنید.
مدیریت خطا و استفاده مودبانه از API
هنگام تعامل با سرورهای راه دور (مانند NCBI Entrez، BLAST یا PDB)، عوامل مختلفی میتوانند باعث بروز خطا شوند: مشکلات شبکه، عدم دسترسی به سرور، خطاهای سرور (مانند 500 Internal Server Error)، یا نقض محدودیتهای نرخ API. مدیریت صحیح این خطاها برای ایجاد کدهای پایدار حیاتی است.
- مدیریت خطا با
try-except: همیشه درخواستهای شبکه و عملیات تجزیه داده را در بلوکهایtry-exceptقرار دهید. این به شما امکان میدهد تا خطاهای مشخصی مانندURLError(مشکلات اتصال به شبکه)،HTTPError(خطاهای HTTP از جانب سرور، مانند 404 Not Found یا 500 Internal Server Error)، یا خطاهای مربوط به تجزیه پاسخ (که ممکن است ناشی از فرمت نادرست داده یا پاسخ غیرمنتظره باشد) را مدیریت کنید.from Bio import Entrez import time from urllib.error import URLError, HTTPError Entrez.email = "Your.Email@example.com" def safe_entrez_efetch(db, id_list, rettype, retmode, delay=0.5): """ تابعی برای بازیابی امن اطلاعات از Entrez با مدیریت خطا و تاخیر. id_list میتواند یک رشته با IDهای جدا شده با کاما یا لیستی از IDها باشد. """ if isinstance(id_list, list): id_str = ",".join(id_list) else: id_str = id_list try: time.sleep(delay) # تاخیر برای رعایت نرخ درخواست NCBI (3 درخواست در ثانیه) handle = Entrez.efetch(db=db, id=id_str, rettype=rettype, retmode=retmode) data = handle.read() handle.close() return data except (URLError, HTTPError) as e: print(f"خطا در ارتباط با سرور Entrez برای ID(ها) '{id_str}': {e}") return None except Exception as e: print(f"خطای ناشناخته در Entrez.efetch برای ID(ها) '{id_str}': {e}") return None # مثال استفاده gene_id = "7157" # ID ژن TP53 در پایگاه داده Gene NCBI fasta_data = safe_entrez_efetch(db="protein", id_list=gene_id, rettype="fasta", retmode="text") if fasta_data: print(f"دادههای FASTA برای ژن ID {gene_id} با موفقیت دریافت شد.") # print(fasta_data[:100]) else: print(f"دریافت داده برای ژن ID {gene_id} با خطا مواجه شد.") # مثال با یک ID نامعتبر invalid_id = "9999999999" invalid_data = safe_entrez_efetch(db="protein", id_list=invalid_id, rettype="fasta", retmode="text") if invalid_data: print(f"دادههای FASTA برای ID نامعتبر {invalid_id} دریافت شد (نباید اتفاق بیفتد).") else: print(f"دریافت داده برای ID نامعتبر {invalid_id} به درستی مدیریت شد.") - محدودیت نرخ (Rate Limiting) و استفاده مودبانه: سرورهای عمومی مانند NCBI Entrez و BLAST برای جلوگیری از سوء استفاده و اطمینان از دسترسی عادلانه برای همه کاربران، محدودیتهایی را برای تعداد درخواستها در یک بازه زمانی تعیین میکنند. بیتوجهی به این محدودیتها (مثلاً ارسال دهها درخواست در هر ثانیه) میتواند منجر به مسدود شدن موقت یا دائم IP شما شود. NCBI به طور عمومی توصیه میکند که بیش از 3 درخواست در ثانیه ارسال نکنید. استفاده از
time.sleep()بین درخواستها یک راه حل ساده و موثر است. همچنین، تنظیمEntrez.emailکه قبلاً اشاره شد، یک عمل "مودبانه" و الزامی است. - تکرار با مکث (Retries with backoff): در صورت بروز خطاهای موقت (مانند خطاهای شبکه یا سرور شلوغ)، میتوانید کد خود را طوری بنویسید که درخواست را پس از یک مکث کوتاه، دوباره امتحان کند. برای جلوگیری از بارگذاری بیش از حد سرور، مکث باید به تدریج افزایش یابد (exponential backoff).
ذخیرهسازی محلی (Caching) و استفاده مجدد از دادهها
برای درخواستهای مکرر، کار با مجموعه دادههای بزرگ، یا زمانی که میخواهید تحلیلهای خود را بازتولیدپذیر نگه دارید، دانلود و ذخیرهسازی محلی نتایج میتواند به شدت کارایی را بهبود بخشد و فشار بر سرورهای راه دور را کاهش دهد.
- ذخیره فایلهای خام: پس از بازیابی دادهها (مثلاً با
Entrez.efetchیاPDBList)، آنها را در فایلهای محلی ذخیره کنید. قبل از هر درخواست جدید، ابتدا بررسی کنید که آیا فایل محلی با داده مورد نظر از قبل وجود دارد یا خیر؛ اگر بله، از آن استفاده کنید، در غیر این صورت، از سرور راه دور دانلود کنید.import os import time from Bio import Entrez from Bio import SeqIO from urllib.error import URLError, HTTPError from io import StringIO # برای خواندن string به عنوان فایل برای SeqIO Entrez.email = "Your.Email@example.com" cache_dir = "entrez_cache" if not os.path.exists(cache_dir): os.makedirs(cache_dir) print(f"پوشه کش '{cache_dir}' ایجاد شد.") def get_seq_record_from_entrez_or_cache(accession_id, db="nucleotide", rettype="gb", retmode="text"): """ بازیابی SeqRecord از Entrez یا کش محلی. """ cached_filepath = os.path.join(cache_dir, f"{accession_id}.{rettype}") if os.path.exists(cached_filepath): print(f"در حال خواندن {accession_id} از کش محلی...") with open(cached_filepath, "r") as f: # SeqIO.read برای خواندن یک تک رکورد از فایل return SeqIO.read(f, rettype) else: print(f"در حال دانلود {accession_id} از Entrez...") try: time.sleep(0.5) # تاخیر برای رعایت نرخ درخواست handle = Entrez.efetch(db=db, id=accession_id, rettype=rettype, retmode=retmode) data = handle.read() handle.close() with open(cached_filepath, "w") as f: f.write(data) # خواندن از دادههای تازه دانلود شده return SeqIO.read(StringIO(data), rettype) except (URLError, HTTPError) as e: print(f"خطا در دانلود {accession_id}: {e}") return None except Exception as e: print(f"خطای ناشناخته در بازیابی/تجزیه {accession_id}: {e}") return None # مثال استفاده از تابع کش tp53_record_1 = get_seq_record_from_entrez_or_cache("NM_000546.5") # اولین بار دانلود میشود if tp53_record_1: print(f" First call: {tp53_record_1.id}, length: {len(tp53_record_1.seq)}") tp53_record_2 = get_seq_record_from_entrez_or_cache("NM_000546.5") # از کش خوانده میشود if tp53_record_2: print(f" Second call: {tp53_record_2.id}, length: {len(tp53_record_2.seq)}") # پاک کردن پوشه کش (اختیاری) # try: # if os.path.exists(cache_dir): # for f_name in os.listdir(cache_dir): # os.remove(os.path.join(cache_dir, f_name)) # os.rmdir(cache_dir) # print(f"\nپوشه کش '{cache_dir}' و محتویات آن پاک شدند.") # except Exception as e: # print(f"خطا در پاک کردن پوشه کش: {e}") - پایگاههای داده محلی: برای دادههای بسیار بزرگ و ساختاریافته، ممکن است بخواهید از سیستمهای مدیریت پایگاه داده محلی (مانند SQLite برای موارد ساده، یا PostgreSQL/MySQL برای دادههای پیچیدهتر) استفاده کنید. بیوپایتون مستقیماً با این پایگاهها تعامل ندارد، اما میتوانید اشیاء
SeqRecordیا دادههایBio.PDBرا به فرمتهایی که در این پایگاهها قابل ذخیره هستند (مانند JSON، Pickle یا جداول SQL) تبدیل و ذخیره کنید.
پردازش موازی و توزیعشده برای مقیاسپذیری
برای تحلیل مجموعه دادههای بسیار بزرگ که نیاز به دسترسی مکرر به پایگاه داده یا پردازش محاسباتی فشرده دارند، ممکن است نیاز به استفاده از تکنیکهای پردازش موازی یا توزیعشده باشد.
- موازیسازی محلی (Local Parallelization): پایتون ماژولهایی مانند
multiprocessingوconcurrent.futuresرا برای اجرای وظایف به صورت موازی روی چندین هسته پردازشی یک ماشین فراهم میکند. این رویکرد میتواند زمان اجرای اسکریپتها را به طور قابل توجهی کاهش دهد، به خصوص برای وظایفی که به طور مستقل قابل انجام هستند (embarrassingly parallel tasks)، مانند دانلود توالیهای متعدد یا اجرای BLAST برای چندین query. - پردازش توزیعشده (Distributed Computing): برای نیازهای پردازشی فراتر از یک ماشین واحد، فریمورکهایی مانند Dask یا Apache Spark (با رابط PySpark) میتوانند مورد استفاده قرار گیرند. این فریمورکها امکان پردازش دادهها در یک کلاستر از ماشینها را فراهم میکنند. ادغام بیوپایتون با این فریمورکها نیازمند دانش عمیقتری در برنامهنویسی موازی و زیرساختهای محاسباتی توزیعشده است.
همگامسازی با تغییرات پایگاه داده و بازتولیدپذیری
پایگاههای داده بیولوژیکی به طور مداوم بهروزرسانی میشوند. توالیها ممکن است تغییر کنند، شناسهها ممکن است منسوخ شوند یا اطلاعات جدیدی به حاشیهنویسیها اضافه شود.
- نسخهبندی (Versioning): برخی از شناسهها (مانند Accession ID در GenBank) شامل یک شماره نسخه (مثلاً NM_000546.5) هستند. همیشه بهتر است به جدیدترین نسخه ارجاع دهید مگر اینکه به دلیل نیاز به بازتولید دقیق، لازم باشد از نسخه خاصی استفاده کنید. هنگام استفاده از شناسههای بدون نسخه، باید از این عدم پایداری آگاه باشید.
- بررسی دورهای: اگر پروژه شما به دادههای ثابت نیاز دارد، دورهای صحت و بهروز بودن دادههای کش شده یا دانلود شده خود را بررسی کنید. میتوانید از تاریخ آخرین بهروزرسانی (که در برخی پایگاهها موجود است) برای تصمیمگیری در مورد دانلود مجدد استفاده کنید.
- تضمین بازتولیدپذیری: برای اطمینان از اینکه تحلیلهای شما در آینده قابل تکرار هستند، تمام شناسههای دادهای که استفاده کردهاید (Accession IDها، PDB IDها، و نسخههای آنها)، تاریخ دسترسی به پایگاه دادهها، و نسخههای نرمافزارها و کتابخانههایی که استفاده کردهاید (شامل بیوپایتون) را مستند کنید. این کار اساس یک علم خوب است.
رعایت این بهترین شیوهها نه تنها به بهبود کارایی و سرعت کار با بیوپایتون کمک میکند، بلکه تضمین میکند که کدهای شما قابل اعتماد، مقاوم در برابر خطا، مقیاسپذیر و مسئولانه هستند. این مهارتها برای هر بیوانفورماتیکدانی که در محیط دادهمحور امروزی کار میکند، ضروری هستند.
نتیجهگیری: بیوپایتون، ابزاری قدرتمند برای اکتشاف بیولوژیکی در عصر دادهمحور
در دنیای پرشتاب زیستشناسی مدرن، که به طور فزایندهای با حجم عظیمی از دادهها تعریف میشود، توانایی تعامل کارآمد با پایگاههای داده بیولوژیکی یک مهارت اساسی و اجتنابناپذیر برای هر محقق، بیوانفورماتیکدان و برنامهنویس درگیر در علوم زیستی است. همانطور که در این نوشتار جامع و تخصصی بررسی شد، کتابخانه Biopython برای زبان برنامهنویسی پایتون، با ارائه مجموعهای غنی از ماژولها و ابزارها، این فرآیند پیچیده را به طرز چشمگیری سادهسازی و خودکار میکند. این کتابخانه به عنوان یک پل ارتباطی حیاتی بین برنامههای پایتون شما و منابع داده جهانی بیولوژی عمل میکند.
از طریق ماژول
Bio.Entrez، محققان به اقیانوس بیکران دادههای مرکز ملی اطلاعات بیوتکنولوژی (NCBI) دسترسی پیدا میکنند. این ماژول امکان جستجو، بازیابی خلاصهای از رکوردها و دانلود کامل توالیها از پایگاههای دادهای مانند GenBank (توالیهای نوکلئوتیدی)، Protein (توالیهای پروتئینی)، PubMed (مقالات علمی) و Gene (اطلاعات ژنی) را فراهم میآورد. این دروازه، بدون نیاز به دانش عمیق پروتکلهای وب، اطلاعات را در دسترس قرار میدهد.پس از بازیابی، ماژولهای اساسی نظیر
Bio.Seq،Bio.SeqRecordوBio.SeqIOبه ما امکان میدهند تا این دادههای خام را به فرمتهای ساختاریافته و قابل دستکاری در پایتون تبدیل کنیم.Bio.SeqIOبه عنوان یک ابزار همه کاره، خواندن و نوشتن توالیها را در فرمتهای استاندارد بیوانفورماتیکی مانند FASTA و GenBank را ساده میکند و آن را به گام اولیه و ضروری برای هر تحلیل عمیقتر توالی تبدیل مینماید.برای دادههای ساختاری، ماژول
Bio.PDBابزارهایی قدرتمند برای دانلود، تجزیه و تحلیل ساختارهای سهبعدی پروتئینها از Protein Data Bank (PDB) ارائه میدهد. این قابلیت برای بیولوژیستهای ساختاری و هر کسی که به درک عملکرد مولکولها از طریق شکل سهبعدی آنها علاقهمند است، ضروری است و امکان کاوش در سلسله مراتب پیچیده اتمها، باقیماندهها، زنجیرهها و مدلها را فراهم میکند.علاوه بر این، ابزارهای قدرتمندی مانند
Bio.Blastبه کاربران اجازه میدهند تا جستجوهای همترازی توالی را به صورت راه دور (باNCBIWWW) یا محلی انجام دهند و نتایج پیچیده XML آنها را به شکلی معنادار تجزیه و تحلیل کنند. این قابلیت برای شناسایی شباهتهای تکاملی، دامنههای عملکردی و استنتاج روابط عملکردی حیاتی است. همچنین،Bio.AlignIOیک رابط کارآمد برای مدیریت فایلهای همترازی چندگانه فراهم میکند که در تحلیلهای فیلوژنتیک و کشف مناطق حفاظتشده نقش کلیدی دارد.فراتر از جنبههای فنی، بر اهمیت رعایت بهترین شیوهها مانند مدیریت خطا، استفاده مودبانه از APIهای عمومی، ذخیرهسازی محلی (caching) برای بهینهسازی عملکرد و اطمینان از بازتولیدپذیری تحلیلها تأکید شد. این رویکردهای مسئولانه، نه تنها تجربه کاربری را بهبود میبخشند، بلکه به پایداری منابع داده عمومی نیز کمک میکنند و کدهای شما را قابل اعتمادتر و قویتر میسازند.
در نهایت، بیوپایتون فقط یک کتابخانه برنامهنویسی نیست؛ بلکه یک ابزار توانمندساز است که به متخصصان علوم زیستی امکان میدهد با دادههای بیولوژیکی در مقیاسهای بزرگ کار کنند، فرضیههای پیچیده را آزمایش کنند، و اکتشافات جدیدی را به ارمغان آورند. تسلط بر مبانی و تکنیکهای پیشرفتهای که در این مقاله پوشش داده شد، به شما این امکان را میدهد که به طور موثرتری در دنیای بیوانفورماتیک حرکت کنید و پتانسیل کامل دادههای بیولوژیکی را برای پیشبرد تحقیقات خود به کار گیرید. با ادامه توسعه بیوپایتون و تکامل بیوقفه پایگاههای داده بیولوژیکی، این ابزار به عنوان یک همراه جداییناپذیر در مسیر اکتشافات علمی و نوآوریهای بیوتکنولوژیکی باقی خواهد ماند. آینده بیولوژی بیش از پیش به برنامهنویسی و ابزارهایی مانند بیوپایتون گره خورده است و این مقاله، قدمی در جهت روشن ساختن این مسیر است.
“تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”
"تسلط به برنامهنویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"
"با شرکت در این دوره جامع و کاربردی، به راحتی مهارتهای برنامهنویسی پایتون را از سطح مبتدی تا پیشرفته با کمک هوش مصنوعی ChatGPT بیاموزید. این دوره، با بیش از 6 ساعت محتوای آموزشی، شما را قادر میسازد تا به سرعت الگوریتمهای پیچیده را درک کرده و اپلیکیشنهای هوشمند ایجاد کنید. مناسب برای تمامی سطوح با زیرنویس فارسی حرفهای و امکان دانلود و تماشای آنلاین."
ویژگیهای کلیدی:
بدون نیاز به تجربه قبلی برنامهنویسی
زیرنویس فارسی با ترجمه حرفهای
۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان