Fix gaus
[alexxy/gromacs-sans.git] / src / sans.cpp
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2011,2012,2013,2014,2015, by the GROMACS development team, led by
5  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
6  * and including many others, as listed in the AUTHORS file in the
7  * top-level source directory and at http://www.gromacs.org.
8  *
9  * GROMACS is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public License
11  * as published by the Free Software Foundation; either version 2.1
12  * of the License, or (at your option) any later version.
13  *
14  * GROMACS is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with GROMACS; if not, see
21  * http://www.gnu.org/licenses, or write to the Free Software Foundation,
22  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
23  *
24  * If you want to redistribute modifications to GROMACS, please
25  * consider that scientific software is very special. Version
26  * control is crucial - bugs must be traceable. We will be happy to
27  * consider code for inclusion in the official distribution, but
28  * derived work must not be called official GROMACS. Details are found
29  * in the README & COPYING files - if they are missing, get the
30  * official version at http://www.gromacs.org.
31  *
32  * To help us fund GROMACS development, we humbly ask that you cite
33  * the research papers on the package. Check out http://www.gromacs.org.
34  */
35 #include <iostream>
36
37 #include <gromacs/trajectoryanalysis.h>
38 #include <gromacs/selection/nbsearch.h>
39 #include <gromacs/math/vec.h>
40
41 using namespace gmx;
42
43 /*! \brief
44  * Template class to serve as a basis for user analysis tools.
45  */
46 class SANS : public TrajectoryAnalysisModule
47 {
48     public:
49         SANS();
50
51         virtual void initOptions(IOptionsContainer          *options,
52                                  TrajectoryAnalysisSettings *settings);
53         virtual void initAnalysis(const TrajectoryAnalysisSettings &settings,
54                                   const TopologyInformation        &top);
55         virtual void initAfterFirstFrame(const TrajectoryAnalysisSettings &settings,
56                                          const t_trxframe                 &fr);
57
58
59         virtual void analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc,
60                                   TrajectoryAnalysisModuleData *pdata);
61
62         virtual void finishAnalysis(int nframes);
63         virtual void writeOutput();
64
65     private:
66         class ModuleData;
67
68         double Gaussian(double value, double sigma, RVec Rpos, RVec Rgrid, RVec GridSpacing);
69
70         std::string                      fnNdx_;
71         double                           cutoff_;
72         double                           grid_;
73         double                           boxScale_;
74
75         IVec gridPoints_;
76         RVec gridSpacing_;
77
78         AnalysisNeighborhood             nb_;
79         const TopologyInformation       *top_;
80         std::vector < std::vector < std::vector<double>>> gausGrid_;
81 };
82
83 SANS::SANS()
84     : cutoff_(1.0), grid_(0.05), boxScale_(1.0)
85 {
86 }
87
88 double SANS::Gaussian(double value, double sigma, RVec Rpos, RVec Rgrid, RVec GridSpacing)
89 {
90     return value*M_PI*M_PI*GridSpacing[XX]*GridSpacing[YY]*GridSpacing[ZZ]*exp(-distance2(Rpos, Rgrid)/(2*sigma*sigma))/(std::sqrt(2.0)*sigma*sigma*sigma*108.);
91 }
92
93 void
94 SANS::initOptions(IOptionsContainer          *options,
95                   TrajectoryAnalysisSettings *settings)
96 {
97     static const char *const desc[] = {
98         "Analysis tool for finding molecular core."
99     };
100
101     // Add the descriptive text (program help text) to the options
102     settings->setHelpText(desc);
103     // Add option for cutoff constant
104     options->addOption(DoubleOption("cutoff")
105                            .store(&cutoff_)
106                            .description("cutoff for neighbour search"));
107     options->addOption(DoubleOption("grid")
108                            .store(&grid_)
109                            .description("grid spacing for gaus grid"));
110     options->addOption(DoubleOption("boxscale")
111                            .store(&boxScale_)
112                            .description("box scaling for gaus grid"));
113 }
114
115 void
116 SANS::initAnalysis(const TrajectoryAnalysisSettings  &settings,
117                    const TopologyInformation         &top)
118 {
119     nb_.setCutoff(cutoff_);
120     top_ = &top;
121
122 }
123
124 void
125 SANS::initAfterFirstFrame(const TrajectoryAnalysisSettings &settings,
126                           const t_trxframe                 &fr)
127 {
128     // set gridpoints and grid spacing for orthogonal boxes only....
129     for (int i = 0; i < DIM; i++)
130     {
131         gridSpacing_[i] = grid_;
132         gridPoints_[i]  = static_cast<int>(std::ceil(fr.box[i][i]*boxScale_/grid_));
133     }
134     // prepare gausGrid
135     gausGrid_.resize(gridPoints_[XX], std::vector < std::vector < double>>(gridPoints_[YY], std::vector<double>(gridPoints_[ZZ])));
136 }
137
138 void
139 SANS::analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc,
140                    TrajectoryAnalysisModuleData *pdata)
141 {
142     RVec GridSpacing(0.1, 0.1, 0.1);
143     AnalysisNeighborhoodSearch nbsearch = nb_.initSearch(pbc, AnalysisNeighborhoodPositions(fr.x, fr.natoms));
144
145     t_topology                *top = top_->topology();
146
147     fprintf(stderr, "Box dimensions:\n");
148     for (int i = 0; i < DIM; i++)
149     {
150         fprintf(stderr, "[ ");
151         for (int j = 0; j < DIM; j++)
152         {
153             fprintf(stderr, " %f ", fr.box[i][j]);
154         }
155         fprintf(stderr, " ]\n");
156     }
157     // main loop over grid points
158     for (int i = 0; i < gridPoints_[XX]; i++)
159     {
160         for (int j = 0; j < gridPoints_[YY]; j++)
161         {
162             for (int k = 0; k < gridPoints_[ZZ]; k++)
163             {
164                 RVec                           point(i*gridSpacing_[XX], j*gridSpacing_[YY], k*gridSpacing_[ZZ]);
165                 AnalysisNeighborhoodPairSearch pairSearch = nbsearch.startPairSearch(point.as_vec());
166                 AnalysisNeighborhoodPair       pair;
167                 while (pairSearch.findNextPair(&pair))
168                 {
169                     // fprintf(stderr,"point = [ %f %f %f ]\n", point[XX],point[YY],point[ZZ]);
170                     // fprintf(stderr,"Index %d\n", pair.refIndex());
171                     // fprintf(stderr,"dx =  (%f, %f, %f)\n", pair.dx()[XX], pair.dx()[YY], pair.dx()[ZZ] );
172                     // fprintf(stderr,"ref =  (%f, %f, %f)\n", fr.x[pair.refIndex()][XX], fr.x[pair.refIndex()][YY], fr.x[pair.refIndex()][ZZ]);
173                     // fprintf(stderr,"ref_dx =  (%f, %f, %f)\n", GridSpacing[XX]+pair.dx()[XX], GridSpacing[YY]+pair.dx()[YY], GridSpacing[ZZ]+pair.dx()[ZZ] );
174                     RVec refPos(point[XX]+pair.dx()[XX], point[YY]+pair.dx()[YY], point[ZZ]+pair.dx()[ZZ]);
175                     // fprintf(stderr,"refPos = [ %f %f %f ]\n", refPos[XX], refPos[YY], refPos[ZZ]);
176                     // fprintf(stderr, "Mass = %f, Radius = %f\n", top->atoms.atom[pair.refIndex()].m, top->atomtypes.radius[top->atoms.atom[pair.refIndex()].type]);
177                     gausGrid_[i][j][k] += Gaussian(top->atoms.atom[pair.refIndex()].m, 2., refPos, point, gridSpacing_);
178                 }
179                 fprintf(stderr, "GausGrid[%d, %d, %d] = %f\n", i, j, k, gausGrid_[i][j][k]);
180             }
181         }
182     }
183     // only for orthogonal boxes...
184     fprintf(stderr, "NX = %d, NY = %d, NZ = %d\n", gridPoints_[XX], gridPoints_[YY], gridPoints_[ZZ]);
185 }
186
187 void
188 SANS::finishAnalysis(int nframes)
189 {
190 }
191
192 void
193 SANS::writeOutput()
194 {
195
196 }
197
198 /*! \brief
199  * The main function for the analysis template.
200  */
201 int
202 main(int argc, char *argv[])
203 {
204     return gmx::TrajectoryAnalysisCommandLineRunner::runAsMain<SANS>(argc, argv);
205 }