read_recphyloxml_thirdlevel_6/
read_recphyloxml_thirdlevel_6.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();
16 options.gene_internal = true;
17 let mut config: Config = Config::new();
18 config.species_opacity = "0.7".to_string();
19 config.gene_opacity = "0.9".to_string();
20 let transfers = vec![];
21
22 let infile_gs = "examples/rec0.recphyloxml".to_string();
23 let infile_sh = "examples/rec0upper.recphyloxml".to_string();
24 println!("Two reconciled files => displaying 3-levels reconciliations. ");
26 let outfile_gene_para = String::from("gene_para.svg");
27 let outfile_para_host = String::from("para_host.svg");
28 let outfile_mapped_1 = String::from("mapped_1.svg");
29 let outfile_mapped_2 = String::from("mapped_2.svg");
30
31 let mut global_pipe_parasite: ArenaTree<String> = ArenaTree::default();
36 let mut global_roots: std::vec::Vec<usize> = Vec::new();
37 let mut path_genes: std::vec::Vec<ArenaTree<String>> = Vec::new();
38 read_recphyloxml_multi(
43 infile_gs,
44 &mut global_pipe_parasite,
45 &mut path_genes,
46 &mut global_roots,
47 );
48 let nb_gntree = path_genes.len().clone();
49 println!("Number of gene trees : {}", nb_gntree);
50 info!("List of gene trees : {:?}", path_genes);
51 let nb_parasite_pipe = global_roots.len().clone();
52 println!("Number of parasite trees : {}", nb_parasite_pipe);
53 println!("List of species trees roots : {:?}", global_roots);
54 info!("Global parasite pipe tree : {:?}", global_pipe_parasite);
55 recphyloxml_processing(
60 &mut global_pipe_parasite,
61 &mut path_genes,
62 &mut options,
63 &config,
64 true,
65 &transfers,
66 outfile_gene_para,
67 );
68 let mut tree_host_pipe: ArenaTree<String> = ArenaTree::default();
73 let mut path_para_trees: std::vec::Vec<ArenaTree<String>> = Vec::new();
74 let mut global_roots: std::vec::Vec<usize> = Vec::new();
78 read_recphyloxml_multi(
79 infile_sh,
80 &mut tree_host_pipe,
81 &mut path_para_trees,
82 &mut global_roots,
83 );
84 let nb_parasite_path = path_para_trees.len().clone();
85 println!(
86 "Number of pipe parasite trees in gene-parasite file : {}",
87 nb_parasite_pipe
88 );
89 println!(
90 "Number of path parasite trees in parasite-host file : {}",
91 nb_parasite_path
92 );
93 if nb_parasite_path != nb_parasite_pipe {
94 println!();
95 println!("==============================================");
96 println!("Error! Different number of parasite trees in the 2 files!");
97 println!(" Resulting svg will be incomplete.");
98 println!("==============================================");
99 println!();
100 }
101 recphyloxml_processing(
105 &mut tree_host_pipe,
106 &mut path_para_trees,
107 &mut options,
108 &config,
109 true,
110 &transfers,
111 outfile_para_host,
112 );
113 info!("Parasite trees as a 'path tree' : {:?}", path_para_trees);
117 info!(
118 "Parasite tree as a 'pipe tree' : {:?}",
119 global_pipe_parasite
120 );
121 println!("==============================================");
122 println!("Map parasite as 'path' to parasite as 'pipe'");
123 println!("==============================================");
124 let mut i = 0;
125 while i < nb_parasite_pipe {
126 map_parasite_g2s(&mut global_pipe_parasite, &mut path_para_trees[i]);
127 i = i + 1;
128 }
129 info!(
130 "Global parasite tree wih events : {:?}",
131 global_pipe_parasite
132 );
133 reset_pos(&mut global_pipe_parasite);
134 let mut i = 0;
135 while i < nb_gntree {
136 reset_pos(&mut path_genes[i]);
137 i = i + 1;
138 }
139 println!("==============================================");
140 println!("Map parasite as 'species' to parasite as 'gene'");
141 println!("==============================================");
142 let mut i = 0;
143 while i < nb_parasite_pipe {
144 map_parasite_s2g(
145 &mut global_pipe_parasite,
146 &mut path_para_trees[i],
147 &mut path_genes,
148 );
149 i = i + 1;
150 }
151 info!(
152 "Global pipe parasite after mapping s2g : {:?}",
153 global_pipe_parasite
154 );
155 println!("==============================================");
156 println!("Map parasite as 'gene' to parasite as 'species' again");
157 println!("==============================================");
158 let mut i = 0;
159 while i < nb_parasite_pipe {
160 map_parasite_g2s(&mut global_pipe_parasite, &mut path_para_trees[i]);
161 i = i + 1;
162 }
163 reset_pos(&mut global_pipe_parasite);
164 let mut i = 0;
165 while i < nb_gntree {
166 reset_pos(&mut path_genes[i]);
167 i = i + 1;
168 }
169 recphyloxml_processing(
171 &mut global_pipe_parasite,
172 &mut path_genes,
173 &mut options,
174 &config,
175 false,
176 &transfers,
177 outfile_mapped_1,
178 );
179 let mut i = 0;
183 let gene_transfers = get_gtransfer(&mut path_genes[i]);
184 info!("Transfers = {:?}", gene_transfers);
185 let mut mapped_gene_transfers = map_transfer_mul(gene_transfers, &mut path_para_trees);
186 info!("Mapped transfers = {:?}", mapped_gene_transfers);
187 i = i + 1;
188 while i < nb_gntree {
189 let gene_transfers = get_gtransfer(&mut path_genes[i]);
190 info!("Transfers = {:?}", gene_transfers);
191 let mapped = map_transfer(gene_transfers, &mut path_para_trees[0]);
192 info!("Mapped transfers = {:?}", mapped);
193 for val in mapped {
194 mapped_gene_transfers.push(val);
195 }
196 i = i + 1;
197 }
198 reset_pos(&mut tree_host_pipe);
199 let mut i = 0;
200 while i < nb_parasite_pipe {
201 reset_pos(&mut path_para_trees[i]);
202 i = i + 1;
203 }
204 println!(
205 "Building svg 2: parasite tree within host pipe tree and mapped tarnsfers {}",
206 outfile_mapped_2
207 );
208 recphyloxml_processing(
210 &mut tree_host_pipe,
211 &mut path_para_trees,
212 &mut options,
213 &config,
214 false,
215 &mapped_gene_transfers,
216 outfile_mapped_2,
217 );
218
219 reset_pos(&mut global_pipe_parasite);
220 phyloxml_processing(
221 &mut global_pipe_parasite,
222 &mut options,
223 &config,
224 "para_simple.svg".to_string(),
225 );
226 reset_pos(&mut tree_host_pipe);
227 phyloxml_processing(
228 &mut tree_host_pipe,
229 &mut options,
230 &config,
231 "host_simple.svg".to_string(),
232 );
233 let mut i = 0;
234 while i < nb_parasite_pipe {
235 reset_pos(&mut path_para_trees[i]);
236 phyloxml_processing(
237 &mut path_para_trees[i],
238 &mut options,
239 &config,
240 ("gene_simple_".to_owned() + &i.to_string() + ".svg").to_string(),
241 );
242 i = i + 1;
243 }
244
245 println!("Building svg 3: gene tree within host pipe tree");
248 map_gene_host(&mut path_genes, &mut path_para_trees, &mut tree_host_pipe);
249
250 reset_pos(&mut tree_host_pipe);
252 let mut i = 0;
253 while i < nb_gntree {
254 reset_pos(&mut path_genes[i]);
255 i = i + 1;
256 }
257
258 recphyloxml_processing(
259 &mut tree_host_pipe,
260 &mut path_genes,
261 &mut options,
262 &config,
263 true,
264 &vec![],
265 "mapped_3.svg".to_string(),
266 );
267 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}