Skip to main content

ferritin_core/views/
model_atom.rs

1use crate::info::elements::Element;
2use crate::model::Model;
3
4/// Read-only view into a single atom from a [`Model`].
5pub struct ModelAtomView<'a> {
6    pub(crate) model: &'a Model,
7    pub(crate) idx: usize,
8}
9
10impl<'a> ModelAtomView<'a> {
11    pub(crate) fn new(model: &'a Model, idx: usize) -> Self {
12        ModelAtomView { model, idx }
13    }
14
15    /// `[x, y, z]` for this atom (AoS convenience; allocation-free from SoA).
16    pub fn coords(&self) -> [f32; 3] {
17        self.model.coord(self.idx)
18    }
19
20    pub fn element(&self) -> Element {
21        self.model.hierarchy.atoms.element[self.idx]
22    }
23
24    pub fn atom_name(&self) -> &'a str {
25        &self.model.hierarchy.atoms.atom_name[self.idx]
26    }
27
28    /// Author-assigned atom identifier (`auth_atom_id`).
29    pub fn auth_atom_name(&self) -> &'a str {
30        &self.model.hierarchy.atoms.auth_atom_name[self.idx]
31    }
32
33    pub fn residue_id(&self) -> i32 {
34        let res_idx = self.model.hierarchy.residue_of_atom(self.idx);
35        self.model.hierarchy.residues.auth_seq_id[res_idx]
36    }
37
38    pub fn residue_name(&self) -> &'a str {
39        let res_idx = self.model.hierarchy.residue_of_atom(self.idx);
40        &self.model.hierarchy.residues.comp_id[res_idx]
41    }
42
43    /// Author-assigned component identifier (`auth_comp_id`).
44    pub fn auth_residue_name(&self) -> &'a str {
45        let res_idx = self.model.hierarchy.residue_of_atom(self.idx);
46        &self.model.hierarchy.residues.auth_comp_id[res_idx]
47    }
48
49    /// Canonical chain identifier (`label_asym_id`).
50    pub fn label_chain_id(&self) -> &'a str {
51        let res_idx = self.model.hierarchy.residue_of_atom(self.idx);
52        let chain_idx = self.model.hierarchy.chain_of_residue(res_idx);
53        &self.model.hierarchy.chains.label_asym_id[chain_idx]
54    }
55
56    pub fn chain_id(&self) -> &'a str {
57        let res_idx = self.model.hierarchy.residue_of_atom(self.idx);
58        let chain_idx = self.model.hierarchy.chain_of_residue(res_idx);
59        &self.model.hierarchy.chains.auth_asym_id[chain_idx]
60    }
61
62    pub fn is_hetero(&self) -> bool {
63        let res_idx = self.model.hierarchy.residue_of_atom(self.idx);
64        self.model.hierarchy.residues.group[res_idx]
65            == crate::model::tables::ResidueGroup::NonPolymer
66    }
67
68    pub fn index(&self) -> usize {
69        self.idx
70    }
71}