Bio python: добавление раздела в средней последовательности с выравниванием элементов - PullRequest
0 голосов
/ 12 января 2020

Я хочу добавить секцию последовательности в середине предыдущей последовательности (в файле gb), и все функции по-прежнему индексируются старой последовательностью.

Например:

предыдущая последовательность: ATAGCCATTGAATGTGTGTG TGTCCTA GAGGGCCTAAAA

fetaure: дополнение misc_feature (20..27) / gene = "Py_ori + A"

Я добавляю TTTTTT в положении 10.

новая последовательность: ATAGCCATTG TTTTTT AAGTGTGTG TGTCCTA GAGGGCCTAAAA

fetaure: дополнение к misc_feature ( 26 .. 33 ) / gene = "Py_ori + A"

Индексы объектов изменены, поскольку объект все еще должен относиться к сегменту TGTCCTA. Я хочу сохранить новую последовательность в новом файле gb.

Существует ли какая-либо функция или метод bio python, которая может добавить сегмент последовательности в середине старой последовательности и добавить длину добавленного сегмента к индексам функций , что после добавленного сегмента?

1 Ответ

0 голосов
/ 27 января 2020

TL; DR

Вызовите + на ваших отрезанных сегментах (например, a + b). Если вы не включили функцию, все будет в порядке.


Длинная версия:

, Bio Python поддерживает объединение функций. Это делается простым вызовом a + b для соответствующих классов SeqRecord (функции являются частью объекта SeqRecord, а не класса Seq.).

Есть причуды, о которых следует знать относительно нарезки последовательности с особенностями. Если вам случится сделать нарезку в функции, функция не будет присутствовать в результате SeqRecord.

Я попытался проиллюстрировать поведение в следующем коде.

from Bio.Seq import Seq
from Bio.SeqRecord import SeqRecord
from Bio.SeqFeature import SeqFeature, FeatureLocation


# THIS IS OK

a = SeqRecord(
    Seq('ACGTA'),
    id='a',
    features=[
        SeqFeature(FeatureLocation(2,4,1), id='f1')
    ]
)

b = SeqRecord(
    Seq('ACGTA'),
    id='b',
    features=[
        SeqFeature(FeatureLocation(2,4,1), id='f2')
    ]
)

c = a + b

print('seq a')
print(a.seq)
print(a.features)

print('\nseq b')
print(b.seq)
print(b.features)

print("\n two distinct features joined in seq c")
print(c.seq)
print(c.features)
print("notice how the second feature has now indices (7,9), instead of 2,4\n")


# BEWARE
# slicing into the feature will remove the feature !

print("\nsliced feature removed")
d = a[:3]
print(d.seq)
print(d.features)
# Seq('ACG')
# []

# However slicing around the feature will preserve it
print("\nslicing out of the feature will preserve it")
e = c[1:6]
print(e.seq)
print(e.features)

ВЫХОД

seq a
ACGTA
[SeqFeature(FeatureLocation(ExactPosition(2), ExactPosition(4), strand=1), id='f1')]

seq b
ACGTA
[SeqFeature(FeatureLocation(ExactPosition(2), ExactPosition(4), strand=1), id='f2')]

 two distinct features joined in seq c
ACGTAACGTA
[SeqFeature(FeatureLocation(ExactPosition(2), ExactPosition(4), strand=1), id='f1'), SeqFeature(FeatureLocation(ExactPosition(7), ExactPosition(9), strand=1), id='f2')]
notice how the second feature has now indices (7,9), instead of 2,4


sliced feature removed
ACG
[]

slicing out of the feature will preserve it
CGTAA
[SeqFeature(FeatureLocation(ExactPosition(1), ExactPosition(3), strand=1), id='f1')]
...