📄 autotors.c
字号:
}; if(!on_list(node->prev[i]->id,rootlist,rootnum)){ if(s=num_cycle(node->prev[i])){ for(r=0;r<cycle_size[s];r++){ if(!on_list(cycles[s][r],rootlist,rootnum)){ rootlist[rootnum++]=cycles[s][r]; tempr=find_key(cycles[s][r],natom,head); tempr->root=1; }; };/*for all the cycle members*/ }else{ node->prev[i]->root=1; rootlist[rootnum++]=node->prev[i]->id; }; }; }; if(traverse_num==4&&check_tors(node->id,node->prev[i]->id)) fprintf(outfile,"BRANCH %d %d\n",node->new_id,(node->prev[i])->new_id); if(k=num_cycle(node->prev[i])){ newlist=is_cycle(node->prev[i]); traverse_cycle(newlist,k,0,list,index); if(traverse_num==2&&check_tors(node->id,node->prev[i]->id)) nbranch--; if(traverse_num==4&&check_tors(node->id,node->prev[i]->id)) fprintf(outfile,"ENDBRANCH %d %d\n",node->new_id,(node->prev[i])->new_id); }else{ /*if not a cycle*/ visit_prev(node->prev[i],list,index,nlist,nindex); if(traverse_num==2&&check_tors(node->id,node->prev[i]->id)) nbranch--; if(traverse_num==4&&check_tors(node->id,node->prev[i]->id)) fprintf(outfile,"ENDBRANCH %d %d\n",node->new_id,(node->prev[i])->new_id); };/*if a cycle or not if-else*/ }; }; /*for i to prev_num*/ if(traverse_num==2){/*NEED TO LOOK FOR 3H leaves in the case of C, 2 for N if valid tors*/ switch (atmtype(atmptr,node->id)) { case 'C': case 'a': case 'b': if ((node->prev_num==3)&&atmtype(atmptr,node->prev[0]->id)=='H'&&atmtype(atmptr,node->prev[1]->id)=='H'&&atmtype(atmptr,node->prev[2]->id)=='H')torsdof--;break; case 'N': if ((node->prev_num==2)&&atmtype(atmptr,node->prev[0]->id)=='H'&&atmtype(atmptr,node->prev[1]->id)=='H')torsdof--;break; };/*switch*/ };/*end of tordof correction on tn=3*/ break;};/*switch*/}void visit_next(node,list,index,plist,pindex)ATOM_NODE * node;int *list,*index;int *plist,*pindex;{ int i,j,k,r,s,*newlist; int connects; double mk; ATOM_NODE * tempr; if((node->next_num+node->prev_num)==1) return; if(on_list(node->id,list,*index)) return; if(num_cycle(node)){ newlist=is_cycle(node); traverse_cycle(newlist,num_cycle(node),1,list,index); return; }; *(list + * index)=node->id; *index=*(index) + 1; check_h(node); if(traverse_num==1&&!((node->prev_num==1)&&on_list(node->prev[0],list,*index))){ prev_next(node,list,index,plist,pindex); for(k=0;k<*pindex;k++){ *(plist+k)=0; }; *pindex=0; };switch(node->next_num) {case 0 : return;case 1 :connects=node->next[0]->prev_num+node->next[0]->next_num; if(((connects>0)||num_cycle(node->next[0]))&&!on_list(node->next[0]->id,list,*index)){ if(!on_list(node->next[0]->id,rootlist,rootnum)&&connects>1&& traverse_num==1){ if(aflag && is_amide(node)>0)printf("3:found amide next %d\n",node->id); else if(!(bflag && check_back(node,0,'n'))) head_tors=add_tors(node->id,(node->next[0])->id,head_tors); }; if(traverse_num==2&&check_tors(node->id,node->next[0]->id)) nbranch++; if(traverse_num==2&&!nbranch&&!check_tors(node->id,node->next[0]->id)){ if(!on_list(node->id,rootlist,rootnum)){ node->root=1; rootlist[rootnum++]=node->id; }; if(!on_list(node->next[0]->id,rootlist,rootnum)){ if(s=num_cycle(node->next[0])){ for(r=0;r<cycle_size[s];r++){ if(!on_list(cycles[s][r],rootlist,rootnum)){ rootlist[rootnum++]=cycles[s][r]; tempr=find_key(cycles[s][r],natom,head); tempr->root=1; }; };/*for all the cycle members*/ }else{ node->next[0]->root=1; rootlist[rootnum++]=node->next[0]->id; }; }; }; if(traverse_num==4&&check_tors(node->id,node->next[0]->id)) fprintf(outfile,"TORS %d %d\n",node->new_id,node->next[0]->new_id); if(k=num_cycle(node->next[0])){ newlist=is_cycle(node->next[0]); traverse_cycle(newlist,k,1,list,index); if(traverse_num==2&&check_tors(node->id,node->next[0]->id)) nbranch--; if(traverse_num==4&&check_tors(node->id,node->next[0]->id)) fprintf(outfile,"ENDTORS %d %d\n",node->new_id,node->next[0]->new_id); }else{ /*else2*/ visit_next(node->next[0],list,index,plist,pindex); if(traverse_num==2&&check_tors(node->id,node->next[0]->id)) nbranch--; if(traverse_num==4&&check_tors(node->id,node->next[0]->id)) fprintf(outfile,"ENDTORS %d %d\n",node->new_id,node->next[0]->new_id); }; };/*if case1*/ break;default: for(i=0;i<node->next_num;i++){ connects=node->next[i]->prev_num+node->next[i]->next_num; if(((connects>0)||num_cycle(node->next[i]))&&!on_list(node->next[i]->id,list,*index)){ if(!on_list(node->next[i]->id,rootlist,rootnum)&&connects>1&&traverse_num==1){ if(aflag && is_amide(node)>0)printf("4:found amide next %d\n",node->id); else if(!(bflag && check_back(node,i,'n'))) head_tors=add_tors(node->id,node->next[i]->id,head_tors); }; if(traverse_num==2&&check_tors(node->id,node->next[i]->id)) nbranch++; if(traverse_num==2&&!nbranch&&!check_tors(node->id,node->next[i]->id)){ if(!on_list(node->id,rootlist,rootnum)){ node->root=1; rootlist[rootnum++]=node->id; }; if(!on_list(node->next[i]->id,rootlist,rootnum)){ if(s=num_cycle(node->next[i])){ for(r=0;r<cycle_size[s];r++){ if(!on_list(cycles[s][r],rootlist,rootnum)){ rootlist[rootnum++]=cycles[s][r]; tempr=find_key(cycles[s][r],natom,head); tempr->root=1; }; };/*for all the cycle members*/ }else{ node->next[i]->root=1; rootlist[rootnum++]=node->next[i]->id; }; }; }; if(traverse_num==4&&check_tors(node->id,node->next[i]->id)){ fprintf(outfile,"BRANCH %d %d\n",node->new_id,node->next[i]->new_id); }; if(k=num_cycle(node->next[i])){ newlist=is_cycle(node->next[i]); traverse_cycle(newlist,k,1,list,index); if(traverse_num==2&&check_tors(node->id,node->next[i]->id)) nbranch--; if(traverse_num==4&&check_tors(node->id,node->next[i]->id)){ fprintf(outfile,"ENDBRANCH %d %d\n",node->new_id,node->next[i]->new_id); }; }else{ /*else2*/ visit_next(node->next[i],list,index,plist,pindex); if(traverse_num==2&&check_tors(node->id,node->next[i]->id)) nbranch--; if(traverse_num==4&&check_tors(node->id,node->next[i]->id)) fprintf(outfile,"ENDBRANCH %d %d\n",node->new_id,node->next[i]->new_id); }; }; };/*forall nexts*/ if(traverse_num==2){/*NEED TO LOOK FOR 3 H leaves in the case of C, 2 for N if valid tors*/ switch (atmtype(atmptr,node->id)){ case 'a': case 'b': if ((node->next_num==3)&&atmtype(atmptr,node->next[0]->id)=='H'&&atmtype(atmptr,node->next[1]->id)=='H'&&atmtype(atmptr,node->next[2]->id)=='H')torsdof--;break;/*need to decrement torsdof*/ case 'N': if ((node->next_num==3)&&atmtype(atmptr,node->next[0]->id)=='H'&&atmtype(atmptr,node->next[1]->id)=='H')torsdof--;break; };/*switch*/ };/*end of tordof correction on tn=3*/ break; /*for the nexts*/};/*switch on node->next_num*/}void traverse_cycle(cyclelist,cyclenum,to_next,tlist,tnum)int *cyclelist,cyclenum,to_next;int *tlist,*tnum;{ int i,j,k,m,n,r,p_num,n_num,connect_num,h_num; int prev_con, next_con; int connects; int np_num; int *nplist, *np_index; double mk; char rec[7],*chptr;/*for firstpart ofoutput*/ ATOM_NODE * temp1,* temp2; TORS_ANGLE * tempt; nplist=(int*) calloc(natom,sizeof(n_num)); np_index=(int*) calloc(1,sizeof(n_num)); *np_index=0;if(!cyclelist){ printf("error in traverse_cycle\n"); exit(1); }; n=cycle_size[cyclenum]; for(i=0;i<n;i++){ temp1=find_key(cyclelist[i],n,head); if(!temp1){ printf("error in finding %d\n",cyclelist[i]); exit(1); }; if(!on_list(cyclelist[i],tlist,*tnum)){ *(tlist + *tnum)=cyclelist[i]; *tnum=(*tnum)+1; }; if(traverse_num==2&&!nbranch&&!on_list(cyclelist[i],rootlist,rootnum)){ rootlist[rootnum++]=cyclelist[i]; }; check_h(temp1); connect_num=temp1->prev_num + temp1->next_num; p_num=temp1->prev_num; n_num=temp1->next_num;/*printf("tc:switching on %d's p_num=%d,n_num=%d\n",temp1->id,p_num,n_num);*/ switch(connect_num){ case 0 : break; case 1 : printf("error in traverse_cycle:cycle with 1 connection\n"); exit(1); case 2 : for(j=0;j<p_num;j++){ if(!on_list(temp1->prev[j]->id,rootlist,rootnum)&&!on_list(temp1->prev[j]->id,tlist,*tnum)){ if(!eq_cycle(temp1->prev[j]->id,temp1->id)){ connects=temp1->prev[j]->prev_num+temp1->prev[j]->next_num; if(traverse_num==1){ if(!to_next) next_prev(temp1->prev[j],tlist,tnum,nplist,np_index); if(to_next) prev_next(temp1->prev[j],tlist,tnum,nplist,np_index); for(k=0;k<*np_index;k++){ *(nplist+k)=0; }; *np_index=0; if(aflag && is_amide(temp1)<0)printf("5:found amide prev %d\n",temp1->id); else if(connects>1&&!(bflag&&check_back(temp1,j,'p'))) head_tors=add_tors(temp1->id,temp1->prev[j]->id,head_tors); }; if(traverse_num==2&&check_tors(temp1->id,temp1->prev[j]->id)) nbranch++; if(traverse_num==2&&!nbranch&&!check_tors(temp1->id,temp1->prev[j]->id)){ if(!on_list(temp1->id,rootlist,rootnum)){ temp1->root=1; rootlist[rootnum++]=temp1->id; }; if(!on_list(temp1->prev[j]->id,rootlist,rootnum)){ temp1->prev[j]->root=1; rootlist[rootnum++]=temp1->prev[j]->id; }; }; if(traverse_num==4&&check_tors(temp1->id,temp1->prev[j]->id)) fprintf(outfile,"TORS %d %d\n",temp1->new_id,temp1->prev[j]->new_id); visit_prev(temp1->prev[j],tlist,tnum,nplist,np_index); if(traverse_num==2&&check_tors(temp1->id,temp1->prev[j]->id)) nbranch--; if(traverse_num==4&&check_tors(temp1->id,temp1->prev[j]->id)){ fprintf(outfile,"ENDTORS %d %d\n",temp1->new_id,temp1->prev[j]->new_id); }; }; };/*if not on rootlist and not on tlist*/ };/*case2:prevs*/ for(j=0;j<n_num;j++){ if(!on_list(temp1->next[j]->id,rootlist,rootnum)&&!on_list(temp1->next[j]->id,tlist,*tnum)){ if(!eq_cycle(temp1->next[j]->id,temp1->id)){ connects=temp1->next[j]->prev_num+temp1->next[j]->next_num; if(traverse_num==1){ if(!to_next) next_prev(temp1->next[j],tlist,tnum,nplist,np_index); if(to_next) prev_next(temp1->next[j],tlist,tnum,nplist,np_index); for(k=0;k<*np_index;k++){ *(nplist+k)=0; }; *np_index=0; if(aflag && is_amide(temp1)>0)printf("6:found amide next %d\n",temp1->id); else if(connects>1&&!(bflag&&check_back(temp1,j,'n'))) head_tors=add_tors(temp1->id,temp1->next[j]->id,head_tors); }; if(traverse_num==2&&check_tors(temp1->id,temp1->next[j]->id)) nbranch++; if(traverse_num==2&&!nbranch&&!check_tors(temp1->id,temp1->next[j]->id)){ if(!on_list(temp1->id,rootlist,rootnum)){ temp1->root=1; rootlist[rootnum++]=temp1->id; }; if(!on_list(temp1->next[j]->id,rootlist,rootnum)){ temp1->next[j]->root=1; rootlist[rootnum++]=temp1->next[j]->id; }; }; if(traverse_num==4&&check_tors(temp1->id,temp1->next[j]->id)) fprintf(outfile,"TORS %d %d\n",temp1->new_id,temp1->next[j]->new_id); visit_next(temp1->next[j],tlist,tnum,nplist,np_index); if(traverse_num==2&&check_tors(temp1->id,temp1->next[j]->id)) nbranch--; if(traverse_num==4&&check_tors(temp1->id,temp1->next[j]->id)) fprintf(outfile,"ENDTORS %d %d\n",temp1->new_id,temp1->next[j]->new_id); };/*!num_cycle*/ };/*!on_list*/ };/*for case 2 nexts*/ break; default : for(j=0;j<p_num;j++){ prev_con=temp1->prev[j]->prev_num+temp1->prev[j]->next_num; if(!on_list(temp1->prev[j]->id,rootlist,rootnum)&&!on_list(temp1->prev[j]->id,tlist,*tnum)){ if(!eq_cycle(temp1->prev[j]->id,temp1->id)){ if(traverse_num==1){ if(!to_next){ next_prev(temp1->prev[j],tlist,tnum,nplist,np_index); }; if(to_next) prev_next(temp1->prev[j],tlist,tnum,nplist,np_index); for(k=0;k<*np_index;k++){ *(nplist+k)=0; }; *np_index=0; if((traverse_num==1)&&(prev_con>1)){ if(aflag && is_amide(temp1)<0)printf("7:found amide prev %d\n",temp1->id); else if(!(bflag&&check_back(temp1,j,'p'))) head_tors=add_tors(temp1->id,(temp1->prev[j])->id,head_tors); }; };/*first traversal*/ if(traverse_num==2&&check_tors(temp1->id,temp1->prev[j]->id)) nbranch++; if(traverse_num==2&&!nbranch&&!check_tors(temp1->id,temp1->prev[j]->id)){ if(!on_list(temp1->id,rootlist,rootnum)){ temp1->root=1; rootlist[rootnum++]=temp1->id; }; if(!on_list(temp1->prev[j]->id,rootlist,rootnum)){ temp1->prev[j]->root=1; rootlist[rootnum++]=temp1->prev[j]->id; }; }; if(traverse_num==4&&check_tors(temp1->id,temp1->prev[j]->id)) fprintf(outfile,"BRANCH %d %d\n",temp1->new_id,temp1->prev[j]->new_id); /*in any case visit the node*/ visit_prev(temp1->prev[j],tlist,tnum,nplist,np_index); if(traverse_num==2&&check_tors(temp1->id,temp1->prev[j]->id)) nbranch--; if(traverse_num==4&&check_tors(temp1->id,temp1->prev[j]->id)) fprintf(outfile,"ENDBRANCH %d %d\n",temp1->new_id,temp1->prev[j]->new_id); };/*not a cycle atom*/ };/*not previously visited*/ }; /*for-prev*/ for(j=0;j<n_num;j++) { next_con=temp1->next[j]->prev_num+temp1->next[j]->next_num; if(!on_list(temp1->next[j]->id,rootlist,rootnum)&&!on_list(temp1->next[j]->id,tlist,*tnum)){ if(!eq_cycle(temp1->next[j]->id,temp1->id)){ if(traverse_num==1){ if(!to_next) next_prev(temp1->next[j],tlist,tnum,nplist,np_index); if(to_next) prev_next(temp1->next[j],tlist,tnum,nplist,np_index); for(k=0;k<*np_index;k++){ *(nplist+k)=0; }; *np_index=0; if(traverse_num==1&&(next_con>1)){ if(aflag && is_amide(temp1)>0)printf("8:found amide next %d\n",temp1->id); else if(!(bflag&&check_back(temp1,j,'n'))) head_tors=add_tors(temp1->id,temp1->next[j]->id,head_tors); }; };/*first traversal*/ if(traverse_num==2&&check_tors(temp1->id,temp1->next[j]->id)) nbranch++; if(traverse_num==2&&!nbranch&&!check_tors(temp1->id,temp1->next[j]->id)){ if(!on_list(temp1->id,rootlist,rootnum)){ temp1->root=1; rootlist[rootnum++]=temp1->id; }; if(!on_list(temp1->next[j]->id,rootlist,rootnum)){ temp1->next[j]->root=1; rootlist[rootnum++]=temp1->next[j]->id; }; }; if(traverse_num==4&&check_tors(temp1->id,temp1->next[j]->id)) fprintf(outfile,"BRANCH %d %d\n",temp1->new_id,temp1->next[j]->new_id); /* any case visit the node*/ visit_next(temp1->next[j],tlist,tnum,nplist,np_index); if(traverse_num==2&&check_tors(temp1->id,temp1->next[j]->id)) nbranch--; if(traverse_num==4&&check_tors(temp1->id,temp1->next[j]->id)) fprintf(outfile,"ENDBRANCH %d %d\n",temp1->new_id,temp1->next[j]->new_id); }; }; }; /*for-next*/ break;}; /*end of switch on to_next statement*/};/*for each node*/ /*free(nplist);*/}void traverse(rootlist,root_num,con_num)int rootlist[],root_num,con_num;{ int i,j,k,n,p_num,n_num,connect_num,h_num; int *newlist; int prev_con, next_con; int *travlist,trav_index; int np_num; int *nplist,*np_index; double mk; char rec[7],*chptr;/*for firstpart ofoutput*/ ATOM_NODE * temp_root,* temp; h_num=0; trav_index=0; np_num=0; np_index=&np_num; n=0; travlist = (int*) calloc (con_num,sizeof(next_con)); nplist = (int*) calloc (con_num,sizeof(next_con)); if(traverse_num==4)fprintf(outfile,"ROOT\n"); for(i=0;i<root_num;i++){ temp_root=find_key(rootlist[i],con_num,head); if(!temp_root){ printf("error in finding %d\n",rootlist[i]); exit(1); }; *(travlist + trav_index)=rootlist[i]; trav_index++; check_h(temp_root); };/*end of first for loop on all the roots*/ /*at this point update outatom*/ outatom=outatom+h_num; if(traverse_num==4)fprintf(outfile,"ENDROOT\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -