1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
// Copyright (C) 2013-2025 Paolo Tosco and other RDKit contributors
//
// @@ All Rights Reserved @@
// This file is part of the RDKit.
// The contents are covered by the terms of the BSD license
// which is included in the file license.txt, found at the root
// of the RDKit source tree.
//
#include <RDGeneral/export.h>
#ifndef __RD_MMFFNONBONDED_H__
#define __RD_MMFFNONBONDED_H__
#include <ForceField/Contrib.h>
#include <GraphMol/RDKitBase.h>
#include <GraphMol/ForceFieldHelpers/MMFF/AtomTyper.h>
namespace ForceFields {
namespace MMFF {
class MMFFVdWCollection;
class MMFFVdW;
//! combined vdW and charge terms for MMFF
class RDKIT_FORCEFIELD_EXPORT NonbondedContrib : public ForceFieldContrib {
public:
NonbondedContrib() {}
NonbondedContrib(ForceField *owner);
//! Track a new VdW pair
void addTerm(unsigned int idx1, unsigned int idx2,
const MMFFVdWRijstarEps *mmffVdWConstants, bool includeCharge,
double chargeTerm, std::uint8_t dielModel, bool is1_4);
double getEnergy(double *pos) const override;
void getGrad(double *pos, double *grad) const override;
NonbondedContrib *copy() const override {
return new NonbondedContrib(*this);
}
private:
enum ContribType {
VDW = 1 << 0, //!< van der Waals contribution
ELECTROSTATIC = 1 << 1 //!< electrostatic contribution
};
std::vector<int16_t> d_at1Idxs;
std::vector<int16_t> d_at2Idxs;
std::vector<std::uint8_t>
d_contribTypes; //!< bit field 0x1: vdW, 0x2: electrostatic
std::vector<double> d_R_ij_stars; //!< the preferred length of the contact
std::vector<double>
d_wellDepths; //!< the vdW well depth (strength of the interaction)
std::vector<double> d_chargeTerms;
std::vector<std::uint8_t> d_is_1_4s;
std::vector<std::uint8_t>
d_dielModels; //!< dielectric model (1: constant; 2: distance-dependent)
};
//! the van der Waals term for MMFF
class RDKIT_FORCEFIELD_EXPORT VdWContrib : public ForceFieldContrib {
public:
VdWContrib() {}
VdWContrib(ForceField *owner);
//! Track a new VdW pair
void addTerm(unsigned int idx1, unsigned int idx2,
const MMFFVdWRijstarEps *mmffVdWConstants);
double getEnergy(double *pos) const override;
void getGrad(double *pos, double *grad) const override;
VdWContrib *copy() const override { return new VdWContrib(*this); }
private:
std::vector<int16_t> d_at1Idxs;
std::vector<int16_t> d_at2Idxs;
std::vector<double> d_R_ij_stars; //!< the preferred length of the contact
std::vector<double>
d_wellDepths; //!< the vdW well depth (strength of the interaction)
};
//! the electrostatic term for MMFF
class RDKIT_FORCEFIELD_EXPORT EleContrib : public ForceFieldContrib {
public:
EleContrib() {}
//! Constructor
/*!
\param owner pointer to the owning ForceField
\param idx1 index of end1 in the ForceField's positions
\param idx2 index of end2 in the ForceField's positions
*/
EleContrib(ForceField *owner);
void addTerm(unsigned int idx1, unsigned int idx2, double chargeTerm,
std::uint8_t dielModel, bool is1_4);
double getEnergy(double *pos) const override;
void getGrad(double *pos, double *grad) const override;
EleContrib *copy() const override { return new EleContrib(*this); }
private:
std::vector<int16_t> d_at1Idxs;
std::vector<int16_t> d_at2Idxs;
std::vector<double> d_chargeTerms;
std::vector<std::uint8_t> d_is_1_4s;
std::vector<std::uint8_t>
d_dielModels; //!< dielectric model (1: constant; 2: distance-dependent)
};
namespace Utils {
//! calculates and returns the unscaled minimum distance (R*ij) for a MMFF VdW
/// contact
RDKIT_FORCEFIELD_EXPORT double calcUnscaledVdWMinimum(
const MMFFVdWCollection *mmffVdW, const MMFFVdW *mmffVdWParamsAtom1,
const MMFFVdW *mmffVdWParamsAtom2);
//! calculates and returns the unscaled well depth (epsilon) for a MMFF VdW
/// contact
RDKIT_FORCEFIELD_EXPORT double calcUnscaledVdWWellDepth(
double R_star_ij, const MMFFVdW *mmffVdWParamsIAtom,
const MMFFVdW *mmffVdWParamsJAtom);
//! scales the VdW parameters
RDKIT_FORCEFIELD_EXPORT void scaleVdWParams(double &R_star_ij,
double &wellDepth,
const MMFFVdWCollection *mmffVdW,
const MMFFVdW *mmffVdWParamsIAtom,
const MMFFVdW *mmffVdWParamsJAtom);
//! calculates and returns the Van der Waals MMFF energy
RDKIT_FORCEFIELD_EXPORT double calcVdWEnergy(const double dist,
const double R_star_ij,
const double wellDepth);
//! calculates and returns the electrostatic MMFF energy
// FIX: idx1 and idx2 are not used
RDKIT_FORCEFIELD_EXPORT double calcEleEnergy(unsigned int idx1,
unsigned int idx2, double dist,
double chargeTerm,
std::uint8_t dielModel,
bool is1_4);
} // namespace Utils
} // namespace MMFF
} // namespace ForceFields
#endif
|