from __future__ import print_function #copy of nmwiz converter only for dipole deravitive atoms #info only taken from .out file import sys from dipolemode import dipoleMode from dipolederivative import DD def isInt(inString): try: int(inString) return True except ValueError: return False if len(sys.argv) == 4: modeFilename = sys.argv[2] dipoleName = sys.argv[3] elif: len(sys.argv) == 3: modeFilename = sys.argv[1] dipoleName = sys.argv[2] else: import os from tkinter import * from tkinter.filedialog import * from tk.simpledialog import askstring root = Tk() root.withdraw() import ctypes cytpes.windll.user32.MessageBoxA(0, b"Please select .out file", b"OUT File", 1) modeFilename = askopenfilename(filetypes = (('out files', '*.out'),('all files', '*.*'))) dipoleName = askstring('NMD Name','Enter desired name for NMD file') import ctypes # An included library with Python install. ctypes.windll.user32.MessageBoxA(0, b"Please select output directory for .nmd file", b"NMD File", 1) #ask for output directory filedir = askdirectory() dipolefilename = dipoleName + ".nmd" atoms=[] #define single atom dipole = DD() dipole.resID = '1' dipole.atomName = 'Dipole' dipole.resName = 'Dipole' dipole.coordinates = ['0.0', '0.0', '0.0'] dipole.bFactor = '0.0' atoms.append(dipole) #read .out file to get vector data with open(modeFilename) as modeFile: modeLines = modeFile.readlines() currentModeNumber = '0' currentModeFrequency = '0.0' for line in modeLines: words = str.split(line) if len(words) < 1: pass elif words[0] == 'VIBRATION' and words[3] == 'FREQUENCY=': currentModeNumber = words[2] currentModeFrequency = words[4] elif words[0] == 'VIBRATION' and not isInt(words[2]): currentModeNumber = list(words[1])[4] + list(words[1])[5] +list(words[1])[6] + list(words[1])[7] currentModeFrequency = words[3] elif words[0] == 'DIPOLE' and words[1] == 'DERIVATIVES' and currentModeNumber != 0: dmode = dipoleMode() dmode.number = currentModeNumber dmode.frequency = currentModeFrequency dmode.atomNumber = 1 dmode.vector = [words[2], words[3], words[4]] atoms[0].modes.append(dmode) #assemble data printTheseLines = [] printTheseLines.append('nmwiz_load ' +dipoleName + '.nmd') printTheseLines.append('name ' + dipoleName) asdf = "" for atom in atoms: atomNames = asdf + dipole.atomName + " " resNames = asdf + dipole.resName + " " resIDs = asdf + dipole.resID + " " chainIDs = asdf + "A" + " " bFactors = asdf + dipole.bFactor + " " coordinates = asdf + dipole.printCoordinates() + " " printTheseLines.append("atomnames" + " " + atomNames) printTheseLines.append("resnames" + " " + resNames) printTheseLines.append("resids" + " " + resIDs) printTheseLines.append("chainids" + " " + chainIDs) printTheseLines.append("bfactors" + " " + bFactors) printTheseLines.append("coordinates" + " " + coordinates ) numberOfLinesBeforeModes = len(printTheseLines) numberOfModes = len(atoms[0].modes) for i in range(0, numberOfModes): printTheseLines.append("mode" + " " + str(atoms[0].modes[i].number) + " " + str(atoms[0].modes[i].frequency) + " ") for atom in atoms: for mode in atom.modes: printTheseLines[numberOfLinesBeforeModes + int(mode.number) - 1] += ( mode.printMode() + " ") #Write .nmd file with printable strings with open(os.path.join(filedir,dipolefilename), "wt") as nmdFile: for line in printTheseLines: print(line, file=nmdFile) import ctypes # An included library with Python install. ctypes.windll.user32.MessageBoxA(0, b"Success =]", b"NMD File", 1) print("Output written to" + " " + dipolefilename) ###END HEAVY LIFTING - phew###