자바에서 이쁜 UI를 위한 컴포넌트 제작하기

맥이나 아이폰을 사용하면서 느끼는 것은 버튼 하나도 참 이쁘다는 것입니다. 지나번 애플의 iPhone SDK 발표를 보면서 iPhone 전용 cocoa touch의 UI 라이브러리를 보고 뭐 이미 아이폰에서 봐왔지만,,, 멋지다 라는 말밖에는

cocoatouch
버튼, 슬라이더, 스위치 뭐 하나 빠질것 없이 이쁘다~~

뭐 그건 그거고 이제 저 맨상에 있는 라벨인지 뭔지 저거랑 비슷하니 하나 만들어 보려고 합니다. 어디다 쓰냐면 바로 Genome Browser에 써먹으려고 ^^;;

1. 우선 JComponent의 paintComponent() 메소드를 override해서 자신만의 이쁜? 컴포넌트를 만듭니다.
    
public void paintComponent(Graphics g) {

2. 우선 Graphics 객체에 대한 Graphics2D를 생성하고, 안티알리아싱을 처리해줍니다.

Graphics2D g2=(Graphics2D)g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

3. 투명한 컴포넌트를 위해서 composite를 지정해주고, 여기서는 0.7f를 주었습니다.

Composite composite = g2.getComposite();
g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, .7f));

4. 라운드 처리된 사각형의 shape를 만들어서 클립에다가 넣어놓습니다.

Shape vButtonShape = new RoundRectangle2D.Double((double)xx,(double)yy,(double)w,(double)h,(double)arc,(double)arc);
Shape vOldClip = g.getClip();

5. 만들어질 컴포넌트는 그라데이션 처리를 해줍니다.

java.awt.Paint p = new GradientPaint(0.0F, 0.0F, vStartColor, 0.0F, 40, vEndColor);
g2.setPaint(p);

6. 아까 지정한 클립에다가 전체 크기의 반 만 그라데이션 처리하면,

g2.setClip(vButtonShape);
g2.fillRect(xx,yy,w,h/2);

7. 나머지 하단 부분도 그라데이션 처리해서 보여주면,

java.awt.Paint p1 = new GradientPaint(0.0F, 0.0F+40, vEndColor, 0.0F, h+10, vStartColor);
g2.setPaint(p1);
g2.fillRect(xx,yy+h/2,w,h/2);

gra1


8. 이제 그라데이션이 된 테두리를 만듭니다.

g2.setClip(vOldClip);  
GradientPaint vPaint = new GradientPaint(xx,yy,borderColor,xx,yy+h,borderHighlight);
g2.setPaint(vPaint);
g2.drawRoundRect(xx,yy+1,w-1,h-3,arc,arc);

9. 이렇게 만들어진 컴포넌트를 겹쳐 놓으면 이런식으로 ^^;;
glasscomponent

10. 어때요 참 쉽죠,,, 뭐 대충 이런 스타일의 컴포넌트가 만들어지죠 ^^;;

lastcomponent


Posted by hongiiv

2008/03/17 11:01 2008/03/17 11:01
, , , , , ,
Response
No Trackback , No Comment
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/347

Pierre Lindenbaum(Blog : YOKOFAKUN) 이 분은 프랑스분이신거 같은데 프로필에 보면 바이러스학을 전공하시는걸로 되어있는데,,, Nature Network의 Bioinformatics그룹이나 MyExperiment에서 봤던(?)분이다. 이것저것 참 재미있는 내용이 많은 블로그이고, BioBlogRSS에도 등록되어 구독되고 있는 바로 그 블로그인데,, 여기의 My fNotebook: Apache Tomcat / Bioinformatics의 글에서 누구나가 쉽게 리눅스에서 웹서버를 설치하고 활용하는 방법에 대해서 적어 주셨다. 이 글에서 UCSC의 dbsnp를 가져오는 부분만 발췌해서 보면 다음과 같다.

1. snp 정보가 들어갈 데이터베이스를 생성한다.

mysql -u root -p -D test -e 'create table snp(chrom varchar(10) ,chromStart int not null,chromEnd int not null,name varchar(20) unique not null)'

2. 만든 snp 테이블을 UCSC의 dbsnp 데이터로 채워 넣는다.

mysql -N --user=genome --host=genome-mysql.cse.ucsc.edu -A -D hg18 -e 'select chrom,chromStart,chromEnd,name from snp126 where chrom="chrM" ' |\
gawk -F ' ' '{printf("insert into test.snp(chrom,chromStart,chromEnd,name) values (\"%s\",%s,%s,\"%s\");\n",$1,$2,$3,$4);}' |\
mysql -u login -p

끝. SNP 연구하시거나 할때 유용하게 단 두줄(줄은 좀 길어요 ^^) 잊지 마세요.

Posted by hongiiv

2008/03/03 11:37 2008/03/03 11:37
, ,
Response
No Trackback , No Comment
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/326

R 그래프 그리기

Bioinformatics ZenHow to draw simple graphs in R이라는 글을 보면 R을 이용해서 데이터의 특성에 따라서 데이터를 그래프로 표현하는 방법에 대해서 간단하게 소개되어 있다. 여기서 간단하다는 의미는 짧고 명확하게 그리고 데이터를 어떻게 표현할지에 대해서 막막한 사람들도 고개를 끄덕이며 빠져 들 수 있다는 의미이다. 참 그리고 댓글을 읽다보면 Matlab과 Mathematica의 상용 어플리케이션과 R에 대한 논쟁(?)의 글도 있으니 댓글도 확인해 보세요 ^^;;

우선 "하루에 차(커피)를 얼마나 드십니까?" 라는 질문으로 시작하겠습니다. 이 질문에 마음속으로 대답을 하셨다면 이제 R package와 예제 데이터 파일(zip format)을 다운로드하시고 차한잔을 옆에 두고 천천히 읽어나가시기 바랍니다. ^^

여기서는 다음의 4가지 유형의 데이터를 그래프로 어떻게 표현하는지에 대해서 설명합니다.

1. Categorical data
2. Continuous data
3. Factored categorical data
4. Factored cotinuous data

Categorical data

첫번째로 Categorical data는 이름을 가지고 있으며, 숫자형이 아닌 값을 가지고 있는 경우입니다. 원형, 사각형, 삼각형같은 경우가 되겠죠. 또는 대, 중, 소와 같은 것도 카테고리 데이터에 속하겠습니다. 여기서는 system biology, Functional genomicsm Non-coding RNA의 각각 3가지 연구영역의 연구자들이 하루에 마시는 차의 횟수 데이터를 가지고 진행합니다.

categorical data 파일 categorical.csv를 읽어들인다.

> data <- read.csv("path/to/file/categorical.csv")

ls()를 통해서 data object가 읽어들여진것을 확인한다.

> ls()
[1] "data"

data object는 앞서 말한것과 같이 3개의 바이오인포매틱스 연구영역(이것이 category가 되겠죠)과 이영역의 연구자들이 하루에 얼마나 많은 양의 차를 마시는지에 대한 데이터가 있다.

> head(data)
  Systems.biology Functional.genomics Non.coding.RNA
1               2                   4              5
2               2                   4              7
3               2                   1              7
4               2                   4              5
5               2                   3              5
6               2                   3              4

1,2,3....6이라고 씌어진 첫번째 컬럼은 행번호(row number)이며, 뒤이은 3개의 컬럼이 하루에 마시는 차의 양을 나타낸다. 언뜻 보더라도 Non-coding RNA 연구자들이 꽤 많이 마시는듯..??

자 그럼 categorical 데이터를 어떻게 가시화 시킬것인가? 첫번째로 해야할 일은 데이터를 다른 포맷으로 변경하는 일이다. 첫번째 컬럼에 System biology가 있고 그 이후로 다른 영역의 데이터가 존재하는 형태이다. 이러한 형태를 지금부터 "wide"라고 하겠다. 만약 100개의 연구영역이 존재한다면 100개의 컬럼으로 구성된 넓은 형태로 보여지기 때문이다. 따라서 "long" 포맷의 길다란 모양으로 데이터를 변형시키도록 하겠다.

wide를 long 형태로 변형하기 위해서는 R package의 reshape 패키지를 사용한다. reshape는 R에 기본적으로 포함되지 않기 때문에 요기를 참고해서 패키지를 설치한다. 이제 설치한 패키지를 로드한다.

library(reshape)

그런다음 다음의 명령어로 reshape를 수행한다.

data <- melt(data,measure.var=c("Systems.biology","Functional.genomics","Non.coding.RNA"))

그러면, 다음과 같이 3개의 변수로 구분된 데이터를 long 형태로 확인할 수 있다.

> head(data)
         variable value
1 Systems.biology     2
2 Systems.biology     2
3 Systems.biology     2
4 Systems.biology     2
5 Systems.biology     2
6 Systems.biology     2

첫번째 컬럼은 bioinformatics 타입, 두번째 컬럼은 하루에 먹는 차의 양 형태로 보여준다. 이제 phylogenetics와 같은 다른 연구 영역을 추가하더라도 열만 추가 된다.

이제 어떤 영역의 연구자들이 가장 많이 차를 마시는지 plot을 이용하여 데이터를 보여주도록 하자. 여기서는 lattice라는 R 패키지를 이용할 것이다. lattice 패키지는 기본적으로 R에 포함되어 있기 때문에 별도의 패키지 설치 과정없이 다음과 같이 호출하면 된다.

> library(lattice)

categorical 데이터를 표현하기 위한 가장 좋은 plot은 box and whisker plot이다. lattice의 bwplot(box and whisker plot)을 이용하여 plot을 생성하자.

plot <- bwplot(value ~ variable, data = data)
plot$ylab <- "Cups of Tea per day"
print(plot)

bwplot의 value ~ variable은 R에서의 값,value(즉 하루에 먹은 차의 양)와 변수,variable(바이오인포매틱스 연구분야)를 위미한다. 그 다음의 data=data의 의미는 R에서의 plot을 그리기 위한 데이터가 R 객체 data에 저장되어있다는 것을 의미한다. 그 결과를 plot이라는 R 객체에 넣어둔다. 그 다음 줄인 plot$ylab은 y축의 라벨을 cups of tea per day로 지정하는 것이다. 마지막으로는 print(plot)을 이용해서 plot 객체를 그래픽 디바이스로 출력하라는 의미이다.
r1

이제 이 그래프 하나로 하루에 몇잔의 차를 마시는지 알기 쉽게 볼 수 있게 되었다. system biologists는 정확하게 하루에 2잔씩, functional genomists는 1~5잔을, non-coding RNA-ist는 최대 7잔까지 ^^

Continuous data

앞서서 각 연구 분야별(categorical data) 하루 마시는 차의 양에 대해서 그래프를 그려봤는데, 이번에는 Continuous data에 대해서 알아보도록 하겠습니다. continuous 데이터는 숫자 형식의 데이터이다. 앞서서와 마찬가지로 파일을 읽어 들인다.

> data <- read.csv("path/to/file/continuous.csv")
> head(data)
  distance productivity
1 54.86337     35.05450
2 53.97946     35.66953
3 53.74379     35.00325
4 41.41431     35.23826
5 73.96309     32.07927
6 58.19178     33.35028

이 데이터는 바이오인포매틱스 연구자와 차를 만드는 방까지의 거리와 한 주동안의 생산성을 나타내고 있다. 이 데이터는 이전에 말한 두개의 컬럼으로 이루어져 long 형태의 데이터포맷으로 잘 이루어져 있다.

이러한 두개의 continuous 변수를 가장 잘 비교하기 위한 위한 벙법은 xyplot으로 각각을 축으로 나타내면 된다. 생산성에 대한 "차를 만드는 방까지의 거리"에 대하여 이전과 마찬가지 방법으로 plot을 생성한다. 이때 xyplot 함수와 각각의 x, y축에 대한 라벨을 생성한다.

> plot <- xyplot(productivity ~ distance, data=data)
> plot$xlab <- "Distance to tea making area (feet)"
> plot$ylab <- "Weekly productivity (hours)"
> print(plot)
r2

위의 결과를 통해 차를 만드는 장소가 가까울수록 생산성이 좋아진다는 것을 알 수 있다.  이렇게 만들어진 plot에 (x,y)축 안쪽에 선을 하나 추가하기 위해 "panel"을 한 생성한다.  panle.xyplot을 사용하여 사용자 정의 panel을 추가한다.

> custom_panel_lm <- function(x,y) {
panel.xyplot(x,y)
panle.lmline(x,y)
}

> plot$panel <- custom_panel_lm
> print(plot)

첫번째 function(x,y) x와 y(x,y는 continuous 변수)를 인자로 같는 함수를 정의하고 있다. 이 함수는 두개의 메소드를 호출하고 있는데, 첫번째는 panel.xyplot 함수로 plot을 그리는 함수, 두번째는 x,y 인자를 가지고 선형 추세선을 그린다. 이렇게 만들어진 함수를 이전 plot에 panel을 추가하고 print하면 된다. r3
이제 선을 통해서 거리와 생산성과의 관계를 좀더 확실하게 보여준다. 그럼 데이터의 좀더 정확한(?) 동향을 위해서 좀 울퉁불퉁한 선을 추가하도록 하자.


> custom_panel_loess <- function(x,y) {
panel.xyplot(x,y)
panle.loess(x,y)
}

> plot$panel <- custom_panel_loess
> print(plot)4

Factored categorical data

지금까지 연구자들이 얼마나 많은 양의 차를 마시는지에 대한 추세(??추이, 경향)를 봤다. 그러나 계절에 따라서 이러한 추세를 보고자 한다면, 여름에 비해서 겨울은 어떠한지 말이다. 이것에 대한 데이터가 categorical_categorical.cvs에 있다.

> data <- read.csv("path/to/file/categorical_categorical.csv")
> head(data)
  SB FG ncRNA SB.1 FG.1 ncRNA.1
1  2  2     4    0    1       7
2  2  2     5    0    2       6
3  2  4     6    0    5       8
4  2  4     4    0    3       7
5  2  2     5    0    1       6
6  2  1     4    0    2       8

자 wide형태이 데이터 형태를 가지고 있으며, 첫번째 3개의 컬럼은 겨울철 데이터를 나머지 3개의 컬럼은 여름철의 데이터를 나타내고 있다. 첫번째 categorical 데이터는 연구분야(area of research), 두번째 category는 계절(season)이 된다.

> winter <- data[,1:3]
> summer <- data[,4:6]

> winter <- melt(winter,measure.var=c(”SB”,”FG”,”ncRNA”))
> summer <- melt(summer,measure.var=c(”SB.1″,”FG.1″,”ncRNA.1″))

첫번째로는 long 형태로 바꾸는 작업을 수행해야 한다. 여기서 3개의 컬럼이 필요하다. 하루동안 마시는 차의 양, 연구분야, 계절의 3개의 변수를 사용할것이기 때문이다.

> head(winter)
  variable value
1       SB     2
2       SB     2
3       SB     2
4       SB     2
5       SB     2
6       SB     2

> head(summer)
  variable value
1     SB.1     0
2     SB.1     0
3     SB.1     0
4     SB.1     0
5     SB.1     0
6     SB.1     0

이제 별도의 계절 변수를 추가하기로 한다. 이 변수는 새로운 컬럼으로 등록된다.

> summer <- cbind(summer,season="summer")
> winter <- cbind(winter,season="winter")

cbind는 새로운 컬럼을 추가하는 명령으로, season이라는 컬럼을 만들고 여기에 summer와 winter 값을 각각 넣었다. 다시 winter와 summber 객체를 보면 다음과 같다.

> head(summer)
  variable value season
1     SB.1     0 summer
2     SB.1     0 summer
3     SB.1     0 summer
4     SB.1     0 summer
5     SB.1     0 summer
6     SB.1     0 summer

> head(winter)
  variable value season
1       SB     2 winter
2       SB     2 winter
3       SB     2 winter
4       SB     2 winter
5       SB     2 winter
6       SB     2 winter

이제 새로운 season 컬럼이 생긴것을 확인할 수 있다. 마지막으로 두개의 데이터 세트를 함께 합쳐야 한다.

> data <- rbind(winter,summer)

rbind 는 새로운 행으로 묶으라는 명령이다. 이제 summer 데이터 아래에 winter 데이터가 합쳐졌다. 이제 한가지만 하면 plot을 생성할 수 있다. 여기서 summer 데이터에는 각 연구분야.1 형태로 .1이 붙어 있다. leveles로 변수 컬럼을 살펴보면 다음과 같이 .1이 붙어 있다.

> levels(data$variable)
[1] "SB" "FG" "ncRNA" "SB.1" "FG.1" "ncRNA.1"

이제 .1을 제거하고 처음 나오는 3개의 변수를 대체해보도록 하자.

> levels(data$variable)[4:6] <- levels(data$variable)[1:3]
> levels(data$variable)
[1] "SB" "FG" "ncRNA"

이제 일관된 형태의 이름으로 바뀐것을 확인할 수 있다. 이제 마지막으로 plot을 생성하면 된다.

> plot <- bwplot(value ~ variable | season, data=data)
> plot$ylab <- "Cups of Tea per day"
> print(plot)
r4
그려진 plot은 두개의 서로다른 계절로 분리되어 보여준다. bwplot에서 | season을 통해서 season 변수의 값으로 구분했기 때문이다.

Factored continuous data

마지막 예제는 categorical 변수에 대한 continuous data factored이다. 뭔 소린지. ^^' 여기서는 continuous_categorical.csv를 읽어 들인다.

> data <- read.csv("/path/to/file/continuous_categorical.csv")
> head(data)
      water water.prod       tea tea.prod  hipflask  hf.prod
1 0.4172023   33.99677 0.7731859 31.71567 1.1661047 24.90616
2 0.9628104   40.04022 0.5545423 29.11507 0.3830907 31.74964
3 1.3025050   40.78758 0.9033747 28.75205 1.0460207 29.64453
4 1.3352481   40.19776 1.2515750 28.68057 1.3909051 20.29845
5 0.8253107   38.38265 0.9861313 30.44975 0.2510354 31.51177
6 1.5136886   40.61841 0.9458123 29.50657 1.1346057 25.31571

이 데이터는 물(water), 차(tea), 포켓위스키에 담겨진(contents of a hipflask) 3개의 서로 다른 음료수를 보여주고 있다. 데이터는 두개의 continus 변수로, 음료에 따른 생산성과 categorical 인 음료의 종류를 보여주고 있다. 첫번째로 long 형태로 변환해 보자.

> water <- cbind(data[,1:2],drink="water")
> tea <- cbind(data[,3:4],drink="tea")
> hipflask <- cbind(data[,5:6],drink="hipflask")

데이터 셋을 3개로 나누고 음료의 종류 컬럼을 추가하였다.

> head(water)
      water water.prod drink
1 0.4172023   33.99677 water
2 0.9628104   40.04022 water
3 1.3025050   40.78758 water
4 1.3352481   40.19776 water
5 0.8253107   38.38265 water
6 1.5136886   40.61841 water

> head(tea)
        tea tea.prod drink
1 0.7731859 31.71567   tea
2 0.5545423 29.11507   tea
3 0.9033747 28.75205   tea
4 1.2515750 28.68057   tea
5 0.9861313 30.44975   tea
6 0.9458123 29.50657   tea

각각의 데이터 셋에 대해서 변수 이름이 맞지 않다. 각각을 volume과 productivity로 로 변경한다.

> col.names <- c("volume","productivity")
> names(water)[1:2] <- col.names
> names(tea)[1:2] <- col.names
> names(hipflask)[1:2] <- col.names

이제 3개의 데이터셋을 rbind를 이용해서 하나로 합친다.

> data <- rbind(water,tea,hipflask)
> head(data)
     volume productivity drink
1 0.4172023     33.99677 water
2 0.9628104     40.04022 water
3 1.3025050     40.78758 water
4 1.3352481     40.19776 water
5 0.8253107     38.38265 water
6 1.5136886     40.61841 water

마지막으로 사용자 정의 panel(custom panel)을 생성해서 그래프를 그린다.

> plot <- xyplot(productivity ~ volume | drink, data=data)
> plot$xlab <- "Average volume ingested (litres / day)"
> plot$ylab <- "Weekly productivity (hours)"
> custom_panel <- function(x,y){
panel.xyplot(x,y)
panel.loess(x,y,col=”red”,lty=2)
}

> plot$panel <- custom_panel
> print(plot)
r5




Posted by hongiiv

2008/01/09 11:18 2008/01/09 11:18
, , , , , ,
Response
No Trackback , 2 Comments
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/299

perl

위의 워크플로우는 input으로 받은 내용을 가지고 c:\perl\example\example.txt라는 파일을 만들고 perl스크립트를 통해서 해당 파일을 읽어서 result로 출력하는 워크플로우이다.

뭐 간단한 것이지만 외부 Perl 프로그램을 수행한다는 점이 주목할만하다. Taverna에 대해 이야기 하다가 가장 많이 듣는 부분이 java로만 프로그래밍 할 수 있나요??라는 부분인데, taverna에서는 외부 커맨드라인 기반 어플리케이션을 수행할 수 있는(즉 perl, python, ruby등등 모두 해당) processor가 존재한다.

Available Processor > Local Services > Local Java widgets > io > Execute cmd-line app 프로세서가 바로 그것이다.

execute cmd-line app는 command와 args의 두개의 인자가 존재하는데, command에는 수행할 프로그램명, args에는 이 프로그램에 넘겨줄 인자를 각각 지정하면된다.

c:\perl\example\example.pl이라는 perl 프로그램은 인자로 받은 파일을 읽어서 그대로 출력하는 프로그램이다. 그럼 execute_cmd_line_app의 command에는 c:\perl\example\example.pl, args에는 example.txt를 입력하면, 아래와 같은 결과를 볼 수 있다.

#!/usr/bin/perl

my $exampleFile = $ARGV[0];

open(IN, $exampleFile);

while(my $line = <IN>) {
        chomp $line;
        print $line;
        print "\n";
};

close IN;

워크플로우의 input을 다음과 같이주고,,,
input

실행하고 나면 sample.txt라는 파일이 생기고 example.pl이 수행되고 난 후 다음과 같은 결과를 반환한다.

워크플로우 결과
perl

Posted by hongiiv

2007/11/19 22:04 2007/11/19 22:04
,
Response
No Trackback , No Comment
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/263

Taverna 플러그인 만들기

요즘 Taverna 플러그인 만들기에 푹 빠져 있습니다. 그냥 재미있을것 같다는 생각으로 시작했는데 이놈의 플러그인을 만드려니깐 Taverna의 전체적인 구조를 알아야 했습니다. 덕분에 Taverna의 구조까지 대충 알게 되어버렸으니..ㅋㅋㅋ eclipse의 경우 플러그인을 만드는 책까지 나와 있는 판에 Taverna는 맨땅(물론 문서화는 잘되어있지만 ^^;;)에 헤딩하면서 꾸역꾸역 만들었습니다. 요놈 보면 볼수록 잘 설계되고 잘 만들어졌다는 생각이 듭니다. 그러나 Biopipe는 어떻게 되어 가고 있는건지 매주 아니 매월 Biopipe 소식지 같은거라도 만들어서 배포했으면 좋으려만 어떻게 되어 가는지 궁금해요!!

갑자기 삼천포로 빠져 버렸네,,, 간단하게 Taverna는 SPI(Service Provider Interface)를 통해서 플러그인을 개발을 할 수 있도록 하고 있는데, LocalWorker 인터페이스를 구현하면 Taverna의 Processor 부분에 자신이 원하는 기능을 넣을 수 있고, PerspectiveSPI를 구현하면 Taverna에 UI를 넣을 수 있으며, UIComponentFactorySPI를 구현해서 UI를 직접 만들 수 있도록 되어 있습니다.

직접적인 플러그인 작성법은 이전에도 포스팅했지만 좀더 업그레이드된 버전을 기대하시고, 우선 맛보기로 Taverna에 UI 플러그인을 작성한 예제 스샷입니다.

guiplugin

상단에 Design, Result는 Taverna에 기본적으로 있는거고 그 옆에 질병관리본부 유전체센터는 PerspectiveSPI를 구현한거고, Find Service는 버튼입니다. 무지 크죠 ^^;; 이건 UIComponentFactorySPI를 구현해서 넣은것입니다. 이제 독자적인 기능이나 Taverna와 연동된 기능을 추가하면 정말 멋진 플러그인이 만들어지겠죠 ^ㅇ^/

plugin

플러그인 매니저에 등록된 플러그인


Posted by hongiiv

2007/11/02 11:08 2007/11/02 11:08
, , , , ,
Response
No Trackback , No Comment
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/248

바이오인포매틱스와 웹 서비스

분자생물학이나 바이오인포매틱스와 관련한 도구들이나 데이터베이스에 대한 웹 서비스는 꾸준히 늘어가고 있다. 대표적인 곳으로는 영국의 EMBL-EBI, 미국의 NCBI, 일본의 DDBJ와 PDBJ가 있으며, 그 외에도 연구소나 프로젝트별로 다양한 웹 서비스를 제공하고 있다.


주요 데이터 센터
  • EMBL-EBI, Cambridge, 영국 (http://www.ebi.ac.uk/Tools/webservices)
  • NCBI, 미국 (http://eutils.ncbi.nlm.nih.gov/entrez/query/static/esoap_help.html)
  • DDBJ, 일본 (http://xml.nig.ac.jp/index.html)
  • PDBJ, 일본 (http://pdbj.protein.osaka-u.ac.jp/SOAP)

소규모 연구소나 프로젝트
  • Kanehisa Laboratory, Kyoto, 일본 (http://www.genome.jp/kegg/soap/)
  • myGrid, Manchester, 영국 (http://phoebus.cs.man.ac.uk:8081/axis/)
  • University of Toronto, 캐나다 (http://soap.bind.ca/)
  • Broad Institute, Harvard/MIT, 미국 (http://www.broad.mit.edu/cancer/genecruiser/webServiceMain.jsp)
  • Genomics and Bioinformatics Group: Laboratory of Molecular Pharmacology, 미국 (http://discover.nci.nih.gov/gominer/goservice.jsp)
  • Virginia Bioinformatics Institute, 미국 (http://staff.vbi.vt.edu/pathport/services/)

EMBL-EBI

영국의 Hinxton에 위치한 EBI(European Bioinformatics Institute)는 EMBL(European Molecular Biology Laboratory, 유럽분자생물실험실)의 산하 기관으로 Bioinformatics에 관한 연구를 수행과 정보를 제공하고 있다. EBI에서는 EMBL DB, SWISS-PROT DB, PDB 등의 생물학 데이터베이스를 제고하고 있는데, 이러한 데이터베이스의 데이터를 검색(retrieval)하고 분석하기 위한 도구들을 웹 서비스로 제공하고 있으며, <표 1>은 EBI에서 제공하고 있는 웹 서비스 리스트로 이 외에도 많은 서비스들을 제공하고 있다.

표 1. EBI에서 제공하는 웹 서비스의 주요 서비스 목록
사용자 삽입 이미지

표 2. WSDbfecth로 검색 가능한 주요 데이터베이스
사용자 삽입 이미지

<리스트 1>은 WSDbfetch 서비스를 호출하는 Python 클라이언트로 uniprot 데이터베이스로부터 slpi_human에 대한 서열 정보를 raw 형태의 fasta 포맷으로 가져오는 코드이다. Python을 통해서 웹 서비스를 호출하기 위해서는 SOAPpy와 fpconst 패키지가 설치되어야 한다. 출력되는 결과는 raw 형태외에도 html 형태를 지원하고 있으며, fasta 포맷과 uniprot 고유 포맷을 지원하므로 인자를 바꾸어 가면서 호출해볼수 있다.


리스트 1. Python로 작성된 WSDbfetch 웹 서비스 클라이언트 (wsdbfetch.py)

      #!/opt/local/bin/python
      from SOAPpy import WSDL
      dbfetch = WSDL.Proxy("http://www.ebi.ac.uk/Tools/webservices/wsdl/WSDbfetch.wsdl")
      resultList = dbfetch.fetchData("uniprot:slpi_human","fasta","raw")
      for result in resultList:
       print result


리스트 2. WSDbfetch 웹 서비스 호출 결과

      # ./wsdbfetch.py
      >uniprot|P03973|SLPI_HUMAN Antileukoproteinase precursor (ALP) (Secretory leukocyte protease inhibitor) (HUSI-1) (Seminal proteinase inhibitor) (BLPI) (Mucus proteinase inhibitor) (MPI) (WAP four-disulfide core domain protein 4) (Protease inhibitor WAP4).
      MKSSGLFPFLVLLALGTLAPWAVEGSGKSFKAGVCPPKKSAQCLRYKKPECQSDWQCPGK
     KRCCPDTCGIKCLDPVDTPNPTRRKPGKCPVTYGQCLMLNPPNFCEMDGQCKRDLKCCMG
      MCGKSCVSPVKA

서열정렬(Sequence alignment)은 단백질 서열이나 핵산 서열 사이의 상관 관계를 나타내는 것으로 관심 대상의 서열과 유사성이 높은 서열을 찾아 그 서열의 기능을 유추하거나 관련되는 서열 사이의 진화적 연관성 같은 것을 예측하기 위해서 사용된다. 이러한 서열 정렬 방법에는 BLAST(The Basic Local Alignment Search Tool)나 FASTA 등의 프로그램들이 있다. BLAST 프로그램은 크게 <표 3>과 같이 질의 서열과 대상 데이터베이스에 따라 blastn, blastp, blastx,tblastn, tblastx로 구분된다.

표 3. BLAST 프로그램
사용자 삽입 이미지

<리스트 3>는 WSDbfetch의 결과로 가져온 단백질 서열에 대하여 Blast를 수행하는 코드로 데이터베이스는 단백질 데이터베이스인 SWISS-PROT, blastp 프로그램, 자신의 이메일주소를 인자로 사용한다. 실제 BLAST 작업을 수행하는 runNCBIBlast 메소드를 호출하면 해당 Blast 작업에 대한 job id를 할당 받게 된다. 추후 이 job id를 통해서 poll 메소드를 호출하여 해당 blast 작업의 결과를 가져올 수 있다.

표 4. WSNCBIBlast에서 사용 가능한 데이터베이스
사용자 삽입 이미지

리스트 3. Python으로 작성된 WSNCBIBlast 웹 서비스 클라이언트 (blast.py)

      #!/opt/local/bin/python

      import sys
      from SOAPpy import WSDL

      seq = ""
      dbfetch = WSDL.Proxy("http://www.ebi.ac.uk/Tools/webservices/wsdl/WSDbfetch.wsdl")
      dbfetch_resultList = dbfetch.fetchData("uniprot:slpi_human","fasta","raw")
      for dbfetch_result in dbfetch_resultList:
       seq = seq +  dbfetch_result +"\n"

      print seq

      blast_wsdUrl='http://www.ebi.ac.uk/Tools/webservices/wsdl/WSNCBIBlast.wsdl'
      server = WSDL.Proxy(blast_wsdUrl)

      blast_params = {'program':'blastp',
                     'database':'swissprot',
                     'email':'hongiiv@gmail.com',
                     'async':0}
      blast_data = [{'type':'sequence',
                    'content':seq}]
      jobid = server.runNCBIBlast(params=blast_params,content=blast_data)

      print jobid + "\n"

      sys.stdout.flush()
      result = server.poll(jobid,'tooloutput')

      print result

Posted by hongiiv

2007/10/19 09:10 2007/10/19 09:10
, , ,
Response
No Trackback , No Comment
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/244

Building Web Service with Netbeans and JAX-WS 2

외국에서는 distributed computational environment 즉, grid나 cluster 환경과 자신의 연구분야에 어떻게 적용하고 어떠한 서비스를 할것인지에 대해 오래전부터 꾸준하게 연구가 진행되고 있다. Bioinformatics, Immunoiformatics등 bio~분야도 예외가 아니다. 앞서 언급했었던 biomoby, biogrid, taverna, bioclipse 등이 그 활용 분야의 대표적인 예라고 할 수 있겠다.

그럼 분산 컴퓨팅환경에서 blast를 수행하고 이를 웹 서비스를 통해서 제공한다면, 이미 많은 곳에서(일본의 XML Central of DDBJ, 유럽의 EBI에서 제공하고 있다.) 서비스를 제공하고 있지만, 나도 한번 해보자는 의미에서 차근차근 공부해 나가고 있다.

그럼 우선 첫번째로 웹서비스부터 어떻게 만드는지 알아보면, 웹서비스에 제일 중요한 것은 어떠한 서비스를 할것인지에 대한 WSDL을 생성하는 것이겠다. 물론 자동으로 WSDL을 생성해서 사용하는 방법 이게 상향식인가? 하향식인가? 암튼 이번에는 WSDL을 손수 작성하고 wsimport를 통해서 뼈대를 만든 후 이를 구현하도록 하겠다.

Picture 2.jpg

결과부터 보자면 현재 두개의 웹서비스를 제공하고 있는 모습을 볼 수 있을 것이다. 첫번째 Hello서비스는 입력 받은 문자열에 대해서 앞에 Hello라는 문자열을 덧붙여서 보여주는 서비스고, 두번쨰 AddNumbers는 입력받은 두개의 숫자의 합을 보여주는 서비스이다. 아주 간단한 웹 서비스이지만, 이 두개의 예제를 잘 익혀두면 blast 웹 서비스쯤이야... ^^;;


blast02.png
완성된 Blast Web Service

Blast를 수행할 프로그램(blastp), 데이터베이스(nr), 결과포맷(xml=7)를 입력으로 받아서 Blat를 수행하고(runPbs) 수행된 Blast가 끝나길 기다리고(checkStatus) 작업이 끝나면 결과를 받아오는(getResult) 순서로 작성된 Blast web service 다이어그램 ^^



Posted by hongiiv

2007/08/03 15:35 2007/08/03 15:35
, , , , , , , ,
Response
No Trackback , No Comment
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/213

Building Web Service with Netbeans and JAX-WS 1

입력 받은 두 개의 숫자를 더한값을 보여주는 웹서비스를 생성하고 이를 Taverna에서 호출하여 클라이언트까지 완성한 모습 ^^;;

=====AddNubmersImpl.java=====

package my.sample.server;

import javax.jws.WebService;
import wsimport.generated.addnumbers.*;

/**
 * A simple java class to implement a web service. Until the
 * endpoint interface has been generated, the class declaration
 * below will show up as a compiler error.
 */
@WebService(endpointInterface="wsimport.generated.addnumbers.AddNumbersPortType")
public class AddNumbersImpl implements AddNumbersPortType {

    public void oneWayInt(int arg0) {
        System.out.println("received value "+arg0);
    }
   
    public int addNumbers(int arg0,int arg1) throws AddNumbersFault_Exception {
        if (arg0<0 || arg1<0) throw new AddNumbersFault_Exception("negative number",new AddNumbersFault());
        return arg0+arg1;
    }
   
}

Taverna 다이어그램
AddNumbers

Posted by hongiiv

2007/08/03 15:10 2007/08/03 15:10
, , ,
Response
No Trackback , No Comment
RSS :
http://socmaster.homelinux.org/~hongiiv/rss/response/212



야후 블로그 벳지


Site Stats

Total hits:
291448
Today:
55
Yesterday:
166