diff --git a/modules/mol/mm/src/simulation.cc b/modules/mol/mm/src/simulation.cc index c154d27cd55d4b410fdf92bc2bf8c3245468ca59..dea985213bf993a1a49f0ec06c17f7b34d4e36fe 100644 --- a/modules/mol/mm/src/simulation.cc +++ b/modules/mol/mm/src/simulation.cc @@ -45,16 +45,11 @@ Simulation::Simulation(const TopologyPtr top, } void Simulation::Save(const String& filename){ + std::ofstream stream(filename.c_str(), std::ios_base::binary); io::BinaryDataSink ds(stream); + ds << *top_; - geom::Vec3List positions = this->GetPositions(false,false); - for(geom::Vec3List::iterator i = positions.begin(); - i != positions.end(); ++i){ - ds & (*i)[0]; - ds & (*i)[1]; - ds & (*i)[2]; - } uint num_chains; uint num_residues; @@ -96,15 +91,11 @@ void Simulation::Save(const String& filename){ k != atom_list.end(); ++k){ atom_name = k->GetName(); atom_element = k->GetElement(); - geom::Vec3 pos = k->GetPos(); bfac = k->GetBFactor(); occ = k->GetOccupancy(); is_hetatm = k->IsHetAtom(); ds & atom_name; ds & atom_element; - ds & pos[0]; - ds & pos[1]; - ds & pos[2]; ds & bfac; ds & occ; ds & is_hetatm; @@ -138,6 +129,7 @@ void Simulation::Save(const String& filename){ } SimulationPtr Simulation::Load(const String& filename, SettingsPtr settings){ + if (!boost::filesystem::exists(filename)) { std::stringstream ss; ss << "Could not open simulation File '" @@ -145,71 +137,17 @@ SimulationPtr Simulation::Load(const String& filename, SettingsPtr settings){ throw ost::io::IOException(ss.str()); } - SimulationPtr sim_ptr(new Simulation); - std::ifstream stream(filename.c_str(), std::ios_base::binary); io::BinaryDataSource ds(stream); - TopologyPtr top_p(new Topology); - ds >> *top_p; - - sim_ptr->top_ = top_p; - - sim_ptr->system_ = SystemCreator::Create(sim_ptr->top_,settings, - sim_ptr->system_force_mapper_); - - sim_ptr->integrator_ = settings->integrator; - - OpenMM::Platform::loadPluginsFromDirectory (settings->openmm_plugin_directory); - OpenMM::Platform::loadPluginsFromDirectory (settings->custom_plugin_directory); - OpenMM::Platform* platform; - switch(settings->platform){ - case Reference:{ - platform = &OpenMM::Platform::getPlatformByName("Reference"); - break; - } - case OpenCL:{ - platform = &OpenMM::Platform::getPlatformByName("OpenCL"); - break; - } - case CUDA:{ - platform = &OpenMM::Platform::getPlatformByName("CUDA"); - break; - } - case CPU:{ - platform = &OpenMM::Platform::getPlatformByName("CPU"); - break; - } - default:{ - throw ost::Error("Invalid Platform when Loading simulation!"); - } - } - - sim_ptr->context_ = ContextPtr(new OpenMM::Context(*(sim_ptr->system_), - *(sim_ptr->integrator_), - *platform)); - - std::vector<OpenMM::Vec3> positions; - OpenMM::Vec3 open_mm_vec; - Real a,b,c; - for(int i = 0; i < sim_ptr->system_->getNumParticles(); ++i){ - ds & a; - ds & b; - ds & c; - open_mm_vec[0] = a; - open_mm_vec[1] = b; - open_mm_vec[2] = c; - positions.push_back(open_mm_vec); - } - sim_ptr->context_->setPositions(positions); + SimulationPtr sim_ptr(new Simulation); + TopologyPtr top(new Topology); + ds >> *top; uint num_chains; uint num_residues; uint num_atoms; uint num_bonded_atoms; - Real x_pos; - Real y_pos; - Real z_pos; Real bfac; Real occ; bool is_hetatm; @@ -238,19 +176,16 @@ SimulationPtr Simulation::Load(const String& filename, SettingsPtr settings){ for(uint k = 0; k < num_atoms; ++k){ ds & atom_name; ds & atom_element; - ds & x_pos; - ds & y_pos; - ds & z_pos; ds & bfac; ds & occ; ds & is_hetatm; - geom::Vec3 pos(x_pos,y_pos,z_pos); - ed.InsertAtom(res,atom_name,pos,atom_element,occ,bfac,is_hetatm); + ed.InsertAtom(res, atom_name, geom::Vec3(0.0,0.0,0.0), + atom_element, occ, bfac, is_hetatm); } } } - sim_ptr->ent_ = ent; - sim_ptr->atom_list_ = sim_ptr->ent_.GetAtomList(); + + sim_ptr->Init(top, ent, settings); for(uint i = 0; i < sim_ptr->atom_list_.size(); ++i){ ds & num_bonded_atoms; @@ -260,7 +195,10 @@ SimulationPtr Simulation::Load(const String& filename, SettingsPtr settings){ } } + // also loads the positions that have been set in the context + // they get mapped over to the attached entity sim_ptr->context_->loadCheckpoint(stream); + sim_ptr->UpdatePositions(); return sim_ptr; }