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

📄 fraglib.c

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

FragLibrary::FragLibrary()
{
	num_frag=0;
	fragment=NULL;
}

FragLibrary::~FragLibrary()
{
	delete [] fragment;
}

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

	printf("Number of valid fragment in this library is %d\n",num_frag);

	for(i=0;i<num_frag;i++) 
		{
		 printf("\nFragment %d: id=%d  possibility=%5.3f\n", 
			 i+1, fragment[i].id, fragment[i].possibility);
		 fragment[i].Show_Parameter();
		}

	return;
}

void FragLibrary::Read_Library(char *dirname)
{
	FILE *fp;
	int tmp,id;
	float poss;
	char buf[160],filename[160],frag_name[160];

	// now read the file INDEX under the directory

	strcpy(filename,dirname); strcat(filename,"INDEX");
	if((fp=fopen(filename,"r"))==NULL) Openning_File_Error(filename);

	// first, determine num_frag

	tmp=0;

	for(;;)
		{
		 if(fgets(buf,160,fp)==NULL) break;
		 else if(buf[0]=='#') continue;
		 else if(Blank_Line_Check(buf)==TRUE) continue;
		 else
			{
		 	 sscanf(buf,"%*d%*s%f",&poss);
		 	 if(poss<0.01) continue;
		 	 else tmp++;
			}
		}

	rewind(fp);

	num_frag=tmp;

	fragment=new Ligand[num_frag];
	if(fragment==NULL) Memory_Allocation_Error();

	// second, read fragments
	
	tmp=0;

	for(;;)
		{
		 if(fgets(buf,160,fp)==NULL) break;
		 else if(buf[0]=='#') continue;
		 else if(Blank_Line_Check(buf)==TRUE) continue;
		 else
		{
		 sscanf(buf,"%d%s%f", &id,frag_name,&poss);
		 if(poss<0.01) continue;
		 else
			{
			 fragment[tmp].id=id;
			 fragment[tmp].possibility=poss;
		 	 strcpy(filename,dirname); 
			 strcat(filename,frag_name);
		 	 fragment[tmp].Read_From_Mol2(filename);
		 	 tmp++;
			}
		}
		}

	fclose(fp);

	if(tmp!=num_frag)	// check it again
		{
		 strcpy(filename,dirname);
		 strcat(filename,"INDEX");
		 Reading_File_Error(filename);
		}

	return;
}

void FragLibrary::Assign_Parameters()
{
	int i;

	for(i=0;i<num_frag;i++)
		{
		 fragment[i].Detect_Connections();
		 fragment[i].Assign_Atom_Parameters();
		}

	return;
}

int FragLibrary::Get_A_Fragment(int frag_id, Ligand &lig) const
{
	int i,mark,id;
	double poss;

	// first, determine which fragment should be extracted

	mark=FALSE; 

	poss=drand48();	// for checking the growing possibility

	for(i=0;i<num_frag;i++)
		{
		 if(frag_id!=fragment[i].id) continue;
		 else
			{
			 if(poss<fragment[i].possibility) 
				{id=i; mark=TRUE; break;}
			 else {mark=FALSE; break;}
			}
		}

	if(mark==FALSE) return FALSE;	
	else {lig=fragment[id]; return TRUE;}
}

int FragLibrary::Make_Fragment_List(int num_wanted,int frag_id[]) const
{
	int i,j,tmp,num_left;
	int *frag_list;

	for(i=0;i<num_frag;i++) frag_id[i]=0;

	frag_list=new int[num_frag];
	if(frag_list==NULL) Memory_Allocation_Error();

	for(i=0;i<num_frag;i++) frag_list[i]=fragment[i].id;

	if(num_wanted>num_frag) num_wanted=num_frag;
	else if(num_wanted<1) num_wanted=1;

	tmp=0; num_left=num_frag;

	do
	{
	 i=(int)(drand48()*num_left);
	 frag_id[tmp]=frag_list[i];

	 j=i;
	 while(j<num_left-1)
		{
		 frag_list[j]=frag_list[j+1];
		 j++;
		}

	 tmp++; num_left--;
	} while(tmp<num_wanted);

	delete [] frag_list;

	return num_wanted;
}

int FragLibrary::Map_A_Molecule(const Ligand &lig) const
{
	int i,mark=FALSE;

	for(i=0;i<num_frag;i++)
		{
		 if(fragment[i].possibility<0.01) continue;
		 else if(drand48()>fragment[i].possibility) continue;

		 if(Substructure_Search(lig,fragment[i])==FALSE) continue;
		 else {mark=fragment[i].id; break;}
		}

	return mark;
}

⌨️ 快捷键说明

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