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

📄 ligand.c

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

Ligand::Ligand()
{
	Clean_Members();

	atom=NULL; bond=NULL;
}

Ligand::Ligand(int max_atom_num, int max_bond_num)
{
	Clean_Members();

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

	bond=new Bond[max_bond_num];
	if(bond==NULL) Memory_Allocation_Error();
}

Ligand::Ligand(const Ligand &original)
{
	id=original.id;
	possibility=original.possibility;
	valid=original.valid;
	strcpy(name,original.name);
	weight=original.weight;
	strcpy(formula,original.formula);
	strcpy(index,original.index);
        binding_score=original.binding_score;
        chemical_score=original.chemical_score;
	logp=original.logp;
	num_donor_atom=original.num_donor_atom;
	num_acceptor_atom=original.num_acceptor_atom;
        wins=original.wins;
	num_fused_ring=original.num_fused_ring;

	num_atom=original.num_atom;
	num_bond=original.num_bond;
	num_part=original.num_part;

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

	bond=new Bond[num_bond];
	if(bond==NULL) Memory_Allocation_Error();

	int i;
	for(i=0;i<num_atom;i++) atom[i]=original.atom[i];
	for(i=0;i<num_bond;i++) bond[i]=original.bond[i];
}

Ligand::~Ligand()
{
	delete [] atom; atom=NULL;
	delete [] bond; bond=NULL;
}

Ligand& Ligand::operator = (const Ligand &original)
{
	// this operator generates a copy of the original molecule 

	if(this==&original) return *this;

	id=original.id;
	possibility=original.possibility;
	valid=original.valid;
	strcpy(name,original.name);
	weight=original.weight;
	strcpy(formula,original.formula);
	strcpy(index,original.index);
        binding_score=original.binding_score;
        chemical_score=original.chemical_score;
	logp=original.logp;
	num_donor_atom=original.num_donor_atom;
        num_acceptor_atom=original.num_acceptor_atom;
        wins=original.wins;
	num_fused_ring=original.num_fused_ring;

	num_atom=original.num_atom;
	num_bond=original.num_bond;
	num_part=original.num_part;

	delete [] atom;
	delete [] bond; 

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

	bond=new Bond[num_bond];
	if(bond==NULL) Memory_Allocation_Error();

	int i;
	for(i=0;i<num_atom;i++) atom[i]=original.atom[i];
	for(i=0;i<num_bond;i++) bond[i]=original.bond[i];

	return *this;
}

Ligand& Ligand::operator <= (const Ligand &original)
{
	// this operator copys the content of the original molecule
	// to the new one, usually used when copy a smaller molecule
	// to a larger one. 

	if(this==&original) return *this;

	id=original.id;
	possibility=original.possibility;
	valid=original.valid;
	strcpy(name,original.name);
	weight=original.weight;
	strcpy(formula,original.formula);
	strcpy(index,original.index);
        binding_score=original.binding_score;
        chemical_score=original.chemical_score;
	logp=original.logp;
        num_donor_atom=original.num_donor_atom;
        num_acceptor_atom=original.num_acceptor_atom;
        wins=original.wins;
	num_fused_ring=original.num_fused_ring;

	num_atom=original.num_atom;
	num_bond=original.num_bond;
	num_part=original.num_part;

	int i;

	for(i=0;i<num_atom;i++) atom[i]=original.atom[i];
	for(i=0;i<num_bond;i++) bond[i]=original.bond[i];

	return *this;
}

void Ligand::Clean_Members()
{
	id=0;
	possibility=0.000;
	valid=0;
        strcpy(name,"");
        weight=0;
        strcpy(formula,"");
        strcpy(index,"");
        binding_score=0.000;
        chemical_score=0.000;
	logp=0.000;
	num_donor_atom=0;
	num_acceptor_atom=0;
        wins=0;
	num_fused_ring=0;

        num_atom=0;
        num_bond=0;
	num_part=1;

	return;
}

void Ligand::Show_Parameter() const
{
	int i;

	printf("Ligand %s\n", name);
	printf("\tFormula = %s\n",formula);
	printf("\tWeight = %d\n",weight);
	printf("\tStructure index = %s\n",index);
	printf("\tBinding score = %5.2f\n",binding_score);
	printf("\tChemical score = %6.2f\n",chemical_score);
	printf("\tLogP = %5.2f\n",logp);
	printf("\tNum_Donor_Atom = %d\n", num_donor_atom);
	printf("\tNum_Acceptor_Atom = %d\n", num_acceptor_atom);
	printf("\tWins = %d\n",wins);

	printf("Number of components = %d\n",num_part);

	printf("Number of atoms = %d\n",num_atom);

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

        printf("Number of bonds = %d\n", num_bond);

        for(i=0;i<num_bond;i++)
                {
                 printf("Bond: "); 
		 printf("%3d ", bond[i].id);
		 printf("%3d ", bond[i].atom_1);
		 printf("%3d ", bond[i].atom_2);
		 printf("%2s ", bond[i].type); 
		 printf("%1d ", bond[i].valid);
		 printf("<%1d> ", bond[i].part);
		 printf("\n");
		}

	return;
}

void Ligand::Show_Structure() const
{
	int i;

	printf("Ligand %s\n", name);
	printf("\tNumber of components = %d\n",num_part);
	printf("\tNumber of atoms = %d\n",num_atom);

        for(i=0;i<num_atom;i++)
                {
                 printf("Atom: ");
                 printf("%3d ",   atom[i].id);
		 printf("%1d ",   atom[i].valid);
                 printf("%5s ",   atom[i].type);
		 printf("%1d ",   atom[i].ring);
		 printf("<%1d>\t", atom[i].part);
		 printf("%1d ",   atom[i].num_neib);
		 printf("%3d ",   atom[i].neib[0]);
		 printf("%3d ",   atom[i].neib[1]);
		 printf("%3d ",   atom[i].neib[2]);
		 printf("%3d ",   atom[i].neib[3]);
                 printf("\n");
                }

        printf("Number of bonds = %d\n", num_bond);

        for(i=0;i<num_bond;i++)
                {
                 printf("Bond: "); 
		 printf("%3d ", bond[i].id);
		 printf("%3d ", bond[i].atom_1);
		 printf("%3d ", bond[i].atom_2);
		 printf("%2s ", bond[i].type);
		 printf("%1d ", bond[i].valid); 
		 printf("%1d ", bond[i].ring);
		 printf("<%1d>\t", bond[i].part);
		 printf("%1d ", bond[i].num_neib);
		 printf("%3d ", bond[i].neib[0]);
		 printf("%3d ", bond[i].neib[1]);
                 printf("%3d ", bond[i].neib[2]);
                 printf("%3d ", bond[i].neib[3]);
                 printf("%3d ", bond[i].neib[4]);
                 printf("%3d ", bond[i].neib[5]);
		 printf("\n");
		}

	return;
}

void Ligand::Read_From_Mol2(char *filename, int position)
{
	FILE *fp;
	int i,count;
	char buf[160],head[40];

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

	count=0;

	for(;;)
		{
		 if(fgets(buf,160,fp)==NULL) Mol2_Format_Error(filename);
		 else sscanf(buf,"%s",head);

		 if(strcmp(head,"@<TRIPOS>MOLECULE")) continue;
		 else count++;

		 if(count==position) break;	// the right one
		 else continue;
		}

       	fgets(buf,160,fp); strcpy(name,buf);
	name[strlen(name)-1]='\0';	// remove the terminal return

	fgets(buf,160,fp);
        sscanf(buf,"%d%d",&num_atom,&num_bond);

	// re-define the molecule

	delete [] atom; delete [] bond; 

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

	bond=new Bond[num_bond];
	if(bond==NULL) Memory_Allocation_Error();

        do 
                {
                 if(fgets(buf,160,fp)!=NULL) sscanf(buf,"%s",head);
                 else Mol2_Format_Error(filename);
                }
        while(strcmp(head,"@<TRIPOS>ATOM"));

	for(i=0;i<num_atom;i++)
		{
		 fgets(buf,160,fp);
		 sscanf(buf,"%d%s%f%f%f%s", 
			&atom[i].id, 
			 atom[i].name,
			&atom[i].coor[0], 
			&atom[i].coor[1], 
			&atom[i].coor[2], 
			 atom[i].type);
		 atom[i].valid=1;
		}

	do
                {
                 if(fgets(buf,160,fp)!=NULL) sscanf(buf,"%s",head);
                 else Mol2_Format_Error(filename);
                }
        while(strcmp(head,"@<TRIPOS>BOND"));

	for(i=0;i<num_bond;i++)
		{
		 fgets(buf,160,fp);
		 sscanf(buf,"%d%d%d%s",
			&bond[i].id, 
			&bond[i].atom_1,
			&bond[i].atom_2, 
			 bond[i].type);
		 bond[i].valid=1;
		}

	fclose(fp);

	valid=1;	// read the molecule okay

	return;
}

void Ligand::Write_Out_Mol2(char *filename) const
{
	FILE *fp;
	int i;

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

	fprintf(fp,"# Name:          %s\n",name); 
	fprintf(fp,"# Creation time: %s\n\n",Get_Time());

	fprintf(fp,"@<TRIPOS>MOLECULE\n");
	fprintf(fp,"%s\n",name);
	fprintf(fp,"%5d %5d %5d %5d %5d\n",num_atom,num_bond,num_part,1,1);
	fprintf(fp,"SMALL\n");
	fprintf(fp,"USER_CHARGES\n");
	fprintf(fp,"\n\n");

	fprintf(fp,"@<TRIPOS>ATOM\n");

	for(i=0;i<num_atom;i++)
		{
		 if(!strcmp(atom[i].type,"H.spc")) strcpy(atom[i].type,"H");

		 fprintf(fp,"%7d %-8s %9.4f %9.4f %9.4f %-9s  ",
			 atom[i].id, 
			 atom[i].name, 
			 atom[i].coor[0],
			 atom[i].coor[1], 
			 atom[i].coor[2], 
			 atom[i].type);
		 fprintf(fp,"%1d <%1d>      %7.3f\n",
			 atom[i].part,
			 atom[i].part,
			 atom[i].score); 
		}
	
	fprintf(fp,"@<TRIPOS>BOND\n");

	for(i=0;i<num_bond;i++)
		{
		 fprintf(fp,"%6d %4d %4d %-3s\n", 
			 bond[i].id, 
			 bond[i].atom_1, 
			 bond[i].atom_2, 
			 bond[i].type);
		}

	fclose(fp);

	return;
}

void Ligand::Read_From_Lig(char *filename, int position)
{
	FILE *fp;
	int i,count;
	char buf[160],head[40];

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

	count=0;

	for(;;)
                {
                 if(fgets(buf,160,fp)==NULL) Lig_Format_Error(filename);
                 else sscanf(buf,"%s",head);

                 if(strcmp(head,"<MOLECULE>")) continue;
                 else count++;

                 if(count==position) break;     // the right one
                 else continue;
                }

	sscanf(buf,"%*s%s",name);

	do {fgets(buf,160,fp); sscanf(buf,"%s",head);}
        while(strcmp(head,"<FORMULA>"));

	sscanf(buf,"%*s%s",formula);

	do {fgets(buf,160,fp); sscanf(buf,"%s",head);}
        while(strcmp(head,"<WEIGHT>"));

	sscanf(buf,"%*s%d",&weight);
	
	do {fgets(buf,160,fp); sscanf(buf,"%s",head);}
        while(strcmp(head,"<LOGP>"));

	sscanf(buf,"%*s%f",&logp);

	do {fgets(buf,160,fp); sscanf(buf,"%s",head);}
        while(strcmp(head,"<BINDING_SCORE>"));

	sscanf(buf,"%*s%f",&binding_score);

	do {fgets(buf,160,fp); sscanf(buf,"%s",head);}
        while(strcmp(head,"<CHEMICAL_SCORE>"));

        sscanf(buf,"%*s%f",&chemical_score);

	do {fgets(buf,160,fp); sscanf(buf,"%s",head);}
        while(strcmp(head,"<ATOM>"));

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

	delete [] atom; 

	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%s%f%f%f%s%s%*s%d%f", 
			&atom[i].id, 
			 atom[i].name,
			&atom[i].coor[0], 
			&atom[i].coor[1], 
			&atom[i].coor[2],
			 atom[i].type, 
			 atom[i].xtype,
			&atom[i].valid, 
			&atom[i].score);
		}

	do {fgets(buf,160,fp); sscanf(buf,"%s",head);}
        while(strcmp(head,"<BOND>"));

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

	delete [] bond; 

	bond=new Bond[num_bond];
	if(bond==NULL) Memory_Allocation_Error();

	for(i=0;i<num_bond;i++)
		{
		 fgets(buf,160,fp);
		 sscanf(buf,"%d%d%d%s%*s%d", 
			&bond[i].id, 
			&bond[i].atom_1,
			&bond[i].atom_2, 
			 bond[i].type,
			&bond[i].valid);
		}

	do {fgets(buf,160,fp); sscanf(buf,"%s",head);}
        while(strcmp(head,"<INDEX>"));

	sscanf(buf,"%*s%s",index);

	fclose(fp);

	valid=1;	// read the molecule okay

	return;
}

void Ligand::Write_Out_Lig(char *filename) const
{
	FILE *fp;
	int i;

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

	fprintf(fp,"<MOLECULE> %s\n", name);
	fprintf(fp,"<FORMULA> %s\n", formula);
	fprintf(fp,"<WEIGHT> %d\n", weight);
	fprintf(fp,"<LOGP> %6.2f\n", logp);
	fprintf(fp,"<BINDING_SCORE> %5.2f\n", binding_score);
	fprintf(fp,"<CHEMICAL_SCORE> %6.1f\n", chemical_score); 

	fprintf(fp,"<ATOM> %d\n", num_atom);

	for(i=0;i<num_atom;i++)
		{
		 fprintf(fp,"%-3d  %-6s  %8.3f  %8.3f  %8.3f  %5s  ",
			 atom[i].id, 
			 atom[i].name, 
			 atom[i].coor[0],
			 atom[i].coor[1], 
			 atom[i].coor[2], 
			 atom[i].type);  
		 fprintf(fp,"%-20s <%1d> %-2d  %6.2f\n", 
			 atom[i].xtype, 
			 atom[i].part, 
			 atom[i].valid, 
			 atom[i].score);
		}

	fprintf(fp,"<BOND> %d\n", num_bond);

	for(i=0;i<num_bond;i++)
		{
		 fprintf(fp,"%-3d  %-3d  %-3d  %3s <%1d> %1d\n",
			 bond[i].id, 
			 bond[i].atom_1, 
			 bond[i].atom_2,
			 bond[i].type, 
			 bond[i].part, 
			 bond[i].valid);
		}
	
	fprintf(fp,"<INDEX> %s\n", index);
	
	fprintf(fp,"<END>\n");

	fclose(fp);

	return;
}

⌨️ 快捷键说明

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