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