class MakeNicerWidget(DockableTabWidget): LOCATION = Qt.LeftDockWidgetArea updateTdPlot = Signal(object) updateTdFitPlot = Signal(object) updateFdPlot = Signal(object) updateFdFitPlot = Signal(object) def __init__(self, parent): super(MakeNicerWidget, self).__init__(parent) self.data = np.array([]) # array which holds data # Time domain plot self.tdWidget = DockablePlotWidget(self, CurveWidget) self.tdWidget.calcFun.addFun('fs', lambda x: x, lambda x: x) self.tdWidget.calcFun.addFun('µm', lambda x: x*fsDelay*1e3, lambda x: x/fsDelay*1e-3) self.tdWidget.calcFun.addFun('mm', lambda x: x*fsDelay, lambda x: x/fsDelay) tdPlot = self.tdWidget.get_plot() self.tdSignal = SignalFT(self, plot=tdPlot) self.tdFit = SignalFT(self, plot=tdPlot, col='r') # Frequency domain plot self.fdWidget = DockablePlotWidget(self, CurveWidget) self.fdWidget.calcFun.addFun('PHz', lambda x: x, lambda x: x) self.fdWidget.calcFun.addFun('THz', lambda x: x*1e3, lambda x: x*1e-3) self.fdWidget.calcFun.addFun('µm', lambda x: c0/x*1e-9, lambda x: c0/x*1e-9) self.fdWidget.calcFun.addFun('eV', lambda x: x, lambda x: x) fdplot = self.fdWidget.get_plot() self.fdSignal = SignalFT(self, plot=fdplot) self.fdFit = SignalFT(self, plot=fdplot, col='r') self.smoothNum = QSpinBox() # gives number of smoothin points self.smoothNum.setMinimum(1) self.smoothNum.setSingleStep(2) # Put things together in layouts buttonLayout = QGridLayout() plotLayout = QVBoxLayout() layout = QHBoxLayout() plotLayout.addWidget(self.tdWidget) plotLayout.addWidget(self.fdWidget) buttonLayout.addWidget(QLabel('Fitting function'), 0, 0) buttonLayout.addWidget( QLineEdit("lambda x,A,f,phi: np.sin(2*np.pi*f*x+phi)"), 1, 0, 1, 2) buttonLayout.addWidget(QLabel('Smooth'), 2, 0) buttonLayout.addWidget(self.smoothNum, 2, 1) buttonLayout.setRowStretch(3, 20) layout.addLayout(buttonLayout) layout.addLayout(plotLayout) self.setLayout(layout) # connect signals self.updateTdPlot.connect(self.tdSignal.updatePlot) self.updateTdFitPlot.connect(self.tdFit.updatePlot) self.updateFdPlot.connect(lambda data: self.fdSignal.updatePlot(self.fdSignal.computeFFT(data))) self.updateFdFitPlot.connect(lambda data: self.fdFit.updatePlot(self.fdFit.computeFFT(data))) self.smoothNum.valueChanged.connect(self.smoothData) self.setData() def setData(self): data = np.loadtxt('testData.txt', delimiter=',') data[:,1] = (data[:,1]-data[:,1].min())/(data[:,1]-data[:,1].min()).max() self.data = data self.updateTdPlot.emit(data) self.updateFdPlot.emit(data) def smoothData(self, i): x = self.data[:,0] x = np.linspace(x[0], x[-1], x.shape[0]+i-1) # get x axis for smooth y = self.data[:,1] self.updateTdPlot.emit(np.column_stack((x, self.tdSignal.smooth(y, i)))) self.updateFdPlot.emit(self.fdSignal.computeFFT( np.column_stack((x, self.fdSignal.smooth(y, i))))) def runFitDialog(self): x = self.plot4Curve.get_data()[0] y = self.plot4Curve.get_data()[1] def fit(x, params): y0, a, x0, s, tau= params return y0+a*0.5*(erf((x-x0)/(s/(2*np.sqrt(2*np.log(2)))))+1)*np.exp(-(x-x0)/tau) y0 = FitParam("Offset", 0., -100., 100.) a = FitParam("Amplitude", y.max(), 0., 10000.) x0 = FitParam("x0", x[y.argmax()], -10., 10.) s = FitParam("FWHM", 0.5, 0., 10.) tau = FitParam("tau", 0.5, 0., 10.) params = [y0, a, x0, s, tau] values = guifit(x, y, fit, params, xlabel="Time (s)", ylabel="Power (a.u.)") self.fitParam = values