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

📄 mutate.c

📁 药物开发中的基于结构的从头设计代码
💻 C
📖 第 1 页 / 共 2 页
字号:

	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 + -