# module Bio::PDB::Utils

Utility methods for `PDB` data. The methods in this mixin should be applicalbe to all `PDB` objects.

### Constants

ElementMass

Returns the coords of the centre of gravity for any `AtomFinder` implementing object Blleurgh! - working out what element it is from the atom name is tricky - this'll work in most cases but not metals etcâ€¦ a proper element field is included in some `PDB` files but not all.

### Public Class Methods

acos(x) click to toggle source

acos

```    # File lib/bio/db/pdb/utils.rb
168 def acos(x)
169   Math.atan2(Math.sqrt(1 - x**2),x)
170 end```
calculatePlane(coord1, coord2, coord3) click to toggle source

calculates plane

```    # File lib/bio/db/pdb/utils.rb
174 def calculatePlane(coord1, coord2, coord3)
175   a = coord1.y * (coord2.z - coord3.z) +
176       coord2.y * (coord3.z - coord1.z) +
177       coord3.y * (coord1.z - coord2.z)
178   b = coord1.z * (coord2.x - coord3.x) +
179       coord2.z * (coord3.x - coord1.x) +
180       coord3.z * (coord1.x - coord2.x)
181   c = coord1.x * (coord2.y - coord3.y) +
182       coord2.x * (coord3.y - coord1.y) +
183       coord3.x * (coord1.y - coord2.y)
184   d = -1 *
185       (
186        (coord1.x * (coord2.y * coord3.z - coord3.y * coord2.z)) +
187        (coord2.x * (coord3.y * coord1.z - coord1.y * coord3.z)) +
188        (coord3.x * (coord1.y * coord2.z - coord2.y * coord1.z))
189        )
190
191   return [a,b,c,d]
192 end```
convert_to_xyz(obj) click to toggle source

Implicit conversion into Vector or `Bio::PDB::Coordinate`

```    # File lib/bio/db/pdb/utils.rb
139 def convert_to_xyz(obj)
140   unless obj.is_a?(Vector)
141     begin
142       obj = obj.xyz
143     rescue NameError
144       obj = Vector.elements(obj.to_a)
145     end
146   end
147   obj
148 end```
dihedral_angle(coord1, coord2, coord3, coord4) click to toggle source

Calculates dihedral angle.

```    # File lib/bio/db/pdb/utils.rb
124 def dihedral_angle(coord1, coord2, coord3, coord4)
125   (a1,b1,c1,d) = calculatePlane(coord1,coord2,coord3)
126   (a2,b2,c2)   = calculatePlane(coord2,coord3,coord4)
127
128   torsion = acos((a1*a2 + b1*b2 + c1*c2)/(Math.sqrt(a1**2 + b1**2 + c1**2) * Math.sqrt(a2**2 + b2**2 + c2**2)))
129
130   if ((a1*coord4.x + b1*coord4.y + c1*coord4.z + d) < 0)
131     -torsion
132   else
133     torsion
134   end
135 end```
distance(coord1, coord2) click to toggle source

Calculates distance between coord1 and coord2.

```    # File lib/bio/db/pdb/utils.rb
116 def distance(coord1, coord2)
117   coord1 = convert_to_xyz(coord1)
118   coord2 = convert_to_xyz(coord2)
119   (coord1 - coord2).r
120 end```

```    # File lib/bio/db/pdb/utils.rb
163   (r/Math::PI)*180
164 end```
to_xyz(obj) click to toggle source

(Deprecated) alias of `convert_to_xyz`(obj)

```    # File lib/bio/db/pdb/utils.rb
152 def self.to_xyz(obj)
153   convert_to_xyz(obj)
154 end```

### Public Instance Methods

centreOfGravity() click to toggle source

calculates centre of gravitiy

```    # File lib/bio/db/pdb/utils.rb
91 def centreOfGravity()
92   x = y = z = total = 0
93
94   self.each_atom{ |atom|
95     element = atom.element[0,1]
96     mass    = ElementMass[element]
97     total += mass
98     x += atom.x * mass
99     y += atom.y * mass
100     z += atom.z * mass
101   }
102
103   x = x / total
104   y = y / total
105   z = z / total
106
107   Coordinate[x,y,z]
108 end```
finder(findtype) { |obj| ... } click to toggle source

Every class in the heirarchy implements finder, this takes a class which determines which type of object to find, the associated block is then run in classic .find style.

The method might be deprecated. You'd better using find_XXX directly.

```    # File lib/bio/db/pdb/utils.rb
201 def finder(findtype, &block) #:yields: obj
202   if findtype == Bio::PDB::Atom
203     return self.find_atom(&block)
204   elsif findtype == Bio::PDB::Residue
205     return self.find_residue(&block)
206   elsif findtype == Bio::PDB::Chain
207     return self.find_chain(&block)
208   elsif findtype == Bio::PDB::Model
209     return self.find_model(&block)
210   else
211     raise TypeError, "You can't find a #{findtype}"
212   end
213 end```
geometricCentre(method = :each_atom) click to toggle source

Returns the coordinates of the geometric centre (average co-ord) of any `AtomFinder` (or .atoms) implementing object

If you want to get the geometric centre of hetatms, call geometricCentre(:each_hetatm).

```   # File lib/bio/db/pdb/utils.rb
59 def geometricCentre(method = :each_atom)
60   x = y = z = count = 0
61
62   self.__send__(method) do |atom|
63     x += atom.x
64     y += atom.y
65     z += atom.z
66     count += 1
67   end
68
69   x = (x / count)
70   y = (y / count)
71   z = (z / count)
72
73   Coordinate[x,y,z]
74 end```