From 9c096d85be8edee700cd06037886bde73045cfe5 Mon Sep 17 00:00:00 2001
From: Marco Biasini <marco.biasini@unibas.ch>
Date: Wed, 20 Oct 2010 17:35:59 +0200
Subject: [PATCH] treat Deuterium like hydrogens

---
 modules/conop/src/rule_based_builder.cc | 12 +++++++-----
 modules/mol/base/src/impl/atom_prop.cc  |  1 +
 2 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/modules/conop/src/rule_based_builder.cc b/modules/conop/src/rule_based_builder.cc
index f8617c89d..bd7b5cfca 100644
--- a/modules/conop/src/rule_based_builder.cc
+++ b/modules/conop/src/rule_based_builder.cc
@@ -49,7 +49,7 @@ void RuleBasedBuilder::CheckResidueCompleteness(const mol::ResidueHandle& rh)
   mol::AtomHandleList atoms=rh.GetAtomList();
   mol::AtomHandleList::iterator i=atoms.begin();
   for (; j!=last_compound_->GetAtomSpecs().end() && i!=atoms.end(); ++j) {
-    if ((*j).is_leaving || (*j).element=="H")
+    if ((*j).is_leaving || (*j).element=="H" || (*j).element=="D")
       continue;
     if ((*j).ordinal!=static_cast<int>((*i).Impl()->GetState())) {
       this->OnMissingAtom(rh, (*j).name);
@@ -72,7 +72,8 @@ bool RuleBasedBuilder::HasUnknownAtoms(mol::ResidueHandle res)
   for (mol::AtomHandleList::iterator 
        i=atoms.begin(), e=atoms.end(); i!=e; ++i) {
     if ((*i).Impl()->GetState()==std::numeric_limits<unsigned int>::max()) {
-      if ((*i).GetElement()=="H" && this->GetStrictHydrogenMode()==false) {
+      if (((*i).GetElement()=="H" || (*i).GetElement()=="D") && 
+          this->GetStrictHydrogenMode()==false) {
         continue;
       }
       return true;
@@ -210,14 +211,15 @@ void RuleBasedBuilder::ConnectAtomsOfResidue(mol::ResidueHandle rh)
       mol::AtomHandle a2=this->LocateAtom(atoms, bond.atom_two);
       if (a1.IsValid() && a2.IsValid() && this->IsBondFeasible(a1, a2)) {
         if (this->GetStrictHydrogenMode() && 
-            (a1.GetElement()=="H" || a2.GetElement()=="H")) {
+            (a1.GetElement()=="H" || a2.GetElement()=="D")) {
           continue;
         }
         e.Connect(a1, a2, bond.order);
       }
   }
   for (mol::AtomHandleList::iterator i=atoms.begin(), e=atoms.end(); i!=e; ++i) {
-    if ((*i).GetElement()=="H" && (*i).GetBondCount()==0) {
+    if (((*i).GetElement()=="H" || (*i).GetElement()=="D") && 
+        (*i).GetBondCount()==0) {
       this->DistanceBasedConnect(*i);
     }
   }
@@ -293,7 +295,7 @@ bool RuleBasedBuilder::IsResidueComplete(const mol::ResidueHandle& residue)
   mol::AtomHandleList::iterator i=atoms.begin();
   for (AtomSpecList::const_iterator j=last_compound_->GetAtomSpecs().begin(),
        e=last_compound_->GetAtomSpecs().end(); j!=e; ++j) {
-    if ((*j).is_leaving || (*j).element=="H") {
+    if ((*j).is_leaving || (*j).element=="H" || (*j).element=="D") {
       continue;      
     }
     if (!(residue.FindAtom(j->name) || residue.FindAtom(j->alt_name))) {
diff --git a/modules/mol/base/src/impl/atom_prop.cc b/modules/mol/base/src/impl/atom_prop.cc
index 587fce2ac..aefb8d219 100644
--- a/modules/mol/base/src/impl/atom_prop.cc
+++ b/modules/mol/base/src/impl/atom_prop.cc
@@ -50,6 +50,7 @@ void AtomProp::Init()
   defaults_["CO"]=AtomProp(2.0000, 58.9330);
   defaults_["CR"]=AtomProp(2.0000, 51.9960);
   defaults_["CS"]=AtomProp(2.0000, 132.9050);
+  defaults_["D"]=AtomProp(1.0900, 2.0141);
   defaults_["CU"]=AtomProp(1.4000, 63.5460);
   defaults_["DB"]=AtomProp(2.0000, 262.0000);
   defaults_["DS"]=AtomProp(2.0000, 271.0000);
-- 
GitLab