chemruby 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +120 -0
- data/Rakefile +195 -0
- data/ext/extconf.rb +4 -0
- data/ext/subcomp.c +416 -0
- data/lib/chem.rb +130 -0
- data/lib/chem/appl.rb +1 -0
- data/lib/chem/appl/chem3dole.rb +36 -0
- data/lib/chem/appl/tinker/nucleic.rb +40 -0
- data/lib/chem/appl/tinker/tinker_reader.rb +43 -0
- data/lib/chem/data.rb +4 -0
- data/lib/chem/data/atomic_weight.rb +124 -0
- data/lib/chem/data/character.rb +2 -0
- data/lib/chem/data/electronegativity.rb +14 -0
- data/lib/chem/data/periodic_table.rb +6 -0
- data/lib/chem/data/prime_numbers.rb +1 -0
- data/lib/chem/data/vdw_radii.rb +1 -0
- data/lib/chem/db.rb +64 -0
- data/lib/chem/db/cansmi.rb +234 -0
- data/lib/chem/db/cdx.rb +1525 -0
- data/lib/chem/db/eps.rb +164 -0
- data/lib/chem/db/g98.rb +909 -0
- data/lib/chem/db/gspan.rb +130 -0
- data/lib/chem/db/iupac.rb +5 -0
- data/lib/chem/db/iupac/a_1.rb +46 -0
- data/lib/chem/db/iupac/iuparser.rb +226 -0
- data/lib/chem/db/iupac/iuparser.ry +97 -0
- data/lib/chem/db/iupac/postfix.rb +2 -0
- data/lib/chem/db/kcf.rb +390 -0
- data/lib/chem/db/kcf_glycan.rb +19 -0
- data/lib/chem/db/kegg.rb +516 -0
- data/lib/chem/db/linucs/linparser.rb +144 -0
- data/lib/chem/db/linucs/linucs.ry +53 -0
- data/lib/chem/db/mdl.rb +379 -0
- data/lib/chem/db/molconnz.rb +12 -0
- data/lib/chem/db/mopac.rb +88 -0
- data/lib/chem/db/msi.rb +107 -0
- data/lib/chem/db/pdb_dic.rb +115 -0
- data/lib/chem/db/pdf.rb +131 -0
- data/lib/chem/db/pubchem.rb +113 -0
- data/lib/chem/db/rmagick.rb +70 -0
- data/lib/chem/db/sdf.rb +37 -0
- data/lib/chem/db/smbl.rb +88 -0
- data/lib/chem/db/smiles.rb +2 -0
- data/lib/chem/db/smiles/smiles.ry +203 -0
- data/lib/chem/db/smiles/smiparser.rb +375 -0
- data/lib/chem/db/swf.rb +74 -0
- data/lib/chem/db/sybyl.rb +150 -0
- data/lib/chem/db/tinker.rb +77 -0
- data/lib/chem/db/types/type_cansmi.rb +9 -0
- data/lib/chem/db/types/type_cdx.rb +24 -0
- data/lib/chem/db/types/type_gspan.rb +31 -0
- data/lib/chem/db/types/type_kcf.rb +28 -0
- data/lib/chem/db/types/type_kcf_glycan.rb +26 -0
- data/lib/chem/db/types/type_kegg.rb +92 -0
- data/lib/chem/db/types/type_mdl.rb +31 -0
- data/lib/chem/db/types/type_pdf.rb +33 -0
- data/lib/chem/db/types/type_png.rb +31 -0
- data/lib/chem/db/types/type_rxn.rb +25 -0
- data/lib/chem/db/types/type_sdf.rb +25 -0
- data/lib/chem/db/types/type_sybyl.rb +30 -0
- data/lib/chem/db/types/type_xyz.rb +26 -0
- data/lib/chem/db/vector.rb +128 -0
- data/lib/chem/db/xyz.rb +39 -0
- data/lib/chem/model.rb +119 -0
- data/lib/chem/model/skeleton.rb +37 -0
- data/lib/chem/utils.rb +11 -0
- data/lib/chem/utils/geometry.rb +27 -0
- data/lib/chem/utils/graph_db.rb +146 -0
- data/lib/chem/utils/math.rb +17 -0
- data/lib/chem/utils/prop.rb +123 -0
- data/lib/chem/utils/sssr.rb +101 -0
- data/lib/chem/utils/sub.rb +78 -0
- data/lib/chem/utils/transform.rb +110 -0
- data/lib/chem/utils/traverse.rb +37 -0
- data/lib/chem/utils/ullmann.rb +134 -0
- data/lib/graph.rb +41 -0
- data/lib/graph/cluster.rb +20 -0
- data/lib/graph/morgan.rb +38 -0
- data/sample/frequent_subgraph.rb +46 -0
- data/sample/images/ex1.rb +11 -0
- data/sample/images/ex2.rb +4 -0
- data/sample/images/ex3.rb +5 -0
- data/sample/images/ex4.rb +17 -0
- data/sample/images/ex5.rb +10 -0
- data/sample/images/mol/adenine.mol +26 -0
- data/sample/images/mol/atp.mol +69 -0
- data/sample/images/temp/ex5.mol +344 -0
- data/sample/kegg_db.rb +116 -0
- data/setup.rb +1551 -0
- data/test/all.rb +6 -0
- data/test/coord_test.rb +17 -0
- data/test/ctab_test.rb +31 -0
- data/test/data/A_21.tar.gz +0 -0
- data/test/data/A_21/aceanthrylene.cdx +0 -0
- data/test/data/A_21/aceanthrylene.mol +40 -0
- data/test/data/A_21/acenaphthylene.cdx +0 -0
- data/test/data/A_21/acenaphthylene.mol +31 -0
- data/test/data/A_21/acephenanthrylene.cdx +0 -0
- data/test/data/A_21/acephenanthrylene.mol +40 -0
- data/test/data/A_21/anthracene.cdx +0 -0
- data/test/data/A_21/anthracene.mol +35 -0
- data/test/data/A_21/as-indacene.cdx +0 -0
- data/test/data/A_21/as-indacene.mol +31 -0
- data/test/data/A_21/azulene.cdx +0 -0
- data/test/data/A_21/azulene.mol +26 -0
- data/test/data/A_21/biphenylene.cdx +0 -0
- data/test/data/A_21/biphenylene.mol +31 -0
- data/test/data/A_21/chrysene.cdx +0 -0
- data/test/data/A_21/chrysene.mol +44 -0
- data/test/data/A_21/coronen.cdx +0 -0
- data/test/data/A_21/coronen.mol +59 -0
- data/test/data/A_21/fluoranthene.cdx +0 -0
- data/test/data/A_21/fluoranthene.mol +40 -0
- data/test/data/A_21/fluorene.cdx +0 -0
- data/test/data/A_21/fluorene.mol +33 -0
- data/test/data/A_21/heptacene.cdx +0 -0
- data/test/data/A_21/heptacene.mol +71 -0
- data/test/data/A_21/heptalene.cdx +0 -0
- data/test/data/A_21/heptalene.mol +30 -0
- data/test/data/A_21/heptaphene.cdx +0 -0
- data/test/data/A_21/heptaphene.mol +71 -0
- data/test/data/A_21/hexacene.cdx +0 -0
- data/test/data/A_21/hexacene.mol +62 -0
- data/test/data/A_21/hexaphene.cdx +0 -0
- data/test/data/A_21/hexaphene.mol +62 -0
- data/test/data/A_21/indene.cdx +0 -0
- data/test/data/A_21/indene.mol +24 -0
- data/test/data/A_21/iupac.txt +41 -0
- data/test/data/A_21/naphthacene.cdx +0 -0
- data/test/data/A_21/naphthacene.mol +44 -0
- data/test/data/A_21/naphthalene.cdx +0 -0
- data/test/data/A_21/naphthalene.mol +26 -0
- data/test/data/A_21/ovalene.cdx +0 -0
- data/test/data/A_21/ovalene.mol +78 -0
- data/test/data/A_21/pentacene.cdx +0 -0
- data/test/data/A_21/pentacene.mol +53 -0
- data/test/data/A_21/pentalene.cdx +0 -0
- data/test/data/A_21/pentalene.mol +22 -0
- data/test/data/A_21/pentaphene.cdx +0 -0
- data/test/data/A_21/pentaphene.mol +53 -0
- data/test/data/A_21/perylene.cdx +0 -0
- data/test/data/A_21/perylene.mol +49 -0
- data/test/data/A_21/phenalene.cdx +0 -0
- data/test/data/A_21/phenalene.mol +33 -0
- data/test/data/A_21/phenanthrene.cdx +0 -0
- data/test/data/A_21/phenanthrene.mol +35 -0
- data/test/data/A_21/picene.cdx +0 -0
- data/test/data/A_21/picene.mol +53 -0
- data/test/data/A_21/pleiadene.cdx +0 -0
- data/test/data/A_21/pleiadene.mol +44 -0
- data/test/data/A_21/pyranthrene.cdx +0 -0
- data/test/data/A_21/pyranthrene.mol +72 -0
- data/test/data/A_21/pyrene.cdx +0 -0
- data/test/data/A_21/pyrene.mol +40 -0
- data/test/data/A_21/rubicene.cdx +0 -0
- data/test/data/A_21/rubicene.mol +63 -0
- data/test/data/A_21/s-indacene.cdx +0 -0
- data/test/data/A_21/s-indacene.mol +31 -0
- data/test/data/A_21/tetraphenylene.cdx +0 -0
- data/test/data/A_21/tetraphenylene.mol +57 -0
- data/test/data/A_21/trinaphthylene.cdx +0 -0
- data/test/data/A_21/trinaphthylene.mol +71 -0
- data/test/data/A_21/triphenylene.cdx +0 -0
- data/test/data/A_21/triphenylene.mol +44 -0
- data/test/data/C00147.kcf +25 -0
- data/test/data/G00147.kcf +13 -0
- data/test/data/atp.mol +69 -0
- data/test/data/cyclohexane.mol +17 -0
- data/test/data/cyclohexane.ps +485 -0
- data/test/data/fullerene.mol +155 -0
- data/test/data/glycan +33 -0
- data/test/data/hypericin.cdx +0 -0
- data/test/data/hypericin.cdxml +596 -0
- data/test/data/hypericin.chm +0 -0
- data/test/data/hypericin.ct +85 -0
- data/test/data/hypericin.f1d +0 -0
- data/test/data/hypericin.f1q +0 -0
- data/test/data/hypericin.gif +0 -0
- data/test/data/hypericin.mol +88 -0
- data/test/data/hypericin.mol2 +159 -0
- data/test/data/hypericin.msm +123 -0
- data/test/data/hypericin.pdf +359 -0
- data/test/data/hypericin.png +0 -0
- data/test/data/hypericin.ps +0 -0
- data/test/data/hypericin.skc +0 -0
- data/test/data/hypericin2.gif +0 -0
- data/test/data/hypericin2.ps +0 -0
- data/test/data/kegg/genomes/hsa/hsa_enzyme.list +4 -0
- data/test/data/kegg/genomes/hsa/hsa_pfam.list +4 -0
- data/test/data/kegg/ligand/mol/C00147.mol +26 -0
- data/test/data/kegg/ligand/reaction +14 -0
- data/test/data/kegg/ligand/reaction.lst +1 -0
- data/test/data/kegg/ligand/reaction_mapformula.lst +3 -0
- data/test/data/reaction +14 -0
- data/test/data/reaction.lst +1 -0
- data/test/data/reaction_mapformula.lst +3 -0
- data/test/data/rxn/C00001.mol +6 -0
- data/test/data/rxn/C00011.mol +10 -0
- data/test/data/rxn/C00014.mol +6 -0
- data/test/data/rxn/C01010.mol +18 -0
- data/test/data/rxn/sample.rxn +50 -0
- data/test/data/rxn/substitution.rxn +45 -0
- data/test/data/test.eps +0 -0
- data/test/data/test.mol +28 -0
- data/test/data/test.sdf +143 -0
- data/test/data/test.skc +0 -0
- data/test/data/test.xyz +4 -0
- data/test/data/test_lf.sdf +143 -0
- data/test/heavy_test_pubchem.rb +16 -0
- data/test/multiple_test.rb +22 -0
- data/test/test_adj.rb +54 -0
- data/test/test_canonical_smiles.rb +46 -0
- data/test/test_cdx.rb +32 -0
- data/test/test_chem.rb +18 -0
- data/test/test_cluster.rb +19 -0
- data/test/test_db.rb +11 -0
- data/test/test_eps.rb +24 -0
- data/test/test_geometry.rb +11 -0
- data/test/test_gspan.rb +28 -0
- data/test/test_iupac.rb +36 -0
- data/test/test_kcf.rb +24 -0
- data/test/test_kcf_glycan.rb +10 -0
- data/test/test_kegg.rb +118 -0
- data/test/test_linucs.rb +21 -0
- data/test/test_mdl.rb +45 -0
- data/test/test_mol2.rb +62 -0
- data/test/test_morgan.rb +21 -0
- data/test/test_pdf.rb +12 -0
- data/test/test_prop.rb +86 -0
- data/test/test_rmagick.rb +15 -0
- data/test/test_sbdb.rb +23 -0
- data/test/test_sdf.rb +30 -0
- data/test/test_smiles.rb +84 -0
- data/test/test_sssr.rb +18 -0
- data/test/test_sub.rb +47 -0
- data/test/test_subcomp.rb +37 -0
- data/test/test_traverse.rb +29 -0
- data/test/test_writer.rb +13 -0
- data/test/test_xyz.rb +15 -0
- data/test/type_test.rb +25 -0
- metadata +290 -0
data/lib/chem/db/eps.rb
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
# Encapsulated Postscript writer.
|
2
|
+
|
3
|
+
module Chem
|
4
|
+
|
5
|
+
module Molecule
|
6
|
+
|
7
|
+
EpsHeader = "%%!PS-Adobe-3.0 EPSF-3.0\n" +
|
8
|
+
"%%Creator: ChemRuby n.tanaka\n" +
|
9
|
+
"%%For: Scientists\n" +
|
10
|
+
"%%Title: Molecular compound\n" +
|
11
|
+
"%%CreationDate: %d/%d/%d %d:%d \n"
|
12
|
+
|
13
|
+
def to_eps(para = EpsParameter.new)
|
14
|
+
# What should I do to ensure 2D features?
|
15
|
+
|
16
|
+
str = ''
|
17
|
+
if block_given?
|
18
|
+
yield para
|
19
|
+
end
|
20
|
+
|
21
|
+
ratio, min = para.calc_bounding_box_size(@nodes)
|
22
|
+
|
23
|
+
str = header(para)
|
24
|
+
|
25
|
+
pos = {}
|
26
|
+
|
27
|
+
@nodes.each do |atom|
|
28
|
+
pos[atom] = Vector[atom.x, atom.y]
|
29
|
+
pos[atom] -= min
|
30
|
+
|
31
|
+
#diff = diff == 0 ? 1 : diff
|
32
|
+
pos[atom] *= para.diff * 100
|
33
|
+
pos[atom] += para.orig_pt + Vector[para.margin, para.margin] + ratio * 0.5
|
34
|
+
|
35
|
+
# if para.has_atom_yield
|
36
|
+
# str += eps.atom_yield.call(atom)
|
37
|
+
# end
|
38
|
+
# str += atom.eps_header if atom.eps_header
|
39
|
+
# if(atom.visible)
|
40
|
+
str += "%5f %5f moveto\n" % [pos[atom][0], pos[atom][1]]
|
41
|
+
str += "(" + atom.element.to_s + ") dup stringwidth pop 2 div neg -1.5 rmoveto show\n"
|
42
|
+
|
43
|
+
# end
|
44
|
+
# str += atom.eps_footer if atom.eps_footer
|
45
|
+
end
|
46
|
+
# @nodes.each do ||
|
47
|
+
|
48
|
+
@edges.each do |bond, atom1, atom2|
|
49
|
+
#str += bond.eps_header if bond.eps_header
|
50
|
+
beginX = pos[atom1][0]
|
51
|
+
beginY = pos[atom1][1]
|
52
|
+
endX = pos[atom2][0]
|
53
|
+
endY = pos[atom2][1]
|
54
|
+
dx = (endX - beginX) / ((endX - beginX)**2 + (endY - beginY)**2)**0.5
|
55
|
+
dx = dx.nan? ? 0 : dx / 2.0
|
56
|
+
dy = (endY - beginY) / ((endX - beginX)**2 + (endY - beginY)**2)**0.5
|
57
|
+
dy = dy.nan? ? 0 : dy / 2.0
|
58
|
+
if(atom2.visible)
|
59
|
+
endX = endX - char_height * dx
|
60
|
+
endY = endY - char_height * dy
|
61
|
+
end
|
62
|
+
if(atom1.visible)
|
63
|
+
beginX = beginX + char_size * dx
|
64
|
+
beginY = beginY + char_size * dy
|
65
|
+
end
|
66
|
+
transition = bond.respond_to?('i') ? bond.i : 0
|
67
|
+
multi_bond_ratio = 1.0
|
68
|
+
beginX = beginX - dy * (bond.v - 1 + transition.abs) * multi_bond_ratio
|
69
|
+
beginY = beginY + dx * (bond.v - 1 + transition.abs) * multi_bond_ratio
|
70
|
+
endX = endX - dy * (bond.v - 1 + transition.abs) * multi_bond_ratio
|
71
|
+
endY = endY + dx * (bond.v - 1 + transition.abs) * multi_bond_ratio
|
72
|
+
valence = bond.v
|
73
|
+
# 1.upto(bond.v + transition.abs) do |n|
|
74
|
+
(bond.v + transition.abs).times do |n|
|
75
|
+
# if(color)
|
76
|
+
# if(transition < 0)
|
77
|
+
# str += "1 0 0 setrgbcolor\n"
|
78
|
+
# elsif(transition > 0)
|
79
|
+
# str += "0 0 1 setrgbcolor\n"
|
80
|
+
# else
|
81
|
+
# str += "0 0 0 setrgbcolor\n"
|
82
|
+
# end
|
83
|
+
# end
|
84
|
+
str += "newpath %f %f moveto %f %f lineto stroke\n" % [beginX, beginY, endX, endY]
|
85
|
+
centerX = (endX + beginX) /2
|
86
|
+
centerY = (endY + beginY) /2
|
87
|
+
if(transition >0)
|
88
|
+
str += centerX.to_s + " " + centerY.to_s + " " + inbond.to_s + " 0 360 arc stroke\n"
|
89
|
+
elsif(transition <0)
|
90
|
+
str += "newpath %f %f moveto %f %f lineto stroke\n" %
|
91
|
+
[centerX + dy - dx*outbond, centerY - dx - outbond * dy,
|
92
|
+
centerX - dy - outbond * dx, dx - outbond * dy + centerY]
|
93
|
+
str += "newpath %f %f moveto %f %f lineto stroke\n" %
|
94
|
+
[centerX + dy + dx*outbond, centerY - dx + outbond * dy,
|
95
|
+
centerX - dy + outbond * dx, dy * outbond + dx + centerY]
|
96
|
+
end
|
97
|
+
transition = transition + 1 if(transition < 0)
|
98
|
+
transition = transition - 1 if(transition > 0)
|
99
|
+
valence = valence - 1
|
100
|
+
beginX = beginX + dy * multi_bond_ratio * 2
|
101
|
+
beginY = beginY - dx * multi_bond_ratio * 2
|
102
|
+
endX = endX + dy * multi_bond_ratio * 2
|
103
|
+
endY = endY - dx * multi_bond_ratio * 2
|
104
|
+
end
|
105
|
+
end
|
106
|
+
# str += "0 0 0 setrgbcolor\n"
|
107
|
+
# str += " #{@size / 2.0} #{@size / 2.0} #{@size / 2.0 + @margin} 0 360 arc stroke\n"
|
108
|
+
|
109
|
+
#open("test.eps", "w").puts str
|
110
|
+
str
|
111
|
+
end
|
112
|
+
|
113
|
+
private
|
114
|
+
def header para
|
115
|
+
now = Time.new
|
116
|
+
str = EpsHeader % [now.day, now.month, now.year, now.hour, now.min]
|
117
|
+
# str += "%%%%BoundingBox: %d %d %d %d\n" % [@orig_pt[0], @orig_pt[1], @orig_pt[0] + @width, @orig_pt[1] + @height]
|
118
|
+
str += "/Arial findfont 5 scalefont setfont\n"
|
119
|
+
# str += "#{@line_width} setlinewidth\n"
|
120
|
+
str
|
121
|
+
end
|
122
|
+
|
123
|
+
class EpsParameter
|
124
|
+
attr_accessor :width, :height, :min, :x_max, :y_max, :fit_box, :diff, :orig_pt,:margin
|
125
|
+
|
126
|
+
def initialize
|
127
|
+
@size = Vector[100.0, 100.0]
|
128
|
+
@diff = 1.0
|
129
|
+
@orig_pt = Vector[0.0, 0.0]
|
130
|
+
@margin = 10.0
|
131
|
+
end
|
132
|
+
|
133
|
+
def calc_bounding_box_size nodes
|
134
|
+
# Shocking code :P
|
135
|
+
min = Vector[ 1.0 / 0, 1.0 / 0]
|
136
|
+
max = Vector[-1.0 / 0, -1.0 / 0]
|
137
|
+
nodes.each do |atom|
|
138
|
+
min[0] = min[0] > atom.x ? atom.x : min[0]
|
139
|
+
max[0] = max[0] < atom.x ? atom.x : max[0]
|
140
|
+
min[1] = min[1] > atom.y ? atom.y : min[1]
|
141
|
+
max[1] = max[1] < atom.y ? atom.y : max[1]
|
142
|
+
end
|
143
|
+
|
144
|
+
diff = 1.0
|
145
|
+
|
146
|
+
ratio = Vector[1.0, 1.0]
|
147
|
+
|
148
|
+
if @fit_box
|
149
|
+
if ((max[0] - min[0]) / (max[1] - min[1])) >
|
150
|
+
(@size[0] - @margin * 2)/ (@size[1] - @margin * 2)
|
151
|
+
diff = (@size[0] - @margin * 2) / (max[0] - min[0])
|
152
|
+
ratio[1] = @size[1] - @margin * 2 - (max[1] - min[1]) * diff
|
153
|
+
else
|
154
|
+
diff = (@size[1] - @margin * 2) / (max[1] - min[1])
|
155
|
+
ratio[0] = @size[0] - @margin * 2 - (max[0] - min[1]) * diff
|
156
|
+
end
|
157
|
+
end
|
158
|
+
[ratio, min]
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
end
|
164
|
+
end
|
data/lib/chem/db/g98.rb
ADDED
@@ -0,0 +1,909 @@
|
|
1
|
+
# Gaussian98 parser
|
2
|
+
|
3
|
+
module Chem
|
4
|
+
|
5
|
+
module G98
|
6
|
+
|
7
|
+
class Lines
|
8
|
+
def initialize lines_array
|
9
|
+
@lines = lines_array
|
10
|
+
@line_ptr = 0
|
11
|
+
end
|
12
|
+
def next_line
|
13
|
+
@lines[@line_ptr + 1]
|
14
|
+
end
|
15
|
+
def proceed num = 1
|
16
|
+
@line_ptr = @line_ptr + num
|
17
|
+
raise if @line_ptr > @lines.length
|
18
|
+
end
|
19
|
+
def now
|
20
|
+
@lines[@line_ptr]
|
21
|
+
end
|
22
|
+
def eof?
|
23
|
+
@lines.length == @line_ptr
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class Link
|
28
|
+
attr_accessor :next_link, :jump_link, :stop
|
29
|
+
attr_reader :major_number, :minor_number, :parameters, :default_link, :goto
|
30
|
+
def initialize major, minor, parameters, goto, gr
|
31
|
+
@major_number = major
|
32
|
+
@minor_number = minor
|
33
|
+
@parameters = parameters
|
34
|
+
@goto = goto
|
35
|
+
@gaussian_result = gr
|
36
|
+
end
|
37
|
+
def default_link=(l)
|
38
|
+
@default_link = l
|
39
|
+
@next_link = l
|
40
|
+
end
|
41
|
+
def to_s
|
42
|
+
sprintf("%2d%02d %2s ", @major_number, @minor_number, @goto.to_s) + parameter_to_s
|
43
|
+
end
|
44
|
+
def parameter_to_s
|
45
|
+
s = ''
|
46
|
+
@parameters.each do |key, value|
|
47
|
+
s = s + key.to_s + '(' + value.to_s + ') '
|
48
|
+
end
|
49
|
+
return s
|
50
|
+
end
|
51
|
+
def process lines
|
52
|
+
case (@major_number * 100 + @minor_number)
|
53
|
+
when 101 # Initializes program and controls overlaying
|
54
|
+
lines.proceed 3
|
55
|
+
n_atoms = 0
|
56
|
+
@gaussian_result.atoms = atoms = Hash.new
|
57
|
+
if lines.next_line.split.length < 2 # Z-Matrix
|
58
|
+
@gaussian_result.has_z_matrix_coordinate = true
|
59
|
+
var = Hash.new
|
60
|
+
atoms_tmp = Array.new
|
61
|
+
while /^ \w+/ =~ lines.next_line
|
62
|
+
lines.proceed
|
63
|
+
atoms_tmp.push lines.now
|
64
|
+
n_atoms = n_atoms + 1 if lines.now.split[0] != 'X'
|
65
|
+
end
|
66
|
+
lines.proceed
|
67
|
+
if /Variables:/ =~ lines.now
|
68
|
+
lines.proceed
|
69
|
+
while /^ \w+/ =~ lines.now
|
70
|
+
sp = lines.now.split
|
71
|
+
var[sp[0]] = sp[1].to_f
|
72
|
+
lines.proceed
|
73
|
+
end
|
74
|
+
end
|
75
|
+
n = 1
|
76
|
+
atoms_tmp.each do |atom_line|
|
77
|
+
atom = G98Atom.new n_atoms, @gaussian_result
|
78
|
+
atom_array = atom_line.split
|
79
|
+
atom.element = atom_array[0]
|
80
|
+
if atom_array.length >= 2
|
81
|
+
if /\d/ !~ atom_array[2]
|
82
|
+
length = var[atom_array[2]]
|
83
|
+
else
|
84
|
+
length = atom_array[2].to_f
|
85
|
+
end
|
86
|
+
atom.distance(atoms[atom_array[1].to_i], length)
|
87
|
+
end
|
88
|
+
if atom_array.length >= 4
|
89
|
+
if /\d/ !~ atom_array[4]
|
90
|
+
angle = var[atom_array[4]]
|
91
|
+
else
|
92
|
+
angle = atom_array[4].to_f
|
93
|
+
end
|
94
|
+
atom.angle(atoms[atom_array[3].to_i], angle)
|
95
|
+
end
|
96
|
+
if atom_array.length >= 7
|
97
|
+
if /\d/ !~ atom_array[6]
|
98
|
+
angle_a = var[atom_array[6]]
|
99
|
+
else
|
100
|
+
angle_a = atom_array[6].to_f
|
101
|
+
end
|
102
|
+
if /\d/ !~ atom_array[7]
|
103
|
+
angle_b = var[atom_array[7]]
|
104
|
+
else
|
105
|
+
angle_b = atom_array[7].to_f
|
106
|
+
end
|
107
|
+
atom.dihedral(atoms[atom_array[5].to_i], angle_a, angle_b)
|
108
|
+
end
|
109
|
+
atoms[n] = atom
|
110
|
+
n = n + 1
|
111
|
+
end
|
112
|
+
else # Cartessian Matrix
|
113
|
+
@gaussian_result.has_cartessian_coordinate = true
|
114
|
+
while /^ \w+/ =~ lines.next_line && / The following ModRedundant/ !~ lines.next_line
|
115
|
+
lines.proceed
|
116
|
+
atom_array = lines.now.split
|
117
|
+
atom = G98Atom.new n_atoms + 1, @gaussian_result
|
118
|
+
atom.element, atom.x, atom.y, atom.z = atom_array
|
119
|
+
atoms[n_atoms + 1] = atom
|
120
|
+
n_atoms = n_atoms + 1 if lines.now.split[0] != 'X'
|
121
|
+
end
|
122
|
+
end
|
123
|
+
@gaussian_result.n_atoms = n_atoms
|
124
|
+
@gaussian_result.atoms = atoms
|
125
|
+
lines.proceed
|
126
|
+
# @stop = true
|
127
|
+
when 103 # Berny optimization to minima and TS, STQN transition state searches
|
128
|
+
@next_link = @jump_link if @jump_link
|
129
|
+
lines.proceed 2
|
130
|
+
while /GradGradGrad/ !~ lines.now
|
131
|
+
if(/ Optimization completed./ =~ lines.now)
|
132
|
+
# if(/ Predicted change in Energy=/ =~ lines.now && / Optimization completed./ =~ lines.next_line)
|
133
|
+
@next_link = @default_link
|
134
|
+
end
|
135
|
+
lines.proceed
|
136
|
+
end
|
137
|
+
# lines.proceed 2
|
138
|
+
# lines.proceed while / Predicted change in Energy=/ !~ lines.now
|
139
|
+
# puts lines.now
|
140
|
+
# is_loop = true if / Optimization completed./ =~ lines.now
|
141
|
+
# # lines.proceed while /^ Predicted change in Energy=/ !~ lines.now
|
142
|
+
# # lines.proceed
|
143
|
+
# # is_loop = true if / Optimization completed./ =~ lines.now
|
144
|
+
# lines.proceed while /GradGradGrad/ !~ lines.now
|
145
|
+
lines.proceed
|
146
|
+
when 105 # MS optimization
|
147
|
+
when 106 # Numerical differentiation of forces/dipoles to obtain polarizability/hyperpolarizability
|
148
|
+
when 107 # Linear-synchronous-transit (LST) transition state search
|
149
|
+
when 108 # Potential energy surface scan
|
150
|
+
when 109 # Newton-Raphson optimization
|
151
|
+
when 110 # Double numerical differentiation of energies to produce frequencies
|
152
|
+
when 111 # Double num. diff. of energies to compute polarizabilities & hyperpolarizabilities
|
153
|
+
when 113 # EF optimization using analytic gradients
|
154
|
+
when 114 # EF numerical optimization (using only energies)
|
155
|
+
when 115 # Follows reaction path using the intrinsic reaction coordinate (IRC)
|
156
|
+
when 116 # Numerical self-consistent reaction field (SCRF)
|
157
|
+
when 117 # Post-SCF SCRF
|
158
|
+
when 118 # Trajectory calculations
|
159
|
+
when 120 # Controls ONIOM calculations
|
160
|
+
when 202 # Reorients coordinates, calculates symmetry, and checks variable
|
161
|
+
# IOp(15) : Symmetry control.
|
162
|
+
# 1: Unconditionally turn symmetry off. Note that Symm is still called, and will determine the
|
163
|
+
# framework group. However, the molecule is not oriented.
|
164
|
+
while / Stoichiometry/ !~ lines.now && /Error/ !~ lines.now
|
165
|
+
lines.proceed
|
166
|
+
end
|
167
|
+
if /Error/ =~ lines.now
|
168
|
+
lines.proceed 6
|
169
|
+
return
|
170
|
+
end
|
171
|
+
@gaussian_result.stoichiometry = lines.now.split[1]
|
172
|
+
lines.proceed
|
173
|
+
@gaussian_result.symmetricity = lines.now.split[2]
|
174
|
+
if /KH/ !~ @gaussian_result.symmetricity
|
175
|
+
unless @parameters.has_key?(15) && @parameters[15] == 1
|
176
|
+
lines.proceed while /Standard orientation:/ !~ lines.now
|
177
|
+
lines.proceed 5
|
178
|
+
1.upto @gaussian_result.n_atoms do |num|
|
179
|
+
o_array = lines.now.split
|
180
|
+
@gaussian_result.atoms[o_array[0].to_i].x = o_array[3].to_f
|
181
|
+
@gaussian_result.atoms[o_array[0].to_i].y = o_array[4].to_f
|
182
|
+
@gaussian_result.atoms[o_array[0].to_i].z = o_array[5].to_f
|
183
|
+
lines.proceed
|
184
|
+
end
|
185
|
+
lines.proceed
|
186
|
+
end
|
187
|
+
while(/^ Isotopes:/ !~ lines.now)
|
188
|
+
lines.proceed
|
189
|
+
end
|
190
|
+
while /-$/ =~ lines.now || /,\D+-\d/ =~ lines.next_line
|
191
|
+
lines.proceed
|
192
|
+
end
|
193
|
+
lines.proceed
|
194
|
+
else
|
195
|
+
lines.proceed 3
|
196
|
+
end
|
197
|
+
when 301 # Generate basis set information
|
198
|
+
@gaussian_result.standard_basis = lines.now.split(':')[1].chop # Standard basis: VSTO-3G (5D, 7F)
|
199
|
+
lines.proceed
|
200
|
+
if / Basis set in the form of general basis input:/ =~ lines.now # with GFINPUT Keyword (24=10)
|
201
|
+
while /^$/ !~ lines.next_line
|
202
|
+
lines.proceed # 1 0
|
203
|
+
end
|
204
|
+
lines.proceed 2#^$
|
205
|
+
end
|
206
|
+
while / There are/ =~ lines.now
|
207
|
+
lines.proceed
|
208
|
+
end
|
209
|
+
lines.proceed while /\d+ basis functions/ !~ lines.now
|
210
|
+
@gaussian_result.n_orbitals = lines.now.split[0].to_i
|
211
|
+
lines.proceed
|
212
|
+
@gaussian_result.n_electron = lines.now.split[0].to_i
|
213
|
+
lines.proceed
|
214
|
+
@gaussian_result.nuclear_repulsion_energy = lines.now.split[3].to_f
|
215
|
+
lines.proceed
|
216
|
+
when 302 # Calculates overlap, kinetic, and potential integrals
|
217
|
+
lines.proceed 3 # No discrimination between 302 and 303. More Gaussian results needed!
|
218
|
+
when 303 # Calculates multipole integrals
|
219
|
+
;
|
220
|
+
when 308 # Computes dipole velocity and RxD integrals
|
221
|
+
when 309 # Computes ECP integrals
|
222
|
+
when 310 # Computes spdf 2-electron integrals in a primitive fashion
|
223
|
+
when 311 # Computes sp 2-electron integrals
|
224
|
+
when 314 # Computes spdf 2-electron integrals
|
225
|
+
when 316 # Prints 2-electron integrals
|
226
|
+
when 319 # Computes 1-electron integrals for approximate spin orbital coupling
|
227
|
+
when 401 # Forms the initial MO guess
|
228
|
+
@gaussian_result.guess = lines.now.chop if @gaussian_result.guess == nil# Projected INDO Guess.
|
229
|
+
lines.proceed
|
230
|
+
if / Initial guess orbital symmetries:/ =~ lines.now
|
231
|
+
lines.proceed 2
|
232
|
+
while /\(A.\)/ =~ lines.now
|
233
|
+
lines.proceed
|
234
|
+
end
|
235
|
+
end
|
236
|
+
when 402 # Performs semi-empirical and molecular mechanics calculations
|
237
|
+
while / Dipole moment=/ !~ lines.now
|
238
|
+
lines.proceed
|
239
|
+
end
|
240
|
+
lines.now.split[4].to_f# Assertive Programming
|
241
|
+
lines.proceed
|
242
|
+
when 405 # Initializes an MCSCF calculation
|
243
|
+
when 502 # Iteratively solves the SCF equations (conven. UHF & ROHF, all direct methods, SCRF)
|
244
|
+
lines.proceed while / SCF Done:/ !~ lines.now
|
245
|
+
@gaussian_result.energy = lines.now.split[4].to_f
|
246
|
+
lines.proceed
|
247
|
+
lines.now.split[5].to_f
|
248
|
+
lines.proceed 2
|
249
|
+
# lines.proceed if / Axes restored/ =~ lines.now
|
250
|
+
if / Annihilation of the first spin contaminant:/ =~ lines.now
|
251
|
+
lines.proceed 2
|
252
|
+
end
|
253
|
+
if / Final SCRF E-Field is:/ =~ lines.now
|
254
|
+
lines.proceed 15
|
255
|
+
end
|
256
|
+
if /---------/ =~ lines.now && /DeltaG/ =~ lines.next_line
|
257
|
+
# if /---------/ =~ lines.now
|
258
|
+
while /DeltaG/ !~ lines.now
|
259
|
+
lines.proceed
|
260
|
+
end
|
261
|
+
@gaussian_result.scrf_delta_g = lines.now.split[4].to_f
|
262
|
+
lines.proceed 2
|
263
|
+
end
|
264
|
+
# lines.proceed
|
265
|
+
when 503 # Iteratively solves the SCF equations using direct minimization
|
266
|
+
when 506 # Performs an ROHF or GVB-PP calculation
|
267
|
+
when 508 # Quadratically convergent SCF program
|
268
|
+
when 510 # MC-SCF
|
269
|
+
when 601 # Population and related analyses (including multipole moments)
|
270
|
+
# puts 'l601 : '+ lines.now
|
271
|
+
# lines.proceed
|
272
|
+
# puts 'l601 : '+ lines.now
|
273
|
+
# lines.proceed
|
274
|
+
# puts 'l601 : '+ lines.now
|
275
|
+
# lines.proceed
|
276
|
+
# puts 'l601 : '+ lines.now
|
277
|
+
# lines.proceed 4
|
278
|
+
lines.proceed 7
|
279
|
+
if / Orbital Symmetries:/ =~ lines.now
|
280
|
+
lines.proceed while / electronic state/ !~ lines.now
|
281
|
+
lines.proceed
|
282
|
+
end
|
283
|
+
lines.proceed while / Alpha / =~ lines.now || / Beta / =~ lines.now
|
284
|
+
if / Molecular Orbital Coefficients/ =~ lines.now
|
285
|
+
if(@parameters.has_key?(7))# Population = Full
|
286
|
+
n = @gaussian_result.n_orbitals / 5.0
|
287
|
+
n_orbital_col = n.ceil
|
288
|
+
else
|
289
|
+
n_orbital_col = 2
|
290
|
+
end
|
291
|
+
lines.proceed # Molecular Orbital Coefficients
|
292
|
+
last_occupy_or_virtual = ''
|
293
|
+
1.upto(n_orbital_col) do |cycle|
|
294
|
+
lines.proceed # 1 2 3 4 5
|
295
|
+
mo_array = lines.now.split
|
296
|
+
0.upto( mo_array.length - 1 ) do |n_mo|
|
297
|
+
/\((.+)\)/ =~ mo_array[n_mo] ; sym = $+
|
298
|
+
/\)--(.)/ =~ mo_array[n_mo]
|
299
|
+
occupy_or_virtual = ($+ != nil ? $+ : mo_array[n_mo])
|
300
|
+
@gaussian_result.mo[(cycle - 1) * 5 + n_mo] =
|
301
|
+
MolecularOrbital.new(((cycle - 1) * 5 + n_mo), sym, occupy_or_virtual)
|
302
|
+
if last_occupy_or_virtual == 'O' && occupy_or_virtual == 'V'
|
303
|
+
@gaussian_result.homo = @gaussian_result.mo[(cycle - 1) * 5 + n_mo - 1]
|
304
|
+
@gaussian_result.lumo = @gaussian_result.mo[(cycle - 1) * 5 + n_mo]
|
305
|
+
elsif(@gaussian_result.homo == nil && n_orbital_col == cycle && mo_array.length - 1 == n_mo)
|
306
|
+
# No LUMO ! Example Br-
|
307
|
+
@gaussian_result.homo = @gaussian_result.mo[(cycle - 1) * 5 + n_mo - 1]
|
308
|
+
@gaussian_result.lumo = nil
|
309
|
+
end
|
310
|
+
last_occupy_or_virtual = occupy_or_virtual
|
311
|
+
end
|
312
|
+
lines.proceed
|
313
|
+
ev_array = lines.now.split
|
314
|
+
0.upto (ev_array.length - 3) do |n_ev|
|
315
|
+
@gaussian_result.mo[(cycle - 1) * 5 + n_ev].eigen_value = ev_array[n_ev + 2].to_f
|
316
|
+
end
|
317
|
+
lines.proceed
|
318
|
+
1.upto(@gaussian_result.n_orbitals) do | num |
|
319
|
+
coef_array = [lines.now[0..3].strip, lines.now[5..8].strip, lines.now[9..10].strip,
|
320
|
+
lines.now[11..21].strip]
|
321
|
+
0.upto (mo_array.length - 1) do |n_mo|
|
322
|
+
coef_array << lines.now[(21 + n_mo*10)..(31 + n_mo*10)]
|
323
|
+
end
|
324
|
+
plus = 0
|
325
|
+
# if /^[[:alpha:]]+/ =~ coef_array[2]
|
326
|
+
if coef_array[1] != ''
|
327
|
+
atom = @gaussian_result.atoms[coef_array[1].to_i]
|
328
|
+
end
|
329
|
+
1.upto( mo_array.length ) do |n_ao|
|
330
|
+
atom.ao(coef_array[3]).push(coef_array[n_ao + 2].to_i)
|
331
|
+
@gaussian_result.mo[(cycle - 1) * 5 + n_ao - 1].push([atom.index, coef_array[3]], coef_array[3 + n_ao].to_f)
|
332
|
+
# @gaussian_result.mo[(cycle - 1) * 5 + n_ao].push(coef_array[n_ao + plus + 2].to_f)
|
333
|
+
end
|
334
|
+
lines.proceed
|
335
|
+
end
|
336
|
+
end
|
337
|
+
lines.proceed # DENSITY MATRIX.
|
338
|
+
density_time = @gaussian_result.n_orbitals
|
339
|
+
while(density_time >0)
|
340
|
+
lines.proceed # 1 2 3 4 5
|
341
|
+
lines.proceed density_time
|
342
|
+
density_time = density_time - 5
|
343
|
+
end
|
344
|
+
lines.proceed # Full Mulliken population analysis:
|
345
|
+
mulliken_time = @gaussian_result.n_orbitals
|
346
|
+
while(mulliken_time > 0)
|
347
|
+
lines.proceed # 1 2 3 4 5
|
348
|
+
lines.proceed mulliken_time
|
349
|
+
mulliken_time = mulliken_time - 5
|
350
|
+
end
|
351
|
+
lines.proceed # Gross orbital populations:
|
352
|
+
1.upto(@gaussian_result.n_orbitals) do |num|
|
353
|
+
lines.proceed
|
354
|
+
end
|
355
|
+
lines.proceed # Condensed to atoms (all electrons):
|
356
|
+
end
|
357
|
+
n = (@gaussian_result.n_atoms) / 6.0
|
358
|
+
if /Condensed to / =~ lines.now
|
359
|
+
lines.proceed
|
360
|
+
if / 1/ =~ lines.now # BUG of Gaussian98 !?
|
361
|
+
1.upto(n.ceil) do |num|
|
362
|
+
@gaussian_result.exist_condensed_to_atom = true
|
363
|
+
lines.proceed
|
364
|
+
1.upto(@gaussian_result.n_atoms) do |nn|
|
365
|
+
array = lines.now.split
|
366
|
+
1.upto(array.length - 2) do |col|
|
367
|
+
@gaussian_result.atoms[array[0].to_i].density[(num - 1)* 6 + col] = array[col + 1].to_f
|
368
|
+
end
|
369
|
+
lines.proceed
|
370
|
+
end
|
371
|
+
end
|
372
|
+
end
|
373
|
+
end
|
374
|
+
lines.proceed 2
|
375
|
+
1.upto(@gaussian_result.n_atoms) do | num |
|
376
|
+
@gaussian_result.atoms[lines.now.split[0].to_i].total_atomic_charge = lines.now.split[2].to_f
|
377
|
+
lines.proceed
|
378
|
+
end
|
379
|
+
@gaussian_result.sum_of_mulliken_charge = lines.now.split[4].to_f
|
380
|
+
lines.proceed
|
381
|
+
lines.proceed # Atomic charges with hydrogens summed into heavy atoms:
|
382
|
+
lines.proceed # 1
|
383
|
+
1.upto(@gaussian_result.n_atoms) do |num|
|
384
|
+
@gaussian_result.atoms[lines.now.split[0].to_i].heavy_charge = lines.now.split[2].to_f
|
385
|
+
lines.proceed
|
386
|
+
end
|
387
|
+
lines.proceed
|
388
|
+
if /Atomic-Atomic Spin Densities./ =~ lines.now
|
389
|
+
lines.proceed
|
390
|
+
n = @gaussian_result.n_atoms / 6.0
|
391
|
+
1.upto n.ceil do |num|
|
392
|
+
lines.proceed @gaussian_result.n_atoms
|
393
|
+
end
|
394
|
+
lines.proceed
|
395
|
+
lines.proceed # Total atomic spin densities:
|
396
|
+
lines.proceed # 1
|
397
|
+
lines.proceed @gaussian_result.n_atoms
|
398
|
+
lines.proceed
|
399
|
+
if /Isotropic Fermi / =~ lines.now
|
400
|
+
lines.proceed
|
401
|
+
1.upto(@gaussian_result.n_atoms) do |num|
|
402
|
+
lines.proceed
|
403
|
+
end
|
404
|
+
end
|
405
|
+
lines.proceed
|
406
|
+
end
|
407
|
+
# if(@parameters.has_key?(7) && (@parameters[7] == 3 || @parameters[7] == 2))
|
408
|
+
if/ Electronic spatial extent/ =~ lines.now
|
409
|
+
# if(@parameters.has_key?(28))
|
410
|
+
@gaussian_result.electronic_spatial_extent = lines.now.split[5].to_f
|
411
|
+
lines.proceed 3
|
412
|
+
@gaussian_result.dipole_moment_total = lines.now.split[7].to_f
|
413
|
+
lines.proceed while / N-N=/ !~ lines.now
|
414
|
+
lines.proceed
|
415
|
+
if / Symmetry/ =~ lines.now
|
416
|
+
lines.proceed while / Symmetry/ =~ lines.now
|
417
|
+
end
|
418
|
+
end
|
419
|
+
if /Exact polarizability/ =~ lines.now
|
420
|
+
lines.now.split[7].to_f #Assertive programming ;)
|
421
|
+
lines.proceed while /Thermochemistry/ != lines.now
|
422
|
+
lines.proceed while / TOTAL BOT/ !~ lines.now
|
423
|
+
lines.proceed while / ROTATIONAL/ !~ lines.now
|
424
|
+
lines.proceed
|
425
|
+
end
|
426
|
+
# @stop = true
|
427
|
+
when 602 # 1-electron properties (potential, field, and field gradient)
|
428
|
+
when 604 # Evaluates MOs or density over a grid of points
|
429
|
+
lines.proceed while / LenV=/ !~ lines.now
|
430
|
+
when 607 # Performs NBO analyses
|
431
|
+
when 608 # Non-iterative DFT energies
|
432
|
+
when 609 # Atoms in Molecules properties
|
433
|
+
when 701 # 1-electron integral first or second derivatives
|
434
|
+
lines.proceed if /solvent charges in/ =~ lines.now
|
435
|
+
when 702 # 2-electron integral first or second derivatives (sp)
|
436
|
+
lines.proceed if /Density matrix is not symmetric/ =~ lines.now
|
437
|
+
when 703 # 2-electron integral first or second derivatives (spdf)
|
438
|
+
when 709 # Forms the ECP integral derivative contribution to gradients
|
439
|
+
when 716 # Processes information for optimizations and frequencies
|
440
|
+
# ***** Axes restored to original set *****
|
441
|
+
lines.proceed if /Axes restored/ =~ lines.now
|
442
|
+
if /Rotating electric field/ =~ lines.now
|
443
|
+
lines.proceed while /Axes restored/ !~ lines.now
|
444
|
+
lines.proceed
|
445
|
+
end
|
446
|
+
lines.proceed # -------------------------------------------------------------------
|
447
|
+
lines.proceed # Center Atomic Forces (Hartrees/Bohr)
|
448
|
+
lines.proceed # Number Number X Y Z
|
449
|
+
lines.proceed # -------------------------------------------------------------------
|
450
|
+
1.upto(@gaussian_result.n_atoms) do |num|
|
451
|
+
lines.now.split[4].to_f #Assertive Programming ;)
|
452
|
+
lines.proceed
|
453
|
+
end
|
454
|
+
lines.proceed # -------------------------------------------------------------------
|
455
|
+
lines.proceed # Cartesian Forces: Max 2.919256220 RMS 1.058248881
|
456
|
+
when 801 # Initializes transformation of 2-electron integrals
|
457
|
+
lines.proceed 2
|
458
|
+
when 802 # Performs integral transformation (N3 in-core)
|
459
|
+
when 803 # Complete basis set (CBS) extrapolation
|
460
|
+
when 804 # Integral transformation
|
461
|
+
# if /^$/ =~ lines.now
|
462
|
+
# lines.proceed 3 # **** Warning!!: The largest alpha MO coefficient is 0.39613240D+02
|
463
|
+
# else
|
464
|
+
# lines.proceed # Estimate disk for full transformation 8758468 words.
|
465
|
+
# end
|
466
|
+
while !(/ANorm/ =~ lines.now && /^ E2=/ =~ lines.next_line)
|
467
|
+
lines.proceed
|
468
|
+
end
|
469
|
+
lines.proceed 2
|
470
|
+
when 811 # Transforms integral derivatives & computes their contributions to MP2 2nd derivatives
|
471
|
+
lines.proceed # Form MO integral derivatives with frozen-active canonical formalism.
|
472
|
+
lines.proceed # MDV= 6291456.
|
473
|
+
lines.proceed # Discarding MO integrals.
|
474
|
+
lines.proceed # Reordered first order wavefunction length = 176418
|
475
|
+
lines.proceed if /In DefCFB/ =~ lines.now
|
476
|
+
lines.proceed if /Large arrays: / =~ lines.now
|
477
|
+
when 901 # Anti-symmetrizes 2-electron integrals
|
478
|
+
when 902 # Determines the stability of the Hartree-Fock wavefunction
|
479
|
+
when 903 # Old in-core MP2
|
480
|
+
when 905 # Complex MP2
|
481
|
+
when 906 # Semi-direct MP2
|
482
|
+
# puts 'l906 : ' + lines.now
|
483
|
+
# lines.proceed 12
|
484
|
+
lines.proceed while / E2 =/ !~ lines.now
|
485
|
+
lines.proceed
|
486
|
+
when 908 # OVGF (closed shell)
|
487
|
+
when 909 # OVGF (open shell)
|
488
|
+
when 913 # Calculates post-SCF energies and gradient terms
|
489
|
+
while /^ QCISD\(T\)=/ !~ lines.now
|
490
|
+
lines.proceed
|
491
|
+
end
|
492
|
+
lines.proceed 1
|
493
|
+
when 914 # CI-Single, RPA and Zindo excited states; SCF stability
|
494
|
+
lines.proceed while / state/ !~ lines.now
|
495
|
+
lines.proceed
|
496
|
+
n_state = 0
|
497
|
+
while / Ground to excited state/ !~ lines.now
|
498
|
+
n_state = n_state + 1
|
499
|
+
lines.proceed
|
500
|
+
end
|
501
|
+
while / Excitation energies and oscillator strengths:/ !~ lines.now
|
502
|
+
lines.proceed
|
503
|
+
end
|
504
|
+
1.upto n_state do |num|
|
505
|
+
lines.proceed while / Excited State / !~ lines.now
|
506
|
+
lines.proceed
|
507
|
+
lines.proceed while /\d+ ->/ =~ lines.now
|
508
|
+
end
|
509
|
+
when 915 # Computes fifth order quantities (for MP5, QCISD (TQ) and BD (TQ))
|
510
|
+
when 918 # Reoptimizes the wavefunction
|
511
|
+
when 1002 # Iteratively solves the CPHF equations; computes various properteis
|
512
|
+
# lines.proceed while /degrees of freedom in the / !~ lines.now
|
513
|
+
# lines.proceed # Petite list used in FoFDir.
|
514
|
+
# lines.proceed #MinBra= 0 MaxBra= 2 Meth= 1.
|
515
|
+
# lines.proceed #IRaf= 0 NMat= 1 IRICut= 1 DoRegI=T DoRafI=F ISym2E= 1 JSym2E=1.
|
516
|
+
# lines.proceed while /vectors were produced by pass/ =~ lines.now
|
517
|
+
while /Inverted reduced A of dimension/ !~ lines.now
|
518
|
+
lines.proceed
|
519
|
+
end
|
520
|
+
lines.proceed
|
521
|
+
if / Calculating GIAO nuclear magnetic shielding tensors./ =~ lines.now
|
522
|
+
1.upto @gaussian_result.n_atoms do |num|
|
523
|
+
lines.proceed while /Eigenvalues:/ !~ lines.now
|
524
|
+
lines.proceed
|
525
|
+
end
|
526
|
+
end
|
527
|
+
# while /^$/ !~ lines.now
|
528
|
+
# lines.proceed
|
529
|
+
# end
|
530
|
+
# end
|
531
|
+
# lines.proceed
|
532
|
+
when 1003 # Iteratively solves the CP-MCSCF equations
|
533
|
+
when 1014 # Computes analytic CI-Single second derivatives
|
534
|
+
when 1101 # Computes 1-electron integral derivatives
|
535
|
+
when 1102 # Computes dipole derivative integrals
|
536
|
+
when 1110 # 2-electron integral derivative condition to F
|
537
|
+
lines.proceed if /G2DrvN: will do/ =~ lines.now
|
538
|
+
lines.proceed if /FoFDir used for/ =~ lines.now
|
539
|
+
when 1111 # 2 PDM and post-SCF derivatives
|
540
|
+
when 1112 # MP2 second derivatives
|
541
|
+
lines.proceed if /R2 and R3 integrals will be/ =~ lines.now
|
542
|
+
lines.proceed while / Incrementing Polarizabilities/ !~ lines.now
|
543
|
+
lines.proceed 2
|
544
|
+
when 9999 # Finalizes calculation and output
|
545
|
+
while !lines.eof?
|
546
|
+
if / Normal termination/ =~ lines.now
|
547
|
+
# puts ' ****** Normal termination ****** '
|
548
|
+
end
|
549
|
+
lines.proceed
|
550
|
+
end
|
551
|
+
@stop = true
|
552
|
+
else
|
553
|
+
puts 'Not implemented Link Number!!'
|
554
|
+
printf " major : %d minor : %d\n", @major_number, @minor_number,to_s
|
555
|
+
end
|
556
|
+
rescue
|
557
|
+
puts 'exception at ' + (@major_number * 100 + @minor_number).to_s
|
558
|
+
raise
|
559
|
+
end
|
560
|
+
end
|
561
|
+
|
562
|
+
class MolecularOrbital
|
563
|
+
attr_accessor :eigen_value, :index
|
564
|
+
def initialize index, sym, occupy_or_virtual
|
565
|
+
@index = index
|
566
|
+
@sym = sym
|
567
|
+
@occupy_or_virtual = occupy_or_virtual
|
568
|
+
@coefficient = Hash.new
|
569
|
+
end
|
570
|
+
def each_ao
|
571
|
+
@coefficient.each do |key, ao|
|
572
|
+
yield key, ao
|
573
|
+
end
|
574
|
+
end
|
575
|
+
def push ao, coef
|
576
|
+
@coefficient[ao] = coef
|
577
|
+
# puts index.to_s + ' : ' + @sym.to_s + ':' + ' : ' + @occupy_or_virtual + ':' + ao + ' : ' +coef.to_s + ' '
|
578
|
+
end
|
579
|
+
def to_s
|
580
|
+
s = sprintf(" %3d %s %s", @index, @sym, @occupy_or_virtual)
|
581
|
+
if @coefficient.length < 1
|
582
|
+
puts '@coefficient == 0!'
|
583
|
+
end
|
584
|
+
@coefficient.each do |key, coef|
|
585
|
+
s = s + sprintf(" %1.1f", coef)
|
586
|
+
end
|
587
|
+
s
|
588
|
+
end
|
589
|
+
end
|
590
|
+
|
591
|
+
class AtomicOrbital
|
592
|
+
def initialize type
|
593
|
+
@type = type
|
594
|
+
@coefficient = Array.new
|
595
|
+
end
|
596
|
+
def push coef
|
597
|
+
@coefficient.push coef
|
598
|
+
end
|
599
|
+
def to_s
|
600
|
+
s = sprintf("%5s ", @type)
|
601
|
+
@coefficient.each do |coef|
|
602
|
+
s = s + sprintf("%2.2f ", coef)
|
603
|
+
end
|
604
|
+
return s
|
605
|
+
end
|
606
|
+
end
|
607
|
+
|
608
|
+
class G98Atom
|
609
|
+
|
610
|
+
#include Atom
|
611
|
+
|
612
|
+
attr_accessor :element, :density,
|
613
|
+
:distance_atom, :distance_length, :angle_atom, :angle, :dihedral_angle_atom, :diheral_angle_a, :dihedral_angle_b,
|
614
|
+
:x, :y, :z, :total_atomic_charge, :heavy_charge
|
615
|
+
attr_reader :index
|
616
|
+
VALENCY = {'C'=>4, 'N'=>3, 'H'=>1, 'F'=>1, 'CL'=>1, 'I'=>1, 'O'=>2, 'BR'=>1}
|
617
|
+
VALENCY2 = {'C'=>2, 'H'=>-1, 'O'=>0, 'F'=>-1, 'CL'=>-1, 'BR'=>-1}
|
618
|
+
WEIGHT = {'O'=>15.9999, 'BR'=>79.904, 'H'=>1.00794, 'C'=>12.001, 'F'=>18.9984032, 'CL'=>35.4527, 'N'=>14.00674}
|
619
|
+
def initialize index, molecule
|
620
|
+
@index = index
|
621
|
+
@molecule = molecule
|
622
|
+
@density = Hash.new
|
623
|
+
@orbital = Hash.new
|
624
|
+
end
|
625
|
+
def get_distance atom
|
626
|
+
Math.sqrt((@x - atom.x)*(@x - atom.x) + (@y - atom.y)*(@y - atom.y) + (@z - atom.z)*(@z - atom.z))
|
627
|
+
end
|
628
|
+
def neighbor? atom, length
|
629
|
+
return (get_distance(atom) < length)
|
630
|
+
end
|
631
|
+
def element= el
|
632
|
+
@element = el.upcase
|
633
|
+
end
|
634
|
+
def weight
|
635
|
+
puts('@element : ' + @element + 'is not defined weight!!') if WEIGHT[@element] == nil
|
636
|
+
return WEIGHT[@element]
|
637
|
+
end
|
638
|
+
def valency
|
639
|
+
puts('@element : ' + @element + 'is not defined valency!!') if VALENCY[@element] == nil
|
640
|
+
VALENCY[@element]
|
641
|
+
end
|
642
|
+
def valency2
|
643
|
+
puts('@element : ' + @element + 'is not defined valency2!!') if VALENCY2[@element] == nil
|
644
|
+
VALENCY2[@element]
|
645
|
+
end
|
646
|
+
def each_ao
|
647
|
+
@orbital.each_value do |atomic_orbital|
|
648
|
+
yield atomic_orbital
|
649
|
+
end
|
650
|
+
end
|
651
|
+
def ao hash
|
652
|
+
if @orbital[hash] == nil
|
653
|
+
return @orbital[hash] = AtomicOrbital.new(hash)
|
654
|
+
else
|
655
|
+
return @orbital[hash]
|
656
|
+
end
|
657
|
+
end
|
658
|
+
def distance atom, length
|
659
|
+
@distance_atom = atom
|
660
|
+
@distance_length = length
|
661
|
+
end
|
662
|
+
def angle atom, angle
|
663
|
+
@angle_atom = atom
|
664
|
+
@angle = angle
|
665
|
+
end
|
666
|
+
def dihedral atom, angle_a, angle_b
|
667
|
+
@dihedral_atom = atom
|
668
|
+
@dihedral_angle_a = angle_a
|
669
|
+
@dihedral_angle_b = angle_b
|
670
|
+
end
|
671
|
+
def to_s
|
672
|
+
if @molecule.has_cartessian_coordinate
|
673
|
+
return to_cartessian_coodinate
|
674
|
+
elsif @molecule.has_z_matrix
|
675
|
+
return to_z_matrix
|
676
|
+
end
|
677
|
+
end
|
678
|
+
def to_condensed_density
|
679
|
+
s = sprintf("%2s ", @element)
|
680
|
+
1.upto @molecule.atoms.length do |num|
|
681
|
+
s = s + sprintf("% f ", @density[num].to_s)
|
682
|
+
end
|
683
|
+
return s
|
684
|
+
end
|
685
|
+
def to_cartessian_coodinate
|
686
|
+
sprintf(" %2s % f % f % f", @element, @x, @y, @z)
|
687
|
+
end
|
688
|
+
def to_mol
|
689
|
+
sprintf("%10.4f%10.4f%10.4f %-2s 0 0 0 0 0", @x, @y, @z, @element)
|
690
|
+
end
|
691
|
+
def to_xyz
|
692
|
+
sprintf("%2s% 8.3f% 8.3f% 8.3f\n", @element, @x, @y, @z)
|
693
|
+
end
|
694
|
+
def to_z_matrix
|
695
|
+
s = sprintf("%d %s ", @molecule.atoms.index(self), @element)
|
696
|
+
if @distance_atom != nil
|
697
|
+
s = s + sprintf("%2d %f ", @molecule.atoms.index(@distance_atom), @distance_length)
|
698
|
+
end
|
699
|
+
if @angle_atom != nil
|
700
|
+
s = s + sprintf("%2d %f ", @molecule.atoms.index(@angle_atom), @angle)
|
701
|
+
end
|
702
|
+
if @dihedral_atom != nil
|
703
|
+
s = s + sprintf("%2d %f %f", @molecule.atoms.index(@dihedral_atom), @dihedral_angle_a, @dihedral_angle_b)
|
704
|
+
end
|
705
|
+
return s
|
706
|
+
end
|
707
|
+
end
|
708
|
+
|
709
|
+
class GaussianResult
|
710
|
+
attr_accessor :guess, :standard_basis, :energy, :n_orbitals, :n_electron, :nuclear_repulsion_energy, :n_atoms,
|
711
|
+
:sum_of_mulliken_charge, :electronic_spatial_extent, :scrf_delta_g, :dipole_moment_total, :atoms,
|
712
|
+
:has_cartessian_coordinate, :has_z_matrix_coordinate, :exist_condensed_to_atom, :mo, :homo, :lumo,
|
713
|
+
:stoichiometry, :symmetricity
|
714
|
+
def initialize input, view=false
|
715
|
+
@mo = Hash.new
|
716
|
+
@has_cartessian_coordinate = false
|
717
|
+
@has_z_matrix_coordinate = false
|
718
|
+
@input = input
|
719
|
+
read_link
|
720
|
+
lines = Lines.new input.readlines
|
721
|
+
link = @links[0].first
|
722
|
+
puts_links if view
|
723
|
+
while ! lines.eof?
|
724
|
+
link.process lines
|
725
|
+
break if link.stop
|
726
|
+
link = link.next_link
|
727
|
+
end
|
728
|
+
# link.process lines
|
729
|
+
end
|
730
|
+
def weight
|
731
|
+
total_weight = 0
|
732
|
+
@atoms.each do |key, atom|
|
733
|
+
total_weight = total_weight + atom.weight
|
734
|
+
end
|
735
|
+
total_weight
|
736
|
+
end
|
737
|
+
def moment
|
738
|
+
total_moment_x = 0
|
739
|
+
total_moment_y = 0
|
740
|
+
total_moment_z = 0
|
741
|
+
@atoms.each do |key, atom|
|
742
|
+
total_moment_x = total_moment_x + atom.weight * atom.x * atom.x
|
743
|
+
total_moment_y = total_moment_y + atom.weight * atom.y * atom.y
|
744
|
+
total_moment_z = total_moment_z + atom.weight * atom.z * atom.z
|
745
|
+
end
|
746
|
+
return total_moment_x * total_moment_y * total_moment_z
|
747
|
+
end
|
748
|
+
def entropy_trans temperature
|
749
|
+
return 76.57 + 12.47 * Math.log10(weight) + 20.79 * Math.log10(temperature)
|
750
|
+
end
|
751
|
+
def entropy_rotate temperature, sigma
|
752
|
+
return 877.37 + 8.3144 * (Math.log10(moment) + Math.log10(temperature) - Math.log10(sigma))
|
753
|
+
end
|
754
|
+
def entropy temperature
|
755
|
+
return entropy_trans(temperature)
|
756
|
+
end
|
757
|
+
def valency
|
758
|
+
total_valency = 0
|
759
|
+
@atoms.each do |key, atom|
|
760
|
+
total_valency = total_valency + atom.valency
|
761
|
+
end
|
762
|
+
total_valency
|
763
|
+
end
|
764
|
+
def valency2
|
765
|
+
total_valency2 = 0
|
766
|
+
@atoms.each do |key, atom|
|
767
|
+
total_valency2 = total_valency2 + atom.valency2
|
768
|
+
end
|
769
|
+
total_valency2 / 2 + 1
|
770
|
+
end
|
771
|
+
def near one, distance
|
772
|
+
@atoms.each do |key, another|
|
773
|
+
puts '.'
|
774
|
+
puts ((another.x - one.x) * (another.x - one.x) +
|
775
|
+
(another.y - one.y) * (another.y - one.y) +
|
776
|
+
(another.z + one.z) * (another.z - one.z)).to_s
|
777
|
+
if ((another.x - one.x) * (another.x - one.x) +
|
778
|
+
(another.y - one.y) * (another.y - one.y) +
|
779
|
+
(another.z + one.z) * (another.z - one.z)) < distance * distance
|
780
|
+
yield another
|
781
|
+
end
|
782
|
+
end
|
783
|
+
end
|
784
|
+
def to_xyz
|
785
|
+
s = @atoms.length.to_s + "\n"
|
786
|
+
s = s + "*\n"
|
787
|
+
@atoms.each do |key, atom|
|
788
|
+
s = s + sprintf("%2s% 8.3f% 8.3f% 8.3f\n", atom.element, atom.x, atom.y, atom.z)
|
789
|
+
end
|
790
|
+
s
|
791
|
+
end
|
792
|
+
def process_link_line line, last_link
|
793
|
+
/\// =~ line
|
794
|
+
major_no = $`.to_i
|
795
|
+
/\// =~ $'
|
796
|
+
parameters = Hash.new
|
797
|
+
minor_no = $'.chop.chop.split ','
|
798
|
+
$`.split(',').each do |p|
|
799
|
+
/=/ =~ p
|
800
|
+
parameters[$`.to_i] = $'.to_i
|
801
|
+
end
|
802
|
+
goto = 0
|
803
|
+
if /\((-?\d+)/ =~ minor_no.last
|
804
|
+
minor_no[-1] = $`
|
805
|
+
goto = $+.to_i
|
806
|
+
end
|
807
|
+
stop = false
|
808
|
+
major_links = Array.new
|
809
|
+
minor_no.each do |minor|
|
810
|
+
link = Link.new(major_no, minor.to_i, parameters, goto, self)# if(major_no == 1 && minor == '1')
|
811
|
+
major_links.push link
|
812
|
+
end
|
813
|
+
major_links
|
814
|
+
end
|
815
|
+
def read_link
|
816
|
+
@links = Array.new
|
817
|
+
while(/[*]{10}/ !~ @input.readline)
|
818
|
+
;
|
819
|
+
end
|
820
|
+
while(/[*]{10}/ !~ @input.readline)
|
821
|
+
;
|
822
|
+
end
|
823
|
+
while /[%]/ =~ @input.readline
|
824
|
+
;
|
825
|
+
end
|
826
|
+
@input.readline if / Will use up to/ =~ $_
|
827
|
+
@input.readline# # RHF/6-31G(d) Pop=Full Test
|
828
|
+
@input.readline# ----------------------------
|
829
|
+
while(/(--+)|( Leave Link)/ !~ @input.readline)
|
830
|
+
if /^$/ =~ $_
|
831
|
+
@input.readline
|
832
|
+
@input.readline
|
833
|
+
@input.readline
|
834
|
+
@input.readline
|
835
|
+
end
|
836
|
+
if(@links.last != nil)
|
837
|
+
last = @links.last.last
|
838
|
+
else
|
839
|
+
last = nil
|
840
|
+
end
|
841
|
+
link = process_link_line $_, last
|
842
|
+
@links.push link
|
843
|
+
# puts link
|
844
|
+
end
|
845
|
+
last_link = nil
|
846
|
+
@links.each do |link|
|
847
|
+
link.each do |minor_link|
|
848
|
+
if (last_link != nil)
|
849
|
+
last_link.default_link = minor_link
|
850
|
+
if minor_link.goto > 0
|
851
|
+
minor_link.jump_link = @links[@links.index(link) + minor_link.goto + 1].first
|
852
|
+
elsif minor_link.goto < 0
|
853
|
+
minor_link.jump_link = @links[@links.index(link) + minor_link.goto].first
|
854
|
+
end
|
855
|
+
end
|
856
|
+
last_link = minor_link
|
857
|
+
end
|
858
|
+
end
|
859
|
+
end
|
860
|
+
def include? major, minor, parameter
|
861
|
+
@links.each do | link |
|
862
|
+
link.each do |minor_link|
|
863
|
+
if parameter
|
864
|
+
if(minor_link.major_number == major &&
|
865
|
+
minor_link.minor_number == minor &&
|
866
|
+
minor_link.parameters.has_key?(parameter))
|
867
|
+
return true
|
868
|
+
end
|
869
|
+
else
|
870
|
+
if(minor_link.major_number == major && minor_link.minor_number == minor)
|
871
|
+
return true
|
872
|
+
end
|
873
|
+
end
|
874
|
+
end
|
875
|
+
end
|
876
|
+
false
|
877
|
+
end
|
878
|
+
def puts_links
|
879
|
+
@links.each do | link |
|
880
|
+
puts link
|
881
|
+
end
|
882
|
+
end
|
883
|
+
end
|
884
|
+
|
885
|
+
if __FILE__ == $0
|
886
|
+
gr = GaussianResult.new(File.open(ARGV.shift), false)
|
887
|
+
puts gr.entropy 256
|
888
|
+
valency = 0
|
889
|
+
puts 'entropy : ' + gr.entropy(276).to_s
|
890
|
+
puts 'eigen_value : ' + gr.homo.eigen_value.to_s
|
891
|
+
gr.atoms.keys.sort.each do |atom_num|
|
892
|
+
# puts gr.atoms[atom_num].to_condensed_density
|
893
|
+
# gr.atoms[atom_num].each_ao do |ao|
|
894
|
+
# puts ao
|
895
|
+
# end
|
896
|
+
end
|
897
|
+
puts '--------------- Print Out Molecular Orbitals---------------'
|
898
|
+
# gr.mo.keys.sort.each do |mo_key|
|
899
|
+
# puts gr.mo[mo_key].to_s
|
900
|
+
# end
|
901
|
+
# puts gr.homo
|
902
|
+
# puts gr.lumo
|
903
|
+
# printf "energy : %f\n", gr.energy
|
904
|
+
# puts gr.valency
|
905
|
+
# puts gr.valency2
|
906
|
+
File.open("test.xyz", "w").puts gr.to_xyz
|
907
|
+
end
|
908
|
+
end # end of G98 module
|
909
|
+
end
|