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