def z_parity_conjugate(self): """Reflect modes across x-y plane (along z axis) See "Gravitational-wave modes from precessing black-hole binaries" by Boyle et al. (2014) for more details. """ if self.dataType == UnknownDataType: raise ValueError( f"Cannot compute parity type for {self.data_type_string}.") W = self[:, : 0] # W without `data`, and `ells`=(0,-1); different from `self.copy_without_data()` W.data = np.empty_like(self.data) W.ells = self.ells W.frame = np.z_parity_conjugate(self.frame) s = self.spin_weight for ell in range(W.ell_min, W.ell_max + 1): if ((ell + s) % 2) == 0: lm_indices = [ sf.LM_index(ell, m, W.ell_min) for m in range(-ell, ell + 1) ] W.data[:, lm_indices] = np.conjugate( self.data[:, list(reversed(lm_indices))]) else: lm_indices = [ sf.LM_index(ell, m, W.ell_min) for m in range(-ell, ell + 1) ] W.data[:, lm_indices] = -np.conjugate( self.data[:, list(reversed(lm_indices))]) W.__history_depth__ -= 1 W._append_history(f"{W} = {self}.z_parity_conjugate") return W
def test_quaternion_parity_conjugates(Qs): for q in Qs[Qs_finite]: assert q.x_parity_conjugate() == np.quaternion(q.w, q.x, -q.y, -q.z) assert q.y_parity_conjugate() == np.quaternion(q.w, -q.x, q.y, -q.z) assert q.z_parity_conjugate() == np.quaternion(q.w, -q.x, -q.y, q.z) assert q.parity_conjugate() == np.quaternion(q.w, q.x, q.y, q.z) assert np.array_equal(np.x_parity_conjugate(Qs[Qs_finite]), np.array([q.x_parity_conjugate() for q in Qs[Qs_finite]])) assert np.array_equal(np.y_parity_conjugate(Qs[Qs_finite]), np.array([q.y_parity_conjugate() for q in Qs[Qs_finite]])) assert np.array_equal(np.z_parity_conjugate(Qs[Qs_finite]), np.array([q.z_parity_conjugate() for q in Qs[Qs_finite]])) assert np.array_equal(np.parity_conjugate(Qs[Qs_finite]), np.array([q.parity_conjugate() for q in Qs[Qs_finite]]))