X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=slayer.cpp;h=5d5a48b864695ce2ed92357006b834efa24195bb;hb=3a13eff5c26d6fc156a299c9fa7f5497bded94a0;hp=66db22b6a36ae9a0f7f9dd383201cd3852a120b2;hpb=5a1e62397b91f57d0d3aff635891df04b8999a88;p=mothur.git diff --git a/slayer.cpp b/slayer.cpp index 66db22b..5d5a48b 100644 --- a/slayer.cpp +++ b/slayer.cpp @@ -11,7 +11,7 @@ /***********************************************************************/ Slayer::Slayer(int win, int increment, int parentThreshold, float div, int i, int snp) : - windowSize(win), windowStep(increment), parentFragmentThreshold(parentThreshold), divRThreshold(div), iters(i), percentSNPSample(snp){} + windowSize(win), windowStep(increment), parentFragmentThreshold(parentThreshold), divRThreshold(div), iters(i), percentSNPSample(snp){ m = MothurOut::getInstance(); } /***********************************************************************/ string Slayer::getResults(Sequence* query, vector refSeqs) { try { @@ -20,6 +20,8 @@ string Slayer::getResults(Sequence* query, vector refSeqs) { for (int i = 0; i < refSeqs.size(); i++) { for (int j = i+1; j < refSeqs.size(); j++) { + + if (m->control_pressed) { return "no"; } //make copies of query and each parent because runBellerophon removes gaps and messes them up Sequence* q = new Sequence(query->getName(), query->getAligned()); @@ -29,12 +31,26 @@ string Slayer::getResults(Sequence* query, vector refSeqs) { map spots; //map from spot in original sequence to spot in filtered sequence for query and both parents vector divs = runBellerophon(q, leftParent, rightParent, spots); + if (m->control_pressed) { + delete q; + delete leftParent; + delete rightParent; + return "no"; + } + vector selectedDivs; for (int k = 0; k < divs.size(); k++) { vector snpsLeft = getSNPS(divs[k].parentA.getAligned(), divs[k].querySeq.getAligned(), divs[k].parentB.getAligned(), divs[k].winLStart, divs[k].winLEnd); vector 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"; + } + int numSNPSLeft = snpsLeft.size(); int numSNPSRight = snpsRight.size(); @@ -54,6 +70,13 @@ string Slayer::getResults(Sequence* query, vector refSeqs) { float BS_A, BS_B; bootstrapSNPS(snpsLeft, snpsRight, BS_A, BS_B); + + if (m->control_pressed) { + delete q; + delete leftParent; + delete rightParent; + return "no"; + } divs[k].bsa = BS_A; divs[k].bsb = BS_B; @@ -98,7 +121,7 @@ string Slayer::getResults(Sequence* query, vector refSeqs) { } } catch(exception& e) { - errorOut(e, "Slayer", "getResults"); + m->errorOut(e, "Slayer", "getResults"); exit(1); } } @@ -130,12 +153,14 @@ vector Slayer::runBellerophon(Sequence* q, Sequence* pA, Sequence* //check window size if (length < (2*windowSize+windowStep)) { - mothurOut("Your window size is too large for " + q->getName() + ". I will make the window size " + toString(length/4) + " which is 1/4 the filtered length."); mothurOutEndLine(); + m->mothurOut("Your window size is too large for " + q->getName() + ". I will make the window size " + toString(length/4) + " which is 1/4 the filtered length."); m->mothurOutEndLine(); windowSize = length / 4; } for (int i = windowSize-1; i <= (length - windowSize); i += windowStep) { + if (m->control_pressed) { return data; } + int breakpoint = i; int leftLength = breakpoint + 1; int rightLength = length - leftLength; @@ -208,7 +233,7 @@ vector Slayer::runBellerophon(Sequence* q, Sequence* pA, Sequence* } catch(exception& e) { - errorOut(e, "Slayer", "runBellerophon"); + m->errorOut(e, "Slayer", "runBellerophon"); exit(1); } } @@ -257,12 +282,12 @@ vector Slayer::getSNPS(string parentA, string query, string parentB, int l } catch(exception& e) { - errorOut(e, "Slayer", "getSNPS"); + m->errorOut(e, "Slayer", "getSNPS"); exit(1); } } /***********************************************************************/ -void Slayer::bootstrapSNPS(vector left, vector right, float& BSA, float& BSB) { +int Slayer::bootstrapSNPS(vector left, vector right, float& BSA, float& BSB) { try { srand((unsigned)time( NULL )); @@ -276,6 +301,8 @@ void Slayer::bootstrapSNPS(vector left, vector right, float& BSA, fl for (int i = 0; i < iters; i++) { //random sampling with replacement. + if (m->control_pressed) { return 0; } + vector selectedLeft; for (int j = 0; j < numLeft; j++) { @@ -339,10 +366,12 @@ void Slayer::bootstrapSNPS(vector left, vector right, float& BSA, fl BSA = ((float) count_A / (float) iters) * 100; BSB = ((float) count_B / (float) iters) * 100; //cout << "bsa = " << BSA << " bsb = " << BSB << endl; + + return 0; } catch(exception& e) { - errorOut(e, "Slayer", "bootstrapSNPS"); + m->errorOut(e, "Slayer", "bootstrapSNPS"); exit(1); } } @@ -363,7 +392,7 @@ float Slayer::snpQA(vector data) { return percentID; } catch(exception& e) { - errorOut(e, "Slayer", "snpQA"); + m->errorOut(e, "Slayer", "snpQA"); exit(1); } } @@ -385,7 +414,7 @@ float Slayer::snpQB(vector data) { } catch(exception& e) { - errorOut(e, "Slayer", "snpQB"); + m->errorOut(e, "Slayer", "snpQB"); exit(1); } } @@ -406,7 +435,7 @@ float Slayer::snpAB(vector data) { } catch(exception& e) { - errorOut(e, "Slayer", "snpAB"); + m->errorOut(e, "Slayer", "snpAB"); exit(1); } } @@ -428,7 +457,7 @@ float Slayer::computePercentID(string queryFrag, string parent, int left, int ri return percentID; } catch(exception& e) { - errorOut(e, "Slayer", "computePercentID"); + m->errorOut(e, "Slayer", "computePercentID"); exit(1); } } @@ -494,7 +523,7 @@ map Slayer::verticalFilter(vector seqs) { return maskMap; } catch(exception& e) { - errorOut(e, "Slayer", "verticalFilter"); + m->errorOut(e, "Slayer", "verticalFilter"); exit(1); } }