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,30 @@
1
+
2
+ module Chem
3
+
4
+ module Type
5
+
6
+ module SybylType
7
+
8
+ def self.detect_file file
9
+ File.extname(file) == '.mol2'
10
+ end
11
+
12
+ def self.parse file
13
+ require 'chem/db/sybyl'
14
+ mol = Chem::Sybyl::SybylMolecule.new file
15
+ end
16
+
17
+ def self.detect_type type
18
+ type == :sybyl
19
+ end
20
+
21
+ def self.save mol, filename
22
+ mol.save_as_mdl(filename)
23
+ end
24
+
25
+ end
26
+ end
27
+
28
+ ChemTypeRegistry << Type::SybylType
29
+
30
+ end
@@ -0,0 +1,26 @@
1
+
2
+ module Chem
3
+
4
+ module Type
5
+ module XyzType
6
+
7
+ def self.detect_file file
8
+ File.extname(file) == '.xyz'
9
+ end
10
+
11
+ def self.parse file
12
+ require 'chem/db/xyz.rb'
13
+ mol = XYZ::XyzMolecule.new
14
+ mol.open_xyz file
15
+ end
16
+
17
+ def self.detect_type type
18
+ type == :sdf
19
+ end
20
+
21
+ end
22
+ end
23
+
24
+ ChemTypeRegistry << Type::XyzType
25
+
26
+ end
@@ -0,0 +1,128 @@
1
+
2
+ module Chem
3
+ module Molecule
4
+ # Explicitly save molecule as PDF
5
+ # = Example:
6
+ # mol = Chem.open_mol("benzene.mol")
7
+ # mol.save_as_pdf("benzene.pdf")
8
+ # mol.save("benzene.pdf", :type => :pdf)
9
+ # mol.save("benzene.pdf") # File type will automatically detected from file extensions
10
+ #
11
+ def save_as_pdf out, params = {}
12
+ v = PDFWriter.new(self, params)
13
+ v.save(out)
14
+ end
15
+
16
+ end
17
+
18
+ module Atom
19
+ # position vector for visualization
20
+ attr_accessor :v_pos
21
+ end
22
+
23
+ module Writer
24
+
25
+ def fbox # :nodoc:
26
+ n = @params[:orig_point]
27
+ m = [@params[:size][0] + n[0], @params[:size][1] + n[1]]
28
+ line([m[0], m[1]], [m[0], n[1]], [0, 0, 0])
29
+ line([m[0], m[1]], [n[0], m[1]], [0, 0, 0])
30
+ line([m[0], n[1]], [n[0], n[1]], [0, 0, 0])
31
+ line([n[0], m[1]], [n[0], n[1]], [0, 0, 0])
32
+ end
33
+
34
+ def draw_body # :nodoc:
35
+ self.fbox() if @params[:fbox]
36
+ @mol.edges.each do |bond, atom1, atom2|
37
+ bond.color = [0, 0, 0] unless bond.color
38
+ a1 = atom1.v_pos.dup
39
+ a2 = atom2.v_pos.dup
40
+ diff = a1 - a2
41
+ len = diff.r
42
+ # 20 % shorter
43
+ a1 = a1 - diff * (@default_pointsize / len / 2.5) if atom1.visible
44
+ a2 = a2 + diff * (@default_pointsize / len / 2.5) if atom2.visible
45
+
46
+ vert = Vector[- diff[1], diff[0], 0]
47
+
48
+ case bond.stereo
49
+ when :up
50
+ fill([a1, a2 + vert * 0.1, a2 - vert * 0.1], bond.color)
51
+ when :down
52
+ 7.times do |n|
53
+ line(a1 - diff * (1.0/ 8) * n + vert * 0.015 * n,
54
+ a1 - diff * (1.0/ 8) * n - vert * 0.015 * n,
55
+ bond.color)
56
+ end
57
+ else
58
+ line(a1, a2, bond.color)
59
+ if bond.v == 2
60
+ v = Vector[atom1.x - atom2.x, atom1.y - atom2.y]
61
+ @mol.adjacent_to(atom1).each do |e, node|
62
+ next if node == atom2
63
+ vv = Vector[atom1.x - node.x, atom1.y - node.y]
64
+ #p a = v.inner_product(vv) / v.r / vv.r
65
+ #p Math.acos(a)
66
+ end
67
+ line(a1 - vert * 0.15 - diff * 0.1,
68
+ a2 - vert * 0.15 + diff * 0.1,
69
+ bond.color)
70
+ end
71
+ end
72
+ end
73
+ @mol.nodes.each do |atom|
74
+ params = {}
75
+ params[:color] = atom.color if atom.color
76
+ if atom.visible
77
+ text(atom.element.to_s, atom.v_pos[0], atom.v_pos[1], params)
78
+ end
79
+ end
80
+ end
81
+
82
+ # Constructors for Vector graphics
83
+ # Accepts several options
84
+ # :fbox:: true # black line frame
85
+ # :upside_down:: true # turns images upside down
86
+ # :size:: [10, 20] # set box size
87
+ # :pointsize:: 18 # set font size
88
+ def initialize mol, params
89
+ @mol = mol
90
+ @params = params
91
+
92
+ unless params[:manual] == false
93
+ mol.nodes.each do |node|
94
+ node.visible = true unless node.element == :C
95
+ end
96
+ end
97
+
98
+ @params[:fbox] = true
99
+ @min = Vector[
100
+ mol.nodes.min{|atom1, atom2| atom1.x <=> atom2.x}.x,
101
+ mol.nodes.min{|atom1, atom2| atom1.y <=> atom2.y}.y,
102
+ mol.nodes.min{|atom1, atom2| atom1.z <=> atom2.z}.z
103
+ ]
104
+ @max = Vector[
105
+ mol.nodes.max{|atom1, atom2| atom1.x <=> atom2.x}.x,
106
+ mol.nodes.max{|atom1, atom2| atom1.y <=> atom2.y}.y,
107
+ mol.nodes.max{|atom1, atom2| atom1.z <=> atom2.z}.z
108
+ ]
109
+ @size = @max - @min
110
+ @size = Vector[10.0, 10.0, 0.0] if @size[0] == 0.0 or @size[0] == 0.0
111
+ x = (@params[:size][0] - @params[:margin][0] * 2) / @size[0]
112
+ y = (@params[:size][1] - @params[:margin][1] * 2) / @size[1]
113
+ scale = x < y ? x : y
114
+ margin = Vector[@params[:margin][0], @params[:margin][1], 0]
115
+ orig = Vector[* @params[:orig_point] << 0.0]
116
+ mol.nodes.each do |atom|
117
+ atom.v_pos = (atom.pos - @min ) * scale + orig + margin
118
+ if @params[:upside_down]
119
+ atom.v_pos = Vector[
120
+ atom.v_pos[0],
121
+ @params[:size][1] + @params[:margin][1] + @params[:orig_point][1] - atom.v_pos[1],
122
+ atom.v_pos[2]]
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
128
+
@@ -0,0 +1,39 @@
1
+ # Chime XYZ parser
2
+
3
+ module Chem
4
+
5
+ module XYZ
6
+
7
+ class XyzAtom
8
+ include Atom
9
+ include Chem::Transform::ThreeDimension
10
+ end
11
+
12
+ class XyzMolecule
13
+
14
+ include Molecule
15
+
16
+ def initialize
17
+ super
18
+ @nodes = []
19
+ end
20
+
21
+ def open_xyz filename
22
+ xyz = open(filename, "r")
23
+ n_atoms = xyz.readline.to_i
24
+ title = xyz.readline
25
+ n_atoms.times do |n|
26
+ array = xyz.readline.split
27
+ a = XyzAtom.new
28
+ a.element, a.x, a.y, a.z = array[0].intern, array[1].to_f, array[2].to_f, array[3].to_f
29
+ @nodes.push(a)
30
+ end
31
+ self
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+
@@ -0,0 +1,119 @@
1
+ #
2
+ # model.rb - Abstract Model for Molecule, Atom and Bond
3
+ #
4
+ #
5
+ # $Id: model.rb 61 2005-10-12 09:17:39Z tanaka $
6
+ #
7
+
8
+ require 'graph'
9
+
10
+ module Chem
11
+
12
+ # Atom module is top level abstract module for atom in molecule.
13
+ # It will be mixed-in to other concrete class.
14
+
15
+ module Atom
16
+ # true if visible (for visualization)
17
+ attr_accessor :visible
18
+ # [r, g, b]
19
+ attr_accessor :color
20
+
21
+ # atomic symbol (Symbol object)
22
+ attr_accessor :element
23
+
24
+ # x-axis position
25
+ attr_accessor :x
26
+
27
+ # y-axis position
28
+ attr_accessor :y
29
+
30
+ # z-axis position
31
+ attr_accessor :z
32
+
33
+ # charge
34
+ attr_accessor :charge
35
+
36
+ # atomic mass
37
+ attr_accessor :mass
38
+
39
+ # Returns Atomic Number.
40
+ # If unknown return 100.
41
+ def atomic_number
42
+ Number2Element.index(element) ? Number2Element.index(element) : 100
43
+ end
44
+
45
+ # Returns atomic mass
46
+ def mass
47
+ return @mass if @mass
48
+ return Chem::AtomicWeight[element] + @mass_difference if @mass_difference
49
+ Chem::AtomicWeight[element]
50
+ end
51
+
52
+ end
53
+
54
+ module Bond
55
+ # Returns valency of bond
56
+ # use bond_type
57
+ attr_accessor :v
58
+
59
+ # Returns Bond Stereo
60
+ # this method may be overridden by concrete class
61
+ # :not_stereo:: Not Stereo
62
+ # :up:: Up
63
+ # :down:: Down
64
+ # :cis_trans:: Cis or Trans
65
+ # :either:: Either
66
+ def stereo ; :either ; end
67
+
68
+ # Returns Bond Type
69
+ # this method may be overridden by concrete class
70
+ # :single:: Single bond
71
+ # :double:: Double bond
72
+ # :triple:: Triple bond
73
+ # :aromatic:: Aromatic Bond
74
+ # :single_or_double:: Single or Double bond
75
+ # :single_or_aromatic:: Single or Aromatic bond
76
+ # :double_or_aromatic:: Double or Aromatic bond
77
+ # :any:: Any bond
78
+ def bond_type ; :any ; end
79
+
80
+ # Returns Topology of bond
81
+ # this method may be overridden by concrete class
82
+ # :either:: Either
83
+ # :ring:: Ring
84
+ # :chain:: Chain
85
+ def topology ; :either ; end
86
+
87
+ attr_accessor :color # set [r, g, b] for visualization
88
+
89
+ end
90
+
91
+ module Reaction
92
+
93
+ end
94
+
95
+ module Molecule
96
+
97
+ include Graph
98
+
99
+ attr_writer :source # source of molecule
100
+ attr_writer :name # name of molecule
101
+
102
+ # Returns source of molecule.
103
+ # default value is ""
104
+ def source
105
+ @source ? @source : ""
106
+ end
107
+
108
+ # Returns name of molecule.
109
+ # default value is self.source
110
+ def name
111
+ @name ? @name : self.souce
112
+ end
113
+
114
+ end
115
+
116
+ end
117
+
118
+ require 'chem/model/skeleton'
119
+
@@ -0,0 +1,37 @@
1
+
2
+ module Chem
3
+
4
+ class SkeletonAtom
5
+ include Atom
6
+ attr_accessor :x, :y, :z
7
+ end
8
+
9
+ class ReactionSkeleton
10
+
11
+ include Reaction
12
+
13
+ def initialize compounds
14
+ @compounds = []
15
+ @compounds[0] = get_compounds(compounds[0])
16
+ @compounds[1] = get_compounds(compounds[1])
17
+ end
18
+
19
+ def compounds
20
+ @compounds
21
+ end
22
+
23
+ private
24
+ def get_compounds(comp)
25
+ ret = {}
26
+ comp.each do |c|
27
+ if c.kind_of?(Array)
28
+ ret[c[0]] = c[1]
29
+ else
30
+ ret[c] = 1
31
+ end
32
+ end
33
+ ret
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,11 @@
1
+ require 'chem/utils/math'
2
+ require 'chem/utils/transform'
3
+ require 'chem/utils/sssr'
4
+ require 'chem/utils/traverse'
5
+ require 'chem/utils/sub'
6
+
7
+ require 'chem/utils/prop'
8
+ require 'chem/utils/geometry'
9
+
10
+ require 'chem/utils/ullmann'
11
+ require 'chem/utils/graph_db'
@@ -0,0 +1,27 @@
1
+
2
+ module Chem
3
+
4
+ module Molecule
5
+
6
+ # Automatically assigns 2-dimensional geometry
7
+ # This method may implicitly called from ChemRuby
8
+ # if nil is assigned to Atom#x
9
+ def assign_2d_geometry
10
+ geometrical_type(nodes[0])
11
+ end
12
+
13
+ private
14
+ #
15
+ def geometrical_type atom
16
+ # adj = adjacent_to(atom)
17
+ # case adj.length
18
+ # when 1
19
+ # when 2
20
+ # when 3
21
+ # when 4
22
+ # end
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,146 @@
1
+
2
+ require 'chem'
3
+ require 'dbm'
4
+
5
+ module Graph
6
+
7
+ class SubGraphDB
8
+
9
+ # Create Database object
10
+ # @idx : index database for @mat and @typ
11
+ # also stores number of nodes.
12
+ # @mat : adjacency matrix database
13
+ # @typ : node type database
14
+ # @dbm : property database
15
+ def initialize dbname, mode = "w"
16
+ @dbm = DBM.open("#{dbname}.dbm")
17
+ @idx = open("#{dbname}.idx", mode)
18
+ @mat = open("#{dbname}.mat", mode)
19
+ @typ = open("#{dbname}.typ", mode)
20
+ end
21
+
22
+ def self.open dbname, mode = "r"
23
+ if mode == "r"
24
+ SubGraphDB.new(dbname, mode)
25
+ else
26
+ self.new(dbname, mode)
27
+ end
28
+ end
29
+
30
+ def []= key, mol
31
+ adj = mol.adj_matrix
32
+ @idx.print [mol.nodes.length, @mat.tell, adj.length].pack("i*")
33
+ @mat.print adj
34
+ @typ.print mol.nodes.inject([]){ |ret, node| ret.push(node.atomic_number)}.pack("i*")
35
+ end
36
+
37
+ # Closes database
38
+ def close
39
+ @dbm.close
40
+ @idx.close
41
+ @mat.close
42
+ @typ.close
43
+ end
44
+
45
+ # Searches molecule from database
46
+ # Example:
47
+ # db = SubGraphDB.open("somewhere/dbname")
48
+ # db.search(SMILES("CCCC"))
49
+ def search mol
50
+ @idx.rewind
51
+ i = 1
52
+ until @idx.eof?
53
+ n_nodes, mat, len_matrix = @idx.read(4 * 3).unpack("i*")
54
+ m = [0xff].pack("c") * 100
55
+ open("test.bin", "w").puts m
56
+
57
+ matrix = read_mat(mat, len_matrix)
58
+ #SubGraphDB.show(m, mol.nodes.length, n_nodes)
59
+ if SubGraphDB.match(matrix, n_nodes, mol.adjacency_list, mol.nodes.length, m)
60
+ puts "C%05d" % i
61
+ end
62
+ i += 1
63
+ end
64
+ end
65
+
66
+ private
67
+ def read_mat idx, len_matrix
68
+ @mat.seek(idx)
69
+ @mat.read(len_matrix)
70
+ end
71
+
72
+ end
73
+
74
+ end
75
+
76
+ __END__
77
+ require 'chem/utils/subgraph/subcomp'
78
+
79
+ module Chem
80
+ def self.open_db db_name
81
+ GraphDB.new(db_name)
82
+ end
83
+ end
84
+
85
+ class GraphDB
86
+
87
+ # def self.open db_name
88
+ # self.new(db_name)
89
+ # end
90
+
91
+ # def initialize db_name, mode="w"
92
+ # if mode == "a"
93
+ # @idx = File.open("#{db_name}.idx", "r+")
94
+ # else
95
+ # @idx = File.open("#{db_name}.idx", mode)
96
+ # end
97
+ # @typ = File.open("#{db_name}.typ", mode)
98
+ # @dat = File.open("#{db_name}.dat", mode)
99
+ # @num = File.open("#{db_name}.num", mode)
100
+ # @typ.print("NodeType ISAM")
101
+ # @dat.print("Adjacency ISAM")
102
+ # end
103
+
104
+ def insert mol
105
+ n_bytes = mol.nodes.length / ($ARC * 8.0)
106
+
107
+ # @typ.flush
108
+ # @dat.flush
109
+ # @idx.flush
110
+
111
+ # record_num = @idx.tell
112
+ # @idx.print [@typ.tell, @dat.tell].pack("ii")
113
+
114
+ # @typ.print [mol.nodes.length, mol.edges.length].pack("ii")
115
+ # @dat.print [n_bytes.ceil].pack("i")
116
+
117
+ # @typ.print mol.nodes.collect { |node|
118
+ # Chem::Element2Number[node.element]
119
+ # }.pack("i*")
120
+
121
+ # mol.nodes.each do |k|
122
+ # atom_type = mol.atoms[k].setup_graph(i)
123
+ # @typ.print [atom_type].pack("i")
124
+ # end
125
+
126
+
127
+ # @dat.print [n_bytes.ceil].pack("i")
128
+ # j = 0
129
+ # mol.atoms.keys.sort.each do |k|
130
+ # 0.upto(n_bytes.ceil - 1) do |o|
131
+ # i = 0
132
+ # mol.atoms[k].set_neighbor
133
+ # 0.upto($ARC * 8 - 1) do |m|
134
+ # i += mol.atoms[k].neighbor.include?(mol.atoms[m + 8 * $ARC * o + 1]) ? 2**m : 0
135
+ # end
136
+ # @dat.print [i].pack("L")
137
+ # end
138
+ # j += 1
139
+ # end
140
+ # #p mol.adjacency_list
141
+ # mol.connection.each do |c|
142
+ # puts "%040b" % c
143
+ # end
144
+ #record_num
145
+ end
146
+ end