This repository was archived by the owner on May 26, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathtutorial.py
More file actions
executable file
·460 lines (447 loc) · 42.7 KB
/
tutorial.py
File metadata and controls
executable file
·460 lines (447 loc) · 42.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# generated by wxGlade 0.6.8 on Tue Oct 1 16:19:20 2013
#
import wx
# begin wxGlade: dependencies
import gettext
# end wxGlade
# begin wxGlade: extracode
# end wxGlade
# own code
import subprocess
import os
import re
workdir_ctp = "./alq3/"
# end own code
class MyFrame2(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: MyFrame2.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.bitmap_1 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap("wx/votca_logo_small.png", wx.BITMAP_TYPE_ANY))
self.notebook_2 = wx.Notebook(self, wx.ID_ANY, style=0)
self.notebook_2_pane_1 = wx.Panel(self.notebook_2, wx.ID_ANY, style=wx.DOUBLE_BORDER | wx.TAB_TRAVERSAL)
self.label_1 = wx.StaticText(self.notebook_2_pane_1, wx.ID_ANY, _("Introduction to the VOTCA Tutor"), style=wx.ST_NO_AUTORESIZE)
self.text_ctrl_1 = wx.TextCtrl(self.notebook_2_pane_1, wx.ID_ANY, _("Welcome to the VOTCA Tutor for Alq3. The aim of this tutor is to guide you through the necessary steps to perform charge transport simulations in VOTCA. The package is split into two parts, VOTCA::CSG (coarse graining applications) and VOTCA::CTP (charge transport). The tutor program will only address the latter.\n\nIn order to run this tutorial you need to have VOTCA::CTP installed and you need to make the commands available in your standard shell. If you are using bash this is done by adding the line \"source ~/votca/bin/VOTCARC.bash\" to the file ~/.bashrc, provided that you installed votca in the directory ~/votca.\n\nBefore you can start simulations with VOTCA you need a morphology generated with a molecular dynamics simulation package, typically GROMACS, and information about a single molecule calculated with a quantum chemistry package, typically GAUSSIAN or TURBOMOLE.\n\nThe files are provided here and are the following:\n\n1) In the folder QC_FILES you find the quantum chemistry files alq3.xyz, that contains the atomic positions of a single molecule, and the file alq3.orb with information about molecular orbitals for a single molecule. The latter is only needed if in the step \"Electronic Coupling\" (see tabs above) the semiemperical \"izindo\" method is used intead of full quantum chemistry calculations. The .xyz file is always needed. However, if you have a protein database file (.pdb) of your molecule, you can create the .xyz file using the command\nctp_tools -e pdb2xyz -o options.xml\n\n2) In the folder MP_FILES you find the .mps files that contain partial charges for the charged molecule (alq3_h.mps, as we are interested in hole transport in this case) and for the neutral molecule (alq3_n.mps). A possible way to generate these files is using GDMA (Gaussian Distributed Multipole Analysis) by Anthony Stone.\n\n3) The last folder is called MD_FILES and contains the morphology information generated, in this case, with GROMACS Molecular Dynamics simulations. The two files are system.gro (GROMACS atomic coordinates) and system.tpr (GROMACS binary topology file).\n\nWith these files at hand we have all the necessary preliminaries at hand to start VOTCA calculations. The necessary parameters are all stored in an .xml file, here called options.xml. Furthermore a mapping file, called system.xml, has to be created. This will be explained in the next step. Results of the VOTCA simulations are saved in the state file (state.sql), that is updated after each calculation. It can be checked using for example the sqlite3 command or the Firefox Plugin SQLite Manager.\n\nBefore continuning the tutorial, click the button below to check if you have VOTCA installed correctly.\n\nThe order of the tabs above is the one in that the calculations have to be done. Now we can go to the next step \"Mapping\".\n"), style=wx.TE_MULTILINE | wx.TE_READONLY)
self.checkinstallation = wx.Button(self.notebook_2_pane_1, wx.ID_ANY, _("Check VOTCA Installation"), style=wx.BU_LEFT)
self.button_next1 = wx.Button(self.notebook_2_pane_1, wx.ID_ANY, _("> next"))
self.hyperlink_3 = wx.HyperlinkCtrl(self.notebook_2_pane_1, wx.ID_ANY, _("VOTCA::CTP"), _("https://code.google.com/p/votca-ctp/"))
self.hyperlink_2 = wx.HyperlinkCtrl(self.notebook_2_pane_1, wx.ID_ANY, _("GAUSSIAN"), _("http://www.gaussian.com/"))
self.hyperlink_1 = wx.HyperlinkCtrl(self.notebook_2_pane_1, wx.ID_ANY, _("GDMA by Anthony Stone"), _("http://www-stone.ch.cam.ac.uk/programs/gdma.html"))
self.hyperlink_4 = wx.HyperlinkCtrl(self.notebook_2_pane_1, wx.ID_ANY, _("TURBOMOLE"), _("http://www.turbomole.com/"))
self.hyperlink_10 = wx.HyperlinkCtrl(self.notebook_2_pane_1, wx.ID_ANY, _("Manual Section 2.1 - Workflow"), "")
self.notebook_2_pane_2 = wx.Panel(self.notebook_2, wx.ID_ANY)
self.label_1a = wx.StaticText(self.notebook_2_pane_2, wx.ID_ANY, _("Options File and Getting Help"), style=wx.ST_NO_AUTORESIZE)
self.text_ctrl_1a = wx.TextCtrl(self.notebook_2_pane_2, wx.ID_ANY, _("You find the VOTCA::CTP manual in the download section, see the link below.\n\nOnce you have VOTCA installed, you can get help on the possible command line options using the commands\n\nctp_map -h\nctp_run -h\nctp_evaluate -h\n\nFor a specific calculator you can use the -d option, e.g.\n\nctp_evaluate -d neighborlist\n\nIt will give you a short description of the calculator and the options that have to be specified in the options.xml file. This file is needed for all the ctp_run and ctp_evaluate calculators. For every section there is also a sample xml file with default options that you can find in the shared folder of your installation (e.g. ~/votca/share/votca/ctp/xml/).\n\nTo make yourself familiar with the options file, let us run the command above and compare it to the izindo section in the options file."), style=wx.TE_MULTILINE | wx.TE_READONLY)
self.button_1_copy = wx.Button(self.notebook_2_pane_2, wx.ID_ANY, _("open options.xml"))
self.text_ctrl_3_copy = wx.TextCtrl(self.notebook_2_pane_2, wx.ID_ANY, _("ctp_evaluate -d neighborlist"))
self.button_runhelp = wx.Button(self.notebook_2_pane_2, wx.ID_ANY, _("run"))
self.button_next1_copy = wx.Button(self.notebook_2_pane_2, wx.ID_ANY, _("> next"))
self.hyperlink_11 = wx.HyperlinkCtrl(self.notebook_2_pane_2, wx.ID_ANY, _("Download VOTCA::CTP Manual"), _("https://code.google.com/p/votca-ctp/downloads/list"))
self.notebook_2_pane_3 = wx.Panel(self.notebook_2, wx.ID_ANY)
self.label_3 = wx.StaticText(self.notebook_2_pane_3, wx.ID_ANY, _("Mapping Files and Mapping Calculator"), style=wx.ST_NO_AUTORESIZE)
self.text_ctrl_2 = wx.TextCtrl(self.notebook_2_pane_3, wx.ID_ANY, _("The program ctp_map converts an atomistic trajectory to a course grained trajectory, i.e. one with conjugated segments and rigid fragments (see manual for details). It uses a file called system.xml in which each rigid fragment is defined by a list of atoms. Atom numbers, names and residue names should correspond to those used in the GROMACS topology.\n\nIn our example the file is already prepared. If you have to do it by hand, have a look at the example file in the manual. In case you have a .pdb file of a single molecule, the file can be generated automatically using the command\n\nctp_tools -e pdb2gmx -o options.xml\n\nThis command requires a file options.xml with the following content:\n\n<options>\n <pdb2map>\n <file>Alq3.pdb</file>\n <outfile>system.xml</outfile>\n </pdb2map>\n</options>\n\nOnce you have the mapping file system.xml, the mapping is generated using the command shown below. Please click the run button to see this in action."), style=wx.TE_MULTILINE | wx.TE_READONLY)
self.text_ctrl_3 = wx.TextCtrl(self.notebook_2_pane_3, wx.ID_ANY, _("ctp_map -t MD_FILES/system.tpr -c MD_FILES/system.gro -s system.xml -f state.sql"))
self.button_run1 = wx.Button(self.notebook_2_pane_3, wx.ID_ANY, _("run"))
self.button_next2 = wx.Button(self.notebook_2_pane_3, wx.ID_ANY, _("> next"))
self.hyperlink_6 = wx.HyperlinkCtrl(self.notebook_2_pane_3, wx.ID_ANY, _("Manual Section 3.2 - Mapping file"), "")
self.hyperlink_5 = wx.HyperlinkCtrl(self.notebook_2_pane_3, wx.ID_ANY, _("Manual Section 4.1.3 - ctp_map"), "")
self.notebook_2_pane_4 = wx.Panel(self.notebook_2, wx.ID_ANY)
self.label_6 = wx.StaticText(self.notebook_2_pane_4, wx.ID_ANY, _("Neighbor List"), style=wx.ST_NO_AUTORESIZE)
self.text_ctrl_4 = wx.TextCtrl(self.notebook_2_pane_4, wx.ID_ANY, _("To define a charge transport network neighboring molecules (segments) have to be identified. This is done by picking one molecule and then checking which other molecules lie within a sphere of a given cut-off. The value for that cut-off has to be specified in the respective section <neighborlist> of the options file. Open the options file and have a look at the section to see how it works.\n\nAfterwards calculate the neighbor list using the command below."), style=wx.TE_MULTILINE | wx.TE_READONLY)
self.button_1 = wx.Button(self.notebook_2_pane_4, wx.ID_ANY, _("open options.xml"))
self.text_ctrl_5 = wx.TextCtrl(self.notebook_2_pane_4, wx.ID_ANY, _("ctp_run -e neighborlist -o options.xml -f state.sql"))
self.button_run2 = wx.Button(self.notebook_2_pane_4, wx.ID_ANY, _("run"))
self.button_next3 = wx.Button(self.notebook_2_pane_4, wx.ID_ANY, _("> next"))
self.hyperlink_7 = wx.HyperlinkCtrl(self.notebook_2_pane_4, wx.ID_ANY, _("Manual Section 2.4 - Neighbor list"), "")
self.hyperlink_8 = wx.HyperlinkCtrl(self.notebook_2_pane_4, wx.ID_ANY, _("Manual Section 4.2.12 - neighborlist calculator"), "")
self.notebook_2_pane_5 = wx.Panel(self.notebook_2, wx.ID_ANY)
self.label_5a = wx.StaticText(self.notebook_2_pane_5, wx.ID_ANY, _("Site Energies"), style=wx.ST_NO_AUTORESIZE)
self.text_ctrl_5a = wx.TextCtrl(self.notebook_2_pane_5, wx.ID_ANY, _("The driving force between charge transfer reaction is the difference in energy between neighboring molecules. The total difference is made up out of contributions of an (a) electrostatic interactions, (b) polarization effects and (c) internal energy differences. Furthermore there can be an externally applied electric field, which is taken into account when rates are calculated.\n\nIn this step point (a) and (b) are computed, using the calculator \"emultipole\" or \"xqmultipole\". Both of them are based on computing the interaction of partial charges of the molecule. Point (c) will be treated in the next step.\n\nAlternatively one can use full density functional calculations instead of partial charges, provided by the calculator \"edft\".\n\nYou can have a look at the emultipole section in the options.xml file and then run the calculator."), style=wx.TE_MULTILINE | wx.TE_READONLY)
self.button_1_copy_1 = wx.Button(self.notebook_2_pane_5, wx.ID_ANY, _("open options.xml"))
self.text_ctrl_12 = wx.TextCtrl(self.notebook_2_pane_5, wx.ID_ANY, _("ctp_run -e emultipole -o options.xml -f state.sql"))
self.button_run5 = wx.Button(self.notebook_2_pane_5, wx.ID_ANY, _("run"))
self.button_next5 = wx.Button(self.notebook_2_pane_5, wx.ID_ANY, _("> next"))
self.hyperlink_12_copy = wx.HyperlinkCtrl(self.notebook_2_pane_5, wx.ID_ANY, _("Manual Section 2.6 - Site energies"), "")
self.hyperlink_13_copy = wx.HyperlinkCtrl(self.notebook_2_pane_5, wx.ID_ANY, _("Manual Section 4.2.6 - emultipole calculator"), "")
self.hyperlink_14 = wx.HyperlinkCtrl(self.notebook_2_pane_5, wx.ID_ANY, _("Manual Section 4.2.19 - xqmultipole calculator"), "")
self.hyperlink_15 = wx.HyperlinkCtrl(self.notebook_2_pane_5, wx.ID_ANY, _("Manual Section 4.2.3 - edft calculator"), "")
self.notebook_2_pane_6 = wx.Panel(self.notebook_2, wx.ID_ANY)
self.label_5 = wx.StaticText(self.notebook_2_pane_6, wx.ID_ANY, _("Neutral/Charged Molecule - Intramolecular Reorganization Energies"), style=wx.ST_NO_AUTORESIZE)
self.text_ctrl_4_copy_copy = wx.TextCtrl(self.notebook_2_pane_6, wx.ID_ANY, _("The intramolecular reorganization energy is the energy difference of a pair of molecules before and after the charge has hopped. It is calculated from the energies of the single molecules in their different states, which have to be specified in the system.xml file:\n\n <!-- EINTERNAL INPUT -->\n <U_cC_nN_h>0.0</U_cC_nN_h><!-- Site energy -->\n <U_nC_nN_h>0.13</U_nC_nN_h><!-- Reorg. discharge -->\n <U_cN_cC_h>0.10</U_cN_cC_h><!-- Reorg. charge -->\n\nLet us explain the notation by taking the example U_nC_nN_h. We are looking here at the energy difference U of a single molecule, namely the difference of teh molecule being neutral in a charged environment (nC) and of the molecule being neutral in a neutral environment (nN). The intramolecular reorganization energy for hole transport is in this example given by 0.13 eV + 0.10 eV.\n\nYou can get these values from DFT calculations, e.g., using GAUSSIAN and afterwards enter them in the system.xml file. This procedure will not be treated in the tutorial, however it is a necessary step of your workflow.\n\nIn your options.xml file you have to specify the path to the system.xml file:\n <einternal>\n <energiesXML>system.xml</energiesXML>\n </einternal>\n\nAfter that you can run the einternal calculator. All it does is read in the three values above and insert them into the state file (table segments, columns UnCnNe, UnCnNh....).\n\nIn case you used the edft calculator in the previous step, einternal is not needed beacause the edft calculator will calculate site specific energies."), style=wx.TE_MULTILINE | wx.TE_READONLY)
self.text_ctrl_9 = wx.TextCtrl(self.notebook_2_pane_6, wx.ID_ANY, _("ctp_run -e einternal -o options.xml -f state.sql"))
self.button_run6 = wx.Button(self.notebook_2_pane_6, wx.ID_ANY, _("run"))
self.button_next6 = wx.Button(self.notebook_2_pane_6, wx.ID_ANY, _("> next"))
self.hyperlink_7_copy_copy = wx.HyperlinkCtrl(self.notebook_2_pane_6, wx.ID_ANY, _("Manual Section 2.5.1 - Intramolecular Reoganization Energy"), "")
self.notebook_2_pane_7 = wx.Panel(self.notebook_2, wx.ID_ANY)
self.label_7 = wx.StaticText(self.notebook_2_pane_7, wx.ID_ANY, _("Outersphere Reorganization Energies"), style=wx.ST_NO_AUTORESIZE)
self.text_ctrl_7 = wx.TextCtrl(self.notebook_2_pane_7, wx.ID_ANY, _("The outersphere reorganization energy is the contribution of surrounding molecules that are polarized during the charge transfer and consequently show a change in their coordinates. This contribution is often small compared to the site energies, so that it can sometimes be neglected when Marcus rates are used. For Jortner rates outersphere reorganization energies are always needed.\n\nCalculate these energies by using the command below!"), style=wx.TE_MULTILINE | wx.TE_READONLY)
self.text_ctrl_8 = wx.TextCtrl(self.notebook_2_pane_7, wx.ID_ANY, _("ctp_run -e eoutersphere -o options.xml -f state.sql"))
self.button_run8 = wx.Button(self.notebook_2_pane_7, wx.ID_ANY, _("run"))
self.button_next7 = wx.Button(self.notebook_2_pane_7, wx.ID_ANY, _("> next"))
self.hyperlink_7_copy_1 = wx.HyperlinkCtrl(self.notebook_2_pane_7, wx.ID_ANY, _("Manual Section 2.5.2 - Outersphere reorganization energy"), "")
self.hyperlink_8_copy = wx.HyperlinkCtrl(self.notebook_2_pane_7, wx.ID_ANY, _("Manual Section 4.2.7 - eoutersphere calculator"), "")
self.notebook_2_pane_8 = wx.ScrolledWindow(self.notebook_2, wx.ID_ANY, style=wx.TAB_TRAVERSAL)
self.label_4 = wx.StaticText(self.notebook_2_pane_8, wx.ID_ANY, _("Molecular Orbitals"))
self.text_ctrl_4a = wx.TextCtrl(self.notebook_2_pane_8, wx.ID_ANY, _("There are two different methods available in VOTCA for calculating electronic coupling elements (also known as transfer integrals). One is to use the full density functional calculation for each pair of neighboring molecules. This is a robust and accurate method, however, it requires a lot of computational time. The second method is the semiempirical ZINDO method (see reference to manual below).\n\nIn this tutorial we will use the ZINDO method, and in this case a file with molecular orbitals is needed. It can be generated using GAUSSIAN and is described in the manual in the reference given below. The procedure is not part of this tutorial but the output file is provided as QC_FILES/alq3.orb.\n\n"), style=wx.TE_MULTILINE | wx.TE_READONLY)
self.label_4b = wx.StaticText(self.notebook_2_pane_8, wx.ID_ANY, _("Electronic Coupling"))
self.text_ctrl_4b = wx.TextCtrl(self.notebook_2_pane_8, wx.ID_ANY, _("Given that the file QC_FILES/alq3.orb is present, we can calculate electronic coupling elements using the semiempirical IZINDO method.\n\nIn order to run the method, for each segment the respective options have to be specified in the file system.xml. It looks like this:\n\n <!-- IZINDO INPUT --> \n <orbitals>QC_FILES/alq3.orb</orbitals>\n <basisset>INDO</basisset> \n <torbital_h>80</torbital_h>\n <torbital_e>81</torbital_e>\n\nYou can open the file clicking the button below to make yourself familiar with the structure of the file. The first line specifies to the path to the orbitals file that is described above. In the second line the basis set that was used in the molecular orbital calculations has to be given, usually \"INDO\". The last two lines specify the orbitals that participate in charge transport of holes and electrons, respectively. In this example orbital number 80is the HOMO and orbital number 81 the LUMO orbital. You can include more orbitals by specifying not only a single number but a vector of orbital indices, where each entry is separated by a space. The number of the orbital can be retrieved from the .log file corresponding to the fort.7 file. It corresponds to the number fo alpha electrons.\n\nIn the file options.xml you have to specify the path to the file system.xml:\n\n<orbitalsXML>system.xml</orbitalsXML>\n\nThe alternative method for calculating electronic coupling elements would be a full density functional calculation for each pair. In that case the alq3.orb file is not needed, however you need the edft calculations from the site energy section. The calculation is prepared and executed using the two commands\n\nctp_parallel -e idft -o options.xml -f state.sql -j write\nctp_parallel -e idft -o options.xml -f state.sql -j run\n\nYou would probably want to run the calculation on a cluster and not on a workstation. In that case the second command has to be submitted to your cluster.\n\nWe will here use only the semiempirical ZINDO method. Have a look at the file system.xml and then run the electronic coupling calculation!"), style=wx.TE_MULTILINE | wx.TE_READONLY)
self.button_OpenSystem = wx.Button(self.notebook_2_pane_8, wx.ID_ANY, _("open system.xml"))
self.text_ctrl_5_copy = wx.TextCtrl(self.notebook_2_pane_8, wx.ID_ANY, _("ctp_run -e izindo -o options.xml -f state.sql"))
self.button_run7 = wx.Button(self.notebook_2_pane_8, wx.ID_ANY, _("run"))
self.button_next8 = wx.Button(self.notebook_2_pane_8, wx.ID_ANY, _("> next"))
self.hyperlink_7_copy = wx.HyperlinkCtrl(self.notebook_2_pane_8, wx.ID_ANY, _("Manual Section 3.3 - Molecular orbitals"), "")
self.hyperlink_9 = wx.HyperlinkCtrl(self.notebook_2_pane_8, wx.ID_ANY, _("Manual Section 2.7.1 - Semiempirical methods"), "")
self.notebook_2_pane_9 = wx.Panel(self.notebook_2, wx.ID_ANY)
self.label_9 = wx.StaticText(self.notebook_2_pane_9, wx.ID_ANY, _("Rates"), style=wx.ST_NO_AUTORESIZE)
self.text_ctrl_10 = wx.TextCtrl(self.notebook_2_pane_9, wx.ID_ANY, _("In the high temperature limit charge transfer rates can be described by Marcus theory. In order to use this theory, the value \"marcus\" has to be provided as the method in the options.xml file. It is also possible to calculate rates as proposed by Jortner and Bixon.\n\nFor Marcus rates the section in the options.xml file looks like this:\n\n <rates>\n <temperature>300</temperature> \n <field> 0 0 1000000 </field>\n <method>marcus</method>\n </rates>\n\nThe first value is the temperature in Kelvin, the second the electric field (x,y,z) in V/m and the third the method.\n\nYou can run the rates calculation using the command below."), style=wx.TE_MULTILINE | wx.TE_READONLY)
self.text_ctrl_8_copy = wx.TextCtrl(self.notebook_2_pane_9, wx.ID_ANY, _("ctp_run -e rates -o options.xml -f state.sql"))
self.button_run9 = wx.Button(self.notebook_2_pane_9, wx.ID_ANY, _("run"))
self.button_next9 = wx.Button(self.notebook_2_pane_9, wx.ID_ANY, _("> next"))
self.hyperlink_12 = wx.HyperlinkCtrl(self.notebook_2_pane_9, wx.ID_ANY, _("Manual Section 2.8 - Charge transfer rate"), "")
self.hyperlink_13 = wx.HyperlinkCtrl(self.notebook_2_pane_9, wx.ID_ANY, _("Manual Section 4.2.15 - rates calculator"), "")
self.notebook_2_pane_10 = wx.Panel(self.notebook_2, wx.ID_ANY)
self.label_10 = wx.StaticText(self.notebook_2_pane_10, wx.ID_ANY, _("Transport Calculations with Kinetic Monte Carlo"), style=wx.ST_NO_AUTORESIZE)
self.text_ctrl_11 = wx.TextCtrl(self.notebook_2_pane_10, wx.ID_ANY, _("The mobility of electrons or holes is the solution of the corresponding master equation. We now have the necessary ingredients at hand: sites with positions and rates for transfer between those sites.\n\nTo solve the Master equation we use here a Kinetic Monte Carlo method for multiple carriers: different charges are injected randomly and move throgh the sample with periodic boundary conditions. Two charges can not occupy the same site, which allows to observe density dependent effects.\n\nA typical input in the options file would be:\n\n <kmcmultiple>\n <runtime>1E-4</runtime>\n <outputtime>1E-6</outputtime>\n <trajectoryfile>trajectory.csv</trajectoryfile>\n <seed>123</seed>\n <injection>*</injection>\n <injectionmethod>random</injectionmethod>\n <numberofcharges>4</numberofcharges>\n <fieldX>0</fieldX>\n <fieldY>0</fieldY>\n <fieldZ>1000000</fieldZ>\n <carriertype>hole</carriertype>\n <temperature>300</temperature>\n <explicitcoulomb>0</explicitcoulomb>\n <rates>statefile</rates>\n </kmcmultiple>\n\nThat means: we are simulating a time of 1/10000 seconds, every 100 steps the position is written to the file trajectory.csv. The random number generagor is initialised with the number 123 (any integer) and all the sites can be used for injection. We have 4 holes moving in the sample, a field of 1000000 V/m in z direction and a temperature of 300 K. Make sure that the field and the temperature agree with what you spefied in the previous step for the rates calculation. \n\nThe last option <rates>statefile</rates> means that the rates from the statefile will be used. You can also set it to \"calculate\". In that case the field and temperature of the file will not be used but the options given for KMC.\n\nIf you want to run calculations for a single charge it is still recomendable to use the kmcmultiple calculator, because it has more output options. Just set \"numberofcharges\" to 1.\n\nThe result of the calculation is the average velocity of each carrier and the resulting mobility (velocity in field direction divided by the absolute value of the field). In order to get meaningful results you should average over different trajectories (i.e. different seeds) and choose a runtime sufficient for convergence."), style=wx.TE_MULTILINE | wx.TE_READONLY)
self.text_ctrl_8_copy_copy = wx.TextCtrl(self.notebook_2_pane_10, wx.ID_ANY, _("kmc_run -e kmcmultiple -o options.xml -f state.sql"))
self.button_run10 = wx.Button(self.notebook_2_pane_10, wx.ID_ANY, _("run"))
self.hyperlink_16 = wx.HyperlinkCtrl(self.notebook_2_pane_10, wx.ID_ANY, _("Manual Section 2.9 - Master equation"), "")
self.hyperlink_13_copy_1 = wx.HyperlinkCtrl(self.notebook_2_pane_10, wx.ID_ANY, _("Manual Section 4.2.22 - kmcmultiple calculator"), "")
self.__set_properties()
self.__do_layout()
self.Bind(wx.EVT_BUTTON, self.onButtonCheckinstallation, self.checkinstallation)
self.Bind(wx.EVT_BUTTON, self.OnButtonNext1, self.button_next1)
self.Bind(wx.EVT_BUTTON, self.onButtonOptions, self.button_1_copy)
self.Bind(wx.EVT_BUTTON, self.onButtonRunHelp, self.button_runhelp)
self.Bind(wx.EVT_BUTTON, self.OnButtonNext2, self.button_next1_copy)
self.Bind(wx.EVT_BUTTON, self.onButtonRun1, self.button_run1)
self.Bind(wx.EVT_BUTTON, self.OnButtonNext3, self.button_next2)
self.Bind(wx.EVT_BUTTON, self.onButtonOptions, self.button_1)
self.Bind(wx.EVT_BUTTON, self.onButtonRun2, self.button_run2)
self.Bind(wx.EVT_BUTTON, self.OnButtonNext4, self.button_next3)
self.Bind(wx.EVT_BUTTON, self.onButtonOptions, self.button_1_copy_1)
self.Bind(wx.EVT_BUTTON, self.onButtonRun5, self.button_run5)
self.Bind(wx.EVT_BUTTON, self.OnButtonNext5, self.button_next5)
self.Bind(wx.EVT_BUTTON, self.onButtonRun6, self.button_run6)
self.Bind(wx.EVT_BUTTON, self.OnButtonNext6, self.button_next6)
self.Bind(wx.EVT_BUTTON, self.onButtonRun8, self.button_run8)
self.Bind(wx.EVT_BUTTON, self.OnButtonNext7, self.button_next7)
self.Bind(wx.EVT_BUTTON, self.onButtonSystem, self.button_OpenSystem)
self.Bind(wx.EVT_BUTTON, self.onButtonRun7, self.button_run7)
self.Bind(wx.EVT_BUTTON, self.OnButtonNext8, self.button_next8)
self.Bind(wx.EVT_BUTTON, self.onButtonRun9, self.button_run9)
self.Bind(wx.EVT_BUTTON, self.OnButtonNext9, self.button_next9)
self.Bind(wx.EVT_BUTTON, self.onButtonRun10, self.button_run10)
# end wxGlade
def __set_properties(self):
# begin wxGlade: MyFrame2.__set_properties
self.SetTitle(_("VOTCA Tutor (Alq3)"))
self.SetSize((917, 1125))
self.label_1.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
self.text_ctrl_1.SetMinSize((800, 300))
self.text_ctrl_1.SetFont(wx.Font(13, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Sans"))
self.label_1a.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
self.text_ctrl_1a.SetMinSize((800, 300))
self.text_ctrl_1a.SetFont(wx.Font(13, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Sans"))
self.text_ctrl_3_copy.SetMinSize((700, 25))
self.label_3.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
self.text_ctrl_2.SetMinSize((800, 300))
self.text_ctrl_2.SetFont(wx.Font(13, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Sans"))
self.text_ctrl_3.SetMinSize((700, 25))
self.label_6.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
self.text_ctrl_4.SetMinSize((800, 300))
self.text_ctrl_4.SetFont(wx.Font(13, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Sans"))
self.text_ctrl_5.SetMinSize((700, 25))
self.label_5a.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
self.text_ctrl_5a.SetMinSize((800, 280))
self.text_ctrl_5a.SetFont(wx.Font(13, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Sans"))
self.text_ctrl_12.SetMinSize((700, 25))
self.label_5.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
self.text_ctrl_4_copy_copy.SetMinSize((800, 300))
self.text_ctrl_4_copy_copy.SetFont(wx.Font(13, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Sans"))
self.text_ctrl_9.SetMinSize((700, 25))
self.label_7.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
self.text_ctrl_7.SetMinSize((800, 300))
self.text_ctrl_7.SetFont(wx.Font(13, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Sans"))
self.text_ctrl_8.SetMinSize((700, 25))
self.label_4.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
self.text_ctrl_4a.SetMinSize((800, 200))
self.text_ctrl_4a.SetFont(wx.Font(13, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Sans"))
self.label_4b.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
self.text_ctrl_4b.SetMinSize((800, 720))
self.text_ctrl_4b.SetFont(wx.Font(13, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Sans"))
self.text_ctrl_5_copy.SetMinSize((700, 25))
self.notebook_2_pane_8.SetScrollRate(0, 10)
self.label_9.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
self.text_ctrl_10.SetMinSize((800, 300))
self.text_ctrl_10.SetFont(wx.Font(13, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Sans"))
self.text_ctrl_8_copy.SetMinSize((700, 25))
self.label_10.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
self.text_ctrl_11.SetMinSize((800, 300))
self.text_ctrl_11.SetFont(wx.Font(13, wx.MODERN, wx.NORMAL, wx.NORMAL, 0, "Sans"))
self.text_ctrl_8_copy_copy.SetMinSize((700, 25))
# end wxGlade
def __do_layout(self):
# begin wxGlade: MyFrame2.__do_layout
sizer_6 = wx.BoxSizer(wx.VERTICAL)
sizer_10 = wx.BoxSizer(wx.VERTICAL)
grid_sizer_1_copy_copy_1_copy_1_copy_1 = wx.GridSizer(1, 2, 0, 0)
sizer_9 = wx.BoxSizer(wx.VERTICAL)
grid_sizer_1_copy_copy_1_copy_1 = wx.GridSizer(1, 2, 0, 0)
sizer_4 = wx.BoxSizer(wx.VERTICAL)
grid_sizer_1_copy_copy = wx.GridSizer(1, 2, 0, 0)
sizer_3_copy = wx.BoxSizer(wx.VERTICAL)
grid_sizer_1_copy_copy_1 = wx.GridSizer(1, 2, 0, 0)
sizer_4_copy = wx.BoxSizer(wx.VERTICAL)
grid_sizer_1_copy_copy_1_copy = wx.GridSizer(1, 2, 0, 0)
sizer_5 = wx.BoxSizer(wx.VERTICAL)
grid_sizer_1_copy_copy_1_copy_1_copy = wx.GridSizer(1, 2, 0, 0)
sizer_3 = wx.BoxSizer(wx.VERTICAL)
grid_sizer_1_copy = wx.GridSizer(1, 2, 0, 0)
sizer_2 = wx.BoxSizer(wx.VERTICAL)
grid_sizer_1 = wx.GridSizer(1, 2, 0, 0)
sizer_1_copy = wx.BoxSizer(wx.VERTICAL)
grid_sizer_1_copy_1 = wx.GridSizer(1, 2, 0, 0)
sizer_1 = wx.BoxSizer(wx.VERTICAL)
sizer_6.Add(self.bitmap_1, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
sizer_1.Add(self.label_1, 0, wx.ALL | wx.EXPAND, 7)
sizer_1.Add(self.text_ctrl_1, 0, wx.ALL, 7)
sizer_1.Add((20, 20), 0, 0, 0)
sizer_1.Add(self.checkinstallation, 0, wx.ALL, 7)
sizer_1.Add(self.button_next1, 0, wx.ALL, 7)
sizer_1.Add((20, 20), 0, 0, 0)
sizer_1.Add(self.hyperlink_3, 0, 0, 0)
sizer_1.Add(self.hyperlink_2, 0, 0, 0)
sizer_1.Add(self.hyperlink_1, 0, 0, 0)
sizer_1.Add(self.hyperlink_4, 0, 0, 0)
sizer_1.Add(self.hyperlink_10, 0, 0, 0)
self.notebook_2_pane_1.SetSizer(sizer_1)
sizer_1_copy.Add(self.label_1a, 0, wx.ALL | wx.EXPAND, 7)
sizer_1_copy.Add(self.text_ctrl_1a, 0, wx.ALL, 7)
sizer_1_copy.Add(self.button_1_copy, 0, wx.ALL, 7)
grid_sizer_1_copy_1.Add(self.text_ctrl_3_copy, 0, wx.ALL, 7)
grid_sizer_1_copy_1.Add(self.button_runhelp, 0, wx.ALL, 7)
sizer_1_copy.Add(grid_sizer_1_copy_1, 0, 0, 0)
sizer_1_copy.Add((20, 20), 0, 0, 0)
sizer_1_copy.Add(self.button_next1_copy, 0, wx.ALL, 7)
sizer_1_copy.Add((20, 20), 0, 0, 0)
sizer_1_copy.Add(self.hyperlink_11, 0, 0, 0)
self.notebook_2_pane_2.SetSizer(sizer_1_copy)
sizer_2.Add(self.label_3, 0, wx.ALL | wx.EXPAND, 7)
sizer_2.Add(self.text_ctrl_2, 0, wx.ALL, 7)
grid_sizer_1.Add(self.text_ctrl_3, 0, wx.ALL, 7)
grid_sizer_1.Add(self.button_run1, 0, wx.ALL, 7)
sizer_2.Add(grid_sizer_1, 0, 0, 0)
sizer_2.Add((20, 20), 0, 0, 0)
sizer_2.Add(self.button_next2, 0, wx.ALL, 7)
sizer_2.Add((20, 20), 0, 0, 0)
sizer_2.Add(self.hyperlink_6, 0, 0, 0)
sizer_2.Add(self.hyperlink_5, 0, 0, 0)
self.notebook_2_pane_3.SetSizer(sizer_2)
sizer_3.Add(self.label_6, 0, wx.ALL | wx.EXPAND, 7)
sizer_3.Add(self.text_ctrl_4, 0, wx.ALL, 7)
sizer_3.Add(self.button_1, 0, wx.ALL, 7)
grid_sizer_1_copy.Add(self.text_ctrl_5, 0, wx.ALL, 7)
grid_sizer_1_copy.Add(self.button_run2, 0, wx.ALL, 7)
sizer_3.Add(grid_sizer_1_copy, 0, 0, 0)
sizer_3.Add((20, 20), 0, 0, 0)
sizer_3.Add(self.button_next3, 0, wx.ALL, 7)
sizer_3.Add((20, 20), 0, 0, 0)
sizer_3.Add(self.hyperlink_7, 0, 0, 0)
sizer_3.Add(self.hyperlink_8, 0, 0, 0)
self.notebook_2_pane_4.SetSizer(sizer_3)
sizer_5.Add(self.label_5a, 0, wx.ALL | wx.EXPAND, 7)
sizer_5.Add(self.text_ctrl_5a, 0, wx.ALL, 7)
sizer_5.Add(self.button_1_copy_1, 0, wx.ALL, 7)
grid_sizer_1_copy_copy_1_copy_1_copy.Add(self.text_ctrl_12, 0, wx.ALL, 7)
grid_sizer_1_copy_copy_1_copy_1_copy.Add(self.button_run5, 0, wx.ALL, 7)
sizer_5.Add(grid_sizer_1_copy_copy_1_copy_1_copy, 0, 0, 0)
sizer_5.Add((20, 20), 0, 0, 0)
sizer_5.Add(self.button_next5, 0, wx.ALL, 7)
sizer_5.Add((20, 20), 0, 0, 0)
sizer_5.Add(self.hyperlink_12_copy, 0, 0, 0)
sizer_5.Add(self.hyperlink_13_copy, 0, 0, 0)
sizer_5.Add(self.hyperlink_14, 0, 0, 0)
sizer_5.Add(self.hyperlink_15, 0, 0, 0)
self.notebook_2_pane_5.SetSizer(sizer_5)
sizer_4_copy.Add(self.label_5, 0, wx.ALL | wx.EXPAND, 7)
sizer_4_copy.Add(self.text_ctrl_4_copy_copy, 0, wx.ALL, 7)
grid_sizer_1_copy_copy_1_copy.Add(self.text_ctrl_9, 0, wx.ALL, 7)
grid_sizer_1_copy_copy_1_copy.Add(self.button_run6, 0, wx.ALL, 7)
sizer_4_copy.Add(grid_sizer_1_copy_copy_1_copy, 0, 0, 0)
sizer_4_copy.Add((20, 20), 0, 0, 0)
sizer_4_copy.Add(self.button_next6, 0, wx.ALL, 7)
sizer_4_copy.Add((20, 20), 0, 0, 0)
sizer_4_copy.Add(self.hyperlink_7_copy_copy, 0, 0, 0)
self.notebook_2_pane_6.SetSizer(sizer_4_copy)
sizer_3_copy.Add(self.label_7, 0, wx.ALL | wx.EXPAND, 7)
sizer_3_copy.Add(self.text_ctrl_7, 0, wx.ALL, 7)
grid_sizer_1_copy_copy_1.Add(self.text_ctrl_8, 0, wx.ALL, 7)
grid_sizer_1_copy_copy_1.Add(self.button_run8, 0, wx.ALL, 7)
sizer_3_copy.Add(grid_sizer_1_copy_copy_1, 0, 0, 0)
sizer_3_copy.Add((20, 20), 0, 0, 0)
sizer_3_copy.Add(self.button_next7, 0, wx.ALL, 7)
sizer_3_copy.Add((20, 20), 0, 0, 0)
sizer_3_copy.Add(self.hyperlink_7_copy_1, 0, 0, 0)
sizer_3_copy.Add(self.hyperlink_8_copy, 0, 0, 0)
self.notebook_2_pane_7.SetSizer(sizer_3_copy)
sizer_4.Add(self.label_4, 0, wx.ALL | wx.EXPAND, 7)
sizer_4.Add(self.text_ctrl_4a, 0, wx.ALL, 7)
sizer_4.Add(self.label_4b, 0, wx.ALL | wx.EXPAND, 7)
sizer_4.Add(self.text_ctrl_4b, 0, wx.ALL, 7)
sizer_4.Add(self.button_OpenSystem, 0, wx.ALL, 7)
grid_sizer_1_copy_copy.Add(self.text_ctrl_5_copy, 0, wx.ALL, 7)
grid_sizer_1_copy_copy.Add(self.button_run7, 0, wx.ALL, 7)
sizer_4.Add(grid_sizer_1_copy_copy, 0, 0, 0)
sizer_4.Add((20, 20), 0, 0, 0)
sizer_4.Add(self.button_next8, 0, wx.ALL, 7)
sizer_4.Add((20, 20), 0, 0, 0)
sizer_4.Add(self.hyperlink_7_copy, 0, 0, 0)
sizer_4.Add(self.hyperlink_9, 0, 0, 0)
self.notebook_2_pane_8.SetSizer(sizer_4)
sizer_9.Add(self.label_9, 0, wx.ALL | wx.EXPAND, 7)
sizer_9.Add(self.text_ctrl_10, 0, wx.ALL, 7)
grid_sizer_1_copy_copy_1_copy_1.Add(self.text_ctrl_8_copy, 0, wx.ALL, 7)
grid_sizer_1_copy_copy_1_copy_1.Add(self.button_run9, 0, wx.ALL, 7)
sizer_9.Add(grid_sizer_1_copy_copy_1_copy_1, 0, 0, 0)
sizer_9.Add((20, 20), 0, 0, 0)
sizer_9.Add(self.button_next9, 0, wx.ALL, 7)
sizer_9.Add((20, 20), 0, 0, 0)
sizer_9.Add(self.hyperlink_12, 0, 0, 0)
sizer_9.Add(self.hyperlink_13, 0, 0, 0)
self.notebook_2_pane_9.SetSizer(sizer_9)
sizer_10.Add(self.label_10, 0, wx.ALL | wx.EXPAND, 7)
sizer_10.Add(self.text_ctrl_11, 0, wx.ALL, 7)
grid_sizer_1_copy_copy_1_copy_1_copy_1.Add(self.text_ctrl_8_copy_copy, 0, wx.ALL, 7)
grid_sizer_1_copy_copy_1_copy_1_copy_1.Add(self.button_run10, 0, wx.ALL, 7)
sizer_10.Add(grid_sizer_1_copy_copy_1_copy_1_copy_1, 0, 0, 0)
sizer_10.Add((20, 20), 0, 0, 0)
sizer_10.Add(self.hyperlink_16, 0, 0, 0)
sizer_10.Add(self.hyperlink_13_copy_1, 0, 0, 0)
self.notebook_2_pane_10.SetSizer(sizer_10)
self.notebook_2.AddPage(self.notebook_2_pane_1, _("Start"))
self.notebook_2.AddPage(self.notebook_2_pane_2, _("Options"))
self.notebook_2.AddPage(self.notebook_2_pane_3, _("Mapping"))
self.notebook_2.AddPage(self.notebook_2_pane_4, _("Neighbor List"))
self.notebook_2.AddPage(self.notebook_2_pane_5, _("Site Energies"))
self.notebook_2.AddPage(self.notebook_2_pane_6, _("Neutral/Charged Molecule"))
self.notebook_2.AddPage(self.notebook_2_pane_7, _("Outersphere Energies"))
self.notebook_2.AddPage(self.notebook_2_pane_8, _("Electronic Coupling"))
self.notebook_2.AddPage(self.notebook_2_pane_9, _("Rates"))
self.notebook_2.AddPage(self.notebook_2_pane_10, _("Transport"))
sizer_6.Add(self.notebook_2, 1, wx.EXPAND, 0)
self.SetSizer(sizer_6)
self.Layout()
self.Centre()
# end wxGlade
def OnButton1(self, event): # wxGlade: MyFrame2.<event_handler>
self.notebook_2.SetSelection(1)
event.Skip()
def onButtonRun1(self, event): # wxGlade: MyFrame2.<event_handler>
pid = subprocess.Popen("konsole --noclose --workdir "+workdir_ctp+" -e ctp_map -t MD_FILES/system.tpr -c MD_FILES/system.gro -s system.xml -f state.sql",shell=True).pid
event.Skip()
def OnButton2(self, event): # wxGlade: MyFrame2.<event_handler>
self.notebook_2.SetSelection(3)
event.Skip()
def onButtonRun2(self, event): # wxGlade: MyFrame2.<event_handler>
pid = subprocess.Popen("konsole --noclose --workdir "+workdir_ctp+" -e ctp_run -e neighborlist -o options.xml -f state.sql",shell=True).pid
event.Skip()
def OnButton3(self, event): # wxGlade: MyFrame2.<event_handler>
self.notebook_2.SetSelection(4)
event.Skip()
def onButtonOptions(self, event): # wxGlade: MyFrame2.<event_handler>
pid = subprocess.Popen("xdg-open "+workdir_ctp+"/options.xml",shell=True).pid
event.Skip()
def onButtonCheckinstallation(self, event): # wxGlade: MyFrame2.<event_handler>
success = 0
output = ""
try:
p = subprocess.Popen('ctp_map',stdout=subprocess.PIPE,stderr=subprocess.PIPE)
output, errors = p.communicate()
success = 1
except:
pass
m = re.search('VOTCA', output)
try:
if m.group(0) == 'VOTCA':
success = 1
else:
success = 0
except:
success = 0
if success == 1:
dlg = wx.MessageDialog(self, 'VOTCA::CTP is installed correctly. You are ready to run the tutorial.', 'VOTCA Installation Check', wx.OK|wx.ICON_INFORMATION)
dlg.ShowModal()
dlg.Destroy()
else:
dlg = wx.MessageDialog(self, '\nVOTCA::CTP has not been installed correctly or has not been sourced. Please check the Wiki page for the installation (https://code.google.com/p/votca-ctp/wiki/Installation) and make sure to source VOTCA in your standard shell.\n\nThis tutorial will not work until the installation is correct.\n\nClick OK to open the help file on installation.', 'CHECK NOT SUCCESSFUL!', wx.OK|wx.ICON_INFORMATION)
dlg.ShowModal()
dlg.Destroy()
pid = subprocess.Popen("xdg-open 'https://code.google.com/p/votca-ctp/wiki/Installation'",shell=True).pid
event.Skip()
def onButtonRunHelp(self, event): # wxGlade: MyFrame2.<event_handler>
pid = subprocess.Popen("konsole --noclose --workdir "+workdir_ctp+" -e ctp_run -d neighborlist",shell=True).pid
event.Skip()
def OnButtonNext1(self, event): # wxGlade: MyFrame2.<event_handler>
self.notebook_2.SetSelection(1)
event.Skip()
def OnButtonNext2(self, event): # wxGlade: MyFrame2.<event_handler>
self.notebook_2.SetSelection(2)
event.Skip()
def OnButtonNext3(self, event): # wxGlade: MyFrame2.<event_handler>
self.notebook_2.SetSelection(3)
event.Skip()
def OnButtonNext4(self, event): # wxGlade: MyFrame2.<event_handler>
self.notebook_2.SetSelection(4)
event.Skip()
def OnButtonNext5(self, event): # wxGlade: MyFrame2.<event_handler>
self.notebook_2.SetSelection(5)
event.Skip()
def OnButtonNext6(self, event): # wxGlade: MyFrame2.<event_handler>
self.notebook_2.SetSelection(6)
event.Skip()
def onButtonSystem(self, event): # wxGlade: MyFrame2.<event_handler>
pid = subprocess.Popen("xdg-open "+workdir_ctp+"system.xml",shell=True).pid
event.Skip()
def onButtonRun8(self, event): # wxGlade: MyFrame2.<event_handler>
pid = subprocess.Popen("konsole --noclose --workdir "+workdir_ctp+" -e ctp_run -e eoutersphere -o options.xml -f state.sql",shell=True).pid
event.Skip()
def OnButtonNext7(self, event): # wxGlade: MyFrame2.<event_handler>
self.notebook_2.SetSelection(7)
event.Skip()
def onButtonRun6(self, event): # wxGlade: MyFrame2.<event_handler>
pid = subprocess.Popen("konsole --noclose --workdir "+workdir_ctp+" -e ctp_run -e einternal -o options.xml -f state.sql",shell=True).pid
event.Skip()
def OnButtonNext8(self, event): # wxGlade: MyFrame2.<event_handler>
self.notebook_2.SetSelection(8)
event.Skip()
def onButtonRun9(self, event): # wxGlade: MyFrame2.<event_handler>
pid = subprocess.Popen("konsole --noclose --workdir "+workdir_ctp+" -e ctp_run -e rates -o options.xml -f state.sql",shell=True).pid
event.Skip()
def OnButtonNext9(self, event): # wxGlade: MyFrame2.<event_handler>
self.notebook_2.SetSelection(9)
event.Skip()
def onButtonRun5(self, event): # wxGlade: MyFrame2.<event_handler>
pid = subprocess.Popen("konsole --noclose --workdir "+workdir_ctp+" -e ctp_run -e emultipole -o options.xml -f state.sql",shell=True).pid
event.Skip()
def onButtonRun10(self, event): # wxGlade: MyFrame2.<event_handler>
pid = subprocess.Popen("konsole --noclose --workdir "+workdir_ctp+" -e kmc_run -e kmcmultiple -o options.xml -f state.sql",shell=True).pid
event.Skip()
def onButtonRun7(self, event): # wxGlade: MyFrame2.<event_handler>
pid = subprocess.Popen("konsole --noclose --workdir "+workdir_ctp+" -e ctp_run -e izindo -o options.xml -f state.sql",shell=True).pid
event.Skip()
# end of class MyFrame2
if __name__ == "__main__":
# change working directory to the script path
scriptpath = os.path.dirname(os.path.realpath(__file__))
os.chdir(scriptpath)
print scriptpath
gettext.install("app") # replace with the appropriate catalog name
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
frame_3 = MyFrame2(None, wx.ID_ANY, "")
app.SetTopWindow(frame_3)
frame_3.Show()
app.MainLoop()