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