IMP  2.3.0
The Integrative Modeling Platform
chimera_models.py
1 #!/usr/bin/env python
2 
3 __doc__ = "Generate complete models from Chimera transformations file."
4 
5 import sys
6 import IMP
7 import IMP.atom
8 from IMP import OptionParser
9 
10 
11 def parse_args():
12  usage = """%prog [options] <subunit> <symmetry degree>
13  <transformations file> <number of models> <output models>
14 
15 This script, given the structure of a single subunit and the Chimera
16 transformations file, applies the transformations to generate a number of
17 complete models.
18 
19  <subunit> subunit PDB, the same given to MultiFit.
20  <symmetry degree> Cn degree.
21  <transformations file> MultiFit output in chimera output format.
22  <number of models> number of models to print.
23  <output models> Solutions are written as output.i.pdb."""
24  parser = OptionParser(usage)
25  opts, args = parser.parse_args()
26  if len(args) != 5:
27  parser.error("incorrect number of arguments")
28  return args
29 
30 
31 def get_transformations(sol):
32  [ind, dock_rot_s, dock_trans_s, fit_rot_s,
33  fit_trans_s, cc_s] = sol.split("|")
34  s = dock_rot_s.split(" ")
35  s1 = dock_trans_s.split(" ")
38  float(s[0]), float(s[1]), float(s[2]),
39  float(s[3]), float(s[4]), float(s[5]),
40  float(s[6]), float(s[7]), float(s[8])),
41  IMP.algebra.Vector3D(float(s1[0]), float(s1[1]), float(s1[2])))
42  s = fit_rot_s.split(" ")
43  s1 = fit_trans_s.split(" ")
46  float(s[0]), float(s[1]), float(s[2]),
47  float(s[3]), float(s[4]), float(s[5]),
48  float(s[6]), float(s[7]), float(s[8])),
49  IMP.algebra.Vector3D(float(s1[0]), float(s1[1]), float(s1[2])))
50  return dock_t, fit_t
51 
52 
53 def run(subunit_fn, symm_deg, sol_fn, num, output_fn):
54  mdl = IMP.kernel.Model()
55  mhs = []
56  for i in range(symm_deg):
57  mh = IMP.atom.read_pdb(subunit_fn, mdl)
58  mhs.append(mh)
59  IMP.atom.setup_as_rigid_body(mh)
60  lines = open(sol_fn).readlines()
61  for j, sol in enumerate(lines[:num]):
62  dock_t, fit_t = get_transformations(sol)
63  curr_t = dock_t
64  for i in range(symm_deg):
65  IMP.core.transform(IMP.core.RigidBody(mhs[i]), curr_t)
66  curr_t = dock_t * curr_t
67  for i in range(symm_deg):
69  IMP.atom.write_pdb(mhs, output_fn + ".%03d.pdb" % j)
70 
71 
72 def main():
73  args = parse_args()
74  run(args[0], int(args[1]), args[2], int(args[3]), args[4])
75 
76 if __name__ == "__main__":
77  main()
Simple 3D transformation class.
void write_pdb(const Selection &mhd, base::TextOutput out, unsigned int model=1)
void transform(XYZ a, const algebra::Transformation3D &tr)
Apply a transformation to the particle.
Rotation3D get_rotation_from_matrix(IMP_Eigen::Matrix3d m)
Generate a Rotation3D object from a rotation matrix.
IMP::kernel::OptionParser OptionParser
VectorD< 3 > Vector3D
Definition: VectorD.h:395
A decorator for a rigid body.
Definition: rigid_bodies.h:75
Functionality for loading, creating, manipulating and scoring atomic structures.
void read_pdb(base::TextInput input, int model, Hierarchy h)
Class for storing model, its restraints, constraints, and particles.
Definition: kernel/Model.h:73