Move to NumPy in Python API
[alexxy/gromacs.git] / src / python / sip / trajectoryanalysis / analysismodule.sip
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
4  * Copyright (c) 2011,2012,2013,2014, 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
36 %PostInitialisationCode
37     import_array();
38 %End
39
40 struct t_trxframe {
41
42 %TypeHeaderCode
43 #include <gromacs/fileio/trx.h>
44 #include "numpy_conv.h"
45 %End
46
47     int flags;
48     int not_ok;
49     bool bDouble;
50     int natoms;
51     double t0;
52     double tf;
53     double tpf;
54     double tppf;
55     bool bTitle;
56     const char *title;
57     bool bStep;
58     int step;
59     bool bTime;
60     double time;
61     bool bLambda;
62     bool bFepState;
63     double lambda;
64     int fep_state;
65     bool bAtoms;
66     // TODO
67     /*void *atoms;*/
68     bool bPrec;
69     double prec;
70     bool bX;
71     SIP_PYOBJECT x {
72     %GetCode
73         sipPy = array2dToNumpy(sipCpp->natoms, 3, sipCpp->x);
74     %End
75     %SetCode
76
77     %End
78     };
79     bool bV;
80     SIP_PYOBJECT v {
81     %GetCode
82         sipPy = array2dToNumpy(sipCpp->natoms, 3, sipCpp->v);
83     %End
84     %SetCode
85
86     %End
87     };
88     bool bF;
89     SIP_PYOBJECT f {
90     %GetCode
91         sipPy = array2dToNumpy(sipCpp->natoms, 3, sipCpp->f);
92     %End
93     %SetCode
94
95     %End
96     };
97     bool bBox;
98     SIP_PYOBJECT box {
99     %GetCode
100         sipPy = array2dToNumpy(3, 3, sipCpp->box);
101     %End
102     %SetCode
103
104     %End
105     };
106     bool bPBC;
107     int ePBC;
108     // TODO
109     /*t_gmxvmdplugin* *vmdplugin; */
110 };
111
112 struct t_pbc {
113
114 %TypeHeaderCode
115 #include <gromacs/pbcutil/pbc.h>
116 #include "numpy_conv.h"
117 %End
118     int ePBC;
119     int ndim_ePBC;
120     int ePBCDX;
121     int dim;
122     SIP_PYOBJECT box {
123     %GetCode
124         sipPy = array2dToNumpy(3, 3, sipCpp->box);
125     %End
126     %SetCode
127
128     %End
129     };
130     SIP_PYOBJECT fbox_diag {
131     %GetCode
132         sipPy = array1dToNumpy(3, sipCpp->fbox_diag);
133     %End
134     %SetCode
135
136     %End
137     };
138     SIP_PYOBJECT hbox_diag {
139     %GetCode
140         sipPy = array1dToNumpy(3, sipCpp->hbox_diag);
141     %End
142     %SetCode
143
144     %End
145     };
146     SIP_PYOBJECT mhbox_diag {
147     %GetCode
148         sipPy = array1dToNumpy(3, sipCpp->mhbox_diag);
149     %End
150     %SetCode
151
152     %End
153     };
154     double max_cutoff2;
155     bool bLimitDistance;
156     double limit_distance2;
157     int  ntric_vec;
158     /*ivec tric_shift[MAX_NTRICVEC];*/
159     /*rvec tric_vec[MAX_NTRICVEC];*/
160 };
161
162 class TrajectoryAnalysisModuleData /NoDefaultCtors/ {
163
164 %TypeHeaderCode
165 #include <gromacs/trajectoryanalysis/analysismodule.h>
166 using namespace gmx;
167 %End
168
169 public:
170     virtual void finish() = 0;
171 };
172
173 class TrajectoryAnalysisModule {
174
175 %TypeHeaderCode
176 #include <gromacs/trajectoryanalysis/analysismodule.h>
177 using namespace gmx;
178 %End
179 public:
180     virtual void initOptions(Options *options, TrajectoryAnalysisSettings *settings) = 0;
181     virtual void optionsFinished(Options *options, TrajectoryAnalysisSettings *settings);
182     virtual void initAnalysis(const TrajectoryAnalysisSettings &settings, const TopologyInformation &top) = 0;
183     virtual void initAfterFirstFrame(const TrajectoryAnalysisSettings &settings, const t_trxframe &fr);
184 //    virtual TrajectoryAnalysisModuleDataPointer       startFrames (const AnalysisDataParallelOptions &opt, const SelectionCollection &selections);
185     virtual void analyzeFrame(int frnr, const t_trxframe &fr, t_pbc *pbc, TrajectoryAnalysisModuleData *pdata ) = 0;
186     virtual void finishFrames(TrajectoryAnalysisModuleData *pdata);
187     virtual void finishAnalysis(int nframes) = 0;
188     virtual void writeOutput() = 0;
189     const char* name() const;
190     const char* description() const;
191     int datasetCount() const;
192 protected:
193     TrajectoryAnalysisModule(const char *name, const char *description);
194 private:
195     TrajectoryAnalysisModule(const TrajectoryAnalysisModule &other);
196 };
197
198 %Exception gmx::InconsistentInputError(SIP_Exception) {
199
200 %TypeHeaderCode
201 #include <gromacs/utility/exceptions.h>
202 using namespace std;
203 %End
204
205 %RaiseCode
206     const char *detail = sipExceptionRef.what();
207
208     SIP_BLOCK_THREADS
209     PyErr_SetString(sipException_gmx_InconsistentInputError, detail);
210     SIP_UNBLOCK_THREADS
211 %End
212 };
213
214 class TrajectoryAnalysisCommandLineRunner {
215 %TypeHeaderCode
216 #include <gromacs/trajectoryanalysis/cmdlinerunner.h>
217 %End
218
219 public:
220     TrajectoryAnalysisCommandLineRunner(TrajectoryAnalysisModule *module);
221     int run(SIP_PYLIST) throw (gmx::InconsistentInputError);
222     %MethodCode
223     int argc = PyList_GET_SIZE(a0);
224
225     char **argv = new char *[argc + 1];
226
227     // Convert the list.
228     for (int a = 0; a < argc; ++a)
229     {
230         PyObject *arg_obj = PyList_GET_ITEM(a0, a);
231         const char *arg = sipString_AsLatin1String(&arg_obj);
232
233         if (arg)
234         {
235             arg = strdup(arg);
236             Py_DECREF(arg_obj);
237         }
238         else
239         {
240             arg = "unknown";
241         }
242
243         argv[a] = const_cast<char *>(arg);
244     }
245
246     argv[argc] = NULL;
247
248     try {
249         sipCpp->run(argc, argv);
250     } catch (gmx::InconsistentInputError &e) {
251         sipIsErr = 1;
252         PyErr_SetString(sipException_gmx_InconsistentInputError, e.what());
253     }
254     %End
255 private:
256     TrajectoryAnalysisCommandLineRunner(const TrajectoryAnalysisCommandLineRunner &other);
257 };
258