Java 14 Et eksempel fra bioinformatikk: analyse av biologiske sekvenser Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo
Ole Chr. Lingjærde © Institutt for informatikk18. november 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
Ole Chr. Lingjærde © Institutt for informatikk18. november Kodende og ikke-kodende sekvenser....CTGCCCGTCTAACTGCACTGCGCGTATCGACGTCTACTGCATCCTCGACTACCTCAGACTGCGCGTATCGACGTCTACTGC.... ca 3% er gener hos mennesker de resterende 97% har ingen kjent funksjon De kodende sekvensene er spredt utover genomet: Bare en del av genomet (= alt DNA) er gener:
Ole Chr. Lingjærde © Institutt for informatikk18. november 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) GATCAGTTTCTTTAAGCCGATGGGTCCAGACTTTTCAGCCCTGCCAGAGAATTCCTAATT CCATCTCTCAGGTTTTCCAGTGGTAATGAAAAGCTAGCCAAGTTTGGCTATGCTAACCAA AGCGGGTTCAGTGTGTGTTGTCAGTAAATATTAGTCTATGTGATGTTAATAATCAAACTTAT CTTGTGTGGGACCACTATGCTGAATGAACTTTGTACTGTTATCTCATTTAATTCTGAGGAT AGCTCTTAAGGTAAGTATTATGATAGCCCTTGATTTACACTTGAGGAAACCAAGGCATAGA GAGATTAAGTAGTGTGTCTAAAGTCACACTACTAGAAAGTGCAAGAGCCTGAACTCAAC CCAGGCAGTCTGACTCTGGAGCCCAGCTTGTGAGCTCCATGCTAGTCTGTCACCTTAC CTTACCAGTCCTTGGACTACAAAGCTGCTAGTTCTGGTACTGTATCCTTGAGTGTCACGC GCGTCCGTGTGAAGAGACCACCAAACAGGCTTTGTGTGAGCAATAAA ?
Ole Chr. Lingjærde © Institutt for informatikk18. november 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
Ole Chr. Lingjærde © Institutt for informatikk18. november enterohemorrhagic Escherichia coli O157:H7 Bacteria; Proteobacteria; Gammaproteobacteria Caenorhabditis elegans Eukaryota; Metazoa; Nematoda Plasmodium falciparum Eukaryota; Alveolata; Apicomplex Data om organismer Filen organismer.txt :
Ole Chr. Lingjærde © Institutt for informatikk18. november enterohemorrhagic Escherichia coli O157:H7 AE (part 1 of 2) AE005174v2-1_fas.txt Plasmodium falciparum Finished sequence from Sanger Institute (part 1) MAL1.txt Data om sekvenser Filen sekvenser.txt : >AE Genome sequence of enterohemorrhagic Escherichia coli O157:H7, segment 1 of 2. agcttttcattctgactgcaacgggcaatatgtctctgtgtggattaaaaaaagagtctctgacagcagcttctgaactg gttacctgccgtgagtaaattaaaattttattgacttaggtcactaaatactttaaccaatataggcatagcgcacagac agataaaaattacagagtacacaacatccatgaaacgcattagcaccaccattaccaccaccatcaccaccaccatcacc attaccattaccacaggtaacggtgcgggctgacgcgtacaggaaacacagaaaaaagcccgcacctgacagtgcgggct tttttttcgaccaaaggtaacgaggtaacaaccatgcgagtgttgaagttcggcggtacatcagtggcaaatgcagaacg ttttctgcgggttgccgatattctggaaagcaatgccaggcaggggcaggtggccaccgtcctctctgcccccgccaaaa tcaccaaccacctggtggcgatgattgaaaaaaccattagcggccaggatgctttacccaatatcagcgatgccgaacgt atttttgccgaacttctgacgggactcgccgccgcccagccgggattcccgctggcgcaattgaaaactttcgtcgacca ggaatttgcccaaataaaacatgtcctgcatggcattagtttgttagggcagtgcccggatagcattaacgctgcgctga Filen AE005174v2-1_fas.txt : Organisme Sekvens-ID Filnavn Organisme Sekvens-ID Filnavn
Ole Chr. Lingjærde © Institutt for informatikk18. november Hvilke data skal vi holde rede på? Organismer: Navn (String) Type (String) Sekvenser: Organisme (peker) Sekvens-ID (String) Selve sekvensen (String)
Ole Chr. Lingjærde © Institutt for informatikk18. november 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; }
Ole Chr. Lingjærde © Institutt for informatikk18. november 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 }
Ole Chr. Lingjærde © Institutt for informatikk18. november 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() {...} }
Ole Chr. Lingjærde © Institutt for informatikk18. november 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(); }
Ole Chr. Lingjærde © Institutt for informatikk18. november 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(); }
Ole Chr. Lingjærde © Institutt for informatikk18. november ordreløkke() int lesOrdre() { int ordre = 0; while (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; }
Ole Chr. Lingjærde © Institutt for informatikk18. november 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 }
Ole Chr. Lingjærde © Institutt for informatikk18. november 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); }
Ole Chr. Lingjærde © Institutt for informatikk18. november 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); }
Ole Chr. Lingjærde © Institutt for informatikk18. november 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(); }
Ole Chr. Lingjærde © Institutt for informatikk18. november 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 }
Ole Chr. Lingjærde © Institutt for informatikk18. november lesFraFil : hovedide >AE Genome sequence of enterohemorrhagic Escherichia coli O157:H7, segment 1 of 2. agcttttcattctgactgcaacgggcaatatgtctctgtgtggattaaaaaaagagtctctgacagcagcttctgaactg gttacctgccgtgagtaaattaaaattttattgacttaggtcactaaatactttaaccaatataggcatagcgcacagac agataaaaattacagagtacacaacatccatgaaacgcattagcaccaccattaccaccaccatcaccaccaccatcacc attaccattaccacaggtaacggtgcgggctgacgcgtacaggaaacacagaaaaaagcccgcacctgacagtgcgggct tttttttcgaccaaaggtaacgaggtaacaaccatgcgagtgttgaagttcggcggtacatcagtggcaaatgcagaacg ttttctgcgggttgccgatattctggaaagcaatgccaggcaggggcaggtggccaccgtcctctctgcccccgccaaaa tcaccaaccacctggtggcgatgattgaaaaaaccattagcggccaggatgctttacccaatatcagcgatgccgaacgt atttttgccgaacttctgacgggactcgccgccgcccagccgggattcccgctggcgcaattgaaaactttcgtcgacca ggaatttgcccaaataaaacatgtcctgcatggcattagtttgttagggcagtgcccggatagcattaacgctgcgctga agcttttcattctgactgca... "agcttttcattctgactgca..." Fil med sekvensdata char-array Tekststreng
Ole Chr. Lingjærde © Institutt for informatikk18. november 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(); }
Ole Chr. Lingjærde © Institutt for informatikk18. november søkSekvens : hovedide agcttttcagcttgactgct sekv: sekvens: gct k: 1 k: 9 k: 17 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 == osv...
Ole Chr. Lingjærde © Institutt for informatikk18. november 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; }
Ole Chr. Lingjærde © Institutt for informatikk18. november søkGener : hovedide aatgtttcataatgactgct sekv: k1: 1 k2: 9 Gen 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... k2+3: 12
Ole Chr. Lingjærde © Institutt for informatikk18. november 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; }