29 #ifndef CDPL_FORCEFIELD_UTILITYFUNCTIONS_HPP
30 #define CDPL_FORCEFIELD_UTILITYFUNCTIONS_HPP
44 class MMFF94InteractionData;
70 template <
typename ValueType,
typename CoordsVec>
88 template <
typename ValueType,
typename CoordsVec>
89 ValueType
calcDistance(
const CoordsVec& atom1_pos,
const CoordsVec& atom2_pos);
114 template <
typename ValueType,
typename CoordsVec>
116 ValueType& bond_length1, ValueType& bond_length2);
141 template <
typename ValueType,
typename CoordsVec>
142 ValueType
calcBondLengthsAndAngle(
const CoordsVec& term_atom1_pos,
const CoordsVec& ctr_atom_pos,
const CoordsVec& term_atom2_pos,
143 ValueType& bond_length1, ValueType& bond_length2);
163 template <
typename ValueType,
typename CoordsVec>
164 ValueType
calcBondAngleCos(
const CoordsVec& term_atom1_pos,
const CoordsVec& ctr_atom_pos,
const CoordsVec& term_atom2_pos);
186 template <
typename ValueType,
typename CoordsVec>
187 ValueType
calcBondAngleCos(
const CoordsVec& term_atom1_pos,
const CoordsVec& ctr_atom_pos,
const CoordsVec& term_atom2_pos,
188 const ValueType& r_ij,
const ValueType& r_jk);
208 template <
typename ValueType,
typename CoordsVec>
209 ValueType
calcBondAngle(
const CoordsVec& term_atom1_pos,
const CoordsVec& ctr_atom_pos,
const CoordsVec& term_atom2_pos);
231 template <
typename ValueType,
typename CoordsVec>
232 ValueType
calcBondAngle(
const CoordsVec& term_atom1_pos,
const CoordsVec& ctr_atom_pos,
const CoordsVec& term_atom2_pos,
233 const ValueType& r_ij,
const ValueType& r_jk);
257 template <
typename ValueType,
typename CoordsVec>
259 const CoordsVec& term_atom2_pos,
const CoordsVec& oop_atom_pos);
284 template <
typename ValueType,
typename CoordsVec>
286 const CoordsVec& term_atom2_pos,
const CoordsVec& oop_atom_pos,
287 const ValueType& r_jl);
312 template <
typename ValueType,
typename CoordsVec>
314 const CoordsVec& ctr_atom2_pos,
const CoordsVec& term_atom2_pos);
338 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
340 GradVec& atom1_deriv, GradVec& atom2_deriv);
372 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
374 GradVec& term_atom1_deriv, GradVec& ctr_atom_deriv, GradVec& term_atom2_deriv);
417 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
419 const CoordsVec& ctr_atom2_pos,
const CoordsVec& term_atom2_pos,
420 GradVec& term_atom1_deriv, GradVec& ctr_atom1_deriv,
421 GradVec& ctr_atom2_deriv, GradVec& term_atom2_deriv);
482 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
484 const CoordsVec& term_atom2_pos,
const CoordsVec& oop_atom_pos,
485 GradVec& term_atom1_deriv, GradVec& ctr_atom_deriv,
486 GradVec& term_atom2_deriv, GradVec& oop_atom_deriv);
503 template <
typename VecType1,
typename VecType2,
typename VecType3>
504 void addVectors(
const VecType1& vec1,
const VecType2& vec2, VecType3& res)
506 res[0] = vec2[0] + vec1[0];
507 res[1] = vec2[1] + vec1[1];
508 res[2] = vec2[2] + vec1[2];
511 template <
typename VecType1,
typename VecType2>
512 void subVectors(
const VecType1& vec1,
const VecType1& vec2, VecType2& res)
514 res[0] = vec2[0] - vec1[0];
515 res[1] = vec2[1] - vec1[1];
516 res[2] = vec2[2] - vec1[2];
519 template <
typename ValueType,
typename VecType>
520 ValueType calcDotProduct(
const VecType& vec1,
const VecType& vec2)
522 return (vec1[0] * vec2[0] + vec1[1] * vec2[1] + vec1[2] * vec2[2]);
525 template <
typename VecType,
typename ResVecType>
526 void calcCrossProduct(
const VecType& vec1,
const VecType& vec2, ResVecType& cross_prod)
528 cross_prod[0] = vec1[1] * vec2[2] - vec1[2] * vec2[1];
529 cross_prod[1] = vec1[2] * vec2[0] - vec1[0] * vec2[2];
530 cross_prod[2] = vec1[0] * vec2[1] - vec1[1] * vec2[0];
533 template <
typename VecType1,
typename VecType2>
534 void copyVector(
const VecType1& vec1, VecType2& vec2)
541 template <
typename VecType>
542 void negateVector(VecType&
vec)
549 template <
typename VecType1,
typename VecType2>
550 void negateCopyVector(
const VecType1& vec1, VecType2& vec2)
557 template <
typename VecType,
typename T>
558 void scaleVector(VecType&
vec,
const T& factor)
565 template <
typename VecType,
typename T>
566 void invScaleVector(VecType&
vec,
const T& factor)
573 template <
typename VecType1,
typename VecType2,
typename T>
574 void scaleAddVector(
const VecType1& vec1,
const T& factor, VecType2& vec2)
576 vec2[0] += vec1[0] * factor;
577 vec2[1] += vec1[1] * factor;
578 vec2[2] += vec1[2] * factor;
581 template <
typename VecType1,
typename VecType2,
typename T>
582 void scaleCopyVector(
const VecType1& vec1,
const T& factor, VecType2& vec2)
584 vec2[0] = vec1[0] * factor;
585 vec2[1] = vec1[1] * factor;
586 vec2[2] = vec1[2] * factor;
589 template <
typename VecType1,
typename VecType2,
typename T>
590 void invScaleCopyVector(
const VecType1& vec1,
const T& factor, VecType2& vec2)
592 vec2[0] = vec1[0] / factor;
593 vec2[1] = vec1[1] / factor;
594 vec2[2] = vec1[2] / factor;
597 template <
typename ValueType>
598 ValueType clampCosine(
const ValueType& v)
600 if (v > ValueType(1))
603 if (v < ValueType(-1))
604 return ValueType(-1);
609 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename FuncType>
610 ValueType accumInteractionEnergies(Iter& beg,
const Iter& end,
const CoordsArray& coords,
const FuncType& func)
612 ValueType e = ValueType();
614 for (; beg != end; ++beg)
615 e += func(*beg, coords);
620 template <
typename ValueType,
typename Iter,
typename CoordsArray,
typename GradVector,
typename FuncType>
621 ValueType calcInteractionGradient(Iter& beg,
const Iter& end,
const CoordsArray& coords, GradVector& grad,
const FuncType& func)
623 ValueType e = ValueType();
625 for (; beg != end; ++beg)
626 e += func(*beg, coords, grad);
635 template <
typename ValueType,
typename CoordsVec>
638 ValueType pos_diff[3];
640 Detail::subVectors(atom1_pos, atom2_pos, pos_diff);
642 return Detail::calcDotProduct<ValueType>(pos_diff, pos_diff);
645 template <
typename ValueType,
typename CoordsVec>
648 return std::sqrt(calcSquaredDistance<ValueType>(atom1_pos, atom2_pos));
651 template <
typename ValueType,
typename CoordsVec>
653 ValueType& bond_length1, ValueType& bond_length2)
655 ValueType bond_vec1[3];
656 ValueType bond_vec2[3];
658 Detail::subVectors(ctr_atom_pos, term_atom1_pos, bond_vec1);
659 Detail::subVectors(ctr_atom_pos, term_atom2_pos, bond_vec2);
661 bond_length1 = std::sqrt(Detail::calcDotProduct<ValueType>(bond_vec1, bond_vec1));
662 bond_length2 = std::sqrt(Detail::calcDotProduct<ValueType>(bond_vec2, bond_vec2));
664 return Detail::clampCosine(Detail::calcDotProduct<ValueType>(bond_vec1, bond_vec2) / (bond_length1 * bond_length2));
667 template <
typename ValueType,
typename CoordsVec>
669 ValueType& bond_length1, ValueType& bond_length2)
674 template <
typename ValueType,
typename CoordsVec>
682 template <
typename ValueType,
typename CoordsVec>
684 const ValueType& r_ij,
const ValueType& r_jk)
686 ValueType bond_vec1[3];
687 ValueType bond_vec2[3];
689 Detail::subVectors(ctr_atom_pos, term_atom1_pos, bond_vec1);
690 Detail::subVectors(ctr_atom_pos, term_atom2_pos, bond_vec2);
692 return Detail::clampCosine(Detail::calcDotProduct<ValueType>(bond_vec1, bond_vec2) / (r_ij * r_jk));
695 template <
typename ValueType,
typename CoordsVec>
698 return std::acos(calcBondAngleCos<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos));
701 template <
typename ValueType,
typename CoordsVec>
703 const ValueType& r_ij,
const ValueType& r_jk)
705 return std::acos(calcBondAngleCos<ValueType>(term_atom1_pos, ctr_atom_pos, term_atom2_pos, r_ij, r_jk));
708 template <
typename ValueType,
typename CoordsVec>
710 const CoordsVec& term_atom2_pos,
const CoordsVec& oop_atom_pos)
712 ValueType term_bond1_vec[3];
713 ValueType term_bond2_vec[3];
714 ValueType oop_bond_vec[3];
715 ValueType plane_normal[3];
717 Detail::subVectors(ctr_atom_pos, term_atom1_pos, term_bond1_vec);
718 Detail::subVectors(ctr_atom_pos, term_atom2_pos, term_bond2_vec);
719 Detail::subVectors(ctr_atom_pos, oop_atom_pos, oop_bond_vec);
720 Detail::calcCrossProduct(term_bond1_vec, term_bond2_vec, plane_normal);
722 ValueType pn_len = std::sqrt(Detail::calcDotProduct<ValueType>(plane_normal, plane_normal));
723 ValueType oop_bnd_len = std::sqrt(Detail::calcDotProduct<ValueType>(oop_bond_vec, oop_bond_vec));
724 ValueType ang_cos = Detail::clampCosine(Detail::calcDotProduct<ValueType>(plane_normal, oop_bond_vec) / (pn_len * oop_bnd_len));
726 return (ValueType(M_PI * 0.5) - std::acos(ang_cos));
729 template <
typename ValueType,
typename CoordsVec>
731 const CoordsVec& term_atom2_pos,
const CoordsVec& oop_atom_pos,
732 const ValueType& r_jl)
734 ValueType term_bond1_vec[3];
735 ValueType term_bond2_vec[3];
736 ValueType oop_bond_vec[3];
737 ValueType plane_normal[3];
739 Detail::subVectors(ctr_atom_pos, term_atom1_pos, term_bond1_vec);
740 Detail::subVectors(ctr_atom_pos, term_atom2_pos, term_bond2_vec);
741 Detail::subVectors(ctr_atom_pos, oop_atom_pos, oop_bond_vec);
742 Detail::calcCrossProduct(term_bond1_vec, term_bond2_vec, plane_normal);
744 ValueType pn_len = std::sqrt(Detail::calcDotProduct<ValueType>(plane_normal, plane_normal));
745 ValueType ang_cos = Detail::clampCosine(Detail::calcDotProduct<ValueType>(plane_normal, oop_bond_vec) / (pn_len * r_jl));
747 return (ValueType(M_PI * 0.5) - std::acos(ang_cos));
750 template <
typename ValueType,
typename CoordsVec>
752 const CoordsVec& ctr_atom2_pos,
const CoordsVec& term_atom2_pos)
754 ValueType term_bond1_vec[3];
755 ValueType ctr_bond_vec[3];
756 ValueType term_bond2_vec[3];
757 ValueType plane_normal1[3];
758 ValueType plane_normal2[3];
760 Detail::subVectors(ctr_atom1_pos, term_atom1_pos, term_bond1_vec);
761 Detail::subVectors(ctr_atom1_pos, ctr_atom2_pos, ctr_bond_vec);
762 Detail::subVectors(term_atom2_pos, ctr_atom2_pos, term_bond2_vec);
764 Detail::calcCrossProduct(term_bond1_vec, ctr_bond_vec, plane_normal1);
765 Detail::calcCrossProduct(ctr_bond_vec, term_bond2_vec, plane_normal2);
767 ValueType pn1_len = std::sqrt(Detail::calcDotProduct<ValueType>(plane_normal1, plane_normal1));
768 ValueType pn2_len = std::sqrt(Detail::calcDotProduct<ValueType>(plane_normal2, plane_normal2));
770 return Detail::clampCosine(Detail::calcDotProduct<ValueType>(plane_normal1, plane_normal2) / (pn1_len * pn2_len));
773 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
775 GradVec& atom1_deriv, GradVec& atom2_deriv)
777 Detail::subVectors(atom1_pos, atom2_pos, atom1_deriv);
779 ValueType dist = std::sqrt(Detail::calcDotProduct<ValueType>(atom1_deriv, atom1_deriv));
781 Detail::invScaleVector(atom1_deriv, -dist);
782 Detail::negateCopyVector(atom1_deriv, atom2_deriv);
787 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
789 GradVec& term_atom1_deriv, GradVec& ctr_atom_deriv, GradVec& term_atom2_deriv)
791 ValueType bond_vec1[3];
792 ValueType bond_vec2[3];
794 Detail::subVectors(ctr_atom_pos, term_atom1_pos, bond_vec1);
795 Detail::subVectors(ctr_atom_pos, term_atom2_pos, bond_vec2);
797 ValueType bond_length1 = std::sqrt(Detail::calcDotProduct<ValueType>(bond_vec1, bond_vec1));
798 ValueType bond_length2 = std::sqrt(Detail::calcDotProduct<ValueType>(bond_vec2, bond_vec2));
800 ValueType dot_prod = Detail::calcDotProduct<ValueType>(bond_vec1, bond_vec2);
801 ValueType bl_prod = bond_length1 * bond_length2;
803 Detail::invScaleCopyVector(bond_vec2, bl_prod, term_atom1_deriv);
804 Detail::scaleCopyVector(bond_vec1, dot_prod / (bond_length1 * bond_length1 * bl_prod), ctr_atom_deriv);
805 Detail::subVectors(ctr_atom_deriv, term_atom1_deriv, term_atom1_deriv);
807 Detail::invScaleCopyVector(bond_vec1, bl_prod, term_atom2_deriv);
808 Detail::scaleCopyVector(bond_vec2, dot_prod / (bond_length2 * bond_length2 * bl_prod), ctr_atom_deriv);
809 Detail::subVectors(ctr_atom_deriv, term_atom2_deriv, term_atom2_deriv);
811 Detail::negateCopyVector(term_atom1_deriv, ctr_atom_deriv);
812 Detail::subVectors(term_atom2_deriv, ctr_atom_deriv, ctr_atom_deriv);
814 return Detail::clampCosine(dot_prod / bl_prod);
817 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
819 const CoordsVec& ctr_atom2_pos,
const CoordsVec& term_atom2_pos,
820 GradVec& term_atom1_deriv, GradVec& ctr_atom1_deriv,
821 GradVec& ctr_atom2_deriv, GradVec& term_atom2_deriv)
823 ValueType term_bond1_vec[3];
824 ValueType ctr_bond_vec[3];
825 ValueType term_bond2_vec[3];
826 ValueType term1_ctr2_vec[3];
827 ValueType plane_normal1[3];
828 ValueType plane_normal2[3];
830 Detail::subVectors(ctr_atom1_pos, term_atom1_pos, term_bond1_vec);
831 Detail::subVectors(ctr_atom1_pos, ctr_atom2_pos, ctr_bond_vec);
832 Detail::subVectors(term_atom2_pos, ctr_atom2_pos, term_bond2_vec);
833 Detail::subVectors(ctr_atom2_pos, term_atom1_pos, term1_ctr2_vec);
835 Detail::calcCrossProduct(term_bond1_vec, ctr_bond_vec, plane_normal1);
836 Detail::calcCrossProduct(ctr_bond_vec, term_bond2_vec, plane_normal2);
838 ValueType pn1_len = std::sqrt(Detail::calcDotProduct<ValueType>(plane_normal1, plane_normal1));
839 ValueType pn2_len = std::sqrt(Detail::calcDotProduct<ValueType>(plane_normal2, plane_normal2));
841 Detail::invScaleVector(plane_normal1, pn1_len);
842 Detail::invScaleVector(plane_normal2, pn2_len);
844 ValueType ang_cos = Detail::clampCosine(Detail::calcDotProduct<ValueType>(plane_normal1, plane_normal2));
849 Detail::scaleCopyVector(plane_normal1, -ang_cos, a);
850 Detail::addVectors(a, plane_normal2, a);
851 Detail::invScaleVector(a, pn1_len);
853 Detail::scaleCopyVector(plane_normal2, -ang_cos, b);
854 Detail::addVectors(b, plane_normal1, b);
855 Detail::invScaleVector(b, pn2_len);
857 Detail::calcCrossProduct(ctr_bond_vec, a, term_atom1_deriv);
858 Detail::calcCrossProduct(ctr_bond_vec, b, term_atom2_deriv);
860 Detail::calcCrossProduct(term1_ctr2_vec, a, ctr_atom1_deriv);
861 Detail::calcCrossProduct(term_bond2_vec, b, ctr_atom2_deriv);
863 Detail::subVectors(ctr_atom2_deriv, ctr_atom1_deriv, ctr_atom1_deriv);
865 Detail::addVectors(term_atom1_deriv, ctr_atom1_deriv, ctr_atom2_deriv);
866 Detail::addVectors(ctr_atom2_deriv, term_atom2_deriv, ctr_atom2_deriv);
867 Detail::negateVector(ctr_atom2_deriv);
872 template <
typename ValueType,
typename CoordsVec,
typename GradVec>
874 const CoordsVec& term_atom2_pos,
const CoordsVec& oop_atom_pos,
875 GradVec& term_atom1_deriv, GradVec& ctr_atom_deriv,
876 GradVec& term_atom2_deriv, GradVec& oop_atom_deriv)
878 ValueType term_bond1_vec[3];
879 ValueType term_bond2_vec[3];
880 ValueType oop_bond_vec[3];
881 ValueType term1_oop_vec[3];
882 ValueType term2_oop_vec[3];
885 Detail::subVectors(ctr_atom_pos, term_atom1_pos, term_bond1_vec);
886 Detail::subVectors(ctr_atom_pos, term_atom2_pos, term_bond2_vec);
887 Detail::subVectors(ctr_atom_pos, oop_atom_pos, oop_bond_vec);
888 Detail::subVectors(term_atom2_pos, oop_atom_pos, term2_oop_vec);
889 Detail::subVectors(term_atom1_pos, oop_atom_pos, term1_oop_vec);
891 Detail::calcCrossProduct(term_bond1_vec, term_bond2_vec, ijk_pn);
893 ValueType ijk_pn_len_2 = Detail::calcDotProduct<ValueType>(ijk_pn, ijk_pn);
894 ValueType ijk_pn_len = std::sqrt(ijk_pn_len_2);
895 ValueType oop_bnd_len = std::sqrt(Detail::calcDotProduct<ValueType>(oop_bond_vec, oop_bond_vec));
896 ValueType oop_ijk_pn_len_prod = ijk_pn_len * oop_bnd_len;
897 ValueType oop_ijk_pn_dot_prod = Detail::calcDotProduct<ValueType>(ijk_pn, oop_bond_vec);
898 ValueType ang_cos = Detail::clampCosine(oop_ijk_pn_dot_prod / oop_ijk_pn_len_prod);
903 Detail::calcCrossProduct(term_bond2_vec, oop_bond_vec, kjl_pn);
904 Detail::calcCrossProduct(oop_bond_vec, term_bond1_vec, lji_pn);
906 ctr_atom_deriv[0] = ijk_pn[1] * -term_bond2_vec[2] + ijk_pn[2] * term_bond2_vec[1];
907 ctr_atom_deriv[1] = ijk_pn[0] * term_bond2_vec[2] + ijk_pn[2] * -term_bond2_vec[0];
908 ctr_atom_deriv[2] = ijk_pn[0] * -term_bond2_vec[1] + ijk_pn[1] * term_bond2_vec[0];
910 Detail::scaleVector(ctr_atom_deriv, ang_cos / ijk_pn_len_2);
912 Detail::invScaleCopyVector(kjl_pn, oop_ijk_pn_len_prod, term_atom1_deriv);
913 Detail::subVectors(ctr_atom_deriv, term_atom1_deriv, term_atom1_deriv);
915 ctr_atom_deriv[0] = ijk_pn[1] * term_bond1_vec[2] + ijk_pn[2] * -term_bond1_vec[1];
916 ctr_atom_deriv[1] = ijk_pn[0] * -term_bond1_vec[2] + ijk_pn[2] * term_bond1_vec[0];
917 ctr_atom_deriv[2] = ijk_pn[0] * term_bond1_vec[1] + ijk_pn[1] * -term_bond1_vec[0];
919 Detail::scaleVector(ctr_atom_deriv, ang_cos / ijk_pn_len_2);
921 Detail::invScaleCopyVector(lji_pn, oop_ijk_pn_len_prod, term_atom2_deriv);
922 Detail::subVectors(ctr_atom_deriv, term_atom2_deriv, term_atom2_deriv);
924 Detail::calcCrossProduct(term2_oop_vec, term1_oop_vec, ctr_atom_deriv);
926 Detail::scaleCopyVector(oop_bond_vec, oop_ijk_pn_dot_prod / (oop_bnd_len * oop_bnd_len), oop_atom_deriv);
927 Detail::addVectors(oop_atom_deriv, lji_pn, oop_atom_deriv);
928 Detail::addVectors(oop_atom_deriv, kjl_pn, oop_atom_deriv);
929 Detail::addVectors(oop_atom_deriv, ctr_atom_deriv, oop_atom_deriv);
930 Detail::invScaleVector(oop_atom_deriv, -oop_ijk_pn_len_prod);
932 Detail::copyVector(term_atom1_deriv, ctr_atom_deriv);
933 Detail::addVectors(term_atom2_deriv, ctr_atom_deriv, ctr_atom_deriv);
934 Detail::addVectors(oop_atom_deriv, ctr_atom_deriv, ctr_atom_deriv);
935 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 parameter records for a molecular graph.
Definition: MMFF94InteractionData.hpp:62
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:404
boost::dynamic_bitset BitSet
Dynamic bitset class.
Definition: BitSet.hpp:46
The namespace of the Chemical Data Processing Library.