use poa_consensus::plot::{graph_network_svg, graph_network_svg_labeled};
use poa_consensus::{PoaConfig, PoaGraph};
use std::fs;
use std::path::Path;
fn write(path: &str, svg: &str) {
if let Some(parent) = Path::new(path).parent() {
fs::create_dir_all(parent).ok();
}
fs::write(path, svg).unwrap();
println!("{} ({} bytes)", path, svg.len());
}
fn main() {
let linear: &[&[u8]] = &[
b"CATCATCAT",
b"CATCATCAT",
b"CATCATCAT",
b"CATCATCAT",
b"CATCATCAT",
];
let mut g_linear = PoaGraph::new(linear[0], PoaConfig::default()).unwrap();
for r in &linear[1..] {
g_linear.add_read(r).unwrap();
}
let svg = graph_network_svg(&g_linear, None);
write("/tmp/poa_linear.svg", &svg);
write("docs/src/diagrams/poa_linear.svg", &svg);
let hp_reads: &[&[u8]] = &[
b"CATCAT", b"CATCAT", b"CATCAT", b"CATCAT", b"CATCAT", b"CATCAT", b"CATCAT", b"CATCAT",
b"CATCAT", b"CATGAT", ];
let mut g_hp = PoaGraph::new(hp_reads[0], PoaConfig::default()).unwrap();
for r in &hp_reads[1..] {
g_hp.add_read(r).unwrap();
}
let svg_hp = graph_network_svg_labeled(&g_hp, None);
write("/tmp/poa_heaviest_path.svg", &svg_hp);
write("docs/src/diagrams/poa_heaviest_path.svg", &svg_hp);
let full_span: &[&[u8]] = &[b"GGGCATCATGGG", b"GGGCATCATGGG", b"GGGCATCATGGG"];
let partial: &[&[u8]] = &[
b"CATCAT", b"CATCAT", b"CATCAT", b"CATCAT", b"CATCAT", b"CATCAT", b"CATCAT",
];
let mut all_reads: Vec<&[u8]> = full_span.to_vec();
all_reads.extend_from_slice(partial);
let mut g_trim = PoaGraph::new(all_reads[0], PoaConfig::default()).unwrap();
for r in &all_reads[1..] {
g_trim.add_read(r).unwrap();
}
let svg_trim = graph_network_svg_labeled(&g_trim, None);
write("/tmp/poa_boundary_trim.svg", &svg_trim);
write("docs/src/diagrams/poa_boundary_trim.svg", &svg_trim);
fn build_single_allele(reads: &[&[u8]]) -> PoaGraph {
let mut g = PoaGraph::new(reads[0], PoaConfig::default()).unwrap();
for r in &reads[1..] {
g.add_read(r).unwrap();
}
g
}
let cag4: &[&[u8]] = &[
b"CAGCAGCAGCAG",
b"CAGCAGCAGCAG",
b"CAGCAGCAGCAG",
b"CAGCAGCAGCAG",
b"CAGCAGCAGCAG",
b"CAGCAGCAGCAG",
b"CAGCAGCAGCAG",
b"CAGCAGCAGCAG",
b"CAGCAGCAGCAG",
b"CAGCAGCAGCAG",
];
let cag7: &[&[u8]] = &[
b"CAGCAGCAGCAGCAGCAGCAG",
b"CAGCAGCAGCAGCAGCAGCAG",
b"CAGCAGCAGCAGCAGCAGCAG",
b"CAGCAGCAGCAGCAGCAGCAG",
b"CAGCAGCAGCAGCAGCAGCAG",
b"CAGCAGCAGCAGCAGCAGCAG",
b"CAGCAGCAGCAGCAGCAGCAG",
b"CAGCAGCAGCAGCAGCAGCAG",
b"CAGCAGCAGCAGCAGCAGCAG",
b"CAGCAGCAGCAGCAGCAGCAG",
];
let svg_cag_normal = graph_network_svg(&build_single_allele(cag4), None);
write("/tmp/poa_cag_normal.svg", &svg_cag_normal);
write("docs/src/diagrams/poa_cag_normal.svg", &svg_cag_normal);
let svg_cag_expanded = graph_network_svg(&build_single_allele(cag7), None);
write("/tmp/poa_cag_expanded.svg", &svg_cag_expanded);
write("docs/src/diagrams/poa_cag_expanded.svg", &svg_cag_expanded);
write("docs/src/diagrams/poa_cag_repeat.svg", &svg_cag_normal);
let gaa4: &[&[u8]] = &[
b"GAAGAAGAAGAA",
b"GAAGAAGAAGAA",
b"GAAGAAGAAGAA",
b"GAAGAAGAAGAA",
b"GAAGAAGAAGAA",
b"GAAGAAGAAGAA",
b"GAAGAAGAAGAA",
b"GAAGAAGAAGAA",
b"GAAGAAGAAGAA",
b"GAAGAAGAAGAA",
];
let gaa8: &[&[u8]] = &[
b"GAAGAAGAAGAAGAAGAAGAAGAA",
b"GAAGAAGAAGAAGAAGAAGAAGAA",
b"GAAGAAGAAGAAGAAGAAGAAGAA",
b"GAAGAAGAAGAAGAAGAAGAAGAA",
b"GAAGAAGAAGAAGAAGAAGAAGAA",
b"GAAGAAGAAGAAGAAGAAGAAGAA",
b"GAAGAAGAAGAAGAAGAAGAAGAA",
b"GAAGAAGAAGAAGAAGAAGAAGAA",
b"GAAGAAGAAGAAGAAGAAGAAGAA",
b"GAAGAAGAAGAAGAAGAAGAAGAA",
];
let svg_gaa_normal = graph_network_svg(&build_single_allele(gaa4), None);
write("/tmp/poa_gaa_normal.svg", &svg_gaa_normal);
write("docs/src/diagrams/poa_gaa_normal.svg", &svg_gaa_normal);
let svg_gaa_expanded = graph_network_svg(&build_single_allele(gaa8), None);
write("/tmp/poa_gaa_expanded.svg", &svg_gaa_expanded);
write("docs/src/diagrams/poa_gaa_expanded.svg", &svg_gaa_expanded);
write("docs/src/diagrams/poa_gaa_repeat.svg", &svg_gaa_normal);
let allele_a: &[&[u8]] = &[
b"GCTAGCTAGCTACTAGCTAGCT",
b"GCTAGCTAGCTACTAGCTAGCT",
b"GCTAGCTAGCTACTAGCTAGCT",
b"GCTAGCTAGCTACTAGCTAGCT",
b"GCTAGCTAGCTACTAGCTAGCT",
b"GCTAGCTAGCTACTAGCTAGCT",
b"GCTAGCTTGCTACTAGCTAGCT", b"GCTAGCTAGCTACTAGCTAGCT",
b"GCTAGCTAGCTACTAGCTAGCT",
b"GCTAGCTAGCTACTAGCTAGCT",
];
let allele_b: &[&[u8]] = &[
b"GCTAGCTAGCTGCTAGCTAGCT",
b"GCTAGCTAGCTGCTAGCTAGCT",
b"GCTAGCTAGCTGCTAGCTAGCT",
b"GCTAGCTAGCTGCTAGCTAGCT",
b"GCTAGCTAGCTGCTAGCTAGCT",
b"GCTAGCTAGCTGCTAGCTAGCT",
b"GCTAGCTAGCTGCTAGCTAGCT",
b"GCTAGCTAGCTGCTAGCTAGCT",
b"GCTAGCTAGCTGCTAGCTAGCT",
b"GCTAGCTAGCTGCTAGCTAGCT",
];
let mut reads: Vec<&[u8]> = allele_a.to_vec();
reads.extend_from_slice(allele_b);
let mut graph = PoaGraph::new(reads[0], PoaConfig::default()).unwrap();
for r in &reads[1..] {
graph.add_read(r).unwrap();
}
let svg_net = graph_network_svg(&graph, None);
write("/tmp/poa_network.svg", &svg_net);
write("docs/src/diagrams/poa_network.svg", &svg_net);
let probe = b"GCTAGCTAGCTGCTAGCTAGCT";
let svg_overlay = graph_network_svg(&graph, Some(probe));
write("/tmp/poa_network_with_read.svg", &svg_overlay);
write("docs/src/diagrams/poa_network_with_read.svg", &svg_overlay);
let ref_reads: &[&[u8]] = &[
b"ACGTACGTACGT",
b"ACGTACGTACGT",
b"ACGTACGTACGT",
b"ACGTACGTACGT",
b"ACGTACGTACGT",
b"ACGTACGTACGT",
b"ACGTACGTACGT",
b"ACGTACGTACGT",
b"ACGTACGTACGT",
b"ACGTACGTACGT",
b"ACGTACGTACGT",
b"ACGTACGTACGT",
b"ACGTACGTACGT",
b"ACGTACGTACGT",
b"ACGTACGTACGT",
];
let ins_reads: &[&[u8]] = &[
b"ACGTGGACGTACGT",
b"ACGTGGACGTACGT",
b"ACGTGGACGTACGT",
b"ACGTGGACGTACGT",
b"ACGTGGACGTACGT",
];
let mut all_bubble: Vec<&[u8]> = ref_reads.to_vec();
all_bubble.extend_from_slice(ins_reads);
let mut g_bubble = PoaGraph::new(all_bubble[0], PoaConfig::default()).unwrap();
for r in &all_bubble[1..] {
g_bubble.add_read(r).unwrap();
}
let svg_bubble = graph_network_svg(&g_bubble, None);
write("/tmp/poa_large_bubble.svg", &svg_bubble);
write("docs/src/diagrams/poa_large_bubble.svg", &svg_bubble);
let noisy: &[&[u8]] = &[
b"GCTAGCTAGCTAGCTA", b"GCTAGCTAGCTAGCTA",
b"GCTAGCTAGCTAGCTA",
b"GCTAGCTAGCTAGCTA",
b"GCTAGCTAGCTAGCTA",
b"GCTAGCTAGCTAGCTA",
b"GCTTAGCTAGCTAGCTA", b"GCTAGGCTAGCTAGCTA", b"GCTAGCTAAGCTAGCTA", b"GCTAGCTAGCTACCGCTA", ];
let mut g_noisy = PoaGraph::new(noisy[0], PoaConfig::default()).unwrap();
for r in &noisy[1..] {
g_noisy.add_read(r).unwrap();
}
let svg_noisy = graph_network_svg(&g_noisy, None);
write("/tmp/poa_network_noisy.svg", &svg_noisy);
write("docs/src/diagrams/poa_network_noisy.svg", &svg_noisy);
let rfc1_normal: &[&[u8]] = &[
b"AAAAGAAAAGAAAAGAAAAG",
b"AAAAGAAAAGAAAAGAAAAG",
b"AAAAGAAAAGAAAAGAAAAG",
b"AAAAGAAAAGAAAAGAAAAG",
b"AAAAGAAAAGAAAAGAAAAG",
b"AAAAGAAAAGAAAAGAAAAG",
b"AAAAGAAAAGAAAAGAAAAG",
b"AAAAGAAAAGAAAAGAAAAG",
b"AAAAGAAAAGAAAAGAAAAG",
b"AAAAGAAAAGAAAAGAAAAG",
b"AAAAGAAAAGAAAAGAAAAG",
b"AAAAGAAAAGAAAAGAAAAG",
b"AAAAGAAAAGAAAAGAAAAG",
b"AAAAGAAAAGAAAAGAAAAG",
b"AAAAGAAAAGAAAAGAAAAG",
];
let rfc1_patho: &[&[u8]] = &[
b"AAAGTAAAGTAAAGTAAAGTAAAGTAAAGT",
b"AAAGTAAAGTAAAGTAAAGTAAAGTAAAGT",
b"AAAGTAAAGTAAAGTAAAGTAAAGTAAAGT",
b"AAAGTAAAGTAAAGTAAAGTAAAGTAAAGT",
b"AAAGTAAAGTAAAGTAAAGTAAAGTAAAGT",
];
let mut rfc1_reads: Vec<&[u8]> = rfc1_normal.to_vec();
rfc1_reads.extend_from_slice(rfc1_patho);
let mut g_rfc1 = PoaGraph::new(rfc1_reads[0], PoaConfig::default()).unwrap();
for r in &rfc1_reads[1..] {
g_rfc1.add_read(r).unwrap();
}
let svg_rfc1 = graph_network_svg(&g_rfc1, None);
write("/tmp/poa_rfc1_mixed.svg", &svg_rfc1);
write("docs/src/diagrams/poa_rfc1_mixed.svg", &svg_rfc1);
let with_del: &[&[u8]] = &[
b"GCTAGCTAGCTAGCTAGCT",
b"GCTAGCTAGCTAGCTAGCT",
b"GCTAGCTAGCTAGCTAGCT",
b"GCTAGCTAGCTAGCTAGCT",
b"GCTAGCTAGCTAGCTAGCT",
b"GCTAGCTAGCTAGCTAGCT",
b"GCTAGCTAGCTAGCTAGCT",
b"GCTAGCTAGCTAGCTAGCT",
b"GCTAGCTAGCTAGCTAGCT",
b"GCTAGCTAGCTAGCTAGCT",
b"GCTAGCTAGCTAGCT",
b"GCTAGCTAGCTAGCT",
b"GCTAGCTAGCTAGCT",
];
let mut g_del = PoaGraph::new(with_del[0], PoaConfig::default()).unwrap();
for r in &with_del[1..] {
g_del.add_read(r).unwrap();
}
let svg_del = graph_network_svg(&g_del, None);
write("/tmp/poa_network_deletion.svg", &svg_del);
write("docs/src/diagrams/poa_network_deletion.svg", &svg_del);
let svg_del_ov = graph_network_svg(&g_del, Some(b"GCTAGCTAGCTAGCT"));
write("/tmp/poa_network_deletion_overlay.svg", &svg_del_ov);
write(
"docs/src/diagrams/poa_network_deletion_overlay.svg",
&svg_del_ov,
);
}