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.
- 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,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
|
+
|
data/lib/chem/db/xyz.rb
ADDED
@@ -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
|
+
|
data/lib/chem/model.rb
ADDED
@@ -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
|
data/lib/chem/utils.rb
ADDED
@@ -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
|