chemruby 0.9.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README +120 -0
- data/Rakefile +195 -0
- data/ext/extconf.rb +4 -0
- data/ext/subcomp.c +416 -0
- data/lib/chem.rb +130 -0
- data/lib/chem/appl.rb +1 -0
- data/lib/chem/appl/chem3dole.rb +36 -0
- data/lib/chem/appl/tinker/nucleic.rb +40 -0
- data/lib/chem/appl/tinker/tinker_reader.rb +43 -0
- data/lib/chem/data.rb +4 -0
- data/lib/chem/data/atomic_weight.rb +124 -0
- data/lib/chem/data/character.rb +2 -0
- data/lib/chem/data/electronegativity.rb +14 -0
- data/lib/chem/data/periodic_table.rb +6 -0
- data/lib/chem/data/prime_numbers.rb +1 -0
- data/lib/chem/data/vdw_radii.rb +1 -0
- data/lib/chem/db.rb +64 -0
- data/lib/chem/db/cansmi.rb +234 -0
- data/lib/chem/db/cdx.rb +1525 -0
- data/lib/chem/db/eps.rb +164 -0
- data/lib/chem/db/g98.rb +909 -0
- data/lib/chem/db/gspan.rb +130 -0
- data/lib/chem/db/iupac.rb +5 -0
- data/lib/chem/db/iupac/a_1.rb +46 -0
- data/lib/chem/db/iupac/iuparser.rb +226 -0
- data/lib/chem/db/iupac/iuparser.ry +97 -0
- data/lib/chem/db/iupac/postfix.rb +2 -0
- data/lib/chem/db/kcf.rb +390 -0
- data/lib/chem/db/kcf_glycan.rb +19 -0
- data/lib/chem/db/kegg.rb +516 -0
- data/lib/chem/db/linucs/linparser.rb +144 -0
- data/lib/chem/db/linucs/linucs.ry +53 -0
- data/lib/chem/db/mdl.rb +379 -0
- data/lib/chem/db/molconnz.rb +12 -0
- data/lib/chem/db/mopac.rb +88 -0
- data/lib/chem/db/msi.rb +107 -0
- data/lib/chem/db/pdb_dic.rb +115 -0
- data/lib/chem/db/pdf.rb +131 -0
- data/lib/chem/db/pubchem.rb +113 -0
- data/lib/chem/db/rmagick.rb +70 -0
- data/lib/chem/db/sdf.rb +37 -0
- data/lib/chem/db/smbl.rb +88 -0
- data/lib/chem/db/smiles.rb +2 -0
- data/lib/chem/db/smiles/smiles.ry +203 -0
- data/lib/chem/db/smiles/smiparser.rb +375 -0
- data/lib/chem/db/swf.rb +74 -0
- data/lib/chem/db/sybyl.rb +150 -0
- data/lib/chem/db/tinker.rb +77 -0
- data/lib/chem/db/types/type_cansmi.rb +9 -0
- data/lib/chem/db/types/type_cdx.rb +24 -0
- data/lib/chem/db/types/type_gspan.rb +31 -0
- data/lib/chem/db/types/type_kcf.rb +28 -0
- data/lib/chem/db/types/type_kcf_glycan.rb +26 -0
- data/lib/chem/db/types/type_kegg.rb +92 -0
- data/lib/chem/db/types/type_mdl.rb +31 -0
- data/lib/chem/db/types/type_pdf.rb +33 -0
- data/lib/chem/db/types/type_png.rb +31 -0
- data/lib/chem/db/types/type_rxn.rb +25 -0
- data/lib/chem/db/types/type_sdf.rb +25 -0
- data/lib/chem/db/types/type_sybyl.rb +30 -0
- data/lib/chem/db/types/type_xyz.rb +26 -0
- data/lib/chem/db/vector.rb +128 -0
- data/lib/chem/db/xyz.rb +39 -0
- data/lib/chem/model.rb +119 -0
- data/lib/chem/model/skeleton.rb +37 -0
- data/lib/chem/utils.rb +11 -0
- data/lib/chem/utils/geometry.rb +27 -0
- data/lib/chem/utils/graph_db.rb +146 -0
- data/lib/chem/utils/math.rb +17 -0
- data/lib/chem/utils/prop.rb +123 -0
- data/lib/chem/utils/sssr.rb +101 -0
- data/lib/chem/utils/sub.rb +78 -0
- data/lib/chem/utils/transform.rb +110 -0
- data/lib/chem/utils/traverse.rb +37 -0
- data/lib/chem/utils/ullmann.rb +134 -0
- data/lib/graph.rb +41 -0
- data/lib/graph/cluster.rb +20 -0
- data/lib/graph/morgan.rb +38 -0
- data/sample/frequent_subgraph.rb +46 -0
- data/sample/images/ex1.rb +11 -0
- data/sample/images/ex2.rb +4 -0
- data/sample/images/ex3.rb +5 -0
- data/sample/images/ex4.rb +17 -0
- data/sample/images/ex5.rb +10 -0
- data/sample/images/mol/adenine.mol +26 -0
- data/sample/images/mol/atp.mol +69 -0
- data/sample/images/temp/ex5.mol +344 -0
- data/sample/kegg_db.rb +116 -0
- data/setup.rb +1551 -0
- data/test/all.rb +6 -0
- data/test/coord_test.rb +17 -0
- data/test/ctab_test.rb +31 -0
- data/test/data/A_21.tar.gz +0 -0
- data/test/data/A_21/aceanthrylene.cdx +0 -0
- data/test/data/A_21/aceanthrylene.mol +40 -0
- data/test/data/A_21/acenaphthylene.cdx +0 -0
- data/test/data/A_21/acenaphthylene.mol +31 -0
- data/test/data/A_21/acephenanthrylene.cdx +0 -0
- data/test/data/A_21/acephenanthrylene.mol +40 -0
- data/test/data/A_21/anthracene.cdx +0 -0
- data/test/data/A_21/anthracene.mol +35 -0
- data/test/data/A_21/as-indacene.cdx +0 -0
- data/test/data/A_21/as-indacene.mol +31 -0
- data/test/data/A_21/azulene.cdx +0 -0
- data/test/data/A_21/azulene.mol +26 -0
- data/test/data/A_21/biphenylene.cdx +0 -0
- data/test/data/A_21/biphenylene.mol +31 -0
- data/test/data/A_21/chrysene.cdx +0 -0
- data/test/data/A_21/chrysene.mol +44 -0
- data/test/data/A_21/coronen.cdx +0 -0
- data/test/data/A_21/coronen.mol +59 -0
- data/test/data/A_21/fluoranthene.cdx +0 -0
- data/test/data/A_21/fluoranthene.mol +40 -0
- data/test/data/A_21/fluorene.cdx +0 -0
- data/test/data/A_21/fluorene.mol +33 -0
- data/test/data/A_21/heptacene.cdx +0 -0
- data/test/data/A_21/heptacene.mol +71 -0
- data/test/data/A_21/heptalene.cdx +0 -0
- data/test/data/A_21/heptalene.mol +30 -0
- data/test/data/A_21/heptaphene.cdx +0 -0
- data/test/data/A_21/heptaphene.mol +71 -0
- data/test/data/A_21/hexacene.cdx +0 -0
- data/test/data/A_21/hexacene.mol +62 -0
- data/test/data/A_21/hexaphene.cdx +0 -0
- data/test/data/A_21/hexaphene.mol +62 -0
- data/test/data/A_21/indene.cdx +0 -0
- data/test/data/A_21/indene.mol +24 -0
- data/test/data/A_21/iupac.txt +41 -0
- data/test/data/A_21/naphthacene.cdx +0 -0
- data/test/data/A_21/naphthacene.mol +44 -0
- data/test/data/A_21/naphthalene.cdx +0 -0
- data/test/data/A_21/naphthalene.mol +26 -0
- data/test/data/A_21/ovalene.cdx +0 -0
- data/test/data/A_21/ovalene.mol +78 -0
- data/test/data/A_21/pentacene.cdx +0 -0
- data/test/data/A_21/pentacene.mol +53 -0
- data/test/data/A_21/pentalene.cdx +0 -0
- data/test/data/A_21/pentalene.mol +22 -0
- data/test/data/A_21/pentaphene.cdx +0 -0
- data/test/data/A_21/pentaphene.mol +53 -0
- data/test/data/A_21/perylene.cdx +0 -0
- data/test/data/A_21/perylene.mol +49 -0
- data/test/data/A_21/phenalene.cdx +0 -0
- data/test/data/A_21/phenalene.mol +33 -0
- data/test/data/A_21/phenanthrene.cdx +0 -0
- data/test/data/A_21/phenanthrene.mol +35 -0
- data/test/data/A_21/picene.cdx +0 -0
- data/test/data/A_21/picene.mol +53 -0
- data/test/data/A_21/pleiadene.cdx +0 -0
- data/test/data/A_21/pleiadene.mol +44 -0
- data/test/data/A_21/pyranthrene.cdx +0 -0
- data/test/data/A_21/pyranthrene.mol +72 -0
- data/test/data/A_21/pyrene.cdx +0 -0
- data/test/data/A_21/pyrene.mol +40 -0
- data/test/data/A_21/rubicene.cdx +0 -0
- data/test/data/A_21/rubicene.mol +63 -0
- data/test/data/A_21/s-indacene.cdx +0 -0
- data/test/data/A_21/s-indacene.mol +31 -0
- data/test/data/A_21/tetraphenylene.cdx +0 -0
- data/test/data/A_21/tetraphenylene.mol +57 -0
- data/test/data/A_21/trinaphthylene.cdx +0 -0
- data/test/data/A_21/trinaphthylene.mol +71 -0
- data/test/data/A_21/triphenylene.cdx +0 -0
- data/test/data/A_21/triphenylene.mol +44 -0
- data/test/data/C00147.kcf +25 -0
- data/test/data/G00147.kcf +13 -0
- data/test/data/atp.mol +69 -0
- data/test/data/cyclohexane.mol +17 -0
- data/test/data/cyclohexane.ps +485 -0
- data/test/data/fullerene.mol +155 -0
- data/test/data/glycan +33 -0
- data/test/data/hypericin.cdx +0 -0
- data/test/data/hypericin.cdxml +596 -0
- data/test/data/hypericin.chm +0 -0
- data/test/data/hypericin.ct +85 -0
- data/test/data/hypericin.f1d +0 -0
- data/test/data/hypericin.f1q +0 -0
- data/test/data/hypericin.gif +0 -0
- data/test/data/hypericin.mol +88 -0
- data/test/data/hypericin.mol2 +159 -0
- data/test/data/hypericin.msm +123 -0
- data/test/data/hypericin.pdf +359 -0
- data/test/data/hypericin.png +0 -0
- data/test/data/hypericin.ps +0 -0
- data/test/data/hypericin.skc +0 -0
- data/test/data/hypericin2.gif +0 -0
- data/test/data/hypericin2.ps +0 -0
- data/test/data/kegg/genomes/hsa/hsa_enzyme.list +4 -0
- data/test/data/kegg/genomes/hsa/hsa_pfam.list +4 -0
- data/test/data/kegg/ligand/mol/C00147.mol +26 -0
- data/test/data/kegg/ligand/reaction +14 -0
- data/test/data/kegg/ligand/reaction.lst +1 -0
- data/test/data/kegg/ligand/reaction_mapformula.lst +3 -0
- data/test/data/reaction +14 -0
- data/test/data/reaction.lst +1 -0
- data/test/data/reaction_mapformula.lst +3 -0
- data/test/data/rxn/C00001.mol +6 -0
- data/test/data/rxn/C00011.mol +10 -0
- data/test/data/rxn/C00014.mol +6 -0
- data/test/data/rxn/C01010.mol +18 -0
- data/test/data/rxn/sample.rxn +50 -0
- data/test/data/rxn/substitution.rxn +45 -0
- data/test/data/test.eps +0 -0
- data/test/data/test.mol +28 -0
- data/test/data/test.sdf +143 -0
- data/test/data/test.skc +0 -0
- data/test/data/test.xyz +4 -0
- data/test/data/test_lf.sdf +143 -0
- data/test/heavy_test_pubchem.rb +16 -0
- data/test/multiple_test.rb +22 -0
- data/test/test_adj.rb +54 -0
- data/test/test_canonical_smiles.rb +46 -0
- data/test/test_cdx.rb +32 -0
- data/test/test_chem.rb +18 -0
- data/test/test_cluster.rb +19 -0
- data/test/test_db.rb +11 -0
- data/test/test_eps.rb +24 -0
- data/test/test_geometry.rb +11 -0
- data/test/test_gspan.rb +28 -0
- data/test/test_iupac.rb +36 -0
- data/test/test_kcf.rb +24 -0
- data/test/test_kcf_glycan.rb +10 -0
- data/test/test_kegg.rb +118 -0
- data/test/test_linucs.rb +21 -0
- data/test/test_mdl.rb +45 -0
- data/test/test_mol2.rb +62 -0
- data/test/test_morgan.rb +21 -0
- data/test/test_pdf.rb +12 -0
- data/test/test_prop.rb +86 -0
- data/test/test_rmagick.rb +15 -0
- data/test/test_sbdb.rb +23 -0
- data/test/test_sdf.rb +30 -0
- data/test/test_smiles.rb +84 -0
- data/test/test_sssr.rb +18 -0
- data/test/test_sub.rb +47 -0
- data/test/test_subcomp.rb +37 -0
- data/test/test_traverse.rb +29 -0
- data/test/test_writer.rb +13 -0
- data/test/test_xyz.rb +15 -0
- data/test/type_test.rb +25 -0
- metadata +290 -0
@@ -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
|
+
|
data/lib/chem/db/msi.rb
ADDED
@@ -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
|
data/lib/chem/db/pdf.rb
ADDED
@@ -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
|