Skip to content

Commit

Permalink
fixed output
Browse files Browse the repository at this point in the history
  • Loading branch information
lmdu committed Nov 17, 2024
1 parent eb2575f commit c8e5a78
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 83 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,6 @@ data/dd3.html
data/dd3.kpf
data/GCF_000001635.27_GRCm39_genomic.fna.gz.fxi

data/ddd.tsv
data/ddd.gff
data/ddd.fasta
11 changes: 8 additions & 3 deletions src/backend.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import apsw
import threading

from PySide6.QtCore import *

__all__ = ['DB']

FASTX_TABLE_SQL = """
Expand Down Expand Up @@ -160,11 +162,11 @@ def row_factory(cursor, row):
fields = [name for name, _ in cursor.getdescription()]
return DataRow(zip(fields, row))

class DataBackend:
class DataBackend(QObject):
conn = None

def __init__(self):
self.lock = threading.Lock()
self.mutex = QMutex()
self._connect_to_db()

def __del__(self):
Expand All @@ -179,7 +181,10 @@ def __del__(self):

@property
def cursor(self):
return self.conn.cursor()
self.mutex.lock()
cur = self.conn.cursor()
self.mutex.unlock()
return cur

def _optimize(self):
self.query("PRAGMA synchronous=OFF")
Expand Down
2 changes: 1 addition & 1 deletion src/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

KRAIT_VERSION = "2.0.1"

KRAIT_BUILD = "20241113"
KRAIT_BUILD = "20241118"

KRAIT_CITATION = """
Expand Down
8 changes: 4 additions & 4 deletions src/window.py
Original file line number Diff line number Diff line change
Expand Up @@ -887,8 +887,8 @@ def export_selected_rows(self):
if table is None:
return

if out_file.endswith(['.gff', '.fasta']):
if table.startswith(['ssr', 'issr', 'cssr', 'gtr']):
if out_file.endswith(('.gff', '.fasta')):
if not table.startswith(('ssr', 'issr', 'cssr', 'gtr')):
error = "The selected rows do not support for exporting as this format"
return QMessageBox.warning(self, "Warning", error)

Expand All @@ -906,8 +906,8 @@ def export_current_table(self):
if table is None:
return

if out_file.endswith(['.gff', '.fasta']):
if table.startswith(['ssr', 'issr', 'cssr', 'gtr']):
if out_file.endswith(('.gff', '.fasta')):
if not table.startswith(('ssr', 'issr', 'cssr', 'gtr')):
error = "The selected rows do not support for exporting as this format"
return QMessageBox.warning(self, "Warning", error)

Expand Down
231 changes: 156 additions & 75 deletions src/workers.py
Original file line number Diff line number Diff line change
Expand Up @@ -521,7 +521,7 @@ def __init__(self, parent=None, export_dest=None):
self.signals = KraitWorkerSignals()

def format_to_gff(self, feature, title, data):
fid = "ID={}{}".fomrat(feature.upper(), data[0])
fid = "ID={}{}".format(feature.upper(), data[0])
attrs = [fid]

for i, d in enumerate(data):
Expand All @@ -541,68 +541,21 @@ def format_to_seq(self, seq, line_len=80):

return ''.join(bases)

def export_to_table(self, table, title, sender, total):
processed = 0
progress = 0

if self.export_dest.endswith('.csv'):
separator = ','
else:
separator = '\t'

with open(self.export_dest, 'w', newline='') as fw:
writer = csv.writer(fw, delimiter=separator)

def export_to_table(self, writer, table, title, rows):
if self.export_dest.endswith('.gff'):
writer.writerow(["##gff-version 3"])

for rows in selected:
for row in rows:
row = self.format_to_gff(table.upper(), title, row)
writer.writerow(row)

processed += len(rows)
p = int(processed/total*100)
if p > progress:
self.signals.progress.emit(p)
progress = p
for row in rows:
row = self.format_to_gff(table.split('_')[0].upper(), title, row)
writer.writerow(row)

else:
writer.writerow(title)

for rows in selected:
for row in rows:
writer.writerow(row)

processed += len(rows)
p = int(processed/total*100)
if p > progress:
self.signals.progress.emit(p)
progress = p
for row in rows:
writer.writerow(row)

def export_to_fasta(self, table, sender, total):
cfile = self.parent.current_file

if not cfile:
return

settings = QSettings()
flank = settings.value('STR/flank', KRAIT_SEARCH_PARAMETERS['STR/flank'], int)

sql = "SELECT fpath,format FROM fastx WHERE id=? LIMIT 1"
file = DB.get_object(sql, (cfile))

if file.format == 'fastq':
fx = pyfastx.Fastq(file.fpath)
else:
fx = pyfastx.Fasta(file.fpath)

processed = 0
progress = 0
chrom = None
seq = None

with open(self.export_dest, 'w', newline='') as fw:
with open(self.export_dest, 'w') as fw:
for rows in sender:
for row in rows:
if chrom != row[1]:
Expand All @@ -617,10 +570,10 @@ def export_to_fasta(self, table, sender, total):
rep_seq = seq[start-1:end]
rep_seq = self.format_to_seq(rep_seq)
rep_rec = ">{}{} {}:{}-{}|flank_len={}\n{}\n".format(
table.upper(), row[1], row[2], row[3], flank, rep_seq.strip()
table.split('_')[0].upper(), row[0], row[1], row[2], row[3], flank, rep_seq.strip()
)

print(fw, rep_rec)
fw.write(rep_rec)

processed += len(rows)
p = int(processed/total*100)
Expand Down Expand Up @@ -688,47 +641,175 @@ def do(self):

class KraitExportSelectedWorker(KraitExportWorker):
def do(self):
processed = 0
progress = 0

table, total, selected = self.parent.get_selected_rows()
table = self.parent.get_current_table()

fw = open(self.export_dest, 'w', newline='')

if self.export_dest.endswith('.fasta'):
self.export_to_fasta(table, selected, total)
writer = fw
cfile = self.parent.current_file
if not cfile:
return

settings = QSettings()
flank = settings.value('STR/flank', KRAIT_SEARCH_PARAMETERS['STR/flank'], int)

sql = "SELECT fpath,format FROM fastx WHERE id=? LIMIT 1"
file = DB.get_object(sql, (cfile,))

if file.format == 'fastq':
fx = pyfastx.Fastq(file.fpath)
else:
fx = pyfastx.Fasta(file.fpath, uppercase=True)

chrom = None
seq = None

for rows in selected:
for row in rows:
if chrom != row[1]:
chrom = row[1]
seq = fx[row[1]].seq

start = row[2] - flank
if start < 1:
start = 1

end = row[3] + flank
rep_seq = seq[start-1:end]
rep_seq = self.format_to_seq(rep_seq)
rep_rec = ">{}{} {}:{}-{}|flank_len={}\n{}\n".format(
table.split('_')[0].upper(), row[0], row[1], row[2], row[3], flank, rep_seq.strip()
)

writer.write(rep_rec)

processed += len(rows)
p = int(processed/total*100)
if p > progress:
self.signals.progress.emit(p)
progress = p

else:
if self.export_dest.endswith('.csv'):
separator = ','
else:
separator = '\t'

title = DB.get_field(table)
self.export_to_table(table, title, selected, total)

writer = csv.writer(fw, delimiter=separator)

for rows in selected:
if self.export_dest.endswith('.gff'):
for row in rows:
row = self.format_to_gff(table.split('_')[0].upper(), title, row)
writer.writerow(row)

else:
for row in rows:
writer.writerow(row)

processed += len(rows)
p = int(processed/total*100)
if p > progress:
self.signals.progress.emit(p)
progress = p

fw.close()
self.signals.messages.emit("Successfully exported {} selected rows to {}".format(total, self.export_dest))

class KraitExportCurrentTableWorker(KraitExportWorker):
def do(self):
processed = 0
progress = 0
table = self.parent.get_current_table()
total = DB.get_one("SELECT COUNT(1) FROM {}".format(table))
rows = DB.query("SELECT * FROM {}".format(table))
fw = open(self.export_dest, 'w', newline='')

if self.export_dest.endswith('.fasta'):
writer = fw
cfile = self.parent.current_file
if not cfile:
return

selected = []
for row in DB.query("SELECT * FROM {}".format(table)):
selected.append(row)
settings = QSettings()
flank = settings.value('STR/flank', KRAIT_SEARCH_PARAMETERS['STR/flank'], int)

if len(selected) == 100:
if self.export_dest.endswith('.fasta'):
self.export_to_fasta(table, selected, total)
sql = "SELECT fpath,format FROM fastx WHERE id=? LIMIT 1"
file = DB.get_object(sql, (cfile,))

else:
title = DB.get_field(table)
self.export_to_table(table, title, selected, total)
if file.format == 'fastq':
fx = pyfastx.Fastq(file.fpath)
else:
fx = pyfastx.Fasta(file.fpath, uppercase=True)

chrom = None
seq = None

for row in rows:
if chrom != row[1]:
chrom = row[1]
seq = fx[row[1]].seq

start = row[2] - flank
if start < 1:
start = 1

selected = []
end = row[3] + flank
rep_seq = seq[start-1:end]
rep_seq = self.format_to_seq(rep_seq)
rep_rec = ">{}{} {}:{}-{}|flank_len={}\n{}\n".format(
table.split('_')[0].upper(), row[0], row[1], row[2], row[3], flank, rep_seq.strip()
)

if selected
if self.export_dest.endswith('.fasta'):
self.export_to_fasta(table, selected, total)
writer.write(rep_rec)

processed += 1
p = int(processed/total*100)
if p > progress:
self.signals.progress.emit(p)
progress = p

else:
if self.export_dest.endswith('.csv'):
separator = ','
else:
title = DB.get_field(table)
self.export_to_table(table, title, selected, total)
separator = '\t'

self.signals.messages.emit("Successfully exported to {}".format(self.export_dest))
title = DB.get_field(table)

writer = csv.writer(fw, delimiter=separator)


if self.export_dest.endswith('.gff'):
for row in rows:
row = self.format_to_gff(table.split('_')[0].upper(), title, row)
writer.writerow(row)

processed += 1
p = int(processed/total*100)
if p > progress:
self.signals.progress.emit(p)
progress = p

else:
for row in rows:
writer.writerow(row)

processed += 1
p = int(processed/total*100)
if p > progress:
self.signals.progress.emit(p)
progress = p

fw.close()
self.signals.messages.emit("Successfully exported to {}".format(self.export_dest))

class KraitExportAllTablesWorker(KraitExportWorker):
def __init__(self, parent, export_tables, export_format, export_dest):
Expand Down

0 comments on commit c8e5a78

Please sign in to comment.