knuckles_parse/records/
dbref.rs1#[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}