///|
/// PDB Header Demo
/// Demonstrates Bio.PDB.ParsePDBHeader functionality:
/// - Parse PDB header text
/// - Display PDB ID, title, compound info, source info
/// - Display resolution, R-factor, keywords, chain IDs
/// - Display authors, DBREF entries
/// - Show individual record parsing
/// - Demonstrate edge cases
///
/// Run: moon run examples/pdb_header_demo/
fn main {
println("=== PDB Header Demo ===")
// =========================================================================
// 1. Create sample PDB header text
// =========================================================================
println("")
println("--- 1. Sample PDB Header ---")
let header_line = "HEADER TRANS 05-JAN-21 1ABC "
let pdb_text = header_line +
"\n" +
"TITLE CRYSTAL STRUCTURE OF A TRANSFERASE ENZYME COMPLEXED WITH\n" +
"TITLE ITS SUBSTRATE AND COFACTOR\n" +
"COMPND 1 ABC; A; ENGINEERED; MUTATION;\n" +
"COMPND 2 DEF; B;\n" +
"SOURCE 1 ORGANISM Escherichia coli; COMMON_NAME Bacterium;\n" +
"SOURCE 2 ORGANISM Homo sapiens; TAX_ID 9606;\n" +
"KEYWDS TRANSFERASE, METABOLISM, ENZYME;\n" +
"KEYWDS CRYSTAL STRUCTURE;\n" +
"REMARK 1 RESOLUTION. 2.10\n" +
"REMARK 3 R FACTOR. 0.195\n" +
"AUTHOR JOHN DOE, JANE SMITH, BOB JONES;\n" +
"JRNL Article title of the publication;\n" +
"DBREF 1ABC A UNP P00000 1-300;\n" +
"DBREF 1ABC A PDB 1XYZ 1-300;\n"
println("Input PDB text:")
println(pdb_text)
// =========================================================================
// 2. Parse using parse_pdb_header()
// =========================================================================
println("")
println("--- 2. Parse Full Header ---")
let header = @bio.parse_pdb_header(pdb_text)
println("PDB ID: \{header.pdb_id}")
println("Date Deposited: \{header.date_deposited}")
println("Title: \{header.title}")
println("")
println("--- 3. Compound Info ---")
let compound = header.compound
println("Molecule ID: \{compound.molecule_id}")
println("Chain IDs (\{compound.chain_ids.length()}):")
for chain in compound.chain_ids {
println(" - \{chain}")
}
println("Compound Name: \{compound.compound_name}")
println("Formula: \{compound.formula}")
println("KA: \{compound.ka}")
println("KB: \{compound.kb}")
println("EC Number: \{compound.ec_number}")
println("Engineered: \{compound.engineered}")
println("Mutation: \{compound.mutation}")
println("")
println("--- 4. Source Info ---")
let source = header.source
println("Source: \{source.source}")
println("Organism (scientific): \{source.organism_scientific}")
println("Organism (common): \{source.organism_common}")
println("Strain: \{source.strain}")
println("Cell Line: \{source.cell_line}")
println("Tissue: \{source.tissue}")
println("Tax ID: \{source.tax_id}")
println("")
println("--- 5. Quality Metrics ---")
println("Resolution: \{header.resolution} A")
println("R-factor: \{header.rfactor}")
println("")
println("--- 6. Keywords ---")
let keywords = header.keywords
println("Keywords (\{keywords.length()}):")
for kw in keywords {
println(" - \{kw}")
}
println("")
println("--- 7. Chain IDs (via extract_chain_ids) ---")
let chain_ids = @bio.extract_chain_ids(header)
println("Chain IDs (\{chain_ids.length()}):")
for chain in chain_ids {
println(" - \{chain}")
}
println("")
println("--- 8. Authors ---")
let authors = header.authors
println("Authors (\{authors.length()}):")
for author in authors {
println(" - \{author}")
}
println("")
println("--- 9. Journal ---")
println("Journal: \{header.journal}")
println("")
println("--- 10. DBREF Entries ---")
let dbrefs = header.dbrefs
println("DBREF entries (\{dbrefs.length()}):")
for dbref in dbrefs {
println(
" DB: \{dbref.db_name} | Accession: \{dbref.db_accession} | ID: \{dbref.db_id}",
)
}
println("")
println("--- 11. Remark Lines ---")
let remarks = header.remark_lines
println("Remark lines (\{remarks.length()}):")
for remark in remarks {
println(" \{remark}")
}
// =========================================================================
// 12. Individual record parsing
// =========================================================================
println("")
println("--- 12. Individual Record Parsing ---")
let header_line = "HEADER TRANS 05-JAN-21 1ABC "
let (pdb_id, date, classification) = @bio.parse_header_record(header_line)
println("parse_header_record:")
println(" PDB ID: \{pdb_id}")
println(" Date: \{date}")
println(" Classification: \{classification}")
let remark2 = "REMARK 2 RESOLUTION. 1.85"
let resolution = @bio.parse_resolution_record(remark2)
println("")
println("parse_resolution_record: \{resolution} A")
let remark3 = "REMARK 3 R FACTOR. 0.172"
let rfactor = @bio.parse_rfactor_record(remark3)
println("parse_rfactor_record: \{rfactor}")
// =========================================================================
// 13. Edge cases
// =========================================================================
println("")
println("--- 13. Edge Cases ---")
println("Empty text:")
let empty_header = @bio.parse_pdb_header("")
println(" PDB ID: '\{empty_header.pdb_id}'")
println(" Resolution: \{empty_header.resolution}")
println(" Keywords count: \{empty_header.keywords.length()}")
println("")
println("Minimal PDB (only HEADER record):")
let minimal_text = "HEADER LIGAN 01-JAN-20 2XYZ \n"
let minimal = @bio.parse_pdb_header(minimal_text)
println(" PDB ID: '\{minimal.pdb_id}'")
println(" Title: '\{minimal.title}'")
println(" Compound name: '\{minimal.compound.compound_name}'")
println(" Resolution: \{minimal.resolution}")
println(" R-factor: \{minimal.rfactor}")
println(" Chain IDs: \{minimal.chain_ids.length()}")
println("")
println("Malformed REMARK (no keyword):")
let malformed = "REMARK 2 THIS LINE HAS NO RESOLUTION DATA\n"
let mal_res = @bio.parse_resolution_record(malformed)
println(" Resolution (expected 0.0): \{mal_res}")
let malformed_r = "REMARK 3 NO RFACTOR HERE\n"
let mal_rf = @bio.parse_rfactor_record(malformed_r)
println(" R-factor (expected 0.0): \{mal_rf}")
println("")
println("=== Demo complete ===")
}