<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>生信菜鸟团 &#187; bwa</title>
	<atom:link href="http://www.bio-info-trainee.com/tag/bwa/feed" rel="self" type="application/rss+xml" />
	<link>http://www.bio-info-trainee.com</link>
	<description>欢迎去论坛biotrainee.com留言参与讨论，或者关注同名微信公众号biotrainee</description>
	<lastBuildDate>Sat, 28 Jun 2025 14:30:13 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.33</generator>
	<item>
		<title>GATK使用注意事项</title>
		<link>http://www.bio-info-trainee.com/838.html</link>
		<comments>http://www.bio-info-trainee.com/838.html#comments</comments>
		<pubDate>Mon, 06 Jul 2015 23:27:05 +0000</pubDate>
		<dc:creator><![CDATA[ulwvfje]]></dc:creator>
				<category><![CDATA[生信基础]]></category>
		<category><![CDATA[bwa]]></category>
		<category><![CDATA[gatk]]></category>
		<category><![CDATA[picard]]></category>
		<category><![CDATA[samtools]]></category>
		<category><![CDATA[snp]]></category>

		<guid isPermaLink="false">http://www.bio-info-trainee.com/?p=838</guid>
		<description><![CDATA[GATK这个软件在做snp-calling的时候使用率非常高，因为之前一直是简单 &#8230; <a href="http://www.bio-info-trainee.com/838.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>GATK这个软件在做snp-calling的时候使用率非常高，因为之前一直是简单粗略的看看snp情况而已，所以没有具体研究它。</p>
<p>这些天做一些外显子项目以找snp为重点，所以想了想还是用起它，报错非常多，调试了好久才成功。</p>
<p>所以记录一些注意事项!</p>
<p>GATK软件本身是受版权保护的，所以需要申请才能下载使用，大家自己去broad institute申请即可。</p>
<p>下载软件就可以直接使用，java软件不需要安装，但是需要你的机器上面有java，当然软件只是个开始，重点是你还得下载很多配套数据，<a href="https://software.broadinstitute.org/gatk/download/bundle" target="_blank">https://software.broadinstitute.org/gatk/download/bundle</a>（ps:这个链接可能会失效，下面的文件，请自己谷歌找到地址哈。），而且这个时候要明确你的参考基因组版本了！！！ <span style="color: #ff6600;">b36/b37/hg18/hg19/hg38，记住b37和hg19并不是完全一样的，有些微区别哦！！！</span><br />
<span id="more-838"></span></p>
<p>比如我选择了hg19</p>
<p>第一点是hg19的下载：这个下载地址非常多，常用的就是NCBI，ensembl和UCSC了，但是这里推荐用这个脚本下载</p>
<p>for i in $(seq 1 22) X Y M;</p>
<p>do echo $i;</p>
<p>wget http://hgdownload.cse.ucsc.edu/goldenPath/hg19/chromosomes/chr${i}.fa.gz;</p>
<p>done</p>
<p>gunzip *.gz</p>
<p>for i in $(seq 1 22) X Y M;</p>
<p>do cat chr${i}.fa &gt;&gt; hg19.fasta;</p>
<p>done</p>
<p>rm -fr chr*.fasta</p>
<p>看得懂shell脚本的应该知道这是一个个的下载hg19的染色体，再用cat按照染色体的顺序拼接起来，因为GATK后面的一些步骤对染色体顺序要求非常变态，如果下载整个hg19，很难保证染色体顺序是1-22，X,Y,M。如下</p>
<p>然后需要对下载的hg19进行索引（bwa和samtools）和建立dict文件（用picard）</p>
<p>bwa index -a bwtsw hg19.fasta</p>
<p>samtools faidx hg19.fasta</p>
<p>然后还要下载几个参考文件，这个是可以选择的.</p>
<p>对我的hg19来说，就应该是去，ftp://ftp.broadinstitute.org/bundle/hg19/ 下载咯。</p>
<p><strong><span style="color: #ff6600;">最后，所有必备的文件如下：</span></strong></p>
<p>231M Jul 2 05:14 1000G_phase1.indels.hg19.sites.vcf<br />
1.2M Jul 2 10:45 1000G_phase1.indels.hg19.sites.vcf.idx<br />
11G Jul 2 08:05 dbsnp_138.hg19.vcf<br />
2.5K Jul 1 04:31 hg19.dict<br />
3.0G Jun 30 21:29 hg19.fasta<br />
6.6K Jun 30 22:54 hg19.fasta.amb<br />
944 Jun 30 22:54 hg19.fasta.ann<br />
2.9G Jun 30 22:54 hg19.fasta.bwt<br />
788 Jul 2 01:53 hg19.fasta.fai<br />
739M Jun 30 22:54 hg19.fasta.pac<br />
1.5G Jun 30 23:23 hg19.fasta.sa<br />
87M Jul 2 05:37 Mills_and_1000G_gold_standard.indels.hg19.sites.vcf<br />
2.3M Jul 2 10:45 Mills_and_1000G_gold_standard.indels.hg19.sites.vcf.idx</p>
<p>&nbsp;</p>
<p>接下来开始跑程序</p>
<p>第一步就是生成sam文件啦bwa mem -t 12 -M  hg19.fasta tmp*fq &gt;tmp.sam</p>
<p>第二步是sort，我用的是picard工具java  -Xmx100g -jar AddOrReplaceReadGroups.jar I=tmp.sam  O=tmp.sorted.bam</p>
<p>SORT_ORDER=coordinate</p>
<p>CREATE_INDEX=true</p>
<p>RGID=tmp</p>
<p>RGLB="pe"</p>
<p>RGPU="HiSeq-2000"</p>
<p>RGSM=PC3-2</p>
<p>RGCN="Human Genetics of Infectious Disease"</p>
<p>RGDS=hg19 RGPL=illumina</p>
<p>VALIDATION_STRINGENCY=SILENT</p>
<p>第三步是去除PCR重复，我还是选择用picard工具</p>
<p>java  -Xmx100g  -jar MarkDuplicates.jar</p>
<p>CREATE_INDEX=true REMOVE_DUPLICATES=True</p>
<p>ASSUME_SORTED=True VALIDATION_STRINGENCY=LENIENT</p>
<p>I=tmp.sorted.bam OUTPUT=tmp.dedup.bam METRICS_FILE=tmp.metrics</p>
<p>第四步是终于要开始用GATK啦，主要是确定要进行重新比对的区域，这个步骤分成三个小步骤：</p>
<p>首先用RealignerTargetCreator找到需要重新比对的区域，输出文件intervals</p>
<p>java -Xmx200g -jar ~/apps/gatk/GenomeAnalysisTK.jar</p>
<p>-R hg19.fasta  #这里需要用这个参考基因组，所以参考基因组特别重要，DICT也要按照流程生成</p>
<p>-T RealignerTargetCreator</p>
<p>-I tmp.dedup.bam -o tmp.intervals</p>
<p>-known /home/ldzeng/EXON/ref/1000G_phase1.indels.hg19.sites.vcf</p>
<p>这一步骤好像非常耗时</p>
<p>&nbsp;</p>
<p>可以看到，我总共就测试了5014个reads，结果就花了近半个小时才搞定，只有947个reads被过滤了。</p>
<p>输出的tmp.intervals 文件是一个1404946行的文件</p>
<p>chr1:13957-13958</p>
<p>chr1:46402-46403</p>
<p>chr1:47190-47191</p>
<p>chr1:52185-52188</p>
<p>chr1:53234-53236</p>
<p>chr1:55249-55250</p>
<p>chr1:63735-63738</p>
<p>人的外显子只有二三十万，所以我暂时也不确定这个文件是什么！</p>
<p>&nbsp;</p>
<p>然后用输出的 tmp.intervals 做输入文件来进行重新比对，也就是用IndelRealigner在这些区域内进行重新比对</p>
<p>java -Xmx150g -jar ~/apps/gatk/GenomeAnalysisTK.jar \</p>
<p>-R hg19.fasta \</p>
<p>-T IndelRealigner \</p>
<p>-targetIntervals tmp.intervals \</p>
<p>-I tmp.dedup.bam -o tmp.dedup.realgn.bam \</p>
<p>-known /home/ldzeng/EXON/ref/1000G_phase1.indels.hg19.sites.vcf</p>
<p>&nbsp;</p>
<p>我只需要它的重新比对，所以后面的一些功能没有怎么用，一个是call snp，一个是算比对质量值</p>
<p>java -Xmx200g -jar ~apps/gatk/GenomeAnalysisTK.jar</p>
<p>-nct 20 -T HaplotypeCaller -R hg19.fasta</p>
<p>-I tmp.dedup.realgn.bam</p>
<p>-o tmp.gatk.vcf</p>
<p>最后输出的文件如下</p>
<p>639K Jul 5 10:17 tmp1.fq<br />
639K Jul 5 10:19 tmp2.fq<br />
1.5M Jul 5 10:26 tmp.dedup.bai<br />
403K Jul 5 10:26 tmp.dedup.bam<br />
12K Jul 5 12:02 tmp.gatk.vcf<br />
3.4K Jul 5 12:02 tmp.gatk.vcf.idx<br />
32M Jul 5 11:24 tmp.intervals<br />
950 Jul 5 10:26 tmp.metrics<br />
1.5M Jul 5 11:31 tmp.realgn.bai<br />
409K Jul 5 11:31 tmp.realgn.bam<br />
1.6M Jul 5 10:20 tmp.sam<br />
1.5M Jul 5 10:23 tmp.sorted.bai<br />
399K Jul 5 10:23 tmp.sorted.bam</p>
<p>&nbsp;</p>
<p>备注：GATK对基因组要求一个字典文件</p>
<p>使用picard工具包的CreateSequenceDictionary.jar生成。以hg19.fa为例，生成的命令为：</p>
<div>    java -Xmx2g -jar /path_to_picard/CreateSequenceDictionary.jar R=hg19.fa O=hg19.dict</div>
]]></content:encoded>
			<wfw:commentRss>http://www.bio-info-trainee.com/838.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bowtie 算法第四讲</title>
		<link>http://www.bio-info-trainee.com/646.html</link>
		<comments>http://www.bio-info-trainee.com/646.html#comments</comments>
		<pubDate>Sat, 18 Apr 2015 11:51:18 +0000</pubDate>
		<dc:creator><![CDATA[ulwvfje]]></dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[bowtie]]></category>
		<category><![CDATA[bwa]]></category>
		<category><![CDATA[bwt]]></category>

		<guid isPermaLink="false">http://www.bio-info-trainee.com/?p=646</guid>
		<description><![CDATA[由于之前就简单的看了看bowtie作者的ppt，没有完全吃透就开始敲代码了，写了 &#8230; <a href="http://www.bio-info-trainee.com/646.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>由于之前就简单的看了看bowtie作者的ppt，没有完全吃透就开始敲代码了，写了十几个程序最后我自己都搞不清楚进展到哪一步了，所以我现在整理一下，从新开始！！！</p>
<p>&nbsp;</p>
<p>首先，bowtie的作用就是在一个大字符串里面搜索一个小字符串！那么本身就有一个非常笨的复杂方法来搜索，比如，大字符串长度为100万，小字符串为10，那么就依次取出大字符串的10个字符来跟小字符串比较即可，这样的算法是非常不经济的，我简单用perl代码实现一下。</p>
<p>[perl]</p>
<p>#首先读取大字符串的fasta文件</p>
<p>open FH ,&quot;&lt;$ARGV[0]&quot;;</p>
<p>$i=0;</p>
<p>while (&lt;FH&gt;) {</p>
<p>next if /^&gt;/;</p>
<p>chomp;</p>
<p>$a.=(uc);</p>
<p>}</p>
<p>#print &quot;$a\n&quot;;</p>
<p>#然后接受我们的小的查询字符串</p>
<p>$query=uc $ARGV[1];</p>
<p>$len=length $a;</p>
<p>$len_query=length $query;</p>
<p>$a=$a.'$'.$a;</p>
<p>#然后依次循环取大字符串来精确比较！</p>
<p>foreach (0..$len-1){</p>
<p>if (substr($a,$_,$len_query) eq $query){</p>
<p>print &quot;$_\n&quot;;</p>
<p>#last;</p>
<p>}</p>
<p>}</p>
<p>[/perl]</p>
<p>&nbsp;</p>
<p>这样在时间复杂度非常恐怖，尤其是对人的30亿碱基。</p>
<p>&nbsp;</p>
<p>正是因为这样的查询效率非常低，所以我们才需要用bwt算法来构建索引，然后根据tally来进行查询</p>
<p>其中构建索引有三种方式，我首先讲最效率最低的那种索引构造算法，就是依次取字符串进行旋转，然后排序即可。</p>
<p>[perl]</p>
<p>$a=uc $ARGV[0];</p>
<p>$len=length $a;</p>
<p>$a=$a.'$'.$a;</p>
<p>foreach (0..$len){</p>
<p>$hash{substr($a,$_,$len+1)}=$_;</p>
<p>}</p>
<p>#print &quot;$_\t$hash{$_}\n&quot; foreach sort keys %hash;</p>
<p>print  substr($_,-1),&quot;\t$hash{$_}\n&quot; foreach sort keys %hash;</p>
<p>[/perl]</p>
<p>这个算法从时间复杂度来讲是非常经济的，对小字符串都是瞬间搞定！！！</p>
<p>perl rotation_one_by_one.pl atgcgtanngtc 这个字符串的BWT矩阵索引如下！</p>
<p>C 12</p>
<p>T 6</p>
<p>$ 0</p>
<p>T 11</p>
<p>G 3</p>
<p>T 2</p>
<p>C 4</p>
<p>N 9</p>
<p>N 8</p>
<p>A 7</p>
<p>G 5</p>
<p>G 10</p>
<p>A 1</p>
<p>但同样的，它也有一个无法避免的弊端，就是内存消耗太恐怖。对于30亿的人类碱基来说，这样旋转会生成30亿乘以30亿的大矩阵，一般的服务器根本hold不住的。</p>
<p>&nbsp;</p>
<p>最后我讲一下，这个BWT矩阵索引如何还原成原字符串，这个没有算法的差别，因为就是很简单的原理。</p>
<p>[perl]</p>
<p>#first read the tally !!!</p>
<p>#首先读取上面输出的BWT矩阵索引文件。</p>
<p>open FH,&quot;&lt;$ARGV[0]&quot;;</p>
<p>$hash_count{'A'}=0;</p>
<p>$hash_count{'C'}=0;</p>
<p>$hash_count{'G'}=0;</p>
<p>$hash_count{'T'}=0;</p>
<p>while(&lt;FH&gt;){</p>
<p>        chomp;</p>
<p>        @F=split;</p>
<p>        $hash_count{$F[0]}++;</p>
<p>        $hash{$.}=&quot;$F[0]\t$F[1]\t$hash_count{$F[0]}&quot;;</p>
<p>#print &quot;$hash{$.}\n&quot;;</p>
<p>}</p>
<p>$all_a=$hash_count{'A'};        </p>
<p>$all_c=$hash_count{'C'};        </p>
<p>$all_g=$hash_count{'G'};        </p>
<p>$all_t=$hash_count{'T'};</p>
<p>$all_n=$hash_count{'N'};</p>
<p>#start from the first char !</p>
<p>$raw='';</p>
<p>&amp;restore(1);</p>
<p>sub restore{</p>
<p>my($num)=@_;</p>
<p>my @F=split/\t/,$hash{$num};</p>
<p>$raw.=$F[0];</p>
<p>   my $before=$F[0];</p>
<p>     if ($before eq 'A') { </p>
<p>$new=$F[2]+1;</p>
<p>        }</p>
<p>        elsif ($before eq 'C') {</p>
<p>               $new=1+$all_a+$F[2];</p>
<p>        }</p>
<p>        elsif ($before eq 'G') {</p>
<p>               $new=1+$all_a+$all_c+$F[2];</p>
<p>        }</p>
<p>elsif ($before eq 'N') {</p>
<p>                $new =1+$all_a+$all_c+$all_g+$F[2];</p>
<p>        }</p>
<p>        elsif ($before eq 'T') {</p>
<p>                $new=1+$all_a+$all_c+$all_g+$all_n+$F[2];</p>
<p>        }</p>
<p>        elsif ($before eq '$') {</p>
<p>chop $raw;</p>
<p>                $raw = reverse $raw;</p>
<p>print &quot;$raw\n&quot;;</p>
<p>exit;</p>
<p>        }</p>
<p>else {die &quot;error !!! we just need A T C N G !!!\n&quot;}</p>
<p>#print &quot;$F[0]\t$new\n&quot;;</p>
<p>&amp;restore($new);</p>
<p>}</p>
<p>[/perl]</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bio-info-trainee.com/646.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Snp-calling流程（BWA+SAMTOOLS+BCFTOOLS）</title>
		<link>http://www.bio-info-trainee.com/439.html</link>
		<comments>http://www.bio-info-trainee.com/439.html#comments</comments>
		<pubDate>Mon, 23 Mar 2015 12:20:25 +0000</pubDate>
		<dc:creator><![CDATA[ulwvfje]]></dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[基础数据库]]></category>
		<category><![CDATA[基础数据格式]]></category>
		<category><![CDATA[bowtie]]></category>
		<category><![CDATA[bwa]]></category>
		<category><![CDATA[samtools]]></category>
		<category><![CDATA[snp]]></category>

		<guid isPermaLink="false">http://www.bio-info-trainee.com/?p=439</guid>
		<description><![CDATA[比对可以选择BWA或者bowtie，测序数据可以是单端也可以是双端，我这里简单讲 &#8230; <a href="http://www.bio-info-trainee.com/439.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>比对可以选择BWA或者bowtie，测序数据可以是单端也可以是双端，我这里简单讲一个，但是脚本都列出来了。而且我选择的是bowtie比对，然后单端数据。</p>
<p>首先进入hg19的目录，对它进行两个索引</p>
<p>samtools faidx hg19.fa</p>
<p>Bowtie2-build hg19.fa hg19</p>
<p>我这里随便从26G的测序数据里面选取了前1000行做了一个tmp.fa文件，进入tmp.fa这个文件的目录进行操作</p>
<p>Bowtie的使用方法详解见http://www.bio-info-trainee.com/?p=398</p>
<p>bowtie2 -x ../../../ref-database/hg19 -U <b> tmp1.fa -S tmp1.sam</b></p>
<p>samtools view -bS <b>tmp1.sam &gt; tmp1.bam</b></p>
<p>samtools sort <b>tmp1.bam tmp1.sorted</b></p>
<p>samtools <b>index tmp1.sorted.bam </b></p>
<p>samtools mpileup -d 1000  -gSDf   ../../../ref-database/hg19.fa  tmp1.sorted.bam |bcftools view -cvNg -  &gt;<b>tmp1.vcf</b></p>
<p><b>然后就能看到我们产生的vcf变异格式文件啦！</b></p>
<p><b> </b></p>
<p><b>当然，我们可能还需要对VCF文件进行再注释！</b></p>
<p><b>要看懂以上流程及命令，需要掌握BWA，bowtie，samtools，bcftools，</b></p>
<p><b>数据格式fasta，fastq，sam，vcf，pileup</b></p>
<p>&nbsp;</p>
<p>如果是bwa把参考基因组索引化，然后aln得到后缀树，然后sampe对双端数据进行比对</p>
<p>首先bwa index 然后选择算法，进行索引。</p>
<p>然后aln脚本批量处理</p>
<p>==&gt; bwa_aln.sh &lt;==</p>
<p>while read id</p>
<p>do</p>
<p>echo $id</p>
<p>bwa aln hg19.fa $id &gt;$id.sai</p>
<p>done &lt;$1</p>
<p>然后sampe脚本批量处理</p>
<p>==&gt; bwa_sampe.sh &lt;==</p>
<p>while read id</p>
<p>do</p>
<p>echo $id</p>
<p>bwa sampe hg19.fa $id*sai $id*single &gt;$id.sam</p>
<p>done &lt;$1</p>
<p>然后是samtools的脚本</p>
<p>==&gt; samtools.sh &lt;==</p>
<p>while read id</p>
<p>do</p>
<p>echo $id</p>
<p>samtools view -bS $id.sam &gt; $id.bam</p>
<p>samtools sort $id.bam $id.sorted</p>
<p>samtools index $id.sorted.bam</p>
<p>done &lt;$1</p>
<p>然后是bcftools的脚本</p>
<p>==&gt; bcftools.sh &lt;==</p>
<p>while read id</p>
<p>do</p>
<p>echo $id</p>
<p>samtools mpileup -d 1000  -gSDf  ref.fa $id*sorted.bam |bcftools view -cvNg -  &gt;$id.vcf</p>
<p>done &lt;$1</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>==&gt; mpileup.sh &lt;==</p>
<p>while read id</p>
<p>do</p>
<p>echo $id</p>
<p>samtools mpileup -d 100000 -f hg19.fa $id*sorted.bam &gt;$id.mpileup</p>
<p>done &lt;$1</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bio-info-trainee.com/439.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>自己动手写bowtie第一讲：BWT算法详解并建立索引</title>
		<link>http://www.bio-info-trainee.com/409.html</link>
		<comments>http://www.bio-info-trainee.com/409.html#comments</comments>
		<pubDate>Fri, 20 Mar 2015 12:27:42 +0000</pubDate>
		<dc:creator><![CDATA[ulwvfje]]></dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[计算机基础]]></category>
		<category><![CDATA[bowtie]]></category>
		<category><![CDATA[bwa]]></category>

		<guid isPermaLink="false">http://www.bio-info-trainee.com/?p=409</guid>
		<description><![CDATA[首先，什么是BWT，可以参考博客 http://www.cnblogs.com/ &#8230; <a href="http://www.bio-info-trainee.com/409.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>首先，什么是BWT，可以参考博客</p>
<p><a href="http://www.cnblogs.com/xudong-bupt/p/3763814.html">http://www.cnblogs.com/xudong-bupt/p/3763814.html</a></p>
<p>他讲的非常好。</p>
<p>一个长度为n的串A1A2A3...An经过旋转可以得到</p>
<p>A1A2A3...An</p>
<p>A2A3...AnA1</p>
<p>A3...AnA1A2</p>
<p>...</p>
<p>AnA1A2A3...</p>
<p>n个串，每个字符串的长度都是n。</p>
<p>对这些字符串进行排序，这样它们之前的顺序就被打乱了，打乱的那个顺序就是index，需要输出。</p>
<p>首先我们测试一个简单的字符串acaacg$,总共六个字符，加上一个$符号，下次再讲$符号的意义。</p>
<p><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/BWT算法详解之一建立索引348.png"><img class="alignnone size-full wp-image-410" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/BWT算法详解之一建立索引348.png" alt="BWT算法详解之一建立索引348" width="402" height="524" /></a></p>
<p>实现以上功能是比较简单的，代码如下</p>
<p><img class="alignnone size-full wp-image-411" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/BWT算法详解之一建立索引563.png" alt="BWT算法详解之一建立索引563" width="379" height="358" /></p>
<p>但是这是对于6个字符串等小片段字符串，如果是是几千万个字符的字符串，这样转换就会输出千万的平方个字符串组成的正方形数组，是很恐怖的数据量。所以在转换的同时就不能把整个千万字符储存在内存里面。</p>
<p>在生物学领域，是这样的，这千万个 千万个碱基的方阵，我们取每个字符串的前20个字符串就足以对它们进行排序，当然这只是近视的，我后面会讲精确排序，而且绕过内存的方法。</p>
<p>Perl程序如下</p>
<p>[perl]</p>
<p>while (&lt;&gt;){</p>
<p>next if /&gt;/;</p>
<p>chomp;</p>
<p>$a.=$_;</p>
<p>}</p>
<p>$a.='$';</p>
<p>$len=length $a;</p>
<p>$i=0;</p>
<p>print &quot;first we transform it !!!\n&quot;;</p>
<p>foreach (0..$len-1){</p>
<p>$up=substr($a,0,$_);</p>
<p>$down=substr($a,$_);</p>
<p>#print &quot;$down$up\n&quot;;</p>
<p>#$hash{&quot;$down$up&quot;}=$i;</p>
<p>$key=substr(&quot;$down$up&quot;,0,20);</p>
<p>$key=$key.”\t”.substr(&quot;$down$up&quot;,$len-1);</p>
<p>$hash{$key}=$i;</p>
<p>$i++;</p>
<p>}</p>
<p>print &quot;then we sort it\n&quot;;</p>
<p>foreach  (sort keys  %hash){</p>
<p>$first=substr($_,0,1);</p>
<p>$len=length;</p>
<p>$last=substr($_,$len-1,1);</p>
<p>#print &quot;$first\t$last\t$hash{$_}\n&quot;;</p>
<p>print &quot;$_\t$hash{$_}\n&quot;;</p>
<p>}</p>
<p>[/perl]</p>
<p>运行的结果如下</p>
<p><img class="alignnone size-full wp-image-412" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/BWT算法详解之一建立索引1289.png" alt="BWT算法详解之一建立索引1289" width="554" height="158" /></p>
<p>个人觉得这样排序是极好的，但是暂时还没想到如何解决不够精确的问题！！！</p>
<p>参考：</p>
<p><a href="http://tieba.baidu.com/p/1504205984">http://tieba.baidu.com/p/1504205984</a></p>
<p><a href="http://www.cnblogs.com/xudong-bupt/p/3763814.html">http://www.cnblogs.com/xudong-bupt/p/3763814.html</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bio-info-trainee.com/409.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
