Развитие RNAInSpace, алгоритм CRA, проблемы кода на Linux и прочие

    Что-то давно не писал, вот решил написать промежуточную статью о развитии RNAInSpace. Первый этап статей собран в Получена траектория сворачивания вироидного рибозима или новости с фронтов при использовании ПО RNAInSpace. Попробуем начать второй этап.

    Второй этап я собирался начать со сворачивания тРНК. Тут оказались некоторые проблемы. С другой стороны, есть интересный алгоритм CRA, который должен помочь решить мне эти проблемы. Он сложный и я его не понимаю. Но он реализован в некоторых ПО в основном для Linux. Что есть большое фи. В общем обо всем по порядку.

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



    Сворачивание тРНК



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

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



    Можно видеть, что с тРНК все намного сложнее, чем в прошлой статье с рибозимом. Если в рибозиме было сравнительно сложно образовать связи между тремя нуклеотидами, для правильной стыковки двух спиралей, то тут для тРНК нужно, чтобы T-спираль четко обкрутилась нуклеотидами 44-48, с другой стороны 8-9, а затем правильно стыковалось бы со спиралью D.

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

    На данный момент, могу показать модель, где образованы все спирали, кроме конечной (1-7 + 66-72). Но стыковка спиралей T и D, при необходимости создать все водородные связи еще не полностью происходит.



    Видно, что если бы получилось правильно стыковать, и закрутить оставшуюся спираль — то профиль тРНК соответствовал реальному. А уже на сколько, измеряя по RMSD — это уже существенно вторичный вопрос. Но именно так сравнивают теперешние ученные в этой области. Хотя, пока я изучал реальную модель .pdb этой РНК — в ней тоже нашел несколько ошибок. Поэтому она тоже не идеальна, хотя и получена биологическими методами. Поэтому измерению по RMSD с моделью — доверять надо осторожно.

    Метод CRA



    Зачем он?

    Можно, конечно, отдать еще несколько месяцев и добиться стыковки спиралей T и D полуавтоматически сворачивая с помощью моего ПО RNAInSpace, вмешиваясь там где человек видит, что сворачивание идет не так, и играясь с последовательностью сворачивания и параметрами колебания.

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

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


    В общем удивительно, но ни в работотехнике, ни в других связанных с кинематикой областях, такой алгоритм не разработали.
    Я задался целью поискать и найти как решается нужная мне проблема. Оказывается есть такие алгоритмы, и разрабатываются давно, хотя практически используются недавно. На русском, по обычаю :) ничего даже близко нет… что несколько обидно.

    Что он конкретно делает?

    Называются такие алгоритмы — concerted rotation algorithm. Мне попалась статья про т.н. CRISP алгоритм, который сделан для того, чтобы улучшить CRA алгоритм. Реализация CRISP и CRA была сделана в ПО PHAISTOS is a Markov chain Monte Carlo framework for protein structure simulations..

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



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

    Это делается в два этапа. Первый — вращаем как хотим наш атом. Если мы не будем связанно вращать оставшийся конец, который зафиксирован, то произойдет разрыв цепи. Хорошо, мы идем на это. А вот вторым этапом, вращением последующего атома мы должны рассчитать так, чтобы разрыв полностью исчез. Как я понимаю там идет какая-та погрешность, и проблемы с тем, что такое закрытие разрыва может привести к пересечению атомов (связей) — и поэтому разные алгоритмы с разной эффективностью это делают.

    Как это он делает?

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

    Проблемы реализаций

    Первая проблема — они написаны под Linux. Хороша новость, то что они написаны на Си. Вообще, смотря код писанный под Linux я никак не могу побороть у себя впечатление, что возвращаюсь в доисторическую эпоху. Говорить о совместимости с Windows (т.е. якобы многоплатформенности) — совершенно не приходится (а я как минимум 3 больших проекта «смотрел»).

    Я даже не понимаю, почему люди хотят жить на 30 лет в прошлом. Но сейчас не об этом.

    Второе, качество кода — Phaistos и Gromacs (о котором после) — не просто плохое, а ужасное. Плохо, это когда нет классов и объектов, или они переплетены со структурным стилем :), ужас — когда то, что есть написано так, что все переплетено.

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

    Попробовал я партировать Phaistos в Windows… невозможно. Он использует библиотеку boost, где я после пару дней мучений пришел к однозначному выводу, библиотека сама по себе дрянь (использование шаблонов, в таком количестве, что код получается ужасным), и она не компилируется под Windows на MS Visual Studio. Забыли.

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

    Тогда возможно процесс у меня пойдет быстрее. По хорошему хочу сделать реализацию метода CRA под MS Visual Studio, как отдельную библиотеку, на вход подаешь координаты атомов, фиксированные атомы, желаемый поворот и — опля, алгоритм закрывает разрыв.
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 32

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

      Первая проблема — они написаны под Linux. Хороша новость, то что они написаны на Си. Вообще, смотря код писанный под Linux я никак не могу побороть у себя впечатление, что возвращаюсь в доисторическую эпоху. Говорить о совместимости с Windows (т.е. якобы многоплатформенности) — совершенно не приходится (а я как минимум 3 больших проекта «смотрел»).

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

      Попробовал я партировать Phaistos в Windows… невозможно. Он использует библиотеку boost, где я после пару дней мучений пришел к однозначному выводу, библиотека сама по себе дрянь (использование шаблонов, в таком количестве, что код получается ужасным), и она не компилируется под Windows на MS Visual Studio

      Boost — отличная библиотека, а использование шаблонов порой единственный вариант чтобы исправить недостатки С++ и получить оптимальную производительность. К тому же она вполне себе компилируется под Visual Studio, если брать свежие версии, то под них есть утилиты, которые автоматически собирают либы под х32 и х64 для студии.
        0
        Про Boost — я вам скажу в чем проблема. Не компилируется

        util.hpp (BOOST_STRING_UTIL_DETAIL_HPP)

        с ошибкой компилятора error C2951: Объявления шаблона разрешены только в глобальной области, области пространства имен и области класса

        (именно это критично, остальное можно решить)

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

        P.S. С остальным не согласен по определению, отсюда и категоричность. Но разговор получится длинным и не по теме. Можно жить и с проблемами 30-летней давности, но как то теперь не хочется… есть много лучшие альтернативы.
          +1
          Можно узнать версию boost'а, Visual Studio, и команду компиляции?
            0
            Все самое новое, boost 1.51, Visual Studio 2010. Что значит команда компиляции?

            Там такой код в util.hpp (BOOST_STRING_UTIL_DETAIL_HPP)

                        template< 
                            typename SeqT, 
                            typename IteratorT=BOOST_STRING_TYPENAME SeqT::const_iterator >
                        struct copy_iterator_rangeF : 
                            public std::unary_function< iterator_range<IteratorT>, SeqT >
                        {
                            SeqT operator()( const iterator_range<IteratorT>& Range ) const
                            {
                                return copy_range<SeqT>(Range);
                            }
                        };
            
            


            где не компилируется строка return copy_range(Range);

            т.к. copy_range тоже шаблон, который определен в теле функции, что и говорит ошибка error C2951
              +1
              Вы сам boost собираете, или уже проект, который его использует? Если сам буст, то скорее всего вы запускаете ./b2 с какими-то параметрами. Добавьте туда -d+2 и покажите, что он пишет.
                0
                Я собираю все вместе проект, который ссылается на неоткомпилированный буст.

                Про параметры не понял, это параметры чего?

                Вот мои параметры компиляции
                /ZI /nologo /W3 /WX- /Od /Oy- /D "_MBCS" /Gm /EHsc /RTC1 /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fp«Debug\RNAInSpaceCRISP.pch» /Fa«Debug\» /Fo«Debug\» /Fd«Debug\vc100.pdb» /Gd /analyze- /errorReport:queue

                А вот параметры компоновщика

                /OUT:«P:\_PROGRAMMING_\RNAInSpaceCRISP\Debug\RNAInSpaceCRISP.exe» /NOLOGO «kernel32.lib» «user32.lib» «gdi32.lib» «winspool.lib» «comdlg32.lib» «advapi32.lib» «shell32.lib» «ole32.lib» «oleaut32.lib» «uuid.lib» «odbc32.lib» «odbccp32.lib» /MANIFEST /ManifestFile:«Debug\RNAInSpaceCRISP.exe.intermediate.manifest» /ALLOWISOLATION /MANIFESTUAC:«level='asInvoker' uiAccess='false'» /DEBUG /PDB:«P:\_PROGRAMMING_\RNAInSpaceCRISP\Debug\RNAInSpaceCRISP.pdb» /PGD:«P:\_PROGRAMMING_\RNAInSpaceCRISP\Debug\RNAInSpaceCRISP.pgd» /TLBID:1 /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:QUEUE

                  0
                  Это из настроек проекта Visual Studio? Если да, то зайдите во вкладку output, log или как там она называется, и скопируйте текст оттуда.
                    0
                    Перед этим сделайте, как описано в ответе здесь: stackoverflow.com/questions/1211841/how-can-i-make-visual-studios-build-be-very-verbose
                      0
                      Да, это из настроек проекта Visual Studio. Но не пойму про какую вкладу говорите. Самое похожие C/C++ -> Output Files… но вроде это не то…

                      Надо установить какие-то параметры компилятора, компоновщика? Какие?

                        0
                        Там же где errors.

                        В бусте чтобы понять, что именно падает, мало маленького кусочка кода посреди header файла. Я хочу увидеть, на компиляции какого именно файла (.cpp) у вас что-то падает, и какие пути для поиска header-файлов передаются компилятору, чтобы можно было воспроизвести.
                          0
                          Окно, нашел (оно по умолчанию скрыто)… но там хренова туча… там еще много warning которые не относятся к делу.

                          вот что-то от туда про эту ошибку

                          1>p:\ps\microsoft visual studio 10.0\vc\include\boost\algorithm\string\detail\util.hpp(97): error C2951: Объявления шаблон разрешены только в глобальной области, области пространства имен и области класса
                          1> p:\ps\microsoft visual studio 10.0\vc\include\boost\algorithm\string\detail\util.hpp(96): при компиляции функции-члена «std::basic_string<_Elem,_Traits,_Ax> boost::algorithm::detail::copy_iterator_rangeF<SeqT,IteratorT>::operator ()(const boost::iterator_range &) const» класса шаблон
                          1> with
                          1> [
                          1> _Elem=char,
                          1> _Traits=std::char_traits,
                          1> _Ax=std::allocator,
                          1> SeqT=std::basic_string<char,std::char_traits,std::allocator>,
                          1> IteratorT=input_iterator_type
                          1> ]
                          1> p:\ps\microsoft visual studio 10.0\vc\include\boost\utility\result_of.hpp(41): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::algorithm::detail::copy_iterator_rangeF<SeqT,IteratorT>»
                          1> with
                          1> [
                          1> SeqT=std::basic_string<char,std::char_traits,std::allocator>,
                          1> IteratorT=input_iterator_type
                          1> ]
                          1> p:\ps\microsoft visual studio 10.0\vc\include\boost\utility\detail\result_of_iterate.hpp(28): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::detail::has_result_type»
                          1> with
                          1> [
                          1> T=const copy_range_type
                          1> ]
                          1> p:\ps\microsoft visual studio 10.0\vc\include\boost\utility\detail\result_of_iterate.hpp(75): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::tr1_result_of»
                          1> with
                          1> [
                          1> F=const copy_range_type (const boost::iterator_range<std::_String_iterator<char,std::char_traits,std::allocator>> &)
                          1> ]
                          1> p:\ps\microsoft visual studio 10.0\vc\include\boost\mpl\eval_if.hpp(41): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::result_of»
                          1> with
                          1> [
                          1> F=const copy_range_type (const boost::iterator_range<std::_String_iterator<char,std::char_traits,std::allocator>> &)
                          1> ]
                          1> p:\ps\microsoft visual studio 10.0\vc\include\boost\iterator\iterator_adaptor.hpp(166): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::mpl::eval_if<C,F1,F2>»
                          1> with
                          1> [
                          1> C=boost::is_same<boost::use_default,boost::use_default>,
                          1> F1=boost::result_of<const copy_range_type (const boost::iterator_range<std::_String_iterator<char,std::char_traits,std::allocator>> &)>,
                          1> F2=boost::mpl::identity<boost::use_default>
                          1> ]
                          1> p:\ps\microsoft visual studio 10.0\vc\include\boost\iterator\transform_iterator.hpp(50): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::detail::ia_dflt_help<T,DefaultNullaryFn>»
                          1> with
                          1> [
                          1> T=boost::use_default,
                          1> DefaultNullaryFn=boost::result_of<const copy_range_type (const boost::iterator_range<std::_String_iterator<char,std::char_traits,std::allocator>> &)>
                          1> ]
                          1> p:\ps\microsoft visual studio 10.0\vc\include\boost\iterator\transform_iterator.hpp(75): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::detail::transform_iterator_base<UnaryFunc,Iterator,Reference,Value>»
                          1> with
                          1> [
                          1> UnaryFunc=copy_range_type,
                          1> Iterator=find_iterator_type,
                          1> Reference=boost::use_default,
                          1> Value=boost::use_default
                          1> ]
                          1> p:\ps\microsoft visual studio 10.0\vc\include\boost\algorithm\string\iter_find.hpp(168): см. ссылку на создание экземпляров класса шаблон при компиляции «boost::transform_iterator<UnaryFunc,Iterator>»
                          1> with
                          1> [
                          1> UnaryFunc=copy_range_type,
                          1> Iterator=find_iterator_type
                          1> ]
                          1> p:\ps\microsoft visual studio 10.0\vc\include\boost\algorithm\string\split.hpp(149): см. ссылку на создание экземпляров функции шаблон при компиляции «SequenceSequenceT &boost::algorithm::iter_split<SequenceSequenceT,RangeT,boost::algorithm::detail::token_finderF>(SequenceSequenceT &,RangeT &,FinderT)»
                          1> with
                          1> [
                          1> SequenceSequenceT=std::vector<std::string>,
                          1> RangeT=std::string,
                          1> PredicateT=boost::algorithm::detail::is_any_ofF,
                          1> FinderT=boost::algorithm::detail::token_finderF<boost::algorithm::detail::is_any_ofF>
                          1> ]
                          1> p:\_programming_\rnainspacecrisp\rnainspacecrisp\definitions.h(590): см. ссылку на создание экземпляров функции шаблон при компиляции «SequenceSequenceT &boost::algorithm::split<std::vector<_Ty>,std::string,boost::algorithm::detail::is_any_ofF>(SequenceSequenceT &,RangeT &,PredicateT,boost::algorithm::token_compress_mode_type)»
                          1> with
                          1> [
                          1> SequenceSequenceT=std::vector<std::string>,
                          1> _Ty=std::string,
                          1> CharT=char,
                          1> RangeT=std::string,
                          1> PredicateT=boost::algorithm::detail::is_any_ofF1> ]

                          и не одного .cpp
                            0
                            понял что вы хотите вот какой «пользовательский» код приводит к ошибке

                            inline std::istream &operator>>(std::istream &input, AtomSelectionEnum &a) {
                                 std::string raw_string;
                                 std::getline(input, raw_string);
                            
                                 std::vector<std::string> split_raw_string;
                                 boost::split(split_raw_string, 
                                              raw_string, 
                                              boost::is_any_of(" "));
                            
                                 AtomSelectionEnum atom_selection = NO_ATOMS;
                                 for (unsigned int i=0; i<split_raw_string.size(); ++i) {
                                      for (unsigned int j=0; j<ATOM_SELECTION_ENUM_SIZE; ++j) {
                                           if (split_raw_string[i] == atom_selection_name[j]) {
                                                atom_selection = AtomSelectionEnum((int)atom_selection | 
                                                                                   (int)atom_selection_array[j]);
                                                break;
                                           }
                                      }
                                 }
                            
                                 if (atom_selection != NO_ATOMS)
                                      a = atom_selection;
                            
                                 return input;
                            }
                            
                            


                            Использование boost::is_any_of
                            0
                            View->Output
                        0
                        b2 — это что?
                          +1
                          Он же bjam, в boost'е не все библиотеки header-only, что-то нужно предварительно компилить. Примерно как описано здесь: www.boost.org/doc/libs/1_51_0/doc/html/bbv2/installation.html или dev.mindillusion.ru/boost/
                            0
                            Вроде как ясно, bjam видимо откомпилирует boost другим не MS компилятором и все будет тогда будет ок. Геморрой, конечно… но решение.
                              0
                              Нет, он его компилирует тем, который есть. В вашем случае это будет cl.exe.
                                0
                                тогда странно, почему же выше я делаю по сути тоже, но там очевидная ошибка с точки зрения MS компилятора?
                                  0
                                  Ну, ок, я запустил компиляцию lib но ошибка выше думаю не связана с библиотеками. Там где были нужны библиотеки у меня запросил линковщик, и я их отдельно компилировал и давал ему. А тут другой случай.
                          0
                          и да, такого типа ошибок (именно определения шаблонов не там где положено) много, эта характерный пример.
                        0
                        Вот с чем мы имеем дело в boost Объективные недостатки С++, снова хреново функциональное программирование, оказывается используется boost::mpl… ну и конечно жди ошибок…
                          0
                          справедливости ради надо сказать, что именно хитровывернутый код от Phaistos так закручивает использование boost, что получаются ошибки… но сама библиотека это не ловит, а лог ошибок с большим трудом дает понять в чем дело… все это превращает программирование в геморрой и ничего более… настоятельно советую не использовать boost, не будите способствовать появлению багов…
                      0
                      Так какую статью вы не смогли понять?
                        0
                        Поможете?
                          0
                          Вообще статья называлась A CONCERTED-ROTATION ALGORITHM FOR MONTE CARLO SAMPLING OF PROTEINS, но похоже её убрали из публичного доступа… если захотите прочесть и рассказать пишите в личку, попробую найти вроде бы сохранял у себя, вышлю почтой
                            0
                            И да, правильнее сказать я не понимаю алгоритм описанный в статье
                              0
                              А вообще более актуально другая статья, про CRA

                              Monte Carlo backbone sampling for polypeptides with variable bond angles
                              and dihedral angles using concerted rotations and a Gaussian bias
                              Jakob P. Ulmschneider and William L. Jorgensen
                              Citation: J. Chem. Phys. 118, 4261 (2003); doi: 10.1063/1.1542611
                              View online: dx.doi.org/10.1063/1.1542611
                              View Table of Contents: jcp.aip.org/resource/1/JCPSA6/v118/i9
                              Published by the American Institute of Physics.
                                0
                                Скачал, попробую понять.
                                  0
                                  Спасибо. Как успехи? Я вроде как грубо запустил одну реализацию этого алгоритма.

                                  Если будите разбираться, давайте посмотрим на сколько реализация соответствует описанному. Как я понимаю на вход нужно подать координаты 15 атомов. Именно 15 — вопрос почему?

                                  Далее первая фаза «prerotation» похоже не может быть произвольным движением, а как-то особо вычисляется. Что будет если мы сделаем произвольный разрыв — вторая фаза «закрытия цепи» не сможет закрыть разрыв?

                                  Вообще понятно ли когда разрыв не будет закрыт этим алгоритмом?
                                    +2
                                    Эту статью прочитал, теперь читаю статью про CRISP, которую мне прислал автор. Но пока я лишь изучил все поверхностно — с конкретным алгоритмом вычислений я пока не разбирался.

                                    Prerotation выбирается c помощью некоторого гауссового распределения. Его делают небольшим, чтобы атом не ушел слишком далеко. Если атом, к примеру, уйдет дальше чем на длину 3 связей, то закрыть цепь с помощью выбора углов для последних 3 связей будет не возможно. Поэтому нужно искать компромисс. Большое возмущение — быстрее исследуется пространство состояний, но меньшее количество попыток являются удачными (в которых можно закрыть цепь).
                                    Гауссово распределение углов в prerotation выбирается так, чтобы положение последнего атома в prerotation было сферическим гауссовым. Поскольку степеней свободы углов в prerotation достаточно для удержания последнего атома в prerotation неподвижным, то этого не достаточно — изменения углов не получатся малыми. Чтобы этого не происходило, распределение дополнительно домножается на сферическое гауссово распределение для углов. Таким образом получается гауссово распределение величины sqrt((сумма квадратов изменений углов в prerotation)*c_1+(расстояние от исходного положения последнего атома до нового положения последнего атома)^2*c_2).
                                      0
                                      можете мне переслать статью про CRISP? (мой майл tac@inbox.lv)
                                        0
                                        По поводу prerotation, что произойдет, если все несколько упростить. Например, не делать сравнительно сложных вычислений, а сделать произвольный поворот, но гарантировать, что атом далеко не уйдет. Сможет ли вторая фаза закрытия принципиально работать без первой. Я клоню к тому, что мне желательно изменять положение атома (в малом диапазоне, торсионный угол у меня меняется на 0.2 градуса, не скажу сколько это в перемещении атома, но думаю вполне удовлетворяет длине 3 связей) без этой сложной науки… а из алгоритма использовать только вторую фазу закрытия. Я конечно, это могу попробовать экспериментально (что и собираюсь со временем), но хотелось бы знать «приговор» математической теории.

                                        Но это скорее вопросы, когда доберетесь до деталей алгоритма.

                              Only users with full accounts can post comments. Log in, please.