1
0
mirror of https://github.com/bec-project/bec_widgets.git synced 2026-04-23 00:32:42 +02:00
Files
bec_widgets/bec_widgets/eiger_plot_hist.py
T
2023-09-08 14:28:43 +02:00

129 lines
3.7 KiB
Python

import threading
import numpy as np
import pyqtgraph as pg
from PyQt5.QtCore import pyqtProperty, pyqtSlot, pyqtSignal
from PyQt5.QtWidgets import QHBoxLayout, QWidget, QCheckBox
import zmq
import json
import h5py
import os
class EigerPlot(QWidget):
update_signale = pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
self.mask_file = os.path.expanduser('~/Data10/software/radial_integration_scipts/bad_pix_map_Eiger9M.h5')
pg.setConfigOptions(background="w", foreground="k", antialias=True)
self.layout = QHBoxLayout()
self.setLayout(self.layout)
self.hist_lim = [0,20]
self.glw = pg.GraphicsLayoutWidget()
self.use_fft = False
# self.glw.show()
# self.setCentralItem(self.glw)
self.checkBox_FFT = QCheckBox("FFT")
self.checkBox_FFT.stateChanged.connect(self.on_fft_changed)
self.layout.addWidget(self.checkBox_FFT)
self.layout.addWidget(self.glw)
self.plot_item = pg.PlotItem()
self.plot_item.setAspectLocked(True)
self.imageItem = pg.ImageItem()
self.plot_item.addItem(self.imageItem)
self.glw.addItem(self.plot_item)
self.hist = pg.HistogramLUTItem()
self.hist.setImageItem(self.imageItem)
self.hist.setLevels(min=self.hist_lim[0],max=self.hist_lim[1])
self.hist.setHistogramRange(self.hist_lim[0] - 0.1 * self.hist_lim[0],self.hist_lim[1] + 0.1 * self.hist_lim[1])
self.hist.disableAutoHistogramRange()
self.hist.gradient.loadPreset('magma')
self.glw.addItem(self.hist)
# self.plot_item.addItem(self.hist)
# add plot and histogram to glw
# self.glw.addItem(self.plot_item)
# self.glw.addItem(self.hist)
# self.imageItem.setImage([[0,1,2],[4,5,6]])
self.update_signale.connect(self.on_image_update)
self.mask = None
self._load_mask()
self.start_zmq_consumer()
def start_zmq_consumer(self):
consumer_thread = threading.Thread(target=self.zmq_consumer, daemon=True).start()
def _load_mask(self):
with h5py.File(self.mask_file, "r") as f:
self.mask = f["data"][...]
def zmq_consumer(self):
try:
print("starting consumer")
live_stream_url = "tcp://129.129.95.38:20000"
receiver = zmq.Context().socket(zmq.SUB)
receiver.connect(live_stream_url)
receiver.setsockopt_string(zmq.SUBSCRIBE, "")
while True:
raw_meta, raw_data = receiver.recv_multipart()
meta = json.loads(raw_meta.decode('utf-8'))
self.image = np.frombuffer(raw_data, dtype=meta['type']).reshape(meta['shape'])
self.update_signale.emit()
finally:
receiver.disconnect(live_stream_url)
receiver.context.term()
@pyqtSlot()
def on_fft_changed(self):
self.update_signale.emit()
@pyqtSlot()
def on_image_update(self):
# if self.checkBox_FFT.isChecked():
# img = np.log10(np.abs(np.fft.fftshift(np.fft.fft2(self.image*(1-self.mask.T)))))
# else:
img = np.log10(self.image*(1-self.mask)+1)
self.imageItem.setImage(img,autoLevels=False)
# hardcoded hist level
# self.hist.setLevels(min=self.hist_lim[0],max=self.hist_lim[1])
# self.hist.setHistogramRange(self.hist_lim[0] - 0.1 * self.hist_lim[0],self.hist_lim[1] + 0.1 * self.hist_lim[1])
if __name__ == "__main__":
import sys
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
plot = EigerPlot()
plot.show()
sys.exit(app.exec_())