Mengembangkan Basis Data Bioinformatika untuk Penelitian Ikatan Disulfida

Diterbitkan: 2022-03-11

Basis data bioinformatika Protein Data Bank (PDB) adalah gudang terbesar di dunia dari struktur protein, asam nukleat, dan rakitan kompleks yang ditentukan secara eksperimental. Semua data dikumpulkan menggunakan metode eksperimental seperti sinar-X, spektroskopi, kristalografi, NMR, dll.

Artikel ini menjelaskan cara mengekstrak, memfilter, dan membersihkan data dari PDB. Hal ini, pada gilirannya, memungkinkan jenis analisis yang dijelaskan dalam artikel Terjadinya ikatan protein disulfida di berbagai domain kehidupan: perbandingan protein dari Protein Data Bank, diterbitkan dalam Protein Engineering, Design and Selection , Volume 27, Issue 3, 1 Maret 2014, hlm. 65–72.

PDB memiliki banyak struktur berulang dengan resolusi, metode, mutasi yang berbeda, dll. Melakukan eksperimen dengan protein yang sama atau serupa dapat menghasilkan bias dalam analisis grup apa pun, jadi kita perlu memilih struktur yang benar dari kumpulan duplikat apa pun . Untuk tujuan itu, kita perlu menggunakan set protein non-redundan (NR).

Untuk tujuan normalisasi, saya sarankan mengunduh kamus senyawa kimia untuk mengimpor nama atom ke dalam database yang menggunakan 3NF atau menggunakan skema bintang dan pemodelan dimensi. (Saya juga menggunakan DSSP untuk membantu menghilangkan struktur yang bermasalah. Saya tidak akan membahasnya di artikel ini, tetapi perhatikan bahwa saya tidak menggunakan fitur DSSP lainnya.)

Data yang digunakan dalam penelitian ini mengandung protein unit tunggal yang mengandung setidaknya satu ikatan disulfida yang diambil dari spesies yang berbeda. Untuk melakukan analisis, semua ikatan disulfida pertama-tama diklasifikasikan sebagai berurutan atau tidak berurutan, berdasarkan domain (archaea, prokariota, virus, eukariota, atau lainnya), dan juga berdasarkan panjangnya.

Struktur protein primer dan tersier

Struktur protein primer dan tersier, sebelum dan sesudah pelipatan protein.
Sumber: Rekayasa Protein, Desain dan Seleksi , seperti yang disebutkan di awal artikel ini.

Keluaran

Agar siap untuk input ke R, SPSS, atau alat lain, seorang analis akan membutuhkan data untuk berada dalam tabel database dengan struktur ini:

Kolom Jenis Keterangan
code character(4) ID Eksperimen (alfanumerik, peka huruf besar/kecil, dan tidak dapat dimulai dengan nol)
title character varying(1000) Judul eksperimen, untuk referensi (bidang dapat juga dalam format teks)
ss_bonds integer Jumlah ikatan disulfida dalam rantai yang dipilih
ssbonds_overlap integer Jumlah ikatan disulfida yang tumpang tindih
intra_count integer Jumlah ikatan yang dibuat dalam rantai yang sama
sci_name_src character varying(5000) Nama ilmiah organisme yang urutannya diambil
tax_path character varying Jalur di pohon klasifikasi Linnaean
src_class character varying(20) Kelas organisme tingkat atas (eukariota, prokariota, virus, archaea, lainnya)
has_reactives7 boolean Benar jika dan hanya jika barisan tersebut mengandung pusat reaktif
len_class7 integer Panjang urutan di set 7 (diatur dengan nilai-p 10e-7 dihitung dengan ledakan)

Bahan dan metode

Untuk mencapai tujuan ini, langkah pertama adalah mengumpulkan data dari rcsb.org. Situs itu berisi struktur eksperimen PDB yang dapat diunduh dalam berbagai format.

Meskipun data disimpan dalam berbagai format, dalam contoh ini, hanya format tekstual delimited spasi tetap (PDB) yang diformat yang akan digunakan. Alternatif untuk format tekstual PDB adalah versi XML-nya, PDBML, tetapi terkadang berisi entri penamaan posisi atom yang salah format, yang dapat menyebabkan masalah untuk analisis data. mmCIF yang lebih lama dan format lain mungkin juga tersedia, tetapi tidak akan dijelaskan dalam artikel ini.

Format PDB

Format PDB adalah format tekstual lebar tetap terfragmentasi yang dapat dengan mudah diuraikan oleh kueri SQL, plugin Java, atau modul Perl, misalnya. Setiap tipe data dalam penampung file direpresentasikan sebagai baris yang dimulai dengan tag yang sesuai—kita akan membahas setiap jenis tag di subbagian berikut. Panjang baris kurang dari atau sama dengan 80 karakter, di mana sebuah tag membutuhkan enam karakter atau kurang ditambah satu atau lebih spasi yang bersama-sama membutuhkan delapan byte. Ada juga kasus tanpa spasi antara tag dan data, biasanya untuk tag CONECT .

TITLE

Tag TITLE menandai garis sebagai (bagian dari) judul percobaan, yang berisi nama molekul dan data relevan lainnya seperti penyisipan, mutasi, atau penghapusan asam amino tertentu.

 12345678901234567890123456789012345678901234567890123456789012345678901234567890 TITLE A TWO DISULFIDE DERIVATIVE OF CHARYBDOTOXIN WITH DISULFIDE TITLE 2 13-33 REPLACED BY TWO ALPHA-AMINOBUTYRIC ACIDS, NMR, 30 TITLE 3 STRUCTURES

Dalam kasus di mana ada beberapa baris ke catatan TITLE , maka judul harus digabungkan, diurutkan dengan nomor lanjutan, yang ditempatkan, rata kanan, pada byte 9 dan 10 (tergantung pada jumlah baris ini).

ATOM

Data yang disimpan dalam garis ATOM adalah data koordinat untuk setiap atom dalam suatu percobaan. Terkadang eksperimen memiliki penyisipan, mutasi, lokasi alternatif, atau beberapa model. Ini menghasilkan pengulangan atom yang sama beberapa kali. Memilih atom yang tepat akan dijelaskan kemudian.

 12345678901234567890123456789012345678901234567890123456789012345678901234567890 ATOM 390 N GLY A 26 -1.120 -2.842 4.624 1.00 0.00 N ATOM 391 CA GLY A 26 -0.334 -2.509 3.469 1.00 0.00 C ATOM 392 C GLY A 26 0.682 -1.548 3.972 1.00 0.00 C ATOM 393 O GLY A 26 0.420 -0.786 4.898 1.00 0.00 O ATOM 394 H GLY A 26 -0.832 -2.438 5.489 1.00 0.00 H ATOM 395 HA2 GLY A 26 0.163 -3.399 3.111 1.00 0.00 H ATOM 396 HA3 GLY A 26 -0.955 -2.006 2.739 1.00 0.00 H

Contoh di atas diambil dari percobaan 1BAH . Kolom pertama menandai jenis catatan, dan kolom kedua adalah nomor seri atom. Setiap atom dalam suatu struktur memiliki nomor serinya sendiri.

Di sebelah nomor seri ada label posisi atom, yang membutuhkan empat byte. Dari posisi atom itu, adalah mungkin untuk mengekstrak simbol kimia unsur, yang tidak selalu ada dalam data rekaman di kolomnya sendiri yang terpisah.

Setelah nama atom ada kode residu tiga huruf. Dalam kasus protein, residu itu sesuai dengan asam amino. Selanjutnya, rantai dikodekan dengan satu huruf. Yang kami maksud dengan rantai adalah rantai tunggal asam amino, dengan atau tanpa celah, meskipun terkadang ligan dapat ditempatkan pada rantai; kasus ini dapat dideteksi melalui celah yang sangat besar dalam urutan asam amino, yang ada di kolom berikutnya. Kadang-kadang struktur yang sama dapat dipindai dengan mutasi yang disertakan, dalam hal ini kode penyisipan tersedia di kolom tambahan setelah kolom urutan. Kode penyisipan berisi huruf untuk membantu membedakan residu mana yang terpengaruh.

Tiga kolom berikutnya adalah koordinat spasial setiap atom, diukur dalam Angstrom (Å). Di sebelah koordinat ini adalah kolom hunian, yang mengatakan berapa probabilitas atom berada di tempat itu, pada skala biasa dari nol hingga satu.

Kolom kedua terakhir adalah faktor suhu, yang membawa informasi tentang ketidakteraturan dalam kristal, diukur dalam ². Nilai yang lebih besar dari 60Ų menandakan ketidakteraturan, sedangkan nilai yang lebih rendah dari 30Ų menandakan kepercayaan. Itu tidak selalu ada dalam file PDB karena tergantung pada metode eksperimental.

Kolom berikutnya—simbol dan muatan—biasanya tidak ada. Simbol kimia dapat dikumpulkan dari kolom posisi atom, seperti yang telah disebutkan di atas. Ketika muatan hadir, itu ditambahkan ke simbol sebagai bilangan bulat diikuti oleh + atau - , misalnya N1+ .

TER

Ini menandai akhir dari rantai. Bahkan tanpa garis ini, mudah untuk membedakan di mana sebuah rantai berakhir. Jadi, seringkali baris TER hilang.

MODEL dan ENDMDL

Garis MODEL menandai tempat model struktur dimulai, dan berisi nomor seri model.

Setelah semua garis atom dalam model itu, itu berakhir dengan garis ENDMDL .

SSBOND

Garis-garis ini mengandung ikatan disulfida antara asam amino sistein. Ikatan disulfida dapat terdapat pada jenis residu lainnya, tetapi dalam artikel ini hanya asam amino yang akan dianalisis, jadi hanya sistein yang disertakan. Contoh berikut adalah dari percobaan dengan kode 132L :

 12345678901234567890123456789012345678901234567890123456789012345678901234567890 SSBOND 1 CYS A 6 CYS A 127 1555 1555 2.01 SSBOND 2 CYS A 30 CYS A 115 1555 1555 2.05 SSBOND 3 CYS A 64 CYS A 80 1555 1555 2.02 SSBOND 4 CYS A 76 CYS A 94 1555 1555 2.02

Dalam contoh ini ada empat ikatan disulfida yang ditandai dalam file dengan nomor urutnya di kolom kedua. Semua ikatan ini menggunakan sistein (kolom 3 dan 6), dan semuanya ada di rantai A (kolom 4 dan 7). Setelah setiap rantai ada nomor urut residu yang menunjukkan posisi ikatan dalam rantai peptida. Kode penyisipan ada di sebelah setiap urutan residu, tetapi dalam contoh ini kode tersebut tidak ada karena tidak ada asam amino yang disisipkan di wilayah itu. Dua kolom sebelum yang terakhir dicadangkan untuk operasi simetri, dan kolom terakhir adalah jarak antara atom belerang, diukur dalam .

Mari luangkan waktu sejenak untuk memberikan beberapa konteks pada data ini.

Gambar-gambar di bawah ini, diambil menggunakan penampil NGL rcsb.org, menunjukkan struktur percobaan 132L . Secara khusus, mereka menunjukkan protein tanpa ligan. Gambar pertama menggunakan representasi tongkat, dengan pewarnaan CPK menunjukkan belerang dan ikatannya dengan warna kuning. Koneksi belerang berbentuk V mewakili koneksi metionin, sedangkan koneksi berbentuk Z adalah ikatan disulfida antara sistein.

Representasi tongkat dengan pewarnaan CPK menunjukkan ikatan belerang disulfida dengan warna kuning

Pada gambar berikutnya, metode visualisasi protein yang disederhanakan yang disebut visualisasi tulang punggung ditunjukkan dengan diwarnai oleh asam amino, di mana sistein berwarna kuning. Ini mewakili protein yang sama, dengan rantai sampingnya dikecualikan, dan hanya sebagian dari kelompok peptidanya yang disertakan—dalam hal ini, tulang punggung protein. Itu terbuat dari tiga atom: N-terminal, C-alpha, dan C-terminal. Gambar ini tidak menunjukkan ikatan disulfida, tetapi disederhanakan untuk menunjukkan susunan spasial protein:

Tulang punggung protein sederhana yang diwarnai oleh asam amino di mana sistein berwarna kuning

Pipa dibuat dengan menggabungkan atom terikat peptida dengan atom C-alfa. Warna sistein sama dengan warna belerang pada metode pewarnaan CPK. Ketika sisten cukup dekat, belerangnya menciptakan ikatan disulfida, dan itu memperkuat strukturnya. Jika tidak, protein ini akan mengikat terlalu banyak, dan strukturnya akan kurang stabil pada suhu yang lebih tinggi.

CONECT

Catatan ini digunakan untuk menandai koneksi antar atom. Terkadang tag ini tidak ada sama sekali, sedangkan di lain waktu semua data diisi. Dalam kasus menganalisis ikatan disulfida, bagian ini dapat berguna—tetapi tidak perlu. Karena itu, dalam proyek ini, ikatan non-tag ditambahkan dengan mengukur jarak, jadi ini akan menjadi overhead, dan juga harus diperiksa.

SOURCE

Catatan ini berisi informasi tentang organisme sumber dari mana molekul telah diekstraksi. Mereka berisi subrecord untuk lokasi yang lebih mudah dalam taksonomi, dan memiliki struktur multi-baris yang sama seperti yang kita lihat dengan record judul.

 SOURCE MOL_ID: 1; SOURCE 2 ORGANISM_SCIENTIFIC: ANOPHELES GAMBIAE; SOURCE 3 ORGANISM_COMMON: AFRICAN MALARIA MOSQUITO; SOURCE 4 ORGANISM_TAXID: 7165; SOURCE 5 GENE: GST1-6; SOURCE 6 EXPRESSION_SYSTEM: ESCHERICHIA COLI; SOURCE 7 EXPRESSION_SYSTEM_TAXID: 562; SOURCE 8 EXPRESSION_SYSTEM_STRAIN: BL21(DE3)PLYSS; SOURCE 9 EXPRESSION_SYSTEM_VECTOR_TYPE: PLASMID; SOURCE 10 EXPRESSION_SYSTEM_PLASMID: PXAGGST1-6

Format NR

Ini adalah daftar set PDB rantai non-redundan (NR). Cuplikannya dapat ditemukan di ftp.ncbi.nih.gov/mmdb/nrtable/. Tujuannya adalah untuk menghindari bias yang tidak perlu yang disebabkan oleh kesamaan protein. NR memiliki tiga set dengan tingkat nilai p identitas berbeda yang dibuat dengan membandingkan semua struktur PDB. Hasilnya ditambahkan ke file tekstual yang akan dijelaskan nanti. Tidak semua kolom diperlukan untuk proyek ini, jadi hanya kolom yang penting yang akan dijelaskan.

Dua kolom pertama berisi kode eksperimen PDB unik dan pengidentifikasi rantai seperti yang dijelaskan untuk catatan ATOM di atas. Kolom 6, 9, dan C berisi informasi tentang keterwakilan nilai p, yaitu tingkat kemiripan barisan yang dihitung dengan BLAST. Jika nilainya nol, maka tidak diterima menjadi bagian dari himpunan; jika nilainya 1, maka itu. Kolom yang disebutkan mewakili penerimaan set dengan nilai p cutoff 10e-7, 10e-40, dan 10e-80, masing-masing. Hanya set dengan nilai p cutoff 10e-7 yang akan digunakan untuk analisis.

Kolom terakhir berisi info tentang akseptabilitas struktur, di mana a dapat diterima dan n tidak.

 #--------------------------------------------------------------------------------------------------------------------------- # 1 2 3 4 5 6 7 8 9 ABCDEFGHIJKLMNOPQ #--------------------------------------------------------------------------------------------------------------------------- 3F8V A 69715 1 1 1 1 1 1 1 1 1 9427 1 1 0.00 0.00 0.00 0.00 1.08 1 6 5 164 X a 3DKE X 68132 1 2 0 1 2 0 1 2 0 39139 1 1 0.00 0.00 0.00 0.00 1.25 1 11 7 164 X a 3HH3 A 77317 1 3 0 1 3 0 1 3 0 90 1 0 0.00 0.00 0.00 0.00 1.25 1 5 4 164 X a 3HH5 A 77319 1 4 0 1 4 0 1 4 0 90 2 0 0.00 0.00 0.00 0.00 1.25 1 4 4 164 X a

Konstruksi Basis Data dan Parsing Data

Sekarang setelah kita memiliki gagasan tentang apa yang sedang kita hadapi dan apa yang perlu kita lakukan, mari kita mulai.

Mengunduh Data

Semua data untuk analisis ini dapat ditemukan di tiga alamat berikut:

  • ftp.wwpdb.org/pub/pdb/data/structures/divided/pdb/
  • ftp.ncbi.nih.gov/mmdb/nrtable/
  • ftp.ncbi.nih.gov/pub/taxonomy/taxdmp.zip

Dua tautan pertama berisi daftar arsip. Arsip terbaru dari masing-masing harus digunakan untuk menghindari masalah yang berasal dari kurangnya resolusi atau kualitas. Tautan ketiga berisi arsip taksonomi terbaru secara langsung.

Mengurai Data

Biasanya penguraian file PDB dilakukan oleh plugin atau modul di Java, Perl, atau Python. Dalam kasus penelitian ini, saya menulis aplikasi Perl khusus tanpa menggunakan modul parsing PDB yang telah ditulis sebelumnya. Alasannya adalah ketika mengurai sejumlah besar data, menurut pengalaman saya, masalah paling umum dengan menggunakan data eksperimen adalah kesalahan dalam data. Terkadang ada kesalahan dengan koordinat, jarak, panjang garis, komentar di tempat yang tidak seharusnya, dll.

Cara paling efektif untuk mengatasinya adalah dengan awalnya menyimpan semua yang ada di database sebagai teks mentah. Pengurai umum ditulis untuk menangani data ideal yang sepenuhnya sesuai dengan spesifikasi. Namun dalam praktiknya, data tidak ideal, dan itu akan dijelaskan di bagian penyaringan di mana Anda akan menemukan skrip impor Perl.

Konstruksi Basis Data

Saat membangun database, perhatikan bahwa database ini dibuat untuk memproses data. Analisis nanti akan dilakukan di SPSS atau R. Untuk keperluan kita di sini disarankan untuk menggunakan PostgreSQL dengan setidaknya versi 8.4.

Struktur tabel disalin langsung dari file yang diunduh hanya dengan beberapa perubahan kecil. Dalam hal ini, jumlah catatan terlalu kecil untuk menghabiskan waktu kita untuk normalisasi. Seperti yang disebutkan, database ini hanya untuk sekali pakai: Tabel ini tidak dibuat untuk disajikan di situs web—tabel hanya ada untuk memproses data. Setelah selesai, mereka dapat dijatuhkan, atau dicadangkan sebagai data tambahan, mungkin untuk mengulangi proses oleh beberapa peneliti lain.

Dalam hal ini, hasil akhirnya akan menjadi satu tabel yang kemudian dapat diekspor ke file untuk digunakan dengan beberapa alat statistik seperti SPSS atau R.

Tabel

Ekstraksi data dari catatan ATOM harus terhubung ke catatan HEADER atau TITLE . Hirarki data dijelaskan pada gambar di bawah ini.

Hirarki alami data ikatan disulfida yang akan menghasilkan database dalam bentuk normal ketiga

Karena gambar ini adalah representasi yang disederhanakan dari database dalam bentuk normal ketiga (3NF), untuk tujuan kita ini mengandung terlalu banyak overhead. Alasannya: Untuk menghitung jarak antar atom untuk deteksi ikatan disulfida, kita perlu melakukan join. Dalam hal ini, kita akan memiliki tabel yang digabungkan ke dirinya sendiri dua kali, dan juga bergabung ke struktur sekunder dan primer masing-masing dua kali, yang merupakan proses yang sangat lambat. Karena tidak setiap analisis memerlukan informasi struktur sekunder, skema lain diusulkan jika Anda perlu menggunakan kembali data atau menganalisis jumlah ikatan disulfida yang lebih besar:

Model skema database yang lebih detail yang tidak menggunakan struktur sekunder (3NF)

Ikatan disulfida tidak sesering ikatan kovalen lainnya, sehingga model gudang tidak diperlukan, meskipun dapat digunakan. Skema bintang dan pemodelan dimensi di bawah ini akan memakan waktu terlalu lama untuk dikembangkan, dan akan membuat kueri menjadi lebih kompleks:

Tata letak database menggunakan skema bintang dan pemodelan dimensi

Dalam kasus di mana semua obligasi harus diproses, maka saya merekomendasikan skema bintang.

(Jika tidak, itu tidak diperlukan, karena ikatan disulfida tidak biasa seperti ikatan lainnya. Dalam kasus pekerjaan ini, jumlah ikatan disulfida mendekati 30.000, yang mungkin cukup cepat dalam 3NF, tetapi saya memutuskan untuk memprosesnya melalui tabel yang tidak dinormalisasi, jadi tidak digambarkan di sini.)

Jumlah total yang diharapkan dari semua ikatan kovalen setidaknya dua kali jumlah atom dalam struktur tersier, dan dalam hal ini 3NF akan sangat lambat, sehingga diperlukan denormalisasi menggunakan bentuk skema bintang. Dalam skema itu, beberapa tabel memiliki dua pemeriksaan kunci asing, dan itu karena ikatan dibuat antara dua atom, sehingga setiap atom perlu memiliki primary_structure_id , atom_name_id dan residue_id .

Ada dua cara untuk mengisi tabel dimensi d_atom_name : dari data, dan dari sumber lain, kamus komponen kimia yang saya sebutkan sebelumnya. Formatnya mirip dengan format PDB: Hanya baris RESIDUE dan CONECT yang berguna. Ini karena kolom pertama RESIDUE berisi kode tiga huruf residu, dan CONECT berisi nama atom dan koneksinya, yang juga merupakan nama atom. Jadi dari file ini, kami dapat mengurai semua nama atom dan memasukkannya ke dalam database kami, meskipun saya sarankan Anda mengizinkan kemungkinan database berisi nama atom yang tidak terdaftar.

 RESIDUE PRO 17 CONECT N 3 CA CD H CONECT CA 4 NC CB HA CONECT C 3 CA O OXT CONECT O 1 C CONECT CB 4 CA CG HB2 HB3 CONECT CG 4 CB CD HG2 HG3 CONECT CD 4 N CG HD2 HD3 CONECT OXT 2 C HXT CONECT H 1 N CONECT HA 1 CA CONECT HB2 1 CB CONECT HB3 1 CB CONECT HG2 1 CG CONECT HG3 1 CG CONECT HD2 1 CD CONECT HD3 1 CD CONECT HXT 1 OXT END HET PRO 17 HETNAM PRO PROLINE FORMUL PRO C5 H9 N1 O2

Dalam proyek ini, kecepatan pengkodean lebih relevan daripada kecepatan eksekusi dan konsumsi penyimpanan. Saya memutuskan untuk tidak menormalkan—bagaimanapun juga, tujuan kami adalah membuat tabel dengan kolom yang disebutkan di intro.

Pada bagian ini, hanya tabel yang paling penting yang akan dijelaskan.

Tabel utama adalah:

  • proteins : Tabel dengan nama percobaan dan kode.
  • ps : Tabel struktur utama yang akan berisi sequence , chain_id , dan code .
  • ts : Tabel yang berisi struktur tersier/kuartener yang diekstraksi dari data mentah dan diubah menjadi format rekaman ATOM . Ini akan digunakan sebagai meja pementasan, dan dapat dijatuhkan setelah ekstraksi. Ligan dikecualikan.
  • sources : Daftar organisme dari mana data eksperimen berasal.
  • tax_names , taxonomy_path , taxonomy_paths : Nama taksonomi Linnean dari database taksonomi NCBI, digunakan untuk mendapatkan jalur taksonomi dari organisme yang terdaftar di sources .
  • nr : Daftar protein non-redundan NCBI yang diekstraksi dari set NR.
  • pdb_ssbond : Daftar ikatan disulfida dalam file PDB tertentu.

Memfilter dan Memproses Data

Data diambil dari snapshot dari repositori RCSB PDB.

Setiap file diimpor ke satu tabel raw_pdb di database PostgreSQL kami menggunakan skrip Perl. Script menggunakan transaksi 10.000 sisipan per potongan.

Struktur raw_pdb adalah ini:

Kolom Jenis pengubah
kode karakter bervariasi (20) bukan nol
baris_num bilangan bulat bukan nol
baris_cont karakter bervariasi (80) bukan nol

Skrip impor terlihat seperti ini:

 #!/usr/bin/perl -w use FindBin '$Bin'; use DBI; $dbName = 'bioinf'; $dbLogin = 'ezop'; $dbPass = 'XYZ'; $conn = DBI->connect("DBI:Pg:database=$dbName;host=localhost", "$dbLogin", "$dbPass", {'RaiseError' => 1, 'AutoCommit' => 0}); die "./pdb_lines_unos.pl <table> <file>" if not defined($ARGV[0]); $recordCount = 0; $table = $ARGV[0]; $fName = $ARGV[1]; open F, "zcat $fName|"; while (<F>) { chomp; $linija = $_; $recordCount += 1; $sql = "insert into $table (code, line_num, line_cont) values (?, ?, ?)"; $conn->do($sql, undef, $fName, $recordCount, $linija); $conn->commit() if ($recordCount%10000 == 0); } close F; $conn->commit(); 1;

Setelah garis diimpor, mereka diurai menggunakan fungsi yang akan kita definisikan di bawah ini.

Dari data raw_pdb , kami membuat tabel ts , ps , proteins , sources , sources_organela , dan ss_bond dengan mem-parsing record yang sesuai.

Tabel ps memiliki tiga kolom penting: chain , length , dan sequence . Urutan protein dihasilkan menggunakan atom C-alfa untuk setiap rantai dan untuk setiap residu yang diurutkan berdasarkan urutan residu, hanya mengambil penyisipan pertama dan lokasi alternatif pertama. chain diambil dari kolom TS.chain , dan length hanyalah panjang yang telah dihitung sebelumnya dari string sequence . Karena artikel ini dimaksudkan untuk menganalisis hanya rantai tunggal dan koneksi intrarantai, protein rantai ganda dilewati dalam analisis kami di sini.

Dalam catatan SSBOND , semua ikatan disulfida disimpan dalam tabel pdb_ssbond , yang diturunkan dari tabel pdb_ssbond_extended . pdb_ssbond terlihat seperti ini:

Kolom Jenis Tidak dapat dibatalkan Bawaan Keterangan
pengenal bilangan bulat bukan nol nextval('pdb_ssbond_id_seq'::regclass)
kode karakter (4) kode empat huruf
nomor_ser bilangan bulat nomor seri ssbond
residu1 karakter (3) residu pertama dalam ikatan
rantai_id1 karakter(1) rantai pertama dalam ikatan
res_seq1 bilangan bulat nomor urut residu pertama
i_code1 karakter(1) kode penyisipan residu pertama
residu2 karakter (3) residu kedua dalam ikatan
rantai_id2 karakter(1) rantai kedua dalam ikatan
res_seq2 bilangan bulat nomor urut residu kedua
i_code2 karakter(1) kode penyisipan residu kedua
sim1 karakter (6) operator simetri pertama
sim2 karakter (6) operator simetri kedua
jarak numerik (5,2) jarak antar atom
is_reaktif boolean bukan nol Salah tanda untuk reaktivitas (akan diatur)
is_consecutive boolean bukan nol benar tanda untuk obligasi berturut-turut (akan ditetapkan)
rep7 boolean bukan nol Salah tandai untuk struktur set-7 (akan disetel)
rep40 boolean bukan nol Salah tandai untuk struktur set-40 (akan disetel)
rep80 boolean bukan nol Salah tandai untuk struktur set-80 (akan disetel)
is_from_pdb boolean benar diambil dari PDB sebagai sumber (akan diatur)

Saya juga menambahkan indeks ini:

 "pdb_ssbond_pkey" PRIMARY KEY, btree (id) "ndxcode1" btree (code, chain_id1, res_seq1) "ndxcode2" btree (code, chain_id2, res_seq2)

Diasumsikan bahwa distribusi ikatan disulfida sebelum cutoff adalah Gaussian (tanpa pengujian dengan, misalnya, uji KS), sehingga standar deviasi dihitung pada setiap jarak antara sistein dalam protein yang sama untuk menemukan kisaran panjang ikatan yang diizinkan dan membandingkannya ke titik potong. Batasnya sama dengan rata-rata yang dihitung plus-minus tiga standar deviasi. Kami telah memperluas jangkauan untuk memperkenalkan lebih banyak kemungkinan ikatan disulfida yang tidak terdaftar dalam file PDB di baris SSBOND tetapi yang telah kami masukkan sendiri dengan menghitung jarak antara catatan ATOM . Rentang yang dipilih untuk ssbonds adalah antara 1,6175344456264 dan 2,48801947642267 , yang merupakan rata-rata (2,05) plus-minus empat standar deviasi:

 select count(1) as cnt , stddev(dist) as std_dev , avg(dist) as avg_val , -stddev(dist) + avg(dist) as left1 , stddev(dist) + avg(dist) as right1 , -2 * stddev(dist) + avg(dist) as left2 , 2 * stddev(dist) + avg(dist) as right2 , -3 * stddev(dist) + avg(dist) as left3 , 3 * stddev(dist) + avg(dist) as right3 , -4 * stddev(dist) + avg(dist) as left4 , 4 * stddev(dist) + avg(dist) as right4 , min(dist) , max(dist) from pdb_ssbond_tmp where dist > 0 and dist < 20;

Tabel TS berisi koordinat semua atom, tetapi hanya sistein yang akan digunakan, dengan belerangnya bernama " SG " . Jadi tabel pementasan lain dengan atom belerang " SG " hanya dibuat untuk mempercepat proses dengan mengurangi jumlah catatan yang akan dicari. Saat memilih belerang saja, jumlah kombinasi jauh lebih sedikit daripada semua atom—194.574 atom pertama dibandingkan dengan 122.761.100 atom terakhir. Di dalam tabel ini yang digabungkan dengan dirinya sendiri, jarak dihitung menggunakan jarak Euclidean, dan hasilnya diimpor ke tabel pdb_ssbond tetapi hanya jika jaraknya antara panjang yang ditentukan yang dihitung sebelumnya. Alasan untuk melakukan percepatan ini adalah untuk mengurangi jumlah waktu menjalankan kembali seluruh proses—untuk tujuan pemeriksaan—menjaganya dalam satu hari.

Untuk membersihkan ikatan disulfida, kami menggunakan algoritma berikut:

  • Hapus ketika kedua sisi koneksi menunjuk ke asam amino yang sama
  • Hapus ikatan yang panjangnya tidak antara 1.6175344456264 dan 2.48801947642267
  • Hapus sisipan
  • Hapus ikatan yang disebabkan oleh lokasi atom alternatif, tetapi meninggalkan lokasi pertama

Kode untuk ini (mengambil tabel pdb_ssbond sebagai argumen pertama) adalah:

 CREATE OR REPLACE FUNCTION pdb_ssbond_clean2( clean_icodes boolean, clean_altloc boolean, mark_reactive boolean, mark_consecutive boolean) RETURNS void AS $$ declare _res integer; BEGIN delete from pdb_ssbond b where exists ( select a.id from pdb_ssbond a where a.code = b.code and a.id > b.id and ( ( a.chain_id1 = b.chain_id1 and a.res_seq1 = b.res_seq1 and a.chain_id2 = b.chain_id2 and a.res_seq2 = b.res_seq2) or ( a.chain_id1 = b.chain_id2 and a.res_seq1 = b.res_seq2 and a.chain_id2 = b.chain_id1 and a.res_seq2 = b.res_seq1) ) ) ; delete from pdb_ssbond where chain_id1 = chain_id2 and res_seq1 = res_seq2 and i_code1 = i_code2; update pdb_ssbond set is_consecutive = true , is_reactive = false; delete from pdb_ssbond where not dist between 1.6175344456264 and 2.48801947642267; if clean_icodes then delete from pdb_ssbond where i_code1 not in ('', ' ', 'A') or i_code2 not in ('', ' ', 'A') ; end if; if clean_altloc then delete from pdb_ssbond a where exists ( select 1 from pdb_ssbond b where b.code = a.code and b.chain_id1 = a.chain_id1 and b.res_seq1 = a.res_seq1 and b.i_code1 = a.i_code1 and b.ser_num < a.ser_num ) ; delete from pdb_ssbond a where exists ( select 1 from pdb_ssbond b where b.code = a.code and b.chain_id2 = a.chain_id2 and b.res_seq2 = a.res_seq2 and b.i_code2 = a.i_code2 and b.ser_num < a.ser_num ) ; end if; if mark_reactive then update pdb_ssbond set is_reactive = false ; update pdb_ssbond set is_reactive = true where exists ( select 1 from pdb_ssbond b where b.code = pdb_ssbond.code and b.chain_id1 = pdb_ssbond.chain_id1 and b.res_seq1 = pdb_ssbond.res_seq1 and b.i_code1 = pdb_ssbond.i_code1 and b.ser_num < pdb_ssbond.ser_num ) ; update pdb_ssbond set is_reactive = true where exists ( select 1 from pdb_ssbond b where b.code = pdb_ssbond.code and b.chain_id2 = pdb_ssbond.chain_id2 and b.res_seq2 = pdb_ssbond.res_seq2 and b.i_code2 = pdb_ssbond.i_code2 and b.ser_num < pdb_ssbond.ser_num ) ; update pdb_ssbond set is_reactive = true where (code, chain_id1, res_seq1, i_code1) in ( select code, chain_id1 as c, res_seq1 as r, i_code1 as i from pdb_ssbond intersect select code, chain_id2 as c, res_seq2 as r, i_code2 as i from pdb_ssbond ) ; update pdb_ssbond set is_reactive = true where (code, chain_id2, res_seq2, i_code2) in ( select code, chain_id1 as c, res_seq1 as r, i_code1 as i from pdb_ssbond intersect select code, chain_id2 as c, res_seq2 as r, i_code2 as i from pdb_ssbond ); end if; if mark_consecutive then update pdb_ssbond set is_consecutive = false; update pdb_ssbond set is_consecutive = true where not exists ( select 1 from pdb_ssbond a where a.code = pdb_ssbond.code and ( (a.chain_id1 = pdb_ssbond.chain_id1 and a.chain_id2 = pdb_ssbond.chain_id2) or (a.chain_id1 = pdb_ssbond.chain_id2 and a.chain_id2 = pdb_ssbond.chain_id1) ) and ( (a.res_seq1 between pdb_ssbond.res_seq1 and pdb_ssbond.res_seq2) or (a.res_seq2 between pdb_ssbond.res_seq1 and pdb_ssbond.res_seq2) or (pdb_ssbond.res_seq1 between a.res_seq1 and a.res_seq2) or (pdb_ssbond.res_seq2 between a.res_seq1 and a.res_seq2) ) and not ( a.code = pdb_ssbond.code and a.chain_id1 = pdb_ssbond.chain_id1 and a.chain_id2 = pdb_ssbond.chain_id2 and a.res_seq1 = pdb_ssbond.res_seq1 and a.res_seq2 = pdb_ssbond.res_seq2 ) ); end if; END; $$ LANGUAGE plpgsql;

Dengan ini, set protein non-redundan diimpor ke tabel nr yang digabungkan ke tabel ps dan proteins , dan set ditandai ( set7 , set40 , dan set80 ). Pada akhirnya, menurut kuantitas protein hanya satu set yang akan dianalisis. Rantai yang tidak cocok antara PDB dan NR dihapus dari analisis.

Protein tanpa ikatan disulfida dikeluarkan dari penelitian, bersama-sama dengan protein yang tidak termasuk dalam himpunan apa pun. Data diproses dengan DSSP, dan file-file ini yang memiliki masalah dengan resolusi atau terlalu banyak atom untuk diproses juga dikecualikan. Hanya protein dengan rantai tunggal yang digunakan sebagai hasil untuk analisis karena koneksi antar rantai tidak disimpan, meskipun mereka mudah dihitung dari tabel ssbond dengan menghitung jumlah koneksi yang memiliki rantai berbeda.

Untuk protein yang tersisa, pembaruan dilakukan untuk jumlah total ikatan dan jumlah ikatan yang tumpang tindih, dan ini dilakukan untuk setiap set.

Organisme sumber diekstraksi dari catatan SOURCE . Dalam kasus di mana tidak diketahui, sintetis, dirancang, buatan, atau hibrida, itu dibuang dari penelitian. Protein resolusi rendah juga dikeluarkan hanya jika rantai sampingnya tidak terlihat.

Catatan SOURCE disimpan dalam tabel sources , yang berisi baris taksonomi. Dalam beberapa kasus, taksonomi hilang atau salah. Dalam hal ini, koreksi manual dari ahli diperlukan.

Dari sumber dan taksonomi yang diunduh dari NCBI, kelas ditugaskan ke setiap struktur utama. Jika kelas tidak dapat ditetapkan, protein akan dihapus dari daftar analisis. Mengetahui bahwa database biologis sedang digunakan, pemeriksaan ekstra dari semua catatan sumber dan kelas taksonomi NCBI direkomendasikan untuk dilakukan oleh ahli biologi, jika tidak, mungkin ada masalah dengan klasifikasi antara domain yang berbeda. Untuk mencocokkan lokasi seluler sumber dengan ID taksonomi, data dari tabel sumber diekstraksi ke dalam tabel sources_organela di mana semua data ditulis sebagai kode, tag, dan nilai. Formatnya ditunjukkan di bawah ini:

 select * from sources_organela where code = '1rav';
kode mol_id menandai nilai
1rav 0 MOL_ID 1
1rav 7 CELLULAR_LOCATION SITOPLASM (PUTIH)

Arsip taksonomi yang ingin kami gunakan adalah file ZIP yang berisi tujuh file dump. Di antara file-file ini, dua yang paling penting adalah names.dmp dan merged.dmp . Kedua file tersebut adalah file yang dibatasi tab-pipe CSV seperti yang dijelaskan dalam dokumentasi:

  • File merged.dmp berisi daftar ID taksonomi sebelumnya, dan ID taksonomi saat ini di mana masing-masing digabungkan.
  • names.dmp berisi kolom-kolom penting berikut dalam urutan ini:
    • tax_id : ID taksonomi
    • name_txt : Nama spesies, dan jika berlaku, nama unik (di mana spesies dapat ditemukan dengan banyak nama, ini membantu membedakan)
  • division.dmp berisi nama-nama domain tingkat atas yang akan kita gunakan sebagai kelas kita.
  • nodes.dmp adalah tabel yang berisi struktur hierarki organisme menggunakan ID taksonomi.
    • Ini berisi ID taksonomi induk, kunci asing yang dapat ditemukan di names.dmp .
    • Ini juga berisi ID divisi yang penting bagi kami untuk menyimpan data domain teratas yang relevan dengan benar.

Dengan semua data ini dan koreksi manual (mengatur domain kehidupan yang benar), kami dapat membuat struktur tabel taxonomy_path . Contoh data terlihat seperti ini:

 select * from taxonomy_path order by length(path) limit 20 offset 2000;
Id pajak jalur is_viral is_eukariota is_archaea is_other is_prokariota
142182 organisme seluler; Bakteri; Gemmatimonadetes F F F F T
136087 organisme seluler; Eukaryota; Malawimonadidae F T F F F
649454 Virus; fag tidak terklasifikasi; Cyanophage G1168 T F F F F
321302 Virus; virus yang tidak diklasifikasikan; virus Tellina 1 T F F F F
649453 Virus; fag tidak terklasifikasi; Cyanophage G1158 T F F F F
536461 Virus; fag tidak terklasifikasi; Cyanophage S-SM1 T F F F F
536462 Virus; fag tidak terklasifikasi; Cyanophage S-SM2 T F F F F
77041 Virus; virus yang tidak diklasifikasikan; Virus siluman 4 T F F F F
77042 Virus; virus yang tidak diklasifikasikan; Virus siluman 5 T F F F F
641835 Virus; fag tidak terklasifikasi; fag Vibrio 512 T F F F F
1074427 Virus;virus yang tidak terklasifikasi;Mouse Rosavirus T F F F F
1074428 Virus;virus yang tidak terklasifikasi;Mosavirus Mouse T F F F F
480920 sekuens lainnya;plasmid;IncP-1 plasmid 6-S1 F F F T F
2441 sekuens lain; plasmid; Plasmid ColBM-Cl139 F F F T F
168317 sekuens lain; plasmid; IncQ plasmid pIE723 F F F T F
536472 Viruses;unclassified phages;Cyanophage Syn10 T F F F F
536474 Viruses;unclassified phages;Cyanophage Syn30 T F F F F
2407 other sequences;transposons;Transposon Tn501 F F F T F
227307 Viruses;ssDNA viruses;Circoviridae;Gyrovirus T F F F F
687247 Viruses;unclassified phages;Cyanophage ZQS-7 T F F F F

Before any analysis, to avoid biases, sequences have to be checked for their level of identity. Although the NR set contains sequences which are already compared between each other, an extra check is always recommended.

For each disulfide bond's prior statistical analysis, data is marked if it is reactive or overlapping. After marking overlaps, that information automatically reveals how many consecutive and non-consecutive bonds are inside each protein, and that data is stored in the proteins table from which all protein complexes are excluded in final result.

Each disulfide bond is marked also for its association to sets, by checking both bond sides to see if they belong to the same NR set. Where that is not the case, the disulfide bond is skipped for that set analysis.

To analyze the quantity of bonds by their variance, each length has to be put in a specific class. In this case, only five classes are chosen as written in the function below.

 CREATE OR REPLACE FUNCTION len2class(len integer) RETURNS integer AS $BODY$ BEGIN return case when len <= 100 then 1 when len > 100 and len <= 200 then 2 when len > 200 and len <= 300 then 3 when len > 300 and len <= 400 then 4 else 5 end; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100;

Most of the protein sizes are less than 400 amino acids, so length classification is done by splitting lengths into five ranges, each taking 100 amino acids, except the last one which takes the rest. Below you can see how to use this function to extract data for analysis:

 SELECT p.code, p.title, p.ss_bonds, p.ssbonds_overlap, p.intra_count, p.sci_name_src, p.len, p.tax_path, p.pfam_families, p.src_class, ( SELECT s.id FROM src_classes s WHERE s.src_class::text = p.src_class::text) AS src_class_id, p.len_class7, ( SELECT s.val FROM sources_organela s WHERE s.code = p.code::bpchar AND s.tag::text = 'EXPRESSION_SYSTEM_CELLULAR_LOCATION'::text) AS expression_system_cellular_location, ( SELECT s.val FROM sources_organela s WHERE s.code = p.code::bpchar AND s.tag::text = 'CELLULAR_LOCATION'::text) AS cellular_location, ps.sequence, ps.uniprot_code, ps.accession_code, ps.cc, ps.seq_uniprot, ps.chain_id FROM proteins p JOIN nr n ON n.code::text = p.code::text AND n.rep7 = true JOIN ps ps ON ps.code::text = n.code::text AND ps.chain_id = n.chain_id AND ps.het = false WHERE p.is_excluded = false AND p.chain_cnt = 1 AND p.is_set7 = true AND p.reactive_cnt7 = 0 ORDER BY p.code;

An example result with corrected titles and some manually added columns is shown below.

kode PDB Jumlah total obligasi SS Jumlah SS-bond yang tidak berurutan Panjang PDB / asam amino Domain TargetP 1.1 TatP 1.0 Sinyal P 4.1 KloroP 1.1 TMHMM 2.0 jumlah domain transmembran besar-pi nucPred NetNES 1.1 PSORTb v3.0 SecretomeP 2.0 LocTree2 Prediksi lokalisasi konsensus
1akp 2 0 114 bakteri ND tat-sinyal tidak ada peptida sinyal ND 0 ND ND ND tidak dikenal ND fimbrium tidak dikenal
1bhu 2 0 102 bakteri ND tat-sinyal peptida sinyal ND 1 ND ND ND tidak dikenal ND disekresikan tidak dikenal
1c75 0 0 71 bakteri ND tat-sinyal tidak ada peptida sinyal ND 0 ND ND ND membran sitoplasma sekresi nonklasik periplasma tidak dikenal
1c8x 0 0 265 bakteri ND tat-sinyal peptida sinyal ND 1 ND ND ND tidak dikenal ND disekresikan tidak dikenal
1cx1 1 0 153 bakteri ND tat-sinyal peptida sinyal ND 1 ND ND ND ekstraseluler ND disekresikan tidak dikenal
1dab 0 0 539 bakteri ND tat-sinyal peptida sinyal ND 0 ND ND ND membran luar ND membran luar tidak dikenal
1dfu 0 0 94 bakteri ND tat-sinyal tidak ada peptida sinyal ND 0 ND ND ND sitoplasma ND sitosol tidak dikenal
1e8r 2 2 50 bakteri ND tat-sinyal peptida sinyal ND 0 ND ND ND tidak dikenal ND disekresikan disekresikan
1 esc 3 0 302 bakteri ND tat-sinyal peptida sinyal ND 1 ND ND ND ekstraseluler ND periplasma tidak dikenal
1g6e 1 0 87 bakteri ND tat-sinyal peptida sinyal ND 1 ND ND ND tidak dikenal ND disekresikan tidak dikenal

PostgreSQL sebagai Perantara Pemrosesan

Dalam karya ini, kami menunjukkan cara memproses data, mulai dari pengambilan hingga analisis. Saat bekerja dengan data ilmiah, terkadang diperlukan normalisasi, dan terkadang tidak. Saat bekerja dengan sejumlah kecil data yang tidak akan digunakan kembali untuk analisis lain, maka cukup untuk membiarkannya didenormalisasi di mana pemrosesannya cukup cepat.

Alasan mengapa ini dilakukan semua dalam satu database bioinformatika adalah karena PostgreSQL mampu mengintegrasikan banyak bahasa. Ini termasuk R, yang dapat melakukan analisis statistik secara langsung dalam database—subjek untuk artikel mendatang tentang alat bioinformatika.


Terima kasih khusus kepada rekan-rekan Toptal Stefan Fuchs dan Aldo Zelen atas konsultasi mereka yang tak ternilai.