- more debug
[alexxy/gromacs-spacetimecorr.git] / src / corrtype.cpp
1 #include "corrtype.h"
2
3 // деструктор класса
4 correlationType::~correlationType() {}
5
6 // конструктор класса для инициализации
7 correlationType::correlationType() {}
8
9 correlationType::correlationType(const std::vector< RVec > &ref, int wnd, int taau, int tau_st, float crlUp, float effRad, int mod,
10                                  const std::string &out, const std::vector< int > &indx,
11                                  const std::vector< std::vector < std::vector < size_t > > > &sels,
12                                  const std::vector< std::string > &rsNames) {
13     setDefaults(ref, wnd, taau, tau_st, crlUp, effRad, mod, out, indx, sels, rsNames);
14 }
15
16 void correlationType::setDefaults(const std::vector< RVec > &ref, int wnd, int taau, int tau_st, float crlUp, float effRad, int mod,
17                                   const std::string &out, const std::vector< int > &indx,
18                                   const std::vector< std::vector < std::vector < size_t > > > &sels,
19                                   const std::vector< std::string > &rsNames) {
20     // очень странная штука в индуском стиле... зачем столько ифов?!!!
21     if (ref.size() != 0) {reference = ref;}
22     if (wnd != -1) {window = wnd;}
23     if (taau != -1) {tau = taau;}
24     if (tau_st != -1) {tauStep = tau_st;}
25     if (crlUp != -1) {crlUpBorder = crlUp;}
26     if (effRad != -1) {effRadius = effRad;}
27     if (mod != -1) {mode = mod;}
28     if (out != "") {outputName = out;}
29     if (sels.size() != 0) {selections = sels;}
30     if (rsNames.size() > 0) {resNames = rsNames;}
31     if (indx.size() > 0) {index = indx;}
32     subGraphRouts.resize(0);
33     trajectoryPartition();
34 }
35
36 void correlationType::update(const int frameNum, const std::vector< RVec > &curFrame) {
37     std::cout << "\tola001";
38     trajectory.push_back(curFrame);
39     size_t temp = window + tau;
40     std::cout << "\tola002";
41     if (trajectory.size() == temp + 1) {
42         trajectory.erase(trajectory.begin());
43     }
44     std::cout << "\tola003";
45     if (mode == 1) {
46         std::cout << "\tola004";
47         if ((frameNum - temp + 1) % tauStep == 0) {
48             correlationEval();
49             selections.erase(selections.begin());
50             std::cout << "ola005" << std::endl;
51         }
52     }
53     std::cout << "\tola006";
54 }
55
56 void correlationType::readEval() {
57     std::cout << "ola005" << std::endl;
58     if (mode == 0) {
59         readWriteCorrelations(0);
60         subGraphRouts.resize(subGraphRouts.size() + 1);
61         std::cout << "ola006" << std::endl;
62         graphCalculations(1, static_cast< size_t >(tau));
63         std::cout << "ola007" << std::endl;
64         graphBackBoneEvaluation();
65         std::cout << "ola008" << std::endl;
66     }
67 }
68
69 void correlationType::printData() {
70     printOutputData();
71 }
72
73 void correlationType::trajectoryPartition() {
74     std::vector< bool > temp1;
75     std::pair< size_t, size_t > temp2;
76     float temp3;
77     std::vector< std::vector < std::vector < size_t > > > selectionsTemp;
78     selectionsTemp.resize(selections.size());
79     for (size_t i1 {0}; i1 < selections.size(); i1++) {
80         selectionsTemp[i1].resize(selections[i1].size());
81         for (size_t i2 {0}; i2 < selections[i1].size(); i2++) {
82             selectionsTemp[i1][i2].resize(0);
83             for (size_t i3 {0}; i3 < selections[i1][i2].size(); i3++) {
84                 for (size_t i4 {0}; i4 < index.size(); i4++) {
85                     if (selections[i1][i2][i3] == index[i4]) {
86                         selectionsTemp[i1][i2].push_back(i4);
87                         break;
88                     }
89                 }
90             }
91         }
92     }
93     selections = selectionsTemp;
94     for (auto &k : selections) {
95         temp1.resize(0);
96         temp1.resize(index.size(), true);
97         for (auto &i : k) {
98             for (auto &j : i) {
99                 temp1[j] = false;
100             }
101         }
102         for (size_t i {0}; i < temp1.size(); i++) {
103             if (temp1[i]) {
104                 temp3 = std::numeric_limits<float>::max();
105                 for (size_t f {0}; f < k.size(); f++) {
106                     for (size_t j {0}; j < k[f].size(); j++) {
107                         if (float temp4 {(reference[k[f][j]] - reference[i]).norm()}; temp3 > temp4) {
108                             temp3 = temp4;
109                             temp2 = std::make_pair(f, j);
110                         }
111                     }
112                 }
113                 k[temp2.first].push_back(i);
114             }
115         }
116     }
117 }
118
119 void correlationType::readWriteCorrelations(int rwMode) {
120     FILE *file;
121     if (rwMode == 1) {
122         file = std::fopen((outputName + "-matrixData").c_str(), "a");
123         for (size_t i {0}; i < matrixes.size(); i++) {
124             std::fprintf(file, "%d %lud\n", count, i);
125             for (size_t j {0}; j < matrixes[i].size(); j++) {
126                 for (size_t f {0}; f < matrixes[i][j].size(); f++) {
127                     std::fprintf(file, "%.4f ", matrixes[i][j][f]); //~16
128                 }
129                 std::fprintf(file, "\n");
130             }
131         }
132         std::fclose(file);
133       }
134     if (rwMode == 0) {
135         file = std::fopen((outputName + "-matrixData").c_str(), "r+");
136         matrixes.resize(0);
137         matrixes.resize(static_cast< unsigned int >(tau + 1));
138         for (size_t i {0}; i < static_cast< size_t >(tau + 1); i++) {
139             int t0, t1, t2 = std::fscanf(file, "%d %d\n", &t0, &t1);
140             matrixes[i].resize(0);
141             matrixes[i].resize(index.size());
142             for (size_t j {0}; j < index.size(); j++) {
143                 matrixes[i][j].resize(index.size());
144                 for (size_t k {0}; k < index.size(); k++) {
145                     t2 = std::fscanf(file, "%lf ", &matrixes[i][j][k]);
146                 }
147             }
148         }
149     }
150 }
151
152 inline void correlationType::trajectoryFitting() {
153     std::vector< std::vector< std::pair< size_t, size_t > > > pairs;
154     pairs.resize(0);
155     pairs.resize(selections.front().size());
156     for (size_t i {0}; i < selections.front().size(); i++) {
157         pairs[i].resize(0);
158         for (size_t j {0}; j < selections.front()[i].size(); j++) {
159             pairs[i].push_back(std::make_pair(selections.front()[i][j], selections.front()[i][j]));
160         }
161     }
162     fitTrajectory.resize(0);
163     fitTrajectory.resize(selections.front().size(), trajectory);
164     #pragma omp parallel for schedule(dynamic) firstprivate(reference)
165     for (size_t i = 0; i < selections.front().size(); i++) {
166         for (size_t j {0}; j < fitTrajectory[i].size(); j++) {
167             MyFitNew(reference, fitTrajectory[i][j], pairs[i], 0);
168         }
169     }
170     #pragma omp barrier
171     for (size_t i {0}; i < selections.front().size(); i++) {
172         for (size_t j {0}; j < selections.front()[i].size(); j++) {
173             for (size_t k {0}; k < fitTrajectory[i].size(); k++) {
174                 trajectory[k][selections.front()[i][j]] = fitTrajectory[i][k][selections.front()[i][j]];
175             }
176         }
177     }
178 }
179
180 inline void correlationType::matrixNullFitting() {
181     matrixes.resize(0);
182     matrixes.resize(static_cast< size_t >(tau + 1));
183     for (auto &i : matrixes) {
184         i.resize(0);
185         i.resize(index.size());
186         for (auto &j : i) {
187             j.resize(0);
188             j.resize(index.size());
189             for (auto &k : j) {
190                 k = 0.;
191             }
192         }
193     }
194 }
195
196 void correlationType::correlationEval() {
197     trajectoryFitting();
198     matrixNullFitting();
199     std::vector< std::vector< double > > a, b, c;
200     std::vector< double > d;
201     d.resize(index.size(), 0.);
202     #pragma omp parallel for ordered schedule(dynamic) shared(matrixes) firstprivate(trajectory, reference)
203     for (size_t i = 0; i <= static_cast< size_t >(tau); i++) {
204         a.resize(0); b.resize(0); c.resize(0);
205         a.resize(index.size(), d); b.resize(index.size(), d); c.resize(index.size(), d);
206         for (size_t j {0}; j < static_cast< size_t >(window); j++) {
207             for (size_t k1 {0}; k1 < index.size(); k1++) {
208                 for (size_t k2 {0}; k2 < index.size(); k2++) {
209                     RVec temp1, temp2;
210                     temp1 = trajectory[j][k1]     - reference[k1];
211                     temp2 = trajectory[j + i][k2] - reference[k2];
212                     a[k1][k2] +=   (static_cast<double>(temp1[0]) * static_cast<double>(temp2[0]) +
213                                     static_cast<double>(temp1[1]) * static_cast<double>(temp2[1]) +
214                                     static_cast<double>(temp1[2]) * static_cast<double>(temp2[2]));
215                     b[k1][k2] +=   (static_cast<double>(temp1[0]) * static_cast<double>(temp1[0]) +
216                                     static_cast<double>(temp1[1]) * static_cast<double>(temp1[1]) +
217                                     static_cast<double>(temp1[2]) * static_cast<double>(temp1[2]));
218                     c[k1][k2] +=   (static_cast<double>(temp2[0]) * static_cast<double>(temp2[0]) +
219                                     static_cast<double>(temp2[1]) * static_cast<double>(temp2[1]) +
220                                     static_cast<double>(temp2[2]) * static_cast<double>(temp2[2]));
221                 }
222             }
223         }
224         for (size_t j {0}; j < index.size(); j++) {
225             for (size_t k {0}; k < index.size(); k++) {
226                 matrixes[i][j][k] = a[j][k] / (std::sqrt(b[j][k] * c[j][k]));
227             }
228         }
229     }
230     #pragma omp barrier
231     for (size_t i {0}; i < matrixes.size(); i++) {
232         for (size_t j {0}; j < matrixes[i].size(); j++) {
233             for (size_t k {0}; k < matrixes[i][j].size(); k++) {
234                 matrixes[i][j][k] = std::round(matrixes[i][j][k] * 10000) / 10000;
235             }
236         }
237     }
238     readWriteCorrelations(1);
239     count++;
240 }
241
242 void correlationType::graphCalculations(size_t tauStart, size_t tauEnd) {
243     graph.resize(0);
244     graph.resize(index.size());
245     subGraphPoints.resize(0);
246     subGraphRbr.resize(0);
247     for (size_t i {0}; i < index.size(); i++) {
248         graph[i].resize(index.size(), std::make_pair(0, -1));
249     }
250     RVec temp;
251     for (size_t i {tauStart}; i <= tauEnd; i++) {
252         for (size_t j {0}; j < index.size(); j++) {
253             for (size_t k {j}; k < index.size(); k++) {
254                 temp = reference[j] - reference[k];
255                 if (double tempIf {std::max(std::abs(matrixes[i][j][k]), std::abs(matrixes[i][k][j]))}; (tempIf >= static_cast< double >(crlUpBorder)) &&
256                     (static_cast< float >(norm(temp)) <= effRadius) && (std::abs(graph[j][k].first) < tempIf)) {
257                     graph[j][k].first = tempIf;
258                     graph[j][k].second = static_cast< int >(i);
259                 }
260             }
261         }
262     }
263     std::vector< bool > graph_flags;
264     graph_flags.resize(0);
265     graph_flags.resize(index.size(), true);
266     std::vector< size_t > a;
267     std::vector< std::pair< size_t, size_t > > b;
268     a.resize(0);
269     b.resize(0);
270     std::vector< size_t > width1, width2, tempSubGraph;
271     for (size_t i {0}; i < index.size(); i++) {
272         if (graph_flags[i]) {
273             subGraphPoints.push_back(a);
274             subGraphRbr.push_back(b);
275             width1.resize(0);
276             width2.resize(0);
277             tempSubGraph.resize(0);
278             width1.push_back(i);
279             tempSubGraph.push_back(i);
280             graph_flags[i] = false;
281             while(width1.size() > 0) {
282                 width2.resize(0);
283                 for (size_t j {0}; j < width1.size(); j++) {
284                     for (size_t k {0}; k < index.size(); k++) {
285                         if ((graph[width1[j]][k].second > -1) && graph_flags[k]) {
286                             width2.push_back(k);
287                             graph_flags[k] = false;
288                         }
289                     }
290                 }
291                 width1 = width2;
292                 for (size_t j {0}; j < width2.size(); j++) {
293                     tempSubGraph.push_back(width2[j]);
294                 }
295             }
296             subGraphPoints.back() = tempSubGraph;
297             for (size_t j {0}; j < tempSubGraph.size(); j++) {
298                 for (size_t k {0}; k < index.size(); k++) {
299                     if (graph[tempSubGraph[j]][k].second > -1) {
300                         subGraphRbr.back().push_back(std::make_pair(tempSubGraph[j], k));
301                     }
302                 }
303             }
304         }
305     }
306 }
307
308 bool correlationType::myComparisonFunction (const std::pair< int, double > i, const std::pair< int, double > j) {
309     return i.second < j.second;
310 }
311
312 void correlationType::graphBackBoneEvaluation() {
313     std::vector< double >                       key;
314     std::vector< long >                         path;
315     std::vector< std::pair< size_t, double > >  que;
316     std::vector< std::pair< size_t, size_t > >  a;
317     size_t                                      v;
318     a.resize(0);
319     subGraphRouts.back().resize(0);
320     for (size_t i {0}; i < subGraphPoints.size(); i++) {
321         key.resize(0);
322         path.resize(0);
323         que.resize(0);
324         v = 0;
325         if (subGraphPoints[i].size() > 2) {
326             key.resize(index.size(), 2);
327             path.resize(index.size(), -1);
328             key[subGraphPoints[i][0]] = 0;
329             for (size_t j {0}; j < subGraphPoints[i].size(); j++) {
330                 que.push_back(std::make_pair(subGraphPoints[i][j], key[subGraphPoints[i][j]]));
331             }
332             std::sort(que.begin(), que.end(), myComparisonFunction);
333             while (!que.empty()) {
334                 v = que.front().first;
335                 que.erase(que.begin());
336                 for (size_t j {0}; j < subGraphRbr[i].size(); j++) {
337                     long u {-1};
338                     if (subGraphRbr[i][j].first == v) {
339                         u = subGraphRbr[i][j].second;
340                     } else if (subGraphRbr[i][j].second == v) {
341                         u = subGraphRbr[i][j].first;
342                     }
343                     bool flag {false};
344                     size_t pos {0};
345                     for (size_t k {0}; k < que.size(); k++) {
346                         if (que[k].first == u) {
347                             flag = true;
348                             pos = k;
349                             k = que.size() + 1;
350                         }
351                     }
352                     if (double tempIf {1. - std::abs(graph[v][static_cast< size_t >(u)].first)};
353                             flag && (key[static_cast< size_t >(u)] > tempIf)) {
354                         path[static_cast< size_t >(u)] = v;
355                         key[static_cast< size_t >(u)] = tempIf;
356                         que[pos].second = key[static_cast< size_t >(u)];
357                         sort(que.begin(), que.end(), myComparisonFunction);
358                     }
359                 }
360             }
361             subGraphRouts.back().push_back(a);
362             for (size_t j {0}; j < index.size(); j++) {
363                 if (path[j] != -1) {
364                     subGraphRouts.back().back().push_back(std::make_pair(path[j], j));
365                 }
366             }
367         }
368     }
369 }
370
371 void correlationType::printOutputData() {
372     FILE *file {std::fopen((outputName + "-arrowsData.txt").c_str(), "w+")};
373     size_t same, pre {0};
374     std::vector< std::tuple< int, int, std::vector< int > > > table;
375     table.resize(0);
376     std::vector< int > a;
377     for (size_t i {0}; i < subGraphRouts.size(); i++) {
378         same = i;
379         for (size_t j {i + 1}; j < subGraphRouts.size(); j++) {
380             if (subGraphRouts[j] == subGraphRouts[i]) {
381                 same = j;
382             } else {
383                 break;
384             }
385         }
386         if (i == same) {
387             std::fprintf(file, "\n Starting time point = %d | correlations >= %0.2f | tau = %d | window = %d\n\n", static_cast< int >(i) * tauStep, static_cast< double >(crlUpBorder), tau, window);
388         } else {
389             std::fprintf(file, "\n Starting time point = [%d ; %d] | correlations >= %0.2f | tau = %d | window = %d\n\n", static_cast< int >(i) * tauStep, static_cast< int >(same) * tauStep, static_cast< double >(crlUpBorder), tau, window);
390         }
391         for (size_t j {0}; j < subGraphRouts[i].size(); j++) {
392             for (size_t k {0}; k < subGraphRouts[i][j].size(); k++) {
393                 std::fprintf(file, "cgo_arrow (id %3d), (id %3d), radius=0.05\n", index[subGraphRouts[i][j][k].first] + 1, index[subGraphRouts[i][j][k].second] + 1);
394             }
395             std::fprintf(file, "\n");
396         }
397         table.resize(0);
398         for (auto &j : subGraphRouts[i]) {
399             for (auto &k : j) {
400                 bool flag1 {true}, flag2 {true};
401                 for (size_t m {0}; m < table.size(); m++) {
402                     if (std::get<0>(table[m]) == index[k.first]) {
403                         std::get<1>(table[m])++;
404                         std::get<2>(table[m]).push_back(index[k.second]);
405                         flag1 = false;
406                     }
407                     if (std::get<0>(table[m]) == index[k.second]) {
408                         std::get<1>(table[m])++;
409                         std::get<2>(table[m]).push_back(index[k.first]);
410                         flag2 = false;
411                     }
412                 }
413                 if (flag1) {
414                     a.resize(0);
415                     a.push_back(index[k.second]);
416                     table.push_back(std::make_tuple(index[k.first], 1, a));
417                 }
418                 if (flag2) {
419                     a.resize(0);
420                     a.push_back(index[k.first]);
421                     table.push_back(std::make_tuple(index[k.second], 1, a));
422                 }
423             }
424         }
425         for (size_t j {0}; j < table.size(); j++) {
426             std::fprintf(file, "residue %s connections %d | ", (resNames[static_cast< size_t >(std::find(index.begin(), index.end(), std::get<0>(table[j])) - index.begin())]).c_str(), std::get<1>(table[j]));
427             for (size_t k {0}; k < std::get<2>(table[j]).size(); k++) {
428                 std::fprintf(file, "%s ", (resNames[static_cast< size_t >(std::find(index.begin(), index.end(), std::get<2>(table[j])[k]) - index.begin())]).c_str());
429             }
430             std::fprintf(file, "\n");
431         }
432         if (pre != 0) {
433             std::vector< std::vector< std::pair< size_t, size_t > > > temp01, temp02;
434             std::vector< std::pair< size_t, size_t > > temp03, temp04, temp05;
435             temp01 = subGraphRouts[pre];
436             temp02 = subGraphRouts[same];
437             temp03.resize(0);
438             temp04.resize(0);
439             temp05.resize(0);
440             for (auto &j : temp01) {
441                 for (auto &k : j) {
442                     temp03.push_back(k);
443                 }
444             }
445             for (auto &j : temp02) {
446                 for (auto &k : j) {
447                     temp04.push_back(k);
448                 }
449             }
450             std::sort(temp03.begin(), temp03.end());
451             std::sort(temp04.begin(), temp04.end());
452             std::set_difference(temp03.begin(), temp03.end(), temp04.begin(), temp04.end(), std::inserter(temp05, temp05.begin()));
453             std::fprintf(file, "minus:\n");
454             for (auto &j : temp05) {
455                 std::fprintf(file, "cgo_arrow (id %3d), (id %3d), radius=0.05\n", index[j.first] + 1, index[j.second] + 1);
456             }
457             temp05.resize(0);
458             std::set_difference(temp04.begin(), temp04.end(), temp03.begin(), temp03.end(), std::inserter(temp05, temp05.begin()));
459             std::fprintf(file, "plus:\n");
460             for (auto &j : temp05) {
461                 std::fprintf(file, "cgo_arrow (id %3d), (id %3d), radius=0.05\n", index[j.first] + 1, index[j.second] + 1);
462             }
463         }
464         pre = same;
465         i = same;
466     }
467     std::fclose(file);
468 }