Example #1
0
 def __init__(self, sysargv):
     super(App, self).__init__(sysargv)
     self.model = MainModel()
     self.controller = MainController(self.model)
     self.view = MainView(self.model, self.controller)
     self.controller.view = self.view
     self.view.show()
class App(Qt.QApplication):
    def __init__(self, sys_argv):
        super(App, self).__init__(sys_argv)
        self.model = Model()
        self.main_ctrl = MainController(self.model)
        self.main_view = MainView(self.model, self.main_ctrl)
        self.main_view.show()
Example #3
0
class App(QtGui.QApplication):
    def __init__(self, sys_argv, port):
        super(App, self).__init__(sys_argv)
        self.model = Model()
        self.main_controller = MainController(self.model, port)
        self.main_view = MainView(self.model, self.main_controller)
        self.main_view.show()
Example #4
0
class App(QApplication):
    def __init__(self, sysargv):
        super(App, self).__init__(sysargv)
        self.model = MainModel()
        self.controller = MainController(self.model)
        self.view = MainView(self.model, self.controller)
        self.controller.view = self.view
        self.view.show()
Example #5
0
    def __init__(self, sys_argv):
        super(App, self).__init__(sys_argv)
        self.model = Model()
        self.main_ctrl = MainController(self.model)
        self.main_view = MainView(self.model, self.main_ctrl)
        self.settings_view = SettingsView(self.model, self.main_ctrl)
        self.main_view.show()

        # This works, but should be shown after I pressed the Settings-button
        self.settings_view.show()
Example #6
0
    def initContextMenu(self):
        self._menu = QMenu(MainView.getInstance())

        self._aboutAction = ActionManager.getInstance().getAboutDialogAction()
        self._menu.addAction(self._aboutAction)

        self.setContextMenu(self._menu)    
Example #7
0
    def createMainWindow(self):
        '''
        Creates the Main Window and bootstraps the Bloop Tree.
        '''
        self._mainView_ = MainView.getInstance()
        self._mainViewController_ = MainViewController(self._mainView_)
        self._mainView_.createComponents()
        
        # Expand the data on the Friend Tree by default
        if self.getMainViewController().getFriendsTreeController() is not None:
            self.getMainViewController().getFriendsTreeController().buildTree()

        self.getMainViewController().bootstrapComponents()
        
        #We do all this at this point (and not on the MainView Controller)
        #since we'd like to make sure we have a controller before invoking
        #these methods.
        self._mainView_.show()
        self._mainView_.createMenuBar()
        
        #IconTray
        possibleTrayController = self._mainView_.initIconTray(self)
        
        if possibleTrayController:
            self.setTrayIconController(possibleTrayController)
        
        self.getMainViewController().restoreSizes()
        
        #Try to recover from unfinished uploads if any
        #self.hireWorker(self.getMainViewController().getUploadManagerViewController().tryRestoringUploads)
        #cant put this on a thread, windows claims the upload manager timer will be started from another thread
        self.getMainViewController().getUploadManagerViewController().tryRestoringUploads()
Example #8
0
    def __init__(self):
        self.widget = MainView(__version__)
        self.widget.show()
        self.model = SxrdModel()
        self.connect_buttons()
        self.connect_tables()
        self.connect_txt()
        self.populate_filename()
        self.connect_checkboxes()
        self.abort_collection = False
        self.logging_handler = InfoLoggingHandler(self.update_status_txt)
        logger.addHandler(self.logging_handler)

        self.status_txt_scrollbar_is_at_max = True
        
        self.widget.setup_table.resizeColumnsToContents()
        self.example_str = ' '
Example #9
0
    def __init__(self):
        self.widget = MainView(__version__)
        self.widget.show()
        self.model = SxrdModel()
        self.connect_buttons()
        self.connect_tables()
        self.connect_txt()
        self.populate_filename()

        self.abort_collection = False
        self.logging_handler = InfoLoggingHandler(self.update_status_txt)
        logger.addHandler(self.logging_handler)

        self.status_txt_scrollbar_is_at_max = True
 def __init__(self):
     self._close_funcs = []
     self.model = Model()
     self.fig_widget = None
     self.main_view = MainView(self)
     self.main_view.show()
Example #11
0
from build_all_ui_files import build_all_ui_files, script_folder

try:
    build_all_ui_files(script_folder, verbose=False)
except:
    print('ui files not built')

from views.MainView import MainView

main_view = MainView()
main_view.show()
Example #12
0
 def __init__(self, sys_argv):
     super(App, self).__init__(sys_argv)
     self.model = MainModel()
     self.main_ctrl = MainController(self.model)
     self.main_view = MainView(self.model, self.main_ctrl)
     self.main_view.show()
Example #13
0
 def voice(self):
     mv = MainView()
     mv.load()
from tkinter import *
from views.MainView import MainView

# Configuración de la interfaz gráfica
root = Tk()
root.title("Deber 03")
root.resizable(False, False)  # para no redimensionar
root.iconbitmap("fav.ico")
# root.geometry("600x400")  # tamaño

app = MainView(root)
root.mainloop()
Example #15
0
def main():
    window = Window(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_TITLE)
    game = MainView()
    window.show_view(game)
    run()
class MainController(object):
    def __init__(self):
        self._close_funcs = []
        self.model = Model()
        self.fig_widget = None
        self.main_view = MainView(self)
        self.main_view.show()

    # subscribe a function for closing on program exit
    def subscribe_close_func(self, func):
        if func not in self._close_funcs:
            self._close_funcs.append(func)

    # unsubscribe a function from closing on program exit
    def unsubscribe_close_func(self, func):
        if func in self._close_funcs:
            self._close_funcs.remove(func)

    # call all close functions on close.
    def announce_close(self):
        # call this function from main application
        for func in self._close_funcs:
            func()

    def main_view_init(self, **kwargs):
        self.main_line_edits = kwargs.pop('lineEdits', None)
        self.main_combo_boxes = kwargs.pop('comboBoxes', None)
        self.main_fig_widget = kwargs.pop('fig_widget', None)
        self.main_deg_rad = kwargs.pop('deg_rad', None)
        self.main_statusbar = kwargs.pop('statusbar', None)

        self.set_line_edits(self.model.values)
        self.set_combo_boxes(self.model.comboBoxItems,
                             self.model.comboBoxIndexes)
        self.update_combo_boxes()

        self.fig_widget = MplFigureCanvas(self)
        self.set_result(self.model.status, self.model.triangle,
                        self.model.deg_rad)
        self.main_fig_widget.addWidget(self.fig_widget)

    def set_line_edits(self, values):
        for n in range(len(self.main_line_edits)):
            if values[n]:
                self.main_line_edits[n].setText(str(values[n]))

    def set_combo_boxes(self, comboBoxItems, comboBoxIndexes):
        for n in range(len(self.main_combo_boxes)):
            self.main_combo_boxes[n].clear()
            self.main_combo_boxes[n].addItems(comboBoxItems[n])
            self.main_combo_boxes[n].setCurrentIndex(comboBoxIndexes[n])

    def update_combo_boxes(self):
        keys = []
        for cb in self.main_combo_boxes:
            keys.append(cb.currentText())
        self.set_combo_boxes(*self.model.update_combo_boxes(keys))

    def update_deg_rad(self):
        deg_rad = True if self.main_deg_rad.currentIndex() == 0 else False
        values = self.model.update_deg_rad(deg_rad)
        self.set_line_edits(values)
        self.calculate()

    def calculate(self):
        keys = []
        for cb in self.main_combo_boxes:
            keys.append(cb.currentText())

        values = []
        for le in self.main_line_edits:
            values.append(le.text())
            try:
                values[-1] = float(values[-1])
            except ValueError:
                values[-1] = None

        deg_rad = True if self.main_deg_rad.currentIndex() == 0 else False

        status, triangle = self.model.triangle_calc(keys, values, deg_rad)
        self.set_result(status, triangle, deg_rad)

    def set_result(self, status, triangle, deg_rad):
        msg = self.model.status_msg(status)
        self.main_statusbar.showMessage(msg)

        if self.fig_widget.animation_is_running:
            self.fig_widget.stop_animation()

        if status == 0:
            self.fig_widget.plot(self.model.draw_triangle, triangle, deg_rad)
        elif status == 1:
            list_of_args = [(t, deg_rad) for t in triangle]
            self.fig_widget.start_animation(self.model.draw_triangle,
                                            list_of_args, 2000)
        elif status == 2:
            list_of_args = self.model.path_list_calc(triangle, deg_rad)
            self.fig_widget.start_animation(self.model.draw_path, list_of_args,
                                            100)
        else:
            self.fig_widget.fig.clf()
            self.fig_widget.draw()
Example #17
0
class MainController(object):
    def __init__(self):
        self.widget = MainView(__version__)
        self.widget.show()
        self.model = SxrdModel()
        self.connect_buttons()
        self.connect_tables()
        self.connect_txt()
        self.populate_filename()
        self.connect_checkboxes()
        self.abort_collection = False
        self.logging_handler = InfoLoggingHandler(self.update_status_txt)
        logger.addHandler(self.logging_handler)

        self.status_txt_scrollbar_is_at_max = True
        
        self.widget.setup_table.resizeColumnsToContents()
        self.example_str = ' '

        # self.filename_update_timer = QtCore.QTimer()
        # self.filename_update_timer.timeout.connect(self.set_example_lbl)
        # self.filename_update_timer.start(1000)


    def connect_checkboxes(self):
        self.widget.no_suffices_cb.clicked.connect(lambda: self.update_cb('no_suffices'))
        self.widget.rename_after_cb.clicked.connect(lambda: self.update_cb('rename'))
        self.widget.rename_files_cb.clicked.connect(lambda: self.update_cb('rename'))
        self.widget.check_all_still_cb.clicked.connect(self.check_all_still)
        self.widget.check_all_wide_cb.clicked.connect(self.check_all_wide)
        self.widget.check_all_step_cb.clicked.connect(self.check_all_step)


    def update_cb(self, emitter):
        if emitter == 'no_suffices':
            if self.widget.no_suffices_cb.isChecked():
                self.widget.rename_files_cb.setChecked(False)
                self.widget.rename_after_cb.setChecked(False)
        elif emitter == 'rename':
            if self.widget.rename_files_cb.isChecked() or self.widget.rename_after_cb.isChecked():
                self.widget.no_suffices_cb.setChecked(False)
        self.set_example_lbl()

    def connect_buttons(self):
        self.widget.add_setup_btn.clicked.connect(self.add_experiment_setup_btn_clicked)
        self.widget.delete_setup_btn.clicked.connect(self.delete_experiment_setup_btn_clicked)
        self.widget.clear_setup_btn.clicked.connect(self.clear_experiment_setup_btn_clicked)

        self.widget.add_sample_btn.clicked.connect(self.add_sample_point_btn_clicked)
        self.widget.delete_sample_btn.clicked.connect(self.delete_sample_point_btn_clicked)
        self.widget.clear_sample_btn.clicked.connect(self.clear_sample_point_btn_clicked)
        self.widget.create_map_btn.clicked.connect(self.create_map_btn_clicked)

        self.widget.get_folder_btn.clicked.connect(self.get_folder_btn_clicked)
        self.widget.get_basename_btn.clicked.connect(self.get_basename_btn_clicked)
        self.widget.get_framenr_btn.clicked.connect(self.get_framenr_btn_clicked)

        self.widget.collect_bkg_btn.clicked.connect(self.collect_bkg_data)
        self.widget.collect_btn.clicked.connect(self.collect_data)

        self.widget.load_setup_btn.clicked.connect(self.load_exp_setup)
        self.widget.save_setup_btn.clicked.connect(self.save_exp_setup)

        self.widget.omega_pm1_btn.clicked.connect(lambda: self.omega_btn_clicked(1.0))
        self.widget.omega_pm3_btn.clicked.connect(lambda: self.omega_btn_clicked(3.0))
        self.widget.omega_pm10_btn.clicked.connect(lambda: self.omega_btn_clicked(10.0))
        self.widget.omega_pm20_btn.clicked.connect(lambda: self.omega_btn_clicked(20.0))
        self.widget.omega_pm38_btn.clicked.connect(lambda: self.omega_btn_clicked(38.0))
        self.widget.omega_set_btn.clicked.connect(lambda: self.omega_btn_clicked(abs(float(self.widget.omega_range_txt.text()))))

        self.widget.set_map_range_02_btn.clicked.connect(lambda: self.set_map_range(0.02))
        self.widget.set_map_range_01_btn.clicked.connect(lambda: self.set_map_range(0.01))
        self.widget.set_map_range_006_btn.clicked.connect(lambda: self.set_map_range(0.006))
        self.widget.set_map_range_004_btn.clicked.connect(lambda: self.set_map_range(0.004))
        self.widget.set_map_range_btn.clicked.connect(lambda: self.set_map_range(self.widget.map_range_txt.text()))

        self.widget.set_map_step_005_btn.clicked.connect(lambda: self.set_map_step(0.005))
        self.widget.set_map_step_003_btn.clicked.connect(lambda: self.set_map_step(0.003))
        self.widget.set_map_step_002_btn.clicked.connect(lambda: self.set_map_step(0.002))
        self.widget.set_map_step_001_btn.clicked.connect(lambda: self.set_map_step(0.001))
        self.widget.set_map_step_btn.clicked.connect(lambda: self.set_map_step(self.widget.map_step_txt.text()))

        self.widget.open_path_btn.clicked.connect(self.open_path_btn_clicked)
        self.widget.framenr_reset_btn.clicked.connect(self.reset_frame_nr)

    def connect_tables(self):
        self.widget.setup_table.cellChanged.connect(self.setup_table_cell_changed)
        self.widget.sample_points_table.cellChanged.connect(self.sample_points_table_cell_changed)

        self.widget.move_sample_btn_clicked.connect(self.move_sample_btn_clicked)
        self.widget.set_sample_btn_clicked.connect(self.set_sample_btn_clicked)

        self.widget.step_cb_status_changed.connect(self.step_cb_status_changed)
        self.widget.wide_cb_status_changed.connect(self.wide_cb_status_changed)
        self.widget.still_cb_status_changed.connect(self.still_cb_status_changed)

    def connect_txt(self):
        self.widget.filename_txt.editingFinished.connect(self.basename_txt_changed)
        self.widget.filepath_txt.editingFinished.connect(self.filepath_txt_changed)
        self.widget.frame_number_txt.editingFinished.connect(self.frame_number_txt_changed)

        self.widget.status_txt.textChanged.connect(self.update_status_txt_scrollbar)
        self.widget.status_txt.verticalScrollBar().valueChanged.connect(self.update_status_txt_scrollbar_value)

    def populate_filename(self):
        self.prev_filepath, self.prev_filename, self.prev_file_number = self.get_filename_info()

        self.filepath = self.prev_filepath
        self.basename = self.prev_filename

        self.widget.filename_txt.setText(self.prev_filename)
        self.widget.filepath_txt.setText(self.prev_filepath)
        self.widget.frame_number_txt.setText(str(self.prev_file_number))

        self.set_example_lbl()

    def update_status_txt(self, msg):
        self.widget.status_txt.append(msg)

    def update_status_txt_scrollbar(self):
        if self.status_txt_scrollbar_is_at_max:
            self.widget.status_txt.verticalScrollBar().setValue(
                self.widget.status_txt.verticalScrollBar().maximum()
            )

    def get_folder_btn_clicked(self):
        self.prev_filepath, _, _ = self.get_filename_info()
        self.filepath = self.prev_filepath
        self.widget.filepath_txt.setText(self.prev_filepath)

        self.set_example_lbl()

    def get_basename_btn_clicked(self):
        _, self.prev_filename, _ = self.get_filename_info()
        self.basename = self.prev_filename
        self.widget.filename_txt.setText(self.basename)
        self.set_example_lbl()

    def get_framenr_btn_clicked(self):
        _, _, self.prev_file_number = self.get_filename_info()
        self.file_number = self.prev_file_number
        self.widget.frame_number_txt.setText(str(self.file_number))
        self.set_example_lbl()

    def update_status_txt_scrollbar_value(self, value):
        self.status_txt_scrollbar_is_at_max = value == self.widget.status_txt.verticalScrollBar().maximum()

    def load_exp_setup(self):
        filename = str(QtGui.QFileDialog.getOpenFileName(self.widget, caption="Load experiment setup file", filter='*.ini'))
        if filename is not '':
            with open(filename) as f:
                for line in f:
                    name, detector_pos_x, detector_pos_z, omega_start, omega_end, omega_step, step_time = line.split(';')
                    self.model.add_experiment_setup(name, float(detector_pos_x), float(detector_pos_z),
                                                    float(omega_start), float(omega_end), float(omega_step), float(step_time))
                    self.widget.add_experiment_setup(name, float(detector_pos_x), float(detector_pos_z),
                                                    float(omega_start), float(omega_end), float(omega_step), float(step_time))
        self.widget.setup_table.resizeColumnsToContents()

    def save_exp_setup(self):
        filename = str(QtGui.QFileDialog.getSaveFileName(self.widget, caption="Save experiment setup file", filter='*.ini'))
        if filename is not '':
            with open(filename, 'w+') as f:
                for experiment_setup in self.model.experiment_setups:
                    f.write(experiment_setup.save())
                    f.write('\n')

    def reset_frame_nr(self):
        self.widget.frame_number_txt.setText('1')
        caput(epics_config['detector_file'] + ':FileNumber', 1)
        self.set_example_lbl()

    def add_experiment_setup_btn_clicked(self):
        detector_pos_x, detector_pos_z, omega, exposure_time = self.get_current_setup()
        default_name = 'E{}'.format(len(self.model.experiment_setups) + 1)
        self.model.add_experiment_setup(default_name, detector_pos_x, detector_pos_z,
                                        omega - 1, omega + 1, 1, exposure_time)
        self.widget.add_experiment_setup(default_name, detector_pos_x, detector_pos_z,
                                         omega - 1, omega + 1, 1, exposure_time)
        self.widget.setup_table.resizeColumnsToContents()

    def delete_experiment_setup_btn_clicked(self):
        cur_ind = self.widget.get_selected_experiment_setup()
        cur_ind.sort()
        cur_ind = cur_ind[::-1]
        if cur_ind is None or (len(cur_ind) == 0):
            return
        msgBox = QtGui.QMessageBox()
        msgBox.setText('Do you really want to delete selected experiment(s)?')
        msgBox.setWindowTitle('Confirmation')
        msgBox.setStandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
        msgBox.setDefaultButton(QtGui.QMessageBox.Yes)
        response = msgBox.exec_()
        if response == QtGui.QMessageBox.Yes:
            for ind in cur_ind:
                self.widget.delete_experiment_setup(ind)
                self.model.delete_experiment_setup(ind)
            self.widget.recreate_sample_point_checkboxes(self.model.get_experiment_state())
        self.set_example_lbl()
        self.set_total_frames()


    def clear_experiment_setup_btn_clicked(self):
        msgBox = QtGui.QMessageBox()
        msgBox.setText('Do you really want to delete all experiments?')
        msgBox.setWindowTitle('Confirmation')
        msgBox.setStandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
        msgBox.setDefaultButton(QtGui.QMessageBox.Yes)
        response = msgBox.exec_()
        if response == QtGui.QMessageBox.Yes:
            self.widget.clear_experiment_setups()
            self.model.clear_experiment_setups()
            self.widget.recreate_sample_point_checkboxes(self.model.get_experiment_state())
        self.set_example_lbl()
        self.set_total_frames()

    def add_sample_point_btn_clicked(self):
        x, y, z = self.get_current_sample_position()
        num = len(self.model.sample_points)
        self.widget.add_sample_point('S{}'.format(num + 1), x, y, z, self.widget.check_all_still_cb.isChecked(), self.widget.check_all_wide_cb.isChecked(), self.widget.check_all_step_cb.isChecked())
        self.model.add_sample_point('S{}'.format(num + 1), x, y, z, self.widget.check_all_step_cb.isChecked(), self.widget.check_all_wide_cb.isChecked(), self.widget.check_all_still_cb.isChecked())
        self.widget.recreate_sample_point_checkboxes(self.model.get_experiment_state())
        self.set_example_lbl()
        self.set_total_frames()

    def delete_sample_point_btn_clicked(self):
        cur_ind = self.widget.get_selected_sample_point()
        cur_ind.sort()
        cur_ind = cur_ind[::-1]
        for ind in cur_ind:
            self.widget.delete_sample_point(ind)
            self.model.delete_sample_point(ind)
        self.set_example_lbl()
        self.set_total_frames()

    def clear_sample_point_btn_clicked(self):
        self.widget.clear_sample_points()
        self.model.clear_sample_points()
        self.set_total_frames()
        self.set_example_lbl()

    def create_map_btn_clicked(self):
        cur_ind = self.widget.get_selected_sample_point()[-1]

        x_min = float(str(self.widget.x_min_txt.text()))
        x_max = float(str(self.widget.x_max_txt.text()))
        x_step = float(str(self.widget.x_step_txt.text()))

        y_min = float(str(self.widget.y_min_txt.text()))
        y_max = float(str(self.widget.y_max_txt.text()))
        y_step = float(str(self.widget.y_step_txt.text()))

        map = self.model.create_map(cur_ind, x_min, x_max, x_step, y_min, y_max, y_step)

        for name, position in map.iteritems():
            x, y, z = position
            self.widget.add_sample_point(name, x, y, z)

        self.set_total_frames()

    def setup_table_cell_changed(self, row, col):
        label_item = self.widget.setup_table.item(row, col)
        value = str(label_item.text())
        self.widget.setup_table.blockSignals(True)
        if col == 0:
            if not self.model.setup_name_existent(value):
                self.model.experiment_setups[row].name = str(value)
                self.widget.update_sample_table_setup_header(
                    self.model.get_experiment_setup_names()
                )
                self.widget.sample_points_table.resizeColumnsToContents()
            else:
                self.create_name_existent_msg('Experiment setup')
                name_item = self.widget.setup_table.item(row, 0)
                name_item.setText(self.model.experiment_setups[row].name)
        else:
            value = float(value)
            if col == 1:
                self.model.experiment_setups[row].detector_pos_x = value
            elif col == 2:
                self.model.experiment_setups[row].detector_pos_z = value
            elif col == 3:
                if value >= -135.0 and value <= -45.0:
                    self.model.experiment_setups[row].omega_start = value
                    self.update_total_exposure_time(row)
                else:
                    self.model.experiment_setups[row].omega_start = -90.0
                    self.widget.setup_table.item(row, 3).setText('-90.0')
                    self.update_total_exposure_time(row)
                    self.create_omega_error_msg('Starting omega value is incorrect')
            elif col == 4:
                if value >= -135 and value <= -45:
                    self.model.experiment_setups[row].omega_end = value
                    self.update_total_exposure_time(row)
                else:
                    self.model.experiment_setups[row].omega_end = -90.0
                    self.widget.setup_table.item(row, 4).setText('-90.0')
                    self.update_total_exposure_time(row)
                    self.create_omega_error_msg('End omega value is incorrect')
            elif col == 5:
                self.model.experiment_setups[row].omega_step = value
                self.update_total_exposure_time(row)
            elif col == 6:
                self.model.experiment_setups[row].time_per_step = value
                self.update_total_exposure_time(row)
            elif col == 7:
                step_time = self.model.experiment_setups[row].get_step_exposure_time(value)
                step_exposure_time_item = self.widget.setup_table.item(row, 6)
                step_exposure_time_item.setText(str(step_time))
                self.model.experiment_setups[row].time_per_step = step_time

        self.widget.setup_table.blockSignals(False)
        self.widget.setup_table.resizeColumnsToContents()
        self.set_example_lbl()
        self.set_total_frames()
        print(self.model.experiment_setups[row])

    def update_total_exposure_time(self, row):
        total_exposure_time_item = self.widget.setup_table.item(row, 7)
        total_exposure_time_item.setText(str(self.model.experiment_setups[row].get_total_exposure_time()))

    def sample_points_table_cell_changed(self, row, col):
        label_item = self.widget.sample_points_table.item(row, col)
        value = str(label_item.text())
        self.widget.sample_points_table.blockSignals(True)
        if col == 0:
            if not self.model.sample_name_existent(value):
                self.model.sample_points[row].name = str(value)
            else:
                self.create_name_existent_msg('Sample')
                name_item = self.widget.sample_points_table.item(row, 0)
                name_item.setText(self.model.sample_points[row].name)
        elif col == 1:
            self.model.sample_points[row].x = float(value)
        elif col == 2:
            self.model.sample_points[row].y = float(value)
        elif col == 3:
            self.model.sample_points[row].z = float(value)
        self.widget.sample_points_table.blockSignals(False)
        self.widget.sample_points_table.resizeColumnsToContents()
        self.set_example_lbl()
        print(self.model.sample_points[row])

    def omega_btn_clicked(self, omega_range):
        cur_ind = self.widget.get_selected_experiment_setup()
        cur_ind.sort()
        cur_ind = cur_ind[::-1]
        omega_start = -90.0 - omega_range
        omega_end = -90 + omega_range
        if cur_ind is None or (len(cur_ind) == 0):
            return
        for ind in cur_ind:
            self.widget.setup_table.item(ind, 3).setText(str(omega_start))
            self.widget.setup_table.item(ind, 4).setText(str(omega_end))
            self.model.experiment_setups[ind].omega_start = omega_start
            self.model.experiment_setups[ind].omega_end = omega_end

    def set_map_range(self, orange):
        self.widget.y_min_txt.setText('-'+str(orange))
        self.widget.x_min_txt.setText('-'+str(orange))
        self.widget.y_max_txt.setText(str(orange))
        self.widget.x_max_txt.setText(str(orange))

    def set_map_step(self, step):
        self.widget.x_step_txt.setText(str(step))
        self.widget.y_step_txt.setText(str(step))

    def move_sample_btn_clicked(self, ind):
        x, y, z = self.widget.get_sample_point_values(ind)
        move_to_sample_pos(x, y, z)

    def set_sample_btn_clicked(self, ind):
        x, y, z = self.get_current_sample_position()
        self.model.sample_points[ind].set_position(x, y, z)
        self.widget.set_sample_point_values(ind, x, y, z)

    def step_cb_status_changed(self, row_ind, exp_ind, state):
        cur_ind = self.widget.get_selected_sample_point()
        if row_ind in cur_ind:
            for ind in cur_ind:
                self.model.sample_points[ind].set_perform_step_scan_setup(exp_ind, state)
            self.widget.recreate_sample_point_checkboxes(self.model.get_experiment_state())
        else:
            self.model.sample_points[row_ind].set_perform_step_scan_setup(exp_ind, state)
        self.set_example_lbl()
        self.set_total_frames()

    def wide_cb_status_changed(self, row_ind, exp_ind, state):
        cur_ind = self.widget.get_selected_sample_point()
        if row_ind in cur_ind:
            for ind in cur_ind:
                self.model.sample_points[ind].set_perform_wide_scan_setup(exp_ind, state)
            self.widget.recreate_sample_point_checkboxes(self.model.get_experiment_state())
        else:
            self.model.sample_points[row_ind].set_perform_wide_scan_setup(exp_ind, state)
        self.set_example_lbl()
        self.set_total_frames()

    def still_cb_status_changed(self, row_ind, exp_ind, state):
        cur_ind = self.widget.get_selected_sample_point()
        if row_ind in cur_ind:
            for ind in cur_ind:
                self.model.sample_points[ind].set_perform_still_setup(exp_ind, state)
            self.widget.recreate_sample_point_checkboxes(self.model.get_experiment_state())
        else:
            self.model.sample_points[row_ind].set_perform_still_setup(exp_ind, state)
        self.set_example_lbl()
        self.set_total_frames()

    def check_all_still(self):
        for exp_ind, experiment in enumerate(self.model.experiment_setups):
            for sample_point in self.model.sample_points:
                sample_point.set_perform_still_setup(exp_ind, self.widget.check_all_still_cb.isChecked())
        self.widget.recreate_sample_point_checkboxes(self.model.get_experiment_state())
        self.set_example_lbl()
        self.set_total_frames()

    def check_all_wide(self):
        for exp_ind, experiment in enumerate(self.model.experiment_setups):
            for sample_point in self.model.sample_points:
                sample_point.set_perform_wide_scan_setup(exp_ind, self.widget.check_all_wide_cb.isChecked())
        self.widget.recreate_sample_point_checkboxes(self.model.get_experiment_state())
        self.set_example_lbl()
        self.set_total_frames()

    def check_all_step(self):
        for exp_ind, experiment in enumerate(self.model.experiment_setups):
            for sample_point in self.model.sample_points:
                sample_point.set_perform_step_scan_setup(exp_ind, self.widget.check_all_step_cb.isChecked())
        self.widget.recreate_sample_point_checkboxes(self.model.get_experiment_state())
        self.set_example_lbl()
        self.set_total_frames()

    def basename_txt_changed(self):
        self.basename = str(self.widget.filename_txt.text())
        caput(epics_config['detector_file'] + ':FileName', self.basename)
        self.set_example_lbl()

    def filepath_txt_changed(self):
        self.filepath = str(self.widget.filepath_txt.text())
        if self.filepath[-1] == '/':
            self.filepath = self.filepath[:-1]

        self.widget.filepath_txt.setText(self.filepath)

        caput(epics_config['detector_file'] + ':FilePath', self.filepath)
        self.set_example_lbl()

    def frame_number_txt_changed(self):
        self.framenr = int(self.widget.frame_number_txt.text())
        caput(epics_config['detector_file'] + ':FileNumber', self.framenr)
        self.set_example_lbl()

    def set_total_frames(self):
        nr = self.frame_counter()
        tm = self.estimate_collection_time(epics_config)
        if nr == 0:
            self.widget.total_frames_txt.setText(' ')
        elif nr == 1:
            self.widget.total_frames_txt.setText(str(nr) + ' image' + "\n" + str(int(tm)) + ' s')
        else:
            self.widget.total_frames_txt.setText(str(nr) + ' images' + "\n" + str(int(tm)) + ' s')

    def set_example_lbl(self):
        no_exp = False
        if self.widget.no_suffices_cb.isChecked():
            _, _, filenumber = self.get_filename_info()
            example_str = self.filepath + '/' + self.basename + '_' + str('%03d' %filenumber)

        elif self.widget.rename_files_cb.isChecked():
            no_exp = True
            if len(self.model.experiment_setups) == 0 or len(self.model.sample_points) == 0:
                example_str = self.filepath + '/' + self.basename + '_' + 'S1_P1_E1_s_001'
            else:
                for exp_ind, experiment in enumerate(self.model.experiment_setups):
                    for sample_point in self.model.sample_points:
                        point_number = str(self.widget.point_txt.text())
                        if sample_point.perform_still_for_setup[exp_ind]:
                            example_str = self.filepath + '/' + self.basename + '_' + sample_point.name + '_P' + point_number + '_' + \
                                   experiment.name + '_001'
                            no_exp = False
                            break
                        elif sample_point.perform_wide_scan_for_setup[exp_ind]:
                            example_str = self.filepath + '/' + self.basename + '_' + sample_point.name + '_P' + point_number + '_' + \
                                   experiment.name + '_w_001'
                            no_exp = False
                            break
                        elif sample_point.perform_step_scan_for_setup[exp_ind]:
                            example_str = self.filepath+ '/' + self.basename + '_' + sample_point.name + '_P' + point_number + '_' + \
                                   experiment.name + '_s_001'
                            no_exp = False
                            break
                if no_exp:
                    example_str = self.filepath + '/' + self.basename + '_' + 'S1_P1_E1_s_001'
        else:
            example_str = self.filepath + '/' + caget(epics_config['detector_file'] + ':FileName', as_string=True)+'_'+str('%03d' %caget(epics_config['detector_file'] + ':FileNumber'))
            if example_str is None:
                example_str = self.filepath + '/None'

        self.example_str = example_str

        if len(self.model.experiment_setups) == 0 or len(self.model.sample_points) == 0 or no_exp:
            if len(example_str) > 40:
                example_str = '...' + example_str[len(example_str)-40:]
            self.widget.example_filename_lbl.setText("<font color = '#888888'>"+example_str+'.tif</font>')
            return
        elif self.check_filename_exists(FILEPATH + example_str[4:]):
            if len(example_str) > 30:
                example_str = '...' + example_str[len(example_str)-30:]
            self.widget.example_filename_lbl.setText("<font color = '#AA0000' style='font-weight:bold'>"+example_str+'.tif</font>')
            return
        elif not self.check_filepath_exists():
            if len(example_str) > 40:
                example_str = '...' + example_str[len(example_str)-40:]
            self.widget.example_filename_lbl.setText("<font color = '#FF5500'>"+example_str+'.tif</font>')
            return
        else:
            if len(example_str) > 40:
                example_str = '...' + example_str[len(example_str)-40:]
            self.widget.example_filename_lbl.setText("<font color = '#228B22'>"+example_str+'.tif</font>')
            return

    def open_path_btn_clicked(self):
        path = FILEPATH + self.filepath[4:]
        os.startfile(path)

    def collect_bkg_data(self):
        self.set_status_lbl("Collecting", "#FF0000")
        QtGui.QApplication.processEvents()
        collect_background()
        self.set_status_lbl("Finished", "#00FF00")

    def collect_data(self):

        # check if the current file path exists
        if self.check_filepath_exists() is False:
            self.show_error_message_box('The folder you specified does not exist. '
                                        'Please enter a valid path for saving the collected images!')
            return

        if self.check_filename_exists(FILEPATH + self.example_str[4:]):
            self.show_error_message_box('The filename already exists' + '\n'
                                        'Please used different filename!')
            return

        # check if sample position are not very far away from the current position (in case users forgot to update
        # positions....) maximum value is right now set to 200um distance
        if self.check_sample_point_distances() is False:
            reply = self.show_continue_abort_message_box(
                'Some measurement points are more than 200um away from the current sample ' +
                'position.<br> Do you want to continue?!')
            if reply == QtGui.QMessageBox.Abort:
                return
        #
        #if MONITOR:
            #omega_RBV = open(FILEPATH+'/BGI/omega_RBV.log', 'w')
            #omega_VAL = open(FILEPATH+'/BGI/omega_VAL.log', 'w')
            #shutter_log = open(FILEPATH+'/BGI/shutter_log.log', 'w')
            #camonitor(epics_config['sample_position_omega']+'.RBV', writer=omega_RBV.write)
            #camonitor(epics_config['sample_position_omega']+'.VAL', writer=omega_VAL.write)
            #camonitor(epics_config['detector_control']+':ShutterStatusEPICS_RBV', writer=shutter_log.write)

        nr = self.frame_counter()
        if nr == 1:
            self.set_status_lbl("Collecting" + "\n" + str(nr) + ' image', "#FF0000")
        else:
            self.set_status_lbl("Collecting" + "\n" + str(nr) + ' images', "#FF0000")

        # save current state to be able to restore after the measurement when the checkboxes are selected.
        previous_filepath, previous_filename, previous_filenumber = self.get_filename_info()
        previous_exposure_time = caget(epics_config['detector_control'] + ':AcquireTime')
        previous_detector_pos_x = caget(epics_config['detector_position_x'])
        previous_detector_pos_z = caget(epics_config['detector_position_z'])
        previous_omega_pos = caget(epics_config['sample_position_omega'])
        sample_x, sample_y, sample_z = self.get_current_sample_position()

        # prepare for for abortion of the collection procedure
        self.abort_collection = False
        self.widget.collect_btn.setText('Abort')
        self.widget.collect_btn.clicked.disconnect(self.collect_data)
        self.widget.collect_btn.clicked.connect(self.abort_data_collection)
        self.widget.status_txt.clear()
        QtGui.QApplication.processEvents()

        for exp_ind, experiment in enumerate(self.model.experiment_setups):
            if not (self.check_omega_in_limits(experiment.omega_start) and
                    self.check_omega_in_limits(experiment.omega_end)):
                self.show_error_message_box('Experiment starting and/or end angle are out of epics limits'
                                            'Please adjust either of them!')
                continue

            for sample_point in self.model.sample_points:

                if sample_point.perform_still_for_setup[exp_ind]:
                    if self.widget.rename_files_cb.isChecked():
                        point_number = str(self.widget.point_txt.text())
                        filename = self.basename + '_' + sample_point.name + '_P' + point_number + '_' + \
                                   experiment.name
                        filenumber = 1

                    elif self.widget.no_suffices_cb.isChecked():
                        filename = self.basename
                        _, _, filenumber = self.get_filename_info()

                    else:
                        _, filename, filenumber = self.get_filename_info()

                    caput(epics_config['detector_file'] + ':FilePath', str(self.filepath))
                    caput(epics_config['detector_file'] + ':FileName', str(filename))
                    caput(epics_config['detector_file'] + ':FileNumber', filenumber)

                    logger.info("Performing still image for:\n\t\t{}\n\t\t{}".format(sample_point, experiment))
                    exposure_time = abs(experiment.omega_end - experiment.omega_start) / experiment.omega_step * \
                                        experiment.time_per_step

                    collect_single_data_thread = Thread(target=collect_single_data,
                                                        kwargs={"detector_position_x": experiment.detector_pos_x,
                                                                "detector_position_z": experiment.detector_pos_z,
                                                                "exposure_time": abs(exposure_time),
                                                                "x": sample_point.x,
                                                                "y": sample_point.y,
                                                                "z": sample_point.z,
                                                                "omega": -90.0
                                                               }
                                                        )
                    collect_single_data_thread.start()

                    while collect_single_data_thread.isAlive():
                        QtGui.QApplication.processEvents()
                        time.sleep(.2)

                if not self.check_if_aborted():
                    break

                if sample_point.perform_wide_scan_for_setup[exp_ind]:

                    # check if all motor positions are in a correct position
                    if self.check_conditions() is False:
                        self.show_error_message_box('Please Move mirrors and microscope in the right positions!')
                        return

                    if self.widget.rename_files_cb.isChecked():
                        point_number = str(self.widget.point_txt.text())
                        filename = self.basename + '_' + sample_point.name + '_P' + point_number + '_' + \
                                   experiment.name + '_w'
                        filenumber = 1

                    elif self.widget.no_suffices_cb.isChecked():
                        filename = self.basename
                        _, _, filenumber = self.get_filename_info()

                    else:
                        _, filename, filenumber = self.get_filename_info()

                    caput(epics_config['detector_file'] + ':FilePath', str(self.filepath))
                    caput(epics_config['detector_file'] + ':FileName', str(filename))
                    caput(epics_config['detector_file'] + ':FileNumber', filenumber)

                    logger.info("Performing wide scan for:\n\t\t{}\n\t\t{}".format(sample_point, experiment))
                    exposure_time = abs(experiment.omega_end - experiment.omega_start) / experiment.omega_step * \
                                    experiment.time_per_step

                    collect_wide_data_thread = Thread(target=collect_wide_data,
                                                      kwargs={"detector_position_x": experiment.detector_pos_x,
                                                              "detector_position_z": experiment.detector_pos_z,
                                                              "omega_start": experiment.omega_start,
                                                              "omega_end": experiment.omega_end,
                                                              "exposure_time": abs(exposure_time),
                                                              "x": sample_point.x,
                                                              "y": sample_point.y,
                                                              "z": sample_point.z
                                                              }
                                                      )
                    collect_wide_data_thread.start()

                    while collect_wide_data_thread.isAlive():
                        QtGui.QApplication.processEvents()
                        time.sleep(.2)

                    time.sleep(.2)

                if not self.check_if_aborted():
                    break

                if sample_point.perform_step_scan_for_setup[exp_ind]:

                    # check if all motor positions are in a correct position
                    if self.check_conditions() is False:
                        self.show_error_message_box('Please Move mirrors and microscope in the right positions!')
                        return

                    if self.widget.rename_files_cb.isChecked():
                        point_number = str(self.widget.point_txt.text())
                        filename = self.basename + '_' + sample_point.name + '_P' + point_number + '_' + \
                                   experiment.name + '_s'
                        print filename
                        filenumber = 1

                    elif self.widget.no_suffices_cb.isChecked():
                        filename = self.basename
                        _, _, filenumber = self.get_filename_info()

                    else:
                        _, filename, filenumber = self.get_filename_info()

                    caput(epics_config['detector_file'] + ':FilePath', str(self.filepath))
                    caput(epics_config['detector_file'] + ':FileName', str(filename))
                    caput(epics_config['detector_file'] + ':FileNumber', filenumber)

                    logger.info("Performing step scan for:\n\t\t{}\n\t\t{}".format(sample_point, experiment))

                    collect_step_data_thread = Thread(target=collect_step_data,
                                                      kwargs={"detector_position_x": experiment.detector_pos_x,
                                                              "detector_position_z": experiment.detector_pos_z,
                                                              "omega_start": experiment.omega_start,
                                                              "omega_end": experiment.omega_end,
                                                              "omega_step": experiment.omega_step,
                                                              "exposure_time": experiment.time_per_step,
                                                              "x": sample_point.x,
                                                              "y": sample_point.y,
                                                              "z": sample_point.z,
                                                              "callback_fcn": self.check_if_aborted,
                                                              "collect_bkg_flag":
                                                                  bool(self.widget.auto_bkg_cb.isChecked())})
                    collect_step_data_thread.start()

                    while collect_step_data_thread.isAlive():
                        QtGui.QApplication.processEvents()
                        time.sleep(0.2)

                if not self.check_if_aborted():
                    break

                #print filename
                
        caput(epics_config['detector_control'] + ':AcquireTime', previous_exposure_time)

        # move to previous detector position:
        if self.widget.reset_detector_position_cb.isChecked():
            caput(epics_config['detector_position_x'], previous_detector_pos_x, wait=True, timeout=300)
            caput(epics_config['detector_position_z'], previous_detector_pos_z, wait=True, timeout=300)

        # move to previous sample position
        if self.widget.reset_sample_position_cb.isChecked():
            caput(epics_config['sample_position_omega'], previous_omega_pos)
            move_to_sample_pos(sample_x, sample_y, sample_z)

        caput(epics_config['detector_control'] + ':ShutterMode', 1)  # enable epics PV shutter mode

        if self.widget.rename_files_cb.isChecked():
            self.increase_point_number()

        if self.widget.rename_after_cb.isChecked():
            caput(epics_config['detector_file'] + ':FilePath', previous_filepath)
            caput(epics_config['detector_file'] + ':FileName', previous_filename)
            if self.widget.rename_files_cb.isChecked():
                caput(epics_config['detector_file'] + ':FileNumber', previous_filenumber)

        #update frame number

        if self.widget.no_suffices_cb.isChecked() or ((not self.widget.rename_files_cb.isChecked()) and (not self.widget.no_suffices_cb.isChecked())):
            _, _, filenumber = self.get_filename_info()
            self.widget.frame_number_txt.setText(str(filenumber))

        #if MONITOR:
            #omega_RBV.close()
            #omega_VAL.close()
            #shutter_log.close()

        # reset the state of the gui:
        self.widget.collect_btn.setText('Collect')
        self.widget.collect_btn.clicked.connect(self.collect_data)
        self.widget.collect_btn.clicked.disconnect(self.abort_data_collection)
        self.set_status_lbl("Finished", "#00FF00")
        self.set_example_lbl()

    def abort_data_collection(self):
        self.abort_collection = True

    def check_if_aborted(self):
        # QtGui.QApplication.processEvents()
        return not self.abort_collection

    def set_status_lbl(self, msg, color, size=20):
        self.widget.status_lbl.setStyleSheet("font-size: {}px; color: {};".format(size, color))
        self.widget.status_lbl.setText(msg)

    def increase_point_number(self):
        cur_point_number = int(str(self.widget.point_txt.text()))
        self.widget.point_txt.setText(str(cur_point_number + 1))

    def estimate_collection_time(self, epics_config):
        total_time = 0
        det_x_speed = caget(epics_config['detector_position_x'] + '.VELO')
        det_z_speed = caget(epics_config['detector_position_z'] + '.VELO')
        det_x_pos = caget(epics_config['detector_position_x'])
        det_z_pos = caget(epics_config['detector_position_z'])

        for exp_ind, experiment in enumerate(self.model.experiment_setups):
            exp_collection = False
            for sample_point in self.model.sample_points:
                if sample_point.perform_still_for_setup[exp_ind]:
                    exposure_time = abs(experiment.omega_end - experiment.omega_start) / experiment.omega_step * \
                                    experiment.time_per_step
                    total_time += exposure_time + 4.5
                    exp_collection = True
                if sample_point.perform_wide_scan_for_setup[exp_ind]:
                    exposure_time = abs(experiment.omega_end - experiment.omega_start) / experiment.omega_step * \
                                    experiment.time_per_step
                    total_time += exposure_time + 4.5
                    exp_collection = True
                if sample_point.perform_step_scan_for_setup[exp_ind]:
                    print("Performing step scan for {}, with setup {}".format(sample_point, experiment))
                    number_of_steps = abs(experiment.omega_end - experiment.omega_start) / experiment.omega_step
                    exposure_time = number_of_steps * (4.5 + experiment.time_per_step)
                    total_time += exposure_time
                    exp_collection = True
                if exp_collection:
                    det_x_move_time = abs(experiment.detector_pos_x - det_x_pos) / float(det_x_speed)
                    det_y_move_time = abs(experiment.detector_pos_z - det_z_pos) / float(det_z_speed)
                    total_time += det_x_move_time + det_y_move_time
                    det_x_pos = experiment.detector_pos_x
                    det_z_pos = experiment.detector_pos_z
        return total_time

    def frame_counter(self):
        counter = 0
        for exp_ind, experiment in enumerate(self.model.experiment_setups):
            for sample_point in self.model.sample_points:
                if sample_point.perform_wide_scan_for_setup[exp_ind]:
                    counter += 1
                if sample_point.perform_step_scan_for_setup[exp_ind]:
                    number_of_steps = int(abs(experiment.omega_end - experiment.omega_start) / experiment.omega_step)
                    counter += number_of_steps
                if sample_point.perform_still_for_setup[exp_ind]:
                    counter += 1
        return counter

    @staticmethod
    def create_name_existent_msg(name_type):
        msg_box = QtGui.QMessageBox()
        msg_box.setWindowFlags(QtCore.Qt.Tool)
        msg_box.setText('{} name already exists.'.format(name_type))
        msg_box.setIcon(QtGui.QMessageBox.Critical)
        msg_box.setWindowTitle('Error')
        msg_box.setStandardButtons(QtGui.QMessageBox.Ok)
        msg_box.setDefaultButton(QtGui.QMessageBox.Ok)
        msg_box.exec_()

    @staticmethod
    def create_omega_error_msg(msg):
        msg_box = QtGui.QMessageBox()
        msg_box.setWindowFlags(QtCore.Qt.Tool)
        msg_box.setText(msg)
        msg_box.setIcon(QtGui.QMessageBox.Critical)
        msg_box.setWindowTitle('Error')
        msg_box.setStandardButtons(QtGui.QMessageBox.Ok)
        msg_box.setDefaultButton(QtGui.QMessageBox.Ok)
        msg_box.exec_()

    @staticmethod
    def get_current_sample_position():
        try:
            x = float("{:.4g}".format(caget(epics_config['sample_position_x'])))
            y = float("{:.4g}".format(caget(epics_config['sample_position_y'])))
            z = float("{:.4g}".format(caget(epics_config['sample_position_z'])))
        except epics.ca.ChannelAccessException:
            x = y = z = 0
        return x, y, z

    @staticmethod
    def get_current_setup():
        """
        Checks epics for the current setup setting.
        returns: detector position, omega, exposure_time
        :return: float, float, float
        """
        try:
            detector_pos_x = float("{:g}".format(caget(epics_config['detector_position_x'])))
            detector_pos_z = float("{:g}".format(caget(epics_config['detector_position_z'])))
            omega = float("{:g}".format(caget(epics_config['sample_position_omega'])))
            exposure_time = float("{:g}".format(caget(epics_config['detector_control'] + ':AcquireTime')))
        except epics.ca.ChannelAccessException:
            detector_pos_x = 0
            detector_pos_z = 49
            omega = -90
            exposure_time = 0.5
        return detector_pos_x, detector_pos_z, omega, exposure_time

    @staticmethod
    def get_filename_info():
        path = caget(epics_config['detector_file'] + ':FilePath', as_string=True)
        filename = caget(epics_config['detector_file'] + ':FileName', as_string=True)
        file_number = caget(epics_config['detector_file'] + ':FileNumber')
        if path is None:
            path = ''
            filename = 'test'
            file_number = 0
        return path, filename, file_number

    def get_framenumber(self):
        if str(self.widget.frame_number_txt.text()) == '':
            return 1
        else:
            return int(str(self.widget.frame_number_txt.text()))

    def check_filepath_exists(self):
        cur_epics_filepath = caget(epics_config['detector_file'] + ':FilePath', as_string=True)
        caput(epics_config['detector_file'] + ':FilePath', self.filepath, wait=True)
        exists = caget(epics_config['detector_file'] + ':FilePathExists_RBV')

        caput(epics_config['detector_file'] + ':FilePath', cur_epics_filepath)
        return exists == 1

    def check_filename_exists(self, filename):
        return os.path.isfile(filename + '.tif')

    @staticmethod
    def check_conditions():
        if int(caget('13IDD:m24.RBV')) > -105:
            return False
        elif int(caget('13IDD:m23.RBV')) > -105:
            return False
        elif int(caget('13IDD:m67.RBV')) > -65:
            return False
        return True

    @staticmethod
    def check_omega_in_limits(omega):
        if int(caget('13IDD:m96.HLM')) < omega:
            return False
        if int(caget('13IDD:m96.LLM')) > omega:
            return False
        return True

    def check_sample_point_distances(self):
        pos_x, pos_y, pos_z = self.get_current_sample_position()
        largest_distance = self.model.get_largest_largest_collecting_sample_point_distance_to(pos_x, pos_y, pos_z)

        return largest_distance < 0.2

    @staticmethod
    def show_error_message_box(msg):
        msg_box = QtGui.QMessageBox()
        msg_box.setWindowFlags(QtCore.Qt.Tool)
        msg_box.setText(msg)
        msg_box.setIcon(QtGui.QMessageBox.Critical)
        msg_box.setWindowTitle('Error')
        msg_box.setStandardButtons(QtGui.QMessageBox.Ok)
        msg_box.setDefaultButton(QtGui.QMessageBox.Ok)
        msg_box.exec_()

    @staticmethod
    def show_continue_abort_message_box(msg):
        msg_box = QtGui.QMessageBox()
        msg_box.setWindowFlags(QtCore.Qt.Tool)
        msg_box.setText("<p align='center' style='font-size:20px' >{}</p>".format(msg))
        msg_box.setIcon(QtGui.QMessageBox.Critical)
        msg_box.setWindowTitle('Continue?')
        msg_box.setStandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.Abort)
        msg_box.setDefaultButton(QtGui.QMessageBox.Abort)
        msg_box.exec_()
        return msg_box.result()
Example #18
0
from views.MainView import MainView
__author__ = 'Rabbi'

if __name__ == "__main__":
    mainView = MainView()
    mainView.showMainView()
Example #19
0
class MainController(object):
    def __init__(self):
        self.widget = MainView(__version__)
        self.widget.show()
        self.model = SxrdModel()
        self.connect_buttons()
        self.connect_tables()
        self.connect_txt()
        self.populate_filename()

        self.abort_collection = False
        self.logging_handler = InfoLoggingHandler(self.update_status_txt)
        logger.addHandler(self.logging_handler)

        self.status_txt_scrollbar_is_at_max = True

    def connect_buttons(self):
        self.widget.add_setup_btn.clicked.connect(self.add_experiment_setup_btn_clicked)
        self.widget.delete_setup_btn.clicked.connect(self.delete_experiment_setup_btn_clicked)
        self.widget.clear_setup_btn.clicked.connect(self.clear_experiment_setup_btn_clicked)

        self.widget.add_sample_btn.clicked.connect(self.add_sample_point_btn_clicked)
        self.widget.delete_sample_btn.clicked.connect(self.delete_sample_point_btn_clicked)
        self.widget.clear_sample_btn.clicked.connect(self.clear_sample_point_btn_clicked)
        self.widget.create_map_btn.clicked.connect(self.create_map_btn_clicked)

        self.widget.get_folder_btn.clicked.connect(self.get_folder_btn_clicked)

        self.widget.collect_bkg_btn.clicked.connect(self.collect_bkg_data)
        self.widget.collect_btn.clicked.connect(self.collect_data)

    def connect_tables(self):
        self.widget.setup_table.cellChanged.connect(self.setup_table_cell_changed)
        self.widget.sample_points_table.cellChanged.connect(self.sample_points_table_cell_changed)

        self.widget.move_sample_btn_clicked.connect(self.move_sample_btn_clicked)
        self.widget.set_sample_btn_clicked.connect(self.set_sample_btn_clicked)

        self.widget.step_cb_status_changed.connect(self.step_cb_status_changed)
        self.widget.wide_cb_status_changed.connect(self.wide_cb_status_changed)

    def connect_txt(self):
        self.widget.filename_txt.editingFinished.connect(self.basename_txt_changed)
        self.widget.filepath_txt.editingFinished.connect(self.filepath_txt_changed)

        self.widget.status_txt.textChanged.connect(self.update_status_txt_scrollbar)
        self.widget.status_txt.verticalScrollBar().valueChanged.connect(self.update_status_txt_scrollbar_value)

    def populate_filename(self):
        self.prev_filepath, self.prev_filename, self.prev_file_number = self.get_filename_info()

        self.filepath = self.prev_filepath
        self.basename = self.prev_filename

        self.widget.filename_txt.setText(self.prev_filename)
        self.widget.filepath_txt.setText(self.prev_filepath)

        self.set_example_lbl()

    def update_status_txt(self, msg):
        self.widget.status_txt.append(msg)

    def update_status_txt_scrollbar(self):
        if self.status_txt_scrollbar_is_at_max:
            self.widget.status_txt.verticalScrollBar().setValue(
                self.widget.status_txt.verticalScrollBar().maximum()
            )

    def get_folder_btn_clicked(self):
        self.prev_filepath, _, _ = self.get_filename_info()
        self.filepath = self.prev_filepath
        self.widget.filepath_txt.setText(self.prev_filepath)

        self.set_example_lbl()

    def update_status_txt_scrollbar_value(self, value):
        self.status_txt_scrollbar_is_at_max = value == self.widget.status_txt.verticalScrollBar().maximum()

    def add_experiment_setup_btn_clicked(self):
        detector_pos_x, detector_pos_z, omega, exposure_time = self.get_current_setup()
        default_name = 'E{}'.format(len(self.model.experiment_setups) + 1)
        self.model.add_experiment_setup(default_name, detector_pos_x, detector_pos_z,
                                        omega - 1, omega + 1, 0.1, exposure_time)
        self.widget.add_experiment_setup(default_name, detector_pos_x, detector_pos_z,
                                         omega - 1, omega + 1, 0.1, exposure_time)

    def delete_experiment_setup_btn_clicked(self):
        cur_ind = self.widget.get_selected_experiment_setup()
        cur_ind.sort()
        cur_ind = cur_ind[::-1]
        if cur_ind is None or (len(cur_ind) == 0):
            return
        msgBox = QtGui.QMessageBox()
        msgBox.setText('Do you really want to delete the selected experiment(s).')
        msgBox.setWindowTitle('Confirmation')
        msgBox.setStandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
        msgBox.setDefaultButton(QtGui.QMessageBox.Yes)
        response = msgBox.exec_()
        if response == QtGui.QMessageBox.Yes:
            for ind in cur_ind:
                self.widget.delete_experiment_setup(ind)
                self.model.delete_experiment_setup(ind)
            self.widget.recreate_sample_point_checkboxes(self.model.get_experiment_state())

    def clear_experiment_setup_btn_clicked(self):
        self.widget.clear_experiment_setups()
        self.model.clear_experiment_setups()

    def add_sample_point_btn_clicked(self):
        x, y, z = self.get_current_sample_position()
        num = len(self.model.sample_points)
        self.widget.add_sample_point('S{}'.format(num + 1), x, y, z)
        self.model.add_sample_point('S{}'.format(num + 1), x, y, z)

    def delete_sample_point_btn_clicked(self):
        cur_ind = self.widget.get_selected_sample_point()
        cur_ind.sort()
        cur_ind = cur_ind[::-1]
        for ind in cur_ind:
            self.widget.delete_sample_point(ind)
            self.model.delete_sample_point(ind)

    def clear_sample_point_btn_clicked(self):
        self.widget.clear_sample_points()
        self.model.clear_sample_points()

    def create_map_btn_clicked(self):
        cur_ind = self.widget.get_selected_sample_point()[-1]

        x_min = float(str(self.widget.x_min_txt.text()))
        x_max = float(str(self.widget.x_max_txt.text()))
        x_step = float(str(self.widget.x_step_txt.text()))

        y_min = float(str(self.widget.y_min_txt.text()))
        y_max = float(str(self.widget.y_max_txt.text()))
        y_step = float(str(self.widget.y_step_txt.text()))

        map = self.model.create_map(cur_ind, x_min, x_max, x_step, y_min, y_max, y_step)

        for name, position in map.iteritems():
            x, y, z = position
            self.widget.add_sample_point(name, x, y, z)

    def setup_table_cell_changed(self, row, col):
        label_item = self.widget.setup_table.item(row, col)
        value = str(label_item.text())
        self.widget.setup_table.blockSignals(True)
        if col == 0:
            if not self.model.setup_name_existent(value):
                self.model.experiment_setups[row].name = str(value)
                self.widget.update_sample_table_setup_header(
                    self.model.get_experiment_setup_names()
                )
                self.widget.sample_points_table.resizeColumnsToContents()
            else:
                self.create_name_existent_msg('Experiment setup')
                name_item = self.widget.setup_table.item(row, 0)
                name_item.setText(self.model.experiment_setups[row].name)
        else:
            value = float(value)
            if col == 1:
                self.model.experiment_setups[row].detector_pos_x = value
            elif col == 2:
                self.model.experiment_setups[row].detector_pos_z = value
            elif col == 3:
                self.model.experiment_setups[row].omega_start = value
                self.update_total_exposure_time(row)
            elif col == 4:
                self.model.experiment_setups[row].omega_end = value
                self.update_total_exposure_time(row)
            elif col == 5:
                self.model.experiment_setups[row].omega_step = value
                self.update_total_exposure_time(row)
            elif col == 6:
                self.model.experiment_setups[row].time_per_step = value
                self.update_total_exposure_time(row)
            elif col == 7:
                step_time = self.model.experiment_setups[row].get_step_exposure_time(value)
                step_exposure_time_item = self.widget.setup_table.item(row, 6)
                step_exposure_time_item.setText(str(step_time))
                self.model.experiment_setups[row].time_per_step = step_time

        self.widget.setup_table.blockSignals(False)
        self.widget.setup_table.resizeColumnsToContents()
        print(self.model.experiment_setups[row])

    def update_total_exposure_time(self, row):
        total_exposure_time_item = self.widget.setup_table.item(row, 7)
        total_exposure_time_item.setText(str(self.model.experiment_setups[row].get_total_exposure_time()))

    def sample_points_table_cell_changed(self, row, col):
        label_item = self.widget.sample_points_table.item(row, col)
        value = str(label_item.text())
        self.widget.sample_points_table.blockSignals(True)
        if col == 0:
            if not self.model.sample_name_existent(value):
                self.model.sample_points[row].name = str(value)
            else:
                self.create_name_existent_msg('Sample')
                name_item = self.widget.sample_points_table.item(row, 0)
                name_item.setText(self.model.sample_points[row].name)
        elif col == 1:
            self.model.sample_points[row].x = float(value)
        elif col == 2:
            self.model.sample_points[row].y = float(value)
        elif col == 3:
            self.model.sample_points[row].z = float(value)
        self.widget.sample_points_table.blockSignals(False)
        self.widget.sample_points_table.resizeColumnsToContents()

        print(self.model.sample_points[row])

    def move_sample_btn_clicked(self, ind):
        x, y, z = self.widget.get_sample_point_values(ind)
        move_to_sample_pos(x, y, z)

    def set_sample_btn_clicked(self, ind):
        x, y, z = self.get_current_sample_position()
        self.model.sample_points[ind].set_position(x, y, z)
        self.widget.set_sample_point_values(ind, x, y, z)

    def step_cb_status_changed(self, row_ind, exp_ind, state):
        cur_ind = self.widget.get_selected_sample_point()
        if row_ind in cur_ind:
            for ind in cur_ind:
                self.model.sample_points[ind].set_perform_step_scan_setup(exp_ind, state)
            self.widget.recreate_sample_point_checkboxes(self.model.get_experiment_state())
        else:
            self.model.sample_points[row_ind].set_perform_step_scan_setup(exp_ind, state)

    def wide_cb_status_changed(self, row_ind, exp_ind, state):
        cur_ind = self.widget.get_selected_sample_point()
        if row_ind in cur_ind:
            for ind in cur_ind:
                self.model.sample_points[ind].set_perform_wide_scan_setup(exp_ind, state)
            self.widget.recreate_sample_point_checkboxes(self.model.get_experiment_state())
        else:
            self.model.sample_points[row_ind].set_perform_wide_scan_setup(exp_ind, state)

    def basename_txt_changed(self):
        self.basename = str(self.widget.filename_txt.text())
        self.set_example_lbl()

    def filepath_txt_changed(self):
        self.filepath = str(self.widget.filepath_txt.text())
        self.set_example_lbl()

    def set_example_lbl(self):
        example_str = self.filepath + '/' + self.basename + '_' + 'S1_P1_E1_s_001'
        self.widget.example_filename_lbl.setText(example_str)

    def collect_bkg_data(self):
        self.set_status_lbl("Collecting", "#FF0000")
        QtGui.QApplication.processEvents()
        collect_background()
        self.set_status_lbl("Finished", "#00FF00")

    def collect_data(self):
        # check if the current file path exists
        if self.check_filepath_exists() is False:
            self.show_error_message_box('The folder you specified does not exist. '
                                        'Please enter a valid path for saving the collected images!')
            return
        # check if all motor positions are in a correct position
        if self.check_conditions() is False:
            self.show_error_message_box('Please Move mirrors and microscope in the right positions!')
            return

        # check if sample position are not very far away from the current position (in case users forgot to update
        # positions....) maximum value is right now set to 200um distance
        if self.check_sample_point_distances() is False:
            reply = self.show_continue_abort_message_box(
                'Some measurement points are more than 200um away from the current sample ' +
                'position.<br> Do you want to continue?!')
            if reply == QtGui.QMessageBox.Abort:
                return

        self.set_status_lbl("Collecting", "#FF0000")

        # save current state to be able to restore after the measurement when the checkboxes are selected.
        previous_filepath, previous_filename, previous_filenumber = self.get_filename_info()
        previous_exposure_time = caget(epics_config['detector_control'] + ':AcquireTime')
        previous_detector_pos_x = caget(epics_config['detector_position_x'])
        previous_detector_pos_z = caget(epics_config['detector_position_z'])
        previous_omega_pos = caget(epics_config['sample_position_omega'])
        sample_x, sample_y, sample_z = self.get_current_sample_position()

        # prepare for for abortion of the collection procedure
        self.abort_collection = False
        self.widget.collect_btn.setText('Abort')
        self.widget.collect_btn.clicked.disconnect(self.collect_data)
        self.widget.collect_btn.clicked.connect(self.abort_data_collection)
        self.widget.status_txt.clear()
        QtGui.QApplication.processEvents()

        for exp_ind, experiment in enumerate(self.model.experiment_setups):
            for sample_point in self.model.sample_points:
                if sample_point.perform_wide_scan_for_setup[exp_ind]:
                    if self.widget.rename_files_cb.isChecked():
                        point_number = str(self.widget.point_txt.text())
                        filename = self.basename + '_' + sample_point.name + '_P' + point_number + '_' + \
                                   experiment.name + '_w'
                        print(filename)
                        caput(epics_config['detector_file'] + ':FilePath', str(self.filepath))
                        caput(epics_config['detector_file'] + ':FileName', str(filename))
                        caput(epics_config['detector_file'] + ':FileNumber', 1)
                    logger.info("Performing wide scan for:\n\t\t{}\n\t\t{}".format(sample_point, experiment))
                    exposure_time = abs(experiment.omega_end - experiment.omega_start) / experiment.omega_step * \
                                    experiment.time_per_step

                    collect_wide_data_thread = Thread(target=collect_wide_data,
                                                      kwargs={"detector_position_x": experiment.detector_pos_x,
                                                              "detector_position_z": experiment.detector_pos_z,
                                                              "omega_start": experiment.omega_start,
                                                              "omega_end": experiment.omega_end,
                                                              "exposure_time": abs(exposure_time),
                                                              "x": sample_point.x,
                                                              "y": sample_point.y,
                                                              "z": sample_point.z
                                                              }
                                                      )
                    collect_wide_data_thread.start()

                    while collect_wide_data_thread.isAlive():
                        QtGui.QApplication.processEvents()
                        time.sleep(.2)

                if not self.check_if_aborted():
                    break

                if sample_point.perform_step_scan_for_setup[exp_ind]:
                    if self.widget.rename_files_cb.isChecked():
                        point_number = str(self.widget.point_txt.text())
                        filename = self.basename + '_' + sample_point.name + '_P' + point_number + '_' + \
                                   experiment.name + '_s'
                        print filename
                    caput(epics_config['detector_file'] + ':FilePath', str(self.filepath))
                    caput(epics_config['detector_file'] + ':FileName', str(filename))
                    caput(epics_config['detector_file'] + ':FileNumber', 1)
                    logger.info("Performing step scan for:\n\t\t{}\n\t\t{}".format(sample_point, experiment))

                    collect_step_data_thread = Thread(target=collect_step_data,
                                                      kwargs={"detector_position_x": experiment.detector_pos_x,
                                                              "detector_position_z": experiment.detector_pos_z,
                                                              "omega_start": experiment.omega_start,
                                                              "omega_end": experiment.omega_end,
                                                              "omega_step": experiment.omega_step,
                                                              "exposure_time": experiment.time_per_step,
                                                              "x": sample_point.x,
                                                              "y": sample_point.y,
                                                              "z": sample_point.z,
                                                              "callback_fcn": self.check_if_aborted,
                                                              "collect_bkg_flag":
                                                                  bool(self.widget.auto_bkg_cb.isChecked())})
                    collect_step_data_thread.start()

                    while collect_step_data_thread.isAlive():
                        QtGui.QApplication.processEvents()
                        time.sleep(0.2)

                if not self.check_if_aborted():
                    break
        caput(epics_config['detector_control'] + ':AcquireTime', previous_exposure_time)

        # move to previous detector position:
        if self.widget.reset_detector_position_cb.isChecked():
            caput(epics_config['detector_position_x'], previous_detector_pos_x, wait=True, timeout=300)
            caput(epics_config['detector_position_z'], previous_detector_pos_z, wait=True, timeout=300)

        # move to previous sample position
        if self.widget.reset_sample_position_cb.isChecked():
            caput(epics_config['sample_position_omega'], previous_omega_pos)
            move_to_sample_pos(sample_x, sample_y, sample_z)

        caput(epics_config['detector_control'] + ':ShutterMode', 1)  # enable epics PV shutter mode

        if self.widget.rename_files_cb.isChecked():
            self.increase_point_number()

        if self.widget.rename_after_cb.isChecked():
            caput(epics_config['detector_file'] + ':FilePath', previous_filepath)
            caput(epics_config['detector_file'] + ':FileName', previous_filename)
            if self.widget.rename_files_cb.isChecked():
                caput(epics_config['detector_file'] + ':FileNumber', previous_filenumber)

        # reset the state of the gui:
        self.widget.collect_btn.setText('Collect')
        self.widget.collect_btn.clicked.connect(self.collect_data)
        self.widget.collect_btn.clicked.disconnect(self.abort_data_collection)
        self.set_status_lbl("Finished", "#00FF00")

    def abort_data_collection(self):
        self.abort_collection = True

    def check_if_aborted(self):
        # QtGui.QApplication.processEvents()
        return not self.abort_collection

    def set_status_lbl(self, msg, color, size=20):
        self.widget.status_lbl.setStyleSheet("font-size: {}px; color: {};".format(size, color))
        self.widget.status_lbl.setText(msg)

    def increase_point_number(self):
        cur_point_number = int(str(self.widget.point_txt.text()))
        self.widget.point_txt.setText(str(cur_point_number + 1))

    def estimate_collection_time(self, epics_config):
        total_time = 0
        det_x_speed = caget(epics_config['detector_position_x'] + '.VELO')
        det_z_speed = caget(epics_config['detector_position_z'] + '.VELO')
        det_x_pos = caget(epics_config['detector_position_x'])
        det_z_pos = caget(epics_config['detector_position_z'])

        for exp_ind, experiment in enumerate(self.model.experiment_setups):
            exp_collection = False
            for sample_point in self.model.sample_points:
                if sample_point.perform_wide_scan_for_setup[exp_ind]:
                    exposure_time = abs(experiment.omega_end - experiment.omega_start) / experiment.omega_step * \
                                    experiment.time_per_step
                    total_time += exposure_time
                    exp_collection = True
                if sample_point.perform_step_scan_for_setup[exp_ind]:
                    print("Performing step scan for {}, with setup {}".format(sample_point, experiment))
                    number_of_steps = abs(experiment.omega_end - experiment.omega_start) / experiment.omega_step
                    exposure_time = number_of_steps * (4 + experiment.time_per_step)
                    total_time += exposure_time
                    exp_collection = True
                if exp_collection:
                    det_x_move_time = abs(experiment.detector_pos_x - det_x_pos) / float(det_x_speed)
                    det_y_move_time = abs(experiment.detector_pos_z - det_z_pos) / float(det_z_speed)
                    total_time += det_x_move_time + det_y_move_time
                    det_x_pos = experiment.detector_pos_x
                    det_z_pos = experiment.detector_pos_z
        return total_time

    @staticmethod
    def create_name_existent_msg(name_type):
        msg_box = QtGui.QMessageBox()
        msg_box.setWindowFlags(QtCore.Qt.Tool)
        msg_box.setText('{} name already exists.'.format(name_type))
        msg_box.setIcon(QtGui.QMessageBox.Critical)
        msg_box.setWindowTitle('Error')
        msg_box.setStandardButtons(QtGui.QMessageBox.Ok)
        msg_box.setDefaultButton(QtGui.QMessageBox.Ok)
        msg_box.exec_()

    @staticmethod
    def get_current_sample_position():
        try:
            x = float("{:.4g}".format(caget(epics_config['sample_position_x'])))
            y = float("{:.4g}".format(caget(epics_config['sample_position_y'])))
            z = float("{:.4g}".format(caget(epics_config['sample_position_z'])))
        except epics.ca.ChannelAccessException:
            x = y = z = 0
        return x, y, z

    @staticmethod
    def get_current_setup():
        """
        Checks epics for the current setup setting.
        returns: detector position, omega, exposure_time
        :return: float, float, float
        """
        try:
            detector_pos_x = float("{:g}".format(caget(epics_config['detector_position_x'])))
            detector_pos_z = float("{:g}".format(caget(epics_config['detector_position_z'])))
            omega = float("{:g}".format(caget(epics_config['sample_position_omega'])))
            exposure_time = float("{:g}".format(caget(epics_config['detector_control'] + ':AcquireTime')))
        except epics.ca.ChannelAccessException:
            detector_pos_x = 0
            detector_pos_z = 49
            omega = -90
            exposure_time = 0.5
        return detector_pos_x, detector_pos_z, omega, exposure_time

    @staticmethod
    def get_filename_info():
        path = caget(epics_config['detector_file'] + ':FilePath', as_string=True)
        print(path)
        filename = caget(epics_config['detector_file'] + ':FileName', as_string=True)
        file_number = caget(epics_config['detector_file'] + ':FileNumber')
        if path is None:
            path = ''
            filename = 'test'
            file_number = 0
        return path, filename, file_number

    def check_filepath_exists(self):
        cur_epics_filepath = caget(epics_config['detector_file'] + ':FilePath', as_string=True)
        print self.filepath
        caput(epics_config['detector_file'] + ':FilePath', self.filepath, wait=True)
        exists = caget(epics_config['detector_file'] + ':FilePathExists_RBV')

        caput(epics_config['detector_file'] + ':FilePath', cur_epics_filepath)
        return exists == 1

    @staticmethod
    def check_conditions():
        if int(caget('13IDD:m24.RBV')) > -105:
            return False
        elif int(caget('13IDD:m23.RBV')) > -105:
            return False
        elif int(caget('13IDD:m67.RBV')) > -65:
            return False
        return True

    def check_sample_point_distances(self):
        pos_x, pos_y, pos_z = self.get_current_sample_position()
        largest_distance = self.model.get_largest_largest_collecting_sample_point_distance_to(pos_x, pos_y, pos_z)

        return largest_distance < 0.2

    @staticmethod
    def show_error_message_box(msg):
        msg_box = QtGui.QMessageBox()
        msg_box.setWindowFlags(QtCore.Qt.Tool)
        msg_box.setText(msg)
        msg_box.setIcon(QtGui.QMessageBox.Critical)
        msg_box.setWindowTitle('Error')
        msg_box.setStandardButtons(QtGui.QMessageBox.Ok)
        msg_box.setDefaultButton(QtGui.QMessageBox.Ok)
        msg_box.exec_()

    @staticmethod
    def show_continue_abort_message_box(msg):
        msg_box = QtGui.QMessageBox()
        msg_box.setWindowFlags(QtCore.Qt.Tool)
        msg_box.setText("<p align='center' style='font-size:20px' >{}</p>".format(msg))
        msg_box.setIcon(QtGui.QMessageBox.Critical)
        msg_box.setWindowTitle('Continue?')
        msg_box.setStandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.Abort)
        msg_box.setDefaultButton(QtGui.QMessageBox.Abort)
        msg_box.exec_()
        return msg_box.result()
Example #20
0
from views.MainView import MainView
__author__ = 'Rabbi'

if __name__ == "__main__":
    mainView = MainView()
    mainView.showMainView()
Example #21
0
    def __init__(self, sys_argv):
        super(App, self).__init__(sys_argv)
        self.model = Model()
        # listView = QtGui.QListView()
        # listView.show
        red = QtGui.QColor(255, 0, 0)
        green = QtGui.QColor(0, 255, 0)
        blue = QtGui.QColor(0, 0, 255)
        rowCount = 4
        columnCount = 2
        tableData1 = [[QtGui.QColor("#FFFF00") for i in range(columnCount)]
                      for j in range(rowCount)]
        headers = ["Pallet0", "Colors"]

        entity = json2obj(
            '{"category":"groups","path":"/mnt/x19/mavisdev/projects/geotest/sequence/afg_0025","name":"afg_0025","description":"AFG_0025 sequence","fileImportPath":"","isGlobal":false,"project":"geotest","fields":{"priority":"medium","status":"idle"},"createdBy":"trevor","createdAt":"2016-09-13T20:28:04.745Z","updatedAt":"2017-05-31T21:38:19.935Z","id":"57d861546fef3a0001c87954","type":"sequence","mediaIds":[],"isTest":false}'
        )
        entity1 = json2obj(
            '{"category":"assets","path":"/mnt/x19/mavisdev/projects/geotest/globals/assets/wood_log","name":"wood_log","description":"a log that is wooden","fileImportPath":"","isGlobal":false,"project":"geotest","fields":{"priority":"medium","status":"review","grouping":"char","comp_status":"Ready","prod_status":"HIGH"},"createdBy":"dexplorer","createdAt":"2017-06-12T20:07:21.739Z","updatedAt":"2017-06-12T20:07:21.798Z","id":"593ef47973d9f40001cf898b","type":"assets","mediaIds":[],"isTest":false}'
        )
        entity2 = json2obj(
            '{"category":"assets","path":"/mnt/x19/mavisdev/projects/geotest/sequence/afg_0025/shots/afg_0025_0020/plates/plate_afg-0025__0020","name":"plate_afg-0025__0020","description":"plate asse for afg_0025_0020","latest":"583dc9eebc843d0001905bde","fileImportPath":"/mnt/x1/mavisdev/client_imports/geotest/afg_0025_0020/AFG_0025_0020_bg01_v001_LIN.exr","isGlobal":true,"project":"geotest","fields":{"priority":"low","status":"approved","startFrame":10,"endFrame":100,"pxAspect":1,"colorspace":"linear","fileType":"exr","width":1920,"height":1080,"lut":"","ccc":"","head":8,"tail":8,"handle":8},"createdBy":"trevor","createdAt":"2016-11-29T18:31:59.429Z","updatedAt":"2017-05-23T21:17:43.390Z","id":"583dc99fbc843d0001905bd9","type":"plates","mediaIds":[],"parentId":"57d861546fef3a0001c87960","isTest":false}'
        )
        entity3 = json2obj(
            '{"category":"tasks","path":"/mnt/x19/mavisdev/projects/geotest/globals/assets/wood_log/texture/tex_log","name":"tex_log","description":"texture the wood log","latest":"5941b18073d9f40001cf8a6c","fileImportPath":"","isGlobal":false,"project":"geotest","fields":{"priority":"urgent","status":"revised","grouping":"mtpg","comp_status":"In-Progress","prod_status":"HIGH"},"createdBy":"dexplorer","createdAt":"2017-06-12T20:08:10.814Z","updatedAt":"2017-06-14T21:58:24.772Z","id":"593ef4aa73d9f40001cf8992","type":"texture","mediaIds":[],"isTest":false}'
        )
        entity4 = json2obj(
            '{"category":"tasks","path":"/mnt/x19/mavisdev/projects/geotest/sequence/mdm_0202/shots/mdm_0202_0100/assets/tuktuka/model/tuktuk_model","name":"tuktuk_model","description":"published plate 6310","latest":"58c6ffe6e925cc00016a6b58","fileImportPath":"","isGlobal":false,"project":"geotest","fields":{"priority":"high","status":"revised","grouping":"vehi","comp_status":"Waiting","prod_status":"MEDIUM"},"createdBy":"trevor","createdAt":"2017-04-13T22:08:33.983Z","updatedAt":"2017-04-18T20:35:28.557Z","id":"589b4f9dc599d10001375de9","type":"model","mediaIds":[],"parentId":"589b4f10c599d10001375de2","isTest":false}'
        )

        rootNode = Node('Hips')
        childNode0 = TransformNode('LeftPirateleg', entity, rootNode)
        childNode1 = Node('RightLeg', entity1, rootNode)
        childNode2 = Node('RightFoot', entity2, childNode1)
        childNode3 = CameraNode('Xxxree', entity3, rootNode)
        childNode4 = LightNode('kldjskfds', entity4, childNode1)

        tree = TreeModel(rootNode)

        model2 = PaletteTableModel(tableData1, headers)
        self.main_ctrl = MainController(self.model)
        self.main_view = MainView(model=self.model, main_ctrl=self.main_ctrl)
        self.main_view.test(model2, tree=tree)
        self.main_view.show()

        # model2.insertRows(0, 5)
        # model2.insertColumns(0, 5)
        model2.removeColumns(1, 1)
        # tree.insertRows(0, 1)
        #
        #
        # self.threadClass = ThreadClass()
        # self.connect(self.threadClass, QtCore.SIGNAL('CPU_VALUE'), self.done)
        # self.threadClass.start()
        self.manager = QtNetwork.QNetworkAccessManager()
        self.manager.finished.connect(self.reply_finished)
        print(
            QtNetwork.QNetworkSession(QtNetwork.QNetworkConfigurationManager().
                                      defaultConfiguration()).State())
        self.request = QtNetwork.QNetworkRequest(
            QtCore.QUrl(
                'http://www.planwallpaper.com/static/images/1080p-HD-Wallpapers-9.jpg'
            ))
        print("Sending request")
        self.manager.get(self.request)
        self.manager2 = QtNetwork.QNetworkAccessManager()
        self.manager2.finished.connect(self.reply_finished)
        print(
            QtNetwork.QNetworkSession(QtNetwork.QNetworkConfigurationManager().
                                      defaultConfiguration()).State())
        self.request = QtNetwork.QNetworkRequest(
            QtCore.QUrl('http://lorempixel.com/1800/1400/city/'))
        print("Sending request")
        self.manager2.get(self.request)

        self.manager2 = QtNetwork.QNetworkAccessManager()
        self.manager2.finished.connect(self.reply_finished)
        print(
            QtNetwork.QNetworkSession(QtNetwork.QNetworkConfigurationManager().
                                      defaultConfiguration()).State())
        self.request = QtNetwork.QNetworkRequest(
            QtCore.QUrl('http://lorempixel.com/1800/1400/city/'))
        print("Sending request")
        self.manager2.get(self.request)

        self.manager3 = QtNetwork.QNetworkAccessManager()
        self.manager3.finished.connect(self.reply_finished)
        print(
            QtNetwork.QNetworkSession(QtNetwork.QNetworkConfigurationManager().
                                      defaultConfiguration()).State())
        self.request = QtNetwork.QNetworkRequest(
            QtCore.QUrl('http://lorempixel.com/1800/1400/city/'))
        print("Sending request")
        self.manager3.get(self.request)