chemruby 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,375 @@
|
|
1
|
+
#
|
2
|
+
# DO NOT MODIFY!!!!
|
3
|
+
# This file is automatically generated by racc 1.4.4
|
4
|
+
# from racc grammer file "smiles.ry".
|
5
|
+
#
|
6
|
+
|
7
|
+
require 'racc/parser'
|
8
|
+
|
9
|
+
|
10
|
+
class SmilesParser < Racc::Parser
|
11
|
+
|
12
|
+
module_eval <<'..end smiles.ry modeval..id6e4480ccfa', 'smiles.ry', 84
|
13
|
+
|
14
|
+
def next_token
|
15
|
+
@q.shift
|
16
|
+
end
|
17
|
+
|
18
|
+
def construct mol, tree, prev = nil
|
19
|
+
tree.each do |node|
|
20
|
+
if node.instance_of?(Array)
|
21
|
+
construct(mol, node, prev)
|
22
|
+
else
|
23
|
+
mol.nodes.push(node)
|
24
|
+
mol.join(prev, node) if prev
|
25
|
+
# if node.pos != nil
|
26
|
+
if node.smiles_pos
|
27
|
+
node.smiles_pos.each do |smiles_pos|
|
28
|
+
if @ring[smiles_pos]
|
29
|
+
mol.join(node, @ring[smiles_pos])
|
30
|
+
# re-use ring closure digits
|
31
|
+
# Higher-numbered ring closures are not supported yet.
|
32
|
+
@ring[smiles_pos] = nil
|
33
|
+
else
|
34
|
+
@ring[smiles_pos] = node
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
prev = node
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def initialize
|
44
|
+
super
|
45
|
+
@ring = []
|
46
|
+
end
|
47
|
+
|
48
|
+
@@parser = SmilesParser.new
|
49
|
+
|
50
|
+
def self.parse_smiles( smiles )
|
51
|
+
@@parser.parse( smiles )
|
52
|
+
end
|
53
|
+
|
54
|
+
ElementRegex = Regexp.new('\A(' + Chem::Number2Element.inject([]){|ret, el| ret.push(el.to_s)}.sort.reverse.join("|") + ')', Regexp::IGNORECASE)
|
55
|
+
|
56
|
+
def parse( line )
|
57
|
+
@q = []
|
58
|
+
|
59
|
+
line.strip!
|
60
|
+
until line.empty? do
|
61
|
+
case line
|
62
|
+
when /\A\[([^\]]+)\]/
|
63
|
+
# [nH] : aromatic N-H
|
64
|
+
@q.push [:ATOM_SYMBOL, $&] # [m[1], m[2], m[3], m[4], m[5], m[6]]]
|
65
|
+
when ElementRegex
|
66
|
+
prop = {}
|
67
|
+
prop[:is_aromatic] = (97 <= $&[0]) #and 122 < $&[0]
|
68
|
+
@q.push [:SYMBOL, [$&.capitalize.intern , prop]]
|
69
|
+
when /\A\d+/
|
70
|
+
@q.push [:NUMBER, $& ]
|
71
|
+
when /\\/
|
72
|
+
@q.push [:BSLASH, :BSLASH]
|
73
|
+
when /\A./
|
74
|
+
@q.push [$&, $&]
|
75
|
+
else
|
76
|
+
raise RuntimeError, 'must not happen'
|
77
|
+
end
|
78
|
+
line = $'
|
79
|
+
end
|
80
|
+
@q.push [ :EOL, nil ]
|
81
|
+
# p @q
|
82
|
+
mol = Chem::SmilesMol.new
|
83
|
+
construct(mol, do_parse)
|
84
|
+
mol
|
85
|
+
end
|
86
|
+
|
87
|
+
..end smiles.ry modeval..id6e4480ccfa
|
88
|
+
|
89
|
+
##### racc 1.4.4 generates ###
|
90
|
+
|
91
|
+
racc_reduce_table = [
|
92
|
+
0, 0, :racc_error,
|
93
|
+
0, 16, :_reduce_none,
|
94
|
+
3, 16, :_reduce_2,
|
95
|
+
1, 17, :_reduce_3,
|
96
|
+
2, 17, :_reduce_4,
|
97
|
+
1, 18, :_reduce_none,
|
98
|
+
2, 18, :_reduce_6,
|
99
|
+
1, 18, :_reduce_none,
|
100
|
+
1, 22, :_reduce_8,
|
101
|
+
1, 22, :_reduce_9,
|
102
|
+
1, 19, :_reduce_none,
|
103
|
+
2, 19, :_reduce_11,
|
104
|
+
1, 20, :_reduce_none,
|
105
|
+
1, 20, :_reduce_none,
|
106
|
+
1, 20, :_reduce_none,
|
107
|
+
1, 20, :_reduce_none,
|
108
|
+
1, 20, :_reduce_none,
|
109
|
+
1, 20, :_reduce_none,
|
110
|
+
1, 20, :_reduce_none,
|
111
|
+
3, 21, :_reduce_19 ]
|
112
|
+
|
113
|
+
racc_reduce_n = 20
|
114
|
+
|
115
|
+
racc_shift_n = 26
|
116
|
+
|
117
|
+
racc_action_table = [
|
118
|
+
4, 7, 8, 7, 8, 19, 9, 11, 13, 15,
|
119
|
+
17, 2, 5, 6, 22, 7, 8, 20, 9, 11,
|
120
|
+
13, 15, 17, 2, 5, 6, 7, 8, nil, 9,
|
121
|
+
11, 13, 15, 17, 2, 5, 6, 25, 7, 8,
|
122
|
+
nil, 9, 11, 13, 15, 17, 2, 5, 6 ]
|
123
|
+
|
124
|
+
racc_action_check = [
|
125
|
+
1, 16, 16, 1, 1, 3, 1, 1, 1, 1,
|
126
|
+
1, 1, 1, 1, 10, 10, 10, 4, 10, 10,
|
127
|
+
10, 10, 10, 10, 10, 10, 21, 21, nil, 21,
|
128
|
+
21, 21, 21, 21, 21, 21, 21, 21, 6, 6,
|
129
|
+
nil, 6, 6, 6, 6, 6, 6, 6, 6 ]
|
130
|
+
|
131
|
+
racc_action_pointer = [
|
132
|
+
nil, 0, nil, 0, 17, nil, 35, nil, nil, nil,
|
133
|
+
12, nil, nil, nil, nil, nil, -2, nil, nil, nil,
|
134
|
+
nil, 23, nil, nil, nil, nil ]
|
135
|
+
|
136
|
+
racc_action_default = [
|
137
|
+
-1, -20, -17, -10, -20, -18, -20, -8, -9, -12,
|
138
|
+
-20, -13, -3, -14, -5, -15, -20, -16, -7, -11,
|
139
|
+
26, -20, -2, -4, -6, -19 ]
|
140
|
+
|
141
|
+
racc_goto_table = [
|
142
|
+
23, 10, 1, 24, nil, nil, 21, nil, nil, nil,
|
143
|
+
nil, 23 ]
|
144
|
+
|
145
|
+
racc_goto_check = [
|
146
|
+
3, 2, 1, 4, nil, nil, 2, nil, nil, nil,
|
147
|
+
nil, 3 ]
|
148
|
+
|
149
|
+
racc_goto_pointer = [
|
150
|
+
nil, 2, 0, -10, -13, nil, nil, nil ]
|
151
|
+
|
152
|
+
racc_goto_default = [
|
153
|
+
nil, nil, nil, 12, 14, 16, 18, 3 ]
|
154
|
+
|
155
|
+
racc_token_table = {
|
156
|
+
false => 0,
|
157
|
+
Object.new => 1,
|
158
|
+
:EOL => 2,
|
159
|
+
:SYMBOL => 3,
|
160
|
+
:ATOM_SYMBOL => 4,
|
161
|
+
:NUMBER => 5,
|
162
|
+
"-" => 6,
|
163
|
+
"=" => 7,
|
164
|
+
"#" => 8,
|
165
|
+
":" => 9,
|
166
|
+
"/" => 10,
|
167
|
+
:BSLASH => 11,
|
168
|
+
"." => 12,
|
169
|
+
"(" => 13,
|
170
|
+
")" => 14 }
|
171
|
+
|
172
|
+
racc_use_result_var = true
|
173
|
+
|
174
|
+
racc_nt_base = 15
|
175
|
+
|
176
|
+
Racc_arg = [
|
177
|
+
racc_action_table,
|
178
|
+
racc_action_check,
|
179
|
+
racc_action_default,
|
180
|
+
racc_action_pointer,
|
181
|
+
racc_goto_table,
|
182
|
+
racc_goto_check,
|
183
|
+
racc_goto_default,
|
184
|
+
racc_goto_pointer,
|
185
|
+
racc_nt_base,
|
186
|
+
racc_reduce_table,
|
187
|
+
racc_token_table,
|
188
|
+
racc_shift_n,
|
189
|
+
racc_reduce_n,
|
190
|
+
racc_use_result_var ]
|
191
|
+
|
192
|
+
Racc_token_to_s_table = [
|
193
|
+
'$end',
|
194
|
+
'error',
|
195
|
+
'EOL',
|
196
|
+
'SYMBOL',
|
197
|
+
'ATOM_SYMBOL',
|
198
|
+
'NUMBER',
|
199
|
+
'"-"',
|
200
|
+
'"="',
|
201
|
+
'"#"',
|
202
|
+
'":"',
|
203
|
+
'"/"',
|
204
|
+
'BSLASH',
|
205
|
+
'"."',
|
206
|
+
'"("',
|
207
|
+
'")"',
|
208
|
+
'$start',
|
209
|
+
'smiles',
|
210
|
+
'smile',
|
211
|
+
'node',
|
212
|
+
'atom_pos',
|
213
|
+
'bond',
|
214
|
+
'branch',
|
215
|
+
'atom']
|
216
|
+
|
217
|
+
Racc_debug_parser = false
|
218
|
+
|
219
|
+
##### racc system variables end #####
|
220
|
+
|
221
|
+
# reduce 0 omitted
|
222
|
+
|
223
|
+
# reduce 1 omitted
|
224
|
+
|
225
|
+
module_eval <<'.,.,', 'smiles.ry', 9
|
226
|
+
def _reduce_2( val, _values, result )
|
227
|
+
return val[1]
|
228
|
+
result
|
229
|
+
end
|
230
|
+
.,.,
|
231
|
+
|
232
|
+
module_eval <<'.,.,', 'smiles.ry', 13
|
233
|
+
def _reduce_3( val, _values, result )
|
234
|
+
result = val
|
235
|
+
result
|
236
|
+
end
|
237
|
+
.,.,
|
238
|
+
|
239
|
+
module_eval <<'.,.,', 'smiles.ry', 17
|
240
|
+
def _reduce_4( val, _values, result )
|
241
|
+
result.push(val[1])
|
242
|
+
result
|
243
|
+
end
|
244
|
+
.,.,
|
245
|
+
|
246
|
+
# reduce 5 omitted
|
247
|
+
|
248
|
+
module_eval <<'.,.,', 'smiles.ry', 23
|
249
|
+
def _reduce_6( val, _values, result )
|
250
|
+
val[1].bond = val[0]
|
251
|
+
result = val[1]
|
252
|
+
result
|
253
|
+
end
|
254
|
+
.,.,
|
255
|
+
|
256
|
+
# reduce 7 omitted
|
257
|
+
|
258
|
+
module_eval <<'.,.,', 'smiles.ry', 31
|
259
|
+
def _reduce_8( val, _values, result )
|
260
|
+
node = Chem::SmilesAtom.new
|
261
|
+
node.element = val[0][0]
|
262
|
+
node.is_aromatic = val[0][1][:is_aromatic]
|
263
|
+
result = node
|
264
|
+
result
|
265
|
+
end
|
266
|
+
.,.,
|
267
|
+
|
268
|
+
module_eval <<'.,.,', 'smiles.ry', 54
|
269
|
+
def _reduce_9( val, _values, result )
|
270
|
+
m = /(\d*)([A-Za-z][a-z]?)(@*)(H\d*)?(\d*[+-]+)?/.match(val[0])
|
271
|
+
# m = /(\d*)([A-Za-z][a-z]?)(@*)(H?\d*)(-?\d*)?/.match(val[0])
|
272
|
+
node = Chem::SmilesAtom.new
|
273
|
+
node.mass = m[1].to_i
|
274
|
+
node.element = m[2].capitalize.intern
|
275
|
+
node.is_aromatic = (97 <= m[2][0]) #and 122 < $&[0]
|
276
|
+
node.chiral = m[3]
|
277
|
+
|
278
|
+
if m[4] and not m[4] == ""
|
279
|
+
hydrogen = /H(\d)+/.match(m[4])
|
280
|
+
node.hydrogen_count = hydrogen ? hydrogen[1].to_i : 1
|
281
|
+
end
|
282
|
+
if m[5]
|
283
|
+
charge = /(\d*)([+-]+)/.match(m[5])
|
284
|
+
sign = (charge[2][0..0] == "+") ? 1 : -1
|
285
|
+
n = charge[1] == "" ? charge[2].length : charge[1].to_i
|
286
|
+
node.charge = sign * n
|
287
|
+
end
|
288
|
+
|
289
|
+
result = node
|
290
|
+
result
|
291
|
+
end
|
292
|
+
.,.,
|
293
|
+
|
294
|
+
# reduce 10 omitted
|
295
|
+
|
296
|
+
module_eval <<'.,.,', 'smiles.ry', 60
|
297
|
+
def _reduce_11( val, _values, result )
|
298
|
+
val[0].smiles_pos = val[1].split("").collect{|c| c.to_i}
|
299
|
+
result = val[0]
|
300
|
+
result
|
301
|
+
end
|
302
|
+
.,.,
|
303
|
+
|
304
|
+
# reduce 12 omitted
|
305
|
+
|
306
|
+
# reduce 13 omitted
|
307
|
+
|
308
|
+
# reduce 14 omitted
|
309
|
+
|
310
|
+
# reduce 15 omitted
|
311
|
+
|
312
|
+
# reduce 16 omitted
|
313
|
+
|
314
|
+
# reduce 17 omitted
|
315
|
+
|
316
|
+
# reduce 18 omitted
|
317
|
+
|
318
|
+
module_eval <<'.,.,', 'smiles.ry', 71
|
319
|
+
def _reduce_19( val, _values, result )
|
320
|
+
result = val[1]
|
321
|
+
result
|
322
|
+
end
|
323
|
+
.,.,
|
324
|
+
|
325
|
+
def _reduce_none( val, _values, result )
|
326
|
+
result
|
327
|
+
end
|
328
|
+
|
329
|
+
end # class SmilesParser
|
330
|
+
|
331
|
+
|
332
|
+
module Chem
|
333
|
+
|
334
|
+
class SmilesAtom
|
335
|
+
include Atom
|
336
|
+
attr_accessor :bond, :element, :element, :chiral, :hydrogen_count, :charge, :smiles_pos, :is_aromatic
|
337
|
+
def inspect
|
338
|
+
"{%s %s(%s)}" % [@bond, @element, smiles_pos ? smiles_pos.join : ""]
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
class SmilesBond
|
343
|
+
include Bond
|
344
|
+
end
|
345
|
+
|
346
|
+
class SmilesMol
|
347
|
+
|
348
|
+
include Molecule
|
349
|
+
include Enumerable
|
350
|
+
|
351
|
+
attr_reader :nodes, :edges
|
352
|
+
|
353
|
+
def initialize
|
354
|
+
@nodes = []
|
355
|
+
@edges = []
|
356
|
+
end
|
357
|
+
|
358
|
+
def join from, to
|
359
|
+
return if to.bond == '.'
|
360
|
+
bond = SmilesBond.new
|
361
|
+
|
362
|
+
case to.bond
|
363
|
+
when '='
|
364
|
+
bond.v = 2
|
365
|
+
when '#'
|
366
|
+
bond.v = 3
|
367
|
+
else
|
368
|
+
bond.v = 1
|
369
|
+
end
|
370
|
+
@edges.push([bond, from, to])
|
371
|
+
end
|
372
|
+
|
373
|
+
end
|
374
|
+
|
375
|
+
end
|
data/lib/chem/db/swf.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
#!/usr/local/bin/ruby
|
2
|
+
|
3
|
+
require 'ming/ming'
|
4
|
+
require 'molfile_reader'
|
5
|
+
require 'transform'
|
6
|
+
|
7
|
+
include Ming
|
8
|
+
|
9
|
+
module Chem
|
10
|
+
|
11
|
+
# Flash SWF writer
|
12
|
+
# Obsolete
|
13
|
+
class SWFWriter
|
14
|
+
|
15
|
+
def initialize mol
|
16
|
+
@m = SWFMovie.new
|
17
|
+
@m.set_rate(5.0)
|
18
|
+
@m.set_dimension(1000, 1000)
|
19
|
+
@m.set_background(0xff, 0xff, 0xff)
|
20
|
+
# @m.add(make_atom(mol))
|
21
|
+
0.upto(200) do |n|
|
22
|
+
rotate(Math::PI * 0.01 * n, mol)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def rotate n, mol
|
27
|
+
t = Transform.translate(500.0, 500.0, 0) * Transform.scale(100, 100, 10) *
|
28
|
+
Transform.rotate_z(n) * Transform.rotate_x(n)
|
29
|
+
mol.transform(t)
|
30
|
+
ib = @m.add(make_bond(mol))
|
31
|
+
# ia = @m.add(make_atom(mol))
|
32
|
+
@m.next_frame
|
33
|
+
@m.remove(ib)
|
34
|
+
# @m.remove(ia)
|
35
|
+
end
|
36
|
+
|
37
|
+
def make_atom mol
|
38
|
+
a = SWFText.new
|
39
|
+
f = SWFFont.new("EfontSerifB.fdb")
|
40
|
+
a.set_font(f)
|
41
|
+
a.set_color(0x00, 0x80, 0x40)
|
42
|
+
height = 28
|
43
|
+
a.set_height(height * 2)
|
44
|
+
mol.atoms.each do |atom|
|
45
|
+
a.move_to(atom.pos[0] - height, atom.pos[1] + height)
|
46
|
+
a.add_string(atom.element)
|
47
|
+
end
|
48
|
+
a
|
49
|
+
end
|
50
|
+
|
51
|
+
def make_bond mol
|
52
|
+
s = SWFShape.new
|
53
|
+
mol.bonds.each do |bond|
|
54
|
+
|
55
|
+
s.set_line(1, 0x0, 0, 0)
|
56
|
+
s.move_pen_to(bond.b.pos[0], bond.b.pos[1])
|
57
|
+
s.draw_line_to(bond.e.pos[0], bond.e.pos[1])
|
58
|
+
end
|
59
|
+
s
|
60
|
+
end
|
61
|
+
|
62
|
+
def save fn
|
63
|
+
@m.save(fn)
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
if __FILE__ == $0
|
71
|
+
s = SWFWriter.new(MolfileReader.new(open('mol1.mol', 'r')).parse_mol)
|
72
|
+
s.save('anim.swf')
|
73
|
+
puts 'Created!'
|
74
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
|
2
|
+
module Chem
|
3
|
+
|
4
|
+
module Molecule
|
5
|
+
|
6
|
+
# Return sybyl formatted molecule
|
7
|
+
def to_sybyl
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
module Atom
|
13
|
+
|
14
|
+
def to_sybyl
|
15
|
+
" 1 C1 -3.262565 -0.588014 -0.082185 C.3 1 <1> -0.020001 "
|
16
|
+
"%7d" % [1]
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
module Sybyl
|
22
|
+
SybylAtomTypes = {
|
23
|
+
"LP" => "lone pair",
|
24
|
+
"Du" => "dummy atom",
|
25
|
+
"Du.C" => "dummy carbon",
|
26
|
+
"Hal" => "halogen",
|
27
|
+
"Het" => "heteroatom = N, O, S, P",
|
28
|
+
"Hev" => "heavy atom (non hydrogen)",
|
29
|
+
|
30
|
+
"H" => "hydrogen",
|
31
|
+
"H.spc" => "hydrogen in Single Point Charge (SPC) water model",
|
32
|
+
"H.t3p" => "hydrogen in Transferable intermolecular Potential (TIP3P) water model",
|
33
|
+
|
34
|
+
"C.2" => "carbon sp2",
|
35
|
+
"C.1" => "carbon sp",
|
36
|
+
"C.ar" => "carbon aromatic",
|
37
|
+
"C.cat" => "carbocation (C+) used only in a guadinium group",
|
38
|
+
"C.3" => "carbon sp3",
|
39
|
+
|
40
|
+
"N.3" => "nitrogen sp3",
|
41
|
+
"N.2" => "nitrogen sp2",
|
42
|
+
"Any" => "any atom",
|
43
|
+
"N.1" => "nitrogen sp",
|
44
|
+
"N.ar" => "nitrogen aromatic",
|
45
|
+
"N.am" => "nitrogen amide",
|
46
|
+
"N.pl3" => "nitrogen trigonal planar",
|
47
|
+
"N.4" => "nitrogen sp3 positively charged",
|
48
|
+
"Li" => "lithium",
|
49
|
+
"Na" => "sodium",
|
50
|
+
|
51
|
+
"O.3" => "oxygen sp3",
|
52
|
+
"O.2" => "oxygen sp2",
|
53
|
+
"O.co2" => "oxygen in carboxylate and phosphate groups",
|
54
|
+
"O.spc" => "oxygen in Single Point Charge (SPC) water model",
|
55
|
+
"O.t3p" => "oxygen in Transferable Intermolecular Potential (TIP3P) water model",
|
56
|
+
|
57
|
+
"Mg" => "magnesium",
|
58
|
+
"Al" => "aluminum",
|
59
|
+
"Si" => "silicon",
|
60
|
+
"K" => "potassium",
|
61
|
+
"Ca" => "calcium",
|
62
|
+
|
63
|
+
"S.3" => "sulfur sp3",
|
64
|
+
"S.2" => "sulfur sp2",
|
65
|
+
"S.O" => "sulfoxide sulfur",
|
66
|
+
"S.O2" => "sulfone sulfur",
|
67
|
+
|
68
|
+
"Cr.th" => "chromium (tetrahedral)",
|
69
|
+
"Cr.oh" => "chromium (octahedral)",
|
70
|
+
|
71
|
+
"Mn" => "manganese",
|
72
|
+
"Fe" => "iron",
|
73
|
+
"P.3" => "phosphorous sp3",
|
74
|
+
"Co.oh" => "cobalt (octahedral)",
|
75
|
+
"F" => "fluorine",
|
76
|
+
"Cu" => "copper",
|
77
|
+
"Cl" => "chlorine",
|
78
|
+
"Zn" => "zinc",
|
79
|
+
"Br" => "bromine",
|
80
|
+
"Se" => "selenium",
|
81
|
+
"I" => "iodine",
|
82
|
+
"Mo" => "molybdenum",
|
83
|
+
"Sn" => "tin",
|
84
|
+
}
|
85
|
+
|
86
|
+
class SybylAtom
|
87
|
+
|
88
|
+
include Atom
|
89
|
+
|
90
|
+
def element ; @element ||= @line[53..60].split(".")[0].strip.intern ; end
|
91
|
+
def x ; @x ||= @line[16..27].to_f ; end
|
92
|
+
def y ; @y ||= @line[28..39].to_f ; end
|
93
|
+
def z ; @z ||= @line[40..51].to_f ; end
|
94
|
+
def initialize line ; @line = line ; end
|
95
|
+
|
96
|
+
end
|
97
|
+
|
98
|
+
class SybylBond
|
99
|
+
|
100
|
+
include Bond
|
101
|
+
|
102
|
+
attr_reader :b, :e
|
103
|
+
def initialize line
|
104
|
+
# @line = line
|
105
|
+
@b = line[6..10].to_i
|
106
|
+
@e = line[11..15].to_i
|
107
|
+
@v = line[16..17].to_i
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
class SybylMolecule
|
113
|
+
|
114
|
+
include Molecule
|
115
|
+
include Enumerable
|
116
|
+
|
117
|
+
def n_atoms ; @n_atoms ||= @count_line[0..4].to_i ; end
|
118
|
+
def n_bonds ; @n_bonds ||= @count_line[5..10].to_i ; end
|
119
|
+
# def charge?
|
120
|
+
def initialize filename
|
121
|
+
@nodes = []
|
122
|
+
@edges = []
|
123
|
+
File.open(filename) do |input|
|
124
|
+
input.read.split("\n@").each do |line|
|
125
|
+
ary = line.split("\n")
|
126
|
+
case ary[0]
|
127
|
+
when /<TRIPOS>MOLECULE/
|
128
|
+
parse_mol ary
|
129
|
+
when /<TRIPOS>ATOM/
|
130
|
+
ary[1..-1].each{|line| @nodes.push(SybylAtom.new(line))}
|
131
|
+
when /<TRIPOS>BOND/
|
132
|
+
ary[1..-1].each do |line|
|
133
|
+
bond = SybylBond.new(line)
|
134
|
+
@edges.push([bond, @nodes[bond.e - 1], @nodes[bond.b - 1]])
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
private
|
142
|
+
def parse_mol ary
|
143
|
+
@count_line = ary[2]
|
144
|
+
end
|
145
|
+
|
146
|
+
end
|
147
|
+
|
148
|
+
end
|
149
|
+
|
150
|
+
end
|