13 class MoverScheme(object):
14 def __init__(self, length):
16 self.mover_scheme =
None
17 self.score_scheme = {}
18 self.score_initial_weights = {}
22 def add_mover_scheme(self, mover_scheme):
23 if len(mover_scheme) != self.length:
27 for mvs
in mover_scheme:
30 mc.set_scoring_function(get_restraint_set(mvs[0].get_model()))
31 mc.set_return_best(
False)
35 mc.set_name(str(self.numbermc))
37 self.mover_scheme = mc_scheme
39 def add_montecarlo_temperatures(self, temps):
42 def add_montecarlo_steps(self, steps):
45 def add_score_scheme(self, score, weigth_scheme):
46 if len(weigth_scheme) != self.length:
49 self.score_scheme[score] = weigth_scheme
50 self.score_initial_weights[score] = score.get_weight()
55 def get_position(self, position):
56 movers = self.mover_scheme[position]
58 for score
in self.score_scheme:
59 score_tmp_dict[score] = self.score_scheme[score][position]
60 return movers, score_tmp_dict
62 def get_and_update(self):
63 mc, score_tmp_dict = self.get_position(self.position)
64 temp = self.temps[self.position]
66 steps = self.steps[self.position]
68 if self.position > self.length - 1:
70 return mc, score_tmp_dict, steps
74 def __init__(self, m, hier, MoverScheme):
75 IMP.core.MonteCarloMover.__init__(
78 "HybridMonteCarloMover")
90 self.ps.append(rb.get_particle())
91 for bead
in self.beads:
92 self.ps.append(bead.get_particle())
94 self.indexes = [p.get_index()
for p
in self.ps]
96 self.do_store_current_coordinates()
98 self.mover_scheme = MoverScheme
100 def do_store_current_coordinates(self):
102 self.refframes[rb] = rb.get_reference_frame()
103 for bead
in self.beads:
106 def do_propose(self):
108 self.rejects.append(0)
109 if len(self.rejects) > self.lenrejects:
112 self.rejects, float(sum(self.rejects)) / len(self.rejects)
114 self.do_store_current_coordinates()
119 for i
in range(self.mover_scheme.get_length()):
120 mc, score_tmp_dict, steps = self.mover_scheme.get_and_update()
122 mc.reset_statistics()
124 for score
in score_tmp_dict:
125 score.set_weight(score_tmp_dict[score])
130 float(mc.get_number_of_accepted_steps())
131 / mc.get_number_of_proposed_steps())
142 for rb
in self.refframes:
143 rb.set_reference_frame(self.refframes[rb])
144 for bead
in self.xyzs:
147 def do_get_inputs(self):
152 def __init__(self, m, hier, resolution=10, depth=4):
154 IMP.core.MonteCarloMover.__init__(
164 self.resolution = resolution
170 self.particle_blocks = []
171 for mol
in self.mols:
174 self.beadsd[mol] = beads
175 for rb
in self.rbsd[mol]:
176 self.ps.append(rb.get_particle())
177 for bead
in self.beadsd[mol]:
178 self.ps.append(bead.get_particle())
180 mol, resolution=self.resolution).get_selected_particles()
181 self.particle_blocks.append(ps)
183 self.do_store_current_coordinates()
185 def do_store_current_coordinates(self):
186 for mol
in self.mols:
187 for rb
in self.rbsd[mol]:
188 self.refframes[rb] = rb.get_reference_frame()
189 for bead
in self.beadsd[mol]:
192 def get_full_graph(self):
194 get the full graph of distances between every particle pair
197 pdist_array = np.array(
199 self.particle_blocks))
200 pdist_mat = scipy.spatial.distance.squareform(pdist_array)
201 pdist_mat[pdist_mat <= 10] = 1
202 pdist_mat[pdist_mat > 10] = 0
203 graph = nx.Graph(pdist_mat)
206 def get_list_of_interacting_molecules(self, succ_dict, pointer):
207 if pointer
in succ_dict:
208 paths = [path
for p
in succ_dict[pointer]
for path
in
209 self.get_list_of_interacting_molecules(succ_dict, p)]
210 ret = [[pointer] + path
for path
in paths]
216 def get_minimum_spanning_tree(self):
218 return the minimum spanning tree
220 graph = self.get_full_graph()
221 graph = nx.minimum_spanning_tree(graph)
224 def get_sublists(self, lst, size):
225 result = [sublist
for sublist
in
226 (lst[x:x + size]
for x
in range(len(lst) - size + 1))]
229 def get_list_of_connected_mols(self, depth):
230 gr = self.get_minimum_spanning_tree()
232 if len(gr.edges()) > 0:
234 for node
in gr.nodes():
235 succ_dict = nx.dfs_successors(gr, node)
236 paths = [path
for p
in succ_dict[node]
for path
in
237 self.get_list_of_interacting_molecules(succ_dict, p)]
238 ret = [[node] + path
for path
in paths]
240 for s
in range(2, min([depth + 1, len(path) + 1,
242 subls = self.get_sublists(path, s)
244 all_groups.add(frozenset(subl))
248 def do_compute_pcas(self):
250 for i, ps
in enumerate(self.particle_blocks):
256 self.singletons[(mol,)] = pcan
259 all_groups = self.get_list_of_connected_mols(self.depth)
261 for group
in all_groups:
262 mols = [self.mols[n]
for n
in group]
264 mols, resolution=self.resolution).get_selected_particles()
268 self.singletons[tuple(mols)] = pcan
270 def do_get_pairs(self, temp=20):
271 sk = self.singletons.keys()
274 for s1, s2
in itertools.combinations(sk, 2):
276 self.singletons[s1].get_principal_values(),
277 self.singletons[s2].get_principal_values())
278 pairs.append(((s1, s2), math.exp(-rms / temp)))
282 def do_compute_transforms(self, pair):
289 arbs += self.rbsd[mol]
290 abeads += self.beadsd[mol]
291 apca = self.singletons[amols]
296 brbs += self.rbsd[mol]
297 bbeads += self.beadsd[mol]
298 bpca = self.singletons[bmols]
303 transbtoa = transatob.get_inverse()
305 return (transatob, transbtoa, arbs, abeads, brbs, bbeads)
307 def weighted_choice(self, choices):
308 total = sum(w
for c, w
in choices)
309 r = random.uniform(0, total)
315 assert False,
"Shouldn't get here"
317 def do_propose(self):
318 self.rejects.append(0)
319 if len(self.rejects) > self.lenrejects:
323 self.do_store_current_coordinates()
324 self.do_compute_pcas()
325 pairs = self.do_get_pairs()
326 pair = self.weighted_choice(pairs)
327 t = self.do_compute_transforms(pair)
330 (ta2b, tb2a) = (t[0], t[1])
335 moved_indexes.append(arb.get_particle_index())
338 moved_indexes.append(arb.get_particle_index())
349 for rb
in self.refframes:
350 rb.set_reference_frame(self.refframes[rb])
351 for bead
in self.xyzs:
354 def do_get_inputs(self):
IMP::algebra::Transformation3Ds PCAalign(const IMP::algebra::PrincipalComponentAnalysis &pca1, const IMP::algebra::PrincipalComponentAnalysis &pca2)
Return value of the MonteCarloMover::propose() function.
IMP::algebra::PrincipalComponentAnalysis NormalizePCA(const IMP::algebra::PrincipalComponentAnalysis &pca, const IMP::Particles &ps)
void transform(XYZ a, const algebra::Transformation3D &tr)
Apply a transformation to the particle.
A base class for classes which perturb particles.
A decorator for a particle with x,y,z coordinates.
PrincipalComponentAnalysisD< D > get_principal_components(const Vector< VectorD< D > > &ps)
Perform principal components analysis on a set of vectors.
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...
double get_distance(const VectorD< D > &v1, const VectorD< D > &v2)
Compute the distance between two vectors.
Floats get_list_of_bipartite_minimum_sphere_distance(const ParticlesTemps &pss)
Select hierarchy particles identified by the biological name.
Applies a list of movers one at a time.