fixes
authorAnatoly Titov <toluk@omrb.pnpi.spb.ru>
Sun, 14 May 2017 12:31:59 +0000 (15:31 +0300)
committerAnatoly Titov <toluk@omrb.pnpi.spb.ru>
Sun, 14 May 2017 12:31:59 +0000 (15:31 +0300)
src/spacetimecorr.cpp

index 6b83214bd8c7f60249923779fe0e17a9aacde8bd..e347c2c70e84e3c1562055b8ae43bcaa0909c845 100644 (file)
@@ -45,6 +45,7 @@
 #include <omp.h>
 #include <thread>
 #include <string>
+#include <algorithm>
 
 #include <gromacs/trajectoryanalysis.h>
 #include <gromacs/pbcutil/pbc.h>
@@ -110,7 +111,6 @@ void make_correlation_file(std::vector< std::vector< std::vector< double > > > c
 {
     FILE *file;
     file = std::fopen(file_name, "w+");
-    std::cout << "start printing\n";
     for (int i = start; i < correlations.size(); i++) {
         if (correlations.size() - start > 1) {
             std::fprintf(file, "correlation between 'n' and 'n + %d' frames\n", i);
@@ -119,23 +119,19 @@ void make_correlation_file(std::vector< std::vector< std::vector< double > > > c
             std::cout << "correlation between 'n' and 'n + " << i << "' frames\n";
         }
         for (int j = 0; j < correlations[i].size(); j++) {
-            for (int k = 0; k < correlations[i][j].size(); k++) {
-                //if (std::abs(correlations[i][j][k]) > 0.5) {
-                    std::fprintf(file, "%3.2f ", correlations[i][j][k]);
-                //}
+            for (int f = 0; f < correlations[i][j].size(); f++) {
+                std::fprintf(file, "%3.2f ", correlations[i][j][f]);
             }
             std::fprintf(file, "\n");
         }
     }
 }
 
-void make_rout_file(std::vector< int > dist, std::vector< std::vector< int > > rout, const char* file_name)
+void make_rout_file(std::vector< std::vector< int > > rout, const char* file_name)
 {
     FILE *file;
     file = std::fopen(file_name, "w+");
-    std::cout << "start printing\n";
     for (int i = 0; i < rout.size(); i++) {
-        //std::fprintf(file, "sum dist %d\n", dist[i]);
         for (int j = 0; j < rout[i].size(); j++) {
             std::fprintf(file, "%3d ", rout[i][j]);
         }
@@ -158,12 +154,6 @@ int dive_in(std::vector< std::vector< std::pair< int, int > > > graph, int start
     if (flag) {
         path.push_back(std::make_pair(start, depth_go));
     }
-
-    /*for (int i = 0; i < path.size(); i++) {
-        std::cout << path[i].second << " ";
-    }
-    std::cout << " | " << depth << "\n";*/
-
     for (int i = 0; i < graph[start].size(); i++) {
         flag = true;
         for (int j = 0; j < path.size(); j++) {
@@ -181,6 +171,8 @@ int dive_in(std::vector< std::vector< std::pair< int, int > > > graph, int start
     return (std::max(steps_old, steps));
 }
 
+bool mysortfunc (std::vector<int> a, std::vector<int> b) { return (a.size() > b.size()); }
+
 /*! \brief
  * Class used to compute free volume in a simulations box.
  *
@@ -346,7 +338,6 @@ Domains::initAfterFirstFrame(const TrajectoryAnalysisSettings       &settings,
         if (flags[i]) {
             int a, b, dist = 90000001;
             rvec temp;
-            //if (domains.size() != 2) { спорно как ту поступить
                 for (int j = 0; j < domains.size(); j++) {
                     for (int k = 0; k < domains[j].size(); k++) {
                         rvec_sub(trajectory.back()[i], trajectory.back()[domains[j][k]], temp);
@@ -357,7 +348,6 @@ Domains::initAfterFirstFrame(const TrajectoryAnalysisSettings       &settings,
                         }
                     }
                 }
-            //}
             domains_local[a].push_back(i);
             flags[i] = false;
         }
@@ -435,9 +425,12 @@ Domains::analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc,
 void
 Domains::finishAnalysis(int nframes)
 {
-    //make_pdb_trajectory(frankenstein_trajectory, "/home/toluk/Develop/samples/reca_rd/for_prez_0.pdb");
+    make_pdb_trajectory(frankenstein_trajectory, "/home/toluk/Develop/samples/reca_rd/10k_frames.pdb");
+
+    //frankenstein_trajectory = trajectory;
+
     std::vector< std::vector< std::vector< double > > > crltns;
-    int k = 1000, m = 0;
+    int k = 2000, m = 0;
     crltns.resize(k + 1);
     for (int i = 0; i < crltns.size(); i++) {
         crltns[i].resize(index.size());
@@ -446,18 +439,12 @@ Domains::finishAnalysis(int nframes)
         }
     }
 
-    //frankenstein_trajectory = trajectory;
-
     #pragma omp parallel
     {
         #pragma omp for schedule(dynamic)
         for (int i = m; i <= k; i += 1) {
             std::cout << " \n " << " k = " << i << " \n";
 
-            /*std::vector< float > medx, medy;
-            medx.resize(index.size(), 0);
-            medy.resize(index.size(), 0);*/
-
             rvec *medx, *medy, temp_zero;
             snew(medx, index.size());
             snew(medy, index.size());
@@ -469,32 +456,21 @@ Domains::finishAnalysis(int nframes)
                 copy_rvec(temp_zero, medy[i]);
             }
 
-            for (int j = 0; j < frankenstein_trajectory.size() - k; j++) {
+            for (int j = 0; j < frankenstein_trajectory.size() - i; j++) {
                 for (int f = 0; f < index.size(); f++) {
                     rvec temp;
-                    /*rvec_sub(frankenstein_trajectory[j][f], frankenstein_trajectory[j + 1][f], temp);
-                    medx[f] += norm(temp);
-                    rvec_sub(frankenstein_trajectory[j + k - 1][f], frankenstein_trajectory[j + k][f], temp);
-                    medy[f] += norm(temp);*/
-
 
                     rvec_sub(frankenstein_trajectory[basic_frame][f], frankenstein_trajectory[j][f], temp);
                     rvec_inc(medx[f], temp);
-                    rvec_sub(frankenstein_trajectory[basic_frame][f], frankenstein_trajectory[j + k][f], temp);
+                    rvec_sub(frankenstein_trajectory[basic_frame][f], frankenstein_trajectory[j + i][f], temp);
                     rvec_inc(medy[f], temp);
-
                 }
             }
 
             for (int j = 0; j < index.size(); j++) {
-                /*double temp2 = frankenstein_trajectory.size();
-                temp2 -= k;
-                medx[j] /= temp2;
-                medy[j] /= temp2;*/
-
                 rvec temp;
                 real temp2 = frankenstein_trajectory.size();
-                temp2 -= k;
+                temp2 -= i;
                 temp2 = 1 / temp2;
                 copy_rvec(medx[j], temp);
                 svmul(temp2, temp, medx[j]);
@@ -511,20 +487,13 @@ Domains::finishAnalysis(int nframes)
                 b[j].resize(index.size(), 0);
                 c[j].resize(index.size(), 0);
             }
-            for (int j = 0; j < frankenstein_trajectory.size() - k; j++) {
+            for (int j = 0; j < frankenstein_trajectory.size() - i; j++) {
                 for (int f1 = 0; f1 < index.size(); f1++) {
                     for (int f2 = f1; f2 < index.size(); f2++) {
                         rvec temp1, temp2;
-
-                        /*rvec_sub(frankenstein_trajectory[j][f1], frankenstein_trajectory[j + 1][f1], temp1);
-                        rvec_sub(frankenstein_trajectory[j + k - 1][f2], frankenstein_trajectory[j + k][f2], temp2);
-                        a[f1][f2] += (norm(temp1) - medx[f1]) * (norm(temp2) - medy[f2]);
-                        b[f1][f2] += (norm(temp1) - medx[f1]) * (norm(temp1) - medx[f1]);
-                        c[f1][f2] += (norm(temp2) - medy[f2]) * (norm(temp2) - medy[f2]);*/
-
                         rvec_sub(frankenstein_trajectory[basic_frame][f1], frankenstein_trajectory[j][f1], temp1);
                         rvec_dec(temp1, medx[f1]);
-                        rvec_sub(frankenstein_trajectory[basic_frame][f2], frankenstein_trajectory[j + k][f2], temp2);
+                        rvec_sub(frankenstein_trajectory[basic_frame][f2], frankenstein_trajectory[j + i][f2], temp2);
                         rvec_dec(temp2, medy[f2]);
                         a[f1][f2] += (temp1[0] * temp2[0] + temp1[1] * temp2[1] + temp1[2] * temp2[2]);
                         b[f1][f2] += (temp1[0] * temp1[0] + temp1[1] * temp1[1] + temp1[2] * temp1[2]);
@@ -541,50 +510,55 @@ Domains::finishAnalysis(int nframes)
             sfree(medy);
         }
     }
-//    std::cout << "\noutput file\n";
-//    make_correlation_file(crltns, "/home/toluk/Develop/samples/reca_rd/corrs.txt", m);
-//    std::cout << "\n\n file done \n\n";
 
-/*
-    std::cout << "\n\n\n\n";
-    for (int i2 = 0; i2 < 40; i2++) {
-        long int count_here = 0;
-        for (int i = 0; i <= k; i++) {
-            for (int j = 0; j < index.size(); j++) {
-                for (int f = 0; f < index.size(); f++) {
-                    if (std::abs(crltns[i][j][f]) > (float)i2 / 100) {
-                        count_here++;
+    //make_correlation_file(crltns, "/home/toluk/Develop/samples/reca_rd/corrs_10k_frames.txt", m);
+
+    for (int i1 = 20; i1 < 70; i1++) {
+        int i5 = 0;
+        for (int i2 = 1; i2 < crltns.size(); i2++) {
+            for (int i3 = 0; i3 < crltns[i2].size(); i3++) {
+                for (int i4 = 0; i4 < crltns[i2][i3].size(); i4++) {
+                    if (crltns[i2][i3][i4] >= (double)i1 / 100) {
+                        i5++;
                     }
                 }
             }
         }
-        std::cout << i2 << " " << count_here << "\n";
+        std::cout << i1 << " - " << i5 << "\n";
     }
-    std::cout << "\n\n\n\n";
-*/
 
-    std::vector< std::vector< std::pair< int, int > > > graph;
+    std::cout << "\n\n\n";
+
+    std::vector< std::vector< int > > graph;
     graph.resize(index.size());
-    for (int i = 0; i < k; i++) {
+    for (int i = 1; i <= k; i++) {
         for (int j = 0; j < index.size(); j++) {
             for (int f = 0; f < index.size(); f++) {
-                if (std::abs(crltns[i][j][f]) >= 0.05) {
-                    graph[j].push_back(std::make_pair(f, i));
+                if (std::abs(crltns[i][j][f]) >= 0.30) {
+                    bool local_flag = true;
+                    for (int f2 = 0; f2 < graph[j].size(); f2++) {
+                        if (graph[j][f2] == f) {
+                            local_flag = false;
+                        }
+                    }
+                    if (local_flag) {
+                        graph[j].push_back(f);
+                    }
                 }
             }
         }
     }
 
-    for (int i = 0; i < index.size(); i++) {
-        std::cout << i << "-" << graph[i].size() << "   ";
-    }
+    /*for (int i = 0; i < index.size(); i++) {
+        if (graph[i].size() > 0) {
+            std::cout << i << " - " << graph[i].size() << "\n";
+        }
+    }*/
+
     std::cout << "\n";
     std::vector< std::vector < int > > rout_old, rout_new;
-    std::vector< int > length_old, length_new;
     bool flag = true;
     rout_new.resize(0);
-    length_new.resize(0);
-    length_old.resize(index.size(), 0);
     rout_old.resize(index.size());
     for (int i = 0; i < index.size(); i++) {
         rout_old[i].resize(1, i);
@@ -592,47 +566,30 @@ Domains::finishAnalysis(int nframes)
 
     std::cout << "building routs\n" ;
 
-
-    std::vector< std::pair< int, int > > temp_a;
-    std::vector< int > howlong;
-    int temp_b = 0;
-    howlong.resize(index.size(), 0);
-
-/*#pragma omp parallel
-{
-    #pragma omp for schedule(dynamic)
-    for (int i = 0; i < index.size(); i++) {
-        temp_a.resize(1, std::make_pair(i, 0));
-        //std::cout << "try out\n";
-        temp_b = dive_in(graph, i, 0, frames, 0, 0, temp_a);
-        howlong[i] = temp_b;
-        std::cout << i << " " << temp_b << "\n";
-    }
-}*/
-
-    std::vector < int > flag3;
     while (flag) {
         flag = false;
+        std::vector < int > flag3;
         for (long int i = 0; i < rout_old.size(); i++) {
             if (graph[rout_old[i].back()].size() == 0 && rout_old[i].size() > 2) {
                 rout_new.push_back(rout_old[i]);
-                length_new.push_back(length_old[i]);
             } else {
                 for (long int j = 0; j < graph[rout_old[i].back()].size(); j++) {
-                    if (length_old[i] + graph[rout_old[i].back()][j].second <= frames) {
-                        flag3 = rout_old[i];
-                        flag3.push_back(graph[rout_old[i].back()][j].first);
-
-                        bool flag2 = true;
+                    bool flag2 = true, flag22 = true;;
+                    flag3 = rout_old[i];
+                    for (int f = 0; f < flag3.size(); f++) {
+                        if (flag3[f] == graph[rout_old[i].back()][j]) {
+                            flag22 = false;
+                        }
+                    }
+                    if (flag22) {
+                        flag3.push_back(graph[rout_old[i].back()][j]);
                         for (int f = 0; f < rout_new.size(); f++) {
                             if (rout_new[f] == flag3) {
                                 flag2 = false;
                             }
                         }
-
                         if (flag2) {
                             rout_new.push_back(flag3);
-                            length_new.push_back(length_old[i] + graph[rout_old[i].back()][j].second);
                             flag = true;
                         }
                     }
@@ -642,25 +599,60 @@ Domains::finishAnalysis(int nframes)
         if (rout_new.size() != 0) {
             rout_old = rout_new;
             rout_new.resize(0);
-            length_old = length_new;
-            length_new.resize(0);
-            std::cout << length_old.size() << "\n";
+            std::cout << rout_old.size() << "\n";
         }
     }
 
+    std::sort(rout_old.begin(), rout_old.end(), mysortfunc);
+
+    std::cout << "\nfinished routs\n" ;
+
+    /*graph.resize(0);
+    graph.resize(index.size());
+    rout_new.resize(0);
+
     for (int i = 0; i < rout_old.size(); i++) {
-        for (int j = 0; j < rout_old[i].size(); j++) {
-            std::cout << rout_old[i][j] << " ";
+        int lflag2 = false;
+        for (int j = 0; j < rout_old[i].size() - 1; j++) {
+            int lflag1 = true;
+            for (int f = 0; f < graph[rout_old[i][j]].size(); f++) {
+                if (graph[rout_old[i][j]][f] == rout_old[i][j + 1]) {
+                    lflag1 = false;
+                }
+            }
+            if (lflag1) {
+                graph[rout_old[i][j]].push_back(rout_old[i][j + 1]);
+                lflag2 = true;
+            }
         }
-        std::cout << "\n";
-    }
-
+        if (lflag2) {
+            rout_new.push_back(rout_old[i]);
+        }
+    }*/
 
+    rout_new.resize(0);
+    for (int i = rout_old.size() - 1; i > 0; i--) {
+        bool lflag1 = true;
+        for (int j = 0; j < i; j++) {
+            if (rout_old[i].size() < rout_old[j].size()) {
+                int la = 0;
+                for (int f = 0; f < rout_old[j].size(); f++) {
+                    if (rout_old[j][f] == rout_old[i][la]) {
+                        la++;
+                    }
+                }
+                if (la == rout_old[i].size()) {
+                    lflag1 = false;
+                }
+            }
+        }
+        if (lflag1) {
+            rout_new.push_back(rout_old[i]);
+        }
+    }
 
-    std::cout << "\nfinished routs\n" ;
-    make_rout_file(length_old, rout_old, "/home/toluk/Develop/samples/reca_rd/routs.txt");
+    make_rout_file(rout_new, "routs.txt");
     std::cout << "\n\n\n job done \n\n\n";
-
 }
 
 void