📄 mutate.c
字号:
return TRUE;
}
int Ligand::Mutate_An_Atom_To_C2(int atom_id)
{
if(strcmp(atom[atom_id-1].type,"N.2")) return FALSE;
Group group;
group=Find_A_Group(atom_id);
if(group.num_neib!=2) return FALSE;
strcpy(group.center.name,"C");
strcpy(group.center.type,"C.2");
group.center.weight=12;
// add one sp2 hydrogen
int i;
extern ForceField *ff;
float v1[3],v2[3];
float length;
Atom h;
Bond b;
for(i=0;i<3;i++)
{
v1[i]=group.neib[0].coor[i]-group.center.coor[i];
v2[i]=group.neib[1].coor[i]-group.center.coor[i];
}
Unify_Vector(v1); Unify_Vector(v2);
Get_Sp2_Coordinates(v1,v2,h.coor);
length=ff->Get_Bond_Length("C.2","H","1");
for(i=0;i<3;i++)
{
h.coor[i]=group.center.coor[i]+length*h.coor[i];
}
h.id=num_atom+1; h.valid=group.center.valid;
strcpy(h.name,"H"); strcpy(h.type,"H.spc");
h.weight=1;
b.id=num_bond+1; b.valid=1;
b.atom_1=group.center.id; b.atom_2=h.id;
strcpy(b.type,"1");
atom[atom_id-1]=group.center;
atom[num_atom]=h;
bond[num_bond]=b;
num_atom++; num_bond++;
return TRUE;
}
int Ligand::Mutate_An_Atom_To_N2(int atom_id)
{
if(strcmp(atom[atom_id-1].type,"C.2")) return FALSE;
Group group;
group=Find_A_Group(atom_id);
if(group.num_nonh>2||group.num_neib!=3) return FALSE;
strcpy(atom[atom_id-1].name,"N");
strcpy(atom[atom_id-1].type,"N.2");
atom[atom_id-1].weight=14;
Delete_An_Atom(group.neib[2].id);
return TRUE;
}
int Ligand::Mutate_An_Atom_To_Nam(int atom_id)
{
char tmp_type[10];
strcpy(tmp_type,atom[atom_id-1].type);
Group group;
group=Find_A_Group(atom_id);
int bond_id;
bond_id=CO_Connection_Check(group);
if(bond_id==FALSE) return FALSE;
else strcpy(bond[bond_id-1].type,"am");
if(group.num_nonh>2) return FALSE;
else if(!strcmp(tmp_type,"C.3")&&(group.num_neib==4))
{
Delete_An_Atom(group.neib[2].id);
Delete_An_Atom(group.neib[3].id);
}
else if(!strcmp(tmp_type,"O.3")&&(group.num_neib==2)) {}
else return FALSE;
// add one sp2 hydrogen
strcpy(group.center.name,"N");
strcpy(group.center.type,"N.am");
group.center.weight=14;
int i;
extern ForceField *ff;
float v1[3],v2[3];
float length;
Atom h;
Bond b;
for(i=0;i<3;i++)
{
v1[i]=group.neib[0].coor[i]-group.center.coor[i];
v2[i]=group.neib[1].coor[i]-group.center.coor[i];
}
Unify_Vector(v1); Unify_Vector(v2);
Get_Sp2_Coordinates(v1,v2,h.coor);
length=ff->Get_Bond_Length("N.am","H","1");
for(i=0;i<3;i++)
{
h.coor[i]=group.center.coor[i]+length*h.coor[i];
}
h.id=num_atom+1; h.valid=group.center.valid;
strcpy(h.name,"H"); strcpy(h.type,"H.spc");
h.weight=1;
b.id=num_bond+1; b.valid=1;
b.atom_1=group.center.id; b.atom_2=h.id;
strcpy(b.type,"1");
atom[atom_id-1]=group.center;
atom[num_atom]=h;
bond[num_bond]=b;
num_atom++; num_bond++;
return TRUE;
}
int Ligand::Mutate_An_Atom_To_Npl3(int atom_id)
{
if(strcmp(atom[atom_id-1].type,"O.3")) return FALSE;
Group group;
group=Find_A_Group(atom_id);
if(group.num_neib!=2) return FALSE;
else if(group.num_nonh!=2) return FALSE;
else if(group.num_pi!=2) return FALSE;
else if(group.center.ring==0) return FALSE;
strcpy(group.center.name,"N");
strcpy(group.center.type,"N.pl3");
group.center.weight=14;
// add one sp2 hydrogen
int i;
extern ForceField *ff;
float v1[3],v2[3];
float length;
Atom h;
Bond b;
for(i=0;i<3;i++)
{
v1[i]=group.neib[0].coor[i]-group.center.coor[i];
v2[i]=group.neib[1].coor[i]-group.center.coor[i];
}
Unify_Vector(v1); Unify_Vector(v2);
Get_Sp2_Coordinates(v1,v2,h.coor);
length=ff->Get_Bond_Length("N.pl3","H","1");
for(i=0;i<3;i++)
{
h.coor[i]=group.center.coor[i]+length*h.coor[i];
}
h.id=num_atom+1; h.valid=group.center.valid;
strcpy(h.name,"H"); strcpy(h.type,"H.spc");
h.weight=1;
b.id=num_bond+1; b.valid=1;
b.atom_1=group.center.id; b.atom_2=h.id;
strcpy(b.type,"1");
atom[atom_id-1]=group.center;
atom[num_atom]=h;
bond[num_bond]=b;
num_atom++; num_bond++;
return TRUE;
}
int Ligand::Mutate_An_Atom_To_Car(int atom_id)
{
if(strcmp(atom[atom_id-1].type,"N.ar")) return FALSE;
Group group;
group=Find_A_Group(atom_id);
if(group.num_neib!=2) return FALSE;
else if(group.num_nonh!=2) return FALSE;
strcpy(group.center.name,"C");
strcpy(group.center.type,"C.ar");
group.center.weight=12;
// add one sp2 hydrogen
int i;
extern ForceField *ff;
float v1[3],v2[3];
float length;
Atom h;
Bond b;
for(i=0;i<3;i++)
{
v1[i]=group.neib[0].coor[i]-group.center.coor[i];
v2[i]=group.neib[1].coor[i]-group.center.coor[i];
}
Unify_Vector(v1); Unify_Vector(v2);
Get_Sp2_Coordinates(v1,v2,h.coor);
length=ff->Get_Bond_Length("C.ar","H","1");
for(i=0;i<3;i++)
{
h.coor[i]=group.center.coor[i]+length*h.coor[i];
}
h.id=num_atom+1; h.valid=group.center.valid;
strcpy(h.name,"H"); strcpy(h.type,"H.spc");
h.weight=1;
b.id=num_bond+1; b.valid=1;
b.atom_1=group.center.id; b.atom_2=h.id;
strcpy(b.type,"1");
atom[atom_id-1]=group.center;
atom[num_atom]=h;
bond[num_bond]=b;
num_atom++; num_bond++;
return TRUE;
}
int Ligand::Mutate_An_Atom_To_Nar(int atom_id)
{
if(strcmp(atom[atom_id-1].type,"C.ar")) return FALSE;
Group group;
group=Find_A_Group(atom_id);
if(group.num_neib!=3) return FALSE;
else if(group.num_nonh!=2) return FALSE;
strcpy(atom[atom_id-1].name,"N");
strcpy(atom[atom_id-1].type,"N.ar");
atom[atom_id-1].weight=14;
Delete_An_Atom(group.neib[2].id);
return TRUE;
}
int Ligand::Mutate_An_Atom_To_H(int atom_id)
{
Group group;
group=Find_A_Group(atom_id);
if(group.num_nonh!=1) return FALSE;
else if(strcmp(group.bond[0].type,"1")&&
strcmp(group.bond[0].type,"am")) return FALSE;
else if(group.num_neib==2)
{
Delete_An_Atom(group.neib[1].id);
}
else if(group.num_neib==3)
{
Delete_An_Atom(group.neib[1].id);
Delete_An_Atom(group.neib[2].id);
}
else if(group.num_neib==4)
{
Delete_An_Atom(group.neib[1].id);
Delete_An_Atom(group.neib[2].id);
Delete_An_Atom(group.neib[3].id);
}
else return FALSE;
Delete_An_Atom(group.center.id);
extern ForceField *ff;
int i;
float length,tmp;
Atom a;
Bond b;
length=ff->Get_Bond_Length(group.neib[0].type,"H","1");
tmp=Distance(group.neib[0].coor,group.center.coor);
a.id=num_atom+1; a.valid=group.neib[0].valid;
strcpy(a.name,"H"); strcpy(a.type,"H");
a.weight=1;
for(i=0;i<3;i++)
{
a.coor[i]=group.neib[0].coor[i];
a.coor[i]+=((group.center.coor[i]-group.neib[0].coor[i])*length/tmp);
}
b.id=num_bond+1; b.valid=1;
b.atom_1=group.neib[0].id; b.atom_2=a.id;
strcpy(b.type,"1");
atom[num_atom]=a; bond[num_bond]=b;
num_atom++; num_bond++;
return TRUE;
}
int Ligand::Mutation_Viability_Check(int atom_id) const
{
int i;
Group group,neib;
group=Find_A_Group(atom_id);
if(Group_Viability_Check(group)==FALSE) return FALSE;
else
{
for(i=0;i<group.num_nonh;i++)
{
neib=Find_A_Group(group.neib[i].id);
if(Group_Viability_Check(neib)==FALSE) return FALSE;
else continue;
}
}
return TRUE;
}
int Ligand::CO_Connection_Check(Group group) const
// this function checks whether an atom is adjacent to C=O
// bond_id returns the ID of the connecting bond
{
int i,mark,bond_id;
Group g;
bond_id=0;
for(i=0;i<group.num_nonh;i++)
{
if(strcmp(group.neib[i].type,"C.2")) continue;
g=Find_A_Group(group.neib[i].id);
mark=g.db_type;
if(mark==3)
{
bond_id=group.bond[i].id;
break;
}
}
return bond_id;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -