def run(self):
        analyzer = self.app.hardware['auger_electron_analyzer']

        from ScopeFoundryHW.ni_daq import NI_AdcTask
        import numpy as np
        import time

        try:
            self.app.measurements['auger_spectrum'].setup_analyzer()
            time.sleep(3.0)  #let electronics settle

            self.adc_task = NI_AdcTask('/X-6368/ai4',
                                       range=10.0,
                                       name='adc_monitor',
                                       terminalConfig='default')
            #self.adc_task.set_rate(rate=2e6, count=100000, finite=False, clk_source="")
            #print("rate", self.adc_task.get_rate())
            #self.adc_task.start()

            adc_data = np.zeros(65536, dtype=float)
            for i in range(65536):
                analyzer.analyzer.write_KE_binary(i)
                #time.sleep(0.010)
                #buf = self.adc_task.read_buffer()
                adc_data[i] = self.adc_task.get()  #buf.mean()
                if i % 64 == 0:
                    print(i, adc_data[i])
                    if self.interrupt_measurement_called:
                        break
        finally:
            self.adc_task.close()
            np.savetxt('outer_vsKEbinary.txt', adc_data)
class AugerElectronAnalyzerViewer(Measurement):

    name = 'auger_e_analyzer_view'

    def setup(self):

        self.ui = load_qt_ui_file(
            sibling_path(__file__, "auger_electron_analyzer_viewer.ui"))

        self.e_analyzer_hw = self.app.hardware['auger_electron_analyzer']

        widget_connections = [
            ('multiplier', 'multiplier_checkBox'),
            ('KE', 'KE_doubleSpinBox'),
            ('pass_energy', 'pass_energy_doubleSpinBox'),
            ('crr_ratio', 'crr_ratio_doubleSpinBox'),
            ('resolution', 'resolution_doubleSpinBox'),
            ('CAE_mode', 'cae_checkBox'),
            ('quad_X1', 'qX1_doubleSpinBox'),
            ('quad_Y1', 'qY1_doubleSpinBox'),
            ('quad_X2', 'qX2_doubleSpinBox'),
            ('quad_Y2', 'qY2_doubleSpinBox'),
        ]
        for lq_name, widget_name in widget_connections:
            lq = self.e_analyzer_hw.settings.get_lq(lq_name)
            lq.connect_to_widget(getattr(self.ui, widget_name))

    def run(self):
        analyzer = self.app.hardware['auger_electron_analyzer']

        from ScopeFoundryHW.ni_daq import NI_AdcTask
        import numpy as np
        import time

        try:
            self.app.measurements['auger_spectrum'].setup_analyzer()
            time.sleep(3.0)  #let electronics settle

            self.adc_task = NI_AdcTask('/X-6368/ai4',
                                       range=10.0,
                                       name='adc_monitor',
                                       terminalConfig='default')
            #self.adc_task.set_rate(rate=2e6, count=100000, finite=False, clk_source="")
            #print("rate", self.adc_task.get_rate())
            #self.adc_task.start()

            adc_data = np.zeros(65536, dtype=float)
            for i in range(65536):
                analyzer.analyzer.write_KE_binary(i)
                #time.sleep(0.010)
                #buf = self.adc_task.read_buffer()
                adc_data[i] = self.adc_task.get()  #buf.mean()
                if i % 64 == 0:
                    print(i, adc_data[i])
                    if self.interrupt_measurement_called:
                        break
        finally:
            self.adc_task.close()
            np.savetxt('outer_vsKEbinary.txt', adc_data)
Пример #3
0
    def connect(self):
        self.settings.channel.change_readonly(True)

        self.adc = NI_AdcTask(channel=self.settings['channel'],
                              range=10,
                              name=self.name,
                              terminalConfig='rse')
        self.adc.set_single()

        self.adc.start()

        #Connect settings to hardware
        self.settings.voltage.hardware_read_func = self.read_adc_single
Пример #4
0
    def connect(self):
        if self.debug_mode.val:
            self.log.debug("connecting to {}".format(self.name))

        # Open connection to hardware
        self.adc = NI_AdcTask(channel='/Dev1/ai2',
                              range=10,
                              name=self.name,
                              terminalConfig='rse')
        self.adc.set_single()
        self.adc.start()

        #Connect lq to hardware
        self.voltage.hardware_read_func = self.read_adc_single
Пример #5
0
    def connect(self):
        if self.debug_mode.val: self.log.debug("Connecting to NI_Dac NI_AdcTask")
        
        # Open connection to hardware

        if not self.dummy_mode.val:
            self.adc = NI_AdcTask('X-6368/ai0:1')
            #self.adc_InLens = NI_AdcTask('X-6368/ai1')
            #self.adc_SE2 = NI_AdcTask('X-6368/ai0')
        else:
            if self.debug_mode.val: self.log.debug("Connecting to NI_Dac NI_AdcTask (Dummy Mode)")

        # connect logged quantities
        self.inLens_signal.hardware_read_func = self.read_inlens_signal
        self.se2_signal.hardware_read_func = self.read_se2_signal
Пример #6
0
class ThorlabsPowerMeterAnalogReadOut(HardwareComponent):

    name = 'thorlabs_powermeter_analog_readout'

    def setup(self):
        self.power = self.add_logged_quantity(name='power',
                                              dtype=float,
                                              si=True,
                                              unit="W",
                                              vmin=0,
                                              vmax=10,
                                              ro=True)
        self.voltage = self.add_logged_quantity(name='voltage',
                                                dtype=float,
                                                si=True,
                                                unit="V",
                                                vmin=-10,
                                                vmax=10,
                                                ro=True)

        self.power_range = self.add_logged_quantity(name='power_range',
                                                    dtype=float,
                                                    unit="W",
                                                    vmin=0,
                                                    vmax=10,
                                                    ro=True)

    def connect(self):
        if self.debug_mode.val:
            self.log.debug("connecting to {}".format(self.name))

        # Open connection to hardware
        self.adc = NI_AdcTask(channel='/Dev1/ai2',
                              range=10,
                              name=self.name,
                              terminalConfig='rse')
        self.adc.set_single()
        self.adc.start()

        #Connect lq to hardware
        self.voltage.hardware_read_func = self.read_adc_single

    def disconnect(self):
        self.settings.disconnect_all_from_hardware()

        #disconnect hardware
        self.adc.close()

        # clean up hardware object
        del self.adc

    def read_adc_single(self):
        resp = self.adc.get()
        if self.debug_mode.val:
            self.log.debug("read_adc_single resp: {}".format(resp))
        return float(resp[0])
Пример #7
0
class TestAnalogReadOutHW(HardwareComponent):

    name = 'test_analog_readout'

    def setup(self):

        self.settings.New('voltage', dtype=float, ro=True, unit='V')

        self.settings.New('channel', dtype=str, initial='/Dev1/ai0')

    def connect(self):
        self.settings.channel.change_readonly(True)

        self.adc = NI_AdcTask(channel=self.settings['channel'],
                              range=10,
                              name=self.name,
                              terminalConfig='rse')
        self.adc.set_single()

        self.adc.start()

        #Connect settings to hardware
        self.settings.voltage.hardware_read_func = self.read_adc_single

    def disconnect(self):
        #disconnect all settings from hardware
        for lq in self.settings.as_list():
            lq.hardware_read_func = None
            lq.hardware_set_func = None

        if hasattr(self, 'adc'):
            #disconnect hardware
            self.adc.stop()
            self.adc.close()

            # clean up hardware object
            del self.adc

        self.settings.channel.change_readonly(False)

    def read_adc_single(self):
        resp = self.adc.get()
        if self.debug_mode.val:
            self.log.debug("read_adc_single resp: {}".format(resp))
        return float(resp[0])
Пример #8
0
    def pre_scan_setup(self):
        print("pre_scan_setup auger_quad")

        #         #### Reset FPGA
        self.auger_fpga_hw.setup_single_clock_mode(self.settings['dwell'],
                                                   delay_fraction=0.05)

        #### setup analyzer
        self.analyzer_hw.settings['multiplier'] = True
        self.analyzer_hw.settings['CAE_mode'] = self.settings['CAE_mode']
        self.analyzer_hw.settings['KE'] = self.settings['ke_start']
        self.analyzer_hw.settings['pass_energy'] = self.settings['pass_energy']
        self.analyzer_hw.settings['crr_ratio'] = self.settings['crr_ratio']
        time.sleep(3.0)
        print("pre_scan_setup done auger_quad")

        S = self.settings
        signal = S['image_signal']
        if signal == 1:
            self.sem_adc = NI_AdcTask('x-6368/ai1', name='sem')
        elif signal == 2:
            self.sem_adc = NI_AdcTask('x-6368/ai0', name='sem')
        else:
            self.sem_adc.close()
            self.sem_adc = None

        self.ke_array = np.linspace(S['ke_start'], S['ke_end'], S['ke_steps'])
        S['n_frames'] = len(self.ke_array)

        self.quad_count_map = np.zeros(self.scan_shape, dtype=float)

        if S['save_h5']:
            self.h5_meas_group['ke_array'] = self.ke_array
            self.quad_count_map_h5 = self.create_h5_framed_dataset(
                "quad_count_map", self.quad_count_map, dtype=float)
            self.quad_max_vs_ke_h5 = self.h5_meas_group.create_dataset(
                "quad_max_vs_ke", shape=(S['n_frames'], 3))  # x%, y%, Hz
Пример #9
0
class SEMDualChanSignal(HardwareComponent):

    name = "sem_dualchan_signal"

    def setup(self):

        # Create logged quantities
        self.inLens_signal = self.add_logged_quantity(
                                name = 'inLens_signal', 
                                initial = 0,
                                dtype=float, fmt="%e", ro=True,
                                unit="V",
                                vmin=-100, vmax=100)
        self.se2_signal = self.add_logged_quantity(
                                name = 'se2_signal', 
                                initial = 0,
                                dtype=float, fmt="%e", ro=True,
                                unit="V",
                                vmin=-100, vmax=100)

        self.signal_nsamples = self.add_logged_quantity(
                                name = 'signal_nsamples',
                                initial=1,
                                dtype=int, ro=False,
                                unit = "",
                                vmin = 1, vmax=10000)
        
        

        self.dummy_mode = self.add_logged_quantity(name='dummy_mode', dtype=bool, initial=False, ro=False)
        
    def connect(self):
        if self.debug_mode.val: self.log.debug("Connecting to NI_Dac NI_AdcTask")
        
        # Open connection to hardware

        if not self.dummy_mode.val:
            self.adc = NI_AdcTask('X-6368/ai0:1')
            #self.adc_InLens = NI_AdcTask('X-6368/ai1')
            #self.adc_SE2 = NI_AdcTask('X-6368/ai0')
        else:
            if self.debug_mode.val: self.log.debug("Connecting to NI_Dac NI_AdcTask (Dummy Mode)")

        # connect logged quantities
        self.inLens_signal.hardware_read_func = self.read_inlens_signal
        self.se2_signal.hardware_read_func = self.read_se2_signal


    def disconnect(self):
        
        #disconnect logged quantities from hardware
        self.settings.disconnect_all_from_hardware()
        
        if hasattr(self, 'adc'):
            #disconnect hardware
            self.adc.close()
            #self.adc_InLens.close()
            #self.adc_SE2.close()
    
            # clean up hardware object
            del self.adc
        
    def read_inlens_signal(self):        
        return self.read_signals()[1]
        
    def read_se2_signal(self):        
        return self.read_signals()[0]
    
    
    def read_signals(self):
        t0 = time.time()
        if not self.dummy_mode.val:
            X = np.zeros(2, dtype=float)
            for i in range(self.signal_nsamples.val):          
                X += self.adc.get()
            self.log.debug("read_signals {} sec, nsamples {}".format( time.time() - t0, self.signal_nsamples.val))
            return X / self.signal_nsamples.val
        else:
            time.sleep(self.inLens_signal_nsamples.val * 20e-6)
            signal = np.random.random(2)*100.
            if self.debug_mode.val:
                self.log.debug("{} dummy read_count_rate {}".format(self.name, signal))
            return signal            
Пример #10
0
class AugerQuadSlowScan(BaseRaster2DFrameSlowScan):

    name = "auger_quad_slowscan"
    ''' FIX
    modified quad scan to do gun align scan, works but slow, 
    also should detect inlens , not auger, which gives odd effects
    probably should duplicate measurement...
    
    Also could use mouse pointer to control stig etc, !
    '''
    q1 = {
        'x_slow': 'quad_X1',
        'x_fast': 'X1',
        'y_slow': 'quad_Y1',
        'y_fast': 'Y1'
    }
    q2 = {
        'x_slow': 'quad_X2',
        'x_fast': 'X2',
        'y_slow': 'quad_Y2',
        'y_fast': 'Y2'
    }
    xx = {
        'x_slow': 'quad_X1',
        'x_fast': 'X1',
        'y_slow': 'quad_X2',
        'y_fast': 'X2'
    }
    yy = {
        'x_slow': 'quad_Y1',
        'x_fast': 'Y1',
        'y_slow': 'quad_Y2',
        'y_fast': 'Y2'
    }
    scan_mode = [q1, q2, xx, yy]

    def scan_specific_setup(self):
        self.settings.continuous_scan.update_value(False)
        self.settings.continuous_scan.change_readonly(True)
        self.settings.n_frames.change_readonly(True)

        self.settings.New('quad_scan_mode',
                          dtype=int,
                          initial=0,
                          vmin=0,
                          vmax=4,
                          choices=(('quad 1', 0), ('quad 2', 1),
                                   ('x shift/angle', 2), ('y shift/angle',
                                                          3), ('SEM gun', 4)))
        self.settings.New('image_signal',
                          dtype=int,
                          initial=0,
                          vmin=0,
                          vmax=2,
                          choices=(('Auger', 0), ('SEM_inlens', 1), ('SEM_SE2',
                                                                     2)))
        self.settings.New('smooth', dtype=bool, initial=True)

        #auger analyzer
        self.settings.New('Control_KE', dtype=bool, initial=True)
        self.settings.New('ke_start',
                          dtype=float,
                          initial=30,
                          unit='V',
                          vmin=0,
                          vmax=2200)
        self.settings.New('ke_end',
                          dtype=float,
                          initial=600,
                          unit='V',
                          vmin=1,
                          vmax=2200)
        self.settings.New('ke_steps', dtype=int, initial=10, vmin=1)
        self.settings.New('dwell',
                          dtype=float,
                          initial=0.05,
                          unit='s',
                          si=True,
                          vmin=1e-4)
        self.settings.New('pass_energy',
                          dtype=float,
                          initial=50,
                          unit='V',
                          vmin=5,
                          vmax=500)
        self.settings.New('crr_ratio',
                          dtype=float,
                          initial=5,
                          vmin=1.5,
                          vmax=20)
        self.settings.New('CAE_mode', dtype=bool, initial=False)

        for lqname in ['ke_start', 'ke_end', 'ke_steps', 'dwell']:
            self.settings.get_lq(lqname).add_listener(self.compute_times)

        self.display_update_period = 0.01

        self.auger_fpga_hw = self.app.hardware['auger_fpga']
        self.analyzer_hw = self.app.hardware['auger_electron_analyzer']
        self.sem_hw = self.app.hardware['sem_remcon']

        #raster scan setup
        #self.h_unit = self.v_unit = "%"
        self.set_h_limits(-100, 100, set_scan_to_max=True)
        self.set_v_limits(-100, 100, set_scan_to_max=True)

    # begining of run
    def pre_scan_setup(self):
        print("pre_scan_setup auger_quad")

        #         #### Reset FPGA
        self.auger_fpga_hw.setup_single_clock_mode(self.settings['dwell'],
                                                   delay_fraction=0.05)

        #### setup analyzer
        self.analyzer_hw.settings['multiplier'] = True
        self.analyzer_hw.settings['CAE_mode'] = self.settings['CAE_mode']
        self.analyzer_hw.settings['KE'] = self.settings['ke_start']
        self.analyzer_hw.settings['pass_energy'] = self.settings['pass_energy']
        self.analyzer_hw.settings['crr_ratio'] = self.settings['crr_ratio']
        time.sleep(3.0)
        print("pre_scan_setup done auger_quad")

        S = self.settings
        signal = S['image_signal']
        if signal == 1:
            self.sem_adc = NI_AdcTask('x-6368/ai1', name='sem')
        elif signal == 2:
            self.sem_adc = NI_AdcTask('x-6368/ai0', name='sem')
        else:
            self.sem_adc.close()
            self.sem_adc = None

        self.ke_array = np.linspace(S['ke_start'], S['ke_end'], S['ke_steps'])
        S['n_frames'] = len(self.ke_array)

        self.quad_count_map = np.zeros(self.scan_shape, dtype=float)

        if S['save_h5']:
            self.h5_meas_group['ke_array'] = self.ke_array
            self.quad_count_map_h5 = self.create_h5_framed_dataset(
                "quad_count_map", self.quad_count_map, dtype=float)
            self.quad_max_vs_ke_h5 = self.h5_meas_group.create_dataset(
                "quad_max_vs_ke", shape=(S['n_frames'], 3))  # x%, y%, Hz

    def move_position_start(self, x, y):
        qmode = self.settings['quad_scan_mode']
        if qmode == 4:
            self.sem_hw.settings['gun_xy'] = (x, y)
        else:
            XX = self.scan_mode[qmode]['x_slow']
            YY = self.scan_mode[qmode]['y_slow']
            self.analyzer_hw.settings[XX] = x
            self.analyzer_hw.settings[YY] = y

        time.sleep(0.2)

    def move_position_slow(self, x, y, dx, dy):
        qmode = self.settings['quad_scan_mode']
        if qmode == 4:
            self.sem_hw.settings['gun_xy'] = (x, y)
        else:
            XX = self.scan_mode[qmode]['x_slow']
            YY = self.scan_mode[qmode]['y_slow']
            self.analyzer_hw.settings[XX] = x
            self.analyzer_hw.settings[YY] = y

    def move_position_fast(self, x, y, dx, dy):
        qmode = self.settings['quad_scan_mode']
        if qmode == 4:
            self.sem_hw.settings['gun_xy'] = (x, y)
        else:
            self.move_position_slow(x, y, 0, 0)

    def on_new_frame(self, frame_i):
        print("New frame", frame_i)
        if self.settings['Control_KE']:
            # set ke
            self.analyzer_hw.settings['KE'] = self.ke_array[frame_i]
            print("New frame", frame_i, self.analyzer_hw.settings['KE'],
                  self.ke_array)
            # wait
            time.sleep(0.1)

    def on_end_frame(self, frame_i):
        #filter image before finding max
        A = self.quad_count_map
        if self.settings['smooth']:
            B = ndimage.gaussian_filter(A[0, :, :], sigma=2)
        else:
            B = A[0, :, :]
        self.p_max = np.amax(B)
        self.p_min = np.amin(B)
        self.display_image_map[0, :, :] = B
        j, i = np.unravel_index(B.argmax(), B.shape)
        k = 0

        print("found quad opt peak at ", k, j, i, 'value', A[k, j, i],
              'coords', self.h_array[i], self.v_array[j])
        #self.move_position_slow(self.h_array[i],self.v_array[j],0,0)
        if self.settings['save_h5']:
            self.quad_count_map_h5[frame_i, :, :] = A
            self.quad_max_vs_ke_h5[
                frame_i, :] = self.h_array[i], self.v_array[j], A[k, j, i]

        self.current_stage_pos_arrow.setPos(self.h_array[i], self.v_array[j])

    def collect_pixel(self, pixel_num, frame_i, k, j, i):
        # collect data
        if self.settings['image_signal'] == 0:
            value = self.auger_fpga_hw.get_single_value(pixel_num == 0)
        else:
            volts = 0.0
            i_ave = 0
            while i_ave < 5:
                i_ave += 1
                volts += self.sem_adc.get()
            value = volts / i_ave

        self.display_image_map[k, j, i] = value
        self.quad_count_map[k, j, i] = value
        if pixel_num == 0:
            self.p_min = self.p_max = value
        else:
            self.p_min = min(value, self.p_min)
            self.p_max = max(value, self.p_max)
        #print(self.name, "collect_pixel", pixel_num, k,j,i, value)

    def update_LUT(self):
        if False:
            self.hist_lut.imageChanged(autoLevel=False)
            if hasattr(self, 'p_min'):
                self.hist_lut.setLevels(self.p_min, self.p_max)
        else:
            self.hist_lut.imageChanged(autoLevel=True)

    def post_scan_cleanup(self):
        self.analyzer_hw.settings['multiplier'] = False
        self.sem_adc.close()
Пример #11
0
class AugerPressureHistory(Measurement):

    name = "auger_pressure_history"

    def setup(self):

        self.has_turbo = 'tc110_turbo' in self.app.hardware

        if self.has_turbo:
            self.turbo_names = []
            for name in ['prep', 'ion', 'nano']:
                for x in ['speed', 'power', 'temp']:
                    self.turbo_names.append(name + "_" + x)

        self.settings.New('delta_t',
                          dtype=float,
                          unit='s',
                          vmin=0.0,
                          initial=1.0)
        self.settings.New('save_h5', dtype=bool, initial=True)

        #display
        self.settings.New('show_last', dtype=int, initial=-1)

        self.names = names = ('Prep', 'Nano')
        for name in self.names:
            self.settings.New(name + "_pressure",
                              dtype=float,
                              ro=True,
                              si=True,
                              unit="Bar")
        #self.settings.New('start_time', dtype=str, ro=True, initial = datestring())
        self.settings.New('ADC_channels', dtype=str, initial='9215A/ai0:1')
        self.settings.New('TC_channels', dtype=str, initial='cDAQ1-9211/ai0:1')

        #setup gui
        self.ui = QtWidgets.QWidget()
        self.layout = QtWidgets.QHBoxLayout()
        self.ui.setLayout(self.layout)
        self.control_widget = QtWidgets.QGroupBox(self.name)
        self.layout.addWidget(self.control_widget, stretch=0)
        self.control_widget.setLayout(QtWidgets.QVBoxLayout())

        self.start_button = QtWidgets.QPushButton("Start")
        self.control_widget.layout().addWidget(self.start_button)
        self.stop_button = QtWidgets.QPushButton("Stop")
        self.control_widget.layout().addWidget(self.stop_button)

        self.start_button.clicked.connect(self.start)
        self.stop_button.clicked.connect(self.interrupt)

        self.control_widget.layout().addWidget(\
            self.settings.New_UI(exclude=['activation','progress','profile']))

        self.control_widget.layout().addWidget(\
            self.app.settings.New_UI())

        self.graph_layout = pg.GraphicsLayoutWidget(border=(100, 100, 100))
        self.layout.addWidget(self.graph_layout, stretch=1)

        self.ui.show()
        self.ui.setWindowTitle("auger_pressure_history")

        self.NUM_CHANS = 2

        self.TC_CHAN_NAMES = ['oven_air', 'vac_system']
        self.TC_CHANS = 2

        self.plots = []

        #ion gauge pressure display
        axis = DateAxis(orientation='bottom')
        self.pressure_plot = plot = self.graph_layout.addPlot(
            title="Pressure", axisItems={'bottom': axis})
        plot.setLogMode(y=True)
        plot.setYRange(-11, -6)
        plot.showGrid(y=True, x=True, alpha=1.0)
        plot.addLegend()

        self.plots.append(plot)

        self.pressure_plot_lines = []
        for i in range(self.NUM_CHANS):
            color = pg.intColor(i)
            plot_line = self.pressure_plot.plot(pen=pg.mkPen(color, width=4),
                                                name=names[i],
                                                autoDownsample=True)
            self.pressure_plot_lines.append(plot_line)
        self.graph_layout.nextRow()

        #turbo status display
        self.turbo_plot = self.graph_layout.addPlot(title="Turbo",
                                                    axisItems={'bottom': axis})
        self.turbo_plot.showGrid(y=True, x=True, alpha=1.0)
        self.turbo_plot.addLegend()
        self.turbo_plot_lines = dict()

        for name in self.turbo_names:
            if 'prep' in name:
                color = 'r'
            elif 'ion' in name:
                color = 'y'
            else:
                color = 'w'
            if 'speed' in name:
                width = 4
                style = 1
            elif 'power' in name:
                style = 2
                width = 2
            else:
                style = style = 3
                width = 1

            self.turbo_plot_lines[name] = self.turbo_plot.plot(
                pen=pg.mkPen(color=color, width=width),
                name=name,
                autoDownsample=True)

    def volts_to_pressure(self, volts):
        '''
        convert log output of ion gauge into mBarr)
        FIX not working for prep ion gauge, vmin or vmax must be wrong...
        '''
        vmin = np.array([0.0, 0.078])
        vmax = np.array([10.0, 2.89])
        vhi = np.array([1.0, 1.0])
        vlo = np.array([0.0, 0.0])

        pmin = np.array([1e-11, 1e-12])
        pmax = np.array([1e-2, 0.2])
        vr = (volts - vmin) / (vmax - vmin)
        vr = np.minimum(1.0, np.maximum(vr, 0.0))
        pr = np.log(pmax / pmin)
        return pmin * np.exp(vr * pr)

    def run(self):
        print(self.name, 'run')

        #self.settings['start_time'] = self.datestring()
        block = self.block = 100
        self.chan_history_pressure = np.zeros((self.NUM_CHANS, block),
                                              dtype=float)
        #self.chan_history_pressure[:,:] = 1e-11
        self.chan_history_time = self.settings['delta_t'] * np.arange(block)
        self.history_i = 0
        self.display_i = 0

        self.press_adc = NI_AdcTask(self.settings['ADC_channels'],
                                    name='pressure')
        self.temp_adc = NI_AdcTask(self.settings['TC_channels'],
                                   name='temperature')
        self.start_time = time.time()
        print(datetime.datetime.now().strftime("%H:%M %b %d, %Y "))

        try:
            # H5 File
            if self.settings['save_h5']:
                self.h5file = h5_io.h5_base_file(app=self.app,
                                                 measurement=self)
                self.h5m = h5_io.h5_create_measurement_group(
                    measurement=self, h5group=self.h5file)

                self.pressure_h5 = self.h5m.create_dataset(
                    'pressure',
                    dtype=float,
                    shape=(self.NUM_CHANS, block),
                    maxshape=(self.NUM_CHANS, None),
                    chunks=(self.NUM_CHANS, block))
                #self.time_h5 = self.h5m.create_dataset('time', dtype=float, shape=(block,),
                #                                                        maxshape=(None,), chunks=(block,))

                self.epoch_h5 = self.h5m.create_dataset('epoch',
                                                        dtype=float,
                                                        shape=(block, ),
                                                        maxshape=(None, ),
                                                        chunks=(block, ))

                self.tc_temp_h5 = self.h5m.create_dataset(
                    'tc_temp',
                    dtype=float,
                    shape=(self.TC_CHANS, block),
                    maxshape=(self.TC_CHANS, None),
                    chunks=(self.TC_CHANS, block))

                print('saving to h5:', self.h5file.filename)

                if self.has_turbo:
                    for name in self.turbo_names:
                        self.h5m.create_dataset(name,
                                                dtype=float,
                                                shape=(block, ),
                                                maxshape=(None, ),
                                                chunks=(block, ))

            while not self.interrupt_measurement_called:

                #read ion gauge pressure
                volts = 0.0
                i_ave = 0
                start = time.time()
                while (time.time() -
                       start) < self.settings['delta_t'] or i_ave == 0:
                    i_ave += 1
                    volts += self.press_adc.get()
                volts /= i_ave
                pressure = self.volts_to_pressure(volts)

                self.settings['Prep_pressure'] = pressure[0] * 1e-3
                self.settings['Nano_pressure'] = pressure[1] * 1e-3

                # read tc temperatures
                temps = [0, 0]  #self.temp_adc.get()

                # timestamp
                abs_time = time.time()
                sample_time = abs_time - self.start_time

                # write to numpy arrays
                self.chan_history_time = np_block_extend(
                    self.chan_history_time, self.history_i, block, axis=0)
                self.chan_history_time[self.history_i] = sample_time

                self.chan_history_pressure = np_block_extend(
                    self.chan_history_pressure, self.history_i, block, axis=1)
                self.chan_history_pressure[:, self.history_i] = pressure

                # write to h5
                if self.settings['save_h5']:
                    #h5_resize_and_insert(self.time_h5, self.history_i,
                    #                     data=sample_time, block=block, axis=0)
                    h5_resize_and_insert(self.epoch_h5,
                                         self.history_i,
                                         data=abs_time,
                                         block=block,
                                         axis=0)
                    h5_resize_and_insert(self.pressure_h5,
                                         self.history_i,
                                         data=pressure[:],
                                         block=block,
                                         axis=1)
                    h5_resize_and_insert(self.tc_temp_h5,
                                         self.history_i,
                                         data=temps,
                                         block=block,
                                         axis=1)

                    if self.has_turbo:
                        for name in self.turbo_names:
                            val = self.app.hardware[
                                'tc110_turbo'].settings.get_lq(
                                    name).read_from_hardware()
                            h5_resize_and_insert(self.h5m[name],
                                                 self.history_i,
                                                 data=val,
                                                 block=block,
                                                 axis=0)

                #print(volts, self.chan_history_pressure.shape)
                self.history_i += 1
        finally:
            self.h5file.close()

            self.press_adc.close()
            self.temp_adc.close()
            del self.press_adc
            del self.temp_adc

            print(self.name, 'stopped')

    def update_display(self):

        if self.history_i > self.display_i:
            jj1 = self.history_i

            show_last = self.settings['show_last']
            if show_last < 0:
                jj0 = 0
            else:
                jj0 = max(0, jj1 - show_last)

            #pressure
            for i in range(self.NUM_CHANS):
                self.pressure_plot_lines[i].setData(
                    self.epoch_h5[jj0:jj1],
                    self.chan_history_pressure[i, jj0:jj1])

            #Turbo
            for name in self.turbo_names:
                yy = np.array(self.h5m[name][jj0:jj1], dtype=float)
                if 'speed' in name:  #convert to %
                    if 'ion' in name:
                        yy /= 15.
                    else:
                        yy /= 10.
                self.turbo_plot_lines[name].setData(self.epoch_h5[jj0:jj1], yy)

            self.display_i = self.history_i
Пример #12
0
    def run(self):
        print(self.name, 'run')

        #self.settings['start_time'] = self.datestring()
        block = self.block = 100
        self.chan_history_pressure = np.zeros((self.NUM_CHANS, block),
                                              dtype=float)
        #self.chan_history_pressure[:,:] = 1e-11
        self.chan_history_time = self.settings['delta_t'] * np.arange(block)
        self.history_i = 0
        self.display_i = 0

        self.press_adc = NI_AdcTask(self.settings['ADC_channels'],
                                    name='pressure')
        self.temp_adc = NI_AdcTask(self.settings['TC_channels'],
                                   name='temperature')
        self.start_time = time.time()
        print(datetime.datetime.now().strftime("%H:%M %b %d, %Y "))

        try:
            # H5 File
            if self.settings['save_h5']:
                self.h5file = h5_io.h5_base_file(app=self.app,
                                                 measurement=self)
                self.h5m = h5_io.h5_create_measurement_group(
                    measurement=self, h5group=self.h5file)

                self.pressure_h5 = self.h5m.create_dataset(
                    'pressure',
                    dtype=float,
                    shape=(self.NUM_CHANS, block),
                    maxshape=(self.NUM_CHANS, None),
                    chunks=(self.NUM_CHANS, block))
                #self.time_h5 = self.h5m.create_dataset('time', dtype=float, shape=(block,),
                #                                                        maxshape=(None,), chunks=(block,))

                self.epoch_h5 = self.h5m.create_dataset('epoch',
                                                        dtype=float,
                                                        shape=(block, ),
                                                        maxshape=(None, ),
                                                        chunks=(block, ))

                self.tc_temp_h5 = self.h5m.create_dataset(
                    'tc_temp',
                    dtype=float,
                    shape=(self.TC_CHANS, block),
                    maxshape=(self.TC_CHANS, None),
                    chunks=(self.TC_CHANS, block))

                print('saving to h5:', self.h5file.filename)

                if self.has_turbo:
                    for name in self.turbo_names:
                        self.h5m.create_dataset(name,
                                                dtype=float,
                                                shape=(block, ),
                                                maxshape=(None, ),
                                                chunks=(block, ))

            while not self.interrupt_measurement_called:

                #read ion gauge pressure
                volts = 0.0
                i_ave = 0
                start = time.time()
                while (time.time() -
                       start) < self.settings['delta_t'] or i_ave == 0:
                    i_ave += 1
                    volts += self.press_adc.get()
                volts /= i_ave
                pressure = self.volts_to_pressure(volts)

                self.settings['Prep_pressure'] = pressure[0] * 1e-3
                self.settings['Nano_pressure'] = pressure[1] * 1e-3

                # read tc temperatures
                temps = [0, 0]  #self.temp_adc.get()

                # timestamp
                abs_time = time.time()
                sample_time = abs_time - self.start_time

                # write to numpy arrays
                self.chan_history_time = np_block_extend(
                    self.chan_history_time, self.history_i, block, axis=0)
                self.chan_history_time[self.history_i] = sample_time

                self.chan_history_pressure = np_block_extend(
                    self.chan_history_pressure, self.history_i, block, axis=1)
                self.chan_history_pressure[:, self.history_i] = pressure

                # write to h5
                if self.settings['save_h5']:
                    #h5_resize_and_insert(self.time_h5, self.history_i,
                    #                     data=sample_time, block=block, axis=0)
                    h5_resize_and_insert(self.epoch_h5,
                                         self.history_i,
                                         data=abs_time,
                                         block=block,
                                         axis=0)
                    h5_resize_and_insert(self.pressure_h5,
                                         self.history_i,
                                         data=pressure[:],
                                         block=block,
                                         axis=1)
                    h5_resize_and_insert(self.tc_temp_h5,
                                         self.history_i,
                                         data=temps,
                                         block=block,
                                         axis=1)

                    if self.has_turbo:
                        for name in self.turbo_names:
                            val = self.app.hardware[
                                'tc110_turbo'].settings.get_lq(
                                    name).read_from_hardware()
                            h5_resize_and_insert(self.h5m[name],
                                                 self.history_i,
                                                 data=val,
                                                 block=block,
                                                 axis=0)

                #print(volts, self.chan_history_pressure.shape)
                self.history_i += 1
        finally:
            self.h5file.close()

            self.press_adc.close()
            self.temp_adc.close()
            del self.press_adc
            del self.temp_adc

            print(self.name, 'stopped')