pyTEMlib 0.2024.2.1__py2.py3-none-any.whl → 0.2024.6.0__py2.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/core_loss_widget.py +658 -0
- pyTEMlib/eels_dialog.py +13 -12
- pyTEMlib/eels_dialog_utilities.py +2 -3
- pyTEMlib/eels_tools.py +56 -71
- pyTEMlib/file_tools.py +12 -5
- pyTEMlib/image_tools.py +168 -36
- pyTEMlib/info_widget.py +301 -365
- pyTEMlib/low_loss_widget.py +176 -0
- pyTEMlib/version.py +2 -2
- {pyTEMlib-0.2024.2.1.dist-info → pyTEMlib-0.2024.6.0.dist-info}/METADATA +4 -4
- {pyTEMlib-0.2024.2.1.dist-info → pyTEMlib-0.2024.6.0.dist-info}/RECORD +15 -13
- {pyTEMlib-0.2024.2.1.dist-info → pyTEMlib-0.2024.6.0.dist-info}/WHEEL +1 -1
- {pyTEMlib-0.2024.2.1.dist-info → pyTEMlib-0.2024.6.0.dist-info}/LICENSE +0 -0
- {pyTEMlib-0.2024.2.1.dist-info → pyTEMlib-0.2024.6.0.dist-info}/entry_points.txt +0 -0
- {pyTEMlib-0.2024.2.1.dist-info → pyTEMlib-0.2024.6.0.dist-info}/top_level.txt +0 -0
pyTEMlib/info_widget.py
CHANGED
|
@@ -11,7 +11,91 @@ import sidpy
|
|
|
11
11
|
# from pyTEMlib.microscope import microscope
|
|
12
12
|
from pyTEMlib import file_tools
|
|
13
13
|
from pyTEMlib import eels_tools
|
|
14
|
+
from pyTEMlib.core_loss_widget import get_core_loss_sidebar, CoreLoss
|
|
15
|
+
from pyTEMlib.low_loss_widget import get_low_loss_sidebar, LowLoss
|
|
14
16
|
|
|
17
|
+
def get_image_sidebar() -> Any:
|
|
18
|
+
side_bar = ipywidgets.GridspecLayout(14, 3, width='auto', grid_gap="0px")
|
|
19
|
+
|
|
20
|
+
side_bar[0, :2] = ipywidgets.Dropdown(
|
|
21
|
+
options=[('None', 0)],
|
|
22
|
+
value=0,
|
|
23
|
+
description='Main Dataset:',
|
|
24
|
+
disabled=False)
|
|
25
|
+
row = 1
|
|
26
|
+
side_bar[row, :3] = ipywidgets.Button(description='Image Scale',
|
|
27
|
+
layout=ipywidgets.Layout(width='auto', grid_area='header'),
|
|
28
|
+
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
29
|
+
row += 1
|
|
30
|
+
side_bar[row, :2] = ipywidgets.FloatText(value=7.5, description='x dim:', disabled=False, color='black',
|
|
31
|
+
layout=ipywidgets.Layout(width='200px'))
|
|
32
|
+
side_bar[row, 2] = ipywidgets.widgets.Label(value="nm", layout=ipywidgets.Layout(width='20px'))
|
|
33
|
+
row += 1
|
|
34
|
+
side_bar[row, :2] = ipywidgets.FloatText(value=7.5, description='y dim:', disabled=False, color='black',
|
|
35
|
+
layout=ipywidgets.Layout(width='200px'))
|
|
36
|
+
side_bar[row, 2] = ipywidgets.widgets.Label(value="nm", layout=ipywidgets.Layout(width='20px'))
|
|
37
|
+
row += 1
|
|
38
|
+
|
|
39
|
+
side_bar[row, :3] = ipywidgets.Button(description='Microscope',
|
|
40
|
+
layout=ipywidgets.Layout(width='auto', grid_area='header'),
|
|
41
|
+
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
42
|
+
row += 1
|
|
43
|
+
side_bar[row, :2] = ipywidgets.FloatText(value=7.5, description='Conv.Angle:', disabled=False, color='black',
|
|
44
|
+
layout=ipywidgets.Layout(width='200px'))
|
|
45
|
+
side_bar[row, 2] = ipywidgets.widgets.Label(value="mrad", layout=ipywidgets.Layout(width='100px'))
|
|
46
|
+
row += 1
|
|
47
|
+
side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Coll.Angle:', disabled=False, color='black',
|
|
48
|
+
layout=ipywidgets.Layout(width='200px'))
|
|
49
|
+
side_bar[row, 2] = ipywidgets.widgets.Label(value="mrad", layout=ipywidgets.Layout(width='100px'))
|
|
50
|
+
row += 1
|
|
51
|
+
side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Acc Voltage:', disabled=False, color='black',
|
|
52
|
+
layout=ipywidgets.Layout(width='200px'))
|
|
53
|
+
side_bar[row, 2] = ipywidgets.widgets.Label(value="keV", layout=ipywidgets.Layout(width='100px'))
|
|
54
|
+
|
|
55
|
+
row += 1
|
|
56
|
+
side_bar[row, :3] = ipywidgets.Button(description='Calibration',
|
|
57
|
+
layout=ipywidgets.Layout(width='auto', grid_area='header'),
|
|
58
|
+
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
59
|
+
row += 1
|
|
60
|
+
side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Pixel_Time:', disabled=False, color='black',
|
|
61
|
+
layout=ipywidgets.Layout(width='200px'))
|
|
62
|
+
side_bar[row, 2] = ipywidgets.widgets.Label(value="μs", layout=ipywidgets.Layout(width='100px'))
|
|
63
|
+
row += 1
|
|
64
|
+
side_bar[row, :2] = ipywidgets.FloatText(value=7.5, description='Screen Curr:', disabled=False, color='black',
|
|
65
|
+
layout=ipywidgets.Layout(width='200px'))
|
|
66
|
+
side_bar[row, 2] = ipywidgets.widgets.Label(value="pA", layout=ipywidgets.Layout(width='50px'))
|
|
67
|
+
row += 1
|
|
68
|
+
|
|
69
|
+
side_bar[row, 0] = ipywidgets.Button(description='FFT', disabled=True,
|
|
70
|
+
layout=ipywidgets.Layout(width='auto'),
|
|
71
|
+
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
72
|
+
side_bar[row, 1] = ipywidgets.Button(description='LR-Decon', disabled=True,
|
|
73
|
+
layout=ipywidgets.Layout(width='auto'),
|
|
74
|
+
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
75
|
+
side_bar[row, 2] = ipywidgets.Button(description='Find atoms', disabled=True,
|
|
76
|
+
layout=ipywidgets.Layout(width='auto'),
|
|
77
|
+
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
78
|
+
|
|
79
|
+
row += 1
|
|
80
|
+
side_bar[row, :3] = ipywidgets.Button(description='Image Stack',
|
|
81
|
+
layout=ipywidgets.Layout(width='auto', grid_area='header'),
|
|
82
|
+
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
83
|
+
row += 1
|
|
84
|
+
side_bar[row, 0] = ipywidgets.Button(description='Rig Reg.', disabled=True,
|
|
85
|
+
layout=ipywidgets.Layout(width='auto'),
|
|
86
|
+
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
87
|
+
side_bar[row, 1] = ipywidgets.Button(description='Demon', disabled=True,
|
|
88
|
+
layout=ipywidgets.Layout(width='auto'),
|
|
89
|
+
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
90
|
+
side_bar[row, 2] = ipywidgets.Button(description='Sum', disabled=True,
|
|
91
|
+
layout=ipywidgets.Layout(width='auto'),
|
|
92
|
+
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
93
|
+
|
|
94
|
+
side_bar[-2, 0].layout.display = "none"
|
|
95
|
+
for i in range(3):
|
|
96
|
+
side_bar[-1, i].layout.display = "none"
|
|
97
|
+
return side_bar
|
|
98
|
+
|
|
15
99
|
|
|
16
100
|
def get_info_sidebar() -> Any:
|
|
17
101
|
side_bar = ipywidgets.GridspecLayout(18, 3, width='auto', grid_gap="0px")
|
|
@@ -111,8 +195,9 @@ def get_info_sidebar() -> Any:
|
|
|
111
195
|
return side_bar
|
|
112
196
|
|
|
113
197
|
|
|
198
|
+
|
|
114
199
|
def get_file_widget_ui():
|
|
115
|
-
side_bar = ipywidgets.GridspecLayout(
|
|
200
|
+
side_bar = ipywidgets.GridspecLayout(7, 3, height='500px', width='auto', grid_gap="0px")
|
|
116
201
|
row = 0
|
|
117
202
|
side_bar[row, :3] = ipywidgets.Dropdown(options=['None'], value='None', description='directory:', disabled=False,
|
|
118
203
|
button_style='', layout=ipywidgets.Layout(width='auto', grid_area='header'))
|
|
@@ -141,10 +226,15 @@ def get_file_widget_ui():
|
|
|
141
226
|
for i in range(3, 6):
|
|
142
227
|
side_bar[i, 0].layout.display = "none"
|
|
143
228
|
|
|
229
|
+
row += 1
|
|
230
|
+
side_bar[row, 0] = ipywidgets.Button(description='Save',
|
|
231
|
+
layout=ipywidgets.Layout(width='100px'),
|
|
232
|
+
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
233
|
+
|
|
144
234
|
return side_bar
|
|
145
235
|
|
|
146
236
|
|
|
147
|
-
class
|
|
237
|
+
class EELSBaseWidget(object):
|
|
148
238
|
|
|
149
239
|
def __init__(self, datasets, sidebar, tab_title=None):
|
|
150
240
|
|
|
@@ -169,6 +259,8 @@ class EELSWidget(object):
|
|
|
169
259
|
self.file_name = ''
|
|
170
260
|
self.datasets = {}
|
|
171
261
|
self.dataset = None
|
|
262
|
+
self.sd0 = 0
|
|
263
|
+
self.sds = 0
|
|
172
264
|
|
|
173
265
|
self.bin_x = 0
|
|
174
266
|
self.bin_y = 0
|
|
@@ -192,7 +284,7 @@ class EELSWidget(object):
|
|
|
192
284
|
tab.titles = ['File', 'Info']
|
|
193
285
|
else:
|
|
194
286
|
tab = sidebar
|
|
195
|
-
|
|
287
|
+
self.tab = tab
|
|
196
288
|
with plt.ioff():
|
|
197
289
|
self.figure = plt.figure()
|
|
198
290
|
|
|
@@ -260,17 +352,39 @@ class EELSWidget(object):
|
|
|
260
352
|
|
|
261
353
|
def plot(self, scale=True):
|
|
262
354
|
self.figure.clear()
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
self.
|
|
355
|
+
spec_dims = self.dataset.get_spectral_dims(return_axis=True)
|
|
356
|
+
if len(spec_dims)>0:
|
|
357
|
+
self.energy_scale = spec_dims[0]
|
|
358
|
+
if self.dataset.data_type.name == 'SPECTRUM':
|
|
359
|
+
self.axis = self.figure.subplots(ncols=1)
|
|
360
|
+
else:
|
|
361
|
+
self.plot_spectrum_image()
|
|
362
|
+
self.axis = self.axes[-1]
|
|
363
|
+
self.spectrum = self.get_spectrum()
|
|
364
|
+
self.plot_spectrum()
|
|
365
|
+
|
|
267
366
|
else:
|
|
268
|
-
self.
|
|
269
|
-
self.
|
|
270
|
-
self.spectrum = self.get_spectrum()
|
|
367
|
+
self.axis = self.figure.subplots(ncols=1)
|
|
368
|
+
self.plot_image()
|
|
271
369
|
|
|
272
|
-
|
|
273
|
-
|
|
370
|
+
def plot_image(self):
|
|
371
|
+
# image_dims = self.dataset.get_image_dims()
|
|
372
|
+
image_dims = []
|
|
373
|
+
for dim, axis in self.dataset._axes.items():
|
|
374
|
+
if axis.dimension_type in [sidpy.DimensionType.SPATIAL, sidpy.DimensionType.RECIPROCAL]:
|
|
375
|
+
image_dims.append(dim)
|
|
376
|
+
self.img = self.axis.imshow(self.dataset, extent=self.dataset.get_extent(image_dims))
|
|
377
|
+
self.axis.set_xlabel(self.dataset.labels[image_dims[0]])
|
|
378
|
+
self.axis.set_ylabel(self.dataset.labels[image_dims[1]])
|
|
379
|
+
|
|
380
|
+
cbar = self.figure.colorbar(self.img)
|
|
381
|
+
cbar.set_label(self.dataset.data_descriptor)
|
|
382
|
+
|
|
383
|
+
self.axis.ticklabel_format(style='sci', scilimits=(-2, 3))
|
|
384
|
+
self.figure.tight_layout()
|
|
385
|
+
self.figure.canvas.draw_idle()
|
|
386
|
+
|
|
387
|
+
|
|
274
388
|
def plot_spectrum(self):
|
|
275
389
|
self.axis.plot(self.energy_scale, self.spectrum, label='spectrum')
|
|
276
390
|
x_limit = self.axis.get_xlim()
|
|
@@ -422,6 +536,7 @@ class EELSWidget(object):
|
|
|
422
536
|
self.end_channel = np.searchsorted(energy_scale, self.end_cursor.value)
|
|
423
537
|
|
|
424
538
|
def set_dataset(self, key=None):
|
|
539
|
+
|
|
425
540
|
if len(self.datasets) == 0:
|
|
426
541
|
data_set = sidpy.Dataset.from_array([0, 1], name='generic')
|
|
427
542
|
data_set.set_dimension(0, sidpy.Dimension([0, 1], 'energy_loss', units='channel', quantity='generic',
|
|
@@ -431,24 +546,26 @@ class EELSWidget(object):
|
|
|
431
546
|
'collection_angle': 0,
|
|
432
547
|
'acceleration_voltage': 0,
|
|
433
548
|
'exposure_time': 0}}
|
|
434
|
-
self.datasets = {'
|
|
435
|
-
key = '
|
|
549
|
+
self.datasets = {'Nothing': data_set}
|
|
550
|
+
key = 'Nothing'
|
|
551
|
+
|
|
436
552
|
dataset_key = key
|
|
437
553
|
|
|
438
554
|
self.dataset_list = []
|
|
439
555
|
dataset_keys = []
|
|
440
556
|
for key in self.datasets.keys():
|
|
441
557
|
if isinstance(self.datasets[key], sidpy.Dataset):
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
dataset_keys.append(key)
|
|
558
|
+
self.dataset_list.append(f'{key}: {self.datasets[key].title}')
|
|
559
|
+
dataset_keys.append(key)
|
|
445
560
|
if dataset_key not in dataset_keys:
|
|
446
561
|
dataset_key = dataset_keys[0]
|
|
447
562
|
self.key = dataset_key
|
|
448
563
|
|
|
449
564
|
self.dataset = self.datasets[self.key]
|
|
450
|
-
|
|
451
|
-
|
|
565
|
+
|
|
566
|
+
spectral_dims = self.dataset.get_spectral_dims(return_axis=True)
|
|
567
|
+
if len(spectral_dims) >0:
|
|
568
|
+
self.energy_scale = spectral_dims[0]
|
|
452
569
|
self.y_scale = 1.0
|
|
453
570
|
self.change_y_scale = 1.0
|
|
454
571
|
self.x = 0
|
|
@@ -457,13 +574,15 @@ class EELSWidget(object):
|
|
|
457
574
|
self.bin_y = 1
|
|
458
575
|
self.count = 0
|
|
459
576
|
|
|
577
|
+
self.update_sidebars()
|
|
578
|
+
#self.update_sidebar()
|
|
460
579
|
self.plot()
|
|
461
|
-
self.update_sidebar()
|
|
462
580
|
|
|
463
|
-
def
|
|
581
|
+
def update_sidebars(self):
|
|
464
582
|
pass
|
|
465
583
|
|
|
466
584
|
def select_main(self, value=0):
|
|
585
|
+
self.sds +=1
|
|
467
586
|
self.datasets = {}
|
|
468
587
|
# self.loaded_datasets.options = self.dataset_list
|
|
469
588
|
|
|
@@ -472,18 +591,19 @@ class EELSWidget(object):
|
|
|
472
591
|
self.dataset_list = []
|
|
473
592
|
self.image_list = ['Sum']
|
|
474
593
|
self.survey_list = ['None']
|
|
594
|
+
self.spectral_list = ['None']
|
|
475
595
|
for key in self.datasets.keys():
|
|
476
596
|
if isinstance(self.datasets[key], sidpy.Dataset):
|
|
597
|
+
self.dataset_list.append(f'{key}: {self.datasets[key].title}')
|
|
477
598
|
if 'SPECTR' in self.datasets[key].data_type.name:
|
|
478
|
-
self.
|
|
599
|
+
self.spectral_list.append(f'{key}: {self.datasets[key].title}')
|
|
479
600
|
if 'IMAGE' == self.datasets[key].data_type.name:
|
|
480
601
|
if 'survey' in self.datasets[key].title.lower():
|
|
481
602
|
self.survey_list.append(f'{key}: {self.datasets[key].title}')
|
|
482
603
|
else:
|
|
483
604
|
self.image_list.append(f'{key}: {self.datasets[key].title}')
|
|
484
605
|
|
|
485
|
-
|
|
486
|
-
self.set_dataset()
|
|
606
|
+
|
|
487
607
|
self.key = self.dataset_list[0].split(':')[0]
|
|
488
608
|
self.dataset = self.datasets[self.key]
|
|
489
609
|
|
|
@@ -569,87 +689,125 @@ class EELSWidget(object):
|
|
|
569
689
|
elif os.path.isfile(os.path.join(self.dir_name, self.dir_list[self.select_files.index])):
|
|
570
690
|
self.file_name = os.path.join(self.dir_name, self.dir_list[self.select_files.index])
|
|
571
691
|
|
|
572
|
-
|
|
573
|
-
class InfoWidget(EELSWidget):
|
|
692
|
+
class EELSWidget(EELSBaseWidget):
|
|
574
693
|
def __init__(self, datasets=None):
|
|
575
694
|
|
|
576
|
-
sidebar = {'
|
|
577
|
-
'LowLoss': get_low_loss_sidebar()
|
|
695
|
+
sidebar = {'Spec.': get_info_sidebar(),
|
|
696
|
+
'LowLoss': get_low_loss_sidebar(),
|
|
697
|
+
'CoreLoss': get_core_loss_sidebar()}
|
|
578
698
|
super().__init__(datasets, sidebar)
|
|
579
|
-
self.info_tab = sidebar['
|
|
699
|
+
self.info_tab = sidebar['Spec.']
|
|
700
|
+
self.core_loss_tab = sidebar['CoreLoss']
|
|
701
|
+
self.low_loss_tab = sidebar['LowLoss']
|
|
580
702
|
super().set_dataset()
|
|
581
|
-
|
|
703
|
+
self.info = Info(self.info_tab, self)
|
|
704
|
+
self.low_loss = LowLoss(self.low_loss_tab, self)
|
|
705
|
+
self.core_loss = CoreLoss(self.core_loss_tab, self)
|
|
706
|
+
|
|
707
|
+
self.set_action()
|
|
708
|
+
|
|
709
|
+
def set_action(self):
|
|
710
|
+
self.tab.observe(self.tab_activated)
|
|
711
|
+
|
|
712
|
+
def tab_activated(self, val=0):
|
|
713
|
+
if isinstance(val.new, int):
|
|
714
|
+
self.tabval = val.new
|
|
715
|
+
self.update_sidebars()
|
|
716
|
+
if val.new == 1:
|
|
717
|
+
self.info.update_dataset()
|
|
718
|
+
elif val.new == 2:
|
|
719
|
+
self.low_loss.update_ll_dataset()
|
|
720
|
+
elif val.new == 3:
|
|
721
|
+
self.core_loss.update_cl_sidebar()
|
|
722
|
+
|
|
723
|
+
def update_sidebars(self):
|
|
724
|
+
if hasattr(self, 'info'):
|
|
725
|
+
self.info.update_sidebar()
|
|
726
|
+
#if hasattr(self, 'low_loss'):
|
|
727
|
+
# self.low_loss.update_ll_sidebar()
|
|
728
|
+
#if hasattr(self, 'core_loss'):
|
|
729
|
+
# self.core_loss.update_cl_sidebar()
|
|
730
|
+
|
|
731
|
+
class Info(object):
|
|
732
|
+
def __init__(self, sidebar=None, parent=None):
|
|
733
|
+
self.parent = parent
|
|
734
|
+
self.info_tab = sidebar
|
|
735
|
+
self.key = self.parent.key
|
|
736
|
+
self.update_sidebar()
|
|
582
737
|
self.set_action()
|
|
738
|
+
self.count =0
|
|
583
739
|
|
|
584
740
|
def set_energy_scale(self, value):
|
|
585
|
-
self.
|
|
586
|
-
|
|
741
|
+
self.ens = 1
|
|
742
|
+
self.energy_scale = self.parent.datasets[self.key].get_spectral_dims(return_axis=True)[0]
|
|
743
|
+
dispersion = self.parent.datasets[self.key].get_dimension_slope(self.energy_scale)
|
|
744
|
+
self.ens = dispersion
|
|
587
745
|
self.energy_scale *= (self.info_tab[3, 0].value / dispersion)
|
|
588
746
|
self.energy_scale += (self.info_tab[2, 0].value - self.energy_scale[0])
|
|
589
|
-
self.plot()
|
|
747
|
+
self.parent.plot()
|
|
590
748
|
|
|
591
749
|
def set_y_scale(self, value):
|
|
592
750
|
self.count += 1
|
|
593
|
-
self.change_y_scale = 1.0 / self.y_scale
|
|
594
|
-
if self.datasets[self.key].metadata['experiment']['flux_ppm'] > 1e-12:
|
|
595
|
-
|
|
751
|
+
self.parent.change_y_scale = 1.0 / self.parent.y_scale
|
|
752
|
+
if self.parent.datasets[self.key].metadata['experiment']['flux_ppm'] > 1e-12:
|
|
596
753
|
if self.info_tab[9, 2].value:
|
|
597
|
-
dispersion = self.datasets[self.key].get_dimension_slope(self.energy_scale)
|
|
598
|
-
self.y_scale = 1 / self.datasets[self.key].metadata['experiment']['flux_ppm'] * dispersion
|
|
599
|
-
self.ylabel = 'scattering probability (ppm)'
|
|
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
|
|
756
|
+
self.parent.ylabel = 'scattering probability (ppm)'
|
|
600
757
|
else:
|
|
601
|
-
self.y_scale = 1.0
|
|
602
|
-
self.ylabel = 'intensity (counts)'
|
|
603
|
-
self.change_y_scale *= self.y_scale
|
|
604
|
-
self._update()
|
|
758
|
+
self.parent.y_scale = 1.0
|
|
759
|
+
self.parent.ylabel = 'intensity (counts)'
|
|
760
|
+
self.parent.change_y_scale *= self.parent.y_scale
|
|
761
|
+
self.parent._update()
|
|
605
762
|
|
|
606
763
|
def set_flux(self, value):
|
|
607
|
-
self.datasets[self.key].metadata['experiment']['exposure_time'] = self.info_tab[10, 0].value
|
|
764
|
+
# self.parent.datasets[self.key].metadata['experiment']['exposure_time'] = self.info_tab[10, 0].value
|
|
608
765
|
if self.info_tab[9, 0].value == 'None':
|
|
609
|
-
self.datasets[self.key].metadata['experiment']['flux_ppm'] = 0.
|
|
766
|
+
self.parent.datasets[self.key].metadata['experiment']['flux_ppm'] = 0.
|
|
610
767
|
else:
|
|
611
|
-
|
|
612
|
-
self.datasets['_relationship']['low_loss'] =
|
|
613
|
-
spectrum_dimensions = self.dataset.get_spectral_dims()
|
|
768
|
+
ll_key = self.info_tab[9, 0].value.split(':')[0]
|
|
769
|
+
self.parent.datasets['_relationship']['low_loss'] = ll_key
|
|
770
|
+
spectrum_dimensions = self.parent.dataset.get_spectral_dims()
|
|
614
771
|
|
|
615
772
|
number_of_pixels = 1
|
|
616
|
-
for index, dimension in enumerate(self.dataset.shape):
|
|
773
|
+
for index, dimension in enumerate(self.parent.dataset.shape):
|
|
617
774
|
if index not in spectrum_dimensions:
|
|
618
775
|
number_of_pixels *= dimension
|
|
619
|
-
if self.datasets[
|
|
620
|
-
if self.datasets[
|
|
776
|
+
if self.parent.datasets[ll_key].metadata['experiment']['exposure_time'] == 0.0:
|
|
777
|
+
if self.parent.datasets[ll_key].metadata['experiment']['single_exposure_time'] == 0.0:
|
|
621
778
|
return
|
|
622
779
|
else:
|
|
623
|
-
self.datasets[
|
|
624
|
-
|
|
780
|
+
self.parent.datasets[ll_key].metadata['experiment']['exposure_time'] = (self.parent.datasets[ll_key].metadata['experiment']['single_exposure_time'] *
|
|
781
|
+
self.parent.datasets[ll_key].metadata['experiment']['number_of_frames'])
|
|
625
782
|
|
|
626
|
-
self.datasets[self.key].metadata['experiment']['flux_ppm'] = ((np.array(self.datasets[
|
|
627
|
-
self.datasets[
|
|
783
|
+
self.parent.datasets[self.key].metadata['experiment']['flux_ppm'] = ((np.array(self.parent.datasets[ll_key])*1e-6).sum() /
|
|
784
|
+
self.parent.datasets[ll_key].metadata['experiment']['exposure_time'] /
|
|
628
785
|
number_of_pixels)
|
|
629
|
-
self.datasets[self.key].metadata['experiment']['flux_ppm'] *= self.datasets[self.key].metadata['experiment']['exposure_time']
|
|
630
|
-
if 'SPECT' in self.datasets[
|
|
786
|
+
self.parent.datasets[self.key].metadata['experiment']['flux_ppm'] *= self.parent.datasets[self.key].metadata['experiment']['exposure_time']
|
|
787
|
+
if 'SPECT' in self.parent.datasets[ll_key].data_type.name:
|
|
631
788
|
self.info_tab[14, 0].disabled = False
|
|
632
|
-
self.info_tab[11, 0].value = np.round(self.datasets[self.key].metadata['experiment']['flux_ppm'], 2)
|
|
789
|
+
self.info_tab[11, 0].value = np.round(self.parent.datasets[self.key].metadata['experiment']['flux_ppm'], 2)
|
|
633
790
|
|
|
634
791
|
def set_microscope_parameter(self, value):
|
|
635
|
-
self.datasets[self.key].metadata['experiment']['convergence_angle'] = self.info_tab[5, 0].value
|
|
636
|
-
self.datasets[self.key].metadata['experiment']['collection_angle'] = self.info_tab[6, 0].value
|
|
637
|
-
self.datasets[self.key].metadata['experiment']['acceleration_voltage'] = self.info_tab[7, 0].value*1000
|
|
792
|
+
self.parent.datasets[self.key].metadata['experiment']['convergence_angle'] = self.info_tab[5, 0].value
|
|
793
|
+
self.parent.datasets[self.key].metadata['experiment']['collection_angle'] = self.info_tab[6, 0].value
|
|
794
|
+
self.parent.datasets[self.key].metadata['experiment']['acceleration_voltage'] = self.info_tab[7, 0].value*1000
|
|
638
795
|
|
|
639
796
|
def cursor2energy_scale(self, value):
|
|
640
|
-
self.energy_scale = self.datasets[self.key].get_spectral_dims(return_axis=True)[0]
|
|
641
|
-
dispersion = (self.end_cursor.value - self.start_cursor.value) / (self.end_channel - self.start_channel)
|
|
797
|
+
self.energy_scale = self.parent.datasets[self.key].get_spectral_dims(return_axis=True)[0]
|
|
798
|
+
dispersion = (self.parent.end_cursor.value - self.parent.start_cursor.value) / (self.parent.end_channel - self.parent.start_channel)
|
|
642
799
|
|
|
643
800
|
self.energy_scale *= (self.info_tab[3, 0].value/dispersion)
|
|
644
|
-
|
|
645
|
-
offset = self.start_cursor.value - self.start_channel * dispersion
|
|
646
|
-
self.energy_scale += (self.info_tab[2, 0].value-self.energy_scale[0])
|
|
647
|
-
self.info_tab[2, 0].value = offset
|
|
648
|
-
self.
|
|
801
|
+
|
|
802
|
+
offset = self.parent.start_cursor.value - self.parent.start_channel * dispersion
|
|
803
|
+
self.parent.energy_scale += (self.info_tab[2, 0].value-self.parent.energy_scale[0])
|
|
804
|
+
self.info_tab[2, 0].value = np.round(offset,4)
|
|
805
|
+
self.info_tab[3, 0].value = np.round(dispersion,4)
|
|
806
|
+
self.parent.plot()
|
|
649
807
|
|
|
650
808
|
def set_binning(self, value):
|
|
651
|
-
if 'SPECTRAL' in self.dataset.data_type.name:
|
|
652
|
-
image_dims = self.dataset.get_image_dims()
|
|
809
|
+
if 'SPECTRAL' in self.parent.dataset.data_type.name:
|
|
810
|
+
image_dims = self.parent.dataset.get_image_dims()
|
|
653
811
|
|
|
654
812
|
self.bin_x = int(self.info_tab[16, 0].value)
|
|
655
813
|
self.bin_y = int(self.info_tab[17, 0].value)
|
|
@@ -659,109 +817,103 @@ class InfoWidget(EELSWidget):
|
|
|
659
817
|
if self.bin_y < 1:
|
|
660
818
|
self.bin_y = 1
|
|
661
819
|
self.info_tab[17, 0].value = self.bin_y
|
|
662
|
-
if self.bin_x > self.dataset.shape[image_dims[0]]:
|
|
663
|
-
self.bin_x = self.dataset.shape[image_dims[0]]
|
|
820
|
+
if self.bin_x > self.parent.dataset.shape[image_dims[0]]:
|
|
821
|
+
self.bin_x = self.parent.dataset.shape[image_dims[0]]
|
|
664
822
|
self.info_tab[16, 0].value = self.bin_x
|
|
665
|
-
if self.bin_y > self.dataset.shape[image_dims[1]]:
|
|
666
|
-
self.bin_y = self.dataset.shape[image_dims[1]]
|
|
823
|
+
if self.bin_y > self.parent.dataset.shape[image_dims[1]]:
|
|
824
|
+
self.bin_y = self.parent.dataset.shape[image_dims[1]]
|
|
667
825
|
self.info_tab[17, 0].value = self.bin_y
|
|
668
826
|
|
|
669
|
-
self.datasets[self.key].metadata['experiment']['SI_bin_x'] = self.bin_x
|
|
670
|
-
self.datasets[self.key].metadata['experiment']['SI_bin_y'] = self.bin_y
|
|
827
|
+
self.parent.datasets[self.key].metadata['experiment']['SI_bin_x'] = self.bin_x
|
|
828
|
+
self.parent.datasets[self.key].metadata['experiment']['SI_bin_y'] = self.bin_y
|
|
671
829
|
self.plot()
|
|
672
830
|
|
|
831
|
+
|
|
832
|
+
|
|
673
833
|
def update_sidebar(self):
|
|
674
|
-
spectrum_list = []
|
|
834
|
+
spectrum_list = ['None']
|
|
675
835
|
reference_list = ['None']
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
836
|
+
data_list = []
|
|
837
|
+
self.key = self.parent.key
|
|
838
|
+
spectrum_data = False
|
|
839
|
+
for key in self.parent.datasets.keys():
|
|
840
|
+
if isinstance(self.parent.datasets[key], sidpy.Dataset):
|
|
841
|
+
if key[0] != '_' :
|
|
842
|
+
data_list.append(f'{key}: {self.parent.datasets[key].title}')
|
|
843
|
+
if 'SPECTR' in self.parent.datasets[key].data_type.name:
|
|
844
|
+
spectrum_data = True
|
|
845
|
+
spectrum_list.append(f'{key}: {self.parent.datasets[key].title}')
|
|
846
|
+
reference_list.append(f'{key}: {self.parent.datasets[key].title}')
|
|
683
847
|
self.info_tab[0, 0].options = spectrum_list
|
|
684
848
|
self.info_tab[9, 0].options = reference_list
|
|
685
849
|
|
|
686
|
-
if 'SPECTRUM' in self.dataset.data_type.name:
|
|
850
|
+
if 'SPECTRUM' in self.parent.dataset.data_type.name:
|
|
687
851
|
for i in range(15, 18):
|
|
688
852
|
self.info_tab[i, 0].layout.display = "none"
|
|
689
853
|
else:
|
|
690
854
|
for i in range(15, 18):
|
|
691
855
|
self.info_tab[i, 0].layout.display = "flex"
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
self.datasets[self.key].metadata['experiment']['
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
self.datasets[self.key].metadata['experiment']['
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
self.datasets[self.key].metadata['experiment']['
|
|
707
|
-
|
|
708
|
-
|
|
856
|
+
|
|
857
|
+
if spectrum_data:
|
|
858
|
+
offset = self.parent.datasets[self.key].energy_loss[0]
|
|
859
|
+
dispersion = self.parent.datasets[self.key].energy_loss[1] - offset
|
|
860
|
+
|
|
861
|
+
# self.info_tab[0,0].value = dataset_index #f'{self.key}: {self.parent.datasets[self.key].title}'
|
|
862
|
+
self.info_tab[2, 0].value = np.round(offset, 3)
|
|
863
|
+
self.info_tab[3, 0].value = np.round(dispersion, 4)
|
|
864
|
+
self.info_tab[5, 0].value = np.round(self.parent.datasets[self.key].metadata['experiment']['convergence_angle'], 1)
|
|
865
|
+
self.info_tab[6, 0].value = np.round(self.parent.datasets[self.key].metadata['experiment']['collection_angle'], 1)
|
|
866
|
+
self.info_tab[7, 0].value = np.round(self.parent.datasets[self.key].metadata['experiment']['acceleration_voltage']/1000, 1)
|
|
867
|
+
self.info_tab[10, 0].value = np.round(self.parent.datasets[self.key].metadata['experiment']['exposure_time'], 4)
|
|
868
|
+
if 'flux_ppm' not in self.parent.datasets[self.key].metadata['experiment']:
|
|
869
|
+
self.parent.datasets[self.key].metadata['experiment']['flux_ppm'] = 0
|
|
870
|
+
self.info_tab[11, 0].value = self.parent.datasets[self.key].metadata['experiment']['flux_ppm']
|
|
871
|
+
if 'count_conversion' not in self.parent.datasets[self.key].metadata['experiment']:
|
|
872
|
+
self.parent.datasets[self.key].metadata['experiment']['count_conversion'] = 1
|
|
873
|
+
self.info_tab[12, 0].value = self.parent.datasets[self.key].metadata['experiment']['count_conversion']
|
|
874
|
+
if 'beam_current' not in self.parent.datasets[self.key].metadata['experiment']:
|
|
875
|
+
self.parent.datasets[self.key].metadata['experiment']['beam_current'] = 0
|
|
876
|
+
self.info_tab[13, 0].value = self.parent.datasets[self.key].metadata['experiment']['beam_current']
|
|
877
|
+
ll_key = 'None'
|
|
878
|
+
if '_relationship' in self.parent.datasets:
|
|
879
|
+
if 'low_loss' in self.parent.datasets['_relationship']:
|
|
880
|
+
ll_key = self.parent.datasets['_relationship']['low_loss']
|
|
881
|
+
ll_key = f'{ll_key}: {self.parent.datasets[ll_key].title}'
|
|
882
|
+
self.info_tab[9, 0].value = ll_key
|
|
883
|
+
|
|
709
884
|
def update_dataset(self, value=0):
|
|
710
885
|
key = self.info_tab[0, 0].value.split(':')[0]
|
|
711
|
-
self.set_dataset(key)
|
|
886
|
+
self.parent.set_dataset(key)
|
|
712
887
|
|
|
713
888
|
def shift_low_loss(self, value=0):
|
|
714
|
-
if 'low_loss' in self.datasets['_relationship']:
|
|
715
|
-
low_loss = self.datasets[self.datasets['_relationship']['low_loss']]
|
|
716
|
-
self.datasets[self.datasets['_relationship']['low_loss']] = eels_tools.align_zero_loss(low_loss)
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
if 'shifted' in self.datasets[self.datasets['_relationship']['low_loss']].metadata['zero_loss'].keys():
|
|
889
|
+
if 'low_loss' in self.parent.datasets['_relationship']:
|
|
890
|
+
low_loss = self.parent.datasets[self.parent.datasets['_relationship']['low_loss']]
|
|
891
|
+
self.parent.datasets[self.parent.datasets['_relationship']['low_loss']] = eels_tools.align_zero_loss(low_loss)
|
|
892
|
+
|
|
893
|
+
if 'low_loss' in self.parent.datasets['_relationship']:
|
|
894
|
+
if 'zero_loss' in self.parent.datasets[self.parent.datasets['_relationship']['low_loss']].metadata:
|
|
895
|
+
if 'shifted' in self.parent.datasets[self.parent.datasets['_relationship']['low_loss']].metadata['zero_loss'].keys():
|
|
722
896
|
self.info_tab[14, 1].disabled = False
|
|
723
|
-
|
|
897
|
+
|
|
724
898
|
|
|
725
899
|
def shift_spectrum(self, value=0):
|
|
726
|
-
shifts = self.dataset.shape
|
|
727
|
-
if 'low_loss' in self.datasets['_relationship']:
|
|
728
|
-
if 'zero_loss' in self.datasets[self.datasets['_relationship']['low_loss']].metadata:
|
|
729
|
-
if 'shifted' in self.datasets[self.datasets['_relationship']['low_loss']].metadata['zero_loss'].keys():
|
|
730
|
-
shifts = self.datasets[self.datasets['_relationship']['low_loss']].metadata['zero_loss']['shifted']
|
|
900
|
+
shifts = self.parent.dataset.shape
|
|
901
|
+
if 'low_loss' in self.parent.datasets['_relationship']:
|
|
902
|
+
if 'zero_loss' in self.parent.datasets[self.parent.datasets['_relationship']['low_loss']].metadata:
|
|
903
|
+
if 'shifted' in self.parent.datasets[self.parent.datasets['_relationship']['low_loss']].metadata['zero_loss'].keys():
|
|
904
|
+
shifts = self.parent.datasets[self.parent.datasets['_relationship']['low_loss']].metadata['zero_loss']['shifted']
|
|
731
905
|
shifts_new = shifts.copy()
|
|
732
|
-
if 'zero_loss' in self.dataset.metadata:
|
|
733
|
-
if 'shifted' in self.dataset.metadata['zero_loss'].keys():
|
|
734
|
-
shifts_new = shifts-self.dataset.metadata['zero_loss']['shifted']
|
|
906
|
+
if 'zero_loss' in self.parent.dataset.metadata:
|
|
907
|
+
if 'shifted' in self.parent.dataset.metadata['zero_loss'].keys():
|
|
908
|
+
shifts_new = shifts-self.parent.dataset.metadata['zero_loss']['shifted']
|
|
735
909
|
else:
|
|
736
|
-
self.dataset.metadata['zero_loss'] = {}
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
self.dataset = eels_tools.shift_energy(self.dataset, shifts_new)
|
|
740
|
-
self.dataset.metadata['zero_loss']['shifted'] = shifts
|
|
741
|
-
self.plot()
|
|
742
|
-
|
|
743
|
-
def get_resolution_function(self, value=0):
|
|
744
|
-
if 'low_loss' in self.datasets['_relationship']:
|
|
745
|
-
if 'zero_loss' in self.datasets[self.datasets['_relationship']['low_loss']].metadata:
|
|
746
|
-
if 'shifted' in self.datasets[self.datasets['_relationship']['low_loss']].metadata['zero_loss']:
|
|
747
|
-
low_loss = self.datasets[self.datasets['_relationship']['low_loss']]
|
|
748
|
-
zero_channel = np.searchsorted(low_loss.energy_loss, 0)
|
|
749
|
-
channels = np.argwhere(np.array(low_loss) > low_loss.max()/100).flatten()
|
|
750
|
-
energy = self.dataset.get_spectral_dims(return_axis=True)[0].values
|
|
751
|
-
self.datasets['resolution_function'] = eels_tools.get_resolution_functions(low_loss,
|
|
752
|
-
energy[channels[0]],
|
|
753
|
-
energy[channels[-1]])
|
|
754
|
-
self.datasets['resolution_function'].title = 'resolution_function'
|
|
755
|
-
self.axis.plot(self.datasets['resolution_function'].energy_loss,
|
|
756
|
-
self.datasets['resolution_function'],
|
|
757
|
-
label='resolution_function')
|
|
758
|
-
self.axis.legend()
|
|
759
|
-
|
|
760
|
-
resolution_key = self.dataset_list.append(f'resolution_function: resolution_function')
|
|
761
|
-
if resolution_key not in self.dataset_list:
|
|
762
|
-
self.dataset_list.append(resolution_key)
|
|
763
|
-
self.loaded_datasets.options = self.dataset_list
|
|
764
|
-
self.info_tab[0, 0].options = self.dataset_list
|
|
910
|
+
self.parent.dataset.metadata['zero_loss'] = {}
|
|
911
|
+
|
|
912
|
+
|
|
913
|
+
self.parent.dataset = eels_tools.shift_energy(self.parent.dataset, shifts_new)
|
|
914
|
+
self.parent.dataset.metadata['zero_loss']['shifted'] = shifts
|
|
915
|
+
self.parent.plot()
|
|
916
|
+
|
|
765
917
|
|
|
766
918
|
def set_action(self):
|
|
767
919
|
self.info_tab[0, 0].observe(self.update_dataset, names='value')
|
|
@@ -776,222 +928,6 @@ class InfoWidget(EELSWidget):
|
|
|
776
928
|
self.info_tab[10, 0].observe(self.set_flux)
|
|
777
929
|
self.info_tab[14, 0].on_click(self.shift_low_loss)
|
|
778
930
|
self.info_tab[14, 1].on_click(self.shift_spectrum)
|
|
779
|
-
self.info_tab[14, 2].on_click(self.get_resolution_function)
|
|
780
931
|
|
|
781
932
|
self.info_tab[16, 0].observe(self.set_binning)
|
|
782
933
|
self.info_tab[17, 0].observe(self.set_binning)
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
def get_low_loss_sidebar():
|
|
786
|
-
side_bar = ipywidgets.GridspecLayout(17, 3, width='auto', grid_gap="0px")
|
|
787
|
-
|
|
788
|
-
side_bar[0, :2] = ipywidgets.Dropdown(
|
|
789
|
-
options=[('None', 0)],
|
|
790
|
-
value=0,
|
|
791
|
-
description='Main Dataset:',
|
|
792
|
-
disabled=False)
|
|
793
|
-
|
|
794
|
-
row = 1
|
|
795
|
-
side_bar[row, :3] = ipywidgets.Button(description='Fix Energy Scale',
|
|
796
|
-
layout=ipywidgets.Layout(width='auto', grid_area='header'),
|
|
797
|
-
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
798
|
-
row += 1
|
|
799
|
-
side_bar[row, :2] = ipywidgets.FloatText(value=7.5, description='Offset:', disabled=False, color='black',
|
|
800
|
-
layout=ipywidgets.Layout(width='200px'))
|
|
801
|
-
side_bar[row, 2] = ipywidgets.widgets.Label(value="eV", layout=ipywidgets.Layout(width='20px'))
|
|
802
|
-
row += 1
|
|
803
|
-
side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Dispersion:', disabled=False, color='black',
|
|
804
|
-
layout=ipywidgets.Layout(width='200px'))
|
|
805
|
-
side_bar[row, 2] = ipywidgets.widgets.Label(value="eV", layout=ipywidgets.Layout(width='20px'))
|
|
806
|
-
|
|
807
|
-
row += 1
|
|
808
|
-
side_bar[row, :3] = ipywidgets.Button(description='Resolution_function',
|
|
809
|
-
layout=ipywidgets.Layout(width='auto', grid_area='header'),
|
|
810
|
-
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
811
|
-
row += 1
|
|
812
|
-
side_bar[row, :2] = ipywidgets.FloatText(value=0.3, description='Fit Window:', disabled=False, color='black',
|
|
813
|
-
layout=ipywidgets.Layout(width='200px'))
|
|
814
|
-
side_bar[row, 2] = ipywidgets.widgets.Label(value="eV", layout=ipywidgets.Layout(width='100px'))
|
|
815
|
-
row += 1
|
|
816
|
-
side_bar[row, :2] = ipywidgets.ToggleButton(description='Show Resolution Function',
|
|
817
|
-
disabled=False,
|
|
818
|
-
button_style='', # 'success', 'info', 'warning', 'danger' or ''
|
|
819
|
-
tooltip='Changes y-axis to probability if flux is given',
|
|
820
|
-
layout=ipywidgets.Layout(width='100px'))
|
|
821
|
-
side_bar[row, 2] = ipywidgets.ToggleButton(description='Probability',
|
|
822
|
-
disabled=False,
|
|
823
|
-
button_style='', # 'success', 'info', 'warning', 'danger' or ''
|
|
824
|
-
tooltip='Changes y-axis to probability if flux is given',
|
|
825
|
-
layout=ipywidgets.Layout(width='100px'))
|
|
826
|
-
row += 2
|
|
827
|
-
|
|
828
|
-
side_bar[row, :3] = ipywidgets.Button(description='Drude Fit',
|
|
829
|
-
layout=ipywidgets.Layout(width='auto', grid_area='header'),
|
|
830
|
-
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
831
|
-
row += 1
|
|
832
|
-
side_bar[row, :2] = ipywidgets.Dropdown(options=[('None', 0)],
|
|
833
|
-
value=0,
|
|
834
|
-
description='Low_Loss:',
|
|
835
|
-
disabled=False)
|
|
836
|
-
side_bar[row, 2] = ipywidgets.ToggleButton(description='Probability',
|
|
837
|
-
disabled=False,
|
|
838
|
-
button_style='',
|
|
839
|
-
tooltip='Changes y-axis to probability if flux is given',
|
|
840
|
-
layout=ipywidgets.Layout(width='100px'))
|
|
841
|
-
row += 1
|
|
842
|
-
side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Exp_Time:', disabled=False, color='black',
|
|
843
|
-
layout=ipywidgets.Layout(width='200px'))
|
|
844
|
-
side_bar[row, 2] = ipywidgets.widgets.Label(value="s", layout=ipywidgets.Layout(width='100px'))
|
|
845
|
-
row += 1
|
|
846
|
-
side_bar[row, :2] = ipywidgets.FloatText(value=7.5, description='Flux:', disabled=False, color='black',
|
|
847
|
-
layout=ipywidgets.Layout(width='200px'))
|
|
848
|
-
side_bar[row, 2] = ipywidgets.widgets.Label(value="Mcounts", layout=ipywidgets.Layout(width='100px'))
|
|
849
|
-
row += 1
|
|
850
|
-
side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Conversion:', disabled=False, color='black',
|
|
851
|
-
layout=ipywidgets.Layout(width='200px'))
|
|
852
|
-
side_bar[row, 2] = ipywidgets.widgets.Label(value=r"e$^-$/counts", layout=ipywidgets.Layout(width='100px'))
|
|
853
|
-
row += 1
|
|
854
|
-
side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Current:', disabled=False, color='black',
|
|
855
|
-
layout=ipywidgets.Layout(width='200px'))
|
|
856
|
-
side_bar[row, 2] = ipywidgets.widgets.Label(value="pA", layout=ipywidgets.Layout(width='100px'))
|
|
857
|
-
|
|
858
|
-
row += 1
|
|
859
|
-
|
|
860
|
-
side_bar[row, :3] = ipywidgets.Button(description='Spectrum Image',
|
|
861
|
-
layout=ipywidgets.Layout(width='auto', grid_area='header'),
|
|
862
|
-
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
863
|
-
|
|
864
|
-
row += 1
|
|
865
|
-
side_bar[row, :2] = ipywidgets.IntText(value=1, description='bin X:', disabled=False, color='black',
|
|
866
|
-
layout=ipywidgets.Layout(width='200px'))
|
|
867
|
-
row += 1
|
|
868
|
-
side_bar[row, :2] = ipywidgets.IntText(value=1, description='bin X:', disabled=False, color='black',
|
|
869
|
-
layout=ipywidgets.Layout(width='200px'))
|
|
870
|
-
|
|
871
|
-
for i in range(15, 18):
|
|
872
|
-
pass
|
|
873
|
-
# side_bar[i, 0].layout.display = "none"
|
|
874
|
-
return side_bar
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
class LowLossWidget(EELSWidget):
|
|
878
|
-
def __init__(self, datasets):
|
|
879
|
-
sidebar = get_low_loss_sidebar()
|
|
880
|
-
super().__init__(datasets, sidebar)
|
|
881
|
-
self.info_tab[3, 0].value = self.energy_scale[0]
|
|
882
|
-
self.info_tab[4, 0].value = self.energy_scale[1] - self.energy_scale[0]
|
|
883
|
-
|
|
884
|
-
self.set_action()
|
|
885
|
-
|
|
886
|
-
def update_sidebar(self):
|
|
887
|
-
spectrum_list = []
|
|
888
|
-
reference_list = [('None', -1)]
|
|
889
|
-
for index, key in enumerate(self.datasets.keys()):
|
|
890
|
-
if isinstance(self.datasets[key], sidpy.Dataset):
|
|
891
|
-
if 'Reference' not in key:
|
|
892
|
-
if 'SPECTR' in self.datasets[key].data_type.name:
|
|
893
|
-
spectrum_list.append((f'{key}: {self.datasets[key].title}', index))
|
|
894
|
-
reference_list.append((f'{key}: {self.datasets[key].title}', index))
|
|
895
|
-
|
|
896
|
-
self.info_tab[0, 0].options = spectrum_list
|
|
897
|
-
self.info_tab[9, 0].options = reference_list
|
|
898
|
-
|
|
899
|
-
if 'SPECTRUM' in self.dataset.data_type.name:
|
|
900
|
-
for i in range(14, 17):
|
|
901
|
-
self.info_tab[i, 0].layout.display = "none"
|
|
902
|
-
else:
|
|
903
|
-
for i in range(14, 17):
|
|
904
|
-
self.info_tab[i, 0].layout.display = "flex"
|
|
905
|
-
|
|
906
|
-
def get_resolution_function(self, value):
|
|
907
|
-
self.datasets['resolution_functions'] = eels_tools.get_resolution_functions(self.dataset,
|
|
908
|
-
zero_loss_fit_width=self.info_tab[5, 0].value)
|
|
909
|
-
if 'low_loss' not in self.dataset.metadata:
|
|
910
|
-
self.dataset.metadata['low_loss'] = {}
|
|
911
|
-
self.dataset.metadata['low_loss'].update(self.datasets['resolution_functions'].metadata['low_loss'])
|
|
912
|
-
self.info_tab[6, 0].value = True
|
|
913
|
-
|
|
914
|
-
def update_dataset(self):
|
|
915
|
-
dataset_index = self.info_tab[0, 0].value
|
|
916
|
-
self.set_dataset(dataset_index)
|
|
917
|
-
|
|
918
|
-
def set_action(self):
|
|
919
|
-
self.info_tab[0, 0].observe(self.update_dataset)
|
|
920
|
-
self.info_tab[1, 0].on_click(self.fix_energy_scale)
|
|
921
|
-
self.info_tab[2, 0].observe(self.set_energy_scale, names='value')
|
|
922
|
-
self.info_tab[3, 0].observe(self.set_energy_scale, names='value')
|
|
923
|
-
self.info_tab[4, 0].on_click(self.get_resolution_function)
|
|
924
|
-
self.info_tab[6, 2].observe(self.set_y_scale, names='value')
|
|
925
|
-
self.info_tab[6, 0].observe(self._update, names='value')
|
|
926
|
-
|
|
927
|
-
def fix_energy_scale(self, value=0):
|
|
928
|
-
self.dataset = eels_tools.shift_on_same_scale(self.dataset)
|
|
929
|
-
self.datasets[self.key] = self.dataset
|
|
930
|
-
if 'resolution_functions' in self.datasets:
|
|
931
|
-
self.datasets['resolution_functions'] = eels_tools.shift_on_same_scale(self.datasets['resolution_functions'])
|
|
932
|
-
self._update()
|
|
933
|
-
|
|
934
|
-
def set_y_scale(self, value):
|
|
935
|
-
self.change_y_scale = 1.0/self.y_scale
|
|
936
|
-
if self.info_tab[6, 2].value:
|
|
937
|
-
dispersion = self.dataset.energy_loss[1] - self.dataset.energy_loss[0]
|
|
938
|
-
if self.dataset.data_type.name == 'SPECTRUM':
|
|
939
|
-
sum = self.dataset.sum()
|
|
940
|
-
else:
|
|
941
|
-
image_dims = self.dataset.get_dimensions_by_type(sidpy.DimensionType.SPATIAL)
|
|
942
|
-
sum = np.average(self.dataset, axis=image_dims).sum()
|
|
943
|
-
|
|
944
|
-
self.y_scale = 1/sum * dispersion * 1e6
|
|
945
|
-
# self.datasets[self.key].metadata['experiment']['flux_ppm'] * dispersion
|
|
946
|
-
self.ylabel = 'scattering probability (ppm)'
|
|
947
|
-
else:
|
|
948
|
-
self.y_scale = 1.0
|
|
949
|
-
self.ylabel = 'intensity (counts)'
|
|
950
|
-
self.change_y_scale *= self.y_scale
|
|
951
|
-
self._update()
|
|
952
|
-
|
|
953
|
-
def _update(self, ev=0):
|
|
954
|
-
super()._update(ev)
|
|
955
|
-
if self.info_tab[6, 0].value:
|
|
956
|
-
if 'resolution_functions' in self.datasets:
|
|
957
|
-
resolution_function = self.get_additional_spectrum('resolution_functions')
|
|
958
|
-
self.axis.plot(self.energy_scale, resolution_function, label='resolution_function')
|
|
959
|
-
self.axis.legend()
|
|
960
|
-
|
|
961
|
-
def get_additional_spectrum(self, key):
|
|
962
|
-
if key not in self.datasets.keys():
|
|
963
|
-
return
|
|
964
|
-
|
|
965
|
-
if self.datasets[key].data_type == sidpy.DataType.SPECTRUM:
|
|
966
|
-
self.spectrum = self.datasets[key].copy()
|
|
967
|
-
else:
|
|
968
|
-
image_dims = self.datasets[key].get_dimensions_by_type(sidpy.DimensionType.SPATIAL)
|
|
969
|
-
selection = []
|
|
970
|
-
for dim, axis in self.datasets[key]._axes.items():
|
|
971
|
-
# print(dim, axis.dimension_type)
|
|
972
|
-
if axis.dimension_type == sidpy.DimensionType.SPATIAL:
|
|
973
|
-
if dim == image_dims[0]:
|
|
974
|
-
selection.append(slice(self.x, self.x + self.bin_x))
|
|
975
|
-
else:
|
|
976
|
-
selection.append(slice(self.y, self.y + self.bin_y))
|
|
977
|
-
|
|
978
|
-
elif axis.dimension_type == sidpy.DimensionType.SPECTRAL:
|
|
979
|
-
selection.append(slice(None))
|
|
980
|
-
elif axis.dimension_type == sidpy.DimensionType.CHANNEL:
|
|
981
|
-
selection.append(slice(None))
|
|
982
|
-
else:
|
|
983
|
-
selection.append(slice(0, 1))
|
|
984
|
-
|
|
985
|
-
self.spectrum = self.datasets[key][tuple(selection)].mean(axis=tuple(image_dims))
|
|
986
|
-
|
|
987
|
-
self.spectrum *= self.y_scale
|
|
988
|
-
|
|
989
|
-
return self.spectrum.squeeze()
|
|
990
|
-
|
|
991
|
-
def set_binning(self, value):
|
|
992
|
-
if 'SPECTRAL' in self.dataset.data_type.name:
|
|
993
|
-
bin_x = self.info_tab[15, 0].value
|
|
994
|
-
bin_y = self.info_tab[16, 0].value
|
|
995
|
-
self.dataset.view.set_bin([bin_x, bin_y])
|
|
996
|
-
self.datasets[self.key].metadata['experiment']['SI_bin_x'] = bin_x
|
|
997
|
-
self.datasets[self.key].metadata['experiment']['SI_bin_y'] = bin_y
|