def calcValidTauRange(mu, tth, psi):
    th = tth / 2
    etaMin = calcEtaMin(tth, psi)
    tauMin = calcTauPsiEta(mu, tth, psi, etaMin)
    # Psi mode
    tauMax = (bc.sind(th) ** 2 - bc.sind(psi) ** 2 + bc.cosd(th) ** 2 * bc.sind(psi) ** 2) / \
       (2 * mu * bc.sind(th) * bc.cosd(psi))
    return etaMin, tauMax
def calcTauRange(mu, tth, psi, etaMin):
    th = tth / 2
    tauMin = calcTauPsiEta(mu, tth, psi, etaMin)
    if abs(psi) > th:
        tauMin = None  # NaN heißt nichts?
    else:
        # Omega mode
        tauMin = (bc.sind(th) ** 2 - bc.sind(psi) ** 2 + bc.cosd(th) ** 2 * bc.sind(psi) ** 2) / \
           (2 * mu * bc.sind(th) * bc.cosd(psi))
    # Psi mode
    tauMax = (bc.sind(th) ** 2 - bc.sind(psi) ** 2 + bc.cosd(th) ** 2 * bc.sind(psi) ** 2) / \
       (2 * mu * bc.sind(th) * bc.cosd(psi))
    return tauMin, tauMax
def calcEtaMin(tth, psi):
    th = tth / 2
    #	if psi <= th:
    #		etaMin = 0
    #	else:
    #		etaMin = asind((sind(psi)**2 - sind(th)**2)**0.5 / (bc.cosd(th) * sind(psi)))
    if psi == 0:
        return 0
    else:
        return bc.asind((max(0,
                             bc.sind(psi)**2 - bc.sind(th)**2))**0.5 /
                        (bc.cosd(th) * bc.sind(psi)))
def calcEtaTau(mu, tau, tth, psi):
    th = tth / 2
    return bc.asind(2 * mu * tau * bc.sind(th) * bc.cosd(psi) - bc.sind(th) ** 2 + bc.sind(psi) ** 2) ** 0.5 / \
        (bc.cosd(th) * bc.sind(psi))
def latticeSpacings(spacings, angles, h, k, l):
    # check if single values are arrays or not
    if bf.length(spacings) == 1:
        if len(bf.size(spacings)) > 0:
            spacing = spacings[0]
        else:
            spacing = spacings
    if bf.length(angles) == 1:
        if len(bf.size(angles)) > 0:
            angle = angles[0]
        else:
            angle = angles
    # determine lattice spacings
    if bf.length(spacings) == 1 and bf.length(angles) == 1 and angle == 90:
        # cubic
        dVals = conv.aVals2latticeDists(spacing, h, k, l)
    elif bf.length(spacings) == 1 and bf.length(angles) == 1 and angle != 90:
        # rhomboedric
        dVals = (spacing**2 *
                 (1 - 3 * bc.cosd(angle)**2 + 2 * bc.cosd(angle)**3) /
                 ((h**2 + k**2 + l**2) * bc.sind(angle)**2 + 2 *
                  (h * k + k * l + h * l) *
                  (bc.cosd(angle)**2 - bc.cosd(angle))))**0.5
    elif bf.length(spacings) == 2 and bf.length(angles) == 1 and angle == 90:
        # tetragonal
        #dVals = spacings[0] / (h ** 2 + k ** 2 + l ** 2 * (spacings[0] ** 2 / spacings[1] ** 2)) ** 0.5
        dVals = 1 / (
            (h**2 + k**2) / spacings[0]**2 + l**2 / spacings[1]**2)**0.5
    elif bf.length(spacings) == 2 and bf.length(
            angles) == 2 and angles[0] == 90 and angles[1] == 120:
        # hexagonal
        dVals = spacings[0] / (4 / 3 * (h**2 + h * k + k**2) +
                               l**2 * spacings[0]**2 / spacings[1]**2)**0.5
    elif bf.length(spacings) == 3 and bf.length(angles) == 1 and angle == 90:
        # orthorhombic
        dVals = 1 / ((h / spacings[0])**2 + (k / spacings[1])**2 +
                     (l / spacings[2])**2)**0.5
    elif bf.length(spacings) == 3 and bf.length(
            angles) == 2 and angles[0] == 90:  # and angles[1] != 90
        # monoklin
        dVals = 1 / (h**2 / (spacings[0]**2 * bc.sind(angles[1])**2) +
                     k**2 / spacings[1]**2 + l**2 /
                     (spacings[2]**2 * bc.sind(angles[1])**2) -
                     2 * h * l * bc.cosd(angles[1]) /
                     (spacings[0] * spacings[2] * bc.sind(angles[1])**2))**0.5
    elif bf.length(spacings) == 3 and bf.length(angles) == 3:
        # triklin
        v = spacings[0] * spacings[1] * spacings[2] * (
            1 - bc.cosd(angles[0])**2 - bc.cosd(angles[1])**2 -
            bc.cosd(angles[2])**2 + 2 * bc.cosd(angles[0]) *
            bc.cosd(angles[1]) * bc.cosd(angles[2]))**0.5
        s11 = spacings[1]**2 * spacings[2]**2 * bc.sind(angles[0])**2
        s22 = spacings[0]**2 * spacings[2]**2 * bc.sind(angles[1])**2
        s33 = spacings[0]**2 * spacings[1]**2 * bc.sind(angles[2])**2
        s12 = spacings[0] * spacings[1] * spacings[2]**2 * (
            bc.cosd(angles[0]) * bc.cosd(angles[1]) - bc.cosd(angles[2]))
        s23 = spacings[0]**2 * spacings[1] * spacings[2] * (
            bc.cosd(angles[1]) * bc.cosd(angles[2]) - bc.cosd(angles[0]))
        s13 = spacings[0] * spacings[1]**2 * spacings[2] * (
            bc.cosd(angles[2]) * bc.cosd(angles[0]) - bc.cosd(angles[1]))
        dVals = (v**2 /
                 (s11 * h**2 + s22 * k**2 + s33 * l**2 + 2 * s12 * h * k +
                  2 * s23 * k * l + 2 * s13 * h * l))**0.5
    return dVals
def calcTauPsiEta(mu, tth, psi, eta):
    th = tth / 2
    return (bc.sind(th) ** 2 - bc.sind(psi) ** 2 + bc.cosd(th) ** 2 * bc.sind(psi) ** 2 * bc.sind(eta) ** 2) / \
        (2 * mu * bc.sind(th) * bc.cosd(psi))