Java 14

25
Java 14 Et eksempel fra bioinformatikk: analyse av biologiske sekvenser Ole Christian Lingjærde Gruppen for bioinformatikk Institutt for informatikk Universitetet i Oslo

description

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) - PowerPoint PPT Presentation

Transcript of Java 14

Page 1: Java 14

Java 14

Et eksempel fra bioinformatikk: analyse av biologiske sekvenser

Ole Christian LingjærdeGruppen for bioinformatikkInstitutt for informatikkUniversitetet i Oslo

Page 2: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 2

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

Page 3: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 3

Kodende og ikke-kodende sekvenser

....CTGCCCGTCTAACTGCACTGCGCGTATCGACGTCTACTGCATCCTCGACTACCTCAGACTGCGCGTATCGACGTCTACTGC....

ca 3% ergener 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:

Page 4: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 4

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

?

Page 5: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 5

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 generFinne alle sekvenser som starter med ATG og slutter med TAA

3: Lage oversikt over organismerSkrive ut all info om lagrede organismer

4: Avslutte

Page 6: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 6

enterohemorrhagic Escherichia coli O157:H7Bacteria; Proteobacteria; Gammaproteobacteria

Caenorhabditis elegansEukaryota; Metazoa; Nematoda

Plasmodium falciparumEukaryota; Alveolata; Apicomplex

Data om organismer

Filen organismer.txt :

Page 7: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 7

enterohemorrhagic Escherichia coli O157:H7AE005174-1 (part 1 of 2)AE005174v2-1_fas.txt

Plasmodium falciparumFinished sequence from Sanger Institute (part 1)MAL1.txt

Data om sekvenser

Filen sekvenser.txt :

>AE005174-1 Genome sequence of enterohemorrhagic Escherichia coli O157:H7, segment 1 of 2.agcttttcattctgactgcaacgggcaatatgtctctgtgtggattaaaaaaagagtctctgacagcagcttctgaactggttacctgccgtgagtaaattaaaattttattgacttaggtcactaaatactttaaccaatataggcatagcgcacagacagataaaaattacagagtacacaacatccatgaaacgcattagcaccaccattaccaccaccatcaccaccaccatcaccattaccattaccacaggtaacggtgcgggctgacgcgtacaggaaacacagaaaaaagcccgcacctgacagtgcgggcttttttttcgaccaaaggtaacgaggtaacaaccatgcgagtgttgaagttcggcggtacatcagtggcaaatgcagaacgttttctgcgggttgccgatattctggaaagcaatgccaggcaggggcaggtggccaccgtcctctctgcccccgccaaaatcaccaaccacctggtggcgatgattgaaaaaaccattagcggccaggatgctttacccaatatcagcgatgccgaacgtatttttgccgaacttctgacgggactcgccgccgcccagccgggattcccgctggcgcaattgaaaactttcgtcgaccaggaatttgcccaaataaaacatgtcctgcatggcattagtttgttagggcagtgcccggatagcattaacgctgcgctga.............

Filen AE005174v2-1_fas.txt :

OrganismeSekvens-IDFilnavn

OrganismeSekvens-IDFilnavn

Page 8: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 8

Hvilke data skal vi holde rede på?

Organismer: Navn (String) Type (String)

Sekvenser: Organisme (peker) Sekvens-ID (String) Selve sekvensen (String)

Page 9: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 9

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;

}}

Page 10: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 10

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

} }

Page 11: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 11

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-navnHashMap sekvenser = new HashMap(); // Nøkkel: sek-idIn tastatur = new In();

void lesOrganismer(String filnavn) {...}

void lesSekvenser(String filnavn) {...}

void ordreløkke() {...}

}

Page 12: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 12

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();

}

Page 13: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 13

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();

}

Page 14: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 14

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;

}}

}

Page 15: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 15

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

}

Page 16: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 16

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);

}}

}

Page 17: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 17

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);

}}

}

Page 18: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 18

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();

}}

Page 19: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 19

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

}

Page 20: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 20

lesFraFil : hovedide

>AE005174-1 Genome sequence of enterohemorrhagic Escherichia coli O157:H7, segment 1 of 2.agcttttcattctgactgcaacgggcaatatgtctctgtgtggattaaaaaaagagtctctgacagcagcttctgaactggttacctgccgtgagtaaattaaaattttattgacttaggtcactaaatactttaaccaatataggcatagcgcacagacagataaaaattacagagtacacaacatccatgaaacgcattagcaccaccattaccaccaccatcaccaccaccatcaccattaccattaccacaggtaacggtgcgggctgacgcgtacaggaaacacagaaaaaagcccgcacctgacagtgcgggcttttttttcgaccaaaggtaacgaggtaacaaccatgcgagtgttgaagttcggcggtacatcagtggcaaatgcagaacgttttctgcgggttgccgatattctggaaagcaatgccaggcaggggcaggtggccaccgtcctctctgcccccgccaaaatcaccaaccacctggtggcgatgattgaaaaaaccattagcggccaggatgctttacccaatatcagcgatgccgaacgtatttttgccgaacttctgacgggactcgccgccgcccagccgggattcccgctggcgcaattgaaaactttcgtcgaccaggaatttgcccaaataaaacatgtcctgcatggcattagtttgttagggcagtgcccggatagcattaacgctgcgctga.............

a g c t t t t c a t t c t g a c t g c a . . .

"agcttttcattctgactgca..."

Fil med sekvensdata

char-array

Tekststreng

Page 21: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 21

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();

}

Page 22: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 22

søkSekvens : hovedide

a g c t t t t c a g c t t g a c t g c tsekv:

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 == 17

... osv ...

Page 23: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 23

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;}

Page 24: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 24

søkGener : hovedide

a a t g t t t c a t a a t g a c t g c tsekv:

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

Page 25: Java 14

Ole Chr. Lingjærde © Institutt for informatikk 18. november 2003 25

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;}