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/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=7.5, description='Conv.Angle:', disabled=False, color='black',
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=0.1, description='Coll.Angle:', disabled=False, color='black',
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=0.1, description='Acc Voltage:', disabled=False, color='black',
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=7.5, description='Conv.Angle:', disabled=False, color='black',
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=0.1, description='Coll.Angle:', disabled=False, color='black',
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 X:', disabled=False, color='black',
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
- tab = ipywidgets.Tab()
283
- tab.children = [self.file_bar, sidebar]
284
- tab.titles = ['File', 'Info']
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 = sidebar
287
- self.tab = tab
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
- self.figure.canvas])
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.plot, names='value')
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
- def set_image(self, key=None):
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 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()
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.key
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
- 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
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
- self.key = self.parent.key
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 spectrum_data:
858
- offset = self.parent.datasets[self.key].energy_loss[0]
859
- dispersion = self.parent.datasets[self.key].energy_loss[1] - offset
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
- self.parent.set_dataset(key)
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
- self.parent.datasets[self.parent.datasets['_relationship']['low_loss']] = eels_tools.align_zero_loss(low_loss)
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)