Beispiel #1
0
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 {};
}
Beispiel #2
0
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 {};
}
Beispiel #3
0
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 {};
}