250 likes | 387 Views
Java 14. Et eksempel fra bioinformatikk: analyse av biologiske sekvenser Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo. Biologiske sekvenser. Arvestoffet er delt opp i kromosomer (23 hos mennesker)
E N D
Java 14 Et eksempel fra bioinformatikk: analyse av biologiske sekvenser Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo
Biologiske sekvenser • Arvestoffet er delt opp i kromosomer (23 hos mennesker) • Hvert kromosom er en lang sekvens bygget opp av • fire elementer: A, T, G og C • Hvert kromosom koder digitalt for en rekke proteiner – • de kodende sekvensene kalles gener
Kodende og ikke-kodende sekvenser Bare en del av genomet (= alt DNA) er gener: ....CTGCCCGTCTAACTGCACTGCGCGTATCGACGTCTACTGCATCCTCGACTACCTCAGACTGCGCGTATCGACGTCTACTGC.... ca 3% er gener hos mennesker de resterende 97% har ingen kjent funksjon De kodende sekvensene er spredt utover genomet:
Hvor er genene? Sentralt problem i biologi: finne ut hvor genene ligger (og hva de gjør) Kjennetegn ved gener: • starter med sekvensen ATG • slutter med sekvensen TAG, TAA eller TGA (Hos høyere organismer er det mer komplisert å finne gener) GATCAGTTTCTTTAAGCCGATGGGTCCAGACTTTTCAGCCCTGCCAGAGAATTCCTAATTCCATCTCTCAGGTTTTCCAGTGGTAATGAAAAGCTAGCCAAGTTTGGCTATGCTAACCAAAGCGGGTTCAGTGTGTGTTGTCAGTAAATATTAGTCTATGTGATGTTAATAATCAAACTTATCTTGTGTGGGACCACTATGCTGAATGAACTTTGTACTGTTATCTCATTTAATTCTGAGGATAGCTCTTAAGGTAAGTATTATGATAGCCCTTGATTTACACTTGAGGAAACCAAGGCATAGAGAGATTAAGTAGTGTGTCTAAAGTCACACTACTAGAAAGTGCAAGAGCCTGAACTCAACCCAGGCAGTCTGACTCTGGAGCCCAGCTTGTGAGCTCCATGCTAGTCTGTCACCTTACCTTACCAGTCCTTGGACTACAAAGCTGCTAGTTCTGGTACTGTATCCTTGAGTGTCACGCGCGTCCGTGTGAAGAGACCACCAAACAGGCTTTGTGTGAGCAATAAA....... ?
Et program for å analysere sekvenser Vi skal lage et program med følgende oppførsel: • Det leser først data om organismer og sekvenser fra fil • Deretter starter en ordreløkke. Lovlige kommandoer er: • 1: Søke etter sekvens F.eks. finne alle forekomster av CTGCCC • 2: Søke etter gener Finne alle sekvenser som starter med ATG og slutter med TAA • 3: Lage oversikt over organismer Skrive ut all info om lagrede organismer • 4: Avslutte
Data om organismer Filen organismer.txt : enterohemorrhagic Escherichia coli O157:H7 Bacteria; Proteobacteria; Gammaproteobacteria Caenorhabditis elegans Eukaryota; Metazoa; Nematoda Plasmodium falciparum Eukaryota; Alveolata; Apicomplex
Data om sekvenser Filen sekvenser.txt : enterohemorrhagic Escherichia coli O157:H7 AE005174-1 (part 1 of 2) AE005174v2-1_fas.txt Plasmodium falciparum Finished sequence from Sanger Institute (part 1) MAL1.txt Organisme Sekvens-ID Filnavn Organisme Sekvens-ID Filnavn Filen AE005174v2-1_fas.txt : >AE005174-1 Genome sequence of enterohemorrhagic Escherichia coli O157:H7, segment 1 of 2. agcttttcattctgactgcaacgggcaatatgtctctgtgtggattaaaaaaagagtctctgacagcagcttctgaactg gttacctgccgtgagtaaattaaaattttattgacttaggtcactaaatactttaaccaatataggcatagcgcacagac agataaaaattacagagtacacaacatccatgaaacgcattagcaccaccattaccaccaccatcaccaccaccatcacc attaccattaccacaggtaacggtgcgggctgacgcgtacaggaaacacagaaaaaagcccgcacctgacagtgcgggct tttttttcgaccaaaggtaacgaggtaacaaccatgcgagtgttgaagttcggcggtacatcagtggcaaatgcagaacg ttttctgcgggttgccgatattctggaaagcaatgccaggcaggggcaggtggccaccgtcctctctgcccccgccaaaa tcaccaaccacctggtggcgatgattgaaaaaaccattagcggccaggatgctttacccaatatcagcgatgccgaacgt atttttgccgaacttctgacgggactcgccgccgcccagccgggattcccgctggcgcaattgaaaactttcgtcgacca ggaatttgcccaaataaaacatgtcctgcatggcattagtttgttagggcagtgcccggatagcattaacgctgcgctga .............
Hvilke data skal vi holde rede på? • Organismer: • Navn (String) • Type (String) • Sekvenser: • Organisme (peker) • Sekvens-ID (String) • Selve sekvensen (String)
class Organisme class Organisme { private String navn; private String type; Organisme(String navn, String type) { this.navn = navn; this.type = type; } String fåNavn() { return navn; } String fåType() { return type; } }
class Sekvens (foreløpig) class Sekvens { private Organisme org; private String id; private String sekv; Sekvens(Organisme org, String id, String fnavn) { this.org = org; this.id = id; this.sekv = ""; lesFraFil(fnavn); } Organisme fåOrg() { return org; } String fåId() { return id; } void lesFraFil(String filnavn) { // Les sekvens fra fil } }
Programmets hovedstruktur import easyIO.*; import java.util.*; class SekvensanalyseMain { public static void main (String[] args) { Sekvensanalyse sa = new Sekvensanalyse(); sa.lesOrganismer(args[0]); sa.lesSekvenser(args[1]); sa.ordreløkke(); } } class Sekvensanalyse { HashMap organismer = new HashMap(); // Nøkkel: org-navn HashMap sekvenser = new HashMap(); // Nøkkel: sek-id In tastatur = new In(); void lesOrganismer(String filnavn) {...} void lesSekvenser(String filnavn) {...} void ordreløkke() {...} }
lesOrganismer() void lesOrganismer(String filnavn) { In fil = new In(filnavn); while (!fil.endOfFile()) { String navn = fil.inWord("\n"); String type = fil.inWord("\n"); Organisme org = new Organisme(navn, type); organismer.put(navn, org); } fil.close(); }
lesSekvenser() void lesSekvenser(String filnavn) { In fil = new In(filnavn); while (!fil.lastItem()) { String navn = fil.inWord("\n"); String id = fil.inWord("\n"); String fnavn = fil.inWord("\n"); if (organismer.containsKey(navn)) { Organisme org = (Organisme) organismer.get(navn); Sekvens sek = new Sekvens(org, id, fnavn); sekvenser.put(id, sek); } else { System.out.println("Kunne ikke lese: " + fnavn); } } fil.close(); }
ordreløkke() int lesOrdre() { int ordre = 0; while (ordre < 1 || ordre > 4) { System.out.println("1 -> Søk etter sekvens"); System.out.println("2 -> Søk etter gener"); System.out.println("3 -> Oversikt over organismer"); System.out.println("4 -> Avslutt"); System.out.print("Ordre (1-4): "); ordre = tast.inInt(); } return ordre; } void ordreløkke() { boolean fortsett = true; while (fortsett) { int ordre = lesOrdre(); switch (ordre) { case 1: søkSekvens(); break; case 2: søkGener(); break; case 3: oversiktOrganismer(); break; case 4: fortsett = false; } } }
Oppsummering: class Sekvensanalyse class Sekvensanalyse { HashMap organismer = new HashMap(); HashMap sekvenser = new HashMap(); In tastatur = new In(); void lesOrganismer(String filnavn) {...} // FERDIG void lesSekvenser(String filnavn) {...} // FERDIG void ordreløkke() {...} // FERDIG void søkSekvens() {...} // MÅ SKRIVES void søkGener() {...} // MÅ SKRIVES void oversiktOrganismer() {...} // MÅ SKRIVES }
Sekvensanalyse: søkSekvens void søkSekvens() { System.out.print("Sekvens: "); String s = tast.inWord("\n"); System.out.println(); Iterator it = sekvenser.values().iterator(); while (it.hasNext()) { Sekvens sek = (Sekvens) it.next(); String resultat = sek.søkSekvens(s); if (!resultat.equals("")) { System.out.println("Organisme: "+sek.fåOrg().fåNavn()); System.out.println("Sekvens: " + sek.fåId()); System.out.println(resultat); } } }
Sekvensanalyse: søkGener void søkGener() { System.out.print("Minste lengde: "); int minLengde = tast.inInt(); Iterator it = sekvenser.values().iterator(); while (it.hasNext()) { Sekvens sek = (Sekvens) it.next(); String resultat = sek.søkGener(minLengde); if (!resultat.equals("")) { System.out.println("Organisme: "+sek.fåOrg().fåNavn()); System.out.println("Sekvens: " + sek.fåId()); System.out.println(resultat); } } }
Sekvensanalyse: oversiktOrganismer void oversiktOrganismer() { Iterator it = organismer.values().iterator(); while (it.hasNext()) { Organisme org = (Organisme) it.next(); System.out.println("Organisme: " + org.fåNavn()); System.out.println("Type: " + org.fåType()); System.out.println(); } }
Oppsummering: class Sekvens class Sekvens { private Organisme org; private String id; private String sekv; Sekvens(..) {...} // FERDIG Organisme fåOrg() {...} // FERDIG String fåId() {...} // FERDIG void lesFraFil(String filnavn) {...} // MÅ SKRIVES String søkSekvenser(String s) {...} // MÅ SKRIVES String søkGener(int minLengde) {...} // MÅ SKRIVES }
lesFraFil : hovedide Fil med sekvensdata >AE005174-1 Genome sequence of enterohemorrhagic Escherichia coli O157:H7, segment 1 of 2. agcttttcattctgactgcaacgggcaatatgtctctgtgtggattaaaaaaagagtctctgacagcagcttctgaactg gttacctgccgtgagtaaattaaaattttattgacttaggtcactaaatactttaaccaatataggcatagcgcacagac agataaaaattacagagtacacaacatccatgaaacgcattagcaccaccattaccaccaccatcaccaccaccatcacc attaccattaccacaggtaacggtgcgggctgacgcgtacaggaaacacagaaaaaagcccgcacctgacagtgcgggct tttttttcgaccaaaggtaacgaggtaacaaccatgcgagtgttgaagttcggcggtacatcagtggcaaatgcagaacg ttttctgcgggttgccgatattctggaaagcaatgccaggcaggggcaggtggccaccgtcctctctgcccccgccaaaa tcaccaaccacctggtggcgatgattgaaaaaaccattagcggccaggatgctttacccaatatcagcgatgccgaacgt atttttgccgaacttctgacgggactcgccgccgcccagccgggattcccgctggcgcaattgaaaactttcgtcgacca ggaatttgcccaaataaaacatgtcctgcatggcattagtttgttagggcagtgcccggatagcattaacgctgcgctga ............. char-array Tekststreng "agcttttcattctgactgca..."
Sekvens: lesFraFil void lesFraFil(String filnavn) { In fil = new In(filnavn); fil.inLine(); int n = tellTegn(filnavn); char [] c = new char[n]; for (int i=0; i<n; i++) { c[i] = fil.inChar(); } sekv = String.valueOf(c); fil.close(); }
søkSekvens : hovedide sekvens: gct sekv: k: 17 k: 9 k: 1 start = 0; k = sekv.indexOf(sekvens, start); // Nå er k == 1 start = k + 1; k = sekv.indexOf(sekvens, start); // Nå er k == 9 start = k + 1; k = sekv.indexOf(sekvens, start); // Nå er k == 17 ... osv ...
Sekvens: søkSekvens String søkSekvens(String sekvens) { String resultat = ""; int start = 0; boolean fortsett = true; while (fortsett) { int k = sekv.indexOf(sekvens, start); if (k >= 0) { resultat = resultat + k + "\n"; start = k+1; } else { fortsett = false; } } return resultat; }
søkGener : hovedide Gen k2+3: 12 sekv: k2: 9 k1: 1 start = 0; k1 = sekv.indexOf("atg", start); k2 = sekv.indexOf("taa", k1 + minLengde); start = k2 + 3; k1 = sekv.indexOf("atg", start); k2 = sekv.indexOf("taa", k1 + minLengde); ... osv ...
Sekvens: søkGener String søkGener(int minLengde) { String resultat = ""; int start = 0; boolean fortsett = true; while (fortsett) { int k1 = sekv.indexOf("atg", start); int k2 = sekv.indexOf("taa", k1 + minLengde); if (k1 >= 0 && k2 >= 0) { resultat = resultat + k1 + " - " + k2 + "\n"; start = k2 + 3; } else { fortsett = false; } } return resultat; }