Source code for rpxdock.cluster.prune
import numpy as np
import rpxdock.homog as hm
from rpxdock.cluster import cookie_cutter
[docs]def prune_results_2comp(spec, body1, body2, score, pos, mindis=5):
order = np.argsort(-score)
score = score[order]
pos = pos[0][order], pos[1][order]
a1, d1, a2, d2, flip = extract_2comp_dofs(spec, pos)
r1 = (body1.rg_xy() + body1.radius_xy_max()) / 2
r2 = (body2.rg_xy() + body2.radius_xy_max()) / 2
dofs = np.stack([a1 * r1, d1, a2 * r2, d2, 1000 * flip], axis=1)
keep = cookie_cutter(dofs, mindis)
return score[keep], (pos[0][keep], pos[1][keep])
[docs]def extract_2comp_dofs(spec, pos):
print("prune_results")
pos1, pos2 = pos
rot1a = np.linalg.inv(spec.orig1) @ pos1
rot1b = np.linalg.inv(spec.orig1 @ hm.hrot([1, 0, 0], 180)) @ pos1
rot2 = np.linalg.inv(spec.orig2) @ pos2
axis1a, ang1a = hm.axis_angle_of(rot1a)
axis1b, ang1b = hm.axis_angle_of(rot1b)
axis2, ang2 = hm.axis_angle_of(rot2)
# sort out flips
aorb = np.abs(axis1a[:, 2]) > 0.999
aorb |= ang1a < 0.01
bora = np.abs(axis1b[:, 2]) > 0.999
bora |= ang1b < 0.01
assert np.all(bora + aorb)
assert not np.all(bora * aorb)
ang1 = np.select([aorb, True], [ang1a, ang1b])
# print("foo", np.round(np.unique(np.round(ang1, 6)) * 180 / np.pi))
# print("foo", np.round(np.unique(np.round(ang2, 6)) * 180 / np.pi))
dist1 = np.linalg.norm(pos1[:, :3, 3], axis=1)
dist2 = np.linalg.norm(pos2[:, :3, 3], axis=1)
return ang1, dist1, ang2, dist2, aorb