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(mdl,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 mdl The IMP model
35 @param pdb_fn The file to read
36 @param chain_id Chain ID to read
37 @param res_range Add only a specific set of residues. None gets you all
38 @param offset Apply an offset to the residue indexes of the PDB file
39 @param model_num Read multi-model PDB and return that model
40 @param ca_only Read only CA atoms (by default, all non-waters are read)
51 if model_num>=len(mhs):
52 raise Exception(
"you requested model num "+str(model_num)+\
53 " but the PDB file only contains "+str(len(mhs))+
" models")
56 if res_range==[]
or res_range
is None:
68 for p
in sel.get_selected_particles():
70 res.set_index(res.get_index() + offset)
74 def build_bead(mdl,residues,input_coord=None):
75 """Generates a single bead"""
83 if ds_frag[0] == ds_frag[-1]:
84 rt = residues[0].get_residue_type()
86 h.set_name(
'%i_bead' % (ds_frag[0]))
87 prt.set_name(
'%i_bead' % (ds_frag[0]))
94 ptem.set_radius(radius)
97 h.set_name(
'%i-%i_bead' % (ds_frag[0], ds_frag[-1]))
98 prt.set_name(
'%i-%i_bead' % (ds_frag[0], ds_frag[-1]))
99 h.set_residue_indexes(range(ds_frag[0], ds_frag[-1] + 1))
101 radius = 0.8 * (3.0 / 4.0 / pi * volume) ** (1.0 / 3.0)
102 ptem.set_radius(radius)
106 if tuple(input_coord)
is not None:
107 ptem.set_coordinates(input_coord)
112 def build_necklace(mdl,residues, resolution, input_coord=None):
113 """Generates a string of beads with given length"""
116 out_hiers.append(build_bead(mdl,chunk, input_coord=input_coord))
119 def build_ca_centers(mdl,residues):
120 """Create a bead on the CA position with coarsened size and mass"""
122 for tempres
in residues:
123 residue = tempres.get_hierarchy()
125 rp1.set_name(
"Residue_%i"%residue.get_index())
126 rt = residue.get_residue_type()
138 get_selected_particles()[0]
143 out_hiers.append(this_res)
146 def setup_bead_as_gaussian(mh):
147 """Setup bead as spherical gaussian, using radius as variance"""
148 p = mh.get_particle()
157 def show_representation(node):
161 resolutions = repr.get_resolutions()
162 for r
in resolutions:
163 print(
'---- resolution %i ----' %r)
169 def recursive_show_representations(root):
172 def build_representation(parent,rep,coord_finder):
173 """Create requested representation.
174 For beads, identifies continuous segments and sets up as Representation.
175 If any volume-based representations (e.g.,densities) are requested,
176 will instead create a single Representation node.
177 All reps are added as children of the passed parent.
178 @param parent The Molecule to which we'll add add representations
179 @param rep What to build. An instance of pmi::topology::_Representation
180 @param coord_finder A _FindCloseStructure object to help localize beads
185 mdl = parent.get_model()
186 if rep.color
is not None:
187 if type(rep.color)
is float:
189 elif hasattr(rep.color,
'__iter__')
and len(rep.color)==3:
194 raise Exception(
"Color must be float or (r,g,b) tuple")
200 primary_resolution = min(rep.bead_resolutions)
205 if rep.density_residues_per_component!=
None:
207 num_components = len(rep.residues)//rep.density_residues_per_component+1
208 rep_dict = defaultdict(list)
211 parent.add_child(root_representation)
212 res_nums = [r.get_index()
for r
in rep.residues]
214 density_frag.get_particle().set_name(
"Densities %i"%rep.density_residues_per_component)
217 if os.path.exists(rep.density_prefix+
'.txt')
and not rep.density_force_compute:
221 if len(density_ps)!=num_components
or not os.path.exists(rep.density_prefix+
'.txt')
or rep.density_force_compute:
224 for r
in rep.residues:
231 if rep.density_voxel_size>0.0:
235 density_frag.add_child(d)
236 root_representation.add_representation(density_frag,
238 rep.density_residues_per_component)
242 rsort = sorted(list(rep.residues),key=
lambda r:r.get_index())
244 prev_structure = rsort[0].get_has_structure()
246 for nr,r
in enumerate(rsort):
247 if r.get_index()!=prev_idx+1
or r.get_has_structure()!=prev_structure
or \
248 r.get_index()
in rep.bead_extra_breaks:
249 segments.append(cur_seg)
252 prev_idx = r.get_index()
253 prev_structure = r.get_has_structure()
255 segments.append(cur_seg)
260 for frag_res
in segments:
261 res_nums = [r.get_index()
for r
in frag_res]
262 rrange =
"%i-%i"%(res_nums[0],res_nums[-1])
263 name =
"Frag_"+rrange
265 name_all +=rrange+
','
273 parent.add_child(this_representation)
274 for resolution
in rep.bead_resolutions:
277 this_resolution.set_name(
"%s: Res %i"%(name,resolution))
278 if frag_res[0].get_has_structure():
280 if resolution==atomic_res:
281 for residue
in frag_res:
282 this_resolution.add_child(residue.get_hierarchy())
283 elif resolution==ca_res
and rep.bead_ca_centers:
284 beads = build_ca_centers(mdl,frag_res)
286 this_resolution.add_child(bead)
289 for residue
in frag_res:
290 tempc.add_child(IMP.atom.create_clone(residue.hier))
292 for bead
in beads.get_children():
293 this_resolution.add_child(bead)
298 input_coord = coord_finder.find_nearest_coord(min(r.get_index()
for r
in frag_res))
299 if input_coord
is None:
300 input_coord = rep.bead_default_coord
301 beads = build_necklace(mdl,
306 this_resolution.add_child(bead)
316 rep_dict[resolution]+=this_resolution.get_children()
318 if resolution==primary_resolution:
319 this_representation.add_child(this_resolution)
321 this_representation.add_representation(this_resolution,
325 if rep.setup_particles_as_densities:
327 setup_bead_as_gaussian(p)
328 this_resolution.set_name(this_resolution.get_name()+
' Densities %i'%resolution)
329 this_representation.add_representation(this_resolution,
334 root_representation.set_name(name_all.strip(
',')+
": Base")
335 d = root_representation.get_representations(IMP.atom.DENSITIES)
336 d[0].set_name(
'%s: '%name_all + d[0].get_name())
337 for resolution
in rep.bead_resolutions:
340 [r.get_index()
for r
in rep.residues])
341 this_resolution.set_name(
"%s: Res %i"%(name_all,resolution))
342 for hier
in rep_dict[resolution]:
343 this_resolution.add_child(hier)
344 if resolution==primary_resolution:
345 root_representation.add_child(this_resolution)
347 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.
void read_pdb(TextInput input, int model, Hierarchy h)
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)
Hierarchies read_multimodel_pdb(TextInput input, Model *model, PDBSelector *selector=get_default_pdb_selector())
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 model particles.
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.