elements_rs/isotopes/
thulium.rs

1//! Isotopes of the element Thulium
2#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, strum :: EnumIter)]
3#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4/// Isotopes of the element Thulium
5pub enum ThuliumIsotope {
6    /// Isotope Tm144 of Thulium
7    Tm144,
8    /// Isotope Tm145 of Thulium
9    Tm145,
10    /// Isotope Tm146 of Thulium
11    Tm146,
12    /// Isotope Tm147 of Thulium
13    Tm147,
14    /// Isotope Tm148 of Thulium
15    Tm148,
16    /// Isotope Tm149 of Thulium
17    Tm149,
18    /// Isotope Tm150 of Thulium
19    Tm150,
20    /// Isotope Tm151 of Thulium
21    Tm151,
22    /// Isotope Tm152 of Thulium
23    Tm152,
24    /// Isotope Tm153 of Thulium
25    Tm153,
26    /// Isotope Tm154 of Thulium
27    Tm154,
28    /// Isotope Tm155 of Thulium
29    Tm155,
30    /// Isotope Tm156 of Thulium
31    Tm156,
32    /// Isotope Tm157 of Thulium
33    Tm157,
34    /// Isotope Tm158 of Thulium
35    Tm158,
36    /// Isotope Tm159 of Thulium
37    Tm159,
38    /// Isotope Tm160 of Thulium
39    Tm160,
40    /// Isotope Tm161 of Thulium
41    Tm161,
42    /// Isotope Tm162 of Thulium
43    Tm162,
44    /// Isotope Tm163 of Thulium
45    Tm163,
46    /// Isotope Tm164 of Thulium
47    Tm164,
48    /// Isotope Tm165 of Thulium
49    Tm165,
50    /// Isotope Tm166 of Thulium
51    Tm166,
52    /// Isotope Tm167 of Thulium
53    Tm167,
54    /// Isotope Tm168 of Thulium
55    Tm168,
56    /// Isotope Tm169 of Thulium
57    Tm169,
58    /// Isotope Tm170 of Thulium
59    Tm170,
60    /// Isotope Tm171 of Thulium
61    Tm171,
62    /// Isotope Tm172 of Thulium
63    Tm172,
64    /// Isotope Tm173 of Thulium
65    Tm173,
66    /// Isotope Tm174 of Thulium
67    Tm174,
68    /// Isotope Tm175 of Thulium
69    Tm175,
70    /// Isotope Tm176 of Thulium
71    Tm176,
72    /// Isotope Tm177 of Thulium
73    Tm177,
74    /// Isotope Tm178 of Thulium
75    Tm178,
76    /// Isotope Tm179 of Thulium
77    Tm179,
78}
79impl super::RelativeAtomicMass for ThuliumIsotope {
80    #[inline]
81    fn relative_atomic_mass(&self) -> f64 {
82        match self {
83            Self::Tm144 => 143.97628f64,
84            Self::Tm145 => 144.97039f64,
85            Self::Tm146 => 145.96684f64,
86            Self::Tm147 => 146.9613799f64,
87            Self::Tm148 => 147.958384f64,
88            Self::Tm149 => 148.95289f64,
89            Self::Tm150 => 149.95009f64,
90            Self::Tm151 => 150.945488f64,
91            Self::Tm152 => 151.944422f64,
92            Self::Tm153 => 152.94204f64,
93            Self::Tm154 => 153.94157f64,
94            Self::Tm155 => 154.93921f64,
95            Self::Tm156 => 155.938992f64,
96            Self::Tm157 => 156.936944f64,
97            Self::Tm158 => 157.93698f64,
98            Self::Tm159 => 158.934975f64,
99            Self::Tm160 => 159.935263f64,
100            Self::Tm161 => 160.933549f64,
101            Self::Tm162 => 161.934002f64,
102            Self::Tm163 => 162.9326592f64,
103            Self::Tm164 => 163.933544f64,
104            Self::Tm165 => 164.9324431f64,
105            Self::Tm166 => 165.933561f64,
106            Self::Tm167 => 166.9328562f64,
107            Self::Tm168 => 167.9341774f64,
108            Self::Tm169 => 168.9342179f64,
109            Self::Tm170 => 169.935806f64,
110            Self::Tm171 => 170.9364339f64,
111            Self::Tm172 => 171.9384055f64,
112            Self::Tm173 => 172.9396084f64,
113            Self::Tm174 => 173.942173f64,
114            Self::Tm175 => 174.943841f64,
115            Self::Tm176 => 175.947f64,
116            Self::Tm177 => 176.94904f64,
117            Self::Tm178 => 177.95264f64,
118            Self::Tm179 => 178.95534f64,
119        }
120    }
121}
122impl super::ElementVariant for ThuliumIsotope {
123    #[inline]
124    fn element(&self) -> crate::Element {
125        crate::Element::Tm
126    }
127}
128impl super::MassNumber for ThuliumIsotope {
129    #[inline]
130    fn mass_number(&self) -> u16 {
131        match self {
132            Self::Tm144 => 144u16,
133            Self::Tm145 => 145u16,
134            Self::Tm146 => 146u16,
135            Self::Tm147 => 147u16,
136            Self::Tm148 => 148u16,
137            Self::Tm149 => 149u16,
138            Self::Tm150 => 150u16,
139            Self::Tm151 => 151u16,
140            Self::Tm152 => 152u16,
141            Self::Tm153 => 153u16,
142            Self::Tm154 => 154u16,
143            Self::Tm155 => 155u16,
144            Self::Tm156 => 156u16,
145            Self::Tm157 => 157u16,
146            Self::Tm158 => 158u16,
147            Self::Tm159 => 159u16,
148            Self::Tm160 => 160u16,
149            Self::Tm161 => 161u16,
150            Self::Tm162 => 162u16,
151            Self::Tm163 => 163u16,
152            Self::Tm164 => 164u16,
153            Self::Tm165 => 165u16,
154            Self::Tm166 => 166u16,
155            Self::Tm167 => 167u16,
156            Self::Tm168 => 168u16,
157            Self::Tm169 => 169u16,
158            Self::Tm170 => 170u16,
159            Self::Tm171 => 171u16,
160            Self::Tm172 => 172u16,
161            Self::Tm173 => 173u16,
162            Self::Tm174 => 174u16,
163            Self::Tm175 => 175u16,
164            Self::Tm176 => 176u16,
165            Self::Tm177 => 177u16,
166            Self::Tm178 => 178u16,
167            Self::Tm179 => 179u16,
168        }
169    }
170}
171impl super::IsotopicComposition for ThuliumIsotope {
172    #[inline]
173    fn isotopic_composition(&self) -> Option<f64> {
174        match self {
175            Self::Tm169 => Some(1f64),
176            _ => None,
177        }
178    }
179}
180impl super::MostAbundantIsotope for ThuliumIsotope {
181    fn most_abundant_isotope() -> Self {
182        Self::Tm169
183    }
184}
185impl From<ThuliumIsotope> for crate::Isotope {
186    fn from(isotope: ThuliumIsotope) -> Self {
187        crate::Isotope::Tm(isotope)
188    }
189}
190impl From<ThuliumIsotope> for crate::Element {
191    fn from(_isotope: ThuliumIsotope) -> Self {
192        crate::Element::Tm
193    }
194}
195impl TryFrom<u64> for ThuliumIsotope {
196    type Error = crate::errors::Error;
197    fn try_from(value: u64) -> Result<Self, Self::Error> {
198        match value {
199            144u64 => Ok(Self::Tm144),
200            145u64 => Ok(Self::Tm145),
201            146u64 => Ok(Self::Tm146),
202            147u64 => Ok(Self::Tm147),
203            148u64 => Ok(Self::Tm148),
204            149u64 => Ok(Self::Tm149),
205            150u64 => Ok(Self::Tm150),
206            151u64 => Ok(Self::Tm151),
207            152u64 => Ok(Self::Tm152),
208            153u64 => Ok(Self::Tm153),
209            154u64 => Ok(Self::Tm154),
210            155u64 => Ok(Self::Tm155),
211            156u64 => Ok(Self::Tm156),
212            157u64 => Ok(Self::Tm157),
213            158u64 => Ok(Self::Tm158),
214            159u64 => Ok(Self::Tm159),
215            160u64 => Ok(Self::Tm160),
216            161u64 => Ok(Self::Tm161),
217            162u64 => Ok(Self::Tm162),
218            163u64 => Ok(Self::Tm163),
219            164u64 => Ok(Self::Tm164),
220            165u64 => Ok(Self::Tm165),
221            166u64 => Ok(Self::Tm166),
222            167u64 => Ok(Self::Tm167),
223            168u64 => Ok(Self::Tm168),
224            169u64 => Ok(Self::Tm169),
225            170u64 => Ok(Self::Tm170),
226            171u64 => Ok(Self::Tm171),
227            172u64 => Ok(Self::Tm172),
228            173u64 => Ok(Self::Tm173),
229            174u64 => Ok(Self::Tm174),
230            175u64 => Ok(Self::Tm175),
231            176u64 => Ok(Self::Tm176),
232            177u64 => Ok(Self::Tm177),
233            178u64 => Ok(Self::Tm178),
234            179u64 => Ok(Self::Tm179),
235            _ => Err(crate::errors::Error::Isotope(crate::Element::Tm, value)),
236        }
237    }
238}
239impl TryFrom<u8> for ThuliumIsotope {
240    type Error = crate::errors::Error;
241    fn try_from(value: u8) -> Result<Self, Self::Error> {
242        Self::try_from(u64::from(value))
243    }
244}
245impl TryFrom<u16> for ThuliumIsotope {
246    type Error = crate::errors::Error;
247    fn try_from(value: u16) -> Result<Self, Self::Error> {
248        Self::try_from(u64::from(value))
249    }
250}
251impl TryFrom<u32> for ThuliumIsotope {
252    type Error = crate::errors::Error;
253    fn try_from(value: u32) -> Result<Self, Self::Error> {
254        Self::try_from(u64::from(value))
255    }
256}
257impl core::fmt::Display for ThuliumIsotope {
258    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
259        match self {
260            Self::Tm144 => write!(f, "Tm144"),
261            Self::Tm145 => write!(f, "Tm145"),
262            Self::Tm146 => write!(f, "Tm146"),
263            Self::Tm147 => write!(f, "Tm147"),
264            Self::Tm148 => write!(f, "Tm148"),
265            Self::Tm149 => write!(f, "Tm149"),
266            Self::Tm150 => write!(f, "Tm150"),
267            Self::Tm151 => write!(f, "Tm151"),
268            Self::Tm152 => write!(f, "Tm152"),
269            Self::Tm153 => write!(f, "Tm153"),
270            Self::Tm154 => write!(f, "Tm154"),
271            Self::Tm155 => write!(f, "Tm155"),
272            Self::Tm156 => write!(f, "Tm156"),
273            Self::Tm157 => write!(f, "Tm157"),
274            Self::Tm158 => write!(f, "Tm158"),
275            Self::Tm159 => write!(f, "Tm159"),
276            Self::Tm160 => write!(f, "Tm160"),
277            Self::Tm161 => write!(f, "Tm161"),
278            Self::Tm162 => write!(f, "Tm162"),
279            Self::Tm163 => write!(f, "Tm163"),
280            Self::Tm164 => write!(f, "Tm164"),
281            Self::Tm165 => write!(f, "Tm165"),
282            Self::Tm166 => write!(f, "Tm166"),
283            Self::Tm167 => write!(f, "Tm167"),
284            Self::Tm168 => write!(f, "Tm168"),
285            Self::Tm169 => write!(f, "Tm169"),
286            Self::Tm170 => write!(f, "Tm170"),
287            Self::Tm171 => write!(f, "Tm171"),
288            Self::Tm172 => write!(f, "Tm172"),
289            Self::Tm173 => write!(f, "Tm173"),
290            Self::Tm174 => write!(f, "Tm174"),
291            Self::Tm175 => write!(f, "Tm175"),
292            Self::Tm176 => write!(f, "Tm176"),
293            Self::Tm177 => write!(f, "Tm177"),
294            Self::Tm178 => write!(f, "Tm178"),
295            Self::Tm179 => write!(f, "Tm179"),
296        }
297    }
298}
299#[cfg(test)]
300mod tests {
301    use strum::IntoEnumIterator;
302
303    use super::*;
304    use crate::isotopes::{
305        ElementVariant, IsotopicComposition, MassNumber, MostAbundantIsotope, RelativeAtomicMass,
306    };
307    #[test]
308    fn test_relative_atomic_mass() {
309        for isotope in ThuliumIsotope::iter() {
310            let mass = isotope.relative_atomic_mass();
311            assert!(mass > 0.0, "Mass should be positive for {isotope:?}");
312        }
313    }
314    #[test]
315    fn test_element() {
316        for isotope in ThuliumIsotope::iter() {
317            let element = isotope.element();
318            assert_eq!(element, crate::Element::Tm, "Element should be correct for {isotope:?}");
319        }
320    }
321    #[test]
322    fn test_mass_number() {
323        for isotope in ThuliumIsotope::iter() {
324            let mass_number = isotope.mass_number();
325            assert!(
326                mass_number > 0 && mass_number < 300,
327                "Mass number should be reasonable for {isotope:?}"
328            );
329        }
330    }
331    #[test]
332    fn test_isotopic_composition() {
333        for isotope in ThuliumIsotope::iter() {
334            let comp = isotope.isotopic_composition();
335            if let Some(c) = comp {
336                assert!(
337                    (0.0..=1.0).contains(&c),
338                    "Composition should be between 0 and 1 for {isotope:?}"
339                );
340            }
341        }
342    }
343    #[test]
344    fn test_most_abundant() {
345        let most_abundant = ThuliumIsotope::most_abundant_isotope();
346        let _ = most_abundant.relative_atomic_mass();
347    }
348    #[test]
349    fn test_from_isotope() {
350        for isotope in ThuliumIsotope::iter() {
351            let iso: crate::Isotope = isotope.into();
352            match iso {
353                crate::Isotope::Tm(i) => assert_eq!(i, isotope),
354                _ => panic!("Wrong isotope type"),
355            }
356        }
357    }
358    #[test]
359    fn test_from_element() {
360        for isotope in ThuliumIsotope::iter() {
361            let elem: crate::Element = isotope.into();
362            assert_eq!(elem, crate::Element::Tm);
363        }
364    }
365    #[test]
366    fn test_try_from_mass_number() {
367        for isotope in ThuliumIsotope::iter() {
368            let mass = isotope.mass_number();
369            let iso = ThuliumIsotope::try_from(mass).unwrap();
370            assert_eq!(iso, isotope);
371            let iso_u32 = ThuliumIsotope::try_from(u32::from(mass)).unwrap();
372            assert_eq!(iso_u32, isotope);
373            if let Ok(mass_u8) = u8::try_from(mass) {
374                let iso_u8 = ThuliumIsotope::try_from(mass_u8).unwrap();
375                assert_eq!(iso_u8, isotope);
376            }
377        }
378        assert!(ThuliumIsotope::try_from(0_u16).is_err());
379        assert!(ThuliumIsotope::try_from(1000_u16).is_err());
380        assert!(ThuliumIsotope::try_from(0_u32).is_err());
381        assert!(ThuliumIsotope::try_from(1000_u32).is_err());
382        assert!(ThuliumIsotope::try_from(0_u8).is_err());
383    }
384    #[test]
385    fn test_display() {
386        for isotope in ThuliumIsotope::iter() {
387            let s = alloc::format!("{isotope}");
388            assert!(!s.is_empty(), "Display should not be empty for {isotope:?}");
389        }
390    }
391}