去除测序reads中的接头:adaptor

之前用c写过一个程序,查找reads中是否包含了adaptor,如果检测到的话就过滤掉含有adaptor的reads,这次在过滤完数据之后发现接头序列比较多,为了提升组装效果,又不能很大地影响数据量,需要对接头进行截断处理,并过滤过短的reads,用python写了一个简短的程序,指定超过3个错配以内的匹配都认为匹配到,并且长度小于50bp的reads过滤,在以下程序基础上添加传入参数,可以适用比较多的情况(单端、双端、含有single等):

 1 import sys
 2 import re
 3 from Bio import SeqIO
 4
 5 def rmPE(read1,read2,adaptor1,adaptor2,min_length):
 6     res_1 = rmSE(read1,adaptor1,min_length)
 7     res_2 = rmSE(read2,adaptor2,min_length)
 8     if res_1 and res_2:
 9         return res_1,res_2
10     else:
11         return False
12
13 def rmSE(read,adaptor,min_length):
14     seq = read.seq
15     seed_len = 6
16     a_len = len(adaptor)
17     seq_len = len(seq)
18     for i in range(a_len - seed_len):
19         seed = adaptor[i:i+seed_len]
20         pos = 0
21         while(pos < seq_len):
22             find_pos = seq.find(seed,pos)
23             if find_pos > 0:
24                 mistaken_count = 0
25                 _b = find_pos
26                 _e = find_pos + seed_len
27                 while(_b >= 0 and i >= find_pos - _b):
28                     if adaptor[i - find_pos + _b] != seq[_b]:
29                         mistaken_count += 1
30                     if mistaken_count > 3:
31                         break
32                     _b -= 1
33                 else :
34                     while(_e < seq_len and i - find_pos + _e < a_len):
35                         if adaptor[ i - find_pos + _e ] != seq[_e]:
36                             mistaken_count += 1
37                         if mistaken_count > 3:
38                             break
39                         _e += 1
40                     else:
41                         if find_pos - i > min_length:
42                             return  read[:find_pos-i]
43                         else :
44                             return False
45                 pos = find_pos + 1
46             else:
47                 break
48     return read
49
50 def rmAdaptor(argv):
51     argv.pop(0)
52     read1_file,read2_file,reads_file,adaptor1,adaptor2,out_prefix,min_length = argv
53     reads_records = SeqIO.parse(open(reads_file),‘fastq‘)
54     read2_records = SeqIO.parse(open(read2_file),‘fastq‘)
55     read1_out = open( ‘%s.1.fq‘%out_prefix,‘w‘ )
56     read2_out = open( ‘%s.2.fq‘%out_prefix,‘w‘ )
57     reads_out = open( ‘%s.single.fq‘%out_prefix,‘w‘ )
58     for read1 in SeqIO.parse(open(read1_file),‘fastq‘):
59         read2 = read2_records.next()
60         reads = reads_records.next()
61         rmPE_res = rmPE(read1,read2,adaptor1,adaptor2,min_length)
62         if rmPE_res:
63             read1_out.write(rmPE_res[0].format(‘fastq‘))
64             read2_out.write(rmPE_res[1].format(‘fastq‘))
65         rmSE_res = False
66         if re.search(‘[\s\/](\d)‘,reads.id) == ‘1‘:
67             rmSE_res = rmSE(reads,adaptor1,min_length)
68         elif re.search(‘[\s\/](\d)‘,reads.id) == ‘2‘:
69             rmSE_res = rmSE(reads,adaptor2,min_length)
70         if rmSE_res:
71             reads_out.write(rmSE_res.format(‘fastq‘))
72
73 if __name__ == ‘__main__‘:
74     rmAdaptor(sys.argv)
时间: 2025-01-31 09:57:42

去除测序reads中的接头:adaptor的相关文章

去除List列表中反复值(稍作调整,也适合于List&amp;lt;T&amp;gt; 和 List&amp;lt;?&amp;gt;)

方法一 循环元素删除 [c-sharp] view plaincopy public static void removeDuplicate(List list) { for ( int i = 0 ; i < list.size() - 1 ; i ++ ) { for ( int j = list.size() - 1 ; j > i; j -- ) { if (list.get(j).equals(list.get(i))) { list.remove(j); } } } System.

去除amcharts图表中的logo标识

偶然的机会,在一次应用中用到了amcharts插件. amcharts是一款很好用的网页端图表控件,使用免费版时,会带上logo.影响美观. 于是就使用了一下firebug想看看到底什么地方用了这个字符串. 最后在amcharts.js找到了这个字符串 在源js中将h中的内容替换为"",清除浏览器中的缓存 成了 去除amcharts图表中的logo标识,布布扣,bubuko.com

WordPress 去除后台标题中的“—— WordPress”

/** * WordPress 去除后台标题中的“—— WordPress” */ add_filter('admin_title', 'doocii_custom_admin_title', 10, 2); function doocii_custom_admin_title($admin_title, $title){ return $title.' ‹ '.get_bloginfo('name'); }

去除 Visual Studio 中臃肿的 ipch 和 sdf 文件

使用VS2010建立C++解决方案时,会生成SolutionName.sdf和一个叫做ipch的文件夹,这两个文件再加上*.pch等文件使得工程变得非常的庞大,一个简单的程序都会占用几十M的硬盘容量,可惜毕竟硬盘还没有廉价到免费的地步. 那么,该怎么解决呢?其实可以关闭它.方法: Tools->Options->Text Editor->C/C++->Advanced->Disable Database,设置为True 但是这样的办法会产生另外的一些问题,可能会导致其他的一些

Java基础知识强化之集合框架笔记27:ArrayList集合练习之去除ArrayList集合中的重复字符串元素

1. 去除ArrayList集合中的重复字符串元素(字符串内容相同) 分析: (1)创建集合对象 (2)添加多个字符串元素(包含重复的) (3)创建新的集合 (4)遍历旧集合,获取得到每一个元素 (5)拿着个元素到新集合中去找,看有没有   有:不搭理它 没有:添加到新集合      (6)遍历新集合 2. 案例代码: 1 package cn.itcast_04; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 6

去除List列表中重复值(稍作调整,也适合于List&lt;T&gt; 和 List&lt;?&gt;)

方法一 循环元素删除 [c-sharp] view plaincopy public static void removeDuplicate(List list) { for ( int i = 0 ; i < list.size() - 1 ; i ++ ) { for ( int j = list.size() - 1 ; j > i; j -- ) { if (list.get(j).equals(list.get(i))) { list.remove(j); } } } System.

去除List集合中的重复元素? 如果没有Set集合,List集合是怎么去除重复元素的(字符串类型,自定义类型)?

 关键字: 如果没有Set集合,List集合是怎么去除重复元素的(字符串类型)?  *   *     思考: List就可以存储重复元素,那么需求中容器中的元素必须保证唯一性,该如何解决呢??  *      *   去除List集合中的重复元素?  * * 思路: * * 1.首先我需要另一个临时容器tempList,用来存放我认为应该保留的元素.(也就是不重复的元素) * 2.然后我们应该遍历原容器, 一个一个的取出元素, 放入tempList. * 当tempList里已经装有刚刚取出的

java集合 collection-list-ArrayList 去除ArrayList集合中的重复元素。

import java.util.*; /* 去除ArrayList集合中的重复元素. */ class ArrayListTest { public static void sop(Object obj) { System.out.println(obj); } public static void main(String[] args) { ArrayList al = new ArrayList(); al.add("java01"); al.add("java02&q

mysql 去除重复 Select中DISTINCT关键字的用法

在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值.其原因是 distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而 这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的.所以我花了很多时间来研究这个问题,网上也查不到解决方案,期间把容容拉来帮忙,