BioPerl使用手册讲解学习
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BioPerl使用手册第一弹—Bio::SeqIO篇
注:本手册假设你已经拥有了一定的Perl编程经验,对个中术语(terms)不再进行赘述。
1.让我们开始吧
为了让第一次使用本手册的同志们在刚开始就有成功的喜悦,这里给出一个例子,大家准备好自己手中的fasta 文件吧!
请在文本编辑器中写入如下程序,并在终端运行:
#! /usr/bin/perl –w
use strict;
use Bio::SeqIO;
my $file = “*********”; # Please use your path to replace the starts
my $seqio_object = Bio::SeqIO -> new(-file = $file);
my $seq_obj = $seqio_object -> next_seq;
printf “$seq_obj\n”;
如果你成功键入了以上程序并且没有报错发生,那么屏幕上面就会正常显示出你的fasta序列。
那么恭喜你,你已经成功调用了BioPerl的模块,并且完成了一个面对对象的程序。
下面我们就来看一下我们第一个认识的BioPrel 的模块Bio::SeqIO。
2.关于Bio::SeqIO的那些事儿
在介绍Bio::SeqIO之前,先来说一下为什么会产生BioPerl这个东西。
在生物信息学起步之初Prel语言强悍的字符串处理能力以及执行效率,毫无疑问的被各位从计算机和数学行业转行过来的“生物学家”选为工具语言(在生物信息数据处理方面放眼望去毫无疑问是Perl语言的天下,近来对大规模数据的处理方面R语言亦有崛起之势)。
但是,对于这海量的数据,同样丰富多彩的数据格式以及花样繁多的数据分析;每次处理数据都要重新自己编写正则表达式未免效率过于低下。
于是,在Perl一次重大的更新之后(引入面对对象编程,后面都将使用OOP代替面对对象编程),几个不太勤快的学生物的程序员看到了通用编程的可能,于是就有了我们现在广泛应用的BioPerl。
那我们就来说说这个Bio::SeqIO以及它的姊妹模块Bio::Seq。
我们为什么要使用Bio::SeqIO和Bio::Seq模块呢?其原因非常简单,就是因为这两个模块其实就是一个非常非常智能的文件句柄。
Bio::SeqIO可以根据你的输入文件类型抽取出所需要的信息,而Bio::Seq则可以按照格式要求储存数据信息。
就拿GenBank的flat file文件来讲,其中的feature等信息都是分门别类的进行储存。
在这里说也不容易理解,下面我们直接上程序来说明。
3.Bio::SeqIO支持的文件格式
Bio::SeqIO几乎涵盖所有常见的生物学数据库的通用文档格式,并且可以很好的对格式进行转换,有如此方便的功能,全仰仗于Perl语言本身所具有的强悍的字符串处理能力。
注意:bioperl-ext以及io_lib库文件对于支持scf, abi, alf, pln, exp, ctf, ztr格式是不可或缺的。
下面我们就用例子来说话,来看一下Bio::SeqIO是如何将一个复杂的文件储存在对象(OOP的概念)中方便处理的。
4.方法大全
4.1.next_seq
首先来看代码如下所示:
# print out accession numbers of all entries in a GenBank flat file.
# first, bring in the SeqIO module
use Bio::SeqIO;
# Notice that you do not have to use any Bio:SeqI
# objects, because SeqIO does this for you. In fact, it
# even knows which SeqI object to use for the provided
# format.
# Bring in the file and format, or die with a nice
# usage statement if one or both arguments are missing.
my$usage="getaccs.pl file format\n";
my$file=shift or die$usage;
my$format=shift or die$usage;
# Now create a new SeqIO object to bring in the input
# file. The new method takes arguments in the format
# key => value, key => value. The basic keys that it
# can accept values for are '-file' which expects some
# information on how to access your data, and '-format'
# which expects one of the Bioperl-format-labels mentioned
# above. Although it is optional, it is good
# programming practice to provide > and < in front of any
# filenames provided in the -file parameter. This makes the
# resulting filehandle created by SeqIO explicitly read (<)
# or write(>). It will definitely help others reading your
# code understand the function of the SeqIO object.
my$inseq= Bio::SeqIO->new(
-file =>"<$file",
-format=>$format,
);
# Now that we have a seq stream,
# we need to tell it to give us a $seq.
# We do this using the 'next_seq' method of SeqIO.
while(my$seq=$inseq->next_seq){
print$seq->accession_number,"\n";
}
不知各位是否看出来以上代码的功能了吗?没错,其功能就是读取一个输入的一定格式文件的Accession Number。
没有自己设计的正则表达式,不需要自行找出文件的规律,更不用每次都重新写一个处理文本的程序。
需要做的就是关注你所需要的重点信息,SeqIO模块的next_seq方法来搞定其他的东西。
至于程序中各变量的含义,待我细细分解,就是一些OOP的概念,多加揣摩就能看懂以后的关于OOP的程序啦。
首先来看$inseq,这个变量就可以理解为一个object/instance,new方法或函数建立的一个模块SeqIO的对象,模块中的方法都可以用于对这个对象进行处理。
而next_seq就这之中的诸多方法之一。
基本的语法结构就是“对象–> 方法(instance –> method)”的形式。
next_seq完成的动作就是取出文件中的一个entry的全部内容,然后根据需求找出你想要的数据就行了,比如Accession Number。
4.2.write_seq
看下面一个将一个格式的文件转为另外一个格式的程序:
use Bio::SeqIO;
# get command-line arguments, or die with a usage statement
my$usage="x2y.pl infile infileformat outfile outfileformat\n";
my$infile=shift or die$usage;
my$infileformat=shift or die$usage;
my$outfile=shift or die$usage;
my$outfileformat=shift or die$usage;
# create one SeqIO object to read in,and another to write out
my$seq_in= Bio::SeqIO->new(
-file =>"<$infile",
-format=>$infileformat,
);
my$seq_out= Bio::SeqIO->new(
-file =>">$outfile",
-format=>$outfileformat,
);
# write each entry in the input file to the output file
while(my$inseq=$seq_in->next_seq){
$seq_out->write_seq($inseq);
}
通过上一个例子,现在就可以知道了,write_seq是对象$seq_out的一个方法,这个方法有一个变量,那就是$inseq,$inseq则是通过对象$seq_in的方法next_seq获得的。
有点乱哈,不过仔细揣摩一下,对OOP加深一下认识。
这里
就不用自己设计需要输出什么了。
因为,要输出的信息已经通过next_seq方法获得了。
In the end
至此Bio::SeqIO模块的两个主要方法已经介绍完了,其方法内各种参数的意义,请见本篇附表。
下一弹,Bio::Seq 模块以及translation的应用,敬请期待!。