-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathconvertor_kjmol_wvnum.py
executable file
·121 lines (85 loc) · 2.72 KB
/
convertor_kjmol_wvnum.py
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
import sys
import os
#Read relative eigenvalues
def readZPE(filename):
datafile = open(filename, 'r')
junk = datafile.readline()
# Get the simulation title
line = datafile.readline()
title = line.split()[9]
junk = datafile.readline()
# Get the ground state energy
line = datafile.readline()
zpe = float(line.split()[4])
junk = datafile.readline()
#Get the energies
energies = []
for line in datafile:
energies.append(line.split()[1])
return {"ZPE": zpe, "Energies": energies, "Title": title}
#Convert values to wavenumbers from kJ/mol
def kjmolToWvnumData(data):
energies = data["Energies"]
h = 6.62606957E-34 #J.s, from NIST 2010
c = 299792458 #m/s, from NIST 2010
N_A = 6.02214129E+23 #/mol, from NIST 2010
wvnumToKjmol = h / 1000.0 * c * 100.0 * N_A
kjmolTowvnum = 1.0 / wvnumToKjmol
energies2 = []
for value in energies:
energies2.append(float(value) * kjmolTowvnum)
zpe = data["ZPE"] * kjmolTowvnum
return {"ZPE": zpe, "Energies": energies2, "Title": data["Title"]}
#Write the data to a single file
def outputData(filename,data):
datafile = open(filename, 'w')
#Write header
datafile.write("#The following are the relative energies for various simulations" + "\n")
datafile.write("#All of the data are in cm-1" + "\n")
#Write the simulation names
datafile.write("State")
for simData in data:
datafile.write(" " + simData["Title"])
datafile.write("\n")
#Write the ZPE
datafile.write("ZPE")
for simData in data:
datafile.write(" " + "%.15E" % simData["ZPE"])
datafile.write("\n")
#Determine the largest number of data points
lengths = []
for simData in data:
lengths.append(len(simData["Energies"]))
lengths.sort()
maxNum = lengths[-1]
#Write the state energies
for i in range(0, maxNum):
datafile.write("%d" % i)
for simData in data:
energies = simData["Energies"]
if len(energies) <= i:
datafile.write(" " + "NA")
else:
datafile.write(" " + "%.15E" % energies[i])
datafile.write("\n")
datafile.close()
#Code to test if integer or not.
#Acquired from http://stackoverflow.com/questions/354038/how-do-i-check-if-a-string-is-a-number-in-python
def is_int(s):
try:
int(s)
return True
except ValueError:
return False
#Start of program
dirc = sys.argv[1]
outputFilename = dirc + "/" + sys.argv[2]
#Get the directories and sort them
dirList = [ name for name in os.listdir(dirc) if os.path.isdir(os.path.join(dirc, name)) ] #Taken from http://stackoverflow.com/questions/141291/how-to-list-only-top-level-directories-in-python
dirList.sort()
data = []
for direct in dirList:
dirPath = "./" + dirc + "/" + direct
filename = dirPath + "/" + "states_zpe.txt"
data.append(kjmolToWvnumData(readZPE(filename)))
outputData(outputFilename,data)