pyTEMlib 0.2024.9.0__py3-none-any.whl → 0.2025.2.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pyTEMlib might be problematic. Click here for more details.
- pyTEMlib/animation.py +1 -1
- pyTEMlib/atom_tools.py +2 -1
- pyTEMlib/core_loss_widget.py +337 -272
- pyTEMlib/eels_dialog.py +15 -10
- pyTEMlib/eels_tools.py +452 -125
- pyTEMlib/file_tools.py +319 -30
- pyTEMlib/image_tools.py +91 -15
- pyTEMlib/info_widget.py +211 -58
- pyTEMlib/info_widget3.py +1120 -0
- pyTEMlib/low_loss_widget.py +344 -41
- pyTEMlib/peak_dialog.py +141 -59
- pyTEMlib/probe_tools.py +65 -8
- pyTEMlib/version.py +2 -2
- {pyTEMlib-0.2024.9.0.dist-info → pytemlib-0.2025.2.2.dist-info}/METADATA +15 -5
- {pyTEMlib-0.2024.9.0.dist-info → pytemlib-0.2025.2.2.dist-info}/RECORD +19 -18
- {pyTEMlib-0.2024.9.0.dist-info → pytemlib-0.2025.2.2.dist-info}/WHEEL +1 -1
- {pyTEMlib-0.2024.9.0.dist-info → pytemlib-0.2025.2.2.dist-info}/LICENSE +0 -0
- {pyTEMlib-0.2024.9.0.dist-info → pytemlib-0.2025.2.2.dist-info}/entry_points.txt +0 -0
- {pyTEMlib-0.2024.9.0.dist-info → pytemlib-0.2025.2.2.dist-info}/top_level.txt +0 -0
pyTEMlib/info_widget.py
CHANGED
|
@@ -2,6 +2,7 @@ from typing import Any
|
|
|
2
2
|
|
|
3
3
|
import numpy as np
|
|
4
4
|
import os
|
|
5
|
+
import sys
|
|
5
6
|
import ipywidgets
|
|
6
7
|
import matplotlib.pylab as plt
|
|
7
8
|
import matplotlib
|
|
@@ -40,15 +41,15 @@ def get_image_sidebar() -> Any:
|
|
|
40
41
|
layout=ipywidgets.Layout(width='auto', grid_area='header'),
|
|
41
42
|
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
42
43
|
row += 1
|
|
43
|
-
side_bar[row, :2] = ipywidgets.FloatText(value
|
|
44
|
+
side_bar[row, :2] = ipywidgets.FloatText(value=-1, description='Conv.Angle:', disabled=False, color='black',
|
|
44
45
|
layout=ipywidgets.Layout(width='200px'))
|
|
45
46
|
side_bar[row, 2] = ipywidgets.widgets.Label(value="mrad", layout=ipywidgets.Layout(width='100px'))
|
|
46
47
|
row += 1
|
|
47
|
-
side_bar[row, :2] = ipywidgets.FloatText(value
|
|
48
|
+
side_bar[row, :2] = ipywidgets.FloatText(value=-0.1, description='Coll.Angle:', disabled=False, color='black',
|
|
48
49
|
layout=ipywidgets.Layout(width='200px'))
|
|
49
50
|
side_bar[row, 2] = ipywidgets.widgets.Label(value="mrad", layout=ipywidgets.Layout(width='100px'))
|
|
50
51
|
row += 1
|
|
51
|
-
side_bar[row, :2] = ipywidgets.FloatText(value
|
|
52
|
+
side_bar[row, :2] = ipywidgets.FloatText(value=.1, description='Acc Voltage:', disabled=False, color='black',
|
|
52
53
|
layout=ipywidgets.Layout(width='200px'))
|
|
53
54
|
side_bar[row, 2] = ipywidgets.widgets.Label(value="keV", layout=ipywidgets.Layout(width='100px'))
|
|
54
55
|
|
|
@@ -123,11 +124,11 @@ def get_info_sidebar() -> Any:
|
|
|
123
124
|
layout=ipywidgets.Layout(width='auto', grid_area='header'),
|
|
124
125
|
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
125
126
|
row += 1
|
|
126
|
-
side_bar[row, :2] = ipywidgets.FloatText(value
|
|
127
|
+
side_bar[row, :2] = ipywidgets.FloatText(value=-1, description='Conv.Angle:', disabled=False, color='black',
|
|
127
128
|
layout=ipywidgets.Layout(width='200px'))
|
|
128
129
|
side_bar[row, 2] = ipywidgets.widgets.Label(value="mrad", layout=ipywidgets.Layout(width='100px'))
|
|
129
130
|
row += 1
|
|
130
|
-
side_bar[row, :2] = ipywidgets.FloatText(value
|
|
131
|
+
side_bar[row, :2] = ipywidgets.FloatText(value=-0.1, description='Coll.Angle:', disabled=False, color='black',
|
|
131
132
|
layout=ipywidgets.Layout(width='200px'))
|
|
132
133
|
side_bar[row, 2] = ipywidgets.widgets.Label(value="mrad", layout=ipywidgets.Layout(width='100px'))
|
|
133
134
|
row += 1
|
|
@@ -174,9 +175,11 @@ def get_info_sidebar() -> Any:
|
|
|
174
175
|
side_bar[row, 1] = ipywidgets.Button(description='Shift Spec', disabled=True,
|
|
175
176
|
layout=ipywidgets.Layout(width='auto'),
|
|
176
177
|
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
178
|
+
"""
|
|
177
179
|
side_bar[row, 2] = ipywidgets.Button(description='Res.Fct.', disabled=True,
|
|
178
180
|
layout=ipywidgets.Layout(width='auto'),
|
|
179
181
|
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
182
|
+
"""
|
|
180
183
|
|
|
181
184
|
row += 1
|
|
182
185
|
side_bar[row, :3] = ipywidgets.Button(description='Spectrum Image',
|
|
@@ -187,7 +190,7 @@ def get_info_sidebar() -> Any:
|
|
|
187
190
|
side_bar[row, :2] = ipywidgets.IntText(value=1, description='bin X:', disabled=False, color='black',
|
|
188
191
|
layout=ipywidgets.Layout(width='200px'))
|
|
189
192
|
row += 1
|
|
190
|
-
side_bar[row, :2] = ipywidgets.IntText(value=1, description='bin
|
|
193
|
+
side_bar[row, :2] = ipywidgets.IntText(value=1, description='bin Y:', disabled=False, color='black',
|
|
191
194
|
layout=ipywidgets.Layout(width='200px'))
|
|
192
195
|
|
|
193
196
|
for i in range(15, 18):
|
|
@@ -230,13 +233,18 @@ def get_file_widget_ui():
|
|
|
230
233
|
side_bar[row, 0] = ipywidgets.Button(description='Save',
|
|
231
234
|
layout=ipywidgets.Layout(width='100px'),
|
|
232
235
|
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
233
|
-
|
|
236
|
+
side_bar[row, 1] = ipywidgets.Text(
|
|
237
|
+
value='Test.hf5',
|
|
238
|
+
placeholder='Type something',
|
|
239
|
+
description='File:',
|
|
240
|
+
disabled=False
|
|
241
|
+
)
|
|
234
242
|
return side_bar
|
|
235
243
|
|
|
236
244
|
|
|
237
245
|
class EELSBaseWidget(object):
|
|
238
246
|
|
|
239
|
-
def __init__(self, datasets, sidebar, tab_title=None):
|
|
247
|
+
def __init__(self, datasets=None, sidebar=None, tab_title=None):
|
|
240
248
|
|
|
241
249
|
self.datasets = datasets
|
|
242
250
|
self.dataset = None
|
|
@@ -248,6 +256,15 @@ class EELSBaseWidget(object):
|
|
|
248
256
|
self.image_list = ['Sum']
|
|
249
257
|
self.dir_name = file_tools.get_last_path()
|
|
250
258
|
|
|
259
|
+
self.key = None
|
|
260
|
+
self.new_info = False
|
|
261
|
+
self.image = 'Sum'
|
|
262
|
+
if 'google.colab' in sys.modules:
|
|
263
|
+
self.google = True
|
|
264
|
+
else:
|
|
265
|
+
self.google = False
|
|
266
|
+
# self.google = True
|
|
267
|
+
|
|
251
268
|
self.save_path = True
|
|
252
269
|
|
|
253
270
|
if not os.path.isdir(self.dir_name):
|
|
@@ -269,25 +286,42 @@ class EELSBaseWidget(object):
|
|
|
269
286
|
self.end_channel = -2
|
|
270
287
|
|
|
271
288
|
self.file_bar = get_file_widget_ui()
|
|
289
|
+
children = [self.file_bar]
|
|
290
|
+
titles = ['File']
|
|
272
291
|
if isinstance(sidebar, dict):
|
|
273
|
-
tab = ipywidgets.Tab()
|
|
274
|
-
children = [self.file_bar]
|
|
275
|
-
titles = ['File']
|
|
276
292
|
for sidebar_key, sidebar_gui in sidebar.items():
|
|
277
293
|
children.append(sidebar_gui)
|
|
278
294
|
titles.append(sidebar_key)
|
|
279
|
-
tab.children = children
|
|
280
|
-
tab.titles = titles
|
|
281
295
|
elif not isinstance(sidebar, list):
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
296
|
+
children = [self.file_bar, sidebar]
|
|
297
|
+
titles = ['File', 'Info']
|
|
298
|
+
if sidebar is None:
|
|
299
|
+
children = [self.file_bar]
|
|
300
|
+
titles = ['File']
|
|
301
|
+
|
|
302
|
+
if self.google:
|
|
303
|
+
self.buttons = []
|
|
304
|
+
for i in range(len(children)):
|
|
305
|
+
self.buttons.append(ipywidgets.Button(description=titles[i],
|
|
306
|
+
disabled=False,
|
|
307
|
+
button_style='', # 'success', 'info', 'warning', 'danger' or ''
|
|
308
|
+
layout=ipywidgets.Layout(width='800px')))
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
self.tab_buttons = ipywidgets.ToggleButtons(options=titles, description='', disabled=False,
|
|
312
|
+
layout=ipywidgets.Layout(width='auto'),
|
|
313
|
+
style={"button_width": "auto"})
|
|
314
|
+
tab = ipywidgets.VBox([self.tab_buttons, self.file_bar])
|
|
315
|
+
self.children = children
|
|
316
|
+
|
|
285
317
|
else:
|
|
286
|
-
tab =
|
|
287
|
-
|
|
318
|
+
tab = ipywidgets.Tab()
|
|
319
|
+
tab.children = children
|
|
320
|
+
tab.titles = titles
|
|
321
|
+
|
|
288
322
|
with plt.ioff():
|
|
289
323
|
self.figure = plt.figure()
|
|
290
|
-
|
|
324
|
+
self.tab =tab
|
|
291
325
|
self.figure.canvas.toolbar_position = 'right'
|
|
292
326
|
self.figure.canvas.toolbar_visible = True
|
|
293
327
|
|
|
@@ -295,11 +329,17 @@ class EELSBaseWidget(object):
|
|
|
295
329
|
layout=ipywidgets.Layout(width='200px'))
|
|
296
330
|
self.end_cursor = ipywidgets.FloatText(value=0, description='End:', disabled=False, color='black',
|
|
297
331
|
layout=ipywidgets.Layout(width='200px'))
|
|
332
|
+
self.statusbar = ipywidgets.Text(value='Starting',
|
|
333
|
+
placeholder='Type something',
|
|
334
|
+
description='Status:',
|
|
335
|
+
disabled=True,
|
|
336
|
+
layout=ipywidgets.Layout(width='100%'))
|
|
298
337
|
self.panel = ipywidgets.VBox([ipywidgets.HBox([ipywidgets.Label('', layout=ipywidgets.Layout(width='100px')),
|
|
299
338
|
ipywidgets.Label('Cursor:'),
|
|
300
339
|
self.start_cursor, ipywidgets.Label('eV'),
|
|
301
340
|
self.end_cursor, ipywidgets.Label('eV')]),
|
|
302
|
-
|
|
341
|
+
self.figure.canvas,
|
|
342
|
+
self.statusbar])
|
|
303
343
|
|
|
304
344
|
self.app_layout = ipywidgets.AppLayout(
|
|
305
345
|
left_sidebar=tab,
|
|
@@ -329,9 +369,30 @@ class EELSBaseWidget(object):
|
|
|
329
369
|
select_button.on_click(self.select_main)
|
|
330
370
|
add_button.on_click(self.add_dataset)
|
|
331
371
|
self.loaded_datasets.observe(self.select_dataset, names='value')
|
|
332
|
-
self.file_bar[4, 0].observe(self.
|
|
372
|
+
self.file_bar[4, 0].observe(self.set_image, names='value')
|
|
373
|
+
self.file_bar[5, 0].observe(self.set_survey_image, names='value')
|
|
333
374
|
|
|
334
|
-
|
|
375
|
+
self.file_bar[6, 0].observe(self.save_datasets)
|
|
376
|
+
|
|
377
|
+
def save_datasets(self, value=0):
|
|
378
|
+
import warnings
|
|
379
|
+
file_name = self.file_bar[6, 1].value
|
|
380
|
+
path = self.path_choice.options[0]
|
|
381
|
+
with warnings.catch_warnings():
|
|
382
|
+
warnings.simplefilter("ignore")
|
|
383
|
+
h5_group = file_tools.save_dataset(self.datasets, os.path.join(path, file_name))
|
|
384
|
+
h5_group.file.close()
|
|
385
|
+
self.status_message(' File saved')
|
|
386
|
+
|
|
387
|
+
def status_message(self, out: str):
|
|
388
|
+
self.statusbar.value = out
|
|
389
|
+
|
|
390
|
+
def set_survey_image(self, key=None):
|
|
391
|
+
|
|
392
|
+
self.datasets['_relationship']['survey_image'] = self.file_bar[5, 0].value
|
|
393
|
+
# ToDo: Find boundaries of scan.
|
|
394
|
+
|
|
395
|
+
def get_image(self):
|
|
335
396
|
if self.file_bar[4, 0].value == 'Sum':
|
|
336
397
|
spec_dim = self.dataset.get_dimensions_by_type(sidpy.DimensionType.SPECTRAL)
|
|
337
398
|
if len(spec_dim) != 1:
|
|
@@ -346,9 +407,15 @@ class EELSBaseWidget(object):
|
|
|
346
407
|
self.image = self.dataset.mean(axis=(spec_dim[0], channel_dim[0]))
|
|
347
408
|
else:
|
|
348
409
|
self.image = self.dataset.mean(axis=(spec_dim[0]))
|
|
410
|
+
image_key = 'Sum'
|
|
349
411
|
else:
|
|
350
412
|
image_key = self.file_bar[4, 0].value.split(':')[0]
|
|
351
413
|
self.image = self.datasets[image_key]
|
|
414
|
+
self.datasets['_relationship']['image'] = image_key
|
|
415
|
+
|
|
416
|
+
def set_image(self, key=None):
|
|
417
|
+
self.get_image()
|
|
418
|
+
self.plot()
|
|
352
419
|
|
|
353
420
|
def plot(self, scale=True):
|
|
354
421
|
self.figure.clear()
|
|
@@ -358,6 +425,7 @@ class EELSBaseWidget(object):
|
|
|
358
425
|
if self.dataset.data_type.name == 'SPECTRUM':
|
|
359
426
|
self.axis = self.figure.subplots(ncols=1)
|
|
360
427
|
else:
|
|
428
|
+
self.get_image()
|
|
361
429
|
self.plot_spectrum_image()
|
|
362
430
|
self.axis = self.axes[-1]
|
|
363
431
|
self.spectrum = self.get_spectrum()
|
|
@@ -373,13 +441,27 @@ class EELSBaseWidget(object):
|
|
|
373
441
|
for dim, axis in self.dataset._axes.items():
|
|
374
442
|
if axis.dimension_type in [sidpy.DimensionType.SPATIAL, sidpy.DimensionType.RECIPROCAL]:
|
|
375
443
|
image_dims.append(dim)
|
|
376
|
-
self.img = self.axis.imshow(self.dataset, extent=self.dataset.get_extent(image_dims))
|
|
444
|
+
self.img = self.axis.imshow(self.dataset.T, extent=self.dataset.get_extent(image_dims))
|
|
377
445
|
self.axis.set_xlabel(self.dataset.labels[image_dims[0]])
|
|
378
446
|
self.axis.set_ylabel(self.dataset.labels[image_dims[1]])
|
|
379
447
|
|
|
380
448
|
cbar = self.figure.colorbar(self.img)
|
|
381
449
|
cbar.set_label(self.dataset.data_descriptor)
|
|
382
|
-
|
|
450
|
+
if 'annotations' in self.dataset.metadata:
|
|
451
|
+
kwargs={'edgecolor': 'red', 'facecolor': 'None'}
|
|
452
|
+
|
|
453
|
+
annotations = self.dataset.metadata['annotations']
|
|
454
|
+
for key in annotations:
|
|
455
|
+
if annotations[key]['type'] == 'spectral_image':
|
|
456
|
+
rectangle = matplotlib.patches.Rectangle(annotations[key]['position'], annotations[key]['width'], annotations[key]['height'], **kwargs)
|
|
457
|
+
self.axis.text(annotations[key]['position'][0], annotations[key]['position'][1], annotations[key]['label'], color='r')
|
|
458
|
+
self.axis.add_artist(rectangle)
|
|
459
|
+
elif annotations[key]['type'] == 'text':
|
|
460
|
+
self.axis.text(annotations[key]['position'][0], annotations[key]['position'][1], annotations[key]['label'], color='r')
|
|
461
|
+
elif annotations[key]['type'] == 'circle':
|
|
462
|
+
circle = matplotlib.patches.Circle(annotations[key]['position'], annotations[key]['radius'], **kwargs)
|
|
463
|
+
self.axis.add_artist(circle)
|
|
464
|
+
self.figure.tight_layout()
|
|
383
465
|
self.axis.ticklabel_format(style='sci', scilimits=(-2, 3))
|
|
384
466
|
self.figure.tight_layout()
|
|
385
467
|
self.figure.canvas.draw_idle()
|
|
@@ -424,7 +506,8 @@ class EELSBaseWidget(object):
|
|
|
424
506
|
self.get_spectrum()
|
|
425
507
|
if len(self.energy_scale) != self.spectrum.shape[0]:
|
|
426
508
|
self.spectrum = self.spectrum.T
|
|
427
|
-
self.axis.plot(self.energy_scale, self.spectrum.compute(), label='experiment')
|
|
509
|
+
# self.axis.plot(self.energy_scale, self.spectrum.compute(), label='experiment')
|
|
510
|
+
self.axis.plot(self.energy_scale, self.spectrum, label='experiment')
|
|
428
511
|
|
|
429
512
|
self.axis.set_title(f'spectrum {self.x}, {self.y}')
|
|
430
513
|
self.figure.tight_layout()
|
|
@@ -438,8 +521,12 @@ class EELSBaseWidget(object):
|
|
|
438
521
|
self.axis.set_xlabel(self.xlabel)
|
|
439
522
|
self.axis.set_ylabel(self.ylabel)
|
|
440
523
|
self.change_y_scale = 1.0
|
|
524
|
+
self.update_tab_spectra()
|
|
441
525
|
self.figure.canvas.draw_idle()
|
|
442
526
|
|
|
527
|
+
def update_tab_spectra(self):
|
|
528
|
+
pass
|
|
529
|
+
|
|
443
530
|
def _onclick(self, event):
|
|
444
531
|
self.event = event
|
|
445
532
|
if event.inaxes in [self.axes[0]]:
|
|
@@ -513,7 +600,6 @@ class EELSBaseWidget(object):
|
|
|
513
600
|
self.axes = self.figure.subplots(ncols=2)
|
|
514
601
|
self.axis = self.axes[-1]
|
|
515
602
|
|
|
516
|
-
self.set_image()
|
|
517
603
|
self.rect = matplotlib.patches.Rectangle((0, 0), self.bin_x, self.bin_y, linewidth=1, edgecolor='r',
|
|
518
604
|
facecolor='red', alpha=0.2)
|
|
519
605
|
image_dims = self.dataset.get_image_dims()
|
|
@@ -587,6 +673,7 @@ class EELSBaseWidget(object):
|
|
|
587
673
|
# self.loaded_datasets.options = self.dataset_list
|
|
588
674
|
|
|
589
675
|
self.datasets = file_tools.open_file(self.file_name)
|
|
676
|
+
|
|
590
677
|
file_tools.save_path(self.file_name)
|
|
591
678
|
self.dataset_list = []
|
|
592
679
|
self.image_list = ['Sum']
|
|
@@ -606,6 +693,7 @@ class EELSBaseWidget(object):
|
|
|
606
693
|
|
|
607
694
|
self.key = self.dataset_list[0].split(':')[0]
|
|
608
695
|
self.dataset = self.datasets[self.key]
|
|
696
|
+
self.new_info = True
|
|
609
697
|
|
|
610
698
|
self.selected_dataset = self.dataset
|
|
611
699
|
if len(self.image_list) > 0:
|
|
@@ -619,12 +707,27 @@ class EELSBaseWidget(object):
|
|
|
619
707
|
self.file_bar[3, 0].options = self.dataset_list
|
|
620
708
|
self.loaded_datasets.options = self.dataset_list
|
|
621
709
|
self.loaded_datasets.value = self.dataset_list[0]
|
|
710
|
+
path, filename = os.path.split(self.file_name)
|
|
711
|
+
name, extension = os.path.splitext(filename)
|
|
712
|
+
self.file_bar[6, 1].value = name+'.hf5'
|
|
713
|
+
self.status_message(' New file loaded')
|
|
622
714
|
|
|
623
715
|
def add_dataset(self, value=0):
|
|
624
716
|
key = file_tools.add_dataset_from_file(self.datasets, self.file_name, 'Channel')
|
|
625
717
|
self.dataset_list.append(f'{key}: {self.datasets[key].title}')
|
|
626
718
|
self.loaded_datasets.options = self.dataset_list
|
|
627
719
|
self.loaded_datasets.value = self.dataset_list[-1]
|
|
720
|
+
|
|
721
|
+
if 'SPECTR' in self.datasets[key].data_type.name:
|
|
722
|
+
self.spectral_list.append(f'{key}: {self.datasets[key].title}')
|
|
723
|
+
if 'IMAGE' == self.datasets[key].data_type.name:
|
|
724
|
+
if 'survey' in self.datasets[key].title.lower():
|
|
725
|
+
self.survey_list.append(f'{key}: {self.datasets[key].title}')
|
|
726
|
+
self.file_bar[5, 0].options = self.survey_list
|
|
727
|
+
else:
|
|
728
|
+
self.image_list.append(f'{key}: {self.datasets[key].title}')
|
|
729
|
+
self.file_bar[4, 0].options = self.image_list
|
|
730
|
+
self.status_message(' image list file loaded')
|
|
628
731
|
|
|
629
732
|
def get_directory(self, directory='.'):
|
|
630
733
|
self.dir_name = directory
|
|
@@ -691,7 +794,11 @@ class EELSBaseWidget(object):
|
|
|
691
794
|
|
|
692
795
|
class EELSWidget(EELSBaseWidget):
|
|
693
796
|
def __init__(self, datasets=None):
|
|
694
|
-
|
|
797
|
+
self.lowloss_key = 'None'
|
|
798
|
+
self.coreloss_key = 'None'
|
|
799
|
+
self.info_key = 'None'
|
|
800
|
+
self.tabval = 0
|
|
801
|
+
|
|
695
802
|
sidebar = {'Spec.': get_info_sidebar(),
|
|
696
803
|
'LowLoss': get_low_loss_sidebar(),
|
|
697
804
|
'CoreLoss': get_core_loss_sidebar()}
|
|
@@ -707,18 +814,30 @@ class EELSWidget(EELSBaseWidget):
|
|
|
707
814
|
self.set_action()
|
|
708
815
|
|
|
709
816
|
def set_action(self):
|
|
817
|
+
if self.google:
|
|
818
|
+
self.tab_buttons.observe(self.tab_activated)
|
|
710
819
|
self.tab.observe(self.tab_activated)
|
|
711
820
|
|
|
712
821
|
def tab_activated(self, val=0):
|
|
713
|
-
if
|
|
714
|
-
self.
|
|
715
|
-
self.
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
822
|
+
if self.google:
|
|
823
|
+
self.tab.children = [self.tab_buttons, self.children[self.tab_buttons.index]] # update sidebar gui
|
|
824
|
+
self.tabval = self.tab_buttons.index
|
|
825
|
+
else:
|
|
826
|
+
if isinstance(val.new, int):
|
|
827
|
+
self.tabval = val.new
|
|
828
|
+
# self.update_sidebars()
|
|
829
|
+
if self.tabval == 1:
|
|
830
|
+
self.info.update_dataset()
|
|
831
|
+
elif self.tabval == 2:
|
|
832
|
+
self.low_loss.update_ll_sidebar()
|
|
833
|
+
elif self.tabval == 3:
|
|
834
|
+
self.core_loss.update_cl_sidebar()
|
|
835
|
+
|
|
836
|
+
|
|
837
|
+
def update_tab_spectra(self):
|
|
838
|
+
if self.tabval == 2:
|
|
839
|
+
self.low_loss._update()
|
|
840
|
+
|
|
722
841
|
|
|
723
842
|
def update_sidebars(self):
|
|
724
843
|
if hasattr(self, 'info'):
|
|
@@ -732,7 +851,7 @@ class Info(object):
|
|
|
732
851
|
def __init__(self, sidebar=None, parent=None):
|
|
733
852
|
self.parent = parent
|
|
734
853
|
self.info_tab = sidebar
|
|
735
|
-
self.key = self.parent.
|
|
854
|
+
self.key = self.parent.info_key
|
|
736
855
|
self.update_sidebar()
|
|
737
856
|
self.set_action()
|
|
738
857
|
self.count =0
|
|
@@ -749,10 +868,10 @@ class Info(object):
|
|
|
749
868
|
def set_y_scale(self, value):
|
|
750
869
|
self.count += 1
|
|
751
870
|
self.parent.change_y_scale = 1.0 / self.parent.y_scale
|
|
752
|
-
if self.parent.datasets[self.key].metadata['experiment']['flux_ppm'] > 1e-12:
|
|
871
|
+
if self.parent.datasets[self.parent.key].metadata['experiment']['flux_ppm'] > 1e-12:
|
|
753
872
|
if self.info_tab[9, 2].value:
|
|
754
|
-
dispersion = self.parent.datasets[self.key].get_dimension_slope(self.energy_scale)
|
|
755
|
-
self.parent.y_scale = 1 / self.parent.datasets[self.key].metadata['experiment']['flux_ppm'] * dispersion
|
|
873
|
+
dispersion = self.parent.datasets[self.parent.key].get_dimension_slope(self.parent.energy_scale)
|
|
874
|
+
self.parent.y_scale = 1 / self.parent.datasets[self.parent.key].metadata['experiment']['flux_ppm'] * dispersion
|
|
756
875
|
self.parent.ylabel = 'scattering probability (ppm)'
|
|
757
876
|
else:
|
|
758
877
|
self.parent.y_scale = 1.0
|
|
@@ -763,10 +882,11 @@ class Info(object):
|
|
|
763
882
|
def set_flux(self, value):
|
|
764
883
|
# self.parent.datasets[self.key].metadata['experiment']['exposure_time'] = self.info_tab[10, 0].value
|
|
765
884
|
if self.info_tab[9, 0].value == 'None':
|
|
766
|
-
self.parent.datasets[self.key].metadata['experiment']['flux_ppm'] = 0.
|
|
885
|
+
self.parent.datasets[self.parent.key].metadata['experiment']['flux_ppm'] = 0.
|
|
767
886
|
else:
|
|
768
887
|
ll_key = self.info_tab[9, 0].value.split(':')[0]
|
|
769
888
|
self.parent.datasets['_relationship']['low_loss'] = ll_key
|
|
889
|
+
self.parent.lowloss_key = ll_key
|
|
770
890
|
spectrum_dimensions = self.parent.dataset.get_spectral_dims()
|
|
771
891
|
|
|
772
892
|
number_of_pixels = 1
|
|
@@ -780,18 +900,19 @@ class Info(object):
|
|
|
780
900
|
self.parent.datasets[ll_key].metadata['experiment']['exposure_time'] = (self.parent.datasets[ll_key].metadata['experiment']['single_exposure_time'] *
|
|
781
901
|
self.parent.datasets[ll_key].metadata['experiment']['number_of_frames'])
|
|
782
902
|
|
|
783
|
-
self.parent.datasets[self.key].metadata['experiment']['flux_ppm'] = ((np.array(self.parent.datasets[ll_key])*1e-6).sum() /
|
|
903
|
+
self.parent.datasets[self.parent.key].metadata['experiment']['flux_ppm'] = ((np.array(self.parent.datasets[ll_key])*1e-6).sum() /
|
|
784
904
|
self.parent.datasets[ll_key].metadata['experiment']['exposure_time'] /
|
|
785
905
|
number_of_pixels)
|
|
786
|
-
self.parent.datasets[self.key].metadata['experiment']['flux_ppm'] *= self.parent.datasets[self.key].metadata['experiment']['exposure_time']
|
|
906
|
+
self.parent.datasets[self.parent.key].metadata['experiment']['flux_ppm'] *= self.parent.datasets[self.parent.key].metadata['experiment']['exposure_time']
|
|
787
907
|
if 'SPECT' in self.parent.datasets[ll_key].data_type.name:
|
|
788
908
|
self.info_tab[14, 0].disabled = False
|
|
789
|
-
self.info_tab[11, 0].value = np.round(self.parent.datasets[self.key].metadata['experiment']['flux_ppm'], 2)
|
|
909
|
+
self.info_tab[11, 0].value = np.round(self.parent.datasets[self.parent.key].metadata['experiment']['flux_ppm'], 2)
|
|
790
910
|
|
|
791
911
|
def set_microscope_parameter(self, value):
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
912
|
+
if not self.parent.new_info:
|
|
913
|
+
self.parent.datasets[self.key].metadata['experiment']['convergence_angle'] = self.info_tab[5, 0].value
|
|
914
|
+
self.parent.datasets[self.key].metadata['experiment']['collection_angle'] = self.info_tab[6, 0].value
|
|
915
|
+
self.parent.datasets[self.key].metadata['experiment']['acceleration_voltage'] = self.info_tab[7, 0].value*1000
|
|
795
916
|
|
|
796
917
|
def cursor2energy_scale(self, value):
|
|
797
918
|
self.energy_scale = self.parent.datasets[self.key].get_spectral_dims(return_axis=True)[0]
|
|
@@ -823,10 +944,12 @@ class Info(object):
|
|
|
823
944
|
if self.bin_y > self.parent.dataset.shape[image_dims[1]]:
|
|
824
945
|
self.bin_y = self.parent.dataset.shape[image_dims[1]]
|
|
825
946
|
self.info_tab[17, 0].value = self.bin_y
|
|
947
|
+
self.parent.bin_x = self.bin_x
|
|
948
|
+
self.parent.bin_y = self.bin_y
|
|
826
949
|
|
|
827
950
|
self.parent.datasets[self.key].metadata['experiment']['SI_bin_x'] = self.bin_x
|
|
828
951
|
self.parent.datasets[self.key].metadata['experiment']['SI_bin_y'] = self.bin_y
|
|
829
|
-
self.plot()
|
|
952
|
+
self.parent.plot()
|
|
830
953
|
|
|
831
954
|
|
|
832
955
|
|
|
@@ -834,8 +957,11 @@ class Info(object):
|
|
|
834
957
|
spectrum_list = ['None']
|
|
835
958
|
reference_list = ['None']
|
|
836
959
|
data_list = []
|
|
837
|
-
|
|
960
|
+
|
|
961
|
+
self.key = self.info_key = self.parent.info_key
|
|
962
|
+
|
|
838
963
|
spectrum_data = False
|
|
964
|
+
info_index= 0
|
|
839
965
|
for key in self.parent.datasets.keys():
|
|
840
966
|
if isinstance(self.parent.datasets[key], sidpy.Dataset):
|
|
841
967
|
if key[0] != '_' :
|
|
@@ -843,20 +969,29 @@ class Info(object):
|
|
|
843
969
|
if 'SPECTR' in self.parent.datasets[key].data_type.name:
|
|
844
970
|
spectrum_data = True
|
|
845
971
|
spectrum_list.append(f'{key}: {self.parent.datasets[key].title}')
|
|
972
|
+
if self.info_key == key:
|
|
973
|
+
info_index = len(spectrum_list)-1
|
|
846
974
|
reference_list.append(f'{key}: {self.parent.datasets[key].title}')
|
|
847
975
|
self.info_tab[0, 0].options = spectrum_list
|
|
848
976
|
self.info_tab[9, 0].options = reference_list
|
|
849
|
-
|
|
977
|
+
self.info_tab[0, 0].value = spectrum_list[info_index]
|
|
978
|
+
|
|
850
979
|
if 'SPECTRUM' in self.parent.dataset.data_type.name:
|
|
851
980
|
for i in range(15, 18):
|
|
852
981
|
self.info_tab[i, 0].layout.display = "none"
|
|
853
982
|
else:
|
|
854
983
|
for i in range(15, 18):
|
|
855
984
|
self.info_tab[i, 0].layout.display = "flex"
|
|
856
|
-
|
|
857
|
-
if
|
|
858
|
-
|
|
859
|
-
|
|
985
|
+
|
|
986
|
+
if 'None' not in self.key:
|
|
987
|
+
self.parent.new_info = True
|
|
988
|
+
energy_scale = self.parent.datasets[self.key].get_spectral_dims(return_axis=True)
|
|
989
|
+
if len(energy_scale) == 0:
|
|
990
|
+
return
|
|
991
|
+
energy_scale = energy_scale[0]
|
|
992
|
+
offset = energy_scale[0]
|
|
993
|
+
# dispersion = self.parent.datasets[self.key].get_dimension_slope(energy_scale)
|
|
994
|
+
dispersion = energy_scale[1] - offset
|
|
860
995
|
|
|
861
996
|
# self.info_tab[0,0].value = dataset_index #f'{self.key}: {self.parent.datasets[self.key].title}'
|
|
862
997
|
self.info_tab[2, 0].value = np.round(offset, 3)
|
|
@@ -864,6 +999,7 @@ class Info(object):
|
|
|
864
999
|
self.info_tab[5, 0].value = np.round(self.parent.datasets[self.key].metadata['experiment']['convergence_angle'], 1)
|
|
865
1000
|
self.info_tab[6, 0].value = np.round(self.parent.datasets[self.key].metadata['experiment']['collection_angle'], 1)
|
|
866
1001
|
self.info_tab[7, 0].value = np.round(self.parent.datasets[self.key].metadata['experiment']['acceleration_voltage']/1000, 1)
|
|
1002
|
+
# print(self.parent.datasets[self.key].metadata['experiment']['acceleration_voltage'])
|
|
867
1003
|
self.info_tab[10, 0].value = np.round(self.parent.datasets[self.key].metadata['experiment']['exposure_time'], 4)
|
|
868
1004
|
if 'flux_ppm' not in self.parent.datasets[self.key].metadata['experiment']:
|
|
869
1005
|
self.parent.datasets[self.key].metadata['experiment']['flux_ppm'] = 0
|
|
@@ -879,16 +1015,32 @@ class Info(object):
|
|
|
879
1015
|
if 'low_loss' in self.parent.datasets['_relationship']:
|
|
880
1016
|
ll_key = self.parent.datasets['_relationship']['low_loss']
|
|
881
1017
|
ll_key = f'{ll_key}: {self.parent.datasets[ll_key].title}'
|
|
1018
|
+
self.lowloss_key = ll_key
|
|
882
1019
|
self.info_tab[9, 0].value = ll_key
|
|
1020
|
+
self.parent.new_info = False
|
|
883
1021
|
|
|
884
1022
|
def update_dataset(self, value=0):
|
|
885
|
-
key = self.info_tab[0, 0].value.split(':')[0]
|
|
886
|
-
|
|
887
|
-
|
|
1023
|
+
self.key = self.info_tab[0, 0].value.split(':')[0]
|
|
1024
|
+
|
|
1025
|
+
self.info_key = self.key
|
|
1026
|
+
self.parent.info_key = self.key
|
|
1027
|
+
|
|
1028
|
+
if self.info_key != 'None':
|
|
1029
|
+
self.parent.set_dataset(self.info_key)
|
|
1030
|
+
self.parent.status_message(self.key+' , '+ self.parent.info_key)
|
|
1031
|
+
if '_relationship' in self.parent.datasets.keys():
|
|
1032
|
+
self.parent.datasets['_relationship']['spectrum'] = self.info_key
|
|
1033
|
+
self.update_sidebar()
|
|
1034
|
+
self.parent._update(0)
|
|
1035
|
+
|
|
888
1036
|
def shift_low_loss(self, value=0):
|
|
889
1037
|
if 'low_loss' in self.parent.datasets['_relationship']:
|
|
890
1038
|
low_loss = self.parent.datasets[self.parent.datasets['_relationship']['low_loss']]
|
|
891
|
-
|
|
1039
|
+
|
|
1040
|
+
self.parent.datasets['shifted_low_loss'] = eels_tools.align_zero_loss(low_loss)
|
|
1041
|
+
self.parent.datasets['shifted_low_loss'].title = self.parent.dataset.title + '_shifted'
|
|
1042
|
+
self.parent.datasets['_relationship']['low_loss'] = 'shifted_low_loss'
|
|
1043
|
+
self.update_sidebar()
|
|
892
1044
|
|
|
893
1045
|
if 'low_loss' in self.parent.datasets['_relationship']:
|
|
894
1046
|
if 'zero_loss' in self.parent.datasets[self.parent.datasets['_relationship']['low_loss']].metadata:
|
|
@@ -928,6 +1080,7 @@ class Info(object):
|
|
|
928
1080
|
self.info_tab[10, 0].observe(self.set_flux)
|
|
929
1081
|
self.info_tab[14, 0].on_click(self.shift_low_loss)
|
|
930
1082
|
self.info_tab[14, 1].on_click(self.shift_spectrum)
|
|
1083
|
+
self.info_tab[14, 1].on_click(self.shift_spectrum)
|
|
931
1084
|
|
|
932
1085
|
self.info_tab[16, 0].observe(self.set_binning)
|
|
933
1086
|
self.info_tab[17, 0].observe(self.set_binning)
|