Commit 0c2f0791 authored by Martin Drechsler's avatar Martin Drechsler

added feedfoward

parent c264ae66
......@@ -70,28 +70,29 @@ class GuiMainWindow(QMainWindow):
self.dactivate.hideTitleBar()
# Here I add the docks
self.area.addDock( self.dtrap_electrodes)
self.area.addDock(self.d397, 'bottom', self.dtrap_electrodes)
self.area.addDock(self.d866, 'bottom', self.d397)
self.area.addDock(self.dPI, 'bottom', self.d866)
self.area.addDock(self.dWM, 'bottom', self.dPI)
self.area.addDock(self.d397_scan, 'right', self.d397)
#self.area.addDock( self.dtrap_electrodes)
#self.area.addDock(self.d397, 'bottom', self.dtrap_electrodes)
#self.area.addDock(self.d866, 'bottom', self.d397)
self.area.addDock(self.dWM)
self.area.addDock(self.dPI, 'bottom', self.dWM)
#self.area.addDock(self.d397_scan, 'right', self.d397)
self.area.addDock(self.d423_scan, 'right', self.dPI)
self.area.addDock(self.d866_scan, 'right', self.d866)
self.area.addDock(self.dactivate, 'right', self.dtrap_electrodes)
#self.area.addDock(self.d866_scan, 'right', self.d866)
#self.area.addDock(self.dactivate, 'right', self.dtrap_electrodes)
self.area.moveDock(self.dWM, 'above', self.dtrap_electrodes)
#self.area.moveDock(self.dWM, 'above', self.dtrap_electrodes)
# Here I add the layouts to the corresponding dock
self.d397.addWidget(self.layout397)
self.d866.addWidget(self.layout866)
#self.d397.addWidget(self.layout397)
#self.d866.addWidget(self.layout866)
self.dPI.addWidget(self.layoutPI)
self.dWM.addWidget(self.layoutWM)
self.d397_scan.addWidget(self.layout397_scan)
self.d866_scan.addWidget(self.layout866_scan)
#self.d397_scan.addWidget(self.layout397_scan)
#self.d866_scan.addWidget(self.layout866_scan)
self.d423_scan.addWidget(self.layout423_scan)
self.dtrap_electrodes.addWidget(self.layout_trap_electrodes)
self.dactivate.addWidget(self.layout_activate)
#self.dtrap_electrodes.addWidget(self.layout_trap_electrodes)
#self.dactivate.addWidget(self.layout_activate)
############ creating the controls ########################
......@@ -100,7 +101,7 @@ class GuiMainWindow(QMainWindow):
self.piezoB397 = anal_control_signal('piezoB397', 7, out_step = 0.01)
self.piezoA866 = anal_control_signal('piezoA866', 14, out_minimum=0, out_maximum=4, out_step=0.01)
self.piezoB866 = anal_control_signal('piezoB866', 6, out_step = 0.01)
self.piezoA423 = anal_control_signal('piezoA423', 1, out_step = 0.01)
self.piezoA423 = anal_control_signal('piezoA423', 1, out_step = 0.01, feedfoward_channel=8)
self.trapDCA = anal_control_signal('DC A', 2)
self.trapDCB = anal_control_signal('DC B', 3)
......@@ -117,7 +118,7 @@ class GuiMainWindow(QMainWindow):
#############Toolbar and initial loading of config ############################
toolbar = myToolbarMenu(self.win, anal_control_signal._registry )
print('Defined analog outputs: \n', toolbar.aosDicc.keys())
###############################################################################
#here I connect the spinboxes to the daq analog outputs:
for ao in anal_control_signal._registry:
......@@ -178,6 +179,10 @@ class GuiMainWindow(QMainWindow):
self.layout423_scan.addWidget(self.piezoA423.scanLabelValue, 5, 0)
self.layout423_scan.addWidget(self.piezoA423.scanpBar, 5, 1)
self.layout423_scan.addWidget(self.piezoA423.scan_feedfoward_button, 6, 0)
self.layout423_scan.addWidget(self.piezoA423.scan_feedfoward_sb, 6, 1)
#########################
######### trap electrodes ###########
......
......@@ -9,7 +9,7 @@ import pyqtgraph as pg
from ADoutputs import daq_AO, daq_DO
from pyqtgraph.Qt import QtGui, QtCore
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import (QPushButton, QWidget, QVBoxLayout, QLCDNumber, QProgressBar, QLabel)
from PyQt5.QtWidgets import (QPushButton, QWidget, QVBoxLayout, QLCDNumber, QProgressBar, QLabel, QCheckBox)
import telnetlib
import os
from messages import show_warning
......@@ -20,13 +20,14 @@ import scanFunctions
class anal_control_signal(QWidget):
_registry = []
def __init__(self, name, channel, out_minimum = -10, out_maximum = 10, out_step = 0.1):
def __init__(self, name, channel, out_minimum = -10, out_maximum = 10, out_step = 0.1, feedfoward_channel = None):
super().__init__()
self._registry.append(self)
self.name = name
self.ch = channel
self.feedfoward_channel = feedfoward_channel
self.initial_value = 0
......@@ -39,13 +40,13 @@ class anal_control_signal(QWidget):
self.sb = pg.SpinBox(value = self.initial_value, bounds=[self.min, self.max], step = self.step, siPrefix = self.siPrefix, suffix = self.suffix)
try:
self.AO = daq_AO(self.ch)
if feedfoward_channel:
self.AO_feedfoward = daq_AO(self.feedfoward_channel)
except:
show_warning('Analog output %i not found. Daq might not be connected' % self.ch)
self.scan_button = QPushButton('Start scan')
self.ScanTimer = QTimer()
......@@ -72,6 +73,11 @@ class anal_control_signal(QWidget):
self.scan_sb_start.setMinimumHeight(22)
self.scan_sb_stop.setMinimumHeight(22)
self.scan_feedfoward_button = QCheckBox('Feedfoward')
self.scan_feedfoward_sb = pg.SpinBox(value = 0, bounds=[0, 1], step = 0.02)
self.scan_feedfoward_sb.setMinimumHeight(22)
self.scan_feedfoward_step = 0
self.scan_feedfoward_analogOut = None
def sb_analog_change(self):
self.AO.set_out(self.sb.val)
......@@ -99,6 +105,10 @@ class anal_control_signal(QWidget):
self.scan_step = next(self.scan_array_gen)
self.AO.set_out(self.scan_step)
if self.scan_feedfoward_button.isChecked():
self.scan_feedfoward_step = next(self.scan_array_feedfoward_gen)
self.AO_feedfoward.set_out(self.scan_feedfoward_step)
def PbarEvent(self):
try:
......@@ -125,11 +135,23 @@ class anal_control_signal(QWidget):
else:
dt = 5.0e-3
first_value = float(self.sb.val)
self.scan_array = scanFunctions.create_scan_array(self.scan_sb_start.val, self.scan_sb_stop.val, self.scan_sb_period.val, first_value,dt)
self.scan_array = scanFunctions.create_scan_array(self.scan_sb_start.val, self.scan_sb_stop.val, self.scan_sb_period.val, first_value, dt)
self.scan_array_gen = scanFunctions.yield_scan_array(self.scan_array)
self.scan_array_feedfoward = scanFunctions.create_scan_array(self.scan_sb_start.val, self.scan_sb_stop.val,
self.scan_sb_period.val, first_value, dt,
normalized=True, normalization_constant = float(self.scan_feedfoward_sb.val) )
self.scan_array_feedfoward_gen = scanFunctions.yield_scan_array(self.scan_array_feedfoward)
import pylab as plt
plt.figure()
plt.plot(self.scan_array, label = 'scan')
plt.plot(self.scan_array_feedfoward, label = 'feedfoward')
plt.legend()
plt.show()
if first_value > float(self.scan_sb_stop.val) or first_value < float(self.scan_sb_start.val):
details = 'Remember remember the fifth of November.' + '\n' + 'Also remember that scan starts from the value of the corresponding spin box'
......@@ -147,7 +169,8 @@ class anal_control_signal(QWidget):
def set_scan_feedfoward_analog_out(self, analogOut):
self.scan_feedfoward_analogOut = analogOut
......
......@@ -11,22 +11,36 @@ Auxiliary functions for performing scans in a cleaner way
import numpy as np
def create_scan_array(scan_start, scan_stop, scan_period, first_value, dt):
def create_scan_array(scan_start, scan_stop, scan_period, first_value, dt, normalized = False, normalization_constant = 0):
"""
Returns the array that represents one period of the scan, including up and down paths of the triangle.
The first_value param is were the scan actually starts. The scan_start and scan_top give the range.
If normalized is true, then it returns the array from 1 to -1 (including up and down paths) multiplied by
the value normalization_constant
"""
scan_start = float(scan_start)
scan_stop = float(scan_stop)
scan_period = float(scan_period)
number_of_points = 1 + (scan_period+dt)//(2*dt)
scan_array_norm = np.linspace(1* normalization_constant, -1*normalization_constant, int(number_of_points) )
scan_array_norm = np.concatenate((scan_array_norm, np.flip(scan_array_norm, 0)[1:]))
scan_array = np.linspace(scan_start, scan_stop, int(number_of_points))
scan_array = np.concatenate((scan_array, np.flip(scan_array, 0)[1:]))
starting_index = np.abs(scan_array-first_value).argmin()+1
scan_array = np.roll(scan_array, starting_index)
scan_array_norm = np.roll(scan_array_norm, starting_index)
return scan_array
if normalized:
return scan_array_norm
else:
return scan_array
def _yield_array(arr):
larr = len(arr)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment