pyTEMlib 0.2024.2.2__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/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(6, 3, height='500px', width='auto', grid_gap="0px")
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 EELSWidget(object):
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
- self.energy_scale = self.dataset.get_spectral_dims(return_axis=True)[0]
264
-
265
- if self.dataset.data_type.name == 'SPECTRUM':
266
- self.axis = self.figure.subplots(ncols=1)
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.plot_spectrum_image()
269
- self.axis = self.axes[-1]
270
- self.spectrum = self.get_spectrum()
367
+ self.axis = self.figure.subplots(ncols=1)
368
+ self.plot_image()
271
369
 
272
- self.plot_spectrum()
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 = {'Channel_000': data_set}
435
- key = 'Channel_000'
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
- if 'SPECTR' in self.datasets[key].data_type.name:
443
- self.dataset_list.append(f'{key}: {self.datasets[key].title}')
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
- self.energy_scale = self.dataset.get_spectral_dims(return_axis=True)[0]
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 update_sidebar(self):
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.dataset_list.append(f'{key}: {self.datasets[key].title}')
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
- # self.survey_list.extend(self.image_list)
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 = {'Info': get_info_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['Info']
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.energy_scale = self.datasets[self.key].get_spectral_dims(return_axis=True)[0]
586
- dispersion = self.datasets[self.key].get_dimension_slope(self.energy_scale)
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
- key = self.info_tab[9, 0].value.split(':')[0]
612
- self.datasets['_relationship']['low_loss'] = key
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[key].metadata['experiment']['exposure_time'] == 0.0:
620
- if self.datasets[key].metadata['experiment']['single_exposure_time'] == 0.0:
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[key].metadata['experiment']['exposure_time'] = (self.datasets[key].metadata['experiment']['single_exposure_time'] *
624
- self.datasets[key].metadata['experiment']['number_of_frames'])
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[key])*1e-6).sum() /
627
- self.datasets[key].metadata['experiment']['exposure_time'] /
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[key].data_type.name:
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
- self.info_tab[3, 0].value = dispersion
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.plot()
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
- for key in self.datasets.keys():
677
- if isinstance(self.datasets[key], sidpy.Dataset):
678
- if 'Reference' not in key:
679
- if 'SPECTR' in self.datasets[key].data_type.name:
680
- spectrum_list.append(f'{key}: {self.datasets[key].title}')
681
- reference_list.append(f'{key}: {self.datasets[key].title}')
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
- # self.info_tab[0,0].value = dataset_index #f'{self.key}: {self.datasets[self.key].title}'
693
- self.info_tab[2, 0].value = np.round(self.datasets[self.key].energy_loss[0], 3)
694
- self.info_tab[3, 0].value = np.round(self.datasets[self.key].energy_loss[1] - self.datasets[self.key].energy_loss[0], 4)
695
- self.info_tab[5, 0].value = np.round(self.datasets[self.key].metadata['experiment']['convergence_angle'], 1)
696
- self.info_tab[6, 0].value = np.round(self.datasets[self.key].metadata['experiment']['collection_angle'], 1)
697
- self.info_tab[7, 0].value = np.round(self.datasets[self.key].metadata['experiment']['acceleration_voltage']/1000, 1)
698
- self.info_tab[10, 0].value = np.round(self.datasets[self.key].metadata['experiment']['exposure_time'], 4)
699
- if 'flux_ppm' not in self.datasets[self.key].metadata['experiment']:
700
- self.datasets[self.key].metadata['experiment']['flux_ppm'] = 0
701
- self.info_tab[11, 0].value = self.datasets[self.key].metadata['experiment']['flux_ppm']
702
- if 'count_conversion' not in self.datasets[self.key].metadata['experiment']:
703
- self.datasets[self.key].metadata['experiment']['count_conversion'] = 1
704
- self.info_tab[12, 0].value = self.datasets[self.key].metadata['experiment']['count_conversion']
705
- if 'beam_current' not in self.datasets[self.key].metadata['experiment']:
706
- self.datasets[self.key].metadata['experiment']['beam_current'] = 0
707
- self.info_tab[13, 0].value = self.datasets[self.key].metadata['experiment']['beam_current']
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
- print('1')
718
- print('2')
719
- if 'low_loss' in self.datasets['_relationship']:
720
- if 'zero_loss' in self.datasets[self.datasets['_relationship']['low_loss']].metadata:
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
- print('shifted')
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
- print(shifts_new)
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