GO是一個同源蛋白的數據庫,按照三大類別BP(生物學過程), MF(分子功能), CC(細胞組分) 對基因的產物-蛋白質進行了分類;
在GO數據庫中,本質上是一個有向無環圖的數據結構,在三大類別之下,又有小的分類層級,一層一層的分類下去;
對於某個具體的GO號來說,代表了一組同源蛋白,擁有相似的結構和功能,在數據庫中,有上層分類的GO,也可能在這個GO下面,還有其他的GO
為了直觀的展示某個GO號的分類,利用數據庫提供的go-basic.obo 文件得到不同GO之間的層級關系,然后用Graphviz 進行可視化
首先下載go-basic.obo 文件, 到GO官網 http://geneontology.org/page/download-ontology

選擇下載go-basic.obo 文件
wget http://purl.obolibrary.org/obo/go/go-basic.obo
觀察obo 文件
[Term] id: GO:0000001 name: mitochondrion inheritance namespace: biological_process def: "The distribution of mitochondria, including the mitochondrial genome, into daughter cells after mitosis or meiosis, mediated by interaction synonym: "mitochondrial inheritance" EXACT [] is_a: GO:0048308 ! organelle inheritance is_a: GO:0048311 ! mitochondrion distribution
其核心是Term , 每個Term 下記錄了一個具體的GO, name 是對該GO的簡單描述,namespace 是值該GO 屬於三大類別中的哪一個,def 是詳細的描述信息, is_a 記錄了該GO 對應的上層分類的GO
根據每個GO的is_a的信息,就可以得到所有GO之間的相互關系,利用程序處理,對於某個具體的GO,就可以得到其對應的所有上層分類,然后整理成Graphviz 識別的dot 文件,進行可視化
具體的代碼如下:
#!/usr/bin/env perl my ($obo, $go) = @ARGV; my %nodes = (); my %edges = (); local $/ = "[Term]"; open OBO, $obo or die "Can't open $obo!\n"; while (<OBO>) { chomp; my ($node) = $_ =~ /id:\s+(\S+)/; next if not defined $node; my ($name) = $_ =~ /name:\s+(.+?)\n/; my $label = qq{"$node\\n$name"}; $node =~ s/://; $nodes{$node} = $label; my @edge = $_ =~ /is_a:\s+(GO:\d+)/; foreach my $x (@edge) { $x =~ s/://; push @{$edges{$node}}, $x; } } close OBO; my @val = @{$edges{$go}}; my @node = (); my @edge = (); push @node, $go; my $start = $go; while (@val) { my $id = shift @val; push @node, $id; push @edge, qq{$id -> $start;}; foreach my $x (@{$edges{$id}}) { push @val, $x; } $start = $id; } print qq{digraph go\{\n}; foreach my $x (@node) { print qq{$x\[label = $nodes{$x}\];\n}; } foreach my $x (@edge) { print qq{$x\n}; } print qq{\}};
運行的命令如下:
perl parse_go.pl go-basic.obo GO0002485 > GO0002485.dot
如果使用GO:0002485 這種作為結點的名字,Graphviz 不能夠正確識別,所以我把冒號統一替換掉了,生成的GO0002485的內容如下:
digraph go{
GO0002485[label = "GO:0002485\nantigen processing and presentation of endogenous peptide antigen via MHC class I via ER pathway, TAP-dependent"];
GO0002484[label = "GO:0002484\nantigen processing and presentation of endogenous peptide antigen via MHC class I via ER pathway"];
GO0019885[label = "GO:0019885\nantigen processing and presentation of endogenous peptide antigen via MHC class I"];
GO0002474[label = "GO:0002474\nantigen processing and presentation of peptide antigen via MHC class I"];
GO0048002[label = "GO:0048002\nantigen processing and presentation of peptide antigen"];
GO0019882[label = "GO:0019882\nantigen processing and presentation"];
GO0002376[label = "GO:0002376\nimmune system process"];
GO0008150[label = "GO:0008150\nbiological_process"];
GO0002484 -> GO0002485;
GO0019885 -> GO0002484;
GO0002474 -> GO0019885;
GO0048002 -> GO0002474;
GO0019882 -> GO0048002;
GO0002376 -> GO0019882;
GO0008150 -> GO0002376;
}
最后用Graphviz 進行可視化
dot -T pdf GO0002485.dot -o GO0002485.pdf
效果圖如下:

這里全部采用了默認的格式,其實還可以在這個基礎上再修改樣式,使圖片更加的美觀;
