//calculate simple TMscore
double ZoomIn_Align::T_Similar(double *rotmat_,int *ali1,int *ali2)
{
	int i;
	int ii,jj;
	double dist2;
	double ori_d;
	double score;
	double d_0=d0;
	XYZ temp;

	score=0.0;
	temp=0.0;
	ori_d=d_0*d_0;
	for(i=0;i<moln2;i++)
	{
		if(ali2[i]==-1)continue;
		if(ali2[i]<0)ii=ali2[i]+INT_MAX_NUM;
		else ii=ali2[i];
		jj=i;
		rot_point(mol1[ii],temp,rotmat_);
		dist2=mol2[jj].distance_square(temp);
		score+=1.0/(1.0+dist2/ori_d);
	}
	return score;
}
double TM_align::TM_Vector_Score_CB(int ii,int jj,double *rotmat_,
	XYZ *mol1,XYZ *mol2,int moln1,int moln2)
{
	XYZ temp1,temp2;
	double v1[3],v2[3];
	double d1,d2;
	double score;
	int range=0;
	if(ii<0||jj<0)return 0.5;
	if(ii+range>=moln1||jj+range>=moln2)return 0.5;
	if(rotmat_!=0)
	{
		TMs_Cache_Point(mol1,ii,temp1,rotmat_);
		rot_point(TM_cb1[ii],temp2,rotmat_);
	}
	else
	{
		temp1=mol1[ii];
		temp2=TM_cb1[ii];
	}
	(temp1-temp2).xyz2double(v1);
	(mol2[jj]-TM_cb2[jj]).xyz2double(v2);
	d1=sqrt(dot(v1,v1,3));
	d2=sqrt(dot(v2,v2,3));
	if(d1>2.0||d2>2.0||d1<1.0||d2<1.0)return 0.0;
	score=dot(v1,v2,3)/d1/d2;
	score=limit(score,-1.0,1.0);
	return (score+1.0)/2;
}
void ZoomIn_Align::Kill_Bad(double thres,double cutoff,double *rotmat_)
{
	int i;
	int ii,jj;
	double cut;
	double dist;
	XYZ temp;
	double Dou_Thres=thres*thres;
	double SQURE_DIST=MAX_DIST*MAX_DIST;

	for(i=0;i<moln2;i++)
	{
		ii=ali2[i];
		jj=i;
		if(ii>=0)
		{
			rot_point(mol1[ii],temp,rotmat_);
			dist=mol2[jj].distance_square(temp);
			if(dist>SQURE_DIST)
			{
				ali2[jj]=-1;
				ali1[ii]=-1;
			}
			else if(dist>Dou_Thres)
			{
				cut=Ali3_Vector_Score_Forward(ii,jj,rotmat_,mol1,mol2,moln1,moln2,SCALE);
				if(cut<cutoff)
				{
					ali2[jj]=-1;
					ali1[ii]=-1;
				}
			}
		}
	}
}
double TM_align::TM_Align_Get_Score_Part_TMsco(XYZ *mol1,XYZ *mol2,double *rotmat_,
	int moln1,int moln2,int *ali2)
{
	int i;
	double dist2;
	double ori_d=d0*d0;
	double tms;
	int pos;
	XYZ xyz;
	double ws_sco=0.0;
	//calc_score
	for(i=0;i<moln2;i++)
	{
		pos=ali2[i];
		if(pos<0 || pos>=moln1)continue;
		//single
		if(rotmat_!=0)rot_point(mol1[pos],xyz,rotmat_);
		else xyz=mol1[pos];
		dist2=mol2[i].distance_square(xyz);
		tms=1.0/(1.0+dist2/ori_d);
		//total score
		ws_sco+=tms;
	}
	return ws_sco;
}
Exemple #5
0
t_color			texture_plan(t_obj object, t_point inter)
{
	float	x;
	float	y;
	int		colo;
	t_point	rot;
	t_plan	*tmp;

	normal = normal_sphere(*(t_sphere *)(obj.obj), inter, ray);
	if (!object.texture)
		return (object.color);
	tmp = ((t_plan *)object.obj);
	rot = vec_dir(new_point(0, 0, 0), new_point(tmp->a, tmp->b, tmp->c));
	x = rot.x + rot.y + rot.z;
	inter = rot_point(new_point(inter.x - rot.x * (tmp->d / (tmp->a + tmp->b +
		tmp->c)), inter.y - rot.y * (tmp->d / (tmp->a + tmp->b + tmp->c)),
	inter.z - rot.z * (tmp->d / (tmp->a + tmp->b + tmp->c))),
	get_rot_mat(M_PI / 2 * rot.z / x, 0, -M_PI / 2 * rot.x / x));
	colo = 0;
	x = (inter.x - floor(inter.x / 30) * 30) / 30 * object.texture->width;
	y = (10 - (inter.z - floor(inter.z / 10) * 10))
		/ 10 * object.texture->height;
	ft_memcpy(&colo, object.texture->data + ((int)x * (object.texture->bpp /
		8)) + ((int)y * object.texture->sl), 3);
	return (normalize(new_point((def.red * 2 - 255) / 255 + normal.x,
		-(def.green * 2 - 255) / 255 + normal.y, (def.blue * 2 - 255)
		/ 255 + normal.z)));
}
//==================== virtual function ====================//-> part[1]: score
//given alignment and rotmat, return scores (maybe TMscore,RMSD and LALI, etc)
double CLEFAPS::CLEPAPS_Make_Score(Align_Record & align_record)
{
	int i;
	int ii,jj;
	double dist2;
	double ori_d;
	double sco;
	double rms;
	double tms;
	int count;
	int lali;
	double rmsd;
	//init equal
	align_record.alignment.resize(moln2);
	for(i=0;i<moln2;i++)align_record.alignment[i]=ali2[i];
	align_record.rotmat.resize(12);
	for(i=0;i<12;i++)align_record.rotmat[i]=CLEP_rotmat[i];
	//calculate
	double d_0=TM_d0;
	XYZ temp=0.0;
	ori_d=d_0*d_0;
	sco=0.0;
	rms=0.0;
	count=0;
	for(i=0;i<moln2;i++)
	{
		ii=ali2[i];
		jj=i;
		if(ii==-1)continue;

#ifdef DEBUG
	overrange_debug_test(ii,moln1);
	overrange_debug_test(jj,moln2);
	lessrange_debug_test(ii,0);
	lessrange_debug_test(jj,0);
#endif

		rot_point(mol1[ii],temp,CLEP_rotmat);
		dist2=mol2[jj].distance_square(temp);
		sco+=1.0/(1.0+dist2/ori_d);
		rms+=dist2;
		count++;
	}
	//evaluate
	rmsd=sqrt(1.0*rms/count);
	lali=count;
	tms=1.0*sco/TM_smaller;
	//final
	align_record.RMSD=rmsd;
	align_record.lali=lali;
	align_record.TMsco=tms;
	align_record.main_sco=tms;
	return tms;
}
double TM_align::TM_Align_Get_Score_Part_Rmsd(XYZ *mol1,XYZ *mol2,double *rotmat_,
	int moln1,int moln2,int *ali2)
{
	int i;
	double dist2;
	int pos;
	XYZ xyz;
	int lali=0;
	double ws_sco=0.0;
	//calc_score
	for(i=0;i<moln2;i++)
	{
		pos=ali2[i];
		if(pos<0 || pos>=moln1)continue;
		//single
		if(rotmat_!=0)rot_point(mol1[pos],xyz,rotmat_);
		else xyz=mol1[pos];
		dist2=mol2[i].distance_square(xyz);
		//total score
		ws_sco+=dist2;
		lali++;
	}
	return 1.0*sqrt(1.0*ws_sco/lali);
}
void ZoomIn_Align::Elongation(double *rotmat_,double thres,int cutoff,int *ali1,int *ali2)
{
	int i;
	int ii,jj;
	int index1,index2;
	double Dou_Thres=thres*thres;
	int success;
	XYZ temp1,temp2,temp;
	int cut1,cut2,cut;

	//forward_elongation
	for(i=0;i<moln2;i++)
	{
		if(ali2[i]<0)continue;
		//forward
		index1 = ali2[i];
		index2 = i;

#ifdef DEBUG
	overrange_debug_test(index1,moln1);
	overrange_debug_test(index2,moln2);
	lessrange_debug_test(index1,0);
	lessrange_debug_test(index2,0);
#endif

		for(;;)
		{
			success=0; //default:fail
			index1++;
			index2++;
			if(index1>moln1-1 || index2>moln2-1) break;
			jj=ali1[index1];
			ii=ali2[index2];
			if(jj!=-1 && ii!=-1) break;
			else if(jj!=-1 && ii==-1)
			{
				rot_point(mol1[index1],temp,rotmat_);
				cut1=Ali3_Vector_Score_Forward(index1,index2,rotmat_,mol1,mol2,moln1,moln2,SCALE);
				cut2=Ali3_Vector_Score_Forward(index1,jj,rotmat_,mol1,mol2,moln1,moln2,SCALE);
				if((mol2[index2].distance_square(temp) < mol2[jj].distance_square(temp)) || cut1>cut2)
				{
					ali2[jj]=-1;
					ali1[index1]=index2;
					ali2[index2]=index1;
					success=1; //now success
				}
			}
			else if(jj==-1 && ii!=-1)
			{
				rot_point(mol1[index1],temp1,rotmat_);
				rot_point(mol1[ii],temp2,rotmat_);
				cut1=Ali3_Vector_Score_Forward(index1,index2,rotmat_,mol1,mol2,moln1,moln2,SCALE);
				cut2=Ali3_Vector_Score_Forward(ii,index2,rotmat_,mol1,mol2,moln1,moln2,SCALE);
				if((mol2[index2].distance_square(temp1) < mol2[index2].distance_square(temp2)) || cut1>cut2)
				{
					ali1[ii]=-1;
					ali1[index1]=index2;
					ali2[index2]=index1;
					success=1; //now success
				}
			}
			else
			{
				rot_point(mol1[index1],temp,rotmat_);
				cut=Ali3_Vector_Score_Forward(index1,index2,rotmat_,mol1,mol2,moln1,moln2,SCALE);
				if(mol2[index2].distance_square(temp) < Dou_Thres || cut>cutoff)
				{
					ali1[index1]=index2;
					ali2[index2]=index1;
					success=1; //now success
				}
			}

			if(success==0)break; //failed
			i++;
		}//end of FOR(;;)
	}//end of FOR(i)


	//backward_elongation
	for(i=moln2-1;i>=0;i--)
	{
		if(ali2[i]<0)continue;
		//forward
		index1 = ali2[i];
		index2 = i;

#ifdef DEBUG
	overrange_debug_test(index1,moln1);
	overrange_debug_test(index2,moln2);
	lessrange_debug_test(index1,0);
	lessrange_debug_test(index2,0);
#endif

		for(;;)
		{
			success=0; //default:fail
			index1--;
			index2--;
			if(index1<0 || index2<0) break;
			jj=ali1[index1];
			ii=ali2[index2];
			if(jj!=-1 && ii!=-1) break;
			else if(jj!=-1 && ii==-1)
			{
				rot_point(mol1[index1],temp,rotmat_);
				cut1=Ali3_Vector_Score_Backward(index1,index2,rotmat_,mol1,mol2,moln1,moln2,SCALE);
				cut2=Ali3_Vector_Score_Backward(index1,jj,rotmat_,mol1,mol2,moln1,moln2,SCALE);
				if((mol2[index2].distance_square(temp) < mol2[jj].distance_square(temp)) || cut1>cut2)
				{
					ali2[jj]=-1;
					ali1[index1]=index2;
					ali2[index2]=index1;
					success=1; //now success
				}
			}
			else if(jj==-1 && ii!=-1)
			{
				rot_point(mol1[index1],temp1,rotmat_);
				rot_point(mol1[ii],temp2,rotmat_);
				cut1=Ali3_Vector_Score_Backward(index1,index2,rotmat_,mol1,mol2,moln1,moln2,SCALE);
				cut2=Ali3_Vector_Score_Backward(ii,index2,rotmat_,mol1,mol2,moln1,moln2,SCALE);
				if((mol2[index2].distance_square(temp1) < mol2[index2].distance_square(temp2)) || cut1>cut2)
				{
					ali1[ii]=-1;
					ali1[index1]=index2;
					ali2[index2]=index1;
					success=1; //now success
				}
			}
			else
			{
				rot_point(mol1[index1],temp,rotmat_);
				cut=Ali3_Vector_Score_Backward(index1,index2,rotmat_,mol1,mol2,moln1,moln2,SCALE);
				if(mol2[index2].distance_square(temp) < Dou_Thres || cut>cutoff)
				{
					ali1[index1]=index2;
					ali2[index2]=index1;
					success=1; //now success
				}
			}

			if(success==0)break; //failed
			i--;
		}//end of FOR(;;)
	}//end of FOR(i)
}