static Residue::eAtomClassification ClassifyAtom(const Residue *residue, const CAtom& atom) { if (!atom.IsSetIupac_code()) return Residue::eUnknownAtom; string code = atom.GetIupac_code().front(); CAtom::EElement element = atom.GetElement(); if (residue->IsAminoAcid()) { // amino acid C-alpha if (element==CAtom::eElement_c && code==" CA ") return Residue::eAlphaBackboneAtom; // amino acid partial backbone if ( (element==CAtom::eElement_c && code==" C ") || (element==CAtom::eElement_n && code==" N ") ) return Residue::ePartialBackboneAtom; // amino acid complete backbone (all backbone that's not part of "partial") // including both GLY alpha hydrogens and terminal COOH and NH3+ if ( (element==CAtom::eElement_o && (code==" O " || code==" OXT")) || (element==CAtom::eElement_h && (code==" H " || code==" HA " || code=="1HA " || code=="2HA " || code==" HXT" || code=="1H " || code=="2H " || code=="3H ")) ) return Residue::eCompleteBackboneAtom; // anything else is side chain return Residue::eSideChainAtom; } else if (residue->IsNucleotide()) { // nucleic acid Phosphorus if (element==CAtom::eElement_p && code==" P ") return Residue::eAlphaBackboneAtom; // nucleic acid partial backbone if ( (element==CAtom::eElement_c && (code==" C5*" || code==" C4*" || code==" C3*")) || (element==CAtom::eElement_o && (code==" O5*" || code==" O3*")) || (element==CAtom::eElement_h && (code==" H3T" || code==" H5T")) ) return Residue::ePartialBackboneAtom; // nucleic acid complete backbone (all backbone that's not part of "partial") if ( (element==CAtom::eElement_o && (code==" O1P" || code==" O2P" || code==" O4*" || code==" O2*")) || (element==CAtom::eElement_c && (code==" C2*" || code==" C1*")) || (element==CAtom::eElement_h && (code=="1H5*" || code=="2H5*" || code==" H4*" || code==" H3*" || code==" H2*" || code==" H1*" || code==" H1P" || code==" H2P" || code==" HO2" || code=="1H2*" || code=="2H2*")) ) return Residue::eCompleteBackboneAtom; // anything else is side chain return Residue::eSideChainAtom; } return Residue::eUnknownAtom; }