ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/freemol/trunk/src/mengine/src/type_mmx.c
(Generate patch)
# Line 6 | Line 6
6  
7   void set_atomtype(int,int,int,int);
8   void set_atomtypes(int);
9 < int is_cyclo3(int, int *);
10 < int is_cyclo4(int, int *);
9 > int is_ring31(int);
10 > int is_ring41(int);
11 > int is_ring51(int);
12 > int is_ring61(int);
13   int is_cyclo5(int, int *);
12 int is_cyclo6(int, int *);
14   int isbond(int,int);
15   int aromatic_5(int,int *);
16   int aromatic_6(int *);
16 void search_rings(int);
17   int find_rsize(int,int);
18   void get_rsize(int,int,int, int *);
19   int icompare(int, int *, int *);
# Line 21 | Line 21
21   void bbchk(void);
22   void deletebond(int,int);
23  
24 EXTERN struct t_ringdata {
25        int nring3, nring4, nring5, nring6;
26        int tot3, tot4, tot5, tot6;
27        int **iring3,**iring4,**iring5,**iring6;
28       }  ringdata;
29
30
24   void type_mmx()
25   {
26     int i, j, ij, jji, jjk, jjbo, jj_bo, iatype,nh;
# Line 61 | Line 54
54     type_mask = (1L << NO_RETYPE);
55     if (have_pi == FALSE)  // if we already have pi no need to mark
56        bbchk();
64   search_rings(0);
57  
58     for (i=1; i <= natom; i++)
59     {
# Line 976 | Line 968
968                        mmxtype = 3;
969                        mm3type = 3;
970                        mmfftype = 3;
971 <                      if (is_cyclo3(i,array))          // cyclopropanone
971 >                      if (is_ring31(i))          // cyclopropanone
972                            mm3type = 67;
973 <                      else if (is_cyclo4(i,array))   // cyclobutanone
973 >                      else if (is_ring41(i))   // cyclobutanone
974                            mm3type = 58;
975                        else                     // carboxylate
976                        {
# Line 1105 | Line 1097
1097                        mmxtype = 2;
1098                        mm3type = 2;
1099                        mmfftype = 2;
1100 <                      if (is_cyclo3(i,array))    // cyclopropene
1100 >                      if (is_ring31(i))    // cyclopropene
1101                        {
1102                            mm3type = 38;
1103                            goto L_10;
1104                        }
1105 <                      if (is_cyclo4(i,array))  // cyclobutene
1105 >                      if (is_ring41(i))  // cyclobutene
1106                        {
1107                            mmxtype = 57;
1108                            mm3type = 57;
# Line 1132 | Line 1124
1124                mmxtype = 1;
1125                mm3type = 1;
1126                mmfftype = 1;
1127 <              if (is_cyclo3(i,array))
1127 >              if (is_ring31(i))
1128                {
1129                    mmxtype = 22;
1130                    mm3type = 22;
1131                    mmfftype = 22;
1132                    goto L_10;
1133 <              } else if (is_cyclo4(i,array))
1133 >              } else if (is_ring41(i))
1134                {
1135                    mmxtype = 56;
1136                    mm3type = 56;
# Line 2472 | Line 2464
2464                        
2465                    }
2466                    // test for epoxides
2467 <                  if (is_cyclo3(i,array))
2467 >                  if (is_ring31(i))
2468                    {
2469                        mm3type = 49;
2470                        mmfftype = 6;
2471                        goto L_10;
2472                    }
2473 <                  if (is_cyclo5(i,array))
2473 >                  if (is_ring51(i))
2474                    {
2475                       if (atom[i].flags & aromatic_mask)
2476                       {
# Line 2732 | Line 2724
2724                    mmxtype = 15;
2725                    mm3type = 15;
2726                    mmfftype = 15;
2727 <                  if (is_cyclo5(i,array))  // thiophene
2727 >                  if (is_ring51(i))  // thiophene
2728                    {
2729                        if (atom[i].flags & aromatic_mask)
2730                        {
# Line 2842 | Line 2834
2834            continue;  // do nothing
2835        }
2836     }
2845   search_rings(-1);
2837     set_atomtypes(field.type);
2838   }
2839   /* --------------------------------------------------------- */
2849 int is_cyclo3(int ia, int *array)
2850 {
2851    int i,k;
2852    int jatm;
2853
2854    for(i = 0; i < MAXIAT; i++)
2855    {
2856        if (atom[ia].iat[i] != 0 && atom[ia].bo[i] != 9 && atom[atom[ia].iat[i]].atomnum != 1)
2857        {
2858            jatm = atom[ia].iat[i];
2859            for(k=0; k < MAXIAT; k++)
2860            {
2861                if (atom[jatm].iat[k] != 0 && atom[jatm].iat[k] != ia && atom[jatm].bo[k] != 9 && atom[atom[jatm].iat[k]].atomnum != 1)
2862                {
2863                    if (isbond(ia,atom[jatm].iat[k]))
2864                    {
2865                       array[0] = ia;
2866                       array[1] = jatm;
2867                       array[2] = atom[jatm].iat[k];
2868                       return TRUE;
2869                    }
2870                }
2871            }
2872        }
2873    }
2874    return FALSE;
2875 }
2876 /* --------------------------------------------------------- */
2877 int is_cyclo4(int ia, int *array)
2878 {
2879    int i,k,l;
2880    int jatm,katm;
2881
2882    for(i = 0; i < MAXIAT; i++)
2883    {
2884        if (atom[ia].iat[i] != 0 && atom[ia].bo[i] != 9)
2885        {
2886            jatm = atom[ia].iat[i];
2887            for(k=0; k < MAXIAT; k++)
2888            {
2889                if (atom[jatm].iat[k] != 0 && atom[jatm].iat[k] != ia && atom[jatm].bo[k] != 9)
2890                {
2891                    katm = atom[jatm].iat[k];
2892                    for (l=0; l < MAXIAT; l++)
2893                    {
2894                        if (atom[katm].iat[l] != 0 && atom[katm].iat[l] != jatm && atom[katm].bo[l] != 9)
2895                        {
2896                            if (isbond(ia,atom[katm].iat[l]))
2897                            {
2898                               array[0] = ia;
2899                               array[1] = jatm;
2900                               array[2] = katm;
2901                               array[3] = atom[katm].iat[l];  
2902                               return TRUE;
2903                            }
2904                        }
2905                    }
2906                }
2907            }
2908        }
2909    }
2910    return FALSE;
2911 }
2912 /* --------------------------------------------------------- */
2913 int is_cyclo5(int ia, int *array)
2914 {
2915    int i,j,k,l;
2916    int jatm,katm,latm;
2917
2918    for (i=0; i < 6; i++)
2919       array[i] = 0;
2920      
2921    for(i=0; i < MAXIAT; i++)
2922    {
2923        if (atom[ia].iat[i] != 0)
2924        {
2925            jatm = atom[ia].iat[i];
2926            for(j=0; j < MAXIAT; j++)
2927            {
2928                if (atom[jatm].iat[j] != 0 && atom[jatm].iat[j] != ia && atom[jatm].bo[j] != 9)
2929                {
2930                    katm = atom[jatm].iat[j];
2931                    if ( !isbond(ia,katm))  // three membered ring
2932                    {
2933                      for(k=0; k < MAXIAT; k++)
2934                      {
2935                        if (atom[katm].iat[k] != 0 && atom[katm].iat[k] != jatm && atom[katm].iat[k] != ia && atom[katm].bo[k] != 9)
2936                        {
2937                            latm = atom[katm].iat[k];
2938                            if ( !isbond(ia,latm))  // four membered ring
2939                            {
2940                              for (l=0; l < MAXIAT; l++)
2941                              {
2942                                if (atom[latm].iat[l] != 0 && atom[latm].iat[l] != katm && atom[latm].iat[l] != jatm &&
2943                                    atom[latm].iat[l] != ia && atom[latm].bo[l] != 9)
2944                                    {
2945                                        if (isbond(ia,atom[latm].iat[l]))
2946                                        {
2947                                            array[0] = ia;
2948                                            array[1] = jatm;
2949                                            array[2] = katm;
2950                                            array[3] = latm;
2951                                            array[4] = atom[latm].iat[l];
2952                                            return TRUE;
2953                                        }
2954                                    }
2955                              }
2956                            }
2957                        }
2958                      }
2959                    }
2960                }
2961            }
2962        }
2963    }
2964    return FALSE;
2965 }
2966 /* --------------------------------------------------------- */                                          
2967 int is_cyclo6(int ia, int *array)
2968 {
2969    int i,j,k,l,m;
2970    int jatm,katm,latm,matm,xatm;
2971
2972    for (i=0; i < 6; i++)
2973       array[i] = 0;
2974      
2975    for(i=0; i < MAXIAT; i++)
2976    {
2977        if (atom[ia].iat[i] != 0)
2978        {
2979            jatm = atom[ia].iat[i];
2980            for(j=0; j < MAXIAT; j++)
2981            {
2982                if (atom[jatm].iat[j] != 0 && atom[jatm].iat[j] != ia && atom[jatm].bo[j] != 9)
2983                {
2984                    katm = atom[jatm].iat[j];
2985                    for(k=0; k < MAXIAT; k++)
2986                    {
2987                        if (atom[katm].iat[k] != 0 && atom[katm].iat[k] != jatm && atom[katm].iat[k] != ia && atom[katm].bo[k] != 9)
2988                        {
2989                            latm = atom[katm].iat[k];
2990                            if (!isbond(ia,latm))  // bail out for four memebered rings
2991                            {
2992                              for (l=0; l < MAXIAT; l++)
2993                              {
2994                                if (atom[latm].iat[l] != 0 && atom[latm].iat[l] != katm && atom[latm].iat[l] != jatm &&
2995                                    atom[latm].iat[l] != ia && atom[latm].bo[l] != 9)
2996                                {
2997                                    matm = atom[latm].iat[l];
2998                                    if (!(isbond(ia,matm)))  // bail out for five membered ring
2999                                    {
3000                                      for (m=0; m < MAXIAT; m++)
3001                                      {
3002                                        xatm = atom[matm].iat[m];
3003                                        if (xatm != 0 && xatm != matm && xatm != latm && xatm != katm && xatm != jatm && xatm != ia)
3004                                        {
3005                                            if (isbond(ia,xatm))
3006                                            {
3007                                               array[0] = ia;
3008                                               array[1] = jatm;
3009                                               array[2] = katm;
3010                                               array[3] = latm;
3011                                               array[4] = matm;
3012                                               array[5] = xatm;
3013                                               return TRUE;
3014                                            }
3015                                        }
3016                                      }
3017                                    }
3018                                }
3019                              }
3020                            }                          
3021                        }
3022                    }
3023                }
3024            }
3025        }
3026    }
3027    return FALSE;
3028 }
3029 /* --------------------------------------------------------- */
3030 int find_rsize(int isize,int iatom)
3031 {
3032    int i, j, icount;
3033    
3034    icount = 0;
3035    if (isize == 3)
3036    {
3037        for (i=0; i < ringdata.tot3; i++)
3038        {
3039            for(j=0; j < 3; j++)
3040            {
3041                if (ringdata.iring3[i][j] == iatom)
3042                    icount++;
3043            }
3044        }
3045        return(icount);
3046    }else if (isize == 4)
3047    {
3048        for (i=0; i < ringdata.tot4; i++)
3049        {
3050            for(j=0; j < 4; j++)
3051            {
3052                if (ringdata.iring4[i][j] == iatom)
3053                    icount++;
3054            }
3055        }
3056        return(icount);
3057    }else if (isize == 5)
3058    {
3059        for (i=0; i < ringdata.tot5; i++)
3060        {
3061            for(j=0; j < 5; j++)
3062            {
3063                if (ringdata.iring5[i][j] == iatom)
3064                    icount++;
3065            }
3066        }
3067        return(icount);
3068    }else if (isize == 6)
3069    {
3070        for (i=0; i < ringdata.tot6; i++)
3071        {
3072            for(j=0; j < 6; j++)
3073            {
3074                if (ringdata.iring6[i][j] == iatom)
3075                    icount++;
3076            }
3077        }
3078        return(icount);
3079    }
3080    return(icount);
3081 }
3082 /* --------------------------------------------------------- */
3083 // iatom is atom number to search on
3084 // isize = ring size
3085 // num = number of ring if more than one ring containing atom iatom
3086 // array = array of ring atoms
3087 //
3088 void get_rsize(int iatom, int isize, int num, int *array)
3089 {
3090    int i, j, k, icount;
3091    icount = -1;
3092    
3093    if (isize == 3)
3094    {
3095       for (i=0; i < ringdata.tot3; i++)
3096       {
3097           for (j=0; j < 3; j++)
3098           {
3099               if (iatom == ringdata.iring3[i][j])
3100                  icount++;
3101               if (icount == num)
3102               {
3103                  for (k=0; k < isize; k++)
3104                      array[k] = ringdata.iring3[i][k];
3105                  return;
3106               }
3107           }
3108        }
3109    } else if (isize == 4)
3110    {
3111       for (i=0; i < ringdata.tot4; i++)
3112       {
3113           for (j=0; j < 4; j++)
3114           {
3115               if (iatom == ringdata.iring3[i][j])
3116                  icount++;
3117               if (icount == num)
3118               {
3119                  for (k=0; k < isize; k++)
3120                      array[k] = ringdata.iring4[i][k];
3121                  return;
3122               }
3123           }
3124        }
3125    } else if (isize == 5)
3126    {
3127       for (i=0; i < ringdata.tot5; i++)
3128       {
3129           for (j=0; j < 5; j++)
3130           {
3131               if (iatom == ringdata.iring5[i][j])
3132                  icount++;
3133               if (icount == num)
3134               {
3135                  for (k=0; k < isize; k++)
3136                      array[k] = ringdata.iring5[i][k];
3137                  return;
3138               }
3139           }
3140        }
3141    } else if (isize == 6)
3142    {
3143       for (i=0; i < ringdata.tot6; i++)
3144       {
3145           for (j=0; j < 6; j++)
3146           {
3147               if (iatom == ringdata.iring6[i][j])
3148                  icount++;
3149               if (icount == num)
3150               {
3151                  for (k=0; k < isize; k++)
3152                      array[k] = ringdata.iring6[i][k];
3153                  return;
3154               }
3155           }
3156        }
3157    }
3158 }
3159 /* --------------------------------------------------------- */
3160 int aromatic_5(int ringindex, int *array)
3161 {
3162    int i,j,k, jatm, katm;
3163    int nodbl, npi;
3164    int ia, ib, ic;
3165    int db[10];
3166    int ihetero;
3167    long int aromatic_mask, mask6;
3168
3169    aromatic_mask = (1 << AROMATIC_MASK);
3170    mask6 = (1L << RING6);
3171    
3172    npi = 0;
3173    ihetero = 0;
3174    for (i=0; i < 4; i++)
3175    {
3176        jatm = array[i];
3177        for (j=i+1;j < 5; j++)
3178        {
3179            katm = array[j];
3180            if (isbond(jatm,katm))
3181            {
3182                for (k=0; k < MAXIAT; k++)
3183                {
3184                    if (atom[jatm].iat[k] == katm)
3185                    {
3186                        if (atom[jatm].bo[k] == 2)
3187                        {
3188                            db[npi] = i+j;
3189                            npi++;
3190                        }else if ( (atom[jatm].flags & aromatic_mask && atom[jatm].flags & mask6 )
3191                                 && (atom[katm].flags & aromatic_mask && atom[katm].flags & mask6 ))
3192                        {
3193                            db[npi] = i+j;
3194                            npi++;
3195                        }
3196                    }
3197                }
3198            }
3199        }
3200    }                    
3201    for (i=0; i < 5; i++)
3202    {
3203        jatm = array[i];
3204        if (atom[jatm].atomnum != 6)
3205        {
3206            nodbl = FALSE;
3207            for(j=0; j < MAXIAT; j++)
3208            {
3209                if (atom[jatm].iat[j] != 0)
3210                {
3211                    if (atom[jatm].bo[j] > 1 && atom[jatm].bo[j] != 9)
3212                       nodbl = TRUE;
3213                }
3214            }
3215            if (nodbl == FALSE)
3216               ihetero = jatm;
3217        }
3218    }
3219    if (npi >= 2 && ihetero != 0)   // got an aromatic ring with heteroatom
3220       return TRUE;            
3221
3222    if (npi == 0)                   // no double bonds in ring
3223       return FALSE;
3224
3225    if (npi == 1 && ihetero == 0)
3226       return FALSE;
3227
3228    if (npi == 1)
3229    {
3230        if (db[0] == 1)
3231        {
3232            ia = array[2];
3233            ib = array[3];
3234            ic = array[4];
3235        } else if (db[0] == 3)
3236        {
3237            ia = array[0];
3238            ib = array[3];
3239            ic = array[4];
3240        } else if (db[0] == 4)
3241        {
3242            ia = array[1];
3243            ib = array[2];
3244            ic = array[3];
3245        } else if (db[0] == 5)
3246        {
3247            ia = array[0];
3248            ib = array[1];
3249            ic = array[4];
3250        } else if (db[0] == 7)
3251        {
3252            ia = array[0];
3253            ib = array[1];
3254            ic = array[2];
3255        }
3256        if (ia == ihetero)
3257        {
3258           for(i=0; i < ringdata.nring6; i++)
3259           {
3260              for (j=0; j < 6; j++)
3261              {
3262                 if (ringdata.iring6[i][j] == ib)
3263                 {
3264                     if (atom[ib].flags & aromatic_mask)
3265                       return TRUE;
3266                 }
3267                 if (ringdata.iring6[i][j] == ic)
3268                 {
3269                     if (atom[ic].flags & aromatic_mask)
3270                       return TRUE;
3271                 }
3272              }
3273           }
3274        } else if (ib == ihetero)
3275        {
3276           for(i=0; i < ringdata.nring6; i++)
3277           {
3278              for (j=0; j < 6; j++)
3279              {
3280                 if (ringdata.iring6[i][j] == ia)
3281                 {
3282                     if (atom[ia].flags & aromatic_mask)
3283                       return TRUE;
3284                 }
3285                 if (ringdata.iring6[i][j] == ic)
3286                 {
3287                     if (atom[ic].flags & aromatic_mask)
3288                       return TRUE;
3289                 }
3290              }
3291           }
3292        } else if (ic == ihetero)
3293        {
3294           for(i=0; i < ringdata.nring6; i++)
3295           {
3296              for (j=0; j < 6; j++)
3297              {
3298                 if (ringdata.iring6[i][j] == ib)
3299                 {
3300                     if (atom[ib].flags & aromatic_mask)
3301                       return TRUE;
3302                 }
3303                 if (ringdata.iring6[i][j] == ia)
3304                 {
3305                     if (atom[ia].flags & aromatic_mask)
3306                       return TRUE;
3307                 }
3308              }
3309           }
3310        }
3311    }
3312    return FALSE;                  
3313 }
3314 /* --------------------------------------------------------- */
3315 int aromatic_6(int *array)
3316 {
3317    int i,j,k, ia,ib, idbl,kdbl;
3318    int num, inarray[10];
3319    long int aromatic_mask, mask6;
3320
3321    aromatic_mask = (1 << AROMATIC_MASK);
3322    mask6 = (1L << RING6);
3323    num = 0;
3324    for (i=0; i < 10; i++)
3325       inarray[i] = FALSE;
3326      
3327    for (i=0; i < 5; i++)
3328    {
3329        ia = array[i];
3330        for (j=i+1; j < 6; j++)
3331        {
3332            for (k=0; k < MAXIAT; k++)
3333            {
3334                if (atom[ia].iat[k] == array[j])
3335                {
3336                    if (atom[ia].bo[k] == 2)
3337                    {
3338                       num++;
3339                       inarray[i] = TRUE;
3340                       inarray[j] = TRUE;
3341                    }
3342                }
3343            }
3344        }
3345    }
3346    if (num == 3)
3347      return TRUE;
3348
3349    if (num >= 1)
3350    {
3351        for(i=0; i < 5; i++)
3352        {
3353            if (inarray[i] == FALSE)
3354            {
3355                ia = array[i];
3356                for(j=i+1;j < 6; j++)
3357                {
3358                    if (inarray[j] == FALSE)
3359                    {
3360                        ib = array[j];
3361                        if ( (atom[ia].flags & aromatic_mask) && (atom[ib].flags & aromatic_mask))
3362                        {
3363                           num++;
3364                           if (num == 3)
3365                              return TRUE;
3366                        } else if (isbond(ia,ib))
3367                        {
3368                           idbl = FALSE;
3369                           kdbl = FALSE;
3370                           for(k=0; k < MAXIAT; k++)
3371                           {
3372                              if (atom[ia].iat[k] !=0 && atom[ia].bo[k] == 2)
3373                              {
3374                                 if (atom[atom[ia].iat[k]].atomnum == 6 || atom[atom[ia].iat[k]].atomnum == 7)
3375                                 {
3376                                     if (atom[atom[ia].iat[k]].flags & mask6)
3377                                         idbl = TRUE;
3378                                 }
3379                              }
3380                              if (atom[ib].iat[k] !=0 && atom[ib].bo[k] == 2)
3381                              {
3382                                 if (atom[atom[ib].iat[k]].atomnum == 6 || atom[atom[ib].iat[k]].atomnum == 7)
3383                                 {
3384                                     if (atom[atom[ib].iat[k]].flags & mask6)
3385                                         kdbl = TRUE;
3386                                 }
3387                              }
3388                           }
3389                           if (idbl == TRUE && kdbl == TRUE)
3390                           {
3391                               num++;
3392                               if (num == 3)
3393                                  return TRUE;
3394                           }
3395                        }
3396                        inarray[i] = TRUE;
3397                        inarray[j] = TRUE;
3398                    }
3399                }
3400            }
3401        }
3402    }
3403    return FALSE;
3404 }
2840   /* ==================================================  */
2841   // look for ionic types input with bonds and adjust to make ionic
2842   //

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines