2015-04-23 1 views
1

У меня есть файлы genbank, состоящие из нескольких аннотированных коннигов. То, что я хотел бы сделать, это разделить это на базу данных, в которой есть отдельные записи генов, содержащие каждую функцию «CDS», а также ее ДНК и последовательность аминокислот. Пока это работает очень хорошо:Извлеките последовательность dna по функции из файла genbank

for record in SeqIO.parse(open_file, 'gb'): 
    for feature in record.features: 
     if feature.type == 'CDS': 
      gene_record = { 
       'locus_tag':feature.qualifiers['locus_tag'][0], 
       'translation':feature.qualifiers['translation'][0], 
       } 

У меня возникла проблема с получением последовательности dna. Файл GenBank отформатирован следующим образом:

FEATURES    Location/Qualifiers 
    source   1..29869 
        /organism="Arthrobacter" 
        /mol_type="genomic DNA" 
        /strain="strain_name" 
    gene   complement(4..462) 
        /locus_tag="ArthroDRAFT_00001" 
    CDS    complement(4..462) 
        /locus_tag="ArthroDRAFT_00001" 
        /product="hypothetical protein" 
        /translation="LSTGKELLNYQSALNDIHDEFSRAQQSDAGVSHLSVAKITEKLS 
        YLKATALQMDDLFSVLRKQGVSLRSTGLADWASVPTIQDDKEEGKTEPSLAKKEISSR 
        TTSKPNKIDFPKFEYPDHGQPTNKIRVGTILDTFSESAFSYEWINVALQD" 
    gene   complement(1126..1842) 
        /locus_tag="ArthroDRAFT_00002" 
    CDS    complement(1126..1842) 
        /locus_tag="ArthroDRAFT_00002" 
        /product="hypothetical protein" 
        /translation="VPRAFIYGSCVGGDTANVFPSDWDRPTYVARQSIISAAFGPTSV 
        EGDIELTSAFQRSMLEGDIEATAFPRLRQELPTHDVLILDIVDERLGVYELAPGKYLT 
        RSMELISSKLIGKQPVTPRLIEFGSDEHYGLWTRSVDMLVDVVKHGGIPVFALLPPWS 
        EKSIQGEDLTWHSVSVDLMNNKYARYNEYLVQSEFTVVTVPDEEALGDAEHKWGLAPF 
        HYTESVYESLRDQILVGVSS" 
...etc 

ORIGIN 
     1 ccctcaatcc tgaagagcca cattgatcca ttcgtatgag aatgcagatt ccgagaatgt 
     61 atcaagaatt gttcctacac gtattttgtt tgtcggctgg ccgtggtccg gatactcaaa 
     121 ttttggaaag tcaatcttgt ... 

Итак, у меня есть место для каждой функции, но мне нужно как-то разобрать последовательность ДНК, чтобы потянуть правильную последовательность ДНК, и я вроде в убыток как это сделать. feature.location дает мне то, что кажется полезным выход:

[3:462](-) 
[1125:1842](-) 
[2159:3755](-) 
[5190:5532](-) 
[6226:6493](+) 

Но единственный способ я знаю, чтобы использовать это было бы разобрать, что с помощью регулярных выражений, а затем сделать record.seq[start_num:finish_num]. И затем, если он находится в сети, запустите все, что есть, через reverse_complement.

Это кажется слишком запутанным, и я думал, что биопит должен иметь более эффективный способ, но я не могу его найти. Я заметил, что feature.location уже, кажется, вычитал из него 1, чтобы учесть индекс python 0, так что число должно быть полезным ... правильно?

EDIT: SeqFeature.location кажется, что это то, что я хочу использовать, но не могу понять, как: http://biopython.org/DIST/docs/api/Bio.SeqFeature.FeatureLocation-class.html

EDIT2: Похоже, что я могу сделать

record.seq[feature.location.start:feature.location.end]

Это делает еще не работа для негативного материала нити, хотя ...

ответ

1

Я использую «Extract» метод объекта местонахождения.

dna_seq = feature.location.extract(record)

Это прекрасно работает.

+0

Я нашел это через пару месяцев ... забыл вернуться и ответить на это - спасибо! – kevbonham

1

Хорошо, неважно - больше поисков и экспериментов привело меня к лучшему решению. Не уверен, что это лучшее решение, я оставлю вопрос и не отвечу, если у кого-то будут лучшие идеи. То, что я сделал, чтобы получить последовательность ДНК состоит в следующем:

if feature.location.strand == 1: 
    dna_seq = record.seq[ 
     feature.location.start:feature.location.end 
    ] 
elif feature.location.strand == -1: 
    dna_seq = record.seq[ 
     feature.location.start:feature.location.end 
    ].reverse_complement() 

Не хорошенькая решение, но это, кажется, работает ...