1 from __future__
import print_function, division
7 from collections
import defaultdict
12 """Take iterable of TempResidues and return compatified string"""
15 idxs = [r.get_index()
for r
in res]
18 cur_range=[idxs[0],idxs[0]]
20 if idx!=cur_range[1]+1:
21 all_ranges.append(cur_range)
24 all_ranges.append(cur_range)
26 for nr,r
in enumerate(all_ranges):
27 ret+=
'%i-%i'%(r[0],r[1])
28 if nr<len(all_ranges)-1:
32 def get_structure(model,pdb_fn,chain_id,res_range=None,offset=0,model_num=None,ca_only=False):
33 """read a structure from a PDB file and return a list of residues
34 @param model The IMP model
35 @param pdb_fn The file to read (in traditional PDB or mmCIF format)
36 @param chain_id Chain ID to read
37 @param res_range Add only a specific set of residues.
38 res_range[0] is the starting and res_range[1] is the ending residue index
39 The ending residue can be "END", that will take everything to the end of the sequence.
41 @param offset Apply an offset to the residue indexes of the PDB file
42 @param model_num Read multi-model PDB and return that model
43 @param ca_only Read only CA atoms (by default, all non-waters are read)
47 read_file = IMP.atom.read_pdb
48 read_multi_file = IMP.atom.read_multimodel_pdb
49 if pdb_fn.endswith(
'.cif'):
50 read_file = IMP.atom.read_mmcif
51 read_multi_file = IMP.atom.read_multimodel_mmcif
55 mh = read_file(pdb_fn,model,
59 mhs = read_multi_file(pdb_fn,model,sel)
60 if model_num>=len(mhs):
61 raise Exception(
"you requested model num "+str(model_num)+\
62 " but the PDB file only contains "+str(len(mhs))+
" models")
65 if res_range==[]
or res_range
is None:
76 atom_type=IMP.atom.AT_P)
79 if sel_p.get_selected_particles():
80 "WARNING: detected nucleotides. Selecting phosphorous instead of CA"
83 for p
in sel.get_selected_particles():
85 res.set_index(res.get_index() + offset)
88 print(
"WARNING: no residues selected from %s in range %s"
89 % (pdb_fn, res_range))
92 def build_bead(model,residues,input_coord=None):
93 """Generates a single bead"""
101 if ds_frag[0] == ds_frag[-1]:
102 rt = residues[0].get_residue_type()
104 h.set_name(
'%i_bead' % (ds_frag[0]))
105 prt.set_name(
'%i_bead' % (ds_frag[0]))
112 ptem.set_radius(radius)
115 h.set_name(
'%i-%i_bead' % (ds_frag[0], ds_frag[-1]))
116 prt.set_name(
'%i-%i_bead' % (ds_frag[0], ds_frag[-1]))
117 h.set_residue_indexes(range(ds_frag[0], ds_frag[-1] + 1))
119 radius = 0.8 * (3.0 / 4.0 / pi * volume) ** (1.0 / 3.0)
120 ptem.set_radius(radius)
124 if tuple(input_coord)
is not None:
125 ptem.set_coordinates(input_coord)
130 def build_necklace(model,residues, resolution, input_coord=None):
131 """Generates a string of beads with given length"""
133 for chunk
in list(IMP.pmi.tools.list_chunks_iterator(residues, resolution)):
134 out_hiers.append(build_bead(model,chunk, input_coord=input_coord))
137 def build_ca_centers(model,residues):
138 """Create a bead on the CA position with coarsened size and mass"""
140 for tempres
in residues:
141 residue = tempres.get_hierarchy()
143 rp1.set_name(
"Residue_%i"%residue.get_index())
144 rt = residue.get_residue_type()
156 get_selected_particles()
158 get_selected_particles()
161 central_atom=calpha[0]
165 raise(
"build_ca_centers: weird selection (no Ca, no nucleotide P or ambiguous selection found)")
170 out_hiers.append(this_res)
173 def setup_bead_as_gaussian(mh):
174 """Setup bead as spherical gaussian, using radius as variance"""
175 p = mh.get_particle()
184 def show_representation(node):
188 resolutions = repr.get_resolutions()
189 for r
in resolutions:
190 print(
'---- resolution %i ----' %r)
196 def build_representation(parent, rep, coord_finder):
197 """Create requested representation.
198 For beads, identifies continuous segments and sets up as Representation.
199 If any volume-based representations (e.g.,densities) are requested,
200 will instead create a single Representation node.
201 All reps are added as children of the passed parent.
202 @param parent The Molecule to which we'll add add representations
203 @param rep What to build. An instance of pmi::topology::_Representation
204 @param coord_finder A _FindCloseStructure object to help localize beads
209 model = parent.hier.get_model()
210 if rep.color
is not None:
211 if type(rep.color)
is float:
213 elif type(rep.color)
is str:
215 elif hasattr(rep.color,
'__iter__')
and len(rep.color)==3:
220 raise Exception(
"Color must be float or (r,g,b) tuple")
226 primary_resolution = min(rep.bead_resolutions)
231 if rep.density_residues_per_component:
233 num_components = len(rep.residues)//rep.density_residues_per_component+1
234 rep_dict = defaultdict(list)
238 built_reps.append(root_representation)
239 res_nums = [r.get_index()
for r
in rep.residues]
242 density_frag.get_particle().set_name(
"Densities %i"%rep.density_residues_per_component)
245 if os.path.exists(rep.density_prefix+
'.txt')
and not rep.density_force_compute:
249 if len(density_ps)!=num_components
or not os.path.exists(rep.density_prefix+
'.txt')
or rep.density_force_compute:
252 for r
in rep.residues:
264 mass_multiplier=total_mass)
267 if rep.density_voxel_size>0.0:
269 rep.density_voxel_size,fast=
True)
271 for n, d
in enumerate(density_ps):
272 d.set_name(
'Density #%d' % n)
273 density_frag.add_child(d)
274 root_representation.add_representation(density_frag,
276 rep.density_residues_per_component)
280 rsort = sorted(list(rep.residues),key=
lambda r:r.get_index())
282 prev_structure = rsort[0].get_has_structure()
285 for nr,r
in enumerate(rsort):
286 if r.get_index()!=prev_idx+1
or r.get_has_structure()!=prev_structure
or force_break:
287 segments.append(cur_seg)
291 prev_idx = r.get_index()
292 prev_structure = r.get_has_structure()
293 if r.get_index()-1
in rep.bead_extra_breaks:
296 segments.append(cur_seg)
301 for frag_res
in segments:
302 res_nums = [r.get_index()
for r
in frag_res]
303 rrange =
"%i-%i"%(res_nums[0],res_nums[-1])
304 name =
"Frag_"+rrange
306 name_all +=rrange+
','
314 built_reps.append(this_representation)
315 for resolution
in rep.bead_resolutions:
318 this_resolution.set_name(
"%s: Res %i"%(name,resolution))
319 if frag_res[0].get_has_structure():
321 if resolution==atomic_res:
322 for residue
in frag_res:
323 this_resolution.add_child(residue.get_hierarchy())
324 elif resolution==ca_res
and rep.bead_ca_centers:
325 beads = build_ca_centers(model,frag_res)
327 this_resolution.add_child(bead)
330 for residue
in frag_res:
331 tempc.add_child(IMP.atom.create_clone(residue.hier))
333 for bead
in beads.get_children():
334 this_resolution.add_child(bead)
339 input_coord = coord_finder.find_nearest_coord(min(r.get_index()
for r
in frag_res))
340 if input_coord
is None:
341 input_coord = rep.bead_default_coord
342 beads = build_necklace(model,
347 this_resolution.add_child(bead)
357 rep_dict[resolution]+=this_resolution.get_children()
359 if resolution==primary_resolution:
360 this_representation.add_child(this_resolution)
362 this_representation.add_representation(this_resolution,
366 if rep.setup_particles_as_densities:
368 setup_bead_as_gaussian(p)
369 this_resolution.set_name(this_resolution.get_name()+
' Densities %i'%resolution)
370 this_representation.add_representation(this_resolution,
375 root_representation.set_name(name_all.strip(
',')+
": Base")
376 d = root_representation.get_representations(IMP.atom.DENSITIES)
377 d[0].set_name(
'%s: '%name_all + d[0].get_name())
378 for resolution
in rep.bead_resolutions:
381 [r.get_index()
for r
in rep.residues])
382 this_resolution.set_name(
"%s: Res %i"%(name_all,resolution))
383 for hier
in rep_dict[resolution]:
384 this_resolution.add_child(hier)
385 if resolution==primary_resolution:
386 root_representation.add_child(this_resolution)
388 root_representation.add_representation(this_resolution,
double get_volume_from_residue_type(ResidueType rt)
Return an estimate for the volume of a given residue.
static Gaussian setup_particle(Model *m, ParticleIndex pi)
void show_molecular_hierarchy(Hierarchy h)
Print out the molecular hierarchy.
static Fragment setup_particle(Model *m, ParticleIndex pi)
double get_mass(const Selection &s)
Get the total mass of a hierarchy, in Daltons.
static XYZR setup_particle(Model *m, ParticleIndex pi)
Select atoms which are selected by both selectors.
double get_mass(ResidueType c)
Get the mass from the residue type.
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.
double get_ball_radius_from_volume_3d(double volume)
Return the radius of a sphere with a given volume.
static Residue setup_particle(Model *m, ParticleIndex pi, ResidueType t, int index, int insertion_code)
static Representation setup_particle(Model *m, ParticleIndex pi)
GenericHierarchies get_leaves(Hierarchy mhd)
Get all the leaves of the bit of hierarchy.
A Gaussian distribution in 3D.
A decorator for a representation.
double get_volume_from_mass(double m, ProteinDensityReference ref=ALBER)
Estimate the volume of a protein from its mass.
Ints get_index(const ParticlesTemp &particles, const Subset &subset, const Subsets &excluded)
A decorator for a particle representing an atom.
static Mass setup_particle(Model *m, ParticleIndex pi, Float mass)
PDBSelector * get_default_pdb_selector()
A decorator for a particle with x,y,z coordinates.
static Colored setup_particle(Model *m, ParticleIndex pi, Color color)
A decorator for a residue.
static bool get_is_setup(const IMP::ParticleAdaptor &p)
Hierarchy create_simplified_along_backbone(Chain input, const IntRanges &residue_segments, bool keep_detailed=false)
Rotation3D get_identity_rotation_3d()
Return a rotation that does not do anything.
Class to handle individual particles of a Model object.
Select all CA ATOM records.
Python classes to represent, score, sample and analyze models.
Functionality for loading, creating, manipulating and scoring atomic structures.
static Chain setup_particle(Model *m, ParticleIndex pi, std::string id)
An exception for an invalid value being passed to IMP.
Select hierarchy particles identified by the biological name.
Select all ATOM and HETATM records with the given chain ids.
A decorator for a particle with x,y,z coordinates and a radius.