///|
/// SASA (Solvent Accessible Surface Area) demo.
///
/// Builds a small sample peptide, calculates per-atom SASA via the
/// Shrake-Rupley rolling-ball algorithm, aggregates per-residue results,
/// and prints an overall summary.
///
/// Run: moon run examples/sasa_demo/main.mbt
///|
fn main {
let structure = @bio.sasa_sample_structure()
println("=== Sample Structure ===")
println(" ID: \{structure.get_id()}")
println(" Models: \{structure.get_num_models()}")
println(" Chains: \{structure.get_num_chains()}")
println(" Residues: \{structure.get_num_residues()}")
println(" Atoms: \{structure.get_num_atoms()}")
// Calculate per-atom SASA (100 sphere points, 1.4 Å water probe).
let atom_results = @bio.sasa_calc(structure, 100, 1.4)
println("\n=== Per-Atom SASA ===")
println(" idx atom res sasa(A^2)")
for r in atom_results {
println(
" \{r.get_atom_index()}\t\{r.get_atom_name()}\t\{r.get_resname()}\t\{r.get_sasa()}",
)
}
// Aggregate per-residue SASA.
let residue_results = @bio.sasa_calc_residue(atom_results, structure)
println("\n=== Per-Residue SASA ===")
println(" res total backbone sidechain atoms")
for r in residue_results {
println(
" \{r.get_resname()}\t\{r.get_total_sasa()}\t\{r.get_backbone_sasa()}\t\{r.get_sidechain_sasa()}\t\{r.get_num_atoms()}",
)
}
// Overall summary.
let summary = @bio.sasa_calc_total(atom_results)
println("\n=== Total SASA Summary ===")
println(" Total SASA: \{summary.get_total_sasa()} A^2")
println(" Backbone : \{summary.get_backbone_sasa()} A^2")
println(" Sidechain: \{summary.get_sidechain_sasa()} A^2")
println(" Atoms : \{summary.get_num_atoms()}")
println(" Residues : \{summary.get_num_residues()}")
}