class Keithley():
    def __init__(self, main, ui):
        self.ui = ui
        self.copyDataFunc = main.CopyDataFunc
        self.collect_data_thread = Collect_data()
        self.save_thread = Save_Thread()

        main.connect(self.ui.pushButton_browse_keithley, SIGNAL('clicked()'),
                     self.Browse_keithley)
        main.connect(self.ui.pushButton_import_keithley, SIGNAL('clicked()'),
                     self.Import_keithley)
        main.connect(self.ui.pushButton_close_keithley, SIGNAL('clicked()'),
                     self.Close_keithley)
        main.connect(self.ui.pushButton_select_keithley, SIGNAL('clicked()'),
                     self.Select_keithley)
        main.connect(self.ui.pushButton_scan_keithley, SIGNAL('clicked()'),
                     self.Scan_keithley)
        main.connect(self.ui.pushButton_pause_keithley, SIGNAL('clicked()'),
                     self.collect_data_thread.pause)
        main.connect(self.ui.pushButton_stop_keithley, SIGNAL('clicked()'),
                     self.collect_data_thread.stop)
        main.connect(self.ui.pushButton_clear_keithley, SIGNAL('clicked()'),
                     self.collect_data_thread.Clear_keithley)
        main.connect(self.ui.pushButton_copy_keithley, SIGNAL('clicked()'),
                     self.Copy_keithley)
        main.connect(self.ui.pushButton_fit_keithley, SIGNAL('clicked()'),
                     self.collect_data_thread.Fit)
        main.connect(self.ui.pushButton_browse_save_G_keithley,
                     SIGNAL('clicked()'), self.Google_browse)
        main.connect(self.ui.pushButton_browse_save_O_keithley,
                     SIGNAL('clicked()'), self.Other_browse)
        main.connect(self.ui.pushButton_check_G_keithley, SIGNAL('clicked()'),
                     self.Check)
        main.connect(self.ui.pushButton_Select_Directory_G_keithley,
                     SIGNAL('clicked()'), self.Google_select_namefolder)
        main.connect(self.ui.pushButton_Save_G_keithley, SIGNAL('clicked()'),
                     self.G_save)
        main.connect(self.ui.pushButton_Open_G_keithley, SIGNAL('clicked()'),
                     self.G_open)
        main.connect(self.ui.pushButton_Save_O_keithley, SIGNAL('clicked()'),
                     self.O_save)
        main.connect(self.ui.pushButton_Open_O_keithley, SIGNAL('clicked()'),
                     self.O_open)
        main.connect(
            self.ui.radioButton_voltage_keithley, SIGNAL("clicked()"),
            lambda: self.ui.tabWidget_scan_keithley.setCurrentIndex(0))
        main.connect(self.ui.radioButton_timescan_keithley,
                     SIGNAL("clicked()"),
                     self.collect_data_thread.Pre_MPL_Plot)
        main.connect(self.ui.radioButton_stepscan_keithley,
                     SIGNAL("clicked()"),
                     self.collect_data_thread.Pre_MPL_Plot)
        main.connect(self.collect_data_thread, SIGNAL("plot"), self.Plot_data)
        main.connect(self.collect_data_thread, SIGNAL("mpl_plot"),
                     self.Plot_analysis)
        main.connect(self.collect_data_thread, SIGNAL("data_available"),
                     self.Pre_save)
        # self.connect(self.Keithley_programs.collect_data_thread, SIGNAL("clear_plot"), self.Keithley_programs.Clear_plot)

        self.Array = []
        self.count = 0
        self.go_on = True

        # Set up guiqwt plot
        self.curve_item = make.curve([], [], color='b', marker="o")
        self.ui.curvewidget_keithley.plot.add_item(self.curve_item)
        self.ui.curvewidget_keithley.plot.set_antialiasing(True)
        self.ui.curvewidget_keithley.plot.set_titles(
            "Measurement and Plot Based on Array", "X-Axis", "Y-Axis")

        self.curve_ct_item = make.curve([], [], color='b', marker="o")
        self.ui.curvewidget_ct_keithley.plot.add_item(self.curve_ct_item)
        self.ui.curvewidget_ct_keithley.plot.set_antialiasing(True)
        self.ui.curvewidget_ct_keithley.plot.set_titles(
            "Current vs Time", "Time", "Current")

        self.curve_vt_item = make.curve([], [], color='b', marker="o")
        self.ui.curvewidget_vt_keithley.plot.add_item(self.curve_vt_item)
        self.ui.curvewidget_vt_keithley.plot.set_antialiasing(True)
        self.ui.curvewidget_vt_keithley.plot.set_titles(
            "Voltage vs Time", "Time", "Voltage")

    # Tab: Keithley
    # Group: Import
    # Search and find the directory of the file you want to import
    def Browse_keithley(self):
        prev_dir = os.getcwd()
        fileDir = QFileDialog.getOpenFileName(None,
                                              'Select File to Import',
                                              prev_dir,
                                              filter="Array Files (*.array)")
        if fileDir != '':
            file_list = str(fileDir).split('/')
            for i in range(0, len(file_list) - 1):
                global open_dir
                open_dir = ''
                if i < len(file_list) - 1:
                    open_dir += file_list[i] + '\\'
                elif i == len(file_list) - 1:
                    open_dir += file_list[i]
            fileDir.replace('/', '\\')
            self.ui.lineEdit_directory_keithley.setText(fileDir)
            self.ui.pushButton_import_keithley.setEnabled(True)
            self.ui.lineEdit_condition_keithley.setText(
                'File: "' + file_list[len(file_list) - 1] +
                '" has been chosen.')

        else:
            self.ui.lineEdit_condition_keithley.setText(
                "Please choose valid file to import.")

    # Tab: Keithley
    # Group: Import
    # Import the file ends in ".array"
    def Import_keithley(self):
        divider_found = True
        count = 0
        temp = 0
        self.Array = []
        x_value = []
        y_value = []

        fileDir = self.ui.lineEdit_directory_keithley.text()
        fp = open(fileDir)
        while True:
            if count == 5000:
                self.ui.lineEdit_condition_keithley.setText(
                    "Data not found in file. Please check it.")
                divider_found = False
                break
            line = fp.readline()
            line_list = line.split(',')
            if line_list[0].upper() == "Array Data".upper() + '\n':
                break
            count += 1

        if divider_found == True:
            line = fp.readline()
            while True:
                line = fp.readline().replace('\n', '')
                print 'line: ' + line
                if line == '':
                    break
                value = line.split(',')
                x_value.append(temp)
                x_value.append(temp + 1)
                y_value.append(value[1])
                y_value.append(value[1])
                self.Array.append(float(value[1]))
                temp += 1

            self.Plot_import(x_value, y_value)
            self.ui.lineEdit_condition_keithley.setText(
                "File is imported correctly.")
            self.ui.groupBox_visa_keithley.setEnabled(True)

    def Copy_keithley(self):
        Values = self.copyDataFunc()
        if Values != None:
            self.ui.lineEdit_condition_keithley.setText(
                'Array has been copied and plotted.')
            self.ui.tabWidget_plot_keithely.setCurrentIndex(0)
            self.Array = []
            x_value = []
            y_value = []
            item = 0
            for i in range(0, len(Values)):
                for j in range(0, len(Values[i])):
                    x_value.append(item)
                    x_value.append(item + 1 - 0.0001)
                    y_value.append(Values[i][j])
                    y_value.append(Values[i][j])
                    self.Array.append(Values[i][j])
                    item += 1
            self.Plot_import(x_value, y_value)
            self.ui.lineEdit_directory_keithley.setText(
                'From Array Builder Tab.')
            self.ui.groupBox_visa_keithley.setEnabled(True)
            self.ui.groupBox_xvalue_keithley.setEnabled(True)
        else:
            self.ui.lineEdit_condition_keithley.setText(
                'No valid array to copy.')

    def Plot_import(self, x, y):
        self.Reset_plot_import()
        self.axes_import.plot(x, y, marker='.', linestyle='-')
        self.axes_import.grid()
        self.axes_import.set_title("Array Import Plot")
        self.axes_import.set_xlabel("Steps")
        self.axes_import.set_ylabel("Values")
        self.ui.mplwidget_import.draw()

    def Plot_analysis(self):
        self.ui.tabWidget_plot_keithely.setCurrentIndex(2)
        self.ui.mplwidget_analysis.draw()
        self.ui.mplwidget_ct_analysis.draw()
        self.ui.mplwidget_vt_analysis.draw()

    def Plot_data(self, voltage, current, time, step):
        self.ui.label_yvalue_keithley.setText(format(current, '.3f'))
        self.ui.label_xvalue_keithley.setText(format(voltage, '.3f'))
        if self.ui.radioButton_timescan_keithley.isChecked():
            self.ui.label_tvalue_keithley.setText(format(time, '.3f'))
        elif self.ui.radioButton_stepscan_keithley.isChecked():
            self.ui.label_tvalue_keithley.setText(str(step))
        self.ui.curvewidget_keithley.plot.do_autoscale()
        self.ui.curvewidget_ct_keithley.plot.do_autoscale()
        self.ui.curvewidget_vt_keithley.plot.do_autoscale()
        self.curve_item.plot().replot()
        self.curve_ct_item.plot().replot()
        self.curve_vt_item.plot().replot()

    def Clear_plot(self):
        self.ui.mplwidget_analysis.draw()
        self.ui.mplwidget_ct_analysis.draw()
        self.ui.mplwidget_vt_analysis.draw()
        self.curve_item.plot().replot()
        self.curve_ct_item.plot().replot()
        self.curve_vt_item.plot().replot()

    # Reset the import matplot widget
    def Reset_plot_import(self):
        self.ui.mplwidget_import.figure.clear()
        self.axes_import = self.ui.mplwidget_import.figure.add_subplot(111)

    def Refresh_visa(self):
        self.rm = visa.ResourceManager()
        try:
            all_visas = self.rm.list_resources()
        except:
            all_visas = "No Visa Available."
        self.ui.comboBox_visa_keithley.clear()
        for item in all_visas:
            self.ui.comboBox_visa_keithley.addItem(item)

    # Tab: Keithley
    # Group: Visa
    # Select the visa address of the Keithley
    def Select_keithley(self):
        self.visa_address = str(self.ui.comboBox_visa_keithley.currentText())
        self.rm = visa.ResourceManager()
        self.rm.list_resources()
        inst = self.rm.open_resource(self.visa_address)
        self.visa_check = self.Check_visa(inst)
        if self.visa_check == True:
            self.ui.lineEdit_condition_keithley.setText(
                "Visa is selected succefully!")
            self.visa_name = inst.query("*IDN?")
            self.ui.lineEdit_visa_keithley.setText(self.visa_name)
            self.visa_chosen = inst
            self.ui.groupBox_scan_keithley.setEnabled(True)
        elif self.visa_check == False:
            self.ui.lineEdit_condition_keithley.setText(
                "Invalid visa address.")
            self.ui.lineEdit_visa_keithley.setText("None.")
            self.visa_chosen = False

    def Check_visa(self, inst):
        try:
            inst.ask("*IDN?")
            valid = True
        except:
            valid = False
        return valid

    # Tab: Keithley
    # Group: Visa
    # Close the visa address you choose
    def Close_keithley(self):
        self.visa_chosen.close()
        self.ui.lineEdit_condition_keithley.setText('Visa address is closed')
        self.ui.lineEdit_visa_keithley.setText('')
        self.ui.groupBox_scan_keithley.setEnabled(False)

    # Tab: Keithley
    # Group: Scan
    # Start to scan by the keithley
    def Scan_keithley(self):
        c_limit = 0
        try:
            if self.ui.lineEdit_climit_keithley.text() != '':
                c_limit = float(self.ui.lineEdit_climit_keithley.text())
            self.collect_data_thread.input(self.visa_chosen, self.ui,
                                           self.Array, self.go_on,
                                           self.curve_item, self.curve_ct_item,
                                           self.curve_vt_item, c_limit)
            self.ui.pushButton_pause_keithley.setEnabled(True)
            self.ui.pushButton_stop_keithley.setEnabled(True)
            self.ui.pushButton_scan_keithley.setEnabled(False)
        except ValueError:
            self.ui.lineEdit_condition_keithley.setText(
                "Invalid current limit.")

    def Google_browse(self):
        prev_dir = 'C:\\'
        file_list = []
        file_dir = QFileDialog.getExistingDirectory(
            None, 'Select Google Drive Folder', prev_dir)
        if file_dir != '':
            file_list = str(file_dir).split('/')
            # for i in range(0, len(file_list) - 1):
            #     if i < len(file_list) - 1:
            #         open_dir += file_list[i] + '\\'
            #     elif i == len(file_list) - 1:
            #         open_dir += file_list[i]
            file_dir.replace('/', '\\')
            self.ui.lineEdit_GoogleDrive_G_keithley.setText(file_dir)
            self.ui.label_condition_G_keithley.setText(
                'Open Google Drive User Folder')
            self.ui.pushButton_check_G_keithley.setEnabled(True)

    def Other_browse(self):
        prev_dir = os.getcwd()
        fileDir = QFileDialog.getExistingDirectory(None,
                                                   'Select Folder to Save',
                                                   prev_dir)
        if fileDir != '':
            open_dir = ''
            file_list = str(fileDir).split('/')
            for i in range(0, len(file_list) - 1):
                if i < len(file_list) - 1:
                    open_dir += file_list[i] + '\\'
                elif i == len(file_list) - 1:
                    open_dir += file_list[i]
            fileDir.replace('/', '\\')
            self.O_directory = fileDir
            self.ui.lineEdit_directory_O_keithley.setText(fileDir)
            self.ui.label_username_O_keithley.setEnabled(True)
            self.ui.comboBox_Name_Folder_O_keithley.setEnabled(True)
            self.ui.groupBox_Filename_O_keithley.setEnabled(True)
            self.ui.groupBox_File_Type_O_keithley.setEnabled(True)
            self.ui.label_comment_O_keithley.setEnabled(True)
            self.ui.textEdit_comment_O_keithley.setEnabled(True)
            self.ui.pushButton_Save_O_keithley.setEnabled(True)
            self.ui.lineEdit_Custom_Name_O_keithley.setEnabled(True)
            self.ui.label_condition_O_keithley.setText(
                "Click save button to save.")
        else:
            self.ui.lineEdit_directory_O_keithley.setText('None')
            self.ui.label_condition_O_keithley.setText('Failed to Read File')

    def Check(self):
        self.G_directory = ''
        file_list = []
        file_list = str(
            self.ui.lineEdit_GoogleDrive_G_keithley.text()).split('\\')
        if os.path.exists(
                self.ui.lineEdit_GoogleDrive_G_keithley.text()) == False:
            self.ui.label_condition_G_keithley.setText(
                'Incorrect Google Drive Directory.')
        else:
            self.ui.label_condition_G_keithley.setText(
                'Please click browse to the "03 User Accounts" folder')
            for i in range(0, len(file_list)):
                self.G_directory += file_list[i] + '\\'
                if file_list[i].upper() == '03 User Accounts'.upper():
                    self.ui.label_namefolder_G_keithley.setEnabled(True)
                    self.ui.comboBox_Name_Folder_G_keithley.setEnabled(True)
                    self.ui.pushButton_Select_Directory_G_keithley.setEnabled(
                        True)
                    self.ui.label_condition_G_keithley.setText(
                        'Choose name folder in Google Drive to save.')
                    break

    def Google_select_namefolder(self):
        namefolder = str(self.ui.comboBox_Name_Folder_G_keithley.currentText())
        if namefolder == 'None':
            self.ui.label_condition_G_keithley.setText(
                'Please choose a name folder to save.')
        else:
            now = datetime.datetime.now()
            date = '%s-%s-%s' % (now.year, now.month, now.day)
            self.ui.label_G_keithley.setText("Save to \\" + namefolder +
                                             "\Date" + '\\' + date)
            self.G_directory += namefolder + "\Data" + '\\' + date + '\\' + 'Keithely with Array'
            self.ui.groupBox_File_Type_G_keithley.setEnabled(True)
            self.ui.groupBox_Filename_G_keithley.setEnabled(True)
            self.ui.label_comment_G_keithley.setEnabled(True)
            self.ui.textEdit_comment_G_keithley.setEnabled(True)
            self.ui.pushButton_Save_G_keithley.setEnabled(True)
            self.ui.lineEdit_Custom_Name_G_keithley.setEnabled(True)
            self.ui.label_condition_G_keithley.setText(
                'Click save button to save.')

    def Select_type_G_keithley(self):
        if self.ui.radioButton_csv_G_keithley.isChecked():
            self.G_type = '.csv'
            self.G_divide = ','

        elif self.ui.radioButton_txt_G_keithley.isChecked():
            self.G_type = '.txt'
            self.G_divide = '\t'

    def Select_type_O_keithley(self):
        if self.ui.radioButton_csv_O_keithley.isChecked():
            self.O_type = '.csv'
            self.O_divide = ','

        elif self.ui.radioButton_txt_O_keithley.isChecked():
            self.O_type = '.txt'
            self.O_divide = '\t'

    def Select_name_G_keithley(self):
        if self.ui.radioButton_Timename_G_keithley.isChecked():
            now = datetime.datetime.now()
            date = '%s-%s-%s' % (now.year, now.month, now.day)
            current_time = '%s.%s.%s' % (now.hour, now.minute, now.second)
            date_and_time = date + ' ' + current_time
            self.G_file_name = str(date_and_time)
        elif self.ui.radioButton_Custom_Name_G_keithley.isChecked():
            self.G_file_name = str(
                self.ui.lineEdit_Custom_Name_G_keithley.text())

    def Select_name_O_keithley(self):
        if self.ui.radioButton_Timename_O_keithley.isChecked():
            now = datetime.datetime.now()
            date = '%s-%s-%s' % (now.year, now.month, now.day)
            current_time = '%s.%s.%s' % (now.hour, now.minute, now.second)
            date_and_time = date + ' ' + current_time
            self.O_file_name = str(date_and_time)
        elif self.ui.radioButton_Custom_Name_O_keithley.isChecked():
            self.O_file_name = str(
                self.ui.lineEdit_Custom_Name_O_keithley.text())

    def Pre_save(self, date_value, t_value, x_value, y_value, array):
        self.date_value = date_value
        self.t_value = t_value
        self.x_value = x_value
        self.y_value = y_value
        self.array = array

    def G_save(self):
        if self.ui.radioButton_Custom_Name_G_keithley.isChecked(
        ) and self.ui.lineEdit_Custom_Name_G_keithley.text() == '':
            self.ui.label_condition_G_keithley.setText(
                'Enter a valid file name.')
        else:
            self.Select_type_G_keithley()
            self.Select_name_G_keithley()

            # It contains the measurement information, including user name, date, measurement type, time step etc.
            # This is a two dimensional list. Each sub list related to a single line.
            comments = []
            # For QMDlab data file it is "Collected Data"
            divider = 'Collected Data'
            # Parameters' names, such as VOLTAGE, CURRENT, TIME
            parameters = []
            # Parameters' units
            units = []
            # Include all the data
            data = []
            # Contains file type, divider, name and directory
            file_info = []

            # First line user name
            temp = []
            temp.append('User Name:')
            temp.append(
                str(self.ui.comboBox_Name_Folder_G_keithley.currentText()))
            comments.append(temp)
            # Second line edit time
            temp = []
            temp.append('Edit Time:')
            temp.append(str(datetime.datetime.now()))
            comments.append(temp)
            # Third line array source
            temp = []
            temp.append('Array Source:')
            temp.append(str(self.ui.lineEdit_directory_keithley.text()))
            comments.append(temp)
            # Fourth line visa address
            temp = []
            temp.append('Visa Address:')
            temp.append(str(self.ui.comboBox_visa_keithley.currentText()))
            comments.append(temp)
            # Fifth line visa name
            temp = []
            temp.append('Visa Name:')
            visa_name = self.visa_name.rstrip('\n')
            visa_name = visa_name.replace(',', ' ')
            temp.append(str(visa_name))
            comments.append(temp)
            # Sixth line scan source
            temp = []
            temp.append('Scan Source:')
            temp.append('Voltage')
            comments.append(temp)
            # Seventh line time step
            temp = []
            temp.append('Time Step(sec):')
            temp.append(str(self.ui.lineEdit_tstep_keithley.text()))
            comments.append(temp)
            # Eighth line comments
            temp = []
            temp.append('Comments:')
            temp.append(str(self.ui.textEdit_comment_G_keithley.toPlainText()))
            comments.append(temp)

            # Do parameters, units and data together
            parameters.append('Date')
            units.append('String')
            data.append(self.date_value)

            parameters.append('Time')
            units.append('s')
            data.append(self.t_value)

            parameters.append('Step')
            units.append('1')
            temp = []
            for i in range(0, len(self.array)):
                temp.append(i)
            data.append(temp)

            parameters.append('Array')
            units.append('1')
            data.append(self.array)
            parameters.append('Voltage')
            units.append('Volts')
            data.append(self.x_value)
            parameters.append('Current')
            units.append('Amps')
            data.append(self.y_value)

            # File_info
            # First is file name
            file_info.append(self.G_file_name)
            # csv or txt file
            file_info.append(self.G_type)
            # the divide of csv is "," while for txt its "\t"
            file_info.append(self.G_divide)
            # Always "Collected Data"
            file_info.append(divider)
            # The saving directory
            file_info.append(self.G_directory)

            self.save_thread.input(comments, parameters, units, data,
                                   file_info)
            self.ui.pushButton_Open_G_keithley.setEnabled(True)
            self.ui.label_condition_G_keithley.setText('File has been saved.')

    def O_save(self):
        if self.ui.comboBox_Name_Folder_O_keithley.currentText() == 'None':
            self.ui.label_condition_O_keithley.setText(
                'Pleanse choose a user name.')
        elif self.ui.radioButton_Custom_Name_O_keithley.isChecked(
        ) and self.ui.lineEdit_Custom_Name_O_keithley.text() == '':
            self.ui.label_condition_O_keithley.setText(
                'Please enter a file name.')
        else:
            self.Select_type_O_keithley()
            self.Select_name_O_keithley()

            # It contains the measurement information, including user name, date, measurement type, time step etc.
            # This is a two dimensional list. Each sub list related to a single line.
            comments = []
            # For QMDlab data file it is "Collected Data"
            divider = 'Collected Data'
            # Parameters' names, such as VOLTAGE, CURRENT, TIME
            parameters = []
            # Parameters' units
            units = []
            # Include all the data
            data = []
            # Contains file type, divider, name and directory
            file_info = []

            # First line user name
            temp = []
            temp.append('User Name:')
            temp.append(
                str(self.ui.comboBox_Name_Folder_O_keithley.currentText()))
            comments.append(temp)
            # Second line edit time
            temp = []
            temp.append('Edit Time:')
            temp.append(str(datetime.datetime.now()))
            comments.append(temp)
            # Third line array source
            temp = []
            temp.append('Array Source:')
            temp.append(str(self.ui.lineEdit_directory_keithley.text()))
            comments.append(temp)
            # Fourth line visa address
            temp = []
            temp.append('Visa Address:')
            temp.append(str(self.ui.comboBox_visa_keithley.currentText()))
            comments.append(temp)
            # Fifth line visa name
            temp = []
            temp.append('Visa Name:')
            visa_name = self.visa_name.rstrip('\n')
            visa_name = visa_name.replace(',', ' ')
            temp.append(str(visa_name))
            comments.append(temp)
            # Sixth line scan source
            temp = []
            temp.append('Scan Source:')
            temp.append('Voltage')
            comments.append(temp)
            # Seventh line time step
            temp = []
            temp.append('Time Step(sec):')
            temp.append(str(self.ui.lineEdit_tstep_keithley.text()))
            comments.append(temp)
            # Eighth line comments
            temp = []
            temp.append('Comments:')
            temp.append(str(self.ui.textEdit_comment_O_keithley.toPlainText()))
            comments.append(temp)

            # Do parameters, units and data together
            parameters.append('Date')
            units.append('String')
            data.append(self.date_value)
            parameters.append('Time')
            units.append('s')
            data.append(self.t_value)
            parameters.append('Step')
            units.append('1')
            temp = []
            for i in range(0, len(self.array)):
                temp.append(i)
            data.append(temp)
            parameters.append('Array')
            units.append('1')
            data.append(self.array)
            parameters.append('Voltage')
            units.append('Volts')
            data.append(self.x_value)
            parameters.append('Current')
            units.append('Amps')
            data.append(self.y_value)

            # File_info
            # First is file name
            file_info.append(self.O_file_name)
            # csv or txt file
            file_info.append(self.O_type)
            # the divide of csv is "," while for txt its "\t"
            file_info.append(self.O_divide)
            # Always "Collected Data"
            file_info.append(divider)
            # The saving directory
            file_info.append(self.O_directory)

            self.save_thread.input(comments, parameters, units, data,
                                   file_info)
            self.ui.pushButton_Open_O_keithley.setEnabled(True)
            self.ui.label_condition_O_keithley.setText('File has been saved.')

    def G_open(self):
        opendir = self.G_directory
        open_path = 'explorer "' + opendir + '"'
        subprocess.Popen(open_path)

    def O_open(self):
        opendir = self.O_directory
        open_path = 'explorer "' + opendir + '"'
        subprocess.Popen(open_path)
    def __init__(self, main, ui):
        self.ui = ui
        self.copyDataFunc = main.CopyDataFunc
        self.collect_data_thread = Collect_data()
        self.save_thread = Save_Thread()

        main.connect(self.ui.pushButton_browse_keithley, SIGNAL('clicked()'),
                     self.Browse_keithley)
        main.connect(self.ui.pushButton_import_keithley, SIGNAL('clicked()'),
                     self.Import_keithley)
        main.connect(self.ui.pushButton_close_keithley, SIGNAL('clicked()'),
                     self.Close_keithley)
        main.connect(self.ui.pushButton_select_keithley, SIGNAL('clicked()'),
                     self.Select_keithley)
        main.connect(self.ui.pushButton_scan_keithley, SIGNAL('clicked()'),
                     self.Scan_keithley)
        main.connect(self.ui.pushButton_pause_keithley, SIGNAL('clicked()'),
                     self.collect_data_thread.pause)
        main.connect(self.ui.pushButton_stop_keithley, SIGNAL('clicked()'),
                     self.collect_data_thread.stop)
        main.connect(self.ui.pushButton_clear_keithley, SIGNAL('clicked()'),
                     self.collect_data_thread.Clear_keithley)
        main.connect(self.ui.pushButton_copy_keithley, SIGNAL('clicked()'),
                     self.Copy_keithley)
        main.connect(self.ui.pushButton_fit_keithley, SIGNAL('clicked()'),
                     self.collect_data_thread.Fit)
        main.connect(self.ui.pushButton_browse_save_G_keithley,
                     SIGNAL('clicked()'), self.Google_browse)
        main.connect(self.ui.pushButton_browse_save_O_keithley,
                     SIGNAL('clicked()'), self.Other_browse)
        main.connect(self.ui.pushButton_check_G_keithley, SIGNAL('clicked()'),
                     self.Check)
        main.connect(self.ui.pushButton_Select_Directory_G_keithley,
                     SIGNAL('clicked()'), self.Google_select_namefolder)
        main.connect(self.ui.pushButton_Save_G_keithley, SIGNAL('clicked()'),
                     self.G_save)
        main.connect(self.ui.pushButton_Open_G_keithley, SIGNAL('clicked()'),
                     self.G_open)
        main.connect(self.ui.pushButton_Save_O_keithley, SIGNAL('clicked()'),
                     self.O_save)
        main.connect(self.ui.pushButton_Open_O_keithley, SIGNAL('clicked()'),
                     self.O_open)
        main.connect(
            self.ui.radioButton_voltage_keithley, SIGNAL("clicked()"),
            lambda: self.ui.tabWidget_scan_keithley.setCurrentIndex(0))
        main.connect(self.ui.radioButton_timescan_keithley,
                     SIGNAL("clicked()"),
                     self.collect_data_thread.Pre_MPL_Plot)
        main.connect(self.ui.radioButton_stepscan_keithley,
                     SIGNAL("clicked()"),
                     self.collect_data_thread.Pre_MPL_Plot)
        main.connect(self.collect_data_thread, SIGNAL("plot"), self.Plot_data)
        main.connect(self.collect_data_thread, SIGNAL("mpl_plot"),
                     self.Plot_analysis)
        main.connect(self.collect_data_thread, SIGNAL("data_available"),
                     self.Pre_save)
        # self.connect(self.Keithley_programs.collect_data_thread, SIGNAL("clear_plot"), self.Keithley_programs.Clear_plot)

        self.Array = []
        self.count = 0
        self.go_on = True

        # Set up guiqwt plot
        self.curve_item = make.curve([], [], color='b', marker="o")
        self.ui.curvewidget_keithley.plot.add_item(self.curve_item)
        self.ui.curvewidget_keithley.plot.set_antialiasing(True)
        self.ui.curvewidget_keithley.plot.set_titles(
            "Measurement and Plot Based on Array", "X-Axis", "Y-Axis")

        self.curve_ct_item = make.curve([], [], color='b', marker="o")
        self.ui.curvewidget_ct_keithley.plot.add_item(self.curve_ct_item)
        self.ui.curvewidget_ct_keithley.plot.set_antialiasing(True)
        self.ui.curvewidget_ct_keithley.plot.set_titles(
            "Current vs Time", "Time", "Current")

        self.curve_vt_item = make.curve([], [], color='b', marker="o")
        self.ui.curvewidget_vt_keithley.plot.add_item(self.curve_vt_item)
        self.ui.curvewidget_vt_keithley.plot.set_antialiasing(True)
        self.ui.curvewidget_vt_keithley.plot.set_titles(
            "Voltage vs Time", "Time", "Voltage")
Example #3
0
class Lock_In_Sweep():
    def __init__ (self, main, ui):

        self.ui = ui
        self.copyDataFunc = main.CopyDataFunc
        self.update_visa()

        self.collectDataThread = CollectData()
        self.save_thread = Save_Thread()
        
        main.connect(self.ui.pushButton_copy_LI, SIGNAL('clicked()'), self.Copy_LI_S)
        main.connect(self.ui.pushButtonSelectReadVisaLI_S, SIGNAL('clicked()'),self.select_ReadVisa)
        main.connect(self.ui.pushButtonSelectSweepVisaLI_S, SIGNAL('clicked()'), self.select_SweepVisa)
        main.connect(self.ui.pushButtonCloseReadVisaLI_S, SIGNAL('clicked()'), self.close_ReadVisa)
        main.connect(self.ui.pushButtonCloseSweepVisaLI_S, SIGNAL('clicked()'), self.close_SweepVisa)
        
        main.connect(self.ui.pushButtonStartLI_S, SIGNAL("clicked()"), self.start)
        main.connect(self.ui.pushButtonPauseLI_S, SIGNAL("clicked()"), self.collectDataThread.pause)
        main.connect(self.ui.pushButtonStopLI_S, SIGNAL("clicked()"), self.stop)
        
        main.connect(self.collectDataThread, SIGNAL("Plot"), self.plotData)
        main.connect(self.collectDataThread, SIGNAL("StatPlot"), self.plot_Stats)
        main.connect(self.collectDataThread, SIGNAL("PreSave"), self.pre_save)
        
        main.connect(self.ui.pushButtonBrowseLI_S, SIGNAL("clicked()"), self.browse)
        main.connect(self.ui.pushButtonSelectFolderLI_S, SIGNAL("clicked()"), self.select_name)
        main.connect(self.ui.radioButtonCSV_LI_S, SIGNAL("clicked()"), self.save_type)
        main.connect(self.ui.radioButtonTXT_LI_S, SIGNAL("clicked()"), self.save_type)
        main.connect(self.ui.pushButtonSaveLI_S, SIGNAL("clicked()"), self.save)


        self.canvas_import_LI_S = FigureCanvas(self.ui.mplwidget_import_LI_S.figure)
        self.canvas_import_LI_S.setParent(self.ui.widgetLI_S)
        # This is the toolbar widget for the import canvas
        self.mpl_toolbar_import_LI_S = NavigationToolbar(self.canvas_import_LI_S, self.ui.widgetLI_S)
        
        vbox_import_LI_S = QVBoxLayout()
        vbox_import_LI_S.addWidget(self.canvas_import_LI_S)
        vbox_import_LI_S.addWidget(self.mpl_toolbar_import_LI_S)
        self.ui.widgetLI_S.setLayout(vbox_import_LI_S)
        
        self.ui.mplwidget_import_LI_S = self.canvas_import_LI_S
        
        # Set up guiqwt plot
        self.curve_item = make.curve([], [], color = 'b', marker = "o")
        self.ui.curvewidgetLI_S.plot.add_item(self.curve_item)
        self.ui.curvewidgetLI_S.plot.set_antialiasing(True)
        
        self.curve_item_STDEV = make.curve([], [], color = 'b', marker = "o")
        self.ui.curvewidgetSTDEV_LI_S.plot.add_item(self.curve_item_STDEV)
        self.ui.curvewidgetSTDEV_LI_S.plot.set_antialiasing(True)
        
        self.curve_item_Mean = make.curve([], [], color = 'b', marker = "o")
        self.ui.curvewidgetMeanValue_LI_S.plot.add_item(self.curve_item_Mean)
        self.ui.curvewidgetMeanValue_LI_S.plot.set_antialiasing(True)
        
        self.ui.pushButtonStartLI_S.setEnabled(False)
        self.ui.pushButtonStopLI_S.setEnabled(False)
        self.ui.pushButtonPauseLI_S.setEnabled(False)
        self.ui.pushButtonClearLI_S.setEnabled(False)
        self.ui.pushButtonCloseReadVisaLI_S.setEnabled(False)
        self.ui.pushButtonCloseSweepVisaLI_S.setEnabled(False)
        
        self.SweepVisa_check = False
        self.ReadVisa_check = False
        

    # def Browse_LI_S(self):
    #     prev_dir = os.getcwd()
    #     fileDir = QFileDialog.getOpenFileName(None, 'Select File to Import', prev_dir, filter="Array Files (*.array)")
    #     if fileDir != '':
    #         file_list = str(fileDir).split('/')
    #         for i in range(0, len(file_list) - 1):
    #             global open_dir
    #             open_dir = ''
    #             if i < len(file_list) - 1:
    #                 open_dir += file_list[i] + '\\'
    #             elif i == len(file_list) - 1:
    #                 open_dir += file_list[i]
    #         fileDir.replace('/', '\\')        
    #     else:
    #         self.ui.lineEdit_condition_keithley.setText("Please choose valid file to import.")
    # 
    # def Import_LI_S(self):
    #     divider_found = True
    #     count = 0
    #     temp = 0
    #     self.Array = []
    #     x_value = []
    #     y_value = []
    #     
    #     fileDir = self.ui.lineEdit_directory_keithley.text()
    #     fp = open(fileDir)
    #     while True:
    #         if count == 5000:
    #             self.ui.lineEdit_condition_keithley.setText("Data not found in file. Please check it.")
    #             divider_found = False
    #             break
    #         line = fp.readline()
    #         line_list = line.split(',')
    #         if line_list[0].upper() == "Array Data".upper() + '\n':
    #             break
    #         count += 1
    #         
    #     if divider_found == True:
    #         line = fp.readline()
    #         while True:
    #             line = fp.readline().replace('\n', '')
    #             print 'line: ' + line
    #             if line == '':
    #                 break
    #             value = line.split(',')
    #             x_value.append(temp)
    #             x_value.append(temp + 1)
    #             y_value.append(value[1])
    #             y_value.append(value[1])
    #             self.Array.append(float(value[1]))
    #             temp += 1
    #             
    #         self.Plot_import(x_value, y_value)
    #         self.ui.lineEdit_condition_keithley.setText("File is imported correctly.")
    #         self.ui.groupBox_visa_keithley.setEnabled(True)
            
    def Copy_LI_S(self):
        Values = self.copyDataFunc()
        if Values != None:
            self.Array = []
            x_value = []
            y_value = []
            item = 0
            for i in range(0, len(Values)):
                for j in range(0, len(Values[i])):
                    x_value.append(item)
                    x_value.append(item + 1 - 0.0001)
                    y_value.append(Values[i][j])
                    y_value.append(Values[i][j])
                    self.Array.append(Values[i][j])
                    item += 1
            self.Plot_import(x_value, y_value)
        else:
            pass
            #self.ui.lineEdit_condition_keithley.setText('No valid array to copy.')
        
    def Plot_import(self, x, y):
        self.Reset_plot_import()
        self.axes_import.plot(x, y, marker = '.', linestyle = '-')
        self.axes_import.grid()
        self.axes_import.set_title("Array Import Plot")
        self.axes_import.set_xlabel("Steps")
        self.axes_import.set_ylabel("Values")
        self.ui.mplwidget_import_LI_S.draw()
        self.ui.lineEditStatusLI_S.setText("The array has been copied")
    
    # Reset the import matplot widget
    def Reset_plot_import(self):
        self.ui.mplwidget_import_LI_S.figure.clear()
        self.axes_import = self.ui.mplwidget_import_LI_S.figure.add_subplot(111)
        
    def update_visa(self):
        try:
            visas = rm.list_resources()
        except:
            self.ui.lineEditStatusLI_S.setText("No visas are connected")
            
        self.ui.comboBoxReadVisaLI_S.clear()
        self.ui.comboBoxSweepVisaLI_S.clear()
        
        for i in visas:
            self.ui.comboBoxReadVisaLI_S.addItem(i)
            self.ui.comboBoxSweepVisaLI_S.addItem(i)
            
    def select_ReadVisa(self):
        valid = False
        
        ReadVisa = str(self.ui.comboBoxReadVisaLI_S.currentText())
        rm = visa.ResourceManager()
        rm.list_resources()
        
        inst1 = rm.open_resource(ReadVisa)
        
        try:
            valid = self.check_ReadVisa(inst1)
        except:
            self.ui.lineEditStatusLI_S.setText("Error with Read visa")
            
        if valid == True:
            self.ReadVisa = inst1
            self.ui.labelReadVisaLI_S.setText(str(self.ReadVisa.ask('*IDN?')))
            self.ui.pushButtonCloseReadVisaLI_S.setEnabled(True)
            self.ui.lineEditStatusLI_S.setText("There are no errors")
            self.ReadVisa_check = True
        else:
            self.pushButtonStartLI_S.setEnabled(False)
            self.ui.labelReadVisaLI_S.setText("None")
            self.ui.labelSweepVisaLI_S.setText("None")
            self.ui.lineEditStatusLI_S.setText("There is an error with the visas")
            
        if self.SweepVisa_check == True:
            self.ui.pushButtonStartLI_S.setEnabled(True)
        else:
            self.ui.lineEditStatusLI_S.setText('Please choose other visa to start')
        
    def select_SweepVisa(self):
        valid = False
        SweepVisa = str(self.ui.comboBoxSweepVisaLI_S.currentText())
        rm = visa.ResourceManager()
        rm.list_resources()
        inst2 = rm.open_resource(SweepVisa)
        
        try:
            valid = self.check_SweepVisa(inst2)
        except:
            self.ui.lineEditStatusLI_S.setText("Error with the Sweep visa")
            
        if valid == True:
            self.SweepVisa = inst2
            self.ui.labelSweepVisaLI_S.setText(str(self.SweepVisa.ask('*IDN?')))
            self.ui.pushButtonCloseSweepVisaLI_S.setEnabled(True)
            self.ui.lineEditStatusLI_S.setText("There are no errors")
            self.SweepVisa_check = True
        else:
            self.ui.pushButtonStartLI_S.setEnabled(False)
            self.ui.lineEditStatusLI_S.setText("Error with the Sweep visa")
            
        if self.ReadVisa_check == True:
            self.ui.pushButtonStartLI_S.setEnabled(True)
        else:
            self.ui.lineEditStatusLI_S.setText('Please choose other visa to start')
        
    def check_ReadVisa(self, inst1):
        try:
            inst1.ask('*IDN?')
            valid = True
        except:
            valid = False
        return valid
    
    def check_SweepVisa(self, inst2):
        try:
            inst2.ask('*IDN?')
            valid = True
        except:
            valid = False
        
        return valid
    
    def close_ReadVisa(self):
        self.ReadVisa.close()
        self.ui.labelReadVisaLI_S.setText("")
        self.ui.lineEditStatusLI_S.setText("The Read Visa has been closed")
        
    def close_SweepVisa(self):
        self.SweepVisa.close()
        self.ui.labelSweepVisaLI_S.setText("")
        self.ui.lineEditStatusLI_S.setText("The Sweep Visa has been closed")

    def start(self):
        self.ui.pushButtonStartLI_S.setDisabled(True)
        self.ui.pushButtonPauseLI_S.setEnabled(True)
        self.ui.pushButtonStopLI_S.setEnabled(True)
        self.ui.tabWidgetLockIn_S.setCurrentIndex(1)
        
        
        if self.Array[0] < 200:
            self.SweepVisa.write('FRNG 2')
            self.SweepVisa.write('FREQ' + ' ' + str(self.Array[0]))
        else:
            pass
        time.sleep(1)
        self.ReadVisa.ask('MEAS:VOLT?')

            
        if int(self.SweepVisa.ask('SENS?')) < 3:
            self.sens_unit = 'nV'
            self.sens_magn = 1E-9
        elif int(self.SweepVisa.ask('Sens?')) >= 3 and int(self.SweepVisa.ask('SENS?')) < 12:
            self.sens_unit = 'uV'
            self.sens_magn = 1E-6
        else:
            self.sens_unit = 'mV'
            self.sens_magn = 1E-3
            
        self.magnitude = [self.sens_magn, self.sens_unit]

        self.collectDataThread.input(self.ui, self.curve_item,self.curve_item_STDEV, self.curve_item_Mean, self.ReadVisa, self.SweepVisa, self.Array, self.magnitude)
        self.ui.lineEditStatusLI_S.setText("Running...")
        
    def plotData(self, voltage, magnitude):
        self.ui.lineEditSTDEV_LI_S.setText(str(round(np.std(voltage/self.magnitude[0]),10)) + " " + magnitude[1])
        self.ui.lineEditMaxMinLI_S.setText(str(round(np.max(voltage/self.magnitude[0])- np.min(voltage/self.magnitude[0]), 10)) + " " + magnitude[1])
        self.ui.lineEditMeanValueLI_S.setText(str(np.mean(voltage/self.magnitude[0])) + " " + magnitude[1])
        self.curve_item.plot().replot()
        self.ui.curvewidgetLI_S.plot.do_autoscale()
        
    def plot_Stats(self):
        self.curve_item_STDEV.plot().replot()
        self.ui.curvewidgetSTDEV_LI_S.plot.do_autoscale()
        self.curve_item_Mean.plot().replot()
        self.ui.curvewidgetMeanValue_LI_S.plot.do_autoscale()
        
    def stop(self):
        self.collectDataThread.pauseLoop = True
        self.collectDataThread.quit()      
        self.ui.pushButtonStartLI_S.setEnabled(True)
        self.ui.pushButtonStopLI_S.setEnabled(False)
        self.ui.pushButtonPauseLI_S.setEnabled(False)
        
    def pre_save(self, Freq, Mean, Stdev, StepPoints):
        self.Freq = Freq
        self.Mean = Mean
        self.Stdev = Stdev
        self.StepPoints = StepPoints
    
        
    def browse(self):
        prev_dir = 'C:\\'
        file_list = []
        file_dir = QFileDialog.getExistingDirectory(None, 'Select The GoogleDrive Folder', prev_dir)
        if file_dir != '':
            file_list = str(file_dir).split('/')
            file_dir.replace('/', '\\')
            self.ui.lineEditDirectoryLI_S.setText(file_dir)
        self.directory = ''
        
    def select_name(self):
        file_list= []
        file_list = str(self.ui.lineEditDirectoryLI_S.text()).split('\\')
        for i in range(0, len(file_list)):
            self.directory += file_list[i] + '\\'
        namefolder = str(self.ui.comboBoxFoldersLI_S.currentText())
        if namefolder == 'None':
            self.ui.lineEditStatusLI_S.setText('Please Choose A Folder To Save To.')
        else:
            #Sets the name of the file to current date and time by default
            now = datetime.now()
            date = '%s-%s-%s' % (now.year, now.month, now.day)
            self.directory += namefolder + "\Data" + '\\' + date
            self.current_time = '%s.%s.%s' % (now.hour, now.month, now.second)
            self.date_and_time = date + ' ' + self.current_time
            self.file_name = (self.date_and_time)
            print self.directory
            
    def save_type(self):
        if self.ui.radioButtonCSV_LI_S.isChecked() == True:
            self.type = '.csv'
            self.divide = ','
        elif self.ui.radioButtonTXT_LI_S.isChecked() == True:
            self.type = '.txt'
            self.divide = '\t'
            
    def save_name(self):
        if self.ui.radioButtonDateTime_LI_S.isChecked():
            now = datetime.now()
            date = '%s-%s-%s' % (now.year, now.month, now.day)
            current_time = '%s.%s.%s' % (now.hour, now.month, now.second)
            date_and_time = date + ' ' + current_time
            self.file_name = str(date_and_time)
        elif self.ui.radioButtonCustomName_LI_S.isChecked():
            self.file_name = str(self.ui.lineEditCustomLI_S.text())
            
    def save(self):
        if self.ui.radioButtonCustomName_LI_S.isChecked() and self.ui.lineEditCustomLI_S.text() == ' ':
            self.ui.lineEditStatusLI_S.setText('Please Enter A Custom File Name')
        else:
            self.save_type()
            self.save_name()
            
        comments = []
        file_info = []
        parameters = []
        units = []
        data = []
        divider = 'Collected Data'
        
        parameters.append('Frequency')
        units.append('Hz')
        data.append(self.Freq)
        
        parameters.append('Points Collected')
        units.append('1')
        data.append(self.StepPoints)
        
        parameters.append('Standard Deviation')
        units.append(self.magnitude[1])
        data.append(self.Stdev)
        
        parameters.append('Mean Value')
        units.append(self.magnitude[1])
        data.append(self.Mean)
        
        file_info.append(self.file_name)
        file_info.append(self.type)
        file_info.append(self.divide)
        file_info.append(divider)
        file_info.append(self.directory)
        
        self.save_thread.input(comments, parameters, units, data, file_info)
        self.ui.lineEditStatusLI_S.setText("File has been saved")
Example #4
0
    def __init__ (self, main, ui):

        self.ui = ui
        self.copyDataFunc = main.CopyDataFunc
        self.update_visa()

        self.collectDataThread = CollectData()
        self.save_thread = Save_Thread()
        
        main.connect(self.ui.pushButton_copy_LI, SIGNAL('clicked()'), self.Copy_LI_S)
        main.connect(self.ui.pushButtonSelectReadVisaLI_S, SIGNAL('clicked()'),self.select_ReadVisa)
        main.connect(self.ui.pushButtonSelectSweepVisaLI_S, SIGNAL('clicked()'), self.select_SweepVisa)
        main.connect(self.ui.pushButtonCloseReadVisaLI_S, SIGNAL('clicked()'), self.close_ReadVisa)
        main.connect(self.ui.pushButtonCloseSweepVisaLI_S, SIGNAL('clicked()'), self.close_SweepVisa)
        
        main.connect(self.ui.pushButtonStartLI_S, SIGNAL("clicked()"), self.start)
        main.connect(self.ui.pushButtonPauseLI_S, SIGNAL("clicked()"), self.collectDataThread.pause)
        main.connect(self.ui.pushButtonStopLI_S, SIGNAL("clicked()"), self.stop)
        
        main.connect(self.collectDataThread, SIGNAL("Plot"), self.plotData)
        main.connect(self.collectDataThread, SIGNAL("StatPlot"), self.plot_Stats)
        main.connect(self.collectDataThread, SIGNAL("PreSave"), self.pre_save)
        
        main.connect(self.ui.pushButtonBrowseLI_S, SIGNAL("clicked()"), self.browse)
        main.connect(self.ui.pushButtonSelectFolderLI_S, SIGNAL("clicked()"), self.select_name)
        main.connect(self.ui.radioButtonCSV_LI_S, SIGNAL("clicked()"), self.save_type)
        main.connect(self.ui.radioButtonTXT_LI_S, SIGNAL("clicked()"), self.save_type)
        main.connect(self.ui.pushButtonSaveLI_S, SIGNAL("clicked()"), self.save)


        self.canvas_import_LI_S = FigureCanvas(self.ui.mplwidget_import_LI_S.figure)
        self.canvas_import_LI_S.setParent(self.ui.widgetLI_S)
        # This is the toolbar widget for the import canvas
        self.mpl_toolbar_import_LI_S = NavigationToolbar(self.canvas_import_LI_S, self.ui.widgetLI_S)
        
        vbox_import_LI_S = QVBoxLayout()
        vbox_import_LI_S.addWidget(self.canvas_import_LI_S)
        vbox_import_LI_S.addWidget(self.mpl_toolbar_import_LI_S)
        self.ui.widgetLI_S.setLayout(vbox_import_LI_S)
        
        self.ui.mplwidget_import_LI_S = self.canvas_import_LI_S
        
        # Set up guiqwt plot
        self.curve_item = make.curve([], [], color = 'b', marker = "o")
        self.ui.curvewidgetLI_S.plot.add_item(self.curve_item)
        self.ui.curvewidgetLI_S.plot.set_antialiasing(True)
        
        self.curve_item_STDEV = make.curve([], [], color = 'b', marker = "o")
        self.ui.curvewidgetSTDEV_LI_S.plot.add_item(self.curve_item_STDEV)
        self.ui.curvewidgetSTDEV_LI_S.plot.set_antialiasing(True)
        
        self.curve_item_Mean = make.curve([], [], color = 'b', marker = "o")
        self.ui.curvewidgetMeanValue_LI_S.plot.add_item(self.curve_item_Mean)
        self.ui.curvewidgetMeanValue_LI_S.plot.set_antialiasing(True)
        
        self.ui.pushButtonStartLI_S.setEnabled(False)
        self.ui.pushButtonStopLI_S.setEnabled(False)
        self.ui.pushButtonPauseLI_S.setEnabled(False)
        self.ui.pushButtonClearLI_S.setEnabled(False)
        self.ui.pushButtonCloseReadVisaLI_S.setEnabled(False)
        self.ui.pushButtonCloseSweepVisaLI_S.setEnabled(False)
        
        self.SweepVisa_check = False
        self.ReadVisa_check = False
    def __init__(self, main, ui):
        self.ui = ui
        self.copyData = main.copyData
        self.collectDataThread = CollectData()
        self.save_thread = Save_Thread()
        
        self.rm = visa.ResourceManager()
        self.update_visa()
        
        self.ui.startButton.setDisabled(True)
        self.ui.closeVisaButton0.setDisabled(True)
        self.ui.closeVisaButton1.setDisabled(True)
        self.ui.stopButton.setEnabled(False)
        self.ui.startButton.setEnabled(False)
        
        self.x_value = []
        self.y_value = []
        self.item = 0
        self.Array = []
        self.frontX = 0.0
        self.frontY = 0.0
        self.backX = 0.0
        self.backY = 0.0
        self.x_plot = [-1.0,1.0]
        self.y_plot = [-1.0,1.0]
        
        self.timeStep = .1
        self.ui.timeStepValue.setText(str(self.timeStep))
        
        self.directory = ''
        self.temp = []

        # Sets up Current v. Voltage guiqwt plot
        self.curve_item_ay = make.curve([], [], color='b', marker = "o")
        self.ui.curvewidget_scanPlot_ay.plot.add_item(self.curve_item_ay)
        self.ui.curvewidget_scanPlot_ay.plot.set_antialiasing(True)
        self.ui.curvewidget_scanPlot_ay.plot.set_titles("Current v. Voltage", "Current (A)", "Voltage (V)")
        
        # Sets up Voltage v. Time Step guiqwt plot
        self.curve_item_vt_ay = make.curve([], [], color='b', marker = "o")
        self.ui.curvewidget_vt_ay.plot.add_item(self.curve_item_vt_ay)
        self.ui.curvewidget_vt_ay.plot.set_antialiasing(True)
        self.ui.curvewidget_vt_ay.plot.set_titles("Voltage v. Time Step", "Time Step", "Voltage (V)")
        
         # Sets up Current v. Time Step guiqwt plot
        self.curve_item_ct_ay = make.curve([], [], color='b', marker = "o")
        self.ui.curvewidget_ct_ay.plot.add_item(self.curve_item_ct_ay)
        self.ui.curvewidget_ct_ay.plot.set_antialiasing(True)
        self.ui.curvewidget_ct_ay.plot.set_titles("Current v. Time Step", "Time Step", "Current (A)")
        
        main.connect(self.ui.startButton, SIGNAL("clicked()"), self.start)
        main.connect(self.ui.stopButton, SIGNAL("clicked()"), self.stop)
        main.connect(self.ui.slopeButton_ay, SIGNAL("clicked()"), self.slopeTriger)
        main.connect(self.collectDataThread, SIGNAL("stop"), self.stop)
        main.connect(self.collectDataThread, SIGNAL("plot"), self.plotData)
        main.connect(self.collectDataThread, SIGNAL("analyse"), self.analyse)

        main.connect(self.ui.pushButton_browse_ay, SIGNAL('clicked()'), self.browse_ay)
        main.connect(self.ui.pushButton_import_ay, SIGNAL('clicked()'), self.import_ay)
        main.connect(self.ui.pushButton_copy_ay, SIGNAL('clicked()'), self.copy_ay)
        main.connect(self.ui.selectVisaButton, SIGNAL("clicked()"), self.select_visa)
        main.connect(self.ui.updateVisaButton, SIGNAL("clicked()"), self.update_visa)
        main.connect(self.ui.closeVisaButton0, SIGNAL("clicked()"), self.close_visa0)
        main.connect(self.ui.closeVisaButton1, SIGNAL("clicked()"), self.close_visa1)
        
        main.connect(self.ui.pushButton_browse_save_G_ay, SIGNAL('clicked()'), self.Google_browse)
        main.connect(self.ui.pushButton_browse_save_O_ay, SIGNAL('clicked()'), self.Other_browse)
        main.connect(self.ui.pushButton_check_G_ay, SIGNAL('clicked()'), self.Check)
        main.connect(self.ui.pushButton_Select_Directory_G_ay, SIGNAL('clicked()'), self.Google_select_namefolder)
        main.connect(self.ui.pushButton_Save_G_ay, SIGNAL('clicked()'), self.G_save)
        main.connect(self.ui.pushButton_Open_G_ay, SIGNAL('clicked()'), self.G_open)
        main.connect(self.ui.pushButton_Save_O_ay, SIGNAL('clicked()'), self.O_save)
        main.connect(self.ui.pushButton_Open_O_ay, SIGNAL('clicked()'), self.O_open)
        
        main.ui.mplwidget_analysis_ay.figure.canvas.mpl_connect('button_release_event', self.slope)
    def __init__(self, main, ui):
        self.ui = ui
        self.copyData = main.copyData
        self.collectDataThread = CollectData()
        self.save_thread = Save_Thread()

        self.update_visa()

        self.ui.pushButtonStart.setDisabled(True)
        self.ui.pushButtoncloseVisa1.setDisabled(True)
        self.ui.pushButtoncloseVisa2.setDisabled(True)
        self.ui.pushButtonStop.setEnabled(False)
        self.ui.pushButtonStart.setEnabled(False)

        self.x_value = []
        self.y_value = []
        self.item = 0
        self.Array = []

        self.timeStep = .1
        self.ui.lineEditTimeStep.setText(str(self.timeStep))

        self.directory = ''
        self.temp = []

        # Sets up Current v. Voltage guiqwt plot
        self.curve_item_ay = make.curve([], [], color='b', marker="o")
        self.ui.curvewidget_scanPlot_ay.plot.add_item(self.curve_item_ay)
        self.ui.curvewidget_scanPlot_ay.plot.set_antialiasing(True)

        # Sets up Voltage v. Time Step guiqwt plot
        self.curve_item_vt_ay = make.curve([], [], color='b', marker="o")
        self.ui.curvewidget_vt_ay.plot.add_item(self.curve_item_vt_ay)
        self.ui.curvewidget_vt_ay.plot.set_antialiasing(True)

        # Sets up Current v. Time Step guiqwt plot
        self.curve_item_ct_ay = make.curve([], [], color='b', marker="o")
        self.ui.curvewidget_ct_ay.plot.add_item(self.curve_item_ct_ay)
        self.ui.curvewidget_ct_ay.plot.set_antialiasing(True)

        # For the canvas.
        self.canvas_import_ay = FigureCanvas(
            self.ui.mplwidget_import_ay.figure)
        self.canvas_import_ay.setParent(self.ui.widget_import_ay)
        self.mpl_toolbar_import_ay = NavigationToolbar(
            self.canvas_import_ay, self.ui.widget_import_ay)
        self.canvas_analysis_ay = FigureCanvas(
            self.ui.mplwidget_analysis_ay.figure)
        self.canvas_analysis_ay.setParent(self.ui.widget_analysis_ay)
        self.mpl_toolbar_analysis_ay = NavigationToolbar(
            self.canvas_analysis_ay, self.ui.widget_analysis_ay)
        self.canvas_analysis_ct_ay = FigureCanvas(
            self.ui.mplwidget_analysis_ct_ay.figure)
        self.canvas_analysis_ct_ay.setParent(self.ui.widget_analysis_ct_ay)
        self.mpl_toolbar_analysis_ct_ay = NavigationToolbar(
            self.canvas_analysis_ct_ay, self.ui.widget_analysis_ct_ay)
        self.canvas_analysis_vt_ay = FigureCanvas(
            self.ui.mplwidget_analysis_vt_ay.figure)
        self.canvas_analysis_vt_ay.setParent(self.ui.widget_analysis_vt_ay)
        self.mpl_toolbar_analysis_vt_ay = NavigationToolbar(
            self.canvas_analysis_vt_ay, self.ui.widget_analysis_vt_ay)

        # Create the QVBoxLayout object and add the widget into the layout
        vbox_import_ay = QVBoxLayout()
        vbox_import_ay.addWidget(self.canvas_import_ay)
        vbox_import_ay.addWidget(self.mpl_toolbar_import_ay)
        self.ui.widget_import_ay.setLayout(vbox_import_ay)
        vbox_analysis_ay = QVBoxLayout()
        vbox_analysis_ay.addWidget(self.canvas_analysis_ay)
        vbox_analysis_ay.addWidget(self.mpl_toolbar_analysis_ay)
        self.ui.widget_analysis_ay.setLayout(vbox_analysis_ay)
        vbox_analysis_ct_ay = QVBoxLayout()
        vbox_analysis_ct_ay.addWidget(self.canvas_analysis_ct_ay)
        vbox_analysis_ct_ay.addWidget(self.mpl_toolbar_analysis_ct_ay)
        self.ui.widget_analysis_ct_ay.setLayout(vbox_analysis_ct_ay)
        vbox_analysis_vt_ay = QVBoxLayout()
        vbox_analysis_vt_ay.addWidget(self.canvas_analysis_vt_ay)
        vbox_analysis_vt_ay.addWidget(self.mpl_toolbar_analysis_vt_ay)
        self.ui.widget_analysis_vt_ay.setLayout(vbox_analysis_vt_ay)

        # Connect the mplwidget with canvass
        self.ui.mplwidget_import_ay = self.canvas_import_ay
        self.ui.mplwidget_analysis_ay = self.canvas_analysis_ay
        self.ui.mplwidget_analysis_ct_ay = self.canvas_analysis_ct_ay
        self.ui.mplwidget_analysis_vt_ay = self.canvas_analysis_vt_ay

        main.connect(self.ui.pushButtonselectVisa, SIGNAL('clicked()'),
                     self.select_visa)
        main.connect(self.ui.pushButtonupdateVisa, SIGNAL('clicked()'),
                     self.update_visa)
        main.connect(self.ui.pushButtoncloseVisa1, SIGNAL('clicked()'),
                     self.close_visaCurrent)
        main.connect(self.ui.pushButtoncloseVisa2, SIGNAL('clicked()'),
                     self.close_visaVoltage)

        main.connect(self.ui.pushButton_browse_ay, SIGNAL('clicked()'),
                     self.browse_ay)
        main.connect(self.ui.pushButton_import_ay, SIGNAL('clicked()'),
                     self.import_ay)
        main.connect(self.ui.pushButton_copy_ay, SIGNAL('clicked()'),
                     self.copy_ay)

        main.connect(self.ui.pushButtonStart, SIGNAL('clicked()'),
                     self.pre_start)
        main.connect(self.ui.pushButtonPause, SIGNAL('clicked()'),
                     self.collectDataThread.pause)
        main.connect(self.ui.pushButtonStop, SIGNAL('clicked()'), self.stop)
        main.connect(self.ui.pushButtonClear, SIGNAL('clicked()'),
                     self.clear_plots)
        main.connect(self.ui.pushButtonFit, SIGNAL('clicked()'), self.Fit)

        main.connect(self.collectDataThread, SIGNAL("Plot"), self.plotData)
        main.connect(self.collectDataThread, SIGNAL("Analyze"), self.Analyze)

        main.connect(self.ui.pushButton_browse_save_G_ay, SIGNAL('clicked()'),
                     self.Google_browse)
        main.connect(self.ui.pushButton_check_G_ay, SIGNAL('clicked()'),
                     self.Check)
        main.connect(self.ui.pushButton_Select_Directory_G_ay,
                     SIGNAL('clicked()'), self.Google_select_namefolder)
        main.connect(self.ui.radioButton_csv_G_ay, SIGNAL('clicked()'),
                     self.Select_type_G_ay)
        main.connect(self.ui.radioButton_txt_G_ay, SIGNAL('clicked()'),
                     self.Select_type_G_ay)
        main.connect(self.ui.radioButton_Timename_G_ay, SIGNAL('clicked()'),
                     self.Select_name_G_ay)
        main.connect(self.ui.radioButton_Custom_Name_G_ay, SIGNAL('clicked()'),
                     self.Select_name_G_ay)
        main.connect(self.ui.pushButton_Save_G_ay, SIGNAL('clicked()'),
                     self.G_save)
class Agilent_Yokogawa():
    def __init__(self, main, ui):
        self.ui = ui
        self.copyData = main.copyData
        self.collectDataThread = CollectData()
        self.save_thread = Save_Thread()
        
        self.rm = visa.ResourceManager()
        self.update_visa()
        
        self.ui.startButton.setDisabled(True)
        self.ui.closeVisaButton0.setDisabled(True)
        self.ui.closeVisaButton1.setDisabled(True)
        self.ui.stopButton.setEnabled(False)
        self.ui.startButton.setEnabled(False)
        
        self.x_value = []
        self.y_value = []
        self.item = 0
        self.Array = []
        self.frontX = 0.0
        self.frontY = 0.0
        self.backX = 0.0
        self.backY = 0.0
        self.x_plot = [-1.0,1.0]
        self.y_plot = [-1.0,1.0]
        
        self.timeStep = .1
        self.ui.timeStepValue.setText(str(self.timeStep))
        
        self.directory = ''
        self.temp = []

        # Sets up Current v. Voltage guiqwt plot
        self.curve_item_ay = make.curve([], [], color='b', marker = "o")
        self.ui.curvewidget_scanPlot_ay.plot.add_item(self.curve_item_ay)
        self.ui.curvewidget_scanPlot_ay.plot.set_antialiasing(True)
        self.ui.curvewidget_scanPlot_ay.plot.set_titles("Current v. Voltage", "Current (A)", "Voltage (V)")
        
        # Sets up Voltage v. Time Step guiqwt plot
        self.curve_item_vt_ay = make.curve([], [], color='b', marker = "o")
        self.ui.curvewidget_vt_ay.plot.add_item(self.curve_item_vt_ay)
        self.ui.curvewidget_vt_ay.plot.set_antialiasing(True)
        self.ui.curvewidget_vt_ay.plot.set_titles("Voltage v. Time Step", "Time Step", "Voltage (V)")
        
         # Sets up Current v. Time Step guiqwt plot
        self.curve_item_ct_ay = make.curve([], [], color='b', marker = "o")
        self.ui.curvewidget_ct_ay.plot.add_item(self.curve_item_ct_ay)
        self.ui.curvewidget_ct_ay.plot.set_antialiasing(True)
        self.ui.curvewidget_ct_ay.plot.set_titles("Current v. Time Step", "Time Step", "Current (A)")
        
        main.connect(self.ui.startButton, SIGNAL("clicked()"), self.start)
        main.connect(self.ui.stopButton, SIGNAL("clicked()"), self.stop)
        main.connect(self.ui.slopeButton_ay, SIGNAL("clicked()"), self.slopeTriger)
        main.connect(self.collectDataThread, SIGNAL("stop"), self.stop)
        main.connect(self.collectDataThread, SIGNAL("plot"), self.plotData)
        main.connect(self.collectDataThread, SIGNAL("analyse"), self.analyse)

        main.connect(self.ui.pushButton_browse_ay, SIGNAL('clicked()'), self.browse_ay)
        main.connect(self.ui.pushButton_import_ay, SIGNAL('clicked()'), self.import_ay)
        main.connect(self.ui.pushButton_copy_ay, SIGNAL('clicked()'), self.copy_ay)
        main.connect(self.ui.selectVisaButton, SIGNAL("clicked()"), self.select_visa)
        main.connect(self.ui.updateVisaButton, SIGNAL("clicked()"), self.update_visa)
        main.connect(self.ui.closeVisaButton0, SIGNAL("clicked()"), self.close_visa0)
        main.connect(self.ui.closeVisaButton1, SIGNAL("clicked()"), self.close_visa1)
        
        main.connect(self.ui.pushButton_browse_save_G_ay, SIGNAL('clicked()'), self.Google_browse)
        main.connect(self.ui.pushButton_browse_save_O_ay, SIGNAL('clicked()'), self.Other_browse)
        main.connect(self.ui.pushButton_check_G_ay, SIGNAL('clicked()'), self.Check)
        main.connect(self.ui.pushButton_Select_Directory_G_ay, SIGNAL('clicked()'), self.Google_select_namefolder)
        main.connect(self.ui.pushButton_Save_G_ay, SIGNAL('clicked()'), self.G_save)
        main.connect(self.ui.pushButton_Open_G_ay, SIGNAL('clicked()'), self.G_open)
        main.connect(self.ui.pushButton_Save_O_ay, SIGNAL('clicked()'), self.O_save)
        main.connect(self.ui.pushButton_Open_O_ay, SIGNAL('clicked()'), self.O_open)
        
        main.ui.mplwidget_analysis_ay.figure.canvas.mpl_connect('button_release_event', self.slope)
        
    def browse_ay(self):
        prev_dir = os.getcwd()
        print prev_dir
        fileDir = QFileDialog.getOpenFileName(None, 'Select File to Import', prev_dir, filter="Array Files (*.array)")
        if fileDir != '':
            file_list = str(fileDir).split('/')
            for i in range(0, len(file_list) - 1):
                global open_dir
                open_dir = ''
                if i < len(file_list) - 1:
                    open_dir += file_list[i] + '\\'
                elif i == len(file_list) - 1:
                    open_dir += file_list[i]
            fileDir.replace('/', '\\')
            self.ui.lineEdit_directory_ay.setText(fileDir)
            self.ui.pushButton_import_ay.setEnabled(True)
            self.ui.lineEdit_condition_ay.setText('File: "' + file_list[len(file_list) - 1] + '" has been chosen.')   

    def import_ay(self):
        divider_found = True
        count = 0
        temp = 0
        x_value = []
        y_value = []
        
        fileDir = self.ui.lineEdit_directory_ay.text()
        fp = open(fileDir)
        while True:
            if count == 5000:
                self.ui.lineEdit_condition_ay.setText("Data not found in file. Please check it.")
                divider_found = False
                break
            line = fp.readline()
            line_list = line.split(',')
            if line_list[0].upper() == "Array Data".upper() + '\n':
                break
            count += 1
            
        if divider_found == True:
            line = fp.readline()
            while True:
                line = fp.readline().replace('\n', '')
                if line == '':
                    break
                value = line.split(',')
                x_value.append(temp)
                x_value.append(temp + 1)
                y_value.append(value[1])
                y_value.append(value[1])
                self.Array.append(value[1])
                temp += 1
            
            self.plot_import(x_value, y_value)
            self.ui.output.setText("File was imported correctly.")
            
    def copy_ay(self):
        Values = self.copyData()
        if not Values == False:
            for i in range(0, len(Values)):
                for j in range(0, len(Values[i])):
                    self.x_value.append(self.item)
                    self.x_value.append(self.item + 1)
                    self.y_value.append(Values[i][j])
                    self.y_value.append(Values[i][j])
                    self.Array.append(Values[i][j])
                    self.item += 1
        self.plot_import(self.x_value, self.y_value)

    def check_visa(self, inst):
        try:
            inst.ask("*IDN?")
            valid = True
        except:
            valid = False
        return valid
    
    def update_visa(self):
        try:
            visas = self.rm.list_resources()
        except:
            visas = ''
        
        current_visa0 = self.ui.visa0.text()
        current_visa1 = self.ui.visa1.text()
        
        check_current0 = False
        check_current1 = False
        
        self.ui.selectVisa0.clear()
        self.ui.selectVisa1.clear()
        
        for each_visa in visas:
            if current_visa0 == each_visa:
                check_current0 = True
            self.ui.selectVisa0.addItem(each_visa)
            
        for each_visa in visas:
            if current_visa1 == each_visa:
                check_current1 = True
            self.ui.selectVisa1.addItem(each_visa)
        
        if check_current0 == False:
            self.ui.visa0.setText("None")
            self.ui.startButton.setDisabled(True)
            self.ui.closeVisaButton0.setDisabled(True)
        
        if check_current1 == False:
            self.ui.visa1.setText("None")
            self.ui.startButton.setDisabled(True)
            self.ui.closeVisaButton1.setDisabled(True)

    def select_visa(self):
        visa_chosen0 = str(self.ui.selectVisa0.currentText())
        visa_chosen1 = str(self.ui.selectVisa1.currentText())
        valid = False

        try:
            inst0 = self.rm.open_resource(visa_chosen0)
            inst1 = self.rm.open_resource(visa_chosen1)
            valid = True
        except:
            valid = False

        if valid:
            self.ui.visa0.setText(visa_chosen0)
            self.ui.visa1.setText(visa_chosen1)
            self.visa_chosen0 = inst0
            self.visa_chosen1 = inst1
            self.visa0_name = self.visa_chosen0.ask('*IDN?')
            self.visa1_name = self.visa_chosen1.ask('*IDN?')
            self.ui.output.setText(self.visa0_name + self.visa1_name)
            self.ui.error.setText("None")
            self.ui.startButton.setDisabled(False)
            self.ui.stopButton.setDisabled(False)
            self.ui.closeVisaButton0.setDisabled(False)
            self.ui.closeVisaButton1.setDisabled(False)

            self.visa_chosen0.write('SOUR:FUNC CURR')
            self.visa_chosen0.write('SOUR:PROT:VOLT 30')
        elif not valid:
            self.ui.error.setText("Invalid Visa Port.")
            self.ui.visa0.setText("None")
            self.ui.visa1.setText("None")
            self.visa_chosen0 = False
            self.ui.startButton.setDisabled(True)
            self.ui.closeVisaButton0.setDisabled(True)
            self.ui.closeVisaButton1.setDisabled(True)
    
    def close_visa0(self):
        self.collectDataThread.stop()
        try:
            self.ui.output.setText(self.visa_chosen0.ask("*IDN?"))
            valid = True
        except:
            valid = False

        if valid == True:
            self.ui.visa0.setText("None")
            self.ui.error.setText("None")
            self.visa_chosen0.close()
        
        elif valid == False:
            self.ui.error.setText("No visa connected.")
            self.ui.visa0.setText("None")
            
        self.visa_chosen0 = False
        self.ui.startButton.setDisabled(True)
        self.ui.stopButton.setDisabled(True)
        self.ui.closeVisaButton0.setDisabled(True)
        
    def close_visa1(self):
        self.collectDataThread.stop()
        try:
            self.ui.output.setText(self.visa_chosen1.ask('*IDN?'))
            valid = True
        except:
            valid = False

        if valid == True:
            self.ui.visa1.setText('None')
            self.ui.error.setText("None")
            self.visa_chosen1.close()
        
        elif valid == False:
            self.ui.error.setText("No visa connected.")
            self.ui.visa1.setText("None")
        
        self.visa_chosen1 = False
        self.ui.startButton.setDisabled(True)
        self.ui.stopButton.setDisabled(True)
        self.ui.closeVisaButton1.setDisabled(True)
    
    def start(self):
        if self.ui.startButton.text() == 'Start':
            self.visa_chosen0.write('OUTP ON')
            self.timeStep = float(self.ui.timeStepValue.text())
            self.ui.timeStepValue.setDisabled(True)
            self.collectDataThread.input(self.ui, self.visa_chosen0, self.visa_chosen1, self.Array, self.timeStep, self.curve_item_ay, self.curve_item_vt_ay, self.curve_item_ct_ay, [], [], [])
            self.ui.stopButton.setEnabled(True)
            self.ui.output.setText("Running")
            self.ui.startButton.setText("Pause")
        else:
            self.collectDataThread.pause()
            
    def stop(self):
        if self.ui.stopButton.text() == 'Stop':
            self.collectDataThread.stop()
                
    def plot_import(self, x, y):
        self.ui.mplwidget_import_ay.figure.clear()
        self.axes_import = self.ui.mplwidget_import_ay.figure.add_subplot(111)
        self.axes_import.plot(x, y, marker = '.', linestyle = '-')
        self.axes_import.grid()
        self.axes_import.set_title("Array Import Plot")
        self.axes_import.set_xlabel("Steps")
        self.axes_import.set_ylabel("Values")
        self.ui.mplwidget_import_ay.draw()

    def plotData(self):
        self.ui.curvewidget_scanPlot_ay.plot.do_autoscale()
        self.ui.curvewidget_vt_ay.plot.do_autoscale()
        self.ui.curvewidget_ct_ay.plot.do_autoscale()
        self.curve_item_ay.plot().replot()
        self.curve_item_vt_ay.plot().replot()
        self.curve_item_ct_ay.plot().replot()

    def analyse(self, date_value, t_value, x_plot, y_plot):
        self.date_value = date_value
        self.t_value = t_value
        self.x_plot = x_plot
        self.y_plot = y_plot
        self.ui.mplwidget_analysis_ay.figure.clear()
        self.axes_analysis_ay = self.ui.mplwidget_analysis_ay.figure.add_subplot(111)
        self.axes_analysis_ay.grid()
        self.axes_analysis_ay.set_title('Voltage v. Current')
        self.axes_analysis_ay.set_ylabel("Voltage (V)")
        self.axes_analysis_ay.set_xlabel("Current (A)")
        self.axes_analysis_ay.plot(x_plot, y_plot, marker = '.', linestyle = '-')
        self.ui.mplwidget_analysis_ay.draw()
        self.frontX = self.x_plot[0]
        self.frontY = self.y_plot[0]
        self.ui.tabWidget_save_ay.setEnabled(True)
        
        self.ui.mplwidget_analysis_ct_ay.figure.clear()
        self.axes_analysis_ct_ay = self.ui.mplwidget_analysis_ct_ay.figure.add_subplot(111)
        self.axes_analysis_ct_ay.grid()
        self.axes_analysis_ct_ay.set_title('Current v. Step')
        self.axes_analysis_ct_ay.set_ylabel("Current (A)")
        self.axes_analysis_ct_ay.set_xlabel("Step")
        self.axes_analysis_ct_ay.plot(t_value, y_plot, marker = '.', linestyle = '-')
        self.ui.mplwidget_analysis_ct_ay.draw()
        
        self.ui.mplwidget_analysis_vt_ay.figure.clear()
        self.axes_analysis_vt_ay = self.ui.mplwidget_analysis_vt_ay.figure.add_subplot(111)
        self.axes_analysis_vt_ay.grid()
        self.axes_analysis_vt_ay.set_title('Voltage v. Step')
        self.axes_analysis_vt_ay.set_ylabel("Voltage (V)")
        self.axes_analysis_vt_ay.set_xlabel("Step")
        self.axes_analysis_vt_ay.plot(t_value, x_plot, marker = '.', linestyle = '-')
        self.ui.mplwidget_analysis_vt_ay.draw()

    def slopeTriger(self):
        if self.ui.slope_ay.isChecked():
            self.ui.slope_ay.setChecked(False)
        else:
            self.ui.slope_ay.setChecked(True)

    def slope(self, event=None):
        if self.ui.slope_ay.isChecked():
            self.backX = self.frontX 
            self.backY = self.frontY
            self.frontX = event.xdata
            self.frontY = event.ydata
            
            index= min(range(len(self.x_plot)), key=lambda i: math.sqrt((self.x_plot[i]-self.frontX)**2+(self.y_plot[i]-self.frontY)**2))
            
            self.frontX = self.x_plot[index]
            self.frontY = self.y_plot[index]
            
            if not ((self.frontX == self.backX) or (self.frontY == self.backY)):
                try:
                    VI = (self.frontY-self.backY)/(self.frontX-self.backX)
                except:
                    VI = "None"
                
                try:
                    IV = (self.frontX-self.backX)/(self.frontY-self.backY)
                except:
                    IV = "None"
                    
                self.ui.output.setText("Resistance: " + str(VI) + " Ohm")
                self.ui.slop_VI_ay.setText(str(VI))
                self.ui.slop_IV_ay.setText(str(IV))
            
            x = [self.backX, self.frontX]
            y = [self.backY, self.frontY]
            
            self.ui.start_end_fit_ay.setText("(" + str(self.backX) + ", " + str(self.backY) + "), " +"(" + str(self.frontX) + ", " + str(self.frontY) + ")")
            
            self.ui.mplwidget_analysis_ay.figure.clear()
            self.axes_analysis_ay = self.ui.mplwidget_analysis_ay.figure.add_subplot(111)
            self.axes_analysis_ay.grid()
            self.axes_analysis_ay.set_title('Voltage v. Current')
            self.axes_analysis_ay.set_ylabel("Voltage (V)")
            self.axes_analysis_ay.set_xlabel("Current (A)")
            self.axes_analysis_ay.plot(self.x_plot, self.y_plot, 'b.-', x, y, 'r')
            self.ui.mplwidget_analysis_ay.draw()

    def browse(self):
        prev_dir = 'C:\\Users'
        try:   
            self.directory = QFileDialog.getExistingDirectory(self, 'Select Google Drive File to Open:', prev_dir)
        except ValueError:
            self.directory = False
        if self.directory != '' and self.directory != False:
            self.file_list = str(self.directory).split('/')
            for i in range(0, len(self.file_list) - 1):
                if i < len(self.file_list) - 1:
                    self.open_dir += self.file_list[i] + '\\'
                elif i == len(self.file_list) - 1:
                    self.open_dir += self.file_list[i]
            self.directory.replace('/', '\\')
            self.ui.directory.setText(self.directory)
            self.ui.output.setText('Folder reached.')
        else:
            self.directory = False
            self.ui.directory.setText('None')
            self.ui.output.setText('Failed to reach folder.')
        self.update_folders()

    def update_folders(self):
        self.ui.folderName.clear()
        self.ui.folderName.addItem('None')
        if not self.directory:
            return
        else:
            self.directories = numpy.asarray(os.listdir(self.directory))
            for folder in self.directories:
                self.ui.folderName.addItem(folder)

    def select_type_ay(self):
        if self.ui.csvRadio.isChecked():
            self.type = '.csv'
            self.divide = ','
            self.form = ''
        elif self.ui.txtRadio.isChecked():
            self.type = '.txt'
            self.divide = '\t'
            self.form = '                     '
        else:
            self.type = False

    def select_name_ay(self):
        now = datetime.datetime.now()
        self.date = '%s-%s-%s' % (now.year, now.month, now.day)
        self.current_time = '%s.%s.%s' % (now.hour, now.month, now.second)
        self.date_and_time = self.date + ' ' + self.current_time
        if self.ui.defaultFile.isChecked():
            try:
                self.file = self.date_and_time
            except ValueError:
                self.file = False  
        elif self.ui.customFile.isChecked():
            try:
                self.file = str(self.ui.file.text())
            except ValueError:
                self.file = False

    def select_folder(self):
        try:
            self.folder_name = str(self.ui.folderName.currentText())
        except ValueError:
            self.folder_name = False
        if self.folder_name == 'None' or self.folder_name == '' :
            self.folder_name = False

    def Google_browse(self):
        prev_dir = 'C:\\'
        file_list = []
        file_dir = QFileDialog.getExistingDirectory(None, 'Select Google Drive Folder', prev_dir)
        if file_dir != '':
            file_list = str(file_dir).split('/')
            # for i in range(0, len(file_list) - 1):
            #     if i < len(file_list) - 1:
            #         open_dir += file_list[i] + '\\'
            #     elif i == len(file_list) - 1:
            #         open_dir += file_list[i]
            file_dir.replace('/', '\\')
            self.ui.lineEdit_GoogleDrive_G_ay.setText(file_dir)
            self.ui.label_condition_G_ay.setText('Open Google Drive User Folder')
            self.ui.pushButton_check_G_ay.setEnabled(True)
    
    def Other_browse(self):
        prev_dir = os.getcwd()
        fileDir = QFileDialog.getExistingDirectory(None, 'Select Folder to Save', prev_dir)
        if fileDir != '':
            open_dir = ''
            file_list = str(fileDir).split('/')
            for i in range(0, len(file_list) - 1):
                if i < len(file_list) - 1:
                    open_dir += file_list[i] + '\\'
                elif i == len(file_list) - 1:
                    open_dir += file_list[i]
            fileDir.replace('/', '\\')
            self.O_directory = fileDir
            self.ui.lineEdit_directory_O_ay.setText(fileDir)
            self.ui.label_username_O_ay.setEnabled(True)
            self.ui.comboBox_Name_Folder_O_ay.setEnabled(True)
            self.ui.groupBox_Filename_O_ay.setEnabled(True)
            self.ui.groupBox_File_Type_O_ay.setEnabled(True)
            self.ui.label_comment_O_ay.setEnabled(True)
            self.ui.textEdit_comment_O_ay.setEnabled(True)
            self.ui.pushButton_Save_O_ay.setEnabled(True)
            self.ui.lineEdit_Custom_Name_O_ay.setEnabled(True)
            self.ui.label_condition_O_ay.setText("Click save button to save.")
        else:
            self.ui.lineEdit_directory_O_ay.setText('None')
            self.ui.label_condition_O_ay.setText('Failed to Read File')
        
    def Check(self):
        self.G_directory = ''
        file_list = []
        file_list = str(self.ui.lineEdit_GoogleDrive_G_ay.text()).split('\\')
        if os.path.exists(self.ui.lineEdit_GoogleDrive_G_ay.text()) == False:
            self.ui.label_condition_G_ay.setText('Incorrect Google Drive Directory.')
        else:
            self.ui.label_condition_G_ay.setText('Please click browse to the "03 User Accounts" folder')
            for i in range(0, len(file_list)):
                self.G_directory += file_list[i] + '\\'
                if file_list[i].upper() == '03 User Accounts'.upper():
                    self.ui.label_namefolder_G_ay.setEnabled(True)
                    self.ui.comboBox_Name_Folder_G_ay.setEnabled(True)
                    self.ui.pushButton_Select_Directory_G_ay.setEnabled(True)
                    self.ui.label_condition_G_ay.setText('Choose name folder in Google Drive to save.')                   
                    break
    
    def Google_select_namefolder(self):
        namefolder = str(self.ui.comboBox_Name_Folder_G_ay.currentText())
        if namefolder == 'None':
            self.ui.label_condition_G_ay.setText('Please choose a name folder to save.')
        else:
            now = datetime.datetime.now()
            date = '%s-%s-%s' % (now.year, now.month, now.day)
            self.ui.label_G_ay.setText("Save to \\" + namefolder + "\Date" + '\\' + date)
            self.G_directory += namefolder + "\Data" + '\\' + date + '\\' + 'Agilent Yokogawa with Array'
            self.ui.groupBox_File_Type_G_ay.setEnabled(True)
            self.ui.groupBox_Filename_G_ay.setEnabled(True)
            self.ui.label_comment_G_ay.setEnabled(True)
            self.ui.textEdit_comment_G_ay.setEnabled(True)
            self.ui.pushButton_Save_G_ay.setEnabled(True)
            self.ui.lineEdit_Custom_Name_G_ay.setEnabled(True)
            self.ui.label_condition_G_ay.setText('Click save button to save.')
            
    def Select_type_G_ay(self):
        if self.ui.radioButton_csv_G_ay.isChecked():
            self.G_type = '.csv'
            self.G_divide = ','

        elif self.ui.radioButton_txt_G_ay.isChecked():
            self.G_type = '.txt'
            self.G_divide = '\t'

    def Select_type_O_ay(self):
        if self.ui.radioButton_csv_O_ay.isChecked():
            self.O_type = '.csv'
            self.O_divide = ','

        elif self.ui.radioButton_txt_O_ay.isChecked():
            self.O_type = '.txt'
            self.O_divide = '\t'

    def Select_name_G_ay(self):
        if self.ui.radioButton_Timename_G_ay.isChecked():
            now = datetime.datetime.now()
            date = '%s-%s-%s' % (now.year, now.month, now.day)
            current_time = '%s.%s.%s' % (now.hour, now.minute, now.second)
            date_and_time = date + ' ' + current_time
            self.G_file_name = str(date_and_time)
        elif self.ui.radioButton_Custom_Name_G_ay.isChecked():
            self.G_file_name = str(self.ui.lineEdit_Custom_Name_G_ay.text())
            
    def Select_name_O_ay(self):
        if self.ui.radioButton_Timename_O_ay.isChecked():
            now = datetime.datetime.now()
            date = '%s-%s-%s' % (now.year, now.month, now.day)
            current_time = '%s.%s.%s' % (now.hour, now.minute, now.second)
            date_and_time = date + ' ' + current_time
            self.O_file_name = str(date_and_time)
        elif self.ui.radioButton_Custom_Name_O_ay.isChecked():
            self.O_file_name = str(self.ui.lineEdit_Custom_Name_O_ay.text())
            
    def Pre_save(self, date_value, t_value, x_value, y_value, array):
        self.date_value = date_value
        self.t_value = t_value
        self.x_value = x_value
        self.y_value = y_value
        self.array = array
    
    def G_save(self):
        if self.ui.radioButton_Custom_Name_G_ay.isChecked() and self.ui.lineEdit_Custom_Name_G_ay.text() == '':
            self.ui.label_condition_G_ay.setText('Enter a valid file name.')
        else:
            self.Select_type_G_ay()
            self.Select_name_G_ay()
            
            # It contains the measurement information, including user name, date, measurement type, time step etc.
            # This is a two dimensional list. Each sub list related to a single line.
            comments = []
            # For QMDlab data file it is "Collected Data"
            divider = 'Collected Data'
            # Parameters' names, such as VOLTAGE, CURRENT, TIME
            parameters = []
            # Parameters' units
            units = []
            # Include all the data
            data = []
            # Contains file type, divider, name and directory
            file_info = []
            
            # Line 1: user name
            temp = []
            temp.append('User Name:')
            temp.append(str(self.ui.comboBox_Name_Folder_G_ay.currentText()))
            comments.append(temp)
            # Line 2: edit time
            temp = []
            temp.append('Edit Time:')
            temp.append(str(datetime.datetime.now()))
            comments.append(temp)
            # Line 3: array source
            temp = []
            temp.append('Array Source:')
            temp.append(str(self.ui.lineEdit_directory_ay.text()))
            comments.append(temp)
            # Line 4: visa0 address
            temp = []
            temp.append('Visa 0 Address:')
            temp.append(str(self.ui.visa0.text()))
            comments.append(temp)
            # Line 5: visa1 address
            temp = []
            temp.append('Visa 1 Address:')
            temp.append(str(self.ui.visa1.text()))
            comments.append(temp)
            # Line 6: visa name
            temp = []
            temp.append('Visa 0 Name:')
            visa0_name = self.visa0_name.rstrip('\n')
            visa0_name = visa0_name.replace(',', ' ')
            temp.append(str(visa0_name))
            comments.append(temp)
            # Line 7: visa name
            temp = []
            temp.append('Visa 1 Name:')
            visa1_name = self.visa1_name.rstrip('\n')
            visa1_name = visa1_name.replace(',', ' ')
            temp.append(str(visa1_name))
            comments.append(temp)
            # Line 8: scan source
            temp = []
            temp.append('Scan Source:')
            temp.append('Voltage')
            comments.append(temp)
            # Line 9: time step
            temp = []
            temp.append('Time Step(sec):')
            temp.append(str(self.timeStep))
            comments.append(temp)
            # Line 10: comments
            temp = []
            temp.append('Comments:')
            temp.append(str(self.ui.textEdit_comment_G_ay.toPlainText()))
            comments.append(temp)
            
            # Do parameters, units and data together
            parameters.append('Date')
            units.append('String')
            data.append(self.date_value)
            
            parameters.append('Time')
            units.append('s')
            data.append(self.t_value)
            
            parameters.append('Step')
            units.append('1')
            temp = []
            for i in range(0, len(self.y_plot)):
                temp.append(i)
            data.append(temp)
            parameters.append('Array')
            units.append('1')
            data.append(self.x_value)
            parameters.append('Voltage')
            units.append('Volts')
            data.append(self.x_plot)
            parameters.append('Current')
            units.append('Amps')
            data.append(self.y_plot)
            
            # File_info
            # First is file name
            file_info.append(self.G_file_name)
            # csv or txt file
            file_info.append(self.G_type)
            # the divide of csv is "," while for txt its "\t"
            file_info.append(self.G_divide)
            # Always "Collected Data"
            file_info.append(divider)
            # The saving directory
            file_info.append(self.G_directory)
            
            self.save_thread.input(comments, parameters, units, data, file_info)
            self.ui.pushButton_Open_G_ay.setEnabled(True)
            self.ui.label_condition_G_ay.setText('File has been saved.')
    
    def O_save(self):
        if self.ui.comboBox_Name_Folder_O_ay.currentText() == 'None':
            self.ui.label_condition_O_ay.setText('Pleanse choose a user name.')
        elif self.ui.radioButton_Custom_Name_O_ay.isChecked() and self.ui.lineEdit_Custom_Name_O_ay.text() == '':
            self.ui.label_condition_O_ay.setText('Please enter a file name.')
        else:
            self.Select_type_O_ay()
            self.Select_name_O_ay()
            
            # It contains the measurement information, including user name, date, measurement type, time step etc.
            # This is a two dimensional list. Each sub list related to a single line.
            comments = []
            # For QMDlab data file it is "Collected Data"
            divider = 'Collected Data'
            # Parameters' names, such as VOLTAGE, CURRENT, TIME
            parameters = []
            # Parameters' units
            units = []
            # Include all the data
            data = []
            # Contains file type, divider, name and directory
            file_info = []
            
            # Line 1: user name
            temp = []
            temp.append('User Name:')
            temp.append(str(self.ui.comboBox_Name_Folder_G_ay.currentText()))
            comments.append(temp)
            # Line 2: edit time
            temp = []
            temp.append('Edit Time:')
            temp.append(str(datetime.datetime.now()))
            comments.append(temp)
            # Line 3: array source
            temp = []
            temp.append('Array Source:')
            temp.append(str(self.ui.lineEdit_directory_ay.text()))
            comments.append(temp)
            # Line 4: visa0 address
            temp = []
            temp.append('Visa 0 Address:')
            temp.append(str(self.ui.visa0.text()))
            comments.append(temp)
            # Line 5: visa1 address
            temp = []
            temp.append('Visa 1 Address:')
            temp.append(str(self.ui.visa1.text()))
            comments.append(temp)
            # Line 6: visa name
            temp = []
            temp.append('Visa 0 Name:')
            visa0_name = self.visa0_name.rstrip('\n')
            visa0_name = visa0_name.replace(',', ' ')
            temp.append(str(visa0_name))
            comments.append(temp)
            # Line 7: visa name
            temp = []
            temp.append('Visa 1 Name:')
            visa1_name = self.visa1_name.rstrip('\n')
            visa1_name = visa1_name.replace(',', ' ')
            temp.append(str(visa1_name))
            comments.append(temp)
            # Line 8: scan source
            temp = []
            temp.append('Scan Source:')
            temp.append('Voltage')
            comments.append(temp)
            # Line 9: time step
            temp = []
            temp.append('Time Step(sec):')
            temp.append(str(self.timeStep))
            comments.append(temp)
            # Line 10: comments
            temp = []
            temp.append('Comments:')
            temp.append(str(self.ui.textEdit_comment_G_ay.toPlainText()))
            comments.append(temp)
            
            # Do parameters, units and data together
            parameters.append('Date')
            units.append('String')
            data.append(self.date_value)
            parameters.append('Time')
            units.append('s')
            data.append(self.t_value)
            parameters.append('Step')
            units.append('1')
            temp = []
            for i in range(0, len(self.y_plot)):
                temp.append(i)
            data.append(temp)
            parameters.append('Array')
            units.append('1')
            data.append(self.x_value)
            parameters.append('Voltage')
            units.append('Volts')
            data.append(self.x_plot)
            parameters.append('Current')
            units.append('Amps')
            data.append(self.y_plot)
            
            # File_info
            # First is file name
            file_info.append(self.O_file_name)
            # csv or txt file
            file_info.append(self.O_type)
            # the divide of csv is "," while for txt its "\t"
            file_info.append(self.O_divide)
            # Always "Collected Data"
            file_info.append(divider)
            # The saving directory
            file_info.append(self.O_directory)
            
            self.save_thread.input(comments, parameters, units, data, file_info)
            self.ui.pushButton_Open_O_ay.setEnabled(True)
            self.ui.label_condition_O_ay.setText('File has been saved.')
    
    def G_open(self):
        opendir = self.G_directory
        open_path = 'explorer "' + opendir + '"'
        subprocess.Popen(open_path)
        
    def O_open(self):
        opendir = self.O_directory
        open_path = 'explorer "' + opendir + '"'
        subprocess.Popen(open_path)
    def __init__(self, main, ui):
        self.ui = ui
        self.copyDataFunc = main.CopyDataFunc
        self.collect_data_thread = Collect_data()
        self.save_thread = Save_Thread()
        
        main.connect(self.ui.pushButtonK2_browseGate, SIGNAL('clicked()'), self.Browse_Array)
        main.connect(self.ui.pushButtonK2_importGate, SIGNAL('clicked()'), self.Import_Array)
        main.connect(self.ui.pushButtonK2_copyGate, SIGNAL('clicked()'), self.Copy_Array)
        main.connect(self.ui.pushButtonK2_updateGate, SIGNAL('clicked()'), self.update_visas)
        main.connect(self.ui.pushButtonK2_updateLead, SIGNAL('clicked()'), self.update_visas)
        main.connect(self.ui.pushButtonK2_selectGate, SIGNAL('clicked()'), lambda : self.Select_visa("gate", self.gate_visa, self.ui.comboBoxK2_gateVisa, self.ui.lineEditK2_gateVisa, [self.ui.pushButtonK2_selectGate, self.ui.pushButtonK2_closeGate]))
        main.connect(self.ui.pushButtonK2_selectLead, SIGNAL('clicked()'), lambda : self.Select_visa("lead", self.lead_visa, self.ui.comboBoxK2_leadVisa, self.ui.lineEditK2_leadVisa, [self.ui.pushButtonK2_selectLead, self.ui.pushButtonK2_closeLead]))
        main.connect(self.ui.pushButtonK2_closeGate, SIGNAL('clicked()'), lambda : self.Close_visa("gate", self.gate_visa, self.ui.lineEditK2_gateVisa, [self.ui.pushButtonK2_selectGate, self.ui.pushButtonK2_closeGate]))
        main.connect(self.ui.pushButtonK2_closeLead, SIGNAL('clicked()'), lambda : self.Close_visa("lead", self.lead_visa, self.ui.lineEditK2_leadVisa, [self.ui.pushButtonK2_selectLead, self.ui.pushButtonK2_closeLead]))
        main.connect(self.ui.pushButtonK2_Start, SIGNAL('clicked()'), self.start)
        main.connect(self.ui.pushButtonK2_Stop, SIGNAL('clicked()'), self.collect_data_thread.stop)
        main.connect(self.ui.pushButtonK2_Pause, SIGNAL('clicked()'), self.collect_data_thread.pause)
        main.connect(self.ui.pushButtonK2_browse_save_G, SIGNAL('clicked()'), self.Google_browse)
        main.connect(self.ui.pushButtonK2_browse_save_O, SIGNAL('clicked()'), self.Other_browse)
        main.connect(self.ui.pushButtonK2_check_G, SIGNAL('clicked()'), self.Check)
        main.connect(self.ui.pushButtonK2_Select_Directory_G, SIGNAL('clicked()'), self.Google_select_namefolder)
        main.connect(self.ui.pushButtonK2_Save_G, SIGNAL('clicked()'), self.G_save)
        main.connect(self.ui.pushButtonK2_Open_G, SIGNAL('clicked()'), self.G_open)
        main.connect(self.ui.pushButtonK2_Save_O, SIGNAL('clicked()'), self.O_save)
        main.connect(self.ui.pushButtonK2_Open_O, SIGNAL('clicked()'), self.O_open)
        main.connect(self.collect_data_thread, SIGNAL("curve_plot"), self.curvePlots_update)
        main.connect(self.collect_data_thread, SIGNAL("mpl_plot"), self.mplPlots)
        main.connect(self.collect_data_thread, SIGNAL("data_available"), self.Pre_save)

    
        self.Array = []
        self.count = 0
        self.go_on = True
        
        self.ui.mplwidgetK2_gateArray = self.make_mplToolBar(self.ui.mplwidgetK2_gateArray, self.ui.widgetK2_gateArray)
        self.ui.mplwidgetK2_AgateVoltage = self.make_mplToolBar(self.ui.mplwidgetK2_AgateVoltage, self.ui.widgetK2_AgateVoltage)
        self.ui.mplwidgetK2_AleadCurrent = self.make_mplToolBar(self.ui.mplwidgetK2_AleadCurrent, self.ui.widgetK2_AleadCurrent)
        self.ui.mplwidgetK2_AgateCurrent = self.make_mplToolBar(self.ui.mplwidgetK2_AgateCurrent, self.ui.widgetK2_AgateCurrent)
        self.ui.mplwidgetK2_ALeadResistance = self.make_mplToolBar(self.ui.mplwidgetK2_ALeadResistance, self.ui.widgetK2_ALeadResistance)
        self.ui.mplwidgetK2_ALeadCurrentGateVoltage = self.make_mplToolBar(self.ui.mplwidgetK2_ALeadCurrentGateVoltage, self.ui.widgetK2_ALeadCurrentGateVoltage)
        self.ui.mplwidgetK2_ALeadResistanceGateVoltage = self.make_mplToolBar(self.ui.mplwidgetK2_ALeadResistanceGateVoltage, self.ui.widgetK2_ALeadResistanceGateVoltage)
        
        self.axes_gateArray = None
        self.axes_AgateVoltage = None
        self.axes_AleadCurrent = None
        self.axes_AgateCurrent = None
        self.axes_ALeadResistance = None
        self.axes_ALeadCurrentGateVoltage = None
        self.axes_ALeadResistanceGateVoltage = None
        

        
        #self.ui.mplwidget_import = self.canvas_import
        #self.ui.mplwidget_analysis = self.canvas_analysis
        #self.ui.mplwidget_ct_analysis = self.canvas_ct_analysis
        #self.ui.mplwidget_vt_analysis = self.canvas_vt_analysis
        
        # Set up guiqwt plot
        
        self.curve_itemK2_SgateVoltage = self.make_curveWidgets(self.ui.curvewidgetK2_SgateVoltage, "b", titles = ["Gate Voltage", "Steps", "Gate Voltage (V)"])
        self.curve_itemK2_SleadCurrent = self.make_curveWidgets(self.ui.curvewidgetK2_SleadCurrent, "b", titles = ["Lead Current", "Steps", "Lead Current (A)"])
        self.curve_itemK2_SgateCurrent = self.make_curveWidgets(self.ui.curvewidgetK2_SgateCurrent, "b", titles = ["Gate Current", "Steps", "Gate Current (A)"])
        self.curve_itemK2_SleadResistance = self.make_curveWidgets(self.ui.curvewidgetK2_SleadResistance, "b", titles = ["Lead Resistance", "Steps", "Lead Resistance (Ohms)"])
        self.curve_itemK2_SleadCurrentGateVoltage = self.make_curveWidgets(self.ui.curvewidgetK2_SleadCurrentGateVoltage, "b", titles = ["Lead Current vs Gate Voltage", "Gate Voltage (V)", "Lead Current (A)"])
        self.curve_itemK2_SleadResistanceGateVoltage = self.make_curveWidgets(self.ui.curvewidgetK2_SleadResistanceGateVoltage, "b", titles = ["Lead Resistane vs Gate Voltage", "Gate Voltage (V)", "Lead Resistance (Ohms)"])
        
        self.ui.pushButtonK2_Pause.setEnabled(False)
        self.ui.pushButtonK2_Stop.setEnabled(False)
        self.gate_visa = None
        self.lead_visa = None
        self.update_visas()
        
        self.uiSavingGDpushButtons = [ self.ui.pushButtonK2_browse_save_G, self.ui.pushButtonK2_check_G, self.ui.pushButtonK2_Select_Directory_G, self.ui.pushButtonK2_Save_G, self.ui.pushButtonK2_Open_G]
        self.uiSavingGDradioButton = [self.ui.radioButtonK2_csv_G, self.ui.radioButtonK2_txt_G, self.ui.radioButtonK2_Timename_G, self.ui.radioButtonK2_Custom_Name_G]
        self.uiSavingGDtextEdit = [self.ui.textEditK2_comment_G]
        self.uiSavingGDcomboBox = [self.ui.comboBoxK2_Name_Folder_G]
        self.uiSavingGDlineEdit = [self.ui.lineEditK2_GoogleDrive_G, self.ui.lineEditK2_Custom_Name_G]
        self.uiSavingGDlabel = [self.ui.labelK2_condition_G]
        
        
        """
class KeithleyGateSweep():
    
    def __init__(self, main, ui):
        self.ui = ui
        self.copyDataFunc = main.CopyDataFunc
        self.collect_data_thread = Collect_data()
        self.save_thread = Save_Thread()
        
        main.connect(self.ui.pushButtonK2_browseGate, SIGNAL('clicked()'), self.Browse_Array)
        main.connect(self.ui.pushButtonK2_importGate, SIGNAL('clicked()'), self.Import_Array)
        main.connect(self.ui.pushButtonK2_copyGate, SIGNAL('clicked()'), self.Copy_Array)
        main.connect(self.ui.pushButtonK2_updateGate, SIGNAL('clicked()'), self.update_visas)
        main.connect(self.ui.pushButtonK2_updateLead, SIGNAL('clicked()'), self.update_visas)
        main.connect(self.ui.pushButtonK2_selectGate, SIGNAL('clicked()'), lambda : self.Select_visa("gate", self.gate_visa, self.ui.comboBoxK2_gateVisa, self.ui.lineEditK2_gateVisa, [self.ui.pushButtonK2_selectGate, self.ui.pushButtonK2_closeGate]))
        main.connect(self.ui.pushButtonK2_selectLead, SIGNAL('clicked()'), lambda : self.Select_visa("lead", self.lead_visa, self.ui.comboBoxK2_leadVisa, self.ui.lineEditK2_leadVisa, [self.ui.pushButtonK2_selectLead, self.ui.pushButtonK2_closeLead]))
        main.connect(self.ui.pushButtonK2_closeGate, SIGNAL('clicked()'), lambda : self.Close_visa("gate", self.gate_visa, self.ui.lineEditK2_gateVisa, [self.ui.pushButtonK2_selectGate, self.ui.pushButtonK2_closeGate]))
        main.connect(self.ui.pushButtonK2_closeLead, SIGNAL('clicked()'), lambda : self.Close_visa("lead", self.lead_visa, self.ui.lineEditK2_leadVisa, [self.ui.pushButtonK2_selectLead, self.ui.pushButtonK2_closeLead]))
        main.connect(self.ui.pushButtonK2_Start, SIGNAL('clicked()'), self.start)
        main.connect(self.ui.pushButtonK2_Stop, SIGNAL('clicked()'), self.collect_data_thread.stop)
        main.connect(self.ui.pushButtonK2_Pause, SIGNAL('clicked()'), self.collect_data_thread.pause)
        main.connect(self.ui.pushButtonK2_browse_save_G, SIGNAL('clicked()'), self.Google_browse)
        main.connect(self.ui.pushButtonK2_browse_save_O, SIGNAL('clicked()'), self.Other_browse)
        main.connect(self.ui.pushButtonK2_check_G, SIGNAL('clicked()'), self.Check)
        main.connect(self.ui.pushButtonK2_Select_Directory_G, SIGNAL('clicked()'), self.Google_select_namefolder)
        main.connect(self.ui.pushButtonK2_Save_G, SIGNAL('clicked()'), self.G_save)
        main.connect(self.ui.pushButtonK2_Open_G, SIGNAL('clicked()'), self.G_open)
        main.connect(self.ui.pushButtonK2_Save_O, SIGNAL('clicked()'), self.O_save)
        main.connect(self.ui.pushButtonK2_Open_O, SIGNAL('clicked()'), self.O_open)
        main.connect(self.collect_data_thread, SIGNAL("curve_plot"), self.curvePlots_update)
        main.connect(self.collect_data_thread, SIGNAL("mpl_plot"), self.mplPlots)
        main.connect(self.collect_data_thread, SIGNAL("data_available"), self.Pre_save)

    
        self.Array = []
        self.count = 0
        self.go_on = True
        
        self.ui.mplwidgetK2_gateArray = self.make_mplToolBar(self.ui.mplwidgetK2_gateArray, self.ui.widgetK2_gateArray)
        self.ui.mplwidgetK2_AgateVoltage = self.make_mplToolBar(self.ui.mplwidgetK2_AgateVoltage, self.ui.widgetK2_AgateVoltage)
        self.ui.mplwidgetK2_AleadCurrent = self.make_mplToolBar(self.ui.mplwidgetK2_AleadCurrent, self.ui.widgetK2_AleadCurrent)
        self.ui.mplwidgetK2_AgateCurrent = self.make_mplToolBar(self.ui.mplwidgetK2_AgateCurrent, self.ui.widgetK2_AgateCurrent)
        self.ui.mplwidgetK2_ALeadResistance = self.make_mplToolBar(self.ui.mplwidgetK2_ALeadResistance, self.ui.widgetK2_ALeadResistance)
        self.ui.mplwidgetK2_ALeadCurrentGateVoltage = self.make_mplToolBar(self.ui.mplwidgetK2_ALeadCurrentGateVoltage, self.ui.widgetK2_ALeadCurrentGateVoltage)
        self.ui.mplwidgetK2_ALeadResistanceGateVoltage = self.make_mplToolBar(self.ui.mplwidgetK2_ALeadResistanceGateVoltage, self.ui.widgetK2_ALeadResistanceGateVoltage)
        
        self.axes_gateArray = None
        self.axes_AgateVoltage = None
        self.axes_AleadCurrent = None
        self.axes_AgateCurrent = None
        self.axes_ALeadResistance = None
        self.axes_ALeadCurrentGateVoltage = None
        self.axes_ALeadResistanceGateVoltage = None
        

        
        #self.ui.mplwidget_import = self.canvas_import
        #self.ui.mplwidget_analysis = self.canvas_analysis
        #self.ui.mplwidget_ct_analysis = self.canvas_ct_analysis
        #self.ui.mplwidget_vt_analysis = self.canvas_vt_analysis
        
        # Set up guiqwt plot
        
        self.curve_itemK2_SgateVoltage = self.make_curveWidgets(self.ui.curvewidgetK2_SgateVoltage, "b", titles = ["Gate Voltage", "Steps", "Gate Voltage (V)"])
        self.curve_itemK2_SleadCurrent = self.make_curveWidgets(self.ui.curvewidgetK2_SleadCurrent, "b", titles = ["Lead Current", "Steps", "Lead Current (A)"])
        self.curve_itemK2_SgateCurrent = self.make_curveWidgets(self.ui.curvewidgetK2_SgateCurrent, "b", titles = ["Gate Current", "Steps", "Gate Current (A)"])
        self.curve_itemK2_SleadResistance = self.make_curveWidgets(self.ui.curvewidgetK2_SleadResistance, "b", titles = ["Lead Resistance", "Steps", "Lead Resistance (Ohms)"])
        self.curve_itemK2_SleadCurrentGateVoltage = self.make_curveWidgets(self.ui.curvewidgetK2_SleadCurrentGateVoltage, "b", titles = ["Lead Current vs Gate Voltage", "Gate Voltage (V)", "Lead Current (A)"])
        self.curve_itemK2_SleadResistanceGateVoltage = self.make_curveWidgets(self.ui.curvewidgetK2_SleadResistanceGateVoltage, "b", titles = ["Lead Resistane vs Gate Voltage", "Gate Voltage (V)", "Lead Resistance (Ohms)"])
        
        self.ui.pushButtonK2_Pause.setEnabled(False)
        self.ui.pushButtonK2_Stop.setEnabled(False)
        self.gate_visa = None
        self.lead_visa = None
        self.update_visas()
        
        self.uiSavingGDpushButtons = [ self.ui.pushButtonK2_browse_save_G, self.ui.pushButtonK2_check_G, self.ui.pushButtonK2_Select_Directory_G, self.ui.pushButtonK2_Save_G, self.ui.pushButtonK2_Open_G]
        self.uiSavingGDradioButton = [self.ui.radioButtonK2_csv_G, self.ui.radioButtonK2_txt_G, self.ui.radioButtonK2_Timename_G, self.ui.radioButtonK2_Custom_Name_G]
        self.uiSavingGDtextEdit = [self.ui.textEditK2_comment_G]
        self.uiSavingGDcomboBox = [self.ui.comboBoxK2_Name_Folder_G]
        self.uiSavingGDlineEdit = [self.ui.lineEditK2_GoogleDrive_G, self.ui.lineEditK2_Custom_Name_G]
        self.uiSavingGDlabel = [self.ui.labelK2_condition_G]
        
        
        """
        
        
        
        main.connect(self.ui.pushButton_scan_keithley, SIGNAL('clicked()'), self.Scan_keithley)
        main.connect(self.ui.pushButton_pause_keithley, SIGNAL('clicked()'), self.collect_data_thread.pause)       
        main.connect(self.ui.pushButton_stop_keithley, SIGNAL('clicked()'), self.collect_data_thread.stop)
        main.connect(self.ui.pushButton_clear_keithley, SIGNAL('clicked()'), self.collect_data_thread.Clear_keithley)
        main.connect(self.ui.pushButton_fit_keithley, SIGNAL('clicked()'), self.collect_data_thread.Fit)
        main.connect(self.ui.pushButton_browse_save_G_keithley, SIGNAL('clicked()'), self.Google_browse)
        main.connect(self.ui.pushButton_browse_save_O_keithley, SIGNAL('clicked()'), self.Other_browse)
        main.connect(self.ui.pushButton_check_G_keithley, SIGNAL('clicked()'), self.Check)
        main.connect(self.ui.pushButton_Select_Directory_G_keithley, SIGNAL('clicked()'), self.Google_select_namefolder)
        main.connect(self.ui.pushButton_Save_G_keithley, SIGNAL('clicked()'), self.G_save)
        main.connect(self.ui.pushButton_Open_G_keithley, SIGNAL('clicked()'), self.G_open)
        main.connect(self.ui.pushButton_Save_O_keithley, SIGNAL('clicked()'), self.O_save)
        main.connect(self.ui.pushButton_Open_O_keithley, SIGNAL('clicked()'), self.O_open)
        main.connect(self.ui.radioButton_voltage_keithley, SIGNAL("clicked()"), lambda : self.ui.tabWidget_scan_keithley.setCurrentIndex(0))
        main.connect(self.ui.radioButton_timescan_keithley, SIGNAL("clicked()"), self.collect_data_thread.Pre_MPL_Plot)
        main.connect(self.ui.radioButton_stepscan_keithley, SIGNAL("clicked()"), self.collect_data_thread.Pre_MPL_Plot)
        main.connect(self.collect_data_thread, SIGNAL("plot"), self.Plot_data)
        main.connect(self.collect_data_thread, SIGNAL("mpl_plot"), self.Plot_analysis)
        main.connect(self.collect_data_thread, SIGNAL("data_available"), self.Pre_save)
        # self.connect(self.Keithley_programs.collect_data_thread, SIGNAL("clear_plot"), self.Keithley_programs.Clear_plot)
        """
        
    def make_mplToolBar(self, mplwidget, widget):
        canvas_mpl = FigureCanvas(mplwidget.figure)
        canvas_mpl.setParent(widget)
        # This is the toolbar widget for the import canvas
        mpl_toolbar = NavigationToolbar(canvas_mpl, mplwidget)
        vbox_ = QVBoxLayout()
        # The matplotlib canvas
        vbox_.addWidget(canvas_mpl)
        # The matplotlib toolbar
        vbox_.addWidget(mpl_toolbar)
        widget.setLayout(vbox_)
        return canvas_mpl
    
    def make_curveWidgets(self, curvewidget, color, titles):
        curve_item = make.curve([], [], color = 'b', marker = "o")
        curvewidget.plot.add_item(curve_item)
        curvewidget.plot.set_antialiasing(True)
        curvewidget.plot.set_titles(titles[0], titles[1], titles[2])
        return curve_item
        

    def Browse_Array(self):
        prev_dir = os.getcwd()
        fileDir = QFileDialog.getOpenFileName(None, 'Select File to Import', prev_dir, filter="Array Files (*.array)")
        if fileDir != '':
            file_list = str(fileDir).split('/')
            for i in range(0, len(file_list) - 1):
                global open_dir
                open_dir = ''
                if i < len(file_list) - 1:
                    open_dir += file_list[i] + '\\'
                elif i == len(file_list) - 1:
                    open_dir += file_list[i]
            fileDir.replace('/', '\\')
            self.ui.lineEditK2_directoryGate.setText(fileDir)
            self.ui.pushButtonK2_importGate.setEnabled(True)
            self.ui.lineEditk2_condition_keithley.setText('File: "' + file_list[len(file_list) - 1] + '" has been chosen.')
            
        else:
            self.ui.lineEditk2_condition_keithley.setText("Please choose valid file to import.")
    

    def Import_Array(self):
        divider_found = True
        count = 0
        temp = 0
        self.Array = []
        x_value = []
        y_value = []
        
        fileDir = self.ui.lineEditK2_directoryGate.text()
        fp = open(fileDir)
        while True:
            if count == 5000:
                self.ui.lineEditk2_condition_keithley.setText("Data not found in file. Please check it.")
                divider_found = False
                break
            line = fp.readline()
            line_list = line.split(',')
            if line_list[0].upper() == "Array Data".upper() + '\n':
                break
            count += 1
            
        if divider_found == True:
            line = fp.readline()
            while True:
                line = fp.readline().replace('\n', '')
                #print 'line: ' + line
                if line == '':
                    break
                value = line.split(',')
                x_value.append(temp)
                x_value.append(temp + 1)
                y_value.append(value[1])
                y_value.append(value[1])
                self.Array.append(float(value[1]))
                temp += 1
                
            self.plot_data(self.axes_gateArray, x_value, y_value, ["Array Import Plot", "Steps", "Values"], self.ui.mplwidgetK2_gateArray)
            self.ui.lineEditk2_condition_keithley.setText("File is imported correctly.")
            #self.ui.groupBox_visa_keithley.setEnabled(True)
            
    def Copy_Array(self):
        Values = self.copyDataFunc()
        if Values != None:
            self.ui.lineEditk2_condition_keithley.setText('Array has been copied and plotted.')
            #self.ui.tabWidget_plot_keithely.setCurrentIndex(0)
            self.Array = []
            x_value = []
            y_value = []
            item = 0
            for i in range(0, len(Values)):
                for j in range(0, len(Values[i])):
                    x_value.append(item)
                    x_value.append(item + 1 - 0.0001)
                    y_value.append(Values[i][j])
                    y_value.append(Values[i][j])
                    self.Array.append(Values[i][j])
                    item += 1
            self.plot_data(self.axes_gateArray, x_value, y_value, ["Array Import Plot", "Steps", "Values"], self.ui.mplwidgetK2_gateArray)
            self.ui.lineEditK2_directoryGate.setText('From Array Builder Tab.')
            #self.ui.groupBox_visa_keithley.setEnabled(True)
            #self.ui.groupBox_xvalue_keithley.setEnabled(True)
        else:
            self.ui.lineEditk2_condition_keithley.setText('No valid array to copy.')
        
        
    def plot_reset(self, axes, mplwidget):
        mplwidget.figure.clear()
        axes = mplwidget.figure.add_subplot(111)
        return axes
        
    def plot_data(self, axes, x, y, titles, mplwidget):
        axes = self.plot_reset(axes, mplwidget)
        axes.plot(x, y, marker = '.', linestyle = '-')
        axes.grid()
        axes.set_title("Array Import Plot")
        axes.set_xlabel("Steps")
        axes.set_ylabel("Values")
        mplwidget.draw()
        
        
    def update_visas(self):
        rm = visa.ResourceManager()
        try:
            all_visas = rm.list_resources()
        except:
            all_visas = "No Visa Available."
        self.ui.comboBoxK2_gateVisa.clear()
        self.ui.comboBoxK2_leadVisa.clear()
        
        for item in all_visas:
            self.ui.comboBoxK2_gateVisa.addItem(item)
            self.ui.comboBoxK2_leadVisa.addItem(item)
        
        
    
    def Select_visa(self, gateLead, visa_chosen, comboBoxVisa, lineEditVisa, selectClose):
        visa_address = str(comboBoxVisa.currentText())
        rm = visa.ResourceManager()
        rm.list_resources()
        inst = rm.open_resource(visa_address)
        visa_check = self.Check_visa(inst)
        if visa_check == True:
            self.ui.lineEditk2_condition_keithley.setText("Visa is selected succefully!")
            visa_name = inst.query("*IDN?")
            lineEditVisa.setText(visa_name)
            selectClose[0].setEnabled(False)
            selectClose[1].setEnabled(True)
            if gateLead == "gate":
                self.gate_visa = inst
            elif gateLead == "lead":
                self.lead_visa = inst
            #self.ui.groupBox_scan_keithley.setEnabled(True)
        elif visa_check == False:
            self.ui.lineEditk2_condition_keithley.setText("Invalid visa address.")
            lineEditVisa.setText("None.")
            visa_chosen = False

    def Check_visa(self, inst):
        try:
            inst.ask("*IDN?")
            valid = True
        except:
            valid = False
        return valid
        
    def Close_visa(self, gateLead, visa_chosen, lineEditVisa, selectClose):
        visa_chosen.close()
        self.ui.lineEditk2_condition_keithley.setText('Visa address is closed')
        lineEditVisa.setText('')
        selectClose[0].setEnabled(True)
        selectClose[1].setEnabled(False)
        if gateLead == "gate":
            self.gate_visa = None
        elif gateLead == "lead":
            self.lead_visa = None
        #self.ui.groupBox_scan_keithley.setEnabled(False)
     
    def start(self):
        gate_set = set(str(self.gate_visa).split(' '))
        lead_set = set(str(self.lead_visa).split(' '))
        if gate_set == lead_set:
            self.ui.lineEditk2_condition_keithley.setText('Two visa addresses cannot be same.')
        else:
            instruments = [self.gate_visa, self.lead_visa]
            curves = [self.curve_itemK2_SgateVoltage, self.curve_itemK2_SleadCurrent, self.curve_itemK2_SgateCurrent, self.curve_itemK2_SleadResistance, self.curve_itemK2_SleadCurrentGateVoltage, self.curve_itemK2_SleadResistanceGateVoltage]
            curveWidgets =[self.ui.curvewidgetK2_SgateVoltage, self.ui.curvewidgetK2_SleadCurrent, self.ui.curvewidgetK2_SgateCurrent, self.ui.curvewidgetK2_SleadResistance, self.ui.curvewidgetK2_SleadCurrentGateVoltage, self.ui.curvewidgetK2_SleadResistanceGateVoltage]
            go_on = None
            self.ui.tabWidgetK2.setCurrentIndex(1)
            self.ui.pushButtonK2_Start.setEnabled(False)
            self.ui.pushButtonK2_Pause.setEnabled(True)
            self.ui.pushButtonK2_Stop.setEnabled(True)
            self.ui.lineEditk2_condition_keithley.setText('Running...')
            self.collect_data_thread.input(instruments, self.ui, self.Array, go_on , curves, curveWidgets)
        
    def curvePlots_update(self, curveInfo):
        curveWidget = curveInfo[0]
        curve = curveInfo[1]
        curveWidget.plot.do_autoscale()
        curve.plot().replot()
        
    def mplPlots(self):
        self.ui.tabWidgetK2.setCurrentIndex(2)
        self.ui.mplwidgetK2_AgateVoltage.draw()
        self.ui.mplwidgetK2_AleadCurrent.draw()
        self.ui.mplwidgetK2_AgateCurrent.draw()
        self.ui.mplwidgetK2_ALeadResistance.draw()
        self.ui.mplwidgetK2_ALeadCurrentGateVoltage.draw()
        self.ui.mplwidgetK2_ALeadResistanceGateVoltage.draw()
    
    def Plot_analysis(self):
        self.ui.tabWidget_plot_keithely.setCurrentIndex(2)
        self.ui.mplwidget_analysis.draw()
        self.ui.mplwidget_ct_analysis.draw()
        self.ui.mplwidget_vt_analysis.draw()
        
    def Plot_data(self, voltage, current, time, step):
        self.ui.label_yvalue_keithley.setText(format(current, '.3f'))
        self.ui.label_xvalue_keithley.setText(format(voltage, '.3f'))
        if self.ui.radioButton_timescan_keithley.isChecked():
            self.ui.label_tvalue_keithley.setText(format(time, '.3f'))
        elif self.ui.radioButton_stepscan_keithley.isChecked():
            self.ui.label_tvalue_keithley.setText(str(step))
        self.ui.curvewidget_keithley.plot.do_autoscale()
        self.ui.curvewidget_ct_keithley.plot.do_autoscale()
        self.ui.curvewidget_vt_keithley.plot.do_autoscale()
        self.curve_item.plot().replot()
        self.curve_ct_item.plot().replot()
        self.curve_vt_item.plot().replot()
    
    def Clear_plot(self):
        self.ui.mplwidget_analysis.draw()
        self.ui.mplwidget_ct_analysis.draw()
        self.ui.mplwidget_vt_analysis.draw()
        self.curve_item.plot().replot()
        self.curve_ct_item.plot().replot()
        self.curve_vt_item.plot().replot()
      
        
    def Google_browse(self):
        prev_dir = 'C:\\'
        file_list = []
        file_dir = QFileDialog.getExistingDirectory(None, 'Select Google Drive Folder', prev_dir)
        if file_dir != '':
            file_list = str(file_dir).split('/')
            # for i in range(0, len(file_list) - 1):
            #     if i < len(file_list) - 1:
            #         open_dir += file_list[i] + '\\'
            #     elif i == len(file_list) - 1:
            #         open_dir += file_list[i]
            file_dir.replace('/', '\\')
            self.ui.lineEditK2_GoogleDrive_G.setText(file_dir)
            self.ui.labelK2_condition_G.setText('Open Google Drive User Folder')
            self.ui.pushButtonK2_check_G.setEnabled(True)
    
    def Other_browse(self):
        prev_dir = os.getcwd()
        fileDir = QFileDialog.getExistingDirectory(None, 'Select Folder to Save', prev_dir)
        if fileDir != '':
            open_dir = ''
            file_list = str(fileDir).split('/')
            for i in range(0, len(file_list) - 1):
                if i < len(file_list) - 1:
                    open_dir += file_list[i] + '\\'
                elif i == len(file_list) - 1:
                    open_dir += file_list[i]
            fileDir.replace('/', '\\')
            self.O_directory = fileDir
            self.ui.lineEditK2_directory_O.setText(fileDir)
            self.ui.labelK2_username_O.setEnabled(True)
            self.ui.comboBoxK2_Name_Folder_O.setEnabled(True)
            self.ui.groupBoxK2_Filename_O.setEnabled(True)
            self.ui.groupBoxK2_File_Type_O.setEnabled(True)
            self.ui.labelK2_comment_O.setEnabled(True)
            self.ui.textEditK2_comment_O.setEnabled(True)
            self.ui.pushButtonK2_Save_O.setEnabled(True)
            self.ui.lineEditK2_Custom_Name_O.setEnabled(True)
            self.ui.labelK2_condition_O.setText("Click save button to save.")
        else:
            self.ui.lineEditK2_directory_O.setText('None')
            self.ui.labelK2_condition_O.setText('Failed to Read File')
        
    def Check(self):
        self.G_directory = ''
        file_list = []
        file_list = str(self.ui.lineEditK2_GoogleDrive_G.text()).split('\\')
        if os.path.exists(self.ui.lineEditK2_GoogleDrive_G.text()) == False:
            self.ui.labelK2_condition_G.setText('Incorrect Google Drive Directory.')
        else:
            self.ui.labelK2_condition_G.setText('Please click browse to the "03 User Accounts" folder')
            for i in range(0, len(file_list)):
                self.G_directory += file_list[i] + '\\'
                if file_list[i].upper() == '03 User Accounts'.upper():
                    self.ui.labelK2_namefolder_G.setEnabled(True)
                    self.ui.comboBoxK2_Name_Folder_G.setEnabled(True)
                    self.ui.pushButtonK2_Select_Directory_G.setEnabled(True)
                    self.ui.labelK2_condition_G.setText('Choose name folder in Google Drive to save.')                   
                    break
    
    def Google_select_namefolder(self):
        namefolder = str(self.ui.comboBoxK2_Name_Folder_G.currentText())
        if namefolder == 'None':
            self.ui.labelK2_condition_G.setText('Please choose a name folder to save.')
        else:
            now = datetime.datetime.now()
            date = '%s-%s-%s' % (now.year, now.month, now.day)
            self.ui.labelK2_G.setText("Save to \\" + namefolder + "\Date" + '\\' + date)
            self.G_directory += namefolder + "\Data" + '\\' + date + '\\' + 'Keithely with Array'
            self.ui.groupBoxK2_File_Type_G.setEnabled(True)
            self.ui.groupBoxK2_Filename_G.setEnabled(True)
            self.ui.labelK2_comment_G.setEnabled(True)
            self.ui.textEditK2_comment_G.setEnabled(True)
            self.ui.pushButtonK2_Save_G.setEnabled(True)
            self.ui.lineEditK2_Custom_Name_G.setEnabled(True)
            self.ui.labelK2_condition_G.setText('Click save button to save.')
            
    def Select_type_G(self):
        if self.ui.radioButtonK2_csv_G.isChecked():
            self.G_type = '.csv'
            self.G_divide = ','

        elif self.ui.radioButtonK2_txt_G.isChecked():
            self.G_type = '.txt'
            self.G_divide = '\t'

            
    def Select_type_O(self):
        if self.ui.radioButtonK2_csv_O.isChecked():
            self.O_type = '.csv'
            self.O_divide = ','

        elif self.ui.radioButtonK2_txt_O.isChecked():
            self.O_type = '.txt'
            self.O_divide = '\t'


    def Select_name_G(self):
        if self.ui.radioButtonK2_Timename_G.isChecked():
            now = datetime.datetime.now()
            date = '%s-%s-%s' % (now.year, now.month, now.day)
            current_time = '%s.%s.%s' % (now.hour, now.minute, now.second)
            date_and_time = date + ' ' + current_time
            self.G_file_name = str(date_and_time)
        elif self.ui.radioButtonK2_Custom_Name_G.isChecked():
            self.G_file_name = str(self.ui.lineEditK2_Custom_Name_G.text())
            
    def Select_name_O(self):
        if self.ui.radioButtonK2_Timename_O.isChecked():
            now = datetime.datetime.now()
            date = '%s-%s-%s' % (now.year, now.month, now.day)
            current_time = '%s.%s.%s' % (now.hour, now.minute, now.second)
            date_and_time = date + ' ' + current_time
            self.O_file_name = str(date_and_time)
        elif self.ui.radioButtonK2_Custom_Name_O.isChecked():
            self.O_file_name = str(self.ui.lineEditK2_Custom_Name_O.text())
    
    def Pre_save(self, date_value, t_value, stepData, Array, gateVolt_data, curr_data, gateCurr_data, resistance_data):
        self.date_value = date_value
        self.t_value = t_value
        self.stepData = stepData
        self.Array = Array
        self.gateVolt_data = gateVolt_data
        self.curr_data = curr_data
        self.gateCurr_data = gateCurr_data
        self.resistance_data = resistance_data
        
    def G_save(self):
        if self.uiSavingGDradioButton[3].isChecked() and self.uiSavingGDlineEdit[1].text() == '':
            self.uiSavingGDlabel[0].setText('Enter a valid file name.')
        else:
            self.Select_type_G()
            self.Select_name_G()
            
            # It contains the measurement information, including user name, date, measurement type, time step etc.
            # This is a two dimensional list. Each sub list related to a single line.
            comments = []
            # For QMDlab data file it is "Collected Data"
            divider = 'Collected Data'
            # Parameters' names, such as VOLTAGE, CURRENT, TIME
            parameters = []
            # Parameters' units
            units = []
            # Include all the data
            data = []
            # Contains file type, divider, name and directory
            file_info = []
            
            # First line user name
            temp = []
            temp.append('User Name:')
            temp.append(str(self.uiSavingGDcomboBox[0].currentText()))
            comments.append(temp)
            # Second line edit time
            temp = []
            temp.append('Edit Time:')
            temp.append(str(datetime.datetime.now()))
            comments.append(temp)
            # Third line array source
            temp = []
            temp.append('Array Source:')
            temp.append(str(self.ui.lineEditK2_directoryGate.text()))
            comments.append(temp)
            # Fourth line visa address
            temp = []
            temp.append('Gate Visa Address:')
            temp.append(str(self.ui.comboBoxK2_gateVisa.currentText()))
            comments.append(temp)
            temp = []
            temp.append('Gate Visa Name:')
            name = str(self.ui.lineEditK2_gateVisa.text())
            name = name.rstrip()
            temp.append(name)
            comments.append(temp)
            # Fifth line visa address
            temp = []
            temp.append('Lead Visa Address:')
            temp.append(str(self.ui.comboBoxK2_leadVisa.currentText()))
            comments.append(temp)
            temp = []
            temp.append('Lead Visa Name:')
            name = str(self.ui.lineEditK2_leadVisa.text())
            name = name.rstrip()
            temp.append(name)
            comments.append(temp)
            # Sixth line scan source
            temp = []
            temp.append('Y-Values Units:')
            if self.ui.radioButtonK2_Volts.isChecked():
                temp.append('Volts')
            elif self.ui.radioButtonK2_mVolts.isChecked():
                temp.append('mVolts')
            elif self.ui.radioButtonK2_uVolts.isChecked():
                temp.append('uVolts')
            elif self.ui.radioButtonK2_nVolts.isChecked():
                temp.append('nVolts')
            comments.append(temp)
            # Seventh line time step
            temp = []
            temp.append('Lead Output:')
            if self.ui.radioButtonK2_Lead4.isChecked():
                temp.append('4-Terminal')
            elif self.ui.radioButtonK2_Lead2.isChecked():
                temp.append('2-Terminal')
            comments.append(temp)
            # Eighth line output voltage
            temp = []
            temp.append('Output Voltage:')
            temp.append(self.ui.lineEditK2_LeadOutput.text())
            temp.append(self.ui.comboBoxK2_LeadOutput.currentText())
            comments.append(temp)
            # Nineth line comments
            temp = []
            temp.append('Comments:')
            temp.append(str(self.ui.textEditK2_comment_G.toPlainText()))
            comments.append(temp)
            
            # Do parameters, units and data together
            parameters.append('Date')
            units.append('String')
            data.append(self.date_value)
            parameters.append('Time')
            units.append('s')
            data.append(self.t_value)
            parameters.append('Step')
            units.append('1')
            data.append(self.stepData)
            parameters.append('Step Value')
            units.append('1')
            data.append(self.Array)
            parameters.append('Gate Voltage')
            units.append('Volts')
            data.append(self.gateVolt_data)
            parameters.append('Gate Current')
            units.append('Amps')
            data.append(self.gateCurr_data)
            parameters.append('Lead Voltage')
            units.append('Volts')
            data.append(self.lead_voltage)
            parameters.append('Lead Current')
            units.append('Amps')
            data.append(self.curr_data)
            parameters.append('Lead Resistance')
            units.append('Ohms')
            data.append(self.resistance_data)
            
            # File_info
            # First is file name
            file_info.append(self.G_file_name)
            # csv or txt file
            file_info.append(self.G_type)
            # the divide of csv is "," while for txt its "\t"
            file_info.append(self.G_divide)
            # Always "Collected Data"
            file_info.append(divider)
            # The saving directory
            file_info.append(self.G_directory)
            
            self.save_thread.input(comments, parameters, units, data, file_info)
            self.ui.pushButtonK2_Open_G.setEnabled(True)
            self.ui.labelK2_condition_G.setText('File has been saved.')
    
    def O_save(self):
        if self.ui.comboBoxK2_Name_Folder_O.currentText() == 'None':
            self.ui.labelK2_condition_O.setText('Pleanse choose a user name.')
        elif self.ui.radioButtonK2_Custom_Name_O.isChecked() and self.ui.lineEdit_Custom_Name_O.text() == '':
            self.ui.labelK2_condition_O.setText('Please enter a file name.')
        else:
            self.Select_type_O()
            self.Select_name_O()
            
            # It contains the measurement information, including user name, date, measurement type, time step etc.
            # This is a two dimensional list. Each sub list related to a single line.
            comments = []
            # For QMDlab data file it is "Collected Data"
            divider = 'Collected Data'
            # Parameters' names, such as VOLTAGE, CURRENT, TIME
            parameters = []
            # Parameters' units
            units = []
            # Include all the data
            data = []
            # Contains file type, divider, name and directory
            file_info = []
            
            # First line user name
            temp = []
            temp.append('User Name:')
            temp.append(str(self.ui.comboBoxK2_Name_Folder_O.currentText()))
            comments.append(temp)
            # Second line edit time
            temp = []
            temp.append('Edit Time:')
            temp.append(str(datetime.datetime.now()))
            comments.append(temp)
            # Third line array source
            temp = []
            temp.append('Array Source:')
            temp.append(str(self.ui.lineEditK2_directoryGate.text()))
            comments.append(temp)
            # Fourth line visa address
            temp = []
            temp.append('Gate Visa Address:')
            temp.append(str(self.ui.comboBoxK2_gateVisa.currentText()))
            comments.append(temp)
            temp = []
            temp.append('Gate Visa Name:')
            name = str(self.ui.lineEditK2_gateVisa.text())
            name = name.rstrip()
            temp.append(name)
            comments.append(temp)
            # Fifth line visa address
            temp = []
            temp.append('Lead Visa Address:')
            temp.append(str(self.ui.comboBoxK2_leadVisa.currentText()))
            comments.append(temp)
            temp = []
            temp.append('Lead Visa Name:')
            name = str(self.ui.lineEditK2_leadVisa.text())
            name = name.rstrip()
            temp.append(name)
            comments.append(temp)
            # Sixth line scan source
            temp = []
            temp.append('Y-Values Units:')
            if self.ui.radioButtonK2_Volts.isChecked():
                temp.append('Volts')
            elif self.ui.radioButtonK2_mVolts.isChecked():
                temp.append('mVolts')
            elif self.ui.radioButtonK2_uVolts.isChecked():
                temp.append('uVolts')
            elif self.ui.radioButtonK2_nVolts.isChecked():
                temp.append('nVolts')
            comments.append(temp)
            # Seventh line time step
            temp = []
            temp.append('Lead Output:')
            if self.ui.radioButtonK2_Lead4.isChecked():
                temp.append('4-Terminal')
            elif self.ui.radioButtonK2_Lead2.isChecked():
                temp.append('2-Terminal')
            comments.append(temp)
            # Eighth line output voltage
            temp = []
            temp.append('Output Voltage:')
            temp.append(self.ui.lineEditK2_LeadOutput.text())
            temp.append(self.ui.comboBoxK2_LeadOutput.currentText())
            comments.append(temp)
            # Nineth line comments
            temp = []
            temp.append('Comments:')
            temp.append(str(self.ui.textEditK2_comment_O.toPlainText()))
            comments.append(temp)
            
            # Do parameters, units and data together
            parameters.append('Date')
            units.append('String')
            data.append(self.date_value)
            parameters.append('Time')
            units.append('s')
            data.append(self.t_value)
            parameters.append('Step')
            units.append('1')
            data.append(self.stepData)
            parameters.append('Step Value')
            units.append('1')
            data.append(self.Array)
            parameters.append('Gate Voltage')
            units.append('Volts')
            data.append(self.gateVolt_data)
            parameters.append('Gate Current')
            units.append('Amps')
            data.append(self.gateCurr_data)
            parameters.append('Lead Voltage')
            units.append('Volts')
            data.append(self.lead_voltage)
            parameters.append('Lead Current')
            units.append('Amps')
            data.append(self.curr_data)
            parameters.append('Lead Resistance')
            units.append('Ohms')
            data.append(self.resistance_data)
            
            # File_info
            # First is file name
            file_info.append(self.O_file_name)
            # csv or txt file
            file_info.append(self.O_type)
            # the divide of csv is "," while for txt its "\t"
            file_info.append(self.O_divide)
            # Always "Collected Data"
            file_info.append(divider)
            # The saving directory
            file_info.append(self.O_directory)
            
            self.save_thread.input(comments, parameters, units, data, file_info)
            self.ui.pushButtonK2_Open_O.setEnabled(True)
            self.ui.labelK2_condition_O.setText('File has been saved.')
    
    def G_open(self):
        opendir = self.G_directory
        open_path = 'explorer "' + opendir + '"'
        subprocess.Popen(open_path)
        
    def O_open(self):
        opendir = self.O_directory
        open_path = 'explorer "' + opendir + '"'
        subprocess.Popen(open_path)
Example #10
0
    def __init__(self, main, ui):

        self.ui = ui
        self.update_visas()
        self.collectDataThread = CollectData()
        self.save_thread = Save_Thread()
        # Set up guiqwt plot
        self.curve_item_current = make.curve([], [], color='b')
        self.ui.curvewidgetCurrent_CB.plot.add_item(self.curve_item_current)
        self.ui.curvewidgetCurrent_CB.plot.set_antialiasing(True)

        self.curve_item_voltage = make.curve([], [], color='b')
        self.ui.curvewidgetVoltage_CB.plot.add_item(self.curve_item_voltage)
        self.ui.curvewidgetVoltage_CB.plot.set_antialiasing(True)

        self.curve_item_conductance = make.curve([], [], color='b')
        self.ui.curvewidgetConductance_CB.plot.add_item(
            self.curve_item_conductance)
        self.ui.curvewidgetConductance_CB.plot.set_antialiasing(True)

        self.curve_item_resistance = make.curve([], [], color='b')
        self.ui.curvewidgetResistance_CB.plot.add_item(
            self.curve_item_resistance)
        self.ui.curvewidgetResistance_CB.plot.set_antialiasing(True)

        self.ui.pushButtonStart_CB.setEnabled(False)
        self.ui.pushButtonStop_CB.setEnabled(False)
        self.ui.pushButtonPause_CB.setEnabled(False)
        self.ui.pushButtonClear_CB.setEnabled(False)
        self.ui.pushButtonCloseAgilent_CB.setEnabled(False)
        self.ui.pushButtonCloseLockIn_CB.setEnabled(False)

        main.connect(self.ui.pushButtonUpdateVisas_CB, SIGNAL('clicked()'),
                     self.update_visas)
        main.connect(self.ui.pushButtonSelectVisas_CB, SIGNAL('clicked()'),
                     self.select_visas)
        main.connect(self.ui.pushButtonCloseAgilent_CB, SIGNAL('clicked()'),
                     self.closeAgilent)
        main.connect(self.ui.pushButtonCloseLockIn_CB, SIGNAL('clicked()'),
                     self.closeLockIn)
        main.connect(self.ui.pushButtonRetrieveVoltage_CB, SIGNAL('clicked()'),
                     self.retrieve_inputs)

        main.connect(self.ui.pushButtonStart_CB, SIGNAL('clicked()'),
                     self.start)
        main.connect(self.ui.pushButtonPause_CB, SIGNAL('clicked()'),
                     self.collectDataThread.pause)
        main.connect(self.ui.pushButtonStop_CB, SIGNAL('clicked()'), self.stop)
        main.connect(self.ui.pushButtonPause_CB, SIGNAL('clicked()'),
                     self.append_parameters)
        main.connect(self.ui.pushButtonStop_CB, SIGNAL('clicked()'),
                     self.append_parameters)
        main.connect(self.ui.pushButtonClear_CB, SIGNAL('clicked()'),
                     self.reset_plots)

        main.connect(self.collectDataThread, SIGNAL('Plot'), self.plotData)
        main.connect(self.collectDataThread, SIGNAL('PreSave'), self.PreSave)

        main.connect(self.ui.pushButtonBrowse_CB, SIGNAL("clicked()"),
                     self.browse)
        main.connect(self.ui.pushButtonSelectFolder_CB, SIGNAL("clicked()"),
                     self.select_name)
        main.connect(self.ui.radioButtonCSV_CB, SIGNAL("clicked()"),
                     self.save_type)
        main.connect(self.ui.radioButtonTXT_CB, SIGNAL("clicked()"),
                     self.save_type)
        main.connect(self.ui.pushButtonSave_CB, SIGNAL("clicked()"), self.save)
        #Variables and Arrays
        self.lock_in_sens_list = [
            100E-9, 200E-9, 500E-9, 1E-6, 2E-6, 5E-6, 10E-6, 20E-6, 50E-6,
            100E-6, 200E-6, 500E-6, 1E-3, 2E-3, 5E-3, 10E-3, 20E-3, 50E-3,
            100E-3, 200E-3, 500E-3
        ]

        self.sens = []
        self.frequency = []
        self.amplitude = []
        self.phase = []
        self.QFactor = []
        self.filter = []
        self.trim_frequency = []
        self.slope = []
        self.reserve = []
        self.quadrant = []
        self.mode = []
        self.range = []
        self.coupling = []
        self.inputType = []
        self.floatground = []
        self.TimeConstant = []
Example #11
0
class Current_Bias():
    def __init__(self, main, ui):

        self.ui = ui
        self.update_visas()
        self.collectDataThread = CollectData()
        self.save_thread = Save_Thread()
        # Set up guiqwt plot
        self.curve_item_current = make.curve([], [], color='b')
        self.ui.curvewidgetCurrent_CB.plot.add_item(self.curve_item_current)
        self.ui.curvewidgetCurrent_CB.plot.set_antialiasing(True)

        self.curve_item_voltage = make.curve([], [], color='b')
        self.ui.curvewidgetVoltage_CB.plot.add_item(self.curve_item_voltage)
        self.ui.curvewidgetVoltage_CB.plot.set_antialiasing(True)

        self.curve_item_conductance = make.curve([], [], color='b')
        self.ui.curvewidgetConductance_CB.plot.add_item(
            self.curve_item_conductance)
        self.ui.curvewidgetConductance_CB.plot.set_antialiasing(True)

        self.curve_item_resistance = make.curve([], [], color='b')
        self.ui.curvewidgetResistance_CB.plot.add_item(
            self.curve_item_resistance)
        self.ui.curvewidgetResistance_CB.plot.set_antialiasing(True)

        self.ui.pushButtonStart_CB.setEnabled(False)
        self.ui.pushButtonStop_CB.setEnabled(False)
        self.ui.pushButtonPause_CB.setEnabled(False)
        self.ui.pushButtonClear_CB.setEnabled(False)
        self.ui.pushButtonCloseAgilent_CB.setEnabled(False)
        self.ui.pushButtonCloseLockIn_CB.setEnabled(False)

        main.connect(self.ui.pushButtonUpdateVisas_CB, SIGNAL('clicked()'),
                     self.update_visas)
        main.connect(self.ui.pushButtonSelectVisas_CB, SIGNAL('clicked()'),
                     self.select_visas)
        main.connect(self.ui.pushButtonCloseAgilent_CB, SIGNAL('clicked()'),
                     self.closeAgilent)
        main.connect(self.ui.pushButtonCloseLockIn_CB, SIGNAL('clicked()'),
                     self.closeLockIn)
        main.connect(self.ui.pushButtonRetrieveVoltage_CB, SIGNAL('clicked()'),
                     self.retrieve_inputs)

        main.connect(self.ui.pushButtonStart_CB, SIGNAL('clicked()'),
                     self.start)
        main.connect(self.ui.pushButtonPause_CB, SIGNAL('clicked()'),
                     self.collectDataThread.pause)
        main.connect(self.ui.pushButtonStop_CB, SIGNAL('clicked()'), self.stop)
        main.connect(self.ui.pushButtonPause_CB, SIGNAL('clicked()'),
                     self.append_parameters)
        main.connect(self.ui.pushButtonStop_CB, SIGNAL('clicked()'),
                     self.append_parameters)
        main.connect(self.ui.pushButtonClear_CB, SIGNAL('clicked()'),
                     self.reset_plots)

        main.connect(self.collectDataThread, SIGNAL('Plot'), self.plotData)
        main.connect(self.collectDataThread, SIGNAL('PreSave'), self.PreSave)

        main.connect(self.ui.pushButtonBrowse_CB, SIGNAL("clicked()"),
                     self.browse)
        main.connect(self.ui.pushButtonSelectFolder_CB, SIGNAL("clicked()"),
                     self.select_name)
        main.connect(self.ui.radioButtonCSV_CB, SIGNAL("clicked()"),
                     self.save_type)
        main.connect(self.ui.radioButtonTXT_CB, SIGNAL("clicked()"),
                     self.save_type)
        main.connect(self.ui.pushButtonSave_CB, SIGNAL("clicked()"), self.save)
        #Variables and Arrays
        self.lock_in_sens_list = [
            100E-9, 200E-9, 500E-9, 1E-6, 2E-6, 5E-6, 10E-6, 20E-6, 50E-6,
            100E-6, 200E-6, 500E-6, 1E-3, 2E-3, 5E-3, 10E-3, 20E-3, 50E-3,
            100E-3, 200E-3, 500E-3
        ]

        self.sens = []
        self.frequency = []
        self.amplitude = []
        self.phase = []
        self.QFactor = []
        self.filter = []
        self.trim_frequency = []
        self.slope = []
        self.reserve = []
        self.quadrant = []
        self.mode = []
        self.range = []
        self.coupling = []
        self.inputType = []
        self.floatground = []
        self.TimeConstant = []

    def update_visas(self):
        visas = rm.list_resources()
        self.ui.comboBoxAgilent_CB.clear()
        self.ui.comboBoxLockIn_CB.clear()
        self.ui.labelCurrentAgilent_CB.setText("")
        self.ui.labelCurrentLockIn_CB.setText("")

        for i in visas:
            self.ui.comboBoxAgilent_CB.addItem(i)
            self.ui.comboBoxLockIn_CB.addItem(i)

    def select_visas(self):
        Agilent = str(self.ui.comboBoxAgilent_CB.currentText())
        self.Agilent = rm.open_resource(Agilent)
        LockIn = str(self.ui.comboBoxLockIn_CB.currentText())
        self.LockIn = rm.open_resource(LockIn)

        try:
            valid = self.check_Visas()
        except:
            valid = False

        if valid == True:
            self.ui.labelCurrentAgilent_CB.setText(
                str(self.Agilent.ask('*IDN?')))
            self.ui.labelCurrentLockIn_CB.setText(str(
                self.LockIn.ask('*IDN?')))
            self.ui.lineEditCondition_CB.setText(
                'No errors with selected visas')
            self.ui.pushButtonStart_CB.setEnabled(True)
            self.ui.pushButtonCloseAgilent_CB.setEnabled(True)
            self.ui.pushButtonCloseLockIn_CB.setEnabled(True)
        else:
            self.ui.lineEditCondition_CB.setText('Error with visas')

    def check_Visas(self):
        try:
            self.Agilent.ask('*IDN?')
            self.LockIn.ask('*IDN?')
            valid = True
        except:
            valid = False

        return valid

    def closeAgilent(self):
        self.Agilent.close()
        self.ui.lineEditCondition_CB.setText(
            'The visa for Agilent has been closed')
        self.ui.labelCurrentAgilent_CB.setText('')

    def closeLockIn(self):
        self.LockIn.close()
        self.ui.lineEditCondition_CB.setText(
            'The visa for Lock In has been closed')
        self.ui.labelCurrentLockIn_CB.setText('')

    def retrieve_inputs(self):
        #Reading from the lock-in will return values of integers, these integers correspond to the actual settings read from the lock in. These arrays make sure the integers are converted to what the
        #settings were placed to.
        self.sens_conversion = [
            '100', '200', '500', '1', '2', '5', '10', '20', '50', '100', '200',
            '500', '1', '2', '5', '10', '20', '50', '100', '200', '500'
        ]
        self.tc_values = [
            '500 us', '1 ms', '3 ms', '10 ms', '30 ms', '100 ms', '300 ms',
            '1 s', '3 s', '10 s', '30 s', '100 s', '300 s'
        ]
        self.qfactor_values = ['1', '2', '5', '10', '20', '50', '100']

        self.temp1 = self.sens_conversion[int(self.LockIn.ask('SENS?'))]
        if int(self.LockIn.ask('SENS?')) < 3:
            self.temp1 = self.temp1 + ' ' + 'nV'
        elif int(self.LockIn.ask('SENS?')) >= 3 and int(
                self.LockIn.ask('SENS ?')) < 12:
            self.temp1 = self.temp1 + ' ' + 'uV'
        else:
            self.temp1 = self.temp1 + ' ' + 'mV'

        self.ui.lineEditVoltageLockInSens_CB.setText(self.temp1)

        self.ui.lineEditFreq_CB.setText(
            str(self.LockIn.ask("FREQ?")).replace("\r\n", ""))
        self.ui.lineEditTrimFreq_CB.setText(
            str(self.LockIn.ask("IFFR?")).replace("\r\n", ""))
        self.ui.lineEditPhase_CB.setText(
            str(self.LockIn.ask("PHAS?")).replace("\r\n", ""))
        self.ui.lineEditAmplitude_CB.setText(
            str(self.LockIn.ask("SLVL?")).replace("\r\n", ""))
        self.ui.lineEditQFactor_CB.setText(self.qfactor_values[int(
            self.LockIn.ask("QFCT?"))])
        self.ui.lineEditTimeConstant_CB.setText(self.tc_values[int(
            (self.LockIn.ask("OFLT?")))])

        #Depending on the integer returned from the lock-in, certain buttons will be pushed.
        if int(self.LockIn.ask('ISRC?')) == 0:
            self.ui.radioButtonA_CB.setChecked(True)
        else:
            self.ui.radioButtonAB_CB.setChecked(True)

        if int(self.LockIn.ask('ICPL?')) == 0:
            self.ui.radioButtonAC_CB.setChecked(True)
        else:
            self.ui.radioButtonDC_CB.setChecked(True)

        if int(self.LockIn.ask('IGND?')) == 0:
            self.ui.radioButtonFloat_CB.setChecked(True)
        else:
            self.ui.radioButtonGround_CB.setChecked(True)

        if int(self.LockIn.ask('TYPF?')) == 0:
            self.ui.radioButtonBandPass_CB.setChecked(True)
        elif int(self.LockIn.ask('TYPF?')) == 1:
            self.ui.radioButtonHighPass_CB.setChecked(True)
        elif int(self.LockIn.ask('TYPF?')) == 2:
            self.ui.radioButtonLowPass_CB.setChecked(True)
        elif int(self.LockIn.ask('TYPF?')) == 3:
            self.ui.radioButtonNotch_CB.setChecked(True)
        else:
            self.ui.radioButtonFlat_CB.setChecked(True)

        if int(self.LockIn.ask('QUAD?')) == 0:
            self.ui.radioButtonQuadrant1_CB.setChecked(True)
        elif int(self.LockIn.ask('QUAD?')) == 1:
            self.ui.radioButtonQuadrant2_CB.setChecked(True)
        elif int(self.LockIn.ask('QUAD?')) == 2:
            self.ui.radioButtonQuadrant3_CB.setChecked(True)
        else:
            self.ui.radioButtonQuadrant4_CB.setChecked(True)

        if int(self.LockIn.ask('FMOD?')) == 0:
            self.ui.radioButtonfMode_CB.setChecked(True)
        elif int(self.LockIn.ask('FMOD?')) == 1:
            self.ui.radioButtonInternalMode_CB.setChecked(True)
        elif int(self.LockIn.ask('FMOD?')) == 2:
            self.ui.radioButton2fMode_CB.setChecked(True)
        elif int(self.LockIn.ask('FMOD?')) == 3:
            self.ui.radioButton3fMode_CB.setChecked(True)
        else:
            self.ui.radioButtonReadMode_CB.setChecked(True)

        if int(self.LockIn.ask('FRNG?')) == 0:
            self.ui.radioButtonRange1_CB.setChecked(True)
        elif int(self.LockIn.ask('FRNG?')) == 1:
            self.ui.radioButtonRange2_CB.setChecked(True)
        elif int(self.LockIn.ask('FRNG?')) == 2:
            self.ui.radioButtonRange3_CB.setChecked(True)
        elif int(self.LockIn.ask('FRNG?')) == 3:
            self.ui.radioButtonRange4_CB.setChecked(True)
        else:
            self.ui.radioButtonRange5_CB.setChecked(True)

        if int(self.LockIn.ask('RMOD?')) == 0:
            self.ui.radioButtonHighRes_CB.setChecked(True)
        elif int(self.LockIn.ask('RMOD?')) == 1:
            self.ui.radioButtonNormal_CB.setChecked(True)
        else:
            self.ui.radioButtonLowNoise_CB.setChecked(True)

        if int(self.LockIn.ask('OFSL?')) == 0:
            self.ui.radioButton6dB_CB.setChecked(True)
        else:
            self.ui.radioButton12dB_CB.setChecked(True)
        self.LockIn.write('LOCL LOCAL')

    def start(self):
        self.ui.tabWidgetCB.setCurrentIndex(1)
        if self.ui.dialVoltageLockIn_CB.value(
        ) >= 0 and self.ui.dialVoltageLockIn_CB.value() <= 2:
            self.LockIn_sens = self.lock_in_sens_list[
                self.ui.dialVoltageLockIn_CB.value()]
            self.LockIn_magn = ['nV', 1E-9]
        elif self.ui.dialVoltageLockIn_CB.value(
        ) >= 3 and self.ui.dialVoltageLockIn_CB.value() <= 11:
            self.LockIn_sens = self.lock_in_sens_list[
                self.ui.dialVoltageLockIn_CB.value()]
            self.LockIn_magn = ['uV', 1E-6]
        else:
            self.LockIn_sens = self.lock_in_sens_list[
                self.ui.dialVoltageLockIn_CB.value()]
            self.LockIn_magn = ['mV', 1E-3]

        self.ui.pushButtonStart_CB.setEnabled(False)
        self.ui.pushButtonPause_CB.setEnabled(True)
        self.ui.pushButtonStop_CB.setEnabled(True)
        self.ui.lineEditCondition_CB.setText('Running...')
        self.collectDataThread.input(self.ui, self.curve_item_current,
                                     self.curve_item_voltage,
                                     self.curve_item_conductance,
                                     self.curve_item_resistance,
                                     self.LockIn_sens, self.LockIn_magn,
                                     self.Agilent, self.LockIn)

    def plotData(self):
        self.curve_item_current.plot().replot()
        self.curve_item_voltage.plot().replot()
        self.curve_item_conductance.plot().replot()
        self.curve_item_resistance.plot().replot()
        self.ui.curvewidgetCurrent_CB.plot.do_autoscale()
        self.ui.curvewidgetVoltage_CB.plot.do_autoscale()
        self.ui.curvewidgetConductance_CB.plot.do_autoscale()
        self.ui.curvewidgetResistance_CB.plot.do_autoscale()

    def stop(self):
        self.collectDataThread.pauseLoop = True
        self.collectDataThread.quit()
        self.ui.pushButtonClear_CB.setEnabled(True)
        self.ui.pushButtonStop_CB.setEnabled(False)
        self.ui.pushButtonPause_CB.setEnabled(False)
        self.ui.lineEditCondition_CB.setText("Stopped")

    def append_parameters(self):
        self.sens.append(self.temp1)
        self.frequency.append(str(self.ui.lineEditFreq_CB.text()))
        self.trim_frequency.append(str(self.ui.lineEditTrimFreq_CB.text()))
        self.amplitude.append(str(self.ui.lineEditAmplitude_CB.text()))
        self.phase.append(str(self.ui.lineEditPhase_CB.text()))
        self.QFactor.append(str(self.ui.lineEditQFactor_CB.text()))
        self.TimeConstant.append(str(self.ui.lineEditTimeConstant_CB.text()))

        if self.ui.radioButtonBandPass_CB.isChecked():
            self.filter.append('Band Pass')
        elif self.ui.radioButtonHighPass_CB.isChecked():
            self.filter.append('High Pass')
        elif self.ui.radioButtonLowPass_CB.isChecked():
            self.filter.append('Low Pass')
        elif self.ui.radioButtonNotch_CB.isChecked():
            self.filter.append('Notch')
        elif self.ui.radioButtonFlat_CB.isChecked():
            self.filter.append('Flat')
        else:
            self.filter = ''
            self.ui.lineEditCondition_CB.setText(
                'Please Choose A Filter Type For Voltage')

        if self.ui.radioButton6dB_CB.isChecked():
            self.slope.append('6 dB/oct.')
        elif self.ui.radioButton12dB_CB.isChecked():
            self.slope.append('12 dB/oct.')
        else:
            self.slope = ''
            self.ui.lineEditCondition_CB.setText(
                'Please Choose A Slope For Voltage')

        if self.ui.radioButtonHighRes_CB.isChecked():
            self.reserve.append('High Res')
        elif self.ui.radioButtonNormal_CB.isChecked():
            self.reserve.append('Normal')
        elif self.ui.radioButtonLowNoise_CB.isChecked():
            self.reserve.append('Low Noise')
        else:
            self.reserve = ''
            self.ui.lineEditCondition_CB.setText(
                'Please Choose A Reserve For Voltage')

        if self.ui.radioButtonQuadrant1_CB.isChecked():
            self.quadrant.append('0-90')
        elif self.ui.radioButtonQuadrant2_CB.isChecked():
            self.quadrant.append('90-180')
        elif self.ui.radioButtonQuadrant3_CB.isChecked():
            self.quadrant.append('180-270')
        elif self.ui.radioButtonQuadrant4_CB.isChecked():
            self.quadrant.append('270-360')
        else:
            self.quadrant = ''
            self.ui.lineEditCondition_CB.setText(
                'Please Choose A Quadrant For Voltage')

        if self.ui.radioButtonfMode_CB.isChecked():
            self.mode.append('f External')
        elif self.ui.radioButton2fMode_CB.isChecked():
            self.mode.append('2f External')
        elif self.ui.radioButton3fMode_CB.isChecked():
            self.mode.append('3f External')
        elif self.ui.radioButtonInternalMode_CB.isChecked():
            self.mode.append('Internal')
        elif self.ui.radioButtonRearMode_CB.isChecked():
            self.mode.append('Rear VCO')
        else:
            self.mode = ''
            self.ui.lineEditCondition_CB.setText(
                'Please Choose A Mode For Voltage')

        if self.ui.radioButtonRange1_CB.isChecked():
            self.range.append('0.2-21 Hz')
        elif self.ui.radioButtonRange2_CB.isChecked():
            self.range.append('2.0-210 Hz')
        elif self.ui.radioButtonRange3_CB.isChecked():
            self.range.append('20-2.1k Hz')
        elif self.ui.radioButtonRange4_CB.isChecked():
            self.range.append('200-21k Hz')
        elif self.ui.radioButtonRange5_CB.isChecked():
            self.range.append('2.0k-210k Hz')
        else:
            self.range = ''
            self.ui.lineEditCondition_CB.setText(
                'Please Choose A Frequency Range For Voltage')

        if self.ui.radioButtonAC_CB.isChecked():
            self.coupling.append('AC')
        elif self.ui.radioButtonDC_CB.isChecked():
            self.coupling.append('DC')
        else:
            self.coupling = ''
            self.ui.lineEditCondition.setText(
                'Please Choose A Coupling For Voltage')

        if self.ui.radioButtonA_CB.isChecked():
            self.inputType.append('A')
        elif self.ui.radioButtonAB_CB.isChecked():
            self.inputType.append('A-B')
        else:
            self.inputType = ''
            self.ui.lineEditCondition_CB.setText(
                'Please Choose An Input Type For Voltage')

        if self.ui.radioButtonFloat_CB.isChecked():
            self.floatground.append('Float')
        elif self.ui.radioButtonGround_CB.isChecked():
            self.floatground.append('Ground')
        else:
            self.floatground = ''
            self.ui.lineEditCondition_CB.setText(
                'Please Choose A Float/Ground For Voltage')

        if self.ui.radioButtonOhms_CB.isChecked():
            self.resistor_unit = 'Ohms'
        elif self.ui.radioButtonkOhms_CB.isChecked():
            self.resistor_unit = 'kOhms'
        elif self.ui.radioButtonMOhms_CB.isChecked():
            self.resistor_unit = 'MOhms'
        else:
            self.resistor_unit = 'GOhms'

    def PreSave(self, Time, Steps, Current, Voltage, Conductance, Resistance):
        self.Time = Time
        self.Steps = Steps
        self.Current = Current
        self.Voltage = Voltage
        self.Conductance = Conductance
        self.Resistance = Resistance
        self.collectDataThread.save_ready == False

    def reset_plots(self):
        self.ui.pushButtonStart_CB.setEnabled(True)
        self.curve_item_current.set_data([], [])
        self.curve_item_voltage.set_data([], [])
        self.curve_item_conductance.set_data([], [])
        self.curve_item_resistance.set_data([], [])
        self.curve_item_current.plot().replot()
        self.curve_item_voltage.plot().replot()
        self.curve_item_conductance.plot().replot()
        self.curve_item_resistance.plot().replot()
        self.reset_check = True

    def browse(self):
        prev_dir = 'C:\\'
        file_list = []
        file_dir = QFileDialog.getExistingDirectory(
            None, 'Select The GoogleDrive Folder', prev_dir)
        if file_dir != '':
            file_list = str(file_dir).split('/')
            file_dir.replace('/', '\\')
            self.ui.lineEditDirectory_CB.setText(file_dir)
        self.directory = ''

    def select_name(self):
        file_list = []
        file_list = str(self.ui.lineEditDirectory_CB.text()).split('\\')
        for i in range(0, len(file_list)):
            self.directory += file_list[i] + '\\'
        namefolder = str(self.ui.comboBoxFolders_CB.currentText())
        if namefolder == 'None':
            self.ui.lineEditCondition_CB.setText(
                'Please Choose A Folder To Save To.')
        else:
            #Sets the name of the file to current date and time by default
            now = datetime.now()
            date = '%s-%s-%s' % (now.year, now.month, now.day)
            self.directory += namefolder + "\Data" + '\\' + date
            self.current_time = '%s.%s.%s' % (now.hour, now.month, now.second)
            self.date_and_time = date + ' ' + self.current_time
            self.file_name = (self.date_and_time)
            print self.directory

    def save_type(self):
        if self.ui.radioButtonCSV_CB.isChecked() == True:
            self.type = '.csv'
            self.divide = ','
        elif self.ui.radioButtonTXT_CB.isChecked() == True:
            self.type = '.txt'
            self.divide = '\t'

    def save_name(self):
        if self.ui.radioButtonDateTime_CB.isChecked():
            now = datetime.now()
            date = '%s-%s-%s' % (now.year, now.month, now.day)
            current_time = '%s.%s.%s' % (now.hour, now.month, now.second)
            date_and_time = date + ' ' + current_time
            self.file_name = str(date_and_time)
        elif self.ui.radioButtonCustomName_CB.isChecked():
            self.file_name = str(self.ui.lineEditCustom_CB.text())

    def save(self):
        if self.ui.radioButtonCustomName_CB.isChecked(
        ) and self.ui.lineEditCustom_CB.text() == ' ':
            self.ui.lineEditStatus_CB.setText(
                'Please Enter A Custom File Name')
        else:
            self.save_type()
            self.save_name()
        import datetime
        parameters_s = [
            'Sensitivity:', 'Frequency:', 'Amplitude:', 'Phase:',
            'Trim Frequency:', 'Reserve:', 'Slope:', 'Q Factor:',
            'Time Constant:', 'Filter Type:', 'Coupling:', 'Input:',
            'Float/Ground:', 'Quadrant:', 'Mode:', 'Frequency Range:'
        ]
        parametersValue = [
            self.sens, self.frequency, self.amplitude, self.phase,
            self.trim_frequency, self.reserve, self.slope, self.QFactor,
            self.TimeConstant, self.filter, self.coupling, self.inputType,
            self.floatground, self.quadrant, self.mode, self.range
        ]

        comments = []
        parameters = []
        file_info = []
        units = []
        data = []
        divider = 'Collected Data'

        # First line user name
        temp = []
        temp.append('User Name:')
        temp.append(str(self.ui.comboBoxFolders_CB.currentText()))
        comments.append(temp)

        temp = []
        temp.append('Edit Time:')
        temp.append(str(datetime.datetime.now()))
        comments.append(temp)
        # Fourth line visa address
        temp = []
        temp.append('Agilent Visa Address:')
        temp.append(str(self.ui.comboBoxAgilent_CB.currentText()))
        comments.append(temp)
        # Fifth line visa name
        temp = []
        temp.append('Visa Name:')
        visa_name = self.Agilent.ask('*IDN?').rstrip('\n')
        visa_name = visa_name.replace(',', ' ')
        temp.append(visa_name)
        comments.append(temp)

        temp = []
        temp.append('Lock-In Visa Address:')
        temp.append(str(self.ui.comboBoxLockIn_CB.currentText()))
        comments.append(temp)

        temp = []
        temp.append('Visa Name:')
        visa_name = self.LockIn.ask('*IDN?').rstrip('\n')
        visa_name = visa_name.replace(',', ' ')
        temp.append(visa_name)
        comments.append(temp)

        # Sixth line scan source
        temp = []
        temp.append('Scan Source:')
        temp.append('Voltage')
        comments.append(temp)
        # Seventh line time step
        temp = []
        temp.append('Time Step(sec):')
        temp.append(str(self.ui.lineEditTimestep_VB.text()))
        comments.append(temp)

        temp = []
        temp.append('Output Voltage:')
        temp.append(str(self.ui.lineEditAmplitude_CB.text()) + ' ' + 'V')
        comments.append(temp)

        temp = []
        temp.append('Large Resistor Value:')
        temp.append(
            str(self.ui.lineEditResistor_CB.text()) + ' ' + self.resistor_unit)
        comments.append(temp)
        temp = []
        temp.append('Lock-In Parameters:')
        temp.append('')
        comments.append(temp)

        for i in range(0, len(parameters_s)):
            temp = []
            for j in range(0, len(self.sens)):
                temp.append(parameters_s[i])
                temp.append(parametersValue[i][j])
                comments.append(temp)

        # Eighth line comments
        temp = []
        temp.append('Comments:')
        temp.append(str(self.ui.textEditComments_CB.toPlainText()))
        comments.append(temp)

        parameters.append('Time')
        units.append('s')
        data.append(self.Time)

        parameters.append('Steps')
        units.append(' ')
        data.append(self.Steps)

        parameters.append('Current')
        units.append('A')
        data.append(self.Current)

        parameters.append('Voltage')
        units.append(self.LockIn_magn[0])
        data.append(self.Voltage)

        parameters.append('Conductance')
        units.append('S')
        data.append(self.Conductance)

        parameters.append('Resistance')
        units.append('Ohm')
        data.append(self.Resistance)

        file_info.append(self.file_name)
        file_info.append(self.type)
        file_info.append(self.divide)
        file_info.append(divider)
        file_info.append(self.directory)

        self.save_thread.input(comments, parameters, units, data, file_info)
        self.ui.lineEditCondition_CB.setText("Data has been saved")