Commit 6ed5bc4e authored by Rafal Wiewiora's avatar Rafal Wiewiora Committed by GitHub
Browse files

Merge branch 'master' into master

parents 656d0e3b fbf193fe
...@@ -65,10 +65,8 @@ void* HarmonicBondForceProxy::deserialize(const SerializationNode& node) const { ...@@ -65,10 +65,8 @@ void* HarmonicBondForceProxy::deserialize(const SerializationNode& node) const {
if (version > 1) if (version > 1)
force->setUsesPeriodicBoundaryConditions(node.getBoolProperty("usesPeriodic")); force->setUsesPeriodicBoundaryConditions(node.getBoolProperty("usesPeriodic"));
const SerializationNode& bonds = node.getChildNode("Bonds"); const SerializationNode& bonds = node.getChildNode("Bonds");
for (int i = 0; i < (int) bonds.getChildren().size(); i++) { for (auto& bond : bonds.getChildren())
const SerializationNode& bond = bonds.getChildren()[i];
force->addBond(bond.getIntProperty("p1"), bond.getIntProperty("p2"), bond.getDoubleProperty("d"), bond.getDoubleProperty("k")); force->addBond(bond.getIntProperty("p1"), bond.getIntProperty("p2"), bond.getDoubleProperty("d"), bond.getDoubleProperty("k"));
}
} }
catch (...) { catch (...) {
delete force; delete force;
......
...@@ -108,15 +108,11 @@ void* NonbondedForceProxy::deserialize(const SerializationNode& node) const { ...@@ -108,15 +108,11 @@ void* NonbondedForceProxy::deserialize(const SerializationNode& node) const {
} }
force->setReciprocalSpaceForceGroup(node.getIntProperty("recipForceGroup", -1)); force->setReciprocalSpaceForceGroup(node.getIntProperty("recipForceGroup", -1));
const SerializationNode& particles = node.getChildNode("Particles"); const SerializationNode& particles = node.getChildNode("Particles");
for (int i = 0; i < (int) particles.getChildren().size(); i++) { for (auto& particle : particles.getChildren())
const SerializationNode& particle = particles.getChildren()[i];
force->addParticle(particle.getDoubleProperty("q"), particle.getDoubleProperty("sig"), particle.getDoubleProperty("eps")); force->addParticle(particle.getDoubleProperty("q"), particle.getDoubleProperty("sig"), particle.getDoubleProperty("eps"));
}
const SerializationNode& exceptions = node.getChildNode("Exceptions"); const SerializationNode& exceptions = node.getChildNode("Exceptions");
for (int i = 0; i < (int) exceptions.getChildren().size(); i++) { for (auto& exception : exceptions.getChildren())
const SerializationNode& exception = exceptions.getChildren()[i];
force->addException(exception.getIntProperty("p1"), exception.getIntProperty("p2"), exception.getDoubleProperty("q"), exception.getDoubleProperty("sig"), exception.getDoubleProperty("eps")); force->addException(exception.getIntProperty("p1"), exception.getIntProperty("p2"), exception.getDoubleProperty("q"), exception.getDoubleProperty("sig"), exception.getDoubleProperty("eps"));
}
} }
catch (...) { catch (...) {
delete force; delete force;
......
...@@ -65,11 +65,9 @@ void* PeriodicTorsionForceProxy::deserialize(const SerializationNode& node) cons ...@@ -65,11 +65,9 @@ void* PeriodicTorsionForceProxy::deserialize(const SerializationNode& node) cons
if (version > 1) if (version > 1)
force->setUsesPeriodicBoundaryConditions(node.getBoolProperty("usesPeriodic")); force->setUsesPeriodicBoundaryConditions(node.getBoolProperty("usesPeriodic"));
const SerializationNode& torsions = node.getChildNode("Torsions"); const SerializationNode& torsions = node.getChildNode("Torsions");
for (int i = 0; i < (int) torsions.getChildren().size(); i++) { for (auto& torsion : torsions.getChildren())
const SerializationNode& torsion = torsions.getChildren()[i];
force->addTorsion(torsion.getIntProperty("p1"), torsion.getIntProperty("p2"), torsion.getIntProperty("p3"), torsion.getIntProperty("p4"), force->addTorsion(torsion.getIntProperty("p1"), torsion.getIntProperty("p2"), torsion.getIntProperty("p3"), torsion.getIntProperty("p4"),
torsion.getIntProperty("periodicity"), torsion.getDoubleProperty("phase"), torsion.getDoubleProperty("k")); torsion.getIntProperty("periodicity"), torsion.getDoubleProperty("phase"), torsion.getDoubleProperty("k"));
}
} }
catch (...) { catch (...) {
delete force; delete force;
......
...@@ -65,12 +65,10 @@ void* RBTorsionForceProxy::deserialize(const SerializationNode& node) const { ...@@ -65,12 +65,10 @@ void* RBTorsionForceProxy::deserialize(const SerializationNode& node) const {
if (version > 1) if (version > 1)
force->setUsesPeriodicBoundaryConditions(node.getBoolProperty("usesPeriodic")); force->setUsesPeriodicBoundaryConditions(node.getBoolProperty("usesPeriodic"));
const SerializationNode& torsions = node.getChildNode("Torsions"); const SerializationNode& torsions = node.getChildNode("Torsions");
for (int i = 0; i < (int) torsions.getChildren().size(); i++) { for (auto& torsion : torsions.getChildren())
const SerializationNode& torsion = torsions.getChildren()[i];
force->addTorsion(torsion.getIntProperty("p1"), torsion.getIntProperty("p2"), torsion.getIntProperty("p3"), torsion.getIntProperty("p4"), force->addTorsion(torsion.getIntProperty("p1"), torsion.getIntProperty("p2"), torsion.getIntProperty("p3"), torsion.getIntProperty("p4"),
torsion.getDoubleProperty("c0"), torsion.getDoubleProperty("c1"), torsion.getDoubleProperty("c2"), torsion.getDoubleProperty("c0"), torsion.getDoubleProperty("c1"), torsion.getDoubleProperty("c2"),
torsion.getDoubleProperty("c3"), torsion.getDoubleProperty("c4"), torsion.getDoubleProperty("c5")); torsion.getDoubleProperty("c3"), torsion.getDoubleProperty("c4"), torsion.getDoubleProperty("c5"));
}
} }
catch (...) { catch (...) {
delete force; delete force;
......
...@@ -56,16 +56,16 @@ vector<SerializationNode>& SerializationNode::getChildren() { ...@@ -56,16 +56,16 @@ vector<SerializationNode>& SerializationNode::getChildren() {
} }
const SerializationNode& SerializationNode::getChildNode(const std::string& name) const { const SerializationNode& SerializationNode::getChildNode(const std::string& name) const {
for (int i = 0; i < (int) children.size(); i++) for (auto& child : children)
if (children[i].name == name) if (child.name == name)
return children[i]; return child;
throw OpenMMException("Unknown child '"+name+"' for node '"+getName()+"'"); throw OpenMMException("Unknown child '"+name+"' for node '"+getName()+"'");
} }
SerializationNode& SerializationNode::getChildNode(const std::string& name) { SerializationNode& SerializationNode::getChildNode(const std::string& name) {
for (int i = 0; i < (int) children.size(); i++) for (auto& child : children)
if (children[i].name == name) if (child.name == name)
return children[i]; return child;
throw OpenMMException("Unknown child '"+name+"' for node '"+getName()+"'"); throw OpenMMException("Unknown child '"+name+"' for node '"+getName()+"'");
} }
......
...@@ -56,11 +56,8 @@ void StateProxy::serialize(const void* object, SerializationNode& node) const { ...@@ -56,11 +56,8 @@ void StateProxy::serialize(const void* object, SerializationNode& node) const {
if ((s.getDataTypes()&State::Parameters) != 0) { if ((s.getDataTypes()&State::Parameters) != 0) {
s.getParameters(); s.getParameters();
SerializationNode& parametersNode = node.createChildNode("Parameters"); SerializationNode& parametersNode = node.createChildNode("Parameters");
map<string, double> stateParams = s.getParameters(); for (auto& param : s.getParameters())
map<string, double>::const_iterator it; parametersNode.setDoubleProperty(param.first, param.second);
for (it = stateParams.begin(); it!=stateParams.end();it++) {
parametersNode.setDoubleProperty(it->first, it->second);
}
} }
if ((s.getDataTypes()&State::Energy) != 0) { if ((s.getDataTypes()&State::Energy) != 0) {
s.getPotentialEnergy(); s.getPotentialEnergy();
...@@ -108,17 +105,11 @@ void* StateProxy::deserialize(const SerializationNode& node) const { ...@@ -108,17 +105,11 @@ void* StateProxy::deserialize(const SerializationNode& node) const {
int types = 0; int types = 0;
vector<int> arraySizes; vector<int> arraySizes;
State::StateBuilder builder(outTime); State::StateBuilder builder(outTime);
const vector<SerializationNode>& children = node.getChildren(); for (auto& child : node.getChildren()) {
for (int j = 0; j < (int) children.size(); j++) {
const SerializationNode& child = children[j];
if (child.getName() == "Parameters") { if (child.getName() == "Parameters") {
map<string, double> outStateParams; map<string, double> outStateParams;
// inStateParams is really a <string,double> pair, where string is the name and double is the value for (auto& param : child.getProperties())
// but we want to avoid casting a string to a double and instead use the built in routines, outStateParams[param.first] = child.getDoubleProperty(param.first);
map<string, string> inStateParams = child.getProperties();
for (map<string, string>::const_iterator pit = inStateParams.begin(); pit != inStateParams.end(); pit++) {
outStateParams[pit->first] = child.getDoubleProperty(pit->first);
}
builder.setParameters(outStateParams); builder.setParameters(outStateParams);
} }
else if (child.getName() == "Energies") { else if (child.getName() == "Energies") {
...@@ -128,28 +119,22 @@ void* StateProxy::deserialize(const SerializationNode& node) const { ...@@ -128,28 +119,22 @@ void* StateProxy::deserialize(const SerializationNode& node) const {
} }
else if (child.getName() == "Positions") { else if (child.getName() == "Positions") {
vector<Vec3> outPositions; vector<Vec3> outPositions;
for (int i = 0; i < (int) child.getChildren().size(); i++) { for (auto& particle : child.getChildren())
const SerializationNode& particle = child.getChildren()[i];
outPositions.push_back(Vec3(particle.getDoubleProperty("x"),particle.getDoubleProperty("y"),particle.getDoubleProperty("z"))); outPositions.push_back(Vec3(particle.getDoubleProperty("x"),particle.getDoubleProperty("y"),particle.getDoubleProperty("z")));
}
builder.setPositions(outPositions); builder.setPositions(outPositions);
arraySizes.push_back(outPositions.size()); arraySizes.push_back(outPositions.size());
} }
else if (child.getName() == "Velocities") { else if (child.getName() == "Velocities") {
vector<Vec3> outVelocities; vector<Vec3> outVelocities;
for (int i = 0; i < (int) child.getChildren().size(); i++) { for (auto& particle : child.getChildren())
const SerializationNode& particle = child.getChildren()[i];
outVelocities.push_back(Vec3(particle.getDoubleProperty("x"),particle.getDoubleProperty("y"),particle.getDoubleProperty("z"))); outVelocities.push_back(Vec3(particle.getDoubleProperty("x"),particle.getDoubleProperty("y"),particle.getDoubleProperty("z")));
}
builder.setVelocities(outVelocities); builder.setVelocities(outVelocities);
arraySizes.push_back(outVelocities.size()); arraySizes.push_back(outVelocities.size());
} }
else if (child.getName() == "Forces") { else if (child.getName() == "Forces") {
vector<Vec3> outForces; vector<Vec3> outForces;
for (int i = 0; i < (int) child.getChildren().size(); i++) { for (auto& particle : child.getChildren())
const SerializationNode& particle = child.getChildren()[i];
outForces.push_back(Vec3(particle.getDoubleProperty("x"),particle.getDoubleProperty("y"),particle.getDoubleProperty("z"))); outForces.push_back(Vec3(particle.getDoubleProperty("x"),particle.getDoubleProperty("y"),particle.getDoubleProperty("z")));
}
builder.setForces(outForces); builder.setForces(outForces);
arraySizes.push_back(outForces.size()); arraySizes.push_back(outForces.size());
} }
......
...@@ -129,14 +129,11 @@ void* SystemProxy::deserialize(const SerializationNode& node) const { ...@@ -129,14 +129,11 @@ void* SystemProxy::deserialize(const SerializationNode& node) const {
} }
} }
const SerializationNode& constraints = node.getChildNode("Constraints"); const SerializationNode& constraints = node.getChildNode("Constraints");
for (int i = 0; i < (int) constraints.getChildren().size(); i++) { for (auto& constraint : constraints.getChildren())
const SerializationNode& constraint = constraints.getChildren()[i];
system->addConstraint(constraint.getIntProperty("p1"), constraint.getIntProperty("p2"), constraint.getDoubleProperty("d")); system->addConstraint(constraint.getIntProperty("p1"), constraint.getIntProperty("p2"), constraint.getDoubleProperty("d"));
}
const SerializationNode& forces = node.getChildNode("Forces"); const SerializationNode& forces = node.getChildNode("Forces");
for (int i = 0; i < (int) forces.getChildren().size(); i++) { for (auto& force : forces.getChildren())
system->addForce(forces.getChildren()[i].decodeObject<Force>()); system->addForce(force.decodeObject<Force>());
}
} }
catch (...) { catch (...) {
delete system; delete system;
......
...@@ -49,8 +49,8 @@ void Continuous1DFunctionProxy::serialize(const void* object, SerializationNode& ...@@ -49,8 +49,8 @@ void Continuous1DFunctionProxy::serialize(const void* object, SerializationNode&
node.setDoubleProperty("min", min); node.setDoubleProperty("min", min);
node.setDoubleProperty("max", max); node.setDoubleProperty("max", max);
SerializationNode& valuesNode = node.createChildNode("Values"); SerializationNode& valuesNode = node.createChildNode("Values");
for (int j = 0; j < (int) values.size(); j++) for (auto v : values)
valuesNode.createChildNode("Value").setDoubleProperty("v", values[j]); valuesNode.createChildNode("Value").setDoubleProperty("v", v);
} }
void* Continuous1DFunctionProxy::deserialize(const SerializationNode& node) const { void* Continuous1DFunctionProxy::deserialize(const SerializationNode& node) const {
...@@ -58,8 +58,8 @@ void* Continuous1DFunctionProxy::deserialize(const SerializationNode& node) cons ...@@ -58,8 +58,8 @@ void* Continuous1DFunctionProxy::deserialize(const SerializationNode& node) cons
throw OpenMMException("Unsupported version number"); throw OpenMMException("Unsupported version number");
const SerializationNode& valuesNode = node.getChildNode("Values"); const SerializationNode& valuesNode = node.getChildNode("Values");
vector<double> values; vector<double> values;
for (int j = 0; j < (int) valuesNode.getChildren().size(); j++) for (auto& child : valuesNode.getChildren())
values.push_back(valuesNode.getChildren()[j].getDoubleProperty("v")); values.push_back(child.getDoubleProperty("v"));
return new Continuous1DFunction(values, node.getDoubleProperty("min"), node.getDoubleProperty("max")); return new Continuous1DFunction(values, node.getDoubleProperty("min"), node.getDoubleProperty("max"));
} }
...@@ -80,8 +80,8 @@ void Continuous2DFunctionProxy::serialize(const void* object, SerializationNode& ...@@ -80,8 +80,8 @@ void Continuous2DFunctionProxy::serialize(const void* object, SerializationNode&
node.setDoubleProperty("ymin", ymin); node.setDoubleProperty("ymin", ymin);
node.setDoubleProperty("ymax", ymax); node.setDoubleProperty("ymax", ymax);
SerializationNode& valuesNode = node.createChildNode("Values"); SerializationNode& valuesNode = node.createChildNode("Values");
for (int j = 0; j < (int) values.size(); j++) for (auto v : values)
valuesNode.createChildNode("Value").setDoubleProperty("v", values[j]); valuesNode.createChildNode("Value").setDoubleProperty("v", v);
} }
void* Continuous2DFunctionProxy::deserialize(const SerializationNode& node) const { void* Continuous2DFunctionProxy::deserialize(const SerializationNode& node) const {
...@@ -89,8 +89,8 @@ void* Continuous2DFunctionProxy::deserialize(const SerializationNode& node) cons ...@@ -89,8 +89,8 @@ void* Continuous2DFunctionProxy::deserialize(const SerializationNode& node) cons
throw OpenMMException("Unsupported version number"); throw OpenMMException("Unsupported version number");
const SerializationNode& valuesNode = node.getChildNode("Values"); const SerializationNode& valuesNode = node.getChildNode("Values");
vector<double> values; vector<double> values;
for (int j = 0; j < (int) valuesNode.getChildren().size(); j++) for (auto& child : valuesNode.getChildren())
values.push_back(valuesNode.getChildren()[j].getDoubleProperty("v")); values.push_back(child.getDoubleProperty("v"));
return new Continuous2DFunction(node.getIntProperty("xsize"), node.getIntProperty("ysize"), values, return new Continuous2DFunction(node.getIntProperty("xsize"), node.getIntProperty("ysize"), values,
node.getDoubleProperty("xmin"), node.getDoubleProperty("xmax"), node.getDoubleProperty("ymin"), node.getDoubleProperty("ymax")); node.getDoubleProperty("xmin"), node.getDoubleProperty("xmax"), node.getDoubleProperty("ymin"), node.getDoubleProperty("ymax"));
} }
...@@ -115,8 +115,8 @@ void Continuous3DFunctionProxy::serialize(const void* object, SerializationNode& ...@@ -115,8 +115,8 @@ void Continuous3DFunctionProxy::serialize(const void* object, SerializationNode&
node.setDoubleProperty("zmin", zmin); node.setDoubleProperty("zmin", zmin);
node.setDoubleProperty("zmax", zmax); node.setDoubleProperty("zmax", zmax);
SerializationNode& valuesNode = node.createChildNode("Values"); SerializationNode& valuesNode = node.createChildNode("Values");
for (int j = 0; j < (int) values.size(); j++) for (auto v : values)
valuesNode.createChildNode("Value").setDoubleProperty("v", values[j]); valuesNode.createChildNode("Value").setDoubleProperty("v", v);
} }
void* Continuous3DFunctionProxy::deserialize(const SerializationNode& node) const { void* Continuous3DFunctionProxy::deserialize(const SerializationNode& node) const {
...@@ -124,8 +124,8 @@ void* Continuous3DFunctionProxy::deserialize(const SerializationNode& node) cons ...@@ -124,8 +124,8 @@ void* Continuous3DFunctionProxy::deserialize(const SerializationNode& node) cons
throw OpenMMException("Unsupported version number"); throw OpenMMException("Unsupported version number");
const SerializationNode& valuesNode = node.getChildNode("Values"); const SerializationNode& valuesNode = node.getChildNode("Values");
vector<double> values; vector<double> values;
for (int j = 0; j < (int) valuesNode.getChildren().size(); j++) for (auto& child : valuesNode.getChildren())
values.push_back(valuesNode.getChildren()[j].getDoubleProperty("v")); values.push_back(child.getDoubleProperty("v"));
return new Continuous3DFunction(node.getIntProperty("xsize"), node.getIntProperty("ysize"), node.getIntProperty("zsize"), values, return new Continuous3DFunction(node.getIntProperty("xsize"), node.getIntProperty("ysize"), node.getIntProperty("zsize"), values,
node.getDoubleProperty("xmin"), node.getDoubleProperty("xmax"), node.getDoubleProperty("ymin"), node.getDoubleProperty("ymax"), node.getDoubleProperty("xmin"), node.getDoubleProperty("xmax"), node.getDoubleProperty("ymin"), node.getDoubleProperty("ymax"),
node.getDoubleProperty("zmin"), node.getDoubleProperty("zmax")); node.getDoubleProperty("zmin"), node.getDoubleProperty("zmax"));
...@@ -140,8 +140,8 @@ void Discrete1DFunctionProxy::serialize(const void* object, SerializationNode& n ...@@ -140,8 +140,8 @@ void Discrete1DFunctionProxy::serialize(const void* object, SerializationNode& n
vector<double> values; vector<double> values;
function.getFunctionParameters(values); function.getFunctionParameters(values);
SerializationNode& valuesNode = node.createChildNode("Values"); SerializationNode& valuesNode = node.createChildNode("Values");
for (int j = 0; j < (int) values.size(); j++) for (auto v : values)
valuesNode.createChildNode("Value").setDoubleProperty("v", values[j]); valuesNode.createChildNode("Value").setDoubleProperty("v", v);
} }
void* Discrete1DFunctionProxy::deserialize(const SerializationNode& node) const { void* Discrete1DFunctionProxy::deserialize(const SerializationNode& node) const {
...@@ -149,8 +149,8 @@ void* Discrete1DFunctionProxy::deserialize(const SerializationNode& node) const ...@@ -149,8 +149,8 @@ void* Discrete1DFunctionProxy::deserialize(const SerializationNode& node) const
throw OpenMMException("Unsupported version number"); throw OpenMMException("Unsupported version number");
const SerializationNode& valuesNode = node.getChildNode("Values"); const SerializationNode& valuesNode = node.getChildNode("Values");
vector<double> values; vector<double> values;
for (int j = 0; j < (int) valuesNode.getChildren().size(); j++) for (auto& child : valuesNode.getChildren())
values.push_back(valuesNode.getChildren()[j].getDoubleProperty("v")); values.push_back(child.getDoubleProperty("v"));
return new Discrete1DFunction(values); return new Discrete1DFunction(values);
} }
...@@ -166,8 +166,8 @@ void Discrete2DFunctionProxy::serialize(const void* object, SerializationNode& n ...@@ -166,8 +166,8 @@ void Discrete2DFunctionProxy::serialize(const void* object, SerializationNode& n
node.setDoubleProperty("xsize", xsize); node.setDoubleProperty("xsize", xsize);
node.setDoubleProperty("ysize", ysize); node.setDoubleProperty("ysize", ysize);
SerializationNode& valuesNode = node.createChildNode("Values"); SerializationNode& valuesNode = node.createChildNode("Values");
for (int j = 0; j < (int) values.size(); j++) for (auto v : values)
valuesNode.createChildNode("Value").setDoubleProperty("v", values[j]); valuesNode.createChildNode("Value").setDoubleProperty("v", v);
} }
void* Discrete2DFunctionProxy::deserialize(const SerializationNode& node) const { void* Discrete2DFunctionProxy::deserialize(const SerializationNode& node) const {
...@@ -175,8 +175,8 @@ void* Discrete2DFunctionProxy::deserialize(const SerializationNode& node) const ...@@ -175,8 +175,8 @@ void* Discrete2DFunctionProxy::deserialize(const SerializationNode& node) const
throw OpenMMException("Unsupported version number"); throw OpenMMException("Unsupported version number");
const SerializationNode& valuesNode = node.getChildNode("Values"); const SerializationNode& valuesNode = node.getChildNode("Values");
vector<double> values; vector<double> values;
for (int j = 0; j < (int) valuesNode.getChildren().size(); j++) for (auto& child : valuesNode.getChildren())
values.push_back(valuesNode.getChildren()[j].getDoubleProperty("v")); values.push_back(child.getDoubleProperty("v"));
return new Discrete2DFunction(node.getIntProperty("xsize"), node.getIntProperty("ysize"), values); return new Discrete2DFunction(node.getIntProperty("xsize"), node.getIntProperty("ysize"), values);
} }
...@@ -193,8 +193,8 @@ void Discrete3DFunctionProxy::serialize(const void* object, SerializationNode& n ...@@ -193,8 +193,8 @@ void Discrete3DFunctionProxy::serialize(const void* object, SerializationNode& n
node.setDoubleProperty("ysize", ysize); node.setDoubleProperty("ysize", ysize);
node.setDoubleProperty("zsize", zsize); node.setDoubleProperty("zsize", zsize);
SerializationNode& valuesNode = node.createChildNode("Values"); SerializationNode& valuesNode = node.createChildNode("Values");
for (int j = 0; j < (int) values.size(); j++) for (auto v : values)
valuesNode.createChildNode("Value").setDoubleProperty("v", values[j]); valuesNode.createChildNode("Value").setDoubleProperty("v", v);
} }
void* Discrete3DFunctionProxy::deserialize(const SerializationNode& node) const { void* Discrete3DFunctionProxy::deserialize(const SerializationNode& node) const {
...@@ -202,7 +202,7 @@ void* Discrete3DFunctionProxy::deserialize(const SerializationNode& node) const ...@@ -202,7 +202,7 @@ void* Discrete3DFunctionProxy::deserialize(const SerializationNode& node) const
throw OpenMMException("Unsupported version number"); throw OpenMMException("Unsupported version number");
const SerializationNode& valuesNode = node.getChildNode("Values"); const SerializationNode& valuesNode = node.getChildNode("Values");
vector<double> values; vector<double> values;
for (int j = 0; j < (int) valuesNode.getChildren().size(); j++) for (auto& child : valuesNode.getChildren())
values.push_back(valuesNode.getChildren()[j].getDoubleProperty("v")); values.push_back(child.getDoubleProperty("v"));
return new Discrete3DFunction(node.getIntProperty("xsize"), node.getIntProperty("ysize"), node.getIntProperty("zsize"), values); return new Discrete3DFunction(node.getIntProperty("xsize"), node.getIntProperty("ysize"), node.getIntProperty("zsize"), values);
} }
...@@ -115,11 +115,10 @@ void XmlSerializer::encodeNode(const SerializationNode& node, std::ostream& stre ...@@ -115,11 +115,10 @@ void XmlSerializer::encodeNode(const SerializationNode& node, std::ostream& stre
for (int i = 0; i < depth; i++) for (int i = 0; i < depth; i++)
stream << '\t'; stream << '\t';
stream << '<' << node.getName(); stream << '<' << node.getName();
const map<string, string>& properties = node.getProperties(); for (auto& prop : node.getProperties()) {
for (map<string, string>::const_iterator iter = properties.begin(); iter != properties.end(); ++iter) {
string name, value; string name, value;
encodeString(iter->first, &name); encodeString(prop.first, &name);
encodeString(iter->second, &value); encodeString(prop.second, &value);
stream << ' ' << name << "=\"" << value << '\"'; stream << ' ' << name << "=\"" << value << '\"';
} }
const vector<SerializationNode>& children = node.getChildren(); const vector<SerializationNode>& children = node.getChildren();
...@@ -127,8 +126,8 @@ void XmlSerializer::encodeNode(const SerializationNode& node, std::ostream& stre ...@@ -127,8 +126,8 @@ void XmlSerializer::encodeNode(const SerializationNode& node, std::ostream& stre
stream << "/>\n"; stream << "/>\n";
else { else {
stream << ">\n"; stream << ">\n";
for (int i = 0; i < (int) children.size(); i++) for (auto& child : children)
encodeNode(children[i], stream, depth+1); encodeNode(child, stream, depth+1);
for (int i = 0; i < depth; i++) for (int i = 0; i < depth; i++)
stream << '\t'; stream << '\t';
stream << "</" << node.getName() << ">\n"; stream << "</" << node.getName() << ">\n";
......
...@@ -244,6 +244,33 @@ void testIllegalVariable() { ...@@ -244,6 +244,33 @@ void testIllegalVariable() {
ASSERT(threwException); ASSERT(threwException);
} }
void testParameters() {
System system;
system.addParticle(1.0);
system.addParticle(1.0);
system.addParticle(1.0);
VerletIntegrator integrator(0.01);
CustomHbondForce* custom = new CustomHbondForce("(2*d+a)*distance(d1,a1)");
custom->addPerDonorParameter("d");
custom->addPerAcceptorParameter("a");
custom->addDonor(1, 0, -1, vector<double>({1.5}));
custom->addDonor(2, 0, -1, vector<double>({1.8}));
custom->addAcceptor(0, 1, -1, vector<double>({2.1}));
system.addForce(custom);
Context context(system, integrator, platform);
vector<Vec3> positions(3);
positions[0] = Vec3(0, 0, 0);
positions[1] = Vec3(0, 2, 0);
positions[2] = Vec3(2, 0, 0);
context.setPositions(positions);
State state = context.getState(State::Forces | State::Energy);
const vector<Vec3>& forces = state.getForces();
ASSERT_EQUAL_VEC(Vec3((2*1.8+2.1), (2*1.5+2.1), 0), forces[0], TOL);
ASSERT_EQUAL_VEC(Vec3(0, -(2*1.5+2.1), 0), forces[1], TOL);
ASSERT_EQUAL_VEC(Vec3(-(2*1.8+2.1), 0, 0), forces[2], TOL);
ASSERT_EQUAL_TOL(2*(2*1.8+2.1)+2*(2*1.5+2.1), state.getPotentialEnergy(), TOL);
}
void runPlatformTests(); void runPlatformTests();
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
...@@ -254,6 +281,7 @@ int main(int argc, char* argv[]) { ...@@ -254,6 +281,7 @@ int main(int argc, char* argv[]) {
testCutoff(); testCutoff();
testCustomFunctions(); testCustomFunctions();
testIllegalVariable(); testIllegalVariable();
testParameters();
runPlatformTests(); runPlatformTests();
} }
catch(const exception& e) { catch(const exception& e) {
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* Biological Structures at Stanford, funded under the NIH Roadmap for * * Biological Structures at Stanford, funded under the NIH Roadmap for *
* Medical Research, grant U54 GM072970. See https://simtk.org. * * Medical Research, grant U54 GM072970. See https://simtk.org. *
* * * *
* Portions copyright (c) 2012-2015 Stanford University and the Authors. * * Portions copyright (c) 2012-2017 Stanford University and the Authors. *
* Authors: Peter Eastman * * Authors: Peter Eastman *
* Contributors: * * Contributors: *
* * * *
...@@ -379,6 +379,14 @@ void testConservationLaws() { ...@@ -379,6 +379,14 @@ void testConservationLaws() {
int numParticles = system.getNumParticles(); int numParticles = system.getNumParticles();
double initialEnergy; double initialEnergy;
Vec3 initialMomentum, initialAngularMomentum; Vec3 initialMomentum, initialAngularMomentum;
double tol = 1e-4;
try {
if (context.getPlatform().getPropertyValue(context, "Precision") == "single")
tol = 0.05;
}
catch (...) {
// This platform doesn't have adjustable precision.
}
for (int i = 0; i < 1000; i++) { for (int i = 0; i < 1000; i++) {
State state = context.getState(State::Positions | State::Velocities | State::Forces | State::Energy); State state = context.getState(State::Positions | State::Velocities | State::Forces | State::Energy);
const vector<Vec3>& pos = state.getPositions(); const vector<Vec3>& pos = state.getPositions();
...@@ -399,14 +407,14 @@ void testConservationLaws() { ...@@ -399,14 +407,14 @@ void testConservationLaws() {
if (i == 0) if (i == 0)
initialMomentum = momentum; initialMomentum = momentum;
else else
ASSERT_EQUAL_VEC(initialMomentum, momentum, 0.02); ASSERT_EQUAL_VEC(initialMomentum, momentum, tol);
Vec3 angularMomentum; Vec3 angularMomentum;
for (int j = 0; j < numParticles; j++) for (int j = 0; j < numParticles; j++)
angularMomentum += pos[j].cross(vel[j])*system.getParticleMass(j); angularMomentum += pos[j].cross(vel[j])*system.getParticleMass(j);
if (i == 0) if (i == 0)
initialAngularMomentum = angularMomentum; initialAngularMomentum = angularMomentum;
else else
ASSERT_EQUAL_VEC(initialAngularMomentum, angularMomentum, 0.05); ASSERT_EQUAL_VEC(initialAngularMomentum, angularMomentum, tol);
integrator.step(1); integrator.step(1);
} }
} }
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -47,6 +47,16 @@ from . import element as elem ...@@ -47,6 +47,16 @@ from . import element as elem
from simtk.openmm.app import Topology from simtk.openmm.app import Topology
from simtk.openmm.app.internal.singleton import Singleton from simtk.openmm.app.internal.singleton import Singleton
# Directories from which to load built in force fields.
_dataDirectories = [os.path.join(os.path.dirname(__file__), 'data')]
try:
from pkg_resources import iter_entry_points
for entry in iter_entry_points(group='openmm.forcefielddir'):
_dataDirectories.append(entry.load()())
except:
pass # pkg_resources is not installed
def _convertParameterToNumber(param): def _convertParameterToNumber(param):
if unit.is_quantity(param): if unit.is_quantity(param):
if param.unit.is_compatible(unit.bar): if param.unit.is_compatible(unit.bar):
...@@ -186,11 +196,16 @@ class ForceField(object): ...@@ -186,11 +196,16 @@ class ForceField(object):
trees = [] trees = []
for file in files: for file in files:
tree = None
try: try:
# this handles either filenames or open file-like objects # this handles either filenames or open file-like objects
tree = etree.parse(file) tree = etree.parse(file)
except IOError: except IOError:
tree = etree.parse(os.path.join(os.path.dirname(__file__), 'data', file)) for dataDir in _dataDirectories:
f = os.path.join(dataDir, file)
if os.path.isfile(f):
tree = etree.parse(f)
break
except Exception as e: except Exception as e:
# Fail with an error message about which file could not be read. # Fail with an error message about which file could not be read.
# TODO: Also handle case where fallback to 'data' directory encounters problems, # TODO: Also handle case where fallback to 'data' directory encounters problems,
...@@ -202,9 +217,24 @@ class ForceField(object): ...@@ -202,9 +217,24 @@ class ForceField(object):
filename = str(file) filename = str(file)
msg += "ForceField.loadFile() encountered an error reading file '%s'\n" % filename msg += "ForceField.loadFile() encountered an error reading file '%s'\n" % filename
raise Exception(msg) raise Exception(msg)
if tree is None:
raise ValueError('Could not locate file "%s"' % file)
trees.append(tree) trees.append(tree)
# Process includes.
for parentFile, tree in zip(files, trees):
if isinstance(parentFile, str):
parentDir = os.path.dirname(parentFile)
else:
parentDir = ''
for include in tree.getroot().findall('Include'):
includeFile = include.attrib['file']
joined = os.path.join(parentDir, includeFile)
if os.path.isfile(joined):
includeFile = joined
self.loadFile(includeFile)
# Load the atom types. # Load the atom types.
...@@ -1273,6 +1303,9 @@ def _findBondsForExclusions(data, sys): ...@@ -1273,6 +1303,9 @@ def _findBondsForExclusions(data, sys):
bondIndices.append((child1, child2)) bondIndices.append((child1, child2))
for child2 in data.excludeAtomWith[atom2]: for child2 in data.excludeAtomWith[atom2]:
bondIndices.append((atom1, child2)) bondIndices.append((atom1, child2))
for atom in data.atoms:
for child in data.excludeAtomWith[atom.index]:
bondIndices.append((child, atom.index))
return bondIndices return bondIndices
def _countResidueAtoms(elements): def _countResidueAtoms(elements):
......
...@@ -69,11 +69,14 @@ def _is_gro_coord(line): ...@@ -69,11 +69,14 @@ def _is_gro_coord(line):
@param[in] line The line to be tested @param[in] line The line to be tested
""" """
sline = line.split() # data lines are fixed field
if len(sline) == 6 or len(sline) == 9: fields = []
return all([_isint(sline[2]), _isfloat(sline[3]), _isfloat(sline[4]), _isfloat(sline[5])]) fields.append(line[16:20].strip()) # atom number
elif len(sline) == 5 or len(sline) == 8: fields.append(line[21:28].strip()) # x coord
return all([_isint(line[15:20]), _isfloat(sline[2]), _isfloat(sline[3]), _isfloat(sline[4])]) fields.append(line[29:36].strip()) # y coord
fields.append(line[37:44].strip()) # z coord
if (all([f != '' for f in fields])): # check for empty fields
return all([_isint(fields[0]), _isfloat(fields[1]), _isfloat(fields[2]), _isfloat(fields[3])])
else: else:
return 0 return 0
......
...@@ -258,11 +258,16 @@ class GromacsTopFile(object): ...@@ -258,11 +258,16 @@ class GromacsTopFile(object):
def _processDefaults(self, line): def _processDefaults(self, line):
"""Process the [ defaults ] line.""" """Process the [ defaults ] line."""
fields = line.split() fields = line.split()
if len(fields) < 4: if len(fields) < 5:
raise ValueError('Too few fields in [ defaults ] line: '+line) # fudgeLJ and fudgeQQ not specified, assumed 1.0 by default
if len(fields) == 3:
fields.append(1.0)
fields.append(1.0)
else:
raise ValueError('Too few fields in [ defaults ] line: '+line)
if fields[0] != '1': if fields[0] != '1':
raise ValueError('Unsupported nonbonded type: '+fields[0]) raise ValueError('Unsupported nonbonded type: '+fields[0])
if fields[1] != '2': if not (fields[1] == '2' or fields[1] == '1'):
raise ValueError('Unsupported combination rule: '+fields[1]) raise ValueError('Unsupported combination rule: '+fields[1])
if fields[2].lower() == 'no': if fields[2].lower() == 'no':
self._genpairs = False self._genpairs = False
...@@ -570,7 +575,7 @@ class GromacsTopFile(object): ...@@ -570,7 +575,7 @@ class GromacsTopFile(object):
The solvent dielectric constant to use in the implicit solvent The solvent dielectric constant to use in the implicit solvent
model. model.
ewaldErrorTolerance : float=0.0005 ewaldErrorTolerance : float=0.0005
The error tolerance to use if nonbondedMethod is Ewald, PME, or LJPME. The error tolerance to use if nonbondedMethod is Ewald, PME or LJPME.
removeCMMotion : boolean=True removeCMMotion : boolean=True
If true, a CMMotionRemover will be added to the System If true, a CMMotionRemover will be added to the System
hydrogenMass : mass=None hydrogenMass : mass=None
...@@ -593,6 +598,11 @@ class GromacsTopFile(object): ...@@ -593,6 +598,11 @@ class GromacsTopFile(object):
raise ValueError('Illegal nonbonded method for a non-periodic system') raise ValueError('Illegal nonbonded method for a non-periodic system')
nb = mm.NonbondedForce() nb = mm.NonbondedForce()
sys.addForce(nb) sys.addForce(nb)
if self._defaults[1] == '1':
lj = mm.CustomNonbondedForce('sqrt(A1*A2)/r^12-sqrt(C1*C2)/r^6')
lj.addPerParticleParameter('C')
lj.addPerParticleParameter('A')
sys.addForce(lj)
if implicitSolvent is OBC2: if implicitSolvent is OBC2:
gb = mm.GBSAOBCForce() gb = mm.GBSAOBCForce()
gb.setSoluteDielectric(soluteDielectric) gb.setSoluteDielectric(soluteDielectric)
...@@ -610,8 +620,10 @@ class GromacsTopFile(object): ...@@ -610,8 +620,10 @@ class GromacsTopFile(object):
mapIndices = {} mapIndices = {}
bondIndices = [] bondIndices = []
topologyAtoms = list(self.topology.atoms()) topologyAtoms = list(self.topology.atoms())
exceptions = [] exclusions = []
pairs = []
fudgeQQ = float(self._defaults[4]) fudgeQQ = float(self._defaults[4])
fudgeLJ = float(self._defaults[3])
# Build a lookup table to let us process dihedrals more quickly. # Build a lookup table to let us process dihedrals more quickly.
...@@ -748,7 +760,7 @@ class GromacsTopFile(object): ...@@ -748,7 +760,7 @@ class GromacsTopFile(object):
dihedralType = fields[4] dihedralType = fields[4]
reversedTypes = types[::-1]+(dihedralType,) reversedTypes = types[::-1]+(dihedralType,)
types = types+(dihedralType,) types = types+(dihedralType,)
if (dihedralType in ('1', '2', '4', '9') and len(fields) > 7) or (dihedralType == '3' and len(fields) > 10): if (dihedralType in ('1', '4', '9') and len(fields) > 7) or (dihedralType == '3' and len(fields) > 10) or (dihedralType == '2' and len(fields) > 6):
paramsList = [fields] paramsList = [fields]
else: else:
# Look for a matching dihedral type. # Look for a matching dihedral type.
...@@ -776,13 +788,16 @@ class GromacsTopFile(object): ...@@ -776,13 +788,16 @@ class GromacsTopFile(object):
elif dihedralType == '2': elif dihedralType == '2':
# Harmonic torsion # Harmonic torsion
k = float(params[6]) k = float(params[6])
phi0 = float(params[5])
if k != 0: if k != 0:
if harmonicTorsion is None: if harmonicTorsion is None:
harmonicTorsion = mm.CustomTorsionForce('0.5*k*(theta-theta0)^2') harmonicTorsion = mm.CustomTorsionForce('0.5*k*(thetap-theta0)^2; thetap = step(-(theta-theta0+pi))*2*pi+theta+step(theta-theta0-pi)*(-2*pi); pi = %.15g' % math.pi)
harmonicTorsion.addPerTorsionParameter('theta0') harmonicTorsion.addPerTorsionParameter('theta0')
harmonicTorsion.addPerTorsionParameter('k') harmonicTorsion.addPerTorsionParameter('k')
sys.addForce(harmonicTorsion) sys.addForce(harmonicTorsion)
harmonicTorsion.addTorsion(baseAtomIndex+atoms[0], baseAtomIndex+atoms[1], baseAtomIndex+atoms[2], baseAtomIndex+atoms[3], (float(params[5])*degToRad, k)) # map phi0 into correct space
phi0 = phi0 - 360 if phi0 > 180 else phi0
harmonicTorsion.addTorsion(baseAtomIndex+atoms[0], baseAtomIndex+atoms[1], baseAtomIndex+atoms[2], baseAtomIndex+atoms[3], (phi0*degToRad, k))
else: else:
# RB Torsion # RB Torsion
c = [float(x) for x in params[5:11]] c = [float(x) for x in params[5:11]]
...@@ -825,11 +840,18 @@ class GromacsTopFile(object): ...@@ -825,11 +840,18 @@ class GromacsTopFile(object):
for fields in moleculeType.atoms: for fields in moleculeType.atoms:
params = self._atomTypes[fields[1]] params = self._atomTypes[fields[1]]
if len(fields) > 6: if len(fields) > 6:
q = float(fields[6]) q = float(fields[6])
else: else:
q = float(params[4]) q = float(params[4])
nb.addParticle(q, float(params[6]), float(params[7]))
if self._defaults[1] == '1':
nb.addParticle(q, 1.0, 0.0)
lj.addParticle([float(params[6]), float(params[7])])
elif self._defaults[1] == '2':
nb.addParticle(q, float(params[6]), float(params[7]))
if implicitSolvent is OBC2: if implicitSolvent is OBC2:
if fields[1] not in self._implicitTypes: if fields[1] not in self._implicitTypes:
raise ValueError('No implicit solvent parameters specified for atom type: '+fields[1]) raise ValueError('No implicit solvent parameters specified for atom type: '+fields[1])
...@@ -857,19 +879,37 @@ class GromacsTopFile(object): ...@@ -857,19 +879,37 @@ class GromacsTopFile(object):
continue # We'll use the automatically generated parameters continue # We'll use the automatically generated parameters
atom1params = nb.getParticleParameters(baseAtomIndex+atoms[0]) atom1params = nb.getParticleParameters(baseAtomIndex+atoms[0])
atom2params = nb.getParticleParameters(baseAtomIndex+atoms[1]) atom2params = nb.getParticleParameters(baseAtomIndex+atoms[1])
exceptions.append((baseAtomIndex+atoms[0], baseAtomIndex+atoms[1], atom1params[0]*atom2params[0]*fudgeQQ, params[0], params[1])) pairs.append((baseAtomIndex+atoms[0], baseAtomIndex+atoms[1], atom1params[0]*atom2params[0]*fudgeQQ, params[0], params[1]))
for fields in moleculeType.exclusions: for fields in moleculeType.exclusions:
atoms = [int(x)-1 for x in fields] atoms = [int(x)-1 for x in fields]
for atom in atoms[1:]: for atom in atoms[1:]:
if atom > atoms[0]: if atom > atoms[0]:
exceptions.append((baseAtomIndex+atoms[0], baseAtomIndex+atom, 0, 0, 0)) exclusions.append((baseAtomIndex+atoms[0], baseAtomIndex+atom))
# Create nonbonded exceptions. # Create nonbonded exceptions.
nb.createExceptionsFromBonds(bondIndices, fudgeQQ, float(self._defaults[3])) nb.createExceptionsFromBonds(bondIndices, fudgeQQ, fudgeLJ)
for exception in exceptions: for exclusion in exclusions:
nb.addException(exception[0], exception[1], exception[2], float(exception[3]), float(exception[4]), True) nb.addException(exclusion[0], exclusion[1], 0.0, 1.0, 0.0, True)
if self._defaults[1] == '1':
# We're using a CustomNonbondedForce for LJ interactions, so also create a CustomBondForce
# to handle the exceptions.
pair_bond = mm.CustomBondForce('138.935456*q/r-C/r^6+A/r^12')
pair_bond.addPerBondParameter('q')
pair_bond.addPerBondParameter('C')
pair_bond.addPerBondParameter('A')
sys.addForce(pair_bond)
lj.createExclusionsFromBonds(bondIndices, 3)
for pair in pairs:
nb.addException(pair[0], pair[1], pair[2], 1.0, 0.0, True)
pair_bond.addBond(pair[0], pair[1], [pair[2],float(pair[3]), float(pair[4])])
for exclusion in exclusions:
lj.addExclusion(exclusion[0], exclusion[1])
elif self._defaults[1] == '2':
for pair in pairs:
nb.addException(pair[0], pair[1], pair[2], float(pair[3]), float(pair[4]), True)
# Finish configuring the NonbondedForce. # Finish configuring the NonbondedForce.
...@@ -882,6 +922,15 @@ class GromacsTopFile(object): ...@@ -882,6 +922,15 @@ class GromacsTopFile(object):
nb.setNonbondedMethod(methodMap[nonbondedMethod]) nb.setNonbondedMethod(methodMap[nonbondedMethod])
nb.setCutoffDistance(nonbondedCutoff) nb.setCutoffDistance(nonbondedCutoff)
nb.setEwaldErrorTolerance(ewaldErrorTolerance) nb.setEwaldErrorTolerance(ewaldErrorTolerance)
if self._defaults[1] == '1':
methodMap = {ff.NoCutoff:mm.CustomNonbondedForce.NoCutoff,
ff.CutoffNonPeriodic:mm.CustomNonbondedForce.CutoffNonPeriodic,
ff.CutoffPeriodic:mm.CustomNonbondedForce.CutoffPeriodic,
ff.Ewald:mm.CustomNonbondedForce.CutoffPeriodic,
ff.PME:mm.CustomNonbondedForce.CutoffPeriodic,
ff.LJPME:mm.CustomNonbondedForce.CutoffPeriodic}
lj.setNonbondedMethod(methodMap[nonbondedMethod])
lj.setCutoffDistance(nonbondedCutoff)
# Adjust masses. # Adjust masses.
......
...@@ -123,6 +123,8 @@ class PDBFile(object): ...@@ -123,6 +123,8 @@ class PDBFile(object):
# Try to guess the element. # Try to guess the element.
upper = atomName.upper() upper = atomName.upper()
while len(upper) > 1 and upper[0].isdigit():
upper = upper[1:]
if upper.startswith('CL'): if upper.startswith('CL'):
element = elem.chlorine element = elem.chlorine
elif upper.startswith('NA'): elif upper.startswith('NA'):
...@@ -141,7 +143,7 @@ class PDBFile(object): ...@@ -141,7 +143,7 @@ class PDBFile(object):
element = elem.calcium element = elem.calcium
else: else:
try: try:
element = elem.get_by_symbol(atomName[0]) element = elem.get_by_symbol(upper[0])
except KeyError: except KeyError:
pass pass
newAtom = top.addAtom(atomName, element, r, str(atom.serial_number)) newAtom = top.addAtom(atomName, element, r, str(atom.serial_number))
......
...@@ -47,6 +47,7 @@ class TestDCDFile(unittest.TestCase): ...@@ -47,6 +47,7 @@ class TestDCDFile(unittest.TestCase):
simulation.step(10) simulation.step(10)
self.assertEqual(5, dcd._dcd._modelCount) self.assertEqual(5, dcd._dcd._modelCount)
del simulation del simulation
del dcd
len1 = os.stat(fname).st_size len1 = os.stat(fname).st_size
# Create a new simulation and have it append some more frames. # Create a new simulation and have it append some more frames.
...@@ -61,6 +62,8 @@ class TestDCDFile(unittest.TestCase): ...@@ -61,6 +62,8 @@ class TestDCDFile(unittest.TestCase):
self.assertEqual(10, dcd._dcd._modelCount) self.assertEqual(10, dcd._dcd._modelCount)
len2 = os.stat(fname).st_size len2 = os.stat(fname).st_size
self.assertTrue(len2-len1 > 3*4*5*system.getNumParticles()) self.assertTrue(len2-len1 > 3*4*5*system.getNumParticles())
del simulation
del dcd
os.remove(fname) os.remove(fname)
......
...@@ -51,6 +51,18 @@ class TestGromacsTopFile(unittest.TestCase): ...@@ -51,6 +51,18 @@ class TestGromacsTopFile(unittest.TestCase):
ene = context.getState(getEnergy=True, groups=2**1).getPotentialEnergy() ene = context.getState(getEnergy=True, groups=2**1).getPotentialEnergy()
self.assertAlmostEqual(ene.value_in_unit(kilojoules_per_mole), 341.6905133582857) self.assertAlmostEqual(ene.value_in_unit(kilojoules_per_mole), 341.6905133582857)
def test_SMOG(self):
""" Test to ensure that SMOG models can be run without problems """
top = GromacsTopFile('systems/2ci2.pdb.top')
gro = GromacsGroFile('systems/2ci2.pdb.gro')
system = top.createSystem()
context = Context(system, VerletIntegrator(1*femtosecond),
Platform.getPlatformByName('Reference'))
context.setPositions(gro.positions)
ene = context.getState(getEnergy=True).getPotentialEnergy()
self.assertAlmostEqual(ene.value_in_unit(kilojoules_per_mole), -346.940915296)
def test_Cutoff(self): def test_Cutoff(self):
"""Test to make sure the nonbondedCutoff parameter is passed correctly.""" """Test to make sure the nonbondedCutoff parameter is passed correctly."""
......
Structure-Based gro file for Gromacs: smog@ctbp Version 1.1
521
1 ASN N 1 3.225 1.272 1.868
1 ASN CA 2 3.089 1.316 1.904
1 ASN C 3 3.092 1.467 1.934
1 ASN O 4 3.185 1.538 1.891
1 ASN CB 5 3.032 1.233 2.017
1 ASN CG 6 3.099 1.097 2.032
1 ASN OD1 7 3.035 1.000 2.076
1 ASN ND2 8 3.226 1.088 1.996
2 LEU N 9 2.990 1.510 2.005
2 LEU CA 10 2.974 1.649 2.048
2 LEU C 11 2.829 1.686 2.078
2 LEU O 12 2.737 1.658 2.000
2 LEU CB 13 3.040 1.740 1.943
2 LEU CG 14 3.126 1.854 1.995
2 LEU CD1 15 3.210 1.811 2.115
2 LEU CD2 16 3.217 1.901 1.881
3 LYS N 17 2.812 1.746 2.196
3 LYS CA 18 2.683 1.801 2.237
3 LYS C 19 2.702 1.953 2.222
3 LYS O 20 2.791 2.009 2.287
3 LYS CB 21 2.625 1.770 2.374
3 LYS CG 22 2.474 1.801 2.379
3 LYS CD 23 2.416 1.776 2.517
3 LYS CE 24 2.266 1.783 2.521
3 LYS NZ 25 2.217 1.786 2.662
4 THR N 26 2.624 2.007 2.131
4 THR CA 27 2.637 2.149 2.094
4 THR C 28 2.512 2.231 2.115
4 THR O 29 2.521 2.355 2.098
4 THR CB 30 2.686 2.156 1.944
4 THR OG1 31 2.583 2.084 1.869
4 THR CG2 32 2.825 2.094 1.926
5 GLU N 33 2.404 2.166 2.152
5 GLU CA 34 2.278 2.239 2.175
5 GLU C 35 2.197 2.178 2.287
5 GLU O 36 2.198 2.056 2.304
5 GLU CB 37 2.199 2.253 2.048
5 GLU CG 38 2.117 2.138 1.990
5 GLU CD 39 2.050 2.197 1.868
5 GLU OE1 40 2.120 2.253 1.785
5 GLU OE2 41 1.926 2.194 1.876
6 TRP N 42 2.136 2.266 2.363
6 TRP CA 43 2.060 2.231 2.483
6 TRP C 44 1.914 2.279 2.477
6 TRP O 45 1.871 2.356 2.564
6 TRP CB 46 2.132 2.281 2.609
6 TRP CG 47 2.259 2.214 2.645
6 TRP CD1 48 2.278 2.112 2.735
6 TRP CD2 49 2.389 2.240 2.589
6 TRP NE1 50 2.409 2.074 2.738
6 TRP CE2 51 2.479 2.149 2.650
6 TRP CE3 52 2.435 2.327 2.491
6 TRP CZ2 53 2.615 2.148 2.618
6 TRP CZ3 54 2.569 2.325 2.459
6 TRP CH2 55 2.657 2.237 2.521
7 PRO N 56 1.842 2.228 2.379
7 PRO CA 57 1.700 2.259 2.359
7 PRO C 58 1.617 2.237 2.483
7 PRO O 59 1.516 2.308 2.502
7 PRO CB 60 1.655 2.165 2.247
7 PRO CG 61 1.762 2.058 2.242
7 PRO CD 62 1.891 2.133 2.277
8 GLU N 63 1.656 2.141 2.565
8 GLU CA 64 1.584 2.104 2.687
8 GLU C 65 1.593 2.215 2.792
8 GLU O 66 1.529 2.203 2.897
8 GLU CB 67 1.641 1.979 2.754
8 GLU CG 68 1.780 1.990 2.819
8 GLU CD 69 1.894 1.946 2.730
8 GLU OE1 70 1.890 1.958 2.610
8 GLU OE2 71 1.990 1.892 2.788
9 LEU N 72 1.674 2.314 2.763
9 LEU CA 73 1.700 2.422 2.858
9 LEU C 74 1.611 2.544 2.844
9 LEU O 75 1.614 2.621 2.943
9 LEU CB 76 1.850 2.454 2.858
9 LEU CG 77 1.941 2.354 2.927
9 LEU CD1 78 2.087 2.398 2.920
9 LEU CD2 79 1.898 2.339 3.073
10 VAL N 80 1.539 2.561 2.734
10 VAL CA 81 1.453 2.680 2.722
10 VAL C 82 1.358 2.685 2.842
10 VAL O 83 1.294 2.585 2.876
10 VAL CB 84 1.382 2.689 2.588
10 VAL CG1 85 1.295 2.816 2.579
10 VAL CG2 86 1.479 2.681 2.470
11 GLY N 87 1.355 2.799 2.907
11 GLY CA 88 1.269 2.827 3.021
11 GLY C 89 1.328 2.813 3.159
11 GLY O 90 1.271 2.865 3.257
12 LYS N 91 1.438 2.741 3.169
12 LYS CA 92 1.508 2.715 3.295
12 LYS C 93 1.595 2.834 3.335
12 LYS O 94 1.631 2.918 3.252
12 LYS CB 95 1.595 2.590 3.283
12 LYS CG 96 1.524 2.474 3.215
12 LYS CD 97 1.548 2.342 3.286
12 LYS CE 98 1.429 2.249 3.280
12 LYS NZ 99 1.334 2.287 3.173
13 SER N 100 1.626 2.840 3.463
13 SER CA 101 1.710 2.946 3.520
13 SER C 102 1.854 2.925 3.471
13 SER O 103 1.893 2.817 3.425
13 SER CB 104 1.702 2.948 3.672
13 SER OG 105 1.790 2.852 3.727
14 VAL N 106 1.928 3.034 3.481
14 VAL CA 107 2.070 3.040 3.444
14 VAL C 108 2.147 2.947 3.539
14 VAL O 109 2.241 2.880 3.493
14 VAL CB 110 2.125 3.183 3.442
14 VAL CG1 111 2.275 3.182 3.474
14 VAL CG2 112 2.101 3.255 3.311
15 GLU N 113 2.106 2.940 3.663
15 GLU CA 114 2.168 2.857 3.766
15 GLU C 115 2.154 2.709 3.729
15 GLU O 116 2.252 2.632 3.721
15 GLU CB 117 2.110 2.885 3.903
15 GLU CG 118 2.026 3.008 3.929
15 GLU CD 119 2.004 3.119 3.832
15 GLU OE1 120 1.913 3.201 3.838
15 GLU OE2 121 2.089 3.128 3.741
16 GLU N 122 2.031 2.671 3.698
16 GLU CA 123 1.998 2.536 3.655
16 GLU C 124 2.073 2.507 3.525
16 GLU O 125 2.140 2.403 3.518
16 GLU CB 126 1.850 2.511 3.632
16 GLU CG 127 1.745 2.544 3.737
16 GLU CD 128 1.601 2.513 3.704
16 GLU OE1 129 1.553 2.400 3.709
16 GLU OE2 130 1.534 2.613 3.671
17 ALA N 131 2.064 2.595 3.427
17 ALA CA 132 2.128 2.578 3.297
17 ALA C 133 2.279 2.563 3.299
17 ALA O 134 2.333 2.483 3.220
17 ALA CB 135 2.081 2.689 3.203
18 LYS N 136 2.349 2.634 3.385
18 LYS CA 137 2.494 2.628 3.402
18 LYS C 138 2.536 2.484 3.437
18 LYS O 139 2.624 2.419 3.379
18 LYS CB 140 2.541 2.711 3.522
18 LYS CG 141 2.598 2.849 3.497
18 LYS CD 142 2.629 2.920 3.629
18 LYS CE 143 2.678 3.061 3.607
18 LYS NZ 144 2.611 3.159 3.697
19 LYS N 145 2.470 2.438 3.542
19 LYS CA 146 2.482 2.306 3.602
19 LYS C 147 2.472 2.192 3.503
19 LYS O 148 2.546 2.093 3.517
19 LYS CB 149 2.372 2.289 3.707
19 LYS CG 150 2.390 2.167 3.796
19 LYS CD 151 2.320 2.189 3.929
19 LYS CE 152 2.410 2.263 4.027
19 LYS NZ 153 2.401 2.410 4.001
20 VAL N 154 2.382 2.204 3.407
20 VAL CA 155 2.358 2.101 3.306
20 VAL C 156 2.469 2.108 3.201
20 VAL O 157 2.533 2.006 3.172
20 VAL CB 158 2.217 2.108 3.246
20 VAL CG1 159 2.207 2.031 3.115
20 VAL CG2 160 2.111 2.060 3.343
21 ILE N 161 2.489 2.227 3.148
21 ILE CA 162 2.593 2.249 3.047
21 ILE C 163 2.729 2.202 3.098
21 ILE O 164 2.800 2.135 3.021
21 ILE CB 165 2.599 2.396 2.995
21 ILE CG1 166 2.470 2.428 2.915
21 ILE CG2 167 2.724 2.420 2.905
21 ILE CD1 168 2.437 2.580 2.905
22 LEU N 169 2.764 2.237 3.220
22 LEU CA 170 2.896 2.201 3.273
22 LEU C 171 2.911 2.050 3.288
22 LEU O 172 3.023 1.996 3.283
22 LEU CB 173 2.924 2.283 3.399
22 LEU CG 174 2.982 2.421 3.383
22 LEU CD1 175 3.007 2.483 3.520
22 LEU CD2 176 3.112 2.415 3.303
23 GLN N 177 2.798 1.987 3.309
23 GLN CA 178 2.787 1.840 3.321
23 GLN C 179 2.830 1.780 3.188
23 GLN O 180 2.919 1.694 3.184
23 GLN CB 181 2.645 1.800 3.359
23 GLN CG 182 2.629 1.665 3.426
23 GLN CD 183 2.549 1.665 3.553
23 GLN OE1 184 2.548 1.760 3.633
23 GLN NE2 185 2.480 1.552 3.575
24 ASP N 186 2.771 1.829 3.081
24 ASP CA 187 2.791 1.785 2.944
24 ASP C 188 2.915 1.840 2.873
24 ASP O 189 2.955 1.782 2.771
24 ASP CB 190 2.672 1.822 2.854
24 ASP CG 191 2.537 1.768 2.892
24 ASP OD1 192 2.520 1.681 2.978
24 ASP OD2 193 2.441 1.817 2.829
25 LYS N 194 2.959 1.955 2.917
25 LYS CA 195 3.074 2.024 2.855
25 LYS C 196 3.155 2.093 2.966
25 LYS O 197 3.143 2.215 2.988
25 LYS CB 198 3.024 2.119 2.749
25 LYS CG 199 3.126 2.207 2.680
25 LYS CD 200 3.064 2.297 2.574
25 LYS CE 201 3.169 2.365 2.490
25 LYS NZ 202 3.221 2.274 2.385
26 PRO N 203 3.233 2.012 3.036
26 PRO CA 204 3.316 2.058 3.147
26 PRO C 205 3.408 2.175 3.120
26 PRO O 206 3.444 2.244 3.218
26 PRO CB 207 3.396 1.933 3.187
26 PRO CG 208 3.311 1.817 3.141
26 PRO CD 209 3.246 1.866 3.014
27 GLU N 210 3.445 2.200 2.998
27 GLU CA 211 3.533 2.310 2.957
27 GLU C 212 3.460 2.435 2.907
27 GLU O 213 3.525 2.532 2.861
27 GLU CB 214 3.623 2.268 2.839
27 GLU CG 215 3.562 2.266 2.700
27 GLU CD 216 3.471 2.154 2.661
27 GLU OE1 217 3.435 2.134 2.546
27 GLU OE2 218 3.431 2.082 2.753
28 ALA N 219 3.328 2.430 2.908
28 ALA CA 220 3.246 2.542 2.860
28 ALA C 221 3.275 2.670 2.940
28 ALA O 222 3.296 2.673 3.063
28 ALA CB 223 3.099 2.505 2.862
29 GLN N 224 3.279 2.776 2.860
29 GLN CA 225 3.291 2.915 2.907
29 GLN C 226 3.151 2.974 2.884
29 GLN O 227 3.110 2.993 2.770
29 GLN CB 228 3.402 2.995 2.841
29 GLN CG 229 3.542 2.948 2.879
29 GLN CD 230 3.577 2.956 3.026
29 GLN OE1 231 3.557 3.052 3.099
29 GLN NE2 232 3.636 2.848 3.078
30 ILE N 233 3.078 2.989 2.994
30 ILE CA 234 2.939 3.036 2.992
30 ILE C 235 2.928 3.188 2.992
30 ILE O 236 2.979 3.254 3.083
30 ILE CB 237 2.857 2.968 3.108
30 ILE CG1 238 2.865 2.814 3.092
30 ILE CG2 239 2.709 3.015 3.117
30 ILE CD1 240 2.805 2.736 3.212
31 ILE N 241 2.859 3.237 2.890
31 ILE CA 242 2.833 3.380 2.869
31 ILE C 243 2.682 3.402 2.875
31 ILE O 244 2.605 3.327 2.813
31 ILE CB 245 2.894 3.427 2.732
31 ILE CG1 246 3.048 3.407 2.730
31 ILE CG2 247 2.856 3.571 2.693
31 ILE CD1 248 3.127 3.467 2.849
32 VAL N 249 2.640 3.501 2.952
32 VAL CA 250 2.500 3.535 2.975
32 VAL C 251 2.466 3.670 2.913
32 VAL O 252 2.515 3.771 2.968
32 VAL CB 253 2.476 3.538 3.128
32 VAL CG1 254 2.336 3.585 3.165
32 VAL CG2 255 2.508 3.406 3.196
33 LEU N 256 2.384 3.671 2.810
33 LEU CA 257 2.341 3.794 2.745
33 LEU C 258 2.188 3.804 2.736
33 LEU O 259 2.119 3.702 2.727
33 LEU CB 260 2.406 3.796 2.607
33 LEU CG 261 2.555 3.777 2.590
33 LEU CD1 262 2.587 3.750 2.443
33 LEU CD2 263 2.629 3.902 2.637
34 PRO N 264 2.140 3.927 2.733
34 PRO CA 265 1.997 3.955 2.716
34 PRO C 266 1.955 3.919 2.574
34 PRO O 267 2.036 3.939 2.481
34 PRO CB 268 1.986 4.107 2.735
34 PRO CG 269 2.117 4.152 2.791
34 PRO CD 270 2.220 4.051 2.743
35 VAL N 271 1.833 3.871 2.554
35 VAL CA 272 1.782 3.838 2.419
35 VAL C 273 1.783 3.968 2.337
35 VAL O 274 1.746 4.072 2.392
35 VAL CB 275 1.637 3.785 2.421
35 VAL CG1 276 1.575 3.776 2.282
35 VAL CG2 277 1.619 3.655 2.497
36 GLY N 278 1.818 3.957 2.211
36 GLY CA 279 1.823 4.071 2.120
36 GLY C 280 1.962 4.131 2.106
36 GLY O 281 1.976 4.231 2.032
37 THR N 282 2.061 4.075 2.172
37 THR CA 283 2.201 4.121 2.166
37 THR C 284 2.271 4.071 2.040
37 THR O 285 2.270 3.952 2.002
37 THR CB 286 2.282 4.085 2.297
37 THR OG1 287 2.202 4.138 2.408
37 THR CG2 288 2.425 4.136 2.310
38 ILE N 289 2.335 4.165 1.973
38 ILE CA 290 2.412 4.141 1.850
38 ILE C 291 2.556 4.109 1.890
38 ILE O 292 2.623 4.196 1.948
38 ILE CB 293 2.401 4.266 1.755
38 ILE CG1 294 2.251 4.298 1.729
38 ILE CG2 295 2.482 4.247 1.624
38 ILE CD1 296 2.215 4.331 1.581
39 VAL N 297 2.600 3.990 1.858
39 VAL CA 298 2.736 3.946 1.893
39 VAL C 299 2.830 3.951 1.773
39 VAL O 300 2.786 3.964 1.657
39 VAL CB 301 2.726 3.809 1.963
39 VAL CG1 302 2.661 3.818 2.101
39 VAL CG2 303 2.654 3.705 1.879
40 THR N 304 2.959 3.941 1.803
40 THR CA 305 3.065 3.940 1.701
40 THR C 306 3.070 3.803 1.633
40 THR O 307 3.069 3.699 1.703
40 THR CB 308 3.206 3.979 1.762
40 THR OG1 309 3.180 4.060 1.881
40 THR CG2 310 3.299 4.051 1.664
41 MET N 311 3.079 3.803 1.502
41 MET CA 312 3.077 3.681 1.421
41 MET C 313 3.190 3.583 1.441
41 MET O 314 3.216 3.498 1.352
41 MET CB 315 3.047 3.719 1.277
41 MET CG 316 3.136 3.664 1.170
41 MET SD 317 3.092 3.752 1.014
41 MET CE 318 3.237 3.860 1.000
42 GLU N 319 3.251 3.580 1.557
42 GLU CA 320 3.361 3.488 1.591
42 GLU C 321 3.314 3.357 1.654
42 GLU O 322 3.244 3.359 1.757
42 GLU CB 323 3.453 3.556 1.693
42 GLU CG 324 3.398 3.593 1.831
42 GLU CD 325 3.493 3.663 1.924
42 GLU OE1 326 3.528 3.779 1.910
42 GLU OE2 327 3.533 3.590 2.016
43 TYR N 328 3.359 3.245 1.599
43 TYR CA 329 3.323 3.111 1.647
43 TYR C 330 3.417 3.048 1.748
43 TYR O 331 3.531 3.013 1.709
43 TYR CB 332 3.313 3.015 1.525
43 TYR CG 333 3.278 2.875 1.569
43 TYR CD1 334 3.373 2.773 1.576
43 TYR CD2 335 3.148 2.844 1.607
43 TYR CE1 336 3.339 2.644 1.618
43 TYR CE2 337 3.112 2.717 1.649
43 TYR CZ 338 3.208 2.617 1.654
43 TYR OH 339 3.168 2.493 1.695
44 ARG N 340 3.371 3.022 1.870
44 ARG CA 341 3.452 2.959 1.974
44 ARG C 342 3.388 2.832 2.031
44 ARG O 343 3.287 2.834 2.103
44 ARG CB 344 3.483 3.055 2.088
44 ARG CG 345 3.570 3.175 2.049
44 ARG CD 346 3.699 3.177 2.122
44 ARG NE 347 3.695 3.109 2.251
44 ARG CZ 348 3.800 3.103 2.333
44 ARG NH1 349 3.916 3.162 2.303
44 ARG NH2 350 3.790 3.035 2.448
45 ILE N 351 3.456 2.723 2.006
45 ILE CA 352 3.417 2.587 2.044
45 ILE C 353 3.394 2.565 2.192
45 ILE O 354 3.306 2.482 2.228
45 ILE CB 355 3.519 2.492 1.970
45 ILE CG1 356 3.459 2.352 1.942
45 ILE CG2 357 3.658 2.483 2.039
45 ILE CD1 358 3.565 2.239 1.918
46 ASP N 359 3.461 2.637 2.280
46 ASP CA 360 3.448 2.618 2.425
46 ASP C 361 3.345 2.708 2.492
46 ASP O 362 3.332 2.701 2.615
46 ASP CB 363 3.582 2.632 2.497
46 ASP CG 364 3.651 2.765 2.475
46 ASP OD1 365 3.643 2.823 2.364
46 ASP OD2 366 3.712 2.812 2.574
47 ARG N 367 3.285 2.791 2.410
47 ARG CA 368 3.190 2.892 2.458
47 ARG C 369 3.043 2.851 2.446
47 ARG O 370 3.005 2.798 2.341
47 ARG CB 371 3.211 3.021 2.376
47 ARG CG 372 3.115 3.134 2.413
47 ARG CD 373 3.162 3.269 2.371
47 ARG NE 374 3.165 3.284 2.227
47 ARG CZ 375 3.244 3.362 2.153
47 ARG NH1 376 3.332 3.446 2.204
47 ARG NH2 377 3.237 3.352 2.020
48 VAL N 378 2.967 2.887 2.549
48 VAL CA 379 2.822 2.868 2.552
48 VAL C 380 2.752 2.998 2.596
48 VAL O 381 2.755 3.032 2.715
48 VAL CB 382 2.772 2.751 2.639
48 VAL CG1 383 2.620 2.735 2.629
48 VAL CG2 384 2.840 2.618 2.610
49 ARG N 385 2.687 3.061 2.501
49 ARG CA 386 2.611 3.184 2.529
49 ARG C 387 2.470 3.148 2.574
49 ARG O 388 2.404 3.074 2.500
49 ARG CB 389 2.598 3.269 2.401
49 ARG CG 390 2.727 3.344 2.362
49 ARG CD 391 2.708 3.394 2.224
49 ARG NE 392 2.820 3.458 2.160
49 ARG CZ 393 2.858 3.435 2.034
49 ARG NH1 394 2.797 3.345 1.958
49 ARG NH2 395 2.958 3.508 1.984
50 LEU N 396 2.424 3.205 2.683
50 LEU CA 397 2.286 3.190 2.730
50 LEU C 398 2.213 3.323 2.702
50 LEU O 399 2.261 3.426 2.750
50 LEU CB 400 2.287 3.156 2.879
50 LEU CG 401 2.357 3.027 2.921
50 LEU CD1 402 2.343 3.002 3.071
50 LEU CD2 403 2.296 2.916 2.836
51 PHE N 404 2.105 3.316 2.628
51 PHE CA 405 2.023 3.436 2.597
51 PHE C 406 1.904 3.433 2.693
51 PHE O 407 1.819 3.343 2.691
51 PHE CB 408 1.990 3.446 2.449
51 PHE CG 409 2.104 3.493 2.363
51 PHE CD1 410 2.190 3.400 2.303
51 PHE CD2 411 2.128 3.629 2.343
51 PHE CE1 412 2.299 3.442 2.228
51 PHE CE2 413 2.236 3.674 2.268
51 PHE CZ 414 2.321 3.579 2.209
52 VAL N 415 1.905 3.529 2.784
52 VAL CA 416 1.809 3.542 2.892
52 VAL C 417 1.705 3.653 2.875
52 VAL O 418 1.719 3.752 2.804
52 VAL CB 419 1.880 3.544 3.029
52 VAL CG1 420 1.980 3.428 3.043
52 VAL CG2 421 1.947 3.675 3.062
53 ASP N 422 1.593 3.627 2.942
53 ASP CA 423 1.474 3.712 2.952
53 ASP C 424 1.490 3.799 3.077
53 ASP O 425 1.591 3.788 3.150
53 ASP CB 426 1.347 3.627 2.950
53 ASP CG 427 1.311 3.565 3.083
53 ASP OD1 428 1.388 3.573 3.181
53 ASP OD2 429 1.203 3.503 3.096
54 LYS N 430 1.393 3.885 3.101
54 LYS CA 431 1.388 3.979 3.212
54 LYS C 432 1.403 3.915 3.349
54 LYS O 433 1.439 3.985 3.445
54 LYS CB 434 1.252 4.050 3.217
54 LYS CG 435 1.247 4.185 3.148
54 LYS CD 436 1.116 4.257 3.176
54 LYS CE 437 1.130 4.369 3.277
54 LYS NZ 438 1.058 4.490 3.228
55 LEU N 439 1.370 3.787 3.358
55 LEU CA 440 1.378 3.717 3.488
55 LEU C 441 1.499 3.625 3.493
55 LEU O 442 1.513 3.551 3.593
55 LEU CB 443 1.244 3.650 3.514
55 LEU CG 444 1.121 3.738 3.535
55 LEU CD1 445 1.000 3.652 3.566
55 LEU CD2 446 1.150 3.835 3.649
56 ASP N 447 1.582 3.630 3.391
56 ASP CA 448 1.703 3.548 3.383
56 ASP C 449 1.672 3.401 3.351
56 ASP O 450 1.744 3.317 3.408
56 ASP CB 451 1.786 3.556 3.511
56 ASP CG 452 1.851 3.691 3.534
56 ASP OD1 453 1.906 3.748 3.438
56 ASP OD2 454 1.846 3.738 3.649
57 ASN N 455 1.572 3.374 3.270
57 ASN CA 456 1.538 3.237 3.229
57 ASN C 457 1.594 3.222 3.088
57 ASN O 458 1.608 3.328 3.025
57 ASN CB 459 1.388 3.210 3.239
57 ASN CG 460 1.349 3.197 3.385
57 ASN OD1 461 1.426 3.140 3.463
57 ASN ND2 462 1.235 3.253 3.421
58 ILE N 463 1.625 3.101 3.046
58 ILE CA 464 1.680 3.080 2.911
58 ILE C 465 1.564 3.098 2.812
58 ILE O 466 1.466 3.022 2.820
58 ILE CB 467 1.750 2.942 2.890
58 ILE CG1 468 1.872 2.918 2.979
58 ILE CG2 469 1.788 2.920 2.740
58 ILE CD1 470 1.912 3.021 3.086
59 ALA N 471 1.582 3.191 2.721
59 ALA CA 472 1.477 3.226 2.625
59 ALA C 473 1.490 3.161 2.489
59 ALA O 474 1.393 3.160 2.411
59 ALA CB 475 1.475 3.380 2.617
60 GLU N 476 1.609 3.115 2.456
60 GLU CA 477 1.638 3.047 2.330
60 GLU C 478 1.728 2.927 2.359
60 GLU O 479 1.790 2.922 2.467
60 GLU CB 480 1.705 3.136 2.226
60 GLU CG 481 1.754 3.274 2.267
60 GLU CD 482 1.776 3.370 2.154
60 GLU OE1 483 1.822 3.337 2.046
60 GLU OE2 484 1.745 3.487 2.183
61 VAL N 485 1.733 2.834 2.266
61 VAL CA 486 1.813 2.712 2.280
61 VAL C 487 1.962 2.749 2.286
61 VAL O 488 2.010 2.806 2.187
61 VAL CB 489 1.793 2.614 2.162
61 VAL CG1 490 1.896 2.501 2.169
61 VAL CG2 491 1.652 2.559 2.151
62 PRO N 492 2.025 2.713 2.395
62 PRO CA 493 2.169 2.736 2.413
62 PRO C 494 2.247 2.652 2.311
62 PRO O 495 2.209 2.536 2.284
62 PRO CB 496 2.195 2.692 2.557
62 PRO CG 497 2.060 2.690 2.625
62 PRO CD 498 1.964 2.649 2.514
63 ARG N 499 2.354 2.707 2.257
63 ARG CA 500 2.437 2.641 2.157
63 ARG C 501 2.584 2.684 2.169
63 ARG O 502 2.609 2.797 2.213
63 ARG CB 503 2.391 2.673 2.014
63 ARG CG 504 2.294 2.574 1.955
63 ARG CD 505 2.240 2.618 1.823
63 ARG NE 506 2.143 2.726 1.840
63 ARG CZ 507 2.010 2.712 1.835
63 ARG NH1 508 1.951 2.601 1.793
63 ARG NH2 509 1.936 2.812 1.883
64 VAL N 510 2.673 2.596 2.125
64 VAL CA 511 2.817 2.623 2.127
64 VAL C 512 2.854 2.725 2.019
64 VAL O 513 2.796 2.722 1.908
64 VAL CB 514 2.898 2.493 2.107
64 VAL CG1 515 3.046 2.525 2.079
64 VAL CG2 516 2.886 2.398 2.224
65 GLY N 517 2.953 2.808 2.050
65 GLY CA 518 3.001 2.906 1.950
65 GLY C 519 3.038 3.040 2.010
65 GLY O 520 2.978 3.069 2.115
65 GLY OXT 521 3.120 3.109 1.949
4.916000 5.490000 5.027000
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment