⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alignmentclass.cpp.bak

📁 利用动态规划算法进行核酸序列的两两比对的源代码。
💻 BAK
字号:
// aligmentClass.cpp: implementation of the AligmentClass class.
//
//////////////////////////////////////////////////////////////////////


#include "math.h"
#include "AlignmentClass.h"
//#include <fstream>
//#include <math.h>

//const double s[5][5]={{1,0.5,0.5,0,0},{0.5,1,0.5,0,0},{0,0.5,1,0.5,0},{0.5,0,0.5,1,0},{0,0,0,0,0}};//打分矩阵
const double s[5][5]={{1.0,-1,-2.0,-1,-2.0},{-1,1.0,-1,-2.0,-2.0},{-2.0,-1,1.0,-1,-2.0},{0,-2.0,0,1.0,-2.0},{-2.0,-2.0,-2.0,-2.0,0}};//打分矩阵
const double K = 1.23891;
const double L = 1.386294;

double tmpArray[PSS4LineLength][PSS4LineLength];
double ArrayMax(int a,int rang);
double ShowMax(double a,double b,double c);
double S(char a,char b);
const double reducematrix=0;
const double gap=0.1;


float ExtAlign(AlignmentResult &rar,int tb,int te,int pb,int pe)
{
	int i,j;
	float score=0;
	
	std::ofstream log("log1");
	log<<"Seed:"<<std::endl;
	for(i=rar.TBegin;i<rar.TEnd;i++)
		log<<rar.Text[i];
	log<<std::endl;
	for(i=rar.PBegin;i<rar.PEnd;i++)
		log<<rar.Pattern[i];
	log<<std::endl;
	log<<std::endl;
	for(i=tb;i<te;i++)
		log<<rar.Text[i];
	log<<std::endl;
	for(i=pb;i<pe;i++)
		log<<rar.Pattern[i];
	log<<std::endl;
	for(i=0;i<=(te-tb);i++)
	{
		for(j=0;j<=(te-tb);j++)
		{
			log<<tmpArray[i][j]<<"  ";
		}
		log<<std::endl;
	}
	

	for(i=0;i<=(te-tb);i++)
	{
		int j1=(i-(int)(reducematrix*(te-tb)))>0?(i-(int)(reducematrix*(te-tb))):0;
		int j2=(i+(int)(reducematrix*(te-tb))<(te-tb))?(i+(int)(reducematrix*(te-tb))):(te-tb);
		for(j=j1;j<=j2;j++)
		{
			if(i==0||j==0)
				tmpArray[i][j]=0;

			else
				tmpArray[i][j]=ShowMax(tmpArray[i-1][j-1]+S(rar.Text[tb+j-1],rar.Pattern[pb+i-1]),tmpArray[i][j-1]+gap,tmpArray[i-1][j]+gap);
		}
	}
	for(i=0;i<=(te-tb);i++)
	{
		for(j=0;j<=(te-tb);j++)
		{
			log<<tmpArray[i][j]<<"  ";
		}
		log<<std::endl;
	}
	score=ArrayMax(te-tb,(int)(reducematrix*(te-tb)));

	log.close();
	return score;
	
}

float AlignmentClass::FinalAlign(AlignmentResult &rar,int tb,int te,int pb,int pe)
{
	int i,j;
	float score=0;
	int tgapcount=0;
	int pgapcount=0;
	//int tmpArray[PSS4LineLength][PSS4LineLength];
	std::ofstream log("log1");
	for(i=0;i<=(pe-pb);i++)
	{
		for(j=0;j<=(te-tb);j++)
		{
			log<<tmpArray[i][j]<<"  ";
		}
		log<<std::endl;
	}
	
	for(i=0;i<=(pe-pb);i++)
	{
		//int j1=(i-(int)(reducematrix*(te-tb)))>0?(i-(int)(reducematrix*(te-tb))):0;
		//int j2=(i+(int)(reducematrix*(te-tb))<(te-tb))?(i+(int)(reducematrix*(te-tb))):(te-tb);
		for(j=0;j<=(te-tb);j++)
		{
			
			if(i==0||j==0)
				tmpArray[i][j]=0;
			else
				tmpArray[i][j]=ShowMax(tmpArray[i-1][j-1]+S(rar.Text[tb+j-1],rar.Pattern[pb+i-1]),tmpArray[i][j-1]+gap,tmpArray[i-1][j]+gap);
			  //tmpArray[i][j]=ShowMax(tmpArray[i-1][j-1]+S(rar.Text[tb+j-1],rar.Pattern[pb+i-1]),tmpArray[i][j-1]-gap,tmpArray[i-1][j]-gap);
		}
	}
	log<<"\t\t";
	for(j=0;j<(te-tb);j++)
		log<<rar.Text[j]<<"\t";
	log<<std::endl;
	for(i=0;i<=(pe-pb);i++)
	{
		if(i>0)
			log<<rar.Pattern[i-1]<<"\t";
		else
			log<<"\t";
		for(j=0;j<=(te-tb);j++)
		{
			log<<tmpArray[i][j]<<"\t";
		}
		log<<std::endl;
	}
	log.close();
	for(i=(pe-pb),j=(te-tb);i>0&&j>0;)
	{
		double ttt=S(rar.Text[tb+j-1],rar.Pattern[pb+i-1]);
		if(tmpArray[i][j]==tmpArray[i-1][j-1]+ttt)
		{
			i--;
			j--;
		}
		else if(tmpArray[i][j]==tmpArray[i-1][j]+gap)
		{
			rar.TGapRecord.push_back(i-2);
			tgapcount++;
			j--;
		}
		else if(tmpArray[i][j]==tmpArray[i][j-1]+gap)
		{
		
			rar.PGapRecord.push_back(j-2);
			pgapcount++;
			i--;
			
		}
		else
		{
			i--;
			j--;
		}

	}
	score=tmpArray[pe-pb][te-tb];
	rar.SimScore=score;
	rar.Similarity=rar.SimScore/double(te-tb+pgapcount+tgapcount);
	rar.TGapCount=tgapcount;
	rar.PGapCount=pgapcount;
	return score;


}


void AlignmentClass::MainAlignment(AlignmentResult &rar)
{
	/*char *T=tar.Text;
	char *P=tar.Pattern;
	AlignmentResult rar;
	ResultAsignMent(&rar,&tar);*/
	bool RFlag=true,LFlag=true;
	int extcount=0;
	while(RFlag==true)//while(LFlag==TRUE||RFlag==TRUE)
	{
		if(LFlag==true)
		{
			//LeftExtend
			if(rar.IsPbegin()||rar.IsTbegin())
			{
				LFlag=false;
			}
			else
			{
				
				double Score=0;
				int Lext=rar.Lextern();
				
				Score=ExtAlign(rar,rar.TBegin-Lext,rar.TBegin,rar.PBegin-Lext,rar.PBegin);
			
				//int t1=(Score+rar.SimScore),t2=(Lext+(rar.PEnd-rar.PBegin)),t3=(rar.SimScore)+t1,t4=(rar.PEnd-rar.PBegin)+t2;
				
				if(Score/Lext<LocalSimDomain)
					LFlag=false;
				else
				{
					extcount++;
					//RFlag=true;
					rar.TBegin=rar.TBegin-Lext;
					rar.PBegin=rar.PBegin-Lext;
					//rar.SimScore=Score;
					//rar.Similarity=rar.SimScore/(rar.PEnd-rar.PBegin);
				}
			}
			if(RFlag==true)
			{
				
				//RExtend
				if(rar.IsPend()||rar.IsTend())
				{
					RFlag=false;
				}
				else
				{
					int Score=0;
					int Rext=rar.Rextern();

					Score=ExtAlign(rar,rar.TEnd,rar.TEnd+Rext,rar.PEnd,rar.PEnd+Rext);

					if(Score/Rext<LocalSimDomain)
						RFlag=false;
					else
					{
						extcount++;
						//LFlag=true;
						rar.TEnd=rar.TEnd+Rext;
						rar.PEnd=rar.PEnd+Rext;
						//rar.SimScore=Score;
						//rar.Similarity=rar.SimScore/(rar.PEnd-rar.PBegin);
					}					
				}
			}
		}
		
		else
		{
			if(RFlag==true)
			{
				
			//	RExtend();
				if(rar.IsPend()||rar.IsTend())
				{
					RFlag=false;
				}
				else
				{
					int Score=0;
					int Rext=rar.Rextern();

					Score=ExtAlign(rar,rar.TEnd,rar.TEnd+Rext,rar.PEnd,rar.PEnd+Rext);

					if(Score/Rext<LocalSimDomain)
						RFlag=false;
					else
					{
						extcount++;
						//LFlag=true;
						rar.TEnd=rar.TEnd+Rext;
						rar.PEnd=rar.PEnd+Rext;
						//rar.SimScore=Score;
						//rar.Similarity=rar.SimScore/(rar.PEnd-rar.PBegin);
					}
				}				
			}
		}
	}
	if(extcount>=3)
	{
		rar.SimScore=FinalAlign(rar,rar.TBegin,rar.TEnd,rar.PBegin,rar.PEnd);
		rar.Similarity=rar.SimScore/(rar.PEnd-rar.PBegin);
		double m=rar.PatternCount;
		double n=rar.TextCount;
		double x=rar.SimScore;
		rar.p_value=1-exp(-K*m*n*exp(-L*x));
	}
	else
	{
		rar.SimScore=-1;
		rar.Similarity=-1;
		rar.p_value=-1;
	}
	//return rar;
}

int AlignmentResult::Lextern()
{
	int i=(TBegin-ExtendStep)>0?ExtendStep:TBegin;
	int j=(PBegin-ExtendStep)>0?ExtendStep:PBegin;
	i=(i<=j?i:j);
	return i;
}
int AlignmentResult::Rextern()
{
	int i=(TEnd+ExtendStep)<TextCount?ExtendStep:TextCount-TEnd;
	int j=(PEnd+ExtendStep)<PatternCount?ExtendStep:PatternCount-PEnd;
	i=(i<=j?i:j);
	return i;
}

bool AlignmentResult::IsTbegin()
{
	if(TBegin==0)
		return true;
	else
		return	false;

}

bool AlignmentResult::IsTend()
{
	if(TEnd==TextCount)
		return true;
	else
		return	false;

}
bool AlignmentResult::IsPend()
{
	if(PEnd==PatternCount)
		return true;
	else
		return	false;

}
bool AlignmentResult::IsPbegin()
{
	if(PBegin==0)
		return true;
	else
		return	false;

}

void AlignmentClass::ResultAsignMent(AlignmentResult& rar,AlignmentResult& tar)
{
	rar.PBegin=tar.PBegin;
	rar.PEnd=tar.PEnd;
	rar.TBegin=tar.TBegin;
	rar.TEnd=tar.TEnd;

	rar.Similarity=tar.Similarity;
	rar.SimScore=tar.SimScore;

	rar.PatternCount=tar.PatternCount;
	rar.TextCount=tar.TextCount;
	rar.Text=tar.Text;
	rar.Pattern=tar.Pattern;
}
double S(char a,char b)//打分矩阵
{
	int a1,b1;
	switch(a)
	{
		case '0':
			 a1=0;break;
		case '1':
			 a1=1;break;
		case '2':
			 a1=2;break;
		case '3':
			 a1=3;break;
		case ' ':
			 a1=4;break;
	}
	switch(b)
	{
		case '0':
			 b1=0;break;
		case '1':
			 b1=1;break;
		case '2':
			 b1=2;break;
		case '3':
			 b1=3;break;
		case ' ':
			b1=4;break;
	}
	if(a1==-1||b1==-1)
		return 0;
	double t=s[a1][b1];
	return t;
	
}
double ShowMax(double a,double b,double c)
{
	double tmp=a>b?a:b;
	tmp=tmp>c?tmp:c;
	return tmp;
}

void AlignmentClass::test(AlignmentResult &tmpAR)
{
	std::ofstream OutFile;
	OutFile.open("odata\\test.out",std::ios::out|std::ios::app);
	//int tmpExt=Result.PEnd-Result.PBegin;
	int i,j;
	for(i=tmpAR.PBegin;i<tmpAR.PEnd;i++)
	{
		for(j=tmpAR.TBegin;j<tmpAR.TEnd;j++)
		{
			if(tmpArray[i][j]>=0)
				OutFile<<tmpArray[i][j]<<" ";
			else
				OutFile<<"*"<<" ";
		}
		OutFile<<std::endl;
	}
	

}
double ArrayMax(int a,int range)
{
	double max;
	int rangei,rangej;
	if(a<=0)
	{
		rangei=0;
		rangej=0;
		return max=tmpArray[0][0];
	}
	else
	{
		max=tmpArray[a][a];
		rangei=a;
		rangej=a;
		for(int i=1;i<(range<a?range:a);i++)
		{
			if(max<tmpArray[a][a-i])
			{
				rangei=a;
				rangej=a-i;
				max=tmpArray[a][a-i];
			}
			if(max<tmpArray[a-i][a])
			{
				rangei=a-i;
				rangej=a;
				max=tmpArray[(a-i)>i?(a-i):i][a];
			}
		}
		return max;
	}
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -