ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/freemol/trunk/src/mengine/src/rings.c
(Generate patch)
# Line 1 | Line 1
1   #define EXTERN extern
2  
3   #include "pcwin.h"
4 #include "pcmod.h"
4   #include "rings.h"
5 + #include "utility.h"
6  
7 <
7 > int have_ring3(void);
8 > int have_ring4(void);
9 > int have_ring5(void);
10 > int have_ring6(void);
11   int isbond(int, int);
12   int is_ring31(int);
13   int is_ring41(int);
# Line 26 | Line 29
29   int is_cyclo6(int, int *);
30   int find_rsize(int, int);
31   void get_rsize(int,int,int,int *);
32 < int aromatic_5(int *);
33 < int aromatic_6(int *);
34 <
32 > int aromatic_5(int *array,long int *flags,int *atomnum,int **,int **);
33 > int aromatic_6(int *,long int *flags,int *atomnum,int **,int **);
34 > void get_rings(int natom,long int *flags,int *atomnum,int **iat,int **bo);
35 > void allocate_rings(int niatom);
36 > int check_ring1(int);
37 >
38 > // ===========================
39 > void allocate_rings(int niatom)
40 > {
41 >  rings.nring3 = 0;
42 >  rings.nring4 = 0;
43 >  rings.nring5 = 0;
44 >  rings.nring6 = 0;
45 >  rings.r13 = imatrix(0,(niatom+10)/3, 0,3);
46 >  rings.r14 = imatrix(0,(niatom+10)/4, 0,4);
47 >  rings.r15 = imatrix(0,(niatom+10)/5, 0,5);
48 >  rings.r16 = imatrix(0,(niatom+10)/2, 0,6);
49 > }
50 > // ======================
51 > int have_ring3()
52 > {
53 >  if (rings.nring3 > 0)
54 >    return TRUE;
55 >  else
56 >    return FALSE;
57 > }
58 > int have_ring4()
59 > {
60 >  if (rings.nring4 > 0)
61 >    return TRUE;
62 >  else
63 >    return FALSE;
64 > }
65 > int have_ring5()
66 > {
67 >  if (rings.nring5 > 0)
68 >    return TRUE;
69 >  else
70 >    return FALSE;
71 > }
72 > int have_ring6()
73 > {
74 >  if (rings.nring6 > 0)
75 >    return TRUE;
76 >  else
77 >    return FALSE;
78 > }
79   /* --------------------------------------------------------- */
80   // iatom is atom number to search on
81   // isize = ring size
# Line 508 | Line 555
555      return (FALSE);
556   }
557   /* -------------------------------------------------------- */    
558 < void get_rings()
558 > void get_rings(int natom,long int *flags,int *atomnum,int **iat,int **bo)
559   {
560    int i,j, add_ring, k, l, m, n,ij,isix;
561     int jatm,katm,latm,matm,xatm;
# Line 526 | Line 573
573       {
574         for (j=0; j < MAXIAT; j++)
575           {
576 <           if (atom[i].iat[j] != 0)
576 >           if (iat[i][j] != 0)
577               {
578 <               jatm = atom[i].iat[j];
578 >               jatm = iat[i][j];
579                 for (k=0; k < MAXIAT; k++)
580                   {
581 <                   if (atom[jatm].iat[k] != 0 && atom[jatm].iat[k] != i)
581 >                   if (iat[jatm][k] != 0 && iat[jatm][k] != i)
582                       {
583 <                       if (isbond(i,atom[jatm].iat[k]))
583 >                       if (isbond(i,iat[jatm][k]))
584                           {
585                             array[0] = i;
586                             array[1] = jatm;
587 <                           array[2] = atom[jatm].iat[k];
587 >                           array[2] = iat[jatm][k];
588                             ksort(3,array);
589                             add_ring = TRUE;
590                             for (j = 0; j < rings.nring3; j++)
# Line 569 | Line 616
616     {
617         for(j=0; j < MAXIAT; j++)
618         {
619 <           if (atom[i].iat[j] != 0)
619 >           if (iat[i][j] != 0)
620             {
621 <               jatm = atom[i].iat[j];
621 >               jatm = iat[i][j];
622                 for (k=0; k < MAXIAT; k++)
623                 {
624 <                   if (atom[jatm].iat[k] != 0 && atom[jatm].iat[k] != i)
624 >                   if (iat[jatm][k] != 0 && iat[jatm][k] != i)
625                     {
626 <                       katm = atom[jatm].iat[k];
626 >                       katm = iat[jatm][k];
627                         if (!(isbond(katm,i)))
628                         {
629                             for(l=0; l < MAXIAT; l++)
630                             {
631 <                               if (atom[katm].iat[l] != 0 && atom[katm].iat[l] != jatm)
631 >                               if (iat[katm][l] != 0 && iat[katm][l] != jatm)
632                                 {
633 <                                   if (isbond(i,atom[katm].iat[l]) )
633 >                                   if (isbond(i,iat[katm][l]) )
634                                     {
635                                          array[0] = i;
636                                          array[1] = jatm;
637                                          array[2] = katm;
638 <                                        array[3] = atom[katm].iat[l];
638 >                                        array[3] = iat[katm][l];
639                                          ksort(4, array);
640                                          if ( is_ring44(array) == FALSE )
641                                          {          
# Line 614 | Line 661
661     {
662         for(j=0; j < MAXIAT; j++)
663         {
664 <           if (atom[i].iat[j] != 0)
664 >           if (iat[i][j] != 0)
665             {
666 <               jatm = atom[i].iat[j];
666 >               jatm = iat[i][j];
667                 for (k=0; k < MAXIAT; k++)
668                 {
669 <                   if (atom[jatm].iat[k] != 0 && atom[jatm].iat[k] != i)
669 >                   if (iat[jatm][k] != 0 && iat[jatm][k] != i)
670                     {
671 <                       katm = atom[jatm].iat[k];
671 >                       katm = iat[jatm][k];
672                         if (!(isbond(katm,i)))
673                         {
674                             for(l=0; l < MAXIAT; l++)
675                             {
676 <                               if (atom[katm].iat[l] != 0 && atom[katm].iat[l] != jatm)
676 >                               if (iat[katm][l] != 0 && iat[katm][l] != jatm)
677                                 {
678 <                                 latm = atom[katm].iat[l];
678 >                                 latm = iat[katm][l];
679                                   for (m=0; m < MAXIAT; m++)
680                                     {
681 <                                     if (atom[latm].iat[m] != 0 && atom[latm].iat[m] != katm && atom[latm].iat[m] != jatm)
681 >                                     if (iat[latm][m] != 0 && iat[latm][m] != katm && iat[latm][m] != jatm)
682                                         {
683 <                                         if (isbond(i,atom[latm].iat[m]))
683 >                                         if (isbond(i,iat[latm][m]))
684                                             {
685                                               array[0] = i;
686                                               array[1] = jatm;
687                                               array[2] = katm;
688                                               array[3] = latm;
689 <                                             array[4] = atom[latm].iat[m];
689 >                                             array[4] = iat[latm][m];
690                                               ksort(5,array);
691                                               if (is_ring55(array) == FALSE)
692                                                 {
# Line 651 | Line 698
698                                                   rings.nring5++;
699                                                   if (rings.nring5 >= MAXATOM/5)
700                                                     message_alert("Error. Too many 5 membered rings!","ERROR");
701 <                                                 isix = aromatic_5(array);
701 >                                                 isix = aromatic_5(array,flags,atomnum,iat,bo);
702                                                   if (isix == TRUE)
703                                                     {
704                                                        for (ij = 0; ij < 5; ij++)
705 <                                                         atom[array[ij]].flags |= aromatic_mask;
705 >                                                         flags[array[ij]] |= aromatic_mask;
706                                                     }
707                                                 }
708                                             }
# Line 674 | Line 721
721     {
722         for(j=0; j < MAXIAT; j++)
723         {
724 <           if (atom[i].iat[j] != 0)
724 >           if (iat[i][j] != 0)
725             {
726 <               jatm = atom[i].iat[j];
726 >               jatm = iat[i][j];
727                 for (k=0; k < MAXIAT; k++)
728                 {
729 <                   if (atom[jatm].iat[k] != 0 && atom[jatm].iat[k] != i)
729 >                   if (iat[jatm][k] != 0 && iat[jatm][k] != i)
730                     {
731 <                       katm = atom[jatm].iat[k];
731 >                       katm = iat[jatm][k];
732                         if (!(isbond(katm,i)))
733                         {
734                             for(l=0; l < MAXIAT; l++)
735                             {
736 <                               if (atom[katm].iat[l] != 0 && atom[katm].iat[l] != jatm)
736 >                               if (iat[katm][l] != 0 && iat[katm][l] != jatm)
737                                 {
738 <                                 latm = atom[katm].iat[l];
738 >                                 latm = iat[katm][l];
739                                   for (m=0; m < MAXIAT; m++)
740                                     {
741 <                                     if (atom[latm].iat[m] != 0 && atom[latm].iat[m] != katm && atom[latm].iat[m] != jatm)
741 >                                     if (iat[latm][m] != 0 && iat[latm][m] != katm && iat[latm][m] != jatm)
742                                         {
743 <                                         xatm = atom[latm].iat[m];
743 >                                         xatm = iat[latm][m];
744                                           for (n = 0; n < MAXIAT; n++)
745                                             {
746 <                                             if (atom[xatm].iat[n] != 0 && atom[xatm].iat[n] != latm && atom[xatm].iat[n] != katm)
747 <                                               if (isbond(i,atom[xatm].iat[n]))
746 >                                             if (iat[xatm][n] != 0 && iat[xatm][n] != latm && iat[xatm][n] != katm)
747 >                                               if (isbond(i,iat[xatm][n]))
748                                                   {
749                                                     array[0] = i;
750                                                     array[1] = jatm;
751                                                     array[2] = katm;
752                                                     array[3] = latm;
753                                                     array[4] = xatm;
754 <                                                   array[5] = atom[xatm].iat[n];
754 >                                                   array[5] = iat[xatm][n];
755                                                     ksort(6,array);
756                                                     if (is_ring66(array) == FALSE)
757                                                       {
# Line 717 | Line 764
764                                                         rings.nring6++;
765                                                         if (rings.nring6 >= MAXATOM/6)
766                                                           message_alert("Error. Too many 6 membered rings!","ERROR");
767 <                                                       isix = aromatic_6(array);
767 >                                                       isix = aromatic_6(array,flags,atomnum,iat,bo);
768                                                         if (isix == TRUE)
769                                                           {
770                                                             for (ij = 0; ij < 6; ij++)
771 <                                                             atom[array[ij]].flags |= aromatic_mask;
771 >                                                             flags[array[ij]] |= aromatic_mask;
772                                                           }
773                                                       }
774                                                   }
# Line 759 | Line 806
806         goto L_1;
807   }
808   /* --------------------------------------------------------- */
809 < int aromatic_5(int *array)
809 > int aromatic_5(int *array,long int *flags,int *atomnum,int **iat,int **bo)
810   {
811      int i,j,k, jatm, katm;
812      int nodbl, npi;
# Line 783 | Line 830
830              {
831                  for (k=0; k < MAXIAT; k++)
832                  {
833 <                    if (atom[jatm].iat[k] == katm)
833 >                    if (iat[jatm][k] == katm)
834                      {
835 <                        if (atom[jatm].bo[k] == 2)
835 >                        if (bo[jatm][k] == 2)
836                          {
837                              db[npi] = i+j;
838                              npi++;
839 <                        }else if ( (atom[jatm].flags & aromatic_mask && atom[jatm].flags & mask6 )
840 <                                 && (atom[katm].flags & aromatic_mask && atom[katm].flags & mask6 ))
839 >                        }else if ( (flags[jatm] & aromatic_mask && flags[jatm] & mask6 )
840 >                                 && (flags[katm] & aromatic_mask && flags[katm] & mask6 ))
841                          {
842                              db[npi] = i+j;
843                              npi++;
# Line 803 | Line 850
850      for (i=0; i < 5; i++)
851      {
852          jatm = array[i];
853 <        if (atom[jatm].atomnum != 6)
853 >        if (atomnum[jatm] != 6)
854          {
855              nodbl = FALSE;
856              for(j=0; j < MAXIAT; j++)
857              {
858 <                if (atom[jatm].iat[j] != 0)
858 >                if (iat[jatm][j] != 0)
859                  {
860 <                    if (atom[jatm].bo[j] > 1 && atom[jatm].bo[j] != 9)
860 >                    if (bo[jatm][j] > 1 && bo[jatm][j] != 9)
861                         nodbl = TRUE;
862                  }
863              }
# Line 863 | Line 910
910                {
911                   if (rings.r16[i][j] == ib)
912                   {
913 <                     if (atom[ib].flags & aromatic_mask)
913 >                     if (flags[ib] & aromatic_mask)
914                         return TRUE;
915                   }
916                   if (rings.r16[i][j] == ic)
917                   {
918 <                     if (atom[ic].flags & aromatic_mask)
918 >                     if (flags[ic] & aromatic_mask)
919                         return TRUE;
920                   }
921                }
# Line 881 | Line 928
928                {
929                   if (rings.r16[i][j] == ia)
930                   {
931 <                     if (atom[ia].flags & aromatic_mask)
931 >                     if (flags[ia] & aromatic_mask)
932                         return TRUE;
933                   }
934                   if (rings.r16[i][j] == ic)
935                   {
936 <                     if (atom[ic].flags & aromatic_mask)
936 >                     if (flags[ic] & aromatic_mask)
937                         return TRUE;
938                   }
939                }
# Line 899 | Line 946
946                {
947                   if (rings.r16[i][j] == ib)
948                   {
949 <                     if (atom[ib].flags & aromatic_mask)
949 >                     if (flags[ib] & aromatic_mask)
950                         return TRUE;
951                   }
952                   if (rings.r16[i][j] == ia)
953                   {
954 <                     if (atom[ia].flags & aromatic_mask)
954 >                     if (flags[ia] & aromatic_mask)
955                         return TRUE;
956                   }
957                }
# Line 914 | Line 961
961      return FALSE;                  
962   }
963   /* --------------------------------------------------------- */
964 < int aromatic_6(int *array)
964 > int aromatic_6(int *array,long int *flags,int *atomnum,int **iat,int **bo)
965   {
966      int i,j,k, ia,ib, idbl,kdbl;
967      int num, inarray[10];
# Line 933 | Line 980
980          {
981              for (k=0; k < MAXIAT; k++)
982              {
983 <                if (atom[ia].iat[k] == array[j])
983 >                if (iat[ia][k] == array[j])
984                  {
985 <                    if (atom[ia].bo[k] == 2)
985 >                    if (bo[ia][k] == 2)
986                      {
987                         num++;
988                         inarray[i] = TRUE;
# Line 960 | Line 1007
1007                      if (inarray[j] == FALSE)
1008                      {
1009                          ib = array[j];
1010 <                        if ( (atom[ia].flags & aromatic_mask) && (atom[ib].flags & aromatic_mask))
1010 >                        if ( (flags[ia] & aromatic_mask) && (flags[ib] & aromatic_mask))
1011                          {
1012                             num++;
1013                             if (num == 3)
# Line 971 | Line 1018
1018                             kdbl = FALSE;
1019                             for(k=0; k < MAXIAT; k++)
1020                             {
1021 <                              if (atom[ia].iat[k] !=0 && atom[ia].bo[k] == 2)
1021 >                              if (iat[ia][k] !=0 && bo[ia][k] == 2)
1022                                {
1023 <                                 if (atom[atom[ia].iat[k]].atomnum == 6 || atom[atom[ia].iat[k]].atomnum == 7)
1023 >                                 if (atomnum[iat[ia][k]] == 6 || atomnum[iat[ia][k]] == 7)
1024                                   {
1025 <                                     if (atom[atom[ia].iat[k]].flags & mask6)
1025 >                                     if (flags[iat[ia][k]] & mask6)
1026                                           idbl = TRUE;
1027                                   }
1028                                }
1029 <                              if (atom[ib].iat[k] !=0 && atom[ib].bo[k] == 2)
1029 >                              if (iat[ib][k] !=0 && bo[ib][k] == 2)
1030                                {
1031 <                                 if (atom[atom[ib].iat[k]].atomnum == 6 || atom[atom[ib].iat[k]].atomnum == 7)
1031 >                                 if (atomnum[iat[ib][k]] == 6 || atomnum[iat[ib][k]] == 7)
1032                                   {
1033 <                                     if (atom[atom[ib].iat[k]].flags & mask6)
1033 >                                     if (flags[iat[ib][k]] & mask6)
1034                                           kdbl = TRUE;
1035                                   }
1036                                }
# Line 1004 | Line 1051
1051      }
1052      return FALSE;
1053   }
1054 + // ==================================
1055 + int check_ring1(int ia)
1056 + {
1057 +    if (is_ring61(ia)) return TRUE;
1058 +    if (is_ring51(ia)) return TRUE;
1059 +    if (is_ring31(ia)) return TRUE;
1060 +    if (is_ring41(ia)) return TRUE;
1061 +    return FALSE;
1062 + }
1063  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines