Трехмерный движок в коде… ДНК

В предыдущих выпусках:
1. Трехмерный движок на формулах Excel для чайников
2. Трехмерный движок внутри запроса SQL

dlecf8cpjbcaske1lyy7gtci0dq.png

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

Вообще, меня всегда интересовало, на что может быть похоже программирование внутриклеточных процессов. Как выглядят переменные, условия и циклы? Как вообще можно управлять молекулами, которые просто свободно перемещаются в цитоплазме?

Ответ довольно неожиданный — lingua franca для моделирования сложных процессов в клетках является реакции вида

$A \rightarrow A + B\\ B + B \rightarrow C $

Эти реакции моделируются при помощи закона действующих масс, который одинаково работает и в химии, и в молекулярной биологии.

— Неужели при помощи этих примитивных реакций можно что-то программировать?
— Да, а то, что написано выше, вычисляет $B = \sqrt{A}$.

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

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

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

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

Дисклеймеры


  • Я никак не связан с биологией. Это просто пятничная статья программиста для программистов о малознакомом предмете.
  • В этой статье точно есть куча фактических ошибок и терминологических косяков. Например, я только недавно узнал, что молекулярная биология и биохимия — не одно и то же. Если вы нашли что-то подобное — буду безумно рад комментариям в личку.
  • Весь материал был непозволительно упрощен, чтобы не грузить читателя лишними подробностями. Я старался избегать специфических терминов, где это возможно (например, «шагающие белки» вместо «кинезины»). Многие примеры взяты вперемешку от бактерий и многоклеточных организмов и могут никогда не встречаться вместе.
  • У любого утверждения обязательно будет множество исключений. Любое перечисление неполное. Примеры нерепрезентативные.

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


Эта часть посвящена краткому обзору примеров механизмов, которые позволяют клеткам управлять своими процессами подобно скриптам bash у системных администраторов.

Содержимое этой части не требуется для понимания последующих. Ее цель — дать примерное представление о том, что может скрываться за буками $A, B, C$ и т.д. в реакциях, которые будут рассматриваться далее, а также заинтересовать читателя, чтобы он захотел прочесть статьи в википедии про описываемые сюжеты.

Сразу предупрежу, что обзор не полный и не самый корректный. Если я пишу что-то про то, почему эволюция выбрала конкретное решение — воспринимайте это как полную спекуляцию.

1.1 Вспоминаем основы


Из чего состоит клетка:

  • ДНК — двухцепочечная спираль, состоящая из последовательности 4 нуклеотидов: A,  C,  G,  T.
  • РНК — одноцепочечная спираль, которая может переносить копии участков ДНК (но не только, об этом подробнее в соответствующей главе).
  • Белки
    • Являются цепочками, которые составлены из 20 аминокислот.
    • Удивительной особенностью является то, что эти цепочки самопроизвольно складываются в сложные стабильные структуры.
    • Способны выполнять практически любые функции в клетке: строительный материал, катализаторы реакций, транспортировка веществ, передача сигналов и т. д.
  • Остальные молекулы — например, глюкоза или клетчатка.


Белки и ДНК созданы друг для друга как Paint и BMP.

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

Белки получаются из ДНК в два этапа:

$ДНК \rightarrow РНК \rightarrow белок$

  • Транскрипция: РНК-полимераза прикрепляется к ДНК и делает копию одного из её генов в виде РНК.
  • Трансляция: РНК попадает в рибосому, которая синтезирует последовательность аминокислот. После синтеза эта цепочка под действием химических связей сворачивается в белок нужной формы.

1.2 Белки — объекты первого класса в клетках


Подобно конструктору Лего, белки:

  • состоят из небольшого числа стандартных элементов (аминокислот),
  • легко собираются и разбираются,
  • не такие прочные, как обычные объекты, хотя если грамотно продумать их структуру, могут быть достаточно прочными,
  • идеально совместимы между собой,
  • при этом без проблем способны взаимодействовать и с объектами внешнего мира.


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

Рекомендую посмотреть это видео, чтобы получить представление о том, как это выглядит на молекулярном уровне


Приведем несколько примеров белков со сложным поведением:

  • Пожалуй, самый крутой белок в клетке и один из самых сложных — рибосома. По сути это принтер, в который на вход подается РНК, а на выходе печатается белок, который в ней закодирован.
  • Если мы можем синтезировать белки, то нужно их и утилизировать, точнее разбирать обратно на аминокислоты. Для этого есть «сборщик мусора» из мира белков ― протеасома.
    • Как протеасома понимает, какие белки разбирать? Достаточно пометить любой белок специальной белковой меткой ― убиквитином.
    • По какому принципу ставятся эти метки? Этим занимаются белки, называемые убиквитинлигазами.
  • Для меня было неожиданно узнать, что для получения энергии важную роль играет белок АТФ-синтазы, который содержит вращающиеся части и работает подобно ветряной мельнице: ссылка на видео.

1.3 Паттерны проектирования белков


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

Рассмотрим несколько примеров паттернов.

  • Allosteric regulation ― способность белков распознавать молекулы определенного вида и захватывать их.
  • DNA-binding domain ― часть белка, которая позволяет белку проверить участок ДНК на соответствие короткому регулярному выражению и закрепиться на нем. В отличие от CRISPR, этот механизм не подразумевает возможность редактировать этот участок.
  • Фосфорилирование ― возможность пометить белок «флагом общего назначения» в виде остатка фосфорной кислоты. Чаще всего этот флаг имеет семантику временного отключения активности белка.


Хорошая новость: паттерны могут комбинироваться. Например:

  • «Если удалось захватить молекулу триптофана, то активировать поиск ДНК по регулярному выражению и закрепиться на нем»


Это настоящий белок, называемый «триптофановый репрессор».

24984f857ca9d74ffce23806cd9514cf.jpg

Источник: www.rcsb.org/3d-view/1TRO/1

На картинке выше он показан закрепленным на молекуле ДНК. Красным показаны молекулы триптофана.

Точное значение регулярного выражения в привычном для программистов смысле я не нашел (это где-то в этой работе), но судя по комментариям к 3d-модели, последовательность TGTACTAGTTAACTAGTAC под него должна подходить.

Также белки позволяют производить внутри себя операцию логического отрицания:

  • «Если молекулы аллолактозы НЕТ, то активировать поиск ДНК по регулярному выражению и закрепиться на нем»


Это настоящий белок, называемый «лактозный репрессор».

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

1.4 Плохие новости


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

Более того, даже «элементарная» на первый взгляд задача определения структуры белка является недостижимой по сложности на данном этапе развития вычислительной техники. Только вдумайтесь: известно, что цепочка из аминокислот единственным образом сворачивается в некоторую пространственную структуру из любого своего начального положения и мы практически бессильны в том, чтобы повторить этот процесс.

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

Таким образом мы можем сколько угодно фантазировать на тему, как мы могли бы добавить в наши клетки белки с определенными свойствами, чтобы «пофиксить» какой-нибудь процесс, но будем бесконечно далеки от того, чтобы получить заветную последовательность ДНК.

Как же мы тогда собираемся портировать трехмерный движок в код ДНК? Для этого мы воспользуемся читом и будем использовать ДНК не совсем по прямому назначению. Но не будем забегать вперед.

1.5 Как белки узнают, куда им нужно двигаться?


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

На самом деле аналогия с конвеерными лентами действительно имеет место быть — это называется микротрубочками. По ним перемещаются удивительные «шагающие белки», которые потребляют АТФ в качестве топлива (вы наверняка видели эти видео).

Но большинство процессов в клетке происходит без участия микротрубочек. Белки (как любые молекулы) просто перемещаются в цитоплазме случайным образом. Таким образом триптофановый репрессор будет пытаться присоединиться абсолютно ко всему, что есть в клетке, пока не наткнется на последовательность TGTACTAGTTAACTAGTAC. К счастью, геном кишечной палочки состоит всего лишь из 4 млн. пар нуклеотидов — в 1000 раз меньше, чем у людей.

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

Эта идея покажется не такой плохой, если учесть факторы, которые нам трудно представить в макромире:

  • Даже в простых клетках находится много белков: >40 млн.
  • При этом различных видов белков не так много, например 1800 у кишечной палочки.
  • Эти белки двигаются хоть и случайно, но очень и очень быстро в масштабах клетки.
  • К тому же это движение происходит в трехмерном пространстве, про которое наша интуиция случайных блужданий работает хуже.

1.6 Сферическая клетка в вакууме


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

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

Где-то внутри этого супа происходит процесс биосинтеза белков: РНК-полимераза присоединяется к случайным участкам ДНК, пока не найдет метку начала гена. Она делает копию этого гена в виде РНК, которая спустя какое-то время попадает в рибосому. Рибосома синтезирует закодированный белок.

Каким-то магическим образом (мы это рассмотрим чуть позже) белки точно с такой же скоростью уничтожаются, чтобы клетка не «лопнула».

Тут необходимо сделать важное пояснение, что если взять любую не бактериальную клетку, то в ней будет множество «отсеков» (органелл), которые более-менее изолированы друг от друга. Это довольно существенная деталь, которая позволяет значительно усложнить поведение клетки. В частности, вероятно, бактерии не способы образовывать многоклеточные организмы в том числе потому, что у них органеллы практически отсутствуют. Но чтобы не усложнять повествование, мы далее везде будем рассуждать про клетку без органелл, хотя будем обсуждать и механизмы типа альтернативного сплайсинга, которых нет у бактерий.

Если рассмотреть клетку, которая ничего не делает и которой не нужно делиться, то ее основную функцию можно сформулировать как поддержание постоянства концентраций белков в своем составе.

Даже поддержание постоянства своего состава не такой элементарный процесс.

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


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

1.7 Как одни белки могут влиять на синтез других белков


Итак, нам нужен какой-нибудь способ влиять на активность синтеза определенных белков. Правильно это называется «регуляция экспрессии генов».

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

Идея состоит в том, чтобы вставить «костыль» в какое-нибудь место механизма синтеза белков, чтобы мешать ему это сделать. Если их нет ― уровень экспрессии максимальный.

Один из типичных примеров ― это знакомый нам триптофановый репрессор.

  • Он способен крепиться к ДНК, мешая РНК-полимеразе делать копию соответствующих генов, тем самым подавляя их экспрессию.
  • При этом его механизм крепления к ДНК активируется только если обнаруживается молекула триптофана.
  • Получается, что если триптофан есть, то гены «включены», если нет ― выключены.


Обратите внимание, что этот механизм может использоваться для получения логических конструкций: если перед каким-то геном есть несколько способов вставить «костыль», то ген будет экспрессироваться только если ни один костыль не сработал. Таким образом мы получаем возможность реализации отрицания ИЛИ.

1.8 РНК ― когда данные имеют структуру в прямом смысле


Рибонуклеиновая кислота, вероятно, является самой важной технологией в истории жизни на Земле. Потому что без РНК невозможен синтез белков и репликация ДНК, при этом РНК способна выполнять и функции белков, и ДНК. Собственно, в этом и состоит идея гипотезы мира РНК.

На первый взгляд, в РНК нет ничего интересного — это та же ДНК, только без дублирования информации.

Еще хуже, в РНК во всей своей красе проявляется принцип комплементарности. То есть нуклеотиды A и U, а также G и C постоянно стремятся соединиться в пару. Единичные такие связи не очень прочные, однако если нашлись два длинных комплементарных участка, то они склеятся почти намертво. С учетом теории вероятностей, практически невозможно придумать такую длинную цепочку РНК, которая не могла бы сама с собой как-нибудь склеиться.

После такой склейки, РНК вполне может стать нечитаемым. При попадании такой «петли» (биологи их называют «шпильками») в рибосому, она либо застрянет, либо отвалится, не закончив задание печати.

Казалось бы, это просто катастрофа с точки зрения передачи информации. Однако это открывает и новые возможности:

  • Мы можем делать разные прочные конструкции из РНК и использовать их для тех же целей, что и белки. Нередко белки имеют внутри себя каркасные вставки из РНК.
  • Эти петли можно использовать как еще один механизм вставки «костылей» в процесс биосинтеза белков.


Наверное, это уникальный случай, когда физический носитель, на котором записан код, взаимодействует с объектами, которыми этот код манипулирует.

1.9 Это просто шедевр применения плохих практик


Сейчас мы рассмотрим второй механизм контроля экспрессии группы генов, связанных с синтезом триптофана (первый мехинизм испольузет триптофановый репрессор, чтобы помешать РНК-полимеразе сделать копию соответствующей группы генов).

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

То есть нам нужно как-то помешать рибосоме синтезировать участок РНК, если триптофан есть в достаточном количестве.

  • Первая идея: давайте попробуем поставить много кодонов, кодирующих триптофан подряд. Если триптофана мало, то рибосома приостановится т.к. рядом не будет необходимых «строительных материалов». Но таким образом мы получили обратное поведение: при отсутствии триптофана последующие гены будут экспрессироваться меньше.
  • Вторая идея: оказывается, можно сделать такой набор «шпилек» из РНК, который будет работать по принципу «лежачего полицейского». То есть если рибосома движется медленно, то она спокойно проходит сквозь шпильки, если двигается быстро — то застряет и отваливается.


Комбинируя эти две идеи мы получаем желаемое поведение.

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

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

1.10 Don’t repeat yourself в коде ДНК


Эта глава и вставка в следующей частично основаны на лекции Михаила Гельфанда, которую он читал для студентов факультета компьютерных наук ВШЭ. Рекомендую посмотреть ее целиком.

Удивительно, что эволюция способна приходить и к хорошим практикам там, где это критично для выживания. Например:

  • В иммунной системе необходимо вырабатывать пары антител и B-лимфоцитов с одинаковыми рецепторами.
  • Если лимфоцит распознает какой-то антиген, то начинают вырабатываться антитела, которые распознают и нейтрализуют этот же антиген.
  • То есть два разных гена должны содержать два абсолютно одинаковых участка, иначе будут большие проблемы с имунной системой.
  • При этом мутации поощряются, главное — чтобы они происходили одновременно в двух белках.


Для решения подобных задач у эукариот имеется альтернативный сплайсинг — это полноценные директивы препроцессора в коде ДНК. Его обеспечивает еще один супер-наноробот из белков и РНК, называемый сплайсосомой.

Сплайсосома работает с РНК и ищет в ней специальные маркеры начала и конца на любом расстоянии друг от друга, после чего удаляет все, что находится между ними.

Этот механизм позволяет решать разнообразный спектр задач:

  • Можно просто закомментировать любой участок ДНК. Предполагается, что альтернативный сплайсинг появился, чтобы как-то спастись от вирусов, которые научились повсюду встраивать копии своего кода.
  • Обеспечить одинаковые копии одного участка ДНК в разных белках.
  • Условная конструкция, в которой в белок попадает один из двух альтернативных участков.
  • Можно компактно закодировать большое разнообразие белков, которые состоят из множества альтернативных частей и избежать комбинаторного взрыва длины кода.


Вы только представьте, какой потенциал для сложного поведения открывает альтернативный сплайсинг в комбинации с РНК-шпильками! И это мы только затронули малую часть из изученных механизмов.

1.11 Почему клетки отличаются друг от друга


Я плохо учил биологию в школе, поэтому мне до недавнего времени не давал покоя следующий вопрос: если все клетки содержат одинаковую ДНК, почему тогда клетки отличаются друг от друга?

Если начать над ним думать, то попутно возникает второй вопрос: зачем вообще клеткам иметь одинаковый ДНК? Почему нельзя, например, аккуратно закомментировать какой-нибудь участок, который нужно отключить у данной конкретной клетки, а потом перед копированием его аккуратно раскомментировать?

Почему клетки стараются не менять свой ДНК без крайней необходимости
Это связано с тем, что целостность ДНК является критическим условием существования клетки:
  • Если обнаруживается проблема в коде ДНК, клетка пытается исправить ее всеми имеющимися способами, например:
    • если произошла вставка лишнего нуклеотида, либо потеря существующего, это определяется по комплементарной паре и исправляется,
    • если произошел разрыв, попытаться «сшить» его на месте,
    • найти резервную копию этого участка в парной хромосоме от второго родителя и скопировать ее оттуда.
  • Если неконсистентность не удается устранить, то с клеткой могут начать происходить самые нехорошие вещи, которые в лучшем случае в какой-то момент будут замечены и клетка самоликвидируется.
  • По этим причинам чаще всего эволюционные эксперименты с редактированием ДНК длятся недолго.


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

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

Клеточная мембрана подобно фаерволлу позволяет определять довольно сложные политики того, какие белки и молекулы могут поступать извне или уходить вовне. В частности, клетки постоянно обмениваются сигналами (белки и другие молекулы), которые координируют поведение клеток.

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

1.12 Итог: откуда берется сложность в живых клетках?


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

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

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

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

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

Если пофантазировать, что когда-то будут «программисты» клеточных процессов, то они скорее будут вести проектирование в масштабе графов взаимодействий абстрактных частиц («сигнальных путей»), чем на уровне структуры отдельных белков.

А это значит, что если мы хотим реализовать трехмерный движок, то нужно перейти к математике!


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

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

Вероятно, системы реакций на законе действующих масс — одна из самых минималистичных архитектур, на которых можно реализовывать более-менее сложные вычисления. При этом это не какая-то абстрактная вычислительная машина, а модель, которая в некотором приближении работает во всех живых клетках.

Например, вот полное описание алгоритма рендера трехмрного куба в виде системы реакций, от начала и до конца:

$$display$$ \begin{align} B + A &\rightarrow B + N\\ C + A &\rightarrow C + O\\ D + A &\rightarrow D + P\\ N &\rightarrow T + H\\ Q &\rightarrow U + H\\ T + U &\rightarrow K + K\\ O &\rightarrow V + I\\ Ω &\rightarrow W + I\\ V + W &\rightarrow L + L\\ P &\rightarrow Φ + J\\ S &\rightarrow Γ + J\\ Φ + Γ &\rightarrow M + M\\ K + L &\rightarrow E\\ H &\rightarrow L + Z\\ I &\rightarrow K + Z\\ E + M &\rightarrow F\\ Z &\rightarrow M + G\\ J &\rightarrow E + G\\ G + F &\rightarrow 0\\ G &\xrightarrow{0.01} G + A + R \end{align} $$display$$

Вы можете проверить эту систему в симуляторе, она обозначена там как «minimalist 3d engine».

2.1 Чему равно A + B


Чтобы понять закон действующих масс, достаточно разобраться, как работает следующая реакция:

$A + B \rightarrow C$

У нас есть абстрактные частицы $A$, $B$ и $C$ одинакового размера. Когда $A$ и $B$ сталкиваются, получается $C$.

Допустим, в пространстве объёма 1 равномерно размешано $a$, $b$ и $c$ штук этих молекул. Как будет меняться их количество со временем?

Если молекулы являются точками, то вероятность их столкновения всегда равна нулю независимо от количества. Поэтому модель должна учитывать их размер. К тому же, если частицы двигаются быстро, то столкновения будут происходить чаще. То есть скорость также надо учитывать. Но вместо того, чтобы учитывать все эти параметры по отдельности, в законе действующих масс есть одна константа $k$ — частота столкновения двух частиц в объеме 1. Если она не равна единице, то записывается над стрелкой:

$A + B \xrightarrow{k} C$

Таким образом, если $a=1$, $b=1$, то частота столкновений $A$ и $B$ будет равна $k$. Заметим, при увеличении $a$ с сохранением $b=1$ частота будет увеличиваться линейно (это вредно строго при условии, что молекулы не взаимодействует друг с другом и не сталкиваются, а проходят насквозь). Из аналогичных соображений частота столкновений пропорциональна $b$, поэтому для нашей реакции будет следущий ответ: $a\cdot b\cdot k$ столкновений $A$ и $B$ в единицу времени.

Но мы пока не учитывали, что $A$ и $B$ превращаются в $C$ и числа $a, b, c$ постоянно изменяются. Давайте возьмём маленький отрезок времени $dt$ и посчитаем изменение этих переменных. Всего произойдёт $l = dt\cdot a\cdot b\cdot k$ столкновений. Тогда $a$ и $b$ уменьшатся на $l$, а $c$ — увеличится на $l$.

Вот и все описание реакции. Далее эту частоту столкновений в единицу времени $l$ мы будем называть скоростью реакции.

Реакции с несколькими видами частиц справа (они называются продуктами реакции)

$A + B \xrightarrow{k} C + D + E + \cdots$

моделируются точно так же, просто тогда концентрации всех молекул в правой части уменьшаются на $l = dt\cdot a\cdot b\cdot k$.

В принципе вот и вся модель, на которую бы собираемся портировать трехмерный движок!

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

9a2af38edfa3db17d8a2f3d888a31b07.gif

2.2 Моделирование реакций


Вы можете моделировать реакции при помощи интерактивного ObservableHQ-ноутбука.

Самая важная вещь, которую нужно понимать, что есть два вида графиков, которые показывают, что происходит с реакцией. Верхний показывает изменение концентраций частиц во времени, а нижний — предельные концентрации в зависимости от разных начальных значений одной из частиц.

cjtzum5eo3lwlmx2xhupm6b_rre.png


То есть, если попытаться изобразить связь между ними, получится как-то так:

n4wlkbmgbnsmhtsnjg5hetytyj0.gif

2.3 Примеры простых реакций


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

3.10 Как это будет реализовано в коде ДНК?

$-\ \text{Talk is cheap. Show me the code (Linus Torvalds)}$

3.1 Алгоритм трехмерного движка


Итак, перед нами стоит задача придумать самый простой из возможных алгоритмов, который производит рендер чего-то трехмерного. Сначала нужно определиться с объектом:

  • Сфера — это просто круг с пятном, который можно нарисовать и без реализации движка.
  • Куб гораздо лучше подходит для этой роли. В принципе и куб можно нарисовать без движка как 3 четырехугольника с фиксированными координатами, но я считаю это не спортивным. Мы будем писать простой, но настоящий трехмерный движок!
  • В идеале хотелось бы что-то посложнее, например, куб с вырезанной сферой. Но с учетом того, что используемый нами компилятор ДНК еще в альфа-версии, лучше начать с чего-то простого.


В качестве алгоритма будем использовать уже знакомый из прошлых статей ray marching. Я подробно описал принцип его работы в статье про Excel. В кратком изложении он выглядит так:

  • Вход: координаты пикселя, выход: яркость пикселя.
  • По координатам текущего пикселя определить соответствующий трехмерный луч, выходя

    © Habrahabr.ru