00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef OST_ENTITY_IMPL_HH
00020 #define OST_ENTITY_IMPL_HH
00021
00022 #include <map>
00023 #include <vector>
00024
00025 #include <boost/enable_shared_from_this.hpp>
00026
00027 #include <ost/mol/module_config.hh>
00028 #include <ost/geom/geom.hh>
00029
00030 #include <ost/mol/impl/entity_impl_fw.hh>
00031
00032 #include <ost/mol/entity_view.hh>
00033
00034 #include <ost/mol/residue_prop.hh>
00035 #include <ost/mol/impl/atom_impl_fw.hh>
00036 #include <ost/mol/impl/residue_impl_fw.hh>
00037 #include <ost/mol/impl/chain_impl_fw.hh>
00038 #include <ost/mol/impl/connector_impl_fw.hh>
00039 #include <ost/mol/impl/torsion_impl_fw.hh>
00040 #include <ost/mol/impl/fragment_impl_fw.hh>
00041 #include <ost/mol/impl/pointer_iterator.hh>
00042 #include <ost/mol/entity_visitor_fw.hh>
00043 #include <ost/mol/entity_observer_fw.hh>
00044 #include <ost/mol/entity_view.hh>
00045 #include <ost/mol/entity_handle.hh>
00046 #include <ost/mol/spatial_organizer.hh>
00047
00048
00049 #include <ost/generic_property.hh>
00050
00051 namespace ost { namespace mol { namespace impl {
00052
00054 typedef std::map<AtomImpl*,AtomImplPtr> AtomImplMap;
00056 typedef std::map<ResidueImpl*,ResidueImplPtr> ResidueImplMap;
00058 typedef std::vector<ChainImplPtr> ChainImplList;
00060 typedef std::map<ConnectorImpl*,ConnectorImplP> ConnectorImplMap;
00062 typedef std::map<TorsionImpl*,TorsionImplP> TorsionImplMap;
00064 typedef std::vector<FragmentImplP> FragmentImplList;
00066 typedef std::map<EntityObserver*,EntityObserverPtr> EntityObserverMap;
00068 typedef SpatialOrganizer<AtomImplPtr> SpatialAtomOrganizer;
00069
00071 typedef enum {
00072 DirtyICS=1,
00073 DirtyXCS=2,
00074
00075 DirtyTrace=DirtyICS+4,
00076 DirtyOrganizer=8,
00077 DisableICS=16
00078 } EntityDirtyFlags;
00079
00080
00082 class EntityImpl: public GenericPropContainerImpl,
00083 public boost::enable_shared_from_this<EntityImpl>
00084 {
00085 public:
00086 EntityImpl();
00087 ~EntityImpl();
00088
00090 EntityImplPtr Copy();
00091
00092 Real GetMass() const;
00093 geom::Vec3 GetCenterOfMass() const;
00094 geom::Vec3 GetCenterOfAtoms() const;
00096 geom::AlignedCuboid GetBounds() const;
00097
00098
00099
00100
00101 AtomImplPtr CreateAtom(const ResidueImplPtr& rp, const String& name,
00102 const geom::Vec3& pos, const String& ele);
00103
00104 ResidueImplPtr CreateResidue(const ChainImplPtr& cp,
00105 const ResNum& n,
00106 const ResidueKey& k);
00107
00108 ChainImplPtr InsertChain(const String& cname);
00112
00113
00114 ChainImplPtr InsertChain(const String& chain_name, const ChainImplPtr& chain, bool deep);
00115 ConnectorImplP Connect(const AtomImplPtr& first, const AtomImplPtr& second,
00116 Real len, Real theta, Real phi,
00117 unsigned char bond_order);
00118
00119 TorsionImplP AddTorsion(const String& name, const AtomImplPtr& a1,
00120 const AtomImplPtr& a2, const AtomImplPtr& a3,
00121 const AtomImplPtr& a4);
00122
00123 void TraceDirectionality();
00124
00126 TorsionImplP FindTorsion(const AtomImplPtr& a1,
00127 const AtomImplPtr& a2,
00128 const AtomImplPtr& a3,
00129 const AtomImplPtr& a4) const;
00130
00131 void RenameChain(ChainImplPtr chain, const String& new_name);
00132 bool SetAngle(const AtomImplPtr& a1, const AtomImplPtr& a2,
00133 const AtomImplPtr& a3, Real angle);
00134
00135 Real GetAngle(const AtomImplPtr& a1, const AtomImplPtr& a2,
00136 const AtomImplPtr& a3) const;
00137 Real GetAngleXCS(const AtomImplPtr& a1, const AtomImplPtr& a2,
00138 const AtomImplPtr& a3) const;
00139 Real GetAngleICS(const AtomImplPtr& a1, const AtomImplPtr& a2,
00140 const AtomImplPtr& a3) const;
00141
00142 void UpdateFromICS();
00143
00144
00145 void UpdateFromXCS();
00146
00147 void Apply(EntityVisitor& v);
00148 void ApplyTransform(const geom::Transform& t);
00149
00150 void SetTransform(const geom::Transform& t);
00151 const geom::Transform& GetTransform() const {return transform_;}
00152 bool HasTransform() const {return has_transform_;}
00153 void ClearTransform();
00154 void FixTransform();
00155
00156 void AttachObserver(const EntityObserverPtr& o);
00157 void DetachObserver(const EntityObserverPtr& o);
00158 void NotifyObserver();
00159
00160
00161 void UpdateOrganizer();
00162
00163 AtomImplList FindWithin(const geom::Vec3& pos, Real radius) const;
00164
00165 EntityView Select(const EntityHandle& h, const Query& q) const;
00166
00167 EntityView Select(const EntityHandle& h, const Query& q,
00168 QueryFlags flags) const;
00169 EntityView CreateFullView(const EntityHandle& h) const;
00170 void SetDefaultQueryFlags(QueryFlags f) {default_query_flags_=f;}
00171 QueryFlags GetDefaultQueryFlags() const {return default_query_flags_;}
00172
00173
00176 ChainImplPtr FindChain(const String& name) const;
00177
00178 ResidueImplPtr FindResidue(const String& chain_name,
00179 const ResNum& residue) const;
00180
00181 AtomImplPtr FindAtom(const String& chain_name,
00182 const ResNum& residue,
00183 const String& atom_name) const;
00184
00185
00186
00187
00188
00189 void Swap(EntityImpl& impl);
00190
00192 int GetAtomCount() const;
00193
00195 int GetBondCount() const;
00196
00198 mol::BondHandleList GetBondList() const;
00199
00200
00202 int GetResidueCount() const;
00203
00205 int GetChainCount() const;
00206
00207 const ChainImplList& GetChainList() const { return chain_list_; }
00208
00209 ChainImplList& GetChainList() { return chain_list_; }
00210
00211 void DeleteFromConnMap(const ConnectorImplP& conn);
00212
00213 void DeleteChain(const ChainImplPtr& chain);
00214
00215 void DeleteAtom(const AtomImplPtr& atom);
00216
00217 void IncXCSEditorCount();
00218 void DecXCSEditorCount();
00219
00220 void IncICSEditorCount();
00221 void DecICSEditorCount();
00222
00223 TorsionImplMap& GetTorsionMap();
00224
00225 void UpdateXCSIfNeeded();
00226
00227 void UpdateICSIfNeeded();
00228
00229 void UpdateOrganizerIfNeeded();
00230
00231 void EnableICS();
00232
00233 bool HasICS() const;
00234
00235 bool IsXCSDirty() const;
00236
00237 void MarkXCSDirty();
00238 void MarkICSDirty();
00239 void MarkTraceDirty();
00240 void MarkOrganizerDirty();
00241
00242 void UpdateTransformedPos();
00243
00244 const String& GetName() const;
00245
00246 impl::ChainImplList::iterator GetChain(const String& name);
00247
00248 pointer_it<ChainImplPtr> GetChainIter(const String& name);
00249 void SetName(const String& ent_name);
00250
00251 void ReorderAllResidues();
00252
00253 void RenumberAllResidues(int start, bool keep_spacing);
00254
00255 void RenumberChain(const String& name, int start, bool keep_spacing);
00256
00257 private:
00258 void DoCopy(EntityImplPtr dest);
00259
00260 void ReplicateHierarchy(EntityImplPtr dest);
00261
00262 void DoCopyBondsAndTorsions(EntityImplPtr dest);
00263
00264 AtomImplMap atom_map_;
00265 ChainImplList chain_list_;
00266 ConnectorImplMap connector_map_;
00267 TorsionImplMap torsion_map_;
00268
00269 geom::Transform transform_;
00270 bool has_transform_;
00271
00272 SpatialAtomOrganizer atom_organizer_;
00273 FragmentImplList fragment_list_;
00274 EntityObserverMap observer_map_;
00275
00276 int xcs_editor_count_;
00277 int ics_editor_count_;
00278 int dirty_flags_;
00279 String name_;
00280
00281 unsigned long next_index_;
00282
00283 QueryFlags default_query_flags_;
00284
00285 template <bool always_true>
00286 EntityView do_selection(const EntityHandle&, const Query&, QueryFlags) const;
00287 };
00288
00289 }}}
00290
00291 #endif