Tuesday, January 16, 2007

Java for Bioinformatics, BioJava

BioJava official Homepage : http://www.biojava.org

1. 서열정보

* BioJava의 서열 관련 클래스는 모두 index가 1부터 시작된다.

SymbolList 클래스
: 각 서열 Alphabet을 구성하는 Symbol 객체를 가리키는 참조변수로 이루어진다.
따라서, Symbol 객체(DNA, RNA, Protein)가 정의되어 있어야 하고, 아래와 같이 접근.

FiniteAlphabet dna=DNATools.getDNA();
FiniteAlphabet rna=DNATools.getRNA();
FiniteAlphabet protein=ProteinTools.getAlphabet();

Exam)SymbolList 이용한 서열 객체 생성

import org.biojava.bio.seq.*;
import org.biojava.bio.symbol.*;

try{
SymbolList dan=DNATools.createDNA("agtagcgcgta");
}catch(IllegalSymbolException ex){}

Exam)SymbolList 객체를 구성하는 Symbol 객체의 이름 접근

SymbolList dan=DNATools.createDNA("agtagcgcgta");
for(int i=1;i<=dna.length();i++){ //index는 1부터 시작한다. 0이 아니다.

Symbol base=dna.symbolAt(i); // i번째 SymbolList 참조자가 가리키는 Symbol 객체 반환
System.out.println(base.getName()); //Symbol base의 이름 출력(예, a=adenine)
}


Sequence 클래스
:SymbolList와 달리 생물학적 서열을 표현하기 위한 여러 abstract method를 가진다.

Exam) Sequence 객체 생성

try{
Sequence dna=DNAtools.createDNASequence("agtagcgat","DNA_sequence");
}


Exam) FASTA file 읽기

try{

BufferedReader read=new BufferedReader(new FileReader(filename));
SequenceIterator seq=SeqIOTools.readFastaDNA(read); // Genbank 파일일 경우 readGenbank() 이용.

while(seq.hasNext()){
Sequence dna=seq.nextSequence();
//출력 or other 작업

}

}

2. Annotation을 위한 class

Annotation 클래스
:SeqIOTools로 읽은 서열 정보는 각 Feature에 따라 객체에 저장되며,
다양한 Method들을 통해 이들에 접근할 수 있다.


Exam) Genbank 파일의 각 Feature에 따른 정보 출력

SequenceIterator seq=SeqIOTools.readGenbankDNA(read);

while(seq.hasNext()){
Sequence dna=seq.nextSequence();
Annotation anno=dna.getAnnotation();
Iterator key=anno.keys().iterator();

while(key.hasNext()){

Object ob=key.next();
System.out.println(ob.toString()+"="+anno.getProperty(ob));
}
}

Feature 클래스
:하나의 feature에도 위치 정보등 여러 unit의 정보가 저장된다. BioJava에서는 feature 항목과
이에 해당하는 정보 자체를 모두 저장하고, Feature 클래스를 통해 각각 접근할 수 있다.

Exam)위의 exam과 같은 context에서 feature 정보 출력

while(seq.hasNext()){
Sequence dna=seq.nextSequence();
Iterator feature_iter=dna.features();

while(feature_iter.hasNext()){

Feature f=(Feature)(feature_iter.next());
Annotation anno=f.getAnnotation();
System.out.println(f.getType()+"="+anno); //feature type(예, species, sequence, LOCUS)과 이에 해당하는 annotaion 출력
}
}

3. PDB file parsing

import org.biojava.bio.structure.*;
import org.biojava.bio.structure.io.*;

try{

PDBFileReader read=new PDBFileReader();
Structure pdb=read.getStructure(seqfile);
System.out.println("PDB code :"+pdb.getPDBCode());

for(int i=0;i< pdb.nrModels();i++){
ArrayList chains=pdb.getChains(i);

for(Iterator iter=chains.iterator();iter.hasNext();){
Chain c=(Chain)(iter.next());
System.out.println("Chain :"+c.getName()+"\n"+c.getSequence());
Atom a=c.getGroup(0).getAtom(0);
System.out.println("a.getPDBserial()+a.getX()+a.getY()+a.getZ());
}
}
}catch(IOException){}
catch(StructureException){}

Java for Bioinformatics, File parsing

StringTokenizer

: 공백 문자나 사용자가 지정한 문자를 이용, 문자열을 여러 개의 token으로 쪼개어 준다.
Perl의 split과 같은 기능.

Exam) Genbank 파일을 읽어 Accession number 추출

//Reading file..

String a;
StringTokenizer token=new StringTokenizer(line);

if(token.hasMoreTokens()){

a=token.nextToken();
if(a.equals("ACCESSION")){
System.out.println(token.nextToken());
}
}

Exam2) 구분자 지정

Default 구분자는 공백(\s).

StringTokenizer a=new StringTokenizer(line,"\t"); // tab을 구분자로
StringTokenizer a=new StringTokenizer(line,"\t",true); // tab을 구분자로하고, 구분자까지 token으로 저장

Monday, January 15, 2007

2007 Weight training plan

2005년 11월경 시작

Body weight : 62.2kg

2007년 1월 현재

Height: 186cm
Body weight : 70kg

Record for three power lifting exercises
1. Squat : 90kg(5rm),
2. Deadlift : 100kg(5rm)
3. Bench press: 60kg(3rm)

*Chin up : 10 repeat at one trial, 25 repeat with split trial


2007년 상반기 목표

Body weight : 75kg

Squat : 120kg
Deadlift : 140kg
Bench press: 80kg

Java for Bioinformatics, File I/O

스트림을 통한 입출력

exam) 파일 복사

FileInputStream input;
FileOutputStream output;

String file1=args[0];
String file2=args[1];

try{
input=new FileInputStream(file1);
output=new FileOutputStream(file2);

int b;

while((b=input.read())!=-1){
output.write(b);

}
input.close();
output.close();

}catch(IOException e){
//
e.printStackTrace();
}

버퍼를 이용한 파일 입출력

미리 일정량의 데이터를 읽어 메모리(버퍼)에 저장하는 방법을 사용하여
속도의 향상을 가져온다.

exam) 파일 복사

try{
FileInputStream input=new FileInputStream(args[0]);
FileOutputStream output=new FileOutputStream(args[1]);
BufferedInputStream bufferinput=new BufferedInputStream(input);
BufferedOutputStream bufferoutput=new BufferedOutputStream(output);

int b;

while((b=input.read())!=-1){
output.write(b);

}
input.close();
output.close();

}catch(){}


텍스트 파일 입출력을 위한 Reader/Writer

앞서의 Fileinoutstream or fileoutputstream이 byte단위로 데이터를 처리했던데
반해, 16 bit UNICODE 문자 단위로 처리한다. 한글의 경우 16bit로 표현되므로,
앞서의 경우처럼 byte(8bit)단위로 읽었을 때는 반쪽만 읽어 반환하여 문자가
깨지는 경우가 발생한다.

exam)


try{
FileReader read=new FileReader(args[0]);

int b;

while((b=read.read())!=-1){
System.out.println((char)b);

}
read.close();
}

exam2) 버퍼 이용

try{
FileReader read=new FileReader(args[0]);
BufferedReader r=new BufferedReader(read);

String line;

while((line=r.readLine())!=null){
System.out.println(line);

}
read.close();
r.close();
}

newLine() 메소드 // BufferedWrite 객체에 '\n'을 넣어준다.


Byte 스트림을 문자 스트림으로 변환

InputStreamReader를 통해 바이트 스트림이 문자 스트림으로,
OutputStreamWriter을 통해 문자 스트림이 바이트 스트림으로 변환된다.


try{
FileInputStream input=new FileInputStream(args[0]);
FileOutputStream output=new FileOutputStream(args[1]);

InputStreamReader reader=new InputStreamReader(input);
OutputStreamWriter writer=new OutputStreamWriter(output);

int b;

while((b=reader.read())!=-1){
writer.write(b);

}

}


FASTA file 읽기 예제

String name;
String seq;
StringBuffer seqbuf=new StringBuffer();

try{

BufferedReader read=new BufferedReader(new FileReader(args[0]));
while((line=read.readLine())!=null){
line=line.trim();
if(line.length()==0) continue;
if(line.charAt(0)=='>'){
name=line.substring(1); // >enzyme1 에서 위치 1 이후의 문자열 enzyme1을 반환
}else{
seqbuf.append(line);

}
read.close();
seq=seqbuf.toString();
}
}

인터넷 resourse 읽어들이기

java.net 패키지의 URLConnection 클래스 이용.

exam)

import java.net.*;
String urlstr="http://~~"

URL url=new URL(urlstr);
URLConnection c=url.openConnection();

BufferedReader re=new BufferedReader(new InputStreamReader(c.getInputStream());

Java for Bioinformatics, chap. 2 through 5

다중 break

break를 통해 break 될 블록을 지정할 수 있다.

Exam)

test: for( .. ){
for( ..) {
if( ..)
break test;

}
}


String 클래스 메소드들

1. CharAt()

String 클래스의 메소드로 문자열의 특정 위치 문자 반환.

Exam)

String DNA="ATGATGA";
char A=DNA.charAt(1);

A에는 DNA 문자열의 2번째 character인 T가 저장.

2. 문자열 상수

문자열 상수는 String 클래스의 객체로 구현.
따라서

int a="atgatcta".length();

도 가능하다.

3. toUpperCase()

dna.toUpperCase() // 대문자로 변환

4. substring(int beginIndex, int endIndex)

beginIndex부터 endIndex의 앞에서 끝나는 부분의 문자열 반환
or substring(int beginIndex)로 특정 부분부터 끝까지의 문자열 반환

5. 문자열 결합

dna=dna+seq;
식의 + 연산자 이용한 결합 가능


StringBuffer 클래스

String 객체는 문자를 추가하거나 지워서 길이를 변화시킬 수 없고,
이런 기능이 필요할 때 StringBuffer 객체를 쓴다.

Exam)

StringBuffer dna=new StringBuffer();
dna.append('T');
dna.append('A');

dna.reverse(); // 스트링 순서를 뒤집는다.

dna.insert(0,'A'); 0번째 위치에 A를 집어 넣는다.

dna.toString(); // String 객체로 type 변환. (type casting)

입력 (명령어 라인, 실행 중 입력)

String dna=args[0]; //명령어 라인 입력

String dna;
byte[] b=new byte[10000];
try{
System.in.read(b);
dna=new String(b);
dna=dna.trim();
}
catch(Exception e){
//
}

패키지 사용

파일의 상위에 package pakagename;
을 명시하여 같은 package파일 임을 표시해 준다.

자바에서 패키지 이름은 폴더 이름과 대응하고
-d 옵션을 통해 .class 파일들이 생성될 폴더 위치를
정해주면 패키지 이름과 같은 폴더가 만들어진다.

javac -d . *.java
java packagename.mainclassname //실행 클래스의 폴더 위치를 . 앞에 써준다. .는 \를 의미.

생성된 package는 다른 프로그램에서 import 문으로 불러 사용할 수 있다.

Hashtable

Hashtable h=new Hashtable();
h.put('AAA','K');

String codon=(String)h.get('AAA');

Hashtable에 저장되거나 키값으로 사용되는 것은 모두 객체.
따라서 기본 자료형을 사용할 때는 wrapper를 사용해야 한다.

h.put(new Integer(123),new Integer(355));
h.put(new Character('a'),new Character('b');


instanceOf 연산자

boolean=dna instanceOf DNA; //dna 객체가 DNA class의 객체인지를 확인하여 ture or false값을 반환.