ugeneunipro / ugene

UGENE is free open-source cross-platform bioinformatics software
http://ugene.net
GNU General Public License v2.0
207 stars 60 forks source link

UGENE-8105 Join restriction sites, which make more than two cuts #1631

Closed DmitriiSukhomlinov closed 3 months ago

DmitriiSukhomlinov commented 3 months ago

Некоторые сайты рестрикции делают не один, а два разреза. Пример таких энзимов: AjuI, AlfI, AloI (ну и, в целом, их достаточно много). То, как выглядят они с разрезами можно посмотреть на сайте rebase.neb.com (пример для AloI) либо в других инструментах (например, SnapGene).

В bairoch файле они пишутся как два разных идущих подряд энизма, последовательности которых реверс-комплементарны друг другу. До этого момента в UGENE они считались двумя разными энзимами, что вызывало определенные баги (нпример, сценарий, описанный в задаче), да и в целом неверно. Я поправил это, теперь таки энзимы считаются одним энзимом и отображаются с двумя разрезами.

Для решения задачи я в дополнение к паре переменных cutDirect и cutComplement завел пару дополнительных переменные secondCutDirect и secondCutComplement, в которые пишется информация о втором разрезе (если он есть). Практически все изменения, связанные с отрисовкой второго разреза я сделал методом переиспользования кода, т.е. выделяю часть кода, ответственную за отрисовку первого сайта, в отдельную функцию и вызываю эту функцию сначала с аругментами cutDirect и cutComplement, а затем - с secondCutDirect и secondCutComplement. Такой способ намного надежнее непосредственного переписывания алгоритма отрисовки, т.к., фактически, сам проверенный годами алгоритм отрисовки не меняется.

Можно увидеть очень много изменений в файле EnzymeModel.cpp. Часть из них связана с тем, что я вынес лямбды в отдельные функции. Для удобства просмотра, это сделано в отдельном коммите.

Помимо функции отрисовки сайтов рестрикции нужно было разобраться с теми функциями, которые с ними связаны и используют эти разрезы. Это разбиение на фрагменты Digest into fragments и кнопка Reset в редактировании фрагмента в диалоге клонирования. Комментарии будут в коде.

Написал один GUI тест, где проверил сразу все.