|
@@ -53,17 +53,28 @@ class VectorXr(yaml.YAMLObject):
|
53
|
53
|
# Converts to numpy array on import
|
54
|
54
|
return "np.array(%r)" % (self.data)
|
55
|
55
|
|
|
56
|
+from collections import OrderedDict
|
|
57
|
+def represent_ordereddict(dumper, data):
|
|
58
|
+ value = []
|
|
59
|
+ for item_key, item_value in data.items():
|
|
60
|
+ node_key = dumper.represent_data(item_key)
|
|
61
|
+ node_value = dumper.represent_data(item_value)
|
|
62
|
+ value.append((node_key, node_value))
|
|
63
|
+ return yaml.nodes.MappingNode(u'tag:yaml.org,2002:map', value)
|
|
64
|
+yaml.add_representer(OrderedDict, represent_ordereddict)
|
|
65
|
+
|
56
|
66
|
class AkvoYamlNode(yaml.YAMLObject):
|
57
|
67
|
yaml_tag = u'!AkvoData'
|
58
|
68
|
def __init__(self):
|
59
|
69
|
self.Akvo_VERSION = version
|
60
|
70
|
self.Import = {}
|
61
|
|
- self.Processing = {}
|
|
71
|
+ self.Processing = OrderedDict()
|
|
72
|
+ #self.ProcessingFlow = []
|
62
|
73
|
#self.data = {}
|
63
|
74
|
# For going the other way, data import based on Yaml serialization,
|
64
|
75
|
def __repr__(self):
|
65
|
76
|
return "%s(name=%r, Akvo_VESION=%r, Import=%r, Processing=%r)" % (
|
66
|
|
- self.__class__.__name__, self.Akvo_VERSION, self.Import, self.Processing) #self.name, self.hp, self.ac, self.attacks, self.thingy)
|
|
77
|
+ self.__class__.__name__, self.Akvo_VERSION, self.Import, OrderedDict(dict(self.Processing)) )
|
67
|
78
|
|
68
|
79
|
try:
|
69
|
80
|
import thread
|
|
@@ -416,7 +427,8 @@ class ApplicationWindow(QtWidgets.QMainWindow):
|
416
|
427
|
self.ui.FIDProcComboBox.setCurrentIndex (0)
|
417
|
428
|
|
418
|
429
|
def ExportPreprocess(self):
|
419
|
|
-
|
|
430
|
+ """ This method export to YAML
|
|
431
|
+ """
|
420
|
432
|
try:
|
421
|
433
|
with open('.akvo.last.yaml.path') as f:
|
422
|
434
|
fpath = f.readline()
|
|
@@ -443,8 +455,6 @@ class ApplicationWindow(QtWidgets.QMainWindow):
|
443
|
455
|
#INFO["deadTime"] = self.RAWDataProc.deadTime
|
444
|
456
|
INFO["transFreq"] = self.RAWDataProc.transFreq.tolist()
|
445
|
457
|
INFO["processed"] = "Akvo v. 1.0, on " + time.strftime("%d/%m/%Y")
|
446
|
|
- #INFO["log"] = self.logText #MAK 20170128 # TI moved to direct write, this is already YAML compliant
|
447
|
|
-
|
448
|
458
|
# Pulse current info
|
449
|
459
|
ip = 0
|
450
|
460
|
INFO["Pulses"] = {}
|
|
@@ -875,35 +885,56 @@ class ApplicationWindow(QtWidgets.QMainWindow):
|
875
|
885
|
self.ui.mplwidget))
|
876
|
886
|
|
877
|
887
|
def calcQ(self):
|
|
888
|
+ if "Calc Q" not in self.YamlNode.Processing.keys():
|
|
889
|
+ self.YamlNode.Processing["Calc Q"] = True
|
|
890
|
+ self.Log()
|
|
891
|
+ else:
|
|
892
|
+ err_msg = "Q values have already been calculated"
|
|
893
|
+ reply =QtWidgets.QMessageBox.critical(self, 'Error',
|
|
894
|
+ err_msg)
|
|
895
|
+ return
|
|
896
|
+
|
878
|
897
|
self.lock("pulse moment calculation")
|
879
|
898
|
thread.start_new_thread(self.RAWDataProc.effectivePulseMoment, \
|
880
|
899
|
(self.ui.CentralVSpinBox.value(), \
|
881
|
900
|
self.ui.mplwidget_2))
|
882
|
901
|
|
883
|
902
|
def FDSmartStack(self):
|
|
903
|
+
|
|
904
|
+ if "TD stack" not in self.YamlNode.Processing.keys():
|
|
905
|
+ self.YamlNode.Processing["TD stack"] = {}
|
|
906
|
+ self.YamlNode.Processing["TD stack"]["outlier"] = str( self.ui.outlierTestCB.currentText() )
|
|
907
|
+ self.YamlNode.Processing["TD stack"]["cutoff"] = str( self.ui.MADCutoff.value() )
|
|
908
|
+ self.Log()
|
|
909
|
+ else:
|
|
910
|
+ err_msg = "TD noise cancellation has already been applied!"
|
|
911
|
+ reply =QtWidgets.QMessageBox.critical(self, 'Error',
|
|
912
|
+ err_msg)
|
|
913
|
+ return
|
884
|
914
|
|
885
|
915
|
self.lock("time-domain smart stack")
|
886
|
|
- nlogText = []
|
887
|
|
- nlogText.append("TD_stack: ")
|
888
|
|
- nlogText.append(" outlier: " + str( self.ui.outlierTestCB.currentText() ) )
|
889
|
|
- nlogText.append(" cutoff: " + str( self.ui.MADCutoff.value() ) )
|
890
|
|
- self.Log(nlogText)
|
891
|
|
-
|
892
|
916
|
thread.start_new_thread(self.RAWDataProc.TDSmartStack, \
|
893
|
917
|
(str(self.ui.outlierTestCB.currentText()), \
|
894
|
918
|
self.ui.MADCutoff.value(),
|
895
|
919
|
self.ui.mplwidget_2))
|
896
|
920
|
|
897
|
921
|
def adaptFilter(self):
|
|
922
|
+
|
|
923
|
+ if "TD noise cancellation" not in self.YamlNode.Processing.keys():
|
|
924
|
+ self.YamlNode.Processing["TD noise cancellation"] = {}
|
|
925
|
+ self.YamlNode.Processing["TD noise cancellation"]["n_Taps"] = str(self.ui.MTapsSpinBox.value())
|
|
926
|
+ self.YamlNode.Processing["TD noise cancellation"]["lambda"] = str(self.ui.adaptLambdaSpinBox.value())
|
|
927
|
+ self.YamlNode.Processing["TD noise cancellation"]["truncate"] = str(self.ui.adaptTruncateSpinBox.value())
|
|
928
|
+ self.YamlNode.Processing["TD noise cancellation"]["mu"] = str(self.ui.adaptMuSpinBox.value())
|
|
929
|
+ self.YamlNode.Processing["TD noise cancellation"]["PCA"] = str(self.ui.PCAComboBox.currentText())
|
|
930
|
+ self.Log()
|
|
931
|
+ else:
|
|
932
|
+ err_msg = "TD noise cancellation has already been applied!"
|
|
933
|
+ reply =QtWidgets.QMessageBox.critical(self, 'Error',
|
|
934
|
+ err_msg)
|
|
935
|
+ return
|
|
936
|
+
|
898
|
937
|
self.lock("TD noise cancellation filter")
|
899
|
|
- nlogText = []
|
900
|
|
- nlogText.append("TD_noise_cancellation: ")
|
901
|
|
- nlogText.append(" n_Taps: " + str(self.ui.MTapsSpinBox.value()) )
|
902
|
|
- nlogText.append(" lambda: " + str(self.ui.adaptLambdaSpinBox.value()) )
|
903
|
|
- nlogText.append(" truncate: " + str(self.ui.adaptTruncateSpinBox.value()) )
|
904
|
|
- nlogText.append(" mu: " + str(self.ui.adaptMuSpinBox.value()) )
|
905
|
|
- nlogText.append(" PCA: " + str(self.ui.PCAComboBox.currentText()) )
|
906
|
|
- self.Log(nlogText)
|
907
|
938
|
thread.start_new_thread(self.RAWDataProc.adaptiveFilter, \
|
908
|
939
|
(self.ui.MTapsSpinBox.value(), \
|
909
|
940
|
self.ui.adaptLambdaSpinBox.value(), \
|
|
@@ -913,11 +944,17 @@ class ApplicationWindow(QtWidgets.QMainWindow):
|
913
|
944
|
self.ui.mplwidget))
|
914
|
945
|
|
915
|
946
|
def sumDataChans(self):
|
|
947
|
+
|
|
948
|
+ if "Data sum" not in self.YamlNode.Processing.keys():
|
|
949
|
+ self.YamlNode.Processing["Data sum"] = True
|
|
950
|
+ self.Log()
|
|
951
|
+ else:
|
|
952
|
+ err_msg = "Data channels have already been summed!"
|
|
953
|
+ reply =QtWidgets.QMessageBox.critical(self, 'Error',
|
|
954
|
+ err_msg)
|
|
955
|
+ return
|
|
956
|
+
|
916
|
957
|
self.lock("Summing data channels")
|
917
|
|
- nlogText = []
|
918
|
|
- nlogText.append("Data_sum: ")
|
919
|
|
- nlogText.append( " summed_channel: " + str(self.dataChan[0]) )
|
920
|
|
- self.Log(nlogText)
|
921
|
958
|
self.dataChan = [self.dataChan[0]]
|
922
|
959
|
self.ui.sumDataBox.setEnabled(False)
|
923
|
960
|
thread.start_new_thread( self.RAWDataProc.sumData, ( self.ui.mplwidget, 7 ) )
|
|
@@ -931,17 +968,21 @@ class ApplicationWindow(QtWidgets.QMainWindow):
|
931
|
968
|
self.ui.mplwidget))
|
932
|
969
|
|
933
|
970
|
def bandPassFilter(self):
|
934
|
|
- self.lock("bandpass filter")
|
935
|
|
- nlogText = []
|
936
|
|
- nlogText.append("bandpass_filter: ")
|
937
|
|
- nlogText.append(" central_nu: "+str(self.ui.CentralVSpinBox.value()))
|
938
|
|
- nlogText.append(" passband: "+str(self.ui.passBandSpinBox.value()) )
|
939
|
|
- nlogText.append(" stopband: "+str(self.ui.stopBandSpinBox.value()) )
|
940
|
|
- nlogText.append(" gpass: "+str(self.ui.gpassSpinBox.value()) )
|
941
|
|
- nlogText.append(" gstop: "+str(self.ui.gstopSpinBox.value()) )
|
942
|
|
- nlogText.append(" type: "+str(self.ui.fTypeComboBox.currentText()) )
|
943
|
|
- self.Log(nlogText)
|
944
|
|
-
|
|
971
|
+ if "Bandpass filter" not in self.YamlNode.Processing.keys():
|
|
972
|
+ self.YamlNode.Processing["Bandpass filter"] = {}
|
|
973
|
+ self.YamlNode.Processing["Bandpass filter"]["central_nu"] = str(self.ui.CentralVSpinBox.value())
|
|
974
|
+ self.YamlNode.Processing["Bandpass filter"]["passband"] = str(self.ui.passBandSpinBox.value())
|
|
975
|
+ self.YamlNode.Processing["Bandpass filter"]["stopband"] = str(self.ui.stopBandSpinBox.value())
|
|
976
|
+ self.YamlNode.Processing["Bandpass filter"]["gpass"] = str(self.ui.gpassSpinBox.value())
|
|
977
|
+ self.YamlNode.Processing["Bandpass filter"]["gstop"] = str(self.ui.gstopSpinBox.value())
|
|
978
|
+ self.YamlNode.Processing["Bandpass filter"]["type"] = str(self.ui.fTypeComboBox.currentText())
|
|
979
|
+ self.Log()
|
|
980
|
+ else:
|
|
981
|
+ err_msg = "Bandpass filter has already been applied!"
|
|
982
|
+ reply =QtWidgets.QMessageBox.critical(self, 'Error',
|
|
983
|
+ err_msg)
|
|
984
|
+ return
|
|
985
|
+ self.lock("bandpass filter")
|
945
|
986
|
nv = self.ui.lcdTotalDeadTime.value( ) + self.ui.lcdNumberFTauDead.value()
|
946
|
987
|
self.ui.lcdTotalDeadTime.display( nv )
|
947
|
988
|
thread.start_new_thread(self.RAWDataProc.bandpassFilter, \
|
|
@@ -949,23 +990,33 @@ class ApplicationWindow(QtWidgets.QMainWindow):
|
949
|
990
|
|
950
|
991
|
def downsample(self):
|
951
|
992
|
self.lock("resampling")
|
952
|
|
- nlogText = list(['Resample: '])
|
953
|
|
- nlogText.append(" downsample_factor: " + str(self.ui.downSampleSpinBox.value() ) )
|
954
|
|
- nlogText.append(" truncate_length: " + str( self.ui.truncateSpinBox.value() ) )
|
955
|
|
- self.Log(nlogText)
|
|
993
|
+
|
|
994
|
+ if "Resample" not in self.YamlNode.Processing.keys():
|
|
995
|
+ self.YamlNode.Processing["Resample"] = {}
|
|
996
|
+ self.YamlNode.Processing["Resample"]["downsample factor"] = []
|
|
997
|
+ self.YamlNode.Processing["Resample"]["truncate length"] = []
|
|
998
|
+ self.YamlNode.Processing["Resample"]["downsample factor"].append( str(self.ui.downSampleSpinBox.value() ) )
|
|
999
|
+ self.YamlNode.Processing["Resample"]["truncate length"].append( str( self.ui.truncateSpinBox.value() ) )
|
|
1000
|
+ self.Log( )
|
|
1001
|
+
|
956
|
1002
|
thread.start_new_thread(self.RAWDataProc.downsample, \
|
957
|
1003
|
(self.ui.truncateSpinBox.value(), \
|
958
|
1004
|
self.ui.downSampleSpinBox.value(),
|
959
|
1005
|
self.ui.mplwidget))
|
960
|
1006
|
|
961
|
1007
|
def quadDet(self):
|
962
|
|
- self.lock("quadrature detection")
|
963
|
|
- nlogText = []
|
964
|
|
- nlogText.append("quadrature_detection: ")
|
965
|
|
- nlogText.append(" trim: " + str( self.ui.trimSpin.value() ))
|
966
|
|
- #nlogText.append(" representation:" + str( self.ui.QDType.currentText() ))
|
967
|
|
- self.Log(nlogText)
|
968
|
1008
|
|
|
1009
|
+ if "Quadrature detection" not in self.YamlNode.Processing.keys():
|
|
1010
|
+ self.YamlNode.Processing["Quadrature detection"] = {}
|
|
1011
|
+ self.YamlNode.Processing["Quadrature detection"]["trim"] = str( self.ui.trimSpin.value() )
|
|
1012
|
+ self.Log()
|
|
1013
|
+ else:
|
|
1014
|
+ err_msg = "Quadrature detection has already been done!"
|
|
1015
|
+ reply =QtWidgets.QMessageBox.critical(self, 'Error',
|
|
1016
|
+ err_msg)
|
|
1017
|
+ return
|
|
1018
|
+
|
|
1019
|
+ self.lock("quadrature detection")
|
969
|
1020
|
thread.start_new_thread(self.RAWDataProc.quadDet, \
|
970
|
1021
|
(self.ui.trimSpin.value(), int(self.ui.QDType.currentIndex()), self.ui.mplwidget_2))
|
971
|
1022
|
|
|
@@ -979,12 +1030,13 @@ class ApplicationWindow(QtWidgets.QMainWindow):
|
979
|
1030
|
|
980
|
1031
|
|
981
|
1032
|
def gateIntegrate(self):
|
982
|
|
- self.lock("gate integration")
|
983
|
|
- nlogText = []
|
984
|
|
- nlogText.append("gate_integrate: ")
|
985
|
|
- nlogText.append(" gpd: " + str(self.ui.GPDspinBox.value( ) ))
|
986
|
|
- self.Log(nlogText)
|
|
1033
|
+
|
|
1034
|
+ if "Gate integrate" not in self.YamlNode.Processing.keys():
|
|
1035
|
+ self.YamlNode.Processing["Gate integrate"] = {}
|
|
1036
|
+ self.YamlNode.Processing["Gate integrate"]["gpd"] = str(self.ui.GPDspinBox.value( ) )
|
|
1037
|
+ self.Log()
|
987
|
1038
|
|
|
1039
|
+ self.lock("gate integration")
|
988
|
1040
|
thread.start_new_thread(self.RAWDataProc.gateIntegrate, \
|
989
|
1041
|
(self.ui.GPDspinBox.value(), self.ui.trimSpin.value(), self.ui.mplwidget_2))
|
990
|
1042
|
|
|
@@ -1013,13 +1065,20 @@ class ApplicationWindow(QtWidgets.QMainWindow):
|
1013
|
1065
|
# self.ui.lcdNumberTauPulse2.display(1e3*self.RAWDataProc.pulseLength[1])
|
1014
|
1066
|
|
1015
|
1067
|
def windowFilter(self):
|
|
1068
|
+
|
|
1069
|
+ if "Window filter" not in self.YamlNode.Processing.keys():
|
|
1070
|
+ self.YamlNode.Processing["Window filter"] = {}
|
|
1071
|
+ self.YamlNode.Processing["Window filter"]["type"] = str(self.ui.windowTypeComboBox.currentText())
|
|
1072
|
+ self.YamlNode.Processing["Window filter"]["width"] = str(self.ui.windowBandwidthSpinBox.value())
|
|
1073
|
+ self.YamlNode.Processing["Window filter"]["centre"] = str(self.ui.CentralVSpinBox.value() )
|
|
1074
|
+ self.Log()
|
|
1075
|
+ else:
|
|
1076
|
+ err_msg = "FD window has already been applied!"
|
|
1077
|
+ reply =QtWidgets.QMessageBox.critical(self, 'Error',
|
|
1078
|
+ err_msg)
|
|
1079
|
+ return
|
|
1080
|
+
|
1016
|
1081
|
self.lock("window filter")
|
1017
|
|
- nlogText = []
|
1018
|
|
- nlogText.append("FD_window: ")
|
1019
|
|
- nlogText.append(" type: " + str(self.ui.windowTypeComboBox.currentText()) )
|
1020
|
|
- nlogText.append(" width: " + str(self.ui.windowBandwidthSpinBox.value()) )
|
1021
|
|
- nlogText.append(" centre: " + str(self.ui.CentralVSpinBox.value() ))
|
1022
|
|
- self.Log(nlogText)
|
1023
|
1082
|
thread.start_new_thread(self.RAWDataProc.windowFilter, \
|
1024
|
1083
|
(str(self.ui.windowTypeComboBox.currentText()), \
|
1025
|
1084
|
self.ui.windowBandwidthSpinBox.value(), \
|