Skip to content
This repository was archived by the owner on Apr 1, 2026. It is now read-only.

Commit c1002fb

Browse files
author
LAKESIDE\LindaT18
committed
load data from h5, spec scan: init work on handling pkl w/o scan params
1 parent c329153 commit c1002fb

3 files changed

Lines changed: 187 additions & 86 deletions

File tree

PythonGUI_apps/FLIM_analysis/FLIM_plot.py

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ def __init__(self):
3333
self.ui.setupUi(self)
3434

3535
#set up ui signals
36-
self.ui.load_scan_pushButton.clicked.connect(self.open_pkl_file)
36+
self.ui.load_scan_pushButton.clicked.connect(self.open_file)
3737
self.ui.plot_intensity_sums_pushButton.clicked.connect(self.plot_intensity_sums)
3838
self.ui.plot_raw_hist_data_pushButton.clicked.connect(self.plot_raw_scan)
3939
self.ui.save_intensities_image_pushButton.clicked.connect(self.save_intensities_image)
@@ -45,11 +45,18 @@ def __init__(self):
4545

4646
self.show()
4747

48-
def open_pkl_file(self):
48+
def open_file(self):
4949
""" Open FLIM scan file """
5050
try:
51-
self.filename = QtWidgets.QFileDialog.getOpenFileName(self)
52-
self.pkl_file = pickle.load(open(self.filename[0], 'rb'))
51+
self.filename = QtWidgets.QFileDialog.getOpenFileName(self, filter="Scan files (*.pkl *.h5)")
52+
if ".pkl" in self.filename[0]:
53+
self.flim_scan_file = pickle.load(open(self.filename[0], 'rb'))
54+
self.scan_file_type = "pkl"
55+
elif ".h5" in self.filename[0]:
56+
self.flim_scan_file = h5py.File(self.filename[0], 'r')
57+
self.scan_file_type = "h5"
58+
self.get_data_params()
59+
# self.pkl_file = pickle.load(open(self.filename[0], 'rb'))
5360
except Exception as err:
5461
print(format(err))
5562

@@ -61,24 +68,37 @@ def import_pkl_to_convert(self):
6168
except:
6269
pass
6370

71+
def get_data_params(self):
72+
73+
data = self.flim_scan_file
74+
if self.scan_file_type == "pkl":
75+
self.x_scan_size = data['Scan Parameters']['X scan size (um)']
76+
self.y_scan_size = data['Scan Parameters']['Y scan size (um)']
77+
self.x_step_size = data['Scan Parameters']['X step size (um)']
78+
self.y_step_size = data['Scan Parameters']['Y step size (um)']
79+
self.hist_data = data['Histogram data']
80+
self.time_data = data['Time data']
81+
else: #run this if scan file is h5
82+
self.x_scan_size = data['Scan Parameters'].attrs['X scan size (um)']
83+
self.y_scan_size = data['Scan Parameters'].attrs['Y scan size (um)']
84+
self.x_step_size = data['Scan Parameters'].attrs['X step size (um)']
85+
self.y_step_size = data['Scan Parameters'].attrs['Y step size (um)']
86+
self.hist_data = data['Histogram data'][()] #get dataset values
87+
self.time_data = data['Time data'][()]
88+
89+
self.numb_x_pixels = int(self.x_scan_size/self.x_step_size)
90+
self.numb_y_pixels = int(self.y_scan_size/self.y_step_size)
91+
92+
6493
def plot_intensity_sums(self):
6594
try:
66-
data = self.pkl_file
67-
self.numb_pixels_X = int((data['Scan Parameters']['X scan size (um)'])/(data['Scan Parameters']['X step size (um)']))
68-
self.numb_pixels_Y = int((data['Scan Parameters']['Y scan size (um)'])/(data['Scan Parameters']['Y step size (um)']))
69-
self.x_step_size = float(data['Scan Parameters']['X step size (um)'])
70-
self.x_scan_size = float(data['Scan Parameters']['X scan size (um)'])
71-
self.y_step_size = float(data['Scan Parameters']['Y step size (um)'])
72-
self.y_scan_size = float(data['Scan Parameters']['Y scan size (um)'])
73-
74-
hist_data = data["Histogram data"]
75-
hist_data = np.reshape(hist_data, newshape=(hist_data.shape[0], self.numb_pixels_X*self.numb_pixels_Y))
76-
self.intensity_sums = np.sum(hist_data, axis=0) #sum intensities for each pixel
77-
self.intensity_sums = np.reshape(self.intensity_sums, newshape=(self.numb_pixels_X, self.numb_pixels_Y))
95+
self.hist_data = np.reshape(self.hist_data, newshape=(self.hist_data.shape[0], self.numb_x_pixels*self.numb_y_pixels))
96+
self.intensity_sums = np.sum(self.hist_data, axis=0) #sum intensities for each pixel
97+
self.intensity_sums = np.reshape(self.intensity_sums, newshape=(self.numb_x_pixels, self.numb_y_pixels))
7898
self.ui.intensity_sums_viewBox.view.invertY(False) # stop y axis invert
7999
self.ui.intensity_sums_viewBox.setImage(self.intensity_sums, scale=
80-
(data['Scan Parameters']['X step size (um)'],
81-
data['Scan Parameters']['Y step size (um)']))
100+
(self.x_step_size,
101+
self.y_step_size))
82102
self.ui.intensity_sums_viewBox.roi.setSize([self.x_scan_size, self.y_step_size]) #line roi
83103
scale = pg.ScaleBar(size=1,suffix='um')
84104
scale.setParentItem(self.ui.intensity_sums_viewBox.view)
@@ -112,23 +132,12 @@ def line_profile_update_plot(self):
112132

113133
def plot_raw_scan(self):
114134
try:
115-
data = self.pkl_file
116-
self.numb_pixels_X = int((data['Scan Parameters']['X scan size (um)'])/(data['Scan Parameters']['X step size (um)']))
117-
self.numb_pixels_Y = int((data['Scan Parameters']['Y scan size (um)'])/(data['Scan Parameters']['Y step size (um)']))
118-
self.x_step_size = float(data['Scan Parameters']['X step size (um)'])
119-
self.x_scan_size = float(data['Scan Parameters']['X scan size (um)'])
120-
self.y_step_size = float(data['Scan Parameters']['Y step size (um)'])
121-
self.y_scan_size = float(data['Scan Parameters']['Y scan size (um)'])
122-
# TODO test line scan plots
123-
hist_data = data['Histogram data']
124-
125-
self.hist_image = np.reshape(hist_data, newshape=(hist_data.shape[0],self.numb_pixels_X,self.numb_pixels_Y))
126-
time_data = data['Time data']
127-
self.times = time_data[:, 0, 0]*1e-3
135+
self.hist_image = np.reshape(self.hist_data, newshape=(self.hist_data.shape[0],self.numb_x_pixels,self.numb_y_pixels))
136+
self.times = self.time_data[:, 0, 0]*1e-3
128137
self.ui.raw_hist_data_viewBox.view.invertY(False) # stops y-axis invert
129138
self.ui.raw_hist_data_viewBox.setImage(self.hist_image, scale=
130-
(data['Scan Parameters']['X step size (um)'],
131-
data['Scan Parameters']['Y step size (um)']), xvals=self.times)
139+
(self.x_step_size,
140+
self.y_step_size), xvals=self.times)
132141
self.ui.raw_hist_data_viewBox.roi.setSize([self.x_scan_size, self.y_scan_size])
133142
# if self.ui.compare_checkBox.isChecked():
134143
# self.ui.imv2.setImage(self.hist_image, scale= (data['Scan Parameters']['X step size (um)'],

PythonGUI_apps/Spectrum_analysis/Spectra_plot_fit.py

Lines changed: 77 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def __init__(self):
6060
self.ui.importSpec_pushButton.clicked.connect(self.open_file)
6161
self.ui.importBck_pushButton.clicked.connect(self.open_bck_file)
6262
self.ui.importWLRef_pushButton.clicked.connect(self.open_wlref_file)
63+
6364
self.ui.load_spectra_scan_pushButton.clicked.connect(self.open_spectra_scan_file)
6465
self.ui.load_bck_file_pushButton.clicked.connect(self.open_spectra_bck_file)
6566
self.ui.load_fitted_scan_pushButton.clicked.connect(self.open_fit_scan_file)
@@ -137,8 +138,14 @@ def open_wlref_file(self):
137138
"""Open Scan Files"""
138139
def open_spectra_scan_file(self):
139140
try:
140-
filename = QtWidgets.QFileDialog.getOpenFileName(self)
141-
self.spec_scan_file = pickle.load(open(filename[0], 'rb'))
141+
filename = QtWidgets.QFileDialog.getOpenFileName(self, filter="Scan files (*.pkl *.h5)")
142+
if ".pkl" in filename[0]:
143+
self.spec_scan_file = pickle.load(open(filename[0], 'rb'))
144+
self.scan_file_type = "pkl"
145+
elif ".h5" in filename[0]:
146+
self.spec_scan_file = h5py.File(filename[0], 'r')
147+
self.scan_file_type = "h5"
148+
self.get_data_params()
142149
self.ui.result_textBrowser2.append("Done Loading - Spectra Scan File")
143150
except Exception as e:
144151
self.ui.result_textBrowser2.append(str(e))
@@ -262,13 +269,13 @@ def clear_check(self):
262269
return False
263270

264271
"""Open param window and get peak center range values and assign it to variables to use later"""
265-
# def configure_fit_params(self):
266-
# self.param_window = ParamWindow()
272+
def configure_scan_params(self):
273+
self.param_window = ParamWindow()
267274
# self.param_window.peak_range.connect(self.peak_range)
268275

269-
def peak_range(self, peaks):
270-
self.center_min = peaks[0]
271-
self.center_max = peaks[1]
276+
# def peak_range(self, peaks):
277+
# self.center_min = peaks[0]
278+
# self.center_max = peaks[1]
272279

273280

274281
def fit_and_plot(self):
@@ -409,12 +416,41 @@ def pub_ready_plot_export(self):
409416

410417

411418
""" Scan spectra functions """
419+
def get_data_params(self):
420+
data = self.spec_scan_file
421+
if self.scan_file_type == "pkl":
422+
self.intensities = data['Intensities']
423+
self.wavelengths = data['Wavelengths']
424+
try:
425+
self.x_scan_size = data['Scan Parameters']['X scan size (um)']
426+
self.y_scan_size = data['Scan Parameters']['Y scan size (um)']
427+
self.x_step_size = data['Scan Parameters']['X step size (um)']
428+
self.y_step_size = data['Scan Parameters']['Y step size (um)']
429+
except: # TODO test and debug loading pkl file w/o scan parameters
430+
self.configure_scan_params()
431+
while not hasattr(self, "scan_params_entered"):
432+
pass
433+
self.x_scan_size = self.param_window.ui.x_scan_size_spinBox.value()
434+
self.y_scan_size = self.param_window.ui.y_scan_size_spinBox.value()
435+
self.x_step_size = self.param_window.ui.x_step_size_spinBox.value()
436+
self.y_step_size = self.param_window.ui.y_step_size_spinBox.value()
437+
438+
else: #run this if scan file is h5
439+
self.x_scan_size = data['Scan Parameters'].attrs['X scan size (um)']
440+
self.y_scan_size = data['Scan Parameters'].attrs['Y scan size (um)']
441+
self.x_step_size = data['Scan Parameters'].attrs['X step size (um)']
442+
self.y_step_size = data['Scan Parameters'].attrs['Y step size (um)']
443+
self.intensities = data['Intensities'][()] #get dataset values
444+
self.wavelengths = data['Wavelengths'][()]
445+
446+
self.numb_x_pixels = int(self.x_scan_size/self.x_step_size)
447+
self.numb_y_pixels = int(self.y_scan_size/self.y_step_size)
448+
412449
def plot_fit_scan(self):
413450
try:
414451
if self.ui.use_raw_scan_settings.isChecked():
415-
data = self.spec_scan_file
416-
num_x = int((data['Scan Parameters']['X scan size (um)'])/(data['Scan Parameters']['X step size (um)']))
417-
num_y = int((data['Scan Parameters']['Y scan size (um)'])/(data['Scan Parameters']['Y step size (um)']))
452+
num_x = self.numb_x_pixels
453+
num_y =self.numb_y_pixels
418454
else:
419455
num_x = self.ui.num_x_spinBox.value()
420456
num_y = self.ui.num_y_spinBox.value()
@@ -441,8 +477,8 @@ def plot_fit_scan(self):
441477

442478
if self.ui.use_raw_scan_settings.isChecked():
443479
self.ui.fit_scan_viewbox.setImage(self.img, scale=
444-
(data['Scan Parameters']['X step size (um)'],
445-
data['Scan Parameters']['Y step size (um)']))
480+
(self.x_step_size,
481+
self.y_step_size))
446482
scale = pg.ScaleBar(size=2,suffix='um')
447483
scale.setParentItem(self.ui.fit_scan_viewbox.view)
448484
scale.anchor((1, 1), (1, 1), offset=(-30, -30))
@@ -457,21 +493,16 @@ def plot_fit_scan(self):
457493

458494
def plot_raw_scan(self):
459495
try:
460-
data = self.spec_scan_file
461-
numb_pixels_X = int((data['Scan Parameters']['X scan size (um)'])/(data['Scan Parameters']['X step size (um)']))
462-
numb_pixels_Y = int((data['Scan Parameters']['Y scan size (um)'])/(data['Scan Parameters']['Y step size (um)']))
463496
# TODO test line scan plots
464497

465-
intensities = data['Intensities'].T #this is only there because of how we are saving the data in the app
498+
intensities = self.intensities.T #this is only there because of how we are saving the data in the app
466499

467-
intensities = np.reshape(intensities, newshape=(2048,numb_pixels_X,numb_pixels_Y))
468-
469-
wavelengths = data['Wavelengths']
500+
intensities = np.reshape(intensities, newshape=(2048,self.numb_x_pixels, self.numb_y_pixels))
470501

471502
self.ui.raw_scan_viewbox.view.invertY(False)
472503
self.ui.raw_scan_viewbox.setImage(intensities, scale=
473-
(data['Scan Parameters']['X step size (um)'],
474-
data['Scan Parameters']['Y step size (um)']), xvals=wavelengths)
504+
(self.x_step_size,
505+
self.y_step_size), xvals=self.wavelengths)
475506

476507

477508
#roi_plot = self.ui.raw_scan_viewBox.getRoiPlot()
@@ -485,21 +516,16 @@ def plot_raw_scan(self):
485516

486517
def plot_intensity_sums(self):
487518
try:
488-
data = self.spec_scan_file
489-
numb_pixels_X = int((data['Scan Parameters']['X scan size (um)'])/(data['Scan Parameters']['X step size (um)']))
490-
numb_pixels_Y = int((data['Scan Parameters']['Y scan size (um)'])/(data['Scan Parameters']['Y step size (um)']))
491519
# TODO test line scan plots
492520

493-
intensities = data['Intensities']
494-
495521
#intensities = np.reshape(intensities, newshape=(2048, numb_pixels_X*numb_pixels_Y))
496522

497-
sums = np.sum(intensities, axis=-1)
498-
sums = np.reshape(sums, newshape=(numb_pixels_X, numb_pixels_Y))
523+
sums = np.sum(self.intensities, axis=-1)
524+
sums = np.reshape(sums, newshape=(self.numb_x_pixels, self.numb_y_pixels))
499525

500526
self.ui.intensity_sums_viewBox.setImage(sums, scale=
501-
(data['Scan Parameters']['X step size (um)'],
502-
data['Scan Parameters']['Y step size (um)']))
527+
(self.x_step_size,
528+
self.y_step_size))
503529
self.ui.intensity_sums_viewBox.view.invertY(False)
504530

505531
scale = pg.ScaleBar(size=2,suffix='um')
@@ -522,10 +548,10 @@ def fit_and_plot_scan(self):
522548
ref = self.bck_file
523549
index = (ref[:,0]>start_nm) & (ref[:,0]<stop_nm)
524550

525-
x = self.spec_scan_file['Wavelengths']
551+
x = self.wavelengths
526552
x = x[index]
527553

528-
data_array = self.spec_scan_file['Intensities']
554+
data_array = self.intensities
529555

530556
result_dict = {}
531557

@@ -653,37 +679,35 @@ def close_application(self):
653679

654680

655681
"""Parameter Window GUI and Functions"""
656-
# param_file_path = (base_path / "peak_bounds_input.ui").resolve()
682+
param_file_path = (base_path / "scan_params_input.ui").resolve()
657683

658-
# param_uiFile = param_file_path
684+
param_uiFile = param_file_path
659685

660-
# param_WindowTemplate, param_TemplateBaseClass = pg.Qt.loadUiType(param_uiFile)
686+
param_WindowTemplate, param_TemplateBaseClass = pg.Qt.loadUiType(param_uiFile)
661687

662-
# class ParamWindow(param_TemplateBaseClass):
688+
class ParamWindow(param_TemplateBaseClass):
663689

664-
# peak_range = QtCore.pyqtSignal(list)
690+
#peak_range = QtCore.pyqtSignal(list)
665691

666-
# def __init__(self):
667-
# # super(param_TemplateBaseClass, self).__init__()
668-
# param_TemplateBaseClass.__init__(self)
692+
def __init__(self):
693+
# super(param_TemplateBaseClass, self).__init__()
694+
param_TemplateBaseClass.__init__(self)
669695

670-
# # Create the param window
671-
# self.pui = param_WindowTemplate()
672-
# self.pui.setupUi(self)
696+
# Create the param window
697+
self.pui = param_WindowTemplate()
698+
self.pui.setupUi(self)
673699

674-
# self.pui.pushButton.clicked.connect(self.done)
700+
self.pui.done_pushButton.clicked.connect(self.done)
675701

676-
# self.show()
702+
self.show()
677703

678-
# def current_peak_range(self):
679-
# center_min = self.pui.cent_min_doubleSpinBox.value()
680-
# center_max = self.pui.cent_max_doubleSpinBox.value()
681-
# return center_min, center_max
704+
682705

683-
# def done(self):
684-
# center_min, center_max = self.current_peak_range()
685-
# self.peak_range.emit([center_min, center_max])
686-
# self.close()
706+
def done(self):
707+
#center_min, center_max = self.current_peak_range()
708+
#self.peak_range.emit([center_min, center_max])
709+
self.close()
710+
self.scan_params_entered = True
687711

688712
"""Run the Main Window"""
689713
def run():

0 commit comments

Comments
 (0)