drltools.py 19.8 KB
Newer Older
Yan's avatar
Yan committed
1
2
3
4
5
#!/usr/bin/env python3
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
from PyQt5 import QtCore
from PyQt5 import QtWidgets
6
from PyQt5 import QtGui
Yan's avatar
Yan committed
7
from PyQt5 import QtPrintSupport
Yan's avatar
Yan committed
8
9
import matplotlib
import numpy as np
Yan's avatar
Yan committed
10
11
import prasopes.datatools as dt
import prasopes.graphtools as gt
Yan's avatar
Yan committed
12
import prasopes.filetools as ft
Yan's avatar
Yan committed
13
import os.path
Yan's avatar
Yan committed
14
15
matplotlib.use("Qt5Agg")

Yan's avatar
Yan committed
16

Yan's avatar
Yan committed
17
class HBar(QtWidgets.QFrame):
18
    """horizontal bar class"""
Yan's avatar
Yan committed
19
20
21
22
23
24
    def __init__(self):
        super(HBar, self).__init__()
        self._main = QtWidgets.QWidget()
        self.setFrameShape(QtWidgets.QFrame.HLine)


25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
def floatize(table, row, column):
    """grabs the tableWidgetItem and transforms its text safely to
    float, if the text is not acceptable as float, returns zero"""
    imptext = table.item(row, column).text()
    validator = QtGui.QDoubleValidator()
    validator.setBottom(0)
    status = validator.validate(imptext, 0)[0]
    if status == QtGui.QValidator.Acceptable:
        outfloat = float(imptext)
    else:
        outfloat = 0
    return outfloat


def update_profile(pt, row, dataset):
40
    """spectrum updating procedure"""
Yan's avatar
Yan committed
41
42
    # Dont do anything to graph when the spectrum is not populated
    if isinstance(dataset['masses'], type(None)):
43
44
        return

45
    spectrum = pt.cellWidget(row, 3).figure.get_axes()[0]
Yan's avatar
Yan committed
46
    masses = dataset['masses']
47
48
    massargs = dt.argsubselect(
        masses, floatize(pt, row, 1), floatize(pt, row, 2))
49
    yshape = np.mean(dataset['matrix'], axis=0)
Yan's avatar
Yan committed
50
    spectrum.clear()
51
52
53
    spectrum.plot(masses, yshape, ':', color='gray')
    spectrum.plot(masses[massargs], yshape[massargs], 'r')
    xex = max((masses[massargs[-1]]-masses[massargs[0]])*0.25, 0.20)
Yan's avatar
Yan committed
54
55
56
    spectrum.set_xlim(masses[massargs[0]]-xex,
                      masses[massargs[-1]]+xex)
    ymax = max(yshape[massargs])
57
58
59
    spectrum.set_ylim(ymax*-0.1, ymax*1.2)
    spectrum.figure.canvas.draw()

Yan's avatar
Yan committed
60

Yan's avatar
Yan committed
61
62
63
64
65
66
67
68
69
def get_intensity(row, ptable, dtable, ds):
    startm = floatize(ptable, row, 1)
    endm = floatize(ptable, row, 2)
    massargs = dt.argsubselect(ds['masses'], startm, endm)
    intensity = (np.sum(
        ds['matrix'].T[massargs].T, axis=1)) / ds['chrom_dat'][1]
    return intensity


Yan's avatar
Yan committed
70
def get_daughterset(ptable, dtable, ds):
Yan's avatar
Yan committed
71
    # TODO: write a less resources demanding function - probably "per-line"
Yan's avatar
Yan committed
72
    names = []
Yan's avatar
Yan committed
73
    times = ds['chrom_dat'][0, :]
Yan's avatar
Yan committed
74
    intensities = []
Yan's avatar
Yan committed
75
    # TODO: resolve intensities trouble
Yan's avatar
Yan committed
76
    for row in range(dtable.rowCount()):
Yan's avatar
Yan committed
77
        if dtable.cellWidget(row, 0).checkState() == 2:
Yan's avatar
Yan committed
78
            intensity = get_intensity(row, ptable, dtable, ds)
79
80
            cor = dtable.cellWidget(row, 1).currentIndex() - 1
            # TODO: check if cor still produce the mess or it started to behave
81
            # testing in this alpha stage
82
            if cor not in (-2, -1):
83
                factor = floatize(dtable, row, 2)
Yan's avatar
Yan committed
84
85
                correction = get_intensity(cor, ptable, dtable, ds)\
                    * factor
Yan's avatar
Yan committed
86
                intensity = intensity - correction
Yan's avatar
Yan committed
87
            intensities.append(intensity)
Yan's avatar
Yan committed
88
89
90
91
            names.append("{} - {} * {}".format(
                dtable.item(row, 0).text(),
                dtable.item(row,2).text(),
                dtable.cellWidget(row,1).currentText()))
Yan's avatar
Yan committed
92
93
94
    return names, times, intensities


95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
def get_parentset(ptable, dtable, ds):
    names = []
    times = ds['chrom_dat'][0, :]
    intensities = []
    # TODO: resolve intensities trouble
    rowlist = []
    for row in range(dtable.rowCount()):
        if dtable.cellWidget(row, 0).checkState() == 2:
            rowlist.append(row)
            if dtable.cellWidget(row, 1).currentIndex() > 0\
                    and floatize(dtable, row, 2) != 0:
                rowlist.append(
                    dtable.cellWidget(row, 1).currentIndex()-1)
    for row in set(rowlist):
            intensity = get_intensity(row, ptable, dtable, ds)
            intensities.append(intensity)
            names.append(dtable.item(row, 0).text())
    return names, times, intensities


Yan's avatar
Yan committed
115
def update_drlspectrum(ptable, dtable, ds, drlspectrum):
116
    # Dont do anything when the dataset is not populated
Yan's avatar
Yan committed
117
    if isinstance(ds['masses'], type(None)):
Yan's avatar
Yan committed
118
        return
119
    colors = np.array([[0, 0, 0], [255, 0, 0], [0, 255, 0], [0, 0, 255],
120
121
122
                       [0, 200, 255], [255, 200, 0], [255, 100, 0],
                       [200, 50, 0], [255, 0, 200], [0, 100, 0],
                       [0, 100, 255], [100, 100, 100]])
Yan's avatar
Yan committed
123

124
    # TODO: write a less resources demanding function
Yan's avatar
Yan committed
125
126
127
    names, times, intensities = get_daughterset(ptable, dtable, ds)
    for i in range(len(drlspectrum.lines)):
        drlspectrum.lines[0].remove()
128

129
    i = 0
130
    for row in range(dtable.rowCount()):
Yan's avatar
Yan committed
131
        if dtable.cellWidget(row, 0).checkState() == 2:
132
            dtable.blockSignals(True)
Yan's avatar
Yan committed
133
            dtable.item(row, 0).setBackground(QtGui.QBrush(
134
                QtGui.QColor(*colors[row % len(colors)], alpha=50)))
135
136
            dtable.blockSignals(False)
            label = " {}".format(ptable.item(row, 0).text())
137
138
139
            drlspectrum.plot(times, intensities[i], label=label,
                             color=(colors[row % len(colors)] / 255))
            i += 1
140
        else:
Yan's avatar
Yan committed
141
            dtable.item(row, 0).setBackground(QtGui.QBrush())
142

143
144
145
146
    if len(names) != 0:
        drlspectrum.set_ylim(top=np.amax(intensities)*1.1,
                             bottom=np.amax(intensities)*-0.01)
        drlspectrum.legend(loc=2)
147
148
    drlspectrum.figure.canvas.draw()

Yan's avatar
Yan committed
149

Yan's avatar
Yan committed
150
def gettableitemlist(ptable):
151
    ion_list = []
Yan's avatar
Yan committed
152
153
154
    for row in range(ptable.rowCount()):
        text = []
        for i in range(3):
155
156
            if not isinstance(ptable.item(row, i), type(None)):
                frg = ptable.item(row, i).text()
Yan's avatar
Yan committed
157
158
159
160
161
            else:
                frg = ""
            text.append(frg)
        line = "{} ({}-{})".format(*text)
        ion_list.append(line)
162
163
164
    return ion_list


165
166
167
168
169
170
171
172
173
174
175
176
def update_corrfors(ptable, dtable):
    """update corrections selection layout of the daughter table"""
    ionlist = gettableitemlist(ptable)
    for row in range(dtable.rowCount()):
        corfor = dtable.cellWidget(row, 1)
        index = corfor.currentIndex()
        corfor.blockSignals(True)
        corfor.clear()
        corfor.addItem("")
        corfor.addItems(ionlist)
        corfor.setCurrentIndex(index)
        corfor.blockSignals(False)
Yan's avatar
Yan committed
177

178

Yan's avatar
Yan committed
179
180
def ptable_changed(row, column, ptable, dtable, ds, drlspectrum,
                   addline=True):
181
182
183
184
185
    """routine called by change of the ptable spectra"""
    update_corrfors(ptable, dtable)
    dtable.item(row, 0).setText(gettableitemlist(ptable)[row])
    if column in (1, 2):
        update_profile(ptable, row, ds)
Yan's avatar
Yan committed
186
187
    if row == ptable.rowCount() - 1 and addline == True:
        add_line(ds, ptable, dtable, drlspectrum)
188

189

190
191
192
193
194
195
196
def dtable_changed(row, column, ptable, dtable, ds, drlspectrum):
    """routine called by change of the dtable spectra"""
    if dtable.cellWidget(row, 0).checkState() == 2:
        if (column == 0)\
           or (column == 2
               and dtable.cellWidget(row, 1).currentIndex() != 0):
                update_drlspectrum(ptable, dtable, ds, drlspectrum)
197

Yan's avatar
Yan committed
198

199
200
201
202
203
def corr_changed(row, ptable, dtable, ds, drlspectrum):
    """routine called by change of correction for ion"""
    if (dtable.cellWidget(row, 0).checkState() == 2
       and floatize(dtable, row, 2) != 0):
        update_drlspectrum(ptable, dtable, ds, drlspectrum)
204
205


206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
def delete_row(row, ptable, dtable, ds, drlspectrum):
    dtable.cellWidget(row,0).setCheckState(0)
    dtable.removeRow(row)
    ptable.removeRow(row)
    for i in range(dtable.rowCount()):
        corfor = dtable.cellWidget(i, 1)
        corfor.disconnect()
        index = corfor.currentIndex()
        corfor.clear()
        corfor.addItem("")
        corfor.addItems(gettableitemlist(ptable))
        if index == row+1:
            corfor.setCurrentIndex(0)
            corr_changed(i, ptable, dtable, ds, drlspectrum)
        elif index > row+1:
            corfor.setCurrentIndex(index-1)
        else:
            corfor.setCurrentIndex(index)
        corfor.currentIndexChanged.connect(lambda: corr_changed(
            i, ptable, dtable, ds, drlspectrum))


228
def remove_rows(ptable, dtable, ds, drlspectrum):
Yan's avatar
Yan committed
229
    # TODO: maybe nicer selection in future, but this works for now
230
    rows = reversed(list(set(
Yan's avatar
Yan committed
231
        map(lambda x: x.row(), ptable.selectedIndexes()))))
232
    for row in rows:
233
        delete_row(row, ptable, dtable, ds, drlspectrum)
234
235


Yan's avatar
Yan committed
236
def add_line(ds, parenttable, daughtertable, drlspectrum):
237
    """add parent ion to the table"""
238
239
240
241
242
243
244
245
246
247
248
249
    newrow = parenttable.rowCount()

    parenttable.blockSignals(True)
    daughtertable.blockSignals(True)

    parenttable.setRowCount(newrow + 1)
    for i in range(3):
        parenttable.setItem(newrow, i, QtWidgets.QTableWidgetItem())
        if newrow is not 0:
            parenttable.item(newrow, i).setText(str(floatize(
                    parenttable, newrow-1, i)+1))

250
    ion_graph = Figure(figsize=(3, 1.5), dpi=100, facecolor="None")
251
252
    ion_graph.add_subplot(111, facecolor=(1, 1, 1, 0.8),
                          position=(-0.01, -0.01, 1.02, 1.02))
253
254
255
256
    graph_canvas = FigureCanvas(ion_graph)
    graph_canvas.setStyleSheet("background-color:transparent;")
    graph_canvas.setAutoFillBackground(False)
    parenttable.setCellWidget(newrow, 3, graph_canvas)
257

258
    daughtertable.setRowCount(newrow + 1)
Yan's avatar
Yan committed
259
    checkbox = QtWidgets.QCheckBox()
260
261
    dname = QtWidgets.QTableWidgetItem()
    dname.setFlags(dname.flags() & ~QtCore.Qt.ItemIsEditable)
Yan's avatar
Yan committed
262
    dname.setTextAlignment(QtCore.Qt.AlignRight)
Yan's avatar
Yan committed
263
264
    daughtertable.setItem(newrow, 0, dname)
    daughtertable.setCellWidget(newrow, 0, checkbox)
265
266
267
268
269
270
271
272
    corfor = QtWidgets.QComboBox()
    corfor.setFrame(False)
    daughtertable.setCellWidget(newrow, 1, corfor)
    daughtertable.setItem(newrow, 2, QtWidgets.QTableWidgetItem())

    parenttable.blockSignals(False)
    daughtertable.blockSignals(False)

Yan's avatar
Yan committed
273
274
    ptable_changed(newrow, 1, parenttable, daughtertable, ds,
                   drlspectrum, False)
275

Yan's avatar
Yan committed
276
277
    checkbox.stateChanged.connect(lambda: update_drlspectrum(
        parenttable, daughtertable, ds, drlspectrum))
278
279
    corfor.currentIndexChanged.connect(lambda: corr_changed(
        newrow, parenttable, daughtertable, ds, drlspectrum))
280
281


Yan's avatar
Yan committed
282
def iontable(labels):
283
284
    """creates a table for ions"""
    table = QtWidgets.QTableWidget(columnCount=len(labels))
285
    table.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
286
287
                        QtWidgets.QSizePolicy.Expanding)
    table.setHorizontalHeaderLabels(labels)
288
289
290
291
292
    table.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)

    for n in range(table.columnCount()):
        table.horizontalHeader().setSectionResizeMode(
            n, QtWidgets.QHeaderView.Stretch)
Yan's avatar
Yan committed
293
    table.setMinimumSize(600, 0)
294

295
    return table
296
297


Yan's avatar
Yan committed
298
299
300
301
302
303
304
305
306
307
308
309
310
311
def load_drltables(parent, ptable, dtable, dataset, drlspectrum):
    filename = QtWidgets.QFileDialog.getOpenFileName(
            caption="Load DRL config tables",
            filter="comma-separated values (*.csv)")[0]
    if filename is not '':
        names = []
        start_masses = []
        end_masses = []
        states = []
        corrected_to = []
        corr_factors = []

        with open(filename, 'r') as cfile:
            rawdata = cfile.read().splitlines()
Yan's avatar
Yan committed
312
313
        for i in range(1, len(rawdata)):
            rawline = rawdata[i].split(",")
314
            # TODO: rawline[4] can be -1 - decide if accept this behaviour
Yan's avatar
Yan committed
315
            if len(rawline) != 6 or int(rawline[3]) not in range(3) \
316
                    or int(rawline[4]) not in range(-1,len(rawdata)):
Yan's avatar
Yan committed
317
318
319
320
321
322
                QtWidgets.QMessageBox.warning(
                    parent, "Load DRL config tables",
                    "Config file corrupted on line {},"
                    " cancelling request".format(i+1))
                return
            for j, k in enumerate((names, start_masses, end_masses,
Yan's avatar
Yan committed
323
                                   states, corrected_to, corr_factors)):
Yan's avatar
Yan committed
324
                k.append(rawline[j])
Yan's avatar
Yan committed
325
326
327
        for row in reversed(range(ptable.rowCount())):
            dtable.removeRow(row)
            ptable.removeRow(row)
328
        # first populate only the parent table
Yan's avatar
Yan committed
329
        for i in range(len(names)):
Yan's avatar
Yan committed
330
            add_line(dataset, ptable, dtable, drlspectrum)
331
332
333
            ptable.item(i, 0).setText(names[i])
            ptable.item(i, 1).setText(start_masses[i])
            ptable.item(i, 2).setText(end_masses[i])
334
        # and after that the daughter table
Yan's avatar
Yan committed
335
        for i in range(len(names)):
Yan's avatar
Yan committed
336
            dtable.cellWidget(i, 1).setCurrentIndex(
Yan's avatar
Yan committed
337
                int(corrected_to[i]))
338
            dtable.item(i, 2).setText(corr_factors[i])
Yan's avatar
Yan committed
339
            dtable.cellWidget(i, 0).setCheckState(int(states[i]))
Yan's avatar
Yan committed
340
341


Yan's avatar
Yan committed
342
343
344
345
346
347
348
349
350
351
352
353
def save_drlconfig(ptable, dtable, parent):
    """safe DRL table layout so it can be summoned when needed"""
    exp_f_name = ft.get_save_filename(
        "Save DRL table layout", "comma-separated values (*.csv)",
        "csv", parent)
    if exp_f_name is not '':
        expf = open(exp_f_name, 'w')
        expf.write("#ion_name, start m/z, end m/z, visible,"
                   "corrected_to, factor\n")
        for row in range(ptable.rowCount()):
            vals = []
            for i in range(3):
354
                vals.append(ptable.item(row, i).text())
Yan's avatar
Yan committed
355
356
            vals.append(dtable.cellWidget(row, 0).checkState())
            vals.append(dtable.cellWidget(row, 1).currentIndex())
357
            vals.append(dtable.item(row, 2).text())
Yan's avatar
Yan committed
358
359
360
            expf.write("{}\n".format((",".join(map(str, vals)))))
        expf.close()

Yan's avatar
Yan committed
361

Yan's avatar
Yan committed
362
363
364
def export_drlspectrum(parent, fn, ptable, dtable, ds):
    if fn[0] is None:
        QtWidgets.QMessageBox.warning(
Yan's avatar
Yan committed
365
            parent, "Export DRL dataset",
Yan's avatar
Yan committed
366
367
368
            "Nothing to export, cancelling request")
        return
    names, times, intensities = get_daughterset(ptable, dtable, ds)
369
    pnames, ptimes, pintensities = get_parentset(ptable, dtable, ds)
Yan's avatar
Yan committed
370
    fname = ft.get_save_filename(
Yan's avatar
Yan committed
371
        "Export DRL data", "comma-separated values (*.csv)", "csv", parent)
Yan's avatar
Yan committed
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
    exp_f_name = ["{}-raw.csv".format(fname[:-4]),
                 "{}-corrected.csv".format(fname[:-4])]
    for name in exp_f_name:
        if os.path.isfile(name):
            quest = QtWidgets.QMessageBox.warning(
                parent, "Export DRL data",
                "File {} already exists in the filesystem.\n"
                "Do you want to overwrite it?"
                .format(os.path.basename(name)),
                QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
            if quest == QtWidgets.QMessageBox.No:
                return
    if fname is not '':
        expf = open(exp_f_name[0], 'w')
        expf.write("times, {}\n".format((",".join(pnames))))
        for i in range(len(times)):
            dataset = list()
            dataset.append(times[i])
            for intensity in pintensities:
                dataset.append(intensity[i])
            expf.write("{}\n".format((",".join(map(str, dataset)))))
        expf.close()
        expf = open(exp_f_name[1], 'w')
Yan's avatar
Yan committed
395
396
        expf.write("times, {}\n".format((",".join(names))))
        for i in range(len(times)):
Yan's avatar
Yan committed
397
            dataset = list()
Yan's avatar
Yan committed
398
399
400
401
402
403
            dataset.append(times[i])
            for intensity in intensities:
                dataset.append(intensity[i])
            expf.write("{}\n".format((",".join(map(str, dataset)))))
        expf.close()

Yan's avatar
Yan committed
404

Yan's avatar
Yan committed
405
def print_graph(labels, ptable, dtable, ds):
Yan's avatar
Yan committed
406
    printfig = Figure(figsize=(5, 2), dpi=100)
Yan's avatar
Yan committed
407
408
409
410
    printplot = printfig.add_subplot(111)
    printcanvas = FigureCanvas(printfig)
    gt.pop_plot(printplot, labels)
    update_drlspectrum(ptable, dtable, ds, printplot)
Yan's avatar
Yan committed
411
    widget = QtWidgets.QDialog(None, windowTitle='Print preview')
Yan's avatar
Yan committed
412
413
    layout = QtWidgets.QVBoxLayout(widget)
    layout.addWidget(printcanvas)
Yan's avatar
Yan committed
414
    widget.resize(600, 400)
Yan's avatar
Yan committed
415
416
417
418
419
420
421
    widget.show()
    dialog = QtPrintSupport.QPrintDialog()
    if dialog.exec_() == QtWidgets.QDialog.Accepted:
        printcanvas.render(dialog.printer())
    widget.close()


422
423
424
425
426
def key_pressed(event, ptable, dtable, ds, drlspectrum):
    if event.key() == QtCore.Qt.Key_Delete:
        for row in map(lambda x: x.row(),
                       ptable.selectionModel().selectedRows()):
            delete_row(row, ptable, dtable, ds, drlspectrum)
Yan's avatar
Yan committed
427
428
429
430
    if event.key() == QtCore.Qt.Key_F5:
        update_drlspectrum(ptable, dtable, ds, drlspectrum)
        for row in range(ptable.rowCount()):
            update_profile(ptable, row, ds)
431
432


Yan's avatar
Yan committed
433
def main_window(parent, ds, filename, cache):
434
    """constructs a dialog window"""
Yan's avatar
Yan committed
435
436
    def saveonclose(widget, event, buffer, ptable, dautable, canvas):
        buffer[0], buffer[1], buffer[2] = ptable, dautable, canvas
Yan's avatar
Yan committed
437
        QtWidgets.QMainWindow.closeEvent(widget, event)
Yan's avatar
Yan committed
438

Yan's avatar
Yan committed
439
    window = QtWidgets.QMainWindow(
Yan's avatar
Yan committed
440
        parent, windowTitle='Delayed reactant labelling')
Yan's avatar
Yan committed
441
442
    main_widget = QtWidgets.QWidget(window)
    window.setCentralWidget(main_widget)
Yan's avatar
Yan committed
443

Yan's avatar
Yan committed
444
    window.closeEvent = lambda event: saveonclose(
Yan's avatar
Yan committed
445
        window, event, cache, pt, dtable, graph_canvas)
Yan's avatar
Yan committed
446

Yan's avatar
Yan committed
447
448
    dial_graph = Figure(figsize=(5, 2), dpi=100, facecolor="None")
    chromplot = dial_graph.add_subplot(111, facecolor=(1, 1, 1, 0.8))
Yan's avatar
Yan committed
449
450
451
    graph_canvas = FigureCanvas(dial_graph)
    graph_canvas.setStyleSheet("background-color:transparent;")
    graph_canvas.setAutoFillBackground(False)
Yan's avatar
Yan committed
452
    graphlabels = dict(x=[0], y=[0], line=None, name="",
Yan's avatar
Yan committed
453
454
                       xlabel="time(min)",
                       ylabel="relative intensity")
Yan's avatar
Yan committed
455
456
457
458
    gt.pan_factory(chromplot)
    gt.zoom_factory(chromplot, 1.15)
    gt.pop_plot(chromplot, graphlabels)

459
460
461
    drl_load = QtWidgets.QPushButton("&Load")
    drl_save = QtWidgets.QPushButton("&Save")
    drl_export = QtWidgets.QPushButton("&Export")
Yan's avatar
Yan committed
462
    drl_print = QtWidgets.QPushButton("&Print")
463
    close = QtWidgets.QPushButton("&Close")
Yan's avatar
Yan committed
464
    close.clicked.connect(window.close)
465

Yan's avatar
Yan committed
466
467
468
    btn_add = QtWidgets.QPushButton("&Add")
    btn_rem = QtWidgets.QPushButton("Remove")

469
470
    # pt = parenttable
    # dt = daughtertable
Yan's avatar
Yan committed
471
    if cache == [None, None, None]:
Yan's avatar
Yan committed
472
        dtable = iontable(["Name", "corrected for", "factor"])
473

Yan's avatar
Yan committed
474
        pt = iontable(["Name", "start (m/z)", "end (m/z)", "profile"])
Yan's avatar
Yan committed
475
        add_line(ds, pt, dtable, chromplot)
Yan's avatar
Yan committed
476
477
    else:
        pt = cache[0]
Yan's avatar
Yan committed
478
        dtable = cache[1]
Yan's avatar
Yan committed
479
        graph_canvas = cache[2]
480

481
482
483
    window.keyPressEvent = lambda event: key_pressed(
        event, pt, dtable, ds, chromplot)

484
    btn_add.clicked.connect(lambda: add_line(
Yan's avatar
Yan committed
485
        ds, pt, dtable, chromplot))
486
487
    btn_rem.clicked.connect(lambda: remove_rows(
        pt, dtable, ds, chromplot))
Yan's avatar
Yan committed
488
    drl_load.clicked.connect(lambda: load_drltables(
Yan's avatar
Yan committed
489
        main_widget, pt, dtable, ds, chromplot))
Yan's avatar
Yan committed
490
    drl_save.clicked.connect(lambda: save_drlconfig(
Yan's avatar
Yan committed
491
        pt, dtable, main_widget))
Yan's avatar
Yan committed
492
    drl_print.clicked.connect(lambda: print_graph(
Yan's avatar
Yan committed
493
        graphlabels, pt, dtable, ds))
Yan's avatar
Yan committed
494
    drl_export.clicked.connect(lambda: export_drlspectrum(
Yan's avatar
Yan committed
495
        main_widget, filename, pt, dtable, ds))
496

497
    pt.itemChanged.connect(lambda item: ptable_changed(
Yan's avatar
Yan committed
498
        item.row(), item.column(), pt, dtable, ds, chromplot))
499
500
501
502

    dtable.itemChanged.connect(lambda item: dtable_changed(
        item.row(), item.column(), pt, dtable, ds, chromplot))

Yan's avatar
Yan committed
503
    main_layout = QtWidgets.QVBoxLayout(main_widget)
Yan's avatar
Yan committed
504
505
    sub_layout = QtWidgets.QHBoxLayout()
    tablelayout = QtWidgets.QVBoxLayout()
Yan's avatar
Yan committed
506
    pt_butlayout = QtWidgets.QHBoxLayout()
Yan's avatar
Yan committed
507
    main_butlayout = QtWidgets.QHBoxLayout()
Yan's avatar
Yan committed
508

Yan's avatar
Yan committed
509
510
511
512
    pt_butlayout.addWidget(btn_add)
    pt_butlayout.addWidget(btn_rem)
    pt_butlayout.addStretch(0)

513
514
    main_layout.addLayout(sub_layout)
    main_layout.addWidget(HBar())
Yan's avatar
Yan committed
515
    main_layout.addLayout(main_butlayout)
516

Yan's avatar
Yan committed
517
518
    main_butlayout.addWidget(drl_load)
    main_butlayout.addWidget(drl_save)
Yan's avatar
Yan committed
519
    main_butlayout.addWidget(drl_print)
Yan's avatar
Yan committed
520
521
    main_butlayout.addStretch(1)
    main_butlayout.addWidget(drl_export)
522
    main_butlayout.addWidget(close)
Yan's avatar
Yan committed
523

524
    sub_layout.addWidget(graph_canvas, stretch=1)
Yan's avatar
Yan committed
525
    sub_layout.addLayout(tablelayout)
526

Yan's avatar
Yan committed
527
528
529
530
    tablelayout.addWidget(QtWidgets.QLabel("Raw ions table:"))
    tablelayout.addWidget(pt)
    tablelayout.addLayout(pt_butlayout)
    tablelayout.addWidget(QtWidgets.QLabel("Corrected ions table:"))
Yan's avatar
Yan committed
531
    tablelayout.addWidget(dtable)
532

Yan's avatar
Yan committed
533
    window.show()