1pub mod types;
2mod config;
3mod utils;
4pub mod fingerprint;
5pub mod similarity;
6pub mod substructure;
7
8#[derive(Debug)]
9pub struct ChiralDB {
10 fp_docs: fingerprint::FingerprintDB,
11 smiles_docs: substructure::SmilesDB,
12 }
14
15impl ChiralDB {
16 pub fn new() -> Self {
17 let conf = config::load_configuration();
18 let fp_docs = fingerprint::load_fingerprint_db(&conf);
19 let smiles_docs = substructure::load_smiles_db(&conf);
20 Self { fp_docs, smiles_docs }
23 }
24
25 fn desc_fingerprint_db(&self) -> String {
26 let mut desc: Vec<String> = vec![vec!["Name", "Entries", "FP Type"].join("\t\t"), "=".repeat(50)];
27 desc.extend(self.fp_docs.keys().map(|key| format!("{}\t\t{}", key, self.fp_docs[key].as_ref().desc())).collect::<Vec<String>>());
28 desc.join("\n")
29 }
30
31 fn desc_smiles_db(&self) -> String {
32 let mut desc: Vec<String> = vec![vec!["Name", "Entries"].join("\t\t"), "=".repeat(50)];
33 desc.extend(self.smiles_docs.keys().map(|key| format!("{}\t\t{}", key, self.smiles_docs[key].as_ref().desc())).collect::<Vec<String>>());
34 desc.join("\n")
35 }
36
37 pub fn desc(&self) -> String {
38 vec![
39 self.desc_fingerprint_db(),
40 self.desc_smiles_db()
41 ].join("\n".repeat(3).as_str())
42 }
43
44 pub fn query_similarity_for_smiles(&self, doc_name: &String, smiles: &String, cut_off: f32) -> types::ResultSimilarity {
45 if self.fp_docs.contains_key(doc_name) {
46 similarity::query_similarity_for_smiles(smiles, &self.fp_docs[doc_name], cut_off)
47 } else {
48 types::ResultSimilarity::new()
49 }
50 }
51
52 pub fn query_substructure_for_smarts(&self, doc_name: &String, smarts: &types::SMARTS) -> types::ResultSubstructure {
53 if self.smiles_docs.contains_key(doc_name) {
54 substructure::query_substructure(&types::Toolkit::OpenBabel, smarts, &self.smiles_docs[doc_name])
55 } else {
56 types::ResultSubstructure::new()
57 }
58 }
59}