如何利用BioJava设置一个BLAST解析器解析BLAST结果

评论1,601

一个生物信息学常遇到的任务是BLAST搜索。Biojava能够解析哪些"BLAST"类型的输出,比如Blast或者HMMER的输出。Biojava在这里使用了基于SAX事件处理的方法,通过设置监听器来解析这些输出。基本的流程如下:

Blast输出 -> 生成SAX事件 -> 转化SAX事件 -> 创建结果对象 -> 将结果对象存储在链表中

输入流 -> BLAST类型的SAX解析器(BLASTLikeSAXParser) -> 序列相似性适配器(SeqSimilartyAdapter) -> Blast类型搜索创建器(BlastLikeSearchBuilder) -> 链表(List)

使用这个API可以非常灵活,但下面的例子可以很方便的获得你想要的结果。

[code lang="java"]
import java.io.*;
import java.util.*;

import org.biojava.bio.program.sax.*;
import org.biojava.bio.program.ssbind.*;
import org.biojava.bio.search.*;
import org.biojava.bio.seq.db.*;
import org.xml.sax.*;
import org.biojava.bio.*;

public class BlastParser {
// args[0] 为Blast输出文件
public static void main(String[] args){
try{
// 以流的方式得到Blast输出
InputStream is = new FileInputStream(args[0]);

// 创建一个Blast类型的SAX解析器
BlastLikeSAXParser parser = new BlastLikeSAXParser();

// 创建一个可以将事件传送给句柄的SAX事件适配器
SeqSimilarityAdapter adapter = new SeqSimilarityAdapter();

// 给parser设置SAX事件适配器
parser.setContentHandler(adapter);

// 保存序列相似性搜索结果(SeqSimilaritySearchResults)的链表
List results = new ArrayList();

// 创建在结果链表(Results List)中生成序列相似性搜索结果对象的搜索内容句柄(SearchContentHandler)
SearchContentHandler builder = new BlastLikeSearchBuilder(results,
new DummySequenceDB("queries"), new DummySequenceDBInstallation());

// 解析文件,序列相似性搜索结果填充到结果链表
parser.parse(new InputSource(is));

// 输出一些Blast细节
for (Iterator i = results.iterator(); i.hasNext(); ){
SeqSimilaritySearchResult result = (SeqSimilaritySearchResult)i.next();
Annotation anno = result.getAnnotation();

for(Iterator j = anno.keys().iterator(); j.hasNext(); ){
Object key = j.next();
Object property = anno.getProperty(key);
System.out.println(key+" : "+property);
}
System.out.println("Hits: ");

// 列出匹配
for (Iterator k = result.getHits().iterator(); k.hasNext(); ){
SeqSimilaritySearchHit hit = (SeqSimilaritySearchHit)k.next();
System.out.println("\tmatch: "+hit.getSubjectID());
System.out.println("\te score: "+hit.getEValue());
}

System.out.println("\n");
}

}
catch (SAXException ex) {
//XML 出问题
ex.printStackTrace();
}catch (IOException ex) {
//IO 出问题,例如文件找不到
ex.printStackTrace();
}
}
}
[/code]

发表评论

匿名网友