read_recphyloxml_thirdlevel_2/
read_recphyloxml_thirdlevel_2.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    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    // Traitement de 2 fichier fichiers recPhyloXML
22    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    // ---------------------------------------------------------
29    // Create a structure Arena for the global parasite pipe
30    // tree and a vector of structures Arena for gene path trees
31    // ---------------------------------------------------------
32    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    // ---------------------------------------------------------
36    // Fill global parasite pipe tree and is roots and path
37    // genes trees
38    // ---------------------------------------------------------
39    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    // ---------------------------------------------------------
53    // Generate svg of the lobal parasite pipe tree and  path
54    // genes trees
55    // ---------------------------------------------------------
56    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    // ---------------------------------------------------------
66    // Create a structure Arena for the host pipe tree and a
67    // vector of structures Arena for parasite path trees
68    // ---------------------------------------------------------
69    let mut tree_host_pipe: ArenaTree<String> = ArenaTree::default();
70    let mut path_para_trees: std::vec::Vec<ArenaTree<String>> = Vec::new();
71    // ---------------------------------------------------------
72    // Fill  host pipe tree and is roots and path parasite trees
73    // ---------------------------------------------------------
74    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    // ---------------------------------------------------------
99    // Generate svg of the host pipe tree and path parasite trees
100    // ---------------------------------------------------------
101    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    // ---------------------------------------------------------
111    // Generation of first 3 levels svg
112    // ---------------------------------------------------------
113    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    // attention on ne remape pas
167    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    // ---------------------------------------------------------
177    // Generation of second 3 levels svg
178    // ---------------------------------------------------------
179    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    // attention on ne remape pas
206    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    //llmlmlmlmlmlm
243    println!("Building svg 3: gene  tree within host pipe tree");
244    // mapping des gene sur les hotes via les parasites
245    // let mut i = 0;
246    // while i < nb_parasite_pipe {
247    // map_gene_host(&mut path_genes, &mut path_para_trees[i], &mut tree_host_pipe);
248    // i = i + 1;
249    // }
250    map_gene_host(&mut path_genes, &mut path_para_trees, &mut tree_host_pipe);
251
252    // map_gene_host(&mut path_genes, &mut path_para_trees[1], &mut tree_host_pipe);
253    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    // 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}