Как извлечь короткую последовательность, используя окно с определенным размером шага?

Приведенный ниже код извлекает короткую последовательность в каждой последовательности с размером окна 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

person Xiong89    schedule 12.06.2015    source источник
comment
Видя ожидаемый результат, кажется, что вы хотите сдвинуть окно на шаг 1, а не 2. Я прав?   -  person Mel    schedule 12.06.2015
comment
На самом деле размер шага 2.   -  person Xiong89    schedule 12.06.2015


Ответы (3)


Вы можете использовать цикл for с range, используя третий параметр step для range. Таким образом, это немного чище, чем использование цикла while. Если данные нельзя разделить по размеру блока, то последний блок будет меньше.

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

Выход

ACCC
CCGA
GATT
TTT
person tobias_k    schedule 12.06.2015

Для любого размера окна и любого размера шага:

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

Вывод с windowSize=4, step=2:

ACCC 
CCGA                       
GATT 

Вывод с windowSize=4, step=1:

ACCC                       
CCCG
CCGA
CGAT
GATT
ATTT

Последний точно такой же, как «Ожидаемый результат», отсортированный по-другому.

person Mel    schedule 12.06.2015

Ваш конкретный пример можно решить, перейдя вместо этого к размеру шага 1. Но ваш вопрос, кажется, спрашивает: «Как мне повторить с тем же размером окна с конца последовательности, если в последовательности недостаточно символов». Таким образом, пример, где это может иметь значение, может быть

AAAATTT

с размером окна 6 и размером шага 2, где вы хотите AAAATT из направления «вперед» и AAATTT из «обратного» направления, но никаких других подпоследовательностей.

Очевидно, что выполнение кода один раз в прямом направлении и один раз в обратном направлении сделает это, но это приводит к повторению, что обычно не очень хорошо. Однако вы можете реорганизовать задачу, разделив шаг на пары шагов.

Для последовательности длины x с шагом y можно разделить y на x%y и < em>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])
person tripleee    schedule 12.06.2015