File: MmodTyping.cpp

package info (click to toggle)
pymol 2.5.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 42,288 kB
  • sloc: cpp: 476,472; python: 76,538; ansic: 29,510; javascript: 6,792; sh: 47; makefile: 24
file content (163 lines) | stat: -rw-r--r-- 4,900 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/*
 * MacroModel atom typing
 *
 * (c) Schrodinger, Inc.
 */

#include "MmodTyping.h"
#include "AtomInfo.h"

/**
 * Get the MacroModel atom type.
 *
 * Pre-condition: ObjectMoleculeVerifyChemistry
 */
int getMacroModelAtomType(const AtomInfoType * ai) {

  // generic ions
  switch (ai->formalCharge) {
    case -2:
      switch (ai->protons) {
        case cAN_S:  return 114; // Sm Sulfide anion, S2-
        case cAN_O:  return 115; // Om Oxide anion, O2-
      }
      break;
    case -1:
      switch (ai->protons) {
        case cAN_C:  return  10; // CM Carbanion (C-)
        case cAN_O:  return  18; // OM O- (alkoxide, carboxylate)
        case cAN_H:  return  45; // H5 H- (Anion)
        case cAN_S:  return  51; // SM S- (thiolate anion)
        case cAN_Cl: return 102; // Cm Cl-
        case cAN_F:  return 104; // Fm F-
        case cAN_Br: return 105; // Bm Br-
        case cAN_I:  return 106; // Im I-
      }
      break;
    case 0:
      switch (ai->protons) {
        case cAN_Li: return  93; // L0 Lithium neutral
        case cAN_Mg: return  94; // M0 Magnesium neutral
      }
      break;
    case 1:
      switch (ai->protons) {
        case cAN_C:  return  11; // CP Carbocation (C+)
        case cAN_H:  return  44; // H4 H+ (Cation)
        case cAN_Li: return  65; // Li Li+
        case cAN_Na: return  66; // Na Na+
        case cAN_K:  return  67; // K0 K+
        case cAN_Rb: return  68; // Rb Rb+
        case cAN_Cs: return  69; // Cs Cs+
        case cAN_Cu: return  85; // c1 Cu+
        case cAN_S:  return 100; // SP S+
      }
      break;
    case 2:
      switch (ai->protons) {
        case cAN_Ca: return  70; // Ca Ca+2
        case cAN_Ba: return  71; // Ba Ba+2
        case cAN_Mg: return  72; // Mg Mg+2
        case cAN_Fe: return  79; // f2 Fe+2
        case cAN_Co: return  81; // o2 Co+2
        case cAN_Ni: return  83; // n2 Ni+2
        case cAN_Cu: return  86; // c2 Cu+2
        case cAN_Zn: return  87; // Zn Zn+2
      }
      break;
    case 3:
      switch (ai->protons) {
        case cAN_Fe: return  80; // f3 Fe+3
        case cAN_Co: return  82; // o3 Co+3
        case cAN_Ni: return  84; // n3 Ni+3
      }
      break;
  }

  // others
  switch (ai->protons) {
    case cAN_C:
      switch (ai->geom) {
        case cAtomInfoLinear:       return 1; // C1 Carbon - sp
        case cAtomInfoPlanar:       return 2; // C2 Carbon - sp2
        case cAtomInfoTetrahedral:  return 3; // C3 Carbon - sp3
      }
      return 14; // C0 Any Carbon
    case cAN_O:
      if ((ai->flags & cAtomFlag_solvent) && !ai->bonded) {
        return 19; // OW United atom H2O - Water
      }
      switch (ai->geom) {
        case cAtomInfoPlanar:       return 15; // O2 Oxygen - double bond
        case cAtomInfoTetrahedral:  return 16; // O3 Oxygen - single bond
      }
      return 23; // O0 Any oxygen;
    case cAN_N:
      switch (ai->geom) {
        case cAtomInfoLinear:
          return 24; // N1 Nitrogen - sp
        case cAtomInfoPlanar:
          switch (ai->formalCharge) {
            case -1: return 38; // NM N- - sp2
            case  1: return 31; // N4 N+ - sp2
          }
          return 25; // N2 Nitrogen - sp2
        case cAtomInfoTetrahedral:
          switch (ai->formalCharge) {
            case -1: return 39; // NP N- - sp2
            case  1: return 32; // N5 N+ - sp2
          }
          return 26; // N3 Nitrogen - sp3
      }
      return 40; // N0 Any Nitrogen
    case cAN_H:
      return 48; // H0 Any Hydrogen
    case cAN_S:
      switch (ai->geom) {
        case cAtomInfoPlanar: return 101; // S2 Sulfur - sp2
      }
      return 52; // S0 Any Sulfur
    case cAN_P:
      if (ai->geom == cAtomInfoTetrahedral) {
        switch (ai->valence) {
          case 3: return  53; // P3 Phosphorus, trivalent
          case 4: return 107; // P5 Phosphorus, pentavalent tetrahedral
        }
      }
      return 108; // P0 Any phosphorus
    case cAN_B:
      switch (ai->geom) {
        case cAtomInfoPlanar:       return 54; // B2 Boron - sp2
        case cAtomInfoTetrahedral:  return 55; // B3 Boron - sp3
      }
      return 103; // B0 Any boron
    case cAN_F:
      return 56; // F0 Fluorine
    case cAN_Cl:
      return 57; // Cl Chlorine
    case cAN_Br:
      return 58; // Br Bromine
    case cAN_I:
      return 59; // I0 Iodine
    case cAN_Si:
      return 60; // Si Silicon
    case cAN_Mn:
      switch (ai->formalCharge) {
        case 2: return 73; // M2 Mn+2
        case 3: return 74; // M3 Mn+3
        case 4: return 75; // M4 Mn+4
        case 5: return 76; // M5 Mn+5
        case 6: return 77; // M6 Mn+6
        case 7: return 78; // M7 Mn+7
      }
      break;
    case cAN_Se:
      return 112; // Se Selenium
    case 0:
      if (strcmp(ai->elem, "LP") == 0)
        return 63; // Lp Lone electron pair
      return 61; // Du Dummy atom
  }

  return 64; // 00 Any Atom
}