Commit a8db48b5 authored by Tobias WEBER's avatar Tobias WEBER
Browse files

cleaned up tascalc and cov scripts.

parent b9f6508f
...@@ -7,10 +7,15 @@ ...@@ -7,10 +7,15 @@
# #
import os import os
import numpy as np
import numpy.linalg as la
import tascalc as tas import tascalc as tas
try:
import numpy as np
import numpy.linalg as la
except ImportError:
print("Numpy could not be imported!")
exit(-1)
np.set_printoptions( np.set_printoptions(
floatmode = "fixed", floatmode = "fixed",
...@@ -241,20 +246,20 @@ def calc_ellipses(Qres_Q): ...@@ -241,20 +246,20 @@ def calc_ellipses(Qres_Q):
print("4d resolution ellipsoid diagonal elements fwhm (coherent-elastic scattering) lengths:\n%s\n" \ print("4d resolution ellipsoid diagonal elements fwhm (coherent-elastic scattering) lengths:\n%s\n" \
% (1./np.sqrt(np.abs(np.diag(Qres_Q))) * sig2fwhm)) % (1./np.sqrt(np.abs(np.diag(Qres_Q))) * sig2fwhm))
print("4d resolution ellipsoid principal axes fwhm lengths:\n%s\n" % fwhms) print("4d resolution ellipsoid principal axes fwhm: %s" % fwhms)
Qres_proj = proj_quad(proj_quad(proj_quad(Qres_Q, 2), 1), 0) Qres_proj = proj_quad(proj_quad(proj_quad(Qres_Q, 2), 1), 0)
print("Incoherent-elastic fwhm width: %.4f meV\n" % (1./np.sqrt(np.abs(Qres_proj[0,0])) * sig2fwhm)) print("Incoherent-elastic fwhm: %.4f meV\n" % (1./np.sqrt(np.abs(Qres_proj[0,0])) * sig2fwhm))
print("2d Qx,E sliced ellipse fwhm lengths and slope angle:\n%s, %.4f\n" % (results[0]["fwhms"], results[0]["angles"][0]))
print("2d Qy,E sliced ellipse fwhm lengths and slope angle:\n%s, %.4f\n" % (results[1]["fwhms"], results[1]["angles"][0]))
print("2d Qz,E sliced ellipse fwhm lengths and slope angle:\n%s, %.4f\n" % (results[2]["fwhms"], results[2]["angles"][0]))
print("2d Qx,Qy sliced ellipse fwhm lengths and slope angle:\n%s, %.4f\n" % (results[3]["fwhms"], results[3]["angles"][0]))
print("2d Qx,E projected ellipse fwhm lengths and slope angle:\n%s, %.4f\n" % (results[0]["fwhms_proj"], results[0]["angles_proj"][0])) print("Qx,E sliced ellipse fwhm and slope angle: %s, %.4f" % (results[0]["fwhms"], results[0]["angles"][0]))
print("2d Qy,E projected ellipse fwhm lengths and slope angle:\n%s, %.4f\n" % (results[1]["fwhms_proj"], results[1]["angles_proj"][0])) print("Qy,E sliced ellipse fwhm and slope angle: %s, %.4f" % (results[1]["fwhms"], results[1]["angles"][0]))
print("2d Qz,E projected ellipse fwhm lengths and slope angle:\n%s, %.4f\n" % (results[2]["fwhms_proj"], results[2]["angles_proj"][0])) print("Qz,E sliced ellipse fwhm and slope angle: %s, %.4f" % (results[2]["fwhms"], results[2]["angles"][0]))
print("2d Qx,Qy projected ellipse fwhm lengths and slope angle:\n%s, %.4f\n" % (results[3]["fwhms_proj"], results[3]["angles_proj"][0])) print("Qx,Qy sliced ellipse fwhm and slope angle: %s, %.4f" % (results[3]["fwhms"], results[3]["angles"][0]))
print()
print("Qx,E projected ellipse fwhm and slope angle: %s, %.4f" % (results[0]["fwhms_proj"], results[0]["angles_proj"][0]))
print("Qy,E projected ellipse fwhm and slope angle: %s, %.4f" % (results[1]["fwhms_proj"], results[1]["angles_proj"][0]))
print("Qz,E projected ellipse fwhm and slope angle: %s, %.4f" % (results[2]["fwhms_proj"], results[2]["angles_proj"][0]))
print("Qx,Qy projected ellipse fwhm and slope angle: %s, %.4f" % (results[3]["fwhms_proj"], results[3]["angles_proj"][0]))
return results return results
...@@ -266,8 +271,12 @@ def calc_ellipses(Qres_Q): ...@@ -266,8 +271,12 @@ def calc_ellipses(Qres_Q):
# shows the 2d ellipses # shows the 2d ellipses
# #
def plot_ellipses(file, Q4, w, Qmean, ellis): def plot_ellipses(file, Q4, w, Qmean, ellis):
import mpl_toolkits.mplot3d as mplot3d try:
import matplotlib.pyplot as plot import mpl_toolkits.mplot3d as mplot3d
import matplotlib.pyplot as plot
except ImportError:
print("Matplotlib could not be imported!")
exit(-1)
thesymsize = options["symsize"] * w thesymsize = options["symsize"] * w
...@@ -367,7 +376,11 @@ if __name__ == "__main__": ...@@ -367,7 +376,11 @@ if __name__ == "__main__":
print("This is a covariance matrix calculator using neutron events, written by T. Weber <tweber@ill.fr>, 30 March 2019.\n") print("This is a covariance matrix calculator using neutron events, written by T. Weber <tweber@ill.fr>, 30 March 2019.\n")
check_versions() check_versions()
import argparse as arg try:
import argparse as arg
except ImportError:
print("Argparse could not be imported!")
exit(-1)
args = arg.ArgumentParser(description="Calculates the covariance matrix of neutron scattering events.") args = arg.ArgumentParser(description="Calculates the covariance matrix of neutron scattering events.")
args.add_argument("file", type=str, help="input file") args.add_argument("file", type=str, help="input file")
...@@ -380,7 +393,7 @@ if __name__ == "__main__": ...@@ -380,7 +393,7 @@ if __name__ == "__main__":
args.add_argument("--w", default=options["w_idx"], type=int, nargs="?", help="index of neutron weight factor column in QE file") args.add_argument("--w", default=options["w_idx"], type=int, nargs="?", help="index of neutron weight factor column in QE file")
args.add_argument("--Q", default=options["Q_start_idx"], type=int, nargs="?", help="index of Q vector's first column in QE file") args.add_argument("--Q", default=options["Q_start_idx"], type=int, nargs="?", help="index of Q vector's first column in QE file")
args.add_argument("--E", default=options["E_idx"], type=int, nargs="?", help="index of E column in QE file") args.add_argument("--E", default=options["E_idx"], type=int, nargs="?", help="index of E column in QE file")
args.add_argument("--kikf", action="store_true", help="use the kikf file type") args.add_argument("--QEfile", action="store_true", help="use the QE file type")
args.add_argument("--centreonQ", action="store_true", help="centre plots on mean Q") args.add_argument("--centreonQ", action="store_true", help="centre plots on mean Q")
args.add_argument("--noverbose", action="store_true", help="don't show console logs") args.add_argument("--noverbose", action="store_true", help="don't show console logs")
args.add_argument("--noplot", action="store_true", help="don't show any plot windows") args.add_argument("--noplot", action="store_true", help="don't show any plot windows")
...@@ -405,7 +418,6 @@ if __name__ == "__main__": ...@@ -405,7 +418,6 @@ if __name__ == "__main__":
options["plot_results"] = (argv.noplot==False) options["plot_results"] = (argv.noplot==False)
options["plot_neutrons"] = (argv.noneutrons==False) options["plot_neutrons"] = (argv.noneutrons==False)
options["centre_on_Q"] = argv.centreonQ options["centre_on_Q"] = argv.centreonQ
use_kikf_file = argv.kikf
options["dpi"] = argv.dpi options["dpi"] = argv.dpi
B = [] B = []
...@@ -430,14 +442,24 @@ if __name__ == "__main__": ...@@ -430,14 +442,24 @@ if __name__ == "__main__":
avec = [ argv.az, argv.ay, argv.az ] avec = [ argv.az, argv.ay, argv.az ]
bvec = [ argv.bx, argv.by, argv.bz ] bvec = [ argv.bx, argv.by, argv.bz ]
if use_kikf_file:
[Q, E, w] = load_events_kikf(infile)
else:
[Q, E, w] = load_events_QE(infile)
# convert rlu to 1/A try:
if len(B) != 0: # input file is in h k l E w format?
Q = np.dot(Q, np.transpose(B)) if argv.QEfile:
[Q, E, w] = load_events_QE(infile)
# convert rlu to 1/A
if len(B) != 0:
Q = np.dot(Q, np.transpose(B))
# input file is in the kix kiy kiz kfx kfy kfz wi wf format?
else:
[Q, E, w] = load_events_kikf(infile)
except OSError:
print("Could not load input file %s." % infile)
exit(-1)
except NameError:
print("Error processing input file %s." % infile)
exit(-1)
if avec[0]!=None and avec[1]!=None and avec[2]!=None and bvec[0]!=None and bvec[1]!=None and bvec[2]!=None: if avec[0]!=None and avec[1]!=None and avec[2]!=None and bvec[0]!=None and bvec[1]!=None and bvec[2]!=None:
Qpara = np.array(avec) Qpara = np.array(avec)
......
#
# tascalc gui
# @author Tobias Weber <tweber@ill.fr>
# @date 24-oct-18
# @license see 'LICENSE' file
#
# __ident__ : TAS Calculator
# __descr__ : Calculates triple-axis angles.
#
# -----------------------------------------------------------------------------
# dependencies
import sys
import tascalc as tas
import numpy as np
import numpy.linalg as la
# try to import qt5...
try:
import PyQt5 as qt
import PyQt5.QtCore as qtc
import PyQt5.QtWidgets as qtw
qt_ver = 5
except ImportError:
# ...and if not possible try to import qt4 instead
try:
import PyQt4 as qt
import PyQt4.QtCore as qtc
import PyQt4.QtGui as qtw
qt_ver = 4
except ImportError:
print("Error: No suitable version of Qt was found!")
exit(-1)
# -----------------------------------------------------------------------------
# -----------------------------------------------------------------------------
# main application
np.set_printoptions(suppress=True, precision=4)
app = qtw.QApplication(sys.argv)
app.setApplicationName("qtas")
#app.setStyle("Fusion")
sett = qtc.QSettings("tobis_stuff", "in20tool")
if sett.contains("mainwnd/theme"):
app.setStyle(sett.value("mainwnd/theme"))
tabs = qtw.QTabWidget()
# -----------------------------------------------------------------------------
# -----------------------------------------------------------------------------
# variables
B = np.array([[1,0,0], [0,1,0], [0,0,1]])
orient_rlu = np.array([1,0,0])
orient2_rlu = np.array([0,1,0])
orient_up_rlu = np.array([0,0,1])
g_eps = 1e-4
# -----------------------------------------------------------------------------
# -----------------------------------------------------------------------------
# helpers
def getfloat(str):
try:
return float(str)
except ValueError:
return 0.
# -----------------------------------------------------------------------------
# -----------------------------------------------------------------------------
# crystal tab
xtalpanel = qtw.QWidget()
xtallayout = qtw.QGridLayout(xtalpanel)
scpanel = xtalpanel
sclayout = xtallayout
editA = qtw.QLineEdit(xtalpanel)
editB = qtw.QLineEdit(xtalpanel)
editC = qtw.QLineEdit(xtalpanel)
editAlpha = qtw.QLineEdit(xtalpanel)
editBeta = qtw.QLineEdit(xtalpanel)
editGamma = qtw.QLineEdit(xtalpanel)
separatorXtal = qtw.QFrame(xtalpanel)
separatorXtal.setFrameStyle(qtw.QFrame.HLine)
editAx = qtw.QLineEdit(scpanel)
editAy = qtw.QLineEdit(scpanel)
editAz = qtw.QLineEdit(scpanel)
editBx = qtw.QLineEdit(scpanel)
editBy = qtw.QLineEdit(scpanel)
editBz = qtw.QLineEdit(scpanel)
editBMat = qtw.QPlainTextEdit(xtalpanel)
editBMat.setReadOnly(True)
def xtalChanged():
global B, orient_rlu, orient2_rlu, orient_up_rlu
lattice = np.array([getfloat(editA.text()), getfloat(editB.text()), getfloat(editC.text())])
angles = np.array([getfloat(editAlpha.text()), getfloat(editBeta.text()), getfloat(editGamma.text())])
orient_rlu = np.array([getfloat(editAx.text()), getfloat(editAy.text()), getfloat(editAz.text())])
orient2_rlu = np.array([getfloat(editBx.text()), getfloat(editBy.text()), getfloat(editBz.text())])
try:
B = tas.get_B(lattice, angles/180.*np.pi)
invB = la.inv(B)
metric = tas.get_metric(B)
ang = tas.angle(orient_rlu, orient2_rlu, metric)
orient_up_rlu = tas.cross(orient_rlu, orient2_rlu, B)
orient_up_rlu_norm = orient_up_rlu / la.norm(orient_up_rlu)
UB = tas.get_UB(B, orient_rlu, orient2_rlu, orient_up_rlu)
invUB = la.inv(UB)
editBMat.setPlainText("Scattering plane normal: %s rlu.\n" % str(orient_up_rlu_norm) \
+"Angle between orientation vectors 1 and 2: %.4g deg.\n" % (ang/np.pi*180.) \
+"\nB =\n%10.4f %10.4f %10.4f\n%10.4f %10.4f %10.4f\n%10.4f %10.4f %10.4f\n" \
% (B[0,0],B[0,1],B[0,2], B[1,0],B[1,1],B[1,2], B[2,0],B[2,1],B[2,2]) \
+"\nB^(-1) =\n%10.4f %10.4f %10.4f\n%10.4f %10.4f %10.4f\n%10.4f %10.4f %10.4f\n" \
% (invB[0,0],invB[0,1],invB[0,2], invB[1,0],invB[1,1],invB[1,2], invB[2,0],invB[2,1],invB[2,2]) \
+"\nUB =\n%10.4f %10.4f %10.4f\n%10.4f %10.4f %10.4f\n%10.4f %10.4f %10.4f\n" \
% (UB[0,0],UB[0,1],UB[0,2], UB[1,0],UB[1,1],UB[1,2], UB[2,0],UB[2,1],UB[2,2]) \
+"\n(UB)^(-1) =\n%10.4f %10.4f %10.4f\n%10.4f %10.4f %10.4f\n%10.4f %10.4f %10.4f\n" \
% (invUB[0,0],invUB[0,1],invUB[0,2], invUB[1,0],invUB[1,1],invUB[1,2], invUB[2,0],invUB[2,1],invUB[2,2]) \
)
except (ArithmeticError, la.LinAlgError) as err:
editBMat.setPlainText("invalid")
QChanged()
def planeChanged():
xtalChanged()
#QChanged()
editA.textEdited.connect(xtalChanged)
editB.textEdited.connect(xtalChanged)
editC.textEdited.connect(xtalChanged)
editAlpha.textEdited.connect(xtalChanged)
editBeta.textEdited.connect(xtalChanged)
editGamma.textEdited.connect(xtalChanged)
editAx.textEdited.connect(planeChanged)
editAy.textEdited.connect(planeChanged)
editAz.textEdited.connect(planeChanged)
editBx.textEdited.connect(planeChanged)
editBy.textEdited.connect(planeChanged)
editBz.textEdited.connect(planeChanged)
editA.setText("%.6g" % sett.value("qtas/a", 5., type=float))
editB.setText("%.6g" % sett.value("qtas/b", 5., type=float))
editC.setText("%.6g" % sett.value("qtas/c", 5., type=float))
editAlpha.setText("%.6g" % sett.value("qtas/alpha", 90., type=float))
editBeta.setText("%.6g" % sett.value("qtas/beta", 90., type=float))
editGamma.setText("%.6g" % sett.value("qtas/gamma", 90., type=float))
editAx.setText("%.6g" % sett.value("qtas/ax", 1., type=float))
editAy.setText("%.6g" % sett.value("qtas/ay", 0., type=float))
editAz.setText("%.6g" % sett.value("qtas/az", 0., type=float))
editBx.setText("%.6g" % sett.value("qtas/bx", 0., type=float))
editBy.setText("%.6g" % sett.value("qtas/by", 1., type=float))
editBz.setText("%.6g" % sett.value("qtas/bz", 0., type=float))
xtallayout.addWidget(qtw.QLabel(u"a (\u212b):", xtalpanel), 0,0, 1,1)
xtallayout.addWidget(editA, 0,1, 1,3)
xtallayout.addWidget(qtw.QLabel(u"b (\u212b):", xtalpanel), 1,0, 1,1)
xtallayout.addWidget(editB, 1,1, 1,3)
xtallayout.addWidget(qtw.QLabel(u"c (\u212b):", xtalpanel), 2,0, 1,1)
xtallayout.addWidget(editC, 2,1, 1,3)
xtallayout.addWidget(qtw.QLabel(u"\u03b1 (deg):", xtalpanel), 3,0, 1,1)
xtallayout.addWidget(editAlpha, 3,1, 1,3)
xtallayout.addWidget(qtw.QLabel(u"\u03b2 (deg):", xtalpanel), 4,0, 1,1)
xtallayout.addWidget(editBeta, 4,1, 1,3)
xtallayout.addWidget(qtw.QLabel(u"\u03b3 (deg):", xtalpanel), 5,0, 1,1)
xtallayout.addWidget(editGamma, 5,1, 1,3)
xtallayout.addWidget(separatorXtal, 6,0, 1,4)
sclayout.addWidget(qtw.QLabel("Orient. 1 (rlu):", scpanel), 7,0, 1,1)
sclayout.addWidget(editAx, 7,1, 1,1)
sclayout.addWidget(editAy, 7,2, 1,1)
sclayout.addWidget(editAz, 7,3, 1,1)
sclayout.addWidget(qtw.QLabel("Orient. 2 (rlu):", scpanel), 8,0, 1,1)
sclayout.addWidget(editBx, 8,1, 1,1)
sclayout.addWidget(editBy, 8,2, 1,1)
sclayout.addWidget(editBz, 8,3, 1,1)
xtallayout.addWidget(editBMat, 9,0, 2,4)
tabs.addTab(xtalpanel, "Crystal")
# -----------------------------------------------------------------------------
# -----------------------------------------------------------------------------
# tas tab
taspanel = qtw.QWidget()
taslayout = qtw.QGridLayout(taspanel)
Qpanel = taspanel
Qlayout = taslayout
editA1 = qtw.QLineEdit(taspanel)
editA2 = qtw.QLineEdit(taspanel)
editA3 = qtw.QLineEdit(taspanel)
editA4 = qtw.QLineEdit(taspanel)
editA5 = qtw.QLineEdit(taspanel)
editA6 = qtw.QLineEdit(taspanel)
checkA4Sense = qtw.QCheckBox(taspanel)
editDm = qtw.QLineEdit(taspanel)
editDa = qtw.QLineEdit(taspanel)
edith = qtw.QLineEdit(Qpanel)
editk = qtw.QLineEdit(Qpanel)
editl = qtw.QLineEdit(Qpanel)
editE = qtw.QLineEdit(Qpanel)
editKi = qtw.QLineEdit(Qpanel)
editKf = qtw.QLineEdit(Qpanel)
editQAbs = qtw.QLineEdit(Qpanel)
editQAbs.setReadOnly(True)
tasstatus = qtw.QLabel(taspanel)
separatorTas = qtw.QFrame(Qpanel)
separatorTas.setFrameStyle(qtw.QFrame.HLine)
separatorTas2 = qtw.QFrame(Qpanel)
separatorTas2.setFrameStyle(qtw.QFrame.HLine)
separatorTas3 = qtw.QFrame(Qpanel)
separatorTas3.setFrameStyle(qtw.QFrame.HLine)
def TASChanged():
global orient_rlu, orient2_rlu, orient_up_rlu
a1 = getfloat(editA1.text()) / 180. * np.pi
a2 = a1 * 2.
a3 = getfloat(editA3.text()) / 180. * np.pi
a4 = getfloat(editA4.text()) / 180. * np.pi
a5 = getfloat(editA5.text()) / 180. * np.pi
a6 = a5 * 2.
dmono = getfloat(editDm.text())
dana = getfloat(editDa.text())
sense_sample = 1.
if checkA4Sense.isChecked() == False:
sense_sample = -1.
editA2.setText("%.6g" % (a2 / np.pi * 180.))
editA6.setText("%.6g" % (a6 / np.pi * 180.))
try:
ki = tas.get_monok(a1, dmono)
kf = tas.get_monok(a5, dana)
E = tas.get_E(ki, kf)
Qlen = tas.get_Q(ki, kf, a4)
Qvec = tas.get_hkl(ki, kf, a3, Qlen, orient_rlu, orient_up_rlu, B, sense_sample)
edith.setText("%.6g" % Qvec[0])
editk.setText("%.6g" % Qvec[1])
editl.setText("%.6g" % Qvec[2])
editQAbs.setText("%.6g" % Qlen)
editKi.setText("%.6g" % ki)
editKf.setText("%.6g" % kf)
editE.setText("%.6g" % E)
except (ArithmeticError, la.LinAlgError) as err:
edith.setText("invalid")
editk.setText("invalid")
editl.setText("invalid")
editKi.setText("invalid")
editKf.setText("invalid")
editE.setText("invalid")
def A2Changed():
a2 = getfloat(editA2.text()) / 180. * np.pi
editA1.setText("%.6g" % (0.5*a2 / np.pi * 180.))
TASChanged()
def A6Changed():
a6 = getfloat(editA6.text()) / 180. * np.pi
editA5.setText("%.6g" % (0.5*a6 / np.pi * 180.))
TASChanged()
def DChanged():
QChanged()
def QChanged():
global orient_rlu, orient2_rlu, orient_up_rlu, g_eps
Q_rlu = np.array([getfloat(edith.text()), getfloat(editk.text()), getfloat(editl.text())])
ki = getfloat(editKi.text())
kf = getfloat(editKf.text())
try:
[a1, a2] = tas.get_a1a2(ki, getfloat(editDm.text()))
editA1.setText("%.6g" % (a1 / np.pi * 180.))
editA2.setText("%.6g" % (a2 / np.pi * 180.))
except (ArithmeticError, la.LinAlgError) as err:
editA1.setText("invalid")
editA2.setText("invalid")
try:
[a5, a6] = tas.get_a1a2(kf, getfloat(editDa.text()))
editA5.setText("%.6g" % (a5 / np.pi * 180.))
editA6.setText("%.6g" % (a6 / np.pi * 180.))
except (ArithmeticError, la.LinAlgError) as err:
editA5.setText("invalid")
editA6.setText("invalid")
try:
sense_sample = 1.
if checkA4Sense.isChecked() == False:
sense_sample = -1.
[a3, a4, dist_Q_plane] = tas.get_a3a4(ki, kf, Q_rlu, orient_rlu, orient_up_rlu, B, sense_sample)
Qlen = tas.get_Q(ki, kf, a4)
Q_in_plane = np.abs(dist_Q_plane) < g_eps
editA3.setText("%.6g" % (a3 / np.pi * 180.))
editA4.setText("%.6g" % (a4 / np.pi * 180.))
editQAbs.setText("%.6g" % Qlen)
if Q_in_plane:
tasstatus.setText("")
else:
metric = tas.get_metric(B)
#ang1 = tas.angle(Q_rlu, orient_rlu, metric)
#ang2 = tas.angle(Q_rlu, orient2_rlu, metric)
ang_plane = np.pi*0.5 - tas.angle(Q_rlu, orient_up_rlu, metric)
tasstatus.setText(u"WARNING: Q is out of the plane by %.4g \u212b\u207b\u00b9, i.e. %.4g deg!" \
% (dist_Q_plane, ang_plane/np.pi*180.))
except (ArithmeticError, la.LinAlgError) as err:
editA3.setText("invalid")
editA4.setText("invalid")
def KiKfChanged():
ki = getfloat(editKi.text())
kf = getfloat(editKf.text())
try:
E = tas.get_E(ki, kf)
editE.setText("%.6g" % E)
QChanged()
except (ArithmeticError, la.LinAlgError) as err:
editE.setText("invalid")
def EChanged():
E = getfloat(editE.text())
kf = getfloat(editKf.text())
try:
ki = tas.get_ki(kf, E)
editKi.setText("%.6g" % ki)
QChanged()
except (ArithmeticError, la.LinAlgError) as err:
editKi.setText("invalid")
editA1.textEdited.connect(TASChanged)
editA3.textEdited.connect(TASChanged)
editA4.textEdited.connect(TASChanged)
editA5.textEdited.connect(TASChanged)
editA2.textEdited.connect(A2Changed)
editA6.textEdited.connect(A6Changed)
editDm.textEdited.connect(DChanged)
editDa.textEdited.connect(DChanged)
edith.textEdited.connect(QChanged)
editk.textEdited.connect(QChanged)
editl.textEdited.connect(QChanged)
editKi.textEdited.connect(KiKfChanged)
editKf.textEdited.connect(KiKfChanged)
editE.textEdited.connect(EChanged)
editDm.setText("%.6g" % sett.value("qtas/dm", 3.355, type=float))
editDa.setText("%.6g" % sett.value("qtas/da", 3.355, type=float))
edith.setText("%.6g" % sett.value("qtas/h", 1., type=float))
editk.setText("%.6g" % sett.value("qtas/k", 0., type=float))
editl.setText("%.6g" % sett.value("qtas/l", 0., type=float))
#editE.setText("%.6g" % sett.value("qtas/E", 0., type=float))
editKi.setText("%.6g" % sett.value("qtas/ki", 2.662, type=float))
editKf.setText("%.6g" % sett.value("qtas/kf", 2.662, type=float))
checkA4Sense.setText("a4 sense is counter-clockwise")
checkA4Sense.setChecked(sett.value("qtas/a4_sense", 1, type=bool))
checkA4Sense.stateChanged.connect(QChanged)
Qlayout.addWidget(qtw.QLabel("h (rlu):", Qpanel), 0,0, 1,1)
Qlayout.addWidget(edith, 0,1, 1,2)
Qlayout.addWidget(qtw.QLabel("k (rlu):", Qpanel), 1,0, 1,1)
Qlayout.addWidget(editk, 1,1, 1,2)
Qlayout.addWidget(qtw.QLabel("l (rlu):", Qpanel), 2,0, 1,1)
Qlayout.addWidget(editl, 2,1, 1,2)
Qlayout.addWidget(qtw.QLabel("E (meV):", Qpanel), 3,0, 1,1)
Qlayout.addWidget(editE, 3,1, 1,2)
Qlayout.addWidget(qtw.QLabel(u"ki, kf (\u212b\u207b\u00b9):", Qpanel), 4,0, 1,1)
Qlayout.addWidget(editKi, 4,1, 1,1)
Qlayout.addWidget(editKf, 4,2, 1,1)
Qlayout.addWidget(qtw.QLabel(u"|Q| (\u212b\u207b\u00b9):", Qpanel), 5,0, 1,1)
Qlayout.addWidget(editQAbs, 5,1, 1,2)
Qlayout.addWidget(separatorTas, 6,0,1,3)
taslayout.addWidget(qtw.QLabel("a1, a2 (deg):", taspanel), 7,0, 1,1)
taslayout.addWidget(editA1, 7,1, 1,1)
taslayout.addWidget(editA2, 7,2, 1,1)
taslayout.addWidget(qtw.QLabel("a3, a4 (deg):", taspanel), 8,0, 1,1)
taslayout.addWidget(editA3, 8,1, 1,1)
taslayout.addWidget(editA4, 8,2, 1,1)
taslayout.addWidget(qtw.QLabel("a5, a6 (deg):", taspanel), 9,0, 1,1)
taslayout.addWidget(editA5, 9,1, 1,1)
taslayout.addWidget(editA6, 9,2, 1,1)
taslayout.addWidget(separatorTas2, 10,0, 1,3)
taslayout.addWidget(qtw.QLabel("Sense:", taspanel), 11,0, 1,1)
taslayout.addWidget(checkA4Sense, 11,1, 1,2)