Halo teman-teman, apa kabar? Kali ini saya ingin membahas sedikit tentang salah satu problem yang ada di web rosalind.info. Judulnya ialah "RNA Splicing". Sebagai acuan, teman-teman bisa cek dahulu problem yang akan kita bahas (disini).
String utama terdiri dari intron dan ekson.
Di problem ini kita akan disajikan beberapa string dalam bentuk FASTA format yang berisikan urutan DNA. String tersebut terdiri dari satu string utama dan beberapa string intron (jumlah tidak diketahui). String intron sendiri merupakan substring dari string utama.
Tugas kita ialah men-translate string ekson (dari string utama) menjadi protein. Seperti yang kita ketahui, string utama ialah string yang terdiri dari intron dan ekson. Untuk mencari eksonnya maka otomatis kita harus menghilangkan intron dari string utama (seperti pada gambar diatas).
Berikut kode pengerjaannya dalam bahasa java :
- static int tot = 0;
- static void makeItDot (int awal, int akhir, char[] pat) {
- for (int i = awal; i <= akhir; i++) {
- pat[i] = '.';
- }
- }
- static int[] makeRev (char[] sample) {
- int[] rev = new int[sample.length]; rev[0] = 0; rev[1] = 0;
- int pvt = 0;
- for (int i = 2; i < sample.length; i++) {
- if (sample[i] != sample[pvt + 1]) {
- if (sample[i] == sample[1]) pvt = 1;
- else pvt = 0;
- }
- else {
- pvt++;
- }
- rev[i] = pvt;
- }
- return rev;
- }
- static void match (char[] pat, char[] sample) {
- int[] rev = makeRev(sample);
- int pvt = 0;
- for (int i = 1; i < pat.length; i++) {
- while (pat[i] != sample[pvt + 1] && pvt != 0) {
- pvt = rev[pvt];
- }
- if (pat[i] == sample[pvt + 1]) pvt++;
- if (pvt == sample.length - 1) {
- makeItDot(i - (sample.length - 1) + 1, i, pat);
- tot += sample.length - 1;
- break;
- }
- }
- }
- static void solve() {
- HashMap<String, String> codonTable = new HashMap<>();
- codonTable.put("UUU", "F");
- codonTable.put("UUC", "F");
- codonTable.put("UUA", "L");
- codonTable.put("UUG", "L");
- codonTable.put("UCU", "S");
- codonTable.put("UCC", "S");
- codonTable.put("UCA", "S");
- codonTable.put("UCG", "S");
- codonTable.put("UAU", "Y");
- codonTable.put("UAC", "Y");
- codonTable.put("UAA", "Stop");
- codonTable.put("UAG", "Stop");
- codonTable.put("UGU", "C");
- codonTable.put("UGC", "C");
- codonTable.put("UGA", "Stop");
- codonTable.put("UGG", "W");
- codonTable.put("CUU", "L");
- codonTable.put("CUC", "L");
- codonTable.put("CUA", "L");
- codonTable.put("CUG", "L");
- codonTable.put("CCU", "P");
- codonTable.put("CCC", "P");
- codonTable.put("CCA", "P");
- codonTable.put("CCG", "P");
- codonTable.put("CAU", "H");
- codonTable.put("CAC", "H");
- codonTable.put("CAA", "Q");
- codonTable.put("CAG", "Q");
- codonTable.put("CGU", "R");
- codonTable.put("CGC", "R");
- codonTable.put("CGA", "R");
- codonTable.put("CGG", "R");
- codonTable.put("AUU", "I");
- codonTable.put("AUC", "I");
- codonTable.put("AUA", "I");
- codonTable.put("AUG", "M");
- codonTable.put("ACU", "T");
- codonTable.put("ACC", "T");
- codonTable.put("ACA", "T");
- codonTable.put("ACG", "T");
- codonTable.put("AAU", "N");
- codonTable.put("AAC", "N");
- codonTable.put("AAA", "K");
- codonTable.put("AAG", "K");
- codonTable.put("AGU", "S");
- codonTable.put("AGC", "S");
- codonTable.put("AGA", "R");
- codonTable.put("AGG", "R");
- codonTable.put("GUU", "V");
- codonTable.put("GUC", "V");
- codonTable.put("GUA", "V");
- codonTable.put("GUG", "V");
- codonTable.put("GCU", "A");
- codonTable.put("GCC", "A");
- codonTable.put("GCA", "A");
- codonTable.put("GCG", "A");
- codonTable.put("GAU", "D");
- codonTable.put("GAC", "D");
- codonTable.put("GAA", "E");
- codonTable.put("GAG", "E");
- codonTable.put("GGU", "G");
- codonTable.put("GGC", "G");
- codonTable.put("GGA", "G");
- codonTable.put("GGG", "G");
- Scanner sc = new Scanner(System.in);
- Vector<String> dnas = new Vector<>();
- while (sc.hasNext()) {
- String s = "";
- while (sc.hasNext()) {
- String masuk = sc.next();
- if (masuk.charAt(0) == '>') break;
- s += masuk;
- }
- if (s != "") dnas.add(s);
- }
- Collections.sort(dnas, new Comparator<String>(){
- public int compare (String a, String b) {
- return b.length() - a.length();
- }
- });
- char[] pat = ("." + dnas.remove(0)).toCharArray();
- while (!dnas.isEmpty()) {
- char[] sample = ("." + dnas.remove(0)).toCharArray();
- match(pat, sample);
- }
- String s = "";
- for (char ch : pat) {
- if (ch != '.') s += ch;
- }
- for (int i = 0; i < s.length(); i+= 3) {
- String prot = codonTable.get(s.substring(i, i + 3).replace('T', 'U'));
- if (prot != "Stop") out.print(prot);
- }
- }
Pertama, kita buat katalog tabel kodon RNA/DNA terlebih dahulu (dua-duanya boleh). Untuk lebih cepatnya kita bisa langsung memakai tabel kodon DNA, jadi bisa langsung men-translate DNA menjadi protein. Disini saya memilih untuk memakai tabel kodon RNA (baris 38-102).
(Untuk baris 115 sampai 119 saya memakai fungsi sort. Fungsi sort ini aslinya tidak diperlukan karena problem setter sudah menjamin tidak akan ada string intron yang berhubungan satu sama lain [supaya jawabannya hanya satu]. Saya memakai fungsi sort hanya untuk jaga-jaga.)
Langkah selanjutnya, kita cocokan intron-intron-nya ke string utama (baris 120-124). Untuk mencocokannya saya memakai algoritma knuth-morris-pratt yang saya jabarkan di baris 2 sampai 36. Disini saya mencocokan string tersebut sekaligus merubah substring yang cocok (di string utama) menjadi karakter "." (titik).
Karakter titik tersebut saya hapus di baris ke 125 sampai 128 (saya membuat string utama baru tanpa ".", pengganti string utama sebelumnya).
Langkah terakhir ialah menerjemahkan string utama baru ke protein, seperti pada problem "Translating RNA into Protein".
Seperti yang teman-teman lihat; disini, saya memakai fungsi next() (baris 109) untuk meng-input data string. Sebelumnya saya juga menggunakan hasNext() (baris 108) dikarenakan fungsi tersebut mampu meng-input data yang tidak diketahui jumlahnya. Fungsi tersebut sangat cocok jika dipakai untuk menangani input dengan format FASTA.
Sedangkan untuk output-nya saya memakai fungsi out.print() (baris 131). Fungsi tersebut juga adalah modifikasi dari fungsi System.out.print() yang merupakan fungsi default di java. Untuk lebih jelasnya teman-teman bisa melihat kode tambahan untuk memodifikasi fungsi tersebut (input maupun output) di versi lengkap kode saya di github.
Sekian dari saya. Jika teman-teman ingin menanyakan sesuatu, teman-teman bisa menulisnya di kolom komentar. Semoga bermanfaat dan sampai jumpa di artikel berikutnya!
Referensi :
Sumber gambar 1 :https://www.facebook.com/ProjectRosalind/
Sumber gambar 2 :https://commons.wikimedia.org/wiki/File:DNA_exons_introns.gif
No comments:
Post a Comment