def __init__(self, symname, tgtaxis1, tgtaxis2, from_seg, *, tol=1.0, lever=50, to_seg=-1, distinct_axes=False): if from_seg == to_seg: raise ValueError('from_seg should not be same as to_seg') self.symname = symname self.from_seg = from_seg if len(tgtaxis1) == 2: tgtaxis1 += [0, 0, 0, 1], if len(tgtaxis2) == 2: tgtaxis2 += [0, 0, 0, 1], self.tgtaxis1 = (tgtaxis1[0], hm.hnormalized(tgtaxis1[1]), hm.hpoint(tgtaxis1[2])) self.tgtaxis2 = (tgtaxis2[0], hm.hnormalized(tgtaxis2[1]), hm.hpoint(tgtaxis2[2])) assert 3 == len(self.tgtaxis1) assert 3 == len(self.tgtaxis2) self.angle = hm.angle(tgtaxis1[1], tgtaxis2[1]) self.tol = tol self.lever = lever self.to_seg = to_seg self.rot_tol = tol / lever self.distinct_axes = distinct_axes # -z not same as z (for T33) self.sym_axes = [self.tgtaxis1, self.tgtaxis2]
def __init__(self, symname, tgtaxis1, tgtaxis2, from_seg=0, origin_seg=None, *, tolerance=1.0, lever=50, to_seg=-1, nondistinct_axes=False, segs=None, tgtaxis3=None): """ """ if from_seg == to_seg: raise ValueError("from_seg should not be same as to_seg") self.symname = symname self.from_seg = from_seg if len(tgtaxis1) == 2: tgtaxis1 += ([0, 0, 0, 1], ) if len(tgtaxis2) == 2: tgtaxis2 += ([0, 0, 0, 1], ) self.tgtaxis1 = ( tgtaxis1[0], hm.hnormalized(tgtaxis1[1]), hm.hpoint(tgtaxis1[2]), ) self.tgtaxis2 = ( tgtaxis2[0], hm.hnormalized(tgtaxis2[1]), hm.hpoint(tgtaxis2[2]), ) if tgtaxis3: if len(tgtaxis3) == 2: tgtaxis3 += ([0, 0, 0, 1], ) self.tgtaxis3 = ( tgtaxis3[0], hm.hnormalized(tgtaxis3[1]), hm.hpoint(tgtaxis3[2]), ) assert 3 == len(self.tgtaxis3) assert 3 == len(self.tgtaxis1) assert 3 == len(self.tgtaxis2) self.tgtangle = hm.angle(tgtaxis1[1], tgtaxis2[1]) self.tolerance = tolerance self.lever = lever self.to_seg = to_seg self.rot_tol = tolerance / lever self.nondistinct_axes = nondistinct_axes # -z not same as z (for T33) self.sym_axes = [self.tgtaxis1, self.tgtaxis2] self.is_cyclic = False self.origin_seg = None self.segs = segs
def score(self, segpos, verbosity=False, **kw): cen1 = segpos[self.from_seg][..., :, 3] cen2 = segpos[self.to_seg][..., :, 3] ax1 = segpos[self.from_seg][..., :, 2] ax2 = segpos[self.to_seg][..., :, 2] if self.nondistinct_axes: p, q = hm.line_line_closest_points_pa(cen1, ax1, cen2, ax2) dist = hm.hnorm(p - q) cen = (p + q) / 2 ax1c = hm.hnormalized(cen1 - cen) ax2c = hm.hnormalized(cen2 - cen) ax1 = np.where(hm.hdot(ax1, ax1c)[..., None] > 0, ax1, -ax1) ax2 = np.where(hm.hdot(ax2, ax2c)[..., None] > 0, ax2, -ax2) ang = np.arccos(hm.hdot(ax1, ax2)) else: dist = hm.line_line_distance_pa(cen1, ax1, cen2, ax2) ang = np.arccos(np.abs(hm.hdot(ax1, ax2))) roterr2 = (ang - self.tgtangle)**2 return np.sqrt(roterr2 / self.rot_tol**2 + (dist / self.tolerance)**2)