diff --git a/modules/gfx/pymod/export_render_options.cc b/modules/gfx/pymod/export_render_options.cc index 113d364cb3a3b5573353077c040822bd0b603c86..51e9829c7ca6fa7ae4d2d80fce7d2bf430c072fd 100644 --- a/modules/gfx/pymod/export_render_options.cc +++ b/modules/gfx/pymod/export_render_options.cc @@ -123,6 +123,8 @@ void export_RenderOptions() .def("GetNormalSmoothFactor", &TraceRenderOptions::GetNormalSmoothFactor) .def("SetTubeRadius", &TraceRenderOptions::SetTubeRadius) .def("GetTubeRadius", &TraceRenderOptions::GetTubeRadius) + .def("SetRadius", &TraceRenderOptions::SetTubeRadius) + .def("GetRadius", &TraceRenderOptions::GetTubeRadius) ; } diff --git a/modules/gfx/pymod/export_scene.cc b/modules/gfx/pymod/export_scene.cc index e39c87232410d7fb0d2d82a4c2b4b189e40f64a0..267c07e01fa76d2ff39f1996b8273b537ac5db8b 100644 --- a/modules/gfx/pymod/export_scene.cc +++ b/modules/gfx/pymod/export_scene.cc @@ -124,6 +124,8 @@ void export_Scene() .def("SetShadow",&Scene::SetShadow) .def("SetShadowQuality",&Scene::SetShadowQuality) .def("AttachObserver",&Scene::AttachObserver) + .def("StartOffscreenMode",&Scene::StartOffscreenMode) + .def("StopOffscreenMode",&Scene::StopOffscreenMode) .def("__getitem__",scene_getitem) .add_property("bg", &Scene::GetBackground, diff --git a/modules/gfx/pymod/wrap_gfx.cc b/modules/gfx/pymod/wrap_gfx.cc index dd2049702cb4ca0d643517dce0de21917630ae6c..1c8ca00655a03830eaed53a3e6c9f1a407395956 100644 --- a/modules/gfx/pymod/wrap_gfx.cc +++ b/modules/gfx/pymod/wrap_gfx.cc @@ -23,7 +23,9 @@ using namespace boost::python; #include <ost/gfx/prim_list.hh> #include <ost/gfx/gradient.hh> #include <ost/gfx/gfx_test_object.hh> - +#if OST_SHADER_SUPPORT_ENABLED +#include <ost/gfx/shader.hh> +#endif #include <boost/python/suite/indexing/vector_indexing_suite.hpp> extern void export_Scene(); @@ -170,6 +172,15 @@ BOOST_PYTHON_MODULE(_gfx) .def("GetRel", &Stop::GetRel) ; +#if OST_SHADER_SUPPORT_ENABLED + class_<Shader, boost::noncopyable>("Shader", no_init) + .def("Instance",&Shader::Instance, + return_value_policy<reference_existing_object>()).staticmethod("Instance") + .def("PushProgram",&Shader::PushProgram) + .def("PopProgram",&Shader::PopProgram) + .def("Activate",&Shader::Activate) + ; +#endif export_primitives(); } diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc index 4a315636d76f722136485e79f5c1e40f24a0bd39..e6cd329a4a2fd08b5f8b80f51098893f92db8de1 100644 --- a/modules/gfx/src/scene.cc +++ b/modules/gfx/src/scene.cc @@ -293,7 +293,7 @@ void Scene::InitGL() void Scene::RequestRedraw() { - if (win_) { + if (win_ && !offscreen_flag_) { win_->DoRefresh(); } } @@ -545,6 +545,37 @@ namespace { GfxObjP node; }; +#if 0 + struct RegexFindObj: public GfxNodeVisitor { + RegexFindObj(const String& rs): reg(), valid(false), node() { + try { + reg = boost::regex(rs); + valid = true; + } catch (boost::regex_error& e) { + LOGN_ERROR("invalid regex"); + } + } + + virtual bool VisitNode(GfxNode* n, const Stack& st) { + return true; + } + + virtual void VisitObject(GfxObj* o, const Stack& st) { + if(boost::regex_match(o->GetName(),reg)) { + GfxNodeP nn = o->shared_from_this(); + GfxObjP oo = dyn_cast<GfxObj>(nn); + if(oo) { + olist.push_back(oo); + } + } + } + + boost::regex reg; + bool valid; + std::vector<GfxObjP> olist; + }; +#endif + struct FindNode2: public GfxNodeVisitor { FindNode2(GfxNodeP n): node(n), found(false) {} virtual bool VisitNode(GfxNode* n, const Stack& st) { @@ -584,6 +615,14 @@ void Scene::Add(const GfxNodeP& n, bool redraw) } LOG_DEBUG("scene: graphical object added @" << n.get() << std::endl); + + if(root_node_->GetChildCount()==0) { + GfxObjP go = boost::dynamic_pointer_cast<GfxObj>(n); + if(go) { + SetCenter(go->GetCenter()); + } + } + root_node_->Add(n); if (redraw) { this->RequestRedraw(); @@ -1162,6 +1201,55 @@ uint Scene::GetSelectionMode() const return selection_mode_; } +void Scene::StartOffscreenMode(unsigned int width, unsigned int height) +{ + if(main_offscreen_buffer_) return; + main_offscreen_buffer_ = new OffscreenBuffer(width,height,OffscreenBufferFormat(),true); + + if(!main_offscreen_buffer_->IsValid()) { + LOGN_ERROR("error during offscreen buffer creation"); + delete main_offscreen_buffer_; + main_offscreen_buffer_=0; + return; + } + old_vp_[0]=vp_width_; + old_vp_[1]=vp_height_; + main_offscreen_buffer_->MakeActive(); + offscreen_flag_=true; + root_node_->ContextSwitch(); + +#if OST_SHADER_SUPPORT_ENABLED + String shader_name = Shader::Instance().GetCurrentName(); +#endif + LOGN_DEBUG("initializing GL"); + this->InitGL(); + LOGN_DEBUG("setting viewport"); + Resize(width,height); + LOGN_DEBUG("updating fog settings"); + update_fog(); + glDrawBuffer(GL_FRONT); +#if OST_SHADER_SUPPORT_ENABLED + LOGN_DEBUG("activating shader"); + Shader::Instance().Activate(shader_name); +#endif +} + +void Scene::StopOffscreenMode() +{ + if(main_offscreen_buffer_) { + if (win_) { + win_->MakeActive(); + } + delete main_offscreen_buffer_; + main_offscreen_buffer_=0; + Scene::Instance().SetViewport(old_vp_[0],old_vp_[1]); + offscreen_flag_=false; + root_node_->ContextSwitch(); + glDrawBuffer(GL_BACK); + update_fog(); + } +} + void Scene::Export(const String& fname, unsigned int width, unsigned int height, bool transparent) { @@ -1176,80 +1264,94 @@ void Scene::Export(const String& fname, unsigned int width, return; } - LOGN_DEBUG("switching to offscreen rendering"); - bool old_flag=offscreen_flag_; GLint old_vp[4]; glGetIntegerv(GL_VIEWPORT,old_vp); - try { - OffscreenBuffer ob(width,height,OffscreenBufferFormat(),true); - - if(!ob.IsValid()) { - LOGN_ERROR("error during offscreen buffer creation"); - return; - } - - ob.MakeActive(); - offscreen_flag_=true; - root_node_->ContextSwitch(); + bool old_flag=offscreen_flag_; + if(!main_offscreen_buffer_) { + LOGN_DEBUG("switching to offscreen rendering"); + glGetIntegerv(GL_VIEWPORT,old_vp); + try { + OffscreenBuffer ob(width,height,OffscreenBufferFormat(),true); + + if(!ob.IsValid()) { + LOGN_ERROR("error during offscreen buffer creation"); + return; + } + + ob.MakeActive(); + offscreen_flag_=true; + root_node_->ContextSwitch(); #if 1 #if OST_SHADER_SUPPORT_ENABLED - String shader_name = Shader::Instance().GetCurrentName(); + String shader_name = Shader::Instance().GetCurrentName(); #endif - LOGN_DEBUG("initializing GL"); - this->InitGL(); - LOGN_DEBUG("setting viewport"); - SetViewport(width,height); - LOGN_DEBUG("reseting projection"); - ResetProjection(); - LOGN_DEBUG("updating fog settings"); - update_fog(); - glDrawBuffer(GL_FRONT); - //this->flag_all_dirty(); + LOGN_DEBUG("initializing GL"); + this->InitGL(); + LOGN_DEBUG("setting viewport"); + SetViewport(width,height); + LOGN_DEBUG("reseting projection"); + ResetProjection(); + LOGN_DEBUG("updating fog settings"); + update_fog(); + glDrawBuffer(GL_FRONT); + //this->flag_all_dirty(); #if OST_SHADER_SUPPORT_ENABLED - LOGN_DEBUG("activating shader"); - Shader::Instance().Activate(shader_name); + LOGN_DEBUG("activating shader"); + Shader::Instance().Activate(shader_name); #endif #endif - LOGN_DEBUG("doing rendering"); - this->RenderGL(); - // make sure drawing operations are finished - glFinish(); - boost::shared_array<uchar> img_data(new uchar[width*height*4]); - - LOGN_DEBUG("setting background transparency"); - if (transparent) { - glPixelTransferf(GL_ALPHA_BIAS, 0.0); - } else { - // shift alpha channel by one to make sure pixels are read out as opaque - glPixelTransferf(GL_ALPHA_BIAS, 1.0); + } catch (std::exception& e) { + LOGN_ERROR("exception during offscreen rendering: " << e.what()); + throw; + // noop } + } + LOGN_DEBUG("doing rendering"); + this->RenderGL(); + // make sure drawing operations are finished + glFinish(); - LOGN_DEBUG("reading framebuffer pixels"); - glReadBuffer(GL_FRONT); - glReadPixels(0,0,width,height,GL_RGBA,GL_UNSIGNED_BYTE,img_data.get()); - - LOGN_DEBUG("calling bitmap export"); - BitmapExport(fname,ext,width,height,img_data.get()); - } catch (std::exception& e) { - LOGN_ERROR("exception during offscreen rendering: " << e.what()); - throw; - // noop + unsigned int width2=width; + unsigned int height2=height; + if(!main_offscreen_buffer_) { + width2=old_vp[2]; + height2=old_vp[3]; } - LOGN_DEBUG("switching back to main context"); - if(main_offscreen_buffer_) { - main_offscreen_buffer_->MakeActive(); - } else if (win_) { - win_->MakeActive(); + boost::shared_array<uchar> img_data(new uchar[width2*height2*4]); + + LOGN_DEBUG("setting background transparency"); + if (transparent) { + glPixelTransferf(GL_ALPHA_BIAS, 0.0); } else { - LOGN_ERROR("erm, no context to fall back to"); - return; + // shift alpha channel by one to make sure pixels are read out as opaque + glPixelTransferf(GL_ALPHA_BIAS, 1.0); + } + + LOGN_DEBUG("reading framebuffer pixels"); + glReadBuffer(GL_FRONT); + glReadPixels(0,0,width2,height2,GL_RGBA,GL_UNSIGNED_BYTE,img_data.get()); + + LOGN_DEBUG("calling bitmap export"); + BitmapExport(fname,ext,width2,height2,img_data.get()); + + + if(!main_offscreen_buffer_) { + LOGN_DEBUG("switching back to main context"); + if(main_offscreen_buffer_) { + main_offscreen_buffer_->MakeActive(); + } else if (win_) { + win_->MakeActive(); + } else { + LOGN_ERROR("erm, no context to fall back to"); + return; + } + Scene::Instance().SetViewport(old_vp[2],old_vp[3]); + offscreen_flag_=old_flag; + root_node_->ContextSwitch(); + glDrawBuffer(GL_BACK); + LOGN_DEBUG("updating fog"); + update_fog(); } - Scene::Instance().SetViewport(old_vp[2],old_vp[3]); - offscreen_flag_=old_flag; - root_node_->ContextSwitch(); - glDrawBuffer(GL_BACK); - LOGN_DEBUG("updating fog"); - update_fog(); } void Scene::Export(const String& fname, bool transparent) diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh index abcd7a9483bc2676033a3d0033b11c77ad421df0..e4ea2c5e99b2fffacd1f25b5a74b8cf24d4d334f 100644 --- a/modules/gfx/src/scene.hh +++ b/modules/gfx/src/scene.hh @@ -330,6 +330,9 @@ class DLLEXPORT_OST_GFX Scene { float ElapsedTime() const; Viewport GetViewport() const; + + void StartOffscreenMode(unsigned int w, unsigned int h); + void StopOffscreenMode(); // temporary interface void ActivateShader(const String& name); @@ -394,6 +397,7 @@ private: bool offscreen_flag_; OffscreenBuffer* main_offscreen_buffer_; + uint old_vp_[2]; uint selection_mode_; diff --git a/modules/io/pymod/__init__.py b/modules/io/pymod/__init__.py index 82ab97c27b96400ea16d1bf5db285af1fea57c5b..996ff1ffcb76a3dddbd6b8b08bbee7e73b72fbe3 100644 --- a/modules/io/pymod/__init__.py +++ b/modules/io/pymod/__init__.py @@ -52,21 +52,27 @@ def LoadPDB(filename, restrict_chains="", no_hetatms=False, flags|=PDB.NO_HETATMS if join_spread_atom_records: flags|=PDB.JOIN_SPREAD_ATOM_RECORDS - reader.SetFlags(flags) - if load_multi: - ent_list=[] - while reader.HasNext(): - ent=mol.CreateEntity() - reader.Import(ent, restrict_chains) - conop_inst.ConnectAll(builder, ent, 0) - ent_list.append(ent) - return ent_list - else: - ent=mol.CreateEntity() - if reader.HasNext(): - reader.Import(ent, restrict_chains) - conop_inst.ConnectAll(builder, ent, 0) - return ent + try: + PDB.PushFlags(PDB.Flags() | flags) + if load_multi: + ent_list=[] + while reader.HasNext(): + ent=mol.CreateEntity() + reader.Import(ent, restrict_chains) + conop_inst.ConnectAll(builder, ent, 0) + ent_list.append(ent) + PDB.PopFlags() + return ent_list + else: + ent=mol.CreateEntity() + if reader.HasNext(): + reader.Import(ent, restrict_chains) + conop_inst.ConnectAll(builder, ent, 0) + PDB.PopFlags() + return ent + except: + PDB.PopFlags() + raise def SavePDB(models, filename): """ diff --git a/modules/io/pymod/export_pdb_io.cc b/modules/io/pymod/export_pdb_io.cc index 6cc80b813ca1c95fca26604b91f93012684390e4..fe2a3a75f0635e36dbab85cc4157bacb696151d6 100644 --- a/modules/io/pymod/export_pdb_io.cc +++ b/modules/io/pymod/export_pdb_io.cc @@ -31,26 +31,38 @@ BOOST_PYTHON_FUNCTION_OVERLOADS(load_PDB_ov, LoadPDB, 1, 2) void (PDBWriter::*write_a)(const mol::EntityHandle&)=&PDBWriter::Write; void (PDBWriter::*write_b)(const mol::EntityView&)=&PDBWriter::Write; + +namespace { + void push_flags(unsigned int x) {PDB::PushFlags(x);} + unsigned int flags() {return PDB::Flags();} + void pop_flags() {PDB::PopFlags();} +} + void export_pdb_io() { - enum_<PDB::Type>("PDB") - .value("NO_HETATMS", PDB::NO_HETATMS) - .value("SKIP_FAULTY_RECORDS", PDB::SKIP_FAULTY_RECORDS) - .value("WRITE_MULTIPLE_MODELS", PDB::WRITE_MULTIPLE_MODELS) - .value("JOIN_SPREAD_ATOM_RECORDS", PDB::JOIN_SPREAD_ATOM_RECORDS) - .value("SEQUENTIAL_ATOM_IMPORT", PDB::SEQUENTIAL_ATOM_IMPORT) - ; + { + scope pdb_scope=class_<PDB>("PDB",no_init) + .def("PushFlags",&PDB::PushFlags) + .staticmethod("PushFlags") + .def("Flags",&PDB::Flags) + .staticmethod("Flags") + .def("PopFlags",&PDB::PopFlags) + .staticmethod("PopFlags") + ; + pdb_scope.attr("NO_HETATMS")=PDB::NO_HETATMS; + pdb_scope.attr("SKIP_FAULTY_RECORDS")=PDB::SKIP_FAULTY_RECORDS; + pdb_scope.attr("WRITE_MULTIPLE_MODELS")=PDB::WRITE_MULTIPLE_MODELS; + pdb_scope.attr("JOIN_SPREAD_ATOM_RECORDS")=PDB::JOIN_SPREAD_ATOM_RECORDS; + } + class_<PDBReader, boost::noncopyable>("PDBReader", init<String>()) .def("HasNext", &PDBReader::HasNext) .def("Import", &PDBReader::Import, X_import(args("entity", "restrict_chains"))) - .def("SetFlags", &PDBReader::SetFlags) - .def("GetSequentialAtoms", &PDBReader::GetSequentialAtoms) ; class_<PDBWriter, boost::noncopyable>("PDBWriter", init<String>()) .def("Write", write_a) .def("Write", write_b) - .def("SetFlags", &PDBWriter::SetFlags) ; } diff --git a/modules/io/pymod/wrap_io.cc b/modules/io/pymod/wrap_io.cc index 79920189ef60ba1cb71c122bb566907291646bef..b04d3ac78ab729a8125fd258f9b7de89c2f15653 100644 --- a/modules/io/pymod/wrap_io.cc +++ b/modules/io/pymod/wrap_io.cc @@ -28,6 +28,7 @@ using namespace boost::python; #include <ost/io/seq/save.hh> #include <ost/io/mol/entity_io_pdb_handler.hh> #include <ost/io/mol/entity_io_crd_handler.hh> +#include <ost/io/mol/entity_io_mae_handler.hh> #include <ost/io/mol/entity_io_sdf_handler.hh> #include <ost/io/mol/pdb_reader.hh> #include <ost/io/mol/dcd_io.hh> @@ -120,6 +121,9 @@ BOOST_PYTHON_MODULE(_io) def("LoadCHARMMTraj",load_dcd3); def("LoadCHARMMTraj",load_dcd4); def("SaveCHARMMTraj",SaveCHARMMTraj,save_charmm_trj_ov()); + + def("LoadMAE", &LoadMAE); + export_pdb_io(); #if OST_IMG_ENABLED export_map_io(); diff --git a/modules/io/src/io_manager.cc b/modules/io/src/io_manager.cc index 23ab54bd29a2bc3efe72085ac9f9242b80c7a69f..b03169d8c84e49f80a7af74c23cf2780d20928b3 100644 --- a/modules/io/src/io_manager.cc +++ b/modules/io/src/io_manager.cc @@ -20,6 +20,7 @@ #include <ost/io/mol/entity_io_pdb_handler.hh> #include <ost/io/mol/entity_io_crd_handler.hh> #include <ost/io/mol/entity_io_sdf_handler.hh> +#include <ost/io/mol/entity_io_mae_handler.hh> #include <ost/io/seq/fasta_io_handler.hh> #include <ost/io/seq/promod_io_handler.hh> #include <ost/io/mol/surface_io_msms_handler.hh> @@ -43,6 +44,7 @@ IOManager::IOManager() RegisterFactory(EntityIOHandlerFactoryBaseP(new EntityIOPDBHandlerFactory)); RegisterFactory(EntityIOHandlerFactoryBaseP(new EntityIOCRDHandlerFactory)); RegisterFactory(EntityIOHandlerFactoryBaseP(new EntityIOSDFHandlerFactory)); + RegisterFactory(EntityIOHandlerFactoryBaseP(new EntityIOMAEHandlerFactory)); RegisterFactory(SequenceIOHandlerFactoryBasePtr(new FastaIOHandlerFactory)); RegisterFactory(SequenceIOHandlerFactoryBasePtr(new ClustalIOHandlerFactory)); RegisterFactory(SequenceIOHandlerFactoryBasePtr(new PromodIOHandlerFactory)); diff --git a/modules/io/src/mol/CMakeLists.txt b/modules/io/src/mol/CMakeLists.txt index b3fd346b6e87552242a509f853a0eb5ff093fd38..5cdf0462bb889d48a63a4d64092b0297d5270102 100644 --- a/modules/io/src/mol/CMakeLists.txt +++ b/modules/io/src/mol/CMakeLists.txt @@ -1,7 +1,9 @@ set(OST_IO_MOL_SOURCES entity_io_crd_handler.cc +entity_io_mae_handler.cc pdb_reader.cc entity_io_pdb_handler.cc +pdb_io.cc pdb_writer.cc entity_io_sdf_handler.cc save_entity.cc @@ -17,6 +19,7 @@ set(OST_IO_MOL_HEADERS star_parser.hh dcd_io.hh entity_io_crd_handler.hh +entity_io_mae_handler.hh pdb_io.hh entity_io_handler.hh pdb_reader.hh diff --git a/modules/io/src/mol/dcd_io.cc b/modules/io/src/mol/dcd_io.cc index efe9f1dfb368cc888c5785279af00ee8510a3fb7..c580ce1b244361b28e85199f2c206f3d8c61c1be 100644 --- a/modules/io/src/mol/dcd_io.cc +++ b/modules/io/src/mol/dcd_io.cc @@ -22,6 +22,8 @@ */ #include <fstream> +#include <algorithm> + #include <boost/iostreams/filter/gzip.hpp> #include <boost/filesystem/convenience.hpp> @@ -31,12 +33,13 @@ #include <ost/conop/conop.hh> #include <ost/mol/xcs_editor.hh> +#include <ost/io/io_exception.hh> +#include <ost/io/swap_util.hh> +#include "load_entity.hh" #include "dcd_io.hh" #include "pdb_reader.hh" #include "pdb_writer.hh" #include "entity_io_crd_handler.hh" -#include <ost/io/io_exception.hh> -#include <ost/io/swap_util.hh> namespace ost { namespace io { @@ -58,12 +61,20 @@ struct DCDHeader { int t_atom_count,f_atom_count, atom_count; }; -mol::CoordGroupHandle load_dcd(const mol::AtomHandleList& alist, +bool less_index(const mol::AtomHandle& a1, const mol::AtomHandle& a2) +{ + return a1.GetIndex()<a2.GetIndex(); +} + +mol::CoordGroupHandle load_dcd(const mol::AtomHandleList& alist2, const String& trj_fn, unsigned int stride) { Profile profile_load("LoadCHARMMTraj"); + mol::AtomHandleList alist(alist2); + std::sort(alist.begin(),alist.end(),less_index); + bool gap_flag = true; boost::filesystem::path trj_f(trj_fn); @@ -121,7 +132,7 @@ mol::CoordGroupHandle load_dcd(const mol::AtomHandleList& alist, header.f_atom_count=header.icntrl[8]; header.atom_count=header.t_atom_count-header.f_atom_count; - LOGN_MESSAGE("LoadCHARMMTraj: " << header.num << " trajectories with " + LOGN_DEBUG("LoadCHARMMTraj: " << header.num << " trajectories with " << header.atom_count << " atoms (" << header.f_atom_count << " fixed) each"); @@ -136,7 +147,8 @@ mol::CoordGroupHandle load_dcd(const mol::AtomHandleList& alist, std::vector<geom::Vec3> clist(header.t_atom_count); std::vector<float> xlist(header.t_atom_count); - for(int i=0;i<header.num;++i) { + int i=0; + for(;i<header.num;++i) { if(skip_flag) ff.seekg(14*4,std::ios_base::cur); // read each frame if(!ff) { @@ -169,9 +181,9 @@ mol::CoordGroupHandle load_dcd(const mol::AtomHandleList& alist, for(uint j=0;j<clist.size();++j) { clist[j].SetZ(xlist[j]); } - if(i%stride) { - cg.AddFrame(clist); - } + + cg.AddFrame(clist); + } ff.get(); @@ -179,6 +191,9 @@ mol::CoordGroupHandle load_dcd(const mol::AtomHandleList& alist, LOGN_VERBOSE("LoadCHARMMTraj: unexpected trailing file data, bytes read: " << ff.tellg()); } + + LOGN_VERBOSE("Loaded " << cg.GetFrameCount() << " frames with " << cg.GetAtomCount() << " atoms each"); + return cg; } @@ -188,30 +203,8 @@ mol::CoordGroupHandle LoadCHARMMTraj(const String& crd_fn, const String& trj_fn, unsigned int stride) { - boost::filesystem::path crd_f(crd_fn); - - // first the coordinate reference file - conop::BuilderP builder = conop::Conopology::Instance().GetBuilder(); - mol::EntityHandle ent=mol::CreateEntity(); - mol::XCSEditor editor=ent.RequestXCSEditor(mol::BUFFERED_EDIT); - std::vector<mol::AtomHandle> alist; - if(boost::filesystem::extension(crd_f)==".pdb") { - PDBReader reader(crd_f); - reader.SetFlags(PDB::SEQUENTIAL_ATOM_IMPORT); - LOGN_MESSAGE("importing coordinate data"); - reader.Import(ent); - alist = reader.GetSequentialAtoms(); - } else if (boost::filesystem::extension(crd_f)==".crd") { - CRDReader reader(crd_f); - LOGN_MESSAGE("importing coordinate data"); - reader.Import(ent); - alist = reader.GetSequentialAtoms(); - } else { - throw(IOException("unsupported coordinate file format")); - } - conop::Conopology::Instance().ConnectAll(builder,ent); - - return load_dcd(alist,trj_fn,stride); + mol::EntityHandle ent=LoadEntity(crd_fn); + return load_dcd(ent.GetAtomList(),trj_fn,stride); } diff --git a/modules/io/src/mol/entity_io_crd_handler.cc b/modules/io/src/mol/entity_io_crd_handler.cc index ce4a1679b765cc8aa13fbddb873b82c33f427871..cfbb7efccbc7986a61b903409c90755b4fe17a1f 100644 --- a/modules/io/src/mol/entity_io_crd_handler.cc +++ b/modules/io/src/mol/entity_io_crd_handler.cc @@ -43,9 +43,6 @@ namespace ost { namespace io { using boost::format; -String FORMAT_NAME_STRING; -String FORMAT_DESCRIPTION_STRING; - CRDReader::CRDReader(const boost::filesystem::path& loc): sequential_atom_list_(), curr_chain_(), diff --git a/modules/io/src/mol/entity_io_pdb_handler.cc b/modules/io/src/mol/entity_io_pdb_handler.cc index ca64835e7372b51d8b7089d0197ce47cb04c6f96..99b8ea49560a7dbe9ef2ca79ab9dbbc855c94dbe 100644 --- a/modules/io/src/mol/entity_io_pdb_handler.cc +++ b/modules/io/src/mol/entity_io_pdb_handler.cc @@ -50,9 +50,12 @@ void EntityIOPDBHandler::Export(const mol::EntityView& ent, { PDBWriter writer(loc); if (boost::iequals(boost::filesystem::extension(loc), ".pqr")) { - writer.SetFlags(PDB::PQR_FORMAT); + PDB::PushFlags(PDB::Flags() | PDB::PQR_FORMAT); + writer.Write(ent); + PDB::PopFlags(); + } else { + writer.Write(ent); } - writer.Write(ent); } void EntityIOPDBHandler::Import(mol::EntityHandle& ent, diff --git a/modules/io/src/mol/pdb_io.hh b/modules/io/src/mol/pdb_io.hh index 140db87e3648055a3bff689f18657da8cceb820e..bc295a84688878b8ff97b3e71854a423512fea06 100644 --- a/modules/io/src/mol/pdb_io.hh +++ b/modules/io/src/mol/pdb_io.hh @@ -19,22 +19,28 @@ #ifndef OST_IO_PDB_IO_HH #define OST_IO_PDB_IO_HH +#include <stack> + namespace ost { namespace io { + /// \brief flags that incluence the behaviour of the PDBReader and PDBWriter struct PDB { - typedef enum { + /// \brief skip faulty records - /// /// This flag tells the PDB loader to ignore faulty records. By default, /// faulty records abort import. - SKIP_FAULTY_RECORDS=1, + static const unsigned int SKIP_FAULTY_RECORDS; + /// \brief do not import HETATM records - NO_HETATMS=2, + static const unsigned int NO_HETATMS; + /// \brief enable writing of multiple models - WRITE_MULTIPLE_MODELS=4, + static const unsigned int WRITE_MULTIPLE_MODELS; + /// \brief enable for PQR - PQR_FORMAT=8, + static const unsigned int PQR_FORMAT; + /// \brief Join atom records into one residue, even if the atom records /// are not sequential. /// @@ -57,20 +63,19 @@ struct PDB { /// /// By default, the atom 550 will start a new residue instead of being /// joined with atoms 43-48 into one residue. - JOIN_SPREAD_ATOM_RECORDS=16, - //// \brief keep track of the order of atom records - /// - /// This option is mostly useful in combination with - /// PDB::JOIN_SPREAD_ATOM_RECORDS and CoordGroups. - /// - /// The atoms are accessible via PDBReader::GetSequentialAtoms() - SEQUENTIAL_ATOM_IMPORT=32, + static const unsigned int JOIN_SPREAD_ATOM_RECORDS; + /// \brief only import C-alpha atoms - CALPHA_ONLY=64 - } Type; -}; + static const unsigned int CALPHA_ONLY; -typedef unsigned int PDBFlags; + static void PushFlags(unsigned int flags); + static unsigned int Flags(); + static void PopFlags(); + + static PDB& Instance(); + + std::stack<unsigned int> fstack; +}; }} diff --git a/modules/io/src/mol/pdb_reader.cc b/modules/io/src/mol/pdb_reader.cc index fa0357bedd93f340e62e393803b5c19af8ff2a78..a2ce79cd12998a98f8e4cccb139cd967bebd5455 100644 --- a/modules/io/src/mol/pdb_reader.cc +++ b/modules/io/src/mol/pdb_reader.cc @@ -62,19 +62,19 @@ mol::ResNum to_res_num(int num, char ins_code) } PDBReader::PDBReader(std::istream& instream): - infile_(), instream_(instream), flags_(0) + infile_(), instream_(instream) { this->Init(boost::filesystem::path("")); } PDBReader::PDBReader(const String& filename) - : infile_(filename), instream_(infile_), flags_(0) + : infile_(filename), instream_(infile_) { this->Init(boost::filesystem::path(filename)); } PDBReader::PDBReader(const boost::filesystem::path& loc): - infile_(loc), instream_(infile_), flags_(0) + infile_(loc), instream_(infile_) { this->Init(loc); } @@ -107,7 +107,7 @@ bool PDBReader::HasNext() StringRef curr_line(curr_line_.c_str(), curr_line_.length()); if (curr_line.size()>5 && (IEquals(curr_line.substr(0, 6), StringRef("ATOM ", 6)) || - (!(flags_ & PDB::NO_HETATMS) && + (!(PDB::Flags() & PDB::NO_HETATMS) && IEquals(curr_line.substr(0, 6),StringRef("HETATM ", 6))) || IEquals(curr_line.substr(0, 6),StringRef("ANISOU ", 6)) || IEquals(curr_line.substr(0, 6), StringRef("SHEET ", 6)) || @@ -124,6 +124,8 @@ bool PDBReader::HasNext() void PDBReader::Import(mol::EntityHandle& ent, const String& restrict_chains) { + LOGN_DEBUG("PDBReader: current flags: " << PDB::Flags()); + Profile profile_import("PDBReader::Import"); this->ClearState(); // first read curr_line and then read next... @@ -172,7 +174,7 @@ void PDBReader::Import(mol::EntityHandle& ent, continue; } if (IEquals(curr_line.substr(0, 6), StringRef("HETATM", 6))) { - if (flags_ & PDB::NO_HETATMS) + if (PDB::Flags() & PDB::NO_HETATMS) continue; LOGN_TRACE("processing HETATM entry"); this->ParseAndAddAtom(curr_line, line_num_, ent, @@ -251,17 +253,6 @@ void PDBReader::ClearState() hard_end_=false; helix_list_.clear(); strand_list_.clear(); - sequential_atom_list_.clear(); -} - -std::vector<mol::AtomHandle> PDBReader::GetSequentialAtoms() const -{ - return sequential_atom_list_; -} - -void PDBReader::SetFlags(PDBFlags flags) -{ - flags_=flags; } bool PDBReader::ParseAtomIdent(const StringRef& line, int line_num, @@ -277,7 +268,7 @@ bool PDBReader::ParseAtomIdent(const StringRef& line, int line_num, std::pair<bool, int> a_num=line.substr(6, 5).ltrim().to_int(); if (!a_num.first) { - if (flags_ & PDB::SKIP_FAULTY_RECORDS) { + if (PDB::Flags() & PDB::SKIP_FAULTY_RECORDS) { return false; } throw IOException(str(format("invalid atom number on line %d") %line_num)); @@ -287,7 +278,7 @@ bool PDBReader::ParseAtomIdent(const StringRef& line, int line_num, res_name=line.substr(17, 3).trim(); std::pair<bool, int> res_num=line.substr(22, 4).ltrim().to_int();; if (!res_num.first) { - if (flags_ & PDB::SKIP_FAULTY_RECORDS) { + if (PDB::Flags() & PDB::SKIP_FAULTY_RECORDS) { return false; } throw IOException(str(format("invalid res number on line %d") % line_num)); @@ -312,7 +303,7 @@ void PDBReader::ParseAnisou(const StringRef& line, int line_num, for (int i=0;i<6; ++i) { std::pair<bool, int> result=line.substr(29+i*7, 6).to_int(); if (!result.first) { - if (flags_ & PDB::SKIP_FAULTY_RECORDS) { + if (PDB::Flags() & PDB::SKIP_FAULTY_RECORDS) { return; } throw IOException(str(format("invalid ANISOU record on line %d")%line_num)); @@ -321,7 +312,7 @@ void PDBReader::ParseAnisou(const StringRef& line, int line_num, } String aname(atom_name.str()); if (!curr_residue_.IsValid()) { - if (flags_ & PDB::SKIP_FAULTY_RECORDS) { + if (PDB::Flags() & PDB::SKIP_FAULTY_RECORDS) { return; } const char* fmt_str="invalid ANISOU record for inexistent atom on line %d"; @@ -329,7 +320,7 @@ void PDBReader::ParseAnisou(const StringRef& line, int line_num, } mol::AtomHandle atom=curr_residue_.FindAtom(aname); if (!atom.IsValid()) { - if (flags_ & PDB::SKIP_FAULTY_RECORDS) { + if (PDB::Flags() & PDB::SKIP_FAULTY_RECORDS) { return; } const char* fmt_str="invalid ANISOU record for inexistent atom on line %d"; @@ -368,7 +359,7 @@ void PDBReader::ParseAndAddAtom(const StringRef& line, int line_num, for (int i=0;i<3; ++i) { std::pair<bool, float> result=line.substr(30+i*8, 8).ltrim().to_float(); if (!result.first) { - if (flags_ & PDB::SKIP_FAULTY_RECORDS) { + if (PDB::Flags() & PDB::SKIP_FAULTY_RECORDS) { return; } throw IOException(str(format("invalid coordinate on line %d")%line_num)); @@ -433,24 +424,31 @@ void PDBReader::ParseAndAddAtom(const StringRef& line, int line_num, } if(update_chain) { - if (!(curr_chain_=ent.FindChain(s_chain))) { + curr_chain_=mol::ChainHandle(); +#if 0 + // TODO: should this depend on JOIN_SPREAD as well? + if (PDB::Flags() & PDB::JOIN_SPREAD_ATOM_RECORDS) { + curr_chain_=ent.FindChain(s_chain); + } +#else + curr_chain_=ent.FindChain(s_chain); +#endif + if(!curr_chain_.IsValid()) { LOGN_DUMP("new chain " << s_chain); curr_chain_=editor.InsertChain(s_chain); ++chain_count_; } + assert(curr_chain_.IsValid()); } if(update_residue) { - if (flags_ & PDB::JOIN_SPREAD_ATOM_RECORDS) { + curr_residue_=mol::ResidueHandle(); + if (PDB::Flags() & PDB::JOIN_SPREAD_ATOM_RECORDS) { curr_residue_=curr_chain_.FindResidue(res_num); - if (!curr_residue_.IsValid()) { - LOGN_DUMP("new residue " << res_name << " " << res_num); - curr_residue_=editor.AppendResidue(curr_chain_, res_name.str(), res_num); - ++residue_count_; - } - } else { + } + if (!curr_residue_.IsValid()) { LOGN_DUMP("new residue " << res_name << " " << res_num); curr_residue_=editor.AppendResidue(curr_chain_, res_name.str(), res_num); - ++residue_count_; + ++residue_count_; } assert(curr_residue_.IsValid()); } @@ -494,16 +492,22 @@ void PDBReader::ParseAndAddAtom(const StringRef& line, int line_num, } else { mol::AtomHandle ah=editor.InsertAltAtom(curr_residue_, aname, String(1, alt_loc), apos, aprop); - if (flags_ & PDB::SEQUENTIAL_ATOM_IMPORT) { + /* + for now, this is not needed - the cg will use an global atom id sorted + list insteadx + if (PDB::Flags() & PDB::SEQUENTIAL_ATOM_IMPORT) { sequential_atom_list_.push_back(ah); } + */ ++atom_count_; } } else { mol::AtomHandle ah = editor.InsertAtom(curr_residue_, aname, apos, aprop); - if (flags_ & PDB::SEQUENTIAL_ATOM_IMPORT) { + /* + if (PDB::Flags() & PDB::SEQUENTIAL_ATOM_IMPORT) { sequential_atom_list_.push_back(ah); } + */ ++atom_count_; } } diff --git a/modules/io/src/mol/pdb_reader.hh b/modules/io/src/mol/pdb_reader.hh index 5c85e23a14a88e80d6229f728171914b9deaa6b9..6d9f715c6cd9071a471d33427464533bb6b29294 100644 --- a/modules/io/src/mol/pdb_reader.hh +++ b/modules/io/src/mol/pdb_reader.hh @@ -47,17 +47,7 @@ public: bool HasNext(); void Import(mol::EntityHandle& ent, - const String& restrict_chains=""); - void SetFlags(PDBFlags flags); - - /// \brief get list of atoms - /// - /// The atom handles reflect the order of atom records in the PDb files. This - /// is used to synchronize PDB and coordgroup io. - /// - /// By default, the atom list is empty, The PDB::SEQUENTIAL_ATOM_IMPORT flag - /// must be set. - std::vector<mol::AtomHandle> GetSequentialAtoms() const; + const String& restrict_chains=""); private: void ClearState(); @@ -90,8 +80,7 @@ private: std::istream& instream_; boost::iostreams::filtering_stream<boost::iostreams::input> in_; String curr_line_; - std::vector<mol::AtomHandle> sequential_atom_list_; - PDBFlags flags_; + // this needs to be set to true for reading pqr // file (i.e. pdb formatted file with charges in occupacy // column, and radii in b-factor column) diff --git a/modules/io/src/mol/pdb_writer.cc b/modules/io/src/mol/pdb_writer.cc index 8e461a56e95da8aa00b28ed6ef44b1be660b3745..36f9ce9e2f8fae5081204e6546f4077022313b54 100644 --- a/modules/io/src/mol/pdb_writer.cc +++ b/modules/io/src/mol/pdb_writer.cc @@ -123,27 +123,20 @@ private: PDBWriter::PDBWriter(std::ostream& stream): outfile_(), outstream_(stream) -{ - -} +{} PDBWriter::PDBWriter(const boost::filesystem::path& filename): - outfile_(filename.file_string().c_str()), outstream_(outfile_), mol_count_(0), - flags_(0) -{ - -} + outfile_(filename.file_string().c_str()), outstream_(outfile_), mol_count_(0) +{} PDBWriter::PDBWriter(const String& filename): - outfile_(filename.c_str()), outstream_(outfile_), mol_count_(0), flags_(0) -{ - -} + outfile_(filename.c_str()), outstream_(outfile_), mol_count_(0) +{} void PDBWriter::WriteModelLeader() { ++mol_count_; - if (flags_ & PDB::WRITE_MULTIPLE_MODELS) { + if (PDB::Flags() & PDB::WRITE_MULTIPLE_MODELS) { outstream_ << "MODEL " << mol_count_ << std::endl; } else if (mol_count_>1) { throw IOException("Please enable the PDB::WRITE_MULTIPLE_MODELS flag to " @@ -153,7 +146,7 @@ void PDBWriter::WriteModelLeader() void PDBWriter::WriteModelTrailer() { - if (flags_ & PDB::WRITE_MULTIPLE_MODELS) { + if (PDB::Flags() & PDB::WRITE_MULTIPLE_MODELS) { outstream_ << "ENDMDL" << std::endl; } } @@ -163,18 +156,13 @@ void PDBWriter::WriteModel(H ent) { this->WriteModelLeader(); PDBWriterImpl writer(outstream_); - if (flags_ & PDB::PQR_FORMAT) { + if (PDB::Flags() & PDB::PQR_FORMAT) { writer.SetIsPQR(true); } ent.Apply(writer); this->WriteModelTrailer(); } -void PDBWriter::SetFlags(PDBFlags flags) -{ - flags_=flags; -} - void PDBWriter::Write(const mol::EntityView& ent) { this->WriteModel(ent); @@ -199,7 +187,7 @@ void PDBWriter::Write(const mol::AtomHandleList& atoms) } last_chain=(*i).GetResidue().GetChain(); } - write_atom(outstream_, *i, counter, flags_ & PDB::PQR_FORMAT); + write_atom(outstream_, *i, counter, PDB::Flags() & PDB::PQR_FORMAT); } this->WriteModelTrailer(); } diff --git a/modules/io/src/mol/pdb_writer.hh b/modules/io/src/mol/pdb_writer.hh index 83f2f923e38ede6435bda01ab860a1421d907ec4..971890eeb66d75cba69453e1782a185b84a51d24 100644 --- a/modules/io/src/mol/pdb_writer.hh +++ b/modules/io/src/mol/pdb_writer.hh @@ -42,8 +42,6 @@ public: PDBWriter(const boost::filesystem::path& filename); PDBWriter(std::ostream& outstream); - void SetFlags(PDBFlags flags); - void Write(const mol::EntityView& ent); void Write(const mol::EntityHandle& ent); @@ -59,7 +57,6 @@ private: std::ofstream outfile_; std::ostream& outstream_; int mol_count_; - PDBFlags flags_; }; }} diff --git a/modules/io/tests/test_io_pdb.cc b/modules/io/tests/test_io_pdb.cc index 64f46c26b62a2bc508afe0d84a67376597b9fba8..7866377c2056932e99732b36d60fcdaceff3041d 100644 --- a/modules/io/tests/test_io_pdb.cc +++ b/modules/io/tests/test_io_pdb.cc @@ -91,10 +91,11 @@ BOOST_AUTO_TEST_CASE(join_spread_records_on) { String fname("testfiles/pdb/join-spread-records.pdb"); PDBReader reader(fname); - reader.SetFlags(PDB::JOIN_SPREAD_ATOM_RECORDS); mol::EntityHandle ent=mol::CreateEntity(); + PDB::PushFlags(PDB::JOIN_SPREAD_ATOM_RECORDS); reader.Import(ent); + PDB::PopFlags(); BOOST_CHECK_EQUAL(ent.GetResidueCount(), 2); mol::ResidueHandle res1=ent.FindResidue("A", mol::ResNum(1)); BOOST_CHECK(res1.IsValid()); @@ -124,4 +125,4 @@ BOOST_AUTO_TEST_CASE(join_spread_records_off) BOOST_CHECK(res2.FindAtom("N")); } -BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file +BOOST_AUTO_TEST_SUITE_END() diff --git a/modules/mol/base/pymod/export_atom.cc b/modules/mol/base/pymod/export_atom.cc index 52983f3ae26775d4014f16028925230a4cc31420..ccebbfb0adf0f9b7eb3aba0f10ba914ef68e987c 100644 --- a/modules/mol/base/pymod/export_atom.cc +++ b/modules/mol/base/pymod/export_atom.cc @@ -46,6 +46,7 @@ void export_Atom() .def("GetProp", &AtomBase::GetProp, return_value_policy<copy_const_reference>()) .def("SetProp", &AtomBase::SetProp, args("prop")) + .def("GetIndex", &AtomBase::GetIndex) .add_property("prop", make_function(&AtomBase::GetProp, return_value_policy<copy_const_reference>())) @@ -56,6 +57,7 @@ void export_Atom() make_function(&AtomBase::GetName, return_value_policy<copy_const_reference>()), &AtomBase::SetName) + .add_property("index",&AtomBase::GetIndex) ; generic_prop_def<AtomBase>(atom_base); diff --git a/modules/mol/base/pymod/export_residue.cc b/modules/mol/base/pymod/export_residue.cc index 615c6bc3d0b39551ab4a3c6e91279bdd04b7a3c1..1ff735cf642d3ca604a54d3dd5c45dca7517b3da 100644 --- a/modules/mol/base/pymod/export_residue.cc +++ b/modules/mol/base/pymod/export_residue.cc @@ -34,6 +34,10 @@ namespace { typedef EntityView (ResidueHandle::*StringMethod)(const String&, uint) const; QueryMethod select_query=&ResidueHandle::Select; StringMethod select_string=&ResidueHandle::Select; + + void set_sec_struct1(ResidueBase* b, const SecStructure& s) {b->SetSecStructure(s);} + void set_sec_struct2(ResidueBase* b, char c) {b->SetSecStructure(SecStructure(c));} + } //BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(X_insert_overloads, @@ -82,7 +86,8 @@ void export_Residue() class_<ResidueBase> residue_base("ResidueBase", no_init); residue_base .def("GetSecStructure", &ResidueBase::GetSecStructure) - .def("SetSecStructure", &ResidueBase::SetSecStructure) + .def("SetSecStructure", set_sec_struct1) + .def("SetSecStructure", set_sec_struct2) .def("GetPhiTorsion", &ResidueBase::GetPhiTorsion) .def("GetPsiTorsion", &ResidueBase::GetPsiTorsion) .def("GetOmegaTorsion", &ResidueBase::GetOmegaTorsion) diff --git a/modules/mol/base/src/atom_base.cc b/modules/mol/base/src/atom_base.cc index 95141733ff27a4ab798e67d9aa814b1d7201aa58..9a8cfb1fc0ce1438612555e2909c7be900fc7558 100644 --- a/modules/mol/base/src/atom_base.cc +++ b/modules/mol/base/src/atom_base.cc @@ -156,5 +156,11 @@ int AtomBase::GetIntProperty(Prop::ID prop_id) const return Impl()->GetIntProperty(prop_id); } +unsigned long AtomBase::GetIndex() const +{ + this->CheckValidity(); + return Impl()->GetIndex(); +} + }} // ns diff --git a/modules/mol/base/src/atom_base.hh b/modules/mol/base/src/atom_base.hh index 0a17ce2508b7a904e92e738de0fe72fbf4a7249b..3b10fb8ca241ff4aa5c452d0b86a63c2bb848127 100644 --- a/modules/mol/base/src/atom_base.hh +++ b/modules/mol/base/src/atom_base.hh @@ -116,7 +116,10 @@ public: /// \brief Get int property by id int GetIntProperty(Prop::ID prop_id) const; -public: + + /// \brief Get the internal index + unsigned long GetIndex() const; + /// \brief get atom implementation. /// /// Intended for internal use. diff --git a/modules/mol/base/src/coord_frame.hh b/modules/mol/base/src/coord_frame.hh index 4a04ca4e45ef0be5a7785e72c6198f046a960e42..017a58865a239a10bc7869ab4a2380047a528c85 100644 --- a/modules/mol/base/src/coord_frame.hh +++ b/modules/mol/base/src/coord_frame.hh @@ -29,17 +29,10 @@ namespace ost { namespace mol { -class CoordFrame; - +typedef std::vector<geom::Vec3> CoordFrame; typedef boost::shared_ptr<CoordFrame> CoordFramePtr; typedef std::vector<CoordFramePtr> CoordFrameList; -class DLLEXPORT_OST_MOL CoordFrame : public std::vector<geom::Vec3> { -public: - CoordFrame() {} - CoordFrame(Real ts) {} -}; - }} #endif diff --git a/modules/mol/base/src/coord_source.cc b/modules/mol/base/src/coord_source.cc index a8d95ff1a9828a56663539407aa7df11ccf7b546..b25a91755d461be23870de214a5e592c038ece6a 100644 --- a/modules/mol/base/src/coord_source.cc +++ b/modules/mol/base/src/coord_source.cc @@ -20,6 +20,7 @@ /* Author: Marco Biasini */ +#include <ost/log.hh> #include <ost/mol/atom_handle.hh> #include <ost/mol/xcs_editor.hh> #include <ost/mol/in_mem_coord_source.hh> @@ -53,10 +54,12 @@ CoordSource::~CoordSource() void CoordSource::CopyFrame(uint frame_id) { if (atoms_.empty()) { + LOGN_DEBUG("atom list empty, ignored"); return; } CoordFramePtr frame=this->GetFrame(frame_id); if (!frame) { + LOGN_DEBUG("invalid frame given, ignored"); return; } assert(frame->size()==atoms_.size()); @@ -64,7 +67,7 @@ void CoordSource::CopyFrame(uint frame_id) CoordFrame::const_iterator c=frame->begin(); for (AtomHandleList::iterator i=atoms_.begin(), e=atoms_.end(); i!=e; ++i, ++c) { - edi.SetAtomPos(*i, *c); + edi.SetAtomPos(*i, *c); } } diff --git a/modules/mol/base/src/impl/atom_impl.cc b/modules/mol/base/src/impl/atom_impl.cc index d8e37b25c38fd459f6e9d1c41d940f9247dd5852..cb3ecf87a290166e78a14329655b9ff7a733698c 100644 --- a/modules/mol/base/src/impl/atom_impl.cc +++ b/modules/mol/base/src/impl/atom_impl.cc @@ -40,7 +40,8 @@ AtomImpl::AtomImpl(const EntityImplPtr& e, const ResidueImplPtr& r, const String& n, const geom::Vec3& p, - const AtomProp& prop): + const AtomProp& prop, + unsigned long index): res_(r), name_(n), pos_(p), @@ -48,7 +49,8 @@ AtomImpl::AtomImpl(const EntityImplPtr& e, prim_connector_(), connector_list_(), fragment_(), - state_(0) + state_(0), + index_(index) { EntityHandle ent = this->GetEntity(); geom::Mat4 transf_matrix = ent.GetTransformationMatrix(); diff --git a/modules/mol/base/src/impl/atom_impl.hh b/modules/mol/base/src/impl/atom_impl.hh index 3db9ff520d4cf7ce0bb03f540e8fa8687fc14339..f3c2cc1c03db42b317b49606c326979e5b473d46 100644 --- a/modules/mol/base/src/impl/atom_impl.hh +++ b/modules/mol/base/src/impl/atom_impl.hh @@ -50,7 +50,8 @@ class AtomImpl: public GenericPropertyContainerImpl, 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 AtomProp& prop, + unsigned long index); ~AtomImpl(); void Apply(EntityVisitor& h); @@ -137,6 +138,9 @@ public: Real GetFloatProperty(Prop::ID prop_id) const; int GetIntProperty(Prop::ID prop_id) const; + + unsigned long GetIndex() const {return index_;} + void SetIndex(unsigned long index) {index_=index;} private: ResidueImplW res_; @@ -171,6 +175,8 @@ private: unsigned int mask = 0x1<<bit; return (state_ & mask)!=0; } + + unsigned long index_; }; /// \internal diff --git a/modules/mol/base/src/impl/entity_impl.cc b/modules/mol/base/src/impl/entity_impl.cc index e17a5a76dbcd2b23047cd34df54ed6ac3a5dff61..2a271f341946116568f34fb9fff8ca1a96e481d9 100644 --- a/modules/mol/base/src/impl/entity_impl.cc +++ b/modules/mol/base/src/impl/entity_impl.cc @@ -76,7 +76,8 @@ EntityImpl::EntityImpl(): xcs_editor_count_(0), ics_editor_count_(0), dirty_flags_(DisableICS), - name_("") + name_(""), + next_index_(0L) { } @@ -350,9 +351,9 @@ AtomImplPtr EntityImpl::CreateAtom(const ResidueImplPtr& rp, { #if MAKE_SHARED_AVAILABLE AtomImplPtr ap=boost::make_shared<AtomImpl>(shared_from_this(), rp, name, - pos, prop); + pos, prop,next_index_++); #else - AtomImplPtr ap(new AtomImpl(shared_from_this(), rp, name, pos, prop)); + AtomImplPtr ap(new AtomImpl(shared_from_this(), rp, name, pos, prop,next_index_++)); #endif if (identity_transf_ == false) { geom::Vec3 transformed_pos = geom::Vec3(transformation_matrix_*geom::Vec4(pos)); @@ -1165,7 +1166,7 @@ void EntityImpl::DecXCSEditorCount() void EntityImpl::UpdateOrganizerIfNeeded() { if (dirty_flags_ & DirtyOrganizer) { - LOGN_VERBOSE("atom organizer marked as dirty. updating"); + LOGN_DEBUG("atom organizer marked as dirty. updating"); this->UpdateOrganizer(); dirty_flags_&=~DirtyOrganizer; } diff --git a/modules/mol/base/src/impl/entity_impl.hh b/modules/mol/base/src/impl/entity_impl.hh index 4042e92975df4ad29d2b8c327d6f113aa0d8b0aa..ebe32704b8309441f87898b52d37bbbaf7fbbe43 100644 --- a/modules/mol/base/src/impl/entity_impl.hh +++ b/modules/mol/base/src/impl/entity_impl.hh @@ -268,6 +268,9 @@ private: int ics_editor_count_; int dirty_flags_; String name_; + + unsigned long next_index_; + template <bool always_true> EntityView do_selection(const EntityHandle&, const Query&, QueryFlags) const; }; diff --git a/modules/mol/base/src/in_mem_coord_source.cc b/modules/mol/base/src/in_mem_coord_source.cc index 98417d1594aa55ba4f26a0a9cfaa208c1fe2ad3f..089c667bd1971f1a7ea6ee7c77d807deaeeb3d8e 100644 --- a/modules/mol/base/src/in_mem_coord_source.cc +++ b/modules/mol/base/src/in_mem_coord_source.cc @@ -27,8 +27,8 @@ void InMemCoordSource::AddFrame(const CoordFramePtr& frame) void InMemCoordSource::AddFrame(const std::vector<geom::Vec3>& coords) { - frames_.push_back(CoordFramePtr(new CoordFrame(0.0))); - frames_.back()->insert(frames_.back()->end(), coords.begin(), coords.end()); + CoordFramePtr fp(new CoordFrame(coords)); + frames_.push_back(fp); } }} diff --git a/modules/mol/base/tests/test_entity.cc b/modules/mol/base/tests/test_entity.cc index 8deba9b01bad9b3a814daee98736ef1e8d0b465f..0504422946e34546f0c3dee532bb05de4fbd232a 100644 --- a/modules/mol/base/tests/test_entity.cc +++ b/modules/mol/base/tests/test_entity.cc @@ -95,10 +95,12 @@ BOOST_AUTO_TEST_CASE(entity_creator) AtomHandle atom1 = e.InsertAtom(res, "X1",geom::Vec3()); BOOST_CHECK(res==atom1.GetResidue()); BOOST_CHECK(atom1.GetName()=="X1"); + BOOST_CHECK(atom1.GetIndex()==0); AtomHandle atom2 = e.InsertAtom(res, "X2",geom::Vec3()); BOOST_CHECK(res==atom2.GetResidue()); BOOST_CHECK(atom2.GetName()=="X2"); + BOOST_CHECK(atom2.GetIndex()==1); BondHandle bond = e.Connect(atom1, atom2);