uint Aligner::checkEndExhaustive(const string& read, pair<kmer, uint>& overlap, vector<uNumber>& path, uint errors){ string readLeft(read.substr(overlap.second+k-1)),unitig; vector<uNumber> path2keep; if(readLeft.empty()){ path.push_back(0); return 0; } auto rangeUnitigs(getBegin(overlap.first)); uint minMiss(errors+1),indiceMinMiss(9); bool ended(false); int offset(-2); if(partial & rangeUnitigs.empty()){ //if(!path.empty()){ return 0; //} } for(uint i(0); i<rangeUnitigs.size(); ++i){ unitig=(rangeUnitigs[i].first); if(unitig.size()-k+1>=readLeft.size()){ uint miss(missmatchNumber(unitig.substr(k-1,readLeft.size()),readLeft, errors)); if(miss<minMiss){ minMiss=miss; indiceMinMiss=i; ended=true; offset=readLeft.size()+k-1; } }else{ uint miss(missmatchNumber(unitig.substr(k-1),readLeft.substr(0,unitig.size()-k+1), errors)); if(miss<minMiss){ kmer overlapNum(str2num(unitig.substr(unitig.size()-k+1,k-1))); vector<uNumber> possiblePath; miss+=mapOnRightEndExhaustive(read, possiblePath, {overlapNum,overlap.second+(unitig.size()-k+1)},errors-miss); if(miss<minMiss){ path2keep=possiblePath; minMiss=miss; indiceMinMiss=i; ended=false; } } } } if(minMiss<=errors){ if(ended){ path.push_back(rangeUnitigs[indiceMinMiss].second); path.push_back(offset); }else{ path.push_back(rangeUnitigs[indiceMinMiss].second); path.insert(path.end(), path2keep.begin(),path2keep.end()); } } return minMiss; }
uint Aligner::mapOnRightEndExhaustive(const string &read, vector<uNumber>& path, const pair<kmer, uint>& overlap , uint errors){ string unitig,readLeft(read.substr(overlap.second+k-1)); vector<uNumber> path2keep; if(readLeft.empty()){path.push_back(0);return 0;} auto rangeUnitigs(getBegin(overlap.first)); uint miniMiss(errors+1), miniMissIndice(9); bool ended(false); for(uint i(0); i<rangeUnitigs.size(); ++i){ unitig=(rangeUnitigs[i].first); //case the rest of the read is too small if(readLeft.size()<= unitig.size()-k+1){ uint miss(missmatchNumber(unitig.substr(k-1,readLeft.size()), readLeft, errors)); if(miss<miniMiss){ miniMiss=miss; miniMissIndice=i; ended=true; } }else{ //case the read is big enough we want to recover a true overlap uint miss(missmatchNumber(unitig.substr(k-1), readLeft.substr(0,unitig.size()-k+1), errors)); if(miss<miniMiss){ kmer overlapNum(str2num(unitig.substr(unitig.size()-k+1,k-1))); vector<uNumber> possiblePath; miss+=mapOnRightEndExhaustive(read , possiblePath, {overlapNum,overlap.second+(unitig.size()-k+1)}, errors-miss); if(miss<miniMiss){ path2keep=possiblePath; miniMiss=miss; miniMissIndice=i; ended=false; } } } } if(miniMiss<=errors){ if(ended){ path.push_back(rangeUnitigs[miniMissIndice].second); path.push_back(readLeft.size()+k-1); }else{ path.push_back(rangeUnitigs[miniMissIndice].second); path.insert(path.end(), path2keep.begin(),path2keep.end()); } successMR++; } return miniMiss; }