This page was generated from docs/Examples/Fitting_Fermi_Diads/Example1b_CO2_Fluid_inclusions_withstandards/Step3_FitAll_Together.ipynb. Interactive online version: Binder badge.

Python Notebook Download

3. Fitting diads once you have groups

  • Once you have divided your diads into groups based on strengths, you need to tweak the fit parameters for each group

  • Then you can loop through all files in a given group and automatically fit the spectra

[4]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import joblib
import DiadFit as pf
pf.__version__
[4]:
'1.0.7'

Specifying filetype, and folder as before

[5]:
# This specifies what file type your Raman exported in.
meta_path, spectra_path, spectra_filetype, prefix, str_prefix, spectra_file_ext, meta_file_ext, TruPower=pf.get_settings()
[7]:
np_x = joblib.load('np_x.sav')
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
Cell In[7], line 1
----> 1 np_x = joblib.load('np_x.sav')

File c:\Users\penny\anaconda3\Lib\site-packages\joblib\numpy_pickle.py:650, in load(filename, mmap_mode)
    648         obj = _unpickle(fobj)
    649 else:
--> 650     with open(filename, 'rb') as f:
    651         with _read_fileobject(f, filename, mmap_mode) as fobj:
    652             if isinstance(fobj, str):
    653                 # if the returned file object is a string, this means we
    654                 # try to load a pickle file generated with an version of
    655                 # Joblib so we load it with joblib compatibility function.

FileNotFoundError: [Errno 2] No such file or directory: 'np_x.sav'
[8]:
pwd
[8]:
'c:\\Users\\penny\\Box\\Berkeley_new\\DiadFit_outer\\docs\\Examples\\Fitting_Fermi_Diads\\Example1b_CO2_Fluid_inclusions_withstandards'

Load in data and fit parameters

  • This loads in the dataframes of the fit parameters you saved in the other file, by group

  • At this point you select what group you want to fit (batch = ‘Weak’, ‘Medium’ or ‘Strong’). After running through the entire notebook for one group, come back up here to fit a second group.

[6]:
## load dataframes and numpy arrays
np_x = joblib.load('np_x.sav')

# Select the group you want to fit ('Weak', 'Medium', 'Strong'). After selecting one, go through and select another one and run again from here.
batch='Medium' # Options are Std, Weak, Medium, Strong

if batch=='Weak':
    GroupN_df=joblib.load('Weak_df.sav')
if batch=='Medium':
    GroupN_df=joblib.load('Medium_df.sav')
if batch=='Strong':
    GroupN_df=joblib.load('Strong_df.sav')
if batch=='Std':
    GroupN_df=joblib.load('Std_df.sav')
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
Cell In[6], line 2
      1 ## load dataframes and numpy arrays 
----> 2 np_x = joblib.load('np_x.sav')
      4 # Select the group you want to fit ('Weak', 'Medium', 'Strong'). After selecting one, go through and select another one and run again from here. 
      5 batch='Medium' # Options are Std, Weak, Medium, Strong

File c:\Users\penny\anaconda3\Lib\site-packages\joblib\numpy_pickle.py:650, in load(filename, mmap_mode)
    648         obj = _unpickle(fobj)
    649 else:
--> 650     with open(filename, 'rb') as f:
    651         with _read_fileobject(f, filename, mmap_mode) as fobj:
    652             if isinstance(fobj, str):
    653                 # if the returned file object is a string, this means we
    654                 # try to load a pickle file generated with an version of
    655                 # Joblib so we load it with joblib compatibility function.

FileNotFoundError: [Errno 2] No such file or directory: 'np_x.sav'

Now load one file from this group to tweak parameters for

[46]:
Diad_Files =GroupN_df['filename']
i=0

Lets plot the diad to have a look at it

[47]:
plot1=pf.plot_diad(path=spectra_path, filename=Diad_Files[i], filetype=spectra_filetype)
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_11_0.png

Now lets inspect the diads and get their approximate positions

  • As with generic peak, you can exclude 2 segments (e.g. around cosmic rays)

  • You then specify how many peaks you want to fit on each diad. 1 means just the strong peak, 2 hotbands, and 3 for Diad2 would also fit the C13 peak if present.

  • The identify_diad_peaks then uses scipy findpeaks to identify the positions of the 2 diads, and any other peaks the user asks for. These are saved, and fed into the later functions for peak fitting.

Choose a model for fitting all peaks

  • Option of Voigt or PseudoVoigt. We recomend PsuedoVoigt

[48]:
model_name='PseudoVoigtModel'

Fit Diad 1

  • Tweak the parameters in the config files for each group. E.g. how many peaks (fit_peaks), the background positions, the sigma of the diad, and whether or not you want a gaussian background

[49]:
diad_id_config=pf.diad_id_config(height=50, exclude_range1=[1308, 1309])
diad_id_config

# FG04 Standards
if batch=='Std':
    diad1_fit_config_init=pf.diad1_fit_config(
    model_name=model_name, fit_peaks=2,
    N_poly_bck_diad1=2, lower_bck_diad1=(1180, 1240),
    upper_bck_diad1=(1315, 1350),
    diad_sigma=0.6,
    x_range_residual=10, x_range_baseline=30,
     y_range_baseline=100,
    HB_prom=GroupN_df['HB1_abs_prom'].iloc[i],
    diad_prom=GroupN_df['Diad1_abs_prom'].iloc[i])
    diad1_fit_config_init


if batch=='Weak':
    diad1_fit_config_init=pf.diad1_fit_config(
    model_name=model_name, fit_peaks=2,
    N_poly_bck_diad1=1, lower_bck_diad1=(1180, 1250),
    upper_bck_diad1=(1300, 1350),
    diad_sigma=0.6,
    x_range_residual=10, x_range_baseline=30,
     y_range_baseline=100,
    HB_prom=GroupN_df['HB1_abs_prom'].iloc[i],
    diad_prom=GroupN_df['Diad1_abs_prom'].iloc[i])
    diad1_fit_config_init

if batch=='Medium':
    diad1_fit_config_init=pf.diad1_fit_config(
    model_name=model_name, fit_peaks=2,
    N_poly_bck_diad1=2, lower_bck_diad1=(1180, 1240),
    upper_bck_diad1=(1315, 1350),
    diad_sigma=0.6,
    x_range_residual=10, x_range_baseline=30,
     y_range_baseline=100,
    HB_prom=GroupN_df['HB1_abs_prom'].iloc[i],
    diad_prom=GroupN_df['Diad1_abs_prom'].iloc[i])
    diad1_fit_config_init

if batch=='Strong':
    diad1_fit_config_init=pf.diad1_fit_config(
    fit_gauss=True, gauss_amp= 2*GroupN_df['HB1_abs_prom'].iloc[i],
    model_name=model_name, fit_peaks=2,
    N_poly_bck_diad1=1, lower_bck_diad1=(1180, 1220),
    upper_bck_diad1=(1330, 1350),
    diad_sigma=0.6,
    x_range_residual=10, x_range_baseline=30,
     y_range_baseline=1000,
    HB_prom=GroupN_df['HB1_abs_prom'].iloc[i],
    diad_prom=GroupN_df['Diad1_abs_prom'].iloc[i])
diad1_fit_config_init
[49]:
diad1_fit_config(model_name='PseudoVoigtModel', fit_peaks=2, N_poly_bck_diad1=2, lower_bck_diad1=(1180, 1240), upper_bck_diad1=(1315, 1350), fit_gauss=False, gauss_amp=1000, diad_sigma=0.6, diad_sigma_min_allowance=0.2, diad_sigma_max_allowance=5, diad_prom=1413.6109462560908, HB_prom=104.37095184669647, x_range_baseline=30, y_range_baseline=100, dpi=200, x_range_residual=10, return_other_params=False)

See what these fit parameters look like for diad1

[50]:
Diad1_fit=pf.fit_diad_1_w_bck(config1=diad1_fit_config_init,
config2=diad_id_config,
path=spectra_path, filename=Diad_Files.iloc[0],
filetype=spectra_filetype, plot_figure=True, close_figure=False,
Diad_pos=GroupN_df['Diad1_pos'].iloc[i],
HB_pos=GroupN_df['HB1_pos'].iloc[i])
Diad1_fit
[50]:
Diad1_Combofit_Cent Diad1_Voigt_Cent Diad1_cent_err Diad1_Voigt_Area Diad1_Voigt_Sigma Diad1_Voigt_Gamma HB1_Cent HB1_Area HB1_Sigma Diad1_Combofit_Height Diad1_Residual Diad1_Prop_Lor Diad1_fwhm Diad1_refit Diad1_Asym50 Diad1_Asym70 Diad1_Yuan2017_sym_factor Diad1_Remigi2021_BSF Diad1_PDF_Model
0 1285.338356 1285.338406 0.002218 2791.147753 0.713516 0 1265.127109 331.034681 1.07491 1453.107904 4.4077 0.649391 1.427033 Flagged Warnings: 1.1725 1.176685 0.246163 0.000982 PseudoVoigtModel
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_18_1.png

Update the sigma

  • The sigma parameter varies quite a lot based on the splitting. Best to update your first guess with what you found for the example file above

[51]:
diad1_fit_config2=diad1_fit_config_init

Fit diad2

[52]:
if batch=='Std':
    diad2_fit_config_init=pf.diad2_fit_config(model_name=model_name,
    fit_peaks=3, fit_gauss=True, gauss_amp= 2*GroupN_df['HB2_abs_prom'].iloc[i],
    lower_bck_diad2=(1310, 1350), diad_sigma=1,  N_poly_bck_diad2=2,
    x_range_residual=30, y_range_baseline=100,
    x_range_baseline=30,
    HB_prom=GroupN_df['HB2_abs_prom'].iloc[i],
    diad_prom=GroupN_df['Diad2_abs_prom'].iloc[i],
    C13_prom=GroupN_df['C13_abs_prom'].iloc[i])
    diad2_fit_config_init


if batch=='Weak':
    diad2_fit_config_init=pf.diad2_fit_config(model_name=model_name,
    fit_peaks=2, upper_bck_diad2=(1430, 1480),
    lower_bck_diad2=(1310, 1360), diad_sigma=0.4,  N_poly_bck_diad2=2,
    x_range_residual=30, y_range_baseline=100,
    x_range_baseline=30,
    HB_prom=GroupN_df['HB2_abs_prom'].iloc[i],
    diad_prom=GroupN_df['Diad2_abs_prom'].iloc[i])
    diad2_fit_config_init

if batch=='Medium':
    diad2_fit_config_init=pf.diad2_fit_config(model_name=model_name,
    fit_peaks=3, fit_gauss=True, gauss_amp= 2*GroupN_df['HB2_abs_prom'].iloc[i],
    lower_bck_diad2=(1310, 1350), diad_sigma=1,  N_poly_bck_diad2=2,
    x_range_residual=30, y_range_baseline=100,
    x_range_baseline=30,
    HB_prom=GroupN_df['HB2_abs_prom'].iloc[i],
    diad_prom=GroupN_df['Diad2_abs_prom'].iloc[i],
    C13_prom=GroupN_df['C13_abs_prom'].iloc[i])
    diad2_fit_config_init

if batch=='Strong':
    diad2_fit_config_init=pf.diad2_fit_config(model_name=model_name,
    fit_peaks=3, fit_gauss=True, gauss_amp= 2*GroupN_df['HB2_abs_prom'].iloc[i],
    lower_bck_diad2=(1310, 1340), diad_sigma=1,  N_poly_bck_diad2=2,
    x_range_residual=30, y_range_baseline=1000,
    x_range_baseline=30,
    HB_prom=GroupN_df['HB2_abs_prom'].iloc[i],
    diad_prom=GroupN_df['Diad2_abs_prom'].iloc[i],
    C13_prom=GroupN_df['C13_abs_prom'].iloc[i])
    diad2_fit_config_init
diad2_fit_config_init
[52]:
diad2_fit_config(model_name='PseudoVoigtModel', fit_peaks=3, N_poly_bck_diad2=2, lower_bck_diad2=(1310, 1350), upper_bck_diad2=(1440, 1470), fit_gauss=False, gauss_amp=388.85307081688484, diad_sigma=1, diad_sigma_min_allowance=0.2, diad_sigma_max_allowance=5, diad_prom=2672.724838342757, HB_prom=194.42653540844242, C13_prom=44.651893969109665, x_range_baseline=30, y_range_baseline=100, plot_figure=True, dpi=200, x_range_residual=30, return_other_params=False)

See what these fit parameters look like for diad2

[53]:
Diad2_fit=pf.fit_diad_2_w_bck(config1=diad2_fit_config_init,
    config2=diad_id_config,
path=spectra_path, filename=Diad_Files[i], filetype=spectra_filetype,
plot_figure=True, close_figure=False,
Diad_pos=GroupN_df['Diad2_pos'].iloc[i],
HB_pos=GroupN_df['HB2_pos'].iloc[i],
C13_pos=GroupN_df['C13_pos'].iloc[i])
Diad2_fit.to_clipboard(excel=True)
Diad2_fit
[53]:
Diad2_Combofit_Cent Diad2_Voigt_Cent Diad2_cent_err Diad2_Voigt_Area Diad2_Voigt_Sigma Diad2_Voigt_Gamma HB2_Cent HB2_Area HB2_Sigma C13_Cent ... Diad2_Combofit_Height Diad2_Residual Diad2_Prop_Lor Diad2_fwhm Diad2_refit Diad2_Asym50 Diad2_Asym70 Diad2_Yuan2017_sym_factor Diad2_Remigi2021_BSF Diad2_PDF_Model
0 1388.79449 1388.79444 0.001257 4351.324925 0.567733 0 1410.157846 509.48224 0.85045 1371.735005 ... 2850.220202 4.92034 0.646463 1.135466 Flagged Warnings: 1.09322 1.103896 0.105849 0.000398 PseudoVoigtModel

1 rows × 22 columns

../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_24_1.png

Loop over all the files in the group

  • This will loop over all the

[54]:
from tqdm import tqdm
plot_figure=True# If False, Means doesnt have to make figures, lot faster.
close_figure=False # If True, wont show figures in notebook, but will still save them in a folder
Diad_Files_i=Diad_Files
df_Merge = pd.DataFrame([])
for i in tqdm(range(0, len(Diad_Files))): #
    tqdm.write(f"Processing file: {Diad_Files[i]}")


    # For diad1, config file like you had in the previous.
    # Only really used to exclude a range (say your spectra has a known spec)
    diad_id_config=pf.diad_id_config(exclude_range1=[1308, 1309])

    # Here, the prominence are taken from the fitting in the last notebook
    diad1_fit_config2.HB_prom=GroupN_df['HB1_abs_prom'].iloc[i]
    diad1_fit_config2.diad_prom=GroupN_df['Diad1_abs_prom'].iloc[i]
    diad1_fit_config2.gauss_amp=2*GroupN_df['HB1_abs_prom'].iloc[i]

    Diad1_fit=pf.fit_diad_1_w_bck(config1=diad1_fit_config2,
    config2=diad_id_config, path=spectra_path, filename=GroupN_df['filename'].iloc[i],
    filetype=spectra_filetype, plot_figure=plot_figure, close_figure=close_figure,
    Diad_pos=GroupN_df['Diad1_pos'].iloc[i],
    HB_pos=GroupN_df['HB1_pos'].iloc[i])

    ## Same for diad2, just also has a C13 peak
    diad2_fit_config_init.HB_prom=GroupN_df['HB2_abs_prom'].iloc[i]
    diad2_fit_config_init.diad_prom=GroupN_df['Diad2_abs_prom'].iloc[i]
    diad2_fit_config_init.gauss_amp= 2*GroupN_df['HB2_abs_prom'].iloc[i]
    diad2_fit_config_init.C13_prom=GroupN_df['C13_abs_prom'].iloc[i]


    Diad2_fit=pf.fit_diad_2_w_bck(config1=diad2_fit_config_init,
        config2=diad_id_config,
    path=spectra_path, filename=GroupN_df['filename'].iloc[i],
    filetype=spectra_filetype,
    plot_figure=plot_figure, close_figure=close_figure,
    Diad_pos=GroupN_df['Diad2_pos'].iloc[i],
    HB_pos=GroupN_df['HB2_pos'].iloc[i],
    C13_pos=GroupN_df['C13_pos'].iloc[i])

    # This combines the outputs into a single dataframe
    data=pf.combine_diad_outputs(filename=GroupN_df['filename'].iloc[i], prefix=prefix,
    Diad1_fit=Diad1_fit, path=spectra_path,
    Diad2_fit=Diad2_fit)



    df_Merge = pd.concat([df_Merge, data], axis=0).reset_index(drop=True)

  0%|          | 0/12 [00:00<?, ?it/s]
Processing file: 09 M58_c2_a1_FIA_CRR_DiadFit.txt
  8%|▊         | 1/12 [00:11<02:03, 11.19s/it]
Processing file: 10 M58_c3_a1_FIA.txt
 17%|█▋        | 2/12 [00:13<01:00,  6.05s/it]
Processing file: 11 M58_c4_a1_FIA.txt
 25%|██▌       | 3/12 [00:15<00:38,  4.33s/it]
Processing file: 14 M58_c7_a1_FIA.txt
refit attempt 1
 33%|███▎      | 4/12 [00:19<00:31,  3.97s/it]
Processing file: 15 M58_c9_a1_FIA.txt
 42%|████▏     | 5/12 [00:21<00:24,  3.47s/it]
Processing file: 18 M58_c11_a1_FIA.txt
 50%|█████     | 6/12 [00:25<00:20,  3.42s/it]
Processing file: 21 M58_c13_a1_FIA.txt
 58%|█████▊    | 7/12 [00:27<00:15,  3.01s/it]
Processing file: 22 M58_c13_a2_FIB.txt
 67%|██████▋   | 8/12 [00:30<00:11,  2.93s/it]
Processing file: 28 M58_c16_a1_FIB.txt
 75%|███████▌  | 9/12 [00:32<00:08,  2.71s/it]
Processing file: 30 M58_c19_a1_FIA.txt
 83%|████████▎ | 10/12 [00:38<00:07,  3.61s/it]c:\users\penny\box\berkeley_new\diadfit_outer\src\DiadFit\diads.py:3128: RuntimeWarning: More than 20 figures have been opened. Figures created through the pyplot interface (`matplotlib.pyplot.figure`) are retained until explicitly closed and may consume too much memory. (To control this warning, see the rcParam `figure.max_open_warning`). Consider using `matplotlib.pyplot.close()`.
  fig,axes=plt.subplot_mosaic(mosaic=figure_mosaic, figsize=(12, 16))
Processing file: 32 M58_c20_a1_FIA_CRR_DiadFit.txt
 92%|█████████▏| 11/12 [00:41<00:03,  3.49s/it]
Processing file: 34 M58_c24_a1_FIA_CRR_DiadFit.txt
100%|██████████| 12/12 [00:43<00:00,  3.66s/it]
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_25.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_26.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_27.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_28.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_29.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_30.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_31.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_32.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_33.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_34.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_35.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_36.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_37.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_38.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_39.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_40.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_41.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_42.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_43.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_44.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_45.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_46.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_47.png
../../../_images/Examples_Fitting_Fermi_Diads_Example1b_CO2_Fluid_inclusions_withstandards_Step3_FitAll_Together_27_48.png
[55]:
# Save parameters to excel
combo=df_Merge

if batch=='Weak':
    combo.to_excel('Weak_Diads.xlsx', index=False)
if batch=='Medium':
    combo.to_excel('Medium_Diads.xlsx', index=False)
if batch=='Strong':
    combo.to_excel('Strong_Diads.xlsx', index=False)
if batch=='Std':
    combo.to_excel('Std_Diads.xlsx', index=False)
[56]:
combo
[56]:
filename Splitting Split_σ Diad1_Combofit_Cent Diad1_cent_err Diad1_Combofit_Height Diad1_Voigt_Cent Diad1_Voigt_Area Diad1_Voigt_Sigma Diad1_Residual ... Diad1_Asym50 Diad1_Asym70 Diad1_Yuan2017_sym_factor Diad1_Remigi2021_BSF Diad2_Asym50 Diad2_Asym70 Diad2_Yuan2017_sym_factor Diad2_Remigi2021_BSF Diad1_PDF_Model Diad2_PDF_Model
0 M58_c2_a1_FIA_CRR_DiadFit 103.456034 0.002550 1285.338356 0.002218 1453.107904 1285.338406 2791.147753 0.713516 4.407700 ... 1.172500 1.176685 0.246163 0.000982 1.093220 1.103896 0.105849 0.000398 PseudoVoigtModel PseudoVoigtModel
1 M58_c3_a1_FIA 103.728381 0.004639 1284.584139 0.004044 997.179787 1284.584189 2709.900844 1.039099 3.761448 ... 1.152098 1.206986 0.316090 0.002084 1.213033 1.214286 0.311153 0.000657 PseudoVoigtModel PseudoVoigtModel
2 M58_c4_a1_FIA 103.488404 0.004778 1285.240463 0.003928 620.915553 1285.240513 1330.470927 0.809045 2.764506 ... 1.150776 1.200328 0.243969 0.002606 1.041558 1.100000 0.052285 0.001032 PseudoVoigtModel PseudoVoigtModel
3 M58_c7_a1_FIA 103.673170 0.008066 1284.680906 0.007293 1033.864634 1284.680956 3061.826950 1.139090 5.672409 ... 1.367491 1.466491 0.837211 0.002204 1.216092 1.265203 0.347300 0.000702 PseudoVoigtModel PseudoVoigtModel
4 M58_c9_a1_FIA 103.586102 0.005653 1284.943361 0.005129 499.771065 1284.943411 1218.613890 0.887467 2.425961 ... 1.213531 1.280675 0.379003 0.003551 1.002475 1.043557 0.003357 0.001325 PseudoVoigtModel PseudoVoigtModel
5 M58_c11_a1_FIA 103.825471 0.004991 1284.378779 0.004432 998.655343 1284.378829 2905.377331 1.125591 3.708580 ... 1.239460 1.253695 0.539069 0.002254 1.036481 1.101106 0.057651 0.000712 PseudoVoigtModel PseudoVoigtModel
6 M58_c13_a1_FIA 103.201681 0.005501 1285.953787 0.004934 328.265044 1285.953787 471.218854 0.570862 2.342246 ... 1.238245 1.239437 0.272009 0.003478 1.184116 1.206522 0.177403 0.001599 PseudoVoigtModel PseudoVoigtModel
7 M58_c13_a2_FIB 103.215498 0.002640 1285.960890 0.002270 666.043097 1285.960940 921.331539 0.536919 2.106174 ... 1.241042 1.248768 0.258841 0.001612 1.207885 1.217391 0.201613 0.000833 PseudoVoigtModel PseudoVoigtModel
8 M58_c16_a1_FIB 103.559733 0.004556 1285.122731 0.004053 668.160389 1285.122781 1435.599593 0.800572 2.795440 ... 1.075758 1.149671 0.121299 0.002396 1.091892 1.027237 0.114923 0.000930 PseudoVoigtModel PseudoVoigtModel
9 M58_c19_a1_FIA 103.579171 0.003771 1285.006578 0.003158 1710.943691 1285.006628 3965.586013 0.853599 6.019247 ... 1.114583 1.187597 0.195616 0.000998 1.060686 1.026217 0.078962 0.000372 PseudoVoigtModel PseudoVoigtModel
10 M58_c20_a1_FIA_CRR_DiadFit 104.034413 0.003374 1283.979157 0.002858 1114.232938 1283.979207 3260.611153 1.079596 3.873428 ... 1.097360 1.094688 0.210218 0.001938 1.008811 1.051887 0.013516 0.000629 PseudoVoigtModel PseudoVoigtModel
11 M58_c24_a1_FIA_CRR_DiadFit 103.514646 0.003865 1285.353569 0.003580 1108.932671 1285.353619 2346.404465 0.770965 4.591351 ... 1.270936 1.274783 0.417764 0.001390 1.206395 1.180467 0.249343 0.000545 PseudoVoigtModel PseudoVoigtModel

12 rows × 49 columns

This plays a sound when the notebook is done if you have a tendency to procrastinate

[57]:
# !pip install winotify

from winotify import Notification, audio

toast= Notification(app_id="VSCode",title="Notebook completed",
                    msg="Step3b_Secondary_Peaks is done!",
                    duration="short")
toast.set_audio(audio.Mail,loop=False)
toast.show()