read_recphyloxml_thirdlevel_2/
read_recphyloxml_thirdlevel_2.rs1use light_phylogeny::{
5 get_gtransfer, map_gene_host, map_parasite_g2s, map_parasite_s2g, map_transfer,
6 map_transfer_mul, phyloxml_processing, read_recphyloxml_multi, recphyloxml_processing,
7 reset_pos, ArenaTree, Config, Options,
8};
9use log::info;
10
11fn main() {
12 let mut options: Options = Options::new();
13 options.gene_internal = true;
14 options.species_internal = true;
15 let mut config: Config = Config::new();
16 config.species_opacity = "0.7".to_string();
17 config.gene_opacity = "0.9".to_string();
18 let transfers = vec![];
19 let infile_gs = "examples/test1_mult_parasite/recgs_mult_host_dtl.recphyloxml".to_string();
20 let infile_sh = "examples/test1_mult_parasite/rechp_dtl.recphyloxml".to_string();
21 println!("Two reconciled files => displaying 3-levels reconciliations. ");
23 let outfile_gene_para = String::from("gene_para.svg");
24 let outfile_para_host = String::from("para_host.svg");
25 let outfile_mapped_1 = String::from("mapped_1.svg");
26 let outfile_mapped_2 = String::from("mapped_2.svg");
27
28 let mut global_pipe_parasite: ArenaTree<String> = ArenaTree::default();
33 let mut global_roots: std::vec::Vec<usize> = Vec::new();
34 let mut path_genes: std::vec::Vec<ArenaTree<String>> = Vec::new();
35 read_recphyloxml_multi(
40 infile_gs,
41 &mut global_pipe_parasite,
42 &mut path_genes,
43 &mut global_roots,
44 );
45 let nb_gntree = path_genes.len().clone();
46 println!("Number of gene trees : {}", nb_gntree);
47 info!("List of gene trees : {:?}", path_genes);
48 let nb_parasite_pipe = global_roots.len().clone();
49 println!("Number of parasite trees : {}", nb_parasite_pipe);
50 println!("List of species trees roots : {:?}", global_roots);
51 info!("Global parasite pipe tree : {:?}", global_pipe_parasite);
52 recphyloxml_processing(
57 &mut global_pipe_parasite,
58 &mut path_genes,
59 &mut options,
60 &config,
61 true,
62 &transfers,
63 outfile_gene_para,
64 );
65 let mut tree_host_pipe: ArenaTree<String> = ArenaTree::default();
70 let mut path_para_trees: std::vec::Vec<ArenaTree<String>> = Vec::new();
71 let mut global_roots: std::vec::Vec<usize> = Vec::new();
75 read_recphyloxml_multi(
76 infile_sh,
77 &mut tree_host_pipe,
78 &mut path_para_trees,
79 &mut global_roots,
80 );
81 let nb_parasite_path = path_para_trees.len().clone();
82 println!(
83 "Number of pipe parasite trees in gene-parasite file : {}",
84 nb_parasite_pipe
85 );
86 println!(
87 "Number of path parasite trees in parasite-host file : {}",
88 nb_parasite_path
89 );
90 if nb_parasite_path != nb_parasite_pipe {
91 println!();
92 println!("==============================================");
93 println!("Error! Different number of parasite trees in the 2 files!");
94 println!(" Resulting svg will be incomplete.");
95 println!("==============================================");
96 println!();
97 }
98 recphyloxml_processing(
102 &mut tree_host_pipe,
103 &mut path_para_trees,
104 &mut options,
105 &config,
106 true,
107 &transfers,
108 outfile_para_host,
109 );
110 info!("Parasite trees as a 'path tree' : {:?}", path_para_trees);
114 info!(
115 "Parasite tree as a 'pipe tree' : {:?}",
116 global_pipe_parasite
117 );
118 println!("==============================================");
119 println!("Map parasite as 'path' to parasite as 'pipe'");
120 println!("==============================================");
121 let mut i = 0;
122 while i < nb_parasite_pipe {
123 map_parasite_g2s(&mut global_pipe_parasite, &mut path_para_trees[i]);
124 i = i + 1;
125 }
126 info!(
127 "Global parasite tree wih events : {:?}",
128 global_pipe_parasite
129 );
130 reset_pos(&mut global_pipe_parasite);
131 let mut i = 0;
132 while i < nb_gntree {
133 reset_pos(&mut path_genes[i]);
134 i = i + 1;
135 }
136 println!("==============================================");
137 println!("Map parasite as 'species' to parasite as 'gene'");
138 println!("==============================================");
139 let mut i = 0;
140 while i < nb_parasite_pipe {
141 map_parasite_s2g(
142 &mut global_pipe_parasite,
143 &mut path_para_trees[i],
144 &mut path_genes,
145 );
146 i = i + 1;
147 }
148 info!(
149 "Global pipe parasite after mapping s2g : {:?}",
150 global_pipe_parasite
151 );
152 println!("==============================================");
153 println!("Map parasite as 'gene' to parasite as 'species' again");
154 println!("==============================================");
155 let mut i = 0;
156 while i < nb_parasite_pipe {
157 map_parasite_g2s(&mut global_pipe_parasite, &mut path_para_trees[i]);
158 i = i + 1;
159 }
160 reset_pos(&mut global_pipe_parasite);
161 let mut i = 0;
162 while i < nb_gntree {
163 reset_pos(&mut path_genes[i]);
164 i = i + 1;
165 }
166 recphyloxml_processing(
168 &mut global_pipe_parasite,
169 &mut path_genes,
170 &mut options,
171 &config,
172 false,
173 &transfers,
174 outfile_mapped_1,
175 );
176 let mut i = 0;
180 let gene_transfers = get_gtransfer(&mut path_genes[i]);
181 info!("Transfers = {:?}", gene_transfers);
182 let mut mapped_gene_transfers = map_transfer_mul(gene_transfers, &mut path_para_trees);
183 info!("Mapped transfers = {:?}", mapped_gene_transfers);
184 i = i + 1;
185 while i < nb_gntree {
186 let gene_transfers = get_gtransfer(&mut path_genes[i]);
187 info!("Transfers = {:?}", gene_transfers);
188 let mapped = map_transfer(gene_transfers, &mut path_para_trees[0]);
189 info!("Mapped transfers = {:?}", mapped);
190 for val in mapped {
191 mapped_gene_transfers.push(val);
192 }
193 i = i + 1;
194 }
195 reset_pos(&mut tree_host_pipe);
196 let mut i = 0;
197 while i < nb_parasite_pipe {
198 reset_pos(&mut path_para_trees[i]);
199 i = i + 1;
200 }
201 println!(
202 "Building svg 2: parasite tree within host pipe tree and mapped tarnsfers {}",
203 outfile_mapped_2
204 );
205 recphyloxml_processing(
207 &mut tree_host_pipe,
208 &mut path_para_trees,
209 &mut options,
210 &config,
211 false,
212 &mapped_gene_transfers,
213 outfile_mapped_2,
214 );
215
216 reset_pos(&mut global_pipe_parasite);
217 phyloxml_processing(
218 &mut global_pipe_parasite,
219 &mut options,
220 &config,
221 "para_simple.svg".to_string(),
222 );
223 reset_pos(&mut tree_host_pipe);
224 phyloxml_processing(
225 &mut tree_host_pipe,
226 &mut options,
227 &config,
228 "host_simple.svg".to_string(),
229 );
230 let mut i = 0;
231 while i < nb_parasite_pipe {
232 reset_pos(&mut path_para_trees[i]);
233 phyloxml_processing(
234 &mut path_para_trees[i],
235 &mut options,
236 &config,
237 ("gene_simple_".to_owned() + &i.to_string() + ".svg").to_string(),
238 );
239 i = i + 1;
240 }
241
242 println!("Building svg 3: gene tree within host pipe tree");
244 map_gene_host(&mut path_genes, &mut path_para_trees, &mut tree_host_pipe);
251
252 reset_pos(&mut tree_host_pipe);
254 let mut i = 0;
255 while i < nb_gntree {
256 reset_pos(&mut path_genes[i]);
257 i = i + 1;
258 }
259 recphyloxml_processing(
260 &mut tree_host_pipe,
261 &mut path_genes,
262 &mut options,
263 &config,
264 true,
265 &vec![],
266 "mapped_3.svg".to_string(),
267 );
268 println!("Output files:");
271
272 println!(" - host_simple.svg ...... 1 level: host tree");
273 let mut i = 0;
274 while i < nb_parasite_pipe {
275 println!(" - para_simple.svg ...... 2 levels: gene_simple_{}.svg", &i);
276 i = i + 1;
277 }
278 println!(" - para_simple.svg ...... 2 levels: parasite tree(s)");
279 println!(" - gene_para.svg ........ 2 levels: pipe parasite tree(s) with gene tree(s) inside");
280 println!(" - para_host.svg ........ 2 levels: pipe host tree with parasite tree(s) inside");
281 println!(
282 " - mapped_1.svg ........ 3 levels: reconciled pipe parasite tree(s) with gene tree(s)"
283 );
284 println!(
285 " - mapped_2.svg ........ 3 levels: parasite-host reconciliation plus gene transfers"
286 );
287 println!(" - mapped_3.svg ........ 3 levels: pipe host tree with gene tree(s) inside");
288
289 if nb_parasite_path != nb_parasite_pipe {
290 println!();
291 println!("==============================================");
292 println!("Error! Different number of parasite trees in the 2 files!");
293 println!(" Resulting svg will be incomplete.");
294 println!("==============================================");
295 println!();
296 }
297}