rubabel 0.1.1 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +0 -1
- data/VERSION +1 -1
- data/bin/fragmenter.rb +43 -0
- data/lib/rubabel.rb +2 -0
- data/lib/rubabel/bond.rb +14 -3
- data/lib/rubabel/core_ext/enumerable.rb +13 -0
- data/lib/rubabel/core_ext/putsv.rb +14 -0
- data/lib/rubabel/molecule.rb +44 -5
- data/lib/rubabel/molecule/fragmentable.rb +188 -141
- data/reference/fragmentation_rules_.pdf +0 -0
- data/rubabel.gemspec +8 -8
- data/spec/rubabel/molecule/fragmentable_spec.rb +107 -16
- data/spec/rubabel/molecule_spec.rb +29 -3
- data/spec/spec_helper.rb +17 -6
- metadata +8 -21
- data/bin/rubabel +0 -229
data/Rakefile
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.5
|
data/bin/fragmenter.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'trollop'
|
4
|
+
require 'rubabel'
|
5
|
+
require 'rubabel/molecule/fragmentable'
|
6
|
+
|
7
|
+
|
8
|
+
parser = Trollop::Parser.new do
|
9
|
+
banner "usage: #{File.basename($0)} [OPTIONS|RULES] <SMARTS> ..."
|
10
|
+
text "\noptions:"
|
11
|
+
opt :ph, "the pH to use (experimental option)", :default => Rubabel::Molecule::Fragmentable::DEFAULT_OPTIONS[:ph]
|
12
|
+
#opt :uniq, "no repeated fragments", :default => false
|
13
|
+
text "\nrules:"
|
14
|
+
Rubabel::Molecule::Fragmentable::RULES.each do |rule|
|
15
|
+
opt rule, rule.to_s.gsub("_",' ')
|
16
|
+
end
|
17
|
+
text "\nexample:"
|
18
|
+
text "fragmenter.rb -aecsoxn 'CCC(=O)OCCC' 'CCC(=O)OCCC(=O)O'"
|
19
|
+
end
|
20
|
+
|
21
|
+
rules = parser.parse(ARGV)
|
22
|
+
options = {rules: []}
|
23
|
+
options[:ph] = rules.delete(:ph)
|
24
|
+
options[:uniq] = rules.delete(:uniq)
|
25
|
+
rules.each do |k,v|
|
26
|
+
options[:rules] << k if v && k.to_s !~ /_given/
|
27
|
+
end
|
28
|
+
|
29
|
+
if ARGV.size == 0
|
30
|
+
parser.educate && exit
|
31
|
+
end
|
32
|
+
|
33
|
+
ARGV.each do |mol|
|
34
|
+
mol = Rubabel[mol]
|
35
|
+
puts "\nmolecule: #{mol.csmiles}"
|
36
|
+
fragment_sets = mol.fragment(options)
|
37
|
+
fragment_sets.each do |frag_set|
|
38
|
+
puts ""
|
39
|
+
frag_set.each do |frag|
|
40
|
+
puts "#{frag.mass.round(5)} #{frag.csmiles}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/rubabel.rb
CHANGED
data/lib/rubabel/bond.rb
CHANGED
@@ -14,12 +14,23 @@ module Rubabel
|
|
14
14
|
include Enumerable
|
15
15
|
|
16
16
|
class << self
|
17
|
-
|
17
|
+
=begin
|
18
|
+
def [](atom1, atom2, bond_order=1, index=0)
|
19
|
+
abort 'cannot get bond generated properly yet, arghhh!'
|
20
|
+
flags = 0
|
18
21
|
obbond = OpenBabel::OBBond.new
|
19
|
-
obbond
|
20
|
-
obbond.
|
22
|
+
p obbond
|
23
|
+
obbond.set(index, atom1.ob, atom2.ob, bond_order, flags)
|
24
|
+
#obbond.set_end(atom2.ob)
|
25
|
+
p obbond
|
26
|
+
puts "GEGIN:"
|
27
|
+
p obbond.get_begin_atom.get_id
|
28
|
+
puts "END:"
|
29
|
+
p obbond.get_end_atom.get_id
|
30
|
+
obbond.set_bond_order(bond_order)
|
21
31
|
self.new(obbond)
|
22
32
|
end
|
33
|
+
=end
|
23
34
|
end
|
24
35
|
|
25
36
|
attr_accessor :ob
|
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
module Enumerable
|
3
|
+
# File activesupport/lib/active_support/core_ext/enumerable.rb, line 94
|
4
|
+
def index_by
|
5
|
+
return to_enum :index_by unless block_given?
|
6
|
+
Hash[map { |elem| [yield(elem), elem] }]
|
7
|
+
end
|
8
|
+
|
9
|
+
def uniq_by
|
10
|
+
h = {}
|
11
|
+
inject([]) {|a,x| h[yield(x)] ||= a << x}
|
12
|
+
end
|
13
|
+
end
|
data/lib/rubabel/molecule.rb
CHANGED
@@ -41,8 +41,22 @@ module Rubabel
|
|
41
41
|
def from_string(string, type=DEFAULT_IN_TYPE)
|
42
42
|
Rubabel.molecule_from_string(string, type)
|
43
43
|
end
|
44
|
+
|
45
|
+
def from_atoms_and_bonds(atoms=[], bonds=[])
|
46
|
+
obj = self.new( OpenBabel::OBMol.new )
|
47
|
+
atoms.each {|atom| obj.add_atom(atom) }
|
48
|
+
bonds.each {|bond| obj.add_bond(bond) }
|
49
|
+
obj
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def add_atom(atom)
|
54
|
+
@ob.add_atom(atom.ob)
|
44
55
|
end
|
45
56
|
|
57
|
+
def delete_atom(atom)
|
58
|
+
@ob.delete_atom(atom.ob, false)
|
59
|
+
end
|
46
60
|
|
47
61
|
# attributes
|
48
62
|
def title() @ob.get_title end
|
@@ -69,8 +83,8 @@ module Rubabel
|
|
69
83
|
|
70
84
|
|
71
85
|
def initialize(obmol, obconv=nil)
|
72
|
-
@obconv = obconv
|
73
86
|
@ob = obmol
|
87
|
+
@obconv = obconv
|
74
88
|
end
|
75
89
|
|
76
90
|
# returns a list of atom indices matching the patterns (corresponds to
|
@@ -267,20 +281,43 @@ module Rubabel
|
|
267
281
|
def delete(obj)
|
268
282
|
case obj
|
269
283
|
when Rubabel::Bond
|
270
|
-
delete_bond(obj)
|
284
|
+
delete_bond(obj, false)
|
271
285
|
when Rubabel::Atom
|
272
|
-
delete_atom(obj)
|
286
|
+
delete_atom(obj, false)
|
273
287
|
else
|
274
288
|
raise(ArgumentError, "don't know how to delete objects of type: #{obj.class}")
|
275
289
|
end
|
276
290
|
end
|
277
291
|
|
278
292
|
def delete_bond(bond)
|
279
|
-
@ob.delete_bond(bond.ob)
|
293
|
+
@ob.delete_bond(bond.ob, false)
|
280
294
|
end
|
281
295
|
|
282
296
|
def delete_atom(atom)
|
283
|
-
@ob.delete_atom(atom.ob)
|
297
|
+
@ob.delete_atom(atom.ob, false)
|
298
|
+
end
|
299
|
+
|
300
|
+
# swaps to_move1 for to_move2 on the respective anchors
|
301
|
+
# returns self
|
302
|
+
def swap!(anchor1, to_move1, anchor2, to_move2)
|
303
|
+
OpenBabel::OBBuilder.swap(@ob, *[anchor1, to_move1, anchor2, to_move2].map {|at| at.ob.get_idx } )
|
304
|
+
self
|
305
|
+
end
|
306
|
+
|
307
|
+
# takes a Rubabel::Bond object or a pair of Rubabel::Atom objects
|
308
|
+
def add_bond(*args)
|
309
|
+
case args.size
|
310
|
+
when 1
|
311
|
+
ob_bond = args.first.ob
|
312
|
+
@ob.add_bond(ob_bond)
|
313
|
+
ob_bond.get_begin_atom.add_bond(ob_bond)
|
314
|
+
ob_bond.get_end_atom.add_bond(ob_bond)
|
315
|
+
when 2
|
316
|
+
ob_bond = Rubabel::Bond[ *args ].ob
|
317
|
+
ob_bond.get_begin_atom.add_bond(ob_bond)
|
318
|
+
ob_bond.get_end_atom.add_bond(ob_bond)
|
319
|
+
@ob.add_bond(ob_bond)
|
320
|
+
end
|
284
321
|
end
|
285
322
|
|
286
323
|
# yields self after deleting the specified bonds. When the block is
|
@@ -297,6 +334,8 @@ module Rubabel
|
|
297
334
|
reply
|
298
335
|
end
|
299
336
|
|
337
|
+
# splits the molecules at the given bonds and returns the fragments. Does
|
338
|
+
# not alter the caller.
|
300
339
|
def split(*bonds)
|
301
340
|
delete_and_restore_bonds(*bonds) do |mol|
|
302
341
|
mol.ob.separate.map(&:upcast)
|
@@ -1,9 +1,19 @@
|
|
1
|
+
require 'set'
|
2
|
+
require 'rubabel/core_ext/putsv'
|
3
|
+
require 'rubabel/core_ext/enumerable'
|
1
4
|
|
2
5
|
module Rubabel
|
3
6
|
class Molecule
|
4
7
|
module Fragmentable
|
5
|
-
|
8
|
+
|
9
|
+
#:sp3c_oxygen_asymmetric_far_sp3, :sp3c_nitrogen_asymmetric_far_sp3,
|
10
|
+
RULES = Set[ :alcohol_to_aldehyde, :peroxy_to_carboxy, :co2_loss,
|
11
|
+
:sp3c_oxygen_double_bond_far_side_sp3, :sp3c_oxygen_double_bond_far_side_sp2, :sp3c_oxygen_double_bond_water_loss, :sp3c_nitrogen_double_bond,
|
12
|
+
]
|
6
13
|
#ADDUCTS = [:lioh, :nh4cl, :nh4oh]
|
14
|
+
CO_RULES = Set[:alcohol_to_aldehyde, :peroxy_to_carboxy, :co2_loss,
|
15
|
+
:sp3c_oxygen_double_bond_water_loss, :sp3c_oxygen_double_bond_far_side_sp2, :sp3c_oxygen_double_bond_far_side_sp3, :sp3c_oxygen_asymmetric_far_sp3
|
16
|
+
]
|
7
17
|
|
8
18
|
DEFAULT_OPTIONS = {
|
9
19
|
rules: RULES,
|
@@ -24,21 +34,124 @@ module Rubabel
|
|
24
34
|
self.num_atoms == frags.map(&:num_atoms).reduce(:+)
|
25
35
|
end
|
26
36
|
|
37
|
+
# add_h! to self, then selects allowable fragments
|
38
|
+
def allowable_fragment_sets!(fragment_sets)
|
39
|
+
self.add_h!
|
40
|
+
fragment_sets.select do |_frags|
|
41
|
+
putsv "ExMAIN:"
|
42
|
+
putsv _frags.inspect
|
43
|
+
putsv self.allowable_fragmentation?(_frags)
|
44
|
+
self.allowable_fragmentation?(_frags)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
27
48
|
# will turn bond into a double bond, yield the changed molecule, then
|
28
49
|
# return the bond to the original state when the block is closed
|
29
50
|
# returns whatever the block returned
|
30
|
-
def feint_double_bond(bond, &block)
|
51
|
+
def feint_double_bond(bond, give_e_pair=nil, get_e_pair=nil, &block)
|
31
52
|
orig = bond.bond_order
|
32
53
|
bond.bond_order = 2
|
33
|
-
reply =
|
54
|
+
reply =
|
55
|
+
if give_e_pair || get_e_pair
|
56
|
+
feint_e_transfer(give_e_pair, get_e_pair, &block)
|
57
|
+
else
|
58
|
+
block.call(self)
|
59
|
+
end
|
34
60
|
bond.bond_order = orig
|
35
61
|
reply
|
36
62
|
end
|
37
63
|
|
64
|
+
# warning, this method adds_h! to the calling molecule
|
65
|
+
def electrophile_snatches_electrons(carbon, electrophile)
|
66
|
+
self.add_h!
|
67
|
+
frags = self.split(carbon.get_bond(electrophile))
|
68
|
+
raise NotImplementedError
|
69
|
+
# don't check for allowable fragments because it
|
70
|
+
#allowable_fragment_sets!([frag_set])
|
71
|
+
end
|
72
|
+
|
73
|
+
def feint_e_transfer(give_e_pair=nil, get_e_pair=nil, &block)
|
74
|
+
if give_e_pair
|
75
|
+
gc_orig = give_e_pair.charge
|
76
|
+
give_e_pair.charge = gc_orig + 1
|
77
|
+
end
|
78
|
+
if get_e_pair
|
79
|
+
rc_orig = get_e_pair.charge
|
80
|
+
get_e_pair.charge = rc_orig - 1
|
81
|
+
end
|
82
|
+
|
83
|
+
reply = block.call(self)
|
84
|
+
|
85
|
+
give_e_pair.charge = gc_orig if give_e_pair
|
86
|
+
get_e_pair.charge = rc_orig if get_e_pair
|
87
|
+
|
88
|
+
reply
|
89
|
+
end
|
90
|
+
|
91
|
+
def near_side_double_bond_break(carbon, electrophile)
|
92
|
+
frag_sets = carbon.atoms.select {|atom| atom.type == "C3" }.map do |near_c3|
|
93
|
+
frags = feint_double_bond(carbon.get_bond(near_c3)) do |_mol|
|
94
|
+
frags = _mol.split(electrophile.get_bond(carbon))
|
95
|
+
frags.map(&:add_h!)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
allowable_fragment_sets!(frag_sets)
|
99
|
+
end
|
100
|
+
|
101
|
+
def alcohol_to_aldehyde(carbon, oxygen, carbon_nbrs)
|
102
|
+
# alcohol becomes a ketone and one R group is released
|
103
|
+
frag_sets = carbon_nbrs.select {|atom| atom.type == 'C3' }.map do |_atom|
|
104
|
+
frags = feint_double_bond(carbon.get_bond(oxygen)) do |_mol|
|
105
|
+
frags = _mol.split(carbon.get_bond(_atom))
|
106
|
+
frags.map(&:add_h!)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
allowable_fragment_sets!(frag_sets)
|
110
|
+
end
|
111
|
+
|
112
|
+
def co2_loss(carbon, oxygen, c3_nbr)
|
113
|
+
# carboxyl rules ...
|
114
|
+
# neutral carbon dioxide loss with anion gain on attaching group
|
115
|
+
# (if carbon)
|
116
|
+
frags = feint_double_bond(carbon.get_bond(oxygen), oxygen, c3_nbr) do |_mol|
|
117
|
+
frags = _mol.split(c3_nbr.get_bond(carbon))
|
118
|
+
frags.map(&:add_h!)
|
119
|
+
end
|
120
|
+
allowable_fragment_sets!([frags])
|
121
|
+
end
|
122
|
+
|
123
|
+
def peroxy_to_carboxy(carbon, oxygen, carbon_nbrs, oxygen_nbr)
|
124
|
+
if oxygen_nbr.el == :o # has a neighbor oxygen
|
125
|
+
distal_o = oxygen_nbr
|
126
|
+
if distal_o.bonds.size == 1 # this is a peroxy
|
127
|
+
frag_sets = carbon_nbrs.select {|atom| atom.type == 'C3' }.map do |_atom|
|
128
|
+
self.swap!(carbon, _atom, oxygen, distal_o)
|
129
|
+
frags = feint_double_bond(carbon.get_bond(oxygen)) do |_mol|
|
130
|
+
|
131
|
+
# we swapped the atoms so the bond to split off is now
|
132
|
+
# attached to the oxygen
|
133
|
+
frags = _mol.split(oxygen.get_bond(_atom))
|
134
|
+
frags.map(&:add_h!)
|
135
|
+
end
|
136
|
+
self.swap!(carbon, distal_o, oxygen, _atom)
|
137
|
+
frags
|
138
|
+
end
|
139
|
+
allowable_fragment_sets!(frag_sets)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
end
|
144
|
+
|
38
145
|
# to ensure proper fragmentation, will add_h!(ph) first at the given ph
|
39
146
|
# an empty array is returned if there are no fragments generated.
|
147
|
+
#
|
148
|
+
# :ph => 7.4
|
149
|
+
# :uniq => false
|
40
150
|
def fragment(opts={})
|
41
151
|
opts = DEFAULT_OPTIONS.merge(opts)
|
152
|
+
opts[:rules].each do |rule|
|
153
|
+
raise ArgumentError, "bad rule: #{rule}" unless RULES.include?(rule)
|
154
|
+
end
|
42
155
|
|
43
156
|
had_hydrogens = self.h_added?
|
44
157
|
|
@@ -46,84 +159,94 @@ module Rubabel
|
|
46
159
|
self.remove_h!
|
47
160
|
|
48
161
|
rules = opts[:rules]
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
case num_oxygen_bonds
|
61
|
-
when 1 # an alcohol
|
62
|
-
# water loss
|
63
|
-
if (c3_nbrs.size > 0 || c2_nbrs.size > 0) && !carbon.carboxyl_carbon?
|
64
|
-
if rules.include?(:h2oloss)
|
65
|
-
frag_sets = (c2_nbrs + c3_nbrs).map do |dbl_bondable_atom|
|
66
|
-
frags = feint_double_bond(dbl_bondable_atom.get_bond(carbon)) do |_mol|
|
67
|
-
# TODO: check accuracy before completely splitting for efficiency
|
68
|
-
frags = _mol.split(carbon.get_bond(oxygen))
|
69
|
-
frags.map(&:add_h!)
|
70
|
-
end
|
71
|
-
end
|
162
|
+
fragment_sets = []
|
163
|
+
if rules.any? {|rule| CO_RULES.include?(rule) }
|
164
|
+
putsv "matching C-O"
|
165
|
+
self.each_match("CO").each do |_atoms|
|
166
|
+
# note: this will *not* match C=O
|
167
|
+
(carbon, oxygen) = _atoms
|
168
|
+
carbon_nbrs = carbon.atoms.reject {|atom| atom == oxygen }
|
169
|
+
c3_nbrs = carbon_nbrs.select {|atm| atm.type == 'C3' }
|
170
|
+
# pulling this out here causes it to work incorrectly internally
|
171
|
+
# (not sure why)
|
172
|
+
#co_bond = carbon.get_bond(oxygen)
|
72
173
|
|
73
|
-
|
74
|
-
|
75
|
-
|
174
|
+
case oxygen.bonds.size # non-hydrogen bonds
|
175
|
+
when 1 # *must* be an alcohol or a carboxylic acid
|
176
|
+
putsv "#{csmiles} oxygen has no other bonds besides C-O (alcohol or carboxylic acid)"
|
177
|
+
if carbon.type == 'C3'
|
178
|
+
if rules.include?(:sp3c_oxygen_double_bond_water_loss)
|
179
|
+
putsv "rule :sp3c_oxygen_double_bond_water_loss"
|
180
|
+
fragment_sets.push *near_side_double_bond_break(carbon, oxygen)
|
76
181
|
end
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
# alcohol becomes a ketone and one R group is released
|
81
|
-
frag_sets = c3_nbrs.map do |neighbor_atom|
|
82
|
-
frags = feint_double_bond(carbon.get_bond(oxygen)) do |_mol|
|
83
|
-
frags = _mol.split(carbon.get_bond(neighbor_atom))
|
84
|
-
frags.map(&:add_h!)
|
85
|
-
end
|
182
|
+
if rules.include?(:alcohol_to_aldehyde)
|
183
|
+
putsv "rule :alcohol_to_aldehyde"
|
184
|
+
fragment_sets.push *alcohol_to_aldehyde(carbon, oxygen, carbon_nbrs)
|
86
185
|
end
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
186
|
+
elsif carbon.carboxyl_carbon?
|
187
|
+
if rules.include?(:co2_loss)
|
188
|
+
putsv "rule :co2_loss"
|
189
|
+
if c3_nbr = c3_nbrs.first
|
190
|
+
fragment_sets.push *co2_loss(carbon, oxygen, c3_nbr)
|
191
|
+
end
|
91
192
|
end
|
92
|
-
fragments.push *frag_sets
|
93
193
|
end
|
194
|
+
when 2
|
195
|
+
putsv "#{csmiles} c-o & oxygen has 2 non-hydrogen bonds"
|
196
|
+
oxygen_nbr = oxygen.atoms.reject {|atom| atom.idx == carbon.idx }.first
|
197
|
+
if carbon.type == 'C3'
|
198
|
+
if rules.include?(:peroxy_to_carboxy)
|
199
|
+
fragment_sets.push *peroxy_to_carboxy(carbon, oxygen, carbon_nbrs, oxygen_nbr)
|
200
|
+
end
|
201
|
+
# ester and ethers (look *only* on close side for places to make
|
202
|
+
# double bond)
|
94
203
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
frag_sets = c3_nbrs.map do |neighbor_atom|
|
101
|
-
frags = feint_double_bond(carbon.get_bond(oxygen)) do |_mol|
|
102
|
-
frags = _mol.split(carbon.get_bond(neighbor_atom))
|
103
|
-
frags.map(&:add_h!)
|
104
|
-
end
|
204
|
+
if oxygen_nbr.type == 'C3'
|
205
|
+
putsv "oxygen nbr is C3"
|
206
|
+
if rules.include?(:sp3c_oxygen_double_bond_far_side_sp3)
|
207
|
+
putsv "rule :sp3c_oxygen_double_bond_far_side_sp3"
|
208
|
+
fragment_sets.push *near_side_double_bond_break(carbon, oxygen)
|
105
209
|
end
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
210
|
+
if rules.include?(:sp3c_oxygen_asymmetric_far_sp3)
|
211
|
+
putsv "rule :sp3c_oxygen_asymmetric_far_sp3"
|
212
|
+
# only returns a single frag set
|
213
|
+
fragment_sets.push electrophile_snatches_electrons(carbon, oxygen)
|
110
214
|
end
|
111
|
-
fragments.push *frag_sets
|
112
215
|
end
|
113
|
-
|
216
|
+
if oxygen_nbr.type == 'C2'
|
217
|
+
if rules.include?(:sp3c_oxygen_double_bond_far_side_sp2)
|
218
|
+
putsv "rule :sp3c_oxygen_double_bond_far_side_sp2"
|
219
|
+
fragment_sets.push *near_side_double_bond_break(carbon, oxygen)
|
220
|
+
end
|
221
|
+
end
|
222
|
+
# note: the case of a carboxy is found with CO search
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
if rules.include?(:sp3c_nitrogen_double_bond)
|
228
|
+
self.each_match("CN") do |_atoms|
|
229
|
+
(carbon, nitrogen) = _atoms
|
230
|
+
num_nitrogen_bonds = nitrogen.bonds.size
|
231
|
+
case num_nitrogen_bonds
|
232
|
+
when 2
|
233
|
+
if carbon.type == 'C3'
|
234
|
+
fragment_sets.push *near_side_double_bond_break(carbon, nitrogen)
|
114
235
|
end
|
115
236
|
end
|
116
|
-
# oxygen bonded to something else (per-oxide??)
|
117
|
-
# also could be ether situation...
|
118
|
-
when 2
|
119
|
-
raise NotImplementedError
|
120
237
|
end
|
121
238
|
end
|
239
|
+
|
122
240
|
unless had_hydrogens
|
123
|
-
|
241
|
+
fragment_sets.each {|set| set.each(&:remove_h!) }
|
124
242
|
self.remove_h!
|
125
243
|
end
|
126
|
-
|
244
|
+
if opts[:uniq]
|
245
|
+
# TODO: impelent properly
|
246
|
+
#fragment_sets = fragment_sets.uniq_by(&:csmiles)
|
247
|
+
raise NotImplementedError
|
248
|
+
end
|
249
|
+
fragment_sets
|
127
250
|
end
|
128
251
|
|
129
252
|
end
|
@@ -131,79 +254,3 @@ module Rubabel
|
|
131
254
|
end
|
132
255
|
end
|
133
256
|
|
134
|
-
|
135
|
-
# co_bond = carbon.get_bond(oxygen)
|
136
|
-
# left_to_c_bond = carbon.get_bond(left)
|
137
|
-
# right_to_c_bond = carbon.get_bond(right)
|
138
|
-
#
|
139
|
-
# co_bond.bond_order = 2
|
140
|
-
#
|
141
|
-
# [left_to_c_bond, right_to_c_bond].flat_map do |other_to_c_bond|
|
142
|
-
# mol.ob.delete_bond(other_to_c_bond.ob, false)
|
143
|
-
# pieces = mol.ob.separate.map(&:upcast)
|
144
|
-
# mol.ob.add_bond(other_to_c_bond.ob)
|
145
|
-
# pieces
|
146
|
-
# end
|
147
|
-
|
148
|
-
|
149
|
-
=begin
|
150
|
-
|
151
|
-
# duplicate the molecule so we can do what we like with it
|
152
|
-
mol = self.dup
|
153
|
-
|
154
|
-
has_hydrogens_added = h_added?
|
155
|
-
mol.remove_h! if has_hydrogens_added
|
156
|
-
|
157
|
-
mol.correct_for_ph!(opts[:ph])
|
158
|
-
|
159
|
-
rules = opts[:rules]
|
160
|
-
fragments = []
|
161
|
-
if rules.include?(:co)
|
162
|
-
mol.each_match("C(O)").flat_map do |_atoms|
|
163
|
-
carbon = _atoms.first
|
164
|
-
non_oxygen = carbon.each_bond.reject {|bond| bond.include?(_atoms.last) }
|
165
|
-
non_oxygen.each {|bond| p mol.split(bond) }
|
166
|
-
|
167
|
-
fragments.push *non_oxygen.flat_map {|bond| mol.split(bond) }
|
168
|
-
end
|
169
|
-
end
|
170
|
-
p fragments
|
171
|
-
abort 'here'
|
172
|
-
fragments.each(&:add_h!) if has_hydrogens_added
|
173
|
-
fragments
|
174
|
-
end
|
175
|
-
end
|
176
|
-
|
177
|
-
=end
|
178
|
-
|
179
|
-
|
180
|
-
# [[left_to_c_bond, left], [right_to_c_bond, right]].flat_map do |other_to_carbony_c, other|
|
181
|
-
# puts "INSIDE!!!"
|
182
|
-
# pieces = mol.split(other_to_carbony_c)
|
183
|
-
# c_in_pieces = nil
|
184
|
-
# oxy_in_pieces = nil
|
185
|
-
# other_in_pieces = nil
|
186
|
-
# pieces.each do |piece|
|
187
|
-
# piece.each_atom do |atom|
|
188
|
-
# p piece
|
189
|
-
# p [atom.id, other.id]
|
190
|
-
# other_in_pieces = atom if atom.id == other.id
|
191
|
-
# c_in_pieces = atom if atom.id == carbon.id
|
192
|
-
# oxy_in_pieces = atom if atom.id == oxygen.id
|
193
|
-
# break if c_in_pieces && oxy_in_pieces
|
194
|
-
# end
|
195
|
-
# break if c_in_pieces && oxy_in_pieces
|
196
|
-
# end
|
197
|
-
# oxygen_bond = c_in_pieces.get_bond(oxy_in_pieces)
|
198
|
-
# oxygen_bond.bond_order = 2
|
199
|
-
#
|
200
|
-
# puts "EXAMINE:other"
|
201
|
-
# p other_in_pieces.ob
|
202
|
-
# p other_in_pieces.mol.csmiles
|
203
|
-
# other_mol = other_in_pieces.mol
|
204
|
-
# ob_atom = other_mol.ob.new_atom
|
205
|
-
# ob_atom.set_atomic_num 1
|
206
|
-
# newbond = OpenBabel::OBBond.new
|
207
|
-
# ob_atom
|
208
|
-
#
|
209
|
-
|
Binary file
|
data/rubabel.gemspec
CHANGED
@@ -5,14 +5,14 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "rubabel"
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["John T. Prince"]
|
12
|
-
s.date = "2012-
|
12
|
+
s.date = "2012-08-08"
|
13
13
|
s.description = "Ruby interface to the openbabel ruby bindings (or the openbabel gem). The\ninterface attempts to be a ruby-ish analogue of pybel."
|
14
14
|
s.email = "jtprince@gmail.com"
|
15
|
-
s.executables = ["
|
15
|
+
s.executables = ["fragmenter.rb"]
|
16
16
|
s.extra_rdoc_files = [
|
17
17
|
"LICENSE",
|
18
18
|
"README.rdoc"
|
@@ -24,10 +24,12 @@ Gem::Specification.new do |s|
|
|
24
24
|
"README.rdoc",
|
25
25
|
"Rakefile",
|
26
26
|
"VERSION",
|
27
|
-
"bin/
|
27
|
+
"bin/fragmenter.rb",
|
28
28
|
"lib/rubabel.rb",
|
29
29
|
"lib/rubabel/atom.rb",
|
30
30
|
"lib/rubabel/bond.rb",
|
31
|
+
"lib/rubabel/core_ext/enumerable.rb",
|
32
|
+
"lib/rubabel/core_ext/putsv.rb",
|
31
33
|
"lib/rubabel/fingerprint.rb",
|
32
34
|
"lib/rubabel/molecule.rb",
|
33
35
|
"lib/rubabel/molecule/fragmentable.rb",
|
@@ -39,6 +41,7 @@ Gem::Specification.new do |s|
|
|
39
41
|
"reference/arity_method_list_CLASS.txt",
|
40
42
|
"reference/atom_methods.txt",
|
41
43
|
"reference/bond_methods.txt",
|
44
|
+
"reference/fragmentation_rules_.pdf",
|
42
45
|
"reference/get_methods.rb",
|
43
46
|
"reference/mol_methods.txt",
|
44
47
|
"rubabel.gemspec",
|
@@ -67,7 +70,7 @@ Gem::Specification.new do |s|
|
|
67
70
|
s.homepage = "http://github.com/princelab/rubabel"
|
68
71
|
s.licenses = ["MIT"]
|
69
72
|
s.require_paths = ["lib"]
|
70
|
-
s.rubygems_version = "1.8.
|
73
|
+
s.rubygems_version = "1.8.23"
|
71
74
|
s.summary = "Ruby interface to the OpenBabel ruby bindings similar to pybel"
|
72
75
|
|
73
76
|
if s.respond_to? :specification_version then
|
@@ -75,14 +78,12 @@ Gem::Specification.new do |s|
|
|
75
78
|
|
76
79
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
77
80
|
s.add_runtime_dependency(%q<openbabel>, ["~> 2.3.1.2"])
|
78
|
-
s.add_runtime_dependency(%q<commander>, ["~> 4.1.2"])
|
79
81
|
s.add_runtime_dependency(%q<andand>, ["~> 1.3.3"])
|
80
82
|
s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
|
81
83
|
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
82
84
|
s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
|
83
85
|
else
|
84
86
|
s.add_dependency(%q<openbabel>, ["~> 2.3.1.2"])
|
85
|
-
s.add_dependency(%q<commander>, ["~> 4.1.2"])
|
86
87
|
s.add_dependency(%q<andand>, ["~> 1.3.3"])
|
87
88
|
s.add_dependency(%q<rspec>, ["~> 2.8.0"])
|
88
89
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
@@ -90,7 +91,6 @@ Gem::Specification.new do |s|
|
|
90
91
|
end
|
91
92
|
else
|
92
93
|
s.add_dependency(%q<openbabel>, ["~> 2.3.1.2"])
|
93
|
-
s.add_dependency(%q<commander>, ["~> 4.1.2"])
|
94
94
|
s.add_dependency(%q<andand>, ["~> 1.3.3"])
|
95
95
|
s.add_dependency(%q<rspec>, ["~> 2.8.0"])
|
96
96
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
@@ -2,37 +2,133 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
require 'rubabel'
|
4
4
|
|
5
|
+
$VERBOSE = nil
|
6
|
+
|
5
7
|
describe Rubabel::Molecule::Fragmentable do
|
6
|
-
describe 'the :co rule' do
|
7
8
|
|
8
|
-
|
9
|
+
# :peroxy_to_carboxy
|
10
|
+
# :oxygen_asymmetric_sp3, :nitrogen_asymmetric_sp3,
|
11
|
+
# :internal_phosphoester
|
12
|
+
|
13
|
+
describe 'fragmentation rules' do
|
14
|
+
# coenzyme: CC1=CC(=O)C=CC1=O
|
15
|
+
# 2-methylcyclohexa-2,5-diene-1,4-dione
|
16
|
+
|
17
|
+
let(:test_mol) { "COP(=O)(O)OCNCOCC(OO)C(=O)O" }
|
18
|
+
|
19
|
+
it 'raises an error for a bad rule' do
|
20
|
+
mol = Rubabel["CCNC"]
|
21
|
+
expect { mol.fragment(rules: [:wackiness]) }.to raise_error
|
22
|
+
end
|
23
|
+
|
24
|
+
describe ':sp3c_nitrogen_double_bond' do
|
25
|
+
|
26
|
+
it 'cleaves like an ether a secondary NH group if possible' do
|
27
|
+
mol = Rubabel["CCNC"]
|
28
|
+
frag_sets = mol.fragment(rules: [:sp3c_nitrogen_double_bond])
|
29
|
+
frag_sets.size.should == 1
|
30
|
+
csmiles = frag_sets.first.map(&:csmiles)
|
31
|
+
csmiles.should include("C=C")
|
32
|
+
csmiles.should include("C[NH3+]")
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'will not cleave if not possible' do
|
36
|
+
mol = Rubabel["CNC"]
|
37
|
+
frag_sets = mol.fragment(rules: [:sp3c_nitrogen_double_bond])
|
38
|
+
frag_sets.should be_empty
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
describe ':co2_loss' do
|
44
|
+
it 'loss of CO2 from carboxy group with charge transfer' do
|
45
|
+
mol = Rubabel["NCC(=O)O"]
|
46
|
+
frag_sets = mol.fragment( rules: [:co2_loss] )
|
47
|
+
frag_sets.size.should == 1
|
48
|
+
csmiles = frag_sets.first.map(&:csmiles)
|
49
|
+
|
50
|
+
csmiles.should include("[CH2-][NH3+]")
|
51
|
+
csmiles.should include("O=C=O")
|
52
|
+
end
|
53
|
+
|
54
|
+
it "doesn't remove CO2 if adjacent is not c3" do
|
55
|
+
mol = Rubabel["C=CC(=O)O"]
|
56
|
+
fragments = mol.fragment( rules: [:co2_loss] )
|
57
|
+
fragments.should be_empty
|
58
|
+
end
|
9
59
|
|
10
|
-
|
60
|
+
end
|
61
|
+
|
62
|
+
describe ':peroxy_to_carboxy' do
|
63
|
+
it 'works' do
|
64
|
+
mol = Rubabel["NCCC(OO)CC"]
|
65
|
+
frag_sets = mol.fragment( rules: [:peroxy_to_carboxy] )
|
66
|
+
frag_sets.size.should == 2
|
67
|
+
frag_sets.flatten(1).map(&:csmiles).sort.should == ["CC", "CCC(=O)O", "CC[NH3+]", "OC(=O)CC[NH3+]"]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe ':sp3c_oxygen_asymmetric_far_sp3', :pending do
|
72
|
+
it 'splits like sp3c_oxygen_double_bond except oxygen takes the electrons' do
|
73
|
+
$VERBOSE = 3
|
74
|
+
mol = Rubabel["NCCCOCC"]
|
75
|
+
frag_sets = mol.fragment( rules: [:sp3c_oxygen_asymmetric_far_sp3] )
|
76
|
+
$VERBOSE = nil
|
77
|
+
frag_sets.size.should == 2
|
78
|
+
#mol = Rubabel["NCCOCC"]
|
79
|
+
#p mol.fragment( rules: [:sp3c_oxygen_asymmetric_far_sp3] )
|
80
|
+
#mol = Rubabel["NCOC"]
|
81
|
+
#p mol.fragment( rules: [:sp3c_oxygen_asymmetric_far_sp3] )
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
describe ':sp3c_oxygen_double_bond_water_loss' do
|
86
|
+
|
87
|
+
it 'does h2o loss of alcohol' do
|
11
88
|
mol = Rubabel["NCCC(O)CC"]
|
12
|
-
fragments = mol.fragment( rules: [:
|
89
|
+
fragments = mol.fragment( rules: [:sp3c_oxygen_double_bond_water_loss] )
|
13
90
|
fragments.flatten(1).map(&:csmiles).sort.should == ["CC=CCC[NH3+]", "CCC=CC[NH3+]", "O", "O"]
|
14
91
|
end
|
15
92
|
|
16
|
-
it '
|
93
|
+
it 'h2o loss does not allow bad chemistry' do
|
17
94
|
# lone pair and double bond resonance ?
|
18
95
|
mol = Rubabel["NCC(O)CC"]
|
19
|
-
fragments = mol.fragment( rules: [:
|
96
|
+
fragments = mol.fragment( rules: [:sp3c_oxygen_double_bond_water_loss] )
|
20
97
|
fragments.flatten(1).map(&:csmiles).sort.should == ["CC=CC[NH3+]", "O"]
|
21
98
|
|
22
99
|
mol = Rubabel["NC(O)CC"]
|
23
|
-
fragments = mol.fragment( rules: [:
|
100
|
+
fragments = mol.fragment( rules: [:sp3c_oxygen_double_bond_water_loss] )
|
24
101
|
fragments.flatten(1).map(&:csmiles).sort.should == []
|
25
102
|
end
|
26
103
|
end
|
27
104
|
|
28
|
-
describe '
|
105
|
+
describe 'sp3c_oxygen_double_bond_far_side_sp2' do
|
106
|
+
|
107
|
+
it 'does not cleave esters without sp3 carbons available for double bond' do
|
108
|
+
mol = Rubabel["NCCC(=O)OC"]
|
109
|
+
pieces = mol.fragment( rules: [:sp3c_oxygen_double_bond_far_side_sp2] )
|
110
|
+
pieces.should be_empty
|
111
|
+
end
|
29
112
|
|
30
|
-
it 'cleaves
|
113
|
+
it 'cleaves esters on far side of singly bonded oxygen' do
|
114
|
+
mol = Rubabel["NCCC(=O)OCC"]
|
115
|
+
pieces = mol.fragment( rules: [:sp3c_oxygen_double_bond_far_side_sp2] )
|
116
|
+
pieces.size.should == 1 # one set
|
117
|
+
the_pair = pieces.first
|
118
|
+
csmiles = the_pair.map(&:csmiles)
|
119
|
+
csmiles.should include("OC(=O)CC[NH3+]")
|
120
|
+
csmiles.should include("C=C")
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
describe ':alcohol_to_aldehyde' do
|
126
|
+
it 'cleaves beside alcohols to generate an aldehyde' do
|
31
127
|
mol = Rubabel["NCCC(O)CC"]
|
32
128
|
mol.correct_for_ph!
|
33
129
|
total_mass = mol.add_h!.mass
|
34
130
|
|
35
|
-
pieces = mol.fragment(rules: [:
|
131
|
+
pieces = mol.fragment(rules: [:alcohol_to_aldehyde])
|
36
132
|
pieces.size.should == 2
|
37
133
|
pieces.map(&:size).should == [2,2]
|
38
134
|
pieces.flatten(1).map(&:csmiles).should == ["CC[NH3+]", "CCC=O", "C(C=O)C[NH3+]", "CC"]
|
@@ -40,12 +136,7 @@ describe Rubabel::Molecule::Fragmentable do
|
|
40
136
|
pair.map(&:mass).reduce(:+).should == total_mass
|
41
137
|
end
|
42
138
|
end
|
43
|
-
|
44
|
-
xit 'does not cleave esters' do
|
45
|
-
mol = Rubabel["NCCC(=O)OC"]
|
46
|
-
pieces = mol.fragment( rules: [:co] )
|
47
|
-
pieces.should be_empty
|
48
|
-
end
|
49
139
|
end
|
140
|
+
|
50
141
|
end
|
51
142
|
end
|
@@ -25,7 +25,33 @@ describe Rubabel::Molecule do
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
|
28
|
+
# specify '#add_bond adds a bond (and updates atoms)' do
|
29
|
+
# c = Rubabel::Atom[:c]
|
30
|
+
# o = Rubabel::Atom[:o]
|
31
|
+
# mol = Rubabel::Molecule.from_atoms_and_bonds([c,o])
|
32
|
+
# mol.add_bond(c,o)
|
33
|
+
# puts "BONDS:"
|
34
|
+
# p mol.bonds
|
35
|
+
# puts "ATOMS:"
|
36
|
+
# p mol.atoms
|
37
|
+
# puts "C ATOMS:"
|
38
|
+
# p c.atoms
|
39
|
+
# puts "O ATOMS:"
|
40
|
+
# p o.atoms
|
41
|
+
# end
|
42
|
+
|
43
|
+
specify '#swap! can swap atoms around' do
|
44
|
+
mol = Rubabel["NCC(=O)O"]
|
45
|
+
carboxy_carbon = mol.atoms.find {|atom| atom.type == 'Cac' }
|
46
|
+
single_bonded_oxygen = mol.atoms.find {|atom| atom.type == 'O.co2' && atom.get_bond(carboxy_carbon).bond_order == 1 }
|
47
|
+
nit_carbon = mol.atoms.find {|atom| atom.atoms.any? {|nbr| nbr.type == 'N3' } }
|
48
|
+
nitrogen = mol.atoms.find {|atom| atom.el == :n }
|
49
|
+
swapped = mol.swap!(nit_carbon, nitrogen, carboxy_carbon, single_bonded_oxygen)
|
50
|
+
swapped.should == mol
|
51
|
+
swapped.csmiles.should == 'NC(=O)CO'
|
52
|
+
end
|
53
|
+
|
54
|
+
specify '#dup creates an entirely new molecule based on the first' do
|
29
55
|
another = @mol.dup
|
30
56
|
# this is a deep copy all the way. Even the atoms are duplicated so that
|
31
57
|
# they can be modified in one and do not affect the other at all.
|
@@ -33,7 +59,7 @@ describe Rubabel::Molecule do
|
|
33
59
|
@mol.charge.should_not == another.charge
|
34
60
|
end
|
35
61
|
|
36
|
-
|
62
|
+
specify '#each iterates through each atom in id order' do
|
37
63
|
cnt = 0
|
38
64
|
@mol.each do |atom|
|
39
65
|
atom.id.should == cnt
|
@@ -44,7 +70,7 @@ describe Rubabel::Molecule do
|
|
44
70
|
@mol.atoms.size.should == 74
|
45
71
|
end
|
46
72
|
|
47
|
-
|
73
|
+
specify '#hydrogens_added?' do
|
48
74
|
@mol.hydrogens_added?.should be_false
|
49
75
|
@mol.atoms.size.should == 33
|
50
76
|
@mol.add_h!
|
data/spec/spec_helper.rb
CHANGED
@@ -1,12 +1,25 @@
|
|
1
1
|
require 'rspec'
|
2
2
|
require 'stringio'
|
3
3
|
|
4
|
-
|
5
|
-
#
|
6
|
-
|
4
|
+
require 'rspec/core/formatters/progress_formatter'
|
5
|
+
# doesn't say so much about pending guys
|
6
|
+
class QuietPendingFormatter < RSpec::Core::Formatters::ProgressFormatter
|
7
|
+
def example_pending(example)
|
8
|
+
output.print yellow('*')
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'rspec/core/formatters/documentation_formatter'
|
13
|
+
class QuietPendingDocFormatter < RSpec::Core::Formatters::DocumentationFormatter
|
14
|
+
def example_pending(example)
|
15
|
+
output.puts yellow( "<pending>: #{example.execution_result[:pending_message]}" )
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
7
19
|
|
8
20
|
RSpec.configure do |config|
|
9
|
-
config.
|
21
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
22
|
+
config.formatter = QuietPendingDocFormatter
|
10
23
|
config.color = true
|
11
24
|
end
|
12
25
|
|
@@ -31,6 +44,4 @@ module Kernel
|
|
31
44
|
ensure
|
32
45
|
$stderr = STDERR
|
33
46
|
end
|
34
|
-
|
35
|
-
|
36
47
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubabel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-08-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: openbabel
|
@@ -27,22 +27,6 @@ dependencies:
|
|
27
27
|
- - ~>
|
28
28
|
- !ruby/object:Gem::Version
|
29
29
|
version: 2.3.1.2
|
30
|
-
- !ruby/object:Gem::Dependency
|
31
|
-
name: commander
|
32
|
-
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
|
-
requirements:
|
35
|
-
- - ~>
|
36
|
-
- !ruby/object:Gem::Version
|
37
|
-
version: 4.1.2
|
38
|
-
type: :runtime
|
39
|
-
prerelease: false
|
40
|
-
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
|
-
requirements:
|
43
|
-
- - ~>
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: 4.1.2
|
46
30
|
- !ruby/object:Gem::Dependency
|
47
31
|
name: andand
|
48
32
|
requirement: !ruby/object:Gem::Requirement
|
@@ -112,7 +96,7 @@ description: ! 'Ruby interface to the openbabel ruby bindings (or the openbabel
|
|
112
96
|
interface attempts to be a ruby-ish analogue of pybel.'
|
113
97
|
email: jtprince@gmail.com
|
114
98
|
executables:
|
115
|
-
-
|
99
|
+
- fragmenter.rb
|
116
100
|
extensions: []
|
117
101
|
extra_rdoc_files:
|
118
102
|
- LICENSE
|
@@ -124,10 +108,12 @@ files:
|
|
124
108
|
- README.rdoc
|
125
109
|
- Rakefile
|
126
110
|
- VERSION
|
127
|
-
- bin/
|
111
|
+
- bin/fragmenter.rb
|
128
112
|
- lib/rubabel.rb
|
129
113
|
- lib/rubabel/atom.rb
|
130
114
|
- lib/rubabel/bond.rb
|
115
|
+
- lib/rubabel/core_ext/enumerable.rb
|
116
|
+
- lib/rubabel/core_ext/putsv.rb
|
131
117
|
- lib/rubabel/fingerprint.rb
|
132
118
|
- lib/rubabel/molecule.rb
|
133
119
|
- lib/rubabel/molecule/fragmentable.rb
|
@@ -139,6 +125,7 @@ files:
|
|
139
125
|
- reference/arity_method_list_CLASS.txt
|
140
126
|
- reference/atom_methods.txt
|
141
127
|
- reference/bond_methods.txt
|
128
|
+
- reference/fragmentation_rules_.pdf
|
142
129
|
- reference/get_methods.rb
|
143
130
|
- reference/mol_methods.txt
|
144
131
|
- rubabel.gemspec
|
@@ -184,7 +171,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
184
171
|
version: '0'
|
185
172
|
requirements: []
|
186
173
|
rubyforge_project:
|
187
|
-
rubygems_version: 1.8.
|
174
|
+
rubygems_version: 1.8.23
|
188
175
|
signing_key:
|
189
176
|
specification_version: 3
|
190
177
|
summary: Ruby interface to the OpenBabel ruby bindings similar to pybel
|
data/bin/rubabel
DELETED
@@ -1,229 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'rubygems'
|
4
|
-
require 'commander/import'
|
5
|
-
require 'rubabel'
|
6
|
-
|
7
|
-
program :version, Rubabel::VERSION
|
8
|
-
program :description, 'tools for manipulating molecules with rubabel'
|
9
|
-
|
10
|
-
=begin
|
11
|
-
filename = filename.first unless options[:string_format]
|
12
|
-
mol_iter =
|
13
|
-
if str_f=options[:string_format]
|
14
|
-
# assumes you aren't passing massive numbers of molecules as strings
|
15
|
-
# on the commandline
|
16
|
-
filename.map {|str| Rubabel.read_string(str, str_f.to_sym) }.each
|
17
|
-
else
|
18
|
-
Rubabel.foreach(ARGV.first)
|
19
|
-
end
|
20
|
-
mol_iter.each do |mol|
|
21
|
-
mol.add_h! unless mol.ob.has_hydrogens_added
|
22
|
-
mol.ob.get_title ||
|
23
|
-
|
24
|
-
end
|
25
|
-
=end
|
26
|
-
|
27
|
-
def mol_iterator(args, strings)
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
|
32
|
-
command :babel do |c|
|
33
|
-
c.syntax = 'rubabel babel [options]'
|
34
|
-
c.summary = ''
|
35
|
-
c.description = ''
|
36
|
-
c.example 'description', 'command example'
|
37
|
-
c.option '--some-switch', 'Some switch that does something'
|
38
|
-
c.action do |args, options|
|
39
|
-
# Do something or c.when_called Rubabel::Commands::Babel
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
command :obabel do |c|
|
44
|
-
c.syntax = 'rubabel obabel [options]'
|
45
|
-
c.summary = ''
|
46
|
-
c.description = ''
|
47
|
-
c.example 'description', 'command example'
|
48
|
-
c.option '--some-switch', 'Some switch that does something'
|
49
|
-
c.action do |args, options|
|
50
|
-
# Do something or c.when_called Rubabel::Commands::Obabel
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
command :chiral do |c|
|
55
|
-
c.syntax = 'rubabel chiral [options]'
|
56
|
-
c.summary = ''
|
57
|
-
c.description = ''
|
58
|
-
c.example 'description', 'command example'
|
59
|
-
c.option '--some-switch', 'Some switch that does something'
|
60
|
-
c.action do |args, options|
|
61
|
-
# Do something or c.when_called Rubabel::Commands::Chiral
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
command :conformer do |c|
|
66
|
-
c.syntax = 'rubabel conformer [options]'
|
67
|
-
c.summary = ''
|
68
|
-
c.description = ''
|
69
|
-
c.example 'description', 'command example'
|
70
|
-
c.option '--some-switch', 'Some switch that does something'
|
71
|
-
c.action do |args, options|
|
72
|
-
# Do something or c.when_called Rubabel::Commands::Conformer
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
command :energy do |c|
|
77
|
-
c.syntax = 'rubabel energy [options]'
|
78
|
-
c.summary = ''
|
79
|
-
c.description = ''
|
80
|
-
c.example 'description', 'command example'
|
81
|
-
c.option '--some-switch', 'Some switch that does something'
|
82
|
-
c.action do |args, options|
|
83
|
-
# Do something or c.when_called Rubabel::Commands::Energy
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
command :fit do |c|
|
88
|
-
c.syntax = 'rubabel fit [options]'
|
89
|
-
c.summary = ''
|
90
|
-
c.description = ''
|
91
|
-
c.example 'description', 'command example'
|
92
|
-
c.option '--some-switch', 'Some switch that does something'
|
93
|
-
c.action do |args, options|
|
94
|
-
# Do something or c.when_called Rubabel::Commands::Fit
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
command :gen do |c|
|
99
|
-
c.syntax = 'rubabel gen [options]'
|
100
|
-
c.summary = ''
|
101
|
-
c.description = ''
|
102
|
-
c.example 'description', 'command example'
|
103
|
-
c.option '--some-switch', 'Some switch that does something'
|
104
|
-
c.action do |args, options|
|
105
|
-
# Do something or c.when_called Rubabel::Commands::Gen
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
command :grep do |c|
|
110
|
-
c.syntax = 'rubabel grep [options]'
|
111
|
-
c.summary = ''
|
112
|
-
c.description = ''
|
113
|
-
c.example 'description', 'command example'
|
114
|
-
c.option '--some-switch', 'Some switch that does something'
|
115
|
-
c.action do |args, options|
|
116
|
-
# Do something or c.when_called Rubabel::Commands::Grep
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
command :gui do |c|
|
121
|
-
c.syntax = 'rubabel gui [options]'
|
122
|
-
c.summary = ''
|
123
|
-
c.description = ''
|
124
|
-
c.example 'description', 'command example'
|
125
|
-
c.option '--some-switch', 'Some switch that does something'
|
126
|
-
c.action do |args, options|
|
127
|
-
# Do something or c.when_called Rubabel::Commands::Gui
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
command :minimize do |c|
|
132
|
-
c.syntax = 'rubabel minimize [options]'
|
133
|
-
c.summary = ''
|
134
|
-
c.description = ''
|
135
|
-
c.example 'description', 'command example'
|
136
|
-
c.option '--some-switch', 'Some switch that does something'
|
137
|
-
c.action do |args, options|
|
138
|
-
# Do something or c.when_called Rubabel::Commands::Minimize
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
command :probe do |c|
|
143
|
-
c.syntax = 'rubabel probe [options]'
|
144
|
-
c.summary = ''
|
145
|
-
c.description = ''
|
146
|
-
c.example 'description', 'command example'
|
147
|
-
c.option '--some-switch', 'Some switch that does something'
|
148
|
-
c.action do |args, options|
|
149
|
-
# Do something or c.when_called Rubabel::Commands::Probe
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
command :prop do |c|
|
154
|
-
c.syntax = 'rubabel prop [options]'
|
155
|
-
c.summary = ''
|
156
|
-
c.description = ''
|
157
|
-
c.example 'description', 'command example'
|
158
|
-
c.option '--some-switch', 'Some switch that does something'
|
159
|
-
c.action do |args, options|
|
160
|
-
# Do something or c.when_called Rubabel::Commands::Prop
|
161
|
-
end
|
162
|
-
end
|
163
|
-
|
164
|
-
command :probe do |c|
|
165
|
-
c.syntax = 'rubabel probe [options]'
|
166
|
-
c.summary = ''
|
167
|
-
c.description = ''
|
168
|
-
c.example 'description', 'command example'
|
169
|
-
c.option '--some-switch', 'Some switch that does something'
|
170
|
-
c.action do |args, options|
|
171
|
-
# Do something or c.when_called Rubabel::Commands::Probe
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
command :prop do |c|
|
176
|
-
c.syntax = 'rubabel prop [options]'
|
177
|
-
c.summary = ''
|
178
|
-
c.description = ''
|
179
|
-
c.example 'description', 'command example'
|
180
|
-
c.option '--some-switch', 'Some switch that does something'
|
181
|
-
c.action do |args, options|
|
182
|
-
# Do something or c.when_called Rubabel::Commands::Prop
|
183
|
-
end
|
184
|
-
end
|
185
|
-
|
186
|
-
command :rotamer do |c|
|
187
|
-
c.syntax = 'rubabel rotamer [options]'
|
188
|
-
c.summary = ''
|
189
|
-
c.description = ''
|
190
|
-
c.example 'description', 'command example'
|
191
|
-
c.option '--some-switch', 'Some switch that does something'
|
192
|
-
c.action do |args, options|
|
193
|
-
# Do something or c.when_called Rubabel::Commands::Rotamer
|
194
|
-
end
|
195
|
-
end
|
196
|
-
|
197
|
-
command :rotate do |c|
|
198
|
-
c.syntax = 'rubabel rotate [options]'
|
199
|
-
c.summary = ''
|
200
|
-
c.description = ''
|
201
|
-
c.example 'description', 'command example'
|
202
|
-
c.option '--some-switch', 'Some switch that does something'
|
203
|
-
c.action do |args, options|
|
204
|
-
# Do something or c.when_called Rubabel::Commands::Rotate
|
205
|
-
end
|
206
|
-
end
|
207
|
-
|
208
|
-
command :spectrophore do |c|
|
209
|
-
c.syntax = 'rubabel spectrophore [options]'
|
210
|
-
c.summary = ''
|
211
|
-
c.description = ''
|
212
|
-
c.example 'description', 'command example'
|
213
|
-
c.option '--some-switch', 'Some switch that does something'
|
214
|
-
c.action do |args, options|
|
215
|
-
# Do something or c.when_called Rubabel::Commands::Spectrophore
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
command :roundtrip do |c|
|
220
|
-
c.syntax = 'rubabel roundtrip [options]'
|
221
|
-
c.summary = ''
|
222
|
-
c.description = ''
|
223
|
-
c.example 'description', 'command example'
|
224
|
-
c.option '--some-switch', 'Some switch that does something'
|
225
|
-
c.action do |args, options|
|
226
|
-
# Do something or c.when_called Rubabel::Commands::Roundtrip
|
227
|
-
end
|
228
|
-
end
|
229
|
-
|