Thursday, 30 September 2021

Consensus and Profile (Rosalind)

rosalind


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 DNAA 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

KonsensusA T G C A A C T

Berikut kode pengerjaannya dalam bahasa java :
  1. static void solve() {
  2. Scanner sc = new Scanner(System.in);
  3. Vector<String> vs = new Vector<>();
  4. sc.next();
  5. while (sc.hasNext()) {
  6. String s = "";
  7. while (sc.hasNext()) {
  8. String line = sc.next();
  9. if (line.charAt(0) == '>') break;
  10. s += line;
  11. }
  12. vs.add(s);
  13. }
  14. int n = vs.size();
  15. int m = vs.get(0).length();
  16. int[][] karung = new int[4][m];
  17. for (int i = 0; i < n; i++) {
  18. for (int j = 0; j < m; j++) {
  19. if (vs.get(i).charAt(j) == 'A') karung[0][j]++;
  20. else if (vs.get(i).charAt(j) == 'C') karung[1][j]++;
  21. else if (vs.get(i).charAt(j) == 'G') karung[2][j]++;
  22. else if (vs.get(i).charAt(j) == 'T') karung[3][j]++;
  23. }
  24. }
  25. char[] mol = {'A', 'C', 'G', 'T'};
  26. String con = "";
  27. for (int i = 0; i < m; i++) {
  28. int Max = 0;
  29. char winner = '.';
  30. for (int j = 0; j < 4; j++) {
  31. if (karung[j][i] > Max) {
  32. Max = karung[j][i];
  33. winner = mol[j];
  34. }
  35. }
  36. con += winner;
  37. }
  38. out.println(con);
  39. for (int i = 0; i < 4; i++) {
  40. out.print(mol[i] + ": ");
  41. for (int j = 0; j < m; j++) {
  42. out.print(karung[i][j] + " ");
  43. }
  44. out.println();
  45. }
  46. } 
  47.   
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 outputdi 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