///|
/// Bio.Crystal demo: small-molecule crystallographic CIF parsing.
///
/// Demonstrates unit-cell geometry, space-group lookup, coordinate
/// transformations, CIF parsing, and crystal-structure analysis.
fn main {
println("=== Bio.Crystal Demo ===\n")
// 1. Unit cell.
println("1. Unit Cell:")
let cell = @bio.UnitCell::new(
a=5.418,
b=5.418,
c=7.543,
alpha=90.0,
beta=90.0,
gamma=120.0,
)
println(" a=\{cell.a}, b=\{cell.b}, c=\{cell.c}")
println(" alpha=\{cell.alpha}, beta=\{cell.beta}, gamma=\{cell.gamma}")
let vol = @bio.unit_cell_volume(cell)
println(" Volume: \{vol} A^3")
// 2. Crystal density.
println("\n2. Crystal Density:")
let rho = @bio.crystal_density(cell, 2, 78.11)
println(" Z=2, MW=78.11 g/mol")
println(" Density: \{rho} g/cm^3")
// 3. Space group lookup.
println("\n3. Space Group Lookup:")
let sg14 = @bio.lookup_space_group(14)
println(" #14: \{sg14.symbol}")
let sg19 = @bio.lookup_space_group(19)
println(" #19: \{sg19.symbol}")
let sg225 = @bio.lookup_space_group(225)
println(" #225: \{sg225.symbol}")
// 4. Coordinate transformations.
println("\n4. Coordinate Transformations:")
let (x, y, z) = @bio.fractional_to_cartesian(cell, 0.5, 0.5, 0.5)
println(" Fractional (0.5, 0.5, 0.5) -> Cartesian (\{x}, \{y}, \{z})")
let (xf, yf, zf) = @bio.cartesian_to_fractional(cell, x, y, z)
println(" Cartesian back to Fractional (\{xf}, \{yf}, \{zf})")
// 5. Parse a CIF file.
println("\n5. Parse CIF File:")
let cif_text = @bio.crystal_sample_cif()
let blocks = @bio.parse_cif(cif_text)
println(" Parsed \{blocks.length()} block(s)")
println(" Block name: \{blocks[0].name}")
// 6. Convert CIF block to CrystalStructure.
println("\n6. Convert to CrystalStructure:")
let s = @bio.cif_block_to_crystal(blocks[0])
println(" Name: \{s.name}")
println(" Atoms: \{s.atoms.length()}")
println(" Z = \{s.z}")
println(" MW = \{s.molecular_weight} g/mol")
println(" Space group: \{s.space_group.symbol} (#\{s.space_group.number})")
println(" Volume: \{@bio.unit_cell_volume(s.cell)} A^3")
let density = @bio.crystal_density(s.cell, s.z, s.molecular_weight)
println(" Density: \{density} g/cm^3")
// 7. Atoms.
println("\n7. Atom Sites:")
println(" label\telement\tx\ty\tz")
for i in 0..