///|
/// Bio.NMR demo: NMR restraint and chemical-shift analysis.
///
/// Demonstrates NOE distance restraints, dihedral-angle restraints,
/// chemical-shift table queries, and NMR peak-list parsing.
fn main {
println("=== Bio.NMR Demo ===\n")
// 1. NOE distance restraints.
println("1. NOE Distance Restraints:")
let restraints = @bio.nmr_sample_noe_restraints()
for i in 0.. {
let v = @bio.noe_violation(r, d)
let status = if v > 0.0 { "VIOLATED" } else { "ok" }
println(
" #\{r.restraint_id}: observed=\{d} A, violation=\{v} A [\{status}]",
)
}
None => continue
}
}
// Summary.
let summary = @bio.noe_restraint_summary(restraints)
println(
"\n Summary: total=\{summary.total}, violated=\{summary.violated}, max_violation=\{summary.max_violation} A",
)
// 2. Dihedral-angle restraints.
println("\n3. Dihedral Angle Restraints:")
let dihedrals = @bio.nmr_sample_dihedral_restraints()
for i in 0.. {
let viol = @bio.dihedral_violation(d, v)
let status = if viol > 0.0 { "VIOLATED" } else { "ok" }
println(
" #\{d.restraint_id}: observed=\{v} deg, violation=\{viol} deg [\{status}]",
)
}
None => continue
}
}
// 3. Chemical shifts.
println("\n5. Chemical Shifts:")
let table = @bio.nmr_sample_chemical_shifts()
println(" Total shifts: \{table.shifts.length()}")
let h_shifts = @bio.shifts_for_element(table, "H")
println(" H shifts: \{h_shifts.length()}")
let n_shifts = @bio.shifts_for_element(table, "N")
println(" N shifts: \{n_shifts.length()}")
let c_shifts = @bio.shifts_for_element(table, "C")
println(" C shifts: \{c_shifts.length()}")
let mean_h = @bio.mean_shift_by_element(table, "H")
println(" Mean H shift: \{mean_h} ppm")
// Lookup example.
let ha_15 = @bio.lookup_shift(table, 15, "HA")
println(" 15.HA shift: \{ha_15.unwrap_or(-1.0)} ppm")
// 4. Peak list.
println("\n6. Peak List:")
let list = @bio.nmr_sample_peak_list()
println(" Label: \{list.label}")
println(" Dimensions: \{list.n_dim}")
println(" Peaks: \{list.peaks.length()}")
for i in 0..