vector<uNumber> Aligner::alignReadGreedyCache(const string& read, bool& overlapFound, uint errors, bool rc){ auto listOverlap(getListOverlapCache(read)); if(listOverlap.empty()){++noOverlapRead;++readNumber;return {};} overlaps+=listOverlap.size(); overlapFound=true; for(uint start(0); start<=min(tryNumber-1,(uint)listOverlap.size()-1); ++start){ vector<uNumber> pathBegin; uint errorBegin(checkBeginGreedyCache(read,listOverlap[start],pathBegin,errors)); if(errorBegin<=errors){ for(int end((int)listOverlap.size()-1); end>=max((int)start,(int)listOverlap.size()-(int)tryNumber); --end){ vector<uNumber> pathEnd; uint errorsEnd(checkEndGreedyCache(read,listOverlap[end],pathEnd,errors-errorBegin)); if(errorsEnd+errorBegin<=errors){ vector<uNumber> pathCover; bool ended(false); uint errorCover(coverGreedyCache(read,listOverlap,start,end,pathCover,errors-errorsEnd-errorBegin,ended)); if(errorCover<=errors-errorsEnd-errorBegin){ ++alignedRead; ++readNumber; pathBegin.insert(pathBegin.end(), pathCover.begin(),pathCover.end()); if (!ended){pathBegin.insert(pathBegin.end(), pathEnd.begin(),pathEnd.end());} return pathBegin; } } } } } //TODO TEST this //if(!rc){return alignReadGreedy(reverseComplements(read), overlapFound,errors, true);} ++notAligned; ++readNumber; return {}; }
vector<uNumber> Aligner::alignReadGreedy(const string& read, bool& overlapFound, uint errors, bool r){ vector<pair<kmer,uint>> listOverlap(getNOverlap(read,tryNumber)); if(listOverlap.empty()){++noOverlapRead;++readNumber;return {};} overlapFound=true; vector<uNumber> pathBegin,pathEnd; for(uint start(0); start<(uint)listOverlap.size(); ++start){ pathBegin={}; uint errorBegin(checkBeginGreedy(read,listOverlap[start],pathBegin,errors)); if(errorBegin<=errors){ pathEnd={}; uint errorsEnd(checkEndGreedy(read,listOverlap[start],pathEnd,errors-errorBegin)); if(errorsEnd+errorBegin<=errors){ alignedRead++; readNumber++; pathBegin.insert(pathBegin.end(), pathEnd.begin(),pathEnd.end()); return pathBegin; } } } //TODO TEST this //if(!rc){return alignReadGreedy(reverseComplements(read), overlapFound,errors, true);} notAligned++; readNumber++; return {}; }
vector<uNumber> Aligner::alignReadExhaustive(const string& read, bool& overlapFound, uint errors){ vector<pair<kmer,uint>> listOverlap(getListOverlap(read)); if(listOverlap.empty()){++noOverlapRead;++readNumber;return {};} overlaps+=listOverlap.size(); overlapFound=true; vector<uNumber> pathBegin,pathEnd; for(uint start(0); start<(uint)listOverlap.size(); ++start){ pathBegin={}; uint errorBegin(checkBeginExhaustive(read,listOverlap[start],pathBegin,errors)); if(errorBegin<=errors){ pathEnd={}; uint errorsEnd(checkEndExhaustive(read,listOverlap[start],pathEnd,errors-errorBegin)); if(errorsEnd+errorBegin<=errors){ alignedRead++; readNumber++; pathBegin.insert(pathBegin.end(), pathEnd.begin(),pathEnd.end()); return pathBegin; } } } notAligned++; readNumber++; return {}; }