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