如何使用具有特定步长的窗口提取短序列?

时间:2015-06-12 07:39:33

标签: python extract extraction biopython fasta

下面的代码在窗口大小为4的每个序列中提取短序列。如何按步长2移动窗口并提取4个碱基对?

示例代码

from Bio import SeqIO

with open("testA_out.fasta","w") as f:
        for seq_record in SeqIO.parse("testA.fasta", "fasta"):
            i = 0
            while ((i+4) < len(seq_record.seq)) :
              f.write(">" + str(seq_record.id) + "\n")
              f.write(str(seq_record.seq[i:i+4]) + "\n")
              i += 2

testA.fasta的输入示例

>human1
ACCCGATTT

testA_out的输出示例

>human1
ACCC
>human1
CCGA
>human1
GATT

这个输出的问题是有一个T被遗漏,所以在这种情况下我希望也包括它。我怎么能得出这个输出?使用反向提取物以及包括从开始到结束提取时可能遗漏的碱基对。任何人都可以帮助我吗?


预期产出

>human1
ACCC
>human1
CCGA
>human1
GATT
>human1
ATTT
>human1
CGAT    
>human1
CCCG

3 个答案:

答案 0 :(得分:3)

对于任何窗口大小和任何步长:

fasta='ACCCGATTT'
windowSize=4
step=1
i=0
while (i+windowSize)<=len(fasta):
    currentWindow=fasta[i:i+windowSize]
    print(currentWindow)
    i+=step

使用windowSize = 4输出,步骤= 2:

ACCC 
CCGA                       
GATT 

使用windowSize = 4输出,步骤= 1:

ACCC                       
CCCG
CCGA
CGAT
GATT
ATTT

最后一个与“预期输出”完全相同,排序方式不同。

答案 1 :(得分:1)

您可以使用for的{​​{1}}循环,使用range的第三个step参数。这样,它比使用range循环更清晰。如果数据不能被块大小分割,那么最后一个块将更小。

while

输出

data = "ACCCGATTT"
step = 2
chunk = 4
for i in range(0, len(data) - step, step):
    print(data[i:i+chunk])

答案 2 :(得分:1)

您可以通过转换为1的步长来解决您的特定示例。但是你的问题似乎在问,&#34;如果序列中没有足够的字符,如何从序列末尾重复相同的窗口大小&#34;。所以这会产生影响的例子可能是

AAAATTT

窗口大小为6且步长为2,您希望{&#34;转发&#34;}中的AAAATT方向和来自&#34;反向&#34;的AAATTT方向,但没有其他后续。

显然,在向前方向上运行一次代码并在向后方向运行一次会做到这一点,但它会引入重复,这通常不是一件好事。但是,您可以重构问题,以便将步骤分成多个步骤。

对于步长为 y 的长度 x 的序列,您可以将 y 划分为 x%y y-(x%y)然后继续这些成对步骤。 (当 x%y == 0时,跳过该对中的第一个成员。)

我只发布字符串处理函数,因为这些函数都不是基因序列特有的。

seq = "AAAATTT"
window = 6
step = 2

length = len(seq)
modulo = length % step

for i in range(0, length-window, step):
    if modulo > 0:
        print(seq[i:i+window])
    print(seq[i+modulo:i+modulo+window])