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
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()
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