Victor
 All Data Structures Functions Variables Friends Pages
AtomCode.h
1 /* This file is part of Victor.
2 
3  Victor is free software: you can redistribute it and/or modify
4  it under the terms of the GNU General Public License as published by
5  the Free Software Foundation, either version 3 of the License, or
6  (at your option) any later version.
7 
8  Victor is distributed in the hope that it will be useful,
9  but WITHOUT ANY WARRANTY; without even the implied warranty of
10  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  GNU General Public License for more details.
12 
13  You should have received a copy of the GNU General Public License
14  along with Victor. If not, see <http://www.gnu.org/licenses/>.
15  */
16 
17 
18 #ifndef __ATOM_CODE_H__
19 #define __ATOM_CODE_H__
20 
21 // Includes
22 
23 #include <string>
24 #include <Debug.h>
25 
26 /*
27 
28  * Translator: PDB names to internal one-word-code and
29  * vice versa. Provides some simple predicates dealing with
30  * one-word-code.
31  *
32  * @NB AtomTranslator converts some "illegal" entries (eg. 1HD, 2HE, ...)
33  * to their "legal" equivalent (eg. HD, HE, ...)
34  *
35  * This file contains information from the Bioinformatics Template Library (BTL).
36  *
37  * Copyright (C) 1997,1998 Birkbeck College, Malet Street,
38  * London WC1E 7HX, U.K. (classlib@mail.cryst.bbk.ac.uk)
39  *
40  */
41 
42 
57 enum AtomCode {
58  // Backbone atoms
59  N,
60  CA,
61  C,
62  O,
63  // Side chain atoms
64  CB,
65  SG,
66  OG,
67  CG,
68  OG1,
69  CG1,
70  CG2,
71  CD,
72  OD,
73  SD,
74  CD1,
75  OD1,
76  ND1,
77  CD2,
78  OD2,
79  ND2,
80  CE,
81  NE,
82  CE1,
83  OE1,
84  NE1,
85  CE2,
86  OE2,
87  NE2,
88  CE3,
89  CZ,
90  NZ,
91  CZ2,
92  CZ3,
93  OH,
94  NH1,
95  NH2,
96  CH2,
97  OXT,
98  P,
99  O1P,
100  O2P,
101  O5S,
102  C5S,
103  C4S,
104  O4S,
105  C3S,
106  O3S,
107  C2S,
108  O2S,
109  C1S,
110  N9,
111  C8,
112  N7,
113  C5,
114  C6,
115  O6,
116  N6,
117  N1,
118  C2,
119  O2,
120  N2,
121  N3,
122  C4,
123  O4,
124  N4,
125  C5M,
126 
127  // Hydrogens
128  H,
129  H1,
130  H2,
131  H3,
132  HA,
133  HA2,
134  HA3,
135  HB,
136  HB1,
137  HB2,
138  HB3,
139  HD1,
140  HD2,
141  HD3,
142  HD11,
143  HD12,
144  HD13,
145  HD21,
146  HD22,
147  HD23,
148  HE,
149  HE1,
150  HE2,
151  HE3,
152  HE21,
153  HE22,
154  HG,
155  HG1,
156  HG2,
157  HG11,
158  HG12,
159  HG13,
160  HG21,
161  HG22,
162  HG23,
163  HG3,
164  HH,
165  HH2,
166  HH11,
167  HH12,
168  HH21,
169  HH22,
170  HZ,
171  HZ1,
172  HZ2,
173  HZ3,
174 
175  // side chain pseudo atoms:
176  XA,
177  XR,
178  XN,
179  XD,
180  XC,
181  XQ,
182  XE,
183  XG,
184  XH,
185  XI,
186  XL,
187  XK,
188  XM,
189  XF,
190  XP,
191  XS,
192  XT,
193  XW,
194  XY,
195  XV,
196 
197  X, // Please leave as last element! Corresponds to unknown atom type
198  ATOM_CODE_SIZE // number of atom types
199 };
200 
201 // ---------------------------------------------------------------------------
202 // AtomTranslator
203 // -----------------x-------------------x-------------------x-----------------
204 
213 inline
214 bool
215 follows(AtomCode first, AtomCode second) {
216  if (first == ATOM_CODE_SIZE || second == ATOM_CODE_SIZE) {
217  return false;
218  } else {
219  return first < second;
220  }
221 }
222 
227 inline
228 bool
229 isBetaAtom(AtomCode code) {
230  return ( code == CB);
231 }
232 
237 inline
238 bool
239 isGammaAtom(AtomCode code) {
240  return ((code == SG) || (code == OG) || (code == CG)
241  || (code == OG1) || (code == CG1) || (code == CG2));
242 }
243 
248 inline
249 bool
250 isDeltaAtom(AtomCode code) {
251  return ((code == CD) || (code == OD) || (code == SD)
252  || (code == CD1) || (code == OD1) || (code == ND1)
253  || (code == CD2) || (code == OD2) || (code == ND2));
254 }
255 
260 inline
261 bool
262 isEpsilonAtom(AtomCode code) {
263  return ((code == CE) || (code == NE) || (code == CE1)
264  || (code == OE1) || (code == NE1) || (code == CE2)
265  || (code == OE2) || (code == NE2) || (code = CE3));
266 }
267 
272 inline
273 bool
274 isZetaAtom(AtomCode code) {
275  return ((code == CZ) || (code == NZ) || (code == CZ2)
276  || (code == CZ3));
277 }
278 
283 inline
284 bool
285 isEtaAtom(AtomCode code) {
286  return ((code == OH) || (code == NH1) || (code == NH2)
287  || (code == CH2));
288 }
289 
295 inline
296 bool
297 isCAtom(AtomCode code) {
298  return ((code == C) || (code == CB) || (code == CG)
299  || (code == CG1) || (code == CG2) || (code == CD)
300  || (code == CD1) || (code == CD2) || (code == CE)
301  || (code == CE1) || (code == CE2) || (code == CE3)
302  || (code == CZ) || (code == CZ2) || (code == CZ3)
303  || (code == C5S) || (code == C4S) || (code == C3S)
304  || (code == C2S) || (code == C1S) || (code == C8)
305  || (code == C5) || (code == C6) || (code == C2)
306  || (code == C4) || (code == C5M));
307 }
308 
314 inline
315 bool
316 isNAtom(AtomCode code) {
317  return ( (code == N9) || (code == N7) || (code == N6)
318  || (code == N1) || (code == N2) || (code == N3)
319  || (code == N4) || (code == ND1) || (code == ND2)
320  || (code == NE) || (code == NE1) || (code == NE2)
321  || (code == NZ) || (code == NH1) || (code == NH2)
322  || (code == N));
323 }
324 
330 inline
331 bool
332 isOAtom(AtomCode code) {
333  return ( (code == OXT) || (code == O1P) || (code == O2P)
334  || (code == O5S) || (code == O4S) || (code == O3S)
335  || (code == O2S) || (code == O6) || (code == O2)
336  || (code == O4) || (code == OD1) || (code == OD2)
337  || (code == OE1) || (code == OE2) || (code == OH)
338  || (code == O) || (code == OG) || (code == OG1)
339  || (code == OD));
340 }
341 
347 inline
348 bool
349 isHAtom(AtomCode code) {
350  return ( (code == H) || (code == H1) || (code == H2) || (code == H3) || (code == HA) ||
351  (code == HA2) || (code == HA3) || (code == HB) || (code == HB1) ||
352  (code == HB2) || (code == HB3) || (code == HD1) || (code == HD2) ||
353  (code == HD3) || (code == HD11) || (code == HD12) || (code == HD13) ||
354  (code == HD21) || (code == HD22) || (code == HD23) || (code == HE) ||
355  (code == HE1) || (code == HE2) || (code == HE3) || (code == HE21) ||
356  (code == HE22) || (code == HG) || (code == HG1) || (code == HG2) ||
357  (code == HG11) || (code == HG12) || (code == HG13) ||
358  (code == HG21) || (code == HG22) ||
359  (code == HG23) || (code == HG3) || (code == HH) || (code == HH2) ||
360  (code == HH11) || (code == HH12) || (code == HH21) || (code == HH22) ||
361  (code == HZ) || (code == HZ1) || (code == HZ2) || (code == HZ3)
362  );
363 }
364 
369 inline
370 bool
371 isKnownAtom(AtomCode code) {
372  return !(code == X);
373 }
374 
379 inline
380 bool
381 isHeavyAtom(AtomCode code) {
382  return (isKnownAtom(code))&&(!isHAtom(code));
383 }
384 
391 inline
392 bool
393 isBackboneAtom(AtomCode code) {
394  return code == C || code == CA || code == N || code == O || code == OXT;
395 }
396 
401 inline
402 AtomCode
403 AtomTranslator(const string& name) {
404  DUMP(name);
405  if (name == "") {
406  return X;
407  }
408  if (name == "X") {
409  return X;
410  }
411  if (name == "N") {
412  return N;
413  } else if (name == "CA") {
414  return CA;
415  } else if (name == "C") {
416  return C;
417  } else if (name == "O") {
418  return O;
419  } else if (name == "CB") {
420  return CB;
421  } else if (name == "SG") {
422  return SG;
423  } else if (name == "OG") {
424  return OG;
425  } else if (name == "CG") {
426  return CG;
427  } else if (name == "OG1") {
428  return OG1;
429  } else if (name == "CG1") {
430  return CG1;
431  } else if (name == "CG2") {
432  return CG2;
433  } else if (name == "CD") {
434  return CD;
435  } else if (name == "OD") {
436  return OD;
437  } else if (name == "SD") {
438  return SD;
439  } else if (name == "CD1") {
440  return CD1;
441  } else if (name == "OD1") {
442  return OD1;
443  } else if (name == "ND1") {
444  return ND1;
445  } else if (name == "CD2") {
446  return CD2;
447  } else if (name == "OD2") {
448  return OD2;
449  } else if (name == "ND2") {
450  return ND2;
451  } else if (name == "CE") {
452  return CE;
453  } else if (name == "NE") {
454  return NE;
455  } else if (name == "CE1") {
456  return CE1;
457  } else if (name == "OE1") {
458  return OE1;
459  } else if (name == "NE1") {
460  return NE1;
461  } else if (name == "CE2") {
462  return CE2;
463  } else if (name == "OE2") {
464  return OE2;
465  } else if (name == "NE2") {
466  return NE2;
467  } else if (name == "CE3") {
468  return CE3;
469  } else if (name == "CZ") {
470  return CZ;
471  } else if (name == "NZ") {
472  return NZ;
473  } else if (name == "CZ2") {
474  return CZ2;
475  } else if (name == "CZ3") {
476  return CZ3;
477  } else if (name == "OH") {
478  return OH;
479  } else if (name == "NH1") {
480  return NH1;
481  } else if (name == "NH2") {
482  return NH2;
483  } else if (name == "CH2") {
484  return CH2;
485  } else if (name == "OXT") {
486  return OXT;
487  } else if (name == "P") {
488  return P;
489  } else if (name == "O1P") {
490  return O1P;
491  } else if (name == "O2P") {
492  return O2P;
493  } else if (name == "O5S") {
494  return O5S;
495  } else if (name == "C5S") {
496  return C5S;
497  } else if (name == "C4S") {
498  return C4S;
499  } else if (name == "O4S") {
500  return O4S;
501  } else if (name == "C3S") {
502  return C3S;
503  } else if (name == "O3S") {
504  return O3S;
505  } else if (name == "C2S") {
506  return C2S;
507  } else if (name == "O2S") {
508  return O2S;
509  } else if (name == "C1S") {
510  return C1S;
511  } else if (name == "N9") {
512  return N9;
513  } else if (name == "C8") {
514  return C8;
515  } else if (name == "N7") {
516  return N7;
517  } else if (name == "C5") {
518  return C5;
519  } else if (name == "C6") {
520  return C6;
521  } else if (name == "O6") {
522  return O6;
523  } else if (name == "N6") {
524  return N6;
525  } else if (name == "N1") {
526  return N1;
527  } else if (name == "C2") {
528  return C2;
529  } else if (name == "O2") {
530  return O2;
531  } else if (name == "N2") {
532  return N2;
533  } else if (name == "N3") {
534  return N3;
535  } else if (name == "C4") {
536  return C4;
537  } else if (name == "O4") {
538  return O4;
539  } else if (name == "N4") {
540  return N4;
541  } else if (name == "C5M") {
542  return C5M;
543  }
544 
545  // Hydrogens
546  else if ((name == "H") || (name == "HN")) {
547  return H;
548  } else if ((name == "H1") || (name == "HN1")) // 1H ???
549  {
550  return H1;
551  } else if ((name == "H2") || (name == "HN2")) // 2H ???
552  {
553  return H2;
554  } else if ((name == "H3") || (name == "HN3")) // 3H ???
555  {
556  return H3;
557  } else if (name == "HA") {
558  return HA;
559  } else if ((name == "HA2") || (name == "1HA")) // HA1 conflict old GLY
560  {
561  return HA2;
562  } else if ((name == "HA3") || (name == "2HA")) // HA2 conflict old GLY
563  {
564  return HA3;
565  } else if (name == "HB") {
566  return HB;
567  } else if (name == "HB1") // 1HB conflict
568  {
569  return HB1;
570  } else if (name == "HB2") // 2HB conflict
571  {
572  return HB2;
573  } else if ((name == "HB3") || (name == "3HB")) {
574  return HB3;
575  } else if (name == "HD1") {
576  return HD1;
577  } else if ((name == "HD2") || (name == "1HD")) {
578  return HD2;
579  } else if ((name == "HD3") || (name == "2HD")) {
580  return HD3;
581  } else if ((name == "HD11") || (name == "1HD1")) {
582  return HD11;
583  } else if ((name == "HD12") || (name == "2HD1")) {
584  return HD12;
585  } else if ((name == "HD13") || (name == "3HD1")) {
586  return HD13;
587  } else if ((name == "HD21") || (name == "1HD2")) {
588  return HD21;
589  } else if ((name == "HD22") || (name == "2HD2")) {
590  return HD22;
591  } else if ((name == "HD23") || (name == "3HD2")) {
592  return HD23;
593  } else if (name == "HE") // 1HE conflict
594  {
595  return HE;
596  } else if (name == "HE1") // 1HE conflict
597  {
598  return HE1;
599  } else if (name == "HE2") // 1HE, 2HE conflict
600  {
601  return HE2;
602  } else if ((name == "HE3") || (name == "3HE")) // 2HE conflict
603  {
604  return HE3;
605  } else if ((name == "HE21") || (name == "1HE2")) {
606  return HE21;
607  } else if ((name == "HE22") || (name == "2HE2")) {
608  return HE22;
609  } else if (name == "HG") {
610  return HG;
611  } else if (name == "HG1") {
612  return HG1;
613  } else if ((name == "1HG") || (name == "HG2")) {
614  return HG2;
615  } else if (name == "HG11") // 1HG1 conflict
616  {
617  return HG11;
618  } else if (name == "HG12") // 2HG1 conflict
619  {
620  return HG12;
621  } else if ((name == "3HG1") || (name == "HG13")) // 2HG1 conflict
622  {
623  return HG13;
624  } else if ((name == "HG21") || (name == "1HG2")) {
625  return HG21;
626  } else if ((name == "HG22") || (name == "2HG2")) {
627  return HG22;
628  } else if ((name == "HG23") || (name == "3HG2")) {
629  return HG23;
630  } else if ((name == "HG3") || (name == "2HG")) {
631  return HG3;
632  } else if (name == "HH") {
633  return HH;
634  } else if (name == "HH2") {
635  return HH2;
636  } else if ((name == "HH11") || (name == "1HH1")) {
637  return HH11;
638  } else if ((name == "HH12") || (name == "2HH1")) {
639  return HH12;
640  } else if ((name == "HH21") || (name == "1HH2")) {
641  return HH21;
642  } else if ((name == "HH22") || (name == "2HH2")) {
643  return HH22;
644  } else if (name == "HZ") {
645  return HZ;
646  } else if ((name == "HZ1") || (name == "1HZ")) {
647  return HZ1;
648  } else if ((name == "HZ2") || (name == "2HZ")) {
649  return HZ2;
650  } else if ((name == "HZ3") || (name == "3HZ")) {
651  return HZ3;
652  }
653 
654 
655  // side chain pseudo atoms:
656  else if (name == "XA") {
657  return XA;
658  } else if (name == "XD") {
659  return XD;
660  } else if (name == "XR") {
661  return XR;
662  } else if (name == "XN") {
663  return XN;
664  } else if (name == "XC") {
665  return XC;
666  } else if (name == "XQ") {
667  return XQ;
668  } else if (name == "XE") {
669  return XE;
670  } else if (name == "XG") {
671  return XG;
672  } else if (name == "XG") {
673  return XG;
674  } else if (name == "XH") {
675  return XH;
676  } else if (name == "XI") {
677  return XI;
678  } else if (name == "XL") {
679  return XL;
680  } else if (name == "XK") {
681  return XK;
682  } else if (name == "XM") {
683  return XM;
684  } else if (name == "XF") {
685  return XF;
686  } else if (name == "XP") {
687  return XP;
688  } else if (name == "XS") {
689  return XS;
690  } else if (name == "XT") {
691  return XT;
692  } else if (name == "XW") {
693  return XW;
694  } else if (name == "XY") {
695  return XY;
696  } else if (name == "XV") {
697  return XV;
698  }
699 
700  return X; // atom type name is unknown
701 }
702 
703 inline string AtomTranslator(AtomCode code) {
704  switch (code) {
705  case X:
706  return "X";
707  case N:
708  return "N";
709  case CA:
710  return "CA";
711  case C:
712  return "C";
713  case O:
714  return "O";
715  case CB:
716  return "CB";
717  case SG:
718  return "SG";
719  case OG:
720  return "OG";
721  case CG:
722  return "CG";
723  case OG1:
724  return "OG1";
725  case CG1:
726  return "CG1";
727  case CG2:
728  return "CG2";
729  case CD:
730  return "CD";
731  case OD:
732  return "OD";
733  case SD:
734  return "SD";
735  case CD1:
736  return "CD1";
737  case OD1:
738  return "OD1";
739  case ND1:
740  return "ND1";
741  case CD2:
742  return "CD2";
743  case OD2:
744  return "OD2";
745  case ND2:
746  return "ND2";
747  case CE:
748  return "CE";
749  case NE:
750  return "NE";
751  case CE1:
752  return "CE1";
753  case OE1:
754  return "OE1";
755  case NE1:
756  return "NE1";
757  case CE2:
758  return "CE2";
759  case OE2:
760  return "OE2";
761  case NE2:
762  return "NE2";
763  case CE3:
764  return "CE3";
765  case CZ:
766  return "CZ";
767  case NZ:
768  return "NZ";
769  case CZ2:
770  return "CZ2";
771  case CZ3:
772  return "CZ3";
773  case OH:
774  return "OH";
775  case NH1:
776  return "NH1";
777  case NH2:
778  return "NH2";
779  case CH2:
780  return "CH2";
781  case OXT:
782  return "OXT";
783  case P:
784  return "P";
785  case O1P:
786  return "O1P";
787  case O2P:
788  return "O2P";
789  case O5S:
790  return "O5S";
791  case C5S:
792  return "C5S";
793  case C4S:
794  return "C4S";
795  case O4S:
796  return "O4S";
797  case C3S:
798  return "C3S";
799  case O3S:
800  return "O3S";
801  case C2S:
802  return "C2S";
803  case O2S:
804  return "O2S";
805  case C1S:
806  return "C1S";
807  case N9:
808  return "N9";
809  case C8:
810  return "C8";
811  case N7:
812  return "N7";
813  case C5:
814  return "C5";
815  case C6:
816  return "C6";
817  case O6:
818  return "O6";
819  case N6:
820  return "N6";
821  case N1:
822  return "N1";
823  case C2:
824  return "C2";
825  case O2:
826  return "O2";
827  case N2:
828  return "N2";
829  case N3:
830  return "N3";
831  case C4:
832  return "C4";
833  case O4:
834  return "O4";
835  case N4:
836  return "N4";
837  case C5M:
838  return "C5M";
839 
840  // Hydrogens by Damiano Piovesan 2014
841  case H:
842  return "H";
843  case H1:
844  return "H1";
845  case H2:
846  return "H2";
847  case H3:
848  return "H3";
849  case HA:
850  return "HA";
851  case HA2:
852  return "HA2";
853  case HA3:
854  return "HA3";
855  case HB:
856  return "HB";
857  case HB1:
858  return "HB1";
859  case HB2:
860  return "HB2";
861  case HB3:
862  return "HB3";
863  case HD1:
864  return "HD1";
865  case HD2:
866  return "HD2";
867  case HD3:
868  return "HD3";
869  case HD11:
870  return "HD11";
871  case HD12:
872  return "HD12";
873  case HD13:
874  return "HD13";
875  case HD21:
876  return "HD21";
877  case HD22:
878  return "HD22";
879  case HD23:
880  return "HD23";
881  case HE:
882  return "HE";
883  case HE1:
884  return "HE1";
885  case HE2:
886  return "HE2";
887  case HE3:
888  return "HE3";
889  case HE21:
890  return "HE21";
891  case HE22:
892  return "HE22";
893  case HG:
894  return "HG";
895  case HG1:
896  return "HG1";
897  case HG2:
898  return "HG2";
899  case HG11:
900  return "HG11";
901  case HG12:
902  return "HG12";
903  case HG13:
904  return "HG13";
905  case HG21:
906  return "HG21";
907  case HG22:
908  return "HG22";
909  case HG23:
910  return "HG23";
911  case HG3:
912  return "HG3";
913  case HH:
914  return "HH";
915  case HH2:
916  return "HH2";
917  case HH11:
918  return "HH11";
919  case HH12:
920  return "HH12";
921  case HH21:
922  return "HH21";
923  case HH22:
924  return "HH22";
925  case HZ:
926  return "HZ";
927  case HZ1:
928  return "HZ1";
929  case HZ2:
930  return "HZ2";
931  case HZ3:
932  return "HZ3";
933 
934  // side chain pseudo atoms:
935  case XA:
936  return "XA";
937  case XR:
938  return "XR";
939  case XN:
940  return "XN";
941  case XD:
942  return "XD";
943  case XC:
944  return "XC";
945  case XQ:
946  return "XQ";
947  case XE:
948  return "XE";
949  case XG:
950  return "XG";
951  case XH:
952  return "XH";
953  case XI:
954  return "XI";
955  case XL:
956  return "XL";
957  case XK:
958  return "XK";
959  case XM:
960  return "XM";
961  case XF:
962  return "XF";
963  case XP:
964  return "XP";
965  case XS:
966  return "XS";
967  case XT:
968  return "XT";
969  case XW:
970  return "XW";
971  case XY:
972  return "XY";
973  case XV:
974  return "XV";
975 
976 
977  case ATOM_CODE_SIZE:
978  ERROR("AtomTranslator(AtomCode code): unknown code", exception);
979  }
980 
981  ERROR("AtomTranslator(AtomCode code): unknown code", exception);
982 
983  return "X";
984 }
985 
986 //********
987 
988 inline ostream& operator<<(ostream& os, const AtomCode& rval) {
989  os << AtomTranslator(rval);
990  return os;
991 }
992 
993 inline istream& operator>>(istream& is, AtomCode& rval) {
994  string name;
995  is >> name;
996  rval = AtomTranslator(name);
997  return is;
998 }
999 
1004 inline int get_all_atom_bin(string group_name) {
1005  switch (group_name[0]) {
1006  case 'A':
1007  if (group_name == "AN") return 1;
1008  if (group_name == "ACA") return 2;
1009  if (group_name == "AC") return 3;
1010  if (group_name == "AO") return 4;
1011  if (group_name == "ACB") return 5;
1012  break;
1013  case 'C':
1014  if (group_name == "CN") return 6;
1015  if (group_name == "CCA") return 7;
1016  if (group_name == "CC") return 8;
1017  if (group_name == "CO") return 9;
1018  if (group_name == "CCB") return 10;
1019  if (group_name == "CSG") return 11;
1020  break;
1021  case 'D':
1022  if (group_name == "DN") return 12;
1023  if (group_name == "DCA") return 13;
1024  if (group_name == "DC") return 14;
1025  if (group_name == "DO") return 15;
1026  if (group_name == "DCB") return 16;
1027  if (group_name == "DCG") return 17;
1028  if (group_name == "DOD1") return 18;
1029  if (group_name == "DOD2") return 19;
1030  break;
1031  case 'E':
1032  if (group_name == "EN") return 20;
1033  if (group_name == "ECA") return 21;
1034  if (group_name == "EC") return 22;
1035  if (group_name == "EO") return 23;
1036  if (group_name == "ECB") return 24;
1037  if (group_name == "ECG") return 25;
1038  if (group_name == "ECD") return 26;
1039  if (group_name == "EOE1") return 27;
1040  if (group_name == "EOE2") return 28;
1041  break;
1042  case 'F':
1043  if (group_name == "FN") return 29;
1044  if (group_name == "FCA") return 30;
1045  if (group_name == "FC") return 31;
1046  if (group_name == "FO") return 32;
1047  if (group_name == "FCB") return 33;
1048  if (group_name == "FCG") return 34;
1049  if (group_name == "FCD1") return 35;
1050  if (group_name == "FCD2") return 36;
1051  if (group_name == "FCE1") return 37;
1052  if (group_name == "FCE2") return 38;
1053  if (group_name == "FCZ") return 39;
1054  break;
1055  case 'G':
1056  if (group_name == "GN") return 40;
1057  if (group_name == "GCA") return 41;
1058  if (group_name == "GC") return 42;
1059  if (group_name == "GO") return 43;
1060  break;
1061  case 'H':
1062  if (group_name == "HN") return 44;
1063  if (group_name == "HCA") return 45;
1064  if (group_name == "HC") return 46;
1065  if (group_name == "HO") return 47;
1066  if (group_name == "HCB") return 48;
1067  if (group_name == "HCG") return 49;
1068  if (group_name == "HND1") return 50;
1069  if (group_name == "HCD2") return 51;
1070  if (group_name == "HCE1") return 52;
1071  if (group_name == "HNE2") return 53;
1072  break;
1073  case 'I':
1074  if (group_name == "IN") return 54;
1075  if (group_name == "ICA") return 55;
1076  if (group_name == "IC") return 56;
1077  if (group_name == "IO") return 57;
1078  if (group_name == "ICB") return 58;
1079  if (group_name == "ICG1") return 59;
1080  if (group_name == "ICG2") return 60;
1081  if (group_name == "ICD1") return 61;
1082  break;
1083  case 'K':
1084  if (group_name == "KN") return 62;
1085  if (group_name == "KCA") return 63;
1086  if (group_name == "KC") return 64;
1087  if (group_name == "KO") return 65;
1088  if (group_name == "KCB") return 66;
1089  if (group_name == "KCG") return 67;
1090  if (group_name == "KCD") return 68;
1091  if (group_name == "KCE") return 69;
1092  if (group_name == "KNZ") return 70;
1093  break;
1094  case 'L':
1095  if (group_name == "LN") return 71;
1096  if (group_name == "LCA") return 72;
1097  if (group_name == "LC") return 73;
1098  if (group_name == "LO") return 74;
1099  if (group_name == "LCB") return 75;
1100  if (group_name == "LCG") return 76;
1101  if (group_name == "LCD1") return 77;
1102  if (group_name == "LCD2") return 78;
1103  break;
1104  case 'M':
1105  if (group_name == "MN") return 79;
1106  if (group_name == "MCA") return 80;
1107  if (group_name == "MC") return 81;
1108  if (group_name == "MO") return 82;
1109  if (group_name == "MCB") return 83;
1110  if (group_name == "MCG") return 84;
1111  if (group_name == "MSD") return 85;
1112  if (group_name == "MCE") return 86;
1113  break;
1114  case 'N':
1115  if (group_name == "NN") return 87;
1116  if (group_name == "NCA") return 88;
1117  if (group_name == "NC") return 89;
1118  if (group_name == "NO") return 90;
1119  if (group_name == "NCB") return 91;
1120  if (group_name == "NCG") return 92;
1121  if (group_name == "NOD1") return 93;
1122  if (group_name == "NND2") return 94;
1123  break;
1124  case 'P':
1125  if (group_name == "PN") return 95;
1126  if (group_name == "PCA") return 96;
1127  if (group_name == "PC") return 97;
1128  if (group_name == "PO") return 98;
1129  if (group_name == "PCB") return 99;
1130  if (group_name == "PCG") return 100;
1131  if (group_name == "PCD") return 101;
1132  break;
1133  case 'Q':
1134  if (group_name == "QN") return 102;
1135  if (group_name == "QCA") return 103;
1136  if (group_name == "QC") return 104;
1137  if (group_name == "QO") return 105;
1138  if (group_name == "QCB") return 106;
1139  if (group_name == "QCG") return 107;
1140  if (group_name == "QCD") return 108;
1141  if (group_name == "QOE1") return 109;
1142  if (group_name == "QNE2") return 110;
1143  break;
1144  case 'R':
1145  if (group_name == "RN") return 111;
1146  if (group_name == "RCA") return 112;
1147  if (group_name == "RC") return 113;
1148  if (group_name == "RO") return 114;
1149  if (group_name == "RCB") return 115;
1150  if (group_name == "RCG") return 116;
1151  if (group_name == "RCD") return 117;
1152  if (group_name == "RNE") return 118;
1153  if (group_name == "RCZ") return 119;
1154  if (group_name == "RNH1") return 120;
1155  if (group_name == "RNH2") return 121;
1156  break;
1157  case 'S':
1158  if (group_name == "SN") return 122;
1159  if (group_name == "SCA") return 123;
1160  if (group_name == "SC") return 124;
1161  if (group_name == "SO") return 125;
1162  if (group_name == "SCB") return 126;
1163  if (group_name == "SOG") return 127;
1164  break;
1165  case 'T':
1166  if (group_name == "TN") return 128;
1167  if (group_name == "TCA") return 129;
1168  if (group_name == "TC") return 130;
1169  if (group_name == "TO") return 131;
1170  if (group_name == "TCB") return 132;
1171  if (group_name == "TOG1") return 133;
1172  if (group_name == "TCG2") return 134;
1173  break;
1174  case 'V':
1175  if (group_name == "VN") return 135;
1176  if (group_name == "VCA") return 136;
1177  if (group_name == "VC") return 137;
1178  if (group_name == "VO") return 138;
1179  if (group_name == "VCB") return 139;
1180  if (group_name == "VCG1") return 140;
1181  if (group_name == "VCG2") return 141;
1182  break;
1183  case 'W':
1184  if (group_name == "WN") return 142;
1185  if (group_name == "WCA") return 143;
1186  if (group_name == "WC") return 144;
1187  if (group_name == "WO") return 145;
1188  if (group_name == "WCB") return 146;
1189  if (group_name == "WCG") return 147;
1190  if (group_name == "WCD1") return 148;
1191  if (group_name == "WCD2") return 149;
1192  if (group_name == "WNE1") return 150;
1193  if (group_name == "WCE2") return 151;
1194  if (group_name == "WCE3") return 152;
1195  if (group_name == "WCZ2") return 153;
1196  if (group_name == "WCZ3") return 154;
1197  if (group_name == "WCH2") return 155;
1198  break;
1199  case 'Y':
1200  if (group_name == "YN") return 156;
1201  if (group_name == "YCA") return 157;
1202  if (group_name == "YC") return 158;
1203  if (group_name == "YO") return 159;
1204  if (group_name == "YCB") return 160;
1205  if (group_name == "YCG") return 161;
1206  if (group_name == "YCD1") return 162;
1207  if (group_name == "YCD2") return 163;
1208  if (group_name == "YCE1") return 164;
1209  if (group_name == "YCE2") return 165;
1210  if (group_name == "YCZ") return 166;
1211  if (group_name == "YOH") return 167;
1212  break;
1213  }
1214 
1215  return 0; // e.g. if hydrogen
1216 }
1217 #endif /* __ATOM_CODE_H__ */
1218