📄 autotors.c
字号:
int key1,key2;{ TORS_ANGLE *temp1; int result; result=0; temp1=head_tors; while(temp1&&temp1->id1&&temp1->id2){ if(((key1==temp1->id1&&key2==temp1->id2)|| (key1==temp1->id2&&key2==temp1->id1))&&temp1->status=='A') { result=1; }; if(temp1->next){ temp1=temp1->next; }else temp1=NULL; }; return(result);}TORS_ANGLE * add_tors(key1,key2,head)int key1,key2;TORS_ANGLE * head;{ TORS_ANGLE * temp; if(!key1||!key2){ printf("in add_tors with key error\n"); exit(1); }; ntors++; if(!head){ head=get_new_tors(key1,key2); next_tors=head; } else { if(!check_tors(key1,key2)||(head!=head_tors)){ temp=get_new_tors(key1,key2); next_tors->next=temp; next_tors=temp; }; }; return(head);}int delete_tors(num)int num;{ TORS_ANGLE * temp1, *temp2; int result; result=0; temp1=head_tors; while(temp1){ if(num==temp1->num) { temp1->status='I'; result=1; return(result); }; temp2=temp1; temp1=temp1->next; };/*while*/ printf("didn't find tors %d to delete\n",num); return(result);}int check_aromatic(con_num){int i,j,k;char line[LINE_LEN];ATOM_NODE *temp;int m,n,o; /*counters for neighbor search*/int cnum;int csize;int counter;int member[MAX_RECORD]; /*which cycle different atoms belong to*/float norms[MAX_RECORD][3]; /*these will be the normals*/float neighbornorms[MAX_RECORD][3]; /*these will be the normals*/float sizes[MAX_RECORD];float nsizes[MAX_RECORD]; /*sizes of the neighboring atoms normals*/float x1,y1,z1,x2,y2,z2; /*these will be for the length of the sides*/float ax,ay,az; /*temporary variables for calculations*/float x3,y3,z3,x4,y4,z4; /*these will be for the length of the sides*/float bx,by,bz; /*temporary variables for calculations*/float cx,cy,cz; /*temporary variables for calculations*/float px,py,pz,qx,qy,qz;/*various vector coeffs*/float p[3];float psize,qsize,theta;/*for each cycle check for aromaticity*/for(i=1;i<cycle_count+1;i++){fprintf(stderr, "checking cycle %d\n",i); counter=1; csize=cycle_size[i]; for(j=0;j<csize;j++)member[j]=-1;for(j=0;j<csize;j++){ m=j+csize-1; n=m%csize; strncpy(line,atmptr+cycles[i][n]*LINE_LEN,LINE_LEN); sscanf(line+31,"%f",&x1); sscanf(line+39,"%f",&y1); sscanf(line+47,"%f",&z1); strncpy(line,atmptr+cycles[i][j]*LINE_LEN,LINE_LEN); sscanf(line+31,"%f",&x2); sscanf(line+39,"%f",&y2); sscanf(line+47,"%f",&z2); ax=x2-x1; ay=y2-y1; az=z2-z1; strncpy(line,atmptr+cycles[i][(j+1)%csize]*LINE_LEN,LINE_LEN); sscanf(line+31,"%f",&x3); sscanf(line+39,"%f",&y3); sscanf(line+47,"%f",&z3); bx=x3-x2; by=y3-y2; bz=z3-z2; px=ay*bz-az*by; py=az*bx-ax*bz; pz=ax*by-ay*bx; p[0]=px; p[1]=py; p[2]=pz; for(k=0;k<3;k++){ norms[j][k]=p[k]; }; psize=sqrt(px*px+py*py+pz*pz); sizes[j]=psize;};/*after computing the normals, test for planarity by computing cos(theta)*/for(j=0;j<csize;j++){ for(k=j+1;k<csize;k++){ px=norms[j][0]; py=norms[j][1]; pz=norms[j][2]; qx=norms[k][0]; qy=norms[k][1]; qz=norms[k][2]; psize=sizes[j]; qsize=sizes[k]; theta=(px*qx+py*qy+pz*qz)/(psize*qsize); if((theta>=0.996||theta<=-0.996) && member[k]==-1){ if(member[j]==-1){ member[j]=j; }; member[k]=member[j]; counter++;/*this keeps track of which cycle pt at k belongs to*/ }; };}; if(counter==csize){ for(j=0;j<csize;j++){ if(*(atmptr+cycles[i][j]*LINE_LEN+13)=='C'){ strncpy(atmptr+cycles[i][j]*LINE_LEN+13,"A",1); fprintf(stderr,"1->changed C to A for atom #%d \n",cycles[i][j]); }; if(*(atmptr+cycles[i][j]*LINE_LEN+12)=='C'){ strncpy(atmptr+cycles[i][j]*LINE_LEN+12,"A",1); fprintf(stderr,"2->changed C to A for atom #%d \n",cycles[i][j]); }; }; };}}void print_out(key1,key2,neighbors)int key1,key2,neighbors;{ int i,j; char rec[7],*chptr; for(j=0;j<7;j++){ rec[j]=0; }; for(j=0;j<7;j++){ rec[j]=*(atmptr+LINE_LEN*key1+j); }; rec[7]='\0'; chptr=rec; if(!key1||!key2){ printf("in print_out with null key\n");if(key1)printf("key1=%d\n",key1);if(key2)printf("key2=%d\n",key2); exit(1); }; if(cflag) sprintf(atmptr+LINE_LEN*key1+offset+6," %3d\n",neighbors); /*printf("%6s%4d %-4s",chptr,key2,atmptr+LINE_LEN*key1+12);*/ fprintf(outfile,"%6s%4d %-4s",chptr,key2,atmptr+LINE_LEN*key1+12);}int check_h(node)ATOM_NODE *node;{ int i,j,k; int nnum; int prevH,prevprevH; int nextH,nextnextH; char rec[7],*chptr; double mk; double mmk; TORS_ANGLE *tmp,*tmp2; prevH=0; nextH=0; mk=atof(atmptr+LINE_LEN*node->id+offset); if(traverse_num==3)node->new_id=outatom++; if(hflag){ for(i=0;i<node->prev_num;i++){if(!num_cycle(node->prev[i])&&!on_list(node->prev[i]->id,rootlist,rootnum)){ mmk=atof(atmptr+LINE_LEN*node->prev[i]->id+offset); prevprevH=0; nextnextH=0; for(j=0;j<node->prev[i]->prev_num;j++){ if((*(atmptr+LINE_LEN*node->prev[i]->id+13)=='C')&& ((*(atmptr+LINE_LEN*node->prev[i]->prev[j]->id+12)=='H')|| (*(atmptr+LINE_LEN*node->prev[i]->prev[j]->id+13)=='H'))){ mmk=mmk+atof(atmptr+LINE_LEN*node->prev[i]->prev[j]->id+offset); nonpolarH++; prevprevH++; node->prev[i]->prev[j]=NULL; };/*if non-polar prev-H*/ };/*for all the prev's prev's*/ for(j=0;j<node->prev[i]->next_num;j++){ if((*(atmptr+LINE_LEN*node->prev[i]->id+13)=='C')&& ((*(atmptr+LINE_LEN*node->prev[i]->next[j]->id+12)=='H')|| (*(atmptr+LINE_LEN*node->prev[i]->next[j]->id+13)=='H'))){ mmk=mmk+atof(atmptr+LINE_LEN*node->prev[i]->next[j]->id+offset); nonpolarH++; nextnextH++; node->prev[i]->next[j]=NULL; };/*if non-polar next-H*/ };/*for all the prev's next's*/ if(traverse_num==1){ for(j=0;j<node->prev[i]->prev_num;j++){ if(!node->prev[i]->prev[j]){ for(k=j+1;k<node->prev[i]->prev_num;k++){ if(node->prev[i]->prev[k]){ node->prev[i]->prev[j]=node->prev[i]->prev[k]; node->prev[i]->prev[k]=NULL; break; };/*if*/ };/*for*/ };/*if*/ };/*for*/ for(j=0;j<node->prev[i]->next_num;j++){ if(!node->prev[i]->next[j]){ for(k=j+1;k<node->prev[i]->next_num;k++){ if(node->prev[i]->next[k]){ node->prev[i]->next[j]=node->prev[i]->next[k]; node->prev[i]->next[k]=NULL; break; };/*if*/ };/*for*/ };/*if*/ };/*for*/ node->prev[i]->prev_num=node->prev[i]->prev_num-prevprevH; node->prev[i]->next_num=node->prev[i]->next_num-nextnextH; if((node->prev[i]->next_num+node->prev[i]->prev_num)==1){ tmp=head_tors; while(tmp){ if((node->prev[i]->id==tmp->id1)||(node->prev[i]->id==tmp->id2)){ if(tmp==head_tors){ head_tors=tmp->next; }else{ tmp2->next=tmp->next; if(tmp==next_tors)next_tors=tmp2; tmp->next=NULL; }; }; tmp2=tmp; tmp=tmp->next; }; }; if(prevprevH+nextnextH){ sprintf(atmptr+LINE_LEN*node->prev[i]->id+offset,"% 4.3f\n",mmk); if(debug)printf("new charge on %d =% 4.3f\n",node->prev[i]->id,mmk); };/*if traverse_num==1*/ };/*for all of current nodes's prev of i-j prevs*/ if((*(atmptr+LINE_LEN*node->id+13)=='C')&& ((*(atmptr+LINE_LEN*node->prev[i]->id+12)=='H')|| (*(atmptr+LINE_LEN*node->prev[i]->id+13)=='H'))){ if(traverse_num==1){ nonpolarH++; prevH++; mk=mk+atof(atmptr+LINE_LEN*node->prev[i]->id+offset); node->prev[i]=NULL; }; }; };/*if not cycle or on rootlist*/ };/*for all i-prev's*/ for(i=0;i<node->next_num;i++){if(!(num_cycle(node->next[i]))&&!(on_list(node->next[i]->id,rootlist,rootnum))){ mmk=atof(atmptr+LINE_LEN*node->next[i]->id+offset); prevprevH=0; nextnextH=0; for(j=0;j<node->next[i]->prev_num;j++){ if((*(atmptr+LINE_LEN*node->next[i]->id+13)=='C')&& ((*(atmptr+LINE_LEN*node->next[i]->prev[j]->id+12)=='H')|| (*(atmptr+LINE_LEN*node->next[i]->prev[j]->id+13)=='H'))){ mmk=mmk+atof(atmptr+LINE_LEN*node->next[i]->prev[j]->id+offset); nonpolarH++; prevprevH++; node->next[i]->prev[j]=NULL; };/*if non-polar prev-H*/ };/*for all the next's prev's*/ for(j=0;j<node->next[i]->next_num;j++){ if((*(atmptr+LINE_LEN*node->next[i]->id+13)=='C')&& ((*(atmptr+LINE_LEN*node->next[i]->next[j]->id+12)=='H')|| (*(atmptr+LINE_LEN*node->next[i]->next[j]->id+13)=='H'))){ mmk=mmk+atof(atmptr+LINE_LEN*node->next[i]->next[j]->id+offset); nonpolarH++; nextnextH++; node->next[i]->next[j]=NULL; };/*if non-polar next-H*/ };/*for all the next's next's*/ if(traverse_num==1){ for(j=0;j<node->next[i]->prev_num;j++){ if(!node->next[i]->prev[j]){ for(k=j+1;k<node->next[i]->prev_num;k++){ if(node->next[i]->prev[k]){ node->next[i]->prev[j]=node->next[i]->prev[k]; node->next[i]->prev[k]=NULL; break; };/*if*/ };/*for*/ };/*if*/ };/*for*/ for(j=0;j<node->next[i]->next_num;j++){ if(!node->next[i]->next[j]){ for(k=j+1;k<node->next[i]->next_num;k++){ if(node->next[i]->next[k]){ node->next[i]->next[j]=node->next[i]->next[k]; node->next[i]->next[k]=NULL; break; };/*if*/ };/*for*/ };/*if*/ };/*for*/ node->next[i]->prev_num=node->next[i]->prev_num-prevprevH; node->next[i]->next_num=node->next[i]->next_num-nextnextH; if((node->next[i]->next_num+node->next[i]->prev_num)==1){ tmp=head_tors; while(tmp){ if((node->next[i]->id==tmp->id1)||(node->next[i]->id==tmp->id2)){ if(tmp==head_tors){ head_tors=tmp->next; }else{ tmp2->next=tmp->next; if(tmp==next_tors)next_tors=tmp2; tmp->next=NULL; }; }; tmp2=tmp; tmp=tmp->next; }; }; if(prevprevH+nextnextH){ sprintf(atmptr+LINE_LEN*node->next[i]->id+offset,"% 4.3f\n",mmk); if(debug)printf("new charge on %d =% 4.3f\n",node->next[i]->id,mmk); };/*if traverse_num==1*/ };/*for all of current nodes's prev of i-j prevs*/ nnum=node->next[i]->next_num+node->next[i]->prev_num; if((*(atmptr+LINE_LEN*node->id+13)=='C')&& ((*(atmptr+LINE_LEN*node->next[i]->id+12)=='H')|| (*(atmptr+LINE_LEN*node->next[i]->id+13)=='H'))){ if(traverse_num==1){ nonpolarH++; nextH++; mk=mk+atof(atmptr+LINE_LEN*node->next[i]->id+offset); node->next[i]=NULL; }; };/*if non-polar H*/ };/*if not on rootlist or cycle*/ };/*for all next's*/ if(traverse_num==1){ for(j=0;j<node->prev_num;j++){ if(!node->prev[j]){ for(k=j+1;k<node->prev_num;k++){ if(node->prev[k]){ node->prev[j]=node->prev[k]; node->prev[k]=NULL; break; };/*if*/ };/*for*/ };/*if*/ };/*for*/ for(j=0;j<node->next_num;j++){ if(!node->next[j]){ for(k=j+1;k<node->next_num;k++){ if(node->next[k]){ node->next[j]=node->next[k]; node->next[k]=NULL; break; };/*if*/ };/*for*/ };/*if*/ };/*for*/ node->prev_num=node->prev_num-prevH; node->next_num=node->next_num-nextH; if((node->next_num+node->prev_num)==1){ tmp=head_tors; while(tmp){ if((node->id==tmp->id1)||(node->id==tmp->id2)){ if(tmp==head_tors){ head_tors=tmp->next; }else{ tmp2->next=tmp->next; if(tmp==next_tors)next_tors=tmp2; tmp->next=NULL; }; }; tmp2=tmp; tmp=tmp->next; }; }; if(prevH+nextH){ sprintf(atmptr+LINE_LEN*node->id+offset,"% 4.3f\n",mk); if(debug)printf("new charge on %d =% 4.3f\n",node->id,mk); }; }; for(j=0;j<7;j++){ rec[j]=0; }; for(j=0;j<7;j++){ rec[j]=*(atmptr+LINE_LEN*node->id+j); }; rec[7]='\0'; chptr=rec; if(traverse_num==4){ if(cflag)sprintf(atmptr+LINE_LEN*node->id+offset+6," %3d\n",node->next_num+node->prev_num); printf("%6s%4d %-4s",chptr,node->new_id,atmptr+LINE_LEN*node->id+12);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -