class Rubabel::Atom

Attributes

ob[RW]

the OpenBabel::OBAtom object

Public Class Methods

new(obatom) click to toggle source
# File lib/rubabel/atom.rb, line 48
def initialize(obatom)
  @ob = obatom
end

Public Instance Methods

<<(arg, bond_order=1)
Alias for: bond!
==(other)
Alias for: equal?
amide_nitrogen?() click to toggle source
# File lib/rubabel/atom.rb, line 346
def amide_nitrogen?() @ob.is_amide_nitrogen end
anti_clockwise?() click to toggle source
# File lib/rubabel/atom.rb, line 353
def anti_clockwise?() @ob.is_anti_clockwise end
aromatic?() click to toggle source
# File lib/rubabel/atom.rb, line 334
def aromatic?() @ob.is_aromatic end
aromatic_noxide?() click to toggle source
# File lib/rubabel/atom.rb, line 349
def aromatic_noxide?() @ob.is_aromatic_noxide end
atomic_mass() click to toggle source
# File lib/rubabel/atom.rb, line 122
def atomic_mass
  @ob.get_atomic_mass
end
atomic_num() click to toggle source
# File lib/rubabel/atom.rb, line 126
def atomic_num
  @ob.get_atomic_num
end
atoms() click to toggle source

returns the neighboring atoms. Consider using each_atom.

# File lib/rubabel/atom.rb, line 118
def atoms
  each_atom.map.to_a
end
axial?() click to toggle source
# File lib/rubabel/atom.rb, line 351
def axial?() @ob.is_axial end
bond!(arg, bond_order=1) click to toggle source

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
Also aliased as: <<
bonds() click to toggle source

returns the bonds. Consider using each_bond.

# File lib/rubabel/atom.rb, line 101
def bonds
  each_bond.map.to_a
end
carbon?() click to toggle source
# File lib/rubabel/atom.rb, line 329
def carbon?() @ob.is_carbon end
carbonyl_carbon?() click to toggle source
# File lib/rubabel/atom.rb, line 393
def carbonyl_carbon?
  each_atom.any?(&:carbonyl_oxygen?)
end
carbonyl_oxygen?() click to toggle source
# File lib/rubabel/atom.rb, line 388
def carbonyl_oxygen?
  ats = atoms
  ats.size == 1 && ats.first.el == :C && double_bond?
end
carboxyl_carbon?() click to toggle source
# File lib/rubabel/atom.rb, line 384
def carboxyl_carbon?
  each_atom.any?(&:carboxyl_oxygen?)
end
carboxyl_oxygen?() click to toggle source
# File lib/rubabel/atom.rb, line 342
def carboxyl_oxygen?() @ob.is_carboxyl_oxygen end
charge()
Alias for: formal_charge
charge=(val)
Alias for: formal_charge=
chiral?() click to toggle source
# File lib/rubabel/atom.rb, line 350
def chiral?() @ob.is_chiral end
chiral_volume?() click to toggle source
# File lib/rubabel/atom.rb, line 357
def chiral_volume?() @ob.has_chiral_volume end
chirality_specified?() click to toggle source
# File lib/rubabel/atom.rb, line 356
def chirality_specified?() @ob.has_chirality_specified end
clockwise?() click to toggle source
# File lib/rubabel/atom.rb, line 352
def clockwise?() @ob.is_clockwise end
connect!(atom, bond_order=1) click to toggle source

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
connected?() click to toggle source
# File lib/rubabel/atom.rb, line 339
def connected?() @ob.is_connected end
coords() click to toggle source

# 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
dec_implicit_valence!() click to toggle source

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
do_with_hydrogens(&block) click to toggle source

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
do_without_hydrogens(&block) click to toggle source

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
double_bond?() click to toggle source
# File lib/rubabel/atom.rb, line 376
def double_bond?
  each_bond.any? {|bond| bond.bond_order == 2 }
end
each(&block)
Alias for: each_atom
each_atom(&block) click to toggle source

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
Also aliased as: each
each_bond(&block) click to toggle source
# 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
el()
Alias for: element
element() click to toggle source

elemental symbol, properly capitalized and returned as a Symbol

# File lib/rubabel/atom.rb, line 66
def element
  NUM_TO_ELEMENT[atomic_num]
end
Also aliased as: el
eql?(other)
Alias for: equal?
equal?(other) click to toggle source

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
Also aliased as: ==, eql?
exact_mass() click to toggle source
# File lib/rubabel/atom.rb, line 130
def exact_mass
  @ob.get_exact_mass
end
explicit_hydrogen_count() click to toggle source
# File lib/rubabel/atom.rb, line 371
def explicit_hydrogen_count
  @ob.explicit_hydrogen_count
end
formal_charge() click to toggle source
# File lib/rubabel/atom.rb, line 134
def formal_charge
  @ob.get_formal_charge
end
Also aliased as: charge
formal_charge=(val) click to toggle source
# File lib/rubabel/atom.rb, line 139
def formal_charge=(val)
  @ob.set_formal_charge(val)
end
Also aliased as: charge=
get_bond(atom) click to toggle source

retrieves the bond

# File lib/rubabel/atom.rb, line 96
def get_bond(atom)
  @ob.get_bond(atom.ob).andand.upcast
end
hbond_acceptor?() click to toggle source
# File lib/rubabel/atom.rb, line 358
def hbond_acceptor?() @ob.is_hbond_acceptor end
hbond_donor?() click to toggle source
# File lib/rubabel/atom.rb, line 359
def hbond_donor?() @ob.is_hbond_donor end
hbond_donor_h?() click to toggle source
# File lib/rubabel/atom.rb, line 360
def hbond_donor_h?() @ob.is_hbond_donor_h end
hetero_valence() click to toggle source
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
heteroatom?() click to toggle source
# File lib/rubabel/atom.rb, line 337
def heteroatom?() @ob.is_heteroatom end
hyb() click to toggle source
# File lib/rubabel/atom.rb, line 153
def hyb
  @ob.get_hybridization
end
hydrogen?() click to toggle source
# File lib/rubabel/atom.rb, line 328
def hydrogen?() @ob.is_hydrogen end
hydrogen_count() click to toggle source

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
Also aliased as: num_h
id() click to toggle source
# File lib/rubabel/atom.rb, line 52
def id
  @ob.get_id
end
id=(val) click to toggle source
# File lib/rubabel/atom.rb, line 56
def id=(val)
  @ob.set_id(val)
end
idx() click to toggle source

index of the atom (begins with 1)

# File lib/rubabel/atom.rb, line 61
def idx
  @ob.get_idx
end
implicit_hydrogen_count() click to toggle source
# File lib/rubabel/atom.rb, line 367
def implicit_hydrogen_count
  @ob.implicit_hydrogen_count
end
implicit_valence() click to toggle source
# File lib/rubabel/atom.rb, line 157
def implicit_valence
  @ob.get_implicit_valence
end
implicit_valence=(val) click to toggle source

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
in_ring?() click to toggle source
# File lib/rubabel/atom.rb, line 335
def in_ring?() @ob.is_in_ring end
in_ring_size?() click to toggle source
# File lib/rubabel/atom.rb, line 336
def in_ring_size?() @ob.is_in_ring_size end
inc_implicit_valence!() click to toggle source

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
inspect() click to toggle source
# File lib/rubabel/atom.rb, line 405
def inspect
  "<#{type} id:#{id}>"
end
inspect_internals() click to toggle source
# 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
isotope() click to toggle source
# File lib/rubabel/atom.rb, line 161
def isotope
  @ob.get_isotope
end
mol() click to toggle source

returns the molecule that is parent of this atom

# File lib/rubabel/atom.rb, line 41
def mol
  @ob.get_parent.andand.upcast
end
negative_stereo?() click to toggle source
# File lib/rubabel/atom.rb, line 355
def negative_stereo?() @ob.is_negative_stereo end
nitro_oxygen?() click to toggle source
# File lib/rubabel/atom.rb, line 345
def nitro_oxygen?() @ob.is_nitro_oxygen end
nitrogen?() click to toggle source
# File lib/rubabel/atom.rb, line 330
def nitrogen?() @ob.is_nitrogen end
non_polar_hydrogen?() click to toggle source
# File lib/rubabel/atom.rb, line 348
def non_polar_hydrogen?() @ob.is_non_polar_hydrogen end
not_c_or_h?() click to toggle source
# File lib/rubabel/atom.rb, line 338
def not_c_or_h?() @ob.is_not_cor_h end
num_h()
Alias for: hydrogen_count
one_four?() click to toggle source
# File lib/rubabel/atom.rb, line 341
def one_four?() @ob.is_one_four end
one_three?() click to toggle source
# File lib/rubabel/atom.rb, line 340
def one_three?() @ob.is_one_three end
oxygen?() click to toggle source
# File lib/rubabel/atom.rb, line 331
def oxygen?() @ob.is_oxygen end
partial_charge() click to toggle source
# File lib/rubabel/atom.rb, line 165
def partial_charge
  @ob.get_partial_charge
end
phosphate_oxygen?() click to toggle source
# File lib/rubabel/atom.rb, line 343
def phosphate_oxygen?() @ob.is_phosphate_oxygen end
phosphorus?() click to toggle source
# File lib/rubabel/atom.rb, line 333
def phosphorus?() @ob.is_phosphorus end
polar_hydrogen?() click to toggle source
# File lib/rubabel/atom.rb, line 347
def polar_hydrogen?() @ob.is_polar_hydrogen end
positive_stereo?() click to toggle source
# File lib/rubabel/atom.rb, line 354
def positive_stereo?() @ob.is_positive_stereo end
remove_a_hydride!(add_placeholder_hydrogens=false) click to toggle source

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
remove_a_hydrogen!(with_num_electrons=1, add_placeholder_hydrogens=false) click to toggle source
# 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
remove_a_proton!(add_placeholder_hydrogens=false) click to toggle source
# File lib/rubabel/atom.rb, line 189
def remove_a_proton!(add_placeholder_hydrogens=false)
  remove_a_hydrogen!(0, add_placeholder_hydrogens)
end
single_bond?() click to toggle source
# File lib/rubabel/atom.rb, line 380
def single_bond?
  each_bond.any? {|bond| bond.bond_order == 1 }
end
spin() click to toggle source

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
spin=(val) click to toggle source
# File lib/rubabel/atom.rb, line 290
def spin=(val)
  @ob.set_spin_multiplicity(val)
end
sulfate_oxygen?() click to toggle source
# File lib/rubabel/atom.rb, line 344
def sulfate_oxygen?() @ob.is_sulfate_oxygen end
sulfur?() click to toggle source
# File lib/rubabel/atom.rb, line 332
def sulfur?() @ob.is_sulfur end
type() click to toggle source
# File lib/rubabel/atom.rb, line 294
def type
  @ob.get_type
end
valence() click to toggle source

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
vector() click to toggle source
# File lib/rubabel/atom.rb, line 324
def vector
  @ob.get_vector
end