1 /******************************************************************************
2 
3   This source file is part of the Avogadro project.
4 
5   Copyright 2018 Kitware, Inc.
6 
7   This source code is released under the New BSD License, (the "License").
8 
9   Unless required by applicable law or agreed to in writing, software
10   distributed under the License is distributed on an "AS IS" BASIS,
11   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   See the License for the specific language governing permissions and
13   limitations under the License.
14 
15 ******************************************************************************/
16 
17 #ifndef OPENMMINPUTDIALOG_H
18 #define OPENMMINPUTDIALOG_H
19 
20 #include "ui_openmminputdialog.h"
21 
22 #include <QHash>
23 #include <QtCore/QSettings>
24 
25 class QJsonObject;
26 class QTextEdit;
27 
28 namespace Avogadro {
29 namespace QtGui {
30 class Molecule;
31 }
32 
33 namespace QtPlugins {
34 class OpenMMInputDialog : public QDialog
35 {
36   Q_OBJECT
37 
38 public:
39   explicit OpenMMInputDialog(QWidget* parent = 0, Qt::WindowFlags flag = 0);
40   ~OpenMMInputDialog();
41 
42   void readSettings(QSettings&);
43   void writeSettings(QSettings&) const;
44 
45   enum forceFieldType
46   {
47     amber96,
48     amber99sb,
49     amber99sbildn,
50     amber99sbnmr,
51     amber03,
52     amber10
53   };
54   enum waterModelType
55   {
56     spce,
57     tip3p,
58     tip4pew,
59     tip5p,
60     implicit
61   };
62   enum nonBondedType
63   {
64     NoCutoff,
65     CutoffNonPeriodic,
66     CutoffPeriodic,
67     Ewald,
68     PME
69   };
70   enum constraintType
71   {
72     None,
73     HBonds,
74     AllBonds,
75     HAngles
76   };
77   enum integratorType
78   {
79     Langevin,
80     Verlet,
81     Brownian,
82     VariableLangevin,
83     VariableVerlet
84   };
85   enum barostatType
86   {
87     NoBarostat,
88     MonteCarlo
89   };
90   enum platformType
91   {
92     Reference,
93     OpenCL,
94     CPU,
95     CUDA
96   };
97   enum precisionType
98   {
99     singlePrecision,
100     mixedPrecision,
101     doublePrecision
102   };
103   void setMolecule(QtGui::Molecule* molecule);
104 
105 protected:
106   /**
107    * Reimplemented to update the dialog when it is shown
108    */
109   void showEvent(QShowEvent* event);
110 
111 private:
112   Ui::OpenMMInputDialog ui;
113   QtGui::Molecule* m_molecule;
114 
115   // QString m_title;
116   QString m_readData;
117   forceFieldType m_forceFieldType;
118   QString m_title;
119   QString m_savePath;
120   waterModelType m_waterModelType;
121   nonBondedType m_nonBondedType;
122   constraintType m_constraintType;
123   integratorType m_integratorType;
124   barostatType m_barostatType;
125 
126   int m_deviceIndex;
127   int m_openclPlatformIndex;
128   int m_rigidWater;
129   double m_temperature;
130   double m_generationTemperature;
131   double m_nonBondedCutoff;
132   double m_timeStep;
133   double m_ewaldTolerance;
134   double m_constraintTolerance;
135   int m_reportInterval;
136   int m_equilibriationSteps;
137   int m_productionSteps;
138   double m_errorTolerance;
139   double m_collisionRate;
140   double m_pressure;
141   int m_barostatInterval;
142   QString m_dumpXYZ;
143   int m_dumpStep;
144   int m_velocityDistRandom;
145   platformType m_platformType;
146   precisionType m_precisionType;
147   int m_thermoInterval;
148   int m_minimize;
149   int m_minimizeSteps;
150   bool m_DCDReporter;
151   bool m_PDBReporter;
152   bool m_stateDataReporter;
153   bool m_stepIndex;
154   bool m_time;
155   bool m_speed;
156   bool m_progress;
157   bool m_potentialEnergy;
158   bool m_kineticEnergy;
159   bool m_totalEnergy;
160   bool m_temperatureCheck;
161   bool m_volume;
162   bool m_density;
163 
164   QString m_output;
165   bool m_dirty;
166   bool m_warned;
167   bool readData;
168 
169   QTextEdit* m_jobEdit;
170   QTextEdit* m_moleculeEdit;
171   QString m_inputCoordFileName;
172   QString m_topologyFileName;
173   QString m_jobFileName;
174 
175   // Generate an input deck as a string
176   QString generateInputDeck();
177   // Translate enums to strings
178   QString getForceFieldType(forceFieldType t);
179   QString getImplicitSolventType(forceFieldType t);
180   QString getConstraintType(constraintType t);
181   QString getWaterModelType(waterModelType t);
182   QString getNonBondedType(nonBondedType t);
183   QString getIntegratorType(integratorType t);
184   QString getBarostatType(barostatType t);
185   QString getRigidWater(int t);
186   QString getVelocityDistRandom(int t);
187   QString getPlatformType(platformType t);
188   QString getPrecisionType(precisionType t);
189   QString getMinimize(int t);
190 
191   // Enable/disable form elements
192   void deckDirty(bool);
193   void addMoleculeDataTab();
194 
195 public Q_SLOTS:
196   void updatePreviewText();
197 
198 private Q_SLOTS:
199   //! Button Slots
200   void textEditModified();
201   void resetClicked();
202   void generateClicked();
203   void enableFormClicked();
204 
205   void setScriptName();
206   void setInputCoordName();
207   void setTopologyName();
208 
209   void setForceField(int);
210   void setConstraintType(int);
211   void setWaterModelType(int);
212   void setNonBondedType(int);
213 
214   void setIntegratorType(int);
215   void setBarostatType(int);
216 
217   void setRigidWater(int);
218   void setTemperature(double);
219   void setGenerationTemperature(double);
220   void setNonBondedCutoff(double);
221 
222   void setTimeStep(double);
223   void setEwaldTolerance(double);
224   void setConstraintTolerance(double);
225   void setReportInterval(int);
226   void setEquilibriationSteps(int);
227   void setProductionSteps(int);
228   void setDeviceIndex(int);
229   void setOpenCLPlatformIndex(int);
230   void setErrorTolerance(double);
231   void setCollisionRate(double);
232   void setPressure(double);
233   void setBarostatInterval(int);
234 
235   void setVelocityDistRandom(int);
236   void setDCDReporter(bool);
237   void setPDBReporter(bool);
238   void setStateDataReporter(bool);
239   void setStepIndexBoolean(bool);
240   void setTimeBoolean(bool);
241   void setSpeedBoolean(bool);
242   void setProgressBoolean(bool);
243   void setPotentialEnergyBoolean(bool);
244   void setKineticEnergyBoolean(bool);
245   void setTotalEnergyBoolean(bool);
246   void setTemperatureBoolean(bool);
247   void setVolumeBoolean(bool);
248   void setDensityBoolean(bool);
249   void setPlatformType(int);
250   void setPrecisionType(int);
251   void setMinimize(int);
252   void setMinimizeSteps(int);
253 };
254 } // namespace QtPlugins
255 } // namespace Avogadro
256 
257 #endif
258