14 #ifndef INCLUDED_protocols_hybridization_TMalign_hh
15 #define INCLUDED_protocols_hybridization_TMalign_hh
17 #define getmax(a,b) a>b?a:b
18 #define getmin(a,b) a>b?b:a
38 #include <numeric/xyzVector.hh>
39 #include <numeric/xyzMatrix.hh>
40 #include <numeric/xyz.functions.hh>
47 namespace hybridization {
70 std::vector < std::vector < double > >
score;
71 std::vector < std::vector < bool > >
path;
72 std::vector < std::vector < double > >
val;
74 std::vector < numeric::xyzVector<core::Real> > xa,
ya;
76 vector < numeric::xyzVector <core::Real> > xtm,
ytm;
77 vector < numeric::xyzVector <core::Real> >
xt;
79 std::vector < int > secx,
secy;
80 vector < numeric::xyzVector <core::Real> > r1,
r2;
85 std::vector < int > m1_,
m2_;
89 double Lnorm_ass,
Lnorm_d0, d0_scale, d0A, d0B, d0u, d0a;
90 bool o_opt, a_opt, u_opt, d_opt,
v_opt;
95 cout << sErrorString << endl;
99 template <
class A >
void ResizeArray(
A & array,
int Narray1,
int Narray2) {
100 array.resize(Narray1);
101 for(
int i=0; i<Narray1; i++) array[i].resize(Narray2);
106 std::list <core::Size>
const & residue_list,
108 string & seq, std::vector < int > & resno) {
110 seq.resize(residue_list.size());
111 for (std::list<core::Size>::const_iterator it = residue_list.begin();
112 it != residue_list.end();
120 resno[i] = pose.
pdb_info()->number(ires);
126 return residue_list.size();
146 for(
int i=0; i<len; i++) {
147 transform(t, u, x[i], x1[i]);
156 void NWDP_TM(
Size const len1,
Size const len2,
double const gap_open, vector < int > & j2i)
167 for(
Size i=0; i<=len1; ++i) {
172 for(
Size j=0; j<=len2; ++j) {
179 for(
Size i=1; i<=len1; ++i) {
180 for(
Size j=1; j<=len2; ++j) {
181 d=val[i-1][j-1]+score[i][j];
216 if(path[i-1][j]) h +=gap_open;
219 if(path[i][j-1]) v +=gap_open;
230 int const len1,
int const len2,
232 double d02,
double gap_open, vector < int > & j2i) {
243 for(i=0; i<=len1; i++) {
248 for(j=0; j<=len2; j++) {
257 for(i=1; i<=len1; i++) {
258 transform(t, u, x[i-1], xx);
259 for(j=1; j<=len2; j++) {
261 dij=dist(xx, y[j-1]);
262 d=val[i-1][j-1] + 1.0/(1+dij/d02);
295 if(path[i-1][j]) h +=gap_open;
298 if(path[i][j-1]) v +=gap_open;
308 std::vector < int >
const secx,
309 std::vector < int >
const secy,
310 int const len1,
int const len2,
311 double gap_open, vector < int > & j2i)
323 for(i=0; i<=len1; i++) {
328 for(j=0; j<=len2; j++) {
335 for(i=1; i<=len1; i++) {
336 for(j=1; j<=len2; j++) {
338 if(secx[i-1]==secy[j-1]) {
339 d=val[i-1][j-1] + 1.0;
376 if(path[i-1][j]) h +=gap_open;
379 if(path[i][j-1]) v +=gap_open;
390 vector <core::Real> & xx) {
400 vector <vector <core::Real> > & xx) {
402 for (
Size i = 0; i<3; ++i) {
404 for (
Size j = 0; j<3; ++j) {
405 xx[i][j]= x(i+1,j+1);
413 vector <core::Real>
const x,
421 vector <vector <core::Real> >
const x,
423 for (
Size i = 0; i<3; ++i) {
424 for (
Size j = 0; j<3; ++j) {
425 xx(i+1,j+1) = x[i][j];
433 vector < vector < double > > & xx) {
435 for (
Size i=0;i<xx.size();++i) {
436 convert_xyz_to_vector(x[i],xx[i]);
450 vector < vector < double > > xx;
451 convert_xyz_v_to_vectors(x,xx);
453 vector < vector < double > > yy;
454 convert_xyz_v_to_vectors(y,yy);
456 vector < double >
tt;
457 convert_xyz_to_vector(t,tt);
459 vector < vector < double > > uu;
460 convert_xyz_to_matrix(u,uu);
463 Kabsch(xx,yy,n,mode,rms,tt,uu);
464 convert_vector_to_xyz(tt,t);
465 convert_matrix_to_xyz(uu,u);
482 vector < vector < double > >
const x,
483 vector < vector < double > >
const y,
487 vector < double > &
t,
488 vector < vector < double > > & u ) {
489 int i, j, m, m1, l, k;
490 double e0, rms1, d, h, g;
491 double cth, sth, sqrth, p, det, sigma;
493 double a[3][3],
b[3][3], r[3][3], e[3], rr[6], ss[6];
494 double sqrt3=1.73205080756888, tol=0.01;
495 int ip[]={0, 1, 3, 1, 2, 4, 3, 4, 5};
496 int ip2312[]={1, 2, 0, 1};
498 int a_failed=0, b_failed=0;
499 double epsilon=0.00000001;
520 if(n<1)
return false;
539 for (i=0; i<3; i++) {
540 e0 += (x[m][i]-xc[i])*(x[m][i]-xc[i])+\
541 (y[m][i]-yc[i])*(y[m][i]-yc[i]);
544 r[i][j] += d*(x[m][j] - xc[j]);
550 det = r[0][0] * ( r[1][1]*r[2][2] - r[1][2]*r[2][1] )\
551 - r[0][1] * ( r[1][0]*r[2][2] - r[1][2]*r[2][0] )\
552 + r[0][2] * ( r[1][0]*r[2][1] - r[1][1]*r[2][0] );
558 for (i=0; i<=j; i++) {
559 rr[m]=r[0][i]*r[0][j]+r[1][i]*r[1][j]+r[2][i]*r[2][j];
564 double spur=(rr[0]+rr[2]+rr[5]) / 3.0;
565 double cof = (((((rr[2]*rr[5] - rr[4]*rr[4]) + rr[0]*rr[5])\
566 - rr[3]*rr[3]) + rr[0]*rr[2]) - rr[1]*rr[1]) / 3.0;
569 for (i=0; i<3; i++) {
576 g = (spur*cof - det)/2.0 - spur*h;
582 d = atan2( sqrt(d), -g ) / 3.0;
583 cth = sqrth * cos(d);
584 sth = sqrth*sqrt3*sin(d);
585 e[0]= (spur + cth) + cth;
586 e[1]= (spur - cth) + sth;
587 e[2]= (spur - cth) - sth;
590 for(l=0; l<3; l=l+2) {
592 ss[0] = (d-rr[2]) * (d-rr[5]) - rr[4]*rr[4];
593 ss[1] = (d-rr[5]) * rr[1] + rr[3]*rr[4];
594 ss[2] = (d-rr[0]) * (d-rr[5]) - rr[3]*rr[3];
595 ss[3] = (d-rr[2]) * rr[3] + rr[1]*rr[4];
596 ss[4] = (d-rr[0]) * rr[4] + rr[1]*rr[3];
597 ss[5] = (d-rr[0]) * (d-rr[2]) - rr[1]*rr[1];
599 if(fabs(ss[0])<=epsilon) ss[0]=0.0;
600 if(fabs(ss[1])<=epsilon) ss[1]=0.0;
601 if(fabs(ss[2])<=epsilon) ss[2]=0.0;
602 if(fabs(ss[3])<=epsilon) ss[3]=0.0;
603 if(fabs(ss[4])<=epsilon) ss[4]=0.0;
604 if(fabs(ss[5])<=epsilon) ss[5]=0.0;
606 if( fabs(ss[0]) >= fabs(ss[2]) ) {
608 if( fabs(ss[0]) < fabs(ss[5])) {
611 }
else if ( fabs(ss[2]) >= fabs(ss[5]) ) {
625 if( d > epsilon ) d = 1.0 / sqrt(d);
628 a[i][l] = a[i][l] * d;
632 d = a[0][0]*a[0][2] + a[1][0]*a[1][2] + a[2][0]*a[2][2];
633 if ((e[0] - e[1]) > (e[1] - e[2])) {
640 a[i][m1] = a[i][m1] - d*a[i][m];
641 p = p + a[i][m1]*a[i][m1];
646 if (p < fabs(a[i][m]))
653 p = sqrt( a[k][m]*a[k][m] + a[l][m]*a[l][m] );
656 a[k][m1] = -a[l][m]/p;
657 a[l][m1] = a[k][m]/p;
665 a[i][m1] = a[i][m1]*p;
669 a[0][1] = a[1][2]*a[2][0] - a[1][0]*a[2][2];
670 a[1][1] = a[2][2]*a[0][0] - a[2][0]*a[0][2];
671 a[2][1] = a[0][2]*a[1][0] - a[0][0]*a[1][2];
677 if(mode!=0 && a_failed!=1) {
682 b[i][l] = r[i][0]*a[0][l] + r[i][1]*a[1][l] + r[i][2]*a[2][l];
683 d = d + b[i][l]*b[i][l];
693 d = b[0][0]*b[0][1] + b[1][0]*b[1][1] + b[2][0]*b[2][1];
697 b[i][1] = b[i][1] - d*b[i][0];
698 p += b[i][1]*b[i][1];
711 p = sqrt( b[k][0]*b[k][0] + b[l][0]*b[l][0] );
714 b[k][1] = -b[l][0]/p;
726 b[0][2] = b[1][0]*b[2][1] - b[1][1]*b[2][0];
727 b[1][2] = b[2][0]*b[0][1] - b[2][1]*b[0][0];
728 b[2][2] = b[0][0]*b[1][1] - b[0][1]*b[1][0];
732 u[i][j] = b[i][0]*a[j][0] + b[i][1]*a[j][1]\
740 t[i] = ((yc[i] - u[i][0]*xc[0]) - u[i][1]*xc[1])\
747 t[i] = ((yc[i] - u[i][0]*xc[0]) - u[i][1]*xc[1]) - u[i][2]*xc[2];
753 if( e[i] < 0 ) e[i] = 0;
760 d = (d + e[1]) + e[0];
762 if( rms1 < 0.0 ) rms1 = 0.0;
771 xlen=residue_list1.size();
772 ylen=residue_list2.size();
773 minlen=min(xlen, ylen);
787 read_pose(pose1, residue_list1, xa, seqx, xresno);
788 read_pose(pose2, residue_list2, ya, seqy, yresno);
797 ResizeArray(score, xlen+1, ylen+1);
798 ResizeArray(path, xlen+1, ylen+1);
799 ResizeArray(val, xlen+1, ylen+1);
809 vector <int> & i_ali,
811 int score_sum_method ) {
812 double score_sum=0, di;
815 double score_d8_cut = score_d8*score_d8;
822 for(i=0; i<n_ali; i++) {
823 di = dist(xa[i], ya[i]);
828 if(score_sum_method==8) {
829 if(di<=score_d8_cut) {
830 score_sum += 1/(1+di/d02);
833 score_sum += 1/(1+di/d02);
838 if(n_cut<3 && n_ali>3) {
840 double dinc=(d+inc*0.5);
847 *score1=score_sum/Lnorm;
864 int const simplify_step,
865 int const score_sum_method,
868 double score_max, score, rmsd;
870 vector <int> k_ali(kmax);
878 const int n_init_max=6;
879 vector <int> L_ini(n_init_max);
881 if(Lali<4) L_ini_min=Lali;
882 int n_init=0, i_init;
883 for(i=0; i<n_init_max-1; i++) {
885 L_ini[i]=(
int) (Lali/pow(2.0, (
double) i));
886 if(L_ini[i]<=L_ini_min) {
891 if(i==n_init_max-1) {
898 vector <int> i_ali(kmax);
902 for(i_init=0; i_init<n_init; i_init++) {
903 L_frag=L_ini[i_init];
910 for(k=0; k<L_frag; k++) {
919 Kabsch(r1, r2, L_frag, 1, &rmsd, t, u);
921 *Rcomm=sqrt(rmsd/Lali);
923 do_rotation(xtm, xt, Lali, t, u);
927 n_cut=score_fun8(xt, ytm, Lali, d, i_ali, &score, score_sum_method);
928 if(score>score_max) {
938 for(
int it=0; it<n_it; it++) {
940 for(k=0; k<n_cut; k++) {
949 Kabsch(r1, r2, n_cut, 1, &rmsd, t, u);
950 do_rotation(xtm, xt, Lali, t, u);
951 n_cut=score_fun8(xt, ytm, Lali, d, i_ali, &score, score_sum_method);
952 if(score>score_max) {
962 for(k=0; k<n_cut; k++) {
963 if(i_ali[k]!=k_ali[k]) {
975 if(i>iL_max) i=iL_max;
976 }
else if(i>=iL_max) {
996 vector < int >
const invmap0,
1000 int score_sum_method) {
1007 for(i=0; i<y_len; i++) {
1017 tmscore=TMscore8_search(xtm, ytm, k, t, u, simplify_step, score_sum_method, &rmsd);
1026 int const ,
int const y_len, vector < int >
const invmap) {
1027 double rms, tmscore, tmscore1, tmscore2;
1030 for(j=0; j<y_len; j++) {
1040 PrintErrorAndQuit(
"Wrong map!\n");
1043 Kabsch(r1, r2, k, 1, &rms,
t, u);
1048 vector <double> dis(len);
1049 double d00=d0_search;
1050 double d002=d00*d00;
1056 for(k=0; k<n_ali; k++) {
1057 transform(
t, u, xtm[k], xrot);
1058 di=dist(xrot, ytm[k]);
1060 tmscore += 1/(1+di/d02);
1067 for(k=0; k<n_ali; k++) {
1077 if(j<3 && n_ali>3) {
1085 Kabsch(r1, r2, j, 1, &rms,
t, u);
1087 for(k=0; k<n_ali; k++) {
1088 transform(
t, u, xtm[k], xrot);
1089 di=dist(xrot, ytm[k]);
1091 tmscore1 += 1/(1+di/d02);
1099 for(k=0; k<n_ali; k++) {
1109 if(j<3 && n_ali>3) {
1117 Kabsch(r1, r2, j, 1, &rms,
t, u);
1119 for(k=0; k<n_ali; k++) {
1120 transform(
t, u, xtm[k], xrot);
1121 di=dist(xrot, ytm[k]);
1122 tmscore2 += 1/(1+di/d02);
1129 if(tmscore1>=tmscore) tmscore=tmscore1;
1130 if(tmscore2>=tmscore) tmscore=tmscore2;
1146 vector < int > & y2x ) {
1147 int min_len=
getmin(x_len, y_len);
1152 int min_ali= min_len/2;
1156 n1 = -y_len+min_ali;
1159 int i, j, k, k_best;
1160 double tmscore, tmscore_max=-1;
1163 for(k=n1; k<=n2; k++) {
1165 for(j=0; j<y_len; j++) {
1167 if(i>=0 && i<x_len) {
1176 tmscore=get_score_fast(x, y, x_len, y_len, y2x);
1177 if(tmscore>=tmscore_max) {
1178 tmscore_max=tmscore;
1185 for(j=0; j<y_len; j++) {
1187 if(i>=0 && i<x_len) {
1196 void smooth(vector < int > & sec,
int const len) {
1199 for(i=2; i<len-2; i++) {
1200 if(sec[i]==2 || sec[i]==4) {
1216 for(i=0; i<len-5; i++) {
1251 for(i=0; i<len-2; i++) {
1259 else if(sec[i] == 4) {
1269 int sec_str(
double dis13,
double dis14,
double dis15,
double dis24,
double dis25,
double dis35) {
1273 if(fabs(dis15-6.37)<delta) {
1274 if(fabs(dis14-5.18)<delta) {
1275 if(fabs(dis25-5.18)<delta) {
1276 if(fabs(dis13-5.45)<delta) {
1277 if(fabs(dis24-5.45)<delta) {
1278 if(fabs(dis35-5.45)<delta) {
1289 if(fabs(dis15-13)<delta) {
1290 if(fabs(dis14-10.4)<delta) {
1291 if(fabs(dis25-10.4)<delta) {
1292 if(fabs(dis13-6.1)<delta) {
1293 if(fabs(dis24-6.1)<delta) {
1294 if(fabs(dis35-6.1)<delta) {
1313 int j1, j2, j3, j4, j5;
1314 double d13, d14, d15, d24, d25, d35;
1315 for(
int i=0; i<len; i++) {
1323 if(j1>=0 && j5<len) {
1324 d13=sqrt(dist(x[j1], x[j3]));
1325 d14=sqrt(dist(x[j1], x[j4]));
1326 d15=sqrt(dist(x[j1], x[j5]));
1327 d24=sqrt(dist(x[j2], x[j4]));
1328 d25=sqrt(dist(x[j2], x[j5]));
1329 d35=sqrt(dist(x[j3], x[j5]));
1330 sec[i]=sec_str(d13, d14, d15, d24, d25, d35);
1345 int const x_len,
int const y_len,
1346 std::vector < int > & y2x ) {
1348 make_sec(x, x_len, secx);
1349 make_sec(y, y_len, secy);
1351 double gap_open=-1.0;
1352 NWDP_TM(secx, secy, x_len, y_len, gap_open, y2x);
1368 std::vector < int > & y2x ) {
1374 if(d01 < D0_MIN) d01=D0_MIN;
1380 vector < int > invmap(y_len+1);
1382 int aL=
getmin(x_len, y_len);
1395 if(n_frag>smallest) n_frag=smallest;
1396 if(ns>smallest) ns=smallest;
1398 int m1=x_len-n_frag-ns;
1399 int m2=y_len-n_frag-ns;
1403 for(
int ii=0; ii<y_len; ii++) {
1408 for(
int i=ns-1; i<m1; i=i+n_frag) {
1409 for(
int j=ns-1; j<m2; j=j+n_frag) {
1410 for(
int k=0; k<n_frag; k++) {
1415 Kabsch(r1, r2, n_frag, 1, &rmsd, t, u);
1418 double gap_open=0.0;
1419 NWDP_TM(x, y, x_len, y_len, t, u, d02, gap_open, invmap);
1420 GL=get_score_fast(x, y, x_len, y_len, invmap);
1423 for(
int ii=0; ii<y_len; ii++) {
1440 std::vector < int >
const y2x ) {
1445 if(d01 < D0_MIN) d01=D0_MIN;
1450 for(
int j=0; j<y_len; j++) {
1458 Kabsch(r1, r2, k, 1, &rmsd, t, u);
1460 for(
int ii=0; ii<x_len; ii++) {
1461 transform(t, u, x[ii], xx);
1462 for(
int jj=0; jj<y_len; jj++) {
1463 dij=dist(xx, y[jj]);
1464 score[ii+1][jj+1] = 1.0/(1+dij/d02);
1474 vector < int >
const y2x ) {
1479 if(d01 < D0_MIN) d01=D0_MIN;
1484 for(
int j=0; j<y_len; j++) {
1493 Kabsch(r1, r2, k, 1, &rmsd, t, u);
1495 for(
int ii=0; ii<x_len; ii++) {
1496 transform(t, u, x[ii], xx);
1497 for(
int jj=0; jj<y_len; jj++) {
1498 dij=dist(xx, y[jj]);
1499 if(secx[ii]==secy[jj]) {
1500 score[ii+1][jj+1] = 1.0/(1+dij/d02) + 0.5;
1502 score[ii+1][jj+1] = 1.0/(1+dij/d02);
1519 std::vector < int > & y2x0,
1520 std::vector < int > & y2x ) {
1522 score_matrix_rmsd_sec(x, y, x_len, y_len, y2x0);
1523 double gap_open=-1.0;
1524 NWDP_TM(x_len, y_len, gap_open, y2x);
1530 std::vector < int >
const resno,
1531 int const len,
int *start_max,
int *end_max) {
1532 int r_min, fra_min=4;
1535 int Lfr_max=0, flag;
1537 r_min= (
int) (len*1.0/3.0);
1538 if(r_min > fra_min) r_min=fra_min;
1541 double dcu0_cut=dcu0*dcu0;;
1542 double dcu_cut=dcu0_cut;
1544 while(Lfr_max < r_min) {
1548 for(
int i=1; i<len; i++) {
1549 d = dist(x[i-1], x[i]);
1551 if(dcu_cut>dcu0_cut) {
1556 else if(resno[i] == (resno[i-1]+1)) {
1585 if(Lfr_max < r_min) {
1587 double dinc=pow(1.1, (
double) inc) * dcu0;
1604 vector < int >
const xresno,
1605 vector < int >
const yresno,
1606 vector < int > & y2x ) {
1608 int fra_min1=fra_min-1;
1609 int xstart=0, ystart=0, xend=0, yend=0;
1611 find_max_frag(x, xresno, x_len, &xstart, &xend);
1612 find_max_frag(y, yresno, y_len, &ystart, ¥d);
1614 int Lx = xend-xstart+1;
1615 int Ly = yend-ystart+1;
1616 vector < int > ifr, y2x_;
1619 y2x_.resize(y_len+1);
1624 if(Lx<Ly || (Lx==Ly && x_len<=y_len)) {
1625 for(
int i=0; i<L_fr; i++) {
1628 }
else if(Lx>Ly || (Lx==Ly && x_len>y_len)) {
1629 for(
int i=0; i<L_fr; i++) {
1634 int L0=
getmin(x_len, y_len);
1636 int n1= (
int)(L0*0.1);
1637 int n2= (
int)(L0*0.89);
1640 for(
int i=n1; i<= n2; i++) {
1648 double tmscore, tmscore_max=-1;
1650 if(Lx<Ly || (Lx==Ly && x_len<=y_len)) {
1652 int min_len=
getmin(L1, y_len);
1653 int min_ali= (
int) (min_len/2.5);
1654 if(min_ali<=fra_min1) min_ali=fra_min1;
1656 n1 = -y_len+min_ali;
1660 for(k=n1; k<=n2; k++) {
1662 for(j=0; j<y_len; j++) {
1672 tmscore=get_score_fast(x, y, x_len, y_len, y2x_);
1673 if(tmscore>=tmscore_max) {
1674 tmscore_max=tmscore;
1675 for(j=0; j<y_len; j++) {
1682 int min_len=
getmin(x_len, L2);
1683 int min_ali= (
int) (min_len/2.5);
1684 if(min_ali<=fra_min1) min_ali=fra_min1;
1690 for(k=n1; k<=n2; k++) {
1692 for(j=0; j<y_len; j++) {
1696 for(j=0; j<L2; j++) {
1698 if(i>=0 && i<x_len) {
1704 tmscore=get_score_fast(x, y, x_len, y_len, y2x_);
1705 if(tmscore>=tmscore_max) {
1706 tmscore_max=tmscore;
1707 for(j=0; j<y_len; j++) {
1724 int const x_len,
int const y_len,
1727 vector < int > & invmap0,
1728 int const g1,
int const g2,
int const iteration_max ) {
1729 double gap_open[2]={-0.6, 0};
1731 vector < int > invmap(y_len+1);
1732 int iteration, i, j, k;
1733 double tmscore, tmscore_max, tmscore_old=0;
1734 int score_sum_method=8, simplify_step=40;
1738 for(
int g=g1; g<g2; g++) {
1739 for(iteration=0; iteration<iteration_max; iteration++) {
1740 NWDP_TM(x, y, x_len, y_len, t, u, d02, gap_open[g], invmap);
1743 for(j=0; j<y_len; j++) {
1752 tmscore=TMscore8_search(xtm, ytm, k, t, u, simplify_step, score_sum_method, &rmsd);
1754 if(tmscore>tmscore_max) {
1755 tmscore_max=tmscore;
1756 for(i=0; i<y_len; i++) {
1757 invmap0[i]=invmap[i];
1762 if(fabs(tmscore_old-tmscore)<0.000001) {
1766 tmscore_old=tmscore;
1779 std::list <core::Size> residue_list1;
1780 std::list <core::Size> residue_list2;
1783 residue_list1.push_back(ires);
1787 residue_list2.push_back(ires);
1790 return alignment2AtomMap(pose1, pose2, residue_list1, residue_list2, n_mapped_residues, atom_map);
1797 std::list <core::Size>
const & residue_list,
1798 std::list <core::Size>
const & ref_residue_list,
1804 do_rotation(xa, xt, xlen,
t, u);
1807 n_mapped_residues = 0;
1808 for(k=0; k<n_ali8_; k++) {
1809 d=sqrt(dist(xt[m1_[k]], ya[m2_[k]]));
1811 std::list<core::Size>::const_iterator it1 = residue_list.begin(); advance(it1, m1_[k]);
1815 std::list<core::Size>::const_iterator it2 = ref_residue_list.begin(); advance(it2, m2_[k]);
1819 atom_map[ id1 ] = id2;
1820 ++n_mapped_residues;
1833 int ali_len=xlen+ylen;
1834 seqM.resize(ali_len);
1835 seqxA.resize(ali_len);
1836 seqyA.resize(ali_len);
1838 do_rotation(xa, xt, xlen,
t, u);
1841 int kk=0, i_old=0, j_old=0;
1843 for(k=0; k<n_ali8_; k++) {
1844 for(i=i_old; i<m1_[k]; i++) {
1852 for(j=j_old; j<m2_[k]; j++) {
1860 seqxA[kk]=seqx[m1_[k]];
1861 seqyA[kk]=seqy[m2_[k]];
1862 if(seqxA[kk]==seqyA[kk]) {
1865 d = sqrt(dist(xt[m1_[k]], ya[m2_[k]]));
1877 for(i=i_old; i<xlen; i++) {
1884 for(j=j_old; j<ylen; j++) {
1895 seq_id=seq_id/( n_ali8_+0.00000001);
1903 Lnorm=
getmin(xlen, ylen);
1907 d0=(1.24*pow((Lnorm*1.0-15), 1.0/3)-1.8);
1913 if(d0_search>8) d0_search=8;
1914 if(d0_search<4.5) d0_search=4.5;
1916 score_d8=1.5*pow(Lnorm*1.0, 0.3)+3.5;
1926 d0=(1.24*pow((Lnorm*1.0-15), 1.0/3)-1.8);
1928 if(d0<D0_MIN) d0=D0_MIN;
1931 if(d0_search>8) d0_search=8;
1932 if(d0_search<4.5) d0_search=4.5;
1941 if(d0_search>8) d0_search=8;
1942 if(d0_search<4.5) d0_search=4.5;
1948 Size simplify_step=1;
1949 Size score_sum_method=0;
1952 parameter_set4final(length);
1955 return TMscore8_search(xtm, ytm, n_ali8_,
t, u, simplify_step, score_sum_method, &rmsd);
1960 std::list <core::Size> residue_list1;
1961 std::list <core::Size> residue_list2;
1964 residue_list1.push_back(ires);
1968 residue_list2.push_back(ires);
1971 return apply(pose1, pose2, residue_list1, residue_list2);
1977 if (residue_list1.size() < 5 || residue_list2.size() < 5) {
1982 load_pose_allocate_memory(pose1, pose2, residue_list1, residue_list2);
1985 parameter_set4search(xlen, ylen);
1986 int simplify_step = 40;
1987 int score_sum_method = 8;
1990 vector < int > invmap0(ylen+1);
1991 vector < int > invmap(ylen+1);
1992 double TM, TMmax=-1;
1993 for(i=0; i<ylen; i++) {
1998 if(Lnorm <= 40) ddcc=0.1;
2001 get_initial(xa, ya, xlen, ylen, invmap0);
2003 TM=detailed_search(xa, ya, xlen, ylen, invmap0,
t, u, simplify_step, score_sum_method);
2008 TM=DP_iter(xa, ya, xlen, ylen,
t, u, invmap, 0, 2, 30);
2011 for(
int i=0; i<ylen; i++) {
2012 invmap0[i]=invmap[i];
2017 get_initial_ss(xa, ya, xlen, ylen, invmap);
2018 TM=detailed_search(xa, ya, xlen, ylen, invmap,
t, u, simplify_step, score_sum_method);
2021 for(
int i=0; i<ylen; i++) {
2022 invmap0[i]=invmap[i];
2025 if(TM > TMmax*0.2) {
2026 TM=DP_iter(xa, ya, xlen, ylen,
t, u, invmap, 0, 2, 30);
2029 for(
int i=0; i<ylen; i++) {
2030 invmap0[i]=invmap[i];
2037 if(get_initial_local(xa, ya, xlen, ylen, invmap)){
2038 TM=detailed_search(xa, ya, xlen, ylen, invmap,
t, u, simplify_step, score_sum_method);
2041 for(
int i=0; i<ylen; i++){
2042 invmap0[i]=invmap[i];
2045 if(TM > TMmax*ddcc){
2046 TM=DP_iter(xa, ya, xlen, ylen,
t, u, invmap, 0, 2, 2);
2049 for(
int i=0; i<ylen; i++){
2050 invmap0[i]=invmap[i];
2055 cout << endl << endl <<
"Warning: initial alignment from local superposition fail!" << endl << endl <<endl;
2061 get_initial_ssplus(xa, ya, xlen, ylen, invmap0, invmap);
2062 TM=detailed_search(xa, ya, xlen, ylen, invmap,
t, u, simplify_step, score_sum_method);
2065 for(i=0; i<ylen; i++) {
2066 invmap0[i]=invmap[i];
2071 TM=DP_iter(xa, ya, xlen, ylen,
t, u, invmap, 0, 2, 30);
2074 for(i=0; i<ylen; i++) {
2075 invmap0[i]=invmap[i];
2082 get_initial_fgt(xa, ya, xlen, ylen, xresno, yresno, invmap);
2083 TM=detailed_search(xa, ya, xlen, ylen, invmap,
t, u, simplify_step, score_sum_method);
2086 for(i=0; i<ylen; i++) {
2087 invmap0[i]=invmap[i];
2090 if(TM > TMmax*ddcc) {
2091 TM=DP_iter(xa, ya, xlen, ylen,
t, u, invmap, 1, 2, 2);
2094 for(i=0; i<ylen; i++) {
2095 invmap0[i]=invmap[i];
2103 for(i=0; i<ylen; i++) {
2110 cout <<
"There is no alignment between the two proteins!" << endl;
2111 cout <<
"Program stop with no result!" << endl;
2120 TM=detailed_search(xa, ya, xlen, ylen, invmap0,
t, u, simplify_step, score_sum_method);
2129 do_rotation(xa, xt, xlen,
t, u);
2131 for(
int j=0; j<ylen; j++) {
2135 d=sqrt(dist(xt[i], ya[j]));
2148 double rmsd, TM1, TM2;
2156 double Lnorm_0=ylen;
2159 parameter_set4final(Lnorm_0);
2162 TM1=TMscore8_search(xtm, ytm, n_ali8_, t0, u0, simplify_step, score_sum_method, &rmsd);
2166 parameter_set4final(xlen+0.0);
2168 TM2=TMscore8_search(xtm, ytm, n_ali8_,
t, u, simplify_step, score_sum_method, &rmsd);