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

📄 pocket.c

📁 药物开发中的基于结构的从头设计代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		 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 + -