//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; }
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) }