///|
/// Chromosome Visualization Demo - SVG-based chromosome rendering.
/// Inspired by Biopython's Bio.Graphics.Chromosome module.
///|
fn main {
println("=== Chromosome Visualization Demo ===")
println("Inspired by Biopython's Bio.Graphics.Chromosome module")
println("")
println("1. Creating Chromosome Features")
let gene1 = @bio.ChrFeature::new(name="BRCA1", start=1000.0, end=5000.0)
let gene2 = @bio.ChrFeature::new(name="TP53", start=10000.0, end=15000.0)
let gene3 = @bio.ChrFeature::new(name="EGFR", start=20000.0, end=25000.0)
println(" Created features:")
println(" - BRCA1")
println(" - TP53")
println(" - EGFR")
println("")
println("2. Creating a Chromosome")
let chr1 = @bio.Chromosome::new(
name="chr1",
length=30000.0,
centromere_pos=15000.0,
)
println(" Chromosome: chr1")
println(" Length: 30000 bp")
println(" Centromere position: 15000")
println("")
println("3. Adding Features to Chromosome")
let chr1_with_features = chr1
.add_feature(gene1)
.add_feature(gene2)
.add_feature(gene3)
println(" Added 3 features to chromosome")
println(
" Total features: " + chr1_with_features.features.length().to_string(),
)
println("")
println("4. Adding Regions and Bands")
let region1 = @bio.ChrRegion::new(name="Region1", start=0.0, end=8000.0)
let region2 = @bio.ChrRegion::new(name="Region2", start=18000.0, end=28000.0)
let chr_full = chr1_with_features
.add_region(region1)
.add_region(region2)
.add_band("p36", 0.0, 2000.0, "gpos75")
.add_band("p35", 2000.0, 5000.0, "gpos50")
.add_band("cen", 14000.0, 16000.0, "acen")
.add_band("q21", 20000.0, 24000.0, "gpos25")
println(" Added regions: 2")
println(" Added bands: 4")
println("")
println("5. Feature Query Operations")
let all_features = chr_full.features
let features_in_region = chr_full.features_in_region(5000.0, 12000.0)
println(" All features: " + all_features.length().to_string())
println(
" Features in region 5000-12000: " +
features_in_region.length().to_string(),
)
println("")
println("6. Band Color Calculation")
let stains = ["gneg", "gpos25", "gpos50", "gpos75", "gpos100", "acen", "gvar"]
for stain in stains {
let color = @bio.chr_band_color(stain)
println(" Stain: " + stain + " -> Color: " + color)
}
println("")
println("7. Creating Layout Configuration")
let layout = @bio.ChrLayout::new(
width=900.0,
height=500.0,
show_labels=true,
show_centromere=true,
show_bands=true,
chromosome_thickness=12.0,
)
println(" Layout: 900 x 500")
println(" Show labels: true")
println(" Show centromere: true")
println(" Show bands: true")
println("")
println("8. Generating SVG Output")
let svg_elements = @bio.chr_chromosome_to_svg(
chr_full, layout, 50.0, 100.0, 0.02,
)
println(" SVG elements generated: " + svg_elements.length().to_string())
println(" First element type: " + svg_elements[0].element_type)
println("")
println("9. Creating a Bacterial Chromosome (Circular)")
let bacterial_chr = @bio.Chromosome::new(
name="E.coli",
length=4600000.0,
centromere_pos=0.0,
is_circular=true,
)
let bacterial_svg = @bio.chr_chromosome_to_svg(
bacterial_chr, layout, 50.0, 100.0, 0.001,
)
println(
" Circular chromosome SVG elements: " + bacterial_svg.length().to_string(),
)
println("")
println("=== Demo completed successfully! ===")
println("")
println("Key concepts:")
println("- Chromosome visualization uses SVG for rendering")
println("- Features represent genes, markers, and annotations")
println("- Bands represent staining patterns (G-banding)")
println("- Linear chromosomes have centromere positions")
println("- Circular chromosomes are rendered differently")
}