BALL  1.4.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
atom.h
Go to the documentation of this file.
1 // -*- Mode: C++; tab-width: 2; -*-
2 // vi: set ts=2:
3 //
4 
5 #ifndef BALL_KERNEL_ATOM_H
6 #define BALL_KERNEL_ATOM_H
7 
8 #ifndef BALL_CONCEPT_COMPOSITE_H
9 # include <BALL/CONCEPT/composite.h>
10 #endif
11 
12 #ifndef BALL_CONCEPT_PROPERTY_H
13 # include <BALL/CONCEPT/property.h>
14 #endif
15 
16 #ifndef BALL_CONCEPT_RANDOMACCESSITERATOR_H
18 #endif
19 
20 #ifndef BALL_MATHS_VECTOR3_H
21 # include <BALL/MATHS/vector3.h>
22 #endif
23 
24 // Defines for default values for an atom
25 #define BALL_ATOM_DEFAULT_ELEMENT &Element::UNKNOWN
26 #define BALL_ATOM_DEFAULT_CHARGE 0
27 #define BALL_ATOM_DEFAULT_FORMAL_CHARGE 0
28 #define BALL_ATOM_DEFAULT_NAME ""
29 #define BALL_ATOM_DEFAULT_TYPE_NAME "?"
30 #define BALL_ATOM_DEFAULT_POSITION 0,0,0
31 #define BALL_ATOM_DEFAULT_RADIUS 0
32 #define BALL_ATOM_DEFAULT_TYPE Atom::UNKNOWN_TYPE
33 #define BALL_ATOM_DEFAULT_VELOCITY 0,0,0
34 #define BALL_ATOM_DEFAULT_FORCE 0,0,0
35 
36 namespace BALL
37 {
38  class Bond;
39  class Element;
40  class Fragment;
41  class Residue;
42  class Chain;
43  class SecondaryStructure;
44  class Molecule;
45 
87  : public Composite,
88  public PropertyManager
89  {
90  public:
91 
96  friend class Bond;
97 
99 
100 
102  typedef short Type;
103 
107 
110  enum
111  {
115  UNKNOWN_TYPE = -1,
116 
120  ANY_TYPE = 0,
121 
123  MAX_NUMBER_OF_BONDS = 12
124  };
125 
129  enum Property
130  {
131  NUMBER_OF_PROPERTIES = 0
132  };
133 
138  {
139  // Do not add extensions
141  // Add the residue extensions
143  // Add the residue ID
145  // Add the residue ID and the residue extension
147  // Add the chain ID and the residue ID
149  // Add the chain ID and the residue ID
150  ADD_VARIANT_EXTENSIONS_AND_CHAIN_RESIDUE_ID
151  };
152 
154 
158 
176  Atom();
177 
188  Atom(const Atom& atom, bool deep = true);
189 
206  Atom(Element& element,
207  const String& name, const String& type_name = BALL_ATOM_DEFAULT_TYPE_NAME,
208  Type atom_type = BALL_ATOM_DEFAULT_TYPE,
209  const Vector3& position = Vector3(BALL_ATOM_DEFAULT_POSITION),
210  const Vector3& velocity = Vector3(BALL_ATOM_DEFAULT_VELOCITY),
211  const Vector3& force = Vector3(BALL_ATOM_DEFAULT_FORCE),
212  float charge = BALL_ATOM_DEFAULT_CHARGE,
213  float radius = BALL_ATOM_DEFAULT_RADIUS,
214  Index formal_charge = BALL_ATOM_DEFAULT_FORMAL_CHARGE);
215 
217 
221 
228  virtual ~Atom();
229 
239  virtual void clear();
240 
246  virtual void destroy();
247 
249 
252 
256  virtual void persistentWrite(PersistenceManager& pm, const char* name = 0) const;
257 
261  virtual void persistentRead(PersistenceManager& pm);
262 
264 
267 
277  void set(const Atom& atom, bool deep = true);
278 
284  void get(Atom& atom, bool deep = true) const;
285 
294  Atom& operator = (const Atom& atom);
295 
300  void swap(Atom& atom);
301 
303 
306 
311  bool operator == (const Atom& atom) const;
312 
316  bool operator != (const Atom& atom) const;
317 
319 
322 
324  void setElement(const Element& element);
325 
327  const Element& getElement() const;
328 
333  void setCharge(float charge);
334 
339  float getCharge() const;
340 
342  void setFormalCharge(Index formal_charge);
343 
345  Index getFormalCharge() const;
346 
354  const Molecule* getMolecule() const;
356  Molecule* getMolecule();
357 
358 
366  const Fragment* getFragment() const;
368  Fragment* getFragment();
369 
377  const Residue* getResidue() const;
379  Residue* getResidue();
380 
386  const SecondaryStructure* getSecondaryStructure() const;
388  SecondaryStructure* getSecondaryStructure();
389 
395  const Chain* getChain() const;
397  Chain* getChain();
398 
400  void setName(const String& name);
401 
403  const String& getName() const;
404 
434  String getFullName(FullNameType type = ADD_VARIANT_EXTENSIONS) const;
435 
439  void setPosition(const Vector3& position);
440 
442  Vector3& getPosition();
443 
445  const Vector3& getPosition() const;
446 
450  void setRadius(float radius);
451 
453  float getRadius() const;
454 
456  void setType(Type atom_type);
457 
459  Type getType() const;
460 
462  String getTypeName() const;
463 
465  void setTypeName(const String& name);
466 
470  void setVelocity(const Vector3& velocity);
471 
475  Vector3& getVelocity();
476 
480  const Vector3& getVelocity() const;
481 
485  void setForce(const Vector3& force);
487  const Vector3& getForce() const;
489  Vector3& getForce();
490 
491 
493  Size countBonds() const;
494 
507  Bond* getBond(Position index);
508 
512  const Bond* getBond(Position index) const;
513 
521  Bond* getBond(const Atom& atom);
522 
530  const Bond* getBond(const Atom& atom) const;
532 
533 
537 
547  Bond* createBond(Atom& atom);
548 
560  Bond* createBond(Bond& bond, Atom& atom);
561 
566  Bond* cloneBond(Bond& bond, Atom& atom);
567 
579  bool destroyBond(const Atom& atom);
580 
592  void destroyBonds();
593 
602  Atom* getPartnerAtom(Position i);
603 
612  const Atom* getPartnerAtom(Position i) const;
613 
620  float getDistance(const Atom& a) const;
621 
623 
627 
634  bool hasBond(const Bond& bond) const;
635 
644  bool isBoundTo(const Atom& atom) const;
645 
651  bool isBound() const;
652 
660  bool isGeminal(const Atom& atom) const;
661 
668  bool isVicinal(const Atom& atom) const;
670 
674 
679  virtual bool isValid() const;
680 
688  virtual void dump(std::ostream& s = std::cout, Size depth = 0) const;
690 
694 
700  bool applyBonds(UnaryProcessor<Bond>& processor);
701 
703 
706 
708 
710  {
711  public:
712 
714 
715  virtual ~BondIteratorTraits() {}
716 
718  : bound_(0),
719  position_(0)
720  {
721  }
722 
724  : bound_((Atom*)&atom),
725  position_(0)
726  {
727  }
728 
729  BondIteratorTraits(const BondIteratorTraits& traits, bool /* deep */ = true)
730  : bound_(traits.bound_),
731  position_(traits.position_)
732  {
733  }
734 
735  BondIteratorTraits& operator = (const BondIteratorTraits& traits)
736  {
737  bound_ = traits.bound_;
738  position_ = traits.position_;
739  return *this;
740  }
741 
742  Atom* getContainer() { return bound_; }
743 
744  const Atom* getContainer() const { return bound_; }
745 
746  bool isSingular() const { return (bound_ == 0); }
747 
748  BondIteratorPosition& getPosition() { return position_; }
749 
750  const BondIteratorPosition& getPosition() const { return position_; }
751 
752  // Comparison: We do net check whether these traits are bound to
753  // the same container here for efficiency reasons.
754 
755  bool operator == (const BondIteratorTraits& traits) const
756  {
757  return (position_ == traits.position_);
758  }
759 
760  bool operator != (const BondIteratorTraits& traits) const
761  {
762  return !(position_ == traits.position_);
763  }
764 
765  bool operator < (const BondIteratorTraits& traits) const
766  {
767  return (position_ < traits.position_);
768  }
769 
770  Distance getDistance(const BondIteratorTraits& traits) const
771  {
772  return (Distance)(position_ - traits.position_);
773  }
774 
775  bool isValid() const
776  {
777  return (bound_ != 0 && position_ >= 0 && position_ < bound_->number_of_bonds_);
778  }
779 
780  void invalidate()
781  {
782  bound_ = 0;
783  position_ = 0;
784  }
785 
786  void toBegin() { position_ = 0; }
787 
788  bool isBegin() const { return (position_ == 0); }
789 
790  void toEnd() { position_ = bound_->number_of_bonds_; }
791 
792  bool isEnd() const { return (position_ >= bound_->number_of_bonds_);}
793 
794  Bond& getData() { return *(bound_->bond_[position_]); }
795 
796  const Bond& getData() const { return *(bound_->bond_[position_]); }
797 
798  void forward() { ++position_; }
799 
800  friend std::ostream& operator << (std::ostream& s, const BondIteratorTraits& traits)
801  {
802  return (s << traits.position_ << ' ');
803  }
804 
805  void dump(std::ostream& s) const
806  {
807  s << position_ << std::endl;
808  }
809 
810  void toRBegin()
811  {
812  position_ = bound_->number_of_bonds_ - 1;
813  }
814 
815  bool isRBegin() const
816  {
817  return (position_ == bound_->number_of_bonds_ - 1);
818  }
819 
820  void toREnd()
821  {
822  position_ = -1;
823  }
824 
825  bool isREnd() const
826  {
827  return (position_ <= -1);
828  }
829 
830  void backward()
831  {
832  --position_;
833  }
834 
835  void backward(Distance distance)
836  {
837  position_ -= distance;
838  }
839 
840  void forward(Distance distance)
841  {
842  position_ += distance;
843  }
844 
845  Bond& getData(Index index)
846  {
847  return *(bound_->bond_[index]);
848  }
849 
850  const Bond& getData(Index index) const
851  {
852  return *(bound_->bond_[index]);
853  }
854 
855  private:
856 
859 
860  };
861 
862  friend class BondIteratorTraits;
863 
866  typedef RandomAccessIterator
869 
871  BondIterator beginBond()
872  {
873  return BondIterator::begin(*this);
874  }
875 
877  BondIterator endBond()
878  {
879  return BondIterator::end(*this);
880  }
881 
884  <Atom, Bond, BondIteratorPosition, BondIteratorTraits>
886 
888  BondConstIterator beginBond() const
889  {
890  return BondConstIterator::begin(*this);
891  }
892 
894  BondConstIterator endBond() const
895  {
896  return BondConstIterator::end(*this);
897  }
898 
900  typedef std::reverse_iterator<BondIterator> BondReverseIterator;
901 
903  BondReverseIterator rbeginBond()
904  {
905  return BondReverseIterator(endBond());
906  }
907 
910  {
911  return BondReverseIterator(beginBond());
912  }
913 
915  typedef std::reverse_iterator<BondConstIterator> BondConstReverseIterator;
916 
918  BondConstReverseIterator rbeginBond() const
919  {
920  return BondConstReverseIterator(endBond());
921  }
922 
924  BondConstReverseIterator rendBond() const
925  {
926  return BondConstReverseIterator(beginBond());
927  }
928 
930 
933 
935  typedef std::list<Atom*> AtomPtrList;
936 
938  typedef std::list<Position> AtomIndexList;
939 
940  protected:
941 
943 
946 
949 
957  float radius_;
961  unsigned char number_of_bonds_;
963  Bond* bond_[MAX_NUMBER_OF_BONDS];
969  float charge_;
975 
976 
977 
978  private:
979 
981  void clear_();
982 
984  void swapLastBond_(const Atom* atom);
985 
986  };
987 
988 // required for visual studio
989 #ifdef BALL_COMPILER_MSVC
990 #include <vector>
991 template class BALL_EXPORT std::vector<Atom*>;
992 #endif
993 
994 # ifndef BALL_NO_INLINE_FUNCTIONS
995 # include <BALL/KERNEL/atom.iC>
996 # endif
997 } // namespace BALL
998 
999 #ifndef BALL_KERNEL_BONDITERATOR_H
1000 # include <BALL/KERNEL/bondIterator.h>
1001 #endif
1002 
1003 
1004 #endif // BALL_KERNEL_ATOM_H