From ea0e71d9aec276f0f41cbd157f47f6fd8c8b0e4f Mon Sep 17 00:00:00 2001
From: Gabriel Studer <gabriel.studer@stud.unibas.ch>
Date: Wed, 22 Feb 2012 12:22:08 +0100
Subject: [PATCH] Added RenumberAllResidue functionality

---
 modules/mol/base/pymod/export_editors.cc |  1 +
 modules/mol/base/src/editor_base.cc      |  5 +++++
 modules/mol/base/src/editor_base.hh      | 11 +++++++++++
 modules/mol/base/src/impl/chain_impl.cc  | 22 ++++++++++++++++++++++
 modules/mol/base/src/impl/chain_impl.hh  |  2 ++
 modules/mol/base/src/impl/entity_impl.cc |  8 ++++++++
 modules/mol/base/src/impl/entity_impl.hh |  2 ++
 modules/mol/base/src/residue_prop.hh     | 10 ++++++++++
 8 files changed, 61 insertions(+)

diff --git a/modules/mol/base/pymod/export_editors.cc b/modules/mol/base/pymod/export_editors.cc
index eb1720a1d..6cee09765 100644
--- a/modules/mol/base/pymod/export_editors.cc
+++ b/modules/mol/base/pymod/export_editors.cc
@@ -220,6 +220,7 @@ void export_Editors()
     .def("AddTorsion", &EditorBase::AddTorsion)
     .def("ReorderResidues",&EditorBase::ReorderResidues)
     .def("ReorderAllResidues",&EditorBase::ReorderAllResidues)
+    .def("RenumberAllResidues",&EditorBase::RenumberAllResidues)
   ;
   
   class_<XCSEditor, bases<EditorBase> >("XCSEditor", no_init)
diff --git a/modules/mol/base/src/editor_base.cc b/modules/mol/base/src/editor_base.cc
index e9fed6874..ba822f0f5 100644
--- a/modules/mol/base/src/editor_base.cc
+++ b/modules/mol/base/src/editor_base.cc
@@ -165,6 +165,11 @@ void EditorBase::ReorderAllResidues()
   ent_.Impl()->ReorderAllResidues();
 }
 
+void EditorBase::RenumberAllResidues(int start, bool keep_spacing)
+{
+  ent_.Impl()->RenumberAllResidues(start, keep_spacing);
+}
+
 void EditorBase::RenameAtom(AtomHandle atom, const String& new_name)
 {
   CheckHandleValidity(atom);
diff --git a/modules/mol/base/src/editor_base.hh b/modules/mol/base/src/editor_base.hh
index 0527a0a7b..c6309cce3 100644
--- a/modules/mol/base/src/editor_base.hh
+++ b/modules/mol/base/src/editor_base.hh
@@ -205,6 +205,17 @@ public:
 
   /// \brief reorder residues of all chains based on their residue number
   void ReorderAllResidues();
+
+  /// \brief renumber residues of all chains
+  ///
+  /// \param start
+  ///           Residues of every chain will be renumbered, whereas the first
+  ///           residue gets the residue number start.
+  ///
+  /// \param keep_spacing
+  ///           If set to false, residues will continously be renumbered ongoing from start.
+  ///           Otherwise the spacings between the residues are kept.
+  void RenumberAllResidues(int start, bool keep_spacing);
     
   /// \brief Get edit mode of editor
   EditMode GetMode() const {return mode_;}
diff --git a/modules/mol/base/src/impl/chain_impl.cc b/modules/mol/base/src/impl/chain_impl.cc
index 5ac2b91ab..009f436a5 100644
--- a/modules/mol/base/src/impl/chain_impl.cc
+++ b/modules/mol/base/src/impl/chain_impl.cc
@@ -484,6 +484,28 @@ void ChainImpl::ReorderResidues()
   UpdateShifts();
 }
 
+void ChainImpl::RenumberAllResidues(int start, bool keep_spacing)
+{
+  ResNum actual_num=ResNum(start);
+  ResNum original_start_num=residue_list_[0]->GetNumber();
+  ResNum start_diff=ResNum(start)-original_start_num;
+
+
+  for (ResidueImplList::const_iterator i=residue_list_.begin(); 
+         i!=residue_list_.end(); ++i) {
+
+      if(keep_spacing){
+         ResNum temp=(*i)->GetNumber();
+         (*i)->SetNumber(temp+start_diff);
+        continue;
+      }
+
+      (*i)->SetNumber(actual_num);
+      actual_num++;
+  }
+  UpdateShifts();
+}
+
 void ChainImpl::SetInSequence(const int index)
 {
   ResNum num=residue_list_[index]->GetNumber();
diff --git a/modules/mol/base/src/impl/chain_impl.hh b/modules/mol/base/src/impl/chain_impl.hh
index 8e99792dd..bcb3436e2 100644
--- a/modules/mol/base/src/impl/chain_impl.hh
+++ b/modules/mol/base/src/impl/chain_impl.hh
@@ -169,6 +169,8 @@ public:
   void DeleteAllResidues();
 
   void ReorderResidues();
+
+  void RenumberAllResidues(int start, bool keep_spacing);
   
   int GetIndex(const ResidueImplPtr& res) const;
   void AssignSecondaryStructure(SecStructure ss,
diff --git a/modules/mol/base/src/impl/entity_impl.cc b/modules/mol/base/src/impl/entity_impl.cc
index bc3fba841..daf9c7c1f 100644
--- a/modules/mol/base/src/impl/entity_impl.cc
+++ b/modules/mol/base/src/impl/entity_impl.cc
@@ -1210,4 +1210,12 @@ void EntityImpl::ReorderAllResidues()
   }
 }
 
+void EntityImpl::RenumberAllResidues(int start, bool keep_spacing)
+{
+  for(ChainImplList::iterator cit=chain_list_.begin();cit!=chain_list_.end();++cit) {
+    (*cit)->RenumberAllResidues(start, keep_spacing);
+  }
+
+}
+
 }}} // ns
diff --git a/modules/mol/base/src/impl/entity_impl.hh b/modules/mol/base/src/impl/entity_impl.hh
index 3c5000920..dd88fb325 100644
--- a/modules/mol/base/src/impl/entity_impl.hh
+++ b/modules/mol/base/src/impl/entity_impl.hh
@@ -254,6 +254,8 @@ public:
 
   void ReorderAllResidues();
 
+  void RenumberAllResidues(int start, bool keep_spacing);
+
 private:
   void DoCopy(EntityImplPtr dest);
   
diff --git a/modules/mol/base/src/residue_prop.hh b/modules/mol/base/src/residue_prop.hh
index 19bccc98e..168c9744c 100644
--- a/modules/mol/base/src/residue_prop.hh
+++ b/modules/mol/base/src/residue_prop.hh
@@ -75,6 +75,16 @@ public:
     return num_;
   }
 
+  ResNum operator+(const ResNum& r)
+  {
+    return ResNum(num_+r.num_);
+  }
+  
+  ResNum operator-(const ResNum& r)
+  {
+    return ResNum(num_-r.num_);
+  }
+  
   ResNum& operator++()
   {
     ++num_;
-- 
GitLab