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_dialog.py DELETED
@@ -1,665 +0,0 @@
1
- """
2
- Input Dialog for EELS Analysis
3
-
4
- Author: Gerd Duscher
5
-
6
- """
7
- import numpy as np
8
- import sidpy
9
-
10
- Qt_available = True
11
- try:
12
- from PyQt5 import QtCore, QtWidgets
13
- except:
14
- Qt_available = False
15
- # print('Qt dialogs are not available')
16
-
17
-
18
- import pyTEMlib.eels_dialog_utilities as ieels
19
- from pyTEMlib.microscope import microscope
20
- import ipywidgets
21
- import matplotlib.pylab as plt
22
- import matplotlib
23
- from IPython.display import display
24
- from pyTEMlib import file_tools as ft
25
- _version = 000
26
-
27
-
28
- if Qt_available:
29
- from pyTEMlib import info_dlg
30
- class InfoDialog(QtWidgets.QDialog):
31
- """
32
- Input Dialog for EELS Analysis
33
-
34
- Opens a PyQt5 GUi Dialog that allows to set the experimental parameter necessary for a Quantification.
35
-
36
-
37
- The dialog operates on a sidpy dataset
38
- """
39
-
40
- def __init__(self, datasets=None, key=None):
41
- super().__init__(None, QtCore.Qt.WindowStaysOnTopHint)
42
- # Create an instance of the GUI
43
- self.ui = info_dlg.UiDialog(self)
44
- self.set_action()
45
- self.datasets = datasets
46
-
47
- self.spec_dim = []
48
- self.energy_scale = np.array([])
49
- self.experiment = {}
50
- self.energy_dlg = None
51
- self.axis = None
52
-
53
- self.y_scale = 1.0
54
- self.change_y_scale = 1.0
55
- self.show()
56
-
57
- if self.datasets is None:
58
- # make a dummy dataset for testing
59
- key = 'Channel_000'
60
- self.datasets={key: ft.make_dummy_dataset(sidpy.DataType.SPECTRUM)}
61
- if key is None:
62
- key = list(self.datasets.keys())[0]
63
- self.dataset = self.datasets[key]
64
- self.key = key
65
- if not isinstance(self.dataset, sidpy.Dataset):
66
- raise TypeError('dataset has to be a sidpy dataset')
67
-
68
- self.set_dataset(self.dataset)
69
-
70
- view = self.dataset.plot()
71
- if hasattr(self.dataset.view, 'axes'):
72
- self.axis = self.dataset.view.axes[-1]
73
- elif hasattr(self.dataset.view, 'axis'):
74
- self.axis = self.dataset.view.axis
75
- self.figure = self.axis.figure
76
- self.plot()
77
- self.update()
78
-
79
- def set_dataset(self, dataset):
80
- self.dataset = dataset
81
- if not hasattr(self.dataset, '_axes'):
82
- self.dataset._axes = self.dataset.axes
83
- if not hasattr(self.dataset, 'meta_data'):
84
- self.dataset.meta_data = {}
85
-
86
- spec_dim = dataset.get_dimensions_by_type(sidpy.DimensionType.SPECTRAL)
87
- if len(spec_dim) != 1:
88
- raise TypeError('We need exactly one SPECTRAL dimension')
89
- self.spec_dim = self.dataset._axes[spec_dim[0]]
90
- self.energy_scale = self.spec_dim.values.copy()
91
-
92
- minimum_info = {'offset': self.energy_scale[0],
93
- 'dispersion': self.energy_scale[1] - self.energy_scale[0],
94
- 'exposure_time': 0.0,
95
- 'convergence_angle': 0.0, 'collection_angle': 0.0,
96
- 'acceleration_voltage': 100.0, 'binning': 1, 'conversion': 1.0,
97
- 'flux_ppm': -1.0, 'flux_unit': 'counts', 'current': 1.0, 'SI_bin_x': 1, 'SI_bin_y': 1}
98
- if 'experiment' not in self.dataset.metadata:
99
- self.dataset.metadata['experiment'] = minimum_info
100
- self.experiment = self.dataset.metadata['experiment']
101
-
102
- for key, item in minimum_info.items():
103
- if key not in self.experiment:
104
- self.experiment[key] = item
105
- self.set_flux_list()
106
-
107
- def set_dimension(self):
108
- spec_dim = self.dataset.get_dimensions_by_type(sidpy.DimensionType.SPECTRAL)
109
- self.spec_dim = self.dataset._axes[spec_dim[0]]
110
- old_energy_scale = self.spec_dim
111
- self.dataset.set_dimension(spec_dim[0], sidpy.Dimension(np.array(self.energy_scale),
112
- name=old_energy_scale.name,
113
- dimension_type=sidpy.DimensionType.SPECTRAL,
114
- units='eV',
115
- quantity='energy loss'))
116
-
117
- def update(self):
118
-
119
- self.ui.offsetEdit.setText(f"{self.experiment['offset']:.3f}")
120
- self.ui.dispersionEdit.setText(f"{self.experiment['dispersion']:.3f}")
121
- self.ui.timeEdit.setText(f"{self.experiment['exposure_time']:.6f}")
122
-
123
- self.ui.convEdit.setText(f"{self.experiment['convergence_angle']:.2f}")
124
- self.ui.collEdit.setText(f"{self.experiment['collection_angle']:.2f}")
125
- self.ui.E0Edit.setText(f"{self.experiment['acceleration_voltage']/1000.:.2f}")
126
-
127
- self.ui.binningEdit.setText(f"{self.experiment['binning']}")
128
- self.ui.conversionEdit.setText(f"{self.experiment['conversion']:.2f}")
129
- self.ui.fluxEdit.setText(f"{self.experiment['flux_ppm']:.2f}")
130
- self.ui.fluxUnit.setText(f"{self.experiment['flux_unit']}")
131
- self.ui.VOAEdit.setText(f"{self.experiment['current']:.2f}")
132
- self.ui.statusBar.showMessage('Message in statusbar.')
133
-
134
- def on_enter(self):
135
- sender = self.sender()
136
-
137
- if sender == self.ui.offsetEdit:
138
- value = float(str(sender.displayText()).strip())
139
- self.experiment['offset'] = value
140
- sender.setText(f"{value:.2f}")
141
- self.energy_scale = self.energy_scale - self.energy_scale[0] + value
142
- self.set_dimension()
143
- self.plot()
144
- elif sender == self.ui.dispersionEdit:
145
- value = float(str(sender.displayText()).strip())
146
- self.experiment['dispersion'] = value
147
- self.energy_scale = np.arange(len(self.energy_scale)) * value + self.energy_scale[0]
148
- self.set_dimension()
149
- self.plot()
150
- sender.setText(f"{value:.3f}")
151
- elif sender == self.ui.timeEdit:
152
- value = float(str(sender.displayText()).strip())
153
- self.experiment['exposure_time'] = value
154
- sender.setText(f"{value:.2f}")
155
- elif sender == self.ui.convEdit:
156
- value = float(str(sender.displayText()).strip())
157
- self.experiment['convergence_angle'] = value
158
- sender.setText(f"{value:.2f}")
159
- elif sender == self.ui.collEdit:
160
- value = float(str(sender.displayText()).strip())
161
- self.experiment['collection_angle'] = value
162
- sender.setText(f"{value:.2f}")
163
- elif sender == self.ui.E0Edit:
164
- value = float(str(sender.displayText()).strip())
165
- self.experiment['acceleration_voltage'] = value*1000.0
166
- sender.setText(f"{value:.2f}")
167
- elif sender == self.ui.fluxEdit:
168
- value = float(str(sender.displayText()).strip())
169
- if value == 0:
170
- self.set_flux()
171
- else:
172
- self.experiment['flux_ppm'] = value
173
- sender.setText(f"{value:.2f}")
174
- elif sender == self.ui.binXEdit or sender == self.ui.binYEdit:
175
- if self.dataset.data_type == sidpy.DataType.SPECTRAL_IMAGE:
176
- bin_x = int(self.ui.binXEdit.displayText())
177
- bin_y = int(self.ui.binYEdit.displayText())
178
- self.experiment['SI_bin_x'] = bin_x
179
- self.experiment['SI_bin_y'] = bin_y
180
- self.dataset.view.set_bin([bin_x, bin_y])
181
- self.ui.binXEdit.setText(str(self.dataset.view.bin_x))
182
- self.ui.binYEdit.setText(str(self.dataset.view.bin_y))
183
- else:
184
- print('not supported yet')
185
-
186
- def plot(self):
187
- if self.dataset.data_type == sidpy.DataType.SPECTRAL_IMAGE:
188
- spectrum = self.dataset.view.get_spectrum()
189
- self.axis = self.dataset.view.axes[1]
190
- else:
191
- spectrum = np.array(self.dataset)
192
- self.axis = self.dataset.view.axis
193
-
194
- spectrum *= self.y_scale
195
-
196
- x_limit = self.axis.get_xlim()
197
- y_limit = np.array(self.axis.get_ylim())
198
- self.axis.clear()
199
-
200
-
201
- self.axis.plot(self.energy_scale, spectrum, label='spectrum')
202
- self.axis.set_xlim(x_limit)
203
- if self.change_y_scale !=1.0:
204
- y_limit *= self.change_y_scale
205
- self.change_y_scale = 1.0
206
- self.axis.set_ylim(y_limit)
207
-
208
- if self.y_scale != 1.:
209
- self.axis.set_ylabel('scattering intensity (ppm)')
210
-
211
- self.axis.set_xlabel('energy_loss (eV)')
212
-
213
- self.figure.canvas.draw_idle()
214
-
215
- def on_list_enter(self):
216
- sender = self.sender()
217
- if sender == self.ui.TEMList:
218
- microscope.set_microscope(self.ui.TEMList.currentText())
219
- self.experiment['microscope'] = microscope.name
220
- self.experiment['convergence_angle'] = microscope.alpha
221
- self.experiment['collection_angle'] = microscope.beta
222
- self.experiment['acceleration_voltage'] = microscope.E0
223
- self.update()
224
-
225
- def set_energy_scale(self):
226
- self.energy_dlg = ieels.EnergySelector(self.dataset)
227
-
228
- self.energy_dlg.signal_selected[bool].connect(self.set_energy)
229
- self.energy_dlg.show()
230
-
231
- def set_energy(self, k):
232
- spec_dim = self.dataset.get_dimensions_by_type(sidpy.DimensionType.SPECTRAL)
233
- self.spec_dim = self.dataset._axes[spec_dim[0]]
234
-
235
- self.energy_scale = self.spec_dim.values
236
- self.experiment['offset'] = self.energy_scale[0]
237
- self.experiment['dispersion'] = self.energy_scale[1] - self.energy_scale[0]
238
- self.update()
239
-
240
- def set_flux(self, key):
241
- self.ui.statusBar.showMessage('on_set_flux')
242
- new_flux = 1.0
243
- title = key
244
- metadata = {}
245
- if key in self.datasets.keys():
246
- flux_dataset = self.datasets[key]
247
- if isinstance(flux_dataset, sidpy.Dataset):
248
- exposure_time = -1.0
249
- flux_dataset = self.datasets[key]
250
- if flux_dataset.data_type.name == 'IMAGE' or 'SPECTRUM' in flux_dataset.data_type.name:
251
- if 'exposure_time' in flux_dataset.metadata['experiment']:
252
- if 'number_of_frames' in flux_dataset.metadata['experiment']:
253
- exposure_time = flux_dataset.metadata['experiment']['single_exposure_time'] * flux_dataset.metadata['experiment']['number_of_frames']
254
- else:
255
- exposure_time = flux_dataset.metadata['experiment']['exposure_time']
256
- else:
257
- exposure_time = -1.0
258
- flux_dataset.metadata['experiment']['exposure_time'] = -1
259
- print('Did not find exposure time assume 1s')
260
- if exposure_time > 0:
261
- new_flux = np.sum(np.array(flux_dataset*1e-6))/exposure_time*self.dataset.metadata['experiment']['exposure_time']
262
- title = flux_dataset.title
263
- metadata = flux_dataset.metadata
264
- self.experiment['flux_ppm'] = new_flux
265
- self.experiment['flux_units'] = 'Mcounts '
266
- self.experiment['flux_source'] = title
267
- self.experiment['flux_metadata'] = metadata
268
-
269
- self.update()
270
-
271
- def on_check(self):
272
- sender = self.sender()
273
-
274
- if sender.objectName() == 'probability':
275
- dispersion = self.energy_scale[1]-self.energy_scale[0]
276
- if sender.isChecked():
277
- self.y_scale = 1/self.experiment['flux_ppm']*dispersion
278
- self.change_y_scale = 1/self.experiment['flux_ppm']*dispersion
279
- else:
280
- self.y_scale = 1.
281
- self.change_y_scale = self.experiment['flux_ppm']/dispersion
282
- self.plot()
283
-
284
- def set_flux_list(self):
285
- length_list = self.ui.select_flux.count()+1
286
- for i in range(2, length_list):
287
- self.ui.select_flux.removeItem(i)
288
- for key in self.datasets.keys():
289
- if isinstance(self.datasets[key], sidpy.Dataset):
290
- if self.datasets[key].title != self.dataset.title:
291
- self.ui.select_flux.addItem(key+': '+self.datasets[key].title)
292
-
293
- def on_list_enter(self):
294
- self.ui.statusBar.showMessage('on_list')
295
- sender = self.sender()
296
- if sender.objectName() == 'select_flux_list':
297
- self.ui.statusBar.showMessage('list')
298
- index = self.ui.select_flux.currentIndex()
299
- self.ui.statusBar.showMessage('list'+str(index))
300
- if index == 1:
301
- ft.add_dataset_from_file(self.datasets, key_name='Reference')
302
- self.set_flux_list()
303
- else:
304
- key = str(self.ui.select_flux.currentText()).split(':')[0]
305
- self.set_flux(key)
306
-
307
- self.update()
308
-
309
- def set_action(self):
310
- self.ui.statusBar.showMessage('action')
311
- self.ui.offsetEdit.editingFinished.connect(self.on_enter)
312
- self.ui.dispersionEdit.editingFinished.connect(self.on_enter)
313
- self.ui.timeEdit.editingFinished.connect(self.on_enter)
314
-
315
- self.ui.TEMList.activated[str].connect(self.on_list_enter)
316
-
317
- self.ui.convEdit.editingFinished.connect(self.on_enter)
318
- self.ui.collEdit.editingFinished.connect(self.on_enter)
319
- self.ui.E0Edit.editingFinished.connect(self.on_enter)
320
- self.ui.binningEdit.editingFinished.connect(self.on_enter)
321
- self.ui.conversionEdit.editingFinished.connect(self.on_enter)
322
- self.ui.fluxEdit.editingFinished.connect(self.on_enter)
323
- self.ui.VOAEdit.editingFinished.connect(self.on_enter)
324
- self.ui.energy_button.clicked.connect(self.set_energy_scale)
325
- self.ui.select_flux.activated[str].connect(self.on_list_enter)
326
-
327
- self.ui.check_probability.clicked.connect(self.on_check)
328
-
329
- self.ui.binXEdit.editingFinished.connect(self.on_enter)
330
- self.ui.binYEdit.editingFinished.connect(self.on_enter)
331
-
332
-
333
- def get_sidebar():
334
- side_bar = ipywidgets.GridspecLayout(17, 3,width='auto', grid_gap="0px")
335
-
336
- side_bar[0, :2] = ipywidgets.Dropdown(
337
- options=[('None', 0)],
338
- value=0,
339
- description='Main Dataset:',
340
- disabled=False)
341
-
342
- row = 1
343
- side_bar[row, :3] = ipywidgets.Button(description='Energy Scale',
344
- layout=ipywidgets.Layout(width='auto', grid_area='header'),
345
- style=ipywidgets.ButtonStyle(button_color='lightblue'))
346
- row += 1
347
- side_bar[row, :2] = ipywidgets.FloatText(value=7.5,description='Offset:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
348
- side_bar[row, 2] = ipywidgets.widgets.Label(value="eV", layout=ipywidgets.Layout(width='20px'))
349
- row += 1
350
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Dispersion:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
351
- side_bar[row, 2] = ipywidgets.widgets.Label(value="eV", layout=ipywidgets.Layout(width='20px'))
352
-
353
- row += 1
354
- side_bar[row, :3] = ipywidgets.Button(description='Microscope',
355
- layout=ipywidgets.Layout(width='auto', grid_area='header'),
356
- style=ipywidgets.ButtonStyle(button_color='lightblue'))
357
- row += 1
358
- side_bar[row, :2] = ipywidgets.FloatText(value=7.5,description='Conv.Angle:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
359
- side_bar[row, 2] = ipywidgets.widgets.Label(value="mrad", layout=ipywidgets.Layout(width='100px'))
360
- row += 1
361
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Coll.Angle:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
362
- side_bar[row, 2] = ipywidgets.widgets.Label(value="mrad", layout=ipywidgets.Layout(width='100px'))
363
- row += 1
364
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Acc Voltage:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
365
- side_bar[row, 2] = ipywidgets.widgets.Label(value="keV", layout=ipywidgets.Layout(width='100px'))
366
- row += 1
367
-
368
- side_bar[row, :3] = ipywidgets.Button(description='Quantification',
369
- layout=ipywidgets.Layout(width='auto', grid_area='header'),
370
- style=ipywidgets.ButtonStyle(button_color='lightblue'))
371
- row+=1
372
- side_bar[row, :2] = ipywidgets.Dropdown(
373
- options=[('None', 0)],
374
- value=0,
375
- description='Reference:',
376
- disabled=False)
377
- side_bar[row,2] = ipywidgets.ToggleButton(
378
- description='Probability',
379
- disabled=False,
380
- button_style='', # 'success', 'info', 'warning', 'danger' or ''
381
- tooltip='Changes y-axis to probability if flux is given',
382
- layout=ipywidgets.Layout(width='100px'))
383
- row += 1
384
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Exp_Time:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
385
- side_bar[row, 2] = ipywidgets.widgets.Label(value="s", layout=ipywidgets.Layout(width='100px'))
386
- row += 1
387
- side_bar[row, :2] = ipywidgets.FloatText(value=7.5,description='Flux:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
388
- side_bar[row, 2] = ipywidgets.widgets.Label(value="Mcounts", layout=ipywidgets.Layout(width='100px'))
389
- row += 1
390
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Conversion:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
391
- side_bar[row, 2] = ipywidgets.widgets.Label(value=r"e$^-$/counts", layout=ipywidgets.Layout(width='100px'))
392
- row += 1
393
- side_bar[row, :2] = ipywidgets.FloatText(value=0.1, description='Current:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
394
- side_bar[row, 2] = ipywidgets.widgets.Label(value="pA", layout=ipywidgets.Layout(width='100px') )
395
-
396
- row += 1
397
-
398
- side_bar[row, :3] = ipywidgets.Button(description='Spectrum Image',
399
- layout=ipywidgets.Layout(width='auto', grid_area='header'),
400
- style=ipywidgets.ButtonStyle(button_color='lightblue'))
401
-
402
- row += 1
403
- side_bar[row, :2] = ipywidgets.IntText(value=1, description='bin X:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
404
- row += 1
405
- side_bar[row, :2] = ipywidgets.IntText(value=1, description='bin X:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
406
-
407
- for i in range(14, 17):
408
- side_bar[i, 0].layout.display = "none"
409
- return side_bar
410
-
411
-
412
- class SpectrumPlot(sidpy.viz.dataset_viz.CurveVisualizer):
413
- def __init__(self, dset, spectrum_number=0, figure=None, **kwargs):
414
- with plt.ioff():
415
- self.figure = plt.figure()
416
- self.figure.canvas.toolbar_position = 'right'
417
- self.figure.canvas.toolbar_visible = True
418
-
419
- super().__init__(dset, spectrum_number=spectrum_number, figure=self.figure, **kwargs)
420
-
421
- self.start_cursor = ipywidgets.FloatText(value=0, description='Start:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
422
- self.end_cursor = ipywidgets.FloatText(value=0, description='End:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
423
- self.panel = ipywidgets.VBox([ipywidgets.HBox([ipywidgets.Label('',layout=ipywidgets.Layout(width='100px')), ipywidgets.Label('Cursor:'),
424
- self.start_cursor,ipywidgets.Label('eV'),
425
- self.end_cursor, ipywidgets.Label('eV')]),
426
- self.figure.canvas])
427
-
428
- self.selector = matplotlib.widgets.SpanSelector(self.axis, self.line_select_callback,
429
- direction="horizontal",
430
- interactive=True,
431
- props=dict(facecolor='blue', alpha=0.2))
432
- #self.axis.legend()
433
- display(self.panel)
434
-
435
- def line_select_callback(self, x_min, x_max):
436
- self.start_cursor.value = np.round(x_min, 3)
437
- self.end_cursor.value = np.round(x_max, 3)
438
- self.start_channel = np.searchsorted(self.datasets[self.key].energy_loss, self.start_cursor.value)
439
- self.end_channel = np.searchsorted(self.datasets[self.key].energy_loss, self.end_cursor.value)
440
-
441
-
442
- class SIPlot(sidpy.viz.dataset_viz.SpectralImageVisualizer):
443
- def __init__(self, dset, figure=None, horizontal=True, **kwargs):
444
- if figure is None:
445
- with plt.ioff():
446
- self.figure = plt.figure()
447
- else:
448
- self.figure = figure
449
- self.figure.canvas.toolbar_position = 'right'
450
- self.figure.canvas.toolbar_visible = True
451
-
452
- super().__init__(dset, figure= self.figure, horizontal=horizontal, **kwargs)
453
-
454
- self.start_cursor = ipywidgets.FloatText(value=0, description='Start:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
455
- self.end_cursor = ipywidgets.FloatText(value=0, description='End:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
456
- self.panel = ipywidgets.VBox([ipywidgets.HBox([ipywidgets.Label('',layout=ipywidgets.Layout(width='100px')), ipywidgets.Label('Cursor:'),
457
- self.start_cursor,ipywidgets.Label('eV'),
458
- self.end_cursor, ipywidgets.Label('eV')]),
459
- self.figure.canvas])
460
- self.axis = self.axes[-1]
461
- self.selector = matplotlib.widgets.SpanSelector(self.axis, self.line_select_callback,
462
- direction="horizontal",
463
- interactive=True,
464
- props=dict(facecolor='blue', alpha=0.2))
465
-
466
- def line_select_callback(self, x_min, x_max):
467
- self.start_cursor.value = np.round(x_min, 3)
468
- self.end_cursor.value = np.round(x_max, 3)
469
- self.start_channel = np.searchsorted(self.datasets[self.key].energy_loss, self.start_cursor.value)
470
- self.end_channel = np.searchsorted(self.datasets[self.key].energy_loss, self.end_cursor.value)
471
-
472
- def _update(self, ev=None):
473
-
474
- xlim = self.axes[1].get_xlim()
475
- ylim = self.axes[1].get_ylim()
476
- self.axes[1].clear()
477
- self.get_spectrum()
478
- if len(self.energy_scale)!=self.spectrum.shape[0]:
479
- self.spectrum = self.spectrum.T
480
- self.axes[1].plot(self.energy_scale, self.spectrum.compute(), label='experiment')
481
-
482
- if self.set_title:
483
- self.axes[1].set_title('spectrum {}, {}'.format(self.x, self.y))
484
- self.fig.tight_layout()
485
- self.selector = matplotlib.widgets.SpanSelector(self.axes[1], self.line_select_callback,
486
- direction="horizontal",
487
- interactive=True,
488
- props=dict(facecolor='blue', alpha=0.2))
489
-
490
- self.axes[1].set_xlim(xlim)
491
- self.axes[1].set_ylim(ylim)
492
- self.axes[1].set_xlabel(self.xlabel)
493
- self.axes[1].set_ylabel(self.ylabel)
494
-
495
- self.fig.canvas.draw_idle()
496
-
497
- class InfoWidget(object):
498
- def __init__(self, datasets=None):
499
- self.datasets = datasets
500
- self.dataset = None
501
-
502
- self.sidebar = get_sidebar()
503
-
504
- self.set_dataset()
505
- self.set_action()
506
-
507
-
508
- self.app_layout = ipywidgets.AppLayout(
509
- left_sidebar=self.sidebar,
510
- center=self.view.panel,
511
- footer=None,#message_bar,
512
- pane_heights=[0, 10, 0],
513
- pane_widths=[4, 10, 0],
514
- )
515
-
516
- display(self.app_layout)
517
-
518
-
519
- def get_spectrum(self):
520
- if self.dataset.data_type == sidpy.DataType.SPECTRAL_IMAGE:
521
- spectrum = self.dataset.view.get_spectrum()
522
- self.axis = self.dataset.view.axes[1]
523
- else:
524
- spectrum = np.array(self.dataset)
525
- self.axis = self.dataset.view.axis
526
-
527
- spectrum *= self.y_scale
528
- return spectrum
529
-
530
- def plot(self, scale=True):
531
- spectrum = self.get_spectrum()
532
- self.energy_scale = self.dataset.energy_loss.values
533
- x_limit = self.axis.get_xlim()
534
- y_limit = np.array(self.axis.get_ylim())
535
- """
536
- self.axis.clear()
537
-
538
- self.axis.plot(self.energy_scale, spectrum, label='spectrum')
539
-
540
-
541
- self.axis.set_xlabel(self.datasets[self.key].labels[0])
542
- self.axis.set_ylabel(self.datasets[self.key].data_descriptor)
543
- self.axis.ticklabel_format(style='sci', scilimits=(-2, 3))
544
- if scale:
545
- self.axis.set_ylim(np.array(y_limit)*self.change_y_scale)
546
- self.change_y_scale = 1.0
547
- if self.y_scale != 1.:
548
- self.axis.set_ylabel('scattering probability (ppm/eV)')
549
- self.selector = matplotlib.widgets.SpanSelector(self.axis, self.line_select_callback,
550
- direction="horizontal",
551
- interactive=True,
552
- props=dict(facecolor='blue', alpha=0.2))
553
- self.axis.legend()
554
- self.figure.canvas.draw_idle()
555
- """
556
-
557
- def set_dataset(self, index=0):
558
-
559
- spectrum_list = []
560
- reference_list =[('None', -1)]
561
- dataset_index = self.sidebar[0, 0].value
562
- for index, key in enumerate(self.datasets.keys()):
563
- if 'Reference' not in key:
564
- if 'SPECTR' in self.datasets[key].data_type.name:
565
- spectrum_list.append((f'{key}: {self.datasets[key].title}', index))
566
- reference_list.append((f'{key}: {self.datasets[key].title}', index))
567
-
568
- self.sidebar[0,0].options = spectrum_list
569
- self.sidebar[9,0].options = reference_list
570
- self.key = list(self.datasets)[dataset_index]
571
- self.dataset = self.datasets[self.key]
572
- if 'SPECTRUM' in self.dataset.data_type.name:
573
- for i in range(14, 17):
574
- self.sidebar[i, 0].layout.display = "none"
575
- else:
576
- for i in range(14, 17):
577
- self.sidebar[i, 0].layout.display = "flex"
578
- #self.sidebar[0,0].value = dataset_index #f'{self.key}: {self.datasets[self.key].title}'
579
- self.sidebar[2,0].value = np.round(self.datasets[self.key].energy_loss[0], 3)
580
- self.sidebar[3,0].value = np.round(self.datasets[self.key].energy_loss[1] - self.datasets[self.key].energy_loss[0], 4)
581
- self.sidebar[5,0].value = np.round(self.datasets[self.key].metadata['experiment']['convergence_angle'], 1)
582
- self.sidebar[6,0].value = np.round(self.datasets[self.key].metadata['experiment']['collection_angle'], 1)
583
- self.sidebar[7,0].value = np.round(self.datasets[self.key].metadata['experiment']['acceleration_voltage']/1000, 1)
584
- self.sidebar[10,0].value = np.round(self.datasets[self.key].metadata['experiment']['exposure_time'], 4)
585
- if 'flux_ppm' not in self.datasets[self.key].metadata['experiment']:
586
- self.datasets[self.key].metadata['experiment']['flux_ppm'] = 0
587
- self.sidebar[11,0].value = self.datasets[self.key].metadata['experiment']['flux_ppm']
588
- if 'count_conversion' not in self.datasets[self.key].metadata['experiment']:
589
- self.datasets[self.key].metadata['experiment']['count_conversion'] = 1
590
- self.sidebar[12,0].value = self.datasets[self.key].metadata['experiment']['count_conversion']
591
- if 'beam_current' not in self.datasets[self.key].metadata['experiment']:
592
- self.datasets[self.key].metadata['experiment']['beam_current'] = 0
593
- self.sidebar[13,0].value = self.datasets[self.key].metadata['experiment']['beam_current']
594
-
595
- self.view = SIPlot(self.dataset)
596
-
597
- self.y_scale = 1.0
598
- self.change_y_scale = 1.0
599
-
600
-
601
- def cursor2energy_scale(self, value):
602
-
603
- dispersion = (self.end_cursor.value - self.start_cursor.value) / (self.end_channel - self.start_channel)
604
- self.datasets[self.key].energy_loss *= (self.sidebar[3, 0].value/dispersion)
605
- self.sidebar[3, 0].value = dispersion
606
- offset = self.start_cursor.value - self.start_channel * dispersion
607
- self.datasets[self.key].energy_loss += (self.sidebar[2, 0].value-self.datasets[self.key].energy_loss[0])
608
- self.sidebar[2, 0].value = offset
609
- self.plot()
610
-
611
- def set_energy_scale(self, value):
612
- dispersion = self.datasets[self.key].energy_loss[1] - self.datasets[self.key].energy_loss[0]
613
- self.datasets[self.key].energy_loss *= (self.sidebar[3, 0].value/dispersion)
614
- self.datasets[self.key].energy_loss += (self.sidebar[2, 0].value-self.datasets[self.key].energy_loss[0])
615
- self.plot()
616
-
617
- def set_y_scale(self, value):
618
- self.change_y_scale = 1/self.y_scale
619
- if self.sidebar[9,2].value:
620
- dispersion = self.datasets[self.key].energy_loss[1] - self.datasets[self.key].energy_loss[0]
621
- self.y_scale = 1/self.datasets[self.key].metadata['experiment']['flux_ppm'] * dispersion
622
- else:
623
- self.y_scale = 1.0
624
-
625
- self.change_y_scale *= self.y_scale
626
- self.plot()
627
-
628
-
629
- def set_flux(self, value):
630
- self.datasets[self.key].metadata['experiment']['exposure_time'] = self.sidebar[10,0].value
631
- if self.sidebar[9,0].value < 0:
632
- self.datasets[self.key].metadata['experiment']['flux_ppm'] = 0.
633
- else:
634
- key = list(self.datasets.keys())[self.sidebar[9,0].value]
635
- self.datasets[self.key].metadata['experiment']['flux_ppm'] = (np.array(self.datasets[key])*1e-6).sum() / self.datasets[key].metadata['experiment']['exposure_time']
636
- self.datasets[self.key].metadata['experiment']['flux_ppm'] *= self.datasets[self.key].metadata['experiment']['exposure_time']
637
- self.sidebar[11,0].value = np.round(self.datasets[self.key].metadata['experiment']['flux_ppm'], 2)
638
-
639
- def set_microscope_parameter(self, value):
640
- self.datasets[self.key].metadata['experiment']['convergence_angle'] = self.sidebar[5,0].value
641
- self.datasets[self.key].metadata['experiment']['collection_angle'] = self.sidebar[6,0].value
642
- self.datasets[self.key].metadata['experiment']['acceleration_voltage'] = self.sidebar[7,0].value*1000
643
-
644
- def set_binning(self, value):
645
- if 'SPECTRAL' in self.dataset.data_type.name:
646
- bin_x = self.sidebar[15,0].value
647
- bin_y = self.sidebar[16,0].value
648
- self.dataset.view.set_bin([bin_x, bin_y])
649
- self.datasets[self.key].metadata['experiment']['SI_bin_x'] = bin_x
650
- self.datasets[self.key].metadata['experiment']['SI_bin_y'] = bin_y
651
-
652
- def set_action(self):
653
- self.sidebar[0,0].observe(self.set_dataset)
654
- self.sidebar[1,0].on_click(self.cursor2energy_scale)
655
- self.sidebar[2,0].observe(self.set_energy_scale, names='value')
656
- self.sidebar[3,0].observe(self.set_energy_scale, names='value')
657
- self.sidebar[5,0].observe(self.set_microscope_parameter)
658
- self.sidebar[6,0].observe(self.set_microscope_parameter)
659
- self.sidebar[7,0].observe(self.set_microscope_parameter)
660
- self.sidebar[9,0].observe(self.set_flux)
661
- self.sidebar[9,2].observe(self.set_y_scale)
662
- self.sidebar[10,0].observe(self.set_flux)
663
- self.sidebar[15,0].observe(self.set_binning)
664
- self.sidebar[16,0].observe(self.set_binning)
665
-