3.4 Solvation Energies: PBSA

A principle use of PB is to calculate the energy stored in the exterior dielectric, for example the partial alignment of water dipoles. This corresponds to the difference between a calculation with uniform dielectric and one with a different external dielectric. In the examples for atom potentials this would be the sum of the solvent potentials at each atom, multiplied by the charges on that atom all multiplied by 0.5.

However, we know water also has an energy component due to hydrophobicity, which is typically estimated as a constant (approximately 10-25 calories per square Angstrom) multiplied by the accessible area of the molecule. This value is an open scientific question. We recommend using 10 for vacuum-water transfer energies and 25 for protein calculations, but ultimately your own scientific judgement should be used. These examples include an area calculation. Taken together these numbers are an approximation of the transfer energy from a low dielectric medium (alkane solvent, protein interior) into water.

The following examples use the OEArea object to calculate the accessible surface area of the molecule. The area is calculated using the same grid based Gaussians that ZAP uses. Therefore, it will not give the same results as triangle summation methods for calculating surface area, which are used in OESpicoli.

 1 /*******************************************************************
 2   Copyright (C) 2006, 2007, 2008 OpenEye Scientific Software, Inc.
 3 *******************************************************************/
 4 #include "openeye.h"
 5
 6 #include "oezap.h"
 7 #include "oechem.h"
 8 #include "oesystem.h"
 9 #include "oeplatform.h"
10
11 using namespace OEPB;
12 using namespace OEChem;
13 using namespace OESystem;
14 using namespace OEPlatform;
15
16 static const float KCalsPerKT = 0.59f;
17 static const float KCalsPerSqAngstrom = 0.025f;
18
19 void PrintHeader()
20 {
21   OEThrow.Info("%-12s %12s %12s %12s %14s", "Title", "Solv(kcal)",
22                "Area(Ang^2)", "Total(kcal)", "Int.Coul(kcal)");
23 }
24
25 void PrintLine(const char *title, float solv, float area, float coul)
26 {
27   float total = KCalsPerKT*solv + KCalsPerSqAngstrom*area;
28   OEThrow.Info("%-12s %12.2f %12.2f %12.2f %14.2f\n",
29          title, KCalsPerKT*solv, area, total, KCalsPerKT*coul);
30 }
31
32 int main(int argc, char *argv[])
33 {
34   float epsin = 1.0f;
35
36   if (argc!=2)
37     OEThrow.Usage("%s <molfile>", argv[0]);
38
39   OEGraphMol mol;
40   OEZap zap;
41   zap.SetInnerDielectric(epsin);
42   zap.SetGridSpacing(0.5f);
43
44   OEArea area;
45
46   PrintHeader();
47   float solv, aval, coul;
48
49   oemolistream ifs;
50   if (!ifs.open(argv[1]))
51     OEThrow.Fatal("Could not open %s for reading", argv[1]);
52
53   while (OEReadMolecule(ifs,mol))
54   {
55     OEAssignBondiVdWRadii(mol);
56     OEMMFFAtomTypes(mol);
57     OEMMFF94PartialCharges(mol);
58     zap.SetMolecule(mol);
59     solv = zap.CalcSolvationEnergy();
60     aval = area.GetArea(mol);
61     coul = OECoulombicSelfEnergy(mol, epsin);
62     PrintLine(mol.GetTitle(), solv, aval, coul);
63   }
64
65   return 0;
66 }

Listing:3.6 ZAP Solvation Example

This next solvation example calculates the transfer energy from vacuum to water. This is the code to replicate the experimental results discussed in Section 3.1

 1 /**********************************************************************
 2  Copyright (C) 2007, 2008 OpenEye Scientific Software, Inc.
 3  **********************************************************************/
 4 #include "openeye.h"
 5
 6 #include "oezap.h"
 7 #include "oechem.h"
 8 #include "oesystem.h"
 9 #include "oeplatform.h"
10
11 using namespace OEPB;
12 using namespace OEChem;
13 using namespace OESystem;
14 using namespace OEPlatform;
15
16 static const float KCalsPerKT = 0.59f;
17 static const float KCalsPerSqAngstrom = 0.010f;
18
19 int main(int argc, char *argv[])
20 {
21   float epsin = 1.0f;
22
23   if (argc!=2)
24     OEThrow.Usage("%s <molfile>", argv[0]);
25
26   OEGraphMol mol;
27   OEZap zap;
28   zap.SetInnerDielectric(epsin);
29   zap.SetGridSpacing(0.5f);
30   OEArea area;
31
32   OEThrow.Info("Title              Vacuum->Water(kcal)\n");
33   float solv, aval;
34
35   oemolistream ifs;
36   if (!ifs.open(argv[1]))
37     OEThrow.Fatal("Could not open %s for reading", argv[1]);
38
39   while (OEReadMolecule(ifs,mol))
40   {
41     OEAssignBondiVdWRadii(mol);
42     OEMMFFAtomTypes(mol);
43     OEMMFF94PartialCharges(mol);
44     zap.SetMolecule(mol);
45     solv = zap.CalcSolvationEnergy();
46     aval = area.GetArea(mol);
47     OEThrow.Info("%-20s   %6.2f", mol.GetTitle(),
48                  KCalsPerKT*solv+KCalsPerSqAngstrom*aval);
49   }
50
51   return 0;
52 }

Listing:3.7 Vacuum-water transfer energy