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