Example #1
0
    def __init__(self, session = None, parent = None):
        super(ExperimentsTab, self).__init__(parent)
        self.session = session
        self.redis_conn = Redis()


        self.current_experiment = None


        self.layout = QtGui.QGridLayout()
        self.setLayout(self.layout)

        # experiments
        self.experiment_box = QtGui.QGroupBox(self, title="Experiments")
        self.experiment_box.setSizePolicy(QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Minimum)
        self.layout.addWidget(self.experiment_box,0,0)
        self.experiment_box_layout = QtGui.QGridLayout(self.experiment_box)
        self.experiment_box.setLayout(self.experiment_box_layout)


        self.experiment_list = ExperimentComboBox(session = session)
        self.experiment_list.currentIndexChanged.connect(self.update_current_experiment)
        self.experiment_box_layout.addWidget(self.experiment_list, 0, 0)

        self.new_experiment_button = QtGui.QPushButton("New Experiment")
        self.new_experiment_button.released.connect(self.new_experiment)
        self.experiment_box_layout.addWidget(self.new_experiment_button, 0, 1)


        # data sources
        self.data_box = QtGui.QGroupBox(self, title="Trials for this Experiment")
        self.data_box.setSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding )
        self.layout.addWidget(self.data_box,1,0, 1, 1)

        self.data_box_layout = QtGui.QGridLayout(self.data_box)
        self.data_box.setLayout(self.data_box_layout)





        self.trial_table = QtGui.QTableView(self)
        #        self.trial_table.doubleClicked.connect(self.edit_racer)
        #        self.trial_table.activated.connect(self.update_current_trial)
        self.trial_table.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
        self.trial_table_model = SQLAlchemyTableModel(session, Trial, [
            ('Type', Trial.discriminator, 'discriminator'),
            ('Name', Trial.name, 'name'),
            ('Reps', Trial.reps, 'reps'),
            ('Start', Trial.start_date, 'start_date'),
            ('End', Trial.end_date, 'end_date')
        ])

        self.trial_table.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.trial_table.customContextMenuRequested.connect(self.display_context_menu)
        self.trial_table.doubleClicked.connect(self.edit_trial)
        self.trial_table.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)


        self.trial_table_selection_model  = QtGui.QItemSelectionModel(self.trial_table_model)
        self.trial_table.setModel(self.trial_table_selection_model.model())
        self.trial_table.setSelectionModel(self.trial_table_selection_model)
        self.trial_table_selection_model.selectionChanged.connect(self.update_current_trial)


        self.data_box_layout.addWidget(self.trial_table, 0, 0, 2, 1)

        self.add_trial_button = QtGui.QPushButton("New Trial")
        self.data_box_layout.addWidget(self.add_trial_button, 0, 1)
        self.add_trial_button.released.connect(self.new_trial)


        self.trial_details_box = QtGui.QGroupBox("Trial Details")
        self.trial_details_box.setSizePolicy(QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Minimum)
        self.data_box_layout.addWidget(self.trial_details_box, 2, 0, 1, 1)
        self.trial_details_box_layout = QtGui.QGridLayout(self.trial_details_box)

        self.echo_trial_details = EchoTrialDetailsWidget()
        self.trial_details_box_layout.addWidget(self.echo_trial_details, 0, 0, 1, 1)
        self.echo_trial_details.hide()

        self.http_trial_details = HttpTrialDetailsWidget()
        self.trial_details_box_layout.addWidget(self.http_trial_details, 0, 0, 1, 1)

        self.racer_settings_widget = RacerDetailsWidget()
        self.trial_details_box_layout.addWidget(self.racer_settings_widget, 1, 0, 1, 1)

        self.trial_status = TrialStatusWidget()
#        self.trial_status.trial_edit.connect(self.show_edit_dialog)
        self.trial_status.trial_started.connect(self.start_trial)
        self.trial_status.trial_stopped.connect(self.stop_trial)
        self.trial_status.trial_refreshed.connect(self.update_trial_details)
        self.trial_status.trial_edit.connect(self.edit_trial)
        self.trial_details_box_layout.addWidget(self.trial_status, 0, 1, 2, 1)

        self.update_current_experiment(0)
        self.trial_table.resizeColumnsToContents()
Example #2
0
    def __init__(self, session=None, parent=None):
        super(ExperimentsTab, self).__init__(parent)
        self.session = session
        self.redis_conn = Redis()

        self.current_experiment = None

        self.layout = QtGui.QGridLayout()
        self.setLayout(self.layout)

        # experiments
        self.experiment_box = QtGui.QGroupBox(self, title="Experiments")
        self.experiment_box.setSizePolicy(QtGui.QSizePolicy.Minimum,
                                          QtGui.QSizePolicy.Minimum)
        self.layout.addWidget(self.experiment_box, 0, 0)
        self.experiment_box_layout = QtGui.QGridLayout(self.experiment_box)
        self.experiment_box.setLayout(self.experiment_box_layout)

        self.experiment_list = ExperimentComboBox(session=session)
        self.experiment_list.currentIndexChanged.connect(
            self.update_current_experiment)
        self.experiment_box_layout.addWidget(self.experiment_list, 0, 0)

        self.new_experiment_button = QtGui.QPushButton("New Experiment")
        self.new_experiment_button.released.connect(self.new_experiment)
        self.experiment_box_layout.addWidget(self.new_experiment_button, 0, 1)

        # data sources
        self.data_box = QtGui.QGroupBox(self,
                                        title="Trials for this Experiment")
        self.data_box.setSizePolicy(QtGui.QSizePolicy.Expanding,
                                    QtGui.QSizePolicy.Expanding)
        self.layout.addWidget(self.data_box, 1, 0, 1, 1)

        self.data_box_layout = QtGui.QGridLayout(self.data_box)
        self.data_box.setLayout(self.data_box_layout)

        self.trial_table = QtGui.QTableView(self)
        #        self.trial_table.doubleClicked.connect(self.edit_racer)
        #        self.trial_table.activated.connect(self.update_current_trial)
        self.trial_table.setSelectionBehavior(
            QtGui.QAbstractItemView.SelectRows)
        self.trial_table_model = SQLAlchemyTableModel(
            session, Trial, [('Type', Trial.discriminator, 'discriminator'),
                             ('Name', Trial.name, 'name'),
                             ('Reps', Trial.reps, 'reps'),
                             ('Start', Trial.start_date, 'start_date'),
                             ('End', Trial.end_date, 'end_date')])

        self.trial_table.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.trial_table.customContextMenuRequested.connect(
            self.display_context_menu)
        self.trial_table.doubleClicked.connect(self.edit_trial)
        self.trial_table.setSelectionMode(
            QtGui.QAbstractItemView.SingleSelection)

        self.trial_table_selection_model = QtGui.QItemSelectionModel(
            self.trial_table_model)
        self.trial_table.setModel(self.trial_table_selection_model.model())
        self.trial_table.setSelectionModel(self.trial_table_selection_model)
        self.trial_table_selection_model.selectionChanged.connect(
            self.update_current_trial)

        self.data_box_layout.addWidget(self.trial_table, 0, 0, 2, 1)

        self.add_trial_button = QtGui.QPushButton("New Trial")
        self.data_box_layout.addWidget(self.add_trial_button, 0, 1)
        self.add_trial_button.released.connect(self.new_trial)

        self.trial_details_box = QtGui.QGroupBox("Trial Details")
        self.trial_details_box.setSizePolicy(QtGui.QSizePolicy.Minimum,
                                             QtGui.QSizePolicy.Minimum)
        self.data_box_layout.addWidget(self.trial_details_box, 2, 0, 1, 1)
        self.trial_details_box_layout = QtGui.QGridLayout(
            self.trial_details_box)

        self.echo_trial_details = EchoTrialDetailsWidget()
        self.trial_details_box_layout.addWidget(self.echo_trial_details, 0, 0,
                                                1, 1)
        self.echo_trial_details.hide()

        self.http_trial_details = HttpTrialDetailsWidget()
        self.trial_details_box_layout.addWidget(self.http_trial_details, 0, 0,
                                                1, 1)

        self.racer_settings_widget = RacerDetailsWidget()
        self.trial_details_box_layout.addWidget(self.racer_settings_widget, 1,
                                                0, 1, 1)

        self.trial_status = TrialStatusWidget()
        #        self.trial_status.trial_edit.connect(self.show_edit_dialog)
        self.trial_status.trial_started.connect(self.start_trial)
        self.trial_status.trial_stopped.connect(self.stop_trial)
        self.trial_status.trial_refreshed.connect(self.update_trial_details)
        self.trial_status.trial_edit.connect(self.edit_trial)
        self.trial_details_box_layout.addWidget(self.trial_status, 0, 1, 2, 1)

        self.update_current_experiment(0)
        self.trial_table.resizeColumnsToContents()
Example #3
0
class ExperimentsTab(QtGui.QWidget):




    def __init__(self, session = None, parent = None):
        super(ExperimentsTab, self).__init__(parent)
        self.session = session
        self.redis_conn = Redis()


        self.current_experiment = None


        self.layout = QtGui.QGridLayout()
        self.setLayout(self.layout)

        # experiments
        self.experiment_box = QtGui.QGroupBox(self, title="Experiments")
        self.experiment_box.setSizePolicy(QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Minimum)
        self.layout.addWidget(self.experiment_box,0,0)
        self.experiment_box_layout = QtGui.QGridLayout(self.experiment_box)
        self.experiment_box.setLayout(self.experiment_box_layout)


        self.experiment_list = ExperimentComboBox(session = session)
        self.experiment_list.currentIndexChanged.connect(self.update_current_experiment)
        self.experiment_box_layout.addWidget(self.experiment_list, 0, 0)

        self.new_experiment_button = QtGui.QPushButton("New Experiment")
        self.new_experiment_button.released.connect(self.new_experiment)
        self.experiment_box_layout.addWidget(self.new_experiment_button, 0, 1)


        # data sources
        self.data_box = QtGui.QGroupBox(self, title="Trials for this Experiment")
        self.data_box.setSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Expanding )
        self.layout.addWidget(self.data_box,1,0, 1, 1)

        self.data_box_layout = QtGui.QGridLayout(self.data_box)
        self.data_box.setLayout(self.data_box_layout)





        self.trial_table = QtGui.QTableView(self)
        #        self.trial_table.doubleClicked.connect(self.edit_racer)
        #        self.trial_table.activated.connect(self.update_current_trial)
        self.trial_table.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
        self.trial_table_model = SQLAlchemyTableModel(session, Trial, [
            ('Type', Trial.discriminator, 'discriminator'),
            ('Name', Trial.name, 'name'),
            ('Reps', Trial.reps, 'reps'),
            ('Start', Trial.start_date, 'start_date'),
            ('End', Trial.end_date, 'end_date')
        ])

        self.trial_table.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.trial_table.customContextMenuRequested.connect(self.display_context_menu)
        self.trial_table.doubleClicked.connect(self.edit_trial)
        self.trial_table.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)


        self.trial_table_selection_model  = QtGui.QItemSelectionModel(self.trial_table_model)
        self.trial_table.setModel(self.trial_table_selection_model.model())
        self.trial_table.setSelectionModel(self.trial_table_selection_model)
        self.trial_table_selection_model.selectionChanged.connect(self.update_current_trial)


        self.data_box_layout.addWidget(self.trial_table, 0, 0, 2, 1)

        self.add_trial_button = QtGui.QPushButton("New Trial")
        self.data_box_layout.addWidget(self.add_trial_button, 0, 1)
        self.add_trial_button.released.connect(self.new_trial)


        self.trial_details_box = QtGui.QGroupBox("Trial Details")
        self.trial_details_box.setSizePolicy(QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Minimum)
        self.data_box_layout.addWidget(self.trial_details_box, 2, 0, 1, 1)
        self.trial_details_box_layout = QtGui.QGridLayout(self.trial_details_box)

        self.echo_trial_details = EchoTrialDetailsWidget()
        self.trial_details_box_layout.addWidget(self.echo_trial_details, 0, 0, 1, 1)
        self.echo_trial_details.hide()

        self.http_trial_details = HttpTrialDetailsWidget()
        self.trial_details_box_layout.addWidget(self.http_trial_details, 0, 0, 1, 1)

        self.racer_settings_widget = RacerDetailsWidget()
        self.trial_details_box_layout.addWidget(self.racer_settings_widget, 1, 0, 1, 1)

        self.trial_status = TrialStatusWidget()
#        self.trial_status.trial_edit.connect(self.show_edit_dialog)
        self.trial_status.trial_started.connect(self.start_trial)
        self.trial_status.trial_stopped.connect(self.stop_trial)
        self.trial_status.trial_refreshed.connect(self.update_trial_details)
        self.trial_status.trial_edit.connect(self.edit_trial)
        self.trial_details_box_layout.addWidget(self.trial_status, 0, 1, 2, 1)

        self.update_current_experiment(0)
        self.trial_table.resizeColumnsToContents()


    def display_context_menu(self, pos):
        index = self.trial_table.indexAt(pos)



        self. menu = QtGui.QMenu()

        self.edit_action = self.menu.addAction("Edit")
        self.edit_action.triggered.connect(self.edit_trial)

        self.duplicate_action = self.menu.addAction("Duplicate")
        self.duplicate_action.triggered.connect(self.duplicate_trial)

        self.delete_action = self.menu.addAction("Delete")
        self.delete_action.triggered.connect(self.delete_trial)

        self.feasibility_separator = self.menu.addAction("---- Feasibility Analysis ----")
        self.feasibility_separator.setEnabled(False)
        self.shorter_action = self.menu.addAction("Set Shorter Trial")
        self.shorter_action.triggered.connect(self.setAsShorterTrial)

        self.longer_action = self.menu.addAction("Set Longer Trial")
        self.longer_action.triggered.connect(self.setAsLongerTrial)


        if self.current_trial.end_date is None:
            self.shorter_action.setEnabled(False)
            self.longer_action.setEnabled(False)
        else:
            self.shorter_action.setEnabled(True)
            self.longer_action.setEnabled(True)

        table_viewport  = self.trial_table.viewport()
        self.menu.popup(table_viewport.mapToGlobal(pos))

    def setAsShorterTrial(self):
        self.emit(QtCore.SIGNAL("shorter_trial_set(PyQt_PyObject)"), self.current_trial)

    def setAsLongerTrial(self):
        self.emit(QtCore.SIGNAL("longer_trial_set(PyQt_PyObject)"), self.current_trial)


    def update_current_experiment(self, index):
        self.current_experiment = self.experiment_list.currentItem()
        #self.experiment_name.setText(self.current_experiment.name)
        self.update_trial_table()
#        self.trial_table.setSelection()


    def update_current_trial(self,x,y):
        self.current_trial = self.trial_table_selection_model.currentIndex().data(QtCore.Qt.EditRole)
        if len(x.indexes()) == 0:
            self.trial_status.start_trial_button.setEnabled(False)
            self.trial_status.edit_trial_button.setEnabled(False)
            self.trial_status.refresh_trial_button.setEnabled(False)
            self.trial_status.stop_trial_button.setEnabled(False)
        else:
            self.update_trial_details()

    def edit_trial(self):
        dialog = NewTrialDialog(self.session, experiment=self.current_experiment, parent=self, trial=self.current_trial)
        dialog.accepted.connect(self.trial_table_model.refresh)
        dialog.exec()



    def update_trial_details(self):
        self.session.refresh(self.current_trial)
        self.trial_status.edit_trial_button.setEnabled(True)
        self.trial_status.refresh_trial_button.setEnabled(True)

        if self.current_trial.start_date == None:
            self.trial_status.start_trial_button.setEnabled(True)
            self.trial_status.stop_trial_button.setEnabled(False)
        else:
            self.trial_status.start_trial_button.setEnabled(False)
            self.trial_status.stop_trial_button.setEnabled(True)

        if(self.current_trial.__class__.__name__ == "HTTPTrial"):
            self.echo_trial_details.hide()
            self.http_trial_details.show()
            self.http_trial_details.request_url.setText(self.current_trial.request_url)
            self.http_trial_details.type.setText("HTTP Trial")

        else:
            self.echo_trial_details.show()
            self.http_trial_details.hide()
            self.echo_trial_details.delay.setText(str(self.current_trial.delay))
            self.echo_trial_details.type.setText("Echo Trial")

        self.http_trial_details.name.setText(self.current_trial.name)
        self.http_trial_details.description.setText(self.current_trial.description)

        self.racer_settings_widget.racer.setText(self.current_trial.racer.hostname)
        self.racer_settings_widget.core_id.setText(str(self.current_trial.core_id))
        self.racer_settings_widget.real_time.setText(str(self.current_trial.real_time))

        self.trial_status.start.setText(str(self.current_trial.start_date))
        self.trial_status.end.setText(str(self.current_trial.end_date))

        try:
            job = Job.fetch(self.current_trial.job, connection=self.redis_conn)
            self.trial_status.job_status.setText(job.get_status())
        except:
            self.trial_status.job_status.setText("not scheduled")




    def stop_trial(self):
        self.current_trial.start_date = None
        self.current_trial.end_date = None
        self.session.add(self.current_trial)
        self.session.commit()

        job = Job.fetch(self.current_trial.job, connection=self.redis_conn)
        job.cancel()
        self.update_trial_details()
        self.trial_table.resizeColumnsToContents()


    def delete_trial(self):
        reply = QtGui.QMessageBox.question(self, "Confirm", "Really delete the selected trial?", QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
        if reply == QtGui.QMessageBox.Yes:
            self.session.delete(self.current_trial)
            self.session.commit()
            self.update_trial_table()

    def duplicate_trial(self):
        new = self.current_trial.duplicate()
        self.session.add(new)
        self.session.commit()
        self.update_trial_table()

    def start_trial(self):
        q = Queue(self.current_trial.racer.hostname, connection=self.redis_conn)
        t = self.current_trial

        job = None
        if(self.current_trial.__class__.__name__ == "HTTPTrial"):
            job = HTTPTrialJob()
            job.request = t.request
            job.request_url = t.request_url
        else:
            job = EchoTrialJob()
            job.target_host = t.host
            job.target_port = t.port
            job.delay = t.delay

        job.reps = t.reps
        job.core_affinity = t.core_id
        if t.real_time:
            job.real_time = 1
        else:
            job.real_time = 0


        res = q.enqueue_call(func=execute_trial, args=(job,), result_ttl=-1, timeout=1000000)
        self.current_trial.job = res.get_id()
        self.current_trial.start_date = datetime.now()
        self.session.add(self.current_trial)
        self.session.commit()

        res.save()
        self.trial_status.start_trial_button.setEnabled(False)
        self.trial_status.stop_trial_button.setEnabled(True)
        self.update_trial_details()
        self.trial_table.resizeColumnsToContents()


    def update_trial_table(self):
        self.trial_table_model.setFilter(Trial.experiment==self.current_experiment)
        self.trial_table.resizeColumnsToContents()



    def new_trial(self):
        dialog = NewTrialDialog(self.session, experiment=self.current_experiment, parent=self)
        dialog.accepted.connect(self.trial_table_model.refresh)
        dialog.exec()


    def new_experiment(self):
        dialog = QtGui.QInputDialog(self)
        dialog.setLabelText("Please enter the name for the new Experiment.")
        dialog.textValueSelected.connect(self.store_new_experiment)
        dialog.exec()

    def store_new_experiment(self, name):
        exp = Experiment()
        exp.name = name
        self.session.add(exp)
        self.session.commit()
        self.experiment_list.refresh_experiments()
Example #4
0
class ExperimentsTab(QtGui.QWidget):
    def __init__(self, session=None, parent=None):
        super(ExperimentsTab, self).__init__(parent)
        self.session = session
        self.redis_conn = Redis()

        self.current_experiment = None

        self.layout = QtGui.QGridLayout()
        self.setLayout(self.layout)

        # experiments
        self.experiment_box = QtGui.QGroupBox(self, title="Experiments")
        self.experiment_box.setSizePolicy(QtGui.QSizePolicy.Minimum,
                                          QtGui.QSizePolicy.Minimum)
        self.layout.addWidget(self.experiment_box, 0, 0)
        self.experiment_box_layout = QtGui.QGridLayout(self.experiment_box)
        self.experiment_box.setLayout(self.experiment_box_layout)

        self.experiment_list = ExperimentComboBox(session=session)
        self.experiment_list.currentIndexChanged.connect(
            self.update_current_experiment)
        self.experiment_box_layout.addWidget(self.experiment_list, 0, 0)

        self.new_experiment_button = QtGui.QPushButton("New Experiment")
        self.new_experiment_button.released.connect(self.new_experiment)
        self.experiment_box_layout.addWidget(self.new_experiment_button, 0, 1)

        # data sources
        self.data_box = QtGui.QGroupBox(self,
                                        title="Trials for this Experiment")
        self.data_box.setSizePolicy(QtGui.QSizePolicy.Expanding,
                                    QtGui.QSizePolicy.Expanding)
        self.layout.addWidget(self.data_box, 1, 0, 1, 1)

        self.data_box_layout = QtGui.QGridLayout(self.data_box)
        self.data_box.setLayout(self.data_box_layout)

        self.trial_table = QtGui.QTableView(self)
        #        self.trial_table.doubleClicked.connect(self.edit_racer)
        #        self.trial_table.activated.connect(self.update_current_trial)
        self.trial_table.setSelectionBehavior(
            QtGui.QAbstractItemView.SelectRows)
        self.trial_table_model = SQLAlchemyTableModel(
            session, Trial, [('Type', Trial.discriminator, 'discriminator'),
                             ('Name', Trial.name, 'name'),
                             ('Reps', Trial.reps, 'reps'),
                             ('Start', Trial.start_date, 'start_date'),
                             ('End', Trial.end_date, 'end_date')])

        self.trial_table.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
        self.trial_table.customContextMenuRequested.connect(
            self.display_context_menu)
        self.trial_table.doubleClicked.connect(self.edit_trial)
        self.trial_table.setSelectionMode(
            QtGui.QAbstractItemView.SingleSelection)

        self.trial_table_selection_model = QtGui.QItemSelectionModel(
            self.trial_table_model)
        self.trial_table.setModel(self.trial_table_selection_model.model())
        self.trial_table.setSelectionModel(self.trial_table_selection_model)
        self.trial_table_selection_model.selectionChanged.connect(
            self.update_current_trial)

        self.data_box_layout.addWidget(self.trial_table, 0, 0, 2, 1)

        self.add_trial_button = QtGui.QPushButton("New Trial")
        self.data_box_layout.addWidget(self.add_trial_button, 0, 1)
        self.add_trial_button.released.connect(self.new_trial)

        self.trial_details_box = QtGui.QGroupBox("Trial Details")
        self.trial_details_box.setSizePolicy(QtGui.QSizePolicy.Minimum,
                                             QtGui.QSizePolicy.Minimum)
        self.data_box_layout.addWidget(self.trial_details_box, 2, 0, 1, 1)
        self.trial_details_box_layout = QtGui.QGridLayout(
            self.trial_details_box)

        self.echo_trial_details = EchoTrialDetailsWidget()
        self.trial_details_box_layout.addWidget(self.echo_trial_details, 0, 0,
                                                1, 1)
        self.echo_trial_details.hide()

        self.http_trial_details = HttpTrialDetailsWidget()
        self.trial_details_box_layout.addWidget(self.http_trial_details, 0, 0,
                                                1, 1)

        self.racer_settings_widget = RacerDetailsWidget()
        self.trial_details_box_layout.addWidget(self.racer_settings_widget, 1,
                                                0, 1, 1)

        self.trial_status = TrialStatusWidget()
        #        self.trial_status.trial_edit.connect(self.show_edit_dialog)
        self.trial_status.trial_started.connect(self.start_trial)
        self.trial_status.trial_stopped.connect(self.stop_trial)
        self.trial_status.trial_refreshed.connect(self.update_trial_details)
        self.trial_status.trial_edit.connect(self.edit_trial)
        self.trial_details_box_layout.addWidget(self.trial_status, 0, 1, 2, 1)

        self.update_current_experiment(0)
        self.trial_table.resizeColumnsToContents()

    def display_context_menu(self, pos):
        index = self.trial_table.indexAt(pos)

        self.menu = QtGui.QMenu()

        self.edit_action = self.menu.addAction("Edit")
        self.edit_action.triggered.connect(self.edit_trial)

        self.duplicate_action = self.menu.addAction("Duplicate")
        self.duplicate_action.triggered.connect(self.duplicate_trial)

        self.delete_action = self.menu.addAction("Delete")
        self.delete_action.triggered.connect(self.delete_trial)

        self.feasibility_separator = self.menu.addAction(
            "---- Feasibility Analysis ----")
        self.feasibility_separator.setEnabled(False)
        self.shorter_action = self.menu.addAction("Set Shorter Trial")
        self.shorter_action.triggered.connect(self.setAsShorterTrial)

        self.longer_action = self.menu.addAction("Set Longer Trial")
        self.longer_action.triggered.connect(self.setAsLongerTrial)

        if self.current_trial.end_date is None:
            self.shorter_action.setEnabled(False)
            self.longer_action.setEnabled(False)
        else:
            self.shorter_action.setEnabled(True)
            self.longer_action.setEnabled(True)

        table_viewport = self.trial_table.viewport()
        self.menu.popup(table_viewport.mapToGlobal(pos))

    def setAsShorterTrial(self):
        self.emit(QtCore.SIGNAL("shorter_trial_set(PyQt_PyObject)"),
                  self.current_trial)

    def setAsLongerTrial(self):
        self.emit(QtCore.SIGNAL("longer_trial_set(PyQt_PyObject)"),
                  self.current_trial)

    def update_current_experiment(self, index):
        self.current_experiment = self.experiment_list.currentItem()
        #self.experiment_name.setText(self.current_experiment.name)
        self.update_trial_table()
#        self.trial_table.setSelection()

    def update_current_trial(self, x, y):
        self.current_trial = self.trial_table_selection_model.currentIndex(
        ).data(QtCore.Qt.EditRole)
        if len(x.indexes()) == 0:
            self.trial_status.start_trial_button.setEnabled(False)
            self.trial_status.edit_trial_button.setEnabled(False)
            self.trial_status.refresh_trial_button.setEnabled(False)
            self.trial_status.stop_trial_button.setEnabled(False)
        else:
            self.update_trial_details()

    def edit_trial(self):
        dialog = NewTrialDialog(self.session,
                                experiment=self.current_experiment,
                                parent=self,
                                trial=self.current_trial)
        dialog.accepted.connect(self.trial_table_model.refresh)
        dialog.exec()

    def update_trial_details(self):
        self.session.refresh(self.current_trial)
        self.trial_status.edit_trial_button.setEnabled(True)
        self.trial_status.refresh_trial_button.setEnabled(True)

        if self.current_trial.start_date == None:
            self.trial_status.start_trial_button.setEnabled(True)
            self.trial_status.stop_trial_button.setEnabled(False)
        else:
            self.trial_status.start_trial_button.setEnabled(False)
            self.trial_status.stop_trial_button.setEnabled(True)

        if (self.current_trial.__class__.__name__ == "HTTPTrial"):
            self.echo_trial_details.hide()
            self.http_trial_details.show()
            self.http_trial_details.request_url.setText(
                self.current_trial.request_url)
            self.http_trial_details.type.setText("HTTP Trial")

        else:
            self.echo_trial_details.show()
            self.http_trial_details.hide()
            self.echo_trial_details.delay.setText(str(
                self.current_trial.delay))
            self.echo_trial_details.type.setText("Echo Trial")

        self.http_trial_details.name.setText(self.current_trial.name)
        self.http_trial_details.description.setText(
            self.current_trial.description)

        self.racer_settings_widget.racer.setText(
            self.current_trial.racer.hostname)
        self.racer_settings_widget.core_id.setText(
            str(self.current_trial.core_id))
        self.racer_settings_widget.real_time.setText(
            str(self.current_trial.real_time))

        self.trial_status.start.setText(str(self.current_trial.start_date))
        self.trial_status.end.setText(str(self.current_trial.end_date))

        try:
            job = Job.fetch(self.current_trial.job, connection=self.redis_conn)
            self.trial_status.job_status.setText(job.get_status())
        except:
            self.trial_status.job_status.setText("not scheduled")

    def stop_trial(self):
        self.current_trial.start_date = None
        self.current_trial.end_date = None
        self.session.add(self.current_trial)
        self.session.commit()

        job = Job.fetch(self.current_trial.job, connection=self.redis_conn)
        job.cancel()
        self.update_trial_details()
        self.trial_table.resizeColumnsToContents()

    def delete_trial(self):
        reply = QtGui.QMessageBox.question(
            self, "Confirm", "Really delete the selected trial?",
            QtGui.QMessageBox.Yes, QtGui.QMessageBox.No)
        if reply == QtGui.QMessageBox.Yes:
            self.session.delete(self.current_trial)
            self.session.commit()
            self.update_trial_table()

    def duplicate_trial(self):
        new = self.current_trial.duplicate()
        self.session.add(new)
        self.session.commit()
        self.update_trial_table()

    def start_trial(self):
        q = Queue(self.current_trial.racer.hostname,
                  connection=self.redis_conn)
        t = self.current_trial

        job = None
        if (self.current_trial.__class__.__name__ == "HTTPTrial"):
            job = HTTPTrialJob()
            job.request = t.request
            job.request_url = t.request_url
        else:
            job = EchoTrialJob()
            job.target_host = t.host
            job.target_port = t.port
            job.delay = t.delay

        job.reps = t.reps
        job.core_affinity = t.core_id
        if t.real_time:
            job.real_time = 1
        else:
            job.real_time = 0

        res = q.enqueue_call(func=execute_trial,
                             args=(job, ),
                             result_ttl=-1,
                             timeout=1000000)
        self.current_trial.job = res.get_id()
        self.current_trial.start_date = datetime.now()
        self.session.add(self.current_trial)
        self.session.commit()

        res.save()
        self.trial_status.start_trial_button.setEnabled(False)
        self.trial_status.stop_trial_button.setEnabled(True)
        self.update_trial_details()
        self.trial_table.resizeColumnsToContents()

    def update_trial_table(self):
        self.trial_table_model.setFilter(
            Trial.experiment == self.current_experiment)
        self.trial_table.resizeColumnsToContents()

    def new_trial(self):
        dialog = NewTrialDialog(self.session,
                                experiment=self.current_experiment,
                                parent=self)
        dialog.accepted.connect(self.trial_table_model.refresh)
        dialog.exec()

    def new_experiment(self):
        dialog = QtGui.QInputDialog(self)
        dialog.setLabelText("Please enter the name for the new Experiment.")
        dialog.textValueSelected.connect(self.store_new_experiment)
        dialog.exec()

    def store_new_experiment(self, name):
        exp = Experiment()
        exp.name = name
        self.session.add(exp)
        self.session.commit()
        self.experiment_list.refresh_experiments()