8 from collections
import defaultdict
12 """A class to read RMF files and make a network contact map"""
13 def __init__(self, model, selections, cutoff, frequency_cutoff,
14 colors=
None, fixed=
None, pos=
None, proteomic_edges=
None,
15 quantitative_proteomic_data=
None):
16 """Set up a new graphXL object
17 @param model The IMP model
18 @param selections A dictionary containing component names.
20 values are either moleculename or
21 start,stop,moleculename
22 @param cutoff The distance cutoff
23 @param frequency_cutoff The frequency cutoff
24 @param colors A dictionary of colors (HEX code,values)
25 for subunits (keywords)
26 @param fixed A list of subunits that are kept fixed
27 @param pos A dictionary with positions (tuple, values)
28 of subunits (keywords)
29 @param proteomic_edges A list edges to represent proteomic data
30 @param quantitative_proteomic_data A dictionary of edges to represent
31 quantitative proteomic data such as PE Scores,
32 or genetic interactions
37 self.selections = selections
38 self.contact_counts = {}
39 self.edges = defaultdict(int)
40 for (name1, name2)
in itertools.combinations(self.selections.keys(),
42 self.edges[tuple(sorted((name1, name2)))] = 0
44 self.frequency_cutoff = frequency_cutoff
46 self.gcpf.set_distance(self.cutoff)
47 self.names = list(self.selections.keys())
51 self.proteomic_edges = proteomic_edges
52 self.quantitative_proteomic_data = quantitative_proteomic_data
56 """Add selections from an RMF file"""
57 print(
'reading from RMF file', rmf_fn)
58 rh = RMF.open_rmf_file_read_only(rmf_fn)
62 ps_per_component = defaultdict(list)
64 self.size_per_component = defaultdict(int)
69 all_particles_by_resolution = []
70 for name
in part_dict:
71 all_particles_by_resolution += part_dict[name]
73 for component_name
in self.selections:
74 for seg
in self.selections[component_name]:
75 if isinstance(seg, str):
77 elif isinstance(seg, tuple):
79 hier, molecule=seg[2],
80 residue_indexes=range(seg[0], seg[1] + 1))
82 raise Exception(
'could not understand selection tuple '
84 parts = list(set(s.get_selected_particles())
85 & set(all_particles_by_resolution))
88 self.size_per_component[component_name] += \
92 for n1, name1
in enumerate(self.names):
93 for name2
in self.names[n1+1:]:
94 ncontacts = len(self.gcpf.get_close_pairs(
95 self.model, ps_per_component[name1],
96 ps_per_component[name2]))
98 self.edges[tuple(sorted((name1, name2)))] += 1.0
102 def make_plot(self, groups, out_fn, quantitative_proteomic_data=False):
104 plot the interaction matrix
105 @param groups is the list of groups of domains, eg,
106 [["protA_1-10","prot1A_11-100"],["protB"]....]
107 it will plot a space between different groups
108 @param out_fn name of the plot file
109 @param quantitative_proteomic_data plot the quantitative proteomic data
111 import matplotlib.pyplot
as plt
114 ax.set_aspect(
'equal',
'box')
115 ax.xaxis.set_major_locator(plt.NullLocator())
116 ax.yaxis.set_major_locator(plt.NullLocator())
122 domain_xlocations = {}
123 domain_ylocations = {}
125 xoffset = squaredistance
126 yoffset = squaredistance
128 xoffset += largespace
129 yoffset += largespace
130 for subgroup
in group:
131 xoffset += smallspace
132 yoffset += smallspace
133 for domain
in subgroup:
134 domain_xlocations[domain] = xoffset
135 domain_ylocations[domain] = yoffset
136 xoffset += squaredistance
137 yoffset += squaredistance
139 for edge, count
in self.edges.items():
141 if quantitative_proteomic_data:
143 maxqpd = max(self.quantitative_proteomic_data.values())
144 minqpd = min(self.quantitative_proteomic_data.values())
145 if edge
in self.quantitative_proteomic_data:
146 value = self.quantitative_proteomic_data[edge]
147 elif (edge[1], edge[0])
in self.quantitative_proteomic_data:
148 value = self.quantitative_proteomic_data[(edge[1],
152 print(minqpd, maxqpd)
153 density = (1.0-(value-minqpd)/(maxqpd-minqpd))
155 density = (1.0-float(count)/self.num_rmf)
156 color = (density, density, 1.0)
157 x = domain_xlocations[edge[0]]
158 y = domain_ylocations[edge[1]]
164 rect = plt.Rectangle([x - squaresize / 2, y - squaresize / 2],
165 squaresize, squaresize,
166 facecolor=color, edgecolor=
'Gray',
169 rect = plt.Rectangle([y - squaresize / 2, x - squaresize / 2],
170 squaresize, squaresize,
171 facecolor=color, edgecolor=
'Gray',
180 def make_graph(self, out_fn):
183 print(
'num edges', len(self.edges))
184 for edge, count
in self.edges.items():
186 if float(count)/self.num_rmf > self.frequency_cutoff:
189 weights.append(count)
190 for nw, w
in enumerate(weights):
191 weights[nw] = float(weights[nw])/max(weights)
192 IMP.pmi.output.draw_graph(edges,
193 node_size=dict(self.size_per_component),
194 node_color=self.colors,
201 validation_edges=self.proteomic_edges)
204 def draw_component_composition(DegreesOfFreedom, max=1000,
205 draw_pdb_names=
False, show=
True):
206 """A function to plot the representation on the sequence
207 @param DegreesOfFreedom input a IMP.pmi.dof.DegreesOfFreedom instance"""
208 import matplotlib
as mpl
210 from matplotlib
import pyplot
211 from operator
import itemgetter
215 movers_mols_res = IMP.pmi.tools.OrderedDict()
216 for mv
in DegreesOfFreedom.movers_particles_map:
217 hs = DegreesOfFreedom.movers_particles_map[mv]
228 while not is_molecule:
233 if mv
not in movers_mols_res:
234 movers_mols_res[mv] = IMP.pmi.tools.OrderedDict()
237 if name
not in movers_mols_res[mv]:
240 movers_mols_res[mv][name].add(res)
245 for mv
in movers_mols_res:
251 srb_movers.append(mv)
255 for mol
in movers_mols_res[mv]:
256 for i
in movers_mols_res[mv][mol].get_flatten():
257 for mv_rb
in rb_movers:
259 movers_mols_res[mv_rb][mol].remove(i)
260 except (ValueError, KeyError):
264 rgb_colors = [(240, 163, 255), (0, 117, 220),
265 (153, 63, 0), (76, 0, 92), (25, 25, 25),
266 (0, 92, 49), (43, 206, 72), (255, 204, 153),
267 (128, 128, 128), (148, 255, 181), (143, 124, 0),
268 (157, 204, 0), (194, 0, 136), (0, 51, 128), (255, 164, 5),
269 (255, 168, 187), (66, 102, 0), (255, 0, 16), (94, 241, 242),
270 (0, 153, 143), (224, 255, 102), (116, 10, 255), (153, 0, 0),
271 (255, 255, 128), (255, 255, 0), (255, 80, 5)]
272 colors = [(float(c0)/255, float(c1)/255, float(c2)/255)
273 for (c0, c1, c2)
in rgb_colors]
275 for mv
in movers_mols_res:
277 if mv
not in mvrb_color:
278 color = colors[len(mvrb_color.keys())]
279 mvrb_color[mv] = color
280 for mol
in movers_mols_res[mv]:
281 if mol
not in elements:
283 for seg
in movers_mols_res[mv][mol].segs:
285 elements[mol].append((seg[0], seg[-1],
" ",
"pdb",
287 except (KeyError, IndexError):
290 for mol
in movers_mols_res[mv]:
291 if mol
not in elements:
293 for seg
in movers_mols_res[mv][mol].segs:
294 elements[mol].append((seg[0], seg[-1],
" ",
"bead"))
298 elements[mol].sort(key=
lambda tup: tup[0])
299 elements[mol].append((elements[mol][-1][1],
300 elements[mol][-1][1],
" ",
"end"))
302 for name
in elements:
304 tmplist = sorted(elements[name], key=itemgetter(0))
306 endres = tmplist[-1][1]
308 print(
"draw_component_composition: missing information for "
309 "component %s" % name)
311 fig = pyplot.figure(figsize=(26.0 * float(endres) / max + 2, 2))
312 ax = fig.add_axes([0.05, 0.475, 0.9, 0.15])
317 norm = mpl.colors.Normalize(vmin=5, vmax=10)
321 for n, l
in enumerate(tmplist):
323 if bounds[-1] != l[0]:
324 colors.append(
"white")
327 colors.append(
"#99CCFF")
329 colors.append(
"white")
331 colors.append(
"#33CCCC")
333 bounds.append(l[1] + 1)
338 colors.append(
"white")
340 colors.append(
"#33CCCC")
342 bounds.append(l[1] + 1)
344 if bounds[-1] - 1 == l[0]:
348 colors.append(
"white")
351 bounds.append(bounds[-1])
352 colors.append(
"white")
353 cmap = mpl.colors.ListedColormap(colors)
354 cmap.set_over(
'0.25')
355 cmap.set_under(
'0.75')
357 norm = mpl.colors.BoundaryNorm(bounds, cmap.N)
358 cb2 = mpl.colorbar.ColorbarBase(ax, cmap=cmap,
364 spacing=
'proportional',
365 orientation=
'horizontal')
374 mid = 1.0 / endres * float(tl[0])
376 tl[2], xy=(mid, 1), xycoords=
'axes fraction',
377 xytext=(mid + 0.025, float(npdb - 1) / 2.0 + 1.5),
378 textcoords=
'axes fraction',
381 connectionstyle=
"angle,angleA=0,angleB=90,rad=10"))
382 extra_artists.append(t)
385 title = ax.text(-0.005, 0.5, k, ha=
"right", va=
"center", rotation=90,
388 extra_artists.append(title)
390 labels = len(bounds) * [
" "]
391 ax.set_xticklabels(labels)
392 mid = 1.0 / endres * float(bounds[0])
393 t = ax.annotate(bounds[0], xy=(mid, 0), xycoords=
'axes fraction',
394 xytext=(mid - 0.01, -0.5), textcoords=
'axes fraction',)
395 extra_artists.append(t)
396 offsets = [0, -0.5, -1.0]
398 for n
in range(1, len(bounds)):
399 if bounds[n] == bounds[n - 1]:
401 mid = 1.0 / endres * float(bounds[n])
402 if (float(bounds[n]) - float(bounds[n - 1])) / max <= 0.01:
404 offset = offsets[nclashes % 3]
409 t = ax.annotate(bounds[n], xy=(mid, 0),
410 xycoords=
'axes fraction',
411 xytext=(mid, -0.5 + offset),
412 textcoords=
'axes fraction')
414 t = ax.annotate(bounds[n], xy=(mid, 0),
415 xycoords=
'axes fraction',
416 xytext=(mid, -0.5 + offset),
417 textcoords=
'axes fraction',
418 arrowprops=dict(arrowstyle=
"-"))
419 extra_artists.append(t)
421 cb2.add_lines(bounds, [
"black"] * len(bounds), [1] * len(bounds))
424 pyplot.savefig(k +
"structure.pdf")
static bool get_is_setup(const IMP::ParticleAdaptor &p)
A class to read RMF files and make a network contact map.
static bool get_is_setup(const IMP::ParticleAdaptor &p)
A decorator to associate a particle with a part of a protein/DNA/RNA.
atom::Hierarchies create_hierarchies(RMF::FileConstHandle fh, Model *m)
Modify the transformation of a rigid body.
def make_plot
plot the interaction matrix
Move continuous particle variables by perturbing them within a ball.
def add_rmf
Add selections from an RMF file.
static bool get_is_setup(Model *m, ParticleIndex pi)
A decorator for keeping track of copies of a molecule.
ParticleIndexPairs get_indexes(const ParticlePairsTemp &ps)
Get the indexes from a list of particle pairs.
Ints get_index(const ParticlesTemp &particles, const Subset &subset, const Subsets &excluded)
def __init__
Set up a new graphXL object.
void load_frame(RMF::FileConstHandle file, RMF::FrameID frame)
Load the given RMF frame into the state of the linked objects.
def get_particles_at_resolution_one
Get particles at res 1, or any beads, based on the name.
Tools for clustering and cluster analysis.
Find all nearby pairs by testing all pairs.
Classes for writing output files and processing them.
A decorator for a residue.
The general base class for IMP exceptions.
int get_copy_index(Hierarchy h)
Walk up the hierarchy to find the current copy index.
Python classes to represent, score, sample and analyze models.
Functionality for loading, creating, manipulating and scoring atomic structures.
A decorator for a molecule.
Select hierarchy particles identified by the biological name.
Support for the RMF file format for storing hierarchical molecular data and markup.