Как извлечь местоположение более короткой последовательности на основе более длинной последовательности с помощью Python?

У меня есть файл A с идентификатором последовательности, а также информация о местоположении сайта привязки. Я хотел бы извлечь информацию о местоположении только без информации A, T, C, G. Более короткая последовательность над более длинной последовательностью показывает свое местоположение и каждое число слева, например, в файле A значение 451 — это значение местоположения слева. Я хотел бы получить расположение короткой последовательности в более длинной последовательности, которая начинается с 453 (начальный сайт), и получить длину более короткой последовательности, которая имеет размер 21, и добавить к 453, чтобы получить конечный сайт, который равен 474. Может ли кто-нибудь мне помочь ?

Файл A.txt

chr1:152806601-152807450

        TTCAGCACCATGGACAGCGCC          
451  GGCTTCAGCACCACGGACAGCGCCCCACCCGCGGCCCTCCCCCCGGCGGCGCGCTCCAGCCGGTGTAGGCGAGGC

            TTCAGCACCATGGACAGCGCC            
751  AGAGCCCCCCGGGACTGCAGAGAGCACCTGGGAGGCTGGACTGGGAACGAGACATACTCGAAGGAGTAAGTGAAG


chr10:125364276-125364825

                       TTCAGCACCATGGACAGCGCC
301  CAGTAATGTGGGGTTGTGGTCAGCACCATGGACAGCTCCCCTGTTGCTTCATATTGAGGAATAGGAAAGCGCCGC

        TTCAGCACCATGGACAGCGCC
376  TATCTCCGGATCCTGGCTAGCTCCAGCCACTGCAGGTAACTGTCTTGAATGGGCTTAGAAACATGGTGATGTCTG

Желаемый результат

chr1:152806601-152807450 453 474
chr1:152806601-152807450 757 778
chr10:125364276-125364825 318 339
chr10:125364276-125364825 378 399

Пример кода

import re
with open("A.txt", "r") as f:
    lines = f.readlines()


label_ptrn = re.compile("")   # insert regular expression sequence ID
line_ptrn = re.compile("")    # insert regular expression start site
inner_ptrn = re.compile("")   # insert regular expression end site

all_matches = []
for line in lines:
    m = label_ptrn.match(line)
    if m:
        label = m.groupdict().get("label")
        continue
    m = line_ptrn.match(line)
    if m:
        start = m.groupdict().get("start_value")
        sequence = m.groupdict().get("sequence")
        mi = inner_ptrn.search(sequence)
        if not mi:
            continue
        span = mi.span()
        all_matches.append((label, int(start)+span[0], int(start)+span[1]))

with open("A_ouput.bed", "w+b") as f:
    for m in all_matches:
        f.write('%s\t%i\t%i\n' % m)

person Xiong89    schedule 02.07.2015    source источник
comment
Can anyone help me? не очень конкретно. В чем проблема?   -  person wwii    schedule 02.07.2015
comment
Ваши начальные значения отличаются на единицу?   -  person wwii    schedule 02.07.2015


Ответы (1)


Так что мне кажется, что начальная позиция желаемого результата отключена на единицу.

        TTCAGCACCATGGACAGCGCC          
451  GGCTTCAGCACCACGGACAGCGCCCCACCCGCGGCCCTCCCCCCGGCGGCGCGCTCCAGCCGGTGTAGGCGAGGC

Первый T в более короткой последовательности выглядит так, как будто он находится над четвертым символом более длинной последовательности. Если первый символ более длинной последовательности находится в позиции 451, то первый символ более короткой последовательности окажется в позиции 454.

Если файловая структура постоянна, это решение без регулярных выражений.

result = []
with open('file.txt') as f:
    for line in f:
        if line.startswith('chr'):
            label = line.strip()
        elif line[0] == ' ':
            # short sequence
            length = len(line.strip())
            # find the index of the beginning of the short sequence
            for i, c in enumerate(line):
                if c.isalpha():
                    short_index = i
                    break
        elif line[0].isdigit():
            # long sequence
            n = line.split(' ')[0]
            # or
            # n = line[:line.index(' ')]
            # find the index of the beginning of the long sequence
            for i, c in enumerate(line):
                if c.isalpha():
                    long_index = i
                    break
            start = int(n) + short_index - long_index
            # start -= 1
            end = start + length
            result.append('{} {} {}'.format(label, start, end))
            offset, n, start, length = 0, 0, 0, 0

результат

['chr1:152806601-152807450 454 475',
 'chr1:152806601-152807450 758 779',
 'chr10:125364276-125364825 319 340',
 'chr10:125364276-125364825 379 400']

Если я неправильно истолковал данные вашего примера, раскомментируйте start -= 1.

person wwii    schedule 02.07.2015