File: Nonbonded.h

package info (click to toggle)
rdkit 202503.6-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 222,024 kB
  • sloc: cpp: 411,111; python: 78,482; ansic: 26,181; java: 8,285; javascript: 4,404; sql: 2,393; yacc: 1,626; lex: 1,267; cs: 1,090; makefile: 580; xml: 229; fortran: 183; sh: 121
file content (134 lines) | stat: -rw-r--r-- 5,271 bytes parent folder | download | duplicates (2)
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