LOOS  v2.3.2
AtomicNumberDeducer.cpp
1 #include <AtomicNumberDeducer.hpp>
2 #include <cmath>
3 
4 
5 
6 namespace loos {
7 
8  namespace internal {
9 
10  unsigned int AtomicNumberDeducer::deduceFromMass(const double mass, const double tolerance) {
11 
12  std::vector<MassNumber>::iterator i;
13  for (i = element_table.begin(); i != element_table.end(); ++i)
14  if (std::abs(i->first - mass) < tolerance)
15  break;
16 
17  if (i != element_table.end())
18  return(i->second);
19 
20  return(0);
21  }
22 
23 
24  void AtomicNumberDeducer::initialize() {
25 
26  // These are most frequent based on an analysis of our PSF files
27  element_table.push_back(MassNumber(1.008, 1)); // H
28  element_table.push_back(MassNumber(15.999, 8)); // O
29  element_table.push_back(MassNumber(12.011, 6)); // C
30  element_table.push_back(MassNumber(14.007, 7)); // N
31  element_table.push_back(MassNumber(30.973762, 15)); // P
32  element_table.push_back(MassNumber(35.45, 17)); // Cl
33  element_table.push_back(MassNumber(22.98976928, 11)); // Na
34  element_table.push_back(MassNumber(32.06, 16)); // S
35 
36  // Guesses about what is next most likely
37  element_table.push_back(MassNumber(39.0983, 19)); // K
38  element_table.push_back(MassNumber(40.078, 20)); // Ca
39  element_table.push_back(MassNumber(54.938045, 25)); // Mn
40  element_table.push_back(MassNumber(55.845, 26)); // Fe
41  element_table.push_back(MassNumber(24.3050, 12)); // Mg
42  element_table.push_back(MassNumber(65.38, 30)); // Zn
43 
44  // Everything else (hopefully uncommon)
45  element_table.push_back(MassNumber(4.002602, 2)); // He
46  element_table.push_back(MassNumber(6.94, 3)); // Li
47  element_table.push_back(MassNumber(9.012182, 4)); // Be
48  element_table.push_back(MassNumber(10.81, 5)); // B
49  element_table.push_back(MassNumber(18.9984032, 9)); // F
50  element_table.push_back(MassNumber(20.1797, 10)); // Ne
51  element_table.push_back(MassNumber(26.9815386, 13)); // Al
52  element_table.push_back(MassNumber(28.085, 14)); // Si
53  element_table.push_back(MassNumber(39.948, 18)); // Ar
54  element_table.push_back(MassNumber(44.955912, 21)); // Sc
55  element_table.push_back(MassNumber(47.867, 22)); // Ti
56  element_table.push_back(MassNumber(50.9415, 23)); // V
57  element_table.push_back(MassNumber(51.9961, 24)); // Cr
58  element_table.push_back(MassNumber(58.6934, 28)); // Ni
59  element_table.push_back(MassNumber(58.933195, 27)); // Co
60  element_table.push_back(MassNumber(63.546, 29)); // Cu
61  element_table.push_back(MassNumber(69.723, 31)); // Ga
62  element_table.push_back(MassNumber(72.63, 32)); // Ge
63  element_table.push_back(MassNumber(74.92160, 33)); // As
64  element_table.push_back(MassNumber(78.96, 34)); // Se
65  element_table.push_back(MassNumber(79.904, 35)); // Br
66  element_table.push_back(MassNumber(83.798, 36)); // Kr
67  element_table.push_back(MassNumber(85.4678, 37)); // Rb
68  element_table.push_back(MassNumber(87.62, 38)); // Sr
69  element_table.push_back(MassNumber(88.90585, 39)); // Y
70  element_table.push_back(MassNumber(91.224, 40)); // Zr
71  element_table.push_back(MassNumber(92.90638, 41)); // Nb
72  element_table.push_back(MassNumber(95.96, 42)); // Mo
73  element_table.push_back(MassNumber(98, 43)); // Tc
74  element_table.push_back(MassNumber(101.07, 44)); // Ru
75  element_table.push_back(MassNumber(102.90550, 45)); // Rh
76  element_table.push_back(MassNumber(106.42, 46)); // Pd
77  element_table.push_back(MassNumber(107.8682, 47)); // Ag
78  element_table.push_back(MassNumber(112.411, 48)); // Cd
79  element_table.push_back(MassNumber(114.818, 49)); // In
80  element_table.push_back(MassNumber(118.710, 50)); // Sn
81  element_table.push_back(MassNumber(121.760, 51)); // Sb
82  element_table.push_back(MassNumber(126.90447, 53)); // I
83  element_table.push_back(MassNumber(127.60, 52)); // Te
84  element_table.push_back(MassNumber(131.293, 54)); // Xe
85  element_table.push_back(MassNumber(132.9054519, 55)); // Cs
86  element_table.push_back(MassNumber(137.327, 56)); // Ba
87  element_table.push_back(MassNumber(138.90547, 57)); // La
88  element_table.push_back(MassNumber(140.116, 58)); // Ce
89  element_table.push_back(MassNumber(140.90765, 59)); // Pr
90  element_table.push_back(MassNumber(144.242, 60)); // Nd
91  element_table.push_back(MassNumber(145, 61)); // Pm
92  element_table.push_back(MassNumber(150.36, 62)); // Sm
93  element_table.push_back(MassNumber(151.964, 63)); // Eu
94  element_table.push_back(MassNumber(157.25, 64)); // Gd
95  element_table.push_back(MassNumber(158.92535, 65)); // Tb
96  element_table.push_back(MassNumber(162.500, 66)); // Dy
97  element_table.push_back(MassNumber(164.93032, 67)); // Ho
98  element_table.push_back(MassNumber(167.259, 68)); // Er
99  element_table.push_back(MassNumber(168.93421, 69)); // Tm
100  element_table.push_back(MassNumber(173.054, 70)); // Yb
101  element_table.push_back(MassNumber(174.9668, 71)); // Lu
102  element_table.push_back(MassNumber(178.49, 72)); // Hf
103  element_table.push_back(MassNumber(180.94788, 73)); // Ta
104  element_table.push_back(MassNumber(183.84, 74)); // W
105  element_table.push_back(MassNumber(186.207, 75)); // Re
106  element_table.push_back(MassNumber(190.23, 76)); // Os
107  element_table.push_back(MassNumber(192.217, 77)); // Ir
108  element_table.push_back(MassNumber(195.084, 78)); // Pt
109  element_table.push_back(MassNumber(196.966569, 79)); // Au
110  element_table.push_back(MassNumber(200.59, 80)); // Hg
111  element_table.push_back(MassNumber(204.38, 81)); // Tl
112  element_table.push_back(MassNumber(207.2, 82)); // Pb
113  element_table.push_back(MassNumber(208.98040, 83)); // Bi
114  element_table.push_back(MassNumber(209, 84)); // Po
115  element_table.push_back(MassNumber(210, 85)); // At
116  element_table.push_back(MassNumber(222, 86)); // Rn
117  element_table.push_back(MassNumber(223, 87)); // Fr
118  element_table.push_back(MassNumber(226, 88)); // Ra
119  element_table.push_back(MassNumber(227, 89)); // Ac
120  element_table.push_back(MassNumber(231.03588, 91)); // Pa
121  element_table.push_back(MassNumber(232.03806, 90)); // Th
122  element_table.push_back(MassNumber(237, 93)); // Np
123  element_table.push_back(MassNumber(238.02891, 92)); // U
124  element_table.push_back(MassNumber(243, 95)); // Am
125  element_table.push_back(MassNumber(244, 94)); // Pu
126  element_table.push_back(MassNumber(247, 96)); // Cm
127 
128  }
129 
130  };
131 
132 
133 
134  unsigned int deduceAtomicNumberFromMass(const double mass, const double tolerance) {
135  static internal::AtomicNumberDeducer deducer;
136 
137  return(deducer.deduceFromMass(mass, tolerance));
138  }
139 
140 };
unsigned int deduceAtomicNumberFromMass(const double mass, const double tolerance)
Deduce an atomic number from the mass.
Namespace for most things not already encapsulated within a class.