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

📄 link.c

📁 药物开发中的基于结构的从头设计代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		 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 + -