haddock_restraints/core/
air.rs1use std::collections::HashSet;
2
3use crate::core::{interactor, pml, utils};
4
5pub struct Air(Vec<interactor::Interactor>);
10
11impl Air {
12 pub fn new(interactors: Vec<interactor::Interactor>) -> Self {
22 Air(interactors)
23 }
24
25 pub fn find_partners(
35 &self,
36 interactor: &interactor::Interactor,
37 ) -> Vec<&interactor::Interactor> {
38 self.0
39 .iter()
40 .filter(|x| x.target().contains(&interactor.id()) && x.id() != interactor.id())
41 .collect()
42 }
43
44 pub fn gen_tbl(&self) -> Result<String, &str> {
55 let mut tbl = String::new();
56
57 for interactor in self.0.iter() {
58 match interactor.is_valid() {
59 Ok(_) => (),
60 Err(err) => {
61 eprintln!("## Interactor {} is not valid ##", interactor.id());
62 return Err(err);
63 }
64 }
65
66 let partners = self.find_partners(interactor);
67
68 if partners.is_empty() {
69 continue;
70 }
71
72 let target_res = interactor::collect_residues(partners);
76 let block = interactor.create_block(target_res);
77 tbl.push_str(&block);
78 }
79 Ok(tbl)
80 }
81
82 pub fn gen_pml(&self, output_f: &str, structure: Option<&str>) {
83 let mut pml = String::new();
84
85 if let Some(structure) = structure {
86 pml.push_str(format!("load {}\n", structure).as_str());
87 }
88
89 pml.push_str(&pml::header());
90
91 let mut active: HashSet<(i16, &str)> = HashSet::new();
92 let mut passive: HashSet<(i16, &str)> = HashSet::new();
93
94 for interactor in self.0.iter() {
95 let partners = self.find_partners(interactor);
96
97 if partners.is_empty() {
98 continue;
99 }
100
101 interactor.active().iter().for_each(|r| {
102 active.insert((*r, interactor.chain()));
103 });
104
105 let target_res = interactor::collect_residues(partners);
106
107 target_res.iter().for_each(|r| {
108 let resnum = r.res_number.unwrap_or(0);
109 passive.insert((resnum, r.chain_id));
110 });
111
112 let block = interactor.make_pml_string(target_res);
113 pml.push_str(&block);
114 }
115
116 pml.push_str(&pml::color_footer(
117 passive.iter().map(|&(r, c)| (r, c)),
118 active.iter().map(|&(r, c)| (r, c)),
119 ));
120
121 utils::write_string_to_file(&pml, output_f).expect("Could not write pml")
122 }
123}
124
125fn _append_header(index: usize) -> String {
137 format!(
138 "!========================================!\n\
139 ! HADDOCK AIR restraints for selection {} !\n\
140 !========================================!\n",
141 index + 1
142 )
143}