📄 pocket.c
字号:
d0=r0+prot->atom[i].r;
d=Distance(grid[num].coor,prot->atom[i].coor);
if(d>d0) continue; // maximum h-bond length
for(j=0;j<3;j++)
{
v1[j]=prot->atom[i].coor[j]-prot->atom[i].root[j];
v2[j]=prot->atom[i].coor[j]-grid[num].coor[j];
}
angle=Angle_Of_Two_Vectors(v1,v2);
if(angle<HB_ANGLE_CUTOFF) continue; // h-bond angle cutoff
candidate[num_candidate].valid=1;
candidate[num_candidate].d=d;
candidate[num_candidate].overlap=d-d0;
candidate[num_candidate].loss=0;
if(!strcmp(prot->atom[i].type,"O.w"))
candidate[num_candidate].type=2;
else candidate[num_candidate].type=1;
num_candidate++;
}
else if(!strcmp(prot->atom[i].hb,"M"))
{
d=Distance(grid[num].coor,prot->atom[i].coor);
for(j=0;j<3;j++)
{
v1[j]=prot->atom[i].coor[j]-prot->atom[i].root[j];
v2[j]=prot->atom[i].coor[j]-grid[num].coor[j];
}
angle=Angle_Of_Two_Vectors(v1,v2);
if(angle<HB_ANGLE_CUTOFF) continue; // m-bond angle cutoff
if(d<2.00) grid[num].acceptor_score+=(MB);
else if(d<3.00) grid[num].acceptor_score+=((3.0-d)*(MB));
else continue;
}
else continue;
}
// The probe may form many HB pair with nearby pocket atoms
// only the shortest HBs are taken into account
for(i=0;i<num_candidate;i++)
{
if(candidate[i].valid==0) continue;
for(j=0;j<num_candidate;j++)
{
if(i==j) continue;
else if(candidate[i].d<candidate[j].d) continue;
else candidate[i].loss++;
}
if(candidate[i].loss>=4)
{
candidate[i].valid=0;
continue;
}
else if(candidate[i].type==1)
{
if(candidate[i].overlap<-0.60)
grid[num].acceptor_score+=(SHB);
else if(candidate[i].overlap<-0.30)
grid[num].acceptor_score+=(MHB);
else if(candidate[i].overlap<0.00)
grid[num].acceptor_score+=(WHB);
else continue;
}
else if(candidate[i].type==2)
{
if(candidate[i].overlap<-0.60)
grid[num].acceptor_score+=(SWH);
else if(candidate[i].overlap<-0.30)
grid[num].acceptor_score+=(MWH);
else if(candidate[i].overlap<0.00)
grid[num].acceptor_score+=(WWH);
else continue;
}
else continue;
}
}
// fourth, calculate the hydrophobic score for each grid
float whole_logp;
r0=HYDROPHOBIC_R; // probe atom is C.3
for(num=0;num<num_grid;num++)
{
if(grid[num].type=='E'||grid[num].type=='S') continue;
whole_logp=0.000;
for(i=0;i<prot->num_atom;i++)
{
if(prot->atom[i].valid!=2) continue;
else
{
d0=r0+prot->atom[i].r;
d=Distance(grid[num].coor,prot->atom[i].coor);
if((d-d0)<-0.60) grid[num].hydrophobic_score+=(VB);
if(d>5.00) continue;
else whole_logp+=(prot->atom[i].logp);
}
}
if(whole_logp>0.10) grid[num].hydrophobic_score+=HM;
}
// Test_Phase("test1.pdb");
return;
}
void Pocket::Filter_Grid()
{
int i,tmp;
float score,tmp_min,tmp_max,tmp_ave;
// report the average value, maximum, and minimum of
// donor_score, acceptor_score, and hydrophobic_score
tmp=0; tmp_min=10.000; tmp_max=-10.000; tmp_ave=0.000;
for(i=0;i<num_grid;i++)
{
if(grid[i].type=='E'||grid[i].type=='S') continue;
score=grid[i].donor_score;
if(score<0.001)
{
grid[i].donor_score=0.000;
continue;
}
else
{
if(score<tmp_min) tmp_min=score;
if(score>tmp_max) tmp_max=score;
tmp_ave+=score;
tmp++;
}
}
tmp_ave/=tmp;
/*
printf("Donor score:\n");
printf("\tpoint number %d\n",tmp);
printf("\tmaximum score %6.2f\n",tmp_max);
printf("\tminimum score %6.2f\n",tmp_min);
printf("\taverage score %6.2f\n",tmp_ave);
*/
for(i=0;i<num_grid;i++)
{
if(grid[i].type=='E'||grid[i].type=='S') continue;
else if(grid[i].donor_score>tmp_ave) continue;
else grid[i].donor_score=0.000;
}
tmp=0; tmp_min=10.000; tmp_max=-10.000; tmp_ave=0.000;
for(i=0;i<num_grid;i++)
{
if(grid[i].type=='E'||grid[i].type=='S') continue;
score=grid[i].acceptor_score;
if(score<0.001)
{
grid[i].acceptor_score=0.000;
continue;
}
else
{
if(score<tmp_min) tmp_min=score;
if(score>tmp_max) tmp_max=score;
tmp_ave+=score;
tmp++;
}
}
tmp_ave/=tmp;
/*
printf("Acceptor score:\n");
printf("\tpoint number %d\n",tmp);
printf("\tmaximum score %6.2f\n",tmp_max);
printf("\tminimum score %6.2f\n",tmp_min);
printf("\taverage score %6.2f\n",tmp_ave);
*/
for(i=0;i<num_grid;i++)
{
if(grid[i].type=='E'||grid[i].type=='S') continue;
else if(grid[i].acceptor_score>tmp_ave) continue;
else grid[i].acceptor_score=0.000;
}
tmp=0; tmp_min=10.000; tmp_max=-10.000; tmp_ave=0.000;
for(i=0;i<num_grid;i++)
{
if(grid[i].type=='E'||grid[i].type=='S') continue;
score=grid[i].hydrophobic_score;
if(score<0.001)
{
grid[i].hydrophobic_score=0.000;
continue;
}
else
{
if(score<tmp_min) tmp_min=score;
if(score>tmp_max) tmp_max=score;
tmp_ave+=score;
tmp++;
}
}
tmp_ave/=tmp;
/*
printf("Hydrophobic score:\n");
printf("\tpoint number %d\n",tmp);
printf("\tmaximum score %6.2f\n",tmp_max);
printf("\tminimum score %6.2f\n",tmp_min);
printf("\taverage score %6.2f\n",tmp_ave);
*/
for(i=0;i<num_grid;i++)
{
if(grid[i].type=='E'||grid[i].type=='S') continue;
else if(grid[i].hydrophobic_score>(tmp_max+VB-0.001)) continue;
// else if(grid[i].hydrophobic_score>tmp_ave) continue;
else grid[i].hydrophobic_score=0.000;
}
// classify the grid according to its scores
for(i=0;i<num_grid;i++)
{
if(grid[i].type=='E'||grid[i].type=='S') continue;
else if((grid[i].donor_score>grid[i].acceptor_score)&&
(grid[i].donor_score>grid[i].hydrophobic_score)&&
(grid[i].donor_score>0.001)) grid[i].type='D';
else if((grid[i].acceptor_score>grid[i].donor_score)&&
(grid[i].acceptor_score>grid[i].hydrophobic_score)&&
(grid[i].acceptor_score>0.001)) grid[i].type='A';
else if((grid[i].hydrophobic_score>grid[i].donor_score)&&
(grid[i].hydrophobic_score>grid[i].acceptor_score)&&
(grid[i].hydrophobic_score>0.001)) grid[i].type='H';
else {grid[i].type='V'; continue;}
}
// Test_Phase("test2.pdb");
return;
}
void Pocket::Refine_Grid()
{
int i,tmp;
float score,tmp_min,tmp_max,tmp_ave;
// investigate the neighbors for each grid, first use a large radius
// to locate the major key sites
for(i=0;i<num_grid;i++)
{
if(grid[i].type=='E') continue;
else if(grid[i].type=='S') continue;
else if(grid[i].type=='V') continue;
else Count_Grid_Neighbor(grid[i],2.00);
}
tmp=0; tmp_ave=0.000; tmp_min=100.0; tmp_max=-100.0;
for(i=0;i<num_grid;i++)
{
if(grid[i].type!='D') continue;
else
{
score=grid[i].homo_neib;
if(score>tmp_max) tmp_max=score;
if(score<tmp_min) tmp_min=score;
tmp_ave+=score;
tmp++;
}
}
tmp_ave/=tmp;
/*
printf("Donor neighbor:\n");
printf("\tpoint number %d\n",tmp);
printf("\tmaximum neighbor %6.2f\n",tmp_max);
printf("\tminimum neighbor %6.2f\n",tmp_min);
printf("\taverage neighbor %6.2f\n",tmp_ave);
*/
for(i=0;i<num_grid;i++)
{
if(grid[i].type!='D') continue;
else if(grid[i].homo_neib>tmp_ave) continue;
else {grid[i].type='V'; grid[i].donor_score=0.000;}
}
tmp=0; tmp_ave=0.000; tmp_min=100.0; tmp_max=-100.0;
for(i=0;i<num_grid;i++)
{
if(grid[i].type!='A') continue;
else
{
score=grid[i].homo_neib;
if(score>tmp_max) tmp_max=score;
if(score<tmp_min) tmp_min=score;
tmp_ave+=score;
tmp++;
}
}
tmp_ave/=tmp;
/*
printf("Acceptor neighbor:\n");
printf("\tpoint number %d\n",tmp);
printf("\tmaximum neighbor %6.2f\n",tmp_max);
printf("\tminimum neighbor %6.2f\n",tmp_min);
printf("\taverage neighbor %6.2f\n",tmp_ave);
*/
for(i=0;i<num_grid;i++)
{
if(grid[i].type!='A') continue;
else if(grid[i].homo_neib>tmp_ave) continue;
else {grid[i].type='V'; grid[i].acceptor_score=0.000;}
}
tmp=0; tmp_ave=0.000; tmp_min=100.0; tmp_max=-100.0;
for(i=0;i<num_grid;i++)
{
if(grid[i].type!='H') continue;
else
{
score=grid[i].homo_neib;
if(score>tmp_max) tmp_max=score;
if(score<tmp_min) tmp_min=score;
tmp_ave+=score;
tmp++;
}
}
tmp_ave/=tmp;
/*
printf("Hydrophobic neighbor:\n");
printf("\tpoint number %d\n",tmp);
printf("\tmaximum neighbor %6.2f\n",tmp_max);
printf("\tminimum neighbor %6.2f\n",tmp_min);
printf("\taverage neighbor %6.2f\n",tmp_ave);
*/
for(i=0;i<num_grid;i++)
{
if(grid[i].type!='H') continue;
else if(grid[i].homo_neib>tmp_ave) continue;
else {grid[i].type='V'; grid[i].hydrophobic_score=0.000;}
}
for(i=0;i<num_grid;i++)
{
if(grid[i].type=='E') grid[i].valid=0;
else if(grid[i].type=='S') grid[i].valid=0;
else if(grid[i].type=='V') grid[i].valid=0;
else grid[i].valid=1;
}
for(i=0;i<num_grid;i++)
{
if(grid[i].type=='E') continue;
else if(grid[i].type=='S') continue;
else if(grid[i].type=='V') continue;
else Count_Grid_Neighbor(grid[i],2.00);
}
for(i=0;i<num_grid;i++)
{
if(grid[i].type=='D') grid[i].score=grid[i].donor_score;
else if(grid[i].type=='A') grid[i].score=grid[i].acceptor_score;
else if(grid[i].type=='H') grid[i].score=grid[i].hydrophobic_score;
else grid[i].score=0.000;
}
// Test_Phase("test3.pdb");
return;
}
void Pocket::Test_Phase(char *filename) const
{
int i;
char type;
FILE *fp;
if((fp=fopen(filename,"w"))==NULL) Openning_File_Error(filename);
for(i=0;i<num_grid;i++)
{
if(grid[i].type=='E') continue;
if((grid[i].donor_score>grid[i].acceptor_score)&&
(grid[i].donor_score>grid[i].hydrophobic_score)&&
(grid[i].donor_score>0.001)) type='D';
else if((grid[i].acceptor_score>grid[i].donor_score)&&
(grid[i].acceptor_score>grid[i].hydrophobic_score)&&
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -