def create_tabs(self):
        #Text Area
        s = ("Welcome to the S.Pombe kinetochore motion "
             "Simulator")
        self.simLog = QtGui.QTextEdit(s)
        self.simLog.setReadOnly(True)

        #Plotting Areas
        span = self.paramtree.relative_dic['span']

        self.plotarea1 = MyMplCanvas(span)
        mpl_toolbar = NavigationToolbar(self.plotarea1, self.centralwidget)
        vbox1 = QtGui.QVBoxLayout()
        vbox1.setSpacing(5)
        vbox1.addWidget(self.plotarea1)
        vbox1.addWidget(mpl_toolbar)
        self.w1 = QtGui.QWidget()
        self.w1.setLayout(vbox1)

        self.plotarea2 = MyMplCanvas(span)
        mpl_toolbar = NavigationToolbar(self.plotarea2, self.centralwidget)
        vbox2 = QtGui.QVBoxLayout()
        vbox2.setSpacing(5)
        vbox2.addWidget(self.plotarea2)
        vbox2.addWidget(mpl_toolbar)
        self.w2 = QtGui.QWidget()
        self.w2.setLayout(vbox2)

        #All this goes in a tab widget
        self.tabWidget = QtGui.QTabWidget()
        self.tabWidget.setTabsClosable(True)
        self.tabWidget.addTab(self.simLog, "Log")
        #self.tabWidget.tabCloseRequested.connect(self.tabWidget.removeTab)

        self.connect(self.tabWidget, QtCore.SIGNAL('tabCloseRequested(int)'),
                     self.closeTab)
class MainWindow(QtGui.QMainWindow):

    def __init__(self, parent=None):

        self.paramtree = ParamTree(PARAMFILE)
        self.measuretree = ParamTree(MEASUREFILE, adimentionalized=False)
        self.measures = self.measuretree.absolute_dic

        self.mt = None

        QtGui.QMainWindow.__init__(self, parent)
        self.centralwidget = QtGui.QWidget()

        self.setCentralWidget(self.centralwidget)
        self.create_docks()
        self.create_tabs()
        self.create_buttons()

        #self.prepare_simulation()

    def create_docks(self):

        #Parameter Setting in a Dock Widget
        self.paramdock = QtGui.QDockWidget('Parameters Setting')
        self.setParameters = SetParameters(self.paramtree)
        scrollArea = QtGui.QScrollArea()
        scrollArea.setWidget(self.setParameters)
        self.paramdock.setWidget(scrollArea)
        self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.paramdock)

        #Measures Setting in another Dock Widget
        self.measuredock = QtGui.QDockWidget('Measures Setting')
        self.setMeasures = SetMeasures(self.measuretree)
        scrollArea = QtGui.QScrollArea()
        scrollArea.setWidget(self.setMeasures)
        self.measuredock.setWidget(scrollArea)
        self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.measuredock)

    def create_tabs(self):
        #Text Area
        s = ("Welcome to the S.Pombe kinetochore motion "
             "Simulator")
        self.simLog = QtGui.QTextEdit(s)
        self.simLog.setReadOnly(True)

        #Plotting Areas
        span = self.paramtree.relative_dic['span']

        self.plotarea1 = MyMplCanvas(span)
        mpl_toolbar = NavigationToolbar(self.plotarea1, self.centralwidget)
        vbox1 = QtGui.QVBoxLayout()
        vbox1.setSpacing(5)
        vbox1.addWidget(self.plotarea1)
        vbox1.addWidget(mpl_toolbar)
        self.w1 = QtGui.QWidget()
        self.w1.setLayout(vbox1)

        self.plotarea2 = MyMplCanvas(span)
        mpl_toolbar = NavigationToolbar(self.plotarea2, self.centralwidget)
        vbox2 = QtGui.QVBoxLayout()
        vbox2.setSpacing(5)
        vbox2.addWidget(self.plotarea2)
        vbox2.addWidget(mpl_toolbar)
        self.w2 = QtGui.QWidget()
        self.w2.setLayout(vbox2)

        #All this goes in a tab widget
        self.tabWidget = QtGui.QTabWidget()
        self.tabWidget.setTabsClosable(True)
        self.tabWidget.addTab(self.simLog, "Log")
        #self.tabWidget.tabCloseRequested.connect(self.tabWidget.removeTab)

        self.connect(self.tabWidget, QtCore.SIGNAL('tabCloseRequested(int)'),
                     self.closeTab)
        #              self.closeTab)
        #self.tabWidget.addTab(w1, "All trajectories")
        #self.tabWidget.addTab(w2, "One trajectory")

    def closeTab(self, idx):
        self.tabWidget.removeTab(idx)

    def create_buttons(self):
        #Buttons
        #self.buttonGroup = QtGui.QButtonGroup()
        runButton = QtGui.QPushButton('Run the simulation')
        exec_icon = os.path.join(os.path.dirname(__file__),
                                 "images", "exec.svg")
        runButton.setIcon(QtGui.QIcon(exec_icon))
        self.connect(runButton, QtCore.SIGNAL('clicked()'), self.run_simulation)

        showTrajButton = QtGui.QPushButton('Show trajectories')
        self.connect(showTrajButton, QtCore.SIGNAL('clicked()'), self.show_trajs)

        self.traj_num = 0
        showOneButton = QtGui.QPushButton('Show one trajectory')
        self.connect(showOneButton, QtCore.SIGNAL('clicked()'), self.show_one)

        self.interactiveButton = QtGui.QRadioButton('Interactive Simulation')
        self.interactiveButton.setChecked(True)
        #self.buttonGroup.addButton(runButton)
        #Progress Bar
        self.progressBar = QtGui.QProgressBar()

        hbox = QtGui.QHBoxLayout()
        hbox.setSpacing(5)
        hbox.addWidget(runButton)
        hbox.addWidget(showTrajButton)
        hbox.addWidget(showOneButton)
        hbox.addWidget(self.progressBar)
        hbox.addWidget(self.interactiveButton)

        vbox = QtGui.QVBoxLayout()
        vbox.setSpacing(5)
        vbox.addLayout(hbox)  #self.buttonGroup)
        vbox.addWidget(self.tabWidget)

        self.centralwidget.setLayout(vbox)

        self.createActions()
        self.createMenus()

        self.createToolBars()
        self.createStatusBar()
        currentDirName = os.path.abspath(os.path.curdir)

        currentFileName = '_'.join(time.asctime().split()[:-1])
        currentFileName = 'simul_' + \
                            '_'.join(currentFileName.split(':')) + \
                            '.xml'
        currentFileName = os.path.join(currentDirName, currentFileName)

        self.setCurrentFile(currentFileName)
        self.setWindowTitle(self.tr("Kinetochore Dynamics Simulation"))
        self.setMinimumSize(160, 160)
        self.resize(1000, 600)

    def prepare_simulation(self):

        plug_idx = self.attachCombo.currentIndex()
        initial_plug = self.attachment_list[plug_idx]

        self.mt = SigMetaphase(self.paramtree, self.measuretree,
                               initial_plug=initial_plug)

        self.progressBar.setMaximum(int(self.paramtree.absolute_dic['span']))

        self.progressBar.setMinimum(0)
        self.connect(self.mt, QtCore.SIGNAL('plugCheckPoint'),
                     self.active_checkpoint)
        self.connect(self.mt,  QtCore.SIGNAL('stepDone'),
                     self.progressBar.setValue)
        self.connect(self.mt,  QtCore.SIGNAL('simulDone'),
                     self.print_report)

        run_interactively = self.interactiveButton.isChecked()

        if run_interactively:
            self.iw = InteractiveCellWidget(self.mt)

            idx = self.tabWidget.currentIndex() + 1
            self.tabWidget.insertTab(idx, self.iw, "Interactive Simulation")
            self.tabWidget.setCurrentIndex(idx)

            self.connect(self.mt,  QtCore.SIGNAL('simulDone'),
                         self.iw.startAnim)

    def run_simulation(self):

        self.prepare_simulation()
        QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
        self.mt.sig_simul()
        QtGui.QApplication.restoreOverrideCursor()

    def show_trajs(self):

        self.plotarea1.update_figure(self.mt)
        self.tabWidget.insertTab(1, self.w1, "All trajectories")
        self.tabWidget.setCurrentIndex(1)

    def show_one(self):

        #self.tabWidget.removeTab(2)
        t_num = mod(self.traj_num, 3)
        self.plotarea2.update_figure(self.mt, t_num)
        self.traj_num += 1
        self.tabWidget.insertTab(2, self.w2, "Trajectory of chromosome # %i" %(t_num + 1) )
        self.tabWidget.setCurrentIndex(2)

    def update_progressBar(self, val):
        self.progressBar.setValue(val)

    def print_report(self, report):
        self.simLog.append("Simulation's done!")
        for l in report:
            ls = l
            self.simLog.append(ls)

        self.progressBar.setValue(0)

    def active_checkpoint(self, cp):
        if cp:
            self.statusBar().showMessage(self.tr("Active Plug/unplug checkpoint"), 2000)
        else:
            self.statusBar().showMessage(self.tr(" "), 2000)

    def closeEvent(self, event):
        if self.maybeSave():
            event.accept()
        else:
            event.ignore()

    def newFile(self):
        if self.maybeSave():
            self.textEdit.clear()
            self.setCurrentFile("")

    def open(self):
        if self.maybeSave():
            fileName, selectedFilter = QtGui.QFileDialog.getOpenFileName(self, filter="XML files (*.xml);;All Files (*.*)")
            self.loadFile(fileName)

        self.setCurrentFile(fileName)

    def save(self):
        # if not os.path.isfile(self.curFile):
        #     self.curFile = default_filename
        #     #return self.saveAs()
        # else:
        return self.saveFile(self.curFile)

    # TODO: The saveAs functions trigs a segfault
    # def saveAs(self):
    #     #'test_save'#
    #     saveDiag = QtGui.QFileDialog()
    #     fileName = saveDiag.getSaveFileName(self,
    #                                         self.tr("Save Simulation"),
    #                                         self.tr("default.xml"),
    #                                         self.tr("Simulations (*.xml)"))
    ### SegFaults here, I don't know why ###
    #     print filename
    #     if fileName.isEmpty():
    #         fileName = "default.xml"

    #     self.saveFile(fileName)
    #     del saveDiag

    def about(self):
        QtGui.QMessageBox.about(self, self.tr("About Application"),
            self.tr("This little stuff allows to simulate "
                    "kinetochore dynamics in S.Pombe "))

    def documentWasModified(self):
        self.setWindowModified(self.setParameters.isModified)

    def createActions(self):

        open_icon = os.path.join(os.path.dirname(__file__),
                                 "images", "open.png")
        self.openAct = QtGui.QAction(QtGui.QIcon(open_icon),
                                     self.tr("&Open Simulation File"), self)
        self.openAct.setShortcut(self.tr("Ctrl+O"))
        self.openAct.setStatusTip(self.tr("Open an existing simulation file"))
        self.connect(self.openAct, QtCore.SIGNAL("triggered()"), self.open)
        save_icon = os.path.join(os.path.dirname(__file__),
                                 "images", "save.png")
        self.saveAct = QtGui.QAction(QtGui.QIcon(save_icon),
                                     self.tr("&Save"), self)
        self.saveAct.setShortcut(self.tr("Ctrl+S"))
        self.saveAct.setStatusTip(self.tr("Save the simulation to disk"))
        self.connect(self.saveAct, QtCore.SIGNAL("triggered()"), self.save)

        # self.saveAsAct = QtGui.QAction(self.tr("Save &As..."), self)
        # self.saveAsAct.setStatusTip(self.tr("Save the simulation under a new name"))
        # self.connect(self.saveAsAct, QtCore.SIGNAL("triggered()"), self.saveAs)

        self.exitAct = QtGui.QAction(self.tr("E&xit"), self)
        self.exitAct.setShortcut(self.tr("Ctrl+Q"))
        self.exitAct.setStatusTip(self.tr("Exit the application"))
        self.connect(self.exitAct, QtCore.SIGNAL("triggered()"), self, QtCore.SLOT("close()"))

        self.aboutAct = QtGui.QAction(self.tr("&About"), self)
        self.aboutAct.setStatusTip(self.tr("Show the application's About box"))
        self.connect(self.aboutAct, QtCore.SIGNAL("triggered()"), self.about)

        self.aboutQtAct = QtGui.QAction(self.tr("About &Qt"), self)
        self.aboutQtAct.setStatusTip(self.tr("Show the Qt library's About box"))
        self.connect(self.aboutQtAct, QtCore.SIGNAL("triggered()"), QtGui.qApp, QtCore.SLOT("aboutQt()"))

    def createMenus(self):
        self.fileMenu = self.menuBar().addMenu(self.tr("&File"))
        self.fileMenu.addAction(self.openAct)
        self.fileMenu.addAction(self.saveAct)
        # self.fileMenu.addAction(self.saveAsAct)
        self.fileMenu.addSeparator()
        self.fileMenu.addAction(self.exitAct)

        self.menuBar().addSeparator()

        self.helpMenu = self.menuBar().addMenu(self.tr("&Help"))
        self.helpMenu.addAction(self.aboutAct)
        self.helpMenu.addAction(self.aboutQtAct)

    def createToolBars(self):
        self.fileToolBar = self.addToolBar(self.tr("File"))
        self.fileToolBar.addAction(self.openAct)
        self.fileToolBar.addAction(self.saveAct)

        self.attachCombo = QtGui.QComboBox()
        self.attachCombo.addItem("No attachment")  #0
        self.attachCombo.addItem("Amphitelic attachment") #1
        self.attachCombo.addItem("Merotelic attachment")  #2
        self.attachCombo.addItem("Syntelic attachment")  #3
        self.attachCombo.addItem("Monotelic attachment")  #4
        self.attachCombo.addItem("Random attachment")  #5

        self.configToolBar = self.addToolBar(self.tr("config"))
        self.configToolBar.addWidget(self.attachCombo)

        self.attachment_list = ['null',
                                'amphitelic',
                                'merotelic',
                                'syntelic',
                                'monotelic',
                                'random']
        self.attachCombo.setCurrentIndex(5)

    def createStatusBar(self):
        self.statusBar().showMessage(self.tr("Ready"))

    def maybeSave(self):
        if self.setParameters.isModified:
            ret = QtGui.QMessageBox.warning(self, self.tr("Application"),
                        self.tr("The document has been modified.\n"
                                "Do you want to save your changes?"),
                        QtGui.QMessageBox.Yes | QtGui.QMessageBox.Default,
                        QtGui.QMessageBox.No,
                        QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Escape)
            if ret == QtGui.QMessageBox.Yes:
                return self.save()
            elif ret == QtGui.QMessageBox.Cancel:
                return False
        return True

    def loadFile(self, fileName):

        QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
        self.prepare_simulation()
        tmp_m = get_fromfile(str(fileName))
        self.paramtree = tmp_m.paramtree
        self.measuretree = tmp_m.measuretree

        self.removeDockWidget(self.paramdock)
        del self.paramdock
        self.removeDockWidget(self.measuredock)
        del self.measuredock
        self.create_docks()
        self.prepare_simulation()
        self.mt = SigMetaphase(tmp_m.paramtree, tmp_m.measuretree)
        self.mt.KD = tmp_m.KD
        del tmp_m
        self.mt.emit(QtCore.SIGNAL('simulDone'),self.mt.report)

        QtGui.QApplication.restoreOverrideCursor()

        self.setCurrentFile(fileName)
        self.statusBar().showMessage(self.tr("Loaded"), 2000)


    def saveFile(self, fileName):

        if not fileName.endsWith('.xml'):
            xmlfname = fileName+'.xml'
            datafname = fileName+'_data.npy'
        else:
            xmlfname = fileName
            datafname = fileName.split('.')[-2]+'_data.npy'

        self.mt.write_results(str(xmlfname), str(datafname))

        self.setCurrentFile(fileName);
        self.statusBar().showMessage(self.tr("File saved"), 2000)
        return True

    def setCurrentFile(self, fileName):

        self.curFile = fileName
        self.setParameters.setModified(False)
        self.setWindowModified(False)

    def strippedName(self, fullFileName):
        return QtCore.QFileInfo(fullFileName).fileName()