pyTEMlib 0.2023.8.0__py2.py3-none-any.whl → 0.2024.2.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
@@ -1,22 +1,20 @@
1
- import numpy as np
2
- import sidpy
3
-
1
+ from typing import Any
4
2
 
5
- import pyTEMlib.eels_dialog_utilities as ieels
6
- import pyTEMlib.file_tools as ft
7
- from pyTEMlib.microscope import microscope
3
+ import numpy as np
4
+ import os
8
5
  import ipywidgets
9
6
  import matplotlib.pylab as plt
10
7
  import matplotlib
11
-
12
8
  from IPython.display import display
13
9
 
14
-
10
+ import sidpy
11
+ # from pyTEMlib.microscope import microscope
15
12
  from pyTEMlib import file_tools
16
13
  from pyTEMlib import eels_tools
17
14
 
18
- def get_info_sidebar():
19
- side_bar = ipywidgets.GridspecLayout(17, 3,width='auto', grid_gap="0px")
15
+
16
+ def get_info_sidebar() -> Any:
17
+ side_bar = ipywidgets.GridspecLayout(18, 3, width='auto', grid_gap="0px")
20
18
 
21
19
  side_bar[0, :2] = ipywidgets.Dropdown(
22
20
  options=[('None', 0)],
@@ -26,116 +24,243 @@ def get_info_sidebar():
26
24
 
27
25
  row = 1
28
26
  side_bar[row, :3] = ipywidgets.Button(description='Energy Scale',
29
- layout=ipywidgets.Layout(width='auto', grid_area='header'),
30
- style=ipywidgets.ButtonStyle(button_color='lightblue'))
27
+ layout=ipywidgets.Layout(width='auto', grid_area='header'),
28
+ style=ipywidgets.ButtonStyle(button_color='lightblue'))
31
29
  row += 1
32
- side_bar[row, :2] = ipywidgets.FloatText(value=7.5,description='Offset:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
30
+ side_bar[row, :2] = ipywidgets.FloatText(value=7.5, description='Offset:', disabled=False, color='black',
31
+ layout=ipywidgets.Layout(width='200px'))
33
32
  side_bar[row, 2] = ipywidgets.widgets.Label(value="eV", layout=ipywidgets.Layout(width='20px'))
34
33
  row += 1
35
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Dispersion:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
34
+ side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Dispersion:', disabled=False, color='black',
35
+ layout=ipywidgets.Layout(width='200px'))
36
36
  side_bar[row, 2] = ipywidgets.widgets.Label(value="eV", layout=ipywidgets.Layout(width='20px'))
37
-
38
37
  row += 1
39
38
  side_bar[row, :3] = ipywidgets.Button(description='Microscope',
40
- layout=ipywidgets.Layout(width='auto', grid_area='header'),
41
- style=ipywidgets.ButtonStyle(button_color='lightblue'))
39
+ layout=ipywidgets.Layout(width='auto', grid_area='header'),
40
+ style=ipywidgets.ButtonStyle(button_color='lightblue'))
42
41
  row += 1
43
- side_bar[row, :2] = ipywidgets.FloatText(value=7.5,description='Conv.Angle:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
42
+ side_bar[row, :2] = ipywidgets.FloatText(value=7.5, description='Conv.Angle:', disabled=False, color='black',
43
+ layout=ipywidgets.Layout(width='200px'))
44
44
  side_bar[row, 2] = ipywidgets.widgets.Label(value="mrad", layout=ipywidgets.Layout(width='100px'))
45
45
  row += 1
46
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Coll.Angle:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
46
+ side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Coll.Angle:', disabled=False, color='black',
47
+ layout=ipywidgets.Layout(width='200px'))
47
48
  side_bar[row, 2] = ipywidgets.widgets.Label(value="mrad", layout=ipywidgets.Layout(width='100px'))
48
49
  row += 1
49
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Acc Voltage:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
50
+ side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Acc Voltage:', disabled=False, color='black',
51
+ layout=ipywidgets.Layout(width='200px'))
50
52
  side_bar[row, 2] = ipywidgets.widgets.Label(value="keV", layout=ipywidgets.Layout(width='100px'))
53
+
54
+ row += 1
55
+ side_bar[row, :3] = ipywidgets.Button(description='Calibration',
56
+ layout=ipywidgets.Layout(width='auto', grid_area='header'),
57
+ style=ipywidgets.ButtonStyle(button_color='lightblue'))
51
58
  row += 1
52
-
53
- side_bar[row, :3] = ipywidgets.Button(description='Quantification',
54
- layout=ipywidgets.Layout(width='auto', grid_area='header'),
55
- style=ipywidgets.ButtonStyle(button_color='lightblue'))
56
- row+=1
57
59
  side_bar[row, :2] = ipywidgets.Dropdown(
58
60
  options=[('None', 0)],
59
61
  value=0,
60
62
  description='Reference:',
61
63
  disabled=False)
62
- side_bar[row,2] = ipywidgets.ToggleButton(
63
- description='Probability',
64
- disabled=False,
65
- button_style='', # 'success', 'info', 'warning', 'danger' or ''
66
- tooltip='Changes y-axis to probability if flux is given',
67
- layout=ipywidgets.Layout(width='100px'))
68
- row += 1
69
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Exp_Time:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
64
+ side_bar[row, 2] = ipywidgets.ToggleButton(description='Probability',
65
+ disabled=False,
66
+ button_style='', # 'success', 'info', 'warning', 'danger' or ''
67
+ tooltip='Changes y-axis to probability if flux is given',
68
+ layout=ipywidgets.Layout(width='100px'))
69
+ row += 1
70
+ side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Exp_Time:', disabled=False, color='black',
71
+ layout=ipywidgets.Layout(width='200px'))
70
72
  side_bar[row, 2] = ipywidgets.widgets.Label(value="s", layout=ipywidgets.Layout(width='100px'))
71
73
  row += 1
72
- side_bar[row, :2] = ipywidgets.FloatText(value=7.5,description='Flux:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
73
- side_bar[row, 2] = ipywidgets.widgets.Label(value="Mcounts", layout=ipywidgets.Layout(width='100px'))
74
+ side_bar[row, :2] = ipywidgets.FloatText(value=7.5, description='Flux:', disabled=False, color='black',
75
+ layout=ipywidgets.Layout(width='200px'))
76
+ side_bar[row, 2] = ipywidgets.widgets.Label(value="Mcounts", layout=ipywidgets.Layout(width='50px'))
74
77
  row += 1
75
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Conversion:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
76
- side_bar[row, 2] = ipywidgets.widgets.Label(value=r"e$^-$/counts", layout=ipywidgets.Layout(width='100px'))
78
+ side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Conversion:', disabled=False, color='black',
79
+ layout=ipywidgets.Layout(width='200px'))
80
+ side_bar[row, 2] = ipywidgets.widgets.Label(value="e⁻/counts", layout=ipywidgets.Layout(width='100px'))
77
81
  row += 1
78
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Current:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
79
- side_bar[row, 2] = ipywidgets.widgets.Label(value="pA", layout=ipywidgets.Layout(width='100px') )
82
+ side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Current:', disabled=False, color='black',
83
+ layout=ipywidgets.Layout(width='200px'))
84
+ side_bar[row, 2] = ipywidgets.widgets.Label(value="pA", layout=ipywidgets.Layout(width='100px'))
85
+
86
+ row += 1
87
+ side_bar[row, 0] = ipywidgets.Button(description='Get Shift', disabled=True,
88
+ layout=ipywidgets.Layout(width='auto'),
89
+ style=ipywidgets.ButtonStyle(button_color='lightblue'))
90
+ side_bar[row, 1] = ipywidgets.Button(description='Shift Spec', disabled=True,
91
+ layout=ipywidgets.Layout(width='auto'),
92
+ style=ipywidgets.ButtonStyle(button_color='lightblue'))
93
+ side_bar[row, 2] = ipywidgets.Button(description='Res.Fct.', disabled=True,
94
+ layout=ipywidgets.Layout(width='auto'),
95
+ style=ipywidgets.ButtonStyle(button_color='lightblue'))
80
96
 
81
97
  row += 1
82
-
83
98
  side_bar[row, :3] = ipywidgets.Button(description='Spectrum Image',
84
- layout=ipywidgets.Layout(width='auto', grid_area='header'),
85
- style=ipywidgets.ButtonStyle(button_color='lightblue'))
99
+ layout=ipywidgets.Layout(width='auto', grid_area='header'),
100
+ style=ipywidgets.ButtonStyle(button_color='lightblue'))
86
101
 
87
102
  row += 1
88
- side_bar[row, :2] = ipywidgets.IntText(value=1, description='bin X:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
103
+ side_bar[row, :2] = ipywidgets.IntText(value=1, description='bin X:', disabled=False, color='black',
104
+ layout=ipywidgets.Layout(width='200px'))
89
105
  row += 1
90
- side_bar[row, :2] = ipywidgets.IntText(value=1, description='bin X:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
106
+ side_bar[row, :2] = ipywidgets.IntText(value=1, description='bin X:', disabled=False, color='black',
107
+ layout=ipywidgets.Layout(width='200px'))
91
108
 
92
- for i in range(14, 17):
109
+ for i in range(15, 18):
93
110
  side_bar[i, 0].layout.display = "none"
94
111
  return side_bar
95
112
 
96
- from sidpy.io.interface_utils import open_file_dialog
113
+
114
+ def get_file_widget_ui():
115
+ side_bar = ipywidgets.GridspecLayout(6, 3, height='500px', width='auto', grid_gap="0px")
116
+ row = 0
117
+ side_bar[row, :3] = ipywidgets.Dropdown(options=['None'], value='None', description='directory:', disabled=False,
118
+ button_style='', layout=ipywidgets.Layout(width='auto', grid_area='header'))
119
+ row += 1
120
+ side_bar[row, :3] = ipywidgets.Select(options=['.'], value='.', description='Select file:', disabled=False,
121
+ rows=10, layout=ipywidgets.Layout(width='auto'))
122
+ row += 1
123
+ side_bar[row, 0] = ipywidgets.Button(description='Select Main',
124
+ layout=ipywidgets.Layout(width='100px'),
125
+ style=ipywidgets.ButtonStyle(button_color='lightblue'))
126
+ side_bar[row, 1] = ipywidgets.Button(description='Add',
127
+ layout=ipywidgets.Layout(width='50px'),
128
+ style=ipywidgets.ButtonStyle(button_color='lightblue'))
129
+ side_bar[row, 2] = ipywidgets.Dropdown(options=['None'], value='None', description='loaded:', disabled=False,
130
+ button_style='')
131
+
132
+ row += 1
133
+ side_bar[row, :3] = ipywidgets.Select(options=['None'], value='None', description='Spectral:',
134
+ disabled=False, rows=3, layout=ipywidgets.Layout(width='auto'))
135
+ row += 1
136
+ side_bar[row, :3] = ipywidgets.Select(options=['Sum'], value='Sum', description='Images:',
137
+ disabled=False, rows=3, layout=ipywidgets.Layout(width='auto'))
138
+ row += 1
139
+ side_bar[row, :3] = ipywidgets.Select(options=['None'], value='None', description='Survey:',
140
+ disabled=False, rows=2, layout=ipywidgets.Layout(width='auto'))
141
+ for i in range(3, 6):
142
+ side_bar[i, 0].layout.display = "none"
143
+
144
+ return side_bar
145
+
146
+
97
147
  class EELSWidget(object):
98
- def __init__(self, datasets, sidebar, tab_title = None):
148
+
149
+ def __init__(self, datasets, sidebar, tab_title=None):
99
150
 
100
151
  self.datasets = datasets
101
152
  self.dataset = None
102
-
103
- if not isinstance(sidebar, list):
153
+ self.save_path = False
154
+ self.dir_dictionary = {}
155
+ self.dir_list = ['.', '..']
156
+ self.display_list = ['.', '..']
157
+ self.dataset_list = ['None']
158
+ self.image_list = ['Sum']
159
+ self.dir_name = file_tools.get_last_path()
160
+
161
+ self.save_path = True
162
+
163
+ if not os.path.isdir(self.dir_name):
164
+ self.dir_name = '.'
165
+
166
+ self.get_directory(self.dir_name)
167
+ self.dir_list = ['.']
168
+ self.extensions = '*'
169
+ self.file_name = ''
170
+ self.datasets = {}
171
+ self.dataset = None
172
+
173
+ self.bin_x = 0
174
+ self.bin_y = 0
175
+
176
+ self.start_channel = -1
177
+ self.end_channel = -2
178
+
179
+ self.file_bar = get_file_widget_ui()
180
+ if isinstance(sidebar, dict):
181
+ tab = ipywidgets.Tab()
182
+ children = [self.file_bar]
183
+ titles = ['File']
184
+ for sidebar_key, sidebar_gui in sidebar.items():
185
+ children.append(sidebar_gui)
186
+ titles.append(sidebar_key)
187
+ tab.children = children
188
+ tab.titles = titles
189
+ elif not isinstance(sidebar, list):
104
190
  tab = ipywidgets.Tab()
105
- tab.children = [ft.FileWidget(), sidebar]
106
- tab.titles = ['Load', 'Info']
191
+ tab.children = [self.file_bar, sidebar]
192
+ tab.titles = ['File', 'Info']
107
193
  else:
108
194
  tab = sidebar
109
195
 
110
- self.sidebar = sidebar
111
196
  with plt.ioff():
112
197
  self.figure = plt.figure()
113
198
 
114
199
  self.figure.canvas.toolbar_position = 'right'
115
200
  self.figure.canvas.toolbar_visible = True
116
201
 
117
- self.start_cursor = ipywidgets.FloatText(value=0, description='Start:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
118
- self.end_cursor = ipywidgets.FloatText(value=0, description='End:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
119
- self.panel = ipywidgets.VBox([ipywidgets.HBox([ipywidgets.Label('',layout=ipywidgets.Layout(width='100px')), ipywidgets.Label('Cursor:'),
120
- self.start_cursor,ipywidgets.Label('eV'),
202
+ self.start_cursor = ipywidgets.FloatText(value=0, description='Start:', disabled=False, color='black',
203
+ layout=ipywidgets.Layout(width='200px'))
204
+ self.end_cursor = ipywidgets.FloatText(value=0, description='End:', disabled=False, color='black',
205
+ layout=ipywidgets.Layout(width='200px'))
206
+ self.panel = ipywidgets.VBox([ipywidgets.HBox([ipywidgets.Label('', layout=ipywidgets.Layout(width='100px')),
207
+ ipywidgets.Label('Cursor:'),
208
+ self.start_cursor, ipywidgets.Label('eV'),
121
209
  self.end_cursor, ipywidgets.Label('eV')]),
122
210
  self.figure.canvas])
123
211
 
124
-
125
212
  self.app_layout = ipywidgets.AppLayout(
126
213
  left_sidebar=tab,
127
214
  center=self.panel,
128
- footer=None,#message_bar,
215
+ footer=None, # message_bar,
129
216
  pane_heights=[0, 10, 0],
130
217
  pane_widths=[4, 10, 0],
131
218
  )
132
- self.set_dataset()
133
-
219
+ # self.set_dataset()
220
+ self.change_y_scale = 1.0
221
+ self.x = 0
222
+ self.y = 0
223
+ self.bin_x = 1
224
+ self.bin_y = 1
225
+ self.count = 0
134
226
  display(self.app_layout)
135
227
 
228
+ self.select_files = self.file_bar[1, 0]
229
+ self.path_choice = self.file_bar[0, 0]
230
+ self.set_file_options()
231
+ select_button = self.file_bar[2, 0]
232
+ add_button = self.file_bar[2, 1]
233
+ self.loaded_datasets = self.file_bar[2, 2]
234
+ self.select_files.observe(self.get_file_name, names='value')
235
+ self.path_choice.observe(self.set_dir, names='value')
236
+
237
+ select_button.on_click(self.select_main)
238
+ add_button.on_click(self.add_dataset)
239
+ self.loaded_datasets.observe(self.select_dataset, names='value')
240
+ self.file_bar[4, 0].observe(self.plot, names='value')
241
+
242
+ def set_image(self, key=None):
243
+ if self.file_bar[4, 0].value == 'Sum':
244
+ spec_dim = self.dataset.get_dimensions_by_type(sidpy.DimensionType.SPECTRAL)
245
+ if len(spec_dim) != 1:
246
+ raise ValueError('Only one spectral dimension')
247
+
248
+ channel_dim = self.dataset.get_dimensions_by_type(sidpy.DimensionType.CHANNEL)
249
+
250
+ if len(channel_dim) > 1:
251
+ raise ValueError('Maximal one channel dimension')
252
+
253
+ if len(channel_dim) > 0:
254
+ self.image = self.dataset.mean(axis=(spec_dim[0], channel_dim[0]))
255
+ else:
256
+ self.image = self.dataset.mean(axis=(spec_dim[0]))
257
+ else:
258
+ image_key = self.file_bar[4, 0].value.split(':')[0]
259
+ self.image = self.datasets[image_key]
260
+
136
261
  def plot(self, scale=True):
137
262
  self.figure.clear()
138
- self.energy_scale = self.dataset.energy_loss.values
263
+ self.energy_scale = self.dataset.get_spectral_dims(return_axis=True)[0]
139
264
 
140
265
  if self.dataset.data_type.name == 'SPECTRUM':
141
266
  self.axis = self.figure.subplots(ncols=1)
@@ -154,44 +279,50 @@ class EELSWidget(object):
154
279
  self.ylabel = self.datasets[self.key].data_descriptor
155
280
  self.axis.set_xlabel(self.datasets[self.key].labels[0])
156
281
  self.axis.set_ylabel(self.datasets[self.key].data_descriptor)
157
- self.axis.ticklabel_format(style='sci', scilimits=(-2, 3))
158
- #if scale:
282
+ self.axis.ticklabel_format(style='sci', scilimits=(-2, 4))
283
+
284
+ # if scale:
159
285
  # self.axis.set_ylim(np.array(y_limit)*self.change_y_scale)
160
286
  self.change_y_scale = 1.0
161
287
  if self.y_scale != 1.:
162
- self.axis.set_ylabel('scattering probability (ppm/eV)')
288
+ self.axis.set_ylabel('scattering probability (ppm/eV)')
163
289
  self.selector = matplotlib.widgets.SpanSelector(self.axis, self.line_select_callback,
164
- direction="horizontal",
165
- interactive=True,
166
- props=dict(facecolor='blue', alpha=0.2))
290
+ direction="horizontal",
291
+ interactive=True,
292
+ props=dict(facecolor='blue', alpha=0.2))
167
293
  self.axis.legend()
168
294
  if self.dataset.data_type.name == 'SPECTRUM':
169
- self.axis.set_title(self.dataset.title)
295
+ self.axis.set_title(self.dataset.title)
170
296
  else:
171
297
  self.axis.set_title(f'spectrum {self.x}, {self.y}')
172
298
  self.figure.canvas.draw_idle()
173
299
 
174
300
  def _update(self, ev=None):
175
-
176
- xlim = np.array(self.axes[1].get_xlim())
177
- ylim = np.array(self.axes[1].get_ylim())
178
- self.axes[1].clear()
301
+ if hasattr(self, 'axes'):
302
+ xlim = np.array(self.axes[1].get_xlim())
303
+ ylim = np.array(self.axes[1].get_ylim())
304
+ self.axes[1].clear()
305
+ self.axis = self.axes[-1]
306
+ else:
307
+ xlim = np.array(self.axis.get_xlim())
308
+ ylim = np.array(self.axis.get_ylim())
309
+ self.axis.clear()
179
310
  self.get_spectrum()
180
- if len(self.energy_scale)!=self.spectrum.shape[0]:
311
+ if len(self.energy_scale) != self.spectrum.shape[0]:
181
312
  self.spectrum = self.spectrum.T
182
- self.axes[1].plot(self.energy_scale, self.spectrum.compute(), label='experiment')
313
+ self.axis.plot(self.energy_scale, self.spectrum.compute(), label='experiment')
183
314
 
184
- self.axes[1].set_title(f'spectrum {self.x}, {self.y}')
315
+ self.axis.set_title(f'spectrum {self.x}, {self.y}')
185
316
  self.figure.tight_layout()
186
317
  self.selector = matplotlib.widgets.SpanSelector(self.axis, self.line_select_callback,
187
- direction="horizontal",
188
- interactive=True,
189
- props=dict(facecolor='blue', alpha=0.2))
190
-
191
- self.axes[1].set_xlim(xlim)
192
- self.axes[1].set_ylim(ylim*self.change_y_scale)
193
- self.axes[1].set_xlabel(self.xlabel)
194
- self.axes[1].set_ylabel(self.ylabel)
318
+ direction="horizontal",
319
+ interactive=True,
320
+ props=dict(facecolor='blue', alpha=0.2))
321
+
322
+ self.axis.set_xlim(xlim)
323
+ self.axis.set_ylim(ylim*self.change_y_scale)
324
+ self.axis.set_xlabel(self.xlabel)
325
+ self.axis.set_ylabel(self.ylabel)
195
326
  self.change_y_scale = 1.0
196
327
  self.figure.canvas.draw_idle()
197
328
 
@@ -208,7 +339,7 @@ class EELSWidget(object):
208
339
  if x <= self.rectangle[1] and y <= self.rectangle[3]:
209
340
  self.x = int(x / (self.rect.get_width() / self.bin_x))
210
341
  self.y = int(y / (self.rect.get_height() / self.bin_y))
211
- image_dims = self.dataset.get_dimensions_by_type(sidpy.DimensionType.SPATIAL)
342
+ image_dims = self.dataset.get_image_dims()
212
343
 
213
344
  if self.x + self.bin_x > self.dataset.shape[image_dims[0]]:
214
345
  self.x = self.dataset.shape[image_dims[0]] - self.bin_x
@@ -234,7 +365,7 @@ class EELSWidget(object):
234
365
  self.axis.set_ylim(bottom=bottom, top=top)
235
366
 
236
367
  def get_spectrum(self):
237
- if self.dataset.data_type == sidpy.DataType.SPECTRUM:
368
+ if self.dataset.data_type.name == 'SPECTRUM':
238
369
  self.spectrum = self.dataset.copy()
239
370
  else:
240
371
  image_dims = self.dataset.get_dimensions_by_type(sidpy.DimensionType.SPATIAL)
@@ -245,7 +376,6 @@ class EELSWidget(object):
245
376
  selection = []
246
377
  self.axis.clear()
247
378
  for dim, axis in self.dataset._axes.items():
248
- # print(dim, axis.dimension_type)
249
379
  if axis.dimension_type == sidpy.DimensionType.SPATIAL:
250
380
  if dim == image_dims[0]:
251
381
  selection.append(slice(self.x, self.x + self.bin_x))
@@ -260,7 +390,7 @@ class EELSWidget(object):
260
390
  selection.append(slice(0, 1))
261
391
 
262
392
  self.spectrum = self.dataset[tuple(selection)].mean(axis=tuple(image_dims))
263
-
393
+
264
394
  self.spectrum *= self.y_scale
265
395
 
266
396
  return self.spectrum.squeeze()
@@ -269,24 +399,13 @@ class EELSWidget(object):
269
399
  self.axes = self.figure.subplots(ncols=2)
270
400
  self.axis = self.axes[-1]
271
401
 
272
- spec_dim = self.dataset.get_dimensions_by_type(sidpy.DimensionType.SPECTRAL)
273
- if len(spec_dim) != 1:
274
- raise ValueError('Only one spectral dimension')
275
-
276
- channel_dim = self.dataset.get_dimensions_by_type(sidpy.DimensionType.CHANNEL)
277
- channel_dim =[]
278
- if len(channel_dim) > 1:
279
- raise ValueError('Maximal one channel dimension')
280
-
281
- if len(channel_dim) > 0:
282
- self.image = self.dataset.mean(axis=(spec_dim[0] ,channel_dim[0]))
283
- else:
284
- self.image = self.dataset.mean(axis=(spec_dim[0]))
285
-
402
+ self.set_image()
286
403
  self.rect = matplotlib.patches.Rectangle((0, 0), self.bin_x, self.bin_y, linewidth=1, edgecolor='r',
287
- facecolor='red', alpha=0.2)
288
- size_x = self.image.shape[0]
289
- size_y = self.image.shape[1]
404
+ facecolor='red', alpha=0.2)
405
+ image_dims = self.dataset.get_image_dims()
406
+
407
+ size_x = self.dataset.shape[image_dims[0]]
408
+ size_y = self.dataset.shape[image_dims[1]]
290
409
  self.extent = [0, size_x, size_y, 0]
291
410
  self.rectangle = [0, size_x, 0, size_y]
292
411
  self.axes[0].imshow(self.image.T, extent=self.extent)
@@ -294,33 +413,42 @@ class EELSWidget(object):
294
413
  self.axes[0].add_patch(self.rect)
295
414
  self.cid = self.axes[0].figure.canvas.mpl_connect('button_press_event', self._onclick)
296
415
 
297
-
298
416
  def line_select_callback(self, x_min, x_max):
299
417
  self.start_cursor.value = np.round(x_min, 3)
300
418
  self.end_cursor.value = np.round(x_max, 3)
301
- self.start_channel = np.searchsorted(self.datasets[self.key].energy_loss, self.start_cursor.value)
302
- self.end_channel = np.searchsorted(self.datasets[self.key].energy_loss, self.end_cursor.value)
303
419
 
304
- def set_dataset(self, index=0):
420
+ energy_scale = self.dataset.get_spectral_dims(return_axis=True)[0]
421
+ self.start_channel = np.searchsorted(energy_scale, self.start_cursor.value)
422
+ self.end_channel = np.searchsorted(energy_scale, self.end_cursor.value)
305
423
 
424
+ def set_dataset(self, key=None):
306
425
  if len(self.datasets) == 0:
307
426
  data_set = sidpy.Dataset.from_array([0, 1], name='generic')
308
- data_set.set_dimension(0, sidpy.Dimension([0,1], 'energy_loss', units='channel', quantity='generic',
427
+ data_set.set_dimension(0, sidpy.Dimension([0, 1], 'energy_loss', units='channel', quantity='generic',
309
428
  dimension_type='spectral'))
310
429
  data_set.data_type = 'spectrum'
311
- data_set.metadata= {'experiment':{'convergence_angle': 0,
312
- 'collection_angle': 0,
313
- 'acceleration_voltage':0,
314
- 'exposure_time':0}}
315
- self.datasets={'Channel_000': data_set}
316
- index = 0
430
+ data_set.metadata = {'experiment': {'convergence_angle': 0,
431
+ 'collection_angle': 0,
432
+ 'acceleration_voltage': 0,
433
+ 'exposure_time': 0}}
434
+ self.datasets = {'Channel_000': data_set}
435
+ key = 'Channel_000'
436
+ dataset_key = key
317
437
 
318
- dataset_index = index
319
-
320
- self.key = list(self.datasets)[dataset_index]
438
+ self.dataset_list = []
439
+ dataset_keys = []
440
+ for key in self.datasets.keys():
441
+ 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)
445
+ if dataset_key not in dataset_keys:
446
+ dataset_key = dataset_keys[0]
447
+ self.key = dataset_key
448
+
321
449
  self.dataset = self.datasets[self.key]
450
+ self.energy_scale = self.dataset.get_spectral_dims(return_axis=True)[0]
322
451
 
323
- self._udpate_sidbar()
324
452
  self.y_scale = 1.0
325
453
  self.change_y_scale = 1.0
326
454
  self.x = 0
@@ -330,124 +458,332 @@ class EELSWidget(object):
330
458
  self.count = 0
331
459
 
332
460
  self.plot()
461
+ self.update_sidebar()
333
462
 
334
- def _udpate_sidbar(self):
335
- pass
463
+ def update_sidebar(self):
464
+ pass
465
+
466
+ def select_main(self, value=0):
467
+ self.datasets = {}
468
+ # self.loaded_datasets.options = self.dataset_list
336
469
 
337
-
338
- def set_energy_scale(self, value):
339
- dispersion = self.datasets[self.key].energy_loss[1] - self.datasets[self.key].energy_loss[0]
340
- self.datasets[self.key].energy_loss *= (self.sidebar[3, 0].value/dispersion)
341
- self.datasets[self.key].energy_loss += (self.sidebar[2, 0].value-self.datasets[self.key].energy_loss[0])
342
- self.plot()
470
+ self.datasets = file_tools.open_file(self.file_name)
471
+ file_tools.save_path(self.file_name)
472
+ self.dataset_list = []
473
+ self.image_list = ['Sum']
474
+ self.survey_list = ['None']
475
+ for key in self.datasets.keys():
476
+ if isinstance(self.datasets[key], sidpy.Dataset):
477
+ if 'SPECTR' in self.datasets[key].data_type.name:
478
+ self.dataset_list.append(f'{key}: {self.datasets[key].title}')
479
+ if 'IMAGE' == self.datasets[key].data_type.name:
480
+ if 'survey' in self.datasets[key].title.lower():
481
+ self.survey_list.append(f'{key}: {self.datasets[key].title}')
482
+ else:
483
+ self.image_list.append(f'{key}: {self.datasets[key].title}')
484
+
485
+ # self.survey_list.extend(self.image_list)
486
+ self.set_dataset()
487
+ self.key = self.dataset_list[0].split(':')[0]
488
+ self.dataset = self.datasets[self.key]
489
+
490
+ self.selected_dataset = self.dataset
491
+ if len(self.image_list) > 0:
492
+ self.file_bar[4, 0].options = self.image_list
493
+ self.file_bar[5, 0].options = self.survey_list
494
+ self.file_bar[4, 0].layout.display = "flex"
495
+ self.file_bar[4, 0].value = self.image_list[0]
496
+ self.file_bar[5, 0].layout.display = "flex"
497
+ self.file_bar[5, 0].value = self.survey_list[0]
498
+
499
+ self.file_bar[3, 0].options = self.dataset_list
500
+ self.loaded_datasets.options = self.dataset_list
501
+ self.loaded_datasets.value = self.dataset_list[0]
502
+
503
+ def add_dataset(self, value=0):
504
+ key = file_tools.add_dataset_from_file(self.datasets, self.file_name, 'Channel')
505
+ self.dataset_list.append(f'{key}: {self.datasets[key].title}')
506
+ self.loaded_datasets.options = self.dataset_list
507
+ self.loaded_datasets.value = self.dataset_list[-1]
508
+
509
+ def get_directory(self, directory='.'):
510
+ self.dir_name = directory
511
+ self.dir_dictionary = {}
512
+ self.dir_list = []
513
+ self.dir_list = ['.', '..'] + os.listdir(directory)
514
+
515
+ def set_dir(self, value=0):
516
+ self.dir_name = self.path_choice.value
517
+ self.select_files.index = 0
518
+ self.set_file_options()
519
+
520
+ def select_dataset(self, value=0):
521
+ key = self.loaded_datasets.value.split(':')[0]
522
+ if key != 'None':
523
+ self.selected_dataset = self.datasets[key]
524
+ self.selected_key = key
525
+ self.key = key
526
+ self.datasets['_relationship'] = {'main_dataset': self.key}
343
527
 
344
- def set_y_scale(self, value):
345
- self.count += 1
346
- self.change_y_scale = 1.0/self.y_scale
347
- if self.sidebar[9,2].value:
348
- dispersion = self.datasets[self.key].energy_loss[1] - self.datasets[self.key].energy_loss[0]
349
- self.y_scale = 1/self.datasets[self.key].metadata['experiment']['flux_ppm'] * dispersion
350
- self.ylabel='scattering probability (ppm)'
351
- else:
352
- self.y_scale = 1.0
353
- self.ylabel='intensity (counts)'
354
- self.change_y_scale *= self.y_scale
355
- self._update()
528
+ self.set_dataset()
529
+
530
+ def set_file_options(self):
531
+ self.dir_name = os.path.abspath(os.path.join(self.dir_name, self.dir_list[self.select_files.index]))
532
+ dir_list = os.listdir(self.dir_name)
533
+ file_dict = file_tools.update_directory_list(self.dir_name)
534
+
535
+ sort = np.argsort(file_dict['directory_list'])
536
+ self.dir_list = ['.', '..']
537
+ self.display_list = ['.', '..']
538
+ for j in sort:
539
+ self.display_list.append(f" * {file_dict['directory_list'][j]}")
540
+ self.dir_list.append(file_dict['directory_list'][j])
541
+
542
+ sort = np.argsort(file_dict['display_file_list'])
543
+
544
+ for i, j in enumerate(sort):
545
+ if '--' in dir_list[j]:
546
+ self.display_list.append(f" {i:3} {file_dict['display_file_list'][j]}")
547
+ else:
548
+ self.display_list.append(f" {i:3} {file_dict['display_file_list'][j]}")
549
+ self.dir_list.append(file_dict['file_list'][j])
550
+
551
+ self.dir_label = os.path.split(self.dir_name)[-1] + ':'
552
+ self.select_files.options = self.display_list
553
+
554
+ path = self.dir_name
555
+ old_path = ' '
556
+ path_list = []
557
+ while path != old_path:
558
+ path_list.append(path)
559
+ old_path = path
560
+ path = os.path.split(path)[0]
561
+ self.path_choice.options = path_list
562
+ self.path_choice.value = path_list[0]
563
+
564
+ def get_file_name(self, b):
565
+
566
+ if os.path.isdir(os.path.join(self.dir_name, self.dir_list[self.select_files.index])):
567
+ self.set_file_options()
568
+
569
+ elif os.path.isfile(os.path.join(self.dir_name, self.dir_list[self.select_files.index])):
570
+ self.file_name = os.path.join(self.dir_name, self.dir_list[self.select_files.index])
571
+
356
572
 
357
573
  class InfoWidget(EELSWidget):
358
- def __init__(self, datasets):
574
+ def __init__(self, datasets=None):
359
575
 
360
- sidebar = get_info_sidebar()
576
+ sidebar = {'Info': get_info_sidebar(),
577
+ 'LowLoss': get_low_loss_sidebar()}
361
578
  super().__init__(datasets, sidebar)
579
+ self.info_tab = sidebar['Info']
580
+ super().set_dataset()
581
+
362
582
  self.set_action()
363
583
 
364
- def set_flux(self, value):
365
- self.datasets[self.key].metadata['experiment']['exposure_time'] = self.sidebar[10,0].value
366
- if self.sidebar[9,0].value < 0:
584
+ 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)
587
+ self.energy_scale *= (self.info_tab[3, 0].value / dispersion)
588
+ self.energy_scale += (self.info_tab[2, 0].value - self.energy_scale[0])
589
+ self.plot()
590
+
591
+ def set_y_scale(self, value):
592
+ 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
+
596
+ 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)'
600
+ else:
601
+ self.y_scale = 1.0
602
+ self.ylabel = 'intensity (counts)'
603
+ self.change_y_scale *= self.y_scale
604
+ self._update()
605
+
606
+ def set_flux(self, value):
607
+ self.datasets[self.key].metadata['experiment']['exposure_time'] = self.info_tab[10, 0].value
608
+ if self.info_tab[9, 0].value == 'None':
367
609
  self.datasets[self.key].metadata['experiment']['flux_ppm'] = 0.
368
610
  else:
369
- key = list(self.datasets.keys())[self.sidebar[9,0].value]
370
- self.datasets[self.key].metadata['experiment']['flux_ppm'] = (np.array(self.datasets[key])*1e-6).sum() / self.datasets[key].metadata['experiment']['exposure_time']
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()
614
+
615
+ number_of_pixels = 1
616
+ for index, dimension in enumerate(self.dataset.shape):
617
+ if index not in spectrum_dimensions:
618
+ 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:
621
+ return
622
+ 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'])
625
+
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'] /
628
+ number_of_pixels)
371
629
  self.datasets[self.key].metadata['experiment']['flux_ppm'] *= self.datasets[self.key].metadata['experiment']['exposure_time']
372
- self.sidebar[11,0].value = np.round(self.datasets[self.key].metadata['experiment']['flux_ppm'], 2)
373
-
630
+ if 'SPECT' in self.datasets[key].data_type.name:
631
+ 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)
633
+
374
634
  def set_microscope_parameter(self, value):
375
- self.datasets[self.key].metadata['experiment']['convergence_angle'] = self.sidebar[5,0].value
376
- self.datasets[self.key].metadata['experiment']['collection_angle'] = self.sidebar[6,0].value
377
- self.datasets[self.key].metadata['experiment']['acceleration_voltage'] = self.sidebar[7,0].value*1000
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
378
638
 
379
639
  def cursor2energy_scale(self, value):
640
+ self.energy_scale = self.datasets[self.key].get_spectral_dims(return_axis=True)[0]
380
641
  dispersion = (self.end_cursor.value - self.start_cursor.value) / (self.end_channel - self.start_channel)
381
- self.datasets[self.key].energy_loss *= (self.sidebar[3, 0].value/dispersion)
382
- self.sidebar[3, 0].value = dispersion
642
+
643
+ self.energy_scale *= (self.info_tab[3, 0].value/dispersion)
644
+ self.info_tab[3, 0].value = dispersion
383
645
  offset = self.start_cursor.value - self.start_channel * dispersion
384
- self.datasets[self.key].energy_loss += (self.sidebar[2, 0].value-self.datasets[self.key].energy_loss[0])
385
- self.sidebar[2, 0].value = offset
646
+ self.energy_scale += (self.info_tab[2, 0].value-self.energy_scale[0])
647
+ self.info_tab[2, 0].value = offset
386
648
  self.plot()
387
649
 
388
650
  def set_binning(self, value):
389
651
  if 'SPECTRAL' in self.dataset.data_type.name:
390
- bin_x = self.sidebar[15,0].value
391
- bin_y = self.sidebar[16,0].value
392
- self.dataset.view.set_bin([bin_x, bin_y])
393
- self.datasets[self.key].metadata['experiment']['SI_bin_x'] = bin_x
394
- self.datasets[self.key].metadata['experiment']['SI_bin_y'] = bin_y
395
-
396
- def _udpate_sidbar(self):
652
+ image_dims = self.dataset.get_image_dims()
653
+
654
+ self.bin_x = int(self.info_tab[16, 0].value)
655
+ self.bin_y = int(self.info_tab[17, 0].value)
656
+ if self.bin_x < 1:
657
+ self.bin_x = 1
658
+ self.info_tab[16, 0].value = self.bin_x
659
+ if self.bin_y < 1:
660
+ self.bin_y = 1
661
+ 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]]
664
+ 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]]
667
+ self.info_tab[17, 0].value = self.bin_y
668
+
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
671
+ self.plot()
672
+
673
+ def update_sidebar(self):
397
674
  spectrum_list = []
398
- reference_list =[('None', -1)]
399
- for index, key in enumerate(self.datasets.keys()):
400
- if 'Reference' not in key:
401
- if 'SPECTR' in self.datasets[key].data_type.name:
402
- spectrum_list.append((f'{key}: {self.datasets[key].title}', index))
403
- reference_list.append((f'{key}: {self.datasets[key].title}', index))
675
+ 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}')
404
682
 
405
- self.sidebar[0,0].options = spectrum_list
406
- self.sidebar[9,0].options = reference_list
407
-
683
+ self.info_tab[0, 0].options = spectrum_list
684
+ self.info_tab[9, 0].options = reference_list
685
+
408
686
  if 'SPECTRUM' in self.dataset.data_type.name:
409
- for i in range(14, 17):
410
- self.sidebar[i, 0].layout.display = "none"
687
+ for i in range(15, 18):
688
+ self.info_tab[i, 0].layout.display = "none"
411
689
  else:
412
- for i in range(14, 17):
413
- self.sidebar[i, 0].layout.display = "flex"
414
- #self.sidebar[0,0].value = dataset_index #f'{self.key}: {self.datasets[self.key].title}'
415
- self.sidebar[2,0].value = np.round(self.datasets[self.key].energy_loss[0], 3)
416
- self.sidebar[3,0].value = np.round(self.datasets[self.key].energy_loss[1] - self.datasets[self.key].energy_loss[0], 4)
417
- self.sidebar[5,0].value = np.round(self.datasets[self.key].metadata['experiment']['convergence_angle'], 1)
418
- self.sidebar[6,0].value = np.round(self.datasets[self.key].metadata['experiment']['collection_angle'], 1)
419
- self.sidebar[7,0].value = np.round(self.datasets[self.key].metadata['experiment']['acceleration_voltage']/1000, 1)
420
- self.sidebar[10,0].value = np.round(self.datasets[self.key].metadata['experiment']['exposure_time'], 4)
690
+ for i in range(15, 18):
691
+ 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)
421
699
  if 'flux_ppm' not in self.datasets[self.key].metadata['experiment']:
422
700
  self.datasets[self.key].metadata['experiment']['flux_ppm'] = 0
423
- self.sidebar[11,0].value = self.datasets[self.key].metadata['experiment']['flux_ppm']
701
+ self.info_tab[11, 0].value = self.datasets[self.key].metadata['experiment']['flux_ppm']
424
702
  if 'count_conversion' not in self.datasets[self.key].metadata['experiment']:
425
703
  self.datasets[self.key].metadata['experiment']['count_conversion'] = 1
426
- self.sidebar[12,0].value = self.datasets[self.key].metadata['experiment']['count_conversion']
704
+ self.info_tab[12, 0].value = self.datasets[self.key].metadata['experiment']['count_conversion']
427
705
  if 'beam_current' not in self.datasets[self.key].metadata['experiment']:
428
706
  self.datasets[self.key].metadata['experiment']['beam_current'] = 0
429
- self.sidebar[13,0].value = self.datasets[self.key].metadata['experiment']['beam_current']
707
+ self.info_tab[13, 0].value = self.datasets[self.key].metadata['experiment']['beam_current']
430
708
 
431
- def update_dataset(self):
432
- dataset_index = self.sidebar[0, 0].value
433
- self.set_dataset(dataset_index)
709
+ def update_dataset(self, value=0):
710
+ key = self.info_tab[0, 0].value.split(':')[0]
711
+ self.set_dataset(key)
712
+
713
+ 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():
722
+ self.info_tab[14, 1].disabled = False
723
+ print('shifted')
724
+
725
+ 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']
731
+ 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']
735
+ 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
434
765
 
435
766
  def set_action(self):
436
- self.sidebar[0,0].observe(self.update_dataset)
437
- self.sidebar[1,0].on_click(self.cursor2energy_scale)
438
- self.sidebar[2,0].observe(self.set_energy_scale, names='value')
439
- self.sidebar[3,0].observe(self.set_energy_scale, names='value')
440
- self.sidebar[5,0].observe(self.set_microscope_parameter)
441
- self.sidebar[6,0].observe(self.set_microscope_parameter)
442
- self.sidebar[7,0].observe(self.set_microscope_parameter)
443
- self.sidebar[9,0].observe(self.set_flux)
444
- self.sidebar[9,2].observe(self.set_y_scale, names='value')
445
- self.sidebar[10,0].observe(self.set_flux)
446
- self.sidebar[15,0].observe(self.set_binning)
447
- self.sidebar[16,0].observe(self.set_binning)
767
+ self.info_tab[0, 0].observe(self.update_dataset, names='value')
768
+ self.info_tab[1, 0].on_click(self.cursor2energy_scale)
769
+ self.info_tab[2, 0].observe(self.set_energy_scale, names='value')
770
+ self.info_tab[3, 0].observe(self.set_energy_scale, names='value')
771
+ self.info_tab[5, 0].observe(self.set_microscope_parameter)
772
+ self.info_tab[6, 0].observe(self.set_microscope_parameter)
773
+ self.info_tab[7, 0].observe(self.set_microscope_parameter)
774
+ self.info_tab[9, 0].observe(self.set_flux, names='value')
775
+ self.info_tab[9, 2].observe(self.set_y_scale, names='value')
776
+ self.info_tab[10, 0].observe(self.set_flux)
777
+ self.info_tab[14, 0].on_click(self.shift_low_loss)
778
+ self.info_tab[14, 1].on_click(self.shift_spectrum)
779
+ self.info_tab[14, 2].on_click(self.get_resolution_function)
448
780
 
781
+ self.info_tab[16, 0].observe(self.set_binning)
782
+ self.info_tab[17, 0].observe(self.set_binning)
783
+
784
+
449
785
  def get_low_loss_sidebar():
450
- side_bar = ipywidgets.GridspecLayout(17, 3,width='auto', grid_gap="0px")
786
+ side_bar = ipywidgets.GridspecLayout(17, 3, width='auto', grid_gap="0px")
451
787
 
452
788
  side_bar[0, :2] = ipywidgets.Dropdown(
453
789
  options=[('None', 0)],
@@ -457,128 +793,136 @@ def get_low_loss_sidebar():
457
793
 
458
794
  row = 1
459
795
  side_bar[row, :3] = ipywidgets.Button(description='Fix Energy Scale',
460
- layout=ipywidgets.Layout(width='auto', grid_area='header'),
461
- style=ipywidgets.ButtonStyle(button_color='lightblue'))
796
+ layout=ipywidgets.Layout(width='auto', grid_area='header'),
797
+ style=ipywidgets.ButtonStyle(button_color='lightblue'))
462
798
  row += 1
463
- side_bar[row, :2] = ipywidgets.FloatText(value=7.5,description='Offset:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
799
+ side_bar[row, :2] = ipywidgets.FloatText(value=7.5, description='Offset:', disabled=False, color='black',
800
+ layout=ipywidgets.Layout(width='200px'))
464
801
  side_bar[row, 2] = ipywidgets.widgets.Label(value="eV", layout=ipywidgets.Layout(width='20px'))
465
802
  row += 1
466
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Dispersion:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
803
+ side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Dispersion:', disabled=False, color='black',
804
+ layout=ipywidgets.Layout(width='200px'))
467
805
  side_bar[row, 2] = ipywidgets.widgets.Label(value="eV", layout=ipywidgets.Layout(width='20px'))
468
806
 
469
807
  row += 1
470
808
  side_bar[row, :3] = ipywidgets.Button(description='Resolution_function',
471
- layout=ipywidgets.Layout(width='auto', grid_area='header'),
472
- style=ipywidgets.ButtonStyle(button_color='lightblue'))
809
+ layout=ipywidgets.Layout(width='auto', grid_area='header'),
810
+ style=ipywidgets.ButtonStyle(button_color='lightblue'))
473
811
  row += 1
474
- side_bar[row, :2] = ipywidgets.FloatText(value=0.3, description='Fit Window:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
812
+ side_bar[row, :2] = ipywidgets.FloatText(value=0.3, description='Fit Window:', disabled=False, color='black',
813
+ layout=ipywidgets.Layout(width='200px'))
475
814
  side_bar[row, 2] = ipywidgets.widgets.Label(value="eV", layout=ipywidgets.Layout(width='100px'))
476
815
  row += 1
477
- side_bar[row,:2] = ipywidgets.ToggleButton(
478
- description='Show Resolution Function',
479
- disabled=False,
480
- button_style='', # 'success', 'info', 'warning', 'danger' or ''
481
- tooltip='Changes y-axis to probability if flux is given',
482
- layout=ipywidgets.Layout(width='100px'))
483
- side_bar[row,2] = ipywidgets.ToggleButton(
484
- description='Probability',
485
- disabled=False,
486
- button_style='', # 'success', 'info', 'warning', 'danger' or ''
487
- tooltip='Changes y-axis to probability if flux is given',
488
- layout=ipywidgets.Layout(width='100px'))
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'))
489
826
  row += 2
490
827
 
491
828
  side_bar[row, :3] = ipywidgets.Button(description='Drude Fit',
492
- layout=ipywidgets.Layout(width='auto', grid_area='header'),
493
- style=ipywidgets.ButtonStyle(button_color='lightblue'))
494
- row+=1
495
- side_bar[row, :2] = ipywidgets.Dropdown(
496
- options=[('None', 0)],
497
- value=0,
498
- description='Reference:',
499
- disabled=False)
500
- side_bar[row,2] = ipywidgets.ToggleButton(
501
- description='Probability',
502
- disabled=False,
503
- button_style='', # 'success', 'info', 'warning', 'danger' or ''
504
- tooltip='Changes y-axis to probability if flux is given',
505
- layout=ipywidgets.Layout(width='100px'))
506
- row += 1
507
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Exp_Time:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
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'))
508
844
  side_bar[row, 2] = ipywidgets.widgets.Label(value="s", layout=ipywidgets.Layout(width='100px'))
509
845
  row += 1
510
- side_bar[row, :2] = ipywidgets.FloatText(value=7.5,description='Flux:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
846
+ side_bar[row, :2] = ipywidgets.FloatText(value=7.5, description='Flux:', disabled=False, color='black',
847
+ layout=ipywidgets.Layout(width='200px'))
511
848
  side_bar[row, 2] = ipywidgets.widgets.Label(value="Mcounts", layout=ipywidgets.Layout(width='100px'))
512
849
  row += 1
513
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Conversion:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
850
+ side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Conversion:', disabled=False, color='black',
851
+ layout=ipywidgets.Layout(width='200px'))
514
852
  side_bar[row, 2] = ipywidgets.widgets.Label(value=r"e$^-$/counts", layout=ipywidgets.Layout(width='100px'))
515
853
  row += 1
516
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Current:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
517
- side_bar[row, 2] = ipywidgets.widgets.Label(value="pA", layout=ipywidgets.Layout(width='100px') )
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'))
518
857
 
519
858
  row += 1
520
859
 
521
860
  side_bar[row, :3] = ipywidgets.Button(description='Spectrum Image',
522
- layout=ipywidgets.Layout(width='auto', grid_area='header'),
523
- style=ipywidgets.ButtonStyle(button_color='lightblue'))
861
+ layout=ipywidgets.Layout(width='auto', grid_area='header'),
862
+ style=ipywidgets.ButtonStyle(button_color='lightblue'))
524
863
 
525
864
  row += 1
526
- side_bar[row, :2] = ipywidgets.IntText(value=1, description='bin X:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
865
+ side_bar[row, :2] = ipywidgets.IntText(value=1, description='bin X:', disabled=False, color='black',
866
+ layout=ipywidgets.Layout(width='200px'))
527
867
  row += 1
528
- side_bar[row, :2] = ipywidgets.IntText(value=1, description='bin X:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
868
+ side_bar[row, :2] = ipywidgets.IntText(value=1, description='bin X:', disabled=False, color='black',
869
+ layout=ipywidgets.Layout(width='200px'))
529
870
 
530
- for i in range(14, 17):
871
+ for i in range(15, 18):
531
872
  pass
532
873
  # side_bar[i, 0].layout.display = "none"
533
874
  return side_bar
534
875
 
876
+
535
877
  class LowLossWidget(EELSWidget):
536
878
  def __init__(self, datasets):
537
879
  sidebar = get_low_loss_sidebar()
538
880
  super().__init__(datasets, sidebar)
539
- self.sidebar[3,0].value = self.energy_scale[0]
540
- self.sidebar[4,0].value = self.energy_scale[1] - self.energy_scale[0]
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]
541
883
 
542
884
  self.set_action()
543
885
 
544
- def _udpate_sidbar(self):
886
+ def update_sidebar(self):
545
887
  spectrum_list = []
546
- reference_list =[('None', -1)]
888
+ reference_list = [('None', -1)]
547
889
  for index, key in enumerate(self.datasets.keys()):
548
- if 'Reference' not in key:
549
- if 'SPECTR' in self.datasets[key].data_type.name:
550
- spectrum_list.append((f'{key}: {self.datasets[key].title}', index))
551
- reference_list.append((f'{key}: {self.datasets[key].title}', index))
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))
552
895
 
553
- self.sidebar[0,0].options = spectrum_list
554
- self.sidebar[9,0].options = reference_list
896
+ self.info_tab[0, 0].options = spectrum_list
897
+ self.info_tab[9, 0].options = reference_list
555
898
 
556
899
  if 'SPECTRUM' in self.dataset.data_type.name:
557
- for i in range(14, 17):
558
- self.sidebar[i, 0].layout.display = "none"
900
+ for i in range(14, 17):
901
+ self.info_tab[i, 0].layout.display = "none"
559
902
  else:
560
903
  for i in range(14, 17):
561
- self.sidebar[i, 0].layout.display = "flex"
904
+ self.info_tab[i, 0].layout.display = "flex"
562
905
 
563
906
  def get_resolution_function(self, value):
564
- self.datasets['resolution_functions'] = eels_tools.get_resolution_functions(self.dataset, zero_loss_fit_width=self.sidebar[5,0].value)
907
+ self.datasets['resolution_functions'] = eels_tools.get_resolution_functions(self.dataset,
908
+ zero_loss_fit_width=self.info_tab[5, 0].value)
565
909
  if 'low_loss' not in self.dataset.metadata:
566
910
  self.dataset.metadata['low_loss'] = {}
567
911
  self.dataset.metadata['low_loss'].update(self.datasets['resolution_functions'].metadata['low_loss'])
568
- self.sidebar[6,0].value = True
912
+ self.info_tab[6, 0].value = True
569
913
 
570
914
  def update_dataset(self):
571
- dataset_index = self.sidebar[0, 0].value
915
+ dataset_index = self.info_tab[0, 0].value
572
916
  self.set_dataset(dataset_index)
573
917
 
574
918
  def set_action(self):
575
- self.sidebar[0,0].observe(self.update_dataset)
576
- self.sidebar[1,0].on_click(self.fix_energy_scale)
577
- self.sidebar[2,0].observe(self.set_energy_scale, names='value')
578
- self.sidebar[3,0].observe(self.set_energy_scale, names='value')
579
- self.sidebar[4,0].on_click(self.get_resolution_function)
580
- self.sidebar[6,2].observe(self.set_y_scale, names='value')
581
- self.sidebar[6,0].observe(self._update, names='value')
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')
582
926
 
583
927
  def fix_energy_scale(self, value=0):
584
928
  self.dataset = eels_tools.shift_on_same_scale(self.dataset)
@@ -586,11 +930,10 @@ class LowLossWidget(EELSWidget):
586
930
  if 'resolution_functions' in self.datasets:
587
931
  self.datasets['resolution_functions'] = eels_tools.shift_on_same_scale(self.datasets['resolution_functions'])
588
932
  self._update()
589
-
590
933
 
591
934
  def set_y_scale(self, value):
592
935
  self.change_y_scale = 1.0/self.y_scale
593
- if self.sidebar[6,2].value:
936
+ if self.info_tab[6, 2].value:
594
937
  dispersion = self.dataset.energy_loss[1] - self.dataset.energy_loss[0]
595
938
  if self.dataset.data_type.name == 'SPECTRUM':
596
939
  sum = self.dataset.sum()
@@ -600,16 +943,16 @@ class LowLossWidget(EELSWidget):
600
943
 
601
944
  self.y_scale = 1/sum * dispersion * 1e6
602
945
  # self.datasets[self.key].metadata['experiment']['flux_ppm'] * dispersion
603
- self.ylabel='scattering probability (ppm)'
946
+ self.ylabel = 'scattering probability (ppm)'
604
947
  else:
605
948
  self.y_scale = 1.0
606
- self.ylabel='intensity (counts)'
949
+ self.ylabel = 'intensity (counts)'
607
950
  self.change_y_scale *= self.y_scale
608
951
  self._update()
609
952
 
610
953
  def _update(self, ev=0):
611
954
  super()._update(ev)
612
- if self.sidebar[6,0].value:
955
+ if self.info_tab[6, 0].value:
613
956
  if 'resolution_functions' in self.datasets:
614
957
  resolution_function = self.get_additional_spectrum('resolution_functions')
615
958
  self.axis.plot(self.energy_scale, resolution_function, label='resolution_function')
@@ -647,9 +990,8 @@ class LowLossWidget(EELSWidget):
647
990
 
648
991
  def set_binning(self, value):
649
992
  if 'SPECTRAL' in self.dataset.data_type.name:
650
- bin_x = self.sidebar[15,0].value
651
- bin_y = self.sidebar[16,0].value
993
+ bin_x = self.info_tab[15, 0].value
994
+ bin_y = self.info_tab[16, 0].value
652
995
  self.dataset.view.set_bin([bin_x, bin_y])
653
996
  self.datasets[self.key].metadata['experiment']['SI_bin_x'] = bin_x
654
997
  self.datasets[self.key].metadata['experiment']['SI_bin_y'] = bin_y
655
-