📄 ligand.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 + -