From e6b1cf9fa9f4e2c1f1184df4cfca1c4a8c2cb7d5 Mon Sep 17 00:00:00 2001
From: Marco Biasini <marco.biasini@unibas.ch>
Date: Mon, 4 Oct 2010 19:37:56 +0200
Subject: [PATCH] rule-based-builder: override the atom element, if it is bogus

---
 modules/conop/src/conop.cc              | 9 +++++++++
 modules/conop/src/conop.hh              | 2 ++
 modules/conop/src/rule_based_builder.cc | 8 ++++----
 3 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/modules/conop/src/conop.cc b/modules/conop/src/conop.cc
index 9d34eba51..d7edd9aa8 100644
--- a/modules/conop/src/conop.cc
+++ b/modules/conop/src/conop.cc
@@ -318,6 +318,15 @@ Real Conopology::GetDefaultAtomRadius(const String& element) const
   return it==ele_rad_map_.end() ? 1.5 : it->second;
 }
 
+bool Conopology::IsValidElement(const String& element) const
+{
+  String upper_ele=element;
+  std::transform(upper_ele.begin(),upper_ele.end(),upper_ele.begin(),toupper);  
+  
+  std::map<String,Real>::const_iterator it = ele_mass_map_.find(upper_ele);
+  return it!=ele_mass_map_.end();
+}
+
 Real Conopology::GetDefaultAtomMass(const String& element) const
 {
   String upper_ele=element;
diff --git a/modules/conop/src/conop.hh b/modules/conop/src/conop.hh
index f8133a078..e8ad4bc0b 100644
--- a/modules/conop/src/conop.hh
+++ b/modules/conop/src/conop.hh
@@ -53,6 +53,8 @@ public:
 
   void RegisterBuilder(const BuilderP& b, const String& name);
   void SetDefaultBuilder(const String& default_name);
+  
+  bool IsValidElement(const String& element) const;
 private:
   Conopology();
   Conopology(const Conopology&) {}
diff --git a/modules/conop/src/rule_based_builder.cc b/modules/conop/src/rule_based_builder.cc
index 8264dc5ba..e47c96e35 100644
--- a/modules/conop/src/rule_based_builder.cc
+++ b/modules/conop/src/rule_based_builder.cc
@@ -83,11 +83,11 @@ bool RuleBasedBuilder::HasUnknownAtoms(mol::ResidueHandle res)
 
 void RuleBasedBuilder::FillAtomProps(mol::AtomHandle atom, const AtomSpec& spec) 
 {
+  Conopology& conop_inst=Conopology::Instance();
   mol::AtomProp props=atom.GetAtomProps();
-  if (props.element=="") {
+  if (!conop_inst.IsValidElement(props.element)) {
     props.element=spec.element;
   }
-  Conopology& conop_inst=Conopology::Instance();  
   if (props.radius==0.0) {
     props.radius=conop_inst.GetDefaultAtomRadius(spec.element);    
   }
@@ -331,10 +331,10 @@ void RuleBasedBuilder::FillAtomProps(mol::AtomHandle atom)
 bool RuleBasedBuilder::OnUnknownAtom(mol::AtomHandle atom)
 {
   mol::AtomProp props=atom.GetAtomProps();
-  if (props.element=="") {
+  Conopology& conop_inst=Conopology::Instance();
+  if (!conop_inst.IsValidElement(props.element)) {
     props.element=Builder::GuessAtomElement(atom.GetName(), props.is_hetatm);
   }
-  Conopology& conop_inst=Conopology::Instance();  
   if (props.radius==0.0) {
     props.radius=conop_inst.GetDefaultAtomRadius(props.element);    
   }
-- 
GitLab