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/config_dir.py +0 -1
- pyTEMlib/crystal_tools.py +22 -26
- pyTEMlib/eds_tools.py +499 -46
- pyTEMlib/eels_dialog.py +284 -899
- pyTEMlib/eels_dialog_utilities.py +218 -341
- pyTEMlib/eels_tools.py +1526 -1583
- pyTEMlib/file_tools.py +52 -48
- pyTEMlib/graph_tools.py +3 -4
- pyTEMlib/image_tools.py +171 -41
- pyTEMlib/info_widget.py +618 -276
- pyTEMlib/kinematic_scattering.py +77 -512
- pyTEMlib/peak_dialog.py +162 -288
- pyTEMlib/version.py +2 -2
- pyTEMlib/xrpa_x_sections.py +173 -97
- {pyTEMlib-0.2023.8.0.dist-info → pyTEMlib-0.2024.2.0.dist-info}/LICENSE +1 -1
- {pyTEMlib-0.2023.8.0.dist-info → pyTEMlib-0.2024.2.0.dist-info}/METADATA +2 -2
- pyTEMlib-0.2024.2.0.dist-info/RECORD +35 -0
- {pyTEMlib-0.2023.8.0.dist-info → pyTEMlib-0.2024.2.0.dist-info}/WHEEL +1 -1
- pyTEMlib/eels_dlg.py +0 -252
- pyTEMlib/info_dialog.py +0 -665
- pyTEMlib/info_dlg.py +0 -239
- pyTEMlib/interactive_eels.py +0 -35
- pyTEMlib/viz.py +0 -481
- pyTEMlib-0.2023.8.0.dist-info/RECORD +0 -40
- {pyTEMlib-0.2023.8.0.dist-info → pyTEMlib-0.2024.2.0.dist-info}/entry_points.txt +0 -0
- {pyTEMlib-0.2023.8.0.dist-info → pyTEMlib-0.2024.2.0.dist-info}/top_level.txt +0 -0
pyTEMlib/peak_dialog.py
CHANGED
|
@@ -24,6 +24,7 @@ import sidpy
|
|
|
24
24
|
import pyTEMlib.file_tools as ft
|
|
25
25
|
from pyTEMlib import eels_tools
|
|
26
26
|
from pyTEMlib import peak_dlg
|
|
27
|
+
from pyTEMlib import eels_dialog_utilities
|
|
27
28
|
|
|
28
29
|
advanced_present = True
|
|
29
30
|
try:
|
|
@@ -85,7 +86,7 @@ def get_sidebar():
|
|
|
85
86
|
style=ipywidgets.ButtonStyle(button_color='lightblue'))
|
|
86
87
|
row += 1
|
|
87
88
|
side_bar[row, :2] = ipywidgets.Dropdown(
|
|
88
|
-
options=[('Peak 1', 0), ('
|
|
89
|
+
options=[('Peak 1', 0), ('add peak', -1)],
|
|
89
90
|
value=0,
|
|
90
91
|
description='Peaks:',
|
|
91
92
|
disabled=False,
|
|
@@ -138,22 +139,14 @@ class PeakFitWidget(object):
|
|
|
138
139
|
def __init__(self, datasets=None):
|
|
139
140
|
self.datasets = datasets
|
|
140
141
|
if not isinstance(datasets, dict):
|
|
141
|
-
raise TypeError('
|
|
142
|
+
raise TypeError('need dictioary of sidpy datasets')
|
|
142
143
|
|
|
143
144
|
self.sidebar = get_sidebar()
|
|
144
145
|
self.key = list(self.datasets)[0]
|
|
145
146
|
self.dataset = datasets[self.key]
|
|
146
147
|
if not isinstance(self.dataset, sidpy.Dataset):
|
|
147
148
|
raise TypeError('dataset or first item inhas to be a sidpy dataset')
|
|
148
|
-
self.spec_dim = ft.get_dimensions_by_type('spectral', self.dataset)
|
|
149
|
-
if len(self.spec_dim) != 1:
|
|
150
|
-
raise TypeError('We need exactly one SPECTRAL dimension')
|
|
151
|
-
self.spec_dim = self.spec_dim[0]
|
|
152
|
-
#self.energy_scale = self.dataset._axes[self.spec_dim]
|
|
153
149
|
|
|
154
|
-
self.energy_scale = self.spec_dim[1]
|
|
155
|
-
|
|
156
|
-
|
|
157
150
|
self.model = np.array([])
|
|
158
151
|
self.y_scale = 1.0
|
|
159
152
|
self.change_y_scale = 1.0
|
|
@@ -164,72 +157,17 @@ class PeakFitWidget(object):
|
|
|
164
157
|
|
|
165
158
|
self.show_regions = False
|
|
166
159
|
|
|
167
|
-
|
|
168
|
-
self.fig = plt.figure()
|
|
169
|
-
self.fig.canvas.toolbar_position = 'right'
|
|
170
|
-
self.fig.canvas.toolbar_visible = True
|
|
171
|
-
#self.set_dataset()
|
|
172
|
-
self.set_action()
|
|
173
|
-
self.y_scale = 1.0
|
|
174
|
-
self.change_y_scale = 1.0
|
|
175
|
-
self.plot(scale=False)
|
|
176
|
-
|
|
177
|
-
if 'peak_fit' not in self.dataset.metadata:
|
|
178
|
-
self.dataset.metadata['peak_fit'] = {}
|
|
179
|
-
if 'edges' in self.dataset.metadata:
|
|
180
|
-
if 'fit_area' in self.dataset.metadata['edges']:
|
|
181
|
-
self.dataset.metadata['peak_fit']['fit_start'] = \
|
|
182
|
-
self.dataset.metadata['edges']['fit_area']['fit_start']
|
|
183
|
-
self.dataset.metadata['peak_fit']['fit_end'] = self.dataset.metadata['edges']['fit_area']['fit_end']
|
|
184
|
-
self.dataset.metadata['peak_fit']['peaks'] = {'0': {'position': self.energy_scale[1],
|
|
185
|
-
'amplitude': 1000.0, 'width': 1.0,
|
|
186
|
-
'type': 'Gauss', 'asymmetry': 0}}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
self.peaks = self.dataset.metadata['peak_fit']
|
|
190
|
-
if 'fit_start' not in self.peaks:
|
|
191
|
-
self.peaks['fit_start'].value = self.energy_scale[1]
|
|
192
|
-
self.peaks['fit_end'].value = self.energy_scale[-2]
|
|
193
|
-
|
|
194
|
-
if 'peak_model' in self.peaks:
|
|
195
|
-
self.peak_model = self.peaks['peak_model']
|
|
196
|
-
self.model = self.peak_model
|
|
197
|
-
if 'edge_model' in self.peaks:
|
|
198
|
-
self.model = self.model + self.peaks['edge_model']
|
|
199
|
-
else:
|
|
200
|
-
self.model = np.array([])
|
|
201
|
-
self.peak_model = np.array([])
|
|
202
|
-
if 'peak_out_list' in self.peaks:
|
|
203
|
-
self.peak_out_list = self.peaks['peak_out_list']
|
|
204
|
-
self.set_peak_list()
|
|
205
|
-
|
|
206
|
-
# check whether a core loss analysis has been done previously
|
|
207
|
-
if not hasattr(self, 'core_loss') and 'edges' in self.dataset.metadata:
|
|
208
|
-
self.core_loss = True
|
|
209
|
-
else:
|
|
210
|
-
self.core_loss = False
|
|
211
|
-
|
|
212
|
-
self.update()
|
|
213
|
-
|
|
214
|
-
self.selector = matplotlib.widgets.SpanSelector(self.fig.gca(), self.line_select_callback,
|
|
215
|
-
direction="horizontal",
|
|
216
|
-
interactive=True,
|
|
217
|
-
props=dict(facecolor='blue', alpha=0.2))
|
|
218
|
-
self.start_cursor = ipywidgets.FloatText(value=0, description='Start:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
|
|
219
|
-
self.end_cursor = ipywidgets.FloatText(value=0, description='End:', disabled=False, color='black', layout=ipywidgets.Layout(width='200px'))
|
|
220
|
-
self.panel = ipywidgets.VBox([ipywidgets.HBox([ipywidgets.Label('',layout=ipywidgets.Layout(width='100px')), ipywidgets.Label('Cursor:'),
|
|
221
|
-
self.start_cursor,ipywidgets.Label('eV'),
|
|
222
|
-
self.end_cursor, ipywidgets.Label('eV')]),
|
|
223
|
-
self.fig.canvas])
|
|
160
|
+
self.set_dataset()
|
|
224
161
|
|
|
225
162
|
self.app_layout = ipywidgets.AppLayout(
|
|
226
163
|
left_sidebar=self.sidebar,
|
|
227
|
-
center=self.panel,
|
|
164
|
+
center=self.view.panel,
|
|
228
165
|
footer=None,#message_bar,
|
|
229
166
|
pane_heights=[0, 10, 0],
|
|
230
167
|
pane_widths=[4, 10, 0],
|
|
231
168
|
)
|
|
232
169
|
display(self.app_layout)
|
|
170
|
+
self.set_action()
|
|
233
171
|
|
|
234
172
|
def line_select_callback(self, x_min, x_max):
|
|
235
173
|
self.start_cursor.value = np.round(x_min,3)
|
|
@@ -247,85 +185,90 @@ class PeakFitWidget(object):
|
|
|
247
185
|
if key.isdigit():
|
|
248
186
|
self.peak_list.append((f'Peak {int(key) + 1}', int(key)))
|
|
249
187
|
self.peak_list.append(('add peak', -1))
|
|
250
|
-
self.sidebar[7, 0].options = self.peak_list
|
|
251
|
-
self.sidebar[7, 0].value = 0
|
|
188
|
+
#self.sidebar[7, 0].options = self.peak_list
|
|
189
|
+
#self.sidebar[7, 0].value = 0
|
|
252
190
|
|
|
253
191
|
|
|
254
192
|
def plot(self, scale=True):
|
|
255
193
|
|
|
256
|
-
|
|
194
|
+
self.view.change_y_scale = self.change_y_scale
|
|
195
|
+
self.view.y_scale = self.y_scale
|
|
196
|
+
self.energy_scale = self.dataset.energy_loss.values
|
|
257
197
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
ax.set_ylabel(self.datasets[self.key].data_descriptor)
|
|
263
|
-
ax.ticklabel_format(style='sci', scilimits=(-2, 3))
|
|
264
|
-
if scale:
|
|
265
|
-
ax.set_ylim(np.array(ylim)*self.change_y_scale)
|
|
266
|
-
self.change_y_scale = 1.0
|
|
267
|
-
if self.y_scale != 1.:
|
|
268
|
-
ax.set_ylabel('scattering probability (ppm/eV)')
|
|
269
|
-
self.selector = matplotlib.widgets.SpanSelector(self.fig.gca(), self.line_select_callback,
|
|
270
|
-
direction="horizontal",
|
|
271
|
-
interactive=True,
|
|
272
|
-
props=dict(facecolor='blue', alpha=0.2))
|
|
273
|
-
|
|
198
|
+
if self.dataset.data_type == sidpy.DataType.SPECTRAL_IMAGE:
|
|
199
|
+
spectrum = self.dataset.view.get_spectrum()
|
|
200
|
+
else:
|
|
201
|
+
spectrum = self.dataset
|
|
274
202
|
if len(self.model) > 1:
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
203
|
+
additional_spectra = {'model': self.model,
|
|
204
|
+
'difference': spectrum-self.model}
|
|
205
|
+
else:
|
|
206
|
+
additional_spectra = {}
|
|
280
207
|
if 'peaks' in self.peaks:
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
208
|
+
if len(self.peaks)>0:
|
|
209
|
+
for index, peak in self.peaks['peaks'].items(): # ll
|
|
210
|
+
p = [peak['position'], peak['amplitude'], peak['width']]
|
|
211
|
+
additional_spectra[f'peak {index}']= eels_tools.gauss(self.energy_scale, p)
|
|
212
|
+
self.view.plot(scale=True, additional_spectra=additional_spectra )
|
|
213
|
+
self.change_y_scale = 1.
|
|
214
|
+
|
|
215
|
+
self.view.figure.canvas.draw_idle()
|
|
287
216
|
|
|
288
217
|
|
|
289
218
|
def set_dataset(self, index=0):
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
self.
|
|
294
|
-
|
|
295
|
-
|
|
219
|
+
self.spec_dim = ft.get_dimensions_by_type('spectral', self.dataset)
|
|
220
|
+
if len(self.spec_dim) != 1:
|
|
221
|
+
raise TypeError('We need exactly one SPECTRAL dimension')
|
|
222
|
+
self.spec_dim = self.spec_dim[0]
|
|
223
|
+
self.energy_scale = self.spec_dim[1]
|
|
224
|
+
|
|
225
|
+
self.y_scale = 1.0
|
|
226
|
+
self.change_y_scale = 1.0
|
|
296
227
|
|
|
297
|
-
if '
|
|
298
|
-
self.
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
228
|
+
if 'peak_fit' not in self.dataset.metadata:
|
|
229
|
+
self.dataset.metadata['peak_fit'] = {}
|
|
230
|
+
if 'edges' in self.dataset.metadata:
|
|
231
|
+
if 'fit_area' in self.dataset.metadata['edges']:
|
|
232
|
+
self.dataset.metadata['peak_fit']['fit_start'] = self.dataset.metadata['edges']['fit_area']['fit_start']
|
|
233
|
+
self.dataset.metadata['peak_fit']['fit_end'] = self.dataset.metadata['edges']['fit_area']['fit_end']
|
|
234
|
+
self.dataset.metadata['peak_fit']['peaks'] = {'0': {'position': self.energy_scale[1],
|
|
235
|
+
'amplitude': 1000.0, 'width': 1.0,
|
|
236
|
+
'type': 'Gauss', 'asymmetry': 0}}
|
|
237
|
+
|
|
238
|
+
self.peaks = self.dataset.metadata['peak_fit']
|
|
239
|
+
if 'fit_start' not in self.peaks:
|
|
240
|
+
self.peaks['fit_start'] = self.energy_scale[1]
|
|
241
|
+
if 'fit_end' not in self.peaks:
|
|
242
|
+
self.peaks['fit_end'] = self.energy_scale[-2]
|
|
243
|
+
|
|
244
|
+
if 'peak_model' in self.peaks:
|
|
245
|
+
self.peak_model = self.peaks['peak_model']
|
|
246
|
+
self.model = self.peak_model
|
|
247
|
+
if 'edge_model' in self.peaks:
|
|
248
|
+
self.model = self.model + self.peaks['edge_model']
|
|
302
249
|
else:
|
|
303
|
-
self.
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
self.
|
|
250
|
+
self.model = np.array([])
|
|
251
|
+
self.peak_model = np.array([])
|
|
252
|
+
if 'peak_out_list' in self.peaks:
|
|
253
|
+
self.peak_out_list = self.peaks['peak_out_list']
|
|
254
|
+
self.set_peak_list()
|
|
255
|
+
|
|
256
|
+
# check whether a core loss analysis has been done previously
|
|
257
|
+
if not hasattr(self, 'core_loss') and 'edges' in self.dataset.metadata:
|
|
258
|
+
self.core_loss = True
|
|
307
259
|
else:
|
|
308
|
-
self.
|
|
309
|
-
|
|
310
|
-
if self.dataset.data_type.name == 'SPECTRAL_IMAGE':
|
|
311
|
-
if 'SI_bin_x' not in self.dataset.metadata['experiment']:
|
|
312
|
-
self.dataset.metadata['experiment']['SI_bin_x'] = 1
|
|
313
|
-
self.dataset.metadata['experiment']['SI_bin_y'] = 1
|
|
314
|
-
|
|
315
|
-
bin_x = self.dataset.metadata['experiment']['SI_bin_x']
|
|
316
|
-
bin_y = self.dataset.metadata['experiment']['SI_bin_y']
|
|
317
|
-
# self.dataset.view.set_bin([bin_x, bin_y])
|
|
260
|
+
self.core_loss = False
|
|
261
|
+
|
|
318
262
|
self.update()
|
|
263
|
+
if self.dataset.data_type.name =='SPECTRAL_IMAGE':
|
|
264
|
+
self.view = eels_dialog_utilities.SIPlot(self.dataset)
|
|
265
|
+
else:
|
|
266
|
+
self.view = eels_dialog_utilities.SpectrumPlot(self.dataset)
|
|
267
|
+
self.y_scale = 1.0
|
|
268
|
+
self.change_y_scale = 1.0
|
|
319
269
|
|
|
320
270
|
def set_fit_area(self, value):
|
|
321
|
-
|
|
322
|
-
if self.sidebar[1,0].value > self.sidebar[2,0].value:
|
|
323
|
-
self.sidebar[1,0].value = self.sidebar[2,0].value - 1.0
|
|
324
|
-
if float(self.sidebar[1,0].value) < self.energy_scale[0]:
|
|
325
|
-
self.sidebar[1,0].value = self.energy_scale[0]
|
|
326
|
-
if self.sidebar[2,0].value > self.energy_scale[-1]:
|
|
327
|
-
self.sidebar[2,0].value = self.energy_scale[-1]
|
|
328
|
-
"""
|
|
271
|
+
|
|
329
272
|
self.peaks['fit_start'] = self.sidebar[1, 0].value
|
|
330
273
|
self.peaks['fit_end'] = self.sidebar[2, 0].value
|
|
331
274
|
|
|
@@ -369,7 +312,7 @@ class PeakFitWidget(object):
|
|
|
369
312
|
|
|
370
313
|
def fit_peaks(self, value = 0):
|
|
371
314
|
"""Fit spectrum with peaks given in peaks dictionary"""
|
|
372
|
-
print('Fitting peaks...')
|
|
315
|
+
# print('Fitting peaks...')
|
|
373
316
|
p_in = []
|
|
374
317
|
for key, peak in self.peaks['peaks'].items():
|
|
375
318
|
if key.isdigit():
|
|
@@ -389,10 +332,10 @@ class PeakFitWidget(object):
|
|
|
389
332
|
if 'model' in self.dataset.metadata:
|
|
390
333
|
model = self.dataset.metadata['model'][start_channel:end_channel]
|
|
391
334
|
elif self.core_loss:
|
|
392
|
-
print('Core loss model found. Fitting on top of the model.')
|
|
335
|
+
# print('Core loss model found. Fitting on top of the model.')
|
|
393
336
|
model = self.dataset.metadata['edges']['model']['spectrum'][start_channel:end_channel]
|
|
394
337
|
else:
|
|
395
|
-
print('No core loss model found. Fitting to the full spectrum.')
|
|
338
|
+
# print('No core loss model found. Fitting to the full spectrum.')
|
|
396
339
|
model = np.zeros(end_channel - start_channel)
|
|
397
340
|
|
|
398
341
|
# if we have a core loss model we will only fit the difference between the model and the data.
|
|
@@ -421,87 +364,31 @@ class PeakFitWidget(object):
|
|
|
421
364
|
'type': 'Gauss',
|
|
422
365
|
'associated_edge': ''}
|
|
423
366
|
|
|
424
|
-
|
|
367
|
+
eels_tools.find_associated_edges(self.dataset)
|
|
425
368
|
self.find_white_lines()
|
|
426
369
|
self.update()
|
|
427
370
|
self.plot()
|
|
428
371
|
|
|
429
|
-
|
|
430
|
-
onsets = []
|
|
431
|
-
edges = []
|
|
432
|
-
if 'edges' in self.dataset.metadata:
|
|
433
|
-
for key, edge in self.dataset.metadata['edges'].items():
|
|
434
|
-
if key.isdigit():
|
|
435
|
-
element = edge['element']
|
|
436
|
-
for sym in edge['all_edges']: # TODO: Could be replaced with exclude
|
|
437
|
-
onsets.append(edge['all_edges'][sym]['onset'] + edge['chemical_shift'])
|
|
438
|
-
# if 'sym' == edge['symmetry']:
|
|
439
|
-
edges.append([key, f"{element}-{sym}", onsets[-1]])
|
|
440
|
-
for key, peak in self.peaks['peaks'].items():
|
|
441
|
-
if key.isdigit():
|
|
442
|
-
distance = self.energy_scale[-1]
|
|
443
|
-
index = -1
|
|
444
|
-
for ii, onset in enumerate(onsets):
|
|
445
|
-
if onset < peak['position'] < onset+50:
|
|
446
|
-
if distance > np.abs(peak['position'] - onset):
|
|
447
|
-
distance = np.abs(peak['position'] - onset) # TODO: check whether absolute is good
|
|
448
|
-
distance_onset = peak['position'] - onset
|
|
449
|
-
index = ii
|
|
450
|
-
if index >= 0:
|
|
451
|
-
peak['associated_edge'] = edges[index][1] # check if more info is necessary
|
|
452
|
-
peak['distance_to_onset'] = distance_onset
|
|
372
|
+
|
|
453
373
|
|
|
454
374
|
def find_white_lines(self):
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
if peak['distance_to_onset'] < 10:
|
|
462
|
-
area = np.sqrt(2 * np.pi) * peak['amplitude'] * np.abs(peak['width']/np.sqrt(2 * np.log(2)))
|
|
463
|
-
if peak['associated_edge'] not in white_lines:
|
|
464
|
-
white_lines[peak['associated_edge']] = 0.
|
|
465
|
-
if area > 0:
|
|
466
|
-
white_lines[peak['associated_edge']] += area # TODO: only positive ones?
|
|
467
|
-
white_line_ratios = {}
|
|
468
|
-
white_line_sum = {}
|
|
469
|
-
for sym, area in white_lines.items():
|
|
470
|
-
if sym[-2:] in ['L2', 'M4', 'M2']:
|
|
471
|
-
if area > 0 and f"{sym[:-1]}{int(sym[-1]) + 1}" in white_lines:
|
|
472
|
-
if white_lines[f"{sym[:-1]}{int(sym[-1]) + 1}"] > 0:
|
|
473
|
-
white_line_ratios[f"{sym}/{sym[-2]}{int(sym[-1]) + 1}"] = area / white_lines[
|
|
474
|
-
f"{sym[:-1]}{int(sym[-1]) + 1}"]
|
|
475
|
-
white_line_sum[f"{sym}+{sym[-2]}{int(sym[-1]) + 1}"] = (
|
|
476
|
-
area + white_lines[f"{sym[:-1]}{int(sym[-1]) + 1}"])
|
|
477
|
-
|
|
478
|
-
areal_density = 1.
|
|
479
|
-
if 'edges' in self.dataset.metadata:
|
|
480
|
-
for key, edge in self.dataset.metadata['edges'].items():
|
|
481
|
-
if key.isdigit():
|
|
482
|
-
if edge['element'] == sym.split('-')[0]:
|
|
483
|
-
areal_density = edge['areal_density']
|
|
484
|
-
break
|
|
485
|
-
white_line_sum[f"{sym}+{sym[-2]}{int(sym[-1]) + 1}"] /= areal_density
|
|
486
|
-
|
|
487
|
-
self.peaks['white_lines'] = white_lines
|
|
488
|
-
self.peaks['white_line_ratios'] = white_line_ratios
|
|
489
|
-
self.peaks['white_line_sums'] = white_line_sum
|
|
490
|
-
self.wl_list = []
|
|
491
|
-
self.wls_list = []
|
|
492
|
-
if len(self.peaks['white_line_ratios']) > 0:
|
|
493
|
-
for key in self.peaks['white_line_ratios']:
|
|
375
|
+
eels_tools.find_white_lines(self.dataset)
|
|
376
|
+
self.wl_list = []
|
|
377
|
+
self.wls_list = []
|
|
378
|
+
if 'white_line_ratios' in self.dataset.metadata['peak_fit']:
|
|
379
|
+
if len(self.dataset.metadata['peak_fit']['white_line_ratios']) > 0:
|
|
380
|
+
for key in self.dataset.metadata['peak_fit']['white_line_ratios']:
|
|
494
381
|
self.wl_list.append(key)
|
|
495
|
-
for key in self.
|
|
382
|
+
for key in self.dataset.metadata['peak_fit']['white_line_sums']:
|
|
496
383
|
self.wls_list.append(key)
|
|
497
384
|
|
|
498
385
|
self.sidebar[14, 0].options = self.wl_list
|
|
499
386
|
self.sidebar[14, 0].value = self.wl_list[0]
|
|
500
|
-
self.sidebar[14, 2].value = f"{self.
|
|
387
|
+
self.sidebar[14, 2].value = f"{self.dataset.metadata['peak_fit']['white_line_ratios'][self.wl_list[0]]:.2f}"
|
|
501
388
|
|
|
502
389
|
self.sidebar[15, 0].options = self.wls_list
|
|
503
390
|
self.sidebar[15, 0].value = self.wls_list[0]
|
|
504
|
-
self.sidebar[15, 2].value = f"{self.
|
|
391
|
+
self.sidebar[15, 2].value = f"{self.dataset.metadata['peak_fit']['white_line_sums'][self.wls_list[0]]*1e6:.4f} ppm"
|
|
505
392
|
|
|
506
393
|
else:
|
|
507
394
|
self.wl_list.append('Ratio')
|
|
@@ -514,28 +401,30 @@ class PeakFitWidget(object):
|
|
|
514
401
|
self.sidebar[15, 0].options = ['None']
|
|
515
402
|
self.sidebar[15, 0].value = 'None'
|
|
516
403
|
self.sidebar[15, 2].value = ' '
|
|
404
|
+
|
|
517
405
|
def find_peaks(self, value=0):
|
|
518
406
|
number_of_peaks = int(self.sidebar[5, 0].value)
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
# new_list = np.reshape(flat_list, [len(flat_list) // 3, 3])
|
|
523
|
-
# arg_list = np.argsort(np.abs(new_list[:, 1]))
|
|
524
|
-
|
|
407
|
+
if number_of_peaks > len(self.peak_out_list):
|
|
408
|
+
number_of_peaks = len(self.peak_out_list)
|
|
409
|
+
self.sidebar[5, 0].value = str(len(self.peak_out_list))
|
|
525
410
|
self.peak_list = []
|
|
526
411
|
self.peaks['peaks'] = {}
|
|
412
|
+
new_number_of_peaks = 0
|
|
527
413
|
for i in range(number_of_peaks):
|
|
528
414
|
self.peak_list.append((f'Peak {i+1}', i))
|
|
529
415
|
p = self.peak_out_list[i]
|
|
530
|
-
|
|
416
|
+
if p[1]>0:
|
|
417
|
+
self.peaks['peaks'][str(new_number_of_peaks)] = {'position': p[0], 'amplitude': p[1], 'width': p[2], 'type': 'Gauss',
|
|
531
418
|
'asymmetry': 0}
|
|
532
|
-
|
|
419
|
+
new_number_of_peaks += 1
|
|
420
|
+
self.sidebar[5, 0].value = str(new_number_of_peaks)
|
|
533
421
|
self.peak_list.append((f'add peak', -1))
|
|
534
422
|
|
|
535
423
|
self.sidebar[7, 0].options = self.peak_list
|
|
536
424
|
self.sidebar[7, 0].value = 0
|
|
537
|
-
|
|
538
|
-
self.
|
|
425
|
+
|
|
426
|
+
#eels_tools.find_associated_edges(self.dataset)
|
|
427
|
+
#self.find_white_lines()
|
|
539
428
|
|
|
540
429
|
self.update()
|
|
541
430
|
self.plot()
|
|
@@ -560,13 +449,12 @@ class PeakFitWidget(object):
|
|
|
560
449
|
else:
|
|
561
450
|
self.model = np.zeros(len(spec_dim[1]))
|
|
562
451
|
|
|
563
|
-
self.sidebar[5, 0].value = number_of_peaks
|
|
564
|
-
|
|
565
452
|
self.dataset.metadata['peak_fit']['edge_model'] = self.model
|
|
566
453
|
self.model = self.model + self.peak_model
|
|
567
454
|
self.dataset.metadata['peak_fit']['peak_model'] = self.peak_model
|
|
568
455
|
self.dataset.metadata['peak_fit']['peak_out_list'] = self.peak_out_list
|
|
569
|
-
|
|
456
|
+
|
|
457
|
+
self.sidebar[5, 0].value = str(len(self.peak_out_list))
|
|
570
458
|
self.update()
|
|
571
459
|
self.plot()
|
|
572
460
|
|
|
@@ -592,6 +480,7 @@ class PeakFitWidget(object):
|
|
|
592
480
|
self.model = self.dataset.metadata['peak_fit']['edge_model'] + self.peak_model
|
|
593
481
|
else:
|
|
594
482
|
self.model = np.zeros(self.dataset.shape)
|
|
483
|
+
|
|
595
484
|
def modify_peak_position(self, value=-1):
|
|
596
485
|
peak_index = self.sidebar[7, 0].value
|
|
597
486
|
self.peaks['peaks'][str(peak_index)]['position'] = self.sidebar[9,0].value
|
|
@@ -609,14 +498,24 @@ class PeakFitWidget(object):
|
|
|
609
498
|
self.peaks['peaks'][str(peak_index)]['width'] = self.sidebar[11,0].value
|
|
610
499
|
self.make_model()
|
|
611
500
|
self.plot()
|
|
501
|
+
|
|
502
|
+
def peak_selection(self, change=None):
|
|
503
|
+
options = list(self.sidebar[7,0].options)
|
|
504
|
+
|
|
505
|
+
if self.sidebar[7, 0].value < 0:
|
|
506
|
+
options.insert(-1, (f'Peak {len(options)}', len(options)-1))
|
|
507
|
+
self.sidebar[7, 0].value = 0
|
|
508
|
+
self.sidebar[7,0].options = options
|
|
509
|
+
self.sidebar[7, 0].value = int(len(options)-2)
|
|
510
|
+
|
|
511
|
+
self.update()
|
|
612
512
|
|
|
613
|
-
|
|
614
513
|
def set_action(self):
|
|
615
514
|
self.sidebar[1, 0].observe(self.set_fit_area, names='value')
|
|
616
515
|
self.sidebar[2, 0].observe(self.set_fit_area, names='value')
|
|
617
516
|
|
|
618
517
|
self.sidebar[4, 2].on_click(self.smooth)
|
|
619
|
-
self.sidebar[7,0].observe(self.
|
|
518
|
+
self.sidebar[7,0].observe(self.peak_selection)
|
|
620
519
|
self.sidebar[5,2].on_click(self.find_peaks)
|
|
621
520
|
|
|
622
521
|
self.sidebar[6, 0].on_click(self.fit_peaks)
|
|
@@ -868,6 +767,11 @@ if Qt_available:
|
|
|
868
767
|
We sort the peaks by area under the Gaussians, assuming that small areas mean noise.
|
|
869
768
|
|
|
870
769
|
"""
|
|
770
|
+
if 'edges' in self.dataset.metadata:
|
|
771
|
+
if 'model' in self.dataset.metadata['edges']:
|
|
772
|
+
self.dataset.metadata['model'] = self.dataset.metadata['edges']['model']
|
|
773
|
+
if 'resolution_function' in self.datasets:
|
|
774
|
+
self.dataset.metadata['model'] = np.array(self.datasets['resolution_function'])
|
|
871
775
|
iterations = int(self.ui.smooth_list.currentIndex())
|
|
872
776
|
|
|
873
777
|
self.peak_model, self.peak_out_list, number_of_peaks = smooth(self.dataset, iterations, advanced_present)
|
|
@@ -916,71 +820,38 @@ if Qt_available:
|
|
|
916
820
|
peak['distance_to_onset'] = distance_onset
|
|
917
821
|
|
|
918
822
|
def find_white_lines(self):
|
|
919
|
-
|
|
920
|
-
white_lines = {}
|
|
921
|
-
for index, peak in self.peaks['peaks'].items():
|
|
922
|
-
if index.isdigit():
|
|
923
|
-
if 'associated_edge' in peak:
|
|
924
|
-
if peak['associated_edge'][-2:] in ['L3', 'L2', 'M5', 'M4']:
|
|
925
|
-
if peak['distance_to_onset'] < 10:
|
|
926
|
-
area = np.sqrt(2 * np.pi) * peak['amplitude'] * np.abs(peak['width']/np.sqrt(2 * np.log(2)))
|
|
927
|
-
if peak['associated_edge'] not in white_lines:
|
|
928
|
-
white_lines[peak['associated_edge']] = 0.
|
|
929
|
-
if area > 0:
|
|
930
|
-
white_lines[peak['associated_edge']] += area # TODO: only positive ones?
|
|
931
|
-
white_line_ratios = {}
|
|
932
|
-
white_line_sum = {}
|
|
933
|
-
for sym, area in white_lines.items():
|
|
934
|
-
if sym[-2:] in ['L2', 'M4', 'M2']:
|
|
935
|
-
if area > 0 and f"{sym[:-1]}{int(sym[-1]) + 1}" in white_lines:
|
|
936
|
-
if white_lines[f"{sym[:-1]}{int(sym[-1]) + 1}"] > 0:
|
|
937
|
-
white_line_ratios[f"{sym}/{sym[-2]}{int(sym[-1]) + 1}"] = area / white_lines[
|
|
938
|
-
f"{sym[:-1]}{int(sym[-1]) + 1}"]
|
|
939
|
-
white_line_sum[f"{sym}+{sym[-2]}{int(sym[-1]) + 1}"] = (
|
|
940
|
-
area + white_lines[f"{sym[:-1]}{int(sym[-1]) + 1}"])
|
|
941
|
-
|
|
942
|
-
areal_density = 1.
|
|
943
|
-
if 'edges' in self.dataset.metadata:
|
|
944
|
-
for key, edge in self.dataset.metadata['edges'].items():
|
|
945
|
-
if key.isdigit():
|
|
946
|
-
if edge['element'] == sym.split('-')[0]:
|
|
947
|
-
areal_density = edge['areal_density']
|
|
948
|
-
break
|
|
949
|
-
white_line_sum[f"{sym}+{sym[-2]}{int(sym[-1]) + 1}"] /= areal_density
|
|
950
|
-
|
|
951
|
-
self.peaks['white_lines'] = white_lines
|
|
952
|
-
self.peaks['white_line_ratios'] = white_line_ratios
|
|
953
|
-
self.peaks['white_line_sums'] = white_line_sum
|
|
954
|
-
self.ui.wl_list = []
|
|
955
|
-
self.ui.wls_list = []
|
|
956
|
-
if len(self.peaks['white_line_ratios']) > 0:
|
|
957
|
-
for key in self.peaks['white_line_ratios']:
|
|
958
|
-
self.ui.wl_list.append(key)
|
|
959
|
-
for key in self.peaks['white_line_sums']:
|
|
960
|
-
self.ui.wls_list.append(key)
|
|
961
|
-
|
|
962
|
-
self.ui.listwl.clear()
|
|
963
|
-
self.ui.listwl.addItems(self.ui.wl_list)
|
|
964
|
-
self.ui.listwl.setCurrentIndex(0)
|
|
965
|
-
self.ui.unitswl.setText(f"{self.peaks['white_line_ratios'][self.ui.wl_list[0]]:.2f}")
|
|
966
|
-
|
|
967
|
-
self.ui.listwls.clear()
|
|
968
|
-
self.ui.listwls.addItems(self.ui.wls_list)
|
|
969
|
-
self.ui.listwls.setCurrentIndex(0)
|
|
970
|
-
self.ui.unitswls.setText(f"{self.peaks['white_line_sums'][self.ui.wls_list[0]]*1e6:.4f} ppm")
|
|
971
|
-
else:
|
|
972
|
-
self.ui.wl_list.append('Ratio')
|
|
973
|
-
self.ui.wls_list.append('Sum')
|
|
823
|
+
eels_tools.find_white_lines(self.dataset)
|
|
974
824
|
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
825
|
+
self.ui.wl_list = []
|
|
826
|
+
self.ui.wls_list = []
|
|
827
|
+
if len(self.peaks['white_line_ratios']) > 0:
|
|
828
|
+
for key in self.peaks['white_line_ratios']:
|
|
829
|
+
self.ui.wl_list.append(key)
|
|
830
|
+
for key in self.peaks['white_line_sums']:
|
|
831
|
+
self.ui.wls_list.append(key)
|
|
832
|
+
|
|
833
|
+
self.ui.listwl.clear()
|
|
834
|
+
self.ui.listwl.addItems(self.ui.wl_list)
|
|
835
|
+
self.ui.listwl.setCurrentIndex(0)
|
|
836
|
+
self.ui.unitswl.setText(f"{self.peaks['white_line_ratios'][self.ui.wl_list[0]]:.2f}")
|
|
979
837
|
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
838
|
+
self.ui.listwls.clear()
|
|
839
|
+
self.ui.listwls.addItems(self.ui.wls_list)
|
|
840
|
+
self.ui.listwls.setCurrentIndex(0)
|
|
841
|
+
self.ui.unitswls.setText(f"{self.peaks['white_line_sums'][self.ui.wls_list[0]]*1e6:.4f} ppm")
|
|
842
|
+
else:
|
|
843
|
+
self.ui.wl_list.append('Ratio')
|
|
844
|
+
self.ui.wls_list.append('Sum')
|
|
845
|
+
|
|
846
|
+
self.ui.listwl.clear()
|
|
847
|
+
self.ui.listwl.addItems(self.ui.wl_list)
|
|
848
|
+
self.ui.listwl.setCurrentIndex(0)
|
|
849
|
+
self.ui.unitswl.setText('')
|
|
850
|
+
|
|
851
|
+
self.ui.listwls.clear()
|
|
852
|
+
self.ui.listwls.addItems(self.ui.wls_list)
|
|
853
|
+
self.ui.listwls.setCurrentIndex(0)
|
|
854
|
+
self.ui.unitswls.setText('')
|
|
984
855
|
|
|
985
856
|
def find_peaks(self):
|
|
986
857
|
number_of_peaks = int(str(self.ui.find_edit.displayText()).strip())
|
|
@@ -1154,15 +1025,18 @@ def smooth(dataset, iterations, advanced_present):
|
|
|
1154
1025
|
# TODO: add sensitivity to dialog and the two functions below
|
|
1155
1026
|
peaks = dataset.metadata['peak_fit']
|
|
1156
1027
|
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1028
|
+
peak_model, peak_out_list = eels_tools.find_peaks(dataset,
|
|
1029
|
+
peaks['fit_start'],
|
|
1030
|
+
peaks['fit_end'])
|
|
1031
|
+
#
|
|
1032
|
+
#cif advanced_present and iterations > 1:
|
|
1033
|
+
# peak_model, peak_out_list = advanced_eels_tools.smooth(dataset, peaks['fit_start'],
|
|
1034
|
+
# peaks['fit_end'], iterations=iterations)
|
|
1035
|
+
# else:
|
|
1036
|
+
# peak_model, peak_out_list = eels_tools.find_peaks(dataset, peaks['fit_start'], peaks['fit_end'])
|
|
1037
|
+
# peak_out_list = [peak_out_list]
|
|
1038
|
+
|
|
1039
|
+
new_list = np.reshape(peak_out_list, [len(peak_out_list) // 3, 3])
|
|
1166
1040
|
area = np.sqrt(2 * np.pi) * np.abs(new_list[:, 1]) * np.abs(new_list[:, 2] / np.sqrt(2 * np.log(2)))
|
|
1167
1041
|
arg_list = np.argsort(area)[::-1]
|
|
1168
1042
|
area = area[arg_list]
|
pyTEMlib/version.py
CHANGED