3 """@namespace IMP.pmi.representation
4 Representation of the system.
7 from __future__
import print_function
20 from math
import pi, sqrt
21 from operator
import itemgetter
26 def __init__(self, doi, root):
30 def get_fname(self, fname):
31 """Return a path relative to the top of the repository"""
32 return os.path.relpath(fname, self._root)
34 class _StateInfo(object):
35 """Score state-specific information about this representation."""
39 class Representation(object):
43 Set up the representation of all proteins and nucleic acid macromolecules.
45 Create the molecular hierarchies, representation,
46 sequence connectivity for the various involved proteins and
47 nucleic acid macromolecules:
49 Create a protein, DNA or RNA, represent it as a set of connected balls of appropriate
50 radii and number of residues, PDB at given resolution(s), or ideal helices.
52 How to use the SimplifiedModel class (typical use):
54 see test/test_hierarchy_contruction.py
58 1) Create a chain of helices and flexible parts
60 c_1_119 =self.add_component_necklace("prot1",1,119,20)
61 c_120_131 =self.add_component_ideal_helix("prot1",resolutions=[1,10],resrange=(120,131))
62 c_132_138 =self.add_component_beads("prot1",[(132,138)])
63 c_139_156 =self.add_component_ideal_helix("prot1",resolutions=[1,10],resrange=(139,156))
64 c_157_174 =self.add_component_beads("prot1",[(157,174)])
65 c_175_182 =self.add_component_ideal_helix("prot1",resolutions=[1,10],resrange=(175,182))
66 c_183_194 =self.add_component_beads("prot1",[(183,194)])
67 c_195_216 =self.add_component_ideal_helix("prot1",resolutions=[1,10],resrange=(195,216))
68 c_217_250 =self.add_component_beads("prot1",[(217,250)])
71 self.set_rigid_body_from_hierarchies(c_120_131)
72 self.set_rigid_body_from_hierarchies(c_139_156)
73 self.set_rigid_body_from_hierarchies(c_175_182)
74 self.set_rigid_body_from_hierarchies(c_195_216)
76 clist=[c_1_119,c_120_131,c_132_138,c_139_156,c_157_174,c_175_182,c_183_194,c_195_216,
79 self.set_chain_of_super_rigid_bodies(clist,2,3)
81 self.set_super_rigid_bodies(["prot1"])
85 def __init__(self, m, upperharmonic=True, disorderedlength=True):
88 @param upperharmonic This flag uses either harmonic (False)
89 or upperharmonic (True) in the intra-pair
90 connectivity restraint.
91 @param disorderedlength This flag uses either disordered length
92 calculated for random coil peptides (True) or zero
93 surface-to-surface distance between beads (False)
94 as optimal distance for the sequence connectivity
98 self.state = _StateInfo()
100 self._file_dataset = {}
101 self._protocol_output = []
110 self.upperharmonic = upperharmonic
111 self.disorderedlength = disorderedlength
112 self.rigid_bodies = []
113 self.fixed_rigid_bodies = []
114 self.fixed_floppy_bodies = []
115 self.floppy_bodies = []
121 self.super_rigid_bodies = []
122 self.rigid_body_symmetries = []
123 self.output_level =
"low"
126 self.maxtrans_rb = 2.0
127 self.maxrot_rb = 0.04
128 self.maxtrans_srb = 2.0
129 self.maxrot_srb = 0.2
130 self.rigidbodiesarefixed =
False
131 self.floppybodiesarefixed =
False
132 self.maxtrans_fb = 3.0
133 self.resolution = 10.0
134 self.bblenght = 100.0
138 self.representation_is_modified =
False
139 self.unmodeledregions_cr_dict = {}
140 self.sortedsegments_cr_dict = {}
142 self.connected_intra_pairs = []
145 self.sequence_dict = {}
146 self.hier_geometry_pairs = {}
152 self.hier_representation = {}
153 self.hier_resolution = {}
156 self.reference_structures = {}
159 self.linker_restraints.set_was_used(
True)
160 self.linker_restraints_dict = {}
161 self.threetoone = {
'ALA':
'A',
'ARG':
'R', 'ASN': 'N', 'ASP': 'D',
162 'CYS':
'C',
'GLU':
'E',
'GLN':
'Q',
'GLY':
'G',
163 'HIS':
'H',
'ILE':
'I',
'LEU':
'L',
'LYS':
'K',
164 'MET':
'M',
'PHE':
'F',
'PRO':
'P',
'SER':
'S',
165 'THR':
'T',
'TRP':
'W',
'TYR':
'Y',
'VAL':
'V',
'UNK':
'X'}
167 self.onetothree = dict((v, k)
for k, v
in self.threetoone.items())
172 """Associate some metadata with this modeling.
173 @param m an instance of IMP.pmi.metadata.Metadata or a subclass.
175 self._metadata.append(m)
178 """Associate a dataset with a filename.
179 This can be used to identify how the file was produced (in many
180 cases IMP can determine this automatically from a file header or
181 other metadata, but not always). For example, a manually-produced
182 PDB file (not from the PDB database or Modeller) can be
184 @param fname filename
185 @dataset the IMP.pmi.metadata.Dataset object to associate.
187 self._file_dataset[os.path.abspath(fname)] = dataset
190 """Get the dataset associated with a filename, or None.
191 @param fname filename
192 @return an IMP.pmi.metadata.Dataset, or None.
194 return self._file_dataset.get(os.path.abspath(fname),
None)
197 """Capture details of the modeling protocol.
198 @param p an instance of IMP.pmi.output.ProtocolOutput or a subclass.
200 state = p._add_state(self)
201 self._protocol_output.append((p, state))
202 p._each_metadata.append(self._metadata)
203 p._file_datasets.append(self._file_dataset)
205 state.prot = self.prot
206 protocol_output = property(
lambda self:
207 [x[0]
for x
in self._protocol_output])
209 def set_label(self, label):
212 def create_component(self, name, color=0.0):
214 protein_h.set_name(name)
215 self.hier_dict[name] = protein_h
216 self.hier_representation[name] = {}
217 self.hier_db.add_name(name)
218 self.prot.add_child(protein_h)
219 self.color_dict[name] = color
220 self.elements[name] = []
221 for p, state
in self._protocol_output:
222 p.create_component(state, name,
True)
225 """Create a component that isn't used in the modeling.
226 No coordinates or other structural data for this component will
227 be read or written, but a primary sequence can be assigned. This
228 is useful if the input experimental data is of a system larger
229 than that modeled. Any references to these non-modeled components
230 can then be correctly resolved later."""
231 self.elements[name] = []
232 for p, state
in self._protocol_output:
233 p.create_component(state, name,
False)
238 def add_component_name(self, *args, **kwargs):
239 self.create_component(*args, **kwargs)
241 def get_component_names(self):
242 return list(self.hier_dict.keys())
247 Add the primary sequence for a single component.
249 @param name Human-readable name of the component
250 @param filename Name of the FASTA file
251 @param id Identifier of the sequence in the FASTA file header
252 (if not provided, use `name` instead)
257 if id
not in record_dict:
258 raise KeyError(
"id %s not found in fasta file" % id)
259 length = len(record_dict[id])
260 self.sequence_dict[name] = str(record_dict[id])
263 self.sequence_dict[name]=offs_str+self.sequence_dict[name]
265 self.elements[name].append((length, length,
" ",
"end"))
266 for p, state
in self._protocol_output:
267 p.add_component_sequence(name, self.sequence_dict[name])
269 def autobuild_model(self, name, pdbname, chain,
270 resolutions=
None, resrange=
None,
272 color=
None, pdbresrange=
None, offset=0,
273 show=
False, isnucleicacid=
False,
276 self.representation_is_modified =
True
280 color = self.color_dict[name]
282 self.color_dict[name] = color
284 if resolutions
is None:
286 print(
"autobuild_model: constructing %s from pdb %s and chain %s" % (name, pdbname, str(chain)))
295 t.get_children()[0].get_children()[0]).
get_index()
297 t.get_children()[0].get_children()[-1]).
get_index()
303 if name
in self.sequence_dict:
304 resrange = (1, len(self.sequence_dict[name]))
306 resrange = (start + offset, end + offset)
308 if resrange[1]
in (-1,
'END'):
309 resrange = (resrange[0],end)
310 start = resrange[0] - offset
311 end = resrange[1] - offset
330 for n, g
in enumerate(gaps):
334 print(
"autobuild_model: constructing fragment %s from pdb" % (str((first, last))))
336 chain, resolutions=resolutions,
337 color=color, cacenters=
True,
338 resrange=(first, last),
339 offset=offset, isnucleicacid=isnucleicacid)
340 elif g[2] ==
"gap" and n > 0:
341 print(
"autobuild_model: constructing fragment %s as a bead" % (str((first, last))))
342 parts = self.hier_db.get_particles_at_closest_resolution(name,
347 first+offset, last+offset, missingbeadsize, incoord=xyz)
349 elif g[2] ==
"gap" and n == 0:
351 print(
"autobuild_model: constructing fragment %s as a bead" % (str((first, last))))
353 first+offset, last+offset, missingbeadsize, incoord=xyznter)
360 def autobuild_pdb_and_intervening_beads(self, *args, **kwargs):
361 r = self.autobuild_model(*args, **kwargs)
365 resrange=
None, offset=0, cacenters=
True, show=
False,
366 isnucleicacid=
False, readnonwateratoms=
False,
367 read_ca_cb_only=
False):
369 Add a component that has an associated 3D structure in a PDB file.
371 Reads the PDB, and constructs the fragments corresponding to contiguous
374 @return a list of hierarchies.
376 @param name (string) the name of the component
377 @param pdbname (string) the name of the PDB file
378 @param chain (string or integer) can be either a string (eg, "A")
379 or an integer (eg, 0 or 1) in case you want
380 to get the corresponding chain number in the PDB.
381 @param resolutions (integers) a list of integers that corresponds
382 to the resolutions that have to be generated
383 @param color (float from 0 to 1) the color applied to the
384 hierarchies generated
385 @param resrange (tuple of integers): the residue range to extract
386 from the PDB. It is a tuple (beg,end). If not specified,
387 all residues belonging to the specified chain are read.
388 @param offset (integer) specifies the residue index offset to be
389 applied when reading the PDB (the FASTA sequence is
390 assumed to start from residue 1, so use this parameter
391 if the PDB file does not start at residue 1)
392 @param cacenters (boolean) if True generates resolution=1 beads
393 centered on C-alpha atoms.
394 @param show (boolean) print out the molecular hierarchy at the end.
395 @param isnucleicacid (boolean) use True if you're reading a PDB
397 @param readnonwateratoms (boolean) if True fixes some pathological PDB.
398 @param read_ca_cb_only (boolean) if True, only reads CA/CB
401 self.representation_is_modified =
True
404 color = self.color_dict[name]
405 protein_h = self.hier_dict[name]
415 if type(chain) == str:
423 t.get_children()[0].get_children()[0]).
get_index()
425 t.get_children()[0].get_children()[-1]).
get_index()
426 c =
IMP.atom.Chain(IMP.atom.get_by_type(t, IMP.atom.CHAIN_TYPE)[0])
430 IMP.atom.get_by_type(t, IMP.atom.CHAIN_TYPE)[chain])
437 if not resrange
is None:
438 if resrange[0] > start:
440 if resrange[1] < end:
443 if not isnucleicacid:
447 residue_indexes=list(range(
450 atom_type=IMP.atom.AT_CA)
457 residue_indexes=list(range(
460 atom_type=IMP.atom.AT_P)
462 ps = sel.get_selected_particles()
464 raise ValueError(
"%s no residue found in pdb %s chain %s that overlaps with the queried stretch %s-%s" \
465 % (name, pdbname, str(chain), str(resrange[0]), str(resrange[1])))
473 if par.get_parent() != c0:
474 par.get_parent().remove_child(par)
476 start = start + offset
479 self.elements[name].append(
480 (start, end, pdbname.split(
"/")[-1] +
":" + chain,
"pdb"))
483 resolutions, isnucleicacid, c0, protein_h,
"pdb", color)
485 for p, state
in self._protocol_output:
486 p.add_pdb_element(state, name, start, end, offset, pdbname, chain,
500 for r
in residues.keys():
502 self.m.remove_particle(c0)
508 def add_component_ideal_helix(
516 self.representation_is_modified =
True
517 from math
import pi, cos, sin
519 protein_h = self.hier_dict[name]
522 color = self.color_dict[name]
526 self.elements[name].append((start, end,
" ",
"helix"))
528 for n, res
in enumerate(range(start, end + 1)):
529 if name
in self.sequence_dict:
531 rtstr = self.onetothree[
532 self.sequence_dict[name][res-1]]
552 x = 2.3 * cos(n * 2 * pi / 3.6)
553 y = 2.3 * sin(n * 2 * pi / 3.6)
554 z = 6.2 / 3.6 / 2 * n * 2 * pi / 3.6
563 resolutions,
False, c0, protein_h,
"helix", color)
572 """ add beads to the representation
573 @param name the component name
574 @param ds a list of tuples corresponding to the residue ranges
576 @param colors a list of colors associated to the beads
577 @param incoord the coordinate tuple corresponding to the position
582 self.representation_is_modified =
True
584 protein_h = self.hier_dict[name]
587 colors = [self.color_dict[name]]
590 for n, dss
in enumerate(ds):
591 ds_frag = (dss[0], dss[1])
592 self.elements[name].append((dss[0], dss[1],
" ",
"bead"))
594 if ds_frag[0] == ds_frag[1]:
596 if name
in self.sequence_dict:
598 rtstr = self.onetothree[
599 self.sequence_dict[name][ds_frag[0]-1]]
606 h.set_name(name +
'_%i_bead' % (ds_frag[0]))
607 prt.set_name(name +
'_%i_bead' % (ds_frag[0]))
611 h.set_name(name +
'_%i-%i_bead' % (ds_frag[0], ds_frag[1]))
612 prt.set_name(name +
'_%i-%i_bead' % (ds_frag[0], ds_frag[1]))
613 h.set_residue_indexes(list(range(ds_frag[0], ds_frag[1] + 1)))
614 resolution = len(h.get_residue_indexes())
615 if "Beads" not in self.hier_representation[name]:
617 root.set_name(
"Beads")
618 self.hier_representation[name][
"Beads"] = root
619 protein_h.add_child(root)
620 self.hier_representation[name][
"Beads"].add_child(h)
622 for kk
in range(ds_frag[0], ds_frag[1] + 1):
623 self.hier_db.add_particles(name, kk, resolution, [h])
646 ptem.set_radius(radius)
649 radius = 0.8 * (3.0 / 4.0 / pi * volume) ** (1.0 / 3.0)
651 ptem.set_radius(radius)
653 if not tuple(incoord)
is None:
654 ptem.set_coordinates(incoord)
659 self.floppy_bodies.append(prt)
663 for p, state
in self._protocol_output:
664 p.add_bead_element(state, name, ds[0][0], ds[-1][1], len(ds),
672 Generates a string of beads with given length.
674 self.representation_is_modified =
True
682 [(chunk[0], chunk[-1])], colors=colors,incoord=incoord)
686 self, name, hierarchies=
None, selection_tuples=
None,
688 resolution=0.0, num_components=10,
689 inputfile=
None, outputfile=
None,
692 covariance_type=
'full', voxel_size=1.0,
694 sampled_points=1000000, num_iter=100,
696 multiply_by_total_mass=
True,
698 intermediate_map_fn=
None,
699 density_ps_to_copy=
None,
700 use_precomputed_gaussians=
False):
702 Sets up a Gaussian Mixture Model for this component.
703 Can specify input GMM file or it will be computed.
704 @param name component name
705 @param hierarchies set up GMM for some hierarchies
706 @param selection_tuples (list of tuples) example (first_residue,last_residue,component_name)
707 @param particles set up GMM for particles directly
708 @param resolution usual PMI resolution for selecting particles from the hierarchies
709 @param inputfile read the GMM from this file
710 @param outputfile fit and write the GMM to this file (text)
711 @param outputmap after fitting, create GMM density file (mrc)
712 @param kernel_type for creating the intermediate density (points are sampled to make GMM). Options are IMP.em.GAUSSIAN, IMP.em.SPHERE, and IMP.em.BINARIZED_SPHERE
713 @param covariance_type for fitting the GMM. options are 'full', 'diagonal' and 'spherical'
714 @param voxel_size for creating the intermediate density map and output map.
715 lower number increases accuracy but also rasterizing time grows
716 @param out_hier_name name of the output density hierarchy
717 @param sampled_points number of points to sample. more will increase accuracy and fitting time
718 @param num_iter num GMM iterations. more will increase accuracy and fitting time
719 @param multiply_by_total_mass multiply the weights of the GMM by this value (only works on creation!)
720 @param transform for input file only, apply a transformation (eg for multiple copies same GMM)
721 @param intermediate_map_fn for debugging, this will write the intermediate (simulated) map
722 @param density_ps_to_copy in case you already created the appropriate GMM (eg, for beads)
723 @param use_precomputed_gaussians Set this flag and pass fragments - will use roughly spherical Gaussian setup
731 self.representation_is_modified =
True
733 protein_h = self.hier_dict[name]
734 if "Densities" not in self.hier_representation[name]:
736 root.set_name(
"Densities")
737 self.hier_representation[name][
"Densities"] = root
738 protein_h.add_child(root)
741 fragment_particles = []
742 if not particles
is None:
743 fragment_particles += particles
744 if not hierarchies
is None:
746 self, resolution=resolution,
747 hierarchies=hierarchies)
748 if not selection_tuples
is None:
749 for st
in selection_tuples:
750 fragment_particles += IMP.pmi.tools.select_by_tuple(
751 self, tupleselection=st,
752 resolution=resolution,
753 name_is_ambiguous=
False)
756 density_particles = []
759 inputfile, density_particles,
761 elif density_ps_to_copy:
762 for ip
in density_ps_to_copy:
768 density_particles.append(p)
769 elif use_precomputed_gaussians:
770 if len(fragment_particles) == 0:
771 print(
"add_component_density: no particle was selected")
773 for p
in fragment_particles:
776 raise Exception(
"The particles you selected must be Fragments and XYZs")
778 pos=
IMP.core.XYZ(self.m,p.get_particle_index()).get_coordinates()
783 raise Exception(
"We haven't created a bead file for",nres,
"residues")
790 if len(fragment_particles) == 0:
791 print(
"add_component_density: no particle was selected")
794 density_particles = IMP.isd.gmm_tools.sample_and_fit_to_particles(
803 multiply_by_total_mass,
809 s0.set_name(out_hier_name)
810 self.hier_representation[name][
"Densities"].add_child(s0)
812 for nps, p
in enumerate(density_particles):
814 p.set_name(s0.get_name() +
'_gaussian_%i' % nps)
817 def get_component_density(self, name):
818 return self.hier_representation[name][
"Densities"]
821 selection_tuples=
None,
826 '''Decorates all specified particles as Gaussians directly.
827 @param name component name
828 @param hierarchies set up GMM for some hierarchies
829 @param selection_tuples (list of tuples) example (first_residue,last_residue,component_name)
830 @param particles set up GMM for particles directly
831 @param resolution usual PMI resolution for selecting particles from the hierarchies
837 from math
import sqrt
838 self.representation_is_modified =
True
840 if particles
is None:
841 fragment_particles = []
843 fragment_particles = particles
845 if not hierarchies
is None:
847 self, resolution=resolution,
848 hierarchies=hierarchies)
850 if not selection_tuples
is None:
851 for st
in selection_tuples:
852 fragment_particles += IMP.pmi.tools.select_by_tuple(
853 self, tupleselection=st,
854 resolution=resolution,
855 name_is_ambiguous=
False)
857 if len(fragment_particles) == 0:
858 print(
"add all atom densities: no particle was selected")
862 print(
'setting up all atom gaussians num_particles',len(fragment_particles))
863 for n,p
in enumerate(fragment_particles):
871 print(
'setting up particle',p.get_name(),
" as individual gaussian particle")
873 if not output_map
is None:
874 print(
'writing map to', output_map)
882 Make a copy of a hierarchy and append it to a component.
885 self.representation_is_modified =
True
886 protein_h = self.hier_dict[name]
887 hierclone = IMP.atom.create_clone(hierarchy)
888 hierclone.set_name(hierclone.get_name() +
"_clone")
889 protein_h.add_child(hierclone)
890 outhier.append(hierclone)
896 for n, pmain
in enumerate(psmain):
902 self.hier_db.add_particles(
918 def dump_particle_descriptors(self):
924 particles_attributes={}
925 floppy_body_attributes={}
931 hparent=h.get_parent()
932 while hparent != hroot:
933 hparent=h.get_parent()
934 name+=
"|"+hparent.get_name()
936 particles_attributes[name]={
"COORDINATES":numpy.array(
IMP.core.XYZR(leaf.get_particle()).get_coordinates()),
942 rigid_body_attributes={}
943 for rb
in self.rigid_bodies:
945 rf=rb.get_reference_frame()
946 t=rf.get_transformation_to()
947 trans=t.get_translation()
949 rigid_body_attributes[name]={
"TRANSLATION":numpy.array(trans),
950 "ROTATION":numpy.array(rot.get_quaternion()),
951 "COORDINATES_NONRIGID_MEMBER":{},
952 "COORDINATES_RIGID_MEMBER":{}}
953 for mi
in rb.get_member_indexes():
954 rm=self.m.get_particle(mi)
956 name_part=rm.get_name()
958 rigid_body_attributes[name][
"COORDINATES_NONRIGID_MEMBER"][name_part]=numpy.array(xyz)
960 name_part=rm.get_name()
962 rigid_body_attributes[name][
"COORDINATES_RIGID_MEMBER"][name_part]=numpy.array(xyz)
966 pickle.dump(particles_attributes,
967 open(
"particles_attributes.pkl",
"wb"))
968 pickle.dump(rigid_body_attributes,
969 open(
"rigid_body_attributes.pkl",
"wb"))
973 def load_particle_descriptors(self):
979 particles_attributes = pickle.load(open(
"particles_attributes.pkl",
981 rigid_body_attributes = pickle.load(open(
"rigid_body_attributes.pkl",
991 hparent=h.get_parent()
992 while hparent != hroot:
993 hparent=h.get_parent()
994 name+=
"|"+hparent.get_name()
998 xyzr.set_coordinates(particles_attributes[name][
"COORDINATES"])
1004 for rb
in self.rigid_bodies:
1006 trans=rigid_body_attributes[name][
"TRANSLATION"]
1007 rot=rigid_body_attributes[name][
"ROTATION"]
1010 rb.set_reference_frame(rf)
1011 coor_nrm_ref=rigid_body_attributes[name][
"COORDINATES_NONRIGID_MEMBER"]
1012 coor_rm_ref_dict=rigid_body_attributes[name][
"COORDINATES_RIGID_MEMBER"]
1015 for mi
in rb.get_member_indexes():
1016 rm=self.m.get_particle(mi)
1018 name_part=rm.get_name()
1019 xyz=coor_nrm_ref[name_part]
1021 self.m.set_attribute(fk, rm,xyz[n])
1023 name_part=rm.get_name()
1025 coor_rm_model.append(
IMP.core.XYZ(rm).get_coordinates())
1026 if len(coor_rm_model)==0:
continue
1032 def _compare_rmf_repr_names(self, rmfname, reprname, component_name):
1033 """Print a warning if particle names in RMF and model don't match"""
1034 def match_any_suffix():
1036 suffixes = [
"pdb",
"bead_floppy_body_rigid_body_member_floppy_body",
1037 "bead_floppy_body_rigid_body_member",
1040 if "%s_%s_%s" % (component_name, rmfname, s) == reprname:
1042 if rmfname != reprname
and not match_any_suffix():
1043 print(
"set_coordinates_from_rmf: WARNING rmf particle and "
1044 "representation particle names don't match %s %s"
1045 % (rmfname, reprname))
1049 rmf_component_name=
None,
1050 check_number_particles=
True,
1051 representation_name_to_rmf_name_map=
None,
1053 skip_gaussian_in_rmf=
False,
1054 skip_gaussian_in_representation=
False,
1056 force_rigid_update=
False):
1057 '''Read and replace coordinates from an RMF file.
1058 Replace the coordinates of particles with the same name.
1059 It assumes that the RMF and the representation have the particles
1061 @param component_name Component name
1062 @param rmf_component_name Name of the component in the RMF file
1063 (if not specified, use `component_name`)
1064 @param representation_name_to_rmf_name_map a dictionary that map
1065 the original rmf particle name to the recipient particle component name
1066 @param save_file: save a file with the names of particles of the component
1067 @param force_rigid_update: update the coordinates of rigid bodies
1068 (normally this should be called before rigid bodies are set up)
1072 prots = IMP.pmi.analysis.get_hiers_from_rmf(
1078 raise ValueError(
"cannot read hierarchy from rmf")
1082 if force_rigid_update:
1093 p, self.hier_dict.keys())
1094 if (protname
is None)
and (rmf_component_name
is not None):
1096 p, rmf_component_name)
1097 if (skip_gaussian_in_rmf):
1100 if (rmf_component_name
is not None)
and (protname == rmf_component_name):
1102 elif (rmf_component_name
is None)
and (protname == component_name):
1106 if (skip_gaussian_in_representation):
1117 reprnames=[p.get_name()
for p
in psrepr]
1118 rmfnames=[p.get_name()
for p
in psrmf]
1121 fl=open(component_name+
".txt",
"w")
1122 for i
in itertools.izip_longest(reprnames,rmfnames): fl.write(str(i[0])+
","+str(i[1])+
"\n")
1125 if check_number_particles
and not representation_name_to_rmf_name_map:
1126 if len(psrmf) != len(psrepr):
1127 fl=open(component_name+
".txt",
"w")
1128 for i
in itertools.izip_longest(reprnames,rmfnames): fl.write(str(i[0])+
","+str(i[1])+
"\n")
1129 raise ValueError(
"%s cannot proceed the rmf and the representation don't have the same number of particles; "
1130 "particles in rmf: %s particles in the representation: %s" % (str(component_name), str(len(psrmf)), str(len(psrepr))))
1133 if not representation_name_to_rmf_name_map:
1134 for n, prmf
in enumerate(psrmf):
1136 prmfname = prmf.get_name()
1137 preprname = psrepr[n].get_name()
1138 if force_rigid_update:
1144 raise ValueError(
"component %s cannot proceed if rigid bodies were initialized. Use the function before defining the rigid bodies" % component_name)
1146 self._compare_rmf_repr_names(prmfname, preprname,
1155 rbm.set_internal_coordinates(xyz)
1157 rb = rbm.get_rigid_body()
1159 raise ValueError(
"Cannot handle nested "
1161 rb.set_reference_frame_lazy(tr)
1168 g=gprmf.get_gaussian()
1169 grepr.set_gaussian(g)
1172 repr_name_particle_map={}
1173 rmf_name_particle_map={}
1175 rmf_name_particle_map[p.get_name()]=p
1179 for prepr
in psrepr:
1181 prmf=rmf_name_particle_map[representation_name_to_rmf_name_map[prepr.get_name()]]
1183 print(
"set_coordinates_from_rmf: WARNING missing particle name in representation_name_to_rmf_name_map, skipping...")
1191 If the root hierarchy does not exist, construct it.
1193 if "Res:" + str(int(resolution))
not in self.hier_representation[name]:
1195 root.set_name(name +
"_Res:" + str(int(resolution)))
1196 self.hier_representation[name][
1197 "Res:" + str(int(resolution))] = root
1198 protein_h.add_child(root)
1201 input_hierarchy, protein_h, type, color):
1203 Generate all needed coarse grained layers.
1205 @param name name of the protein
1206 @param resolutions list of resolutions
1207 @param protein_h root hierarchy
1208 @param input_hierarchy hierarchy to coarse grain
1209 @param type a string, typically "pdb" or "helix"
1213 if (1
in resolutions)
or (0
in resolutions):
1216 if 1
in resolutions:
1219 s1.set_name(
'%s_%i-%i_%s' % (name, start, end, type))
1221 self.hier_representation[name][
"Res:1"].add_child(s1)
1223 if 0
in resolutions:
1226 s0.set_name(
'%s_%i-%i_%s' % (name, start, end, type))
1228 self.hier_representation[name][
"Res:0"].add_child(s0)
1231 if not isnucleicacid:
1234 atom_type=IMP.atom.AT_CA)
1238 atom_type=IMP.atom.AT_P)
1240 for p
in sel.get_selected_particles():
1242 if 0
in resolutions:
1244 resclone0 = IMP.atom.create_clone(resobject)
1246 s0.add_child(resclone0)
1247 self.hier_db.add_particles(
1251 resclone0.get_children())
1253 chil = resclone0.get_children()
1262 if 1
in resolutions:
1264 resclone1 = IMP.atom.create_clone_one(resobject)
1266 s1.add_child(resclone1)
1267 self.hier_db.add_particles(name, resindex, 1, [resclone1])
1271 prt = resclone1.get_particle()
1272 prt.set_name(
'%s_%i_%s' % (name, resindex, type))
1294 for r
in resolutions:
1295 if r != 0
and r != 1:
1301 chil = s.get_children()
1303 s0.set_name(
'%s_%i-%i_%s' % (name, start, end, type))
1308 self.hier_representation[name][
1309 "Res:" + str(int(r))].add_child(s0)
1318 prt.set_name(
'%s_%i_%s' % (name, first, type))
1320 prt.set_name(
'%s_%i_%i_%s' % (name, first, last, type))
1322 self.hier_db.add_particles(name, kk, r, [prt])
1343 Get the hierarchies at the given resolution.
1345 The map between resolution and hierarchies is cached to accelerate
1346 the selection algorithm. The cache is invalidated when the
1347 representation was changed by any add_component_xxx.
1350 if self.representation_is_modified:
1351 rhbr = self.hier_db.get_all_root_hierarchies_by_resolution(
1353 self.hier_resolution[resolution] = rhbr
1354 self.representation_is_modified =
False
1357 if resolution
in self.hier_resolution:
1358 return self.hier_resolution[resolution]
1360 rhbr = self.hier_db.get_all_root_hierarchies_by_resolution(
1362 self.hier_resolution[resolution] = rhbr
1366 self, max_translation=300., max_rotation=2.0 * pi,
1367 avoidcollision=
True, cutoff=10.0, niterations=100,
1369 excluded_rigid_bodies=
None,
1370 ignore_initial_coordinates=
False,
1371 hierarchies_excluded_from_collision=
None):
1373 Shuffle configuration; used to restart the optimization.
1375 The configuration of the system is initialized by placing each
1376 rigid body and each bead randomly in a box with a side of
1377 `max_translation` angstroms, and far enough from each other to
1378 prevent any steric clashes. The rigid bodies are also randomly rotated.
1380 @param avoidcollision check if the particle/rigid body was
1381 placed close to another particle; uses the optional
1382 arguments cutoff and niterations
1383 @param bounding_box defined by ((x1,y1,z1),(x2,y2,z2))
1386 if excluded_rigid_bodies
is None:
1387 excluded_rigid_bodies = []
1388 if hierarchies_excluded_from_collision
is None:
1389 hierarchies_excluded_from_collision = []
1391 if len(self.rigid_bodies) == 0:
1392 print(
"shuffle_configuration: rigid bodies were not intialized")
1395 gcpf.set_distance(cutoff)
1397 hierarchies_excluded_from_collision_indexes = []
1406 if bounding_box
is not None:
1407 ((x1, y1, z1), (x2, y2, z2)) = bounding_box
1412 for h
in hierarchies_excluded_from_collision:
1416 allparticleindexes = list(
1417 set(allparticleindexes) - set(hierarchies_excluded_from_collision_indexes))
1419 print(hierarchies_excluded_from_collision)
1420 print(len(allparticleindexes),len(hierarchies_excluded_from_collision_indexes))
1422 print(
'shuffling', len(self.rigid_bodies) - len(excluded_rigid_bodies),
'rigid bodies')
1423 for rb
in self.rigid_bodies:
1424 if rb
not in excluded_rigid_bodies:
1426 rbindexes = rb.get_member_particle_indexes()
1428 set(rbindexes) - set(hierarchies_excluded_from_collision_indexes))
1429 otherparticleindexes = list(
1430 set(allparticleindexes) - set(rbindexes))
1432 if len(otherparticleindexes)
is None:
1436 while niter < niterations:
1437 if (ignore_initial_coordinates):
1443 if bounding_box
is not None:
1459 gcpf.get_close_pairs(
1461 otherparticleindexes,
1465 if (ignore_initial_coordinates):
1466 print (rb.get_name(),
IMP.core.XYZ(rb).get_coordinates())
1469 print(
"shuffle_configuration: rigid body placed close to other %d particles, trying again..." % npairs)
1470 print(
"shuffle_configuration: rigid body name: " + rb.get_name())
1471 if niter == niterations:
1472 raise ValueError(
"tried the maximum number of iterations to avoid collisions, increase the distance cutoff")
1476 print(
'shuffling', len(self.floppy_bodies),
'floppy bodies')
1477 for fb
in self.floppy_bodies:
1478 if (avoidcollision):
1483 otherparticleindexes = list(
1484 set(allparticleindexes) - set(fbindexes))
1485 if len(otherparticleindexes)
is None:
1503 while niter < niterations:
1504 if (ignore_initial_coordinates):
1510 if bounding_box
is not None:
1522 if (avoidcollision):
1525 gcpf.get_close_pairs(
1527 otherparticleindexes,
1531 if (ignore_initial_coordinates):
1532 print (fb.get_name(),
IMP.core.XYZ(fb).get_coordinates())
1535 print(
"shuffle_configuration: floppy body placed close to other %d particles, trying again..." % npairs)
1536 print(
"shuffle_configuration: floppy body name: " + fb.get_name())
1537 if niter == niterations:
1538 raise ValueError(
"tried the maximum number of iterations to avoid collisions, increase the distance cutoff")
1542 def set_current_coordinates_as_reference_for_rmsd(self, label="None"):
1546 self.reference_structures[label] = (
1550 def get_all_rmsds(self):
1553 for label
in self.reference_structures:
1555 current_coordinates = [
IMP.core.XYZ(p).get_coordinates()
1556 for p
in self.reference_structures[label][1]]
1557 reference_coordinates = self.reference_structures[label][0]
1558 if len(reference_coordinates) != len(current_coordinates):
1559 print(
"calculate_all_rmsds: reference and actual coordinates are not the same")
1562 current_coordinates,
1563 reference_coordinates)
1565 reference_coordinates,
1566 current_coordinates)
1570 reference_coordinates,
1571 current_coordinates)
1572 rmsds[label +
"_GlobalRMSD"] = rmsd_global
1573 rmsds[label +
"_RelativeDRMS"] = rmsd_relative
1576 def setup_component_geometry(self, name, color=None, resolution=1.0):
1578 color = self.color_dict[name]
1582 self.hier_geometry_pairs[name] = []
1583 protein_h = self.hier_dict[name]
1585 pbr = IMP.pmi.tools.sort_by_residues(pbr)
1587 for n
in range(len(pbr) - 1):
1588 self.hier_geometry_pairs[name].append((pbr[n], pbr[n + 1], color))
1591 self, name, resolution=10, scale=1.0):
1593 Generate restraints between contiguous fragments in the hierarchy.
1594 The linkers are generated at resolution 10 by default.
1601 protein_h = self.hier_dict[name]
1603 frs = self.hier_db.get_preroot_fragments_by_resolution(
1609 start = fr.get_children()[0]
1614 end = fr.get_children()[-1]
1620 SortedSegments.append((start, end, startres))
1621 SortedSegments = sorted(SortedSegments, key=itemgetter(2))
1624 for x
in range(len(SortedSegments) - 1):
1625 last = SortedSegments[x][1]
1626 first = SortedSegments[x + 1][0]
1633 residuegap = firstresn - lastresn - 1
1634 if self.disorderedlength
and (nreslast / 2 + nresfirst / 2 + residuegap) > 20.0:
1637 optdist = sqrt(5 / 3) * 1.93 * \
1638 (nreslast / 2 + nresfirst / 2 + residuegap) ** 0.6
1640 if self.upperharmonic:
1646 optdist = (0.0 + (float(residuegap) + 1.0) * 3.6) * scale
1647 if self.upperharmonic:
1653 pt0 = last.get_particle()
1654 pt1 = first.get_particle()
1657 print(
"Adding sequence connectivity restraint between", pt0.get_name(),
" and ", pt1.get_name(),
'of distance', optdist)
1658 sortedsegments_cr.add_restraint(r)
1659 self.linker_restraints_dict[
1660 "LinkerRestraint-" + pt0.get_name() +
"-" + pt1.get_name()] = r
1661 self.connected_intra_pairs.append((pt0, pt1))
1662 self.connected_intra_pairs.append((pt1, pt0))
1664 self.linker_restraints.add_restraint(sortedsegments_cr)
1665 self.linker_restraints.add_restraint(unmodeledregions_cr)
1667 self.sortedsegments_cr_dict[name] = sortedsegments_cr
1668 self.unmodeledregions_cr_dict[name] = unmodeledregions_cr
1670 def optimize_floppy_bodies(self, nsteps, temperature=1.0):
1672 pts = IMP.pmi.tools.ParticleToSampleList()
1673 for n, fb
in enumerate(self.floppy_bodies):
1674 pts.add_particle(fb,
"Floppy_Bodies", 1.0,
"Floppy_Body_" + str(n))
1675 if len(pts.get_particles_to_sample()) > 0:
1677 print(
"optimize_floppy_bodies: optimizing %i floppy bodies" % len(self.floppy_bodies))
1680 print(
"optimize_floppy_bodies: no particle to optimize")
1683 nSymmetry=
None, skip_gaussian_in_clones=
False):
1685 The copies must not contain rigid bodies.
1686 The symmetry restraints are applied at each leaf.
1690 self.representation_is_modified =
True
1691 ncopies = len(copies) + 1
1694 for k
in range(len(copies)):
1695 if (nSymmetry
is None):
1696 rotation_angle = 2.0 * pi / float(ncopies) * float(k + 1)
1699 rotation_angle = 2.0 * pi / float(nSymmetry) * float((k + 2) / 2)
1701 rotation_angle = -2.0 * pi / float(nSymmetry) * float((k + 1) / 2)
1709 for n, p
in enumerate(main_hiers):
1710 if (skip_gaussian_in_clones):
1719 self.m.add_score_state(c)
1720 print(
"Completed setting " + str(maincopy) +
" as a reference for " + str(copies[k]) \
1721 +
" by rotating it in " + str(rotation_angle / 2.0 / pi * 360) +
" degree around the " + str(rotational_axis) +
" axis.")
1724 def create_rigid_body_symmetry(self, particles_reference, particles_copy,label="None",
1727 self.representation_is_modified =
True
1729 mainparticles = particles_reference
1731 t=initial_transformation
1733 p.set_name(
"RigidBody_Symmetry")
1739 copyparticles = particles_copy
1743 for n, p
in enumerate(mainparticles):
1745 pc = copyparticles[n]
1747 mainpurged.append(p)
1753 copypurged.append(pc)
1760 for n, p
in enumerate(mainpurged):
1763 print(
"setting " + p.get_name() +
" as reference for " + pc.get_name())
1766 lc.add(pc.get_index())
1769 self.m.add_score_state(c)
1772 self.rigid_bodies.append(rb)
1773 self.rigid_body_symmetries.append(rb)
1774 rb.set_name(label+
".rigid_body_symmetry."+str(len(self.rigid_body_symmetries)))
1777 def create_amyloid_fibril_symmetry(self, maincopy, axial_copies,
1778 longitudinal_copies, axis=(0, 0, 1), translation_value=4.8):
1781 self.representation_is_modified =
True
1784 protein_h = self.hier_dict[maincopy]
1787 for ilc
in range(-longitudinal_copies, longitudinal_copies + 1):
1788 for iac
in range(axial_copies):
1789 copyname = maincopy +
"_a" + str(ilc) +
"_l" + str(iac)
1790 self.create_component(copyname, 0.0)
1791 for hier
in protein_h.get_children():
1793 copyhier = self.hier_dict[copyname]
1794 outhiers.append(copyhier)
1798 2 * pi / axial_copies * (float(iac)))
1799 translation_vector = tuple(
1800 [translation_value * float(ilc) * x
for x
in axis])
1801 print(translation_vector)
1806 for n, p
in enumerate(mainparts):
1813 lc.add(pc.get_index())
1815 self.m.add_score_state(c)
1821 Load coordinates in the current representation.
1822 This should be done only if the hierarchy self.prot is identical
1823 to the one as stored in the rmf i.e. all components were added.
1828 rh = RMF.open_rmf_file_read_only(rmfname)
1836 create the representation (i.e. hierarchies) from the rmf file.
1837 it will be stored in self.prot, which will be overwritten.
1838 load the coordinates from the rmf file at frameindex.
1840 rh = RMF.open_rmf_file_read_only(rmfname)
1846 for p
in self.prot.get_children():
1847 self.create_component(p.get_name())
1848 self.hier_dict[p.get_name()] = p
1850 still missing: save rigid bodies contained in the rmf in self.rigid_bodies
1851 save floppy bodies in self.floppy_bodies
1852 get the connectivity restraints
1857 Construct a rigid body from hierarchies (and optionally particles).
1859 @param hiers list of hierarchies to make rigid
1860 @param particles list of particles to add to the rigid body
1863 if particles
is None:
1866 rigid_parts = set(particles)
1869 print(
"set_rigid_body_from_hierarchies> setting up a new rigid body")
1876 print(
"set_rigid_body_from_hierarchies> WARNING particle %s already belongs to rigid body %s" % (p.get_name(), rb.get_name()))
1879 name += hier.get_name() +
"-"
1880 print(
"set_rigid_body_from_hierarchies> adding %s to the rigid body" % hier.get_name())
1882 if len(list(rigid_parts)) != 0:
1884 rb.set_coordinates_are_optimized(
True)
1885 rb.set_name(name +
"rigid_body")
1886 self.rigid_bodies.append(rb)
1890 print(
"set_rigid_body_from_hierarchies> rigid body could not be setup")
1894 Construct a rigid body from a list of subunits.
1896 Each subunit is a tuple that identifies the residue ranges and the
1897 component name (as used in create_component()).
1899 subunits: [(name_1,(first_residue_1,last_residue_1)),(name_2,(first_residue_2,last_residue_2)),.....]
1901 [name_1,name_2,(name_3,(first_residue_3,last_residue_3)),.....]
1903 example: ["prot1","prot2",("prot3",(1,10))]
1905 sometimes, we know about structure of an interaction
1906 and here we make such PPIs rigid
1911 if type(s) == type(tuple())
and len(s) == 2:
1915 residue_indexes=list(range(s[1][0],
1917 if len(sel.get_selected_particles()) == 0:
1918 print(
"set_rigid_bodies: selected particle does not exist")
1919 for p
in sel.get_selected_particles():
1923 print(
"set_rigid_body_from_hierarchies> WARNING particle %s already belongs to rigid body %s" % (p.get_name(), rb.get_name()))
1927 elif type(s) == type(str()):
1929 if len(sel.get_selected_particles()) == 0:
1930 print(
"set_rigid_bodies: selected particle does not exist")
1931 for p
in sel.get_selected_particles():
1935 print(
"set_rigid_body_from_hierarchies> WARNING particle %s already belongs to rigid body %s" % (p.get_name(), rb.get_name()))
1940 rb.set_coordinates_are_optimized(
True)
1941 rb.set_name(
''.join(str(subunits)) +
"_rigid_body")
1942 self.rigid_bodies.append(rb)
1945 def set_super_rigid_body_from_hierarchies(
1951 super_rigid_xyzs = set()
1952 super_rigid_rbs = set()
1954 print(
"set_super_rigid_body_from_hierarchies> setting up a new SUPER rigid body")
1961 super_rigid_rbs.add(rb)
1963 super_rigid_xyzs.add(p)
1964 print(
"set_rigid_body_from_hierarchies> adding %s to the rigid body" % hier.get_name())
1965 if len(super_rigid_rbs|super_rigid_xyzs) < min_size:
1968 self.super_rigid_bodies.append((super_rigid_xyzs, super_rigid_rbs))
1971 self.super_rigid_bodies.append(
1972 (super_rigid_xyzs, super_rigid_rbs, axis))
1974 def fix_rigid_bodies(self, rigid_bodies):
1975 self.fixed_rigid_bodies += rigid_bodies
1979 self, hiers, min_length=
None, max_length=
None, axis=
None):
1981 Make a chain of super rigid bodies from a list of hierarchies.
1983 Takes a linear list of hierarchies (they are supposed to be
1984 sequence-contiguous) and produces a chain of super rigid bodies
1985 with given length range, specified by min_length and max_length.
1988 hiers = IMP.pmi.tools.flatten_list(hiers)
1992 self.set_super_rigid_body_from_hierarchies(hs, axis, min_length)
1994 def set_super_rigid_bodies(self, subunits, coords=None):
1995 super_rigid_xyzs = set()
1996 super_rigid_rbs = set()
1999 if type(s) == type(tuple())
and len(s) == 3:
2003 residue_indexes=list(range(s[0],
2005 if len(sel.get_selected_particles()) == 0:
2006 print(
"set_rigid_bodies: selected particle does not exist")
2007 for p
in sel.get_selected_particles():
2010 super_rigid_rbs.add(rb)
2012 super_rigid_xyzs.add(p)
2013 elif type(s) == type(str()):
2015 if len(sel.get_selected_particles()) == 0:
2016 print(
"set_rigid_bodies: selected particle does not exist")
2017 for p
in sel.get_selected_particles():
2021 super_rigid_rbs.add(rb)
2023 super_rigid_xyzs.add(p)
2024 self.super_rigid_bodies.append((super_rigid_xyzs, super_rigid_rbs))
2028 Remove leaves of hierarchies from the floppy bodies list based
2029 on the component name
2032 ps=[h.get_particle()
for h
in hs]
2033 for p
in self.floppy_bodies:
2035 if p
in ps: self.floppy_bodies.remove(p)
2036 if p
in hs: self.floppy_bodies.remove(p)
2043 Remove leaves of hierarchies from the floppy bodies list.
2045 Given a list of hierarchies, get the leaves and remove the
2046 corresponding particles from the floppy bodies list. We need this
2047 function because sometimes
2048 we want to constrain the floppy bodies in a rigid body - for instance
2049 when you want to associate a bead with a density particle.
2051 for h
in hierarchies:
2054 if p
in self.floppy_bodies:
2055 print(
"remove_floppy_bodies: removing %s from floppy body list" % p.get_name())
2056 self.floppy_bodies.remove(p)
2059 def set_floppy_bodies(self):
2060 for p
in self.floppy_bodies:
2062 p.set_name(name +
"_floppy_body")
2064 print(
"I'm trying to make this particle flexible although it was assigned to a rigid body", p.get_name())
2067 rb.set_is_rigid_member(p.get_index(),
False)
2070 rb.set_is_rigid_member(p.get_particle_index(),
False)
2071 p.set_name(p.get_name() +
"_rigid_body_member")
2073 def set_floppy_bodies_from_hierarchies(self, hiers):
2078 self.floppy_bodies.append(p)
2085 selection tuples must be [(r1,r2,"name1"),(r1,r2,"name2"),....]
2086 @return the particles
2089 print(selection_tuples)
2090 for s
in selection_tuples:
2091 ps = IMP.pmi.tools.select_by_tuple(
2092 representation=self, tupleselection=tuple(s),
2093 resolution=
None, name_is_ambiguous=
False)
2097 def get_connected_intra_pairs(self):
2098 return self.connected_intra_pairs
2100 def set_rigid_bodies_max_trans(self, maxtrans):
2101 self.maxtrans_rb = maxtrans
2103 def set_rigid_bodies_max_rot(self, maxrot):
2104 self.maxrot_rb = maxrot
2106 def set_super_rigid_bodies_max_trans(self, maxtrans):
2107 self.maxtrans_srb = maxtrans
2109 def set_super_rigid_bodies_max_rot(self, maxrot):
2110 self.maxrot_srb = maxrot
2112 def set_floppy_bodies_max_trans(self, maxtrans):
2113 self.maxtrans_fb = maxtrans
2117 Fix rigid bodies in their actual position.
2118 The get_particles_to_sample() function will return
2119 just the floppy bodies (if they are not fixed).
2121 self.rigidbodiesarefixed = rigidbodiesarefixed
2125 Fix floppy bodies in their actual position.
2126 The get_particles_to_sample() function will return
2127 just the rigid bodies (if they are not fixed).
2129 self.floppybodiesarefixed=floppybodiesarefixed
2131 def draw_hierarchy_graph(self):
2133 print(
"Drawing hierarchy graph for " + c.get_name())
2134 IMP.pmi.output.get_graph_from_hierarchy(c)
2136 def get_geometries(self):
2139 for name
in self.hier_geometry_pairs:
2140 for pt
in self.hier_geometry_pairs[name]:
2154 def setup_bonds(self):
2157 for name
in self.hier_geometry_pairs:
2158 for pt
in self.hier_geometry_pairs[name]:
2173 def show_component_table(self, name):
2174 if name
in self.sequence_dict:
2175 lastresn = len(self.sequence_dict[name])
2178 residues = self.hier_db.get_residue_numbers(name)
2179 firstresn = min(residues)
2180 lastresn = max(residues)
2182 for nres
in range(firstresn, lastresn + 1):
2184 resolutions = self.hier_db.get_residue_resolutions(name, nres)
2186 for r
in resolutions:
2187 ps += self.hier_db.get_particles(name, nres, r)
2188 print(
"%20s %7s" % (name, nres),
" ".join([
"%20s %7s" % (str(p.get_name()),
2191 print(
"%20s %20s" % (name, nres),
"**** not represented ****")
2193 def draw_hierarchy_composition(self):
2195 ks = list(self.elements.keys())
2199 for k
in self.elements:
2200 for l
in self.elements[k]:
2205 self.draw_component_composition(k, max)
2207 def draw_component_composition(self, name, max=1000, draw_pdb_names=False):
2208 from matplotlib
import pyplot
2209 import matplotlib
as mpl
2211 tmplist = sorted(self.elements[k], key=itemgetter(0))
2213 endres = tmplist[-1][1]
2215 print(
"draw_component_composition: missing information for component %s" % name)
2217 fig = pyplot.figure(figsize=(26.0 * float(endres) / max + 2, 2))
2218 ax = fig.add_axes([0.05, 0.475, 0.9, 0.15])
2223 norm = mpl.colors.Normalize(vmin=5, vmax=10)
2227 for n, l
in enumerate(tmplist):
2231 if bounds[-1] != l[0]:
2232 colors.append(
"white")
2235 colors.append(
"#99CCFF")
2237 colors.append(
"#FFFF99")
2239 colors.append(
"#33CCCC")
2241 bounds.append(l[1] + 1)
2244 colors.append(
"#99CCFF")
2246 colors.append(
"#FFFF99")
2248 colors.append(
"#33CCCC")
2250 bounds.append(l[1] + 1)
2252 if bounds[-1] - 1 == l[0]:
2256 colors.append(
"white")
2259 bounds.append(bounds[-1])
2260 colors.append(
"white")
2261 cmap = mpl.colors.ListedColormap(colors)
2262 cmap.set_over(
'0.25')
2263 cmap.set_under(
'0.75')
2265 norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
2266 cb2 = mpl.colorbar.ColorbarBase(ax, cmap=cmap,
2272 spacing=
'proportional',
2273 orientation=
'horizontal')
2282 mid = 1.0 / endres * float(l[0])
2287 l[2], xy=(mid, 1), xycoords=
'axes fraction',
2288 xytext=(mid + 0.025, float(npdb - 1) / 2.0 + 1.5), textcoords=
'axes fraction',
2289 arrowprops=dict(arrowstyle=
"->",
2290 connectionstyle=
"angle,angleA=0,angleB=90,rad=10"),
2292 extra_artists.append(t)
2295 title = ax.text(-0.005, 0.5, k, ha=
"right", va=
"center", rotation=90,
2298 extra_artists.append(title)
2300 labels = len(bounds) * [
" "]
2301 ax.set_xticklabels(labels)
2302 mid = 1.0 / endres * float(bounds[0])
2303 t = ax.annotate(bounds[0], xy=(mid, 0), xycoords=
'axes fraction',
2304 xytext=(mid - 0.01, -0.5), textcoords=
'axes fraction',)
2305 extra_artists.append(t)
2306 offsets = [0, -0.5, -1.0]
2308 for n
in range(1, len(bounds)):
2309 if bounds[n] == bounds[n - 1]:
2311 mid = 1.0 / endres * float(bounds[n])
2312 if (float(bounds[n]) - float(bounds[n - 1])) / max <= 0.01:
2314 offset = offsets[nclashes % 3]
2320 bounds[n], xy=(mid, 0), xycoords=
'axes fraction',
2321 xytext=(mid, -0.5 + offset), textcoords=
'axes fraction')
2324 bounds[n], xy=(mid, 0), xycoords=
'axes fraction',
2325 xytext=(mid, -0.5 + offset), textcoords=
'axes fraction', arrowprops=dict(arrowstyle=
"-"))
2326 extra_artists.append(t)
2328 cb2.add_lines(bounds, [
"black"] * len(bounds), [1] * len(bounds))
2332 k +
"structure.pdf",
2335 bbox_extra_artists=(extra_artists),
2336 bbox_inches=
'tight')
2339 def draw_coordinates_projection(self):
2340 import matplotlib.pyplot
as pp
2343 for name
in self.hier_geometry_pairs:
2344 for pt
in self.hier_geometry_pairs[name]:
2354 xpairs.append([x1, x2])
2355 ypairs.append([y1, y2])
2358 for xends, yends
in zip(xpairs, ypairs):
2363 pp.plot(xlist, ylist,
'b-', alpha=0.1)
2366 def get_prot_name_from_particle(self, particle):
2367 names = self.get_component_names()
2368 particle0 = particle
2370 while not name
in names:
2373 particle0 = h.get_particle()
2377 def get_particles_to_sample(self):
2387 if not self.rigidbodiesarefixed:
2388 for rb
in self.rigid_bodies:
2393 if rb
not in self.fixed_rigid_bodies:
2396 if not self.floppybodiesarefixed:
2397 for fb
in self.floppy_bodies:
2404 for srb
in self.super_rigid_bodies:
2407 rigid_bodies = list(srb[1])
2408 filtered_rigid_bodies = []
2409 for rb
in rigid_bodies:
2410 if rb
not in self.fixed_rigid_bodies:
2411 filtered_rigid_bodies.append(rb)
2412 srbtmp.append((srb[0], filtered_rigid_bodies))
2414 self.rigid_bodies = rbtmp
2415 self.floppy_bodies = fbtmp
2416 self.super_rigid_bodies = srbtmp
2418 ps[
"Rigid_Bodies_SimplifiedModel"] = (
2422 ps[
"Floppy_Bodies_SimplifiedModel"] = (
2425 ps[
"SR_Bodies_SimplifiedModel"] = (
2426 self.super_rigid_bodies,
2431 def set_output_level(self, level):
2432 self.output_level = level
2434 def _evaluate(self, deriv):
2435 """Evaluate the total score of all added restraints"""
2437 return r.evaluate(deriv)
2439 def get_output(self):
2443 output[
"SimplifiedModel_Total_Score_" +
2444 self.label] = str(self._evaluate(
False))
2445 output[
"SimplifiedModel_Linker_Score_" +
2446 self.label] = str(self.linker_restraints.unprotected_evaluate(
None))
2447 for name
in self.sortedsegments_cr_dict:
2448 partialscore = self.sortedsegments_cr_dict[name].evaluate(
False)
2449 score += partialscore
2451 "SimplifiedModel_Link_SortedSegments_" +
2456 partialscore = self.unmodeledregions_cr_dict[name].evaluate(
False)
2457 score += partialscore
2459 "SimplifiedModel_Link_UnmodeledRegions_" +
2464 for rb
in self.rigid_body_symmetries:
2466 output[name +
"_" +self.label]=str(rb.get_reference_frame().get_transformation_to())
2467 for name
in self.linker_restraints_dict:
2472 self.linker_restraints_dict[
2473 name].unprotected_evaluate(
2476 if len(self.reference_structures.keys()) != 0:
2477 rmsds = self.get_all_rmsds()
2480 "SimplifiedModel_" +
2483 self.label] = rmsds[
2486 if self.output_level ==
"high":
2489 output[
"Coordinates_" +
2490 p.get_name() +
"_" + self.label] = str(d)
2492 output[
"_TotalScore"] = str(score)
2495 def get_test_output(self):
2497 output = self.get_output()
2498 for n, p
in enumerate(self.get_particles_to_sample()):
2499 output[
"Particle_to_sample_" + str(n)] = str(p)
2501 output[
"Hierarchy_Dictionary"] = list(self.hier_dict.keys())
2502 output[
"Number_of_floppy_bodies"] = len(self.floppy_bodies)
2503 output[
"Number_of_rigid_bodies"] = len(self.rigid_bodies)
2504 output[
"Number_of_super_bodies"] = len(self.super_rigid_bodies)
2505 output[
"Selection_resolution_1"] = len(
2507 output[
"Selection_resolution_5"] = len(
2509 output[
"Selection_resolution_7"] = len(
2511 output[
"Selection_resolution_10"] = len(
2513 output[
"Selection_resolution_100"] = len(
2516 output[
"Selection_resolution=1"] = len(
2518 output[
"Selection_resolution=1,resid=10"] = len(
2520 for resolution
in self.hier_resolution:
2521 output[
"Hier_resolution_dictionary" +
2522 str(resolution)] = len(self.hier_resolution[resolution])
2523 for name
in self.hier_dict:
2525 "Selection_resolution=1,resid=10,name=" +
2533 "Selection_resolution=1,resid=10,name=" +
2535 ",ambiguous"] = len(
2540 name_is_ambiguous=
True,
2543 "Selection_resolution=1,resid=10,name=" +
2545 ",ambiguous"] = len(
2550 name_is_ambiguous=
True,
2553 "Selection_resolution=1,resrange=(10,20),name=" +
2562 "Selection_resolution=1,resrange=(10,20),name=" +
2564 ",ambiguous"] = len(
2569 name_is_ambiguous=
True,
2573 "Selection_resolution=10,resrange=(10,20),name=" +
2582 "Selection_resolution=10,resrange=(10,20),name=" +
2584 ",ambiguous"] = len(
2589 name_is_ambiguous=
True,
2593 "Selection_resolution=100,resrange=(10,20),name=" +
2602 "Selection_resolution=100,resrange=(10,20),name=" +
2604 ",ambiguous"] = len(
2609 name_is_ambiguous=
True,
def link_components_to_rmf
Load coordinates in the current representation.
Select non water and non hydrogen atoms.
double get_volume_from_residue_type(ResidueType rt)
Return an estimate for the volume of a given residue.
def add_metadata
Associate some metadata with this modeling.
static bool get_is_setup(const IMP::ParticleAdaptor &p)
A decorator to associate a particle with a part of a protein/DNA/RNA.
static Gaussian setup_particle(Model *m, ParticleIndex pi)
void show_molecular_hierarchy(Hierarchy h)
Print out the molecular hierarchy.
double get_drms(const Vector3DsOrXYZs0 &m1, const Vector3DsOrXYZs1 &m2)
Apply a SingletonFunction to a SingletonContainer to maintain an invariant.
atom::Hierarchies create_hierarchies(RMF::FileConstHandle fh, Model *m)
def shuffle_configuration
Shuffle configuration; used to restart the optimization.
A member of a rigid body, it has internal (local) coordinates.
static bool get_is_setup(const IMP::ParticleAdaptor &p)
Set of python classes to create a multi-state, multi-resolution IMP hierarchy.
static Atom setup_particle(Model *m, ParticleIndex pi, Atom other)
static Fragment setup_particle(Model *m, ParticleIndex pi)
Upper bound harmonic function (non-zero when feature > mean)
static Symmetric setup_particle(Model *m, ParticleIndex pi, Float symmetric)
def set_coordinates_from_rmf
Read and replace coordinates from an RMF file.
static XYZR setup_particle(Model *m, ParticleIndex pi)
A decorator for a particle which has bonds.
Select atoms which are selected by both selectors.
Rotation3D get_random_rotation_3d(const Rotation3D ¢er, double distance)
Pick a rotation at random near the provided one.
double get_mass(ResidueType c)
Get the mass from the residue type.
def create_non_modeled_component
Create a component that isn't used in the modeling.
Color get_rgb_color(double f)
Return the color for f from the RGB color map.
double get_mass_from_number_of_residues(unsigned int num_aa)
Estimate the mass of a protein from the number of amino acids.
def set_rigid_bodies_as_fixed
Fix rigid bodies in their actual position.
def get_particles_from_selection_tuples
selection tuples must be [(r1,r2,"name1"),(r1,r2,"name2"),....
Add symmetric attribute to a particle.
double get_ball_radius_from_volume_3d(double volume)
Return the radius of a sphere with a given volume.
def setup_component_sequence_connectivity
Generate restraints between contiguous fragments in the hierarchy.
def create_rotational_symmetry
The copies must not contain rigid bodies.
Add uncertainty to a particle.
A score on the distance between the surfaces of two spheres.
static Residue setup_particle(Model *m, ParticleIndex pi, ResidueType t, int index, int insertion_code)
static bool get_is_setup(const IMP::ParticleAdaptor &p)
static bool get_is_setup(const IMP::ParticleAdaptor &p)
static XYZ setup_particle(Model *m, ParticleIndex pi)
void read_pdb(TextInput input, int model, Hierarchy h)
def remove_floppy_bodies
Remove leaves of hierarchies from the floppy bodies list.
Vector3D get_random_vector_in(const Cylinder3D &c)
Generate a random vector in a cylinder with uniform density.
static Uncertainty setup_particle(Model *m, ParticleIndex pi, Float uncertainty)
def remove_floppy_bodies_from_component
Remove leaves of hierarchies from the floppy bodies list based on the component name.
Add resolution to a particle.
Bond create_bond(Bonded a, Bonded b, Bond o)
Connect the two wrapped particles by a custom bond.
Object used to hold a set of restraints.
static Molecule setup_particle(Model *m, ParticleIndex pi)
Rotation3D get_rotation_about_axis(const Vector3D &axis, double angle)
Generate a Rotation3D object from a rotation around an axis.
Select all CB ATOM records.
A Gaussian distribution in 3D.
static bool get_is_setup(Model *m, ParticleIndex pi)
static Hierarchy setup_particle(Model *m, ParticleIndex pi, ParticleIndexesAdaptor children=ParticleIndexesAdaptor())
Create a Hierarchy of level t by adding the needed attributes.
ParticleIndexPairs get_indexes(const ParticlePairsTemp &ps)
def set_rigid_bodies
Construct a rigid body from a list of subunits.
double get_volume_from_mass(double m, ProteinDensityReference ref=ALBER)
Estimate the volume of a protein from its mass.
The standard decorator for manipulating molecular structures.
Ints get_index(const ParticlesTemp &particles, const Subset &subset, const Subsets &excluded)
Store a list of ParticleIndexes.
def deprecated_method
Python decorator to mark a method as deprecated.
A decorator for a particle representing an atom.
void transform(XYZ a, const algebra::Transformation3D &tr)
Apply a transformation to the particle.
static Mass setup_particle(Model *m, ParticleIndex pi, Float mass)
static Bonded setup_particle(Model *m, ParticleIndex pi)
def add_protocol_output
Capture details of the modeling protocol.
static bool get_is_setup(Model *m, ParticleIndex pi)
double get_rmsd(const Vector3DsOrXYZs0 &m1, const Vector3DsOrXYZs1 &m2)
def add_all_atom_densities
Decorates all specified particles as Gaussians directly.
def coarse_hierarchy
Generate all needed coarse grained layers.
def add_component_pdb
Add a component that has an associated 3D structure in a PDB file.
Basic utilities for handling cryo-electron microscopy 3D density maps.
void load_frame(RMF::FileConstHandle file, RMF::FrameID frame)
Load the given RMF frame into the state of the linked objects.
A decorator for a particle with x,y,z coordinates.
static bool get_is_setup(Model *m, ParticleIndex pi)
static Colored setup_particle(Model *m, ParticleIndex pi, Color color)
def set_chain_of_super_rigid_bodies
Make a chain of super rigid bodies from a list of hierarchies.
def add_component_sequence
Add the primary sequence for a single component.
Tools for clustering and cluster analysis.
static Resolution setup_particle(Model *m, ParticleIndex pi, Float resolution)
def create_components_from_rmf
still not working.
Transformation3D get_identity_transformation_3d()
Return a transformation that does not do anything.
Find all nearby pairs by testing all pairs.
Classes for writing output files and processing them.
Simple implementation of segments in 3D.
static bool get_is_setup(const IMP::ParticleAdaptor &p)
A decorator for a residue.
Basic functionality that is expected to be used by a wide variety of IMP users.
General purpose algebraic and geometric methods that are expected to be used by a wide variety of IMP...
static bool get_is_setup(const IMP::ParticleAdaptor &p)
def add_component_density
Sets up a Gaussian Mixture Model for this component.
Sample using Monte Carlo.
The general base class for IMP exceptions.
Hierarchy create_simplified_along_backbone(Chain input, const IntRanges &residue_segments, bool keep_detailed=false)
def get_file_dataset
Get the dataset associated with a filename, or None.
IMP::core::RigidBody create_rigid_body(Hierarchy h)
static Reference setup_particle(Model *m, ParticleIndex pi, ParticleIndexAdaptor reference)
Rotation3D get_identity_rotation_3d()
Return a rotation that does not do anything.
void link_hierarchies(RMF::FileConstHandle fh, const atom::Hierarchies &hs)
Class to handle individual particles of a Model object.
Bond get_bond(Bonded a, Bonded b)
Get the bond between two particles.
std::string get_data_path(std::string file_name)
Return the full path to one of this module's data files.
Select atoms which are selected by either or both selectors.
def get_hierarchies_at_given_resolution
Get the hierarchies at the given resolution.
Store info for a chain of a protein.
Applies a PairScore to a Pair.
Select all CA ATOM records.
Python classes to represent, score, sample and analyze models.
static bool get_is_setup(Model *m, ParticleIndex pi)
double get_resolution(Model *m, ParticleIndex pi)
Estimate the resolution of the hierarchy as used by Representation.
A decorator for a rigid body.
static bool get_is_setup(const IMP::ParticleAdaptor &p)
A dictionary-like wrapper for reading and storing sequence data.
Transformation3D get_transformation_aligning_first_to_second(Vector3Ds a, Vector3Ds b)
Output IMP model data in various file formats.
Functionality for loading, creating, manipulating and scoring atomic structures.
static Chain setup_particle(Model *m, ParticleIndex pi, std::string id)
Hierarchies get_leaves(const Selection &h)
def add_component_necklace
Generates a string of beads with given length.
An exception for an invalid value being passed to IMP.
def set_file_dataset
Associate a dataset with a filename.
def set_floppy_bodies_as_fixed
Fix floppy bodies in their actual position.
Select hierarchy particles identified by the biological name.
static RigidBody setup_particle(Model *m, ParticleIndex pi, ParticleIndexesAdaptor ps)
Select all ATOM and HETATM records with the given chain ids.
Support for the RMF file format for storing hierarchical molecular data and markup.
def set_rigid_body_from_hierarchies
Construct a rigid body from hierarchies (and optionally particles).
static bool get_is_setup(const IMP::ParticleAdaptor &p)
Transformation3D get_random_local_transformation(Vector3D origin, double max_translation=5., double max_angle_in_rad=0.26)
Get a local transformation.
def check_root
If the root hierarchy does not exist, construct it.
def add_component_beads
add beads to the representation
Inferential scoring building on methods developed as part of the Inferential Structure Determination ...
def add_component_hierarchy_clone
Make a copy of a hierarchy and append it to a component.
Harmonic function (symmetric about the mean)
A decorator for a particle with x,y,z coordinates and a radius.