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

📄 pocket.c

📁 药物开发中的基于结构的从头设计代码
💻 C
字号:
# include "link.h"

Pocket::Pocket()
{
	max_x=min_x=0;
	max_y=min_y=0;
	max_z=min_z=0;

	num_grid=0; grid=NULL;
	num_atom=0; atom=NULL;
}

Pocket::~Pocket()
{
	delete [] grid;
	delete [] atom;
}

void Pocket::Show_Content() const
{
	int i;

	printf("min_x=%d  max_x=%d\n",min_x,max_x);
	printf("min_y=%d  max_y=%d\n",min_y,max_y);
	printf("min_z=%d  max_z=%d\n",min_z,max_z);

	printf("num_grid=%d\n",num_grid);

	for(i=0;i<num_grid;i++) printf("Grid %d\t%c\n", i+1, grid[i]);
	
	printf("num_atom=%d\n",num_atom);

        for(i=0;i<num_atom;i++)
                {
                 printf("Atom: ");
                 printf("%3d ",   atom[i].id);
                 printf("%5s ",   atom[i].type);
                 printf("%7.2f ", atom[i].coor[0]);
                 printf("%7.2f ", atom[i].coor[1]);
                 printf("%7.2f ", atom[i].coor[2]);
                 printf("%4.2f ", atom[i].R);
                 printf("%5.2f ", atom[i].logp);
                 printf("%2s ",   atom[i].hb);
                 printf("%7.2f ", atom[i].root[0]);
                 printf("%7.2f ", atom[i].root[1]);
                 printf("%7.2f ", atom[i].root[2]);
                 printf("\n");
                }

	return;
}

void Pocket::Read_Grids(char *filename)
{
	FILE *fp;
	int i,tmp;
	char buf[160],head[80];

	if((fp=fopen(filename,"r"))==NULL) Openning_File_Error(filename);

	do
	{
	 if(fgets(buf,160,fp)==NULL) Reading_File_Error(filename);
	 else sscanf(buf,"%s",head); 
	} while(strcmp(head,"<X_boundary>"));

	sscanf(buf,"%*s%d%d",&min_x,&max_x);	// X_boundary

	fgets(buf,160,fp);			// Y_boundary
	sscanf(buf,"%*s%d%d",&min_y,&max_y);

	fgets(buf,160,fp);			// Z_boundary
	sscanf(buf,"%*s%d%d",&min_z,&max_z);

	fgets(buf,160,fp);
	sscanf(buf,"%*s%d",&num_grid);

	grid=new char[num_grid];
	if(grid==NULL) Memory_Allocation_Error();

	for(i=0;i<num_grid;i++)
		{
		 fgets(buf,160,fp);
		 sscanf(buf,"%d%*f%*f%*f%s",&tmp,head);
		 grid[i]=head[0];
		 if(tmp!=(i+1))
			{
			 puts("Warning: something wrong in reading the grids");
			 puts("This may lead to unpredictable results.");
			}
		}

	fclose(fp);

	return;
}

void Pocket::Read_Atoms(char *filename)
{
	FILE *fp;
	int i;
        char buf[160],head[80];

        if((fp=fopen(filename,"r"))==NULL) Openning_File_Error(filename);

        do
        {
         if(fgets(buf,160,fp)==NULL) Reading_File_Error(filename);
         else sscanf(buf,"%s",head);
        } while(strcmp(head,"<Atom_number>"));

	sscanf(buf,"%*s%d",&num_atom);

	// read the pocket atoms

	atom=new Atom[num_atom];
	if(atom==NULL) Memory_Allocation_Error();

	for(i=0;i<num_atom;i++)
		{
		 fgets(buf,160,fp);
		 sscanf(buf,"%d%*d%s%f%f%f%f%f%s%f%f%f", 
			&atom[i].id, 
			 atom[i].type, 
			&atom[i].coor[0], 
			&atom[i].coor[1], 
			&atom[i].coor[2], 
			&atom[i].R, 
			&atom[i].logp, 
			 atom[i].hb,
			&atom[i].root[0], 
			&atom[i].root[1], 
			&atom[i].root[2]);
		 if(atom[i].id!=(i+1))
			{
			 puts("Warning: something wrong in reading the pocket");
                         puts("This may lead to unpredictable results.");
                        }
		 else atom[i].valid=1;
		}

	fclose(fp);

	return;
}

char Pocket::Get_Grid_Property(float coor[3]) const
{
	if(coor[0]<min_x) return 'E';
	if(coor[0]>max_x) return 'E';
	if(coor[1]<min_y) return 'E';
	if(coor[1]>max_y) return 'E';
	if(coor[2]<min_z) return 'E';
	if(coor[2]>max_z) return 'E';

	int i,j,k,num;
	int dx,dy,dz;

	dx=(max_x-min_x)*2+1;	// grid space is 0.5A
        dy=(max_y-min_y)*2+1;
        dz=(max_z-min_z)*2+1;

	i=(int)((coor[0]-min_x)*2.0+0.500);
	j=(int)((coor[1]-min_y)*2.0+0.500);
	k=(int)((coor[2]-min_z)*2.0+0.500);

	num=i*dy*dz+j*dz+k;

	return grid[num];
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -