+vector<trace_struct> Maligner::mapTraceRegionsToAlignment(vector<score_struct> path) {
+ try {
+ vector<trace_struct> trace;
+
+ int region_index = path[0].row;
+ int region_start = path[0].col;
+
+ for (int i = 1; i < path.size(); i++) {
+
+ int next_region_index = path[i].row;
+ //cout << i << '\t' << next_region_index << endl;
+
+ if (next_region_index != region_index) {
+
+ // add trace region
+ int col_index = path[i].col;
+ trace_struct temp;
+ temp.col = region_start;
+ temp.oldCol = col_index-1;
+ temp.row = region_index;
+
+ trace.push_back(temp);
+
+ region_index = path[i].row;
+ region_start = col_index;
+ }
+ }
+
+ // get last one
+ trace_struct temp;
+ temp.col = region_start;
+ temp.oldCol = path[path.size()-1].col;
+ temp.row = region_index;
+ trace.push_back(temp);
+
+ return trace;
+
+ }
+ catch(exception& e) {
+ m->errorOut(e, "Maligner", "mapTraceRegionsToAlignment");
+ exit(1);
+ }
+}
+
+/***************************************************************************************************************
+
+vector<trace_struct> Maligner::extractHighestPath(vector<vector<score_struct> > ms) {
+ try {
+
+
+ //get matrix dimensions
+ int numCols = query->getAligned().length();
+ int numRows = ms.size();
+
+
+ //find highest score scoring matrix
+ vector<score_struct> highestStruct;
+ int highestScore = 0;
+
+ for (int i = 0; i < numRows; i++) {
+ for (int j = 0; j < numCols; j++) {
+ if (ms[i][j].score > highestScore) {
+ highestScore = ms[i][j].score;
+ highestStruct.resize(0);
+ highestStruct.push_back(ms[i][j]);
+ }
+ else if(ms[i][j].score == highestScore){
+ highestStruct.push_back(ms[i][j]);
+ }
+ }
+ }
+
+ //cout << endl << highestScore << '\t' << highestStruct.size() << '\t' << highestStruct[0].row << endl;
+
+ vector<trace_struct> maxTrace;
+ double maxPercentIdenticalQueryAntiChimera = 0;
+
+ for(int i=0;i<highestStruct.size();i++){
+
+ vector<score_struct> path;
+
+ int rowIndex = highestStruct[i].row;
+ int pos = highestStruct[i].col;
+ int score = highestStruct[i].score;
+
+ while (pos >= 0 && score > 0) {
+ score_struct temp = ms[rowIndex][pos];
+ score = temp.score;
+
+ if (score > 0) { path.push_back(temp); }
+
+ rowIndex = temp.prev;
+ pos--;
+ }
+
+ reverse(path.begin(), path.end());
+
+ vector<trace_struct> trace = mapTraceRegionsToAlignment(path, refSeqs);
+
+ //cout << "traces\n";
+ //for(int j=0;j<trace.size();j++){
+ // cout << trace[j].col << '\t' << trace[j].oldCol << '\t' << refSeqs[trace[j].row]->getName() << endl;
+ //}
+
+ int traceStart = path[0].col;
+ int traceEnd = path[path.size()-1].col;
+// cout << "traceStart/End\t" << traceStart << '\t' << traceEnd << endl;
+
+ string queryInRange = query->getAligned();
+ queryInRange = queryInRange.substr(traceStart, (traceEnd-traceStart+1));
+// cout << "here" << endl;
+ string chimeraSeq = constructChimericSeq(trace, refSeqs);
+ string antiChimeraSeq = constructAntiChimericSeq(trace, refSeqs);
+
+ percentIdenticalQueryChimera = computePercentID(queryInRange, chimeraSeq);
+ double percentIdenticalQueryAntiChimera = computePercentID(queryInRange, antiChimeraSeq);
+// cout << i << '\t' << percentIdenticalQueryChimera << '\t' << percentIdenticalQueryAntiChimera << endl;
+
+ if(percentIdenticalQueryAntiChimera > maxPercentIdenticalQueryAntiChimera){
+ maxPercentIdenticalQueryAntiChimera = percentIdenticalQueryAntiChimera;
+ maxTrace = trace;
+ }
+ }
+// cout << maxPercentIdenticalQueryAntiChimera << endl;
+ return maxTrace;
+
+
+ }
+ catch(exception& e) {
+ m->errorOut(e, "Maligner", "extractHighestPath");
+ exit(1);
+ }
+}
+
+***************************************************************************************************************
+