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