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

并行计算

开发平台:

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 <cstring>
  19. #include <cctype>
  20. #include "ParameterLibrary.h"
  21. #include "Utils.h"
  22. #include "Exceptions.h"
  23. #define char const char // ugly hack to calm down G++
  24. #include "../autodock/default_parameters.h"
  25. #undef char
  26. ParameterLibrary::ParameterLibrary(LogFile *logFile, const char *modelText, Unbound_Model unboundModel, int debug, int outputLevel)
  27.     : logFile(logFile), debug(debug), outputLevel(outputLevel)
  28. {
  29.     filename[0] = 0;
  30.     memset(dictionary, 0, sizeof(dictionary));
  31.     // Setup default parameters
  32.     // These are set up in "default_parameters.h"
  33.     // and stored in the param_string_VERSION_NUM[MAX_LINES] array
  34.     // so far we have param_string_4_0 and param_string_4_1
  35.     const char **paramString;
  36.     if (unboundModel == Extended)
  37.         paramString = param_string_4_0;
  38.     else if (unboundModel == Unbound_Same_As_Bound)
  39.         paramString=param_string_4_1;
  40.     else
  41.     {
  42.         logFile->printFormatted("DEBUG: cannot determine %s parameter values n", modelText);
  43.         throw ExitProgram(-1);
  44.     }
  45.     logFile->printFormatted("Setting up parameter library with AutoDock %s values.nnn", modelText);
  46.     for (int i = 0; paramString[i]; i++)
  47.         readLine(paramString[i]);
  48. }
  49. ParameterLibrary::~ParameterLibrary()
  50. {
  51.     for (int i = 0; i < MAXKEY; i++)
  52.         if (dictionary[i])
  53.             delete dictionary[i];
  54. }
  55. unsigned int ParameterLibrary::hash(const char *key)
  56. {
  57.     switch (strlen(key))
  58.     {
  59.     case 0:
  60.         return 0;
  61.     case 1:
  62.         return key[0];
  63.     default:
  64.         return (unsigned int)key[0] + 256*(unsigned int)key[1];
  65.     }
  66. }
  67. void ParameterLibrary::insertAtomParameter(const char *key, const ParameterEntry &value)
  68. {
  69.     unsigned int hashKey = hash(key);
  70.     if (!dictionary[hashKey])
  71.         dictionary[hashKey] = new ParameterEntry();
  72.     *dictionary[hashKey] = value;
  73. }
  74. ParameterEntry *ParameterLibrary::findAtomParameter(const char *key)
  75. {
  76.     return dictionary[hash(key)];
  77. }
  78. const ParameterEntry *ParameterLibrary::findAtomParameter(const char *key) const
  79. {
  80.     return dictionary[hash(key)];
  81. }
  82. int ParameterLibrary::getAtomParameterRecIndex(const char *key) const
  83. {
  84.     const ParameterEntry *foundParam = findAtomParameter(key);
  85.     if (foundParam)
  86.         return foundParam->recIndex;
  87.     return -1;
  88. }
  89. void ParameterLibrary::load(const char *filename)
  90. {
  91.     logFile->printFormatted("Using read_parameter_library() to try to open and read "%s".nn", filename);
  92.     strncpy(this->filename, filename, MAX_CHARS);
  93.     // Open and read the parameter library
  94.     FILE *parameterLibraryFile;
  95.     if ((parameterLibraryFile = boincOpenFile(filename, "r")) == 0)
  96.     {
  97.         logFile->printFormatted("Sorry, I can't find or open %sn", filename);
  98.         throw ExitProgram(-1);
  99.     }
  100.     char line[LINE_LEN];
  101.     while (fgets(line, sizeof(line), parameterLibraryFile) != 0)
  102.         readLine(line);
  103. }
  104. void ParameterLibrary::readLine(const char *line)
  105. {
  106.     ParameterEntry thisParameter;
  107.     int int_hbond_type = 0;
  108.     int nfields;
  109.     ParserTokens paramKeyword = parseParamLine(line);
  110.     if (debug > 0)
  111.         logFile->printFormatted("DEBUG: line = %sDEBUG: paramKeyword          = %dn", line, paramKeyword);
  112.     switch (paramKeyword)
  113.     {
  114.     case PAR_:
  115.     case PAR_NULL:
  116.     case PAR_COMMENT:
  117.         break;
  118.     case PAR_VDW:
  119.         nfields = sscanf(line, "%*s %lf", &this->coeff_vdW);
  120.         if (nfields < 1)
  121.         {
  122.             logFile->printTitled("WARNING:  Please supply a coefficient as a floating point number.nn");
  123.             return; // skip any line without enough info
  124.         }
  125.         logFile->printFormatted("Free energy coefficient for the van der Waals term = t%.4lfnn", this->coeff_vdW);
  126.         break;
  127.     case PAR_HBOND:
  128.         nfields = sscanf(line, "%*s %lf", &this->coeff_hbond);
  129.         if (nfields < 1)
  130.         {
  131.             logFile->printTitled("WARNING:  Please supply a coefficient as a floating point number.nn");
  132.             return; // skip any line without enough info
  133.         }
  134.         logFile->printFormatted("Free energy coefficient for the H-bonding term     = t%.4lfnn", this->coeff_hbond);
  135.         break;
  136.     case PAR_ESTAT:
  137.         nfields = sscanf(line, "%*s %lf", &this->coeff_estat);
  138.         if (nfields < 1)
  139.         {
  140.             logFile->printTitled("WARNING:  Please supply a coefficient as a floating point number.nn");
  141.             return; // skip any line without enough info
  142.         }
  143.         logFile->printFormatted("Free energy coefficient for the electrostatic term = t%.4lfnn", this->coeff_estat);
  144.         break;
  145.     case PAR_DESOLV:
  146.         nfields = sscanf(line, "%*s %lf", &this->coeff_desolv);
  147.         if (nfields < 1)
  148.         {
  149.             logFile->printTitled("WARNING:  Please supply a coefficient as a floating point number.nn");
  150.             return; // skip any line without enough info
  151.         }
  152.         logFile->printFormatted("Free energy coefficient for the desolvation term   = t%.4lfnn", this->coeff_desolv);
  153.         break;
  154.     case PAR_TORS:
  155.         nfields = sscanf(line, "%*s %lf", &this->coeff_tors);
  156.         if (nfields < 1)
  157.         {
  158.             logFile->printTitled("WARNING:  Please supply a coefficient as a floating point number.nn");
  159.             return; // skip any line without enough info
  160.         }
  161.         logFile->printFormatted("Free energy coefficient for the torsional term     = t%.4lfnn", this->coeff_tors);
  162.         break;
  163.     case PAR_UNBOUND:
  164.         logFile->printError(WARNING, "the unbound model cannot be specified in the parameter library file.nn");
  165.         logFile->print("Use the DPF parameter 'unbound_model' instead.n");
  166.         break;
  167.     case PAR_ATOM_PAR:
  168.         // Read in one line of atom parameters;
  169.         // NB: scanf doesn't try to write missing fields
  170.         nfields = sscanf(line, "%*s %s %lf %lf %lf %lf %lf %lf %d %d %d %d",
  171.                             thisParameter.autogridType,
  172.                             &thisParameter.Rij,
  173.                             &thisParameter.epsij,
  174.                             &thisParameter.vol,
  175.                             &thisParameter.solpar,
  176.                             &thisParameter.RijHB,
  177.                             &thisParameter.epsijHB,
  178.                             &int_hbond_type,
  179.                             &thisParameter.recIndex,
  180.                             &thisParameter.mapIndex,
  181.                             &thisParameter.bondIndex);
  182.         if (nfields < 2)
  183.             return; // skip any line without enough info
  184.         thisParameter.hbond = int_hbond_type <= A2 ? HBondType(int_hbond_type) : NON;
  185.         thisParameter.epsij *= this->coeff_vdW;
  186.         thisParameter.epsijHB *= this->coeff_hbond;
  187.         insertAtomParameter(thisParameter.autogridType, thisParameter);
  188.         if (filename[0])
  189.             logFile->printFormatted("Parameters for the atom type "%s" were read in from "%s" as follows:nn", thisParameter.autogridType, filename);
  190.         else
  191.             logFile->printFormatted("Parameters for the atom type "%s" were initialised with the following default values:nn", thisParameter.autogridType);
  192.         if (outputLevel > 2)
  193.             logFile->printFormatted("tR-eqm = %5.2f Angstromntweighted epsilon = %5.3fntAtomic fragmental volume = %5.3fntAtomic solvation parameter = %5.3fntH-bonding R-eqm = %5.3fntweighted H-bonding epsilon = %5.3fntH-bonding type = %d,  bond index = %dnn",
  194.                     thisParameter.Rij, thisParameter.epsij, thisParameter.vol, thisParameter.solpar,
  195.                     thisParameter.RijHB, thisParameter.epsijHB, thisParameter.hbond, thisParameter.bondIndex);
  196.         else
  197.             logFile->printFormatted("tR-eqm = %.2f Angstrom,  weighted epsilon = %.3f,ntAt.frag.vol. = %.3f,  At.solv.par. = %.3f,ntHb R-eqm = %.3f,  weighted Hb epsilon = %.3f,ntHb type = %d,  bond index = %dnn",
  198.                     thisParameter.Rij, thisParameter.epsij, thisParameter.vol, thisParameter.solpar,
  199.                     thisParameter.RijHB, thisParameter.epsijHB, thisParameter.hbond, thisParameter.bondIndex);
  200.         break;
  201.     }
  202. }
  203. ParameterLibrary::ParserTokens ParameterLibrary::parseParamLine(const char *line)
  204. {
  205.     int j, i;
  206.     ParserTokens token = PAR_; // return -1 if nothing is recognized.
  207.     char c[LINE_LEN];
  208.     // tokentablesize should be set to the length of the tokentable
  209.     const int tokentablesize = 6;
  210.     const struct
  211.     {
  212.        const char *lexeme;
  213.        ParserTokens tokenvalue;
  214.     } tokentable[] = {
  215.         {"FE_coeff_vdW", PAR_VDW},          // 1
  216.         {"FE_coeff_hbond", PAR_HBOND},      // 2
  217.         {"FE_coeff_estat", PAR_ESTAT},      // 3
  218.         {"FE_coeff_desolv", PAR_DESOLV},    // 4
  219.         {"FE_coeff_tors", PAR_TORS},        // 5
  220.         {"atom_par", PAR_ATOM_PAR}          // 6
  221.     }; // 6 tokens  // remember to set tokentablesize earlier
  222.     c[0] = '';
  223.     for (j = 0; line[j]!='' && line[j]!=' ' && line[j]!='t' && line[j]!='n'; j++)
  224.     {
  225.         //  Ignore case
  226.         c[j] = (char)tolower((int)line[j]);
  227.         if (debug > 0)
  228.             logFile->printFormatted("%c",c[j]);
  229.     }
  230.     if (debug > 0)
  231.         logFile->printFormatted("nj = %dn",j);
  232.     //  Recognize one character tokens
  233.     if ((c[0]=='n') || (c[0]==''))
  234.         token = PAR_NULL;
  235.     else if (c[0]=='#')
  236.         token = PAR_COMMENT;
  237.     //  Recognize token strings
  238.     for (i = 0; i < tokentablesize && token == PAR_; i++)
  239.     {
  240.         if (debug > 0)
  241.             logFile->printFormatted("i = %d, tokentable[i].lexeme = %s, tokentable[i].value = %d, c = %sn",i,tokentable[i].lexeme,tokentable[i].tokenvalue,c);
  242.         if (strncasecmp(tokentable[i].lexeme, c, j) == 0)
  243.             token = tokentable[i].tokenvalue;
  244.     }
  245.     return token;
  246. }