class PicoPlotter(QtGui.QDialog):
	
	def set_class_vars(self):
		self.script = ones
		self.n_show = 30
		self.live_data = np.full(self.n_show, None)
	
	def __init__(self, parent):
		super(PicoPlotter, self).__init__()
		self.parent = parent
		self.set_class_vars()
		self.populate()
		
    	def populate(self):
		self.setWindowTitle('Live plotter')
		self.canvas = MplCanvas()
		self.nav = NavigationToolbar(self.canvas, self)
		'''Changed nav toolbar'''
		self.nav.addAction('Reset optimizer', self.reset_opt)
		
		self.layout = QtGui.QGridLayout()
		self.layout.setSpacing(0)
		self.layout.setContentsMargins(0, 0, 0, 0)
		
		self.layout.addWidget(self.nav)
		self.layout.addWidget(self.canvas)

		self.setLayout(self.layout)
		self.canvas.ax.set_ylim((0, 5e-5))
		self.canvas.ax.set_xlim((0, .04))
		width = self.canvas.width()
		height = self.nav.height() + self.canvas.height() + 20
		self.setFixedSize(width, height)

        	

	def reset_opt(self):
		self.live_data = np.full(self.n_show, None)
	
	def live_plot(self):
		try:
		    this_shot = self.script(self.parent.data)
		    empty_data = np.where(self.live_data == None)
		    if len(empty_data[0]) == 0:
		        self.live_data[0:self.n_show - 1] = self.live_data[1:self.n_show]
		        self.live_data[-1] = this_shot
		    else:
		        self.live_data[empty_data[0][0]] = this_shot
		except AttributeError:
		    print('Not loaded')
		    
	'''def ones(self):
		return 1
	'''	
	def show_window(self):
		self.live_plot()
		self.canvas.ax.clear()
		self.canvas.ax.plot(self.live_data)
#		self.canvas.ax.title(np.std(self.live_data))
		self.canvas.draw()
Esempio n. 2
0
class FFTPlotter(QtGui.QDialog):
    def __init__(self, data, ts, t):
        super(FFTPlotter, self).__init__()
        self.populate()
        self.show_plot(data, ts, t)

    def populate(self):
        self.canvas = MplCanvas()
        self.nav = NavigationToolbar(self.canvas, self)
        '''Changed nav toolbar'''

        self.layout = QtGui.QGridLayout()
        self.layout.setSpacing(0)
        self.layout.setContentsMargins(0, 0, 0, 0)

        self.layout.addWidget(self.nav)
        self.layout.addWidget(self.canvas)

        self.setLayout(self.layout)
        #self.canvas.ax.set_ylim((0, 5e-5))
        #self.canvas.ax.set_xlim((0, .04))
        width = self.canvas.width()
        height = self.nav.height() + self.canvas.height() + 20
        self.setFixedSize(width, height)

    def show_plot(self, data, ts, t):
        print('hello!!')
        Pxx, freqs, t0 = show_fft(data, ts, t)
        self.setWindowTitle('FFT at time {} s'.format(t0))
        self.canvas.ax.clear()
        self.canvas.ax.plot(freqs * 1e-6, Pxx)
        print(max(freqs * 1e-6))
        #self.canvas.ax.set_xlim((0, 20))
        self.canvas.ax.set_xlabel("Freq (MHz)")
        self.canvas.draw()
Esempio n. 3
0
class PMTViewer(QtGui.QDialog):
    pmt_name = None
    data_dir = None

    def __init__(self, reactor, cxn=None):
        super(PMTViewer, self).__init__(None)
        self.reactor = reactor
        self.cxn = cxn
        print self.data_dir

        self.update_id = np.random.randint(0, 2**31 - 1)
        self.loading = False
        self.connect()

    @inlineCallbacks
    def connect(self):
        if self.cxn is None:
            self.cxn = connection()
            cname = 'pmt - {} - client'.format(self.pmt_name)
            yield self.cxn.connect(name=cname)

        self.populate()
        yield self.connect_signals()

    def populate(self):
        self.setWindowTitle(self.pmt_name)
        self.canvas = MplCanvas()
        self.nav = NavigationToolbar(self.canvas, self)

        self.layout = QtGui.QGridLayout()
        self.layout.setSpacing(0)
        self.layout.setContentsMargins(0, 0, 0, 0)

        self.layout.addWidget(self.nav)
        self.layout.addWidget(self.canvas)

        self.setLayout(self.layout)

        width = self.canvas.width()
        height = self.nav.height() + self.canvas.height() + 20
        self.setFixedSize(width, height)
        self.setWindowTitle('pmt_viewer')

    @inlineCallbacks
    def connect_signals(self):
        pmt_server = yield self.cxn.get_server('pmt')
        yield pmt_server.signal__update(self.update_id)
        yield pmt_server.addListener(listener=self.receive_update,
                                     source=None,
                                     ID=self.update_id)

    def receive_update(self, c, signal_json):
        signal = json.loads(signal_json)
        for message_type, message in signal.items():
            print message_type, message
            device_message = message.get(self.pmt_name)
            if (message_type == 'record') and (device_message is not None):
                self.replot(device_message)

    def replot(self, rel_data_path):
        abs_data_path = os.path.join(self.data_dir, rel_data_path) + '.hdf5'
        with h5py.File(abs_data_path) as h5f:
            gnd = h5f['gnd']
            exc = h5f['exc']
            bac = h5f['bac']
            self.canvas.ax.clear()
            self.canvas.ax.plot(gnd, label='gnd')
            self.canvas.ax.plot(exc, label='exc')
            self.canvas.ax.plot(bac, label='bac')
            self.canvas.ax.legend()
        self.canvas.draw()

    def closeEvent(self, x):
        self.reactor.stop()
Esempio n. 4
0
class AnalogVoltageEditor(QtGui.QDialog):
    sequence_parameters = {}

    def __init__(self,
                 channel,
                 sequence,
                 config,
                 reactor=None,
                 cxn=None,
                 parent=None):
        super(AnalogVoltageEditor, self).__init__(parent)
        self.channel = str(channel)
        self.sequence = sequence
        self.ramp_maker = RampMaker
        self.config = config
        self.reactor = reactor
        self.cxn = cxn

        self.loading = False
        self.connect()

    @inlineCallbacks
    def connect(self):
        if self.cxn is None:
            self.cxn = connection()
            yield self.cxn.connect()
        self.context = yield self.cxn.context()
        #        yield self.get_sequence_parameters()
        yield self.populate()
        self.connect_signals()

    @inlineCallbacks
    def populate(self):
        self.setWindowTitle(self.channel)

        self.canvas = MplCanvas()
        self.nav = NavigationToolbar(self.canvas, self)
        self.ramp_table = RampTable(self.ramp_maker)
        self.ramp_scroll = QtGui.QScrollArea()
        self.buttons = QtGui.QDialogButtonBox(
            QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel,
            QtCore.Qt.Horizontal, self)

        self.ramp_scroll.setWidget(self.ramp_table)
        self.ramp_scroll.setFixedHeight(
            self.ramp_table.height() +
            self.ramp_scroll.horizontalScrollBar().height() - 10)
        self.ramp_scroll.setWidgetResizable(True)
        self.buttons.button(QtGui.QDialogButtonBox.Ok).setDefault(False)

        self.layout = QtGui.QGridLayout()
        self.layout.setSpacing(0)
        self.layout.setContentsMargins(0, 0, 0, 0)

        self.layout.addWidget(self.nav)
        self.layout.addWidget(self.canvas)
        self.layout.addWidget(self.ramp_scroll)
        self.layout.addWidget(self.buttons)

        self.setLayout(self.layout)

        width = self.canvas.width()
        height = self.nav.height() + self.canvas.height(
        ) + self.ramp_scroll.height() + 20
        self.setFixedSize(width, height)
        yield self.set_columns()
        yield self.replot()

    @inlineCallbacks
    def connect_signals(self):
        # pyqt signals
        for c in self.ramp_table.cols:
            c.ramp_select.currentIndexChanged.connect(self.replot)
            for pw in c.parameter_widgets.values():
                for pb in pw.pboxes.values():
                    pb.returnPressed.connect(self.replot)

        for i, c in enumerate(self.ramp_table.cols):
            c.add.clicked.connect(self.add_column(i))
            c.dlt.clicked.connect(self.dlt_column(i))

            c.zero_button.clicked.connect(self.zero_column(i))
            c.prev_button.clicked.connect(self.prev_column(i))
            c.next_button.clicked.connect(self.next_column(i))
#            c.all_zero.clicked.connect(self.all_zero(i))

        self.buttons.accepted.connect(self.accept)
        self.buttons.rejected.connect(self.reject)

        # labrad signals
        conductor = yield self.cxn.get_server(self.config.conductor_servername)
        yield conductor.signal__parameters_updated(
            self.config.conductor_update_id)
        yield conductor.addListener(listener=self.receive_parameters,
                                    source=None,
                                    ID=self.config.conductor_update_id)

    @inlineCallbacks
    def get_sequence_parameters(self):
        conductor = yield self.cxn.get_server(self.config.conductor_servername)
        sp = yield conductor.set_sequence_parameters()
        self.sequence_parameters = json.loads(sp)

    @inlineCallbacks
    def receive_parameters(self, c, signal):
        yield self.replot()

    @inlineCallbacks
    def set_columns(self):
        self.loading = True
        for c in self.ramp_table.cols:
            c.hide()

        for s, c in zip(self.sequence[self.channel], self.ramp_table.cols):
            ramp_type = s['type']
            c.show()
            c.ramp_select.setCurrentIndex(c.ramp_select.findText(ramp_type))
            for k in c.parameter_widgets[ramp_type].pboxes.keys():
                c.parameter_widgets[ramp_type].pboxes[k].display(s[k])

        self.loading = False
        yield self.replot()

    def add_column(self, i):
        def ac():
            sequence = self.get_sequence()
            for c in sequence.keys():
                sequence[c].insert(i, sequence[c][i])

            scroll_position = self.ramp_scroll.horizontalScrollBar().value()
            self.set_sequence(sequence)
            self.ramp_scroll.horizontalScrollBar().setValue(scroll_position)

        return ac

    def dlt_column(self, i):
        def dc():
            sequence = self.get_sequence()
            for c in sequence.keys():
                sequence[c].pop(i)

            scroll_position = self.ramp_scroll.horizontalScrollBar().value()
            self.set_sequence(sequence)
            self.ramp_scroll.horizontalScrollBar().setValue(scroll_position)

        return dc

    def zero_column(self, i):
        def zc():
            sequence = self.get_sequence()
            dt = sequence[self.channel][i]['dt']
            sequence[self.channel][i] = {'dt': dt, 'type': 's', 'vf': 0.0}

            scroll_position = self.ramp_scroll.horizontalScrollBar().value()
            self.set_sequence(sequence)
            self.ramp_scroll.horizontalScrollBar().setValue(scroll_position)

        return zc

    def prev_column(self, i):
        def pc():
            sequence = self.get_sequence()
            if i > 0:
                dt = sequence[self.channel][i]['dt']
                sequence[self.channel][i] = deepcopy(sequence[self.channel][i -
                                                                            1])
                sequence[self.channel][i]['dt'] = dt

            scroll_position = self.ramp_scroll.horizontalScrollBar().value()
            self.set_sequence(sequence)
            self.ramp_scroll.horizontalScrollBar().setValue(scroll_position)

        return pc

    def next_column(self, i):
        def nc():
            sequence = self.get_sequence()
            if i < len(sequence[self.channel]) - 1:
                dt = sequence[self.channel][i]['dt']
                sequence[self.channel][i] = deepcopy(sequence[self.channel][i +
                                                                            1])
                sequence[self.channel][i]['dt'] = dt

            scroll_position = self.ramp_scroll.horizontalScrollBar().value()
            self.set_sequence(sequence)
            self.ramp_scroll.horizontalScrollBar().setValue(scroll_position)

        return nc


#    def all_zero(self, i):
#        def az():
#            sequence = self.get_sequence()
#            for i in range(0, len(sequence[self.channel])):
#                dt = sequence[self.channel][i]['dt']
#                sequence[self.channel][i] = {'dt': dt, 'type': 's', 'vf': 0.0}
#                i += 1
#            self.set_sequence(sequence)
#        return az

    def set_sequence(self, sequence):
        self.sequence = sequence
        self.set_columns()

    @inlineCallbacks
    def get_plottable_sequence(self):
        sequence = self.ramp_table.get_channel_sequence()
        parameters = {'sequencer': get_sequence_parameters(sequence)}
        parameters_json = json.dumps(parameters)
        conductor = yield self.cxn.get_server(self.config.conductor_servername)
        pv_json = yield conductor.get_parameter_values(parameters_json, True)
        parameter_values = json.loads(pv_json)['sequencer']
        plottable_sequence = substitute_sequence_parameters(
            sequence, parameter_values)
        returnValue(self.ramp_maker(plottable_sequence).get_plottable())

    def get_sequence(self):
        channel_sequence = self.ramp_table.get_channel_sequence()
        self.sequence.update({self.channel: channel_sequence})
        return self.sequence

    @inlineCallbacks
    def replot(self, c=None):
        if not self.loading:
            T, V = yield self.get_plottable_sequence()
            self.canvas.make_figure(T, V)
            self.canvas.draw()

    def getEditedSequence(self):
        return self.get_sequence()

    def keyPressEvent(self, c):
        if QtGui.QApplication.keyboardModifiers() == QtCore.Qt.ControlModifier:
            if c.key() == QtCore.Qt.Key_Return:
                self.buttons.accepted.emit()
            if c.key() == QtCore.Qt.Key_Q:
                self.buttons.rejected.emit()
        else:
            QtGui.QWidget().keyPressEvent(c)
Esempio n. 5
0
class ElectrodeEditor(QtGui.QDialog):
    sequence_parameters = {}

    def __init__(self,
                 channels,
                 sequence,
                 electrode_sequence,
                 config,
                 reactor=None,
                 cxn=None,
                 parent=None):
        super(ElectrodeEditor, self).__init__(parent)
        self.channels = channels
        self.sequence = sequence

        self.ramp_maker = RampMaker
        self.config = config
        self.reactor = reactor
        self.cxn = cxn

        self.lookup = self.generateChannelLookup(self.channels)

        self.electrode_sequence = self.check_electrode_sequence(
            electrode_sequence)
        self.sequence_length = len(electrode_sequence)
        self.presets = {}

        self.loading = False
        self.connect()

    def generateChannelLookup(self, channels):
        lookup = {}
        for i, nl in enumerate(
                sorted(self.channels, key=lambda nl: nl.split('@')[1])):
            lookup[self.config.electrode_channel_map[i]] = nl
        return lookup

    def check_electrode_sequence(self, electrode_sequence):
        dummy = self.sequence.keys()[0]
        dummy_seq = self.sequence[dummy]

        if len(electrode_sequence) != len(dummy_seq):
            electrode_sequence = []
            for x in dummy_seq:
                v = deepcopy(zero_sequence(x['dt']))
                electrode_sequence.append(v)
        return electrode_sequence

    @inlineCallbacks
    def connect(self):
        if self.cxn is None:
            self.cxn = connection()
            yield self.cxn.connect()
        self.context = yield self.cxn.context()
        #        yield self.get_sequence_parameters()
        self.populate()
        yield self.connect_signals()
        yield self.update_presets()

    def populate(self):
        self.setWindowTitle("Electrode control")

        self.canvas = MplCanvas(self.config.electrode_channel_map)
        self.nav = NavigationToolbar(self.canvas, self)
        self.ramp_table = RampTable(self.ramp_maker, self.sequence_length)
        self.ramp_scroll = QtGui.QScrollArea()
        self.buttons = QtGui.QDialogButtonBox(
            QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel,
            QtCore.Qt.Horizontal, self)

        self.ramp_scroll.setWidget(self.ramp_table)
        self.ramp_scroll.setFixedHeight(
            self.ramp_table.height() +
            self.ramp_scroll.horizontalScrollBar().height() - 10)
        self.ramp_scroll.setWidgetResizable(True)
        self.buttons.button(QtGui.QDialogButtonBox.Ok).setDefault(False)

        self.layout = QtGui.QGridLayout()
        self.layout.setSpacing(0)
        self.layout.setContentsMargins(0, 0, 0, 0)

        self.layout.addWidget(self.nav)
        self.layout.addWidget(self.canvas)
        self.layout.addWidget(self.ramp_scroll)
        self.layout.addWidget(self.buttons)

        self.setLayout(self.layout)

        width = self.canvas.width()
        height = self.nav.height() + self.canvas.height(
        ) + self.ramp_scroll.height() + 20
        self.setFixedSize(width, height)

    @inlineCallbacks
    def connect_signals(self):
        # pyqt signals
        for c in self.ramp_table.cols:
            c.ramp_select.currentIndexChanged.connect(self.replot)
            for pw in c.parameter_widgets.values():
                for key, pb in pw.pboxes.items():
                    if key == 'vi' or key == 'vf':
                        pb.currentIndexChanged.connect(self.replot)
                    else:
                        pb.returnPressed.connect(self.replot)

        for i, c in enumerate(self.ramp_table.cols):
            # c.add.clicked.connect(self.add_column(i))
            # c.dlt.clicked.connect(self.dlt_column(i))

            c.zero_button.clicked.connect(self.zero_column(i))
            c.prev_button.clicked.connect(self.prev_column(i))
            c.next_button.clicked.connect(self.next_column(i))

        self.buttons.accepted.connect(self.accept)
        self.buttons.rejected.connect(self.reject)

        self.electrode = yield self.cxn.get_server(
            self.config.electrode_servername)
        yield self.electrode.signal__presets_changed(
            self.config.electrode_update_id)
        yield self.electrode.addListener(listener=self._update_presets,
                                         source=None,
                                         ID=self.config.electrode_update_id)

        # labrad signals
        self.conductor = yield self.cxn.get_server(
            self.config.conductor_servername)
        yield self.conductor.signal__parameters_updated(
            self.config.conductor_update_id)
        yield self.conductor.addListener(listener=self.receive_parameters,
                                         source=None,
                                         ID=self.config.conductor_update_id)

    @inlineCallbacks
    def get_electrode_presets(self):
        s = yield self.electrode.get_presets()
        s = json.loads(s)

        presets = {}
        for x in s:
            idn = x.pop('id')
            presets[idn] = x
        self.presets = presets

    def _update_presets(self, c, x):
        self.update_presets()

    @inlineCallbacks
    def update_presets(self):
        self.loading = True

        yield self.get_electrode_presets()

        for c in self.ramp_table.cols:
            c.updatePresets(self.presets)

        self.loading = False

        yield self.set_columns()

    @inlineCallbacks
    def get_sequence_parameters(self):
        sp = yield self.conductor.set_sequence_parameters()
        self.sequence_parameters = json.loads(sp)

    @inlineCallbacks
    def receive_parameters(self, c, signal):
        yield self.replot()

    @inlineCallbacks
    def set_columns(self):
        self.loading = True

        for s, c in zip(self.electrode_sequence, self.ramp_table.cols):
            ramp_type = s['type']
            c.ramp_select.setCurrentIndex(c.ramp_select.findText(ramp_type))

            for k in c.parameter_widgets[ramp_type].pboxes.keys():
                c.parameter_widgets[ramp_type].pboxes[k].display(s[k])

        self.loading = False
        yield self.replot()

    def zero_column(self, i):

        # QAbstractButton.clicked() sends a bool (for whether the button is checked or not)
        # This will cause an error as zc is then called with an extra argument
        # Just put *args and ignore them to catch this
        @inlineCallbacks
        def zc(*args):
            self.electrode_sequence = self.getElectrodeSequence()
            dt = self.electrode_sequence[i]['dt']
            self.electrode_sequence[i] = zero_sequence(dt)
            yield self.set_columns()

        return zc

    def prev_column(self, i):

        # See comment on zc()
        @inlineCallbacks
        def pc(*args):
            self.electrode_sequence = self.getElectrodeSequence()

            if i > 0:
                dt = self.electrode_sequence[i]['dt']
                self.electrode_sequence[i] = deepcopy(
                    self.electrode_sequence[i - 1])
                self.electrode_sequence[i]['dt'] = dt
                yield self.set_columns()

        return pc

    def next_column(self, i):

        # See comment on zc()
        @inlineCallbacks
        def nc(*args):
            self.electrode_sequence = self.getElectrodeSequence()

            if i < len(self.electrode_sequence) - 1:
                dt = self.electrode_sequence[i]['dt']
                self.electrode_sequence[i] = deepcopy(
                    self.electrode_sequence[i + 1])
                self.electrode_sequence[i]['dt'] = dt
                yield self.set_columns()

        return nc

    def parseElectrodesSequence(self, electrode_sequence):
        sequence = {}
        for x in self.config.electrode_channel_map:
            s = []
            for step in electrode_sequence:
                seq = deepcopy(step)
                vf = self.presets[int(step['vf'])]['values'][x]
                seq['vf'] = vf
                if step.has_key('vi'):
                    vi = self.presets[int(step['vi'])]['values'][x]
                    seq['vi'] = vi
                s.append(seq)
            sequence[x] = s
        return sequence

    @inlineCallbacks
    def get_plottable_sequence(self):
        sequence = self.ramp_table.get_sequence()
        parameters_json = json.dumps(
            {'sequencer': get_sequence_parameters(sequence)})
        pv_json = yield self.conductor.get_parameter_values(
            parameters_json, True)
        parameter_values = json.loads(pv_json)['sequencer']
        sequence = substitute_sequence_parameters(sequence, parameter_values)

        fixed_sequence = self.parseElectrodesSequence(sequence)
        returnValue({
            key: self.ramp_maker(val).get_plottable()
            for key, val in fixed_sequence.items()
        })

    def get_sequence(self):
        electrode_sequence = self.ramp_table.get_sequence()
        fixed_sequence = self.parseElectrodesSequence(electrode_sequence)

        for k, v in fixed_sequence.items():
            self.sequence.update({self.lookup[k]: v})
        return self.sequence

    @inlineCallbacks
    def replot(self, c=None):
        if not self.loading:
            self.canvas.clear()

            # Update the electrode sequence
            self.electrode_sequence = self.getElectrodeSequence()

            seq = yield self.get_plottable_sequence()
            self.canvas.make_figure(seq)
            # for key, val in seq.items():
            #     (T, V) = val
            #     self.canvas.make_figure(T, V, key)
            self.canvas.draw()
        self.canvas.legend()

    def getEditedSequence(self):
        return self.get_sequence()

    def getElectrodeSequence(self):
        return self.ramp_table.get_sequence()

    def keyPressEvent(self, c):
        if QtGui.QApplication.keyboardModifiers() == QtCore.Qt.ControlModifier:
            if c.key() == QtCore.Qt.Key_Return:
                self.buttons.accepted.emit()
            if c.key() == QtCore.Qt.Key_Q:
                self.buttons.rejected.emit()
        else:
            QtGui.QWidget().keyPressEvent(c)
Esempio n. 6
0
class AnalogVoltageEditor(QtGui.QDialog):
    sequence_parameters = {}

    def __init__(self, channel, sequence, cxn, reactor, parent=None):
        super(AnalogVoltageEditor, self).__init__(parent)
        self.channel = str(channel)
        self.sequence = sequence
        self.ramp_maker = RampMaker
        self.parent = parent
        self.cxn = cxn
        self.reactor = reactor

        self.conductor_update_id = np.random.randint(0, 2**31 - 1)

        self.loading = False
        self.connect()

    @inlineCallbacks
    def connect(self):
        #        self.cxn = connection()
        #        yield self.cxn.connect()
        yield self.get_sequence_parameters()
        self.populate()
        yield self.connect_signals()

    def populate(self):
        self.setWindowTitle(self.channel)

        self.canvas = MplCanvas()
        self.nav = NavigationToolbar(self.canvas, self)
        self.ramp_table = RampTable(self.ramp_maker)
        self.ramp_scroll = QtGui.QScrollArea()
        self.buttons = QtGui.QDialogButtonBox(
            QtGui.QDialogButtonBox.Ok
            | QtGui.QDialogButtonBox.Cancel, QtCore.Qt.Horizontal, self)

        self.ramp_scroll.setWidget(self.ramp_table)
        self.ramp_scroll.setFixedHeight(
            self.ramp_table.height() +
            self.ramp_scroll.horizontalScrollBar().height() - 10)
        self.ramp_scroll.setWidgetResizable(True)
        self.buttons.button(QtGui.QDialogButtonBox.Ok).setDefault(False)

        self.layout = QtGui.QGridLayout()
        self.layout.setSpacing(0)
        self.layout.setContentsMargins(0, 0, 0, 0)

        self.layout.addWidget(self.nav)
        self.layout.addWidget(self.canvas)
        self.layout.addWidget(self.ramp_scroll)
        self.layout.addWidget(self.buttons)

        self.setLayout(self.layout)

        width = self.canvas.width()
        height = self.nav.height() + self.canvas.height(
        ) + self.ramp_scroll.height() + 20
        self.setFixedSize(width, height)
        self.set_columns()
        self.replot()

    @inlineCallbacks
    def connect_signals(self):
        # pyqt signals
        for c in self.ramp_table.cols:
            c.ramp_select.currentIndexChanged.connect(self.replot)
            for pw in c.parameter_widgets.values():
                for pb in pw.pboxes.values():
                    pb.returnPressed.connect(self.replot)

        for i, c in enumerate(self.ramp_table.cols):
            c.add.clicked.connect(self.add_column(i))
            c.dlt.clicked.connect(self.dlt_column(i))

        self.buttons.accepted.connect(self.accept)
        self.buttons.rejected.connect(self.reject)

        # labrad signals
        conductor = yield self.cxn.get_server(self.parent.conductor_servername)
        yield conductor.signal__update(self.conductor_update_id)
        yield conductor.addListener(listener=self.receive_conductor_update,
                                    source=None,
                                    ID=self.conductor_update_id)

    @inlineCallbacks
    def get_sequence_parameters(self):
        conductor = yield self.cxn.get_server(self.parent.conductor_servername)
        parameter_names = get_sequence_parameters(self.sequence)
        request = {
            parameter_name.replace('*', 'sequencer.'): None
            for parameter_name in parameter_names
        }
        parameter_values_json = yield conductor.get_parameter_values(
            json.dumps(request))
        parameter_values = json.loads(parameter_values_json)
        self.sequence_parameters = {
            name.replace('sequencer.', '*'): value
            for name, value in parameter_values.items()
        }

    def receive_conductor_update(self, c, signal_json):
        signal = json.loads(signal_json)
        for message_type, message in signal.items():
            if message_type in [
                    'set_parameter_values', 'get_parameter_values'
            ]:
                update = {
                    name.replace('sequencer.', '*'): value
                    for name, value in message.items()
                }
                self.sequence_parameters.update(update)
                self.replot()

    def set_columns(self):
        self.loading = True
        for c in self.ramp_table.cols:
            c.hide()

        for s, c in zip(self.sequence[self.channel], self.ramp_table.cols):
            ramp_type = s['type']
            c.show()
            c.ramp_select.setCurrentIndex(c.ramp_select.findText(ramp_type))
            for k in c.parameter_widgets[ramp_type].pboxes.keys():
                c.parameter_widgets[ramp_type].pboxes[k].display(s[k])

        self.loading = False
        self.replot()

    def add_column(self, i):
        def ac():
            sequence = self.get_sequence()
            for c in sequence.keys():
                sequence[c].insert(i, sequence[c][i])
            self.set_sequence(sequence)

        return ac

    def dlt_column(self, i):
        def dc():
            sequence = self.get_sequence()
            for c in sequence.keys():
                sequence[c].pop(i)
            self.set_sequence(sequence)

        return dc

    def set_sequence(self, sequence):
        self.sequence = sequence
        self.set_columns()

    def get_plottable_sequence(self):
        sequence = self.ramp_table.get_channel_sequence()
        plottable_sequence = substitute_sequence_parameters(
            sequence, self.sequence_parameters)
        return self.ramp_maker(plottable_sequence).get_plottable()

    def get_sequence(self):
        channel_sequence = self.ramp_table.get_channel_sequence()
        self.sequence.update({self.channel: channel_sequence})
        return self.sequence

    def replot(self, c=None):
        if not self.loading:
            T, V = self.get_plottable_sequence()
            self.canvas.make_figure(T, V)
            self.canvas.draw()

    def getEditedSequence(self):
        return self.get_sequence()

    def keyPressEvent(self, c):
        if QtGui.QApplication.keyboardModifiers() == QtCore.Qt.ControlModifier:
            if c.key() == QtCore.Qt.Key_Return:
                self.buttons.accepted.emit()
            if c.key() == QtCore.Qt.Key_Q:
                self.buttons.rejected.emit()
        else:
            QtGui.QWidget().keyPressEvent(c)
Esempio n. 7
0
class PMTViewerNumeric(PMTViewer):

    """ Class is modified to also display numeric readout of ground, excited,
    background and total counts.  These values update every time the plot is updated. 
    """

    def populate(self):
        self.setWindowTitle(self.pmt_name)
        self.canvas = MplCanvas()
        self.nav = NavigationToolbar(self.canvas, self)
        self.lcdGND = QtGui.QLCDNumber(self)
        self.lcdGND.display('0.001')
        self.lcdEXC = QtGui.QLCDNumber(self)
        self.lcdEXC.display('0.001')
        self.lcdBAC = QtGui.QLCDNumber(self)
        self.lcdBAC.display('0.000')
        self.lcdFRAC = QtGui.QLCDNumber(self)
        self.lcdFRAC.display('0.000')
        self.lcdTOTAL = QtGui.QLCDNumber(self)
        self.lcdTOTAL.display('0.000')
        self.labelGND = QtGui.QLabel('GROUND')
        self.labelGND.setAlignment(QtCore.Qt.AlignCenter)
        self.labelGND.setFont(QtGui.QFont("Arial", 48, QtGui.QFont.Bold))
        self.labelEXC = QtGui.QLabel('EXCITED')
        self.labelEXC.setAlignment(QtCore.Qt.AlignCenter)
        self.labelEXC.setFont(QtGui.QFont("Arial", 48, QtGui.QFont.Bold))
        self.labelBAC = QtGui.QLabel('BACKGROUND')
        self.labelBAC.setAlignment(QtCore.Qt.AlignCenter)
        self.labelBAC.setFont(QtGui.QFont("Arial", 48, QtGui.QFont.Bold))
        self.labelFRAC = QtGui.QLabel('EXC. FRACTION')
        self.labelFRAC.setAlignment(QtCore.Qt.AlignCenter)
        self.labelFRAC.setFont(QtGui.QFont("Arial", 48, QtGui.QFont.Bold))
        self.labelTOTAL = QtGui.QLabel('TOTAL')
        self.labelTOTAL.setAlignment(QtCore.Qt.AlignCenter)
        self.labelTOTAL.setFont(QtGui.QFont("Arial", 48, QtGui.QFont.Bold))

         
        self.layout = QtGui.QGridLayout()
        self.layout.setSpacing(1)
        self.layout.setContentsMargins(0, 0, 0, 0)
        
        self.layout.addWidget(self.nav)
        self.layout.addWidget(self.canvas)
        
        self.hboxFRAC = QtGui.QHBoxLayout()
        self.hboxFRAC.addWidget(self.labelFRAC)
        self.hboxFRAC.addWidget(self.lcdFRAC)        
        self.hboxGND = QtGui.QHBoxLayout()
        self.hboxGND.addWidget(self.labelGND)
        self.hboxGND.addWidget(self.lcdGND)
        self.hboxEXC = QtGui.QHBoxLayout()
        self.hboxEXC.addWidget(self.labelEXC)
        self.hboxEXC.addWidget(self.lcdEXC)
        self.hboxBAC = QtGui.QHBoxLayout()
        self.hboxBAC.addWidget(self.labelBAC)
        self.hboxBAC.addWidget(self.lcdBAC)
        self.hboxTOTAL = QtGui.QHBoxLayout()
        self.hboxTOTAL.addWidget(self.labelTOTAL)
        self.hboxTOTAL.addWidget(self.lcdTOTAL)
        

        self.layout.addItem(self.hboxFRAC)
        self.layout.addItem(self.hboxGND)
        self.layout.addItem(self.hboxEXC)
        self.layout.addItem(self.hboxBAC)
        self.layout.addItem(self.hboxTOTAL)


        self.setLayout(self.layout)
       
        width = self.canvas.width() + 500
        height = self.nav.height() + self.canvas.height() + 8*self.lcdGND.height() + 200
        self.setFixedSize(width, height)
        self.setWindowTitle('PMT_trace_viewer')
        
                   
    def replot(self, rel_data_path):
        abs_data_path = os.path.join(self.data_dir, rel_data_path) + '.hdf5'
        with h5py.File(abs_data_path) as h5f:
            gnd = h5f['gnd']
            exc = h5f['exc']
            bac = h5f['bac']
            self.canvas.ax.clear()
            self.canvas.ax.plot(gnd, label='gnd')
            self.canvas.ax.plot(exc, label='exc')
            self.canvas.ax.plot(bac, label='bac')
            self.canvas.ax.legend()
            gnd = np.mean(h5f['gnd'][3000:23000])
            exc = np.mean(h5f['exc'][3000:23000])
            bac = np.mean(h5f['bac'][3000:23000])
            tot = (gnd+exc-2*bac)
            if tot==0:
                frac = 0
            else:
                frac = (exc-bac)/tot
            self.lcdGND.display(str(np.round(gnd,3)))
            self.lcdEXC.display(str(np.round(exc,3)))
            self.lcdBAC.display(str(np.round(bac,3)))
            self.lcdFRAC.display(str(np.round(frac,3)))
            self.lcdTOTAL.display(str(np.round(tot,3)))
        self.canvas.draw()
Esempio n. 8
0
class PicoViewer(QtGui.QDialog):
    name = None
    data_dir = None
    data_fxn = None

    def __init__(self, reactor, cxn=None, ylim = 2e-9):
        super(PicoViewer, self).__init__(None)
        self.reactor = reactor
        self.cxn = cxn
        print 'Directory:'
        print self.data_dir

        self.update_id = np.random.randint(0, 2**31 - 1)
        self.loading = False
        self.connect()
        
        self.Plotter = PicoPlotter(self)
   
    @inlineCallbacks
    def connect(self):
        if self.cxn is None:
            self.cxn = connection()
            cname = 'pico - {} - client'.format(self.name)
            yield self.cxn.connect(name=cname)

        self.populate()
        yield self.connect_signals()

    def show_fft(self):
    	self.mouse_listener = self.canvas.mpl_connect('button_press_event', self.process_click)
    
    def process_click(self, event):
    	t_click = event.xdata
    	self.canvas.mpl_disconnect(self.mouse_listener)
    	self.FFTPlot = FFTPlotter(self.data, self.ts, t_click)
    	self.FFTPlot.show()

    def launch_plotter(self):
    	self.Plotter.show()
    	
    def populate(self):
        self.setWindowTitle(self.name)
        self.canvas = MplCanvas()
        self.nav = NavigationToolbar(self.canvas, self)
        self.nav.addAction('Select analysis method')
        self.nav.addAction('Launch live plotter', self.launch_plotter)
        self.nav.addAction('Show fft on click', self.show_fft)
        
  
        self.layout = QtGui.QGridLayout()
        self.layout.setSpacing(0)
        self.layout.setContentsMargins(0, 0, 0, 0)
        
        self.layout.addWidget(self.nav)
        self.layout.addWidget(self.canvas)

        self.setLayout(self.layout)
        self.canvas.ax.set_ylim(self.ylim)
        self.canvas.ax.set_xlim((-.005, .045))
        width = self.canvas.width()
        height = self.nav.height() + self.canvas.height() + 20
        self.setFixedSize(width, height)
        self.setWindowTitle('pico_viewer')

    @inlineCallbacks
    def connect_signals(self):
        pico_server = yield self.cxn.get_server('cavity_probe_pico')
        yield pico_server.signal__update(self.update_id)
        yield pico_server.addListener(listener=self.receive_update, source=None, ID=self.update_id)

    def receive_update(self, c, signal_json):
        signal = json.loads(signal_json)
        for message_type, message in signal.items():
            print message_type, message
            device_message = message.get(self.name)
            if (message_type == 'record') and (device_message is not None):
                #Will only look at file specified by device message
                self.get_data(device_message)
                self.replot()
                self.Plotter.show_window()
                

    def get_data(self, abs_data_path):
	with h5py.File(abs_data_path) as h5f:
            self.data = np.array(h5f['gnd'])
            #self.test = np.array(h5f['test_new_trig'])
            #print(self.test)
            self.ts = np.array(h5f['time'])
            
    def replot(self):
        #Apply function as specified in child class
        print('called')
        x, y = (self.data_fxn)(self.data, self.ts)#, self.ts)
        #keep zoomed in view on repaint
        xlim = self.canvas.ax.get_xlim()
        ylim = self.canvas.ax.get_ylim()
        self.canvas.ax.clear()
        self.canvas.ax.plot(x, y, label='Time domain')
        self.canvas.ax.set_xlim(xlim)
        self.canvas.ax.set_ylim(ylim)
        self.canvas.ax.legend()
        self.canvas.draw()
        print('redrawn')
    
    def closeEvent(self, x):
        self.reactor.stop()
Esempio n. 9
0
class PMTViewer(QtGui.QDialog):
    if sys.platform == "win32":
        data_dir = 'J:\\data\\'
    else:
        data_dir = '/home/srgang/J/data/'

    def __init__(self, pmt_name, reactor, cxn=None):
        super(PMTViewer, self).__init__(None)
        self.pmt_name = pmt_name
        self.reactor = reactor
        self.cxn = cxn

        self.update_id = np.random.randint(0, 2**31 - 1)
        #        self.update_id = 6100034
        self.loading = False
        self.connect()

    @inlineCallbacks
    def connect(self):
        if self.cxn is None:
            self.cxn = connection()
            cname = 'pmt - {} - client'.format(self.pmt_name)
            yield self.cxn.connect(name=cname)
#        self.context = yield self.cxn.context()

        self.populate()
        yield self.connect_signals()
        #self.replot()

    def populate(self):
        self.setWindowTitle(self.pmt_name)
        self.canvas = MplCanvas()
        self.nav = NavigationToolbar(self.canvas, self)
        self.lcdGND = QtGui.QLCDNumber(self)
        self.lcdGND.display('0.001')
        self.lcdEXC = QtGui.QLCDNumber(self)
        self.lcdEXC.display('0.001')
        self.lcdBAC = QtGui.QLCDNumber(self)
        self.lcdBAC.display('0.000')
        self.lcdFRAC = QtGui.QLCDNumber(self)
        self.lcdFRAC.display('0.000')
        self.lcdTOTAL = QtGui.QLCDNumber(self)
        self.lcdTOTAL.display('0.000')
        self.labelGND = QtGui.QLabel('GROUND')
        self.labelGND.setAlignment(QtCore.Qt.AlignCenter)
        self.labelGND.setFont(QtGui.QFont("Arial", 48, QtGui.QFont.Bold))
        self.labelEXC = QtGui.QLabel('EXCITED')
        self.labelEXC.setAlignment(QtCore.Qt.AlignCenter)
        self.labelEXC.setFont(QtGui.QFont("Arial", 48, QtGui.QFont.Bold))
        self.labelBAC = QtGui.QLabel('BACKGROUND')
        self.labelBAC.setAlignment(QtCore.Qt.AlignCenter)
        self.labelBAC.setFont(QtGui.QFont("Arial", 48, QtGui.QFont.Bold))
        self.labelFRAC = QtGui.QLabel('EXC. FRACTION')
        self.labelFRAC.setAlignment(QtCore.Qt.AlignCenter)
        self.labelFRAC.setFont(QtGui.QFont("Arial", 48, QtGui.QFont.Bold))
        self.labelTOTAL = QtGui.QLabel('TOTAL')
        self.labelTOTAL.setAlignment(QtCore.Qt.AlignCenter)
        self.labelTOTAL.setFont(QtGui.QFont("Arial", 48, QtGui.QFont.Bold))

        self.layout = QtGui.QGridLayout()
        self.layout.setSpacing(1)
        self.layout.setContentsMargins(0, 0, 0, 0)

        self.layout.addWidget(self.nav)
        self.layout.addWidget(self.canvas)

        self.hboxFRAC = QtGui.QHBoxLayout()
        self.hboxFRAC.addWidget(self.labelFRAC)
        self.hboxFRAC.addWidget(self.lcdFRAC)
        self.hboxGND = QtGui.QHBoxLayout()
        self.hboxGND.addWidget(self.labelGND)
        self.hboxGND.addWidget(self.lcdGND)
        self.hboxEXC = QtGui.QHBoxLayout()
        self.hboxEXC.addWidget(self.labelEXC)
        self.hboxEXC.addWidget(self.lcdEXC)
        self.hboxBAC = QtGui.QHBoxLayout()
        self.hboxBAC.addWidget(self.labelBAC)
        self.hboxBAC.addWidget(self.lcdBAC)
        self.hboxTOTAL = QtGui.QHBoxLayout()
        self.hboxTOTAL.addWidget(self.labelTOTAL)
        self.hboxTOTAL.addWidget(self.lcdTOTAL)

        self.layout.addItem(self.hboxFRAC)
        self.layout.addItem(self.hboxGND)
        self.layout.addItem(self.hboxEXC)
        self.layout.addItem(self.hboxBAC)
        self.layout.addItem(self.hboxTOTAL)

        self.setLayout(self.layout)

        width = self.canvas.width() + 500
        height = self.nav.height() + self.canvas.height(
        ) + 8 * self.lcdGND.height() + 200
        self.setFixedSize(width, height)
        self.setWindowTitle('PMT_trace_viewer')


#        yield self.replot()

    @inlineCallbacks
    def connect_signals(self):
        # pyqt signals

        # labrad signals
        pmt_server = yield self.cxn.get_server('pmt')
        yield pmt_server.select_device(self.pmt_name)
        yield pmt_server.signal__update(self.update_id)
        yield pmt_server.addListener(listener=self.receive_update,
                                     source=None,
                                     ID=self.update_id)

    @inlineCallbacks
    def receive_update(self, c, signal):
        if signal == self.pmt_name:
            pmt_server = yield self.cxn.get_server('pmt')
            data_json = yield pmt_server.retrive(-1)
            data = json.loads(data_json)
            record_name = data['record_name'].split('/')[5:]
            raw_data_path = self.data_dir + os.path.join(
                *record_name) + '.hdf5'
            self.replot(raw_data_path)
            self.update_numbers(raw_data_path)

    def replot(self, data_path):
        with h5py.File(data_path) as h5f:
            gnd = h5f['gnd'][500:]
            exc = h5f['exc'][500:]
            bac = h5f['bac'][500:]
            self.canvas.ax.clear()
            self.canvas.ax.plot(gnd, label='GND')
            self.canvas.ax.plot(exc, label='EXC')
            self.canvas.ax.plot(bac, label='BAC')
            self.canvas.ax.text(100, 100, 'FRAC')
            self.canvas.ax.legend()
        self.canvas.draw()

    def update_numbers(self, data_path):
        with h5py.File(data_path) as h5f:
            gnd = np.mean(h5f['gnd'][3000:23000])
            exc = np.mean(h5f['exc'][3000:23000])
            bac = np.mean(h5f['bac'][3000:23000])
            tot = (gnd + exc - 2 * bac)
            if tot == 0:
                frac = 0
            else:
                frac = (exc - bac) / tot
            self.lcdGND.display(str(np.round(gnd, 3)))
            self.lcdEXC.display(str(np.round(exc, 3)))
            self.lcdBAC.display(str(np.round(bac, 3)))
            self.lcdFRAC.display(str(np.round(frac, 3)))
            self.lcdTOTAL.display(str(np.round(tot, 3)))

    def closeEvent(self, x):
        self.reactor.stop()
Esempio n. 10
0
class PMTViewer(QtGui.QDialog):
    if sys.platform == "win32":
        data_dir = 'J:\\data\\'
    else:
        data_dir = '/home/srgang/J/data/'

    def __init__(self, pmt_name, reactor, cxn=None):
        super(PMTViewer, self).__init__(None)
        self.pmt_name = pmt_name
        self.reactor = reactor
        self.cxn = cxn

        self.update_id = np.random.randint(0, 2**31 - 1)
        #        self.update_id = 6100034
        self.loading = False
        self.connect()

    @inlineCallbacks
    def connect(self):
        if self.cxn is None:
            self.cxn = connection()
            cname = 'pmt - {} - client'.format(self.pmt_name)
            yield self.cxn.connect(name=cname)
#        self.context = yield self.cxn.context()

        self.populate()
        yield self.connect_signals()
        #self.replot()

    def populate(self):
        self.setWindowTitle(self.pmt_name)
        self.canvas = MplCanvas()
        self.nav = NavigationToolbar(self.canvas, self)

        self.layout = QtGui.QGridLayout()
        self.layout.setSpacing(0)
        self.layout.setContentsMargins(0, 0, 0, 0)

        self.layout.addWidget(self.nav)
        self.layout.addWidget(self.canvas)

        self.setLayout(self.layout)

        width = self.canvas.width()
        height = self.nav.height() + self.canvas.height() + 20
        self.setFixedSize(width, height)
        self.setWindowTitle('pmt_viewer')


#        yield self.replot()

    @inlineCallbacks
    def connect_signals(self):
        # pyqt signals

        # labrad signals
        pmt_server = yield self.cxn.get_server('pmt')
        yield pmt_server.select_device(self.pmt_name)
        yield pmt_server.signal__update(self.update_id)
        yield pmt_server.addListener(listener=self.receive_update,
                                     source=None,
                                     ID=self.update_id)

    @inlineCallbacks
    def receive_update(self, c, signal):
        if signal == self.pmt_name:
            pmt_server = yield self.cxn.get_server('pmt')
            data_json = yield pmt_server.retrive(-1)
            data = json.loads(data_json)
            record_name = data['record_name'].split('/')[5:]
            raw_data_path = self.data_dir + os.path.join(
                *record_name) + '.hdf5'
            self.replot(raw_data_path)

    def replot(self, data_path):
        with h5py.File(data_path) as h5f:
            gnd = h5f['gnd'][500:]
            exc = h5f['exc'][500:]
            bac = h5f['bac'][500:]
            self.canvas.ax.clear()
            self.canvas.ax.plot(gnd, label='gnd')
            self.canvas.ax.plot(exc, label='exc')
            self.canvas.ax.plot(bac, label='bac')
            self.canvas.ax.legend()
        self.canvas.draw()

    def closeEvent(self, x):
        self.reactor.stop()