main.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 <new>
  19. #include "ProgramParameters.h"
  20. #include "Exceptions.h"
  21. #include "InputDataLoader.h"
  22. #include "Utils.h"
  23. #include "CalculateGridmaps.h"
  24. #include "electrostatics/Electrostatics.h"
  25. void initCovalentMaps(const InputData *input, const GridMapList &gridmaps)
  26. {
  27.     // TODO: once covalent maps are supported, rewrite this function using NVIDIA CUDA
  28.     for (int m = 0; m < gridmaps.getNumMaps(); m++)
  29.         if (gridmaps[m].isCovalent)
  30. #if defined(AG_OPENMP)
  31.     #pragma omp parallel for schedule(dynamic, 1)
  32. #endif
  33.             FOR_EACH_GRID_POINT(gridPos, outputIndex)
  34.             {
  35.                 // Distance squared from current grid point to the covalent attachment point
  36.                 double rcovSq = (input->covalentPoint - gridPos).MagnitudeSqr() * input->covHalfWidthSquaredInv;
  37.                 if (rcovSq < Mathd::Sqr(APPROX_ZERO))
  38.                     rcovSq = Mathd::Sqr(APPROX_ZERO);
  39.                 double energy = input->covBarrier * (1 - exp(-0.69314718055994529 * rcovSq)); // -0.69314718055994529 = log(0.5)
  40.                 gridmaps[m].energies[outputIndex] = energy;
  41.             }
  42.             END_FOR();
  43. }
  44. void calculateFloatingGrid(const InputData *input, const GridMapList &gridmaps)
  45. {
  46.     // TODO: rewrite this function using NVIDIA CUDA
  47.     // Calculate the so-called "Floating Grid"...
  48. #if defined(AG_OPENMP)
  49.     #pragma omp parallel for schedule(dynamic, 1)
  50. #endif
  51.     FOR_EACH_GRID_POINT(gridPos, outputIndex)
  52.     {
  53.         double minDistSq = Mathd::Sqr(BIG);
  54.         //  Do all Receptor (protein, DNA, etc.) atoms...
  55.         for (int ia = 0; ia < input->numReceptorAtoms; ia++)
  56.         {
  57.             //  Get distance^2 from current grid point to this receptor atom
  58.             Vec3d distance = Vec3d(input->receptorAtom[ia]) - gridPos;
  59.             double distSq = distance.MagnitudeSqr();
  60.             if (distSq < minDistSq)
  61.                 minDistSq = distSq;
  62.         }
  63.         gridmaps.getFloatingGridMins()[outputIndex] = float(Mathd::Sqrt(minDistSq));
  64.     }
  65.     END_FOR();
  66. }
  67. // Function: Calculation of interaction energy grids for Autodock.
  68. // Directional H_bonds from Goodford:
  69. // Distance dependent dielectric after Mehler and Solmajer.
  70. // Charge-based desolvation
  71. // Copyright: (C) 2004, TSRI
  72. //
  73. // Authors: Garrett Matthew Morris, Ruth Huey, David S. Goodsell
  74. //          Marek Olsak
  75. //
  76. // The Scripps Research Institute
  77. // Department of Molecular Biology, MB5
  78. // 10550 North Torrey Pines Road
  79. // La Jolla, CA 92037-1000.
  80. //
  81. // Masaryk University
  82. // National Centre For Biomolecular Research
  83. // Building A4, University Campus
  84. // Kamenice 5
  85. // 625 00 Brno-Bohunice
  86. // Czech Republic
  87. //
  88. // e-mail: garrett@scripps.edu
  89. //         rhuey@scripps.edu
  90. //         goodsell@scripps.edu
  91. //         marao@mail.muni.cz
  92. //
  93. // Helpful suggestions and advice:
  94. // Arthur J. Olson
  95. // Bruce Duncan, Yng Chen, Michael Pique, Victoria Roberts
  96. // Lindy Lindstrom
  97. // Jiri Filipovic
  98. //
  99. // Inputs: Control file, receptor PDBQT file, parameter file
  100. // Returns: Atomic affinity, desolvation and electrostatic grid maps.
  101. void programMain(int argc, char **argv)
  102. {
  103.     // Get the time at the start of the run...
  104.     tms tmsJobStart;
  105.     Clock jobStart = times(&tmsJobStart);
  106. #if !defined(VERSION)
  107.     const char *versionNumber = "4.2.1";
  108. #else
  109.     const char *versionNumber = VERSION;
  110. #endif
  111.     // Initialize the ProgramParameters object, which parses the command-line arguments
  112.     ProgramParameters programParams(argc, argv);
  113.     // Initialize the log file
  114.     LogFile logFile(versionNumber, programParams.getProgramName(), programParams.getLogFilename());
  115. #if defined(AG_OPENMP)
  116.     logFile.printFormatted("Using OpenMP.n"
  117.                            "- Total number of cores: %in"
  118.                            "- Threads available: %inn", omp_get_max_threads());
  119. #endif
  120. #if defined(AG_CUDA)
  121.     logFile.print("Using CUDA.n");
  122. #endif
  123.     // Declaration of gridmaps, InputDataLoader::load takes care of their initialization
  124.     GridMapList gridmaps(&logFile);
  125.     // Initialization of free energy coefficients and atom parameters
  126.     ParameterLibrary parameterLibrary(&logFile, "default Unbound_Same_As_Bound",
  127.                                       programParams.useVersion4() ? Extended : Unbound_Same_As_Bound,
  128.                                       programParams.getDebugLevel());
  129.     // Reading in the grid parameter file
  130.     InputDataLoader *inputDataLoader = new InputDataLoader(&logFile);
  131.     inputDataLoader->load(programParams.getGridParameterFilename(), gridmaps, parameterLibrary);
  132.     // TODO: shouldn't we put these out of the load function? :
  133.     // - gridmaps initialization code
  134.     // - initialization of atom parameters recIndex/mapIndex (in parameterLibrary)
  135.     // Now we want to make the input data read-only
  136.     const InputData *input = inputDataLoader;
  137.     if (input->floatingGridFilename[0])
  138.         gridmaps.enableFloatingGrid();
  139.     // Inititializing arrays of output energies and the header which is at the beginning of each output file
  140.     gridmaps.prepareGridmaps(input->numGridPointsPerMap);
  141.     gridmaps.initFileHeader(input, programParams.getGridParameterFilename());
  142.     // TODO: add a smarter mechanism of checking for the available disk space, we need to know that as soon as possible.
  143.     // the formerly implemented checks in the middle of calculations were done too late
  144.     // Loading the parameter library from the file
  145.     if (input->parameterLibraryFilename[0])
  146.         parameterLibrary.load(input->parameterLibraryFilename);
  147.     // Writing to AVS-readable gridmaps file (fld)
  148.     saveAVSGridmapsFile(gridmaps, input, programParams, logFile);
  149. #if defined(BOINCCOMPOUND)
  150.     boinc_fraction_done(0.1);
  151. #endif
  152.     Timer *t0 = 0;
  153.     if (programParams.benchmarkEnabled())
  154.         t0 = Timer::startNew("Precalculations        ");
  155.     // Calculating the lookup table of the pairwise interaction energies
  156.     PairwiseInteractionEnergies energyLookup;
  157.     energyLookup.calculate(gridmaps, logFile, input->numReceptorTypes, input->receptorTypes, input->rSmooth);
  158.     // Precalculating the exponential function for receptor and ligand desolvation
  159.     DesolvExpFunc desolvExpFunc(parameterLibrary.coeff_desolv);
  160.     // Calculating bond vectors for directional H-bonds
  161.     BondVectors *bondVectors = new BondVectors(input->numReceptorAtoms, &logFile);
  162.     bondVectors->calculate(input, parameterLibrary);
  163.     if (programParams.benchmarkEnabled())
  164.         t0->stopAndLog(stderr);
  165.     logFile.printFormatted("Beginning grid calculations.n"
  166.                            "nCalculating %d grids over %d elements, around %d receptor atoms.nn"
  167.                            /*"                    Percent   Estimated Time  Time/this planen"
  168.                            "XY-plane  Z-coord   Done      Remaining       Real, User, Systemn"
  169.                            "            /Ang              /sec            /secn"
  170.                            "________  ________  ________  ______________  __________________________nn"*/,
  171.                            gridmaps.getNumMapsInclFloatingGrid(), input->numGridPointsPerMap, input->numReceptorAtoms);
  172.     // Covalent Atom Types are not yet supported with the new AG4/AD4 atom typing mechanism...
  173.     Timer *t1 = 0;
  174.     if (programParams.benchmarkEnabled())
  175.         t1 = Timer::startNew("Covalent maps          ");
  176.     initCovalentMaps(input, gridmaps);
  177.     if (programParams.benchmarkEnabled())
  178.         t1->stopAndLog(stderr);
  179.     // Start calculating the electrostatic map
  180.     void *handleElecMap = calculateElectrostaticMapAsync(input, programParams, gridmaps);
  181.     // Calculate the atom maps and the desolvation map
  182.     calculateGridmaps(input, programParams, gridmaps, parameterLibrary, energyLookup, desolvExpFunc, bondVectors);
  183.     gridmaps.saveAtomMapsAndDesolvMap(); // and save them
  184.     // Wait for the calculation
  185.     synchronizeCalculation(handleElecMap);
  186.     // Calculate the so-called "floating grid"
  187.     if (gridmaps.containsFloatingGrid())
  188.     {
  189.         Timer *t3 = 0;
  190.         if (programParams.benchmarkEnabled())
  191.             t3 = Timer::startNew("Floating grid          ");
  192.         calculateFloatingGrid(input, gridmaps);
  193.         if (programParams.benchmarkEnabled())
  194.             t3->stopAndLog(stderr);
  195.         gridmaps.saveFloatingGrid(input->floatingGridFilename);
  196.     }
  197.     delete bondVectors;
  198. #if defined(BOINCCOMPOUND)
  199.     boinc_fraction_done(0.9);
  200. #endif
  201.     delete inputDataLoader;
  202.     // Writing out summary
  203.     gridmaps.logSummary();
  204.     // Get the time at the end of the run and print the difference
  205.     tms tmsJobEnd;
  206.     Clock jobEnd = times(&tmsJobEnd);
  207.     logFile.printExecutionTimesInHMS(jobStart, jobEnd, &tmsJobStart, &tmsJobEnd);
  208. }
  209. int main(int argc, char **argv)
  210. {
  211.     try
  212.     {
  213.         // Initialize BOINC if needed
  214.         boincInit();
  215.         // Main function
  216.         programMain(argc, argv);
  217.         // This should not return if used
  218.         boincDone();
  219.         return 0;
  220.     }
  221.     catch (ExitProgram &e)  // the ExitProgram exception is a replacement for C's exit function (we need destructors)
  222.     {
  223.         return e.getExitCode();
  224.     }
  225.     catch (std::bad_alloc &)
  226.     {
  227.         fprintf(stderr, "n%s: FATAL ERROR: Not enough memory!n", *argv);
  228.         return 0xBADA110C; // BADALLOC
  229.     }
  230. }