<?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; bowtie</title>
	<atom:link href="http://www.bio-info-trainee.com/tag/bowtie/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>Bowtie算法第六讲-tally法对bwt索引进行搜索</title>
		<link>http://www.bio-info-trainee.com/650.html</link>
		<comments>http://www.bio-info-trainee.com/650.html#comments</comments>
		<pubDate>Sat, 18 Apr 2015 14:46:04 +0000</pubDate>
		<dc:creator><![CDATA[ulwvfje]]></dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[bowtie]]></category>
		<category><![CDATA[bwt]]></category>
		<category><![CDATA[tally]]></category>

		<guid isPermaLink="false">http://www.bio-info-trainee.com/?p=650</guid>
		<description><![CDATA[因为要讲搜索，所以我选择了一个长一点的字符串来演示多种情况的搜索 perl ro &#8230; <a href="http://www.bio-info-trainee.com/650.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>因为要讲搜索，所以我选择了一个长一点的字符串来演示多种情况的搜索</p>
<p>perl rotation_one_by_one.pl atgtgtcgtagctcgtnncgt</p>
<p>程序运行的结果如下</p>
<p>$ATGTGTCGTAGCTCGTNNCGT 21</p>
<p>AGCTCGTNNCGT$ATGTGTCGT 9</p>
<p>ATGTGTCGTAGCTCGTNNCGT$ 0</p>
<p>CGT$ATGTGTCGTAGCTCGTNN 18</p>
<p>CGTAGCTCGTNNCGT$ATGTGT 6</p>
<p>CGTNNCGT$ATGTGTCGTAGCT 13</p>
<p>CTCGTNNCGT$ATGTGTCGTAG 11</p>
<p>GCTCGTNNCGT$ATGTGTCGTA 10</p>
<p>GT$ATGTGTCGTAGCTCGTNNC 19</p>
<p>GTAGCTCGTNNCGT$ATGTGTC 7</p>
<p>GTCGTAGCTCGTNNCGT$ATGT 4</p>
<p>GTGTCGTAGCTCGTNNCGT$AT 2</p>
<p>GTNNCGT$ATGTGTCGTAGCTC 14</p>
<p>NCGT$ATGTGTCGTAGCTCGTN 17</p>
<p>NNCGT$ATGTGTCGTAGCTCGT 16</p>
<p>T$ATGTGTCGTAGCTCGTNNCG 20</p>
<p>TAGCTCGTNNCGT$ATGTGTCG 8</p>
<p>TCGTAGCTCGTNNCGT$ATGTG 5</p>
<p>TCGTNNCGT$ATGTGTCGTAGC 12</p>
<p>TGTCGTAGCTCGTNNCGT$ATG 3</p>
<p>TGTGTCGTAGCTCGTNNCGT$A 1</p>
<p>TNNCGT$ATGTGTCGTAGCTCG 15</p>
<p>它的BWT及索引是</p>
<p>T 21</p>
<p>T 9</p>
<p>$ 0</p>
<p>N 18</p>
<p>T 6</p>
<p>T 13</p>
<p>G 11</p>
<p>A 10</p>
<p>C 19</p>
<p>C 7</p>
<p>T 4</p>
<p>T 2</p>
<p>C 14</p>
<p>N 17</p>
<p>T 16</p>
<p>G 20</p>
<p>G 8</p>
<p>G 5</p>
<p>C 12</p>
<p>G 3</p>
<p>A 1</p>
<p>G 15</p>
<p>然后得到它的tally文件如下</p>
<p><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/04/图片1.png"><img class="alignnone size-full wp-image-651" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/04/图片1.png" alt="图片1" width="418" height="423" /></a></p>
<p>接下来用我们的perl程序在里面找字符串</p>
<p>第一次我测试 GTGTCG 这个字符串，程序可以很清楚的看到它的查找过程。</p>
<p>perl search_char.pl    GTGTCG   tm.tally</p>
<p>your last char is G</p>
<p>start is 7 ; and end is 13</p>
<p>now it is number 5 and the char is C</p>
<p>start is 3 ; and end is 6</p>
<p>now it is number 4 and the char is T</p>
<p>start is 17 ; and end is 19</p>
<p>now it is number 3 and the char is G</p>
<p>start is 10 ; and end is 11</p>
<p>now it is number 2 and the char is T</p>
<p>start is 19 ; and end is 20</p>
<p>now it is number 1 and the char is G</p>
<p>start is 11 ; and end is 12</p>
<p>It is just one perfect match !</p>
<p>The index is 2</p>
<p>第二次我测试一个多重匹配的字符串GT，在原字符串出现了五次的</p>
<p>perl search_char.pl  GT  tm.tally</p>
<p>your last char is T</p>
<p>start is 15 ; and end is 22</p>
<p>now it is number 1 and the char is G</p>
<p>start is 8 ; and end is 13</p>
<p>we find more than one perfect match!!!</p>
<p>8 13</p>
<p>One of the index is 11</p>
<p>One of the index is 10</p>
<p>One of the index is 19</p>
<p>One of the index is 7</p>
<p>One of the index is 4</p>
<p>One of the index is 2</p>
<p>One of the index is 14</p>
<p>惨了，这个是很严重的bug，不知道为什么，对于多个匹配总是会多出那么一点点的结果。</p>
<p>去转换矩阵里面查看，可知，前面两个结果11和10是错误的。</p>
<p>CTCGTNNCGT$ATGTGTCGTAG 11</p>
<p>GCTCGTNNCGT$ATGTGTCGTA 10</p>
<p>GT$ATGTGTCGTAGCTCGTNNC 19</p>
<p>GTAGCTCGTNNCGT$ATGTGTC 7</p>
<p>GTCGTAGCTCGTNNCGT$ATGT 4</p>
<p>GTGTCGTAGCTCGTNNCGT$AT 2</p>
<p>GTNNCGT$ATGTGTCGTAGCTC 14</p>
<p>最后我们测试未知字符串的查找。</p>
<p>perl search_char.pl ACATGTGT tm.tally</p>
<p>your last char is T</p>
<p>start is 15 ; and end is 22</p>
<p>now it is number 7 and the char is G</p>
<p>start is 8 ; and end is 13</p>
<p>now it is number 6 and the char is T</p>
<p>start is 19 ; and end is 21</p>
<p>now it is number 5 and the char is G</p>
<p>start is 11 ; and end is 12</p>
<p>now it is number 4 and the char is T</p>
<p>start is 20 ; and end is 21</p>
<p>now it is number 3 and the char is A</p>
<p>start is 2 ; and end is 3</p>
<p>now it is number 2 and the char is C</p>
<p>start is 3 ; and end is 3</p>
<p>we can just find the last 6 char ,and it is ATGTGT</p>
<p>原始字符串是ATGTGTCGTAGCTCGTNNCGT，所以查找的挺对的！！！</p>
<p>&nbsp;</p>
<p>[perl]</p>
<p>$a=$ARGV[0];</p>
<p>$a=uc $a;</p>
<p>open FH,&quot;&lt;$ARGV[1]&quot;;</p>
<p>while(&lt;FH&gt;){</p>
<p>chomp;</p>
<p>@F=split;</p>
<p>$hash_count_atcg{$F[0]}++;</p>
<p>$hash{$.}=$_;</p>
<p># the first line is $ and the last char and the last index !</p>
<p>}</p>
<p>$all_a=$hash_count_atcg{'A'};</p>
<p>$all_c=$hash_count_atcg{'C'};</p>
<p>$all_g=$hash_count_atcg{'G'};</p>
<p>$all_n=$hash_count_atcg{'N'};</p>
<p>$all_t=$hash_count_atcg{'T'};</p>
<p>#print &quot;$all_a\t$all_c\t$all_g\t$all_t\n&quot;;</p>
<p>$len_a=length $a;</p>
<p>$end_a=$len_a-1;</p>
<p>#print &quot;your query is $a\n&quot;;</p>
<p>#print &quot;and the length of your query is $len_a \n&quot;;</p>
<p>$after=substr($a,$end_a,1);</p>
<p>#we fill search your query from the last char !</p>
<p>if ($after eq 'A') {</p>
<p>$start=2;</p>
<p>$end=$all_a+1;</p>
<p>}</p>
<p>elsif ($after eq 'C') {</p>
<p>$start=$all_a+1;</p>
<p>$end=$all_a+$all_c+1;</p>
<p>}</p>
<p>elsif ($after eq 'G') {</p>
<p>$start=$all_a+$all_c+1;</p>
<p>$end=$all_a+$all_c+$all_g+1;</p>
<p>}</p>
<p>elsif ($after eq 'T'){</p>
<p>$start=$all_a+$all_c+$all_g+$all_n+1;</p>
<p>$end=$all_a+$all_c+$all_g+$all_t+$all_n+1;</p>
<p>}</p>
<p>else {die &quot;error !!! we just need A T C G !!!\n&quot;}</p>
<p>print &quot;your last char is $after\n &quot;;</p>
<p>print &quot;start is $start ; and end is $end \n&quot;;</p>
<p>foreach (reverse (1..$end_a)){</p>
<p>$after=substr($a,$_,1);</p>
<p>$before=substr($a,$_-1,1);</p>
<p>($start,$end)=&amp;find_level($after,$before,$start,$end);</p>
<p>print &quot;now it is number $_ and the char is $before \n &quot;;</p>
<p>print &quot;start is $start ; and end is $end \n&quot;;</p>
<p>if ($_  &gt; 1 &amp;&amp; $start == $end) {</p>
<p>$find_char=substr($a,$_);</p>
<p>$find_len=length $find_char;</p>
<p>print &quot;we can just find the last $find_len char ,and it is $find_char \n&quot;;</p>
<p>#return &quot;miss&quot;;</p>
<p>last;</p>
<p>}</p>
<p>if ($_ == 1) {</p>
<p>if (($end-$start)==1) {</p>
<p>print &quot;It is just one perfect match ! \n&quot;;</p>
<p>my @F_start=split/\s+/,$hash{$end};</p>
<p>print &quot;The index is $F_start[1]\n&quot;;</p>
<p>#return $F_start[1];</p>
<p>last;</p>
<p>}</p>
<p>else {</p>
<p>print &quot;we find more than one perfect match!!!\n&quot;;</p>
<p>print &quot;$start\t$end\n&quot;;</p>
<p>foreach  (($start-1)..$end) {</p>
<p>my @F_start=split/\s+/,$hash{$_};</p>
<p>print &quot;One of the index is $F_start[1]\n&quot;;</p>
<p>}</p>
<p>#return &quot;multiple&quot;;</p>
<p>last;</p>
<p>}</p>
<p>}</p>
<p>}</p>
<p>sub find_level{</p>
<p>my($after,$before,$start,$end)=@_;</p>
<p>my @F_start=split/\s+/,$hash{$start};</p>
<p>my @F_end=split/\s+/,$hash{$end};</p>
<p>if ($before eq 'A') {</p>
<p>return ($F_start[2]+1,$F_end[2]+1);</p>
<p>}</p>
<p>elsif ($before eq 'C') {</p>
<p>return ($all_a+$F_start[3]+1,$all_a+$F_end[3]+1);</p>
<p>}</p>
<p>elsif ($before eq 'G') {</p>
<p>return ($all_a+$all_c+1+$F_start[4],$all_a+$all_c+1+$F_end[4]);</p>
<p>}</p>
<p>elsif ($before eq 'T') {</p>
<p>return ($all_a+$all_c+$all_g+$all_n+1+$F_start[5],$all_a+$all_c+$all_g+1+$all_n+$F_end[5]);</p>
<p>}</p>
<p>else {die &quot;error !!! we just need A T C G !!!\n&quot;}</p>
<p>}</p>
<p>[/perl]</p>
<p>&nbsp;</p>
<p>原始字符串是atgtgtcgtagctcgtnncgt</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bio-info-trainee.com/650.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>自己动手写bowtie第三讲：序列查询。</title>
		<link>http://www.bio-info-trainee.com/511.html</link>
		<comments>http://www.bio-info-trainee.com/511.html#comments</comments>
		<pubDate>Sat, 28 Mar 2015 02:24:31 +0000</pubDate>
		<dc:creator><![CDATA[ulwvfje]]></dc:creator>
				<category><![CDATA[perl]]></category>
		<category><![CDATA[bowtie]]></category>
		<category><![CDATA[bwt]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://www.bio-info-trainee.com/?p=511</guid>
		<description><![CDATA[查询需要根据前面建立的索引来做。 这是一个比较复杂的过程，我也是看了bowtie &#8230; <a href="http://www.bio-info-trainee.com/511.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>查询需要根据前面建立的索引来做。</p>
<p><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/BWT算法第二讲532.png"><img class="alignnone size-full wp-image-506" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/BWT算法第二讲532.png" alt="BWT算法第二讲532" width="554" height="427" /></a></p>
<p>这是一个比较复杂的过程，我也是看了bowtie的作者的ppt才慢慢弄懂的，感觉自己也不可能三言两语就说清楚，一般都是辅助图片，动画，再经过多方交流才能慢慢理解。</p>
<p>所以大家呢，就自己去看ppt，看懂那个查询算法。（ppt及代码在我的群里面有共享，欢迎大家加群交流）</p>
<p>这里我简单讲讲我的程序</p>
<p>首先读取索引文件，统计好A,C,G,T的总数</p>
<p>然后把查询序列从最后一个字符往前面回溯。</p>
<p>我创建了一个子函数，专门来处理回溯的问题</p>
<p>每次接受四个参数（左右两端的碱基，上下的阈值），并返回两个参数（新的上下两个阈值）</p>
<p><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/自己动手写bowtie之三序列查询261.png"><img class="alignnone size-full wp-image-512" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/自己动手写bowtie之三序列查询261.png" alt="自己动手写bowtie之三序列查询261" width="554" height="225" /></a></p>
<p>大家要看懂阈值是如何更新迭代，这样动态的一个个回溯字符串，一个个迭代阈值。</p>
<p>直到四种临界情况的出现。</p>
<p><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/自己动手写bowtie之三序列查询477.png"><img class="alignnone size-full wp-image-513" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/自己动手写bowtie之三序列查询477.png" alt="自己动手写bowtie之三序列查询477" width="554" height="342" /></a></p>
<p>第一是上下阈值已经相等了，但是我们还没有回溯完全，那就说明字符串只能查找后几个字符，前面还有字符是无法匹配的</p>
<p>第二种情况是上下阈值已经相等了，正巧我们也回溯到了最后一个字符串，那么我们就找到了精确匹配。</p>
<p>第三种情况是已经进行到了最后一个字符串，但是上下阈值还有差值，那么就找到了多个精确匹配点。</p>
<p>最后一种情况是各种非法字符。</p>
<p>然后我简单的测序了一下在病毒的5K基因组里面的精确匹配情况，好像效果还挺好的</p>
<p><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/自己动手写bowtie之三序列查询518.png"><img class="alignnone size-full wp-image-514" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/自己动手写bowtie之三序列查询518.png" alt="自己动手写bowtie之三序列查询518" width="554" height="391" /></a></p>
<p>但是在酵母里面还有一个问题没有解决，就是取前二十个字符串排序的问题，不够精确，需要重新审视排序结果进行局部优化，可能是需要用堆排序发，具体我还得考虑一个星期，只能等下周上课再看看了，平时太忙了，基本没时间码代码。</p>
<p>这里贴上我的代码给大家看看，</p>
<p>[perl]</p>
<p>$a='CGCTATGTACTGGATGCGCTGGCAAACGAGCCTGCCGTAAG';</p>
<p>while(&lt;&gt;){</p>
<p>chomp;</p>
<p>@F=split;</p>
<p>$hash_count_atcg{$F[0]}++;</p>
<p>$hash{$.}=$_;</p>
<p>}</p>
<p>$all_a=$hash_count_atcg{'A'};</p>
<p>$all_c=$hash_count_atcg{'C'};</p>
<p>$all_g=$hash_count_atcg{'G'};</p>
<p>$all_t=$hash_count_atcg{'T'};</p>
<p>#print &quot;$all_a\t$all_c\t$all_g\t$all_t\n&quot;;</p>
<p>$len_a=length $a;</p>
<p>$end_a=$len_a-1;</p>
<p>print &quot;your query is $a\n&quot;;</p>
<p>print &quot;and the length of your query is $len_a \n&quot;;</p>
<p>foreach (reverse (0..$end_a)){</p>
<p>$after=substr($a,$_,1);</p>
<p>$before=substr($a,$_-1,1);</p>
<p>#对第一个字符进行找阈值的时候，我们需要人为的定义起始点！</p>
<p>if($_ == $end_a){</p>
<p>if ($after eq 'A') {</p>
<p>$start=1;</p>
<p>$end=$all_a;</p>
<p>}</p>
<p>elsif ($after eq 'C') {</p>
<p>$start=$all_a+1;</p>
<p>$end=$all_a+$all_c;</p>
<p>}</p>
<p>elsif ($after eq 'G') {</p>
<p>$start=$all_a+$all_c+1;</p>
<p>$end=$all_a+$all_c+$all_g;</p>
<p>}</p>
<p>elsif ($after eq 'T'){</p>
<p>$start=$all_a+$all_c+$all_g+1;</p>
<p>$end=$all_a+$all_c+$all_g+$all_t;</p>
<p>}</p>
<p>else {print &quot;error !!! we just need A T C G !!!\n&quot;;exit;}</p>
<p>}</p>
<p>#如果阈值已经无法继续分割，但是字符串还未查询完</p>
<p>if ($_  &gt; 0 &amp;&amp; $start == $end) {</p>
<p>$find_char=substr($a,$_);</p>
<p>$find_len=length $find_char;</p>
<p>#这里需要修改，但是不影响完全匹配了</p>
<p>print &quot;we can just find the last $find_len char ,and it is $find_char \n&quot;;</p>
<p>exit;</p>
<p>}</p>
<p>#如果进行到了最后一个字符</p>
<p>if ($_ == 0) {</p>
<p>if ($start == $end) {</p>
<p>print &quot;It is just one perfect match ! \n&quot;;</p>
<p>my @F_start=split/\s+/,$hash{$start};</p>
<p>print &quot;The index is $F_start[1]\n&quot;;</p>
<p>exit;</p>
<p>}</p>
<p>else {</p>
<p>print &quot;we find more than one perfect match!!!\n&quot;;</p>
<p>#print &quot;$start\t$end\n&quot;;</p>
<p>foreach  ($start..$end) {</p>
<p>my @F_start=split/\s+/,$hash{$_};</p>
<p>print &quot;One of the index is $F_start[1]\n&quot;;</p>
<p>}</p>
<p>exit;</p>
<p>}</p>
<p>}</p>
<p>($start,$end)=&amp;find_level($after,$before,$start,$end);</p>
<p>}</p>
<p>sub find_level{</p>
<p>my($after,$before,$start,$end)=@_;</p>
<p>my @F_start=split/\s+/,$hash{$start};</p>
<p>my @F_end=split/\s+/,$hash{$end};</p>
<p>if ($before eq 'A') {</p>
<p>return ($F_start[2],$F_end[2]);</p>
<p>}</p>
<p>elsif ($before eq 'C') {</p>
<p>return ($all_a+$F_start[3],$all_a+$F_end[3]);</p>
<p>}</p>
<p>elsif ($before eq 'G') {</p>
<p>return ($all_a+$all_c+$F_start[4],$all_a+$all_c+$F_end[4]);</p>
<p>}</p>
<p>elsif ($before eq 'T') {</p>
<p>return ($all_a+$all_c+$all_g+$F_start[5],$all_a+$all_c+$all_g+$F_end[5]);</p>
<p>}</p>
<p>else {print &quot;sorry , I can't find the right match!!!\n&quot;;}</p>
<p>}</p>
<p>#perl -alne '{next if /&gt;/;$all.=$_;}END{print substr($all,308,10)}'   lambda_virus.fa </p>
<p>[/perl]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bio-info-trainee.com/511.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>
		<item>
		<title>bowtie简单使用</title>
		<link>http://www.bio-info-trainee.com/398.html</link>
		<comments>http://www.bio-info-trainee.com/398.html#comments</comments>
		<pubDate>Fri, 20 Mar 2015 07:49:25 +0000</pubDate>
		<dc:creator><![CDATA[ulwvfje]]></dc:creator>
				<category><![CDATA[基础数据格式]]></category>
		<category><![CDATA[bowtie]]></category>
		<category><![CDATA[比对]]></category>

		<guid isPermaLink="false">http://www.bio-info-trainee.com/?p=398</guid>
		<description><![CDATA[首先进入bowtie的主页，千万要谷歌！！！ http://bowtie-bio &#8230; <a href="http://www.bio-info-trainee.com/398.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>首先进入bowtie的主页，千万要谷歌！！！</p>
<p><a href="http://bowtie-bio.sourceforge.net/bowtie2/index.shtml">http://bowtie-bio.sourceforge.net/bowtie2/index.shtml</a></p>
<p><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/image001.png"><img class="alignnone size-full wp-image-399" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/image001.png" alt="image001" width="446" height="529" /></a></p>
<p>主页里面有下载链接，也有索引文件，当然索引文件只有人类等模式生物</p>
<p>下载之后是个压缩包，解压即可使用</p>
<p><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/image003.png"><img class="alignnone size-full wp-image-401" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/image003.png" alt="image003" width="829" height="339" /></a></p>
<p>可以看到绿色的就是命令，可以添加到环境变量使用，也可以直接用全路径使用它！！！</p>
<p>然后example文件夹里面有所有的测试文件。</p>
<p>二、准备数据</p>
<p>我们就用软件自带的测试数据</p>
<p><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/image005.png"><img class="alignnone size-full wp-image-403" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/image005.png" alt="image005" width="626" height="217" /></a></p>
<p>三、运行命令</p>
<p>分为两步，首先索引，然后比对！！！</p>
<ul>
<li>索引，bowtie2-build your-fastq-file.fa your-index-name</li>
</ul>
<p><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/image008.jpg"><img class="alignnone size-full wp-image-406" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/image008.jpg" alt="image008" width="373" height="157" /></a></p>
<p>然后你的目录就产生了六个索引文件，我给索引取名是tmp，你们可以随便取名字</p>
<ul>
<li>然后比对，分两种，一是单端测序数据，二是双端数据</li>
</ul>
<p>重点参数的-x 和 –S ，单端是-U 双端是-1 -2</p>
<p>Bowtie –x tmp –U reads.fa –S hahahhha.sam</p>
<p>Bowtie –x tmp -1 reads1.fa -2 reads2.fa –S hahahha.sam</p>
<p>四：输出文件解读</p>
<p>就是输出了sam文件咯，这个就看我的sam文件格式讲解哈</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bio-info-trainee.com/398.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>转录组比对软件tophat的使用</title>
		<link>http://www.bio-info-trainee.com/156.html</link>
		<comments>http://www.bio-info-trainee.com/156.html#comments</comments>
		<pubDate>Sat, 14 Mar 2015 12:52:49 +0000</pubDate>
		<dc:creator><![CDATA[ulwvfje]]></dc:creator>
				<category><![CDATA[转录组软件]]></category>
		<category><![CDATA[bowtie]]></category>
		<category><![CDATA[tophat]]></category>
		<category><![CDATA[比对]]></category>

		<guid isPermaLink="false">http://www.bio-info-trainee.com/?p=156</guid>
		<description><![CDATA[转录组比对软件tophat的使用 为什么要用这个软件？：因为转录组reads比对 &#8230; <a href="http://www.bio-info-trainee.com/156.html">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p style="text-align: center;"><b>转录组比对软件</b><b>tophat</b><b>的使用</b></p>
<p><b>为什么要用这个软件？：因为转录组reads比对到基因组reads用bwa和bowtie的效果都不够好，所以我们选择tophat</b></p>
<p><b>它做了什么？：tophat把测序的转录组的原始reads比对到了参考基因组上面，并且输出了bam（二进制的sam）文件比对结果给我们。（fastq---&gt;bam）</b></p>
<p><b>一：下载安装该软件</b></p>
<p><b>其实一般的生信服务器自然会有高手给安装好了，你只需调用即可，这里我给大家演示一下如何安装。</b></p>
<p><b>wget   </b><a href="http://ccb.jhu.edu/software/tophat/downloads/tophat-2.0.13.Linux_x86_64.tar.gz"><b>http://ccb.jhu.edu/software/tophat/downloads/tophat-2.0.13.Linux_x86_64.tar.gz</b></a></p>
<p><span id="more-156"></span></p>
<p><b>我这里简单下载二进制版本的，直接解压即可使用，里面除了tophat之外，还有好几个小工具，也是挺实用的。</b></p>
<p><b><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用688.png"><img class="alignnone size-full wp-image-157" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用688.png" alt="tophat简单使用688" width="314" height="341" /></a>       </b></p>
<p><b>二：准备数据</b></p>
<p><b>数据当然是</b><b>测序的转录组的原始reads啦，fastq格式的</b></p>
<p><b><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用923.png"><img class="alignnone size-full wp-image-158" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用923.png" alt="tophat简单使用923" width="200" height="46" /></a></b></p>
<p><b>还有人的参考基因组，这里选择人的hg19，很容易就下载了，bowtie官网里面有下载并且索引好了所有文件。如果你是自己下载的hg19，需要用bowtie先进行索引，见我的bowtie简单使用教程</b></p>
<p><b><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用1219.png"><img class="alignnone size-full wp-image-159" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用1219.png" alt="tophat简单使用1219" width="240" height="104" /></a></b></p>
<p><b>三：运行命令</b></p>
<p><b>不需要看那么多的参数，首先要能用</b></p>
<p><b>/home/jmzeng/bio-soft/tophat-2.0.13.Linux_x86_64/tophat2 /home/jmzeng/ref-database/hg19 case1.fq</b></p>
<p><b>拆开看就是tophat2   hg19  case1.fq    即可，不需要设置任何参数，等需要优化的时候再去思考参数的意义，我这里是单端测序的命令。</b></p>
<p><b><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用1615.png"><img class="alignnone size-full wp-image-160" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用1615.png" alt="tophat简单使用1615" width="550" height="103" /></a></b></p>
<p><b>不过我的习惯是用脚本解决问题，一定要批量化运行的，我设置了30个CPU，也设置了输出目录，还加上了一个转录本</b></p>
<p><b><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用1868.png"><img class="alignnone size-full wp-image-161" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用1868.png" alt="tophat简单使用1868" width="667" height="48" /></a></b></p>
<p><b>也许是要等明天才能看结果啦</b></p>
<p><b>好像用了30个cpu跑的很快，每个两个多小时就跑完啦</b></p>
<p><b><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用2107.png"><img class="alignnone size-full wp-image-162" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用2107.png" alt="tophat简单使用2107" width="668" height="53" /></a></b></p>
<p><b>四：输出文件解读</b></p>
<p><b>这三个文件夹里面就输出文件，每个样本一个输出文件夹，</b></p>
<p><b><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用2342.png"><img class="alignnone size-full wp-image-163" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用2342.png" alt="tophat简单使用2342" width="378" height="129" /></a></b></p>
<p><b>任意进入一个文件夹可以看</b>到</p>
<p><b>通常，我们只需要那个accepted_hits.bam文件，是我们的测序reads成功比对到hg19什么的比对情况。</b></p>
<p><b><a href="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用2554.png"><img class="alignnone size-full wp-image-164" src="http://www.bio-info-trainee.com/wp-content/uploads/2015/03/tophat简单使用2554.png" alt="tophat简单使用2554" width="397" height="173" /></a></b></p>
<p><b>接下来就可以用很多软件来处理这个bam文件了</b></p>
<p><b> </b></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bio-info-trainee.com/156.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
