Skip to content

Commit 2d4aacb

Browse files
committed
spectrogram view
1 parent 51daadb commit 2d4aacb

File tree

3 files changed

+118
-15
lines changed

3 files changed

+118
-15
lines changed

dosview/__init__.py

+116-13
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
from PyQt5.QtCore import QThread, pyqtSignal
55
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QHBoxLayout
6-
from PyQt5.QtWidgets import QFileDialog, QTreeWidget, QTreeWidgetItem, QAction, QSplitter, QTableWidgetItem
6+
from PyQt5.QtWidgets import QPushButton, QFileDialog, QTreeWidget, QTreeWidgetItem, QAction, QSplitter, QTableWidgetItem
77

88
from PyQt5.QtGui import QIcon
99

@@ -24,6 +24,7 @@
2424
import os
2525

2626
from .version import __version__
27+
from pyqtgraph import ImageView
2728

2829

2930
def parse_file(file_path):
@@ -84,13 +85,13 @@ def parse_file(file_path):
8485
'internal_time_min': minimal_time,
8586
'internal_time_max': maximal_time,
8687
'log_duration': duration,
87-
'spectral_count': sums.shape,
88-
'channels': hist.shape,
88+
'spectral_count': sums.shape[0],
89+
'channels': hist.shape[0],
8990
})
9091

9192
print("Log file parsed in ", time.time()-start_time, " seconds")
9293

93-
return [time_column, sums, hist, metadata, None]
94+
return [time_column, sums, hist, metadata, None, np_spectrum]
9495

9596
class LoadDataThread(QThread):
9697
data_loaded = pyqtSignal(list)
@@ -151,7 +152,6 @@ def plot(self, data):
151152

152153
print("PLOT DURATION ... ", time.time()-start_time)
153154

154-
155155
def telemetry_toggle(self, key, value):
156156
if self.telemetry_lines[key] is not None:
157157
self.telemetry_lines[key].setVisible(value)
@@ -860,6 +860,38 @@ def run(self):
860860
# Implement USB storage monitoring logic here
861861

862862

863+
864+
class LabdosConfigTab(QWidget):
865+
def __init__(self):
866+
super().__init__()
867+
868+
self.initUI()
869+
870+
def initUI(self):
871+
# Create a QTabWidget
872+
tab_widget = QTabWidget()
873+
tab_widget.setTabPosition(QTabWidget.West) # Set the tab position to vertical
874+
875+
# Create the first tab - Realtime Data
876+
realtime_tab = QWidget()
877+
realtime_layout = QVBoxLayout()
878+
879+
firmware_tab = QWidget()
880+
firmware_layout = QVBoxLayout()
881+
882+
# Add the tabs to the tab_widget
883+
tab_widget.addTab(realtime_tab, "Realtime Data")
884+
tab_widget.addTab(firmware_tab, "Firmware")
885+
886+
# Create a main layout for the LabdosConfigTab
887+
main_layout = QVBoxLayout()
888+
main_layout.addWidget(tab_widget)
889+
890+
# Set the main layout for the LabdosConfigTab
891+
self.setLayout(main_layout)
892+
893+
894+
863895
class AirdosConfigTab(QWidget):
864896
def __init__(self):
865897
super().__init__()
@@ -990,13 +1022,55 @@ def initUI(self):
9901022
self.setLayout(layout)
9911023

9921024

1025+
class DataSpectrumView(QWidget):
1026+
1027+
def __init__(self,parent):
1028+
self.parent = parent
1029+
super(DataSpectrumView, self).__init__(parent)
1030+
self.setWindowFlags(self.windowFlags() | Qt.Window)
1031+
self.initUI()
1032+
1033+
def initUI(self):
1034+
1035+
self.setWindowTitle(repr(self.parent))
1036+
self.setGeometry(100, 100, 400, 300)
1037+
self.imv = pg.ImageView(view=pg.PlotItem())
1038+
layout = QVBoxLayout()
1039+
layout.addWidget(self.imv)
1040+
self.setLayout(layout)
1041+
1042+
def plot_data(self, data):
1043+
# Clear the plot widget
1044+
self.imv.clear()
1045+
1046+
# Set the image data
1047+
self.imv.setImage(np.where(data == 0, np.nan, data))
1048+
#self.imv.autoLevels()
1049+
#self.imv.autoRange()
1050+
1051+
self.imv.show()
1052+
1053+
self.imv.setPredefinedGradient('thermal')
1054+
self.imv.getView().showGrid(True, True, 0.2)
1055+
1056+
1057+
# Invert the y-axis
1058+
self.imv.getView().invertY(False)
1059+
#self.imv.getView().setLogMode(x=False, y=True)
1060+
1061+
1062+
# Add axis labels
1063+
#self.imv.setLabel('left', 'Y Axis')
1064+
#self.imv.setLabel('bottom', 'X Axis')
1065+
1066+
1067+
9931068
class PlotTab(QWidget):
9941069
def __init__(self):
9951070
super().__init__()
9961071
self.initUI()
9971072

9981073
def initUI(self):
999-
10001074
self.properties_tree = QTreeWidget()
10011075
self.properties_tree.setColumnCount(2)
10021076
self.properties_tree.setHeaderLabels(["Property", "Value"])
@@ -1005,19 +1079,24 @@ def initUI(self):
10051079
self.datalines_tree.setColumnCount(1)
10061080
self.datalines_tree.setHeaderLabels(["Units"])
10071081

1082+
1083+
self.open_img_view_button = QPushButton("Spectrogram")
1084+
self.open_img_view_button.clicked.connect(self.open_spectrogram_view)
1085+
1086+
10081087
log_view_widget = QWidget()
10091088

10101089
self.left_panel = QSplitter(Qt.Vertical)
10111090

10121091
self.left_panel.addWidget(self.datalines_tree)
10131092
self.left_panel.addWidget(self.properties_tree)
1014-
1093+
self.left_panel.addWidget(self.open_img_view_button)
10151094

10161095
self.logView_splitter = QSplitter(Qt.Horizontal)
10171096
self.logView_splitter.addWidget(self.left_panel)
10181097
#self.logView_splitter.addWidget(QWidget())
1019-
1020-
1098+
1099+
10211100

10221101
layout = QVBoxLayout()
10231102
layout.addWidget(self.logView_splitter)
@@ -1042,6 +1121,7 @@ def start_data_loading(self):
10421121
self.load_data_thread.start()
10431122

10441123
def on_data_loaded(self, data):
1124+
self.data = data # TODO>.. tohle do budoucna zrusit a nahradit tridou parseru..
10451125
print("Data are fully loaded...")
10461126
self.plot_canvas.plot(data)
10471127
print("After plot data canvas")
@@ -1080,6 +1160,15 @@ def add_properties_to_tree(item, properties):
10801160
self.properties_tree.expandAll()
10811161

10821162

1163+
def open_spectrogram_view(self):
1164+
matrix = self.data[-1] #TODO .. tohle predelat na nejakou tridu pro parserovani
1165+
1166+
w = DataSpectrumView(self)
1167+
w.show()
1168+
w.plot_data(matrix)
1169+
1170+
1171+
10831172
class App(QMainWindow):
10841173
def __init__(self, args):
10851174
super().__init__()
@@ -1108,6 +1197,10 @@ def solve_startup_args(self):
11081197
if self.args.airdos:
11091198
print("Oteviram zalozku s airdosem")
11101199
self.openAirdosTab()
1200+
1201+
if self.args.labdos:
1202+
print("Oteviram zalozku s labdosem")
1203+
self.openLabdosTab()
11111204

11121205
def updateStackedWidget(self):
11131206
print("Updating stacked widget")
@@ -1136,7 +1229,12 @@ def openAirdosTab(self):
11361229
self.tab_widget.addTab(airdos_tab, "Airdos control")
11371230
self.tab_widget.setCurrentIndex(self.tab_widget.count() - 1)
11381231
self.updateStackedWidget()
1139-
1232+
1233+
def openLabdosTab(self):
1234+
labdos_tab = LabdosConfigTab()
1235+
self.tab_widget.addTab(labdos_tab, "Labdos control")
1236+
self.tab_widget.setCurrentIndex(self.tab_widget.count() - 1)
1237+
self.updateStackedWidget()
11401238

11411239
def blank_page(self):
11421240
# This is widget for blank page
@@ -1153,7 +1251,6 @@ def initUI(self):
11531251
self.setGeometry(self.left, self.top, self.width, self.height)
11541252
self.setWindowIcon(QIcon('media/icon_ust.png'))
11551253

1156-
11571254
self.tab_widget = QTabWidget()
11581255

11591256
self.tab_widget.setCurrentIndex(0)
@@ -1171,10 +1268,13 @@ def initUI(self):
11711268

11721269
tools = bar.addMenu("&Tools")
11731270
tool_airdosctrl = QAction("AirdosControl", self)
1174-
#tool_airdosctrl.setCheckable(True)
11751271
tool_airdosctrl.triggered.connect(self.action_switch_airdoscontrol)
11761272
tools.addAction(tool_airdosctrl)
11771273

1274+
tools_labdosctrl = QAction("LabdosControl", self)
1275+
tools_labdosctrl.triggered.connect(self.action_switch_labdoscontrol)
1276+
tools.addAction(tools_labdosctrl)
1277+
11781278

11791279
help = bar.addMenu("&Help")
11801280
doc = QAction("Documentation", self)
@@ -1204,12 +1304,14 @@ def initUI(self):
12041304

12051305
def action_switch_airdoscontrol(self):
12061306
self.openAirdosTab()
1307+
1308+
def action_switch_labdoscontrol(self):
1309+
self.openLabdosTab()
12071310

12081311
def about(self):
12091312
message = QMessageBox.about(self, "About dosview", "dosview is a simple tool to visualize data from Universal Scientific Technologies's")
12101313

12111314

1212-
12131315
def open_new_file(self, flag):
12141316
print("Open new file")
12151317

@@ -1228,6 +1330,7 @@ def main():
12281330
parser = argparse.ArgumentParser(description='Process some integers.')
12291331
parser.add_argument('file_path', type=str, help='Path to the input file', default=False, nargs='?')
12301332
parser.add_argument('--airdos', action='store_true', help='Enable airdos control tab')
1333+
parser.add_argument('--labdos', action='store_true', help='Enable labdos control tab')
12311334
parser.add_argument('--no_gui', action='store_true', help='Disable GUI and run in headless mode')
12321335
parser.add_argument('--version', action='store_true', help='Print version and exit')
12331336

dosview/version.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
#!/usr/bin/env python3
22
# -*- coding: UTF-8 -*-
3-
__version__ = "0.1.16"
3+
__version__ = "0.1.17"

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def run(self):
3737
setup(
3838
name='dosview',
3939
#version= dosview.__version__,
40-
version="0.1.16",
40+
version="0.1.17",
4141
description='Dosview is a simple graphical log viewer and control interface for Universial Scientific Technologies (UST) dosimeters.',
4242
long_description=long_description,
4343
long_description_content_type='text/markdown',

0 commit comments

Comments
 (0)