Completed
Push — pulsed_with_queued_connections ( d810d5...0b7aaa )
by
unknown
02:22
created

PulsedMeasurementGui.apply_generator_settings()   A

Complexity

Conditions 4

Size

Total Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
dl 0
loc 15
rs 9.2
c 0
b 0
f 0
1
# -*- coding: utf-8 -*-
2
3
"""
4
This file contains the QuDi main GUI for pulsed measurements.
5
6
QuDi is free software: you can redistribute it and/or modify
7
it under the terms of the GNU General Public License as published by
8
the Free Software Foundation, either version 3 of the License, or
9
(at your option) any later version.
10
11
QuDi is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
GNU General Public License for more details.
15
16
You should have received a copy of the GNU General Public License
17
along with QuDi. If not, see <http://www.gnu.org/licenses/>.
18
19
Copyright (c) the Qudi Developers. See the COPYRIGHT.txt file at the
20
top-level directory of this distribution and at <https://github.com/Ulm-IQO/qudi/>
21
"""
22
23
from qtpy import QtGui
24
from qtpy import QtCore
25
from qtpy import QtWidgets
26
from qtpy import uic
27
import numpy as np
28
import os
29
from collections import OrderedDict
30
import pyqtgraph as pg
31
import re
32
import inspect
33
import datetime
34
35
36
from gui.guibase import GUIBase
37
from gui.colordefs import QudiPalettePale as palette
38
from gui.colordefs import QudiPalette as palettedark
39
#from gui.pulsed.pulse_editor import PulseEditor
40
from core.util.mutex import Mutex
41
from core.util import units
42
from gui.pulsed.pulse_editors import BlockEditor, BlockOrganizer
43
from logic.sampling_functions import SamplingFunctions
44
45
46
#FIXME: Display the Pulse
47
#FIXME: save the length in sample points (bins)
48
#FIXME: adjust the length to the bins
49
#FIXME: Later that should be able to round up the values directly within
50
51
52
class PulsedMeasurementMainWindow(QtWidgets.QMainWindow):
53
    def __init__(self):
54
        # Get the path to the *.ui file
55
        this_dir = os.path.dirname(__file__)
56
        ui_file = os.path.join(this_dir, 'ui_pulsed_noeditor.ui')
57
58
        # Load it
59
        super(PulsedMeasurementMainWindow, self).__init__()
60
61
        uic.loadUi(ui_file, self)
62
        self.show()
63
64
65
class PulseAnalysisTab(QtWidgets.QWidget):
66
    def __init__(self):
67
        # Get the path to the *.ui file
68
        this_dir = os.path.dirname(__file__)
69
        ui_file = os.path.join(this_dir, 'ui_pulse_analysis.ui')
70
        # Load it
71
        super().__init__()
72
        uic.loadUi(ui_file, self)
73
74
75
class PulseGeneratorTab(QtWidgets.QWidget):
76
    def __init__(self):
77
        # Get the path to the *.ui file
78
        this_dir = os.path.dirname(__file__)
79
        ui_file = os.path.join(this_dir, 'ui_pulse_editor.ui')
80
        # Load it
81
        super().__init__()
82
        uic.loadUi(ui_file, self)
83
84
85
class PulseExtractionTab(QtWidgets.QWidget):
86
    def __init__(self):
87
        # Get the path to the *.ui file
88
        this_dir = os.path.dirname(__file__)
89
        ui_file = os.path.join(this_dir, 'ui_pulse_extraction.ui')
90
        # Load it
91
        super().__init__()
92
        uic.loadUi(ui_file, self)
93
94
95
class AnalysisSettingDialog(QtWidgets.QDialog):
96
    def __init__(self):
97
        # Get the path to the *.ui file
98
        this_dir = os.path.dirname(__file__)
99
        ui_file = os.path.join(this_dir, 'ui_pulsed_main_gui_settings_analysis.ui')
100
101
        # Load it
102
        super(AnalysisSettingDialog, self).__init__()
103
104
        uic.loadUi(ui_file, self)
105
106
107
class GeneratorSettingsDialog(QtWidgets.QDialog):
108
    def __init__(self):
109
        # Get the path to the *.ui file
110
        this_dir = os.path.dirname(__file__)
111
        ui_file = os.path.join(this_dir, 'ui_pulsed_main_gui_settings_block_gen.ui')
112
113
        # Load it
114
        super(GeneratorSettingsDialog, self).__init__()
115
116
        uic.loadUi(ui_file, self)
117
118
119
class PulsedMeasurementGui(GUIBase):
120
    """ This is the main GUI Class for pulsed measurements. """
121
122
    _modclass = 'PulsedMeasurementGui'
123
    _modtype = 'gui'
124
125
    ## declare connectors
126
    _in = {'pulsedmasterlogic': 'PulsedMasterLogic',
127
           'savelogic': 'SaveLogic'}
128
129
    def __init__(self, config, **kwargs):
130
        super().__init__(config=config, **kwargs)
131
132
        self.log.info('The following configuration was found.')
133
134
        # checking for the right configuration
135
        for key in config.keys():
136
            self.log.info('{}: {}'.format(key,config[key]))
137
138
        # that variable is for testing issues and can be deleted if not needed:
139
        self._write_chunkwise = False
140
141 View Code Duplication
    def on_activate(self, e=None):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
142
        """ Initialize, connect and configure the pulsed measurement GUI.
143
144
        @param object e: Fysom.event object from Fysom class.
145
                         An object created by the state machine module Fysom,
146
                         which is connected to a specific event (have a look in
147
                         the Base Class). This object contains the passed event,
148
                         the state before the event happened and the destination
149
                         of the state which should be reached after the event
150
                         had happened.
151
152
        Establish general connectivity and activate the different tabs of the
153
        GUI.
154
        """
155
        self._pulsed_master_logic = self.get_in_connector('pulsedmasterlogic')
156
        self._save_logic = self.get_in_connector('savelogic')
157
158
        self._mw = PulsedMeasurementMainWindow()
159
        self._pa = PulseAnalysisTab()
160
        self._pg = PulseGeneratorTab()
161
        self._pe = PulseExtractionTab()
162
163
        self._mw.tabWidget.addTab(self._pa, 'Analysis')
164
        self._mw.tabWidget.addTab(self._pe, 'Pulse Extraction')
165
        self._mw.tabWidget.addTab(self._pg, 'Pulse Generator')
166
167
        self.setup_toolbar()
168
        self._activate_analysis_settings_ui(e)
169
        self._activate_analysis_ui(e)
170
        self.setup_extraction_ui()
171
172
        self._activate_generator_settings_ui(e)
173
        self._activate_pulse_generator_ui(e)
174
175
        self.show()
176
177
    def on_deactivate(self, e):
178
        """ Undo the Definition, configuration and initialisation of the pulsed
179
            measurement GUI.
180
181
        @param object e: Fysom.event object from Fysom class. A more detailed
182
                         explanation can be found in the method initUI.
183
184
        This deactivation disconnects all the graphic modules, which were
185
        connected in the initUI method.
186
        """
187
        self._deactivate_analysis_settings_ui(e)
188
        self._deactivate_analysis_ui(e)
189
190
        self._deactivate_generator_settings_ui(e)
191
        self._deactivate_pulse_generator_ui(e)
192
193
        self._mw.close()
194
195
    def show(self):
196
        """Make main window visible and put it above all other windows. """
197
        QtWidgets.QMainWindow.show(self._mw)
198
        self._mw.activateWindow()
199
        self._mw.raise_()
200
201
    ###########################################################################
202
    ###   Methods related to Settings for the 'Pulse Generator' tab:        ###
203
    ###########################################################################
204
    def _activate_generator_settings_ui(self, e):
205
        """ Initialize, connect and configure the pulse generator settings to be displayed in the
206
        editor.
207
208
        @param object e: Fysom.event object from Fysom class. A more detailed
209
                         explanation can be found in the method initUI.
210
        """
211
        self._gs = GeneratorSettingsDialog()
212
        self._gs.accepted.connect(self.apply_generator_settings)
213
        self._gs.rejected.connect(self.keep_former_generator_settings)
214
        self._gs.buttonBox.button(QtWidgets.QDialogButtonBox.Apply).clicked.connect(
215
            self.apply_generator_settings)
216
217
        # create the Predefined methods Dialog
218
        # self._pm = PredefinedMethodsDialog()
219
        # self._predefined_methods_list = []  # here are all the names saved of
220
        # the created predefined methods.
221
222
        # create a config for the predefined methods:
223
        # self._pm_cfg = PredefinedMethodsConfigDialog()
224
225
        # Add in the settings menu within the groupbox widget all the available math_functions,
226
        # based on the list from the Logic. Right now, the GUI objects are inserted the 'hard' way,
227
        # like it is done in the Qt-Designer.
228
        # FIXME: Make a nicer way of displaying the available functions, maybe with a Table!
229
        _encoding = QtWidgets.QApplication.UnicodeUTF8
230
        objectname = self._gs.objectName()
231
        for index, func_name in enumerate(list(SamplingFunctions().func_config)):
232
            name_label = 'func_' + str(index)
233
            setattr(self._gs, name_label, QtWidgets.QLabel(self._gs.groupBox))
234
            label = getattr(self._gs, name_label)
235
            label.setObjectName(name_label)
236
            self._gs.gridLayout_3.addWidget(label, index, 0, 1, 1)
237
            label.setText(QtWidgets.QApplication.translate(objectname, func_name, None, _encoding))
238
239
            name_checkbox = 'checkbox_' + str(index)
240
            setattr(self._gs, name_checkbox, QtWidgets.QCheckBox(self._gs.groupBox))
241
            checkbox = getattr(self._gs, name_checkbox)
242
            checkbox.setObjectName(name_checkbox)
243
            self._gs.gridLayout_3.addWidget(checkbox, index, 1, 1, 1)
244
            checkbox.setText(QtWidgets.QApplication.translate(objectname, '', None, _encoding))
245
        # make the first 4 Functions as default.
246
        # FIXME: the default functions, must be passed as a config
247
        for index in range(4):
248
            name_checkbox = 'checkbox_' + str(index)
249
            checkbox = getattr(self._gs, name_checkbox)
250
            checkbox.setCheckState(QtCore.Qt.Checked)
251
        return
252
253
    def _deactivate_generator_settings_ui(self, e):
254
        """ Disconnects the configuration of the Settings for the 'Pulse Generator' Tab.
255
256
        @param object e: Fysom.event object from Fysom class. A more detailed
257
                         explanation can be found in the method initUI.
258
        """
259
        self._gs.accepted.disconnect()
260
        self._gs.rejected.disconnect()
261
        self._gs.buttonBox.button(QtWidgets.QDialogButtonBox.Apply).clicked.disconnect()
262
        self._gs.close()
263
        return
264
265
    def show_generator_settings(self):
266
        """
267
        Opens the generator settings menu.
268
        """
269
        self._gs.exec_()
270
        return
271
272
    def apply_generator_settings(self):
273
        """
274
        Write new generator settings from the gui to the file.
275
        """
276
        new_config = SamplingFunctions().func_config
277
        for index, func_name in enumerate(list(SamplingFunctions().func_config)):
278
            name_checkbox = 'checkbox_' + str(index)
279
            checkbox = getattr(self._gs, name_checkbox)
280
            if not checkbox.isChecked():
281
                name_label = 'func_' + str(index)
282
                func = getattr(self._gs, name_label)
283
                del new_config[func.text()]
284
        if self.block_editor.function_config != new_config:
285
            self.block_editor.set_function_config(new_config)
286
        return
287
288
    def keep_former_generator_settings(self):
289
        """
290
        Keep the old generator settings and restores them in the gui.
291
        """
292
        old_config = self.block_editor.function_config
293
        for index, func_name in enumerate(list(SamplingFunctions().func_config)):
294
            name_checkbox = 'checkbox_' + str(index)
295
            checkbox = getattr(self._gs, name_checkbox)
296
            if func_name in old_config:
297
                checkbox.setChecked(True)
298
            else:
299
                checkbox.setChecked(False)
300
        return
301
302
    # def show_predefined_methods(self):
303
    #     """ Opens the predefined methods Window."""
304
    #     self._pm.show()
305
    #     self._pm.raise_()
306
    #
307
    # def show_predefined_methods_config(self):
308
    #     """ Opens the Window for the config of predefined methods."""
309
    #     self._pm_cfg.show()
310
    #     self._pm_cfg.raise_()
311
    #
312
    # def keep_former_predefined_methods(self):
313
    #
314
    #     for method_name in self._predefined_methods_list:
315
    #         groupbox = self._get_ref_groupbox_predefined_methods(method_name)
316
    #         checkbox = self._get_ref_checkbox_predefined_methods_config(method_name)
317
    #
318
    #         checkbox.setChecked(groupbox.isVisible())
319
    #
320
    # def update_predefined_methods(self):
321
    #     for method_name in self._predefined_methods_list:
322
    #         groupbox = self._get_ref_groupbox_predefined_methods(method_name)
323
    #         checkbox = self._get_ref_checkbox_predefined_methods_config(method_name)
324
    #
325
    #         groupbox.setVisible(checkbox.isChecked())
326
327
    ###########################################################################
328
    ###   Methods related to Tab 'Pulse Generator' in the Pulsed Window:    ###
329
    ###########################################################################
330
    def _activate_pulse_generator_ui(self, e):
331
        """ Initialize, connect and configure the 'Pulse Generator' Tab.
332
333
        @param object e: Fysom.event object from Fysom class. A more detailed
334
                         explanation can be found in the method initUI.
335
        """
336
        # connect signals of input widgets
337
        self._pg.gen_sample_freq_DSpinBox.editingFinished.connect(self.generator_settings_changed, QtCore.Qt.QueuedConnection)
338
        self._pg.gen_laserchannel_ComboBox.currentIndexChanged.connect(self.generator_settings_changed, QtCore.Qt.QueuedConnection)
339
        self._pg.gen_activation_config_ComboBox.currentIndexChanged.connect(self.generator_settings_changed, QtCore.Qt.QueuedConnection)
340
        # connect signals of buttons
341
        self._pg.sample_ensemble_PushButton.clicked.connect(self.sample_ensemble_clicked)
342
        # self._pg.sample_sequence_PushButton.clicked.connect(self.sample_sequence_clicked)
343
        self._pg.sauplo_ensemble_PushButton.clicked.connect(self.sauplo_ensemble_clicked)
344
345
        self._pg.block_add_last_PushButton.clicked.connect(self.block_add_last_clicked)
346
        self._pg.block_del_last_PushButton.clicked.connect(self.block_del_last_clicked)
347
        self._pg.block_add_sel_PushButton.clicked.connect(self.block_add_sel_clicked)
348
        self._pg.block_del_sel_PushButton.clicked.connect(self.block_del_sel_clicked)
349
        self._pg.block_clear_PushButton.clicked.connect(self.block_clear_clicked)
350
        self._pg.organizer_add_last_PushButton.clicked.connect(self.organizer_add_last_clicked)
351
        self._pg.organizer_del_last_PushButton.clicked.connect(self.organizer_del_last_clicked)
352
        self._pg.organizer_add_sel_PushButton.clicked.connect(self.organizer_add_sel_clicked)
353
        self._pg.organizer_del_sel_PushButton.clicked.connect(self.organizer_del_sel_clicked)
354
        self._pg.organizer_clear_PushButton.clicked.connect(self.organizer_clear_clicked)
355
356
        self._pg.curr_block_generate_PushButton.clicked.connect(self.editor_generate_block_clicked)
357
        self._pg.curr_block_del_PushButton.clicked.connect(self.editor_delete_block_clicked)
358
        self._pg.curr_block_load_PushButton.clicked.connect(self.editor_load_block_clicked)
359
        self._pg.curr_ensemble_generate_PushButton.clicked.connect(self.editor_generate_ensemble_clicked)
360
        self._pg.curr_ensemble_del_PushButton.clicked.connect(self.editor_delete_ensemble_clicked)
361
        self._pg.curr_ensemble_load_PushButton.clicked.connect(self.editor_load_ensemble_clicked)
362
363
        # connect update signals from pulsed_master_logic
364
        self._pulsed_master_logic.sigBlockEnsembleSampled.connect(self.sample_ensemble_finished)
365
        # self._pulsed_master_logic.sigSequenceSampled.connect(self.sample_sequence_finished)
366
        self._pulsed_master_logic.sigSavedPulseBlocksUpdated.connect(self.update_block_dict)
367
        self._pulsed_master_logic.sigSavedBlockEnsemblesUpdated.connect(self.update_ensemble_dict)
368
        # self._pulsed_master_logic.sigSavedSequencesUpdated.connect(self.update_sequence_list)
369
        self._pulsed_master_logic.sigGeneratorSettingsUpdated.connect(self.update_generator_settings)
370
371
        self._pulsed_master_logic.sigCurrentPulseBlockUpdated.connect(self.load_block_in_editor)
372
        self._pulsed_master_logic.sigCurrentBlockEnsembleUpdated.connect(self.load_ensemble_in_editor)
373
        # self._pulsed_master_logic.sigCurrentSequenceUpdated.connect(self.)
374
375
        self.block_organizer = BlockOrganizer(self._pg.block_organizer_TableWidget)
376
        self.block_editor = BlockEditor(self._pg.block_editor_TableWidget)
377
378
        # connect the menu to the actions:
379
        self._mw.action_Settings_Block_Generation.triggered.connect(self.show_generator_settings)
380
381
        # Apply hardware constraints to input widgets
382
        self._gen_apply_hardware_constraints()
383
384
        # Fill initial values from logic into input widgets
385
        self._pulsed_master_logic.request_generator_init_values()
386
        return
387
388
    def _deactivate_pulse_generator_ui(self, e):
389
        """ Disconnects the configuration for 'Pulse Generator Tab.
390
391
        @param object e: Fysom.event object from Fysom class. A more detailed
392
                         explanation can be found in the method initUI.
393
        """
394
        # disconnect signals of input widgets
395
        self._pg.gen_sample_freq_DSpinBox.editingFinished.disconnect()
396
        self._pg.gen_laserchannel_ComboBox.currentIndexChanged.disconnect()
397
        self._pg.gen_activation_config_ComboBox.currentIndexChanged.disconnect()
398
        # disconnect signals of buttons
399
        self._pg.sample_ensemble_PushButton.clicked.disconnect()
400
        # self._pg.sample_sequence_PushButton.clicked.disconnect()
401
        self._pg.sauplo_ensemble_PushButton.clicked.disconnect()
402
        self._pg.block_add_last_PushButton.clicked.disconnect()
403
        self._pg.block_del_last_PushButton.clicked.disconnect()
404
        self._pg.block_add_sel_PushButton.clicked.disconnect()
405
        self._pg.block_del_sel_PushButton.clicked.disconnect()
406
        self._pg.block_clear_PushButton.clicked.disconnect()
407
        self._pg.organizer_add_last_PushButton.clicked.disconnect()
408
        self._pg.organizer_del_last_PushButton.clicked.disconnect()
409
        self._pg.organizer_add_sel_PushButton.clicked.disconnect()
410
        self._pg.organizer_del_sel_PushButton.clicked.disconnect()
411
        self._pg.organizer_clear_PushButton.clicked.disconnect()
412
        self._pg.curr_block_generate_PushButton.clicked.disconnect()
413
        self._pg.curr_block_del_PushButton.clicked.disconnect()
414
        self._pg.curr_block_load_PushButton.clicked.disconnect()
415
        self._pg.curr_ensemble_generate_PushButton.clicked.disconnect()
416
        self._pg.curr_ensemble_del_PushButton.clicked.disconnect()
417
        self._pg.curr_ensemble_load_PushButton.clicked.disconnect()
418
        # disconnect update signals from pulsed_master_logic
419
        self._pulsed_master_logic.sigBlockEnsembleSampled.disconnect()
420
        # self._pulsed_master_logic.sigSequenceSampled.disconnect()
421
        self._pulsed_master_logic.sigSavedPulseBlocksUpdated.disconnect()
422
        self._pulsed_master_logic.sigSavedBlockEnsemblesUpdated.disconnect()
423
        # self._pulsed_master_logic.sigSavedSequencesUpdated.disconnect()
424
        self._pulsed_master_logic.sigGeneratorSettingsUpdated.disconnect()
425
        # self._pulsed_master_logic.sigCurrentPulseBlockUpdated.disconnect()
426
        # self._pulsed_master_logic.sigCurrentBlockEnsembleUpdated.disconnect()
427
        # self._pulsed_master_logic.sigCurrentSequenceUpdated.disconnect()
428
        return
429
430 View Code Duplication
    def _gen_apply_hardware_constraints(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
431
        """
432
        Retrieve the constraints from pulser hardware and apply these constraints to the pulse
433
        generator GUI elements.
434
        """
435
        # block signals
436
        self._pg.gen_activation_config_ComboBox.blockSignals(True)
437
        self._pg.gen_sample_freq_DSpinBox.blockSignals(True)
438
        # apply constraints
439
        pulser_constr, dummy = self._pulsed_master_logic.get_hardware_constraints()
440
        self._pg.gen_activation_config_ComboBox.addItems(list(pulser_constr['activation_config']))
441
        self._pg.gen_sample_freq_DSpinBox.setMinimum(pulser_constr['sample_rate']['min'])
442
        self._pg.gen_sample_freq_DSpinBox.setMaximum(pulser_constr['sample_rate']['max'])
443
        # unblock signals
444
        self._pg.gen_activation_config_ComboBox.blockSignals(False)
445
        self._pg.gen_sample_freq_DSpinBox.blockSignals(False)
446
        return
447
448
    def generator_settings_changed(self):
449
        """
450
451
        @return:
452
        """
453
        sample_rate = self._pg.gen_sample_freq_DSpinBox.value()
454
        laser_channel = self._pg.gen_laserchannel_ComboBox.currentText()
455
        activation_config_name = self._pg.gen_activation_config_ComboBox.currentText()
456
        amplitude_dict = self._pulsed_master_logic._generator_logic.amplitude_dict
457
458
        self._pulsed_master_logic.generator_settings_changed(activation_config_name, laser_channel,
459
                                                             sample_rate, amplitude_dict)
460
        return
461
462 View Code Duplication
    def update_generator_settings(self, activation_config_name, activation_config, sample_rate,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
463
                                   amplitude_dict, laser_channel):
464
        """
465
466
        @param activation_config_name:
467
        @param activation_config:
468
        @param sample_rate:
469
        @param amplitude_dict:
470
        @param laser_channel:
471
        @return:
472
        """
473
        # block signals
474
        self._pg.gen_sample_freq_DSpinBox.blockSignals(True)
475
        self._pg.gen_laserchannel_ComboBox.blockSignals(True)
476
        self._pg.gen_activation_config_ComboBox.blockSignals(True)
477
        # activation config
478
        index = self._pg.gen_activation_config_ComboBox.findText(activation_config_name)
479
        self._pg.gen_activation_config_ComboBox.setCurrentIndex(index)
480
        display_str = ''
481
        for chnl in activation_config:
482
            display_str += chnl + ' | '
483
        display_str = display_str[:-3]
484
        self._pg.gen_activation_config_LineEdit.setText(display_str)
485
        self._pg.gen_analog_channels_SpinBox.setValue(
486
            len([chnl for chnl in activation_config if 'a_ch' in chnl]))
487
        self._pg.gen_digital_channels_SpinBox.setValue(
488
            len([chnl for chnl in activation_config if 'd_ch' in chnl]))
489
        # laser channel
490
        self._pg.gen_laserchannel_ComboBox.clear()
491
        self._pg.gen_laserchannel_ComboBox.addItems(activation_config)
492
        index = self._pg.gen_laserchannel_ComboBox.findText(laser_channel)
493
        self._pg.gen_laserchannel_ComboBox.setCurrentIndex(index)
494
        # sample rate
495
        self._pg.gen_sample_freq_DSpinBox.setValue(sample_rate)
496
        # set activation config in block editor
497
        if self.block_editor.activation_config != activation_config:
498
            self.block_editor.set_activation_config(activation_config)
499
        # unblock signals
500
        self._pg.gen_sample_freq_DSpinBox.blockSignals(False)
501
        self._pg.gen_laserchannel_ComboBox.blockSignals(False)
502
        self._pg.gen_activation_config_ComboBox.blockSignals(False)
503
        return
504
505
    def block_add_last_clicked(self):
506
        """
507
508
        @return:
509
        """
510
        self.block_editor.insert_rows(self._pg.block_editor_TableWidget.rowCount(), 1)
511
        return
512
513
    def block_del_last_clicked(self):
514
        """
515
516
        @return:
517
        """
518
        self.block_editor.delete_row(self._pg.block_editor_TableWidget.rowCount())
519
        return
520
521
    def block_add_sel_clicked(self):
522
        """
523
524
        @return:
525
        """
526
        index = self._pg.block_editor_TableWidget.currentRow()
527
        self.block_editor.insert_rows(index + 1, 1)
528
        return
529
530
    def block_del_sel_clicked(self):
531
        """
532
533
        @return:
534
        """
535
        index = self._pg.block_editor_TableWidget.currentRow()
536
        self.block_editor.delete_row(index)
537
        return
538
539
    def block_clear_clicked(self):
540
        """
541
542
        @return:
543
        """
544
        self.block_editor.clear_table()
545
        return
546
547
    def organizer_add_last_clicked(self):
548
        """
549
550
        @return:
551
        """
552
        self.block_organizer.insert_rows(self._pg.block_organizer_TableWidget.rowCount(), 1)
553
        return
554
555
    def organizer_del_last_clicked(self):
556
        """
557
558
        @return:
559
        """
560
        self.block_organizer.delete_row(self._pg.block_organizer_TableWidget.rowCount() - 1)
561
        return
562
563
    def organizer_add_sel_clicked(self):
564
        """
565
566
        @return:
567
        """
568
        index = self._pg.block_organizer_TableWidget.currentRow()
569
        self.block_organizer.insert_rows(index + 1, 1)
570
        return
571
572
    def organizer_del_sel_clicked(self):
573
        """
574
575
        @return:
576
        """
577
        index = self._pg.block_organizer_TableWidget.currentRow()
578
        self.block_organizer.delete_row(index)
579
        return
580
581
    def organizer_clear_clicked(self):
582
        """
583
584
        @return:
585
        """
586
        self.block_organizer.clear_table()
587
        return
588
589
    def editor_generate_block_clicked(self):
590
        name = self._pg.curr_block_name_LineEdit.text()
591
        if name == '':
592
            self.log.error('No name has been entered for the PulseBlock to be generated.')
593
            return
594
        block_object = self.block_editor.generate_block_object(name)
595
        self._pulsed_master_logic.save_pulse_block(name, block_object)
596
        return
597
598
    def editor_delete_block_clicked(self):
599
        name = self._pg.saved_blocks_ComboBox.currentText()
600
        self._pulsed_master_logic.delete_pulse_block(name)
601
        return
602
603
    def editor_load_block_clicked(self):
604
        name = self._pg.saved_blocks_ComboBox.currentText()
605
        self._pulsed_master_logic.load_pulse_block(name)
606
        return
607
608
    def editor_generate_ensemble_clicked(self):
609
        name = self._pg.curr_ensemble_name_LineEdit.text()
610
        if name == '':
611
            self.log.error('No name has been entered for the PulseBlockEnsemble to be generated.')
612
            return
613
        rotating_frame = self._pg.curr_ensemble_rot_frame_CheckBox.isChecked()
614
        ensemble_object = self.block_organizer.generate_ensemble_object(name, rotating_frame)
615
        self._pulsed_master_logic.save_block_ensemble(name, ensemble_object)
616
        return
617
618
    def editor_delete_ensemble_clicked(self):
619
        name = self._pg.saved_ensembles_ComboBox.currentText()
620
        self._pulsed_master_logic.delete_block_ensemble(name)
621
        return
622
623
    def editor_load_ensemble_clicked(self):
624
        name = self._pg.saved_ensembles_ComboBox.currentText()
625
        self._pulsed_master_logic.load_block_ensemble(name)
626
        return
627
628
    def load_block_in_editor(self, block_obj):
629
        self.block_editor.load_pulse_block(block_obj)
630
        return
631
632
    def load_ensemble_in_editor(self, ensemble_obj):
633
        self.block_organizer.load_pulse_block_ensemble(ensemble_obj)
634
        return
635
636
    def update_block_dict(self, block_dict):
637
        """
638
639
        @param block_dict:
640
        @return:
641
        """
642
        self.block_organizer.set_block_dict(block_dict)
643
        self._pg.saved_blocks_ComboBox.blockSignals(True)
644
        self._pg.saved_blocks_ComboBox.clear()
645
        self._pg.saved_blocks_ComboBox.addItems(list(block_dict))
646
        self._pg.saved_blocks_ComboBox.blockSignals(False)
647
        return
648
649
    def update_ensemble_dict(self, ensemble_dict):
650
        """
651
652
        @param ensemble_dict:
653
        @return:
654
        """
655
        # block signals
656
        self._pg.gen_ensemble_ComboBox.blockSignals(True)
657
        self._pg.saved_ensembles_ComboBox.blockSignals(True)
658
        # update gen_sequence_ComboBox items
659
        self._pg.gen_ensemble_ComboBox.clear()
660
        self._pg.gen_ensemble_ComboBox.addItems(list(ensemble_dict))
661
        self._pg.saved_ensembles_ComboBox.clear()
662
        self._pg.saved_ensembles_ComboBox.addItems(list(ensemble_dict))
663
        # unblock signals
664
        self._pg.gen_ensemble_ComboBox.blockSignals(False)
665
        self._pg.saved_ensembles_ComboBox.blockSignals(False)
666
        return
667
668
    # def update_sequence_list(self, sequence_list):
669
    #     """
670
    #
671
    #     @param sequence_list:
672
    #     @return:
673
    #     """
674
    #     # block signals
675
    #     self._pg.gen_sequence_ComboBox.blockSignals(True)
676
    #     # update gen_sequence_ComboBox items
677
    #     self._pg.gen_sequence_ComboBox.clear()
678
    #     self._pg.gen_sequence_ComboBox.addItems(sequence_list)
679
    #     # unblock signals
680
    #     self._pg.gen_sequence_ComboBox.blockSignals(False)
681
    #     return
682
683
    def sample_ensemble_clicked(self):
684
        """
685
        This method is called when the user clicks on "sample"
686
        """
687
        # Get the ensemble name from the ComboBox
688
        ensemble_name = self._pg.gen_ensemble_ComboBox.currentText()
689
        # disable button
690
        self._pg.sample_ensemble_PushButton.setEnabled(False)
691
        # Sample the ensemble via logic module
692
        self._pulsed_master_logic.sample_block_ensemble(ensemble_name, True, self._write_chunkwise)
693
        return
694
695
    def sample_ensemble_finished(self, ensemble_name):
696
        """
697
698
        @return:
699
        """
700
        # enable button
701
        self._pg.sample_ensemble_PushButton.setEnabled(True)
702
        return
703
704
    def sauplo_ensemble_clicked(self):
705
        """
706
707
        @return:
708
        """
709
        # Get the ensemble name from the ComboBox
710
        ensemble_name = self._pg.gen_ensemble_ComboBox.currentText()
711
        # disable button
712
        self._pg.sample_ensemble_PushButton.setEnabled(False)
713
        self._pg.upload_ensemble_PushButton.setEnabled(False)
714
        self._pg.load_ensemble_PushButton.setEnabled(False)
715
        # Sample the ensemble via logic module
716
        self._pulsed_master_logic.sample_block_ensemble(ensemble_name, True, self._write_chunkwise, True)
717
        return
718
719
    # def sample_sequence_clicked(self):
720
    #     """
721
    #     This method is called when the user clicks on "sample"
722
    #     """
723
    #     # Get the sequence name from the ComboBox
724
    #     sequence_name = self._pg.gen_sequence_ComboBox.currentText()
725
    #     # Sample the sequence via logic module
726
    #     self._pulsed_master_logic.sample_sequence(sequence_name, True, self._write_chunkwise)
727
    #     # disable button
728
    #     self._pg.sample_sequence_PushButton.setEnabled(False)
729
    #     return
730
731
    # def sample_sequence_finished(self, sequence_name):
732
    #     """
733
    #
734
    #     @return:
735
    #     """
736
    #     # enable button
737
    #     self._pg.sample_sequence_PushButton.setEnabled(True)
738
    #     return
739
740
    ###########################################################################
741
    ###        Methods related to Settings for the 'Analysis' Tab:          ###
742
    ###########################################################################
743
    #FIXME: Implement the setting for 'Analysis' tab.
744 View Code Duplication
    def _activate_analysis_settings_ui(self, e):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
745
        """ Initialize, connect and configure the Settings of 'Analysis' Tab.
746
747
        @param object e: Fysom.event object from Fysom class. A more detailed
748
                         explanation can be found in the method initUI.
749
        """
750
        self._as = AnalysisSettingDialog()
751
        self._as.accepted.connect(self.update_analysis_settings)
752
        self._as.rejected.connect(self.keep_former_analysis_settings)
753
        self._as.buttonBox.button(QtWidgets.QDialogButtonBox.Apply).clicked.connect(self.update_analysis_settings)
754
755
        if 'ana_param_x_axis_name_LineEdit' in self._statusVariables:
756
            self._as.ana_param_x_axis_name_LineEdit.setText(self._statusVariables['ana_param_x_axis_name_LineEdit'])
757
        if 'ana_param_x_axis_unit_LineEdit' in self._statusVariables:
758
            self._as.ana_param_x_axis_unit_LineEdit.setText(self._statusVariables['ana_param_x_axis_unit_LineEdit'])
759
        if 'ana_param_y_axis_name_LineEdit' in self._statusVariables:
760
            self._as.ana_param_y_axis_name_LineEdit.setText(self._statusVariables['ana_param_y_axis_name_LineEdit'])
761
        if 'ana_param_y_axis_unit_LineEdit' in self._statusVariables:
762
            self._as.ana_param_y_axis_unit_LineEdit.setText(self._statusVariables['ana_param_y_axis_unit_LineEdit'])
763
        if 'ana_param_second_plot_x_axis_name_LineEdit' in self._statusVariables:
764
            self._as.ana_param_second_plot_x_axis_name_LineEdit.setText(self._statusVariables['ana_param_second_plot_x_axis_name_LineEdit'])
765
        if 'ana_param_second_plot_x_axis_unit_LineEdit' in self._statusVariables:
766
            self._as.ana_param_second_plot_x_axis_unit_LineEdit.setText(self._statusVariables['ana_param_second_plot_x_axis_unit_LineEdit'])
767
        if 'ana_param_second_plot_y_axis_name_LineEdit' in self._statusVariables:
768
            self._as.ana_param_second_plot_y_axis_name_LineEdit.setText(self._statusVariables['ana_param_second_plot_y_axis_name_LineEdit'])
769
        if 'ana_param_second_plot_y_axis_unit_LineEdit' in self._statusVariables:
770
            self._as.ana_param_second_plot_y_axis_unit_LineEdit.setText(self._statusVariables['ana_param_second_plot_y_axis_unit_LineEdit'])
771
        self.update_analysis_settings()
772
        return
773
774
775 View Code Duplication
    def _deactivate_analysis_settings_ui(self, e):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
776
        """ Disconnects the configuration of the Settings for 'Analysis' Tab.
777
778
        @param object e: Fysom.event object from Fysom class. A more detailed
779
                         explanation can be found in the method initUI.
780
        """
781
        self._statusVariables['ana_param_x_axis_name_LineEdit'] = self._as.ana_param_x_axis_name_LineEdit.text()
782
        self._statusVariables['ana_param_x_axis_unit_LineEdit'] = self._as.ana_param_x_axis_unit_LineEdit.text()
783
        self._statusVariables['ana_param_y_axis_name_LineEdit'] = self._as.ana_param_y_axis_name_LineEdit.text()
784
        self._statusVariables['ana_param_y_axis_unit_LineEdit'] = self._as.ana_param_y_axis_unit_LineEdit.text()
785
        self._statusVariables['ana_param_second_plot_x_axis_name_LineEdit'] = self._as.ana_param_second_plot_x_axis_name_LineEdit.text()
786
        self._statusVariables['ana_param_second_plot_x_axis_unit_LineEdit'] = self._as.ana_param_second_plot_x_axis_unit_LineEdit.text()
787
        self._statusVariables['ana_param_second_plot_y_axis_name_LineEdit'] = self._as.ana_param_second_plot_y_axis_name_LineEdit.text()
788
        self._statusVariables['ana_param_second_plot_y_axis_unit_LineEdit'] = self._as.ana_param_second_plot_y_axis_unit_LineEdit.text()
789
        return
790
791
792 View Code Duplication
    def update_analysis_settings(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
793
        """ Apply the new settings """
794
        self._pa.pulse_analysis_PlotWidget.setLabel(
795
            axis='bottom',
796
            text=self._as.ana_param_x_axis_name_LineEdit.text(),
797
            units=self._as.ana_param_x_axis_unit_LineEdit.text())
798
        self._pa.pulse_analysis_PlotWidget.setLabel(
799
            axis='left',
800
            text=self._as.ana_param_y_axis_name_LineEdit.text(),
801
            units=self._as.ana_param_y_axis_unit_LineEdit.text())
802
        self._pa.pulse_analysis_second_PlotWidget.setLabel(
803
            axis='bottom',
804
            text=self._as.ana_param_second_plot_x_axis_name_LineEdit.text(),
805
            units=self._as.ana_param_second_plot_x_axis_unit_LineEdit.text())
806
        self._pa.pulse_analysis_second_PlotWidget.setLabel(
807
            axis='left',
808
            text=self._as.ana_param_second_plot_y_axis_name_LineEdit.text(),
809
            units=self._as.ana_param_second_plot_y_axis_unit_LineEdit.text())
810
        return
811
812
    def keep_former_analysis_settings(self):
813
        """ Keep the old settings """
814
        #FIXME: Implement the behaviour
815
        pass
816
817
    def show_analysis_settings(self):
818
        """ Open the Analysis Settings Window. """
819
        self._as.exec_()
820
        return
821
822
    ###########################################################################
823
    ###     Methods related to the Tab 'Analysis' in the Pulsed Window:     ###
824
    ###########################################################################
825 View Code Duplication
    def setup_toolbar(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
826
        # create all the needed control widgets on the fly and connect their
827
        # actions to each other:
828
        self._mw.pulser_on_off_PushButton = QtWidgets.QPushButton()
829
        self._mw.pulser_on_off_PushButton.setText('Pulser ON')
830
        self._mw.pulser_on_off_PushButton.setToolTip('Switch the device on and off.')
831
        self._mw.pulser_on_off_PushButton.setCheckable(True)
832
        self._mw.control_ToolBar.addWidget(self._mw.pulser_on_off_PushButton)
833
834
        self._mw.clear_device_PushButton = QtWidgets.QPushButton(self._mw)
835
        self._mw.clear_device_PushButton.setText('Clear Pulser')
836
        self._mw.clear_device_PushButton.setToolTip(
837
            'Clear the Pulser Device Memory\nfrom all loaded files.')
838
        self._mw.control_ToolBar.addWidget(self._mw.clear_device_PushButton)
839
840
        self._mw.current_loaded_asset_Label = QtWidgets.QLabel(self._mw)
841
        sizepolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred,
842
                                           QtWidgets.QSizePolicy.Fixed)
843
        sizepolicy.setHorizontalStretch(0)
844
        sizepolicy.setVerticalStretch(0)
845
        sizepolicy.setHeightForWidth(
846
            self._mw.current_loaded_asset_Label.sizePolicy().hasHeightForWidth())
847
        self._mw.current_loaded_asset_Label.setSizePolicy(sizepolicy)
848
        self._mw.current_loaded_asset_Label.setText('  No Asset Loaded')
849
        self._mw.current_loaded_asset_Label.setToolTip('Display the currently loaded asset.')
850
        self._mw.control_ToolBar.addWidget(self._mw.current_loaded_asset_Label)
851
852
        self._mw.save_tag_LineEdit = QtWidgets.QLineEdit()
853
        self._mw.save_tag_LineEdit.setMaximumWidth(200)
854
        self._mw.save_ToolBar.addWidget(self._mw.save_tag_LineEdit)
855
856 View Code Duplication
    def setup_extraction_ui(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
857
        self.lasertrace_image = pg.PlotDataItem(np.array(range(10)), np.zeros(10), pen=palette.c1)
858
        self._pe.laserpulses_PlotWidget.addItem(self.lasertrace_image)
859
        self._pe.laserpulses_PlotWidget.addItem(self.sig_start_line)
860
        self._pe.laserpulses_PlotWidget.addItem(self.sig_end_line)
861
        self._pe.laserpulses_PlotWidget.addItem(self.ref_start_line)
862
        self._pe.laserpulses_PlotWidget.addItem(self.ref_end_line)
863
        self._pe.laserpulses_PlotWidget.setLabel('bottom', 'bins')
864
865
    def _activate_analysis_ui(self, e):
866
        """ Initialize, connect and configure the 'Analysis' Tab.
867
868
        @param object e: Fysom.event object from Fysom class. A more detailed
869
                         explanation can be found in the method initUI.
870
        """
871
        # FIXME: Implement second plot
872
        self._pa.second_plot_GroupBox.setVisible(False)
873
        # Configure the main pulse analysis display:
874
        self.signal_image = pg.PlotDataItem(np.array(range(10)), np.zeros(10), pen=palette.c1)
875
        self._pa.pulse_analysis_PlotWidget.addItem(self.signal_image)
876
        self.signal_image2 = pg.PlotDataItem(pen=palette.c3)
877
        self._pa.pulse_analysis_PlotWidget.addItem(self.signal_image2)
878
        self._pa.pulse_analysis_PlotWidget.showGrid(x=True, y=True, alpha=0.8)
879
880
        # Configure the fit of the data in the main pulse analysis display:
881
        self.fit_image = pg.PlotDataItem(pen=palette.c2)
882
        self._pa.pulse_analysis_PlotWidget.addItem(self.fit_image)
883
        self._pa.fit_param_fit_func_ComboBox.clear()
884
        self._pa.fit_param_fit_func_ComboBox.addItems(self._pulsed_master_logic.get_fit_functions())
885
886
        # Configure the errorbars of the data in the main pulse analysis display:
887
        self.signal_image_error_bars = pg.ErrorBarItem(
888
            x=np.array(range(10)),
889
            y=np.zeros(10),
890
            top=0.,
891
            bottom=0.,
892
            pen=palette.c1)
893
        self.signal_image_error_bars2 = pg.ErrorBarItem(
894
            x=np.array(range(10)),
895
            y=np.zeros(10),
896
            top=0.,
897
            bottom=0.,
898
            pen=palette.c3)
899
900
        # Configure the second pulse analysis display:
901
        self.second_plot_image = pg.PlotDataItem(np.array(range(10)), np.zeros(10), pen=palette.c1)
902
        self._pa.pulse_analysis_second_PlotWidget.addItem(self.second_plot_image)
903
        self._pa.pulse_analysis_second_PlotWidget.showGrid(x=True, y=True, alpha=0.8)
904
905
        # Configure the lasertrace plot display:
906
        self.sig_start_line = pg.InfiniteLine(pos=0, pen=QtGui.QPen(palette.c3), movable=True)
907
        self.sig_start_line.setHoverPen(QtGui.QPen(palette.c2))
908
        self.sig_end_line = pg.InfiniteLine(pos=0, pen=QtGui.QPen(palette.c3), movable=True)
909
        self.sig_end_line.setHoverPen(QtGui.QPen(palette.c2))
910
        self.ref_start_line = pg.InfiniteLine(pos=0, pen=QtGui.QPen(palettedark.c4), movable=True)
911
        self.ref_start_line.setHoverPen(QtGui.QPen(palette.c4))
912
        self.ref_end_line = pg.InfiniteLine(pos=0, pen=QtGui.QPen(palettedark.c4), movable=True)
913
        self.ref_end_line.setHoverPen(QtGui.QPen(palette.c4))
914
        # Configure the measuring error display:
915
        self.measuring_error_image = pg.PlotDataItem(
916
            np.array(range(10)),
917
            np.zeros(10),
918
            pen=palette.c1)
919
        self.measuring_error_image2 = pg.PlotDataItem(
920
            np.array(range(10)),
921
            np.zeros(10),
922
            pen=palette.c3)
923
        self._pe.measuring_error_PlotWidget.addItem(self.measuring_error_image)
924
        self._pe.measuring_error_PlotWidget.addItem(self.measuring_error_image2)
925
        self._pe.measuring_error_PlotWidget.setLabel('left', 'measuring error', units='a.u.')
926
        self._pe.measuring_error_PlotWidget.setLabel('bottom', 'tau', units='ns')
927
928
929
        # set boundaries
930
        self._pe.slider_conv_std_dev.setRange(1, 200)
931
        self._pe.conv_std_dev.setRange(1, 200)
932
933
        # ---------------------------------------------------------------------
934
        #                         Connect signals
935
        # ---------------------------------------------------------------------
936
        # connect update signals from logic
937
        self._pulsed_master_logic.sigSignalDataUpdated.connect(self.signal_data_updated)
938
        self._pulsed_master_logic.sigLaserDataUpdated.connect(self.laser_data_updated)
939
        self._pulsed_master_logic.sigLaserToShowUpdated.connect(self.laser_to_show_updated)
940
        self._pulsed_master_logic.sigElapsedTimeUpdated.connect(self.elapsed_time_updated)
941
        self._pulsed_master_logic.sigFitUpdated.connect(self.fit_data_updated)
942
        self._pulsed_master_logic.sigMeasurementStatusUpdated.connect(self.measurement_status_updated)
943
        self._pulsed_master_logic.sigPulserRunningUpdated.connect(self.pulser_running_updated)
944
        self._pulsed_master_logic.sigFastCounterSettingsUpdated.connect(self.fast_counter_settings_updated)
945
        self._pulsed_master_logic.sigMeasurementSequenceSettingsUpdated.connect(self.measurement_sequence_settings_updated)
946
        self._pulsed_master_logic.sigPulserSettingsUpdated.connect(self.pulse_generator_settings_updated)
947
        self._pulsed_master_logic.sigUploadedAssetsUpdated.connect(self.update_uploaded_assets)
948
        self._pulsed_master_logic.sigLoadedAssetUpdated.connect(self.update_loaded_asset)
949
        self._pulsed_master_logic.sigExtMicrowaveSettingsUpdated.connect(self.microwave_settings_updated)
950
        self._pulsed_master_logic.sigExtMicrowaveRunningUpdated.connect(self.microwave_running_updated)
951
        self._pulsed_master_logic.sigTimerIntervalUpdated.connect(self.measurement_timer_updated)
952
        self._pulsed_master_logic.sigAnalysisWindowsUpdated.connect(self.analysis_windows_updated)
953
        self._pulsed_master_logic.sigAnalysisMethodUpdated.connect(self.analysis_method_updated)
954
955
        # connect button click signals
956
        self._pg.upload_ensemble_PushButton.clicked.connect(self.upload_ensemble_clicked)
957
        self._pg.load_ensemble_PushButton.clicked.connect(self.load_ensemble_clicked)
958
        # self._pg.upload_sequence_PushButton.clicked.connect(self.upload_sequence_clicked)
959
        # self._pg.load_sequence_PushButton.clicked.connect(self.load_sequence_clicked)
960
        self._mw.pulser_on_off_PushButton.clicked.connect(self.pulser_on_off_clicked)
961
        self._mw.clear_device_PushButton.clicked.connect(self.clear_pulser_clicked)
962
        self._pa.fit_param_PushButton.clicked.connect(self.fit_clicked)
963
964
        # connect action trigger signals
965
        self._mw.action_run_stop.triggered.connect(self.measurement_run_stop_clicked)
966
        self._mw.action_continue_pause.triggered.connect(self.measurement_continue_pause_clicked)
967
        self._mw.action_pull_data.triggered.connect(self.pull_data_clicked)
968
        self._mw.action_save.triggered.connect(self.save_clicked)
969
        self._mw.action_Settings_Analysis.triggered.connect(self.show_analysis_settings)
970
971
        # connect checkbox click signals
972
        self._pa.ext_control_use_mw_CheckBox.stateChanged.connect(self.ext_mw_params_changed)
973
        self._pa.ana_param_x_axis_defined_CheckBox.stateChanged.connect(self.toggle_laser_xaxis_editor)
974
        self._pa.ana_param_laserpulse_defined_CheckBox.stateChanged.connect(self.toggle_laser_xaxis_editor)
975
        self._pa.ana_param_alternating_CheckBox.stateChanged.connect(self.measurement_sequence_settings_changed)
976
        self._pa.ana_param_ignore_first_CheckBox.stateChanged.connect(self.measurement_sequence_settings_changed)
977
        self._pa.ana_param_ignore_last_CheckBox.stateChanged.connect(self.measurement_sequence_settings_changed)
978
        self._pe.laserpulses_display_raw_CheckBox.stateChanged.connect(self.laser_to_show_changed)
979
        self._pa.ana_param_errorbars_CheckBox.stateChanged.connect(self.toggle_error_bars)
980
        self._pa.pulser_use_interleave_CheckBox.stateChanged.connect(self.pulse_generator_settings_changed)
981
982
        # connect spinbox changed signals
983
        self._pa.ana_param_num_laser_pulse_SpinBox.editingFinished.connect(self.measurement_sequence_settings_changed)
984
        self._pa.ana_param_record_length_SpinBox.editingFinished.connect(self.fast_counter_settings_changed)
985
        self._pa.time_param_ana_periode_DoubleSpinBox.editingFinished.connect(self.measurement_timer_changed)
986
        self._pa.ext_control_mw_freq_DoubleSpinBox.editingFinished.connect(self.ext_mw_params_changed)
987
        self._pa.ext_control_mw_power_DoubleSpinBox.editingFinished.connect(self.ext_mw_params_changed)
988
        self._pa.pulser_sample_freq_DSpinBox.editingFinished.connect(self.pulse_generator_settings_changed)
989
        self._pa.ana_param_x_axis_start_ScienDSpinBox.editingFinished.connect(self.measurement_sequence_settings_changed)
990
        self._pa.ana_param_x_axis_inc_ScienDSpinBox.editingFinished.connect(self.measurement_sequence_settings_changed)
991
        self._pe.extract_param_ana_window_start_SpinBox.editingFinished.connect(self.analysis_windows_changed)
992
        self._pe.extract_param_ana_window_width_SpinBox.editingFinished.connect(self.analysis_windows_changed)
993
        self._pe.extract_param_ref_window_start_SpinBox.editingFinished.connect(self.analysis_windows_changed)
994
        self._pe.extract_param_ref_window_width_SpinBox.editingFinished.connect(self.analysis_windows_changed)
995
        self._pe.conv_std_dev.valueChanged.connect(self.conv_std_dev_changed)
996
997
        # connect combobox changed signals
998
        self._pa.ana_param_fc_bins_ComboBox.currentIndexChanged.connect(self.fast_counter_settings_changed)
999
        #self._pa.second_plot_ComboBox.currentIndexChanged.connect(self.change_second_plot)
1000
        self._pa.pulser_activation_config_ComboBox.currentIndexChanged.connect(self.pulse_generator_settings_changed)
1001
        self._pe.laserpulses_ComboBox.currentIndexChanged.connect(self.laser_to_show_changed)
1002
1003
        # connect other widgets changed signals
1004
        self.sig_start_line.sigPositionChanged.connect(self.analysis_windows_line_changed)
1005
        self.sig_end_line.sigPositionChanged.connect(self.analysis_windows_line_changed)
1006
        self.ref_start_line.sigPositionChanged.connect(self.analysis_windows_line_changed)
1007
        self.ref_end_line.sigPositionChanged.connect(self.analysis_windows_line_changed)
1008
        self._pe.slider_conv_std_dev.sliderReleased.connect(self.slider_conv_std_dev_changed)
1009
1010
        # apply hardware constraints
1011
        self._analysis_apply_hardware_constraints()
1012
1013
        # initialize values
1014
        self._pulsed_master_logic.request_measurement_init_values()
1015
        return
1016
1017
    def _deactivate_analysis_ui(self, e):
1018
        """ Disconnects the configuration for 'Analysis' Tab.
1019
1020
       @param object e: Fysom.event object from Fysom class. A more detailed
1021
                         explanation can be found in the method initUI.
1022
        """
1023
        self.measurement_run_stop_clicked(False)
1024
1025
        self._statusVariables['ana_param_x_axis_defined_CheckBox'] = self._pa.ana_param_x_axis_defined_CheckBox.isChecked()
1026
        self._statusVariables['ana_param_laserpulse_defined_CheckBox'] = self._pa.ana_param_laserpulse_defined_CheckBox.isChecked()
1027
        self._statusVariables['ana_param_ignore_first_CheckBox'] = self._pa.ana_param_ignore_first_CheckBox.isChecked()
1028
        self._statusVariables['ana_param_ignore_last_CheckBox'] = self._pa.ana_param_ignore_last_CheckBox.isChecked()
1029
        self._statusVariables['ana_param_errorbars_CheckBox'] = self._pa.ana_param_errorbars_CheckBox.isChecked()
1030
        self._statusVariables['second_plot_ComboBox_text'] = self._pa.second_plot_ComboBox.currentText()
1031
1032
        # disconnect signals
1033
        self._pulsed_master_logic.sigSignalDataUpdated.disconnect()
1034
        self._pulsed_master_logic.sigLaserDataUpdated.disconnect()
1035
        self._pulsed_master_logic.sigLaserToShowUpdated.disconnect()
1036
        self._pulsed_master_logic.sigElapsedTimeUpdated.disconnect()
1037
        self._pulsed_master_logic.sigFitUpdated.disconnect()
1038
        self._pulsed_master_logic.sigMeasurementStatusUpdated.disconnect()
1039
        self._pulsed_master_logic.sigPulserRunningUpdated.disconnect()
1040
        self._pulsed_master_logic.sigFastCounterSettingsUpdated.disconnect()
1041
        self._pulsed_master_logic.sigMeasurementSequenceSettingsUpdated.disconnect()
1042
        self._pulsed_master_logic.sigPulserSettingsUpdated.disconnect()
1043
        self._pulsed_master_logic.sigUploadedAssetsUpdated.disconnect()
1044
        self._pulsed_master_logic.sigLoadedAssetUpdated.disconnect()
1045
        self._pulsed_master_logic.sigExtMicrowaveSettingsUpdated.disconnect()
1046
        self._pulsed_master_logic.sigExtMicrowaveRunningUpdated.disconnect()
1047
        self._pulsed_master_logic.sigTimerIntervalUpdated.disconnect()
1048
        self._pulsed_master_logic.sigAnalysisWindowsUpdated.disconnect()
1049
        self._pulsed_master_logic.sigAnalysisMethodUpdated.disconnect()
1050
        self._pg.upload_ensemble_PushButton.clicked.disconnect()
1051
        self._pg.load_ensemble_PushButton.clicked.disconnect()
1052
        # self._pg.upload_sequence_PushButton.clicked.disconnect()
1053
        # self._pg.load_sequence_PushButton.clicked.disconnect()
1054
        self._mw.pulser_on_off_PushButton.clicked.disconnect()
1055
        self._mw.clear_device_PushButton.clicked.disconnect()
1056
        self._pa.fit_param_PushButton.clicked.disconnect()
1057
        self._mw.action_run_stop.triggered.disconnect()
1058
        self._mw.action_continue_pause.triggered.disconnect()
1059
        self._mw.action_pull_data.triggered.disconnect()
1060
        self._mw.action_save.triggered.disconnect()
1061
        self._mw.action_Settings_Analysis.triggered.disconnect()
1062
        self._pa.ext_control_use_mw_CheckBox.stateChanged.disconnect()
1063
        self._pa.ana_param_x_axis_defined_CheckBox.stateChanged.disconnect()
1064
        self._pa.ana_param_laserpulse_defined_CheckBox.stateChanged.disconnect()
1065
        self._pa.ana_param_alternating_CheckBox.stateChanged.disconnect()
1066
        self._pa.ana_param_ignore_first_CheckBox.stateChanged.disconnect()
1067
        self._pa.ana_param_ignore_last_CheckBox.stateChanged.disconnect()
1068
        self._pe.laserpulses_display_raw_CheckBox.stateChanged.disconnect()
1069
        self._pa.ana_param_errorbars_CheckBox.stateChanged.disconnect()
1070
        self._pa.pulser_use_interleave_CheckBox.stateChanged.disconnect()
1071
        self._pa.ana_param_num_laser_pulse_SpinBox.editingFinished.disconnect()
1072
        self._pa.ana_param_record_length_SpinBox.editingFinished.disconnect()
1073
        self._pa.time_param_ana_periode_DoubleSpinBox.editingFinished.disconnect()
1074
        self._pa.ext_control_mw_freq_DoubleSpinBox.editingFinished.disconnect()
1075
        self._pa.ext_control_mw_power_DoubleSpinBox.editingFinished.disconnect()
1076
        self._pa.pulser_sample_freq_DSpinBox.editingFinished.disconnect()
1077
        self._pa.ana_param_x_axis_start_ScienDSpinBox.editingFinished.disconnect()
1078
        self._pa.ana_param_x_axis_inc_ScienDSpinBox.editingFinished.disconnect()
1079
        self._pe.extract_param_ana_window_start_SpinBox.editingFinished.disconnect()
1080
        self._pe.extract_param_ana_window_width_SpinBox.editingFinished.disconnect()
1081
        self._pe.extract_param_ref_window_start_SpinBox.editingFinished.disconnect()
1082
        self._pe.extract_param_ref_window_width_SpinBox.editingFinished.disconnect()
1083
        self._pe.conv_std_dev.valueChanged.disconnect()
1084
        self._pa.ana_param_fc_bins_ComboBox.currentIndexChanged.disconnect()
1085
        #self._pa.second_plot_ComboBox.currentIndexChanged.disconnect()
1086
        self._pa.pulser_activation_config_ComboBox.currentIndexChanged.disconnect()
1087
        self._pe.laserpulses_ComboBox.currentIndexChanged.disconnect()
1088
        self.sig_start_line.sigPositionChanged.disconnect()
1089
        self.sig_end_line.sigPositionChanged.disconnect()
1090
        self.ref_start_line.sigPositionChanged.disconnect()
1091
        self.ref_end_line.sigPositionChanged.disconnect()
1092
        self._pe.slider_conv_std_dev.sliderReleased.disconnect()
1093
        return
1094
1095 View Code Duplication
    def _analysis_apply_hardware_constraints(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1096
        """
1097
        Retrieve the constraints from pulser and fast counter hardware and apply these constraints
1098
        to the analysis tab GUI elements.
1099
        """
1100
        # block signals
1101
        self._pa.pulser_activation_config_ComboBox.blockSignals(True)
1102
        self._pa.ana_param_fc_bins_ComboBox.blockSignals(True)
1103
        # apply constraints
1104
        pulser_constr, fastcounter_constr = self._pulsed_master_logic.get_hardware_constraints()
1105
        sample_min = pulser_constr['sample_rate']['min']
1106
        sample_max = pulser_constr['sample_rate']['max']
1107
        sample_step = pulser_constr['sample_rate']['step']
1108
        self._pa.pulser_sample_freq_DSpinBox.setMinimum(sample_min)
1109
        self._pa.pulser_sample_freq_DSpinBox.setMaximum(sample_max)
1110
        self._pa.pulser_sample_freq_DSpinBox.setSingleStep(sample_step)
1111
        self._pa.pulser_activation_config_ComboBox.clear()
1112
        self._pa.pulser_activation_config_ComboBox.addItems(list(pulser_constr['activation_config']))
1113
        self._pa.ana_param_fc_bins_ComboBox.clear()
1114
        for binwidth in fastcounter_constr['hardware_binwidth_list']:
1115
            self._pa.ana_param_fc_bins_ComboBox.addItem(str(binwidth))
1116
        # unblock signals
1117
        self._pa.pulser_activation_config_ComboBox.blockSignals(False)
1118
        self._pa.ana_param_fc_bins_ComboBox.blockSignals(False)
1119
        return
1120
1121
    def measurement_run_stop_clicked(self, isChecked):
1122
        """ Manages what happens if pulsed measurement is started or stopped.
1123
1124
        @param bool isChecked: start scan if that is possible
1125
        """
1126
        if isChecked:
1127
            self._pulsed_master_logic.start_measurement()
1128
        else:
1129
            self._pulsed_master_logic.stop_measurement()
1130
        return
1131
1132
    #ToDo: I think that is not really working yet. Yeap, true....
1133
    def measurement_continue_pause_clicked(self, isChecked):
1134
        """ Continues and pauses the measurement. """
1135
        if isChecked:
1136
            self._pulsed_master_logic.pause_measurement()
1137
        else:
1138
            self._pulsed_master_logic.continue_measurement()
1139
        return
1140
1141
    def measurement_status_updated(self, is_running, is_paused):
1142
        """
1143
1144
        @param is_running:
1145
        @param is_paused:
1146
        @return:
1147
        """
1148
        # block signals
1149
        self._mw.action_run_stop.blockSignals(True)
1150
        self._mw.action_continue_pause.blockSignals(True)
1151
1152
        # Enable/Disable widgets
1153
        if is_running:
1154
            self._pa.ext_control_use_mw_CheckBox.setEnabled(False)
1155
            self._pa.ext_control_mw_freq_DoubleSpinBox.setEnabled(False)
1156
            self._pa.ext_control_mw_power_DoubleSpinBox.setEnabled(False)
1157
            self._pa.pulser_sample_freq_DSpinBox.setEnabled(False)
1158
            self._pa.pulser_activation_config_ComboBox.setEnabled(False)
1159
            self._pa.ana_param_fc_bins_ComboBox.setEnabled(False)
1160
            self._pa.ana_param_laserpulse_defined_CheckBox.setEnabled(False)
1161
            self._pa.ana_param_num_laser_pulse_SpinBox.setEnabled(False)
1162
            self._pa.ana_param_record_length_SpinBox.setEnabled(False)
1163
            self._pa.ana_param_ignore_first_CheckBox.setEnabled(False)
1164
            self._pa.ana_param_ignore_last_CheckBox.setEnabled(False)
1165
            self._pa.ana_param_alternating_CheckBox.setEnabled(False)
1166
            self._pa.ana_param_x_axis_defined_CheckBox.setEnabled(False)
1167
            self._pa.ana_param_x_axis_start_ScienDSpinBox.setEnabled(False)
1168
            self._pa.ana_param_x_axis_inc_ScienDSpinBox.setEnabled(False)
1169
            self._pg.load_ensemble_PushButton.setEnabled(False)
1170
            # self._pg.load_sequence_PushButton.setEnabled(False)
1171
            self._mw.pulser_on_off_PushButton.setEnabled(False)
1172
            self._mw.action_continue_pause.setEnabled(True)
1173
            self._mw.action_pull_data.setEnabled(True)
1174
            if not self._mw.action_run_stop.isChecked():
1175
                self._mw.action_run_stop.toggle()
1176
        else:
1177
            self._pa.ext_control_use_mw_CheckBox.setEnabled(True)
1178
            self._pa.ext_control_mw_freq_DoubleSpinBox.setEnabled(True)
1179
            self._pa.ext_control_mw_power_DoubleSpinBox.setEnabled(True)
1180
            self._pa.pulser_sample_freq_DSpinBox.setEnabled(True)
1181
            self._pa.pulser_activation_config_ComboBox.setEnabled(True)
1182
            self._pa.ana_param_fc_bins_ComboBox.setEnabled(True)
1183
            self._pa.ana_param_laserpulse_defined_CheckBox.setEnabled(True)
1184
            self._pa.ana_param_num_laser_pulse_SpinBox.setEnabled(True)
1185
            self._pa.ana_param_record_length_SpinBox.setEnabled(True)
1186
            self._pa.ana_param_ignore_first_CheckBox.setEnabled(True)
1187
            self._pa.ana_param_ignore_last_CheckBox.setEnabled(True)
1188
            self._pa.ana_param_alternating_CheckBox.setEnabled(True)
1189
            self._pa.ana_param_x_axis_defined_CheckBox.setEnabled(True)
1190
            self._pa.ana_param_x_axis_start_ScienDSpinBox.setEnabled(True)
1191
            self._pa.ana_param_x_axis_inc_ScienDSpinBox.setEnabled(True)
1192
            self._pg.load_ensemble_PushButton.setEnabled(True)
1193
            # self._pg.load_sequence_PushButton.setEnabled(True)
1194
            self._mw.pulser_on_off_PushButton.setEnabled(True)
1195
            self._mw.action_continue_pause.setEnabled(False)
1196
            self._mw.action_pull_data.setEnabled(False)
1197
            if self._mw.action_run_stop.isChecked():
1198
                self._mw.action_run_stop.toggle()
1199
        if is_paused:
1200
            if not self._mw.action_continue_pause.isChecked():
1201
                self._mw.action_continue_pause.toggle()
1202
        else:
1203
            if self._mw.action_continue_pause.isChecked():
1204
                self._mw.action_continue_pause.toggle()
1205
        # unblock signals
1206
        self._mw.action_run_stop.blockSignals(False)
1207
        self._mw.action_continue_pause.blockSignals(False)
1208
        return
1209
1210
    def pull_data_clicked(self):
1211
        """ Pulls and analysis the data when the 'action_pull_data'-button is clicked. """
1212
        self._pulsed_master_logic.manually_pull_data()
1213
        return
1214
1215 View Code Duplication
    def signal_data_updated(self, x_data, y_signal_data, y2_signal_data, y_error_data, y2_error_data):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1216
        """
1217
1218
        @param x_data:
1219
        @param y_signal_data:
1220
        @param y2_signal_data:
1221
        @param y_error_data:
1222
        @param y2_error_data:
1223
        @return:
1224
        """
1225
        show_error_bars = self._pa.ana_param_errorbars_CheckBox.isChecked()
1226
        is_alternating = self._pa.ana_param_alternating_CheckBox.isChecked()
1227
        if show_error_bars:
1228
            beamwidth = np.inf
1229
            for i in range(len(x_data) - 1):
1230
                width = x_data[i + 1] - x_data[i]
1231
                width = width / 3
1232
                if width <= beamwidth:
1233
                    beamwidth = width
1234
            # create ErrorBarItems
1235
            self.signal_image_error_bars.setData(x=x_data, y=y_signal_data, top=y_error_data,
1236
                                                 bottom=y_error_data, beam=beamwidth)
1237
            if is_alternating:
1238
                self.signal_image_error_bars2.setData(x=x_data, y=y2_signal_data, top=y2_error_data,
1239
                                                      bottom=y2_error_data, beam=beamwidth)
1240
            if not self.signal_image_error_bars in self._pa.pulse_analysis_PlotWidget.items():
1241
                self._pa.pulse_analysis_PlotWidget.addItem(self.signal_image_error_bars)
1242
                if is_alternating:
1243
                    self._pa.pulse_analysis_PlotWidget.addItem(self.signal_image_error_bars2)
1244
        else:
1245
            if self.signal_image_error_bars in self._pa.pulse_analysis_PlotWidget.items():
1246
                self._pa.pulse_analysis_PlotWidget.removeItem(self.signal_image_error_bars)
1247
                if is_alternating:
1248
                    self._pa.pulse_analysis_PlotWidget.addItem(self.signal_image_error_bars2)
1249
1250
        # dealing with the actual signal
1251
        self.signal_image.setData(x=x_data, y=y_signal_data)
1252
        if is_alternating:
1253
            self.signal_image2.setData(x=x_data, y=y2_signal_data)
1254
1255
        # dealing with the error plot
1256
        self.measuring_error_image.setData(x=x_data, y=y_error_data)
1257
        if is_alternating:
1258
            self.measuring_error_image2.setData(x=x_data, y=y2_error_data)
1259
        return
1260
1261
    # FIXME: Implement that
1262
    def save_clicked(self):
1263
        """Saves the current data"""
1264
        self._mw.action_save.setEnabled(False)
1265
        save_tag = self._mw.save_tag_LineEdit.text()
1266
        self._pulsed_master_logic.save_measurement_data(save_tag)
1267
        self._mw.action_save.setEnabled(True)
1268
        return
1269
1270
    def fit_clicked(self):
1271
        """Fits the current data"""
1272
        current_fit_function = self._pa.fit_param_fit_func_ComboBox.currentText()
1273
        self._pulsed_master_logic.do_fit(current_fit_function)
1274
        return
1275
1276 View Code Duplication
    def fit_data_updated(self, fit_function, fit_data_x, fit_data_y, param_dict, result_dict):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1277
        """
1278
1279
        @param fit_function:
1280
        @param fit_data_x:
1281
        @param fit_data_y:
1282
        @param param_dict:
1283
        @param result_dict:
1284
        @return:
1285
        """
1286
        # block signals
1287
        self._pa.fit_param_fit_func_ComboBox.blockSignals(True)
1288
        # set widgets
1289
        self._pa.fit_param_results_TextBrowser.clear()
1290
        fit_text = units.create_formatted_output(param_dict)
1291
        self._pa.fit_param_results_TextBrowser.setPlainText(fit_text)
1292
        self.fit_image.setData(x=fit_data_x, y=fit_data_y)
1293
        if fit_function == 'No Fit' and self.fit_image in self._pa.pulse_analysis_PlotWidget.items():
1294
            self._pa.pulse_analysis_PlotWidget.removeItem(self.fit_image)
1295
        elif fit_function != 'No Fit' and self.fit_image not in self._pa.pulse_analysis_PlotWidget.items():
1296
            self._pa.pulse_analysis_PlotWidget.addItem(self.fit_image)
1297
        if self._pa.fit_param_fit_func_ComboBox.currentText() != fit_function:
1298
            index = self._pa.fit_param_fit_func_ComboBox.findText(fit_function)
1299
            if index >= 0:
1300
                self._pa.fit_param_fit_func_ComboBox.setCurrentIndex(index)
1301
        # unblock signals
1302
        self._pa.fit_param_fit_func_ComboBox.blockSignals(False)
1303
        return
1304
1305
    def elapsed_time_updated(self, elapsed_time, elapsed_time_str):
1306
        """
1307
        Refreshes the elapsed time and sweeps of the measurement.
1308
1309
        @param elapsed_time:
1310
        @param elapsed_time_str:
1311
        @return:
1312
        """
1313
        # block signals
1314
        self._pa.time_param_elapsed_time_LineEdit.blockSignals(True)
1315
        # Set widgets
1316
        self._pa.time_param_elapsed_time_LineEdit.setText(elapsed_time_str)
1317
        # unblock signals
1318
        self._pa.time_param_elapsed_time_LineEdit.blockSignals(True)
1319
        return
1320
1321 View Code Duplication
    def ext_mw_params_changed(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1322
        """ Shows or hides input widgets which are necessary if an external mw is turned on"""
1323
        use_ext_microwave = self._pa.ext_control_use_mw_CheckBox.isChecked()
1324
        microwave_freq = self._pa.ext_control_mw_freq_DoubleSpinBox.value()
1325
        microwave_power = self._pa.ext_control_mw_power_DoubleSpinBox.value()
1326
        if use_ext_microwave:
1327
            self._pa.ext_control_mw_freq_Label.setEnabled(True)
1328
            self._pa.ext_control_mw_freq_DoubleSpinBox.setEnabled(True)
1329
            self._pa.ext_control_mw_power_Label.setEnabled(True)
1330
            self._pa.ext_control_mw_power_DoubleSpinBox.setEnabled(True)
1331
1332
            self._pa.ext_control_mw_freq_Label.setVisible(True)
1333
            self._pa.ext_control_mw_freq_DoubleSpinBox.setVisible(True)
1334
            self._pa.ext_control_mw_power_Label.setVisible(True)
1335
            self._pa.ext_control_mw_power_DoubleSpinBox.setVisible(True)
1336
        else:
1337
            self._pa.ext_control_mw_freq_Label.setEnabled(False)
1338
            self._pa.ext_control_mw_freq_DoubleSpinBox.setEnabled(False)
1339
            self._pa.ext_control_mw_power_Label.setEnabled(False)
1340
            self._pa.ext_control_mw_power_DoubleSpinBox.setEnabled(False)
1341
1342
            self._pa.ext_control_mw_freq_Label.setVisible(False)
1343
            self._pa.ext_control_mw_freq_DoubleSpinBox.setVisible(False)
1344
            self._pa.ext_control_mw_power_Label.setVisible(False)
1345
            self._pa.ext_control_mw_power_DoubleSpinBox.setVisible(False)
1346
1347
        self._pulsed_master_logic.ext_microwave_settings_changed(microwave_freq, microwave_power,
1348
                                                                 use_ext_microwave)
1349
        return
1350
1351 View Code Duplication
    def microwave_settings_updated(self, frequency, power, use_ext_microwave):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1352
        """
1353
1354
        @param frequency:
1355
        @param power:
1356
        @param use_ext_microwave:
1357
        @return:
1358
        """
1359
        # block signals
1360
        self._pa.ext_control_mw_freq_DoubleSpinBox.blockSignals(True)
1361
        self._pa.ext_control_mw_power_DoubleSpinBox.blockSignals(True)
1362
        self._pa.ext_control_use_mw_CheckBox.blockSignals(True)
1363
        # set widgets
1364
        self._pa.ext_control_mw_freq_DoubleSpinBox.setValue(frequency)
1365
        self._pa.ext_control_mw_power_DoubleSpinBox.setValue(power)
1366
        self._pa.ext_control_use_mw_CheckBox.setChecked(use_ext_microwave)
1367
        # set visibility
1368
        if use_ext_microwave:
1369
            self._pa.ext_control_mw_freq_Label.setEnabled(True)
1370
            self._pa.ext_control_mw_freq_DoubleSpinBox.setEnabled(True)
1371
            self._pa.ext_control_mw_power_Label.setEnabled(True)
1372
            self._pa.ext_control_mw_power_DoubleSpinBox.setEnabled(True)
1373
1374
            self._pa.ext_control_mw_freq_Label.setVisible(True)
1375
            self._pa.ext_control_mw_freq_DoubleSpinBox.setVisible(True)
1376
            self._pa.ext_control_mw_power_Label.setVisible(True)
1377
            self._pa.ext_control_mw_power_DoubleSpinBox.setVisible(True)
1378
        else:
1379
            self._pa.ext_control_mw_freq_Label.setEnabled(False)
1380
            self._pa.ext_control_mw_freq_DoubleSpinBox.setEnabled(False)
1381
            self._pa.ext_control_mw_power_Label.setEnabled(False)
1382
            self._pa.ext_control_mw_power_DoubleSpinBox.setEnabled(False)
1383
1384
            self._pa.ext_control_mw_freq_Label.setVisible(False)
1385
            self._pa.ext_control_mw_freq_DoubleSpinBox.setVisible(False)
1386
            self._pa.ext_control_mw_power_Label.setVisible(False)
1387
            self._pa.ext_control_mw_power_DoubleSpinBox.setVisible(False)
1388
        # unblock signals
1389
        self._pa.ext_control_mw_freq_DoubleSpinBox.blockSignals(False)
1390
        self._pa.ext_control_mw_power_DoubleSpinBox.blockSignals(False)
1391
        self._pa.ext_control_use_mw_CheckBox.blockSignals(False)
1392
        return
1393
1394
    def microwave_running_updated(self, is_running):
1395
        """
1396
1397
        @return:
1398
        """
1399
        pass
1400
1401
    def pulse_generator_settings_changed(self):
1402
        """
1403
1404
        @return:
1405
        """
1406
        # FIXME: Properly implement amplitude and interleave
1407
        sample_rate_hz = self._pa.pulser_sample_freq_DSpinBox.value()
1408
        activation_config_name = self._pa.pulser_activation_config_ComboBox.currentText()
1409
        analogue_amplitude, dummy = self._pulsed_master_logic._measurement_logic._pulse_generator_device.get_analog_level()
1410
        interleave_on = self._pa.pulser_use_interleave_CheckBox.isChecked()
1411
        self._pulsed_master_logic.pulse_generator_settings_changed(sample_rate_hz,
1412
                                                                   activation_config_name,
1413
                                                                   analogue_amplitude,
1414
                                                                   interleave_on)
1415
        return
1416
1417 View Code Duplication
    def pulse_generator_settings_updated(self, sample_rate_hz, activation_config_name,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1418
                                         activation_config, analogue_amplitude, interleave_on):
1419
        """
1420
1421
        @param sample_rate_hz:
1422
        @param activation_config_name:
1423
        @param analogue_amplitude:
1424
        @param interleave_on:
1425
        @return:
1426
        """
1427
        # block signals
1428
        self._pa.pulser_sample_freq_DSpinBox.blockSignals(True)
1429
        self._pa.pulser_activation_config_ComboBox.blockSignals(True)
1430
        self._pa.pulser_activation_config_LineEdit.blockSignals(True)
1431
        self._pa.pulser_use_interleave_CheckBox.blockSignals(True)
1432
        # Set widgets
1433
        # FIXME: Properly implement amplitude and interleave
1434
        self._pa.pulser_sample_freq_DSpinBox.setValue(sample_rate_hz)
1435
        index = self._pa.pulser_activation_config_ComboBox.findText(activation_config_name)
1436
        self._pa.pulser_activation_config_ComboBox.setCurrentIndex(index)
1437
        config_display_str = ''
1438
        for channel in activation_config:
1439
            config_display_str += channel + ' | '
1440
        config_display_str = config_display_str[:-3]
1441
        self._pa.pulser_activation_config_LineEdit.setText(config_display_str)
1442
        self._pa.pulser_use_interleave_CheckBox.setChecked(interleave_on)
1443
        # unblock signals
1444
        self._pa.pulser_sample_freq_DSpinBox.blockSignals(False)
1445
        self._pa.pulser_activation_config_ComboBox.blockSignals(False)
1446
        self._pa.pulser_activation_config_LineEdit.blockSignals(False)
1447
        self._pa.pulser_use_interleave_CheckBox.blockSignals(False)
1448
        return
1449
1450
    def fast_counter_settings_changed(self):
1451
        """
1452
1453
        @return:
1454
        """
1455
        record_length_s = self._pa.ana_param_record_length_SpinBox.value()
1456
        bin_width_s = float(self._pa.ana_param_fc_bins_ComboBox.currentText())
1457
        self._pulsed_master_logic.fast_counter_settings_changed(bin_width_s, record_length_s)
1458
        return
1459
1460 View Code Duplication
    def fast_counter_settings_updated(self, bin_width_s, record_length_s):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1461
        """
1462
1463
        @param bin_width_s:
1464
        @param record_length_s:
1465
        @return:
1466
        """
1467
        # block signals
1468
        self._pa.ana_param_record_length_SpinBox.blockSignals(True)
1469
        self._pa.ana_param_fc_bins_ComboBox.blockSignals(True)
1470
        # set widgets
1471
        self._pa.ana_param_record_length_SpinBox.setValue(record_length_s)
1472
        index = self._pa.ana_param_fc_bins_ComboBox.findText(str(bin_width_s))
1473
        self._pa.ana_param_fc_bins_ComboBox.setCurrentIndex(index)
1474
        # unblock signals
1475
        self._pa.ana_param_record_length_SpinBox.blockSignals(False)
1476
        self._pa.ana_param_fc_bins_ComboBox.blockSignals(False)
1477
        return
1478
1479 View Code Duplication
    def measurement_sequence_settings_changed(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1480
        """
1481
1482
        @return:
1483
        """
1484
        laser_ignore_list = []
1485
        if self._pa.ana_param_ignore_first_CheckBox.isChecked():
1486
            laser_ignore_list.append(0)
1487
        if self._pa.ana_param_ignore_last_CheckBox.isChecked():
1488
            laser_ignore_list.append(-1)
1489
        alternating = self._pa.ana_param_alternating_CheckBox.isChecked()
1490
        num_of_lasers = self._pa.ana_param_num_laser_pulse_SpinBox.value()
1491
        xaxis_start = self._pa.ana_param_x_axis_start_ScienDSpinBox.value()
1492
        xaxis_incr = self._pa.ana_param_x_axis_inc_ScienDSpinBox.value()
1493
        laser_trigger_delay = self._as.ana_param_lasertrigger_delay_ScienDSpinBox.value()
1494
        # FIXME: properly implement sequence_length_s
1495
        sequence_length_s = self._pulsed_master_logic._measurement_logic.sequence_length_s
1496
        num_of_ticks = num_of_lasers - len(laser_ignore_list)
1497
        if alternating:
1498
            num_of_ticks //= 2
1499
        measurement_ticks = np.arange(xaxis_start,
1500
                                      xaxis_start + (xaxis_incr * num_of_ticks) - (xaxis_incr / 2),
1501
                                      xaxis_incr)
1502
1503
        self._pulsed_master_logic.measurement_sequence_settings_changed(measurement_ticks,
1504
                                                                        num_of_lasers,
1505
                                                                        sequence_length_s,
1506
                                                                        laser_ignore_list,
1507
                                                                        alternating,
1508
                                                                        laser_trigger_delay)
1509
        return
1510
1511 View Code Duplication
    def measurement_sequence_settings_updated(self, measurement_ticks, number_of_lasers,
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1512
                                              sequence_length_s, laser_ignore_list, alternating,
1513
                                              laser_trigger_delay):
1514
        """
1515
1516
        @param measurement_ticks:
1517
        @param number_of_lasers:
1518
        @param sequence_length_s:
1519
        @param laser_ignore_list:
1520
        @param alternating:
1521
        @param laser_trigger_delay:
1522
        @return:
1523
        """
1524
        # block signals
1525
        self._pa.ana_param_ignore_first_CheckBox.blockSignals(True)
1526
        self._pa.ana_param_ignore_last_CheckBox.blockSignals(True)
1527
        self._pa.ana_param_alternating_CheckBox.blockSignals(True)
1528
        self._pa.ana_param_num_laser_pulse_SpinBox.blockSignals(True)
1529
        self._pa.ana_param_x_axis_start_ScienDSpinBox.blockSignals(True)
1530
        self._pa.ana_param_x_axis_inc_ScienDSpinBox.blockSignals(True)
1531
        self._as.ana_param_lasertrigger_delay_ScienDSpinBox.blockSignals(True)
1532
        self._pe.laserpulses_ComboBox.blockSignals(True)
1533
        # set widgets
1534
        self._pa.ana_param_ignore_first_CheckBox.setChecked(0 in laser_ignore_list)
1535
        self._pa.ana_param_ignore_last_CheckBox.setChecked(-1 in laser_ignore_list)
1536
        self._pa.ana_param_alternating_CheckBox.setChecked(alternating)
1537
        self._pa.ana_param_num_laser_pulse_SpinBox.setValue(number_of_lasers)
1538
        self._as.ana_param_lasertrigger_delay_ScienDSpinBox.setValue(laser_trigger_delay)
1539
        self._pa.ana_param_x_axis_start_ScienDSpinBox.setValue(measurement_ticks[0])
1540
        self._pa.ana_param_x_axis_inc_ScienDSpinBox.setValue(
1541
            (measurement_ticks[-1] - measurement_ticks[0]) / (len(measurement_ticks)-1))
1542
        self._pe.laserpulses_ComboBox.addItems([str(i) for i in range(number_of_lasers+1)])
1543
        # change plots accordingly
1544
        if alternating:
1545
            if self.signal_image2 not in self._pa.pulse_analysis_PlotWidget.items():
1546
                self._pa.pulse_analysis_PlotWidget.addItem(self.signal_image2)
1547
            if self.signal_image_error_bars in self._pa.pulse_analysis_PlotWidget.items() and self.signal_image_error_bars2 not in self._pa.pulse_analysis_PlotWidget.items():
1548
                self._pa.pulse_analysis_PlotWidget.addItem(self.signal_image_error_bars2)
1549
            if self.measuring_error_image2 not in self._pe.measuring_error_PlotWidget.items():
1550
                self._pe.measuring_error_PlotWidget.addItem(self.measuring_error_image2)
1551
        else:
1552
            if self.signal_image2 in self._pa.pulse_analysis_PlotWidget.items():
1553
                self._pa.pulse_analysis_PlotWidget.removeItem(self.signal_image2)
1554
            if self.signal_image_error_bars2 in self._pa.pulse_analysis_PlotWidget.items():
1555
                self._pa.pulse_analysis_PlotWidget.removeItem(self.signal_image_error_bars2)
1556
            if self.measuring_error_image2 in self._pe.measuring_error_PlotWidget.items():
1557
                self._pe.measuring_error_PlotWidget.removeItem(self.measuring_error_image2)
1558
        # unblock signals
1559
        self._pa.ana_param_ignore_first_CheckBox.blockSignals(False)
1560
        self._pa.ana_param_ignore_last_CheckBox.blockSignals(False)
1561
        self._pa.ana_param_alternating_CheckBox.blockSignals(False)
1562
        self._pa.ana_param_num_laser_pulse_SpinBox.blockSignals(False)
1563
        self._pa.ana_param_x_axis_start_ScienDSpinBox.blockSignals(False)
1564
        self._pa.ana_param_x_axis_inc_ScienDSpinBox.blockSignals(False)
1565
        self._as.ana_param_lasertrigger_delay_ScienDSpinBox.blockSignals(False)
1566
        self._pe.laserpulses_ComboBox.blockSignals(False)
1567
        return
1568
1569 View Code Duplication
    def toggle_laser_xaxis_editor(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1570
        """ Shows or hides input widgets which are necessary if the x axis id defined or not."""
1571
        if self._pa.ana_param_x_axis_defined_CheckBox.isChecked():
1572
            self._pa.ana_param_x_axis_start_Label.setVisible(True)
1573
            self._pa.ana_param_x_axis_start_ScienDSpinBox.setVisible(True)
1574
            self._pa.ana_param_x_axis_inc_Label.setVisible(True)
1575
            self._pa.ana_param_x_axis_inc_ScienDSpinBox.setVisible(True)
1576
            self._pa.ana_param_x_axis_start_ScienDSpinBox.setEnabled(True)
1577
            self._pa.ana_param_x_axis_inc_ScienDSpinBox.setEnabled(True)
1578
        else:
1579
            self._pa.ana_param_x_axis_start_Label.setVisible(False)
1580
            self._pa.ana_param_x_axis_start_ScienDSpinBox.setVisible(False)
1581
            self._pa.ana_param_x_axis_inc_Label.setVisible(False)
1582
            self._pa.ana_param_x_axis_inc_ScienDSpinBox.setVisible(False)
1583
            self._pa.ana_param_x_axis_start_ScienDSpinBox.setEnabled(False)
1584
            self._pa.ana_param_x_axis_inc_ScienDSpinBox.setEnabled(False)
1585
1586
        if self._pa.ana_param_laserpulse_defined_CheckBox.isChecked():
1587
            self._pa.ana_param_num_laserpulses_Label.setVisible(True)
1588
            self._pa.ana_param_num_laser_pulse_SpinBox.setVisible(True)
1589
            self._pa.ana_param_record_length_Label.setVisible(True)
1590
            self._pa.ana_param_record_length_SpinBox.setVisible(True)
1591
            self._pa.ana_param_num_laser_pulse_SpinBox.setEnabled(True)
1592
            self._pa.ana_param_record_length_SpinBox.setEnabled(True)
1593
        else:
1594
            self._pa.ana_param_num_laserpulses_Label.setVisible(False)
1595
            self._pa.ana_param_num_laser_pulse_SpinBox.setVisible(False)
1596
            self._pa.ana_param_record_length_Label.setVisible(False)
1597
            self._pa.ana_param_record_length_SpinBox.setVisible(False)
1598
            self._pa.ana_param_num_laser_pulse_SpinBox.setEnabled(False)
1599
            self._pa.ana_param_record_length_SpinBox.setEnabled(False)
1600
        return
1601
1602 View Code Duplication
    def toggle_error_bars(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1603
        """
1604
1605
        @return:
1606
        """
1607
        show_bars = self._pa.ana_param_errorbars_CheckBox.isChecked()
1608
        is_alternating = self.signal_image2 in self._pa.pulse_analysis_PlotWidget.items()
1609
        if show_bars:
1610
            if self.signal_image_error_bars not in self._pa.pulse_analysis_PlotWidget.items():
1611
                self._pa.pulse_analysis_PlotWidget.addItem(self.signal_image_error_bars)
1612
            if is_alternating and self.signal_image_error_bars2 not in self._pa.pulse_analysis_PlotWidget.items():
1613
                self._pa.pulse_analysis_PlotWidget.addItem(self.signal_image_error_bars2)
1614
        else:
1615
            if self.signal_image_error_bars in self._pa.pulse_analysis_PlotWidget.items():
1616
                self._pa.pulse_analysis_PlotWidget.removeItem(self.signal_image_error_bars)
1617
            if is_alternating and self.signal_image_error_bars2 in self._pa.pulse_analysis_PlotWidget.items():
1618
                self._pa.pulse_analysis_PlotWidget.removeItem(self.signal_image_error_bars2)
1619
        return
1620
1621
    # def change_second_plot(self):
1622
    #     """ This method handles the second plot"""
1623
    #     if self._mw.second_plot_ComboBox.currentText()=='None':
1624
    #         self._mw.second_plot_GroupBox.setVisible(False)
1625
    #     else:
1626
    #         self._mw.second_plot_GroupBox.setVisible(True)
1627
    #
1628
    #         # Here FFT is seperated from the other option. The reason for that
1629
    #         # is preventing of code doubling
1630
    #         if self._mw.second_plot_ComboBox.currentText() == 'FFT':
1631
    #             fft_x, fft_y = self._pulsed_meas_logic.compute_fft()
1632
    #             self.second_plot_image.setData(fft_x, fft_y)
1633
    #             self._mw.pulse_analysis_second_PlotWidget.setLogMode(x=False, y=False)
1634
    #
1635
    #             self._mw.pulse_analysis_second_PlotWidget.setLabel(axis='bottom',
1636
    #                                                                text=self._as.ana_param_second_plot_x_axis_name_LineEdit.text(),
1637
    #                                                                units=self._as.ana_param_second_plot_x_axis_unit_LineEdit.text())
1638
    #             self._mw.pulse_analysis_second_PlotWidget.setLabel(axis='left',
1639
    #                                                                text=self._as.ana_param_second_plot_y_axis_name_LineEdit.text(),
1640
    #                                                                units=self._as.ana_param_second_plot_y_axis_unit_LineEdit.text())
1641
    #
1642
    #         else:
1643
    #             #FIXME: Is not working when there is a 0 in the values, therefore ignoring the first measurment point
1644
    #             self.second_plot_image.setData(self._pulsed_meas_logic.signal_plot_x[1:], self._pulsed_meas_logic.signal_plot_y[1:])
1645
    #
1646
    #             if self._as.ana_param_second_plot_x_axis_name_LineEdit.text()== '':
1647
    #                 self._mw.pulse_analysis_second_PlotWidget.setLabel(axis='left',
1648
    #                                                                    text=self._as.ana_param_y_axis_name_LineEdit.text(),
1649
    #                                                                    units=self._as.ana_param_y_axis_unit_LineEdit.text())
1650
    #                 self._mw.pulse_analysis_second_PlotWidget.setLabel(axis='bottom',
1651
    #                                                                    text=self._as.ana_param_x_axis_name_LineEdit.text(),
1652
    #                                                                    units=self._as.ana_param_x_axis_unit_LineEdit.text())
1653
    #
1654
    #             else:
1655
    #                 self._mw.pulse_analysis_second_PlotWidget.setLabel(axis='bottom',
1656
    #                                                                    text=self._as.ana_param_second_plot_x_axis_name_LineEdit.text(),
1657
    #                                                                    units=self._as.ana_param_second_plot_x_axis_unit_LineEdit.text())
1658
    #                 self._mw.pulse_analysis_second_PlotWidget.setLabel(axis='left',
1659
    #                                                                    text=self._as.ana_param_second_plot_y_axis_name_LineEdit.text(),
1660
    #                                                                    units=self._as.ana_param_second_plot_y_axis_unit_LineEdit.text())
1661
    #
1662
    #             if self._mw.second_plot_ComboBox.currentText() == 'unchanged data':
1663
    #                 self._mw.pulse_analysis_second_PlotWidget.setLogMode(x=False, y=False)
1664
    #
1665
    #             elif self._mw.second_plot_ComboBox.currentText() == 'Log(x)':
1666
    #                 self._mw.pulse_analysis_second_PlotWidget.setLogMode(x=True, y=False)
1667
    #
1668
    #             elif self._mw.second_plot_ComboBox.currentText() == 'Log(y)':
1669
    #                 self._mw.pulse_analysis_second_PlotWidget.setLogMode(x=False,y=True)
1670
    #
1671
    #             elif self._mw.second_plot_ComboBox.currentText() == 'Log(x)&Log(y)':
1672
    #                 self._mw.pulse_analysis_second_PlotWidget.setLogMode(x=True, y=True)
1673
1674
    def measurement_timer_changed(self):
1675
        """ This method handles the analysis timing"""
1676
        timer_interval = self._pa.time_param_ana_periode_DoubleSpinBox.value()
1677
        self._pulsed_master_logic.analysis_interval_changed(timer_interval)
1678
        return
1679
1680
    def measurement_timer_updated(self, timer_interval_s):
1681
        """
1682
1683
        @param timer_interval_s:
1684
        @return:
1685
        """
1686
        # block signals
1687
        self._pa.time_param_ana_periode_DoubleSpinBox.blockSignals(True)
1688
        # set widget
1689
        self._pa.time_param_ana_periode_DoubleSpinBox.setValue(timer_interval_s)
1690
        # unblock signals
1691
        self._pa.time_param_ana_periode_DoubleSpinBox.blockSignals(False)
1692
        return
1693
1694
    def conv_std_dev_changed(self):
1695
        """
1696
        Uodate new value of standard deviation of gaussian filter
1697
        """
1698
        # block signals
1699
        self._pe.slider_conv_std_dev.blockSignals(True)
1700
        # set widgets
1701
        std_dev = self._pe.conv_std_dev.value()
1702
        self._pe.slider_conv_std_dev.setValue(std_dev)
1703
        # unblock signals
1704
        self._pe.slider_conv_std_dev.blockSignals(False)
1705
1706
        self._pulsed_master_logic.analysis_method_changed(std_dev)
1707
        return
1708
1709
    def slider_conv_std_dev_changed(self):
1710
        """
1711
        Uodate new value of standard deviation of gaussian filter
1712
        from slider
1713
        """
1714
        # block signals
1715
        self._pe.conv_std_dev.blockSignals(True)
1716
        # set widgets
1717
        std_dev = self._pe.slider_conv_std_dev.value()
1718
        self._pe.conv_std_dev.setValue(std_dev)
1719
        # unblock signals
1720
        self._pe.conv_std_dev.blockSignals(False)
1721
1722
        self._pulsed_master_logic.analysis_method_changed(std_dev)
1723
        return
1724
1725 View Code Duplication
    def analysis_method_updated(self, gaussfilt_std_dev):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1726
        """
1727
1728
        @param gaussfilt_std_dev:
1729
        @return:
1730
        """
1731
        # block signals
1732
        self._pe.slider_conv_std_dev.blockSignals(True)
1733
        self._pe.conv_std_dev.blockSignals(True)
1734
        # set widgets
1735
        self._pe.slider_conv_std_dev.setValue(gaussfilt_std_dev)
1736
        self._pe.conv_std_dev.setValue(gaussfilt_std_dev)
1737
        # unblock signals
1738
        self._pe.slider_conv_std_dev.blockSignals(False)
1739
        self._pe.conv_std_dev.blockSignals(False)
1740
        return
1741
1742 View Code Duplication
    def analysis_windows_changed(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1743
        """
1744
1745
        @return:
1746
        """
1747
        # block signals
1748
        self.sig_start_line.blockSignals(True)
1749
        self.sig_end_line.blockSignals(True)
1750
        self.ref_start_line.blockSignals(True)
1751
        self.ref_end_line.blockSignals(True)
1752
        # get data
1753
        sig_start = self._pe.extract_param_ana_window_start_SpinBox.value()
1754
        sig_length = self._pe.extract_param_ana_window_width_SpinBox.value()
1755
        ref_start = self._pe.extract_param_ref_window_start_SpinBox.value()
1756
        ref_length = self._pe.extract_param_ref_window_width_SpinBox.value()
1757
        # update plots
1758
        self.sig_start_line.setValue(sig_start)
1759
        self.sig_end_line.setValue(sig_start + sig_length)
1760
        self.ref_start_line.setValue(ref_start)
1761
        self.ref_end_line.setValue(ref_start + ref_length)
1762
        # unblock signals
1763
        self.sig_start_line.blockSignals(False)
1764
        self.sig_end_line.blockSignals(False)
1765
        self.ref_start_line.blockSignals(False)
1766
        self.ref_end_line.blockSignals(False)
1767
1768
        self._pulsed_master_logic.analysis_windows_changed(sig_start, sig_length, ref_start,
1769
                                                           ref_length)
1770
        return
1771
1772 View Code Duplication
    def analysis_windows_line_changed(self):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1773
        """
1774
1775
        @return:
1776
        """
1777
        # block signals
1778
        self._pe.extract_param_ana_window_start_SpinBox.blockSignals(True)
1779
        self._pe.extract_param_ana_window_width_SpinBox.blockSignals(True)
1780
        self._pe.extract_param_ref_window_start_SpinBox.blockSignals(True)
1781
        self._pe.extract_param_ref_window_width_SpinBox.blockSignals(True)
1782
        # get data
1783
        sig_start = self.sig_start_line.value()
1784
        sig_length = self.sig_end_line.value() - sig_start
1785
        ref_start = self.ref_start_line.value()
1786
        ref_length = self.ref_end_line.value() - ref_start
1787
        # set widgets
1788
        self._pe.extract_param_ana_window_start_SpinBox.setValue(sig_start)
1789
        self._pe.extract_param_ana_window_width_SpinBox.setValue(sig_length)
1790
        self._pe.extract_param_ref_window_start_SpinBox.setValue(ref_start)
1791
        self._pe.extract_param_ref_window_width_SpinBox.setValue(ref_length)
1792
        # unblock signals
1793
        self._pe.extract_param_ana_window_start_SpinBox.blockSignals(False)
1794
        self._pe.extract_param_ana_window_width_SpinBox.blockSignals(False)
1795
        self._pe.extract_param_ref_window_start_SpinBox.blockSignals(False)
1796
        self._pe.extract_param_ref_window_width_SpinBox.blockSignals(False)
1797
        return
1798
1799 View Code Duplication
    def analysis_windows_updated(self, sig_start, sig_length, ref_start, ref_length):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1800
        """
1801
1802
        @param sig_start:
1803
        @param sig_length:
1804
        @param ref_start:
1805
        @param ref_length:
1806
        @return:
1807
        """
1808
        # block signals
1809
        self._pe.extract_param_ana_window_start_SpinBox.blockSignals(True)
1810
        self._pe.extract_param_ana_window_width_SpinBox.blockSignals(True)
1811
        self._pe.extract_param_ref_window_start_SpinBox.blockSignals(True)
1812
        self._pe.extract_param_ref_window_width_SpinBox.blockSignals(True)
1813
        # set widgets
1814
        self._pe.extract_param_ana_window_start_SpinBox.setValue(sig_start)
1815
        self._pe.extract_param_ana_window_width_SpinBox.setValue(sig_length)
1816
        self._pe.extract_param_ref_window_start_SpinBox.setValue(ref_start)
1817
        self._pe.extract_param_ref_window_width_SpinBox.setValue(ref_length)
1818
        # update plots
1819
        self.sig_start_line.setValue(sig_start)
1820
        self.sig_end_line.setValue(sig_start + sig_length)
1821
        self.ref_start_line.setValue(ref_start)
1822
        self.ref_end_line.setValue(ref_start + ref_length)
1823
        # unblock signals
1824
        self._pe.extract_param_ana_window_start_SpinBox.blockSignals(False)
1825
        self._pe.extract_param_ana_window_width_SpinBox.blockSignals(False)
1826
        self._pe.extract_param_ref_window_start_SpinBox.blockSignals(False)
1827
        self._pe.extract_param_ref_window_width_SpinBox.blockSignals(False)
1828
        return
1829
1830
    def laser_to_show_changed(self):
1831
        """
1832
1833
        @return:
1834
        """
1835
        current_laser = self._pe.laserpulses_ComboBox.currentText()
1836
        show_raw_data = self._pe.laserpulses_display_raw_CheckBox.isChecked()
1837
        if current_laser == 'sum':
1838
            show_laser_index = 0
1839
        else:
1840
            show_laser_index = int(current_laser)
1841
1842
        self._pulsed_master_logic.laser_to_show_changed(show_laser_index, show_raw_data)
1843
        return
1844
1845 View Code Duplication
    def laser_to_show_updated(self, laser_index, show_raw_data):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1846
        """
1847
1848
        @param laser_index:
1849
        @param show_raw_data:
1850
        @return:
1851
        """
1852
        # block signals
1853
        self._pe.laserpulses_ComboBox.blockSignals(True)
1854
        self._pe.laserpulses_display_raw_CheckBox.blockSignals(True)
1855
        # set widgets
1856
        self._pe.laserpulses_ComboBox.setCurrentIndex(laser_index)
1857
        self._pe.laserpulses_display_raw_CheckBox.setChecked(show_raw_data)
1858
        # unblock signals
1859
        self._pe.laserpulses_ComboBox.blockSignals(False)
1860
        self._pe.laserpulses_display_raw_CheckBox.blockSignals(False)
1861
        return
1862
1863
    def laser_data_updated(self, x_data, y_data):
1864
        """
1865
1866
        @param x_data:
1867
        @param y_data:
1868
        @return:
1869
        """
1870
        self.lasertrace_image.setData(x=x_data, y=y_data)
1871
        return
1872
1873
1874
1875
    ###########################################################################
1876
    ###         Methods related to the Tab 'Sequence Generator':            ###
1877
    ###########################################################################
1878
    def pulser_on_off_clicked(self, checked):
1879
        """ Manually switch the pulser output on/off. """
1880
        checked = self._mw.pulser_on_off_PushButton.isChecked()
1881
        if checked:
1882
            self._mw.pulser_on_off_PushButton.setText('Pulser OFF')
1883
            self._pulsed_master_logic.toggle_pulse_generator(True)
1884
        else:
1885
            self._mw.pulser_on_off_PushButton.setText('Pulser ON')
1886
            self._pulsed_master_logic.toggle_pulse_generator(False)
1887
        return
1888
1889 View Code Duplication
    def pulser_running_updated(self, is_running):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1890
        """
1891
1892
        @param is_running:
1893
        @return:
1894
        """
1895
        # block signals
1896
        self._mw.pulser_on_off_PushButton.blockSignals(True)
1897
        # set widgets
1898
        if is_running:
1899
            self._mw.pulser_on_off_PushButton.setText('Pulser OFF')
1900
            if not self._mw.pulser_on_off_PushButton.isChecked():
1901
                self._mw.pulser_on_off_PushButton.toggle()
1902
        else:
1903
            self._mw.pulser_on_off_PushButton.setText('Pulser ON')
1904
            if self._mw.pulser_on_off_PushButton.isChecked():
1905
                self._mw.pulser_on_off_PushButton.toggle()
1906
        # unblock signals
1907
        self._mw.pulser_on_off_PushButton.blockSignals(False)
1908
        return
1909
1910
    def clear_pulser_clicked(self):
1911
        """ Delete all loaded files in the device's current memory. """
1912
        self._pulsed_master_logic.clear_pulse_generator()
1913
        return
1914
1915
    def upload_ensemble_clicked(self):
1916
        """
1917
1918
        @return:
1919
        """
1920
        # Get the ensemble name from the ComboBox
1921
        ensemble_name = self._pg.gen_ensemble_ComboBox.currentText()
1922
        # Upload the ensemble via logic module
1923
        self._pulsed_master_logic.upload_asset(ensemble_name)
1924
        # disable button
1925
        self._pg.upload_ensemble_PushButton.setEnabled(False)
1926
        self._pg.load_ensemble_PushButton.setEnabled(False)
1927
        return
1928
1929
    # def upload_sequence_clicked(self):
1930
    #     """
1931
    #
1932
    #     @return:
1933
    #     """
1934
    #     # Get the sequence name from the ComboBox
1935
    #     seq_name = self._pg.gen_sequence_ComboBox.currentText()
1936
    #     # Upload the asset via logic module
1937
    #     self._pulsed_master_logic.upload_asset(seq_name)
1938
    #     # disable button
1939
    #     self._pg.upload_sequence_PushButton.setEnabled(False)
1940
    #     self._pg.load_sequence_PushButton.setEnabled(False)
1941
    #     return
1942
1943
    def update_uploaded_assets(self, asset_names_list):
1944
        """
1945
1946
        @param asset_names_list:
1947
        @return:
1948
        """
1949
        # enable buttons
1950
        # self._pg.upload_sequence_PushButton.setEnabled(True)
1951
        self._pg.upload_ensemble_PushButton.setEnabled(True)
1952
        self._pg.load_ensemble_PushButton.setEnabled(True)
1953
        # self._pg.load_sequence_PushButton.setEnabled(True)
1954
        return
1955
1956
    def load_ensemble_clicked(self):
1957
        """
1958
1959
        @return:
1960
        """
1961
        # Get the asset name to be uploaded from the ComboBox
1962
        asset_name = self._pg.gen_ensemble_ComboBox.currentText()
1963
        # Load asset into channles via logic module
1964
        self._pulsed_master_logic.load_asset_into_channels(asset_name, {}, False)
1965
        # disable button
1966
        self._pg.load_ensemble_PushButton.setEnabled(False)
1967
        return
1968
1969
    # def load_sequence_clicked(self):
1970
    #     """
1971
    #
1972
    #     @return:
1973
    #     """
1974
    #     # Get the asset name to be uploaded from the ComboBox
1975
    #     asset_name = self._pg.gen_sequence_ComboBox.currentText()
1976
    #     # Load asset into channles via logic module
1977
    #     self._pulsed_master_logic.load_asset_into_channels(asset_name, {}, False)
1978
    #     # disable button
1979
    #     self._pg.load_sequence_PushButton.setEnabled(False)
1980
    #     return
1981
1982 View Code Duplication
    def update_loaded_asset(self, asset_name, asset_type):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
1983
        """ Check the current loaded asset from the logic and update the display. """
1984
        label = self._mw.current_loaded_asset_Label
1985
        if asset_name is None:
1986
            label.setText(asset_type)
1987
        elif asset_type == 'PulseBlockEnsemble' or asset_type == 'PulseSequence':
1988
            label.setText('  {0} ({1})'.format(asset_name, asset_type))
1989
        else:
1990
            label.setText('  Unknown asset type')
1991
        # enable buttons
1992
        if asset_type == 'PulseBlockEnsemble':
1993
            self._pg.load_ensemble_PushButton.setEnabled(True)
1994
        elif asset_type == 'PulseSequence':
1995
            self._pg.load_sequence_PushButton.setEnabled(True)
1996
        return
1997
1998
1999
    # def save_plots(self):
2000
    #     """ Save plot from analysis graph as a picture. """
2001
    #     timestamp = datetime.datetime.now()
2002
    #     filetag = self._mw.save_tag_LineEdit.text()
2003
    #     filepath = self._save_logic.get_path_for_module(module_name='PulsedMeasurement')
2004
    #     if len(filetag) > 0:
2005
    #         filename = os.path.join(filepath, '{}_{}_pulsed'.format(timestamp.strftime('%Y%m%d-%H%M-%S'), filetag))
2006
    #     else:
2007
    #         filename = os.path.join(filepath, '{}_pulsed'.format(timestamp.strftime('%Y%m%d-%H%M-%S')))
2008
    #
2009
    #     # print(type(self._mw.second_plot_ComboBox.currentText()), self._mw.second_plot_ComboBox.currentText())
2010
    #     # pulse plot
2011
    #     # exporter = pg.exporters.SVGExporter(self._pa.pulse_analysis_PlotWidget.plotItem.scene())
2012
    #     # exporter.export(filename+'.svg')
2013
    #     #
2014
    #     # # auxiliary plot
2015
    #     # if 'None' not in self._mw.second_plot_ComboBox.currentText():
2016
    #     #     exporter_aux = pg.exporters.SVGExporter(self._mw.pulse_analysis_second_PlotWidget.plotItem.scene())
2017
    #     #     exporter_aux.export(filename + '_aux' + '.svg')
2018
    #
2019
    #     self._pulsed_meas_logic._save_data(filetag, timestamp)
2020
2021
2022
2023