class Rubabel::Atom
Attributes
the OpenBabel::OBAtom
object
Public Class Methods
# File lib/rubabel/atom.rb, line 48 def initialize(obatom) @ob = obatom end
Public Instance Methods
# File lib/rubabel/atom.rb, line 346 def amide_nitrogen?() @ob.is_amide_nitrogen end
# File lib/rubabel/atom.rb, line 353 def anti_clockwise?() @ob.is_anti_clockwise end
# File lib/rubabel/atom.rb, line 334 def aromatic?() @ob.is_aromatic end
# File lib/rubabel/atom.rb, line 349 def aromatic_noxide?() @ob.is_aromatic_noxide end
# File lib/rubabel/atom.rb, line 122 def atomic_mass @ob.get_atomic_mass end
# File lib/rubabel/atom.rb, line 126 def atomic_num @ob.get_atomic_num end
returns the neighboring atoms. Consider using each_atom.
# File lib/rubabel/atom.rb, line 118 def atoms each_atom.map.to_a end
# File lib/rubabel/atom.rb, line 351 def axial?() @ob.is_axial end
connects the atom-like specifier to this atom through Molecule#add_atom!
returns the atom that was just added for chaining. Takes any argument that Molecule#add_atom!
will take.
# File lib/rubabel/atom.rb, line 74 def bond!(arg, bond_order=1) mol.add_atom!(arg, bond_order, self) end
returns the bonds. Consider using each_bond.
# File lib/rubabel/atom.rb, line 101 def bonds each_bond.map.to_a end
# File lib/rubabel/atom.rb, line 329 def carbon?() @ob.is_carbon end
# File lib/rubabel/atom.rb, line 393 def carbonyl_carbon? each_atom.any?(&:carbonyl_oxygen?) end
# File lib/rubabel/atom.rb, line 388 def carbonyl_oxygen? ats = atoms ats.size == 1 && ats.first.el == :C && double_bond? end
# File lib/rubabel/atom.rb, line 384 def carboxyl_carbon? each_atom.any?(&:carboxyl_oxygen?) end
# File lib/rubabel/atom.rb, line 342 def carboxyl_oxygen?() @ob.is_carboxyl_oxygen end
# File lib/rubabel/atom.rb, line 350 def chiral?() @ob.is_chiral end
# File lib/rubabel/atom.rb, line 357 def chiral_volume?() @ob.has_chiral_volume end
# File lib/rubabel/atom.rb, line 356 def chirality_specified?() @ob.has_chirality_specified end
# File lib/rubabel/atom.rb, line 352 def clockwise?() @ob.is_clockwise end
connects a Rubabel::Atom
object with a bond
# File lib/rubabel/atom.rb, line 80 def connect!(atom, bond_order=1) @ob.get_parent.add_bond(@ob.get_idx, atom.ob.get_idx, bond_order) end
# File lib/rubabel/atom.rb, line 339 def connected?() @ob.is_connected end
# does this carbon hold a primary alcohol def primary_alcohol_carbon? end
# File lib/rubabel/atom.rb, line 401 def coords Vector[@ob.x, @ob.y, @ob.z] end
decrease by one the maximum number of connections expected for this atom
# File lib/rubabel/atom.rb, line 320 def dec_implicit_valence! @ob.decrement_implicit_valence end
doesn’t take into account pH (use Molecule#do_with_hydrogens
)
# File lib/rubabel/atom.rb, line 180 def do_with_hydrogens(&block) _obmol = @ob.get_parent had_hydrogens = _obmol.has_hydrogens_added _obmol.add_hydrogens(self.ob) unless had_hydrogens reply = block.call(had_hydrogens) _obmol.delete_hydrogens(self.ob) unless had_hydrogens reply end
doesn’t take into account pH (use Molecule#do_without_hydrogens
)
# File lib/rubabel/atom.rb, line 170 def do_without_hydrogens(&block) _obmol = @ob.get_parent had_hydrogens = _obmol.has_hydrogens_added _obmol.delete_hydrogens(self.ob) if had_hydrogens reply = block.call(had_hydrogens) _obmol.add_hydrogens(self.ob) if had_hydrogens reply end
# File lib/rubabel/atom.rb, line 376 def double_bond? each_bond.any? {|bond| bond.bond_order == 2 } end
iterates through each neighboring atom
# File lib/rubabel/atom.rb, line 106 def each_atom(&block) block or return enum_for(__method__) iter = @ob.begin_bonds _atom = @ob.begin_nbr_atom(iter) while _atom block.call _atom.upcast _atom = @ob.next_nbr_atom(iter) end end
# File lib/rubabel/atom.rb, line 84 def each_bond(&block) block or return enum_for(__method__) iter = @ob.begin_bonds _bond = @ob.begin_bond(iter) while _bond block.call _bond.upcast _bond = @ob.next_bond(iter) end end
elemental symbol, properly capitalized and returned as a Symbol
# File lib/rubabel/atom.rb, line 66 def element NUM_TO_ELEMENT[atomic_num] end
the exact same atom in the same molecule. The equivalency test for molecules is a little pricey, so better to use something like atom.id == other.id if you know you are working within the same molecule.
# File lib/rubabel/atom.rb, line 247 def equal?(other) other.respond_to?(:mol) && mol.equal?(other.mol) && id == other.id end
# File lib/rubabel/atom.rb, line 130 def exact_mass @ob.get_exact_mass end
# File lib/rubabel/atom.rb, line 371 def explicit_hydrogen_count @ob.explicit_hydrogen_count end
# File lib/rubabel/atom.rb, line 134 def formal_charge @ob.get_formal_charge end
# File lib/rubabel/atom.rb, line 139 def formal_charge=(val) @ob.set_formal_charge(val) end
retrieves the bond
# File lib/rubabel/atom.rb, line 96 def get_bond(atom) @ob.get_bond(atom.ob).andand.upcast end
# File lib/rubabel/atom.rb, line 358 def hbond_acceptor?() @ob.is_hbond_acceptor end
# File lib/rubabel/atom.rb, line 359 def hbond_donor?() @ob.is_hbond_donor end
# File lib/rubabel/atom.rb, line 360 def hbond_donor_h?() @ob.is_hbond_donor_h end
not recognizing get_heavy_valence right now for some reason
def heavy_valence
@ob.get_heavy_valence
end
# File lib/rubabel/atom.rb, line 149 def hetero_valence @ob.get_hetero_valence end
# File lib/rubabel/atom.rb, line 337 def heteroatom?() @ob.is_heteroatom end
# File lib/rubabel/atom.rb, line 153 def hyb @ob.get_hybridization end
# File lib/rubabel/atom.rb, line 328 def hydrogen?() @ob.is_hydrogen end
the total number of hydrogens bonded to the atom (implicit + explicit)
# File lib/rubabel/atom.rb, line 363 def hydrogen_count @ob.implicit_hydrogen_count + @ob.explicit_hydrogen_count end
# File lib/rubabel/atom.rb, line 52 def id @ob.get_id end
# File lib/rubabel/atom.rb, line 56 def id=(val) @ob.set_id(val) end
index of the atom (begins with 1)
# File lib/rubabel/atom.rb, line 61 def idx @ob.get_idx end
# File lib/rubabel/atom.rb, line 367 def implicit_hydrogen_count @ob.implicit_hydrogen_count end
# File lib/rubabel/atom.rb, line 157 def implicit_valence @ob.get_implicit_valence end
set the maximum number of connections expected for this atom
# File lib/rubabel/atom.rb, line 310 def implicit_valence=(val) @ob.set_implicit_valence(val) end
# File lib/rubabel/atom.rb, line 335 def in_ring?() @ob.is_in_ring end
# File lib/rubabel/atom.rb, line 336 def in_ring_size?() @ob.is_in_ring_size end
increase by one the maximum number of connections expected for this atom
# File lib/rubabel/atom.rb, line 315 def inc_implicit_valence! @ob.increment_implicit_valence end
# File lib/rubabel/atom.rb, line 405 def inspect "<#{type} id:#{id}>" end
# File lib/rubabel/atom.rb, line 409 def inspect_internals "<" << @ob.methods.grep(/get_/).map do |mthd| begin "#{mthd.to_s.sub(/get_/,'')}=#{@ob.send(mthd)}" rescue ArgumentError nil end end.compact.join(" ") << ">" end
# File lib/rubabel/atom.rb, line 161 def isotope @ob.get_isotope end
returns the molecule that is parent of this atom
# File lib/rubabel/atom.rb, line 41 def mol @ob.get_parent.andand.upcast end
# File lib/rubabel/atom.rb, line 355 def negative_stereo?() @ob.is_negative_stereo end
# File lib/rubabel/atom.rb, line 345 def nitro_oxygen?() @ob.is_nitro_oxygen end
# File lib/rubabel/atom.rb, line 330 def nitrogen?() @ob.is_nitrogen end
# File lib/rubabel/atom.rb, line 348 def non_polar_hydrogen?() @ob.is_non_polar_hydrogen end
# File lib/rubabel/atom.rb, line 338 def not_c_or_h?() @ob.is_not_cor_h end
# File lib/rubabel/atom.rb, line 341 def one_four?() @ob.is_one_four end
# File lib/rubabel/atom.rb, line 340 def one_three?() @ob.is_one_three end
# File lib/rubabel/atom.rb, line 331 def oxygen?() @ob.is_oxygen end
# File lib/rubabel/atom.rb, line 165 def partial_charge @ob.get_partial_charge end
# File lib/rubabel/atom.rb, line 343 def phosphate_oxygen?() @ob.is_phosphate_oxygen end
# File lib/rubabel/atom.rb, line 333 def phosphorus?() @ob.is_phosphorus end
# File lib/rubabel/atom.rb, line 347 def polar_hydrogen?() @ob.is_polar_hydrogen end
# File lib/rubabel/atom.rb, line 354 def positive_stereo?() @ob.is_positive_stereo end
removes a proton with its electrons from an atom. This gives precisely the same molecule as if the molecule were input by smiles. csmiles, formula, exact_mass
, valence, implicit_valence
, etc.
mol = Rubabel["CC"] mol[1].remove_a_hydride! mol == Rubabel["C[CH2+]"] # in all characteristics
Note, however, that with explicit hydrogens, the partial charge is not matching up, even though every other property seems to be. I’m not sure why this is.
mol == Rubabel["C[CH2+]"].add_h! mol[1].remove_a_hydride! mol == Rubabel["C[CH2+]"].add_h! # identical except in partial charge!
# File lib/rubabel/atom.rb, line 234 def remove_a_hydride!(add_placeholder_hydrogens=false) remove_a_hydrogen!(2, add_placeholder_hydrogens) end
# File lib/rubabel/atom.rb, line 193 def remove_a_hydrogen!(with_num_electrons=1, add_placeholder_hydrogens=false) self.dec_implicit_valence! case with_num_electrons when 0 self.charge -= 1 when 1 raise NotImplementedError, "not doing free radicals just yet" when 2 self.charge += 1 end if @ob.explicit_hydrogen_count > 0 _obmol = @ob.get_parent each do |atom| if atom.hydrogen? _obmol.delete_atom(atom.ob, false) break end end else if add_placeholder_hydrogens @ob.get_parent.add_hydrogens(@ob) end end self end
# File lib/rubabel/atom.rb, line 189 def remove_a_proton!(add_placeholder_hydrogens=false) remove_a_hydrogen!(0, add_placeholder_hydrogens) end
# File lib/rubabel/atom.rb, line 380 def single_bond? each_bond.any? {|bond| bond.bond_order == 1 } end
puts self.inspect_internals puts “EXAMIN B:” p self p self.charge (self.charge = self.charge - 1) if remove_charge puts “EXAMIN A:” puts self.inspect_internals p self p self.charge puts “BEFORE:” p mol.formula p mol.atoms mol.add_bond!(self, mol.add_atom!(1)) puts “AFTER:” p mol.formula p mol.atoms abort ‘here’ self end
# File lib/rubabel/atom.rb, line 286 def spin @ob.get_spin_multiplicity end
# File lib/rubabel/atom.rb, line 290 def spin=(val) @ob.set_spin_multiplicity(val) end
# File lib/rubabel/atom.rb, line 344 def sulfate_oxygen?() @ob.is_sulfate_oxygen end
# File lib/rubabel/atom.rb, line 332 def sulfur?() @ob.is_sulfur end
# File lib/rubabel/atom.rb, line 294 def type @ob.get_type end
Returns the current number of explicit connections. Don’t confuse this for implicit_valence.
# File lib/rubabel/atom.rb, line 300 def valence @ob.get_valence end
# File lib/rubabel/atom.rb, line 324 def vector @ob.get_vector end