Как перебросить через реку танк весом 36 тонн с помощью всего лишь 6 солдат? Это сложная задача, но ребенок может нарисовать ее карандашом.

Не верите мне? Мы к этому еще вернемся. Сначала поговорим о биологии.

Следующей технологией, которая изменит мир, будет биологическая. Биотехнология вылечит наши болезни, сделает более здоровую пищу и улучшит качество нашей жизни.

Во многом это зависит от понимания генома, всей ДНК, которая сообщает нашим клеткам, что делать и что делать.

Геном - это язык, и нам нужно больше людей, которые его поймут.

Беглость генетических данных - это основа будущего биотехнологии. Так как предстоит многому научиться, начинать это может быть непросто.

Вот почему я документирую то, что узнаю в своем путешествии по биоинформатике, начиная с основ: анализа места репликации ДНК. Давайте создадим нужные нам функции и применим их к геному V. холеры.

(This article assumes a basic knowledge of Python 3.6 and genetics).

Подсчет паттернов

Сложность: ⭐_ _ _ _

Чтобы инициировать репликацию ДНК, белки DnaA связываются с определенными нуклеотидными последовательностями, называемыми блоками DnaA. Эти прямоугольники появляются в ori области генома несколько раз.

(Примечание на будущее: белки DnaA не заботятся о том, с какой цепью ДНК они связываются).

Подобные «коробки» часто повторяются в тех частях генома, где происходят важные процессы.

Если нам известна последовательность, или Pattern, ящиков DnaA, нам нужно подтвердить, что она появляется в регионе, который мы изучаем, несколько раз.

Для начала давайте просканируем более длинную последовательность (строку Text), используя «окно», и посмотрим, соответствует ли содержимое этого окна заданному Pattern.

Код

Давайте назовем строку длиной k k-mer. Когда у нас есть более длинная строка, такая как Text, с длиной n символов, последний k-mer начинается с позиции n-k .

Python начинает отсчет с 0, поэтому наш последний k-mer начинается с позиции n-k+1, как у нас выше.

Text[i:i+len(Pattern)] - это наше «окно»; это просто фрагмент / подстрока Text, которая начинается с символа i и равна по длине Pattern. Если он равен Pattern, мы увеличиваем count.

Результаты, достижения

Не слишком сумасшедший, правда? Относительно простая логика этой функции будет возвращаться снова и снова.

Отображение частот

Сложность: ⭐⭐ _ _ _

PatternCount полезен только в том случае, если мы знаем, что Pattern - что, если мы не знаем последовательность блоков DnaA?

Нам придется искать тот шаблон, который встречается чаще всего, поэтому давайте создадим словарь, который будет содержать все возможные k-mer в Text и их количество.

Код

Здесь k - целая длина k-мер. Начните с создания пустого словаря freq. Затем мы перемещаемся по Text, используя ту же логику, что и в PatternCount. Это создает ключ для каждого возможного k-mer Pattern в Text, каждый со значением 0.

Вложенные в этот цикл, мы снова пробегаем через Text. Мы сравниваем Pattern из цикла вложения с каждым k-мером в Text, начиная с j -ой позиции. Мы увеличиваем значение этого Pattern ключа, если оно истинно.

Вы видели эту логику раньше?

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

Результаты, достижения

Частые слова

Сложность: ⭐_ _ _ _

Мы заботимся только о k-мерах, которые появляются наиболее часто. Давайте определим максимальное значение в этом словаре и добавим все соответствующие ключи в новый list.

Код

Инициализируйте пустой список words («слова», потому что геном похож на длинное предложение). Мы вызываем функцию FrequencyMap и устанавливаем выход равным freq.

Используя встроенный метод values(), мы извлекаем все значения из freq. Затем используйте встроенную функцию max, чтобы установить m равным наивысшему значению.

Затем мы перебираем словарь и добавляем keys (k-mers) в список words, если их соответствующее значение соответствует максимуму.

Результаты, достижения

Обратные дополнения

Сложность: ⭐_ _ _ _

Если несколько k-мер повторяют максимальное количество раз, какой из них правильный? Если у Pattern есть обратные дополнения, которые также повторяются, вероятно, это правильный вариант.

Я объясню, почему, когда мы применяем эту функцию к V. cholerae геном.

Код - обратный

Первую функцию Reverse легче читать. Создайте пустую строку rev. Пройдите по строке Pattern и добавьте (объедините) i -й символ в начало rev.

Pattern: ATTGATGGC
[i = 0]rev: A
[i = 1]rev: TA
...
[i = 7]rev: GGTAGTTA
[i = 8]rev: CGGTAGTTA

Reverse_2 более краток, но менее интуитивен. Число после второго двоеточия - это аргумент шага в расширенном срезе. Создание -1 переворачивает строку.

Код - Дополнение

Нуклеотиды будут спариваться друг с другом определенным образом: A-T, C-G. В функции Complement мы перебираем строку Pattern и создаем новую строку comp, так что A заменяется на T, и так далее.

Моя первая попытка 🤢:

Он функциональный, но небрежный. Мы проверяем базу в Pattern операторами if/else, а затем добавляем соответствующее дополнение к comp.

Эта функция (привет доктору Гансу М. Руппу) чище:

Пары оснований есть в словаре. Если base в Pattern совпадает с ключом, соответствующее значение добавляется к comp.

Результаты - обратное дополнение

Вызовите обе функции Reverse и Complement в новую функцию ReverseComplement:

Соответствие шаблону

Сложность: ⭐_ _ _ _

Мы хотим подтвердить, повторяются ли эти Patterns или группируются в другом месте генома (кроме ori). Если да, то мы не можем знать, связаны ли они конкретно с репликацией ДНК.

Просмотрим весь Genome и отметим positions, где появляются эти Patterns. Если они имеют тенденцию группироваться в одном месте, мы можем быть уверены, что это те блоки DnaA, которые мы ищем.

Код

Начнем с создания пустого списка positions. Итерируйте Genome, используя ту же логику, которую мы использовали в PatternCount.

Вместо увеличения count мы добавляем к positions индексы, совпадающие с Genome окном и Pattern.

Результаты, достижения

Собираем все вместе

Теперь давайте применим эти функции к V. cholerae. Вот его ori регион:

ATCAATGATCAACGTAAGCTTCTAAGCATGATCAAGGTGCTCACACAGTTTATCCACAACCTGAGTGGATGACATCAAGATAGGTCGTTGTATCTCCTTCCTCTCGTACTCTCATGACCACGGAAAGATGATCAAGAGAGGATGATTTCTTGGCCATATCGCAATGAATACTTGTGACTTGTGCTTCCAATTGACATCTTCAGCGCCATATTGCGCTGGCCAAGGTGACGGAGCGGGATTACGAAAGCATGATCATGGCTGTTGTTCTGTTTATCTTGTTTTGACTGAGACTTGTTAGGATAGACGGTTTTTCATCACTGACTAGCCAAAGCCTTACTCTGCCTGACATCGACCGTAAATTGATAATGAATTTACATGCTTCCGCGACGATTTACCTCTTGATCATCGATCCGATTGAAGATCTTCAATTGTTAATTCTCTTGCCTCGACTCATAGCCATGATGAGCTCTTGATCATGTTTCCTTAACCCTCTATTTTTTACGGAAGAATGATCAAGCTGCTGCTCTTGATCATCGTTTC

Давайте выполним тестовый PatternCount случайный Pattern:

Затем давайте запустим FrequentWords в области ori, чтобы найти наиболее часто встречающиеся k-меры. Когда мы устанавливаем k в целые числа от 3 до 9, мы получаем следующие результаты:

Подождите, четыре девятимера, каждый из которых встречается по 3 раза? Давайте сосредоточимся на девятимерах:

  • Коробки DnaA обычно имеют длину 9 баз.
  • Шансы на то, что последовательность из 9 оснований появится 3 раза в области из 500 оснований, слишком мала, чтобы это могло произойти случайно.
  • В этих первых двух девятимерцах есть что-то интересное ...

Давайте запустим функцию ReverseComplement на первом 9-мере, ATGATCAAG:

CTTGATCAT - еще один из наших 9-меров! Помните, что ДНК двухцепочечная, поэтому CTTGATCAT на одной цепи означает ATGATCAAG на другой. (Наоборот).

Также помните, что белки DnaA будут связываться с любой цепью, пока у нее есть блок DnaA. Учитывая обе нити ДНК, ATGATCAAG появляется 6 раз в области ori (то же самое с CTTGATCAT).

Это хороший показатель, что мы нашли наши коробки DnaA. Посмотрим, группируются ли они где-нибудь еще в геноме, который мы установили равным v_cholerae.

Оба имеют тенденцию группироваться около отметки 152 000. Это хорошее свидетельство того, что мы обнаружили блоки DnaA в ori области V. холера!

Как перебросить 36-тонный танк через реку с шестью солдатами:

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

Модельер Дональд Бейли спроектировал этот мост.

Его фундамент? Почему этот мост был одновременно прочным и удобным для передвижения? Эта панель:

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

Биоинформатика может быть сложной и пугающей. Но, как показывает Бейли Бридж, мы можем решать сложные проблемы с помощью простых понятий, таких как циклы for и строки.

Вывод: изучите основы, и вы сможете решать задачи больше, чем резервуар, или меньше, чем V. холеры.

Если вы зашли так далеко, спасибо! Получили обратную связь? Дайте мне знать"!

Я буду дополнять эту серию, когда узнаю больше о биоинформатике. Вот еще кое-что, что я написал: