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,12 @@
1
+ #!/usr/local/bin/ruby
2
+
3
+ molconn = open(ARGV.shift, "r")
4
+ molconn.readline
5
+ molconn.readline
6
+ while !molconn.eof?
7
+ line = molconn.readline
8
+ if /-1/ !~ line
9
+ num, code, element, *connection = line.split(',')
10
+ puts connection.join(' ')
11
+ end
12
+ end
@@ -0,0 +1,88 @@
1
+ #
2
+ # chem/mopac.rb - MOPAC7 format class
3
+ #
4
+
5
+ require 'chem/molecule'
6
+ require 'scanf'
7
+
8
+ module Chem
9
+ module Mopac7
10
+ class MopacReader
11
+ def initialize entry
12
+ ea = entry.split("\n")
13
+ n_line = 0
14
+ 0.upto(ea.length) do |n|
15
+ n_line = n if /SCF FIELD WAS ACHIEVED/ =~ ea[n]
16
+ end
17
+ n_atom = 0
18
+ n_line.upto(ea.length) do |n|
19
+ line = ea[n]
20
+ if /FINAL HEAT OF FORMATION =\s+(\d+.\d+) KCAL/ =~ line
21
+ @heat_of_formation = $1.to_f
22
+ elsif /TOTAL ENERGY/ =~ line
23
+ @total_energy = line.scanf("TOTAL ENERGY =%f")
24
+ elsif /ELECTRONIC ENERGY/ =~ line
25
+ @electronic_energy = line.scanf("ELECTRONIC ENERGY =%f")
26
+ elsif /CORE-CORE REPULSION/ =~ line
27
+ @core_core_repulstion = line.scanf("CORE-CORE REPULSION =%f")
28
+ elsif /GRADIENT NORM/ =~ line
29
+ @gradient_norm = line.scanf("GRADIENT NORM =%f")
30
+ elsif /IONIZATION POTENTIAL/ =~ line
31
+ @ionization_potential = line.scanf("IONIZATION POTENTIAL =%f")
32
+ elsif /NO. OF FILLED LEVELS/ =~ line
33
+ @no_of_filled_levels = line.scanf("NO. OF FILLED LEVELS =%d")
34
+ elsif /MOLECULAR WEIGHT/ =~ line
35
+ @molecular_weight = line.scanf("MOLECULAR WEIGHT =%f")
36
+ elsif / ATOM CHEMICAL BOND LENGTH BOND ANGLE TWIST ANGLE/ =~ line
37
+ Range.new(n+4, ea.length).each do |l|
38
+ if '' == ea[l]
39
+ n_atom = l - n - 4
40
+ break
41
+ end
42
+ if /^ 1/ =~ ea[l]
43
+ ea[l].scanf("%d%s")
44
+ elsif /^ 2/ =~ ea[l]
45
+ ea[l].scanf("%d%s%f*%d")
46
+ elsif /^ 3/ =~ ea[l]
47
+ ea[l].scanf("%d%s%f*%f*%d%d")
48
+ else
49
+ ea[l].scanf("%d%s%f*%f*%f*%d%d%d")
50
+ end
51
+ end
52
+ elsif /INTERATOMIC DISTANCES/ =~ line
53
+ @distances = {}
54
+ reduced = 0
55
+ first = n + 3 + 1
56
+
57
+ while n_atom - reduced> 0
58
+ Range.new(first, first + n_atom - reduced - 1).each do |l|
59
+ ary = ea[l].scanf("%s%d"+"%f"* (l - first + 1))
60
+ 1.upto(l - first + 1) do |ll|
61
+ @distances[[ary[1], ll + reduced]] = ary[ll + 1]
62
+ @distances[[ll + reduced, ary[1]]] = ary[ll + 1]
63
+ end
64
+ end
65
+ first = first + n_atom - reduced + 3
66
+ reduced = reduced + 6
67
+ end
68
+ # 1.upto(n_atom) do |nn|
69
+ # print "%3d" % nn
70
+ # 1.upto(n_atom) do |mm|
71
+ # print " %3f" % @distances[[nn, mm]] if @distances[[nn, mm]]
72
+ # end
73
+ # puts
74
+ # end
75
+ elsif /MOLECULAR POINT GROUP/ =~ line
76
+ @symmetry = line.scanf("MOLECULAR POINT GROUP :%s")
77
+ elsif /EIGENVECTORS/
78
+
79
+ end
80
+ end
81
+ end
82
+ def MopacReader.open_out file
83
+ MopacReader.new(File.open(file, 'r').gets(nil))
84
+ end
85
+ end
86
+ end
87
+ end
88
+
@@ -0,0 +1,107 @@
1
+ #!/usr/local/bin/ruby
2
+
3
+ require 'chem/molecule'
4
+ require 'scanf'
5
+
6
+ module Chem
7
+
8
+ # parser for msi file
9
+ # MSI : Molecular Simulation Inc.
10
+ module MSI
11
+
12
+ module MSIObject
13
+
14
+ attr_accessor :parent, :child, :prop
15
+
16
+ def initialize n = 0
17
+ @prop = {}
18
+ @n = n
19
+ end
20
+
21
+ def child= child
22
+ @child = child
23
+ child.parent = self
24
+ end
25
+
26
+ end
27
+
28
+ class MSIFile
29
+ include MSIObject
30
+ end
31
+
32
+ class Model < Molecule
33
+ include MSIObject
34
+ end
35
+
36
+ class MSIAtom < Atom
37
+
38
+ include MSIObject
39
+
40
+ def b
41
+ @prop['Atom1']
42
+ end
43
+
44
+ def e
45
+ @prop['Atom2']
46
+ end
47
+
48
+ end
49
+
50
+ class MSIBond < Bond
51
+ include MSIObject
52
+ end
53
+
54
+ class MSIReader
55
+
56
+ def MSIReader.open input
57
+ MSIReader.new(input)
58
+ end
59
+
60
+ def model
61
+ @top
62
+ end
63
+
64
+ def initialize input
65
+ @objects = {}
66
+ @input = input
67
+ end
68
+
69
+ def read
70
+ current = MSIFile.new
71
+ @top = current
72
+ @input.each_line do |l|
73
+ if /\((\d+) (\S+)/ =~ l
74
+ case $2
75
+ when 'Model'
76
+ current.child = Model.new($1)
77
+ current = current.child
78
+ when 'Atom'
79
+ current.child = MSIAtom.new($1)
80
+ current = current.child
81
+ when 'Bond'
82
+ current.child = MSIBond.new($1)
83
+ current = current.child
84
+ end
85
+ @objects[$1.to_i] = current
86
+ elsif /\(A (\S) (\S+) (.+)\)/ =~ (l)
87
+ case $1
88
+ when 'C'
89
+ current.prop[$2] = $3
90
+ when 'I'
91
+ current.prop[$2] = $3.to_i
92
+ when 'O'
93
+ current.prop[$2] = @objects[$3.to_i]
94
+ when 'D'
95
+ current.prop[$2] = $3.scanf("(%f %f %f")
96
+ end
97
+ elsif /\s+\)/ =~ l
98
+ current = current.parent
99
+ end
100
+ end
101
+ end
102
+
103
+ end
104
+
105
+ end
106
+ end
107
+
@@ -0,0 +1,115 @@
1
+ require 'chem/molecule'
2
+
3
+ module Chem
4
+ class PdbDic
5
+ class PdbDicAtom < Atom
6
+ attr_reader :atom_id, :neighbor
7
+ def initialize atom_id
8
+ @bonds = []
9
+ @neighbor = []
10
+ @atom_id = atom_id
11
+ set_element
12
+ end
13
+ def set_element
14
+ # Heuristically set element. Any idea?
15
+ case @atom_id.gsub(/(\d|[*'\"])/, '').upcase
16
+ when /S/
17
+ @element = 'S'
18
+ when 'B'
19
+ @elmenet = 'B'
20
+ when /^BR/
21
+ @element = 'Br'
22
+ when /^MO/
23
+ @element = 'MO'
24
+ when /^W/
25
+ @element = 'W'
26
+ when /^I/
27
+ @element = 'I'
28
+ when /CL/
29
+ @element = 'Cl'
30
+ when /^A?B?C/
31
+ @element = 'C'
32
+ when /^A?B?H/
33
+ @element = 'H'
34
+ when /^A?N/
35
+ @element = 'N'
36
+ when /^A?O/
37
+ @element = 'O'
38
+ when /^A?P/
39
+ @element = 'P'
40
+ when /^F/
41
+ @element = 'F'
42
+ else
43
+ puts @atom_id
44
+ end
45
+ end
46
+ end
47
+ class PdbDicBond < Bond
48
+ attr_accessor :v
49
+ end
50
+ class PdbDicMolecule < Molecule
51
+ attr_reader :atoms, :bonds
52
+ def initialize
53
+ @atoms = {}
54
+ @bonds = []
55
+ end
56
+ end
57
+
58
+ attr_reader :mols
59
+ def initialize file, &block
60
+ @mols = {}
61
+ parse(file, &block)
62
+ end
63
+
64
+ def parse file, &block
65
+ i = 0
66
+ @input = File.open(file, 'r')
67
+ res = nil
68
+ while !@input.eof?
69
+ line = @input.readline
70
+ case line
71
+ when /^RESIDUE/
72
+ mol = PdbDicMolecule.new
73
+ res = line.split[1]
74
+ @mols[res] = mol
75
+ # if line.split[1] == 'ACY'
76
+ # puts 'Found ACY'
77
+ # exit
78
+ # end
79
+ # puts "'%s'" % line[0..5]
80
+ when /^CONECT/
81
+ atom = mol.atoms[line[11..15].strip] ||= PdbDicAtom.new(line[11..15].strip)
82
+ line[20..-1].chop.split.each do |atom_id|
83
+ if ! mol.atoms[atom_id]
84
+ atom2 = PdbDicAtom.new(atom_id)
85
+ mol.atoms[atom_id] = atom2
86
+ bond = PdbDicBond.new
87
+ bond.b = atom
88
+ bond.e = atom2
89
+ bond.v = 1
90
+ mol.bonds.push(bond)
91
+ end
92
+ end
93
+ when "\n"
94
+ mol.bonds.each do |bond|
95
+ bond.b.neighbor.push(bond.e) if ! bond.b.neighbor.include?(bond.e)
96
+ bond.e.neighbor.push(bond.b) if ! bond.e.neighbor.include?(bond.b)
97
+ end
98
+ # i += 1
99
+ if block
100
+ yield res, mol
101
+ end
102
+ return if i >= 100
103
+ else
104
+ # puts line
105
+ end
106
+ end
107
+ end
108
+ def PdbDic.each file, &block
109
+ PdbDic.new(file, &block)
110
+ end
111
+ def PdbDic.open(file, &block)
112
+ PdbDic.new(file, &block)
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,131 @@
1
+
2
+ require 'chem/db/vector'
3
+
4
+ module Chem
5
+ class PDFWriter
6
+
7
+ include Writer
8
+
9
+ PDFHeader = <<EOL
10
+ %PDF-1.3
11
+ 1 0 obj
12
+ << /Type /Catalog
13
+ /Outlines 2 0 R
14
+ /Pages 3 0 R
15
+ >>
16
+ endobj
17
+ 2 0 obj
18
+ << /Type /Outlines
19
+ /Count 0
20
+ >>
21
+ endobj
22
+ 3 0 obj
23
+ << /Type /Pages
24
+ /Kids [ 4 0 R]
25
+ /Count 1
26
+ >>
27
+ endobj
28
+ 4 0 obj
29
+ << /Type /Page
30
+ /Parent 3 0 R
31
+ EOL
32
+
33
+ PDFMiddle = <<EOL
34
+ /Contents 5 0 R
35
+ /Resources << /ProcSet 6 0 R
36
+ /Font << /F1 7 0 R >>
37
+ >>
38
+ >>
39
+ endobj
40
+ 5 0 obj
41
+ EOL
42
+
43
+ PDFFooter = <<EOL
44
+ endstream
45
+ endobj
46
+ 6 0 obj
47
+ [ /PDF /Text ]
48
+ endobj
49
+ 7 0 obj
50
+ << /Type /Font
51
+ /Subtype /Type1
52
+ /Name /F1
53
+ /BaseFont /Helvetica
54
+ /Encoding /MacRomanEncoding
55
+ >>
56
+ endobj
57
+ xref
58
+ 0 8
59
+ 0000000000 65535 f
60
+ 0000000009 00000 n
61
+ 0000000074 00000 n
62
+ 0000000120 00000 n
63
+ 0000000179 00000 n
64
+ 0000000364 00000 n
65
+ 0000000466 00000 n
66
+ 0000000496 00000 n
67
+ trailer
68
+ << /Size 8
69
+ /Root 1 0 R
70
+ >>
71
+ startxref
72
+ 625
73
+ %%EOF
74
+ EOL
75
+
76
+ def initialize mol, params
77
+ params[:size] ||= [180, 200]
78
+ params[:orig_point] ||= [0, 0]
79
+ params[:margin] ||= [10, 10]
80
+ @default_pointsize = (params[:pointsize] ? params[:pointsize] : 14)
81
+ super
82
+ end
83
+
84
+ def line(from, to, color)
85
+ @vect << color.join(' ') + " RG"
86
+ @vect << "#{from[0]} #{from[1]} m"
87
+ @vect << "#{to[0]} #{to[1]} l"
88
+ @vect << "S"
89
+ end
90
+
91
+ def fill(nodes, color)
92
+ @vect << "0 w" # setline width
93
+ @vect << color.join(' ') + " RG" # set setrgbcolor
94
+ @vect << "%d %d m" % [nodes[0][0], nodes[0][1]]
95
+ nodes[1..-1].each do |vect|
96
+ @vect << "%d %d l" % [vect[0], vect[1]]
97
+ end
98
+ @vect << "b"
99
+ @vect << "1 w" # setline width
100
+ end
101
+
102
+ def text(str, x, y, params = {})
103
+ @vect << "BT"
104
+ @vect << "/F1 #{@params[:font]} Tf"
105
+ @vect << "1 0 0 1 #{x - @params[:font] * 0.4} #{y - @params[:font] * 0.4} Tm"
106
+ @vect << "(#{str}) Tj"
107
+ @vect << "ET"
108
+ end
109
+
110
+ def save out
111
+ @out = out
112
+ @params[:font] ||= 12.0
113
+ @params[:orig_point] ||= [0, 0]
114
+ @vect = ["q"]
115
+ @vect << "1 0 0 1 #{@params[:orig_point][0]} #{@params[:orig_point][1]} cm"
116
+ @out.puts(PDFHeader)
117
+ @out.puts "/MediaBox [ 0 0 %d %d]" % @params[:size]
118
+ @out.puts PDFMiddle
119
+
120
+ draw_body
121
+
122
+ @vect << "Q"
123
+ str = @vect.join("\n")
124
+
125
+ @out.puts "<< /Length #{str.length} >> stream"
126
+ @out.puts str
127
+ @out.puts PDFFooter
128
+ end
129
+
130
+ end
131
+ end