molio 0.4.0

A library for reading chemical file formats
Documentation
// SPDX-License-Identifier: BSD-3-Clause
// Copyright (c) 2025 William Bro-Jørgensen
// Copyright (c) 2020 Guillaume Fraux and contributors
//
// See LICENSE at the project root for full text.

// this file is a translation of an auto-generated C++ file.
// the C++ file (and the python script used to generate it can be found
// her: https://github.com/chemfiles/chemfiles/blob/8b70661890636c40472e3303e447d434af6237eb/src/pdb_connectivity.cpp)
//
// The data file from which the auto-generated C++ file has been generated
// can be found here: https://files.wwpdb.org/pub/pdb/data/monomers/het_dictionary.txt

use phf::phf_map;

/// generated for the following residues
/// A, ALA, ARG, ASN, ASP, C, CYS, DA, DC, DG, DT, G, GLN, GLU, GLY, HIS,
/// ILE, LEU, LYS, MET, PHE, PRO, SER, THR, TRP, TYR, U, VAL,
///
/// List of all interned atom names, by index.
pub const INTERNER: &[&str; 136] = &[
    "P", "HOP3", "OP3", "OP1", "OP2", "O5'", "HOP2", "C5'", "C4'", "H5'", "H5''", "O4'", "C3'",
    "H4'", "C1'", "O3'", "C2'", "H3'", "HO3'", "O2'", "H2'", "HO2'", "N9", "H1'", "C8", "C4", "N7",
    "H8", "C5", "C6", "N6", "N1", "H61", "H62", "C2", "N3", "H2", "CA", "H", "N", "C", "CB", "HA",
    "O", "OXT", "HB1", "HB2", "HB3", "HXT", "CG", "CD", "HG2", "HG3", "NE", "HD2", "HD3", "CZ",
    "HE", "NH1", "NH2", "HH11", "HH12", "HH21", "HH22", "OD1", "ND2", "HD21", "HD22", "OD2", "O2",
    "N4", "H41", "H42", "H5", "H6", "SG", "HG", "H2''", "O6", "H1", "N2", "H21", "H22", "H3", "O4",
    "C7", "H71", "H72", "H73", "OE1", "NE2", "HE21", "HE22", "OE2", "HE2", "HA2", "HA3", "ND1",
    "CD2", "CE1", "HD1", "HE1", "CG1", "CG2", "HB", "CD1", "HG12", "HG13", "HG21", "HG22", "HG23",
    "HD11", "HD12", "HD13", "HD23", "CE", "NZ", "HE3", "HZ1", "HZ2", "HZ3", "SD", "CE2", "HZ",
    "OG", "OG1", "HG1", "NE1", "CE3", "CZ2", "CZ3", "CH2", "HH2", "OH", "HH", "HG11",
];

// Find the connectivity data for a given residue name
#[must_use]
pub fn find(name: &str) -> Option<&'static [(usize, usize)]> {
    PDB_CONNECTIVITY_MAP.get(name).copied()
}

/// Map from residue code to its list of bonded‐atom‐index pairs.
pub static PDB_CONNECTIVITY_MAP: phf::Map<&'static str, &'static [(usize, usize)]> = phf_map! {
    "A" => &[
        (0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (2, 0), (2, 1), (3, 0), (4, 0),
        (4, 6), (5, 0), (5, 7), (6, 4), (7, 5), (7, 8), (7, 9), (7, 10),
        (8, 7), (8, 11), (8, 12), (8, 13), (9, 7), (10, 7), (11, 8), (11, 14),
        (12, 8), (12, 15), (12, 16), (12, 17), (13, 8), (14, 11), (14, 16),
        (14, 22), (14, 23), (15, 12), (15, 18), (16, 12), (16, 19), (16, 14),
        (16, 20), (17, 12), (18, 15), (19, 16), (19, 21), (20, 16), (21, 19),
        (22, 14), (22, 24), (22, 25), (23, 14), (24, 22), (24, 26), (24, 27),
        (25, 22), (25, 28), (25, 35), (26, 24), (26, 28), (27, 24), (28, 26),
        (28, 29), (28, 25), (29, 28), (29, 30), (29, 31), (30, 29), (30, 32),
        (30, 33), (31, 29), (31, 34), (32, 30), (33, 30), (34, 31), (34, 35),
        (34, 36), (35, 34), (35, 25), (36, 34),
    ],
    "ALA" => &[
        (36, 39), (37, 39), (37, 40), (37, 41), (37, 42), (38, 39), (39, 37),
        (39, 38), (39, 36), (40, 37), (40, 43), (40, 44), (41, 37), (41, 45),
        (41, 46), (41, 47), (42, 37), (43, 40), (44, 40), (44, 48), (45, 41),
        (46, 41), (47, 41), (48, 44),
    ],
    "ARG" => &[
        (36, 39), (37, 39), (37, 40), (37, 41), (37, 42), (38, 39), (39, 37),
        (39, 38), (39, 36), (40, 37), (40, 43), (40, 44), (41, 37), (41, 49),
        (41, 46), (41, 47), (42, 37), (43, 40), (44, 40), (44, 48), (46, 41),
        (47, 41), (48, 44), (49, 41), (49, 50), (49, 51), (49, 52), (50, 49),
        (50, 53), (50, 54), (50, 55), (51, 49), (52, 49), (53, 50), (53, 56),
        (53, 57), (54, 50), (55, 50), (56, 53), (56, 58), (56, 59), (57, 53),
        (58, 56), (58, 60), (58, 61), (59, 56), (59, 62), (59, 63), (60, 58),
        (61, 58), (62, 59), (63, 59),
    ],

    "ASN" => &[
        (64, 49), (65, 49), (65, 66), (65, 67), (66, 65), (67, 65), (36, 39),
        (37, 39), (37, 40), (37, 41), (37, 42), (38, 39), (39, 37), (39, 38),
        (39, 36), (40, 37), (40, 43), (40, 44), (41, 37), (41, 49), (41, 46),
        (41, 47), (42, 37), (43, 40), (44, 40), (44, 48), (46, 41), (47, 41),
        (48, 44), (49, 41), (49, 64), (49, 65)],
    "ASP" => &[
        (64, 49), (68, 49), (68, 54), (37, 39), (37, 40), (37, 41), (37, 42),
        (38, 39), (39, 37), (39, 38), (39, 36), (40, 37), (40, 43), (40, 44),
        (41, 37), (41, 49), (41, 46), (41, 47), (42, 37), (43, 40), (44, 40),
        (44, 48), (46, 41), (47, 41), (48, 44), (49, 41), (49, 64), (49, 68),
        (54, 68), (36, 39)],
    "C" => &[
        (0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (2, 0), (2, 1), (3, 0), (4, 0),
        (4, 6), (5, 0), (5, 7), (6, 4), (7, 5), (7, 8), (7, 9), (7, 10),
        (8, 7), (8, 11), (8, 12), (8, 13), (9, 7), (10, 7), (11, 8), (11, 14),
        (12, 8), (12, 15), (12, 16), (12, 17), (13, 8), (14, 11), (14, 16),
        (14, 31), (14, 23), (15, 12), (15, 18), (16, 12), (16, 19), (16, 14),
        (16, 20), (17, 12), (18, 15), (19, 16), (19, 21), (20, 16), (21, 19),
        (23, 14), (25, 35), (25, 70), (25, 28), (28, 25), (28, 29), (28, 73),
        (29, 31), (29, 28), (29, 74), (31, 14), (31, 34), (31, 29), (34, 31),
        (34, 69), (34, 35), (35, 34), (35, 25), (69, 34), (70, 25), (70, 71),
        (70, 72), (71, 70), (72, 70), (73, 28), (74, 29)],
    "CYS" => &[
        (48, 44), (43, 40), (36, 39), (37, 39), (37, 40), (37, 41), (37, 42),
        (38, 39), (39, 37), (39, 38), (39, 36), (40, 37), (40, 43), (40, 44),
        (41, 37), (41, 75), (41, 46), (41, 47), (42, 37), (75, 41), (75, 76),
        (44, 40), (44, 48), (46, 41), (47, 41), (76, 75)],
    "DA" => &[
        (0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (2, 0), (2, 1), (3, 0), (4, 0),
        (4, 6), (5, 0), (5, 7), (6, 4), (7, 5), (7, 8), (7, 9), (7, 10),
        (8, 7), (8, 11), (8, 12), (8, 13), (9, 7), (10, 7), (11, 8), (11, 14),
        (12, 8), (12, 15), (12, 16), (12, 17), (13, 8), (14, 11), (14, 16),
        (14, 22), (14, 23), (15, 12), (15, 18), (16, 12), (16, 14), (16, 20),
        (16, 77), (17, 12), (18, 15), (20, 16), (22, 14), (22, 24), (22, 25),
        (23, 14), (24, 22), (24, 26), (24, 27), (25, 22), (25, 28), (25, 35),
        (26, 24), (26, 28), (27, 24), (28, 26), (28, 29), (28, 25), (29, 28),
        (29, 30), (29, 31), (30, 29), (30, 32), (30, 33), (31, 29), (31, 34),
        (32, 30), (33, 30), (34, 31), (34, 35), (34, 36), (35, 34), (35, 25),
        (36, 34), (77, 16)],
    "DC" => &[
        (0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (2, 0), (2, 1), (3, 0), (4, 0),
        (4, 6), (5, 0), (5, 7), (6, 4), (7, 5), (7, 8), (7, 9), (7, 10),
        (8, 7), (8, 11), (8, 12), (8, 13), (9, 7), (10, 7), (11, 8), (11, 14),
        (12, 8), (12, 15), (12, 16), (12, 17), (13, 8), (14, 11), (14, 16),
        (14, 31), (14, 23), (15, 12), (15, 18), (16, 12), (16, 14), (16, 20),
        (16, 77), (17, 12), (18, 15), (20, 16), (23, 14), (25, 35), (25, 70),
        (25, 28), (28, 25), (28, 29), (28, 73), (29, 31), (29, 28), (29, 74),
        (31, 14), (31, 34), (31, 29), (34, 31), (34, 69), (34, 35), (35, 34),
        (35, 25), (69, 34), (70, 25), (70, 71), (70, 72), (71, 70), (72, 70),
        (73, 28), (74, 29), (77, 16)],
    "DG" => &[
        (0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (2, 0), (2, 1), (3, 0), (4, 0),
        (4, 6), (5, 0), (5, 7), (6, 4), (7, 5), (7, 8), (7, 9), (7, 10),
        (8, 7), (8, 11), (8, 12), (8, 13), (9, 7), (10, 7), (11, 8), (11, 14),
        (12, 8), (12, 15), (12, 16), (12, 17), (13, 8), (14, 11), (14, 16),
        (14, 22), (14, 23), (15, 12), (15, 18), (16, 12), (16, 14), (16, 20),
        (16, 77), (17, 12), (18, 15), (20, 16), (22, 14), (22, 24), (22, 25),
        (23, 14), (24, 22), (24, 26), (24, 27), (25, 22), (25, 28), (25, 35),
        (26, 24), (26, 28), (27, 24), (28, 26), (28, 29), (28, 25), (29, 28),
        (29, 78), (29, 31), (31, 29), (31, 34), (31, 79), (34, 31), (34, 80),
        (34, 35), (35, 34), (35, 25), (77, 16), (78, 29), (79, 31), (80, 34),
        (80, 81), (80, 82), (81, 80), (82, 80)],
    "DT" => &[
        (0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (2, 0), (2, 1), (3, 0), (4, 0),
        (4, 6), (5, 0), (5, 7), (6, 4), (7, 5), (7, 8), (7, 9), (7, 10),
        (8, 7), (8, 11), (8, 12), (8, 13), (9, 7), (10, 7), (11, 8), (11, 14),
        (12, 8), (12, 15), (12, 16), (12, 17), (13, 8), (14, 11), (14, 16),
        (14, 31), (14, 23), (15, 12), (15, 18), (16, 12), (16, 14), (16, 20),
        (16, 77), (17, 12), (18, 15), (20, 16), (23, 14), (25, 35), (25, 84),
        (25, 28), (28, 25), (28, 85), (28, 29), (29, 31), (29, 28), (29, 74),
        (31, 14), (31, 34), (31, 29), (34, 31), (34, 69), (34, 35), (35, 34),
        (35, 25), (35, 83), (69, 34), (74, 29), (77, 16), (83, 35), (84, 25),
        (85, 28), (85, 86), (85, 87), (85, 88), (86, 85), (87, 85), (88, 85)],
        "G" => &[
        (0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (2, 0), (2, 1), (3, 0), (4, 0),
        (4, 6), (5, 0), (5, 7), (6, 4), (7, 5), (7, 8), (7, 9), (7, 10),
        (8, 7), (8, 11), (8, 12), (8, 13), (9, 7), (10, 7), (11, 8), (11, 14),
        (12, 8), (12, 15), (12, 16), (12, 17), (13, 8), (14, 11), (14, 16),
        (14, 22), (14, 23), (15, 12), (15, 18), (16, 12), (16, 19), (16, 14),
        (16, 20), (17, 12), (18, 15), (19, 16), (19, 21), (20, 16), (21, 19),
        (22, 14), (22, 24), (22, 25), (23, 14), (24, 22), (24, 26), (24, 27),
        (25, 22), (25, 28), (25, 35), (26, 24), (26, 28), (27, 24), (28, 26),
        (28, 29), (28, 25), (29, 28), (29, 78), (29, 31), (31, 29), (31, 34),
        (31, 79), (34, 31), (34, 80), (34, 35), (35, 34), (35, 25), (78, 29),
        (79, 31), (80, 34), (80, 81), (80, 82), (81, 80), (82, 80)],
    "GLN" => &[
        (36, 39), (37, 39), (37, 40), (37, 41), (37, 42), (38, 39), (39, 37),
        (39, 38), (39, 36), (40, 37), (40, 43), (40, 44), (41, 37), (41, 49),
        (41, 46), (41, 47), (42, 37), (43, 40), (44, 40), (44, 48), (46, 41),
        (47, 41), (48, 44), (49, 41), (49, 50), (49, 51), (49, 52), (50, 49),
        (50, 89), (50, 90), (51, 49), (52, 49), (89, 50), (90, 50), (90, 91),
        (90, 92), (91, 90), (92, 90)],
    "GLU" => &[
        (36, 39), (37, 39), (37, 40), (37, 41), (37, 42), (38, 39), (39, 37),
        (39, 38), (39, 36), (40, 37), (40, 43), (40, 44), (41, 37), (41, 49),
        (41, 46), (41, 47), (42, 37), (43, 40), (44, 40), (44, 48), (46, 41),
        (47, 41), (48, 44), (49, 41), (49, 50), (49, 51), (49, 52), (50, 49),
        (50, 89), (50, 93), (51, 49), (52, 49), (89, 50), (93, 50), (93, 94),
        (94, 93)],
    "GLY" => &[
        (96, 37), (36, 39), (37, 39), (37, 40), (37, 95), (37, 96), (38, 39),
        (39, 37), (39, 38), (39, 36), (40, 37), (40, 43), (40, 44), (43, 40),
        (44, 40), (44, 48), (48, 44), (95, 37)],
    "HIS" => &[
        (97, 49), (97, 99), (97, 100), (98, 49), (98, 90), (98, 54), (99, 97),
        (99, 90), (99, 101), (36, 39), (37, 39), (37, 40), (37, 41), (37, 42),
        (38, 39), (39, 37), (39, 38), (39, 36), (40, 37), (40, 43), (40, 44),
        (41, 37), (41, 49), (41, 46), (41, 47), (42, 37), (43, 40), (44, 40),
        (44, 48), (46, 41), (47, 41), (48, 44), (49, 41), (49, 97), (49, 98),
        (54, 98), (100, 97), (90, 98), (90, 99), (90, 94), (94, 90), (101, 99)],
    "ILE" => &[
        (36, 39), (37, 39), (37, 40), (37, 41), (37, 42), (38, 39), (39, 37),
        (39, 38), (39, 36), (40, 37), (40, 43), (40, 44), (41, 37), (41, 102),
        (41, 103), (41, 104), (42, 37), (43, 40), (44, 40), (44, 48), (48, 44),
        (102, 41), (102, 105), (102, 106), (102, 107), (103, 41), (103, 108),
        (103, 109), (103, 110), (104, 41), (105, 102), (105, 111), (105, 112),
        (105, 113), (106, 102), (107, 102), (108, 103), (109, 103), (110, 103),
        (111, 105), (112, 105), (113, 105)],
    "LEU" => &[
        (36, 39), (37, 39), (37, 40), (37, 41), (37, 42), (38, 39), (39, 37),
        (39, 38), (39, 36), (40, 37), (40, 43), (40, 44), (41, 37), (41, 49),
        (41, 46), (41, 47), (42, 37), (43, 40), (44, 40), (44, 48), (46, 41),
        (47, 41), (48, 44), (49, 41), (49, 105), (49, 98), (49, 76), (66, 98),
        (67, 98), (76, 49), (98, 49), (98, 66), (98, 67), (98, 114), (105, 49),
        (105, 111), (105, 112), (105, 113), (111, 105), (112, 105), (113, 105),
        (114, 98)],
    "LYS" => &[
        (36, 39), (37, 39), (37, 40), (37, 41), (37, 42), (38, 39), (39, 37),
        (39, 38), (39, 36), (40, 37), (40, 43), (40, 44), (41, 37), (41, 49),
        (41, 46), (41, 47), (42, 37), (43, 40), (44, 40), (44, 48), (46, 41),
        (47, 41), (48, 44), (49, 41), (49, 50), (49, 51), (49, 52), (50, 49),
        (50, 115), (50, 54), (50, 55), (51, 49), (52, 49), (54, 50), (55, 50),
        (94, 115), (115, 50), (115, 116), (115, 94), (115, 117), (116, 115),
        (116, 118), (116, 119), (116, 120), (117, 115), (118, 116), (119, 116),
        (120, 116)],
    "MET" => &[
        (51, 49), (36, 39), (37, 39), (37, 40), (37, 41), (37, 42), (38, 39),
        (39, 37), (39, 38), (39, 36), (40, 37), (40, 43), (40, 44), (41, 37),
        (41, 49), (41, 46), (41, 47), (42, 37), (43, 40), (44, 40), (44, 48),
        (46, 41), (47, 41), (48, 44), (49, 41), (49, 121), (49, 51), (49, 52),
        (115, 121), (115, 101), (115, 94), (115, 117), (52, 49), (117, 115),
        (121, 49), (121, 115), (94, 115), (101, 115)],
    "PHE" => &[
        (36, 39), (37, 39), (37, 40), (37, 41), (37, 42), (38, 39), (39, 37),
        (39, 38), (39, 36), (40, 37), (40, 43), (40, 44), (41, 37), (41, 49),
        (41, 46), (41, 47), (42, 37), (43, 40), (44, 40), (44, 48), (46, 41),
        (47, 41), (48, 44), (49, 41), (49, 105), (49, 98), (54, 98), (56, 99),
        (56, 122), (56, 123), (94, 122), (98, 49), (98, 122), (98, 54), (99, 105),
        (99, 56), (99, 101), (100, 105), (101, 99), (105, 49), (105, 99),
        (105, 100), (122, 98), (122, 56), (122, 94), (123, 56)],
    "PRO" => &[
        (37, 39), (37, 40), (37, 41), (37, 42), (38, 39), (39, 37), (39, 50),
        (39, 38), (40, 37), (40, 43), (40, 44), (41, 37), (41, 49), (41, 46),
        (41, 47), (42, 37), (43, 40), (44, 40), (44, 48), (46, 41), (47, 41),
        (48, 44), (49, 41), (49, 50), (49, 51), (49, 52), (50, 39), (50, 49),
        (50, 54), (50, 55), (51, 49), (52, 49), (54, 50), (55, 50)],
    "SER" => &[
        (48, 44), (36, 39), (37, 39), (37, 40), (37, 41), (37, 42), (38, 39),
        (39, 37), (39, 38), (39, 36), (40, 37), (40, 43), (40, 44), (41, 37),
        (41, 124), (41, 46), (41, 47), (42, 37), (43, 40), (44, 40), (44, 48),
        (46, 41), (47, 41), (76, 124), (124, 41), (124, 76)],
    "THR" => &[
        (36, 39), (37, 39), (37, 40), (37, 41), (37, 42), (38, 39), (39, 37),
        (39, 38), (39, 36), (40, 37), (40, 43), (40, 44), (41, 37), (41, 125),
        (41, 103), (41, 104), (42, 37), (43, 40), (44, 40), (44, 48), (109, 103),
        (110, 103), (48, 44), (104, 41), (108, 103), (103, 41), (103, 108),
        (103, 109), (103, 110), (125, 41), (125, 126), (126, 125)],
    "TRP" => &[
        (128, 98), (128, 130), (128, 117), (129, 122), (129, 131), (129, 119),
        (130, 128), (130, 131), (130, 120), (131, 129), (131, 130), (131, 132),
        (132, 131), (36, 39), (37, 39), (37, 40), (37, 41), (37, 42), (38, 39),
        (39, 37), (39, 38), (39, 36), (40, 37), (40, 43), (40, 44), (41, 37),
        (41, 49), (41, 46), (41, 47), (42, 37), (43, 40), (44, 40), (44, 48),
        (46, 41), (47, 41), (48, 44), (49, 41), (49, 105), (49, 98), (98, 49),
        (98, 122), (98, 128), (100, 105), (101, 127), (105, 49), (105, 127),
        (105, 100), (117, 128), (119, 129), (120, 130), (122, 98), (122, 127),
        (122, 129), (127, 105), (127, 122), (127, 101)],
    "TYR" => &[
        (133, 56), (133, 134), (134, 133), (36, 39), (37, 39), (37, 40),
        (37, 41), (37, 42), (38, 39), (39, 37), (39, 38), (39, 36), (40, 37),
        (40, 43), (40, 44), (41, 37), (41, 49), (41, 46), (41, 47), (42, 37),
        (43, 40), (44, 40), (44, 48), (46, 41), (47, 41), (48, 44), (49, 41),
        (49, 105), (49, 98), (54, 98), (56, 99), (56, 122), (56, 133), (94, 122),
        (98, 49), (98, 122), (98, 54), (99, 105), (99, 56), (99, 101), (100, 105),
        (101, 99), (105, 49), (105, 99), (105, 100), (122, 98), (122, 56),
        (122, 94)],
    "U" => &[
        (0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (2, 0), (2, 1), (3, 0), (4, 0),
        (4, 6), (5, 0), (5, 7), (6, 4), (7, 5), (7, 8), (7, 9), (7, 10),
        (8, 7), (8, 11), (8, 12), (8, 13), (9, 7), (10, 7), (11, 8), (11, 14),
        (12, 8), (12, 15), (12, 16), (12, 17), (13, 8), (14, 11), (14, 16),
        (14, 31), (14, 23), (15, 12), (15, 18), (16, 12), (16, 19), (16, 14),
        (16, 20), (17, 12), (18, 15), (19, 16), (19, 21), (20, 16), (21, 19),
        (23, 14), (25, 35), (25, 84), (25, 28), (28, 25), (28, 29), (28, 73),
        (29, 31), (29, 28), (29, 74), (31, 14), (31, 34), (31, 29), (34, 31),
        (34, 69), (34, 35), (35, 34), (35, 25), (35, 83), (69, 34), (73, 28),
        (74, 29), (83, 35), (84, 25)],
    "VAL" => &[
        (107, 102), (36, 39), (37, 39), (37, 40), (37, 41), (37, 42), (102, 41),
        (102, 135), (102, 106), (102, 107), (39, 37), (39, 38), (39, 36),
        (40, 37), (40, 43), (40, 44), (41, 37), (41, 102), (41, 103), (41, 104),
        (42, 37), (43, 40), (44, 40), (44, 48), (109, 103), (38, 39), (48, 44),
        (104, 41), (110, 103), (108, 103), (103, 41), (103, 108), (103, 109),
        (103, 110), (135, 102), (106, 102)],
};