chemruby 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (241) hide show
  1. data/README +120 -0
  2. data/Rakefile +195 -0
  3. data/ext/extconf.rb +4 -0
  4. data/ext/subcomp.c +416 -0
  5. data/lib/chem.rb +130 -0
  6. data/lib/chem/appl.rb +1 -0
  7. data/lib/chem/appl/chem3dole.rb +36 -0
  8. data/lib/chem/appl/tinker/nucleic.rb +40 -0
  9. data/lib/chem/appl/tinker/tinker_reader.rb +43 -0
  10. data/lib/chem/data.rb +4 -0
  11. data/lib/chem/data/atomic_weight.rb +124 -0
  12. data/lib/chem/data/character.rb +2 -0
  13. data/lib/chem/data/electronegativity.rb +14 -0
  14. data/lib/chem/data/periodic_table.rb +6 -0
  15. data/lib/chem/data/prime_numbers.rb +1 -0
  16. data/lib/chem/data/vdw_radii.rb +1 -0
  17. data/lib/chem/db.rb +64 -0
  18. data/lib/chem/db/cansmi.rb +234 -0
  19. data/lib/chem/db/cdx.rb +1525 -0
  20. data/lib/chem/db/eps.rb +164 -0
  21. data/lib/chem/db/g98.rb +909 -0
  22. data/lib/chem/db/gspan.rb +130 -0
  23. data/lib/chem/db/iupac.rb +5 -0
  24. data/lib/chem/db/iupac/a_1.rb +46 -0
  25. data/lib/chem/db/iupac/iuparser.rb +226 -0
  26. data/lib/chem/db/iupac/iuparser.ry +97 -0
  27. data/lib/chem/db/iupac/postfix.rb +2 -0
  28. data/lib/chem/db/kcf.rb +390 -0
  29. data/lib/chem/db/kcf_glycan.rb +19 -0
  30. data/lib/chem/db/kegg.rb +516 -0
  31. data/lib/chem/db/linucs/linparser.rb +144 -0
  32. data/lib/chem/db/linucs/linucs.ry +53 -0
  33. data/lib/chem/db/mdl.rb +379 -0
  34. data/lib/chem/db/molconnz.rb +12 -0
  35. data/lib/chem/db/mopac.rb +88 -0
  36. data/lib/chem/db/msi.rb +107 -0
  37. data/lib/chem/db/pdb_dic.rb +115 -0
  38. data/lib/chem/db/pdf.rb +131 -0
  39. data/lib/chem/db/pubchem.rb +113 -0
  40. data/lib/chem/db/rmagick.rb +70 -0
  41. data/lib/chem/db/sdf.rb +37 -0
  42. data/lib/chem/db/smbl.rb +88 -0
  43. data/lib/chem/db/smiles.rb +2 -0
  44. data/lib/chem/db/smiles/smiles.ry +203 -0
  45. data/lib/chem/db/smiles/smiparser.rb +375 -0
  46. data/lib/chem/db/swf.rb +74 -0
  47. data/lib/chem/db/sybyl.rb +150 -0
  48. data/lib/chem/db/tinker.rb +77 -0
  49. data/lib/chem/db/types/type_cansmi.rb +9 -0
  50. data/lib/chem/db/types/type_cdx.rb +24 -0
  51. data/lib/chem/db/types/type_gspan.rb +31 -0
  52. data/lib/chem/db/types/type_kcf.rb +28 -0
  53. data/lib/chem/db/types/type_kcf_glycan.rb +26 -0
  54. data/lib/chem/db/types/type_kegg.rb +92 -0
  55. data/lib/chem/db/types/type_mdl.rb +31 -0
  56. data/lib/chem/db/types/type_pdf.rb +33 -0
  57. data/lib/chem/db/types/type_png.rb +31 -0
  58. data/lib/chem/db/types/type_rxn.rb +25 -0
  59. data/lib/chem/db/types/type_sdf.rb +25 -0
  60. data/lib/chem/db/types/type_sybyl.rb +30 -0
  61. data/lib/chem/db/types/type_xyz.rb +26 -0
  62. data/lib/chem/db/vector.rb +128 -0
  63. data/lib/chem/db/xyz.rb +39 -0
  64. data/lib/chem/model.rb +119 -0
  65. data/lib/chem/model/skeleton.rb +37 -0
  66. data/lib/chem/utils.rb +11 -0
  67. data/lib/chem/utils/geometry.rb +27 -0
  68. data/lib/chem/utils/graph_db.rb +146 -0
  69. data/lib/chem/utils/math.rb +17 -0
  70. data/lib/chem/utils/prop.rb +123 -0
  71. data/lib/chem/utils/sssr.rb +101 -0
  72. data/lib/chem/utils/sub.rb +78 -0
  73. data/lib/chem/utils/transform.rb +110 -0
  74. data/lib/chem/utils/traverse.rb +37 -0
  75. data/lib/chem/utils/ullmann.rb +134 -0
  76. data/lib/graph.rb +41 -0
  77. data/lib/graph/cluster.rb +20 -0
  78. data/lib/graph/morgan.rb +38 -0
  79. data/sample/frequent_subgraph.rb +46 -0
  80. data/sample/images/ex1.rb +11 -0
  81. data/sample/images/ex2.rb +4 -0
  82. data/sample/images/ex3.rb +5 -0
  83. data/sample/images/ex4.rb +17 -0
  84. data/sample/images/ex5.rb +10 -0
  85. data/sample/images/mol/adenine.mol +26 -0
  86. data/sample/images/mol/atp.mol +69 -0
  87. data/sample/images/temp/ex5.mol +344 -0
  88. data/sample/kegg_db.rb +116 -0
  89. data/setup.rb +1551 -0
  90. data/test/all.rb +6 -0
  91. data/test/coord_test.rb +17 -0
  92. data/test/ctab_test.rb +31 -0
  93. data/test/data/A_21.tar.gz +0 -0
  94. data/test/data/A_21/aceanthrylene.cdx +0 -0
  95. data/test/data/A_21/aceanthrylene.mol +40 -0
  96. data/test/data/A_21/acenaphthylene.cdx +0 -0
  97. data/test/data/A_21/acenaphthylene.mol +31 -0
  98. data/test/data/A_21/acephenanthrylene.cdx +0 -0
  99. data/test/data/A_21/acephenanthrylene.mol +40 -0
  100. data/test/data/A_21/anthracene.cdx +0 -0
  101. data/test/data/A_21/anthracene.mol +35 -0
  102. data/test/data/A_21/as-indacene.cdx +0 -0
  103. data/test/data/A_21/as-indacene.mol +31 -0
  104. data/test/data/A_21/azulene.cdx +0 -0
  105. data/test/data/A_21/azulene.mol +26 -0
  106. data/test/data/A_21/biphenylene.cdx +0 -0
  107. data/test/data/A_21/biphenylene.mol +31 -0
  108. data/test/data/A_21/chrysene.cdx +0 -0
  109. data/test/data/A_21/chrysene.mol +44 -0
  110. data/test/data/A_21/coronen.cdx +0 -0
  111. data/test/data/A_21/coronen.mol +59 -0
  112. data/test/data/A_21/fluoranthene.cdx +0 -0
  113. data/test/data/A_21/fluoranthene.mol +40 -0
  114. data/test/data/A_21/fluorene.cdx +0 -0
  115. data/test/data/A_21/fluorene.mol +33 -0
  116. data/test/data/A_21/heptacene.cdx +0 -0
  117. data/test/data/A_21/heptacene.mol +71 -0
  118. data/test/data/A_21/heptalene.cdx +0 -0
  119. data/test/data/A_21/heptalene.mol +30 -0
  120. data/test/data/A_21/heptaphene.cdx +0 -0
  121. data/test/data/A_21/heptaphene.mol +71 -0
  122. data/test/data/A_21/hexacene.cdx +0 -0
  123. data/test/data/A_21/hexacene.mol +62 -0
  124. data/test/data/A_21/hexaphene.cdx +0 -0
  125. data/test/data/A_21/hexaphene.mol +62 -0
  126. data/test/data/A_21/indene.cdx +0 -0
  127. data/test/data/A_21/indene.mol +24 -0
  128. data/test/data/A_21/iupac.txt +41 -0
  129. data/test/data/A_21/naphthacene.cdx +0 -0
  130. data/test/data/A_21/naphthacene.mol +44 -0
  131. data/test/data/A_21/naphthalene.cdx +0 -0
  132. data/test/data/A_21/naphthalene.mol +26 -0
  133. data/test/data/A_21/ovalene.cdx +0 -0
  134. data/test/data/A_21/ovalene.mol +78 -0
  135. data/test/data/A_21/pentacene.cdx +0 -0
  136. data/test/data/A_21/pentacene.mol +53 -0
  137. data/test/data/A_21/pentalene.cdx +0 -0
  138. data/test/data/A_21/pentalene.mol +22 -0
  139. data/test/data/A_21/pentaphene.cdx +0 -0
  140. data/test/data/A_21/pentaphene.mol +53 -0
  141. data/test/data/A_21/perylene.cdx +0 -0
  142. data/test/data/A_21/perylene.mol +49 -0
  143. data/test/data/A_21/phenalene.cdx +0 -0
  144. data/test/data/A_21/phenalene.mol +33 -0
  145. data/test/data/A_21/phenanthrene.cdx +0 -0
  146. data/test/data/A_21/phenanthrene.mol +35 -0
  147. data/test/data/A_21/picene.cdx +0 -0
  148. data/test/data/A_21/picene.mol +53 -0
  149. data/test/data/A_21/pleiadene.cdx +0 -0
  150. data/test/data/A_21/pleiadene.mol +44 -0
  151. data/test/data/A_21/pyranthrene.cdx +0 -0
  152. data/test/data/A_21/pyranthrene.mol +72 -0
  153. data/test/data/A_21/pyrene.cdx +0 -0
  154. data/test/data/A_21/pyrene.mol +40 -0
  155. data/test/data/A_21/rubicene.cdx +0 -0
  156. data/test/data/A_21/rubicene.mol +63 -0
  157. data/test/data/A_21/s-indacene.cdx +0 -0
  158. data/test/data/A_21/s-indacene.mol +31 -0
  159. data/test/data/A_21/tetraphenylene.cdx +0 -0
  160. data/test/data/A_21/tetraphenylene.mol +57 -0
  161. data/test/data/A_21/trinaphthylene.cdx +0 -0
  162. data/test/data/A_21/trinaphthylene.mol +71 -0
  163. data/test/data/A_21/triphenylene.cdx +0 -0
  164. data/test/data/A_21/triphenylene.mol +44 -0
  165. data/test/data/C00147.kcf +25 -0
  166. data/test/data/G00147.kcf +13 -0
  167. data/test/data/atp.mol +69 -0
  168. data/test/data/cyclohexane.mol +17 -0
  169. data/test/data/cyclohexane.ps +485 -0
  170. data/test/data/fullerene.mol +155 -0
  171. data/test/data/glycan +33 -0
  172. data/test/data/hypericin.cdx +0 -0
  173. data/test/data/hypericin.cdxml +596 -0
  174. data/test/data/hypericin.chm +0 -0
  175. data/test/data/hypericin.ct +85 -0
  176. data/test/data/hypericin.f1d +0 -0
  177. data/test/data/hypericin.f1q +0 -0
  178. data/test/data/hypericin.gif +0 -0
  179. data/test/data/hypericin.mol +88 -0
  180. data/test/data/hypericin.mol2 +159 -0
  181. data/test/data/hypericin.msm +123 -0
  182. data/test/data/hypericin.pdf +359 -0
  183. data/test/data/hypericin.png +0 -0
  184. data/test/data/hypericin.ps +0 -0
  185. data/test/data/hypericin.skc +0 -0
  186. data/test/data/hypericin2.gif +0 -0
  187. data/test/data/hypericin2.ps +0 -0
  188. data/test/data/kegg/genomes/hsa/hsa_enzyme.list +4 -0
  189. data/test/data/kegg/genomes/hsa/hsa_pfam.list +4 -0
  190. data/test/data/kegg/ligand/mol/C00147.mol +26 -0
  191. data/test/data/kegg/ligand/reaction +14 -0
  192. data/test/data/kegg/ligand/reaction.lst +1 -0
  193. data/test/data/kegg/ligand/reaction_mapformula.lst +3 -0
  194. data/test/data/reaction +14 -0
  195. data/test/data/reaction.lst +1 -0
  196. data/test/data/reaction_mapformula.lst +3 -0
  197. data/test/data/rxn/C00001.mol +6 -0
  198. data/test/data/rxn/C00011.mol +10 -0
  199. data/test/data/rxn/C00014.mol +6 -0
  200. data/test/data/rxn/C01010.mol +18 -0
  201. data/test/data/rxn/sample.rxn +50 -0
  202. data/test/data/rxn/substitution.rxn +45 -0
  203. data/test/data/test.eps +0 -0
  204. data/test/data/test.mol +28 -0
  205. data/test/data/test.sdf +143 -0
  206. data/test/data/test.skc +0 -0
  207. data/test/data/test.xyz +4 -0
  208. data/test/data/test_lf.sdf +143 -0
  209. data/test/heavy_test_pubchem.rb +16 -0
  210. data/test/multiple_test.rb +22 -0
  211. data/test/test_adj.rb +54 -0
  212. data/test/test_canonical_smiles.rb +46 -0
  213. data/test/test_cdx.rb +32 -0
  214. data/test/test_chem.rb +18 -0
  215. data/test/test_cluster.rb +19 -0
  216. data/test/test_db.rb +11 -0
  217. data/test/test_eps.rb +24 -0
  218. data/test/test_geometry.rb +11 -0
  219. data/test/test_gspan.rb +28 -0
  220. data/test/test_iupac.rb +36 -0
  221. data/test/test_kcf.rb +24 -0
  222. data/test/test_kcf_glycan.rb +10 -0
  223. data/test/test_kegg.rb +118 -0
  224. data/test/test_linucs.rb +21 -0
  225. data/test/test_mdl.rb +45 -0
  226. data/test/test_mol2.rb +62 -0
  227. data/test/test_morgan.rb +21 -0
  228. data/test/test_pdf.rb +12 -0
  229. data/test/test_prop.rb +86 -0
  230. data/test/test_rmagick.rb +15 -0
  231. data/test/test_sbdb.rb +23 -0
  232. data/test/test_sdf.rb +30 -0
  233. data/test/test_smiles.rb +84 -0
  234. data/test/test_sssr.rb +18 -0
  235. data/test/test_sub.rb +47 -0
  236. data/test/test_subcomp.rb +37 -0
  237. data/test/test_traverse.rb +29 -0
  238. data/test/test_writer.rb +13 -0
  239. data/test/test_xyz.rb +15 -0
  240. data/test/type_test.rb +25 -0
  241. 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
@@ -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