Exemple #1
0
double Perseus::basicPairwiseAlignSeqs(string query, string reference, string& qAlign, string& rAlign, pwModel model){
	try {
		double GAP = model.GAP_OPEN;
		double MATCH = model.MATCH;
		double MISMATCH = model.MISMATCH;
		
		int queryLength = query.size();
		int refLength = reference.size();
		
		vector<vector<double> > alignMatrix(queryLength + 1);
		vector<vector<char> > alignMoves(queryLength + 1);
		
		for(int i=0;i<=queryLength;i++){
			if (m->getControl_pressed()) { return 0; }
			alignMatrix[i].resize(refLength + 1, 0);
			alignMoves[i].resize(refLength + 1, 'x');
		}
		
		for(int i=0;i<=queryLength;i++){
			if (m->getControl_pressed()) { return 0; }
			alignMatrix[i][0] = GAP * i;
			alignMoves[i][0] = 'u';
		}
		
		for(int i=0;i<=refLength;i++){
			if (m->getControl_pressed()) { return 0; }
			alignMatrix[0][i] = GAP * i;
			alignMoves[0][i] = 'l';
		}
		
		for(int i=1;i<=queryLength;i++){
			
			if (m->getControl_pressed()) { return 0; }
			
			for(int j=1;j<=refLength;j++){
				
				double nogapScore;		
				if(query[i-1] == reference[j-1]){	nogapScore = alignMatrix[i-1][j-1] + MATCH;		}
				else							{	nogapScore = alignMatrix[i-1][j-1] + MISMATCH;	}
				
				double leftScore;
				if(i == queryLength)			{	leftScore = alignMatrix[i][j-1];				}
				else							{	leftScore = alignMatrix[i][j-1] + GAP;			}
				
				
				double upScore;
				if(j == refLength)				{	upScore = alignMatrix[i-1][j];					}
				else							{	upScore = alignMatrix[i-1][j] + GAP;			}
				
				if(nogapScore > leftScore){
					if(nogapScore > upScore){
						alignMoves[i][j] = 'd';
						alignMatrix[i][j] = nogapScore;
					}
					else{
						alignMoves[i][j] = 'u';
						alignMatrix[i][j] = upScore;
					}
				}
				else{
					if(leftScore > upScore){
						alignMoves[i][j] = 'l';
						alignMatrix[i][j] = leftScore;
					}
					else{
						alignMoves[i][j] = 'u';
						alignMatrix[i][j] = upScore;
					}
				}
			}
		}
		
		int i = queryLength;
		int j = refLength;
		
		qAlign = "";
		rAlign = "";
			
		int diffs = 0;
		int length = 0;
		
		while(i > 0 && j > 0){
			
			if (m->getControl_pressed()) { return 0; }
			
			if(alignMoves[i][j] == 'd'){
				qAlign = query[i-1] + qAlign;
				rAlign = reference[j-1] + rAlign;

				if(query[i-1] != reference[j-1]){	diffs++;	}
				length++;
				
				i--;
				j--;
			}
			else if(alignMoves[i][j] == 'u'){
				qAlign = query[i-1] + qAlign;
				
				if(j != refLength)	{	rAlign = '-' + rAlign;	diffs++;	length++;	}
				else				{	rAlign = '.' + rAlign;	}
				i--;
			}
			else if(alignMoves[i][j] == 'l'){
				rAlign = reference[j-1] + rAlign;
				
				if(i != queryLength){	qAlign = '-' + qAlign;	diffs++;	length++;	}
				else				{	qAlign = '.' + qAlign;	}
				j--;
			}
		}
		
		while(i>0){
			
			if (m->getControl_pressed()) { return 0; }
			
			rAlign = '.' + rAlign;
			qAlign = query[i-1] + qAlign;
			i--;
		}
		
		while(j>0){
			
			if (m->getControl_pressed()) { return 0; }
			
			rAlign = reference[j-1] + rAlign;
			qAlign = '.' + qAlign;
			j--;
		}
		
		

		return double(diffs)/double(length);
	}
	catch(exception& e) {
		m->errorOut(e, "Perseus", "basicPairwiseAlignSeqs");
		exit(1);
	}
	
}
Exemple #2
0
int seqNoise::countDiffs(vector<int> query, vector<int> ref){
	try {
		//double MATCH = 5.0;
		//double MISMATCH = -2.0;
		//double GAP = -2.0;
		
		vector<vector<double> > correctMatrix(4);
		for(int i=0;i<4;i++){	correctMatrix[i].resize(4);	}
		
		correctMatrix[0][0] = 0.000000;		//AA
		correctMatrix[1][0] = 11.619259;	//CA
		correctMatrix[2][0] = 11.694004;	//TA
		correctMatrix[3][0] = 7.748623;		//GA
		
		correctMatrix[1][1] = 0.000000;		//CC
		correctMatrix[2][1] = 7.619657;		//TC
		correctMatrix[3][1] = 12.852562;	//GC
		
		correctMatrix[2][2] = 0.000000;		//TT
		correctMatrix[3][2] = 10.964048;	//TG
		
		correctMatrix[3][3] = 0.000000;		//GG
		
		for(int i=0;i<4;i++){
			for(int j=0;j<i;j++){
				correctMatrix[j][i] = correctMatrix[i][j];
			}
		}
		
		int queryLength = query.size();
		int refLength = ref.size();
		
		vector<vector<double> > alignMatrix(queryLength + 1);
		vector<vector<char> > alignMoves(queryLength + 1);
		
		for(int i=0;i<=queryLength;i++){
			if (m->control_pressed) { return 0; }
			alignMatrix[i].resize(refLength + 1, 0);
			alignMoves[i].resize(refLength + 1, 'x');
		}
		
		for(int i=0;i<=queryLength;i++){
			if (m->control_pressed) { return 0; }
			alignMatrix[i][0] = 15.0 * i;
			alignMoves[i][0] = 'u';
		}
		
		for(int i=0;i<=refLength;i++){
			if (m->control_pressed) { return 0; }
			alignMatrix[0][i] = 15.0 * i;
			alignMoves[0][i] = 'l';
		}
		
		for(int i=1;i<=queryLength;i++){
			if (m->control_pressed) { return 0; }
			for(int j=1;j<=refLength;j++){
				
				double nogap;		
				nogap = alignMatrix[i-1][j-1] + correctMatrix[query[i-1]][ref[j-1]];
				
				
				double gap;
				double left;
				if(i == queryLength){ //terminal gap
					left = alignMatrix[i][j-1];
				}
				else{
					if(ref[j-1] == getLastMatch('l', alignMoves, i, j, query, ref)){
						gap = 4.0;
					}
					else{
						gap = 15.0;
					}
					
					left = alignMatrix[i][j-1] + gap;
				}
				
				
				double up;
				if(j == refLength){ //terminal gap
					up = alignMatrix[i-1][j];
				}
				else{
					
					if(query[i-1] == getLastMatch('u', alignMoves, i, j, query, ref)){
						gap = 4.0;
					}
					else{
						gap = 15.0;
					}
					
					up = alignMatrix[i-1][j] + gap;
				}
				
				
				
				if(nogap < left){
					if(nogap < up){
						alignMoves[i][j] = 'd';
						alignMatrix[i][j] = nogap;
					}
					else{
						alignMoves[i][j] = 'u';
						alignMatrix[i][j] = up;
					}
				}
				else{
					if(left < up){
						alignMoves[i][j] = 'l';
						alignMatrix[i][j] = left;
					}
					else{
						alignMoves[i][j] = 'u';
						alignMatrix[i][j] = up;
					}
				}
			}
		}
		
		int i = queryLength;
		int j = refLength;
		int diffs = 0;
		
		//	string alignA = "";
		//	string alignB = "";
		//	string bases = "ACTG";
		
		while(i > 0 && j > 0){
			if (m->control_pressed) { return 0; }
			if(alignMoves[i][j] == 'd'){
				//			alignA = bases[query[i-1]] + alignA;
				//			alignB = bases[ref[j-1]] + alignB;
				
				if(query[i-1] != ref[j-1])	{	diffs++;	}
				
				i--;
				j--;
			}
			else if(alignMoves[i][j] == 'u'){
				if(j != refLength){
					//				alignA = bases[query[i-1]] + alignA;
					//				alignB = '-' + alignB;
					
					diffs++;
				}
				
				i--;
			}
			else if(alignMoves[i][j] == 'l'){
				if(i != queryLength){
					//				alignA = '-' + alignA;
					//				alignB = bases[ref[j-1]] + alignB;
					
					diffs++;
				}
				
				j--;
			}
		}
		
		//	cout << diffs << endl;
		//	cout << alignA << endl;
		//	cout << alignB << endl;
		//	cout << endl;
		
		return diffs;
	}
	catch(exception& e) {
		m->errorOut(e, "seqNoise", "countDiffs");
		exit(1);
	}
	
}
Exemple #3
0
double Perseus::modeledPairwiseAlignSeqs(string query, string reference, string& qAlign, string& rAlign, vector<vector<double> >& correctMatrix){
	try {
		int queryLength = query.size();
		int refLength = reference.size();
		
		vector<vector<double> > alignMatrix(queryLength + 1);
		vector<vector<char> > alignMoves(queryLength + 1);
		
		for(int i=0;i<=queryLength;i++){
			if (m->getControl_pressed()) { return 0; }
			alignMatrix[i].resize(refLength + 1, 0);
			alignMoves[i].resize(refLength + 1, 'x');
		}
		
		for(int i=0;i<=queryLength;i++){
			if (m->getControl_pressed()) { return 0; }
			alignMatrix[i][0] = 15.0 * i;
			alignMoves[i][0] = 'u';
		}
		
		for(int i=0;i<=refLength;i++){
			if (m->getControl_pressed()) { return 0; }
			alignMatrix[0][i] = 15.0 * i;
			alignMoves[0][i] = 'l';
		}
		
		for(int i=1;i<=queryLength;i++){
			
			if (m->getControl_pressed()) { return 0; }
			
			for(int j=1;j<=refLength;j++){
				
				double nogap;		
				nogap = alignMatrix[i-1][j-1] + correctMatrix[toInt(query[i-1])][toInt(reference[j-1])];			
				
				double gap;
				
				double left;
				if(i == queryLength){ //terminal gap
					left = alignMatrix[i][j-1];
				}
				else{
					if(reference[j-1] == getLastMatch('l', alignMoves, i, j, query, reference)){
						gap = 4.0;
					}
					else{
						gap = 15.0;
					}
					
					left = alignMatrix[i][j-1] + gap;
				}
				
				double up;
				if(j == refLength){ //terminal gap
					up = alignMatrix[i-1][j];
				}
				else{
					
					if(query[i-1] == getLastMatch('u', alignMoves, i, j, query, reference)){
						gap = 4.0;
					}
					else{
						gap = 15.0;
					}
					
					up = alignMatrix[i-1][j] + gap;
				}
				
				
				if(nogap < left){
					if(nogap < up){
						alignMoves[i][j] = 'd';
						alignMatrix[i][j] = nogap;
					}
					else{
						alignMoves[i][j] = 'u';
						alignMatrix[i][j] = up;
					}
				}
				else{
					if(left < up){
						alignMoves[i][j] = 'l';
						alignMatrix[i][j] = left;
					}
					else{
						alignMoves[i][j] = 'u';
						alignMatrix[i][j] = up;
					}
				}
			}
		}

		int i = queryLength;
		int j = refLength;
		
		int alignLength = 0;
		
		while(i > 0 && j > 0){
			
			if (m->getControl_pressed()) { return 0; }
			
			if(alignMoves[i][j] == 'd'){
				qAlign = query[i-1] + qAlign;
				rAlign = reference[j-1] + rAlign;
				alignLength++;
				i--;
				j--;
			}
			else if(alignMoves[i][j] == 'u'){
				if(j != refLength){
					qAlign = query[i-1] + qAlign;
					rAlign = '-' + rAlign;
					alignLength++;
				}
				
				i--;
			}
			else if(alignMoves[i][j] == 'l'){
				if(i != queryLength){
					qAlign = '-' + qAlign;
					rAlign = reference[j-1] + rAlign;
					alignLength++;				
				}
				
				j--;
			}
		}

		return alignMatrix[queryLength][refLength] / (double)alignLength;
	}
	catch(exception& e) {
		m->errorOut(e, "Perseus", "modeledPairwiseAlignSeqs");
		exit(1);
	}
}
Exemple #4
0
double correctDist::getDist(vector<int>& seqA, vector<int>& seqB){
	try {
		
		int lengthA = seqA.size();
		int lengthB = seqB.size();
		
		vector<vector<double> > alignMatrix(lengthA+1);
		vector<vector<char> > alignMoves(lengthA+1);
		
		for(int i=0;i<=lengthA;i++){
			alignMatrix[i].resize(lengthB+1, 0);
			alignMoves[i].resize(lengthB+1, 'x');
		}
		
		for(int i=0;i<=lengthA;i++){
			alignMatrix[i][0] = 15.0 * i;
			alignMoves[i][0] = 'u';
		}
		for(int i=0;i<=lengthB;i++){
			alignMatrix[0][i] = 15.0 * i;
			alignMoves[0][i] = 'l';
		}
		
		for(int i=1;i<=lengthA;i++){
			for(int j=1;j<=lengthB;j++){
				
				if (m->control_pressed) {  return 0;  }
				
				double nogap;		
				nogap = alignMatrix[i-1][j-1] + correctMatrix[seqA[i-1]][seqB[j-1]];
				
				
				double gap;
				double left;
				if(i == lengthA){ //terminal gap
					left = alignMatrix[i][j-1];
				}
				else{
					if(seqB[j-1] == getLastMatch('l', alignMoves, i, j, seqA, seqB)){
						gap = 4.0;
					}
					else{
						gap = 15.0;
					}
					
					left = alignMatrix[i][j-1] + gap;
				}
				
				
				double up;
				if(j == lengthB){ //terminal gap
					up = alignMatrix[i-1][j];
				}
				else{
					
					if(seqA[i-1] == getLastMatch('u', alignMoves, i, j, seqA, seqB)){
						gap = 4.0;
					}
					else{
						gap = 15.0;
					}
					
					up = alignMatrix[i-1][j] + gap;
				}
				
				
				
				if(nogap < left){
					if(nogap < up){
						alignMoves[i][j] = 'd';
						alignMatrix[i][j] = nogap;
					}
					else{
						alignMoves[i][j] = 'u';
						alignMatrix[i][j] = up;
					}
				}
				else{
					if(left < up){
						alignMoves[i][j] = 'l';
						alignMatrix[i][j] = left;
					}
					else{
						alignMoves[i][j] = 'u';
						alignMatrix[i][j] = up;
					}
				}
			}
		}
		
		int i = lengthA;
		int j = lengthB;
		int count = 0;
		
		
		//	string alignA = "";
		//	string alignB = "";
		//	string bases = "ACTG";
		//	
		//	for(int i=0;i<lengthA;i++){
		//		cout << bases[seqA[i]];
		//	}cout << endl;
		//
		//	for(int i=0;i<lengthB;i++){
		//		cout << bases[seqB[i]];
		//	}cout << endl;
		
		while(i > 0 && j > 0){
			
			if (m->control_pressed) {  return 0;  }
			
			if(alignMoves[i][j] == 'd'){
				//			alignA = bases[seqA[i-1]] + alignA;
				//			alignB = bases[seqB[j-1]] + alignB;
				
				count++;
				i--;
				j--;
			}
			else if(alignMoves[i][j] == 'u'){
				if(j != lengthB){
					//				alignA = bases[seqA[i-1]] + alignA;
					//				alignB = '-' + alignB;
					count++;
				}
				
				i--;
			}
			else if(alignMoves[i][j] == 'l'){
				if(i != lengthA){
					//				alignA = '-' + alignA;
					//				alignB = bases[seqB[j-1]] + alignB;
					count++;
				}
				
				j--;
			}
		}
		
		//	cout << alignA << endl << alignB << endl;
		
		return alignMatrix[lengthA][lengthB] / (double)count;
	}
	catch(exception& e) {
		m->errorOut(e, "correctDist", "getDist");
		exit(1);
	}	
}