1 """This modules implements I{File --> Trajectory conversion --> converter} dialog.
2
3 Classes:
4 * AmberNetCDFConverterDialog: sets up I{File-->Trajectory conversion --> Amber NetCDF to MMTK} dialog used to
5 convert an AMBER trajectory to a MMTK NetCDF trajectory.
6 * CHARMMConverterDialog: sets up I{File-->Trajectory conversion --> CHARMM/X-PLOR to MMTK} dialog used to
7 convert a CHARMM or X-PLOR trajectory to a MMTK NetCDF trajectory.
8 * DL_POLYConverterDialog: sets up I{File-->Trajectory conversion --> DL_POLY to MMTK} dialog used to
9 convert a DL_POLY trajectory to a MMTK NetCDF trajectory.
10 * MaterialsStudioConverterDialog: sets up I{File-->Trajectory conversion --> MaterialsStudio --> Discover to MMTK} or
11 I{File-->Trajectory conversion --> MaterialsStudio --> Forcite to MMTK} dialogs used to convert a Discover or a
12 Forcite trajectory to a MMTK NetCDF trajectory.
13 * NAMDConverterDialog: sets up I{File-->Trajectory conversion --> NAMD to MMTK} dialog used to
14 convert a NAMD trajectory to a MMTK NetCDF trajectory.
15 * VASPConverterDialog: sets up I{File-->Trajectory conversion --> VASP to MMTK} dialog used to
16 convert a VASP trajectory to a MMTK NetCDF trajectory.
17 """
18
19 import re
20
21
22 from tkFileDialog import askopenfilename
23 from Tkinter import *
24
25
26 from Scientific.Geometry import Vector
27
28
29 from MMTK import Atom, AtomCluster, Units
30 from MMTK.Trajectory import Trajectory, SnapshotGenerator, TrajectoryOutput
31 from MMTK.Universe import InfiniteUniverse, OrthorhombicPeriodicUniverse, ParallelepipedicPeriodicUniverse
32
33
34 from nMOLDYN.Core.Error import Error
35 from nMOLDYN.Core.IOFiles import AmberNetCDFConverter, CHARMMConverter, DL_POLYConverter, MaterialsStudioConverter, NAMDConverter, VASPConverter
36 from nMOLDYN.Core.Logger import LogMessage
37 from nMOLDYN.GUI.Widgets import *
38
40 """Sets up a dialog for the conversion from an Amber NetCDF trajectory to a MMTK NetCDF trajectory.
41
42 @note: the conversion requires a AMber NetCDF and PDB file and the time step in ps between two frames.
43 """
44
46 """The constructor.
47
48 @param parent: the parent widget.
49 """
50
51 Toplevel.__init__(self, parent)
52 self.transient(parent)
53
54 self.title('Amber --> MMTK NetCDF converter')
55
56 self.parent = parent
57
58 body = Frame(self)
59 self.initial_focus = self.body(body)
60 body.grid(row = 0, column = 0, sticky = EW)
61
62 self.buttonbox()
63
64 self.grab_set()
65
66 if not self.initial_focus:
67 self.initial_focus = self
68
69 self.protocol("WM_DELETE_WINDOW", self.cancel)
70
71 self.resizable(width = NO, height = NO)
72
73 self.geometry("+%d+%d" % (parent.winfo_rootx()+50, parent.winfo_rooty()+50))
74
75 self.initial_focus.focus_set()
76
77 self.wait_window(self)
78
79 - def body(self, master):
80 """
81 Create dialog body. Return widget that should have initial focus.
82 """
83
84 settingsFrame = LabelFrame(master, text = 'Settings', bd = 2, relief = GROOVE)
85 settingsFrame.grid(row = 0, column = 0, sticky = EW, padx = 3, pady = 3)
86 settingsFrame.grid_columnconfigure(0, weight = 1)
87
88
89 self.pdbFileBrowser = ComboFileBrowser(settingsFrame,\
90 frameLabel = "PDB input file",\
91 tagName = 'amber_converter_pdb_input_file',\
92 contents = '',\
93 filetypes = [('PDB', '*.pdb'), ('All files', '*')],\
94 save = False)
95 self.pdbFileBrowser.grid(row = 0, column = 0, padx = 2, pady = 2, sticky = W)
96
97
98 self.amberNetCDFFileBrowser = ComboFileBrowser(settingsFrame,\
99 frameLabel = "Amber NetCDF input file",\
100 tagName = 'amber_converter_netcdf_input_file',\
101 contents = '',\
102 filetypes = [('Amber NetCDF', '*.nc'), ('All files', '*')],\
103 save = False)
104 self.amberNetCDFFileBrowser.grid(row = 1, column = 0, padx = 2, pady = 2, sticky = EW)
105 self.amberNetCDFFileBrowser.grid_columnconfigure(0, weight = 1)
106 self.amberNetCDFFileBrowser.entry.variable.trace('w', self.suggestOutputFilename)
107
108
109 self.timeStepEntry = ComboFloatEntry(settingsFrame,\
110 frameLabel = "Time step (in ps)",\
111 tagName = 'amber_converter_time_step',\
112 contents = 1.0)
113 self.timeStepEntry.grid(row = 2, column = 0, padx = 2, pady = 2, sticky = EW)
114 self.timeStepEntry.grid_columnconfigure(0, weight = 1)
115
116
117 self.outputFileBrowser = ComboFileBrowser(settingsFrame,\
118 frameLabel = "MMTK NetCDF output file",\
119 tagName = 'amber_converter_mmtk_netcdf_output_file',\
120 contents = '',\
121 save = True)
122 self.outputFileBrowser.grid(row = 3, column = 0, padx = 2, pady = 2, sticky = EW)
123 self.outputFileBrowser.grid_columnconfigure(0, weight = 1)
124
125 return None
126
144
145
146 - def ok(self, event = None):
147
148 if not self.validate():
149 self.initial_focus.focus_set()
150 return
151
152 self.update_idletasks()
153
154 self.apply()
155
156 - def cancel(self, event=None):
157
158
159 self.parent.focus_set()
160 self.destroy()
161
162
164
165 self.pdbFile = self.pdbFileBrowser.getValue()
166
167 if not self.pdbFile:
168 raise Error('Please enter a PDB input file.')
169
170
171 self.amberNetCDFFile = self.amberNetCDFFileBrowser.getValue()
172 if not self.amberNetCDFFile:
173 raise Error('Please enter an Amber NetCDF input file.')
174
175
176 self.outputFile = self.outputFileBrowser.getValue()
177 if not self.outputFile:
178 raise Error('Please enter a MMTK NetCDF output file.')
179
180 if self.outputFile[-3:] != '.nc':
181 self.outputFile += '.nc'
182
183 self.timeStep = self.timeStepEntry.getValue()
184 if self.timeStep <= 0.0:
185 raise Error('Time step must be > 0.')
186
187 return True
188
190 """
191 This method starts the conversion.
192 """
193
194 converter = AmberNetCDFConverter(self.pdbFile, self.amberNetCDFFile, self.outputFile, self.timeStep)
195 LogMessage('info', 'Conversion successful', ['gui'])
196
198 """
199 This method will propose a name for the output file based on the name of the loaded file.
200 """
201
202 if self.amberNetCDFFileBrowser.getValue():
203 self.outputFileBrowser.setValue(os.path.splitext(self.amberNetCDFFileBrowser.getValue())[0] + '_mmtk.nc')
204
206 """Sets up a dialog used for the conversion from a CHARMM/X-PLOR/NAMD trajectory to a MMTK NetCDF trajectory.
207
208 @note: the conversion requires CHARMM/X-PLOR DCD and PDB files.
209 """
210
212 """The constructor.
213
214 @param parent: the parent widget.
215 """
216
217 Toplevel.__init__(self, parent)
218 self.transient(parent)
219
220 self.title('CHARMM/X-PLOR --> MMTK NetCDF converter')
221
222 self.parent = parent
223
224 body = Frame(self)
225 self.initial_focus = self.body(body)
226 body.grid(row = 0, column = 0, sticky = EW)
227
228 self.buttonbox()
229
230 self.grab_set()
231
232 if not self.initial_focus:
233 self.initial_focus = self
234
235 self.protocol("WM_DELETE_WINDOW", self.cancel)
236
237 self.resizable(width = NO, height = NO)
238
239 self.geometry("+%d+%d" % (parent.winfo_rootx()+50, parent.winfo_rooty()+50))
240
241 self.initial_focus.focus_set()
242
243 self.wait_window(self)
244
245 - def body(self, master):
246 """
247 Create dialog body. Return widget that should have initial focus.
248 """
249
250 settingsFrame = LabelFrame(master, text = 'Settings', bd = 2, relief = GROOVE)
251 settingsFrame.grid(row = 0, column = 0, sticky = EW, padx = 3, pady = 3)
252 settingsFrame.grid_columnconfigure(0, weight = 1)
253
254
255 self.pdbFileBrowser = ComboFileBrowser(settingsFrame,\
256 frameLabel = "PDB input file",\
257 tagName = "charmm_converter_pdb_input_file",\
258 contents = '',\
259 filetypes = [('PDB', '*.pdb'), ('All files', '*')],\
260 save = False)
261 self.pdbFileBrowser.grid(row = 0, column = 0, padx = 2, pady = 2, sticky = EW)
262 self.pdbFileBrowser.grid_columnconfigure(0, weight = 1)
263
264
265 self.dcdFileBrowser = ComboFileBrowser(settingsFrame,\
266 frameLabel = "DCD input file",\
267 tagName = "charmm_converter_dcd_input_file",\
268 contents = '',\
269 filetypes = [('DCD input file', '*.dcd'), ('All files', '*')],\
270 save = False)
271 self.dcdFileBrowser.grid(row = 1, column = 0, padx = 2, pady = 2, sticky = EW)
272 self.dcdFileBrowser.grid_columnconfigure(0, weight = 1)
273 self.dcdFileBrowser.entry.variable.trace('w', self.suggestOutputFilename)
274
275
276 self.outputFileBrowser = ComboFileBrowser(settingsFrame,\
277 frameLabel = "MMTK NetCDF output file",\
278 tagName = "charmm_converter_mmtk_netcdf_output_file",\
279 contents = '',\
280 save = True)
281 self.outputFileBrowser.grid(row = 3, column = 0, padx = 2, pady = 2, sticky = EW)
282 self.outputFileBrowser.grid_columnconfigure(0, weight = 1)
283
284 return None
285
303
304
305 - def ok(self, event = None):
306
307 if not self.validate():
308 self.initial_focus.focus_set()
309 return
310
311 self.update_idletasks()
312
313 self.apply()
314
315 - def cancel(self, event=None):
316
317
318 self.parent.focus_set()
319 self.destroy()
320
321
323
324 self.pdbFile = self.pdbFileBrowser.getValue()
325
326 if not self.pdbFile:
327 raise Error('Please enter a PDB input file.')
328
329
330 self.dcdFile = self.dcdFileBrowser.getValue()
331 if not self.dcdFile:
332 raise Error('Please enter a DCD input file.')
333
334
335 self.outputFile = self.outputFileBrowser.getValue()
336 if not self.outputFile:
337 raise Error('Please enter a MMTK NetCDF output file.')
338
339 if self.outputFile[-3:] != '.nc':
340 self.outputFile += '.nc'
341
342 return True
343
345 """
346 This method starts the conversion.
347 """
348
349 converter = CHARMMConverter(self.pdbFile, self.dcdFile, self.outputFile)
350 LogMessage('info', 'Conversion successful', ['gui'])
351
353 """
354 This method will propose a name for the output file based on the name of the loaded file.
355 """
356
357 if self.dcdFileBrowser.getValue():
358 self.outputFileBrowser.setValue(os.path.splitext(self.dcdFileBrowser.getValue())[0] + '.nc')
359
361 """Sets up a dialog used for the conversion from a DL_POLY trajectory to a MMTK NetCDF trajectory.
362
363 @note: the conversion requires the DL_POLY FIELD and HISTORY files and additional information to specify
364 the atoms whose names is not sufficient to determine which element they are.
365 """
366
368 """The constructor.
369
370 @param parent: the parent widget.
371 """
372
373 Toplevel.__init__(self, parent)
374 self.transient(parent)
375
376 self.title('DL_POLY --> MMTK NetCDF converter')
377
378 self.parent = parent
379
380 body = Frame(self)
381 self.initial_focus = self.body(body)
382 body.grid(row = 0, column = 0, sticky = EW)
383
384 self.buttonbox()
385
386 self.grab_set()
387
388 if not self.initial_focus:
389 self.initial_focus = self
390
391 self.protocol("WM_DELETE_WINDOW", self.cancel)
392
393 self.resizable(width = NO, height = NO)
394
395 self.geometry("+%d+%d" % (parent.winfo_rootx()+50, parent.winfo_rooty()+50))
396
397 self.initial_focus.focus_set()
398
399 self.wait_window(self)
400
401 - def body(self, master):
402 """
403 Create dialog body. Return widget that should have initial focus.
404 """
405
406 settingsFrame = LabelFrame(master, text = 'Settings', bd = 2, relief = GROOVE)
407 settingsFrame.grid(row = 0, column = 0, sticky = EW, padx = 3, pady = 3)
408 settingsFrame.grid_columnconfigure(0, weight = 1)
409
410
411 self.fieldFileBrowser = ComboFileBrowser(settingsFrame,\
412 frameLabel = "FIELD input file",\
413 tagName = "dlpoly_converter_field_input_file",\
414 contents = '',\
415 filetypes = [('FIELD files', 'FIELD*'),('All files', '*')],\
416 save = False)
417 self.fieldFileBrowser.grid(row = 0, column = 0, padx = 2, pady = 2, sticky = EW)
418 self.fieldFileBrowser.grid_columnconfigure(0, weight = 1)
419
420
421 self.historyFileBrowser = ComboFileBrowser(settingsFrame,\
422 frameLabel = "HISTORY input file",\
423 tagName = "dlpoly_converter_history_input_file",\
424 contents = '',\
425 filetypes = [('HISTORY files', 'HISTORY*'),('All files', '*')],\
426 save = False)
427 self.historyFileBrowser.grid(row = 1, column = 0, padx = 2, pady = 2, sticky = EW)
428 self.historyFileBrowser.grid_columnconfigure(0, weight = 1)
429
430
431 self.specialAtomsEntry = ComboStringEntry(settingsFrame,\
432 frameLabel = "Special atoms",\
433 tagName = 'dlpoly_converter_special_atoms',\
434 contents = '')
435 self.specialAtomsEntry.grid(row = 2, column = 0, padx = 2, pady = 2, sticky = EW)
436 self.specialAtomsEntry.grid_columnconfigure(0, weight = 1)
437
438
439 self.outputFileBrowser = ComboFileBrowser(settingsFrame,\
440 frameLabel = "MMTK NetCDF output file",\
441 tagName = 'dlpoly_converter_mmtk_netcdf_output_file',\
442 contents = '',\
443 save = True)
444 self.outputFileBrowser.grid(row = 3, column = 0, padx = 2, pady = 2, sticky = EW)
445 self.outputFileBrowser.grid_columnconfigure(0, weight = 1)
446
447 return None
448
466
467
468 - def ok(self, event = None):
469
470 if not self.validate():
471 self.initial_focus.focus_set()
472 return
473
474 self.update_idletasks()
475
476 self.apply()
477
478 - def cancel(self, event=None):
479
480
481 self.parent.focus_set()
482 self.destroy()
483
484
486
487
488 self.fieldFile = self.fieldFileBrowser.getValue()
489 if not self.fieldFile:
490 raise Error('Please enter a FIELD input file.')
491
492
493 self.historyFile = self.historyFileBrowser.getValue()
494 if not self.historyFile:
495 raise Error('Please enter a HISTORY input file.')
496
497
498 self.outputFile = self.outputFileBrowser.getValue()
499 if not self.outputFile:
500 raise Error('Please enter a MMTK NetCDF output file.')
501
502 if self.outputFile[-3:] != '.nc':
503 self.outputFile += '.nc'
504
505 self.specialAtoms = self.specialAtomsEntry.getValue()
506 if not self.specialAtoms:
507 self.specialAtoms = {}
508
509 else:
510 try:
511 self.specialAtoms = dict(re.findall('(\w+):(\w+)',self.specialAtoms))
512 except:
513 raise Error('Wrong format for special atoms declaration. \
514 Must be of the form special atom name1:corresponding element,...')
515
516 return True
517
519
520 converter = DL_POLYConverter(self.fieldFile, self.historyFile, self.outputFile, self.specialAtoms)
521 LogMessage('info', 'Conversion successful', ['gui'])
522
524 """Sets up a dialog used for the conversion from a MaterialsStudio trajectory to a MMTK NetCDF trajectory.
525
526 @note: the conversion requires MaterialsStudio XTD or XSD file and HIS or TRJ files according to the MaterialsStudio modules used to
527 produce the trajectory (HIS for Discover and TRJ for Forcite).
528 """
529
531 """The constructor.
532
533 @param parent: the parent widget.
534 """
535
536 Toplevel.__init__(self, parent)
537 self.transient(parent)
538
539 self.title('MaterialsStudio-%s --> MMTK NetCDF converter' % module)
540
541 self.parent = parent
542 self.module = module
543
544 body = Frame(self)
545 self.initial_focus = self.body(body)
546 body.grid(row = 0, column = 0, sticky = EW)
547
548 self.buttonbox()
549
550 self.grab_set()
551
552 if not self.initial_focus:
553 self.initial_focus = self
554
555 self.protocol("WM_DELETE_WINDOW", self.cancel)
556
557 self.resizable(width = NO, height = NO)
558
559 self.geometry("+%d+%d" % (parent.winfo_rootx()+50, parent.winfo_rooty()+50))
560
561 self.initial_focus.focus_set()
562
563 self.wait_window(self)
564
565 - def body(self, master):
566 """
567 Create dialog body. Return widget that should have initial focus.
568 """
569
570 module = self.module.lower()
571
572 settingsFrame = LabelFrame(master, text = 'Settings', bd = 2, relief = GROOVE)
573 settingsFrame.grid(row = 0, column = 0, sticky = EW, padx = 3, pady = 3)
574 settingsFrame.grid_columnconfigure(0, weight = 1)
575
576
577 self.xtdxsdFileBrowser = ComboFileBrowser(settingsFrame,\
578 frameLabel = "XTD/XSD input file",\
579 tagName = '%s_converter_xtd_xsd_input_file' % module,\
580 contents = '',\
581 filetypes = [('XTD input file', '*.xtd'), ('XSD input file', '*.xsd'), ('All files', '*')],\
582 save = False)
583 self.xtdxsdFileBrowser.grid(row = 0, column = 0, padx = 2, pady = 2, sticky = EW)
584 self.xtdxsdFileBrowser.grid_columnconfigure(0, weight = 1)
585
586 if self.module == 'Discover':
587
588 self.histrjFileBrowser = ComboFileBrowser(settingsFrame,\
589 frameLabel = "HIS input file",\
590 tagName = 'discover_converter_his_input_file',\
591 contents = '',\
592 filetypes = [('HIS input file', '*.his'), ('All files', '*')],\
593 save = False)
594 elif self.module == 'Forcite':
595
596 self.histrjFileBrowser = ComboFileBrowser(settingsFrame,\
597 frameLabel = "TRJ input file",\
598 tagName = 'forcite_converter_trj_input_file',\
599 contents = '',\
600 filetypes = [('TRJ input file', '*.trj'), ('All files', '*')],\
601 save = False)
602
603 self.histrjFileBrowser.grid(row = 1, column = 0, padx = 2, pady = 2, sticky = EW)
604 self.histrjFileBrowser.grid_columnconfigure(0, weight = 1)
605 self.histrjFileBrowser.entry.variable.trace('w', self.suggestOutputFilename)
606
607
608 self.subselectionEntry = ComboStringEntry(settingsFrame,\
609 frameLabel = "Subselection",\
610 tagName = '%s_converter_subselection' % module,\
611 contents = '')
612 self.subselectionEntry.grid(row = 2, column = 0, padx = 2, pady = 2, sticky = EW)
613 self.subselectionEntry.grid_columnconfigure(0, weight = 1)
614
615
616 self.outputFileBrowser = ComboFileBrowser(settingsFrame,\
617 frameLabel = "MMTK NetCDF output file",\
618 tagName = '%s_converter_mmtk_netcdf_output_file' % module,\
619 contents = '',\
620 save = True)
621 self.outputFileBrowser.grid(row = 3, column = 0, padx = 2, pady = 2, sticky = EW)
622 self.outputFileBrowser.grid_columnconfigure(0, weight = 1)
623
624 return None
625
643
644
645 - def ok(self, event = None):
646
647 if not self.validate():
648 self.initial_focus.focus_set()
649 return
650
651 self.update_idletasks()
652
653 self.apply()
654
655 - def cancel(self, event=None):
656
657
658 self.parent.focus_set()
659 self.destroy()
660
661
663
664
665 self.xtdxsdFile = self.xtdxsdFileBrowser.getValue()
666 if not self.xtdxsdFile:
667 raise Error('Please enter a XTD or XSD input file.')
668
669
670 self.histrjFile = self.histrjFileBrowser.getValue()
671 if not self.histrjFile:
672 raise Error('Please enter a HIS or TRJ input file.')
673
674
675
676 self.subselection = self.subselectionEntry.getValue().strip()
677 if self.subselection:
678 try:
679 self.subselection = eval(self.subselection)
680
681 if isinstance(self.subselection, int):
682 self.subselection = [[self.subselection]]
683
684 elif isinstance(self.subselection, (list,tuple)):
685 pass
686 except:
687 try:
688 self.subselection = [range(int(v[0]),int(v[1])+1,int(v[2])) for v in re.findall('(\d+):(\d+):(\d+)',subsel)]
689 except:
690 raise Error('Wrong format for frame selection.')
691
692
693 for s in self.subselection:
694 if not isinstance(s, (list, tuple)):
695 raise Error('The parsed subselection must be a nested list of integers.')
696
697 for ss in s:
698 if not isinstance(ss, int):
699 raise Error('The parsed subselection must be a nested list of integers.')
700
701
702 self.outputFile = self.outputFileBrowser.getValue()
703 if not self.outputFile:
704 raise Error('Please enter a MMTK NetCDF output file.')
705
706 if self.outputFile[-3:] != '.nc':
707 self.outputFile += '.nc'
708
709 return True
710
712
713 converter = MaterialsStudioConverter(self.module, self.xtdxsdFile, self.histrjFile, self.outputFile, self.subselection)
714 LogMessage('info', 'Conversion successful', ['gui'])
715
717 """
718 This method will propose a name for the output file based on the name of the loaded file.
719 """
720
721 if self.histrjFileBrowser.getValue():
722 self.outputFileBrowser.setValue(os.path.splitext(self.histrjFileBrowser.getValue())[0] + '.nc')
723
725 """Sets up a dialog used for the conversion from a CHARMM/X-PLOR/NAMD trajectory to a MMTK NetCDF trajectory.
726
727 @note: the conversion requires CHARMM/X-PLOR/NAMD DCD and PDB files and optionnaly the simulation box dimensions.
728 """
729
731 """
732 The constructor.
733 """
734
735 Toplevel.__init__(self, parent)
736 self.transient(parent)
737
738 self.title('NAMD --> MMTK NetCDF converter')
739
740 self.parent = parent
741
742 body = Frame(self)
743 self.initial_focus = self.body(body)
744 body.grid(row = 0, column = 0, sticky = EW)
745
746 self.buttonbox()
747
748 self.grab_set()
749
750 if not self.initial_focus:
751 self.initial_focus = self
752
753 self.protocol("WM_DELETE_WINDOW", self.cancel)
754
755 self.resizable(width = NO, height = NO)
756
757 self.geometry("+%d+%d" % (parent.winfo_rootx()+50, parent.winfo_rooty()+50))
758
759 self.initial_focus.focus_set()
760
761 self.wait_window(self)
762
763 - def body(self, master):
764 """
765 Create dialog body. Return widget that should have initial focus.
766 """
767
768 settingsFrame = LabelFrame(master, text = 'Settings', bd = 2, relief = GROOVE)
769 settingsFrame.grid(row = 0, column = 0, sticky = EW, padx = 3, pady = 3)
770 settingsFrame.grid_columnconfigure(0, weight = 1)
771
772
773 self.pdbFileBrowser = ComboFileBrowser(settingsFrame,\
774 frameLabel = "PDB input file",\
775 tagName = 'namd_converter_pdb_input_file',\
776 contents = '',\
777 filetypes = [('PDB', '*.pdb'), ('All files', '*')],\
778 save = False)
779 self.pdbFileBrowser.grid(row = 0, column = 0, padx = 2, pady = 2, sticky = EW)
780 self.pdbFileBrowser.grid_columnconfigure(0, weight = 1)
781
782
783 self.dcdFileBrowser = ComboFileBrowser(settingsFrame,\
784 frameLabel = "DCD input file",\
785 tagName = 'namd_converter_dcd_input_file',\
786 contents = '',\
787 filetypes = [('DCD input file', '*.dcd'), ('All files', '*')],\
788 save = False)
789 self.dcdFileBrowser.grid(row = 1, column = 0, padx = 2, pady = 2, sticky = EW)
790 self.dcdFileBrowser.grid_columnconfigure(0, weight = 1)
791 self.dcdFileBrowser.entry.variable.trace('w', self.suggestOutputFilename)
792
793
794 self.xstFileBrowser = ComboFileBrowser(settingsFrame,\
795 frameLabel = "XST input file",\
796 tagName = 'namd_converter_xst_input_file',\
797 contents = '',\
798 filetypes = [('XST input file', '*.xst'), ('All files', '*')],\
799 save = False)
800 self.xstFileBrowser.grid(row = 2, column = 0, padx = 2, pady = 2, sticky = EW)
801 self.xstFileBrowser.grid_columnconfigure(0, weight = 1)
802
803
804 self.outputFileBrowser = ComboFileBrowser(settingsFrame,\
805 frameLabel = "MMTK NetCDF output file",\
806 tagName = 'namd_converter_mmtk_netcdf_output_file',\
807 contents = '',\
808 save = True)
809 self.outputFileBrowser.grid(row = 3, column = 0, padx = 2, pady = 2, sticky = EW)
810 self.outputFileBrowser.grid_columnconfigure(0, weight = 1)
811
812 return None
813
831
832
833 - def ok(self, event = None):
834
835 if not self.validate():
836 self.initial_focus.focus_set()
837 return
838
839 self.update_idletasks()
840
841 self.apply()
842
843 - def cancel(self, event=None):
844
845
846 self.parent.focus_set()
847 self.destroy()
848
849
851
852 self.pdbFile = self.pdbFileBrowser.getValue()
853
854 if not self.pdbFile:
855 raise Error('Please enter a PDB input file.')
856
857
858 self.dcdFile = self.dcdFileBrowser.getValue()
859 if not self.dcdFile:
860 raise Error('Please enter a DCD input file.')
861
862 self.xstFile = self.xstFileBrowser.getValue()
863
864
865 self.outputFile = self.outputFileBrowser.getValue()
866 if not self.outputFile:
867 raise Error('Please enter a MMTK NetCDF output file.')
868
869 if self.outputFile[-3:] != '.nc':
870 self.outputFile += '.nc'
871
872 return True
873
875 """
876 This method starts the conversion.
877 """
878
879 converter = NAMDConverter(self.pdbFile, self.dcdFile, self.xstFile, self.outputFile)
880 LogMessage('info', 'Conversion successful', ['gui'])
881
882
884 """
885 This method will propose a name for the output file based on the name of the loaded file.
886 """
887
888 if self.dcdFileBrowser.getValue():
889 self.outputFileBrowser.setValue(os.path.splitext(self.dcdFileBrowser.getValue())[0] + '.nc')
890
892 """Sets up a dialog used for the conversion from a VASP trajectory to a MMTK NetCDF trajectory.
893
894 @note: the conversion requires the VASP CONTCAR or POSCAR and XDATCAR files.
895 """
896
898 """
899 The constructor.
900 """
901
902 Toplevel.__init__(self, parent)
903 self.transient(parent)
904
905 self.title('VASP --> MMTK NetCDF converter')
906
907 self.parent = parent
908
909 body = Frame(self)
910 self.initial_focus = self.body(body)
911 body.grid(row = 0, column = 0, sticky = EW)
912
913 self.buttonbox()
914
915 self.grab_set()
916
917 if not self.initial_focus:
918 self.initial_focus = self
919
920 self.protocol("WM_DELETE_WINDOW", self.cancel)
921
922 self.resizable(width = NO, height = NO)
923
924 self.geometry("+%d+%d" % (parent.winfo_rootx()+50, parent.winfo_rooty()+50))
925
926 self.initial_focus.focus_set()
927
928 self.wait_window(self)
929
930 - def body(self, master):
931 """
932 Create dialog body. Return widget that should have initial focus.
933 """
934
935 settingsFrame = LabelFrame(master, text = 'Settings', bd = 2, relief = GROOVE)
936 settingsFrame.grid(row = 0, column = 0, sticky = EW, padx = 3, pady = 3)
937 settingsFrame.grid_columnconfigure(0, weight = 1)
938
939
940 self.contcarFileBrowser = ComboFileBrowser(settingsFrame,\
941 frameLabel = "POSCAR/CONTCAR input file",\
942 tagName = 'vasp_converter_poscar_contcar_input_file',\
943 contents = '',\
944 filetypes = [('POSCAR files', 'POSCAR*'), ('CONTCAR files', 'CONTCAR*'),('All files', '*')],\
945 save = False)
946 self.contcarFileBrowser.grid(row = 0, column = 0, padx = 2, pady = 2, sticky = EW)
947 self.contcarFileBrowser.grid_columnconfigure(0, weight = 1)
948
949
950 self.xdatcarFileBrowser = ComboFileBrowser(settingsFrame,\
951 frameLabel = "XDATCAR input file",\
952 tagName = 'vasp_converter_xdatcar_input_file',\
953 contents = '',\
954 filetypes = [('XDATCAR files', 'XDATCAR*'),('All files', '*')],\
955 save = False)
956 self.xdatcarFileBrowser.grid(row = 1, column = 0, padx = 2, pady = 2, sticky = EW)
957 self.xdatcarFileBrowser.grid_columnconfigure(0, weight = 1)
958
959
960 self.atomContentsEntry = ComboStringEntry(settingsFrame,\
961 frameLabel = "Atom contents",\
962 tagName = 'vasp_converter_atom_contents',\
963 contents = '')
964 self.atomContentsEntry.grid(row = 2, column = 0, padx = 2, pady = 2, sticky = EW)
965 self.atomContentsEntry.grid_columnconfigure(0, weight = 1)
966
967
968 self.outputFileBrowser = ComboFileBrowser(settingsFrame,\
969 frameLabel = "MMTK NetCDF output file",\
970 tagName = 'vasp_converter_mmtk_netcdf_output_file',\
971 contents = '',\
972 save = True)
973 self.outputFileBrowser.grid(row = 3, column = 0, padx = 2, pady = 2, sticky = EW)
974 self.outputFileBrowser.grid_columnconfigure(0, weight = 1)
975
976 return None
977
995
996
997 - def ok(self, event = None):
998
999 if not self.validate():
1000 self.initial_focus.focus_set()
1001 return
1002
1003 self.update_idletasks()
1004
1005 self.apply()
1006
1007 - def cancel(self, event=None):
1008
1009
1010 self.parent.focus_set()
1011 self.destroy()
1012
1013
1015
1016
1017 self.contcarFile = self.contcarFileBrowser.getValue()
1018 if not self.contcarFile:
1019 raise Error('Please enter a CONTCAR or POSCAR input file.')
1020
1021
1022 self.xdatcarFile = self.xdatcarFileBrowser.getValue()
1023 if not self.xdatcarFile:
1024 raise Error('Please enter a XDATCAR input file.')
1025
1026 self.atomContents = self.atomContentsEntry.getValue()
1027 if not self.atomContents:
1028 raise Error('You must provide the atomic contents as it appears in the CONTCAR file.')
1029
1030 try:
1031 self.atomContents = re.split('[;,\s]+',self.atomContents)
1032 except:
1033 try:
1034 self.atomContents = [v.strip() for v in self.atomContents.split()]
1035 except:
1036 raise Error('Wrong format for atomic contents declaration.')
1037
1038
1039 self.outputFile = self.outputFileBrowser.getValue()
1040 if not self.outputFile:
1041 raise Error('Please enter a MMTK NetCDF output file.')
1042
1043 if self.outputFile[-3:] != '.nc':
1044 self.outputFile += '.nc'
1045
1046 return True
1047
1049
1050 converter = VASPConverter(self.contcarFile, self.xdatcarFile, self.outputFile, self.atomContents)
1051 LogMessage('info', 'Conversion successful', ['gui'])
1052