read_recphyloxml_thirdlevel_6/
read_recphyloxml_thirdlevel_6.rs

1// Visualisation  of  3 levels reconciliation
2//  Case there are several gene trees
3
4use 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    // env::set_var("RUST_LOG", "info");
13    // env_logger::init();
14
15    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    // Traitement de 2 fichier fichiers recPhyloXML
25    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    // ---------------------------------------------------------
32    // Create a structure Arena for the global parasite pipe
33    // tree and a vector of structures Arena for gene path trees
34    // ---------------------------------------------------------
35    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    // ---------------------------------------------------------
39    // Fill global parasite pipe tree and is roots and path
40    // genes trees
41    // ---------------------------------------------------------
42    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    // ---------------------------------------------------------
56    // Generate svg of the lobal parasite pipe tree and  path
57    // genes trees
58    // ---------------------------------------------------------
59    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    // ---------------------------------------------------------
69    // Create a structure Arena for the host pipe tree and a
70    // vector of structures Arena for parasite path trees
71    // ---------------------------------------------------------
72    let mut tree_host_pipe: ArenaTree<String> = ArenaTree::default();
73    let mut path_para_trees: std::vec::Vec<ArenaTree<String>> = Vec::new();
74    // ---------------------------------------------------------
75    // Fill  host pipe tree and is roots and path parasite trees
76    // ---------------------------------------------------------
77    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    // ---------------------------------------------------------
102    // Generate svg of the host pipe tree and path parasite trees
103    // ---------------------------------------------------------
104    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    // ---------------------------------------------------------
114    // Generation of first 3 levels svg
115    // ---------------------------------------------------------
116    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    // attention on ne remape pas
170    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    // ---------------------------------------------------------
180    // Generation of second 3 levels svg
181    // ---------------------------------------------------------
182    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    // attention on ne remape pas
209    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    //llmlmlmlmlmlm
246    // mapping des gene sur les hotes via les parasites
247    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    // map_gene_host(&mut path_genes, &mut path_para_trees[1], &mut tree_host_pipe);
251    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!("DEBUG  FINAL HOST = {:?}",tree_host_pipe);
268    // lmlmlmlm
269
270    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}