Move read_tps_conf() to confio.h
[alexxy/gromacs.git] / src / gromacs / gmxana / gmx_spatial.c
index de0706e38bbcd15b0462ea1d33e45cd1b23925c1..a7f3d12720ba4f39634ae03d2cb1dc1bda3d2a4e 100644 (file)
 /*
+ * This file is part of the GROMACS molecular simulation package.
  *
- *                This source code is part of
+ * Copyright (c) 2007,2008,2009,2010,2011,2012,2013,2014,2015, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
  *
- *                 G   R   O   M   A   C   S
- *
- *          GROningen MAchine for Chemical Simulations
- *
- *                        VERSION 3.0
- *
- * Copyright (c) 1991-2001
- * BIOSON Research Institute, Dept. of Biophysical Chemistry
- * University of Groningen, The Netherlands
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
  * of the License, or (at your option) any later version.
  *
- * If you want to redistribute modifications, please consider that
- * scientific software is very special. Version control is crucial -
- * bugs must be traceable. We will be happy to consider code for
- * inclusion in the official distribution, but derived work must not
- * be called official GROMACS. Details are found in the README & COPYING
- * files - if they are missing, get the official version at www.gromacs.org.
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
  *
- * To help us fund GROMACS development, we humbly ask that you cite
- * the papers on the package - you can find them in the top README file.
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
  *
- * Do check out http://www.gromacs.org , or mail us at gromacs@gromacs.org .
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
  *
- * And Hey:
- * Gyas ROwers Mature At Cryogenic Speed
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
  */
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-
+#include "gmxpre.h"
 
-#include "statutil.h"
-#include "typedefs.h"
-#include "smalloc.h"
-#include "vec.h"
-#include "statutil.h"
-#include "gromacs/fileio/tpxio.h"
-#include "gromacs/fileio/trxio.h"
 #include <math.h>
-#include "index.h"
-#include "pbc.h"
-#include "rmpbc.h"
-#include "gmx_ana.h"
-#include "macros.h"
+#include <stdlib.h>
 
+#include "gromacs/commandline/pargs.h"
+#include "gromacs/fileio/confio.h"
+#include "gromacs/fileio/trxio.h"
+#include "gromacs/gmxana/gmx_ana.h"
+#include "gromacs/legacyheaders/macros.h"
+#include "gromacs/legacyheaders/typedefs.h"
+#include "gromacs/math/vec.h"
+#include "gromacs/pbcutil/pbc.h"
+#include "gromacs/pbcutil/rmpbc.h"
+#include "gromacs/topology/index.h"
+#include "gromacs/utility/cstringutil.h"
+#include "gromacs/utility/futil.h"
+#include "gromacs/utility/smalloc.h"
 
 static const double bohr = 0.529177249;  /* conversion factor to compensate for VMD plugin conversion... */
 
-static void mequit(void)
-{
-    printf("Memory allocation error\n");
-    exit(1);
-}
-
 int gmx_spatial(int argc, char *argv[])
 {
     const char     *desc[] = {
-        "[TT]g_spatial[tt] calculates the spatial distribution function and ",
-        "outputs it in a form that can be read by VMD as Gaussian98 cube format. ",
-        "This was developed from template.c (GROMACS-3.3). ",
-        "For a system of 32,000 atoms and a 50 ns trajectory, the SDF can be generated ",
-        "in about 30 minutes, with most of the time dedicated to the two runs through ",
-        "[TT]trjconv[tt] that are required to center everything properly. ",
-        "This also takes a whole bunch of space (3 copies of the [TT].xtc[tt] file). ",
-        "Still, the pictures are pretty and very informative when the fitted selection is properly made. ",
-        "3-4 atoms in a widely mobile group (like a free amino acid in solution) works ",
-        "well, or select the protein backbone in a stable folded structure to get the SDF ",
-        "of solvent and look at the time-averaged solvation shell. ",
-        "It is also possible using this program to generate the SDF based on some arbitrary ",
-        "Cartesian coordinate. To do that, simply omit the preliminary [TT]trjconv[tt] steps. \n",
-        "USAGE: \n",
-        "1. Use [TT]make_ndx[tt] to create a group containing the atoms around which you want the SDF \n",
-        "2. [TT]trjconv -s a.tpr -f a.xtc -o b.xtc -boxcenter tric -ur compact -pbc none[tt] \n",
-        "3. [TT]trjconv -s a.tpr -f b.xtc -o c.xtc -fit rot+trans[tt] \n",
-        "4. run [TT]g_spatial[tt] on the [TT].xtc[tt] output of step #3. \n",
-        "5. Load [TT]grid.cube[tt] into VMD and view as an isosurface. \n",
-        "[BB]Note[bb] that systems such as micelles will require [TT]trjconv -pbc cluster[tt] between steps 1 and 2\n",
-        "WARNINGS:[BR]",
-        "The SDF will be generated for a cube that contains all bins that have some non-zero occupancy. ",
-        "However, the preparatory [TT]-fit rot+trans[tt] option to [TT]trjconv[tt] implies that your system will be rotating ",
-        "and translating in space (in order that the selected group does not). Therefore the values that are ",
-        "returned will only be valid for some region around your central group/coordinate that has full overlap ",
-        "with system volume throughout the entire translated/rotated system over the course of the trajectory. ",
-        "It is up to the user to ensure that this is the case. \n",
-        "BUGS:[BR]",
-        "When the allocated memory is not large enough, a segmentation fault may occur. This is usually detected ",
-        "and the program is halted prior to the fault while displaying a warning message suggesting the use of the [TT]-nab[tt] (Number of Additional Bins)",
-        "option. However, the program does not detect all such events. If you encounter a segmentation fault, run it again ",
-        "with an increased [TT]-nab[tt] value. \n",
-        "RISKY OPTIONS:[BR]",
-        "To reduce the amount of space and time required, you can output only the coords ",
-        "that are going to be used in the first and subsequent run through [TT]trjconv[tt]. ",
-        "However, be sure to set the [TT]-nab[tt] option to a sufficiently high value since ",
-        "memory is allocated for cube bins based on the initial coordinates and the [TT]-nab[tt] ",
-        "option value. \n"
+        "[THISMODULE] calculates the spatial distribution function and",
+        "outputs it in a form that can be read by VMD as Gaussian98 cube format.",
+        "For a system of 32,000 atoms and a 50 ns trajectory, the SDF can be generated",
+        "in about 30 minutes, with most of the time dedicated to the two runs through",
+        "[TT]trjconv[tt] that are required to center everything properly.",
+        "This also takes a whole bunch of space (3 copies of the trajectory file).",
+        "Still, the pictures are pretty and very informative when the fitted selection is properly made.",
+        "3-4 atoms in a widely mobile group (like a free amino acid in solution) works",
+        "well, or select the protein backbone in a stable folded structure to get the SDF",
+        "of solvent and look at the time-averaged solvation shell.",
+        "It is also possible using this program to generate the SDF based on some arbitrary",
+        "Cartesian coordinate. To do that, simply omit the preliminary [gmx-trjconv] steps.",
+        "",
+        "Usage:",
+        "",
+        "1. Use [gmx-make_ndx] to create a group containing the atoms around which you want the SDF",
+        "2. [TT]gmx trjconv -s a.tpr -f a.tng -o b.tng -boxcenter tric -ur compact -pbc none[tt]",
+        "3. [TT]gmx trjconv -s a.tpr -f b.tng -o c.tng -fit rot+trans[tt]",
+        "4. run [THISMODULE] on the [TT]c.tng[tt] output of step #3.",
+        "5. Load [TT]grid.cube[tt] into VMD and view as an isosurface.",
+        "",
+        "[BB]Note[bb] that systems such as micelles will require [TT]gmx trjconv -pbc cluster[tt] between steps 1 and 2.",
+        "",
+        "Warnings",
+        "^^^^^^^^",
+        "",
+        "The SDF will be generated for a cube that contains all bins that have some non-zero occupancy.",
+        "However, the preparatory [TT]-fit rot+trans[tt] option to [gmx-trjconv] implies that your system will be rotating",
+        "and translating in space (in order that the selected group does not). Therefore the values that are",
+        "returned will only be valid for some region around your central group/coordinate that has full overlap",
+        "with system volume throughout the entire translated/rotated system over the course of the trajectory.",
+        "It is up to the user to ensure that this is the case.",
+        "",
+        "Risky options",
+        "^^^^^^^^^^^^^",
+        "",
+        "To reduce the amount of space and time required, you can output only the coords",
+        "that are going to be used in the first and subsequent run through [gmx-trjconv].",
+        "However, be sure to set the [TT]-nab[tt] option to a sufficiently high value since",
+        "memory is allocated for cube bins based on the initial coordinates and the [TT]-nab[tt]",
+        "option value."
+    };
+    const char     *bugs[] = {
+        "When the allocated memory is not large enough, a segmentation fault may occur. This is usually detected "
+        "and the program is halted prior to the fault while displaying a warning message suggesting the use of the [TT]-nab[tt] (Number of Additional Bins) "
+        "option. However, the program does not detect all such events. If you encounter a segmentation fault, run it again "
+        "with an increased [TT]-nab[tt] value."
     };
 
     static gmx_bool bPBC         = FALSE;
@@ -166,7 +167,7 @@ int gmx_spatial(int argc, char *argv[])
     /* This is the routine responsible for adding default options,
      * calling the X/motif interface, etc. */
     if (!parse_common_args(&argc, argv, PCA_CAN_TIME | PCA_CAN_VIEW,
-                           NFILE, fnm, asize(pa), pa, asize(desc), desc, 0, NULL, &oenv))
+                           NFILE, fnm, asize(pa), pa, asize(desc), desc, asize(bugs), bugs, &oenv))
     {
         return 0;
     }
@@ -220,25 +221,13 @@ int gmx_spatial(int argc, char *argv[])
         MINBIN[i] -= (double)iNAB*rBINWIDTH;
         nbin[i]    = (long)ceil((MAXBIN[i]-MINBIN[i])/rBINWIDTH);
     }
-    bin = (long ***)malloc(nbin[XX]*sizeof(long **));
-    if (!bin)
-    {
-        mequit();
-    }
+    snew(bin, nbin[XX]);
     for (i = 0; i < nbin[XX]; ++i)
     {
-        bin[i] = (long **)malloc(nbin[YY]*sizeof(long *));
-        if (!bin[i])
-        {
-            mequit();
-        }
+        snew(bin[i], nbin[YY]);
         for (j = 0; j < nbin[YY]; ++j)
         {
-            bin[i][j] = (long *)calloc(nbin[ZZ], sizeof(long));
-            if (!bin[i][j])
-            {
-                mequit();
-            }
+            snew(bin[i][j], nbin[ZZ]);
         }
     }
     copy_mat(box, box_pbc);
@@ -322,7 +311,7 @@ int gmx_spatial(int argc, char *argv[])
     }
 
     /* OUTPUT */
-    flp = ffopen("grid.cube", "w");
+    flp = gmx_ffopen("grid.cube", "w");
     fprintf(flp, "Spatial Distribution Function\n");
     fprintf(flp, "test\n");
     fprintf(flp, "%5d%12.6f%12.6f%12.6f\n", nidxp, (MINBIN[XX]+(minx+iIGNOREOUTER)*rBINWIDTH)*10./bohr, (MINBIN[YY]+(miny+iIGNOREOUTER)*rBINWIDTH)*10./bohr, (MINBIN[ZZ]+(minz+iIGNOREOUTER)*rBINWIDTH)*10./bohr);
@@ -451,7 +440,7 @@ int gmx_spatial(int argc, char *argv[])
         }
         fprintf(flp, "\n");
     }
-    ffclose(flp);
+    gmx_ffclose(flp);
 
     /* printf("x=%d to %d\n",minx,maxx); */
     /* printf("y=%d to %d\n",miny,maxy); */