def _cart_dists(self, s1, s2, avg_lattice, mask, normalization, frac_tol=None): """ Finds a matching in cartesian space. Finds an additional fractional translation vector to minimize RMS distance Args: s1, s2: numpy arrays of fractional coordinates. len(s1) >= len(s2) avg_lattice: Lattice on which to calculate distances mask: numpy array of booleans. mask[i, j] = True indicates that s2[i] cannot be matched to s1[j] normalization (float): inverse normalization length Returns: Distances from s2 to s1, normalized by (V/Natom) ^ 1/3 Fractional translation vector to apply to s2. Mapping from s1 to s2, i.e. with numpy slicing, s1[mapping] => s2 """ if len(s2) > len(s1): raise ValueError("s1 must be larger than s2") if mask.shape != (len(s2), len(s1)): raise ValueError("mask has incorrect shape") #vectors are from s2 to s1 vecs, d_2 = pbc_shortest_vectors(avg_lattice, s2, s1, mask, return_d2=True, frac_tol=frac_tol) lin = LinearAssignment(d_2) s = lin.solution short_vecs = vecs[np.arange(len(s)), s] translation = np.average(short_vecs, axis=0) f_translation = avg_lattice.get_fractional_coords(translation) new_d2 = np.sum((short_vecs - translation) ** 2, axis=-1) return new_d2 ** 0.5 * normalization, f_translation, s
def pbc_shortest_vectors(lattice, fcoords1, fcoords2, mask=None, return_d2=False): """ Returns the shortest vectors between two lists of coordinates taking into account periodic boundary conditions and the lattice. Args: lattice: lattice to use fcoords1: First set of fractional coordinates. e.g., [0.5, 0.6, 0.7] or [[1.1, 1.2, 4.3], [0.5, 0.6, 0.7]]. It can be a single coord or any array of coords. fcoords2: Second set of fractional coordinates. mask (boolean array): Mask of matches that are not allowed. i.e. if mask[1,2] == True, then subset[1] cannot be matched to superset[2] return_d2 (boolean): whether to also return the squared distances Returns: array of displacement vectors from fcoords1 to fcoords2 first index is fcoords1 index, second is fcoords2 index """ return cuc.pbc_shortest_vectors(lattice, fcoords1, fcoords2, mask, return_d2)