7eaab0ea0ae802579cee99ebda03f98126052868
[alexxy/gromacs-domains.git] / src / domaintype.h
1 #ifndef DOMAINTYPE_H
2 #define DOMAINTYPE_H
3
4 #include <gromacs/trajectoryanalysis.h>
5 #include <gromacs/trajectoryanalysis/topologyinformation.h>
6 //#include "/home/titov_ai/Develop/gromacs-original/src/gromacs/trajectoryanalysis/topologyinformation.h"
7
8 #include "gtest/gtest.h"
9
10 #include <iostream>
11 #include <cfloat>
12 #include <omp.h>
13 #include <vector>
14 #include <cstdio>
15
16 using namespace gmx;
17
18 class domainType {
19     public:
20
21         // деструктор класса
22         ~domainType();
23
24         // конструктор класса для инициализации
25         domainType();
26
27         // конструктор класса для полноценной инициализации данных
28         domainType(const std::vector< size_t > &index, const std::vector< RVec > &reference,
29                     const int windowSize, const int domainMinimumSize,
30                     const int domainSearchAlgorythm, const int timeStepBetweenWindowStarts,
31                     const unsigned int sliceNum, const double epsilon, const double delta,
32                     const std::string outPutFileName);
33
34         // set numeric values to "-1" / string value to "" - if you want default settings
35         // функция заполнения необходимыми данными для вычисления структурных доменов
36         void setDefaults(const std::vector< size_t > &index, const std::vector< RVec > &reference,
37                         const int windowSize, const int domainMinimumSize,
38                         const int domainSearchAlgorythm, const int timeStepBetweenWindows,
39                         const unsigned int sliceNum, const double epsilon, const double delta,
40                         const std::string outPutFileName);
41
42         // фукнция обновления данных для выделения структурных доменов
43         void update(const std::vector< std::vector< RVec > > &frame, const int frameNumber);
44
45     private:
46
47         FRIEND_TEST(domainTests, domainTest_setDefaults);
48         FRIEND_TEST(domainTests, domainTest_setGraph);
49         FRIEND_TEST(domainTests, domainTest_deleteDomainFromGraph);
50         FRIEND_TEST(domainTests, domainTest_searchDomainSizes);
51         FRIEND_TEST(domainTests, domainTest_getDomains);
52         FRIEND_TEST(domainTests, domainTest_print);
53
54         // узел матрицы связности: число вхождений в один домен, вектор между элементами в референсной структуре, флаг для проверки
55         // последние два пункта технически можно перевычеслять при каждом обращении, что сократит размер ячейки с 20 байт до 4
56         // но замедлит скорость работы программы, возможно стоит проверить на больших структурах
57         struct node {
58             int num;
59             bool check;
60         };
61         // таблица векторных соотношений в референсной структуре
62         std::vector< std::vector< RVec > >                                  refTable;
63         // индекс структуры
64         std::vector< size_t >                                               structIndex;                    // must be presented
65         // рабочие окна -> рассматриваемые основные последовательности -> матрица соотношений в структуре всё на всё
66         std::vector< std::vector< std::vector< std::vector< node > > > >    graph;
67         // списки доменов
68         std::vector< std::vector< size_t > >                                domains;
69         // размеры доменов для каждой основной последовательности
70         std::vector< std::vector< int > >                                   domsizes;
71         // размер рассматриваемого окна в последовательных фреймах траектории
72         int                                                                 window      {1000};             // selectable
73         // счётчик эффективных последовательных обновлений структуры graph
74         int                                                                 updateCount {0};
75         // минимальный рассматриваемый размер домена - осмысленно брать 4+
76         int                                                                 dms         {4};                // selectable
77         // какой из алгоритмов выделения использовать 0 - от максимального домена к меньшим / 1 - самый большой домен (первый из равных) / 2 - от минимального домена к большим
78         int                                                                 dsa         {0};                // selectable
79         // константа допустимых тепловых колебаний  относительно центра домена, находящегося в конкретном атоме структуры
80         double                                                              eps         {0.2};              // selectable
81         // константа допустимой входимости атома в выделяемый домен, призвана сгладить резкую границу константы eps
82         double                                                              dlt         {0.95};             // selectable
83         // шаг между началами рассматриваемых окон на траектории в фреймах
84         int                                                                 ts          {window / 10};      // selectable
85         // название выходного файла для записи доменов, так же происходит создание selectionList для выделенных доменов
86         std::string                                                         outPut      = "default.ndx";    // selectable
87
88         // инициализация матриц соотношений в структуре
89         void setGraph(std::vector< std::vector< node > > &smallGraph);
90
91         // "зануление" элементов матриц вошедших в домен
92         void deleteDomainFromGraph(const std::vector< size_t > &domain);
93
94         // подсчёт размеров всех потенциально возможных доменов и проверка на наличие домена для выделения
95         bool searchDomainSizes();
96
97         // функция выделения доменов
98         void getDomains();
99
100         // функция печати ndx и selectionList файлов
101         void print(int currentFrame);
102
103
104 };
105
106 #endif // DOMAINTYPE_H