X-Git-Url: https://git.donarmstrong.com/?p=mothur.git;a=blobdiff_plain;f=needlemanoverlap.cpp;h=1c2ef223539c65a95ca1dac66a823d226b6108b8;hp=b14d8e3d10e42ee9c7a21f5595315b29ad172ff5;hb=050a3ff02473a3d4c0980964e1a9ebe52e55d6b8;hpb=3abb236c602eb168ee112f080b563ebe2c705029 diff --git a/needlemanoverlap.cpp b/needlemanoverlap.cpp index b14d8e3..1c2ef22 100644 --- a/needlemanoverlap.cpp +++ b/needlemanoverlap.cpp @@ -24,8 +24,8 @@ /**************************************************************************************************/ -NeedlemanOverlap::NeedlemanOverlap(float gO, float m, float mm, int r) :// note that we don't have a gap extend -gap(gO), match(m), mismatch(mm), Alignment(r) { // the gap openning penalty is assessed for +NeedlemanOverlap::NeedlemanOverlap(float gO, float f, float mm, int r) :// note that we don't have a gap extend +gap(gO), match(f), mismatch(mm), Alignment(r) { // the gap openning penalty is assessed for try { // every gapped position for(int i=1;ierrorOut(e, "NeedlemanOverlap", "NeedlemanOverlap"); exit(1); } - - } /**************************************************************************************************/ @@ -53,18 +51,21 @@ NeedlemanOverlap::~NeedlemanOverlap(){ /* do nothing */ } void NeedlemanOverlap::align(string A, string B){ try { + seqA = ' ' + A; lA = seqA.length(); // algorithm requires a dummy space at the beginning of each string seqB = ' ' + B; lB = seqB.length(); // algorithm requires a dummy space at the beginning of each string - if (lA > nRows) { mothurOut("Your one of your candidate sequences is longer than you longest template sequence."); mothurOutEndLine(); } + if (lA > nRows) { m->mothurOut("One of your candidate sequences is longer than you longest template sequence. Your longest template sequence is " + toString(nRows) + ". Your candidate is " + toString(lA) + "."); m->mothurOutEndLine(); } for(int i=1;ierrorOut(e, "NeedlemanOverlap", "align"); exit(1); } } +/**************************************************************************************************/ +void NeedlemanOverlap::alignPrimer(string A, string B){ + try { + + seqA = ' ' + A; lA = seqA.length(); // algorithm requires a dummy space at the beginning of each string + seqB = ' ' + B; lB = seqB.length(); // algorithm requires a dummy space at the beginning of each string + + if (lA > nRows) { m->mothurOut("One of your candidate sequences is longer than you longest template sequence. Your longest template sequence is " + toString(nRows) + ". Your candidate is " + toString(lA) + "."); m->mothurOutEndLine(); } + + for(int i=1;i= up){ + if(diagonal >= left){ + alignment[i][j].cValue = diagonal; + alignment[i][j].prevCell = 'd'; + } + else{ + alignment[i][j].cValue = left; + alignment[i][j].prevCell = 'l'; + } + } + else{ + if(up >= left){ + alignment[i][j].cValue = up; + alignment[i][j].prevCell = 'u'; + } + else{ + alignment[i][j].cValue = left; + alignment[i][j].prevCell = 'l'; + } + } + } + } + + Overlap over; + over.setOverlap(alignment, lA, lB, 0); // Fix gaps at the beginning and end of the sequences + traceBack(); // Traceback the alignment to populate seqAaln and seqBaln + + } + catch(exception& e) { + m->errorOut(e, "NeedlemanOverlap", "alignPrimer"); + exit(1); + } + +} +//********************************************************************/ +bool NeedlemanOverlap::isEquivalent(char oligo, char seq){ + try { + + bool same = true; + + oligo = toupper(oligo); + seq = toupper(seq); + + if(oligo != seq){ + if(oligo == 'A' && (seq != 'A' && seq != 'M' && seq != 'R' && seq != 'W' && seq != 'D' && seq != 'H' && seq != 'V')) { same = false; } + else if(oligo == 'C' && (seq != 'C' && seq != 'Y' && seq != 'M' && seq != 'S' && seq != 'B' && seq != 'H' && seq != 'V')) { same = false; } + else if(oligo == 'G' && (seq != 'G' && seq != 'R' && seq != 'K' && seq != 'S' && seq != 'B' && seq != 'D' && seq != 'V')) { same = false; } + else if(oligo == 'T' && (seq != 'T' && seq != 'Y' && seq != 'K' && seq != 'W' && seq != 'B' && seq != 'D' && seq != 'H')) { same = false; } + else if((oligo == '.' || oligo == '-')) { same = false; } + else if((oligo == 'N' || oligo == 'I') && (seq == 'N')) { same = false; } + else if(oligo == 'R' && (seq != 'A' && seq != 'G')) { same = false; } + else if(oligo == 'Y' && (seq != 'C' && seq != 'T')) { same = false; } + else if(oligo == 'M' && (seq != 'C' && seq != 'A')) { same = false; } + else if(oligo == 'K' && (seq != 'T' && seq != 'G')) { same = false; } + else if(oligo == 'W' && (seq != 'T' && seq != 'A')) { same = false; } + else if(oligo == 'S' && (seq != 'C' && seq != 'G')) { same = false; } + else if(oligo == 'B' && (seq != 'C' && seq != 'T' && seq != 'G')) { same = false; } + else if(oligo == 'D' && (seq != 'A' && seq != 'T' && seq != 'G')) { same = false; } + else if(oligo == 'H' && (seq != 'A' && seq != 'T' && seq != 'C')) { same = false; } + else if(oligo == 'V' && (seq != 'A' && seq != 'C' && seq != 'G')) { same = false; } + } + + + + return same; + } + catch(exception& e) { + m->errorOut(e, "TrimOligos", "countDiffs"); + exit(1); + } +} /**************************************************************************************************/