use std::collections::HashMap;
use kuva::plot::BrickPlot;
use kuva::plot::brick::BrickTemplate;
use kuva::backend::svg::SvgBackend;
use kuva::render::render::render_multiple;
use kuva::render::layout::Layout;
use kuva::render::plots::Plot;
const OUT: &str = "docs/src/assets/brick";
fn main() {
std::fs::create_dir_all(OUT).expect("could not create docs/src/assets/brick");
dna();
per_row_offsets();
custom_template();
strigar();
println!("Brick SVGs written to {OUT}/");
}
fn dna() {
let sequences = vec![
"CGGCGATCAGGCCGCACTCATCATCATCATCATCATCATCATCATCATCATCATCATCATTCAT",
"CGGCGATCAGGCCGCACTCATCATCATCATCATCATCATCATCATCATCATCATCATTCAT",
"CGGCGATCAGGCCGCACTCATCATCATCATCATCATCATCATCATCATCATCATCATCATTCAT",
"CGGCGATCAGGCCGCACTCATCATCATCATCATCATCATCATCATCATCCATCATCATCATTCAT",
"CGGCGATCAGGCCGCACTCATCATCATCATCATCATCATCATCATCATCCATCATCATCATTCAT",
"CGGCGATCAGGCCGCACTCATCATCATCATCATCATCATCATCATCATCCATCATCATCATCATCATCAT",
];
let names = vec![
"read_1", "read_2", "read_3", "read_4", "read_5", "read_6",
];
let tmpl = BrickTemplate::new().dna();
let plot = BrickPlot::new()
.with_sequences(sequences)
.with_names(names)
.with_template(tmpl.template)
.with_x_offset(18.0);
let plots = vec![Plot::Brick(plot)];
let layout = Layout::auto_from_plots(&plots)
.with_title("Brick Plot — DNA Sequences");
let svg = SvgBackend.render_scene(&render_multiple(plots, layout));
std::fs::write(format!("{OUT}/dna.svg"), svg).unwrap();
}
fn per_row_offsets() {
let sequences = vec![
"CGGCGATCAGGCCGCACTCATCATCATCATCATCATCATCAT", "GCACTCATCATCATCATCATCATCATCATCATCAT", "ATCAGGCCGCACTCATCATCATCATCATCATCATCATCAT", "CACTCATCATCATCATCATCAT", "AGGCCGCACTCATCATCATCATCATCATCATCATCATCAT", ];
let names = vec!["read_1", "read_2", "read_3", "read_4", "read_5"];
let tmpl = BrickTemplate::new().dna();
let plot = BrickPlot::new()
.with_sequences(sequences)
.with_names(names)
.with_template(tmpl.template)
.with_x_offset(12.0) .with_x_offsets(vec![
Some(18.0_f64), Some(10.0), Some(16.0), Some(5.0), None,
]);
let plots = vec![Plot::Brick(plot)];
let layout = Layout::auto_from_plots(&plots)
.with_title("Brick Plot — Per-row Offsets");
let svg = SvgBackend.render_scene(&render_multiple(plots, layout));
std::fs::write(format!("{OUT}/per_row_offsets.svg"), svg).unwrap();
}
fn custom_template() {
let mut tmpl: HashMap<char, String> = HashMap::new();
tmpl.insert('H', "steelblue".into()); tmpl.insert('E', "firebrick".into()); tmpl.insert('C', "#aaaaaa".into()); tmpl.insert('T', "seagreen".into());
let sequences = vec![
"CCCCCHHHHHHHHHHCCCCEEEEEECCCTTCCCEEEEECCC",
"CCCHHHHHHHHHHHHHCCCCEEEEEEECCTCCCEEEEECCC",
"CCCCHHHHHHHHHCCCCCEEEEEECCCTTCCCEEEEEECCC",
"CCCHHHHHHHHHHHHCCCCCEEEEECCCTTCCCEEEEEECCC",
"CCCCHHHHHHHHHCCCCEEEEEECCCTTCCCCEEEEECCCCC",
];
let names = vec!["prot_1", "prot_2", "prot_3", "prot_4", "prot_5"];
let plot = BrickPlot::new()
.with_sequences(sequences)
.with_names(names)
.with_template(tmpl)
.with_values();
let plots = vec![Plot::Brick(plot)];
let layout = Layout::auto_from_plots(&plots)
.with_title("Brick Plot — Protein Secondary Structure");
let svg = SvgBackend.render_scene(&render_multiple(plots, layout));
std::fs::write(format!("{OUT}/custom.svg"), svg).unwrap();
}
fn strigar() {
let strigars: Vec<(String, String)> = vec![
("CAT:A,C:B,T:C".to_string(), "10A1B4A1C1A".to_string()),
("CAT:A,T:B".to_string(), "14A1B1A".to_string()),
("CAT:A,T:B".to_string(), "14A1B1A".to_string()),
("CAT:A,C:B,T:C".to_string(), "10A1B4A1C1A".to_string()),
("CAT:A,C:B,T:C".to_string(), "10A1B4A1C1A".to_string()),
("CAT:A,C:B,GGT:C".to_string(), "10A1B8A1C5A".to_string()),
("CAT:A,C:B".to_string(), "10A1B5A".to_string()),
("CAT:A,C:B,T:C".to_string(), "10A1B4A1C1A".to_string()),
];
let names = vec![
"read_1", "read_2", "read_3", "read_4",
"read_5", "read_6", "read_7", "read_8",
];
let plot = BrickPlot::new()
.with_names(names)
.with_strigars(strigars);
let plots = vec![Plot::Brick(plot)];
let layout = Layout::auto_from_plots(&plots)
.with_title("Brick Plot — Strigar Mode (CAT repeats)");
let svg = SvgBackend.render_scene(&render_multiple(plots, layout));
std::fs::write(format!("{OUT}/strigar.svg"), svg).unwrap();
}