Sequence* q = new Sequence(query->getName(), query->getAligned());
Sequence* leftParent = new Sequence(refSeqs[i]->getName(), refSeqs[i]->getAligned());
Sequence* rightParent = new Sequence(refSeqs[j]->getName(), refSeqs[j]->getAligned());
- //cout << "parents: (" << refSeqs[i]->getName() << ", " << refSeqs[j]->getName() << ")\n";
+
map<int, int> spots; //map from spot in original sequence to spot in filtered sequence for query and both parents
vector<data_struct> divs = runBellerophon(q, leftParent, rightParent, spots);
- //cout << divs.size() << endl;
- if (m->control_pressed) {
- delete q;
- delete leftParent;
- delete rightParent;
- return "no";
- }
+
+ if (m->control_pressed) { delete q; delete leftParent; delete rightParent; return "no"; }
-// cout << divs.size() << endl;
vector<data_struct> selectedDivs;
for (int k = 0; k < divs.size(); k++) {
vector<snps> snpsLeft = getSNPS(divs[k].parentA.getAligned(), divs[k].querySeq.getAligned(), divs[k].parentB.getAligned(), divs[k].winLStart, divs[k].winLEnd);
vector<snps> snpsRight = getSNPS(divs[k].parentA.getAligned(), divs[k].querySeq.getAligned(), divs[k].parentB.getAligned(), divs[k].winRStart, divs[k].winREnd);
- //cout << refSeqs[i]->getName() << '\t' << refSeqs[j]->getName() << '\t' << k << divs[k].parentA.getAligned() << endl << divs[k].parentB.getAligned() << endl;
+
if (m->control_pressed) { delete q; delete leftParent; delete rightParent; return "no"; }
int numSNPSLeft = snpsLeft.size();
//are we within 10 points of the bootstrap cutoff?
if ((divs[k].bsMax >= (minBS-10)) && (iters < 1000)) {
- snpsLeft = getSNPS(divs[k].parentA.getAligned(), divs[k].querySeq.getAligned(), divs[k].parentB.getAligned(), divs[k].winLStart, divs[k].winLEnd);
- snpsRight = getSNPS(divs[k].parentA.getAligned(), divs[k].querySeq.getAligned(), divs[k].parentB.getAligned(), divs[k].winRStart, divs[k].winREnd);
-
- if (m->control_pressed) { delete q; delete leftParent; delete rightParent; return "no"; }
-
- numSNPSLeft = snpsLeft.size();
- numSNPSRight = snpsRight.size();
-
- //require at least 4 SNPs on each side of the break
- if ((numSNPSLeft >= 4) && (numSNPSRight >= 4)) {
- float BS_A, BS_B;
- bootstrapSNPS(snpsLeft, snpsRight, BS_A, BS_B, 1000);
+ bootstrapSNPS(snpsLeft, snpsRight, BS_A, BS_B, 1000);
- if (m->control_pressed) { return "no"; }
+ if (m->control_pressed) { delete q; delete leftParent; delete rightParent; return "no"; }
- divs[k].bsa = BS_A;
- divs[k].bsb = BS_B;
- divs[k].bsMax = max(BS_A, BS_B);
- divs[k].chimeraMax = max(divs[k].qla_qrb, divs[k].qlb_qra);
- }
+ divs[k].bsa = BS_A;
+ divs[k].bsb = BS_B;
+ divs[k].bsMax = max(BS_A, BS_B);
+ divs[k].chimeraMax = max(divs[k].qla_qrb, divs[k].qlb_qra);
}
//so results reflect orignal alignment
}
}
/***********************************************************************/
-float Slayer::computePercentID(string queryFrag, string parent, int left, int right) {
+float Slayer::computePercentID(string queryAlign, string chimera, int left, int right) {
try {
- int total = 0;
- int matches = 0;
-
+
+ int numIdentical = 0;
+ int countA = 0;
+ int countB = 0;
for (int i = left; i <= right; i++) {
- total++;
- if (queryFrag[i] == parent[i]) {
- matches++;
+ if (((queryAlign[i] != 'G') && (queryAlign[i] != 'T') && (queryAlign[i] != 'A') && (queryAlign[i] != 'C')&& (queryAlign[i] != '.') && (queryAlign[i] != '-')) ||
+ ((chimera[i] != 'G') && (chimera[i] != 'T') && (chimera[i] != 'A') && (chimera[i] != 'C')&& (chimera[i] != '.') && (chimera[i] != '-'))) {}
+ else {
+
+ bool charA = false; bool charB = false;
+ if ((queryAlign[i] == 'G') || (queryAlign[i] == 'T') || (queryAlign[i] == 'A') || (queryAlign[i] == 'C')) { charA = true; }
+ if ((chimera[i] == 'G') || (chimera[i] == 'T') || (chimera[i] == 'A') || (chimera[i] == 'C')) { charB = true; }
+
+ if (charA || charB) {
+
+ if (charA) { countA++; }
+ if (charB) { countB++; }
+
+ if (queryAlign[i] == chimera[i]) {
+ numIdentical++;
+ }
+ }
}
}
-
- float percentID =( matches/(float)total) * 100;
- return percentID;
+ float numBases = (countA + countB) /(float) 2;
+
+ if (numBases == 0) { return 0; }
+
+ float percentIdentical = (numIdentical/(float)numBases) * 100;
+
+ return percentIdentical;
+
}
catch(exception& e) {
m->errorOut(e, "Slayer", "computePercentID");