Сравнение двух строк параллельно - PullRequest
0 голосов
/ 25 октября 2018

У меня есть два отсортированных текстовых файла, которые содержат белковые последовательности из одинаковых 600 образцов, просто мы используем разные методы для получения последовательностей.Теперь мы хотим сравнить последовательности в обоих файлах, чтобы увидеть, согласуются ли они друг с другом.

Это выравнивание / сравнение последовательностей с высокой пропускной способностью , поэтому я хотел бы написать небольшойскрипт обрабатывает все последовательности параллельно , то есть сравнивает:

последовательность 1 в файле 1 с последовательностью 1 в файле 2,

последовательность 2 в файле 1 с последовательностью 2 в файле 2 и т. д.

И затем в конечном итоге возвращает мне результаты, независимо от того, совпадают они или нет, и дает мне% идентичность.

Каждая последовательность имеет связанный заголовок, обозначенный знаком «>», за которым следует имя образца.

file1
>Sample 1
ABCDEFG
>Sample 2
ZXCVBNM
>Sample 3
QAZWSXEDC
>Sample 4
ZXCVSDFGHNMJKL

file2
>Sample 1
ABCDEFG
>Sample 2
ZXCVBOM
>Sample 3
QAZWSXEDCF
>Sample 4
ASDFGHJK

Я хотел бы создать таблицу для отображения результатов в следующем формате:

Sample Name   Seq 1           Seq 2           Mismatch   % Identity
Sample 1      ABCDEFG         ABCDEFG         0          100
Sample 2      ZXCVBNM         ZXCVBOM         1          85.7
Sample 3      QAZRWSXED       QAZWSXEDCF      2          80
Sample 4      ZXCVSDFGHNMJKL  ASDFGHJK        6          42.9

Я думал сделать это следующим образом (прикрепив здесь псевдокод):

with open ('file1.txt', 'r') as infile1:
    sanger = infile1.read().splitlines()  # Read file1 in

with open ('file2.txt', 'r') as infile2:
    ngs = infile2.read().splitlines()   # Read file2 in

with open ('outfile.txt', 'w') as outfile:  # Write output file
    data_iter = iter(sequences)
    order = ['Sample Name', 'Seq 1', 'Seq 2', 'Mismatch', '% Identity']
    header = '\t'.join([k for k in order])
    outfile.write(header + '\n')   # Print the header information

    if sanger[1] in ngs[1]:
        locations = [[{'Sample Name': seq_name.strip('>'),
                       'Seq 1': sanger[1],
                       'Seq 2': ngs[1],
                       'Mismatch': mismatch count,
                       '% Identity': 100 - (mismatch count/len(sanger/ngs) * 100)}]]                        
        for loc in chain.from_iterable(locations):
            output = '\t'.join([str(loc[k]) for k in order])
            outfile.write(output + '\n')

И повторить для всех 60 последовательностей.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

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

  1. Открыть файлы.
  2. zip их вместе
  3. Направьте итератор через itertools.islice с размером шага два.

Демонстрация:

$ cat file1.txt 
>Sample 1
ABCDEFG
>Sample 2
ZXCVBNM
>Sample 3
QAZWSXEDC
>Sample 4
ZXCVSDFGHNMJKL
$ cat file2.txt 
>Sample 1
ABCDEFG
>Sample 2
ZXCVBOM
>Sample 3
QAZWSXEDCF
>Sample 4
ASDFGHJK
$ python3
>>> from itertools import islice
>>> 
>>> with open('file1.txt') as f1, open('file2.txt') as f2:
...     pairs = islice(zip(f1, f2), 1, None, 2)
...     for pair in pairs:
...         print(pair)
... 
('ABCDEFG\n', 'ABCDEFG\n')
('ZXCVBNM\n', 'ZXCVBOM\n')
('QAZWSXEDC\n', 'QAZWSXEDCF\n')
('ZXCVSDFGHNMJKL\n', 'ASDFGHJK\n')

Предполагается, что вы используете Python 3, используйтеitertools.izip более zip в Python 2, чтобы избежать полного чтения обоих файлов в память.

0 голосов
/ 25 октября 2018

Вместо загрузки обоих файлов вы можете открыть их и выполнить итерации с помощью функции zip и итератора с включенным файлом.Это должно работать:

for element_in_file1, element un file1 in zip(open(file1), open(file2)): #extract logic in function

Ваша логика должна быть в функции, которая вычислит выравнивание и результаты и вернет выходную строку.

...