new mafft v 6.857 with extensions
[jabaws.git] / binaries / src / mafft / extensions / mxscarna_src / postProcessings.cpp
diff --git a/binaries/src/mafft/extensions/mxscarna_src/postProcessings.cpp b/binaries/src/mafft/extensions/mxscarna_src/postProcessings.cpp
new file mode 100644 (file)
index 0000000..1028630
--- /dev/null
@@ -0,0 +1,91 @@
+//////////////////////////////////////////////////////////////////////////////////////
+// postProcessings.cpp
+// 
+// several post process functions after aligning two profile stem candidate sequences
+//////////////////////////////////////////////////////////////////////////////////////
+
+#include <iostream>
+#include "scarna.hpp"
+#include "StemCandidate.hpp"
+#include <vector>
+#include <string>
+
+using namespace::MXSCARNA;
+
+void printStructure(std::vector<StemCandidate> *pscs1, std::vector<StemCandidate> *pscs2, std::vector<int> *matchPSCS1, std::vector<int> *matchPSCS2);
+
+void removeConflicts(std::vector<StemCandidate> *pscs1, std::vector<StemCandidate> *pscs2, std::vector<int> *matchPSCS1, std::vector<int> *matchPSCS2)
+{
+    int size = matchPSCS1->size();
+    
+    std::vector<int> found(size, 0);
+    for(int k = size - 1; k >= 0; k--) {
+       int i    = matchPSCS1->at(k);
+       int i_rv = pscs1->at(i).GetRvscnumber();
+       int j    = matchPSCS2->at(k);
+       int j_rv = pscs2->at(j).GetRvscnumber();
+       
+       found[k] = 0;
+       
+       for(int m = size - 1; m >= 0; m--) {
+           if ( (matchPSCS1->at(m) == i_rv) && (matchPSCS2->at(m) == j_rv) ) {
+               found[k] = 1;
+               break;
+           }
+       }
+    }
+
+    int pt = 0;
+    for(int k = 0; k < size; k++) {
+       matchPSCS1->at(pt) = matchPSCS1->at(k);
+       matchPSCS2->at(pt) = matchPSCS2->at(k);
+       if(found[k] == 1) ++pt; 
+    }
+
+    matchPSCS1->resize(pt);
+    matchPSCS2->resize(pt);
+    
+    //printStructure (pscs1, pscs2, matchPSCS1, matchPSCS2);
+}
+
+void printStructure(std::vector<StemCandidate> *pscs1, std::vector<StemCandidate> *pscs2, std::vector<int> *matchPSCS1, std::vector<int> *matchPSCS2)
+{
+    int size = matchPSCS1->size();
+    int len  = WORDLENGTH;
+    std::vector<char> structure1(100, '.');
+    std::vector<char> structure2(100, '.');
+    for(int k = 0; k < size; k++) {
+       int i    = matchPSCS1->at(k);
+       int pos1 = pscs1->at(i).GetPosition();
+       int j    = matchPSCS2->at(k);
+       int pos2 = pscs2->at(j).GetPosition();
+       for(int l = 0; l < len; l++) {
+           if(pscs1->at(i).GetDistance() > 0) {
+               structure1[pos1 + l] = '(';
+           }
+           else {
+               structure1[pos1 + l] = ')';
+           }
+       
+           if(pscs2->at(j).GetDistance() > 0) {
+               structure2[pos2 + l] = '(';
+           }
+           else {
+               structure2[pos2 + l] = ')';
+           }
+       }
+       /*
+       std::cout << i << "\t" << pscs1->at(i).GetLength() << "\t" << pscs1->at(i).GetPosition() << "\t" << pscs1->at(i).GetRvposition() << "\t" << pscs1->at(i).GetDistance()  << "\t" << pscs1->at(i).GetContPos() << "\t" << pscs1->at(i).GetBeforePos() << "\t" << pscs1->at(i).GetRvscnumber() << endl;
+       */
+    }
+    size = structure1.size();
+    for(int k = 0; k < size; k++) {
+       std::cout << structure1[k];
+    }
+    std::cout << endl;
+    for(int k = 0; k < size; k++) {
+       std::cout << structure2[k];
+    }
+    std::cout << endl;
+}
+