def part_int_daeg1_pseudo_ellipse_22(phi, x, y): """The theta-sigma partial integral of the 1st degree Frame Order matrix element 22 for the pseudo-ellipse. @param phi: The azimuthal tilt-torsion angle. @type phi: float @param x: The cone opening angle along x. @type x: float @param y: The cone opening angle along y. @type y: float @return: The theta-sigma partial integral. @rtype: float """ # Theta max. tmax = tmax_pseudo_ellipse(phi, x, y) # The theta-sigma integral. return sin(tmax)**2
def part_int_daeg2_pseudo_ellipse_free_rotor_88(phi, x, y): """The theta-sigma partial integral of the 2nd degree Frame Order matrix for the free rotor pseudo-ellipse. @param phi: The azimuthal tilt-torsion angle. @type phi: float @param x: The cone opening angle along x. @type x: float @param y: The cone opening angle along y. @type y: float @return: The theta-sigma partial integral. @rtype: float """ # Theta max. tmax = tmax_pseudo_ellipse(phi, x, y) # The theta-sigma integral. return cos(tmax)**3
def part_int_daeg2_pseudo_ellipse_torsionless_55(phi, x, y): """The theta partial integral of the 2nd degree Frame Order matrix for the torsionless pseudo-ellipse. @param phi: The azimuthal tilt-torsion angle. @type phi: float @param x: The cone opening angle along x. @type x: float @param y: The cone opening angle along y. @type y: float @return: The theta partial integral. @rtype: float """ # Theta max. tmax = tmax_pseudo_ellipse(phi, x, y) # The theta integral. return 2.0*sin(phi)**2*cos(tmax)**3 + 3.0*cos(phi)**2*cos(tmax)**2
def part_int_daeg2_pseudo_ellipse_free_rotor_88(phi, x, y): """The theta-sigma partial integral of the 2nd degree Frame Order matrix for the free rotor pseudo-ellipse. @param phi: The azimuthal tilt-torsion angle. @type phi: float @param x: The cone opening angle along x. @type x: float @param y: The cone opening angle along y. @type y: float @return: The theta-sigma partial integral. @rtype: float """ # Theta max. tmax = tmax_pseudo_ellipse(phi, x, y) # The theta-sigma integral. return cos(tmax)**3
def part_int_daeg2_pseudo_ellipse_torsionless_55(phi, x, y): """The theta partial integral of the 2nd degree Frame Order matrix for the torsionless pseudo-ellipse. @param phi: The azimuthal tilt-torsion angle. @type phi: float @param x: The cone opening angle along x. @type x: float @param y: The cone opening angle along y. @type y: float @return: The theta partial integral. @rtype: float """ # Theta max. tmax = tmax_pseudo_ellipse(phi, x, y) # The theta integral. return 2.0 * sin(phi)**2 * cos(tmax)**3 + 3.0 * cos(phi)**2 * cos(tmax)**2
def part_int_daeg1_pseudo_ellipse_22(phi, x, y): """The theta-sigma partial integral of the 1st degree Frame Order matrix element 22 for the pseudo-ellipse. @param phi: The azimuthal tilt-torsion angle. @type phi: float @param x: The cone opening angle along x. @type x: float @param y: The cone opening angle along y. @type y: float @return: The theta-sigma partial integral. @rtype: float """ # Theta max. tmax = tmax_pseudo_ellipse(phi, x, y) # The theta-sigma integral. return sin(tmax)**2
def pseudo_ellipse(phi): """The pseudo-ellipse wrapper formula.""" return tmax_pseudo_ellipse(phi, theta_x, theta_y)
def pseudo_ellipse(phi): """The pseudo-ellipse wrapper formula.""" return tmax_pseudo_ellipse(phi, theta_x, theta_y)
def pcs_numeric_int_pseudo_ellipse_torsionless_qrint(points=None, theta_x=None, theta_y=None, c=None, full_in_ref_frame=None, r_pivot_atom=None, r_pivot_atom_rev=None, r_ln_pivot=None, A=None, R_eigen=None, RT_eigen=None, Ri_prime=None, pcs_theta=None, pcs_theta_err=None, missing_pcs=None, error_flag=False): """Determine the averaged PCS value via numerical integration. @keyword points: The Sobol points in the torsion-tilt angle space. @type points: numpy rank-2, 3D array @keyword theta_x: The x-axis half cone angle. @type theta_x: float @keyword theta_y: The y-axis half cone angle. @type theta_y: float @keyword c: The PCS constant (without the interatomic distance and in Angstrom units). @type c: numpy rank-1 array @keyword full_in_ref_frame: An array of flags specifying if the tensor in the reference frame is the full or reduced tensor. @type full_in_ref_frame: numpy rank-1 array @keyword r_pivot_atom: The pivot point to atom vector. @type r_pivot_atom: numpy rank-2, 3D array @keyword r_pivot_atom_rev: The reversed pivot point to atom vector. @type r_pivot_atom_rev: numpy rank-2, 3D array @keyword r_ln_pivot: The lanthanide position to pivot point vector. @type r_ln_pivot: numpy rank-2, 3D array @keyword A: The full alignment tensor of the non-moving domain. @type A: numpy rank-2, 3D array @keyword R_eigen: The eigenframe rotation matrix. @type R_eigen: numpy rank-2, 3D array @keyword RT_eigen: The transpose of the eigenframe rotation matrix (for faster calculations). @type RT_eigen: numpy rank-2, 3D array @keyword Ri_prime: The empty rotation matrix for the in-frame isotropic cone motion, used to calculate the PCS for each state i in the numerical integration. @type Ri_prime: numpy rank-2, 3D array @keyword pcs_theta: The storage structure for the back-calculated PCS values. @type pcs_theta: numpy rank-2 array @keyword pcs_theta_err: The storage structure for the back-calculated PCS errors. @type pcs_theta_err: numpy rank-2 array @keyword missing_pcs: A structure used to indicate which PCS values are missing. @type missing_pcs: numpy rank-2 array @keyword error_flag: A flag which if True will cause the PCS errors to be estimated and stored in pcs_theta_err. @type error_flag: bool """ # Clear the data structures. for i in range(len(pcs_theta)): for j in range(len(pcs_theta[i])): pcs_theta[i, j] = 0.0 pcs_theta_err[i, j] = 0.0 # Loop over the samples. num = 0 for i in range(len(points)): # Unpack the point. theta, phi = points[i] # Calculate theta_max. theta_max = tmax_pseudo_ellipse(phi, theta_x, theta_y) # Outside of the distribution, so skip the point. if theta > theta_max: continue # Calculate the PCSs for this state. pcs_pivot_motion_torsionless_qrint(theta_i=theta, phi_i=phi, full_in_ref_frame=full_in_ref_frame, r_pivot_atom=r_pivot_atom, r_pivot_atom_rev=r_pivot_atom_rev, r_ln_pivot=r_ln_pivot, A=A, R_eigen=R_eigen, RT_eigen=RT_eigen, Ri_prime=Ri_prime, pcs_theta=pcs_theta, pcs_theta_err=pcs_theta_err, missing_pcs=missing_pcs) # Increment the number of points. num += 1 # Calculate the PCS and error. for i in range(len(pcs_theta)): for j in range(len(pcs_theta[i])): # The average PCS. pcs_theta[i, j] = c[i] * pcs_theta[i, j] / float(num) # The error. if error_flag: pcs_theta_err[i, j] = abs(pcs_theta_err[i, j] / float(num) - pcs_theta[i, j]**2) / float(num) pcs_theta_err[i, j] = c[i] * sqrt(pcs_theta_err[i, j]) print("%8.3f +/- %-8.3f" % (pcs_theta[i, j]*1e6, pcs_theta_err[i, j]*1e6))