00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef OST_MM_OBSERVER_HH
00021 #define OST_MM_OBSERVER_HH
00022
00023
00024 #include <boost/shared_ptr.hpp>
00025
00026 #include <ost/io/mol/io_profile.hh>
00027 #include <ost/io/mol/pdb_writer.hh>
00028 #include <ost/mol/entity_handle.hh>
00029 #include <ost/mol/coord_frame.hh>
00030 #include <ost/mol/coord_group.hh>
00031 #include <ost/mol/mm/state_extractor.hh>
00032 #include <ost/mol/mm/topology.hh>
00033 #include <ost/mol/mm/modeller.hh>
00034 #include <ost/stdint.hh>
00035
00036 namespace OpenMM{
00037 class Context;
00038
00039
00040 }
00041
00042 namespace ost { namespace mol{ namespace mm{
00043
00044 class Observer;
00045 class TrajObserver;
00046 class TrajWriter;
00047 typedef boost::shared_ptr<Observer> ObserverPtr;
00048 typedef boost::shared_ptr<TrajObserver> TrajObserverPtr;
00049 typedef boost::shared_ptr<TrajWriter> TrajWriterPtr;
00050
00051
00052 class Observer{
00053 public:
00054
00055 virtual void Notify() = 0;
00056
00057 virtual void Init(boost::shared_ptr<OpenMM::Context> c,
00058 TopologyPtr top,
00059 ost::mol::EntityHandle& ent) = 0;
00060
00061 virtual int Rhythm() = 0;
00062
00063 };
00064
00065
00066 class TrajObserver : public Observer{
00067
00068 public:
00069
00070 TrajObserver(int rhythm): rhythm_(rhythm), registered_(false) { }
00071
00072 void Init(boost::shared_ptr<OpenMM::Context> c,
00073 TopologyPtr top,
00074 ost::mol::EntityHandle& ent);
00075
00076 void Notify();
00077
00078 int Rhythm() { return rhythm_; }
00079
00080 CoordGroupHandle GetTraj() { return c_group_; }
00081
00082 private:
00083
00084 ost::mol::CoordGroupHandle c_group_;
00085 boost::shared_ptr<OpenMM::Context> context_;
00086 int rhythm_;
00087 bool registered_;
00088 };
00089
00090 class TrajWriter : public Observer{
00091
00092
00093
00094 public:
00095
00096 TrajWriter(int rhythm, const String& pdb_filename, const String& dcd_filename)
00097 : rhythm_(rhythm), pdb_filename_(pdb_filename),
00098 dcd_filename_(dcd_filename), stream_(), registered_(false),
00099 frames_(0) { }
00100
00101 void Init(boost::shared_ptr<OpenMM::Context> c,
00102 TopologyPtr top,
00103 ost::mol::EntityHandle& ent);
00104
00105 void Notify();
00106
00107 int Rhythm() { return rhythm_; }
00108
00109 void Finalize();
00110
00111 private:
00112
00113 TrajWriter(const TrajWriter& writer) { }
00114
00115
00116 boost::shared_ptr<OpenMM::Context> context_;
00117 int rhythm_;
00118 String pdb_filename_;
00119 String dcd_filename_;
00120 std::ofstream stream_;
00121 bool registered_;
00122 uint32_t frames_;
00123 std::vector<float> x;
00124 std::vector<float> y;
00125 std::vector<float> z;
00126 };
00127
00128
00129 }}}
00130
00131 #endif