Example #1
0
    def loadFile(self, fileName):
        file = QFile(fileName)
        if not file.open(QFile.ReadOnly):
            mb = QMessageBox(self)
            mb.setTextFormat(Qt.RichText)
            mb.setText("<p style='font-size: 18pt'>File opening error</p>"
                "<p style='font-size: 14pt; font-weight: normal'> Unable to open file <i>{}</i>.<br><br>File error was: \"{}\".</p>".format(fileName, file.errorString()))
            mb.setIcon(QMessageBox.Warning)
            mb.exec()
            return

        inf = QTextStream(file)
        QApplication.setOverrideCursor(Qt.WaitCursor)
        QApplication.processEvents()
        Line1=inf.readLine()
        if Line1.startswith(">"):
            readOK=self.read_seq(fileName, "fasta")
        elif Line1.upper().startswith("CLUSTAL"):
            readOK=self.read_seq(fileName, "clustal")
        elif Line1.upper().startswith("#NEXUS"):
            readOK=self.read_seq(fileName, "nexus")
        elif Line1.upper().find("STOCKHOLM") > -1:
            readOK=self.read_seq(fileName, "stockholm")
        elif Line1.upper().find("MULTIPLE_ALIGNMENT") > -1 or Line1.upper().find("PILEUP") > -1:
            readOK=self.read_seq(fileName, "msf")
        elif len([int(i) for i in Line1.split() if i.isdigit()]) == 2:
            readOK=self.read_seq(fileName, "phylip-relaxed")
        else:
            QApplication.restoreOverrideCursor()
            mb = QMessageBox(self)
            mb.setTextFormat(Qt.RichText)
            mb.setText("<p style='font-size: 18pt'>Alignment file error</p>"
                "<p style='font-size: 14pt; font-weight: normal'> Sorry, I don't recognise the format of file:<br><i>{}</i></p>".format(fileName))
            mb.setIcon(QMessageBox.Warning)
            mb.exec()
            file.close()
            return
        if not readOK: # If there was an error in read_seq, the cursor has already been reset
            file.close()
            return

        self.seqs = np.array([list(rec.upper()) for rec in self.al], str, order="F")
        self.seqnames = [rec.id for rec in self.al]
        self.al = []
# release the memory used by the BioPython construct, not needed now.
# now that I know how big an alignment I have, I redefine the space taken up by the various arrays
        self.no_seqs = self.seqs.shape[0]
        self.maxseqlen = self.seqs.shape[1]
        mbflag=False
        if self.no_seqs*self.maxseqlen >50000:
            mb = QMessageBox(self)
            mb.setAttribute(Qt.WA_DeleteOnClose)
            mb.setTextFormat(Qt.RichText)
            mb.setText("<p style='font-size: 18pt'>Large file warning</p>"
                       "<p style='font-size: 14pt; font-weight: normal'> OK, that's a big alignment!<br>"
                       "Be aware that processing the alignment and preparing images/files will take more than a few seconds \U0001F609.<br>"
                       "Working.....</p>")
            mb.setIcon(QMessageBox.Information)
            mb.setStandardButtons(QMessageBox.NoButton)
            mb.setWindowModality(Qt.NonModal)
            mbflag=True
            mb.show()
            app.processEvents()
        if system() == "Darwin":
            BS.monofont.setPointSize(14)
        else:
            BS.monofont.setPointSize(12)
        BS.monofont.setWeight(QFont.Normal)
        self.textEdit.setFont(BS.monofont)
        inf.seek(0)
        self.textEdit.setPlainText(inf.readAll())
        file.close()
        self.cols = np.full(self.seqs.shape, 0, dtype=np.int32)
        self.cons = np.full(self.maxseqlen, ' ', dtype=str)
        self.conschar = np.copy(self.cons)
        self.seqlens = np.full(self.no_seqs, self.maxseqlen, dtype=np.int32)
        self.startnums = np.full(self.no_seqs, 1, dtype=np.int64) # a newly loaded file has all startnums set to 1 by default
#
#set consensus length = length of longest sequence (not counting dots,
#spaces, etc. at the "far" end. May be a problem here for some strange cases
        self.consenslen = 0
        for i in range(0,self.no_seqs):
            while self.seqlens[i] and (self.seqs[i, self.seqlens[i] - 1] in [' ', '-', '.']):
                self.seqlens[i] -= 1
            if self.seqlens[i] > self.consenslen:
                self.consenslen = self.seqlens[i]
        self.setCurrentFile(fileName)
        QApplication.restoreOverrideCursor()
        self.process_seqs()

        if mbflag:
            mb.done(1)
        self.statusBar().showMessage("File loaded", 2000)
        return # from load_file
Example #2
0
class LogsReadThread(QThread):
    MAX_INITIAL_SIZE = 2*1024*1024 # 2Mb

    updateLogs = pyqtSignal()

    def __init__(self, parent):
        QThread.__init__(self, parent)

        self.fCloseNow   = False
        self.fPurgeLogs  = False
        self.fRealParent = parent

        # -------------------------------------------------------------
        # Take some values from Logs Window

        self.LOG_FILE_JACK   = LogsW.LOG_FILE_JACK
        self.LOG_FILE_A2J    = LogsW.LOG_FILE_A2J
        self.LOG_FILE_LASH   = LogsW.LOG_FILE_LASH
        self.LOG_FILE_LADISH = LogsW.LOG_FILE_LADISH

        # -------------------------------------------------------------
        # Init logs

        if self.LOG_FILE_JACK is not None:
            self.fLogFileJACK = QFile(self.LOG_FILE_JACK)
            self.fLogFileJACK.open(QIODevice.ReadOnly)
            self.fLogStreamJACK = QTextStream(self.fLogFileJACK)
            self.fLogStreamJACK.setCodec("UTF-8")

            if self.fLogFileJACK.size() > self.MAX_INITIAL_SIZE:
                self.fLogStreamJACK.seek(self.fLogFileJACK.size() - self.MAX_INITIAL_SIZE)

        if self.LOG_FILE_A2J is not None:
            self.fLogFileA2J = QFile(self.LOG_FILE_A2J)
            self.fLogFileA2J.open(QIODevice.ReadOnly)
            self.fLogStreamA2J = QTextStream(self.fLogFileA2J)
            self.fLogStreamA2J.setCodec("UTF-8")

            if self.fLogFileA2J.size() > self.MAX_INITIAL_SIZE:
                self.fLogStreamA2J.seek(self.fLogFileA2J.size() - self.MAX_INITIAL_SIZE)

        if self.LOG_FILE_LASH is not None:
            self.fLogFileLASH = QFile(self.LOG_FILE_LASH)
            self.fLogFileLASH.open(QIODevice.ReadOnly)
            self.fLogStreamLASH = QTextStream(self.fLogFileLASH)
            self.fLogStreamLASH.setCodec("UTF-8")

            if self.fLogFileLASH.size() > self.MAX_INITIAL_SIZE:
                self.fLogStreamLASH.seek(self.fLogFileLASH.size() - self.MAX_INITIAL_SIZE)

        if self.LOG_FILE_LADISH is not None:
            self.fLogFileLADISH = QFile(self.LOG_FILE_LADISH)
            self.fLogFileLADISH.open(QIODevice.ReadOnly)
            self.fLogStreamLADISH = QTextStream(self.fLogFileLADISH)
            self.fLogStreamLADISH.setCodec("UTF-8")

            if self.fLogFileLADISH.size() > self.MAX_INITIAL_SIZE:
                self.fLogStreamLADISH.seek(self.fLogFileLADISH.size() - self.MAX_INITIAL_SIZE)

    def closeNow(self):
        self.fCloseNow = True

    def purgeLogs(self):
        self.fPurgeLogs = True

    def run(self):
        # -------------------------------------------------------------
        # Read logs and set text in main thread

        while not self.fCloseNow:
            if self.fPurgeLogs:
                if self.LOG_FILE_JACK:
                    self.fLogStreamJACK.flush()
                    self.fLogFileJACK.close()
                    self.fLogFileJACK.open(QIODevice.WriteOnly)
                    self.fLogFileJACK.close()
                    self.fLogFileJACK.open(QIODevice.ReadOnly)

                if self.LOG_FILE_A2J:
                    self.fLogStreamA2J.flush()
                    self.fLogFileA2J.close()
                    self.fLogFileA2J.open(QIODevice.WriteOnly)
                    self.fLogFileA2J.close()
                    self.fLogFileA2J.open(QIODevice.ReadOnly)

                if self.LOG_FILE_LASH:
                    self.fLogStreamLASH.flush()
                    self.fLogFileLASH.close()
                    self.fLogFileLASH.open(QIODevice.WriteOnly)
                    self.fLogFileLASH.close()
                    self.fLogFileLASH.open(QIODevice.ReadOnly)

                if self.LOG_FILE_LADISH:
                    self.fLogStreamLADISH.flush()
                    self.fLogFileLADISH.close()
                    self.fLogFileLADISH.open(QIODevice.WriteOnly)
                    self.fLogFileLADISH.close()
                    self.fLogFileLADISH.open(QIODevice.ReadOnly)

                self.fPurgeLogs = False

            else:
                if self.LOG_FILE_JACK:
                    textJACK = fixLogText(self.fLogStreamJACK.readAll()).strip()
                else:
                    textJACK = ""

                if self.LOG_FILE_A2J:
                    textA2J = fixLogText(self.fLogStreamA2J.readAll()).strip()
                else:
                    textA2J = ""

                if self.LOG_FILE_LASH:
                    textLASH = fixLogText(self.fLogStreamLASH.readAll()).strip()
                else:
                    textLASH = ""

                if self.LOG_FILE_LADISH:
                    textLADISH = fixLogText(self.fLogStreamLADISH.readAll()).strip()
                else:
                    textLADISH = ""

                self.fRealParent.setLogsText(textJACK, textA2J, textLASH, textLADISH)
                self.updateLogs.emit()

            if not self.fCloseNow:
                self.sleep(1)

        # -------------------------------------------------------------
        # Close logs before closing thread

        if self.LOG_FILE_JACK:
            self.fLogFileJACK.close()

        if self.LOG_FILE_A2J:
            self.fLogFileA2J.close()

        if self.LOG_FILE_LASH:
            self.fLogFileLASH.close()

        if self.LOG_FILE_LADISH:
            self.fLogFileLADISH.close()
Example #3
0
    def loadFile(self, fileName):
        file = QFile(fileName)
        if not file.open(QFile.ReadOnly):
            QMessageBox.warning(
                self, "Application",
                "Cannot read file %s:\n%s." % (fileName, file.errorString()))
            return

        inf = QTextStream(file)
        QApplication.setOverrideCursor(Qt.WaitCursor)

        BS.monofont.setPointSize(14)
        BS.monofont.setWeight(QFont.Normal)
        self.textEdit.setFont(BS.monofont)
        self.textEdit.setPlainText(inf.readAll())
        inf.seek(0)
        Line1 = inf.readLine()
        file.close()
        if Line1.startswith(">"):
            self.read_seq(fileName, "fasta")
        elif Line1.upper().startswith("CLUSTAL"):
            self.read_seq(fileName, "clustal")
        elif Line1.upper().startswith("#NEXUS"):
            self.read_seq(fileName, "nexus")
        elif Line1.upper().find("STOCKHOLM") > -1:
            self.read_seq(fileName, "stockholm")
        elif Line1.upper().find("MULTIPLE_ALIGNMENT") > -1 or Line1.upper(
        ).find("PILEUP") > -1:
            self.read_seq(fileName, "msf")
        elif len([int(i) for i in Line1.split() if i.isdigit()]) == 2:
            self.read_seq(fileName, "phylip-relaxed")
        else:
            QMessageBox.warning(
                self, "Application",
                "Cannot extract alignment from file %s" % fileName)
            QApplication.restoreOverrideCursor()
            return
        self.seqs = np.array([list(rec) for rec in self.al],
                             np.unicode,
                             order="F")
        self.seqnames = [rec.id for rec in self.al]
        self.al = [
        ]  # release the memory used by the BioPython construct, not needed now.
        # now that I know how big an alignment I have, I redefine the space taken up by the various arrays
        self.no_seqs = self.seqs.shape[0]
        self.maxseqlen = self.seqs.shape[1]
        self.cols = np.full(self.seqs.shape, 0, dtype=np.int32)
        self.cons = np.full(self.maxseqlen, ' ', dtype=np.unicode)
        self.conschar = np.copy(self.cons)
        self.seqlens = np.full(self.no_seqs, self.maxseqlen, dtype=np.int32)
        self.startnums = np.full(
            self.no_seqs, 1, dtype=np.int64
        )  # a newly loaded file has all startnums set to 1 by default
        #
        #set consensus length = length of longest sequence (not counting dots,
        #spaces, etc. at the "far" end. May be a problem here for some strange cases
        self.consenslen = 0
        for i in range(0, self.no_seqs):
            while self.seqs[i, self.seqlens[i] - 1] in [' ', '-', '.']:
                self.seqlens[i] -= 1
            if self.seqlens[i] > self.consenslen:
                self.consenslen = self.seqlens[i]
        self.setCurrentFile(fileName)
        self.statusBar().showMessage("File loaded", 2000)
        self.process_seqs()
        QApplication.restoreOverrideCursor()
        return  # from load_file