Steps for Determining the PDBtoVIPER Matrix: Get the program source here, or go to the web tool here.
 1.
 Find the centroid of the asymmetric unit in the PDB file
 1a.
 If the capsid has Tnumber = 3, the reference atom should be shifted slightly towards the 3fold axis matching the equivalent positive x VIPER 3fold axis closest to the positive z axis.
 2.
 Get all of the 60 rotation matrices (BIOMT records) used to generate
the capsid from the PDB file. Each matrix is then decomposed into angleaxis
form using the following equations and taking into account the singularities
for acos at +/ 1
angle = acos((t[0][0]+t[1][1]+t[2][2]1)/2)
m = sqrt((t[2][1]t[1][2])*(t[2][1]t[1][2]) +
(t[0][2]t[2][0])*(t[0][2]t[2][0]) +
(t[1][0]t[0][1])*(t[1][0]t[0][1])
x = (t[2][1]t[1][2])/m
y = (t[0][2]t[2][0])/m
z = (t[1][0]t[0][1])/m
 3.
 Find the translation vector needed to move the center of the complete particle to the origin, by averaging the components of the PDB translation vectors and negating them.
 4.
 Apply the translation vector from step 3 to the reference atom. Take the axes from step 2 and order them according to their distance to the translated reference atom
 5.
 Take the two closest axes from the list above with angles of ration 72 or 144 degrees (identifying a 5fold axis), and 120 degrees (3fold axis). Find the unit vector representing the plane formed by them, by taking the cross product of the 5fold and 3fold and normalizing the result
 6.
 Find the unit vector representing the plane formed by the VIPER 5fold and 3fold axes that are part of the set of axes surrounding the 1/60 VIPER coordinates by taking their cross product and normalizing it.
5fold: (0, .527, .851) 3fold: (.357, 0, .394)
 7.
 Take the two planes from the steps above and find the angleaxis of rotation from the PDB plane t other VIPER plane the angle = acos(PDB x VIPER) and the axis = PDB x VIPER normalized. Turn this into a rotation matrix, using the following equations:
a = 1cos(angle), c=cos(angle), s=sin(angle)
t[0][0] = a*x*x+c, t[0][1] = a*x*yz*s, t[0][2] = a*x*z+y*s
t[1][0] = a*x*y+z*s, t[1][1] = a*y*y+c, t[1][2] = a*y*zx*s
t[2][0] = a*x*zy*s, t[2][1] = a*y*z+x*s, t[2][2] = a*z*z+c
 8.
 Apply the above matrix to the PDB 5fold axis, and then find the rotation matrix from the PDB 5fold to the VIPER 5fold. Multiply the matrix from step 7 with this matrix to get the final rotation matrix.
 9.
 Multiply the final rotation matrix with the translation vector from step 3 to get the final translation vector.
a
+
b
2
