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/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), ('Add Peak', -1)],
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('dataset or first item inhas to be a sidpy dataset')
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
- with plt.ioff():
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
- ylim = self.fig.gca().get_ylim()
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
- ax = self.fig.gca()
259
- ax.clear()
260
- ax.plot(self.energy_scale, self.datasets[self.key]*self.y_scale, label=self.datasets[self.key].title)
261
- ax.set_xlabel(self.datasets[self.key].labels[0])
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
- ax.plot(self.energy_scale, self.model*self.y_scale, label='model')
276
- difference_spec = self.datasets[self.key] - self.model
277
- ax.plot(self.energy_scale, difference_spec*self.y_scale, label='difference')
278
- # axis.plot(self.energy_scale, (self.datasets[key] - self.model) / np.sqrt(self.datasets[key])*self.y_scale, label='Poisson')
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
- for index, peak in self.peaks['peaks'].items():
282
- p = [peak['position'], peak['amplitude'], peak['width']]
283
- ax.plot(self.energy_scale, eels_tools.gauss(self.energy_scale, p))
284
-
285
- ax.legend()
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
- if 'edges' not in self.dataset.metadata or self.dataset.metadata['edges'] == {}:
291
- self.dataset.metadata['edges'] = {'0': {}, 'model': {}, 'use_low_loss': False}
292
-
293
- self.edges = self.dataset.metadata['edges']
294
- if '0' not in self.edges:
295
- self.edges['0'] = {}
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 'fit_area' not in self.edges:
298
- self.edges['fit_area'] = {}
299
- if 'fit_start' not in self.edges['fit_area']:
300
- self.sidebar[1,0].value = np.round(self.energy_scale[50], 3)
301
- self.edges['fit_area']['fit_start'] = self.sidebar[1,0].value
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.sidebar[1,0].value = np.round(self.edges['fit_area']['fit_start'],3)
304
- if 'fit_end' not in self.edges['fit_area']:
305
- self.sidebar[2,0].value = np.round(self.energy_scale[-2], 3)
306
- self.edges['fit_area']['fit_end'] = self.sidebar[2,0].value
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.sidebar[2,0].value = np.round(self.edges['fit_area']['fit_end'],3)
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
- self.find_associated_edges()
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
- def find_associated_edges(self):
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
- if 'edges' in self.dataset.metadata:
456
- white_lines = {}
457
- for index, peak in self.peaks['peaks'].items():
458
- if index.isdigit():
459
- if 'associated_edge' in peak:
460
- if peak['associated_edge'][-2:] in ['L3', 'L2', 'M5', 'M4']:
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.peaks['white_line_sums']:
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.peaks['white_line_ratios'][self.wl_list[0]]:.2f}"
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.peaks['white_line_sums'][self.wls_list[0]]*1e6:.4f} ppm"
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
- # is now sorted in smooth function
521
- # flat_list = [item for sublist in self.peak_out_list for item in sublist]
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
- self.peaks['peaks'][str(i)] = {'position': p[0], 'amplitude': p[1], 'width': p[2], 'type': 'Gauss',
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
- self.find_associated_edges()
538
- self.find_white_lines()
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.update)
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
- if 'edges' in self.dataset.metadata:
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
- self.ui.listwl.clear()
976
- self.ui.listwl.addItems(self.ui.wl_list)
977
- self.ui.listwl.setCurrentIndex(0)
978
- self.ui.unitswl.setText('')
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
- self.ui.listwls.clear()
981
- self.ui.listwls.addItems(self.ui.wls_list)
982
- self.ui.listwls.setCurrentIndex(0)
983
- self.ui.unitswls.setText('')
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
- if advanced_present and iterations > 1:
1158
- peak_model, peak_out_list = advanced_eels_tools.smooth(dataset, peaks['fit_start'],
1159
- peaks['fit_end'], iterations=iterations)
1160
- else:
1161
- peak_model, peak_out_list = eels_tools.find_peaks(dataset, peaks['fit_start'], peaks['fit_end'])
1162
- peak_out_list = [peak_out_list]
1163
-
1164
- flat_list = [item for sublist in peak_out_list for item in sublist]
1165
- new_list = np.reshape(flat_list, [len(flat_list) // 3, 3])
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
@@ -1,6 +1,6 @@
1
1
  """
2
2
  version
3
3
  """
4
- _version = '0.2023.8.0'
4
+ _version = '0.2024.02.0'
5
5
  __version__ = _version
6
- _time = '2023-08-09 19:58:26'
6
+ _time = '2024-02-08 19:58:26'