knuckles_parse/records/
dbref.rs

1#[cfg(feature = "serde")]
2use serde::{Deserialize, Serialize};
3
4#[cfg(feature = "python")]
5use pyo3::prelude::*;
6
7#[cfg(feature = "python")]
8use knuckles_macro::pydefault;
9
10#[derive(Debug, Clone)]
11#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
12#[cfg_attr(feature = "python", pyclass(get_all, set_all))]
13#[cfg_attr(feature = "python", pydefault)]
14pub struct DBRefRecord {
15    pub id_code: String,
16    pub chain_id: char,
17    pub seq_begin: u32,
18    pub insert_begin: Option<char>,
19    pub seq_end: u32,
20    pub insert_end: Option<char>,
21    pub database: DBType,
22    pub db_accession: String,
23    pub db_id_code: String,
24    pub db_seq_begin: u32,
25    pub i_dbns_beg: Option<char>,
26    pub db_seq_end: u32,
27    pub db_ins_end: Option<char>,
28}
29
30#[derive(Debug, PartialEq, Clone)]
31#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
32#[cfg_attr(feature = "python", pyclass(eq, eq_int))]
33#[cfg_attr(feature = "python", pydefault)]
34pub enum DBType {
35    GB,
36    NORINE,
37    PDB,
38    UNP,
39}
40
41impl DBType {
42    pub fn new(str: &str) -> Self {
43        match str.trim() {
44            "GB" => DBType::GB,
45            "NORINE" | "NOR" => DBType::NORINE,
46            "PDB" => DBType::PDB,
47            "UNP" => DBType::UNP,
48            _ => panic!("Unknown DBType"),
49        }
50    }
51}
52
53impl DBRefRecord {
54    pub fn new(str: &str) -> Self {
55        let database = DBType::new(&str[26..32]);
56        let mut i_dbns_beg: Option<char> = None;
57        let mut db_ins_end: Option<char> = None;
58        if let DBType::PDB = database {
59            i_dbns_beg = Some(str.chars().nth(60).unwrap());
60            db_ins_end = Some(str.chars().nth(67).unwrap());
61        }
62        DBRefRecord {
63            id_code: str[7..11].trim().to_string(),
64            chain_id: str.chars().nth(12).unwrap(),
65            seq_begin: str[14..18].trim().parse().unwrap(),
66            insert_begin: str[18..19].trim().parse().ok(),
67            seq_end: str[20..24].trim().parse().unwrap(),
68            insert_end: str[24..25].trim().parse().ok(),
69            database,
70            db_accession: str[33..41].trim().to_string(),
71            db_id_code: str[42..54].trim().to_string(),
72            db_seq_begin: str[55..60].trim().parse().unwrap(),
73            i_dbns_beg,
74            db_seq_end: str[62..67].trim().parse().unwrap(),
75            db_ins_end,
76        }
77    }
78}
79
80impl From<&str> for DBRefRecord {
81    fn from(line: &str) -> Self {
82        Self::new(line)
83    }
84}
85
86#[cfg(test)]
87mod tests {
88    use super::*;
89
90    #[test]
91    fn test_new_dbref() {
92        let line = "DBREF  2JHQ A    1   226  UNP    Q9KPK8   UNG_VIBCH        1    226";
93        let record = DBRefRecord::new(line);
94        assert_eq!("2JHQ", record.id_code);
95        assert_eq!('A', record.chain_id);
96        assert_eq!(1, record.seq_begin);
97        assert_eq!(None, record.insert_begin);
98        assert_eq!(226, record.seq_end);
99        assert_eq!(None, record.insert_end);
100        assert_eq!(DBType::UNP, record.database);
101        assert_eq!("Q9KPK8", record.db_accession);
102        assert_eq!("UNG_VIBCH", record.db_id_code);
103        assert_eq!(1, record.db_seq_begin);
104        assert_eq!(None, record.i_dbns_beg);
105        assert_eq!(226, record.db_seq_end);
106        assert_eq!(None, record.db_ins_end);
107        let line = "DBREF  2JHQ A    1   226  PDB    Q9KPK8   UNG_VIBCH        1A   226B";
108        let record = DBRefRecord::new(line);
109        assert_eq!("2JHQ", record.id_code);
110        assert_eq!('A', record.chain_id);
111        assert_eq!(1, record.seq_begin);
112        assert_eq!(None, record.insert_begin);
113        assert_eq!(226, record.seq_end);
114        assert_eq!(None, record.insert_end);
115        assert_eq!(DBType::PDB, record.database);
116        assert_eq!("Q9KPK8", record.db_accession);
117        assert_eq!("UNG_VIBCH", record.db_id_code);
118        assert_eq!(1, record.db_seq_begin);
119        assert_eq!(Some('A'), record.i_dbns_beg);
120        assert_eq!(226, record.db_seq_end);
121        assert_eq!(Some('B'), record.db_ins_end);
122    }
123}