00001
00002
00003
00004
00005
00006
00007
00008 #ifndef BALL_MOLMEC_COMMON_SUPPORT_H
00009 #define BALL_MOLMEC_COMMON_SUPPORT_H
00010
00011 #ifndef BALL_COMMON_H
00012 # include <BALL/common.h>
00013 #endif
00014
00015 #ifndef BALL_MATHS_SIMPLEBOX3_H
00016 # include <BALL/MATHS/simpleBox3.h>
00017 #endif
00018
00019 #ifndef BALL_MOLMEC_COMMON_FORCEFIELD_H
00020 # include <BALL/MOLMEC/COMMON/forceField.h>
00021 #endif
00022
00023 #ifndef BALL_MOLMEC_COMMON_ATOMVECTOR_H
00024 # include <BALL/MOLMEC/COMMON/atomVector.h>
00025 #endif
00026
00027 #ifndef BALL_DATATYPE_HASHGRID_H
00028 # include <BALL/DATATYPE/hashGrid.h>
00029 #endif
00030
00031 #ifndef BALL_KERNEL_BOND_H
00032 # include <BALL/KERNEL/bond.h>
00033 #endif
00034
00035 #include <vector>
00036
00037 namespace BALL
00038 {
00039 class Atom;
00040 class System;
00041
00045 namespace MolmecSupport
00046 {
00047
00048 using std::pair;
00049
00053
00057
00060 enum PairListAlgorithmType
00061 {
00064 HASH_GRID,
00065
00068 BRUTE_FORCE
00069 };
00071
00085 BALL_EXPORT BALL::Size calculateNonBondedAtomPairs
00086 (ForceField::PairVector& pair_vector,
00087 const AtomVector& atom_vector, const SimpleBox3& box,
00088 double distance, bool periodic_boundary_enabled,
00089 PairListAlgorithmType type)
00090 throw(Exception::OutOfMemory);
00091
00099 BALL_EXPORT Size sortNonBondedAtomPairsAfterSelection(ForceField::PairVector& pair_vector);
00100
00114 BALL_EXPORT BALL::Size addNonOverlappingMolecules
00115 (System& system, const HashGrid3<const Atom*>& solute_grid,
00116 const System& solvent, const SimpleBox3& box, double distance);
00117
00130 BALL_EXPORT void adaptWaterBox(System& system, const SimpleBox3& box);
00131
00134
00135 BALL_EXPORT void calculateMinimumImage
00136 (Vector3& distance, const Vector3& period);
00137
00145 template <typename TorsionType, typename AtomIteratorType>
00146 Size computeTorsions
00147 (const AtomIteratorType& start, const AtomIteratorType& end,
00148 std::vector<TorsionType>& torsions, bool use_selection = false);
00149
00150
00151
00152 template <typename TorsionType, typename AtomIteratorType>
00153 Size computeTorsions
00154 (const AtomIteratorType& start, const AtomIteratorType& end,
00155 std::vector<TorsionType>& torsions, bool use_selection)
00156 {
00157
00158 Atom* a1;
00159 Atom* a2;
00160 Atom* a3;
00161 Atom* a4;
00162
00163 Size number_of_added_torsions = 0;
00164
00165
00166
00167 AtomIteratorType atom_it = start;
00168 for (; atom_it != end; ++atom_it)
00169 {
00170
00171
00172 Atom::BondIterator it1 = (*atom_it)->beginBond();
00173 for (; +it1 ; ++ it1)
00174 {
00175
00176
00177 if (*atom_it == it1->getFirstAtom())
00178 {
00179
00180
00181 a2 = *atom_it;
00182 a3 = const_cast<Atom*>(it1->getSecondAtom());
00183
00184
00185 Atom::BondIterator it2;
00186 Atom::BondIterator it3;
00187 for (it2 = (*atom_it)->beginBond(); +it2 ; ++it2)
00188 {
00189 if (it2->getSecondAtom() != it1->getSecondAtom())
00190 {
00191
00192 if (it2->getFirstAtom() == *atom_it)
00193 {
00194 a1 = const_cast<Atom*>(it2->getSecondAtom());
00195 }
00196 else
00197 {
00198 a1 = const_cast<Atom*>(it2->getFirstAtom());
00199 }
00200
00201 for (it3 = const_cast<Atom*>(it1->getSecondAtom())->beginBond(); +it3 ; ++it3)
00202 {
00203 if (it3->getFirstAtom() != a2 )
00204 {
00205
00206 if (it3->getFirstAtom() == a3)
00207 {
00208 a4 = const_cast<Atom*>(it3->getSecondAtom());
00209 }
00210 else
00211 {
00212 a4 = const_cast<Atom*>(it3->getFirstAtom());
00213 }
00214
00215 if (use_selection == false
00216 || (use_selection == true
00217 && (a1->isSelected() || a2->isSelected() || a3->isSelected() || a4->isSelected())))
00218 {
00219
00220 TorsionType tmp;
00221 tmp.atom1 = a1;
00222 tmp.atom2 = a2;
00223 tmp.atom3 = a3;
00224 tmp.atom4 = a4;
00225
00226 torsions.push_back(tmp);
00227 number_of_added_torsions++;
00228 }
00229 }
00230 }
00231 }
00232 }
00233 }
00234 }
00235 }
00236
00237
00238 return number_of_added_torsions;
00239 }
00240
00241 }
00242 }
00243
00244 #endif // BALL_MOLMEC_COMMON_SUPPORT_H