def compute_POAVs(self): """Compute `POAV1`, `POAV2`, `POAVR`.""" super().update_attrs() POAV_classes = {'POAV1': POAV1, 'POAV2': POAV2, 'POAVR': POAVR} for atom in self: # the central atom must have 3 bonds for POAV analysis. if atom.bonds.Nbonds == 3: for POAV_name, POAV_class in list(POAV_classes.items()): setattr(atom, POAV_name, POAV_class(atom.bonds)) for atom in self: # the central atom must have 3 bonds for POAV analysis. if atom.bonds.Nbonds == 3: for POAV_name in ('POAV1', 'POAV2', 'POAVR'): POAV = getattr(atom, POAV_name) sigma_pi_angles = [] pyramidalization_angles = [] misalignment_angles = [] for bond, NN in zip(atom.bonds, atom.NN): # first compute the pyramidalization angle sigma_pi_angle = vec.angle(POAV.Vpi, bond.vector) if sigma_pi_angle < np.pi / 2: sigma_pi_angle = np.pi - sigma_pi_angle sigma_pi_angles.append(sigma_pi_angle) pyramidalization_angles.append(sigma_pi_angle - np.pi / 2) # the bonded atom must have a POAV to compute the # misalignment angles if getattr(NN, POAV_name) is not None: NN_POAV = getattr(NN, POAV_name) # compute vector that is orthogonal to the plane # defined by the bond vector and the POAV of the # center atom. nvec = vec.cross(bond.vector, POAV.Vpi) # the misalignment angle is the angle between the # nearest neighbor's POAV and the plane defined by # the bond vector and the POAV of the center atom, # which is pi/2 minus the angle between # the NN POAV and the normal vector to the plane # computed above. misalignment_angles.append( np.abs(np.pi / 2 - vec.angle(NN_POAV.Vpi, nvec))) else: misalignment_angles.append(np.nan) POAV.pyramidalization_angles = pyramidalization_angles POAV.misalignment_angles = misalignment_angles POAV.sigma_pi_angles = sigma_pi_angles
def compute_POAVs(self): """Compute `POAV1`, `POAV2`, `POAVR`.""" super().update_attrs() POAV_classes = {'POAV1': POAV1, 'POAV2': POAV2, 'POAVR': POAVR} for atom in self: # the central atom must have 3 bonds for POAV analysis. if atom.bonds.Nbonds == 3: for POAV_name, POAV_class in list(POAV_classes.items()): setattr(atom, POAV_name, POAV_class(atom.bonds)) for atom in self: # the central atom must have 3 bonds for POAV analysis. if atom.bonds.Nbonds == 3: for POAV_name in ('POAV1', 'POAV2', 'POAVR'): POAV = getattr(atom, POAV_name) sigma_pi_angles = [] pyramidalization_angles = [] misalignment_angles = [] for bond, NN in zip(atom.bonds, atom.NN): # first compute the pyramidalization angle sigma_pi_angle = vec.angle(POAV.Vpi, bond.vector) if sigma_pi_angle < np.pi / 2: sigma_pi_angle = np.pi - sigma_pi_angle sigma_pi_angles.append(sigma_pi_angle) pyramidalization_angles.append( sigma_pi_angle - np.pi / 2) # the bonded atom must have a POAV to compute the # misalignment angles if getattr(NN, POAV_name) is not None: NN_POAV = getattr(NN, POAV_name) # compute vector that is orthogonal to the plane # defined by the bond vector and the POAV of the # center atom. nvec = vec.cross(bond.vector, POAV.Vpi) # the misalignment angle is the angle between the # nearest neighbor's POAV and the plane defined by # the bond vector and the POAV of the center atom, # which is pi/2 minus the angle between # the NN POAV and the normal vector to the plane # computed above. misalignment_angles.append(np.abs( np.pi / 2 - vec.angle(NN_POAV.Vpi, nvec))) else: misalignment_angles.append(np.nan) POAV.pyramidalization_angles = pyramidalization_angles POAV.misalignment_angles = misalignment_angles POAV.sigma_pi_angles = sigma_pi_angles
def angles(self): """:class:`~numpy:numpy.ndarray` of `Bond` pair angles.""" return np.asarray([ vec.angle(b1.vector, b2.vector) for (b1, b2) in cyclic_pairs(self) ])
def angles(self): """:class:`~numpy:numpy.ndarray` of `Bond` pair angles.""" return np.asarray([vec.angle(b1.vector, b2.vector) for (b1, b2) in cyclic_pairs(self)])
def test15(): u = Vector([1, 0]) v = Vector([1, 1]) assert_almost_equal(vec.angle(u, v), np.pi / 4)
def test15(): u = Vector([1, 0]) v = Vector([1, 1]) assert_almost_equal(vec.angle(u, v), np.pi/4)