📄 link.c
字号:
new_bond.valid=1;
bond[num_bond]=new_bond;
num_bond++;
}
// printf("Fusing happens between %d and %d\n", id1, id2);
return TRUE;
}
if((delete_mode_1==FALSE)&&(delete_mode_2==TRUE))
{
// delete root_2
for(i=0;i<root_2.num_neib;i++)
{
if(root_2.neib[i].type[0]!='H')
Delete_An_Atom(bonding_2[i].id2);
else Delete_An_Atom(root_2.neib[i].id);
}
Delete_An_Atom(root_2.center.id);
for(i=0;i<root_2.num_nonh;i++)
{
new_bond.id=num_bond+1;
new_bond.atom_1=root_2.neib[i].id;
new_bond.atom_2=root_1.center.id;
strcpy(new_bond.type,"1");
new_bond.valid=1;
bond[num_bond]=new_bond;
num_bond++;
}
// printf("Fusing happens between %d and %d\n", id1, id2);
return TRUE;
}
return FALSE;
}
int Ligand::Bonding_Match_Check(Atom atm, Group harbor) const
{
int i,j;
float v1[3], v2[3];
for(i=0;i<harbor.num_neib;i++)
{
if(harbor.neib[i].type[0]!='H') continue;
for(j=0;j<3;j++)
{
v1[j]=atm.coor[j]-harbor.center.coor[j];
v2[j]=harbor.neib[i].coor[j]-harbor.center.coor[j];
}
if(Angle_Of_Two_Vectors(v1,v2)>ANGLE_OVERLAP_RANGE) continue;
else return harbor.neib[i].id;
}
return FALSE;
}
int Ligand::Link_Structure(struct Linking_Record &record)
{
int i,j,mark;
float d,d0;
int old_num_bond,num_candidate;
struct Candidate
{
int valid;
int id1;
int id2;
} candidate[500];
old_num_bond=num_bond;
record.num_link=0; record.rmsd=0.000;
// apply fusing algorithm
while(1)
{
// first, make the candidate list of C-C overlaps
Detect_Connections();
num_candidate=0;
for(i=0;i<500;i++)
{
candidate[i].valid=0;
candidate[i].id1=0;
candidate[i].id2=0;
}
for(i=0;i<num_atom-1;i++)
{
if(atom[i].valid==0) continue;
else if(atom[i].type[0]=='H') continue;
for(j=i+1;j<num_atom;j++)
{
if(atom[j].valid==0) continue;
else if(atom[j].type[0]=='H') continue;
else if(Atom_Overlap_Check(atom[i],atom[j])==FALSE) continue;
else
{
candidate[num_candidate].valid=1;
candidate[num_candidate].id1=atom[i].id;
candidate[num_candidate].id2=atom[j].id;
num_candidate++;
}
}
}
if(num_candidate==0) break;
// check whether there is any confusing case
if(num_candidate>1)
{
for(i=0;i<num_candidate-1;i++)
for(j=i+1;j<num_candidate;j++)
{
if(Connection_1_2_Check(candidate[i].id1,candidate[j].id1)) return FALSE;
else if(Connection_1_2_Check(candidate[i].id1, candidate[j].id2)) return FALSE;
else if(Connection_1_2_Check(candidate[i].id2, candidate[j].id1)) return FALSE;
else if(Connection_1_2_Check(candidate[i].id2, candidate[j].id2)) return FALSE;
else continue;
}
}
// then try to deal with each candidate
mark=FALSE;
for(i=0;i<num_candidate;i++)
{
if(Fusing(candidate[i].id1,candidate[i].id2)==TRUE)
{
record.id1[record.num_link]=candidate[i].id1;
record.id2[record.num_link]=candidate[i].id2;
d=Distance(atom[candidate[i].id1-1].coor,
atom[candidate[i].id2-1].coor);
record.rmsd+=(d*d);
record.num_link++;
mark=TRUE;
break;
}
else continue;
}
if(mark==TRUE&&num_candidate==1) break; // finish linking
else if(mark==TRUE&&num_candidate!=1) continue; // continue linking
else if(mark==FALSE&&num_candidate!=0) return FALSE; // bad structure
else break; // no more candidate, finish linking
}
// apply bridging and joining algorithm
while(1)
{
// first, make the candidate list of H-H bumps
Detect_Connections();
num_candidate=0;
for(i=0;i<500;i++)
{
candidate[i].valid=0;
candidate[i].id1=0;
candidate[i].id2=0;
}
for(i=0;i<num_atom-1;i++)
{
if(atom[i].valid==0) continue;
else if(atom[i].type[0]!='H') continue;
for(j=i+1;j<num_atom;j++)
{
if(atom[j].valid==0) continue;
else if(atom[j].type[0]!='H') continue;
d0=atom[i].r+atom[j].r;
d=Distance(atom[i].coor,atom[j].coor);
if(d>(d0-VDW_BUMP_RANGE)) continue;
else if(Connection_1_2_Check(atom[i].id,atom[j].id)) continue;
else if(Connection_1_3_Check(atom[i].id,atom[j].id)) continue;
{
candidate[num_candidate].valid=1;
candidate[num_candidate].id1=atom[i].id;
candidate[num_candidate].id2=atom[j].id;
num_candidate++;
}
}
}
if(num_candidate==0) break;
// try to deal with each candidate
mark=FALSE;
for(i=0;i<num_candidate;i++)
{
if(Bridging(candidate[i].id1,candidate[i].id2)==TRUE)
{
record.id1[record.num_link]=candidate[i].id1;
record.id2[record.num_link]=candidate[i].id2;
d=Distance(atom[candidate[i].id1-1].coor,
atom[candidate[i].id2-1].coor);
record.rmsd+=(d*d);
record.num_link++;
mark=TRUE;
break;
}
else if(Joining(candidate[i].id1,candidate[i].id2)==TRUE)
{
record.id1[record.num_link]=candidate[i].id1;
record.id2[record.num_link]=candidate[i].id2;
d=Distance(atom[candidate[i].id1-1].coor,
atom[candidate[i].id2-1].coor);
record.rmsd+=(d*d);
record.num_link++;
mark=TRUE;
break;
}
else continue;
}
if(mark==TRUE&&num_candidate==1) break; // finish linking
else if(mark==TRUE&&num_candidate!=1) continue; // continue linking
else if(mark==FALSE&&num_candidate!=0) return FALSE; // bad structure
else break; // no more candidate, finish linking
}
if(num_bond==old_num_bond) return FALSE; // no link made
record.rmsd=sqrt((double)(record.rmsd/record.num_link));
this->valid=Arrange_IDs();
if(this->valid==FALSE) return FALSE;
else return TRUE;
}
int Ligand::Link_Structure()
{
int i,j,mark;
float d,d0;
int old_num_bond,num_candidate;
struct Candidate
{
int valid;
int id1;
int id2;
} candidate[500];
old_num_bond=num_bond;
// apply fusing algorithm
while(1)
{
// first, make the candidate list of C-C overlaps
Detect_Connections();
num_candidate=0;
for(i=0;i<500;i++)
{
candidate[i].valid=0;
candidate[i].id1=0;
candidate[i].id2=0;
}
for(i=0;i<num_atom-1;i++)
{
if(atom[i].valid==0) continue;
else if(atom[i].type[0]=='H') continue;
for(j=i+1;j<num_atom;j++)
{
if(atom[j].valid==0) continue;
else if(atom[j].type[0]=='H') continue;
else if(Atom_Overlap_Check(atom[i],atom[j])==FALSE) continue;
else
{
candidate[num_candidate].valid=1;
candidate[num_candidate].id1=atom[i].id;
candidate[num_candidate].id2=atom[j].id;
num_candidate++;
}
}
}
if(num_candidate==0) break;
// check whether there is any confusing case
if(num_candidate>1)
{
for(i=0;i<num_candidate-1;i++)
for(j=i+1;j<num_candidate;j++)
{
if(Connection_1_2_Check(candidate[i].id1,
candidate[j].id1)) return FALSE;
else if(Connection_1_2_Check(candidate[i].id1,
candidate[j].id2)) return FALSE;
else if(Connection_1_2_Check(candidate[i].id2,
candidate[j].id1)) return FALSE;
else if(Connection_1_2_Check(candidate[i].id2,
candidate[j].id2)) return FALSE;
else continue;
}
}
// then try to deal with each candidate
mark=FALSE;
for(i=0;i<num_candidate;i++)
{
if(Fusing(candidate[i].id1,candidate[i].id2)==TRUE)
{
mark=TRUE;
break;
}
else continue;
}
if(mark==TRUE&&num_candidate==1) break; // finish linking
else if(mark==TRUE&&num_candidate!=1) continue; // continue linking
else if(mark==FALSE&&num_candidate!=0) return FALSE; // bad structure
else break; // no more candidate, finish linking
}
// apply bridging and joining algorithm
while(1)
{
// first, make the candidate list of H-H bumps
Detect_Connections();
num_candidate=0;
for(i=0;i<500;i++)
{
candidate[i].valid=0;
candidate[i].id1=0;
candidate[i].id2=0;
}
for(i=0;i<num_atom-1;i++)
{
if(atom[i].valid==0) continue;
else if(atom[i].type[0]!='H') continue;
for(j=i+1;j<num_atom;j++)
{
if(atom[j].valid==0) continue;
else if(atom[j].type[0]!='H') continue;
d0=atom[i].r+atom[j].r;
d=Distance(atom[i].coor,atom[j].coor);
if(d>(d0-VDW_BUMP_RANGE)) continue;
else if(Connection_1_2_Check(atom[i].id,atom[j].id)) continue;
else if(Connection_1_3_Check(atom[i].id,atom[j].id)) continue;
{
candidate[num_candidate].valid=1;
candidate[num_candidate].id1=atom[i].id;
candidate[num_candidate].id2=atom[j].id;
num_candidate++;
}
}
}
if(num_candidate==0) break;
// try to deal with each candidate
mark=FALSE;
for(i=0;i<num_candidate;i++)
{
if(Bridging(candidate[i].id1,candidate[i].id2)==TRUE)
{
mark=TRUE;
break;
}
else if(Joining(candidate[i].id1,candidate[i].id2)==TRUE)
{
mark=TRUE;
break;
}
else continue;
}
if(mark==TRUE&&num_candidate==1) break; // finish linking
else if(mark==TRUE&&num_candidate!=1) continue; // continue linking
else if(mark==FALSE&&num_candidate!=0) return FALSE; // bad structure
else break; // no more candidate, finish linking
}
if(num_bond==old_num_bond) return FALSE; // no link made
this->valid=Arrange_IDs();
if(this->valid==FALSE) return FALSE;
else return TRUE;
}
void Ligand::Seed_Structure_Check() const
{
extern Pocket *pok;
int i,mark,*seed_list;
char grid;
if(num_part==1)
{
printf("\nThere are %d fragments in the seed structure\n",num_part);
printf("You are suggested to use LigBuilder/Grow for instead.\n");
exit(1);
}
// check whether the seed is in the box
mark=0;
for(i=0;i<num_atom;i++)
{
if(atom[i].valid==0) continue;
else if(atom[i].coor[0]>pok->max_x) mark++;
else if(atom[i].coor[0]<pok->min_x) mark++;
else if(atom[i].coor[1]>pok->max_y) mark++;
else if(atom[i].coor[1]<pok->min_y) mark++;
else if(atom[i].coor[2]>pok->max_z) mark++;
else if(atom[i].coor[2]<pok->min_z) mark++;
else continue;
}
if(mark)
{
puts("\nError: part of the seed structure is out of the box.");
puts("Are you sure it has been docked to the right place?");
exit(1);
}
// then check whether any part of the seed bumps to the protein
mark=0;
for(i=0;i<num_atom;i++)
{
grid=pok->Get_Grid_Property(atom[i].coor);
if(grid=='E')
{
if(!strcmp(atom[i].type,"H")) continue;
else if(!strcmp(atom[i].type,"H.spc"))
{strcpy(atom[i].type,"H"); continue;}
else
{
printf("Atom %d %s bumps to the protein!\n",
atom[i].id, atom[i].type);
mark++;
continue;
}
}
else continue;
}
if(mark)
{
puts("\nError: some atoms in the seed bump to the protein.");
puts("Please modify the seed structure to release the bumps.");
exit(1);
}
// notice here the seeds on 'S' grid are allowed to survive
// check whether there is any growing site on the seed
seed_list=new int[num_atom];
if(seed_list==NULL) Memory_Allocation_Error();
mark=Make_Seed_List(seed_list);
if(mark==0)
{
puts("\nError: No available growing site found on the seed.");
puts("Program has no way to develop new molecules.");
puts("Please assign proper growing sites on the seed.");
exit(1);
}
delete [] seed_list;
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -