From 68cd4e8505414cc0e14afbe33ac92c144d89f1ce Mon Sep 17 00:00:00 2001
From: Andreas Schenk <andreas_schenk@hms.harvard.edu>
Date: Tue, 25 Oct 2011 16:28:55 -0400
Subject: [PATCH] increased precision for mass calculation

instead of doing a simple summation of all atoms in an entity the
summation is now done hierarchically, thereby reducing the rounding
error
---
 modules/mol/base/src/chain_view.cc        | 8 ++------
 modules/mol/base/src/entity_view.cc       | 8 ++++----
 modules/mol/base/src/impl/chain_impl.cc   | 7 ++-----
 modules/mol/base/src/impl/entity_impl.cc  | 9 +++++----
 modules/mol/base/src/impl/residue_impl.cc | 2 +-
 5 files changed, 14 insertions(+), 20 deletions(-)

diff --git a/modules/mol/base/src/chain_view.cc b/modules/mol/base/src/chain_view.cc
index b940a37ee..4727e31dd 100644
--- a/modules/mol/base/src/chain_view.cc
+++ b/modules/mol/base/src/chain_view.cc
@@ -334,14 +334,10 @@ bool ChainView::operator!=(const ChainView& rhs) const
 
 Real ChainView::GetMass() const {
   this->CheckValidity();
-  Real mass = 0;
+  double mass = 0;
   ResidueViewList::const_iterator i;
   for (i=data_->residues.begin(); i!=data_->residues.end(); ++i) {
-    ResidueView r=*i;
-    for (AtomViewList::const_iterator j=r.GetAtomList().begin(),
-         e2=r.GetAtomList().end(); j!=e2; ++j) {
-      mass+=j->GetMass();
-    }
+    mass+=i->GetMass();
   }
   return mass;
 }
diff --git a/modules/mol/base/src/entity_view.cc b/modules/mol/base/src/entity_view.cc
index 3e5445b56..a88f0b395 100644
--- a/modules/mol/base/src/entity_view.cc
+++ b/modules/mol/base/src/entity_view.cc
@@ -187,10 +187,10 @@ geom::Vec3 EntityView::GetCenterOfMass() const
 
 Real EntityView::GetMass() const 
 {
-  Real mass = 0;
-  AtomViewIter it=this->AtomsBegin();
-  for(; it!=this->AtomsEnd(); ++it) {
-    mass+=(*it).GetMass();
+  this->CheckValidity();
+  double mass = 0;
+  for (ChainViewList::iterator i=data_->chains.begin();i!=data_->chains.end(); ++i) {
+    mass+=i->GetMass();
   }
   return mass;
 }
diff --git a/modules/mol/base/src/impl/chain_impl.cc b/modules/mol/base/src/impl/chain_impl.cc
index c04e1ed72..460269020 100644
--- a/modules/mol/base/src/impl/chain_impl.cc
+++ b/modules/mol/base/src/impl/chain_impl.cc
@@ -400,14 +400,11 @@ void ChainImpl::AssignSecondaryStructure(SecStructure ss,
 
 Real ChainImpl::GetMass() const
 {
-  Real mass = 0;
+  double mass = 0;
   for (ResidueImplList::const_iterator i=residue_list_.begin(); 
         i!=residue_list_.end(); ++i) {
     ResidueImplPtr r=*i;
-    for (AtomImplList::iterator j=r->GetAtomList().begin(); 
-          j!=r->GetAtomList().end(); ++j) {
-      mass+=(*j)->GetMass();
-    }
+    mass+=r->GetMass();
   }
   return mass;
 }
diff --git a/modules/mol/base/src/impl/entity_impl.cc b/modules/mol/base/src/impl/entity_impl.cc
index 305e34230..bc3fba841 100644
--- a/modules/mol/base/src/impl/entity_impl.cc
+++ b/modules/mol/base/src/impl/entity_impl.cc
@@ -308,10 +308,11 @@ geom::Vec3 EntityImpl::GetCenterOfMass() const {
 }
 
 Real EntityImpl::GetMass() const {
-  Real mass=0.0;
-  for (AtomImplMap::const_iterator it = atom_map_.begin();
-      it!=atom_map_.end();++it) {
-    mass+=it->second->GetMass();
+  double mass=0.0;
+  for (ChainImplList::const_iterator i=chain_list_.begin(), 
+       e=chain_list_.end(); i!=e; ++i) {
+    ChainImplPtr chain=*i;
+    mass+=chain->GetMass();
   }
   return mass;
 }
diff --git a/modules/mol/base/src/impl/residue_impl.cc b/modules/mol/base/src/impl/residue_impl.cc
index 28f0cc6f9..eb633c5be 100644
--- a/modules/mol/base/src/impl/residue_impl.cc
+++ b/modules/mol/base/src/impl/residue_impl.cc
@@ -451,7 +451,7 @@ void ResidueImpl::RemoveAltPositionsForAtom(const AtomImplPtr& atom) {
 
 Real ResidueImpl::GetMass() const
 {
-  Real mass = 0;
+  double mass = 0;
   for (AtomImplList::const_iterator i=atom_list_.begin(); 
        i!=atom_list_.end(); ++i) {
     mass+=(*i)->GetMass();
-- 
GitLab