PairwiseInteractionEnergies.cpp
上传用户:chinafayin
上传日期:2022-04-05
资源大小:153k
文件大小:6k
源码类别:

并行计算

开发平台:

Visual C++

  1. /*
  2.     FastGrid (formerly AutoGrid)
  3.     Copyright (C) 2009 The Scripps Research Institute. All rights reserved.
  4.     Copyright (C) 2009 Masaryk University. All rights reserved.
  5.     AutoGrid is a Trade Mark of The Scripps Research Institute.
  6.     This program is free software; you can redistribute it and/or
  7.     modify it under the terms of the GNU General Public License
  8.     as published by the Free Software Foundation; either version 2
  9.     of the License, or (at your option) any later version.
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.     You should have received a copy of the GNU General Public License
  15.     along with this program; if not, write to the Free Software
  16.     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17. */
  18. #include "PairwiseInteractionEnergies.h"
  19. PairwiseInteractionEnergies::PairwiseInteractionEnergies()
  20. {
  21.     energyLookup = new LookupTable();
  22. }
  23. PairwiseInteractionEnergies::~PairwiseInteractionEnergies()
  24. {
  25.     delete energyLookup;
  26. }
  27. void PairwiseInteractionEnergies::calculate(const GridMapList &gridmaps, LogFile &logFile,
  28.                                             int numReceptorTypes, const char (&receptorTypes)[NUM_RECEPTOR_TYPES][3], double rSmooth)
  29. {
  30.     double energySmooth[MAX_DIST];
  31.     double dxA;
  32.     double dxB;
  33.     double rA;
  34.     double rB;
  35.     double Rij, epsij;
  36.     double cA, cB, tmpconst;
  37.     int xA, xB;
  38.     // Angstrom is divided by A_DIVISOR in look-up table.
  39.     // Typical value of rSmooth is 0.5 Angstroms
  40.     // so iSmooth = 0.5 * 100 / 2 = 25
  41.     int iSmooth = int(rSmooth * A_DIVISOR / 2);
  42.     logFile.print("nnCalculating Pairwise Interaction Energiesn"
  43.                   "=========================================nn");
  44.     // do the map stuff here:
  45.     // set up xA, xB, npb_r, npb_eps and hbonder
  46.     // before this pt
  47.     for (int ia = 0; ia < gridmaps.getNumAtomMaps(); ia++)
  48.         if (!gridmaps[ia].isCovalent)
  49.         {
  50.             // i is the index of the receptor atom type, that the ia type ligand probe will interact with. *//* GPF_MAP
  51.             for (int i = 0; i < numReceptorTypes; i++)
  52.             {
  53.                 // for each receptor_type
  54.                 xA = gridmaps[ia].xA[i];
  55.                 xB = gridmaps[ia].xB[i];
  56.                 Rij = gridmaps[ia].nbpR[i];
  57.                 epsij = gridmaps[ia].nbpEps[i];
  58.                 // for each receptor_type get its parms and fill in tables
  59.                 cA = (tmpconst = epsij / (xA - xB)) * pow(Rij, xA) * xB;
  60.                 cB = tmpconst * pow(Rij, xB) * xA;
  61.                 if (isnan(cA))
  62.                     logFile.printError(FATAL_ERROR, "Van der Waals coefficient cA is not a number.  " APPNAME " must exit.");
  63.                 if (isnan(cB))
  64.                     logFile.printError(FATAL_ERROR, "Van der Waals coefficient cB is not a number.  " APPNAME " must exit.");
  65.                 dxA = xA;
  66.                 dxB = xB;
  67.                 if (xA == 0)
  68.                     logFile.printError(FATAL_ERROR, "Van der Waals exponent xA is 0.  " APPNAME " must exit.");
  69.                 if (xB == 0)
  70.                     logFile.printError(FATAL_ERROR, "Van der Waals exponent xB is 0.  " APPNAME " must exit.");
  71.                 logFile.printFormatted("n             %9.1lf       %9.1lf n"
  72.                                        "    E    =  -----------  -  -----------n"
  73.                                        "     %s, %s         %2d              %2dn"
  74.                                        "                r               r nn"
  75.                                        "Calculating energies for %s-%s interactions.n",
  76.                                        cA, cB, gridmaps[ia].type, receptorTypes[i], xA, xB, gridmaps[ia].type, receptorTypes[i]);
  77.                 // loop over distance index, indexR, from 0 to MAX_DIST
  78.                 for (int indexR = 1; indexR < MAX_DIST; indexR++)
  79.                 {
  80.                     double r = indexToAngstrom<double>(indexR);
  81.                     rA = pow(r, dxA);
  82.                     rB = pow(r, dxB);
  83.                     energyLookup->table[i][indexR][ia] = Mathd::Min(EINTCLAMP, (cA / rA - cB / rB));
  84.                 }               // for each distance
  85.                 energyLookup->table[i][0][ia] = EINTCLAMP;
  86.                 energyLookup->table[i][MAX_DIST-1][ia] = 0;
  87.                 // smooth with min function *//* GPF_MAP
  88.                 if (iSmooth > 0)
  89.                 {
  90.                     for (int indexR = 1; indexR < MAX_DIST; indexR++)
  91.                     {
  92.                         energySmooth[indexR] = 100000;
  93.                         for (int j = Mathi::Max(0, indexR - iSmooth); j < Mathi::Min(MAX_DIST, indexR + iSmooth); j++)
  94.                             energySmooth[indexR] = Mathd::Min(energySmooth[indexR], energyLookup->table[i][j][ia]);
  95.                     }
  96.                     for (int indexR = 1; indexR < MAX_DIST; indexR++)
  97.                         energyLookup->table[i][indexR][ia] = energySmooth[indexR];
  98.                 }               // endif smoothing
  99.             }                   // for i in receptor types: build energy table for this map
  100.             // Print out a table, of distance versus energy...
  101.             // GPF_MAP
  102.             logFile.printFormatted("nnFinding the lowest pairwise interaction energy within %.1f Angstrom ("smoothing").nn  r ", rSmooth);
  103.             for (int iat = 0; iat < numReceptorTypes; iat++)
  104.                 logFile.printFormatted("    %s    ", receptorTypes[iat]);
  105.             logFile.print("n ___");
  106.             for (int iat = 0; iat < numReceptorTypes; iat++)
  107.                 logFile.print(" ________");                   // iat
  108.             logFile.print("n");
  109.             for (int j = 0; j <= 500; j += 10)
  110.             {
  111.                 logFile.printFormatted("%4.1lf", indexToAngstrom<double>(j));
  112.                 for (int iat = 0; iat < numReceptorTypes; iat++)
  113.                     logFile.printFormatted((energyLookup->table[iat][j][ia] < 100000) ? "%9.2lf" : "%9.2lg", energyLookup->table[iat][j][ia]);               // iat
  114.                 logFile.print("n");
  115.             }                   // j
  116.             logFile.print("n");
  117.         }
  118.         else
  119.             // parsing for intnbp not needed for covalent maps
  120.             logFile.print("nAny internal non-bonded parameters will be ignored for this map, since this is a covalent map.n");
  121. }