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))