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.
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