perl如何分离NR NT库

perl如何分离NR NT库

这篇文章主要为大家展示了“perl如何分离NR NT库”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“perl如何分离NR NT库”这篇文章吧。

分离NR NT库,快速blast本地比对同源注释基因

perl如何分离NR NT库

我们需要对自己的基因做注释,需要blast同源比对NCBI当中的NR NT库;通常做无参转录组,会组织出10几万的unigene ,如果比对全库的话,就太浪费时间了,我们可以根据NCBI的分类数据库将数据库分开,可下载如下文件,然后利用下面的perl脚本就可以把NR或者NT库分开成小库:

wget-cftp://ftp.ncbi.nlm.nih.gov/blast/db/FASTA/nr.gzwget-cftp://ftp.ncbi.nlm.nih.gov/blast/db/FASTA/nt.gzwget-cftp://ftp.ncbi.nlm.nih.gov/pub/taxonomy/gi_taxid_nucl.dmp.gzwget-cftp://ftp.ncbi.nlm.nih.gov/pub/taxonomy/gi_taxid_prot.dmp.gzwget-cftp://ftp.ncbi.nlm.nih.gov/pub/taxonomy/taxdump.tar.gz

perl脚本如下,由于脚本会把分类文件全部读入内存,所有脚本内存消耗较大,建议确保100G以上的内存空间:

#Thegi_taxid_nucl.dmpisabout160MBandcontainstwocolumns:thenucleotide'sgiandtaxid.#Thegi_taxid_prot.dmpisabout17MBandcontainstwocolumns:theprotein'sgiandtaxid.#Divisionsfile(division.dmp):#divisionid--taxonomydatabasedivisionid#divisioncde--GenBankdivisioncode(threecharacters)#divisionname--e.g.BCT,PLN,VRT,MAM,PRI...#comments#0|BCT|Bacteria||#1|INV|Invertebrates||#2|MAM|Mammals||#3|PHG|Phages||#4|PLN|PlantsandFungi||#5|PRI|Primates||#6|ROD|Rodents||#7|SYN|SyntheticandChimeric||#8|UNA|Unassigned|Nospeciesnodesshouldinheritthisdivisionassignment|#9|VRL|Viruses||#10|VRT|Vertebrates||#11|ENV|Environmentalsamples|Anonymoussequencescloneddirectlyfromtheenvironment|#nodes.dmpfileconsistsoftaxonomynodes.Thedescriptionforeachnodeincludesthefollowing#fields:#tax_id--nodeidinGenBanktaxonomydatabase#parenttax_id--parentnodeidinGenBanktaxonomydatabase#rank--rankofthisnode(superkingdom,kingdom,...)#emblcode--locus-nameprefix;notunique#divisionid--seedivision.dmpfile#inheriteddivflag(1or0)--1ifnodeinheritsdivisionfromparent#geneticcodeid--seegencode.dmpfile#inheritedGCflag(1or0)--1ifnodeinheritsgeneticcodefromparent#mitochondrialgeneticcodeid--seegencode.dmpfile#inheritedMGCflag(1or0)--1ifnodeinheritsmitochondrialgencodefromparent#GenBankhiddenflag(1or0)--1ifnameissuppressedinGenBankentrylineage#hiddensubtreerootflag(1or0)--1ifthissubtreehasnosequencedatayet#comments--free-textcommentsandcitationsdie"perl$0<division.dmp><nodes.dmp><gi_taxid_n/p.dmp><nr.fa/nt.fa><od>"unless(@ARGV==5);useMath::BigFloat;useBio::SeqIO;useBio::Seq;useData::Dumper;usePerlIO::gzip;useFileHandle;useCwdqw(abs_pathgetcwd);if($ARGV[3]=~/gz$/){open$Fa,"<:gzip","$ARGV[3]"ordie"$!";}else{open$Fa,"$ARGV[3]"ordie"$!";}my$od=$ARGV[4];$od||=getcwd;$od=abs_path($od);unless(-d$od){mkdir$od;}my$in=Bio::SeqIO->new(-fh=>$Fa,-format=>'Fasta');my%division2name=();openIN,"$ARGV[0]"ordie"$!";while(<IN>){chomp;my($taxid,$name)=split(/\s+\|\s+/);$division2name{$taxid}=$name;}close(IN);my%fout=();formy$i(keys%division2name){my$FO=FileHandle->new(">$od/$division2name{$i}.fa");my$out=Bio::SeqIO->new(-fh=>$FO,-format=>'Fasta');$fout{$i}=$out;}print"$ARGV[0]readed\n";#printDumper(\%fout);#printDumper(\%division2name);openIN,"$ARGV[1]"ordie"$!";my%taxid2division=();while(<IN>){chomp;my@tmp=split(/\s+\|\s+/);$taxid2division{$tmp[0]}=$tmp[4];#lastif$.>100;}close(IN);print"$ARGV[1]readed\n";my%gi2taxid=();openIN,"$ARGV[2]"ordie"$!";while(<IN>){chomp;my@tmp=split(/\s+/);$gi2taxid{$tmp[0]}=$tmp[1];#lastif$.>100;}close(IN);print"$ARGV[2]readed\n";#printDumper(\%gi2taxid);while(my$seq=$in->next_seq()){my$id=$seq->id;my($gi)=($id=~/gi\|(\d+)\|ref\|/);if(exists($gi2taxid{$gi})andexists($taxid2division{$gi2taxid{$gi}})){$fout{$taxid2division{$gi2taxid{$gi}}}->write_seq($seq);}else{print"unknowngi:$gi\n";}}formy$i(keys%fout){$fout{$i}->close();}

以上是“perl如何分离NR NT库”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注恰卡编程网行业资讯频道!

发布于 2022-03-19 21:11:06
收藏
分享
海报
0 条评论
34
上一篇:css如何实现文字的水平居中 下一篇:python如何计算一个数值的二进制数中有多少个1
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码