From a0970ace7dde2cb56c6563c838a964db02b59f24 Mon Sep 17 00:00:00 2001
From: Marco Biasini <marco.biasini@unibas.ch>
Date: Wed, 20 Oct 2010 14:37:12 +0200
Subject: [PATCH] reduce memory consumption of atom properties

the default atom properties for each element are shared. Upon changing
one of the properties, the properties are copied and stored locally
for that atom. That way, we have the advantage of low memory consumption
while still keeping the previous flexibility.
---
 modules/bindings/pymod/msms.py               |   2 +-
 modules/conop/pymod/export_conop.cc          |   1 -
 modules/conop/src/conop.cc                   | 291 ++++++++-----------
 modules/conop/src/conop.hh                   |  10 +-
 modules/conop/src/heuristic_builder.cc       |  13 +-
 modules/conop/src/rule_based_builder.cc      |  26 +-
 modules/gfx/src/impl/backbone_trace.cc       |   4 +-
 modules/gfx/src/surface.cc                   |   1 -
 modules/io/src/mol/entity_io_crd_handler.cc  |   9 +-
 modules/io/src/mol/entity_io_mae_handler.cc  |   8 +-
 modules/io/src/mol/pdb_reader.cc             |  57 ++--
 modules/io/src/mol/pdb_writer.cc             |   4 +-
 modules/io/src/mol/sdf_reader.cc             |  30 +-
 modules/io/tests/test_io_pdb.cc              |  58 ++--
 modules/io/tests/test_io_sdf.cc              |   4 +-
 modules/mol/alg/src/entity_to_density.cc     |   4 +-
 modules/mol/alg/tests/test_superposition.cc  |  19 +-
 modules/mol/base/pymod/export_atom.cc        |  30 +-
 modules/mol/base/src/CMakeLists.txt          |   1 -
 modules/mol/base/src/atom_base.cc            |  78 +++--
 modules/mol/base/src/atom_base.hh            |  31 +-
 modules/mol/base/src/chain_view.cc           |   2 +-
 modules/mol/base/src/editor_base.cc          |  13 +-
 modules/mol/base/src/editor_base.hh          |  12 +-
 modules/mol/base/src/impl/CMakeLists.txt     |   2 +
 modules/mol/base/src/impl/atom_impl.cc       |  14 +-
 modules/mol/base/src/impl/atom_impl.hh       | 109 ++++++-
 modules/mol/base/src/impl/atom_prop.cc       | 157 ++++++++++
 modules/mol/base/src/{ => impl}/atom_prop.hh |  34 ++-
 modules/mol/base/src/impl/chain_impl.cc      |   4 +-
 modules/mol/base/src/impl/entity_impl.cc     |  10 +-
 modules/mol/base/src/impl/entity_impl.hh     |   2 +-
 modules/mol/base/src/impl/residue_impl.cc    |  19 +-
 modules/mol/base/src/impl/residue_impl.hh    |   6 +-
 modules/mol/base/src/query_state.cc          |  10 +-
 modules/mol/base/src/residue_handle.hh       |   1 -
 modules/mol/base/src/residue_view.cc         |   4 +-
 modules/mol/base/tests/test_atom_groups.cc   |  11 +-
 modules/mol/base/tests/test_query.cc         |  68 ++---
 modules/qa/src/clash_score.cc                |  12 +-
 40 files changed, 655 insertions(+), 516 deletions(-)
 create mode 100644 modules/mol/base/src/impl/atom_prop.cc
 rename modules/mol/base/src/{ => impl}/atom_prop.hh (68%)

diff --git a/modules/bindings/pymod/msms.py b/modules/bindings/pymod/msms.py
index dc3b85906..893e6c4b5 100644
--- a/modules/bindings/pymod/msms.py
+++ b/modules/bindings/pymod/msms.py
@@ -69,7 +69,7 @@ def _SetupFiles(entity, selection):
   for a in entity_view.GetAtomList():
     position=a.GetPos()
     tmp_file_handle.write('%8.3f %8.3f %8.3f %4.2f\n' % (position[0],
-                          position[1], position[2], a.GetAtomProps().radius))
+                          position[1], position[2], a.radius))
   tmp_file_handle.close()
   
   return (tmp_dir_name, tmp_file_name)
diff --git a/modules/conop/pymod/export_conop.cc b/modules/conop/pymod/export_conop.cc
index 8b2509ec3..64d12ffd2 100644
--- a/modules/conop/pymod/export_conop.cc
+++ b/modules/conop/pymod/export_conop.cc
@@ -31,7 +31,6 @@ void export_Conop() {
      .def("Instance", &Conopology::Instance, return_value_policy<reference_existing_object>()).staticmethod("Instance")
     .def("ConnectAll", &Conopology::ConnectAll)
     .def("GetBuilder", &Conopology::GetBuilder)
-    .def("GetDefaultAtomRadius", &Conopology::GetDefaultAtomRadius)
     .def("ConnectAll", &Conopology::ConnectAll)
     .def("RegisterBuilder", &Conopology::RegisterBuilder)
     .def("SetDefaultBuilder", &Conopology::SetDefaultBuilder)
diff --git a/modules/conop/src/conop.cc b/modules/conop/src/conop.cc
index d7edd9aa8..e2fc45e2e 100644
--- a/modules/conop/src/conop.cc
+++ b/modules/conop/src/conop.cc
@@ -33,165 +33,128 @@ Conopology& Conopology::Instance()
 }
 
 Conopology::Conopology():
-  builder_map_(),
-  ele_rad_map_(),
-  ele_mass_map_()
+  builder_map_()
 {
   builder_map_["HEURISTIC"]=BuilderP(new HeuristicBuilder());
   builder_map_["DEFAULT"]=builder_map_["HEURISTIC"];
-
-  ele_rad_map_["H"]  = 1.09;
-                 
-  ele_rad_map_["C"]  = 1.70;  //was 1.75
-  ele_rad_map_["N"]  = 1.55;
-  ele_rad_map_["O"]  = 1.52;
-  ele_rad_map_["F"]  = 1.47;
-                 
-  ele_rad_map_["NA"] = 2.27;
-  ele_rad_map_["MG"] = 1.73;
-  ele_rad_map_["SI"] = 2.10;
-  ele_rad_map_["P"]  = 1.80;
-  ele_rad_map_["S"]  = 1.80;
-  ele_rad_map_["CL"] = 1.75;
-                 
-  ele_rad_map_["K"]  = 2.75;
-  ele_rad_map_["CA"] = 2.00;
-  ele_rad_map_["MN"] = 2.00;
-  ele_rad_map_["FE"] = 2.00;
-  ele_rad_map_["CO"] = 2.00;
-  ele_rad_map_["NI"] = 1.63;
-  ele_rad_map_["CU"] = 1.40;
-  ele_rad_map_["ZN"] = 1.39;
-  ele_rad_map_["BR"] = 1.85;
-
-  ele_rad_map_["I"]  = 1.98;
-
-
-  // Element masses according to IUPAC standards
-  // see http://www.chem.qmul.ac.uk/iupac/AtWt/
-  ele_mass_map_["H"]  = 1.00794;
-  ele_mass_map_["HE"] = 4.002602;
-  ele_mass_map_["LI"] = 6.941;
-  ele_mass_map_["BE"] = 9.012182;
-  ele_mass_map_["B"]  = 10.811;
-  ele_mass_map_["C"]  = 12.0107;
-  ele_mass_map_["N"]  = 14.0067;
-  ele_mass_map_["O"]  = 15.9994;
-  ele_mass_map_["F"]  = 18.9984032;
-  ele_mass_map_["NE"] = 20.1797;
-  ele_mass_map_["NA"] = 22.98976928;
-  ele_mass_map_["MG"] = 24.3050;
-  ele_mass_map_["AL"] = 26.9815386;
-  ele_mass_map_["SI"] = 28.0855;
-  ele_mass_map_["P"]  = 30.973762;
-  ele_mass_map_["S"]  = 32.065;
-  ele_mass_map_["CL"] = 35.453;
-  ele_mass_map_["AR"] = 39.948;
-  ele_mass_map_["K"]  = 39.0983;
-  ele_mass_map_["CA"] = 40.078;
-  ele_mass_map_["SC"] = 44.955912;
-  ele_mass_map_["TI"] = 47.867;
-  ele_mass_map_["V"]  = 50.9415;
-  ele_mass_map_["CR"] = 51.9961;
-  ele_mass_map_["MN"] = 54.938045;
-  ele_mass_map_["FE"] = 55.845;
-  ele_mass_map_["CO"] = 58.933195;
-  ele_mass_map_["NI"] = 58.6934;
-  ele_mass_map_["CU"] = 63.546;
-  ele_mass_map_["ZN"] = 65.38;
-  ele_mass_map_["GA"] = 69.723;
-  ele_mass_map_["GE"] = 72.64;
-  ele_mass_map_["AS"] = 74.92160;
-  ele_mass_map_["SE"] = 78.96;
-  ele_mass_map_["BR"] = 79.904;
-  ele_mass_map_["KR"] = 83.798;
-  ele_mass_map_["RB"] = 85.4678;
-  ele_mass_map_["SR"] = 87.62;
-  ele_mass_map_["Y"]  = 88.90585;
-  ele_mass_map_["ZR"] = 91.224;
-  ele_mass_map_["NB"] = 92.90638;
-  ele_mass_map_["MO"] = 95.96;
-  ele_mass_map_["TC"] = 98.0;
-  ele_mass_map_["RU"] = 101.07;
-  ele_mass_map_["RH"] = 102.90550;
-  ele_mass_map_["PD"] = 106.42;
-  ele_mass_map_["AG"] = 107.8682;
-  ele_mass_map_["CD"] = 112.411;
-  ele_mass_map_["IN"] = 114.818;
-  ele_mass_map_["SN"] = 118.710;
-  ele_mass_map_["SB"] = 121.760;
-  ele_mass_map_["TE"] = 127.60;
-  ele_mass_map_["I"]  = 126.90447;
-  ele_mass_map_["XE"] = 131.293;
-  ele_mass_map_["CS"] = 132.9054519;
-  ele_mass_map_["BA"] = 137.327;
-  ele_mass_map_["LA"] = 138.90547;
-  ele_mass_map_["CE"] = 140.116;
-  ele_mass_map_["PR"] = 140.90765;
-  ele_mass_map_["ND"] = 144.242;
-  ele_mass_map_["PM"] = 145.0;
-  ele_mass_map_["SM"] = 150.36;
-  ele_mass_map_["EU"] = 151.964;
-  ele_mass_map_["GD"] = 157.25;
-  ele_mass_map_["TB"] = 158.92535;
-  ele_mass_map_["DY"] = 162.500;
-  ele_mass_map_["HO"] = 164.93032;
-  ele_mass_map_["ER"] = 167.259;
-  ele_mass_map_["TM"] = 168.93421;
-  ele_mass_map_["YB"] = 173.054;
-  ele_mass_map_["LU"] = 174.9668;
-  ele_mass_map_["HF"] = 178.49;
-  ele_mass_map_["TA"] = 180.94788;
-  ele_mass_map_["W"]  = 183.84;
-  ele_mass_map_["RE"] = 186.207;
-  ele_mass_map_["OS"] = 190.23;
-  ele_mass_map_["IR"] = 192.217;
-  ele_mass_map_["PT"] = 195.084;
-  ele_mass_map_["AU"] = 196.966569;
-  ele_mass_map_["HG"] = 200.59;
-  ele_mass_map_["TL"] = 204.3833;
-  ele_mass_map_["PB"] = 207.2;
-  ele_mass_map_["BI"] = 208.98040;
-  ele_mass_map_["PO"] = 209.0;
-  ele_mass_map_["AT"] = 210.0;
-  ele_mass_map_["RN"] = 222.0;
-  ele_mass_map_["FR"] = 223.0;
-  ele_mass_map_["RA"] = 226.0;
-  ele_mass_map_["AC"] = 227.0;
-  ele_mass_map_["TH"] = 232.03806;
-  ele_mass_map_["PA"] = 231.03588;
-  ele_mass_map_["U"]  = 238.02891;
-  ele_mass_map_["NP"] = 237.0;
-  ele_mass_map_["PU"] = 244.0;
-  ele_mass_map_["AM"] = 243.0;
-  ele_mass_map_["CM"] = 247.0;
-  ele_mass_map_["BK"] = 247.0;
-  ele_mass_map_["CF"] = 251.0;
-  ele_mass_map_["ES"] = 252.0;
-  ele_mass_map_["FM"] = 257.0;
-  ele_mass_map_["MD"] = 258.0;
-  ele_mass_map_["NO"] = 259.0;
-  ele_mass_map_["LR"] = 262.0;
-  ele_mass_map_["RF"] = 267.0;
-  ele_mass_map_["DB"] = 268.0;
-  ele_mass_map_["SG"] = 271.0;
-  ele_mass_map_["BH"] = 272.0;
-  ele_mass_map_["HS"] = 270.0;
-  ele_mass_map_["MT"] = 276.0;
-  ele_mass_map_["DS"] = 281.0;
-  ele_mass_map_["RG"] = 280.0;
-  ele_mass_map_["CN"] = 285.0;
-  ele_mass_map_["UUT"]= 284.0;
-  ele_mass_map_["UUQ"]= 289.0;
-  ele_mass_map_["UUP"]= 288.0;
-  ele_mass_map_["UUH"]= 293.0;
-  ele_mass_map_["UUO"]= 294.0;  
+  
+  known_elements_.insert("AC");
+  known_elements_.insert("AG");
+  known_elements_.insert("AL");
+  known_elements_.insert("AM");
+  known_elements_.insert("AR");
+  known_elements_.insert("AS");
+  known_elements_.insert("AT");
+  known_elements_.insert("AU");
+  known_elements_.insert("B");
+  known_elements_.insert("BA");
+  known_elements_.insert("BE");
+  known_elements_.insert("BH");
+  known_elements_.insert("BI");
+  known_elements_.insert("BK");
+  known_elements_.insert("BR");
+  known_elements_.insert("C");
+  known_elements_.insert("CA");
+  known_elements_.insert("CD");
+  known_elements_.insert("CE");
+  known_elements_.insert("CF");
+  known_elements_.insert("CL");
+  known_elements_.insert("CM");
+  known_elements_.insert("CO");
+  known_elements_.insert("CR");
+  known_elements_.insert("CS");
+  known_elements_.insert("CU");
+  known_elements_.insert("DB");
+  known_elements_.insert("DS");
+  known_elements_.insert("DY");
+  known_elements_.insert("ER");
+  known_elements_.insert("ES");
+  known_elements_.insert("EU");
+  known_elements_.insert("F");
+  known_elements_.insert("FE");
+  known_elements_.insert("FM");
+  known_elements_.insert("FR");
+  known_elements_.insert("GA");
+  known_elements_.insert("GD");
+  known_elements_.insert("GE");
+  known_elements_.insert("H");
+  known_elements_.insert("HE");
+  known_elements_.insert("HF");
+  known_elements_.insert("HG");
+  known_elements_.insert("HO");
+  known_elements_.insert("HS");
+  known_elements_.insert("I");
+  known_elements_.insert("IN");
+  known_elements_.insert("IR");
+  known_elements_.insert("K");
+  known_elements_.insert("KR");
+  known_elements_.insert("LA");
+  known_elements_.insert("LI");
+  known_elements_.insert("LR");
+  known_elements_.insert("LU");
+  known_elements_.insert("MD");
+  known_elements_.insert("MG");
+  known_elements_.insert("MN");
+  known_elements_.insert("MO");
+  known_elements_.insert("MT");
+  known_elements_.insert("N");
+  known_elements_.insert("NA");
+  known_elements_.insert("NB");
+  known_elements_.insert("ND");
+  known_elements_.insert("NE");
+  known_elements_.insert("NI");
+  known_elements_.insert("NO");
+  known_elements_.insert("NP");
+  known_elements_.insert("O");
+  known_elements_.insert("OS");
+  known_elements_.insert("P");
+  known_elements_.insert("PA");
+  known_elements_.insert("PB");
+  known_elements_.insert("PD");
+  known_elements_.insert("PM");
+  known_elements_.insert("PO");
+  known_elements_.insert("PR");
+  known_elements_.insert("PT");
+  known_elements_.insert("PU");
+  known_elements_.insert("RA");
+  known_elements_.insert("RB");
+  known_elements_.insert("RE");
+  known_elements_.insert("RF");
+  known_elements_.insert("RH");
+  known_elements_.insert("RN");
+  known_elements_.insert("RU");
+  known_elements_.insert("S");
+  known_elements_.insert("SB");
+  known_elements_.insert("SC");
+  known_elements_.insert("SE");
+  known_elements_.insert("SG");
+  known_elements_.insert("SI");
+  known_elements_.insert("SM");
+  known_elements_.insert("SN");
+  known_elements_.insert("SR");
+  known_elements_.insert("TA");
+  known_elements_.insert("TB");
+  known_elements_.insert("TC");
+  known_elements_.insert("TE");
+  known_elements_.insert("TH");
+  known_elements_.insert("TI");
+  known_elements_.insert("TL");
+  known_elements_.insert("TM");
+  known_elements_.insert("U");
+  known_elements_.insert("V");
+  known_elements_.insert("W");
+  known_elements_.insert("XE");
+  known_elements_.insert("Y");
+  known_elements_.insert("YB");
+  known_elements_.insert("ZN");
+  known_elements_.insert("ZR");
 }
 
 void Conopology::RegisterBuilder(const BuilderP& b, const String& name) {
   if (!GetBuilder(name))
   builder_map_[name]=b;
 }
+
 void Conopology::SetDefaultBuilder(const String& default_name) {
   BuilderP builder=GetBuilder(default_name);
   if (builder)
@@ -310,31 +273,11 @@ void Conopology::ConnectAll(const BuilderP& b, mol::EntityHandle eh, int flag)
   eh.Apply(tmaker);
 }
 
-Real Conopology::GetDefaultAtomRadius(const String& element) const
+bool Conopology::IsValidElement(const String& ele) 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_rad_map_.find(upper_ele);
-  return it==ele_rad_map_.end() ? 1.5 : it->second;
+  String upper_ele=ele;
+  std::transform(upper_ele.begin(),upper_ele.end(),upper_ele.begin(),toupper);
+  return known_elements_.find(upper_ele)!=known_elements_.end();
 }
 
-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;
-  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() ? 1.0 : it->second;
-}
-
-
 }} // ns
diff --git a/modules/conop/src/conop.hh b/modules/conop/src/conop.hh
index e8ad4bc0b..7109c83aa 100644
--- a/modules/conop/src/conop.hh
+++ b/modules/conop/src/conop.hh
@@ -36,13 +36,6 @@ public:
   // retrieve a builder by name
   BuilderP GetBuilder(const String& name="DEFAULT");
 
-  // return default vdW radius
-  // temporary location until more elaborate chemical information is impl
-  Real GetDefaultAtomRadius(const String& element) const;
-
-  // return default mass
-  Real GetDefaultAtomMass(const String& element) const;
-
   /*
     convenience function, connect all atoms with given coordinates,
     such as after coordinate file import, based on a given builder
@@ -61,8 +54,7 @@ private:
   Conopology& operator=(const Conopology&) {return *this;}
 
   BuilderMap builder_map_;
-  std::map<String,Real> ele_rad_map_;
-  std::map<String,Real> ele_mass_map_;
+  std::set<String> known_elements_;
 };
 
 }} //
diff --git a/modules/conop/src/heuristic_builder.cc b/modules/conop/src/heuristic_builder.cc
index bb4a63a22..55f548ae3 100644
--- a/modules/conop/src/heuristic_builder.cc
+++ b/modules/conop/src/heuristic_builder.cc
@@ -474,18 +474,9 @@ bool HeuristicBuilder::IsResidueComplete(const mol::ResidueHandle& rh)
 
 void HeuristicBuilder::FillAtomProps(mol::AtomHandle atom)
 {
-  mol::AtomProp prop=atom.GetAtomProps();
-  if (prop.element=="") {
-    prop.element=Builder::GuessAtomElement(atom.GetName(), prop.is_hetatm);
+  if (atom.GetElement()=="") {
+    atom.SetElement(Builder::GuessAtomElement(atom.GetName(), atom.IsHetAtom()));
   }
-  Conopology& conop_inst=Conopology::Instance();
-  if (prop.radius==0.0) {
-    prop.radius=conop_inst.GetDefaultAtomRadius(prop.element);    
-  }
-  if (prop.mass==0.0) {
-    prop.mass=conop_inst.GetDefaultAtomMass(prop.element);    
-  }
-  atom.SetAtomProps(prop);  
 }
 
 }} // ns
diff --git a/modules/conop/src/rule_based_builder.cc b/modules/conop/src/rule_based_builder.cc
index e47c96e35..f8617c89d 100644
--- a/modules/conop/src/rule_based_builder.cc
+++ b/modules/conop/src/rule_based_builder.cc
@@ -84,17 +84,9 @@ 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 (!conop_inst.IsValidElement(props.element)) {
-    props.element=spec.element;
-  }
-  if (props.radius==0.0) {
-    props.radius=conop_inst.GetDefaultAtomRadius(spec.element);    
-  }
-  if (props.mass==0.0) {
-    props.mass=conop_inst.GetDefaultAtomMass(spec.element);
-  }
-  atom.SetAtomProps(props);  
+  if (!conop_inst.IsValidElement(atom.GetElement())) {
+    atom.SetElement(spec.element);
+  } 
 }
 
 void RuleBasedBuilder::FillResidueProps(mol::ResidueHandle residue) 
@@ -330,18 +322,10 @@ void RuleBasedBuilder::FillAtomProps(mol::AtomHandle atom)
 
 bool RuleBasedBuilder::OnUnknownAtom(mol::AtomHandle atom)
 {
-  mol::AtomProp props=atom.GetAtomProps();
   Conopology& conop_inst=Conopology::Instance();
-  if (!conop_inst.IsValidElement(props.element)) {
-    props.element=Builder::GuessAtomElement(atom.GetName(), props.is_hetatm);
-  }
-  if (props.radius==0.0) {
-    props.radius=conop_inst.GetDefaultAtomRadius(props.element);    
-  }
-  if (props.mass==0.0) {
-    props.mass=conop_inst.GetDefaultAtomMass(props.element);
+  if (!conop_inst.IsValidElement(atom.GetElement())) {
+    atom.SetElement(Builder::GuessAtomElement(atom.GetName(), atom.IsHetAtom()));
   }
-  atom.SetAtomProps(props); 
   return false;
 }
 
diff --git a/modules/gfx/src/impl/backbone_trace.cc b/modules/gfx/src/impl/backbone_trace.cc
index 26f9f009c..2a0315380 100644
--- a/modules/gfx/src/impl/backbone_trace.cc
+++ b/modules/gfx/src/impl/backbone_trace.cc
@@ -78,8 +78,8 @@ public:
     // determine atom to add to list
     mol::AtomHandle ca = res.GetCentralAtom();
     if (ca) {
-      NodeEntry entry={ca, GfxObj::Ele2Color(ca.GetAtomProps().element),
-                       GfxObj::Ele2Color(ca.GetAtomProps().element),
+      NodeEntry entry={ca, GfxObj::Ele2Color(ca.GetElement()),
+                       GfxObj::Ele2Color(ca.GetElement()),
                        geom::Vec3(), // this will be set by the gfx trace obj
                        res.GetCentralNormal(),
                        1.0,
diff --git a/modules/gfx/src/surface.cc b/modules/gfx/src/surface.cc
index 6ffae62e6..2e271df6d 100644
--- a/modules/gfx/src/surface.cc
+++ b/modules/gfx/src/surface.cc
@@ -23,7 +23,6 @@
 #include <map>
 #include <limits>
 
-#include <ost/mol/atom_prop.hh>
 #include <ost/mol/mol.hh>
 #include <ost/mol/entity_property_mapper.hh>
 #include "surface.hh"
diff --git a/modules/io/src/mol/entity_io_crd_handler.cc b/modules/io/src/mol/entity_io_crd_handler.cc
index 320db5d1d..88286b78e 100644
--- a/modules/io/src/mol/entity_io_crd_handler.cc
+++ b/modules/io/src/mol/entity_io_crd_handler.cc
@@ -142,14 +142,7 @@ void CRDReader::ParseAndAddAtom(const String& line, mol::EntityHandle& ent)
 
   // finally add atom
   LOG_DEBUG("adding atom " << aname << " (" << ele << ") @" << apos);
-  mol::AtomProp aprop;
-  aprop.element=ele;
-  aprop.radius=conop::Conopology::Instance().GetDefaultAtomRadius(ele);
-  aprop.is_hetatm=false;
-  aprop.b_factor=0.0;
-  aprop.occupancy=1.0;
-  
-  mol::AtomHandle ah = editor.InsertAtom(curr_residue_, aname, apos, aprop);
+  mol::AtomHandle ah = editor.InsertAtom(curr_residue_, aname, apos, ele);
   sequential_atom_list_.push_back(ah);
   ++atom_count_;
 }
diff --git a/modules/io/src/mol/entity_io_mae_handler.cc b/modules/io/src/mol/entity_io_mae_handler.cc
index e810c9089..f5def7a3e 100644
--- a/modules/io/src/mol/entity_io_mae_handler.cc
+++ b/modules/io/src/mol/entity_io_mae_handler.cc
@@ -265,13 +265,7 @@ void MAEReader::add_atom(mol::EntityHandle ent,
 
   // finally add atom
   LOG_DEBUG("  atom " << aname << " (" << ele << ") @" << apos);
-  mol::AtomProp aprop;
-  aprop.element=ele;
-  aprop.radius=conop::Conopology::Instance().GetDefaultAtomRadius(ele);
-  aprop.is_hetatm=false;
-  aprop.b_factor=0.0;
-  aprop.occupancy=1.0;
-  mol::AtomHandle ah = editor.InsertAtom(curr_residue_, aname, apos, aprop);
+  mol::AtomHandle ah = editor.InsertAtom(curr_residue_, aname, apos, ele);
 }
   
 
diff --git a/modules/io/src/mol/pdb_reader.cc b/modules/io/src/mol/pdb_reader.cc
index 6fad3dc2c..969d9ffa1 100644
--- a/modules/io/src/mol/pdb_reader.cc
+++ b/modules/io/src/mol/pdb_reader.cc
@@ -395,15 +395,13 @@ void PDBReader::ParseAnisou(const StringRef& line, int line_num,
     throw IOException(str(format(fmt_str) % line_num));      
   }
   //get properties which are already set and extend them by adding the ANISOU info
-  mol::AtomProp aprop=atom.GetAtomProps();
+  
+
   geom::Mat3 mat(anisou[0], anisou[3], anisou[4],
                  anisou[3], anisou[1], anisou[5],
                  anisou[4], anisou[5], anisou[2]);
-  aprop.anisou=mat;
-  //divide by 10**4 to actually reflect the real values
-  aprop.anisou/=10000;
-  aprop.has_anisou=true;
-  atom.SetAtomProps(aprop);
+  mat/=10000;
+  atom.SetAnisou(mat);
 }
 
 void PDBReader::ParseAndAddAtom(const StringRef& line, int line_num,
@@ -527,30 +525,7 @@ void PDBReader::ParseAndAddAtom(const StringRef& line, int line_num,
   }
   // finally add atom
   LOG_DEBUG("adding atom " << aname << " (" << s_ele << ") @" << apos);
-  mol::AtomProp aprop;
-  aprop.element=s_ele;
-  if(is_pqr_) {
-    if (radius.first) {
-      aprop.radius=radius.second;
-    } else {
-      aprop.radius=0.0;
-    }
-  } else {
-    aprop.radius=0.0;
-  }
-
-  if (temp.first) {
-    aprop.b_factor=temp.second;
-  }
-  if (occ.first) {
-    aprop.occupancy=occ.second;
-  }
-  if (charge.first) {
-    aprop.charge=charge.second;
-  }
-
-  aprop.is_hetatm=record_type[0]=='H' ? true : false;
-
+  mol::AtomHandle ah;
   if (alt_loc!=' ') {
     // Check if there is already a atom with the same name.
     mol::AtomHandle me=curr_residue_.FindAtom(aname);
@@ -562,15 +537,31 @@ void PDBReader::ParseAndAddAtom(const StringRef& line, int line_num,
                      "with name " << aname << ", but without an alt loc");
         return;
       }
+      return;
     } else {
-      mol::AtomHandle ah=editor.InsertAltAtom(curr_residue_, aname,
-                                              String(1, alt_loc), apos, aprop);
+      ah=editor.InsertAltAtom(curr_residue_, aname,
+                              String(1, alt_loc), apos, s_ele);
       ++atom_count_;
     }
   } else {
-    mol::AtomHandle ah = editor.InsertAtom(curr_residue_, aname, apos, aprop);
+    ah=editor.InsertAtom(curr_residue_, aname, apos, s_ele);
     ++atom_count_;
   }
+  if(is_pqr_) {
+    if (radius.first) {
+      ah.SetRadius(radius.second);
+    }
+  }
+  if (temp.first) {
+    ah.SetBFactor(temp.second);
+  }
+  if (occ.first) {
+    ah.SetOccupancy(occ.second);
+  }
+  if (charge.first) {
+    ah.SetCharge(charge.second);
+  }
+  ah.SetHetAtom(record_type[0]=='H');
 }
 
 void PDBReader::ParseHelixEntry(const StringRef& line)
diff --git a/modules/io/src/mol/pdb_writer.cc b/modules/io/src/mol/pdb_writer.cc
index 8b16c2cce..8ab50da64 100644
--- a/modules/io/src/mol/pdb_writer.cc
+++ b/modules/io/src/mol/pdb_writer.cc
@@ -197,7 +197,7 @@ public:
   virtual bool VisitAtom(const mol::AtomHandle& atom) {
     counter_++;
     write_atom(ostr_, line_, atom, counter_, is_pqr_, charmm_style_);
-    if (atom.GetAtomProps().is_hetatm) {
+    if (atom.IsHetAtom()) {
       atom_indices_[atom.GetHashCode()]=counter_;
     }
     return true;
@@ -268,7 +268,7 @@ public:
 private:
 public:
   virtual bool VisitAtom(const mol::AtomHandle& atom) {
-    if (atom.GetAtomProps().is_hetatm) {
+    if (atom.IsHetAtom()) {
       bool has_partner=false;
       int atom_index=atom_indices_[atom.GetHashCode()];
       mol::AtomHandleList partners=atom.GetBondPartners();
diff --git a/modules/io/src/mol/sdf_reader.cc b/modules/io/src/mol/sdf_reader.cc
index 4427850ea..a7f70c916 100644
--- a/modules/io/src/mol/sdf_reader.cc
+++ b/modules/io/src/mol/sdf_reader.cc
@@ -196,17 +196,12 @@ void SDFReader::ParseAndAddAtom(const String& line, int line_num,
 
   String ele=boost::trim_copy(s_ele);
   String aname=boost::lexical_cast<String>(anum);
-
-  mol::AtomProp aprop;
-  aprop.element=ele;
-  aprop.radius=conop::Conopology::Instance().GetDefaultAtomRadius(ele);
-  aprop.mass=conop::Conopology::Instance().GetDefaultAtomMass(ele);
-  aprop.is_hetatm=hetatm;
-
+  
+  Real charge=0.0;  
   try {
-    aprop.charge=boost::lexical_cast<Real>(boost::trim_copy(s_charge));
-    if(aprop.charge != 0) {
-      aprop.charge=4-aprop.charge;
+    charge=boost::lexical_cast<Real>(boost::trim_copy(s_charge));
+    if (charge!=0) {
+      charge=4-charge;
     } //4-sdf_charge=real_charge if not 0
   } catch(boost::bad_lexical_cast&) {
     String msg="Bad atom line %d: Can't convert charge"
@@ -216,7 +211,9 @@ void SDFReader::ParseAndAddAtom(const String& line, int line_num,
 
   LOG_DEBUG("adding atom " << aname << " (" << s_ele << ") @" << apos);
 
-  editor.InsertAtom(curr_residue_, aname,apos,aprop);
+  mol::AtomHandle atom=editor.InsertAtom(curr_residue_, aname,apos, ele);  
+  atom.SetHetAtom(hetatm);
+  atom.SetCharge(charge);
 }
 
 
@@ -257,10 +254,12 @@ void SDFReader::ParseAndAddBond(const String& line, int line_num,
 
   mol::AtomHandle first,second;
 
-  first = ent.FindAtom(curr_chain_.GetName(), mol::ResNum(residue_count_), first_name);
-  second = ent.FindAtom(curr_chain_.GetName(), mol::ResNum(residue_count_), second_name);
+  first = ent.FindAtom(curr_chain_.GetName(), mol::ResNum(residue_count_), 
+                       first_name);
+  second = ent.FindAtom(curr_chain_.GetName(), mol::ResNum(residue_count_), 
+                        second_name);
 
-  if(first.IsValid() && second.IsValid()) {
+  if (first.IsValid() && second.IsValid()) {
     bond = editor.Connect(first, second);
     bond.SetBondOrder(type);
   } else {
@@ -269,7 +268,8 @@ void SDFReader::ParseAndAddBond(const String& line, int line_num,
     throw IOException(str(format(msg) % line_num % first % second));
   }
 
-  LOG_DEBUG("adding bond " << s_first_name << " " << s_second_name << " (" << s_type << ") ");
+  LOG_DEBUG("adding bond " << s_first_name << " " << s_second_name << " (" 
+            << s_type << ") ");
 }
 
 }}
diff --git a/modules/io/tests/test_io_pdb.cc b/modules/io/tests/test_io_pdb.cc
index df8ff5295..1c9218aa4 100644
--- a/modules/io/tests/test_io_pdb.cc
+++ b/modules/io/tests/test_io_pdb.cc
@@ -67,10 +67,10 @@ BOOST_AUTO_TEST_CASE(atom_record)
   BOOST_CHECK_EQUAL(a1.GetResidue().GetChain().GetName(), "A");  
   
   BOOST_CHECK_EQUAL(a1.GetPos(), geom::Vec3(16.0, 64.0, 8.0));
-  BOOST_CHECK_EQUAL(a1.GetAtomProps().b_factor, 1.0);
-  BOOST_CHECK_EQUAL(a1.GetAtomProps().occupancy, 0.5);  
-  BOOST_CHECK_EQUAL(a1.GetAtomProps().element, "N");
-  BOOST_CHECK_EQUAL(a1.GetAtomProps().is_hetatm, false);
+  BOOST_CHECK_EQUAL(a1.GetBFactor(), 1.0);
+  BOOST_CHECK_EQUAL(a1.GetOccupancy(), 0.5);  
+  BOOST_CHECK_EQUAL(a1.GetElement(), "N");
+  BOOST_CHECK_EQUAL(a1.IsHetAtom(), false);
   mol::AtomHandle a2=ent.FindAtom(" ", mol::ResNum(1), "CA");
   BOOST_REQUIRE(a2.IsValid());  
   BOOST_CHECK_EQUAL(a2.GetName(), "CA");
@@ -78,10 +78,10 @@ BOOST_AUTO_TEST_CASE(atom_record)
   BOOST_CHECK_EQUAL(a2.GetResidue().GetChain().GetName(), " ");  
   
   BOOST_CHECK_EQUAL(a2.GetPos(), geom::Vec3(32.0, -128.0, -2.5));
-  BOOST_CHECK_EQUAL(a2.GetAtomProps().b_factor, 128.0);
-  BOOST_CHECK_EQUAL(a2.GetAtomProps().occupancy, 1.0);  
-  BOOST_CHECK_EQUAL(a2.GetAtomProps().element, "C");
-  BOOST_CHECK_EQUAL(a2.GetAtomProps().is_hetatm, true);
+  BOOST_CHECK_EQUAL(a2.GetBFactor(), 128.0);
+  BOOST_CHECK_EQUAL(a2.GetOccupancy(), 1.0);  
+  BOOST_CHECK_EQUAL(a2.GetElement(), "C");
+  BOOST_CHECK_EQUAL(a2.IsHetAtom(), true);
 }
 
 BOOST_AUTO_TEST_CASE(end_record)
@@ -162,16 +162,16 @@ BOOST_AUTO_TEST_CASE(anisou_record)
   BOOST_REQUIRE(ent.GetAtomCount()==1);
   mol::AtomHandle a1=ent.FindAtom("A", mol::ResNum(7), "N");
   BOOST_REQUIRE(a1.IsValid());
-  mol::AtomProp props=a1.GetAtomProps();
-  BOOST_CHECK_CLOSE(Real( 0.0100), props.anisou(0, 0), Real(1e-4));
-  BOOST_CHECK_CLOSE(Real(-0.0016), props.anisou(1, 0), Real(1e-4));
-  BOOST_CHECK_CLOSE(Real(-0.0026), props.anisou(2, 0), Real(1e-4));
-  BOOST_CHECK_CLOSE(Real(-0.0016), props.anisou(0, 1), Real(1e-4));
-  BOOST_CHECK_CLOSE(Real( 0.0110), props.anisou(1, 1), Real(1e-4));
-  BOOST_CHECK_CLOSE(Real(-0.0054), props.anisou(2, 1), Real(1e-4));
-  BOOST_CHECK_CLOSE(Real(-0.0026), props.anisou(0, 2), Real(1e-4));
-  BOOST_CHECK_CLOSE(Real(-0.0054), props.anisou(1, 2), Real(1e-4));
-  BOOST_CHECK_CLOSE(Real( 0.0120), props.anisou(2, 2), Real(1e-4));    
+  const geom::Mat3& anisou=a1.GetAnisou();
+  BOOST_CHECK_CLOSE(Real( 0.0100), anisou(0, 0), Real(1e-4));
+  BOOST_CHECK_CLOSE(Real(-0.0016), anisou(1, 0), Real(1e-4));
+  BOOST_CHECK_CLOSE(Real(-0.0026), anisou(2, 0), Real(1e-4));
+  BOOST_CHECK_CLOSE(Real(-0.0016), anisou(0, 1), Real(1e-4));
+  BOOST_CHECK_CLOSE(Real( 0.0110), anisou(1, 1), Real(1e-4));
+  BOOST_CHECK_CLOSE(Real(-0.0054), anisou(2, 1), Real(1e-4));
+  BOOST_CHECK_CLOSE(Real(-0.0026), anisou(0, 2), Real(1e-4));
+  BOOST_CHECK_CLOSE(Real(-0.0054), anisou(1, 2), Real(1e-4));
+  BOOST_CHECK_CLOSE(Real( 0.0120), anisou(2, 2), Real(1e-4));    
 }
 
 BOOST_AUTO_TEST_CASE(only_66_cols)
@@ -210,12 +210,10 @@ BOOST_AUTO_TEST_CASE(write_atom)
   mol::XCSEditor edi=ent.RequestXCSEditor();
   mol::ChainHandle ch=edi.InsertChain("A");
   mol::ResidueHandle r=edi.AppendResidue(ch, "GLY");
-  mol::AtomProp c_prop;
-  c_prop.element="C";
-  c_prop.occupancy=1.0;
-  c_prop.b_factor=128.0;
-  mol::AtomHandle a=edi.InsertAtom(r, "CA", geom::Vec3(32.0, -128.0, -2.5), 
-                                   c_prop);
+
+  mol::AtomHandle a=edi.InsertAtom(r, "CA", geom::Vec3(32.0, -128.0, -2.5), "C");
+  a.SetOccupancy(1.0);
+  a.SetBFactor(128.0);
   writer.Write(ent);
   String s=out.str();
   BOOST_CHECK_EQUAL(s.substr(0, 54), 
@@ -233,14 +231,12 @@ BOOST_AUTO_TEST_CASE(write_hetatom)
   mol::XCSEditor edi=ent.RequestXCSEditor();
   mol::ChainHandle ch=edi.InsertChain("A");
   mol::ResidueHandle r=edi.AppendResidue(ch, "CA");
-  mol::AtomProp c_prop;
-  c_prop.element="CA";
-  c_prop.is_hetatm=true;
-  c_prop.mass=40.01;
-  c_prop.occupancy=1.0;
-  c_prop.b_factor=40.75;
   mol::AtomHandle a=edi.InsertAtom(r, "CA", geom::Vec3(32.0, -128.0, -2.5), 
-                                   c_prop);
+                                   "CA");
+  a.SetHetAtom(true);
+  a.SetMass(40.01);
+  a.SetOccupancy(1.0);
+  a.SetBFactor(40.75);
   writer.Write(ent);
   String s=out.str();
   BOOST_CHECK_EQUAL(s.substr(0, 54), 
diff --git a/modules/io/tests/test_io_sdf.cc b/modules/io/tests/test_io_sdf.cc
index bbf858427..db108e4c5 100644
--- a/modules/io/tests/test_io_sdf.cc
+++ b/modules/io/tests/test_io_sdf.cc
@@ -60,7 +60,7 @@ BOOST_AUTO_TEST_CASE(simple_sdf)
   BOOST_CHECK_EQUAL(eh.GetChainCount(), 1);
   BOOST_CHECK_EQUAL(eh.GetAtomCount(),  6);
   BOOST_CHECK_EQUAL(eh.GetBondCount(),  6);
-  BOOST_CHECK_CLOSE(eh.GetMass(), Real(121.545502), Real(1e-4));
+  BOOST_CHECK_CLOSE(eh.GetMass(), Real(121.546997), Real(1e-4));
 
   // check atom/bond types
   mol::AtomHandle ah=eh.GetAtomList()[0];
@@ -70,7 +70,7 @@ BOOST_AUTO_TEST_CASE(simple_sdf)
   BOOST_CHECK_EQUAL(ah2.GetElement(), "Cl");
   BOOST_CHECK_CLOSE(ah.GetRadius(),  Real(1.55), Real(1e-2));
   BOOST_CHECK_CLOSE(ah2.GetRadius(), Real(1.75), Real(1e-2));
-  BOOST_CHECK_CLOSE(ah.GetMass(),  Real(14.0067), Real(1e-4));
+  BOOST_CHECK_CLOSE(ah.GetMass(),  Real(14.007), Real(1e-4));
   BOOST_CHECK_CLOSE(ah2.GetMass(), Real(35.453), Real(1e-3));
   BOOST_CHECK_EQUAL(ah.GetBondCount(),  3);
   BOOST_CHECK_EQUAL(ah2.GetBondCount(), 1);
diff --git a/modules/mol/alg/src/entity_to_density.cc b/modules/mol/alg/src/entity_to_density.cc
index 269f23add..6a15ac44f 100644
--- a/modules/mol/alg/src/entity_to_density.cc
+++ b/modules/mol/alg/src/entity_to_density.cc
@@ -135,7 +135,7 @@ public:
       bool found = false;
       while (found != true && table_iter!=scatt_props_table_.end())
       {
-        if ( (*table_iter).element == (*iterator).GetAtomProps().element)
+        if ( (*table_iter).element == (*iterator).GetElement())
         {        
           geom::Vec3 coord = (*iterator).GetPos();
 
@@ -287,7 +287,7 @@ public:
                                              scatt_props_table_.begin();
       bool found = false;
       while (found != true && table_iter!=scatt_props_table_.end()) {
-        if ((*table_iter).element == (*iterator).GetAtomProps().element) {
+        if ((*table_iter).element == (*iterator).GetElement()) {
           found = true;
           Real a = (*table_iter).atomic_weight;
           geom::Vec3 coord = (*iterator).GetPos();
diff --git a/modules/mol/alg/tests/test_superposition.cc b/modules/mol/alg/tests/test_superposition.cc
index c410a768a..599e0e31c 100644
--- a/modules/mol/alg/tests/test_superposition.cc
+++ b/modules/mol/alg/tests/test_superposition.cc
@@ -33,21 +33,18 @@ using namespace ost::mol::alg;
 struct Fixture {
   Fixture() {
 
-    AtomProp prop;
-    prop.element="C";
-
     e=CreateEntity();
     XCSEditor ed=e.RequestXCSEditor();
     c=ed.InsertChain("A");
     r=ed.AppendResidue(c, "XXX");
-    ab=ed.InsertAtom(r, "A", geom::Vec3(-5,-5,-5), prop);
-    ac=ed.InsertAtom(r, "B", geom::Vec3(-5, 5,-5), prop);
-    ad=ed.InsertAtom(r, "C", geom::Vec3(-5, 5, 5), prop);
-    ae=ed.InsertAtom(r, "D", geom::Vec3(-5,-5, 5), prop);
-    af=ed.InsertAtom(r, "E", geom::Vec3(5,-5, 5), prop);
-    ag=ed.InsertAtom(r, "F", geom::Vec3(5,-5,-5), prop);
-    ah=ed.InsertAtom(r, "G", geom::Vec3(5, 5,-5), prop);
-    ai=ed.InsertAtom(r, "H", geom::Vec3(5, 5, 5), prop);
+    ab=ed.InsertAtom(r, "A", geom::Vec3(-5,-5,-5), "C");
+    ac=ed.InsertAtom(r, "B", geom::Vec3(-5, 5,-5), "C");
+    ad=ed.InsertAtom(r, "C", geom::Vec3(-5, 5, 5), "C");
+    ae=ed.InsertAtom(r, "D", geom::Vec3(-5,-5, 5), "C");
+    af=ed.InsertAtom(r, "E", geom::Vec3(5,-5, 5), "C");
+    ag=ed.InsertAtom(r, "F", geom::Vec3(5,-5,-5), "C");
+    ah=ed.InsertAtom(r, "G", geom::Vec3(5, 5,-5), "C");
+    ai=ed.InsertAtom(r, "H", geom::Vec3(5, 5, 5), "C");
 
 
     BondHandle b1=ed.Connect(ab, ad);
diff --git a/modules/mol/base/pymod/export_atom.cc b/modules/mol/base/pymod/export_atom.cc
index 13fc2ee55..fe12a2f64 100644
--- a/modules/mol/base/pymod/export_atom.cc
+++ b/modules/mol/base/pymod/export_atom.cc
@@ -42,13 +42,7 @@ void export_Atom()
     .add_property("qualified_name", &AtomBase::GetQualifiedName)
     .def("IsValid", &AtomBase::IsValid)
     .def(self_ns::str(self))
-    .def("GetAtomProps", &AtomBase::GetAtomProps,
-         return_value_policy<copy_const_reference>())
-    .def("SetAtomProps", &AtomBase::SetAtomProps, args("prop"))
     .def("GetIndex", &AtomBase::GetIndex)
-    .add_property("prop",
-                  make_function(&AtomBase::GetAtomProps,
-                                return_value_policy<copy_const_reference>()))
     .add_property("pos",
                   make_function(&AtomBase::GetPos,
                                 return_value_policy<copy_const_reference>()))
@@ -61,15 +55,19 @@ void export_Atom()
     .def("GetRadius", &AtomBase::GetRadius)
     .def("GetElement", &AtomBase::GetElement, 
          return_value_policy<copy_const_reference>())
+    .def("SetElement", &AtomBase::SetElement)
     .def("GetCharge", &AtomBase::GetCharge)
     .def("GetMass", &AtomBase::GetMass)
-    .def("IsHetAtom", &AtomBase::IsHetAtom)    
+    .def("IsHetAtom", &AtomBase::IsHetAtom)
+    .def("SetMass", &AtomBase::SetMass)
+    .def("SetCharge", &AtomBase::SetCharge)
     .add_property("radius", &AtomBase::GetRadius)
     .add_property("element", make_function(&AtomBase::GetElement, 
-                  return_value_policy<copy_const_reference>()))
-    .add_property("is_hetatom", &AtomBase::IsHetAtom)
-    .add_property("charge", &AtomBase::GetCharge)
-    .add_property("mass", &AtomBase::GetMass)
+                  return_value_policy<copy_const_reference>()),
+                  &AtomBase::SetElement)
+    .add_property("is_hetatom", &AtomBase::IsHetAtom, &AtomBase::SetHetAtom)
+    .add_property("charge", &AtomBase::GetCharge, &AtomBase::SetCharge)
+    .add_property("mass", &AtomBase::GetMass, &AtomBase::SetMass)
   ;
   generic_prop_def<AtomBase>(atom_base);
 
@@ -96,15 +94,5 @@ void export_Atom()
     .def(vector_indexing_suite<AtomHandleList>())
     .def(ost::VectorAdditions<AtomHandleList>())
   ;
-  class_<AtomProp>("AtomProp", init<>())
-    .def_readwrite("element", &AtomProp::element)
-    .def_readwrite("radius", &AtomProp::radius)
-    .def_readwrite("charge", &AtomProp::charge)
-    .def_readwrite("mass", &AtomProp::mass)
-    .def_readwrite("occupancy", &AtomProp::occupancy)
-    .def_readwrite("b_factor", &AtomProp::b_factor)
-    .def_readwrite("is_hetatm", &AtomProp::is_hetatm)
-    .def_readwrite("anisou", &AtomProp::anisou)
-  ;
 }
 
diff --git a/modules/mol/base/src/CMakeLists.txt b/modules/mol/base/src/CMakeLists.txt
index b83c69420..0a4314041 100644
--- a/modules/mol/base/src/CMakeLists.txt
+++ b/modules/mol/base/src/CMakeLists.txt
@@ -41,7 +41,6 @@ xcs_editor.cc)
 set(OST_MOL_HEADERS
 atom_base.hh
 atom_handle.hh
-atom_prop.hh
 atom_view.hh
 bond_handle.hh
 bond_table.hh
diff --git a/modules/mol/base/src/atom_base.cc b/modules/mol/base/src/atom_base.cc
index 2818844b0..6de12176f 100644
--- a/modules/mol/base/src/atom_base.cc
+++ b/modules/mol/base/src/atom_base.cc
@@ -75,19 +75,6 @@ std::vector<String> AtomBase::GetAltGroupNames() const
   return impl_->GetResidue()->GetAltAtomGroupNames(Impl());
 }
 
-
-const AtomProp& AtomBase::GetAtomProps() const 
-{
-  this->CheckValidity();  
-  return impl_->GetAtomProps();
-}
-
-void AtomBase::SetAtomProps(const AtomProp& prop) 
-{
-  this->CheckValidity();  
-  impl_->GetAtomProps()=prop;
-}
-
 impl::AtomImplPtr& AtomBase::Impl() 
 {
   return impl_;
@@ -134,47 +121,98 @@ std::ostream& operator<<(std::ostream& os, const AtomBase& atom)
 Real AtomBase::GetRadius() const
 {
   this->CheckValidity();
-  return Impl()->GetAtomProps().radius;
+  return Impl()->GetRadius();
 }
 
 
 const String& AtomBase::GetElement() const
 {
   this->CheckValidity();
-  return Impl()->GetAtomProps().element;
+  return Impl()->GetElement();
 }
 
 
 bool AtomBase::IsHetAtom() const
 {
   this->CheckValidity();
-  return Impl()->GetAtomProps().is_hetatm;
+  return Impl()->IsHetAtom();
 }
 
 Real AtomBase::GetBFactor() const
 {
   this->CheckValidity();
-  return Impl()->GetAtomProps().b_factor;
+  return Impl()->GetBFactor();
+}
+void AtomBase::SetElement(const String& element)
+{
+  this->CheckValidity();
+  Impl()->SetElement(element);
+}
+
+void AtomBase::SetBFactor(Real factor)
+{
+  this->CheckValidity();
+  Impl()->SetBFactor(factor);
+}
+
+void AtomBase::SetOccupancy(Real occ)
+{
+  this->CheckValidity();
+  Impl()->SetOccupancy(occ);
 }
 
 Real AtomBase::GetMass() const
 {
   this->CheckValidity();
-  return Impl()->GetAtomProps().mass;
+  return Impl()->GetMass();
 }
 
 Real AtomBase::GetCharge() const
 {
   this->CheckValidity();
-  return Impl()->GetAtomProps().charge;
+  return Impl()->GetCharge();
 }
 
 Real AtomBase::GetOccupancy() const
 {
   this->CheckValidity();
-  return Impl()->GetAtomProps().occupancy;
+  return Impl()->GetOccupancy();
+}
+
+void AtomBase::SetCharge(Real charge)
+{
+  this->CheckValidity();
+  Impl()->SetCharge(charge);
+}
+
+void AtomBase::SetRadius(Real radius)
+{
+  this->CheckValidity();
+  Impl()->SetCharge(radius);
+}
+
+const geom::Mat3& AtomBase::GetAnisou() const
+{
+  this->CheckValidity();
+  return Impl()->GetAnisou();
 }
 
+void AtomBase::SetAnisou(const geom::Mat3& anisou)
+{
+  this->CheckValidity();
+  Impl()->SetAnisou(anisou);
+}
+
+void AtomBase::SetMass(Real mass)
+{
+  this->CheckValidity();
+  Impl()->SetMass(mass);
+}
+void AtomBase::SetHetAtom(bool het)
+{
+  this->CheckValidity();
+  Impl()->SetHetAtom(het);
+}
 
 String AtomBase::GetStringProperty(Prop::ID prop_id) const
 {
diff --git a/modules/mol/base/src/atom_base.hh b/modules/mol/base/src/atom_base.hh
index 9777aea71..189c5830a 100644
--- a/modules/mol/base/src/atom_base.hh
+++ b/modules/mol/base/src/atom_base.hh
@@ -75,16 +75,7 @@ public:
   geom::Vec3 GetAltPos(const String& alt_group) const;
   
   std::vector<String> GetAltGroupNames() const;
-    /// \name Atom properties
-  //@{
-  /// \brief Get atom properties such as element name, radius crystallographic
-  ///     occupancy and temperature factors.
-  ///
-  /// \sa      #SetAtomProps
-  const AtomProp& GetAtomProps() const;
-    
-  /// \brief  Set atom properties.
-  void SetAtomProps(const AtomProp& prop);
+
   //@} 
   
   /// \name Handle validity
@@ -134,6 +125,24 @@ public:
   /// The returned value may be zero for some structures
   Real GetBFactor() const;
   
+  
+  void SetBFactor(Real factor);
+  
+  void SetOccupancy(Real occ);
+  
+  
+  void SetCharge(Real charge);
+  
+  void SetMass(Real mass);
+  
+  void SetHetAtom(bool het);
+  
+  void SetRadius(Real radius);
+  
+  
+  const geom::Mat3& GetAnisou() const;
+  
+  void SetAnisou(const geom::Mat3& anisou);
   /// \brief get mass of atom
   /// 
   /// The returned value may be zero
@@ -153,6 +162,8 @@ public:
   /// \brief get atom implementation
   impl::AtomImplPtr& Impl();
 
+
+  void SetElement(const String& element);
 protected:
   
   GenericPropContainerImpl* GpImpl();
diff --git a/modules/mol/base/src/chain_view.cc b/modules/mol/base/src/chain_view.cc
index 1c5ba252e..0e6458c38 100644
--- a/modules/mol/base/src/chain_view.cc
+++ b/modules/mol/base/src/chain_view.cc
@@ -381,7 +381,7 @@ geom::Vec3 ChainView::GetCenterOfMass() const
       ResidueView r=*i;
       for (AtomViewList::const_iterator j=r.GetAtomList().begin(),
           e2=r.GetAtomList().end(); j!=e2; ++j) {
-        center+=j->GetPos() * j->GetAtomProps().mass;
+        center+=j->GetPos() * j->GetMass();
       }
     }
     center/=mass;
diff --git a/modules/mol/base/src/editor_base.cc b/modules/mol/base/src/editor_base.cc
index 02f7d1744..4ed9b6a4b 100644
--- a/modules/mol/base/src/editor_base.cc
+++ b/modules/mol/base/src/editor_base.cc
@@ -78,29 +78,28 @@ void EditorBase::RenameChain(ChainHandle chain, const String& new_name)
 
 
 AtomHandle EditorBase::InsertAtom(ResidueHandle res, const String& name,
-                                  const geom::Vec3& pos,
-                                  const AtomProp& prop)
+                                  const geom::Vec3& pos, const String& ele)
 {
   CheckHandleValidity(res);
   ent_.Impl()->MarkTraceDirty();  
-  return AtomHandle(res.Impl()->InsertAtom(name, pos,prop));
+  return AtomHandle(res.Impl()->InsertAtom(name, pos, ele));
 }
 
 AtomHandle EditorBase::InsertAltAtom(ResidueHandle res, const String& name,
                                      const String& alt_group,
                                      const geom::Vec3& pos,
-                                     const AtomProp& prop) 
+                                     const String& ele) 
 {
   CheckHandleValidity(res);
   ent_.Impl()->MarkTraceDirty();
-  AtomHandle atom(res.Impl()->InsertAltAtom(name, alt_group, pos, prop));
+  AtomHandle atom(res.Impl()->InsertAltAtom(name, alt_group, pos, ele));
   this->UpdateTrace();
   return atom;
 }
 
 void EditorBase::AddAltAtomPos(const String& group,
-                                    const AtomHandle& atom,
-                                    const geom::Vec3& position) 
+                               const AtomHandle& atom,
+                               const geom::Vec3& position) 
 {
   CheckHandleValidity(atom);
   atom.GetResidue().Impl()->AddAltAtomPos(group, atom.Impl(), position);
diff --git a/modules/mol/base/src/editor_base.hh b/modules/mol/base/src/editor_base.hh
index 4354c8295..e8a112726 100644
--- a/modules/mol/base/src/editor_base.hh
+++ b/modules/mol/base/src/editor_base.hh
@@ -28,7 +28,6 @@
 
 #include "entity_handle.hh"
 #include "residue_prop.hh"
-#include "atom_prop.hh"
 #include "editor_type_fw.hh"
 
 namespace ost { namespace mol {
@@ -116,17 +115,14 @@ public:
   ///     algorithms as well as most builders in the conop module rely on proper 
   ///     naming.
   /// \param pos is the position of the atom in global coordinates
-  /// \param prop are the atom's properties such as element, van der Waals 
-  ///     radius charge and so on. The default set of atom properties is  rather
-  ///     meaningless
   AtomHandle InsertAtom(ResidueHandle residue, const String& name, 
-                        const geom::Vec3& pos, const AtomProp& prop=AtomProp());
+                        const geom::Vec3& pos, const String& ele="");
 
   /// \brief Insert new atom with alternative position indicator
   /// \sa EditorBase::AddAltAtomPos(), ResidueHandle
   AtomHandle InsertAltAtom(ResidueHandle residue, const String& name, 
-                           const String& alt_group, const geom::Vec3& pos, 
-                           const AtomProp& prop=AtomProp());
+                           const String& alt_group, const geom::Vec3& pos,
+                           const String& ele="");
   /// \brief  Add alternative atom position
   /// \param group is the name of the alternative atom position group. If no 
   ///     group of that name exists, it will be created.
@@ -138,7 +134,7 @@ public:
   ///         is the alternative position
   /// \sa EditorBase::InsertAltAtom(), ResidueHandle
   void AddAltAtomPos(const String& group, const AtomHandle& atom, 
-                          const geom::Vec3& position);                           
+                     const geom::Vec3& position);
   //\}
   
   /// \brief connect two atoms with bond
diff --git a/modules/mol/base/src/impl/CMakeLists.txt b/modules/mol/base/src/impl/CMakeLists.txt
index 41ddeb0b5..45a453ac1 100644
--- a/modules/mol/base/src/impl/CMakeLists.txt
+++ b/modules/mol/base/src/impl/CMakeLists.txt
@@ -10,12 +10,14 @@ query_impl.cc
 residue_impl.cc
 surface_impl.cc
 torsion_impl.cc
+atom_prop.cc
 PARENT_SCOPE
 )
 
 set(OST_MOL_IMPL_HEADERS
 pointer_iterator.hh
 atom_group.hh
+atom_prop.hh
 atom_impl.hh
 atom_impl_fw.hh
 chain_impl.hh
diff --git a/modules/mol/base/src/impl/atom_impl.cc b/modules/mol/base/src/impl/atom_impl.cc
index 698bc863f..f355416fa 100644
--- a/modules/mol/base/src/impl/atom_impl.cc
+++ b/modules/mol/base/src/impl/atom_impl.cc
@@ -40,12 +40,13 @@ AtomImpl::AtomImpl(const EntityImplPtr& e,
                    const ResidueImplPtr& r,
                    const String& n,
                    const geom::Vec3& p,
-                   const AtomProp& prop,
+                   const String& ele,
                    unsigned long index):
   res_(r),
   name_(n),
   pos_(p),
-  prop_(prop),
+  element_(ele),
+  is_hetatm_(false),
   prim_connector_(),
   connector_list_(),
   fragment_(),
@@ -56,6 +57,7 @@ AtomImpl::AtomImpl(const EntityImplPtr& e,
   geom::Mat4 transf_matrix = ent.GetTransformationMatrix();
   geom::Vec3 transf_pos = geom::Vec3(transf_matrix*geom::Vec4(p));
   tf_pos_ = transf_pos;
+  prop_=AtomProp::GetDefaultProps(element_);
 }
 
 void AtomImpl::AddSecondaryConnector(const ConnectorImplP& bp)
@@ -319,11 +321,11 @@ Real AtomImpl::GetFloatProperty(Prop::ID prop_id) const
     case Prop::AZ:
       return pos_[2];            
     case Prop::OCC:
-      return prop_.occupancy;
+      return occupancy_;
     case Prop::ABFAC:
-      return prop_.b_factor;
+      return b_factor_;
     case Prop::ACHARGE:
-      return prop_.charge;
+      return prop_->charge;
     default:
       throw PropertyError(prop_id);
   }
@@ -335,7 +337,7 @@ String AtomImpl::GetStringProperty(Prop::ID prop_id) const
     case Prop::ANAME:
       return name_;
     case Prop::ELE:
-      return prop_.element;
+      return element_;
     default:
       throw PropertyError(prop_id);
   }
diff --git a/modules/mol/base/src/impl/atom_impl.hh b/modules/mol/base/src/impl/atom_impl.hh
index 9fcbbf776..90507b102 100644
--- a/modules/mol/base/src/impl/atom_impl.hh
+++ b/modules/mol/base/src/impl/atom_impl.hh
@@ -24,7 +24,7 @@
 #include <ost/mol/module_config.hh>
 #include <ost/geom/geom.hh>
 #include <ost/mol/entity_visitor_fw.hh>
-#include <ost/mol/atom_prop.hh>
+#include <ost/mol/impl/atom_prop.hh>
 
 #include <ost/mol/impl/atom_impl_fw.hh>
 #include <ost/mol/impl/residue_impl_fw.hh>
@@ -50,7 +50,7 @@ class AtomImpl: public GenericPropContainerImpl,
                 public boost::enable_shared_from_this<AtomImpl> {
 public:
    AtomImpl(const EntityImplPtr& ent, const ResidueImplPtr& res,
-            const String& name, const geom::Vec3& pos, const AtomProp& prop,
+            const String& name, const geom::Vec3& pos, const String& ele,
             unsigned long index);
 
   ~AtomImpl();
@@ -70,11 +70,7 @@ public:
   void SetTransformedPos(const geom::Vec3& pos) { tf_pos_=pos; }
 
   void SetOriginalPos(const geom::Vec3& pos) { pos_=pos; }
-  
-  const AtomProp& GetAtomProps() const {return prop_;}
-  
-  AtomProp& GetAtomProps() {return prop_;}
-  
+      
   ResidueImplPtr GetResidue() const;
 
   void SetPrimaryConnector(const ConnectorImplP& bp) {
@@ -111,11 +107,93 @@ public:
   void SetTraced(bool f) {set_state_bit(1,f);}
   bool IsTraced() const {return get_state_bit(1);}
 
-  unsigned int GetState() const {
+
+  Real GetBFactor() const { return b_factor_; }
+  
+  const String& GetElement() const { return element_; }  
+  
+  void SetElement(const String& ele) 
+  { 
+    if (element_!=ele) {
+      element_=ele;
+      prop_=impl::AtomProp::GetDefaultProps(element_);
+    }
+  }
+  
+  void SetAnisou(const geom::Mat3& anisou)
+  {
+    if (prop_->is_default && prop_->anisou!=anisou) {
+      prop_=new AtomProp(*prop_);
+      prop_->is_default=false;
+      prop_->has_anisou=true;
+    }
+
+    prop_->anisou=anisou;
+  }
+  
+  const geom::Mat3& GetAnisou() const
+  {
+    return prop_->anisou;
+  }
+  void SetBFactor(Real factor) 
+  { 
+    b_factor_=factor;
+  }  
+  
+  void SetOccupancy(Real occ)
+  {
+    occupancy_=occ;
+  }
+  
+  Real GetOccupancy() const 
+  { 
+    return occupancy_; 
+  }
+  
+  Real GetRadius() const { return prop_->radius; }
+  
+  Real GetMass() const { return prop_->mass; }
+  Real GetCharge() const { return prop_->charge; }
+  
+  bool IsHetAtom() { return is_hetatm_; }
+  
+  void SetHetAtom(bool het) { is_hetatm_=het; }
+  
+  void SetMass(Real mass)
+  {
+    if (prop_->is_default && prop_->mass!=mass) {
+      prop_=new AtomProp(*prop_);
+      prop_->is_default=false;
+    }
+    prop_->mass=mass;
+  }
+  
+  void SetRadius(Real radius)
+  {
+    if (prop_->is_default && prop_->radius!=radius) {
+      prop_=new AtomProp(*prop_);
+      prop_->is_default=false;
+    }
+    prop_->radius=radius;
+  }
+  
+  void SetCharge(Real charge)
+  {
+    if (prop_->is_default && prop_->charge!=charge) {
+      prop_=new AtomProp(*prop_);
+      prop_->is_default=false;
+    }
+    prop_->charge=charge;
+  }
+  
+  
+  unsigned int GetState() const 
+  {
     return state_;
   }
   
-  void SetState(int state) {
+  void SetState(int state) 
+  {
     state_=state;
   }
   
@@ -144,11 +222,14 @@ public:
                      
 private:
   ResidueImplW res_;
-  String name_;
-  geom::Vec3 pos_;
-  geom::Vec3 tf_pos_;
-  AtomProp prop_;
-
+  String       name_;
+  geom::Vec3   pos_;
+  geom::Vec3   tf_pos_;
+  Real         occupancy_;
+  Real         b_factor_;
+  String       element_;
+  AtomProp*    prop_;
+  bool         is_hetatm_;
   ConnectorImplP prim_connector_;
   ConnectorImplList connector_list_;
   FragmentImplP fragment_;
diff --git a/modules/mol/base/src/impl/atom_prop.cc b/modules/mol/base/src/impl/atom_prop.cc
new file mode 100644
index 000000000..dc00c94b0
--- /dev/null
+++ b/modules/mol/base/src/impl/atom_prop.cc
@@ -0,0 +1,157 @@
+//------------------------------------------------------------------------------
+// This file is part of the OpenStructure project <www.openstructure.org>
+//
+// Copyright (C) 2008-2010 by the OpenStructure authors
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License as published by the Free
+// Software Foundation; either version 3.0 of the License, or (at your option)
+// any later version.
+// This library is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+// details.
+//
+// You should have received a copy of the GNU Lesser General Public License
+// along with this library; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+//------------------------------------------------------------------------------
+#include "atom_prop.hh"
+
+namespace ost { namespace mol { namespace impl {
+
+std::map<String, AtomProp> AtomProp::defaults_;
+
+void AtomProp::Init()
+{
+  defaults_["AC"]=AtomProp(2.0000, 227.0000);
+  defaults_["AG"]=AtomProp(1.7200, 107.8680);
+  defaults_["AL"]=AtomProp(2.0000, 26.9820);
+  defaults_["AM"]=AtomProp(2.0000, 243.0000);
+  defaults_["AR"]=AtomProp(1.8800, 39.9480);
+  defaults_["AS"]=AtomProp(1.8500, 74.9220);
+  defaults_["AT"]=AtomProp(2.0000, 210.0000);
+  defaults_["AU"]=AtomProp(1.6600, 196.9670);
+  defaults_["B"]=AtomProp(2.0000, 10.8110);
+  defaults_["BA"]=AtomProp(2.0000, 137.3270);
+  defaults_["BE"]=AtomProp(2.0000, 9.0120);
+  defaults_["BH"]=AtomProp(2.0000, 264.0000);
+  defaults_["BI"]=AtomProp(2.0000, 208.9800);
+  defaults_["BK"]=AtomProp(2.0000, 247.0000);
+  defaults_["BR"]=AtomProp(1.8500, 79.9040);
+  defaults_["C"]=AtomProp(1.7000, 12.0110);
+  defaults_["CA"]=AtomProp(2.0000, 40.0780);
+  defaults_["CD"]=AtomProp(1.5800, 112.4110);
+  defaults_["CE"]=AtomProp(2.0000, 140.1160);
+  defaults_["CF"]=AtomProp(2.0000, 251.0000);
+  defaults_["CL"]=AtomProp(1.7500, 35.4530);
+  defaults_["CM"]=AtomProp(2.0000, 247.0000);
+  defaults_["CO"]=AtomProp(2.0000, 58.9330);
+  defaults_["CR"]=AtomProp(2.0000, 51.9960);
+  defaults_["CS"]=AtomProp(2.0000, 132.9050);
+  defaults_["CU"]=AtomProp(1.4000, 63.5460);
+  defaults_["DB"]=AtomProp(2.0000, 262.0000);
+  defaults_["DS"]=AtomProp(2.0000, 271.0000);
+  defaults_["DY"]=AtomProp(2.0000, 162.5000);
+  defaults_["ER"]=AtomProp(2.0000, 167.2600);
+  defaults_["ES"]=AtomProp(2.0000, 252.0000);
+  defaults_["EU"]=AtomProp(2.0000, 151.9640);
+  defaults_["F"]=AtomProp(1.4700, 18.9980);
+  defaults_["FE"]=AtomProp(2.0000, 55.8450);
+  defaults_["FM"]=AtomProp(2.0000, 257.0000);
+  defaults_["FR"]=AtomProp(2.0000, 223.0000);
+  defaults_["GA"]=AtomProp(1.8700, 69.7230);
+  defaults_["GD"]=AtomProp(2.0000, 157.2500);
+  defaults_["GE"]=AtomProp(2.0000, 72.6100);
+  defaults_["H"]=AtomProp(1.0900, 1.0080);
+  defaults_["HE"]=AtomProp(1.4000, 4.0030);
+  defaults_["HF"]=AtomProp(2.0000, 178.4900);
+  defaults_["HG"]=AtomProp(1.5500, 200.5900);
+  defaults_["HO"]=AtomProp(2.0000, 164.9300);
+  defaults_["HS"]=AtomProp(2.0000, 269.0000);
+  defaults_["I"]=AtomProp(1.9800, 126.9040);
+  defaults_["IN"]=AtomProp(1.9300, 114.8180);
+  defaults_["IR"]=AtomProp(2.0000, 192.2170);
+  defaults_["K"]=AtomProp(2.7500, 39.0980);
+  defaults_["KR"]=AtomProp(2.0200, 83.8000);
+  defaults_["LA"]=AtomProp(2.0000, 138.9060);
+  defaults_["LI"]=AtomProp(1.8200, 6.9410);
+  defaults_["LR"]=AtomProp(1.5000, 103.0000);
+  defaults_["LU"]=AtomProp(2.0000, 174.9670);
+  defaults_["MD"]=AtomProp(2.0000, 258.0000);
+  defaults_["MG"]=AtomProp(1.7300, 24.3050);
+  defaults_["MN"]=AtomProp(2.0000, 54.9380);
+  defaults_["MO"]=AtomProp(2.0000, 95.9400);
+  defaults_["MT"]=AtomProp(2.0000, 268.0000);
+  defaults_["N"]=AtomProp(1.5500, 14.0070);
+  defaults_["NA"]=AtomProp(2.2700, 22.9910);
+  defaults_["NB"]=AtomProp(2.0000, 92.9060);
+  defaults_["ND"]=AtomProp(2.0000, 144.2400);
+  defaults_["NE"]=AtomProp(1.5400, 20.1800);
+  defaults_["NI"]=AtomProp(1.6300, 58.6930);
+  defaults_["NO"]=AtomProp(2.0000, 259.0000);
+  defaults_["NP"]=AtomProp(2.0000, 237.0000);
+  defaults_["O"]=AtomProp(1.5200, 15.9990);
+  defaults_["OS"]=AtomProp(2.0000, 190.2300);
+  defaults_["P"]=AtomProp(1.8000, 30.9740);
+  defaults_["PA"]=AtomProp(2.0000, 231.0360);
+  defaults_["PB"]=AtomProp(2.0200, 207.2000);
+  defaults_["PD"]=AtomProp(1.6300, 106.4200);
+  defaults_["PM"]=AtomProp(2.0000, 145.0000);
+  defaults_["PO"]=AtomProp(2.0000, 210.0000);
+  defaults_["PR"]=AtomProp(2.0000, 140.9080);
+  defaults_["PT"]=AtomProp(1.7200, 195.0780);
+  defaults_["PU"]=AtomProp(2.0000, 244.0000);
+  defaults_["RA"]=AtomProp(2.0000, 226.0000);
+  defaults_["RB"]=AtomProp(2.0000, 85.4680);
+  defaults_["RE"]=AtomProp(2.0000, 186.2070);
+  defaults_["RF"]=AtomProp(2.0000, 261.0000);
+  defaults_["RH"]=AtomProp(2.0000, 102.9060);
+  defaults_["RN"]=AtomProp(2.0000, 222.0000);
+  defaults_["RU"]=AtomProp(2.0000, 101.0700);
+  defaults_["S"]=AtomProp(1.8000, 32.0660);
+  defaults_["SB"]=AtomProp(2.0000, 121.7600);
+  defaults_["SC"]=AtomProp(2.0000, 44.9560);
+  defaults_["SE"]=AtomProp(1.9000, 78.9600);
+  defaults_["SG"]=AtomProp(2.0000, 266.0000);
+  defaults_["SI"]=AtomProp(2.1000, 28.0860);
+  defaults_["SM"]=AtomProp(2.0000, 150.3600);
+  defaults_["SN"]=AtomProp(2.1700, 118.7100);
+  defaults_["SR"]=AtomProp(2.0000, 87.6200);
+  defaults_["TA"]=AtomProp(2.0000, 180.9480);
+  defaults_["TB"]=AtomProp(2.0000, 158.9250);
+  defaults_["TC"]=AtomProp(2.0000, 98.0000);
+  defaults_["TE"]=AtomProp(2.0600, 127.6000);
+  defaults_["TH"]=AtomProp(2.0000, 232.0380);
+  defaults_["TI"]=AtomProp(2.0000, 47.8670);
+  defaults_["TL"]=AtomProp(1.9600, 204.3830);
+  defaults_["TM"]=AtomProp(2.0000, 168.9340);
+  defaults_["U"]=AtomProp(1.8600, 238.0290);
+  defaults_["V"]=AtomProp(2.0000, 50.9420);
+  defaults_["W"]=AtomProp(2.0000, 183.8400);
+  defaults_["XE"]=AtomProp(2.1600, 131.2900);
+  defaults_["Y"]=AtomProp(2.0000, 88.9060);
+  defaults_["YB"]=AtomProp(2.0000, 173.0400);
+  defaults_["ZN"]=AtomProp(1.3900, 65.3900);
+  defaults_["ZR"]=AtomProp(2.0000, 91.2240);
+
+  defaults_[""]=AtomProp(0.0, 0.0);
+
+}
+
+AtomProp* AtomProp::GetDefaultProps(const String& ele)  
+{
+  if (defaults_.empty()) {
+    AtomProp::Init();
+  }
+  String upper_ele=ele;
+  std::transform(upper_ele.begin(),upper_ele.end(),upper_ele.begin(),toupper);  
+  std::map<String, AtomProp>::iterator i=defaults_.find(upper_ele);
+  if (i!=defaults_.end()) {
+    return &i->second;
+  }
+  return &defaults_[""];
+}
+
+
+}}}
diff --git a/modules/mol/base/src/atom_prop.hh b/modules/mol/base/src/impl/atom_prop.hh
similarity index 68%
rename from modules/mol/base/src/atom_prop.hh
rename to modules/mol/base/src/impl/atom_prop.hh
index badf20f00..95e3068ea 100644
--- a/modules/mol/base/src/atom_prop.hh
+++ b/modules/mol/base/src/impl/atom_prop.hh
@@ -19,38 +19,42 @@
 #ifndef OST_ATOM_PROP_HH
 #define OST_ATOM_PROP_HH
 
+#include <map>
 #include <ost/mol/module_config.hh>
 #include <ost/geom/mat3.hh>
 
-namespace ost { namespace mol {
-
+namespace ost { namespace mol { namespace impl {
 
 
 class DLLEXPORT_OST_MOL AtomProp {
 public:
   AtomProp()
-    : element(""), radius(0.0), occupancy(1.0),
-      b_factor(0.0), charge(0.0), mass(0.0),
-      is_hetatm(false), has_anisou(false),
-      ordinal(0), anisou(geom::Mat3()) {
-
+    : radius(0.0), charge(0.0), mass(0.0), has_anisou(false), is_default(true),
+      anisou(geom::Mat3()) 
+  {
   }
-  String        element;
+  AtomProp(Real r, Real m, Real c=0.0): radius(r), charge(c), 
+     mass(m), has_anisou(false), is_default(true)
+  { }
+  AtomProp(const AtomProp& rhs): radius(rhs.radius), charge(rhs.charge),
+    mass(rhs.mass), has_anisou(rhs.has_anisou), is_default(rhs.is_default),
+    anisou(rhs.anisou)
+  { }
   Real          radius;
-  Real          occupancy;
-  Real          b_factor;
   Real          charge;
   Real          mass;
-  bool          is_hetatm;
   bool          has_anisou;
-  
-  int           ordinal;
+  bool          is_default;
   geom::Mat3    anisou;
+  
+  static AtomProp* GetDefaultProps(const String& ele);
+  
 private:
-  unsigned char flags;
+  static void Init();
+  static std::map<String, AtomProp> defaults_;
 };
 
-}} // ns
+}}} // ns
 
 #endif
 
diff --git a/modules/mol/base/src/impl/chain_impl.cc b/modules/mol/base/src/impl/chain_impl.cc
index 0395a8107..779482036 100644
--- a/modules/mol/base/src/impl/chain_impl.cc
+++ b/modules/mol/base/src/impl/chain_impl.cc
@@ -369,7 +369,7 @@ Real ChainImpl::GetMass() const
     ResidueImplPtr r=*i;
     for (AtomImplList::iterator j=r->GetAtomList().begin(); 
           j!=r->GetAtomList().end(); ++j) {
-      mass+=(*j)->GetAtomProps().mass;
+      mass+=(*j)->GetMass();
     }
   }
   return mass;
@@ -424,7 +424,7 @@ geom::Vec3 ChainImpl::GetCenterOfMass() const
       ResidueImplPtr r=*i;
       for (AtomImplList::iterator j=r->GetAtomList().begin(); 
            j!=r->GetAtomList().end(); ++j) {
-        center+=(*j)->GetPos() * (*j)->GetAtomProps().mass;
+        center+=(*j)->GetPos() * (*j)->GetMass();
       }
     }
     center/=mass;
diff --git a/modules/mol/base/src/impl/entity_impl.cc b/modules/mol/base/src/impl/entity_impl.cc
index 33d9bef05..c7ceb61ce 100644
--- a/modules/mol/base/src/impl/entity_impl.cc
+++ b/modules/mol/base/src/impl/entity_impl.cc
@@ -297,7 +297,7 @@ geom::Vec3 EntityImpl::GetCenterOfMass() const {
   Real mass = this->GetMass();
   if (this->GetAtomCount()>0 && mass>0) {
     for(AtomImplMap::const_iterator it = atom_map_.begin();it!=atom_map_.end();++it) {
-      center+=it->second->GetPos()*it->second->GetAtomProps().mass;
+      center+=it->second->GetPos()*it->second->GetMass();
     }
     center/=mass;
   }
@@ -308,7 +308,7 @@ Real EntityImpl::GetMass() const {
   Real mass=0.0;
   for (AtomImplMap::const_iterator it = atom_map_.begin();
       it!=atom_map_.end();++it) {
-    mass+=it->second->GetAtomProps().mass;
+    mass+=it->second->GetMass();
   }
   return mass;
 }
@@ -316,13 +316,13 @@ Real EntityImpl::GetMass() const {
 AtomImplPtr EntityImpl::CreateAtom(const ResidueImplPtr& rp,
                                    const String& name,
                                    const geom::Vec3& pos,
-                                   const AtomProp& prop)
+                                   const String& ele)
 {
 #if MAKE_SHARED_AVAILABLE
   AtomImplPtr ap=boost::make_shared<AtomImpl>(shared_from_this(), rp, name, 
-                                              pos, prop,next_index_++);
+                                              pos, ele,next_index_++);
 #else
-  AtomImplPtr ap(new AtomImpl(shared_from_this(), rp, name, pos, prop,next_index_++));
+  AtomImplPtr ap(new AtomImpl(shared_from_this(), rp, name, pos, ele, next_index_++));
 #endif
   if (identity_transf_ == false) {
     geom::Vec3 transformed_pos = geom::Vec3(transformation_matrix_*geom::Vec4(pos));
diff --git a/modules/mol/base/src/impl/entity_impl.hh b/modules/mol/base/src/impl/entity_impl.hh
index c01285ed2..3c6579452 100644
--- a/modules/mol/base/src/impl/entity_impl.hh
+++ b/modules/mol/base/src/impl/entity_impl.hh
@@ -101,7 +101,7 @@ public:
 
   // default copy ctor and assignment op should work for now
   AtomImplPtr CreateAtom(const ResidueImplPtr& rp, const String& name,
-                       const geom::Vec3& pos, const AtomProp& prop);
+                         const geom::Vec3& pos, const String& ele);
 
   ResidueImplPtr CreateResidue(const ChainImplPtr& cp,
                                const ResNum& n,
diff --git a/modules/mol/base/src/impl/residue_impl.cc b/modules/mol/base/src/impl/residue_impl.cc
index b997ced3f..ef6ffd729 100644
--- a/modules/mol/base/src/impl/residue_impl.cc
+++ b/modules/mol/base/src/impl/residue_impl.cc
@@ -47,10 +47,11 @@ ResidueImpl::ResidueImpl(const EntityImplPtr& ent,
 
 
 AtomImplPtr ResidueImpl::InsertAtom(const String& name,
-                                  const geom::Vec3& pos,
-                                  const AtomProp& prop)
+                                    const geom::Vec3& pos,
+                                    const String& ele)
 {
-  AtomImplPtr ap=ent_.lock()->CreateAtom(shared_from_this(),name, pos, prop);
+  AtomImplPtr ap=ent_.lock()->CreateAtom(shared_from_this(),
+                                         name, pos, ele);
   atom_list_.push_back(ap);
   return ap;
 }
@@ -59,7 +60,7 @@ AtomImplPtr ResidueImpl::InsertAtom(const AtomImplPtr& atom)
 {
   AtomImplPtr dst_atom=this->InsertAtom(atom->GetName(), 
                                         atom->GetPos(),
-                                        atom->GetAtomProps());
+                                        atom->GetElement());
   dst_atom->Assign(*atom.get());
   dst_atom->SetState(atom->GetState());
   return dst_atom;
@@ -70,7 +71,7 @@ Real ResidueImpl::GetAverageBFactor() const
   Real sum=0;
   for (AtomImplList::const_iterator i=atom_list_.begin(), 
        e=atom_list_.end(); i!=e; ++i) {
-    sum+=(*i)->GetAtomProps().b_factor;
+    sum+=(*i)->GetBFactor();
   }
   return atom_list_.size()>0 ? sum/atom_list_.size() : 0.0;
 }
@@ -115,8 +116,8 @@ geom::Vec3 ResidueImpl::GetAltAtomPos(const AtomImplPtr& atom,
 AtomImplPtr ResidueImpl::InsertAltAtom(const String& name,
                                        const String& alt_group,
                                        const geom::Vec3& pos,
-                                       const AtomProp& prop) {
-  AtomImplPtr atom=this->InsertAtom(name, pos, prop);
+                                       const String& ele) {
+  AtomImplPtr atom=this->InsertAtom(name, pos, ele);
   this->AddAltAtom(alt_group, atom, pos);
   return atom;
 }
@@ -422,7 +423,7 @@ Real ResidueImpl::GetMass() const
   Real mass = 0;
   for (AtomImplList::const_iterator i=atom_list_.begin(); 
        i!=atom_list_.end(); ++i) {
-    mass+=(*i)->GetAtomProps().mass;
+    mass+=(*i)->GetMass();
   }
   return mass;
 }
@@ -466,7 +467,7 @@ geom::Vec3 ResidueImpl::GetCenterOfMass() const
   if (this->GetAtomCount() > 0 && mass > 0) {
     for (AtomImplList::const_iterator i=atom_list_.begin(); 
         i!=atom_list_.end(); ++i) {
-      center+=(*i)->GetPos()*(*i)->GetAtomProps().mass;
+      center+=(*i)->GetPos()*(*i)->GetMass();
     }
   }
   return center/mass;
diff --git a/modules/mol/base/src/impl/residue_impl.hh b/modules/mol/base/src/impl/residue_impl.hh
index 183a9ccef..a9f8481d2 100644
--- a/modules/mol/base/src/impl/residue_impl.hh
+++ b/modules/mol/base/src/impl/residue_impl.hh
@@ -51,13 +51,13 @@ public:
   ResidueImpl(const EntityImplPtr& ent, const ChainImplPtr& ch,
               const ResNum& num, const ResidueKey& key);
 
-  AtomImplPtr InsertAtom(const String& name, const geom::Vec3& pos,
-                         const AtomProp& prop);
+  AtomImplPtr InsertAtom(const String& name, const geom::Vec3& pos, 
+                         const String& ele);
   /// \brief insert new residue with exactly the same parameters as atom, but 
   ///     no bonds
   AtomImplPtr InsertAtom(const AtomImplPtr& atom);
   AtomImplPtr InsertAltAtom(const String& name, const String& alt_group,
-                           const geom::Vec3& pos, const AtomProp& prop);
+                           const geom::Vec3& pos, const String& ele);
   const ResNum& GetNumber() const {return num_;}
   void SetNumber(const ResNum& num) {num_=num;}
 
diff --git a/modules/mol/base/src/query_state.cc b/modules/mol/base/src/query_state.cc
index 95dc07e16..03b2ea28b 100644
--- a/modules/mol/base/src/query_state.cc
+++ b/modules/mol/base/src/query_state.cc
@@ -334,17 +334,17 @@ boost::logic::tribool QueryState::EvalAtom(const impl::AtomImplPtr& a) {
                                boost::get<float>(ss.param));
         break;                
       case Prop::OCC:
-        float_value=a->GetAtomProps().occupancy;
+        float_value=a->GetOccupancy();
         s_[*i]=cmp_num<Real>(ss.comp_op, float_value, 
                                boost::get<float>(ss.param));
         break;                        
       case Prop::ELE:
-        str_value = a->GetAtomProps().element;
+        str_value = a->GetElement();
         s_[*i] = cmp_string(ss.comp_op,str_value,
           boost::get<String>(ss.param));                          
         break;
       case Prop::ABFAC:
-        float_value=a->GetAtomProps().b_factor;
+        float_value=a->GetBFactor();
         s_[*i]=cmp_num<Real>(ss.comp_op, float_value, 
                               boost::get<float>(ss.param));
         break;
@@ -354,11 +354,11 @@ boost::logic::tribool QueryState::EvalAtom(const impl::AtomImplPtr& a) {
                                 ss.comp_op);
         break;
       case Prop::ISHETATM:
-        int_value = a->GetAtomProps().is_hetatm;
+        int_value = a->IsHetAtom();
         s_[*i] = cmp_num<int>(ss.comp_op,int_value,boost::get<int>(ss.param));
         break;
       case Prop::ACHARGE:
-        float_value=a->GetAtomProps().charge;
+        float_value=a->GetCharge();
         s_[*i]=cmp_num<Real>(ss.comp_op, float_value, 
                               boost::get<float>(ss.param));
         break;
diff --git a/modules/mol/base/src/residue_handle.hh b/modules/mol/base/src/residue_handle.hh
index f1eb07850..83890f3af 100644
--- a/modules/mol/base/src/residue_handle.hh
+++ b/modules/mol/base/src/residue_handle.hh
@@ -25,7 +25,6 @@
 #include <ost/mol/query.hh>
 #include <ost/mol/module_config.hh>
 #include <ost/mol/residue_base.hh>
-#include <ost/mol/atom_prop.hh>
 #include <ost/mol/entity_visitor_fw.hh>
 #include <ost/mol/iterator_fw.hh>
 
diff --git a/modules/mol/base/src/residue_view.cc b/modules/mol/base/src/residue_view.cc
index 53e0a3eaa..8f76c5766 100644
--- a/modules/mol/base/src/residue_view.cc
+++ b/modules/mol/base/src/residue_view.cc
@@ -200,7 +200,7 @@ double ResidueView::GetMass() const
   double mass = 0;
   AtomViewList::const_iterator i;
   for (i=data_->atoms.begin(); i!=data_->atoms.end(); ++i) {
-    mass+=(*i).GetAtomProps().mass;
+    mass+=(*i).GetMass();
   }
   return mass;
 }
@@ -226,7 +226,7 @@ geom::Vec3 ResidueView::GetCenterOfMass() const
   if (!data_->atoms.empty() && mass > 0) {
     AtomViewList::const_iterator i;
     for (i=data_->atoms.begin(); i!=data_->atoms.end(); ++i) {
-      center+=(*i).GetPos()*(*i).GetAtomProps().mass;
+      center+=(*i).GetPos()*(*i).GetMass();
     }
       center/=mass;
   }
diff --git a/modules/mol/base/tests/test_atom_groups.cc b/modules/mol/base/tests/test_atom_groups.cc
index 72835fa76..01e3510ff 100644
--- a/modules/mol/base/tests/test_atom_groups.cc
+++ b/modules/mol/base/tests/test_atom_groups.cc
@@ -40,7 +40,7 @@ BOOST_AUTO_TEST_CASE(switch_pos)
   XCSEditor editor=ent.e.RequestXCSEditor();  
   BOOST_CHECK_THROW(editor.AddAltAtomPos("B", ent.aa, y),
                     Error);
-  AtomHandle xx=editor.InsertAltAtom(ent.r, "ZZ", "A", y, AtomProp()); 
+  AtomHandle xx=editor.InsertAltAtom(ent.r, "ZZ", "A", y); 
   BOOST_CHECK_NO_THROW(editor.AddAltAtomPos("B", xx, z));
   BOOST_CHECK_EQUAL(ent.r.GetCurrentAltGroupName(), "A");
   BOOST_CHECK(ent.r.SwitchAtomPos("B"));
@@ -56,10 +56,8 @@ BOOST_AUTO_TEST_CASE(delete_atom)
 {
   test::DummyEnt ent;
   XCSEditor editor=ent.e.RequestXCSEditor();       
-  AtomHandle xx=editor.InsertAltAtom(ent.r, "ZZ", "A", geom::Vec3(), 
-                                     AtomProp());
-  AtomHandle zz=editor.InsertAltAtom(ent.r, "XX", "A", geom::Vec3(), 
-                                     AtomProp());
+  AtomHandle xx=editor.InsertAltAtom(ent.r, "ZZ", "A", geom::Vec3());
+  AtomHandle zz=editor.InsertAltAtom(ent.r, "XX", "A", geom::Vec3());
   
   editor.AddAltAtomPos("B", xx, geom::Vec3());
   editor.AddAltAtomPos("B", zz, geom::Vec3());
@@ -78,8 +76,7 @@ BOOST_AUTO_TEST_CASE(atom_group_triv)
   std::vector<String> names=ent.r.GetAltAtomGroupNames();
   BOOST_CHECK(names.empty());
   XCSEditor editor=ent.e.RequestXCSEditor();
-  AtomHandle xx=editor.InsertAltAtom(ent.r, "A", "ZZ", geom::Vec3(0.0,1.0,0.0), 
-                                     AtomProp());   
+  AtomHandle xx=editor.InsertAltAtom(ent.r, "A", "ZZ", geom::Vec3(0.0,1.0,0.0));   
   editor.AddAltAtomPos("B", xx, geom::Vec3(1.0, 0.0, 0.0));
   BOOST_CHECK(ent.r.HasAltAtoms()==true);
   BOOST_CHECK(ent.r.HasAltAtomGroup("B")==true);
diff --git a/modules/mol/base/tests/test_query.cc b/modules/mol/base/tests/test_query.cc
index d84a3156b..c3f779a87 100644
--- a/modules/mol/base/tests/test_query.cc
+++ b/modules/mol/base/tests/test_query.cc
@@ -36,52 +36,38 @@ EntityHandle make_query_test_entity()
   chain.SetFloatProp("testprop_c", 1.0);
   ResidueHandle res = e.AppendResidue(chain, "MET");
   res.SetFloatProp("testpropr", 1.0);
-  AtomProp c_atom;
-  c_atom.element="C";
-  c_atom.radius=1.0;
-
-  AtomProp o_atom;
-  o_atom.element="O";
-  o_atom.radius=1.0;
-  AtomProp n_atom;
-  n_atom.element="N";
-  n_atom.radius=1.0;
-
-  AtomProp s_atom;
-  s_atom.element="S";
-  s_atom.radius=1.0;
-  AtomHandle ah=e.InsertAtom(res, "N",geom::Vec3(21.609,35.384,56.705), n_atom);
+  AtomHandle ah=e.InsertAtom(res, "N",geom::Vec3(21.609,35.384,56.705), "N");
   ah.SetFloatProp("testpropa", 1.0);
-  e.InsertAtom(res, "CA",geom::Vec3(20.601,35.494,57.793), c_atom);
-  e.InsertAtom(res, "C",geom::Vec3(19.654,34.300,57.789), c_atom);
-  e.InsertAtom(res, "O",geom::Vec3(18.447,34.456,57.595), o_atom);
-  e.InsertAtom(res, "CB",geom::Vec3(19.789,36.783,57.639), c_atom);
-  e.InsertAtom(res, "CG",geom::Vec3(20.629,38.055,57.606), c_atom);
-  e.InsertAtom(res, "SD",geom::Vec3(21.638,38.325,59.084), s_atom);
-  e.InsertAtom(res, "CE",geom::Vec3(23.233,37.697,58.529), c_atom);
+  e.InsertAtom(res, "CA",geom::Vec3(20.601,35.494,57.793), "C");
+  e.InsertAtom(res, "C",geom::Vec3(19.654,34.300,57.789), "C");
+  e.InsertAtom(res, "O",geom::Vec3(18.447,34.456,57.595), "O");
+  e.InsertAtom(res, "CB",geom::Vec3(19.789,36.783,57.639), "C");
+  e.InsertAtom(res, "CG",geom::Vec3(20.629,38.055,57.606), "C");
+  e.InsertAtom(res, "SD",geom::Vec3(21.638,38.325,59.084), "S");
+  e.InsertAtom(res, "CE",geom::Vec3(23.233,37.697,58.529), "C");
 
   res = e.AppendResidue(chain, "ARG");
-  e.InsertAtom(res, "N",geom::Vec3(20.202,33.112,58.011), n_atom);
-  e.InsertAtom(res, "CA",geom::Vec3(19.396,31.903,58.033), c_atom);
-  e.InsertAtom(res, "C",geom::Vec3(18.608,31.739,59.328), c_atom);
-  e.InsertAtom(res, "O",geom::Vec3(17.651,30.965,59.381), o_atom);
-  e.InsertAtom(res, "CB",geom::Vec3(20.284,30.681,57.801), c_atom);
-  e.InsertAtom(res, "CG",geom::Vec3(20.665,30.488,56.342), c_atom);
-  e.InsertAtom(res, "CD",geom::Vec3(21.557,29.281,56.154), c_atom);
-  e.InsertAtom(res, "NE",geom::Vec3(22.931,29.557,56.551), n_atom);
-  e.InsertAtom(res, "CZ",geom::Vec3(23.901,28.653,56.528), c_atom);
-  e.InsertAtom(res, "NH1",geom::Vec3(23.640,27.417,56.130), n_atom);
-  e.InsertAtom(res, "NH2",geom::Vec3(25.132,28.980,56.893), n_atom);
+  e.InsertAtom(res, "N",geom::Vec3(20.202,33.112,58.011), "N");
+  e.InsertAtom(res, "CA",geom::Vec3(19.396,31.903,58.033), "C");
+  e.InsertAtom(res, "C",geom::Vec3(18.608,31.739,59.328), "C");
+  e.InsertAtom(res, "O",geom::Vec3(17.651,30.965,59.381), "O");
+  e.InsertAtom(res, "CB",geom::Vec3(20.284,30.681,57.801), "C");
+  e.InsertAtom(res, "CG",geom::Vec3(20.665,30.488,56.342), "C");
+  e.InsertAtom(res, "CD",geom::Vec3(21.557,29.281,56.154), "C");
+  e.InsertAtom(res, "NE",geom::Vec3(22.931,29.557,56.551), "N");
+  e.InsertAtom(res, "CZ",geom::Vec3(23.901,28.653,56.528), "C");
+  e.InsertAtom(res, "NH1",geom::Vec3(23.640,27.417,56.130), "N");
+  e.InsertAtom(res, "NH2",geom::Vec3(25.132,28.980,56.893), "N");
 
   res = e.AppendResidue(chain, "LEU");
-  e.InsertAtom(res, "N",geom::Vec3(19.003,32.473,60.366), n_atom);
-  e.InsertAtom(res, "CA",geom::Vec3(18.330,32.402,61.664), c_atom);
-  e.InsertAtom(res, "C",geom::Vec3(17.884,33.787,62.117), c_atom);
-  e.InsertAtom(res, "O",geom::Vec3(17.853,34.091,63.308), o_atom);
-  e.InsertAtom(res, "CB",geom::Vec3(19.269,31.793,62.710), c_atom);
-  e.InsertAtom(res, "CG",geom::Vec3(19.695,30.340,62.501), c_atom);
-  e.InsertAtom(res, "CD1",geom::Vec3(20.585,29.897,63.648), c_atom);
-  e.InsertAtom(res, "CD2",geom::Vec3(18.461,29.459,62.420), c_atom);
+  e.InsertAtom(res, "N",geom::Vec3(19.003,32.473,60.366), "N");
+  e.InsertAtom(res, "CA",geom::Vec3(18.330,32.402,61.664), "C");
+  e.InsertAtom(res, "C",geom::Vec3(17.884,33.787,62.117), "C");
+  e.InsertAtom(res, "O",geom::Vec3(17.853,34.091,63.308), "O");
+  e.InsertAtom(res, "CB",geom::Vec3(19.269,31.793,62.710), "C");
+  e.InsertAtom(res, "CG",geom::Vec3(19.695,30.340,62.501), "C");
+  e.InsertAtom(res, "CD1",geom::Vec3(20.585,29.897,63.648), "C");
+  e.InsertAtom(res, "CD2",geom::Vec3(18.461,29.459,62.420), "C");
   return eh;
 }
 
diff --git a/modules/qa/src/clash_score.cc b/modules/qa/src/clash_score.cc
index 66b95c096..d05a4e3fe 100644
--- a/modules/qa/src/clash_score.cc
+++ b/modules/qa/src/clash_score.cc
@@ -48,12 +48,12 @@ Real do_clash_score(const T& ent_a, const mol::EntityView& ent_b)
   for (I i=ent_a.AtomsBegin(), e=ent_a.AtomsEnd(); i!=e; ++i) {
     
     mol::AtomViewList clashees=ent_b.FindWithin((*i).GetPos(), 
-                                                (*i).GetAtomProps().radius+1.7);
+                                                (*i).GetRadius()+1.7);
 
     for (mol::AtomViewList::iterator j=clashees.begin(), 
          e2=clashees.end(); j!=e2; ++j) {
-         energy+=StericEnergy((*j).GetPos(), (*j).GetAtomProps().radius-0.25,
-                              (*i).GetPos(), (*i).GetAtomProps().radius-0.25);           
+         energy+=StericEnergy((*j).GetPos(), (*j).GetRadius()-0.25,
+                              (*i).GetPos(), (*i).GetRadius()-0.25);           
     }
   }
   return energy;  
@@ -75,11 +75,11 @@ Real ClashScore(const mol::AtomHandle& atom, const mol::EntityView& ent_b)
 {
   Real energy=0.0;
   mol::AtomViewList clashees=ent_b.FindWithin(atom.GetPos(), 
-                                              atom.GetAtomProps().radius+2.0);
+                                              atom.GetRadius()+2.0);
   for (mol::AtomViewList::iterator j=clashees.begin(), 
        e2=clashees.end(); j!=e2; ++j) {
-       energy+=StericEnergy((*j).GetPos(), (*j).GetAtomProps().radius,
-                            atom.GetPos(), atom.GetAtomProps().radius);           
+       energy+=StericEnergy((*j).GetPos(), (*j).GetRadius(),
+                            atom.GetPos(), atom.GetRadius());           
   }
   return energy;                                 
 }
-- 
GitLab