Halo teman-teman, apa kabar? Kali ini saya ingin membahas sedikit tentang salah satu problem yang ada di web rosalind.info. Judulnya ialah "Consensus and Profile". Sebagai acuan, teman-teman bisa cek dahulu problem yang akan kita bahas (disini).
Di problem ini kita akan disajikan beberapa string dalam bentuk FASTA format yang berisikan urutan-urutan DNA (jumlah tidak diketahui). Tugas kita ialah mencari konsensus dan matriks profil dari string-string DNA tersebut.
Konsensus sendiri ialah sebuah string yang dibentuk dari pengambilan "huruf yang paling sering muncul" di setiap posisi.
Sedangkan matriks profil ialah matriks yang mewakili berapa kali masing-masing huruf DNA (A, C, G, T) muncul di setiap posisi. Supaya lebih jelas, berikut contoh cara mencari konsensus dan matriks profil.
Contoh kasus,
A T C C A G C T | |
G G G C A A C T | |
A T G G A T C T | |
String DNA | A A G C A A C C |
T T G G A A C T | |
A T G C C A T T | |
A T G G C A C T | |
A 5 1 0 0 5 5 0 0 | |
Matriks profil | C 0 0 1 4 2 0 6 1 |
G 1 1 6 3 0 1 0 0 | |
T 1 5 0 0 0 1 1 6 | |
Konsensus | A T G C A A C T |
Berikut kode pengerjaannya dalam bahasa java :
- static void solve() {
- Scanner sc = new Scanner(System.in);
- Vector<String> vs = new Vector<>();
- sc.next();
- while (sc.hasNext()) {
- String s = "";
- while (sc.hasNext()) {
- String line = sc.next();
- if (line.charAt(0) == '>') break;
- s += line;
- }
- vs.add(s);
- }
- int n = vs.size();
- int m = vs.get(0).length();
- int[][] karung = new int[4][m];
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- if (vs.get(i).charAt(j) == 'A') karung[0][j]++;
- else if (vs.get(i).charAt(j) == 'C') karung[1][j]++;
- else if (vs.get(i).charAt(j) == 'G') karung[2][j]++;
- else if (vs.get(i).charAt(j) == 'T') karung[3][j]++;
- }
- }
- char[] mol = {'A', 'C', 'G', 'T'};
- String con = "";
- for (int i = 0; i < m; i++) {
- int Max = 0;
- char winner = '.';
- for (int j = 0; j < 4; j++) {
- if (karung[j][i] > Max) {
- Max = karung[j][i];
- winner = mol[j];
- }
- }
- con += winner;
- }
- out.println(con);
- for (int i = 0; i < 4; i++) {
- out.print(mol[i] + ": ");
- for (int j = 0; j < m; j++) {
- out.print(karung[i][j] + " ");
- }
- out.println();
- }
- }
Pertama, kita masukan dulu input-nya (baris 2-13).
Kemudian, buat matriks profil dengan mengelompokkannya berdasarkan huruf (baris 14-24).
Buat string konsensus berdasarkan data dari matriks profil; cari huruf yang paling sering muncul (baris 25-37).
Print string konsensus dan matriks profil (baris 38-46).
Seperti yang teman-teman lihat; disini, saya memakai fungsi next() (baris 8) untuk meng-input data string. Sebelumnya saya juga menggunakan hasNext() (baris 5) 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() dan out.println() (baris 38 & 40). Fungsi tersebut juga adalah modifikasi dari fungsi System.out.print() dan System.out.println() 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/
No comments:
Post a Comment