29 #ifndef CDPL_FORCEFIELD_UTILITYFUNCTIONS_HPP
30 #define CDPL_FORCEFIELD_UTILITYFUNCTIONS_HPP
44 class MMFF94InteractionData;
69 template <
typename ValueType,
typename CoordsVec>
87 template <
typename ValueType,
typename CoordsVec>
88 ValueType
calcDistance(
const CoordsVec& atom1_pos,
const CoordsVec& atom2_pos);
113 template <
typename ValueType,
typename CoordsVec>
115 ValueType& bond_length1, ValueType& bond_length2);
140 template <
typename ValueType,
typename CoordsVec>
141 ValueType
calcBondLengthsAndAngle(
const CoordsVec& term_atom1_pos,
const CoordsVec& ctr_atom_pos,
const CoordsVec& term_atom2_pos,
142 ValueType& bond_length1, ValueType& bond_length2);
162 template <
typename ValueType,
typename CoordsVec>
163 ValueType
calcBondAngleCos(
const CoordsVec& term_atom1_pos,
const CoordsVec& ctr_atom_pos,
const CoordsVec& term_atom2_pos);
185 template <
typename ValueType,
typename CoordsVec>
186 ValueType
calcBondAngleCos(
const CoordsVec& term_atom1_pos,
const CoordsVec& ctr_atom_pos,
const CoordsVec& term_atom2_pos,
187 const ValueType& r_ij,
const ValueType& r_jk);
207 template <
typename ValueType,
typename CoordsVec>
208 ValueType
calcBondAngle(
const CoordsVec& term_atom1_pos,
const CoordsVec& ctr_atom_pos,
const CoordsVec& term_atom2_pos);
230 template <
typename ValueType,
typename CoordsVec>
231 ValueType
calcBondAngle(
const CoordsVec& term_atom1_pos,
const CoordsVec& ctr_atom_pos,
const CoordsVec& term_atom2_pos,
232 const ValueType& r_ij,
const ValueType& r_jk);
256 template <
typename ValueType,
typename CoordsVec>
258 const CoordsVec& term_atom2_pos,
const CoordsVec& oop_atom_pos);
283 template <
typename ValueType,
typename CoordsVec>
285 const CoordsVec& term_atom2_pos,
const CoordsVec& oop_atom_pos,
286 const ValueType& r_jl);
311 template <
typename ValueType,
typename CoordsVec>
313 const CoordsVec& ctr_atom2_pos,
const CoordsVec& term_atom2_pos);
337 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
339 GradVec& atom1_deriv, GradVec& atom2_deriv);
371 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
373 GradVec& term_atom1_deriv, GradVec& ctr_atom_deriv, GradVec& term_atom2_deriv);
416 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
418 const CoordsVec& ctr_atom2_pos,
const CoordsVec& term_atom2_pos,
419 GradVec& term_atom1_deriv, GradVec& ctr_atom1_deriv,
420 GradVec& ctr_atom2_deriv, GradVec& term_atom2_deriv);
481 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
483 const CoordsVec& term_atom2_pos,
const CoordsVec& oop_atom_pos,
484 GradVec& term_atom1_deriv, GradVec& ctr_atom_deriv,
485 GradVec& term_atom2_deriv, GradVec& oop_atom_deriv);
502 template <
typename VecType1,
typename VecType2,
typename VecType3>
503 void addVectors(
const VecType1& vec1,
const VecType2& vec2, VecType3& res)
505 res[0] = vec2[0] + vec1[0];
506 res[1] = vec2[1] + vec1[1];
507 res[2] = vec2[2] + vec1[2];
510 template <
typename VecType1,
typename VecType2>
511 void subVectors(
const VecType1& vec1,
const VecType1& vec2, VecType2& res)
513 res[0] = vec2[0] - vec1[0];
514 res[1] = vec2[1] - vec1[1];
515 res[2] = vec2[2] - vec1[2];
518 template <
typename ValueType,
typename VecType>
519 ValueType calcDotProduct(
const VecType& vec1,
const VecType& vec2)
521 return (vec1[0] * vec2[0] + vec1[1] * vec2[1] + vec1[2] * vec2[2]);
524 template <
typename VecType,
typename ResVecType>
525 void calcCrossProduct(
const VecType& vec1,
const VecType& vec2, ResVecType& cross_prod)
527 cross_prod[0] = vec1[1] * vec2[2] - vec1[2] * vec2[1];
528 cross_prod[1] = vec1[2] * vec2[0] - vec1[0] * vec2[2];
529 cross_prod[2] = vec1[0] * vec2[1] - vec1[1] * vec2[0];
532 template <
typename VecType1,
typename VecType2>
533 void copyVector(
const VecType1& vec1, VecType2& vec2)
540 template <
typename VecType>
541 void negateVector(VecType&
vec)
548 template <
typename VecType1,
typename VecType2>
549 void negateCopyVector(
const VecType1& vec1, VecType2& vec2)
556 template <
typename VecType,
typename T>
557 void scaleVector(VecType&
vec,
const T& factor)
564 template <
typename VecType,
typename T>
565 void invScaleVector(VecType&
vec,
const T& factor)
572 template <
typename VecType1,
typename VecType2,
typename T>
573 void scaleAddVector(
const VecType1& vec1,
const T& factor, VecType2& vec2)
575 vec2[0] += vec1[0] * factor;
576 vec2[1] += vec1[1] * factor;
577 vec2[2] += vec1[2] * factor;
580 template <
typename VecType1,
typename VecType2,
typename T>
581 void scaleCopyVector(
const VecType1& vec1,
const T& factor, VecType2& vec2)
583 vec2[0] = vec1[0] * factor;
584 vec2[1] = vec1[1] * factor;
585 vec2[2] = vec1[2] * factor;
588 template <
typename VecType1,
typename VecType2,
typename T>
589 void invScaleCopyVector(
const VecType1& vec1,
const T& factor, VecType2& vec2)
591 vec2[0] = vec1[0] / factor;
592 vec2[1] = vec1[1] / factor;
593 vec2[2] = vec1[2] / factor;
596 template <
typename ValueType>
597 ValueType clampCosine(
const ValueType& v)
599 if (v > ValueType(1))
602 if (v < ValueType(-1))
603 return ValueType(-1);
608 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename FuncType>
609 ValueType accumInteractionEnergies(Iter& beg,
const Iter& end,
const CoordsArray& coords,
const FuncType& func)
611 ValueType e = ValueType();
613 for (; beg != end; ++beg)
614 e += func(*beg, coords);
619 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector,
typename FuncType>
620 ValueType calcInteractionGradient(Iter& beg,
const Iter& end,
const CoordsArray& coords, GradVector& grad,
const FuncType& func)
622 ValueType e = ValueType();
624 for (; beg != end; ++beg)
625 e += func(*beg, coords, grad);
634 template <
typename ValueType,
typename CoordsVec>
637 ValueType pos_diff[3];
639 Detail::subVectors(atom1_pos, atom2_pos, pos_diff);
641 return Detail::calcDotProduct<ValueType>(pos_diff, pos_diff);
644 template <
typename ValueType,
typename CoordsVec>
647 return std::sqrt(calcSquaredDistance<ValueType>(atom1_pos, atom2_pos));
650 template <
typename ValueType,
typename CoordsVec>
652 ValueType& bond_length1, ValueType& bond_length2)
654 ValueType bond_vec1[3];
655 ValueType bond_vec2[3];
657 Detail::subVectors(ctr_atom_pos, term_atom1_pos, bond_vec1);
658 Detail::subVectors(ctr_atom_pos, term_atom2_pos, bond_vec2);
660 bond_length1 = std::sqrt(Detail::calcDotProduct<ValueType>(bond_vec1, bond_vec1));
661 bond_length2 = std::sqrt(Detail::calcDotProduct<ValueType>(bond_vec2, bond_vec2));
663 return Detail::clampCosine(Detail::calcDotProduct<ValueType>(bond_vec1, bond_vec2) / (bond_length1 * bond_length2));
666 template <
typename ValueType,
typename CoordsVec>
668 ValueType& bond_length1, ValueType& bond_length2)
673 template <
typename ValueType,
typename CoordsVec>
681 template <
typename ValueType,
typename CoordsVec>
683 const ValueType& r_ij,
const ValueType& r_jk)
685 ValueType bond_vec1[3];
686 ValueType bond_vec2[3];
688 Detail::subVectors(ctr_atom_pos, term_atom1_pos, bond_vec1);
689 Detail::subVectors(ctr_atom_pos, term_atom2_pos, bond_vec2);
691 return Detail::clampCosine(Detail::calcDotProduct<ValueType>(bond_vec1, bond_vec2) / (r_ij * r_jk));
694 template <
typename ValueType,
typename CoordsVec>
697 return std::acos(calcBondAngleCos<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos));
700 template <
typename ValueType,
typename CoordsVec>
702 const ValueType& r_ij,
const ValueType& r_jk)
704 return std::acos(calcBondAngleCos<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos, r_ij, r_jk));
707 template <
typename ValueType,
typename CoordsVec>
709 const CoordsVec& term_atom2_pos,
const CoordsVec& oop_atom_pos)
711 ValueType term_bond1_vec[3];
712 ValueType term_bond2_vec[3];
713 ValueType oop_bond_vec[3];
714 ValueType plane_normal[3];
716 Detail::subVectors(ctr_atom_pos, term_atom1_pos, term_bond1_vec);
717 Detail::subVectors(ctr_atom_pos, term_atom2_pos, term_bond2_vec);
718 Detail::subVectors(ctr_atom_pos, oop_atom_pos, oop_bond_vec);
719 Detail::calcCrossProduct(term_bond1_vec, term_bond2_vec, plane_normal);
721 ValueType pn_len = std::sqrt(Detail::calcDotProduct<ValueType>(plane_normal, plane_normal));
722 ValueType oop_bnd_len = std::sqrt(Detail::calcDotProduct<ValueType>(oop_bond_vec, oop_bond_vec));
723 ValueType ang_cos = Detail::clampCosine(Detail::calcDotProduct<ValueType>(plane_normal, oop_bond_vec) / (pn_len * oop_bnd_len));
725 return (ValueType(M_PI * 0.5) - std::acos(ang_cos));
728 template <
typename ValueType,
typename CoordsVec>
730 const CoordsVec& term_atom2_pos,
const CoordsVec& oop_atom_pos,
731 const ValueType& r_jl)
733 ValueType term_bond1_vec[3];
734 ValueType term_bond2_vec[3];
735 ValueType oop_bond_vec[3];
736 ValueType plane_normal[3];
738 Detail::subVectors(ctr_atom_pos, term_atom1_pos, term_bond1_vec);
739 Detail::subVectors(ctr_atom_pos, term_atom2_pos, term_bond2_vec);
740 Detail::subVectors(ctr_atom_pos, oop_atom_pos, oop_bond_vec);
741 Detail::calcCrossProduct(term_bond1_vec, term_bond2_vec, plane_normal);
743 ValueType pn_len = std::sqrt(Detail::calcDotProduct<ValueType>(plane_normal, plane_normal));
744 ValueType ang_cos = Detail::clampCosine(Detail::calcDotProduct<ValueType>(plane_normal, oop_bond_vec) / (pn_len * r_jl));
746 return (ValueType(M_PI * 0.5) - std::acos(ang_cos));
749 template <
typename ValueType,
typename CoordsVec>
751 const CoordsVec& ctr_atom2_pos,
const CoordsVec& term_atom2_pos)
753 ValueType term_bond1_vec[3];
754 ValueType ctr_bond_vec[3];
755 ValueType term_bond2_vec[3];
756 ValueType plane_normal1[3];
757 ValueType plane_normal2[3];
759 Detail::subVectors(ctr_atom1_pos, term_atom1_pos, term_bond1_vec);
760 Detail::subVectors(ctr_atom1_pos, ctr_atom2_pos, ctr_bond_vec);
761 Detail::subVectors(term_atom2_pos, ctr_atom2_pos, term_bond2_vec);
763 Detail::calcCrossProduct(term_bond1_vec, ctr_bond_vec, plane_normal1);
764 Detail::calcCrossProduct(ctr_bond_vec, term_bond2_vec, plane_normal2);
766 ValueType pn1_len = std::sqrt(Detail::calcDotProduct<ValueType>(plane_normal1, plane_normal1));
767 ValueType pn2_len = std::sqrt(Detail::calcDotProduct<ValueType>(plane_normal2, plane_normal2));
769 return Detail::clampCosine(Detail::calcDotProduct<ValueType>(plane_normal1, plane_normal2) / (pn1_len * pn2_len));
772 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
774 GradVec& atom1_deriv, GradVec& atom2_deriv)
776 Detail::subVectors(atom1_pos, atom2_pos, atom1_deriv);
778 ValueType dist = std::sqrt(Detail::calcDotProduct<ValueType>(atom1_deriv, atom1_deriv));
780 Detail::invScaleVector(atom1_deriv, -dist);
781 Detail::negateCopyVector(atom1_deriv, atom2_deriv);
786 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
788 GradVec& term_atom1_deriv, GradVec& ctr_atom_deriv, GradVec& term_atom2_deriv)
790 ValueType bond_vec1[3];
791 ValueType bond_vec2[3];
793 Detail::subVectors(ctr_atom_pos, term_atom1_pos, bond_vec1);
794 Detail::subVectors(ctr_atom_pos, term_atom2_pos, bond_vec2);
796 ValueType bond_length1 = std::sqrt(Detail::calcDotProduct<ValueType>(bond_vec1, bond_vec1));
797 ValueType bond_length2 = std::sqrt(Detail::calcDotProduct<ValueType>(bond_vec2, bond_vec2));
799 ValueType dot_prod = Detail::calcDotProduct<ValueType>(bond_vec1, bond_vec2);
800 ValueType bl_prod = bond_length1 * bond_length2;
802 Detail::invScaleCopyVector(bond_vec2, bl_prod, term_atom1_deriv);
803 Detail::scaleCopyVector(bond_vec1, dot_prod / (bond_length1 * bond_length1 * bl_prod), ctr_atom_deriv);
804 Detail::subVectors(ctr_atom_deriv, term_atom1_deriv, term_atom1_deriv);
806 Detail::invScaleCopyVector(bond_vec1, bl_prod, term_atom2_deriv);
807 Detail::scaleCopyVector(bond_vec2, dot_prod / (bond_length2 * bond_length2 * bl_prod), ctr_atom_deriv);
808 Detail::subVectors(ctr_atom_deriv, term_atom2_deriv, term_atom2_deriv);
810 Detail::negateCopyVector(term_atom1_deriv, ctr_atom_deriv);
811 Detail::subVectors(term_atom2_deriv, ctr_atom_deriv, ctr_atom_deriv);
813 return Detail::clampCosine(dot_prod / bl_prod);
816 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
818 const CoordsVec& ctr_atom2_pos,
const CoordsVec& term_atom2_pos,
819 GradVec& term_atom1_deriv, GradVec& ctr_atom1_deriv,
820 GradVec& ctr_atom2_deriv, GradVec& term_atom2_deriv)
822 ValueType term_bond1_vec[3];
823 ValueType ctr_bond_vec[3];
824 ValueType term_bond2_vec[3];
825 ValueType term1_ctr2_vec[3];
826 ValueType plane_normal1[3];
827 ValueType plane_normal2[3];
829 Detail::subVectors(ctr_atom1_pos, term_atom1_pos, term_bond1_vec);
830 Detail::subVectors(ctr_atom1_pos, ctr_atom2_pos, ctr_bond_vec);
831 Detail::subVectors(term_atom2_pos, ctr_atom2_pos, term_bond2_vec);
832 Detail::subVectors(ctr_atom2_pos, term_atom1_pos, term1_ctr2_vec);
834 Detail::calcCrossProduct(term_bond1_vec, ctr_bond_vec, plane_normal1);
835 Detail::calcCrossProduct(ctr_bond_vec, term_bond2_vec, plane_normal2);
837 ValueType pn1_len = std::sqrt(Detail::calcDotProduct<ValueType>(plane_normal1, plane_normal1));
838 ValueType pn2_len = std::sqrt(Detail::calcDotProduct<ValueType>(plane_normal2, plane_normal2));
840 Detail::invScaleVector(plane_normal1, pn1_len);
841 Detail::invScaleVector(plane_normal2, pn2_len);
843 ValueType ang_cos = Detail::clampCosine(Detail::calcDotProduct<ValueType>(plane_normal1, plane_normal2));
848 Detail::scaleCopyVector(plane_normal1, -ang_cos, a);
849 Detail::addVectors(a, plane_normal2, a);
850 Detail::invScaleVector(a, pn1_len);
852 Detail::scaleCopyVector(plane_normal2, -ang_cos, b);
853 Detail::addVectors(b, plane_normal1, b);
854 Detail::invScaleVector(b, pn2_len);
856 Detail::calcCrossProduct(ctr_bond_vec, a, term_atom1_deriv);
857 Detail::calcCrossProduct(ctr_bond_vec, b, term_atom2_deriv);
859 Detail::calcCrossProduct(term1_ctr2_vec, a, ctr_atom1_deriv);
860 Detail::calcCrossProduct(term_bond2_vec, b, ctr_atom2_deriv);
862 Detail::subVectors(ctr_atom2_deriv, ctr_atom1_deriv, ctr_atom1_deriv);
864 Detail::addVectors(term_atom1_deriv, ctr_atom1_deriv, ctr_atom2_deriv);
865 Detail::addVectors(ctr_atom2_deriv, term_atom2_deriv, ctr_atom2_deriv);
866 Detail::negateVector(ctr_atom2_deriv);
871 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
873 const CoordsVec& term_atom2_pos,
const CoordsVec& oop_atom_pos,
874 GradVec& term_atom1_deriv, GradVec& ctr_atom_deriv,
875 GradVec& term_atom2_deriv, GradVec& oop_atom_deriv)
877 ValueType term_bond1_vec[3];
878 ValueType term_bond2_vec[3];
879 ValueType oop_bond_vec[3];
880 ValueType term1_oop_vec[3];
881 ValueType term2_oop_vec[3];
884 Detail::subVectors(ctr_atom_pos, term_atom1_pos, term_bond1_vec);
885 Detail::subVectors(ctr_atom_pos, term_atom2_pos, term_bond2_vec);
886 Detail::subVectors(ctr_atom_pos, oop_atom_pos, oop_bond_vec);
887 Detail::subVectors(term_atom2_pos, oop_atom_pos, term2_oop_vec);
888 Detail::subVectors(term_atom1_pos, oop_atom_pos, term1_oop_vec);
890 Detail::calcCrossProduct(term_bond1_vec, term_bond2_vec, ijk_pn);
892 ValueType ijk_pn_len_2 = Detail::calcDotProduct<ValueType>(ijk_pn, ijk_pn);
893 ValueType ijk_pn_len = std::sqrt(ijk_pn_len_2);
894 ValueType oop_bnd_len = std::sqrt(Detail::calcDotProduct<ValueType>(oop_bond_vec, oop_bond_vec));
895 ValueType oop_ijk_pn_len_prod = ijk_pn_len * oop_bnd_len;
896 ValueType oop_ijk_pn_dot_prod = Detail::calcDotProduct<ValueType>(ijk_pn, oop_bond_vec);
897 ValueType ang_cos = Detail::clampCosine(oop_ijk_pn_dot_prod / oop_ijk_pn_len_prod);
902 Detail::calcCrossProduct(term_bond2_vec, oop_bond_vec, kjl_pn);
903 Detail::calcCrossProduct(oop_bond_vec, term_bond1_vec, lji_pn);
905 ctr_atom_deriv[0] = ijk_pn[1] * -term_bond2_vec[2] + ijk_pn[2] * term_bond2_vec[1];
906 ctr_atom_deriv[1] = ijk_pn[0] * term_bond2_vec[2] + ijk_pn[2] * -term_bond2_vec[0];
907 ctr_atom_deriv[2] = ijk_pn[0] * -term_bond2_vec[1] + ijk_pn[1] * term_bond2_vec[0];
909 Detail::scaleVector(ctr_atom_deriv, ang_cos / ijk_pn_len_2);
911 Detail::invScaleCopyVector(kjl_pn, oop_ijk_pn_len_prod, term_atom1_deriv);
912 Detail::subVectors(ctr_atom_deriv, term_atom1_deriv, term_atom1_deriv);
914 ctr_atom_deriv[0] = ijk_pn[1] * term_bond1_vec[2] + ijk_pn[2] * -term_bond1_vec[1];
915 ctr_atom_deriv[1] = ijk_pn[0] * -term_bond1_vec[2] + ijk_pn[2] * term_bond1_vec[0];
916 ctr_atom_deriv[2] = ijk_pn[0] * term_bond1_vec[1] + ijk_pn[1] * -term_bond1_vec[0];
918 Detail::scaleVector(ctr_atom_deriv, ang_cos / ijk_pn_len_2);
920 Detail::invScaleCopyVector(lji_pn, oop_ijk_pn_len_prod, term_atom2_deriv);
921 Detail::subVectors(ctr_atom_deriv, term_atom2_deriv, term_atom2_deriv);
923 Detail::calcCrossProduct(term2_oop_vec, term1_oop_vec, ctr_atom_deriv);
925 Detail::scaleCopyVector(oop_bond_vec, oop_ijk_pn_dot_prod / (oop_bnd_len * oop_bnd_len), oop_atom_deriv);
926 Detail::addVectors(oop_atom_deriv, lji_pn, oop_atom_deriv);
927 Detail::addVectors(oop_atom_deriv, kjl_pn, oop_atom_deriv);
928 Detail::addVectors(oop_atom_deriv, ctr_atom_deriv, oop_atom_deriv);
929 Detail::invScaleVector(oop_atom_deriv, -oop_ijk_pn_len_prod);
931 Detail::copyVector(term_atom1_deriv, ctr_atom_deriv);
932 Detail::addVectors(term_atom2_deriv, ctr_atom_deriv, ctr_atom_deriv);
933 Detail::addVectors(oop_atom_deriv, ctr_atom_deriv, ctr_atom_deriv);
934 Detail::negateVector(ctr_atom_deriv);
Declaration of type CDPL::Util::BitSet.
Definition of the preprocessor macro CDPL_FORCEFIELD_API.
#define CDPL_FORCEFIELD_API
Tells the compiler/linker which classes, functions and variables are part of the library API.
Container holding the full set of MMFF94 interaction parameters for a molecular graph.
Definition: MMFF94InteractionData.hpp:60
constexpr unsigned int T
Specifies Hydrogen (Tritium).
Definition: AtomType.hpp:67
ValueType calcOutOfPlaneAngle(const CoordsVec &term_atom1_pos, const CoordsVec &ctr_atom_pos, const CoordsVec &term_atom2_pos, const CoordsVec &oop_atom_pos)
Calculates the out-of-plane angle between the bond j-l and the plane defined by the atoms i-j-k.
ValueType calcDihedralAngleCosDerivatives(const CoordsVec &term_atom1_pos, const CoordsVec &ctr_atom1_pos, const CoordsVec &ctr_atom2_pos, const CoordsVec &term_atom2_pos, GradVec &term_atom1_deriv, GradVec &ctr_atom1_deriv, GradVec &ctr_atom2_deriv, GradVec &term_atom2_deriv)
Calculates the partial derivatives of the cosine of the angle between the planes defined by the ato...
ValueType calcSquaredDistance(const CoordsVec &atom1_pos, const CoordsVec &atom2_pos)
Calculates the squared distance between two atoms i and j.
ValueType calcBondAngle(const CoordsVec &term_atom1_pos, const CoordsVec &ctr_atom_pos, const CoordsVec &term_atom2_pos)
Calculates the bond angle between the two bonds i-j and j-k.
ValueType calcBondLengthsAndAngleCos(const CoordsVec &term_atom1_pos, const CoordsVec &ctr_atom_pos, const CoordsVec &term_atom2_pos, ValueType &bond_length1, ValueType &bond_length2)
Calculates bond lengths and and the cosine of the bond angle between the two bonds i-j and j-k.
ValueType calcOutOfPlaneAngleCosDerivatives(const CoordsVec &term_atom1_pos, const CoordsVec &ctr_atom_pos, const CoordsVec &term_atom2_pos, const CoordsVec &oop_atom_pos, GradVec &term_atom1_deriv, GradVec &ctr_atom_deriv, GradVec &term_atom2_deriv, GradVec &oop_atom_deriv)
Calculates the partial derivatives of the cosine of the angle between the bond j-l and the normal o...
ValueType calcDihedralAngleCos(const CoordsVec &term_atom1_pos, const CoordsVec &ctr_atom1_pos, const CoordsVec &ctr_atom2_pos, const CoordsVec &term_atom2_pos)
Calculates the cosine of the dihedral angle between the planes defined by the atom triplets i-j-k an...
ValueType calcBondLengthsAndAngle(const CoordsVec &term_atom1_pos, const CoordsVec &ctr_atom_pos, const CoordsVec &term_atom2_pos, ValueType &bond_length1, ValueType &bond_length2)
Calculates bond lengths and and the bond angle between the two bonds i-j and j-k.
ValueType calcBondAngleCosDerivatives(const CoordsVec &term_atom1_pos, const CoordsVec &ctr_atom_pos, const CoordsVec &term_atom2_pos, GradVec &term_atom1_deriv, GradVec &ctr_atom_deriv, GradVec &term_atom2_deriv)
Calculates the partial derivatives of the of the cosine of the angle between the bonds i-j and j-k.
ValueType calcDistance(const CoordsVec &atom1_pos, const CoordsVec &atom2_pos)
Calculates the distance between two atoms i and j.
CDPL_FORCEFIELD_API void filterInteractions(const MMFF94InteractionData &ia_data, MMFF94InteractionData &filtered_ia_data, const Util::BitSet &inc_atom_mask)
Filters an MMFF94 interaction-data set, retaining only those interactions that exclusively reference ...
ValueType calcBondAngleCos(const CoordsVec &term_atom1_pos, const CoordsVec &ctr_atom_pos, const CoordsVec &term_atom2_pos)
Calculates the cosine of the bond angle between the two bonds i-j and j-k.
ValueType calcDistanceDerivatives(const CoordsVec &atom1_pos, const CoordsVec &atom2_pos, GradVec &atom1_deriv, GradVec &atom2_deriv)
Calculates the partial derivatives of the distance between two atoms i and j.
QuaternionVectorAdapter< E > vec(QuaternionExpression< E > &e)
Creates a mutable Math::QuaternionVectorAdapter view of the quaternion expression e.
Definition: QuaternionAdapter.hpp:372
boost::dynamic_bitset BitSet
Dynamic bitset class.
Definition: BitSet.hpp:46
The namespace of the Chemical Data Processing Library.