simLIBS 2.0.3
SimulatedLIBS provides simple Python class to simulate LIBS spectra with NIST LIBS Database interface
License: MIT
Requires Python: >=3.8

# Simulated LIBS

[![PyPI version](https://img.shields.io/pypi/v/SimulatedLIBS?style=flat&logo=pypi)](https://pypi.org/project/SimulatedLIBS/)
[![License](https://img.shields.io/badge/License-MIT-blue.svg)](./LICENSE.md)
![Tests](https://github.com/MKastek/SimulatedLIBS/actions/workflows/test.yml/badge.svg)
[![ZENADO DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.7260706.svg)](https://doi.org/10.5281/zenodo.7260706)

*SimulatedLIBS* provides Python class to simulate LIBS spectra with NIST LIBS Database interface.  
*SimulatedLIBS* also allows the creation of simulated data sets that can be used to train ML models.  
*SimulatedLIBS* was mentioned is [FOSS For Spectroscopy](https://bryanhanson.github.io/FOSS4Spectroscopy/) by Prof. Bryan A. Hanson, DePauw University.

Project created for **B.Eng. thesis**:  
Computer methods of the identification of the elements in optical spectra obtained by Laser Induced Breakdown Spectroscopy.

**Thesis supervisor**: Paweł Gąsior PhD  
e-mail: pawel.gasior@ifpilm.pl  
Institute of Plasma Physics and Laser Microfusion - IPPLM  


## Installation
```python
pip install SimulatedLIBS
```
## Import

```python
from simLIBS import SimulatedLIBS
```
## Example
Parameters:
- Te - electron temperature [eV]
- Ne - electron density [cm^-3]
- elements - list of elements
- percentages - list of elements concentrations
- resoulution
- wavelength range: low_w, upper_w
- maximal ion charge: max_ion_charge
- websraping: 'static' or 'dynamic'


### Static websraping
```python
libs = SimulatedLIBS(Te=1.0,
                     Ne=10**17,
                     elements=['W','Fe','Mo'],
                     percentages=[50,25,25],
                     resolution=1000,
                     low_w=200,
                     upper_w=1000,
                     max_ion_charge=3,
                     webscraping='static')
```

### Plot
```python
libs.plot(color='blue', title='W Fe Mo composition')
```
![](https://github.com/MKastek/SimulatedLIBS/blob/master/images/plot_static.png?raw=True)

### Save to file
```python
libs.save_to_csv('filename.csv')
```

### Interpolated spectrum
SimulatedLIBS interpolates retrieved data from NIST with cubic splines.
```python
libs.get_interpolated_spectrum()
```

### Raw spectrum
Raw retrieved data from NIST
```python
libs.get_raw_spectrum()
```
### Dynamic webscraping
```python
libs = SimulatedLIBS(Te=1.0,
                     Ne=10**17,
                     elements=['W','Fe','Mo'],
                     percentages=[50,25,25],
                     resolution=1000,
                     low_w=200,
                     upper_w=1000,
                     max_ion_charge=3,
                     webscraping='dynamic')
```

### Plot
```python
libs.plot(color='blue', title='W Fe Mo composition')
```
![](https://github.com/MKastek/SimulatedLIBS/blob/master/images/plot_dynamic.png?raw=True)

### Ion spectra
After simulation with parameter websraping = dynamic, ion spectra are stored in ion_spectra (pd.DataFrame) and can be plotted.
```python
libs.plot_ion_spectra()
```
![](https://github.com/MKastek/SimulatedLIBS/blob/master/images/plot_ion_spectra.png?raw=True)
### Random dataset of samples
Based on .csv file with chemical composition of samples, one can generate dataset of simulated LIBS measurements
with different Te and Ne values.

Example of input_composition_df pd.DataFrame:

|W  |H  |He |name|
|---|---|---|----|
|50 |25 |25 |A   |
|30 |60 |10 |B   |
|40 |40 |20 |C   |

```python
SimulatedLIBS.create_dataset(input_composition_df,
                             size=100,
                             Te_min=1.0,
                             Te_max=2.0,
                             Ne_min=10**17,
                             Ne_max=10**18)
```

Example of output .csv file:

|    |   200.0 |   200.1 |   200.2 |   200.3 |   200.4 | ...   |   H |   W |   Te |       Ne |
|---:|--------:|--------:|--------:|--------:|--------:|----:|----:|----:|-----:|---------:|
|  0 |       0 |     0   |     0   |     0   |     0   | ...   |2 |   50 | 1.43 | 1.08e+17 |
|  1 |       0 |     0   |     0   |     0   |     0   | ...   |0 |   0 | 1.06 | 1.08e+17 |
|  2 |       0 |     0.1 |     0.1 |     0.1 |     0.1 | ...   |0 |  68 | 1.82 | 1.18e+17 |
|  3 |       0 |    54.5 |    56.7 |    54.4 |    48.4 | ...   |0 |   3 | 1.25 | 1.06e+17 |
|  4 |       0 |   121.7 |   143.1 |   140.5 |   115.3 | ...   |0 |  84 | 1.08 | 9.23e+17 |


### Animations
SimulatedLIBS can be helpful in creating LIBS animations mostly for educational purpose.

#### Resolution animation
Changes in resolution in range: 500-10000.
![](https://github.com/MKastek/SimulatedLIBS/blob/master/SimulatedLIBS/animations/saved-gifs/animated_resolution.gif?raw=True)
#### Electron temperature animation
Changes in electron temperature Te in range: 0.5-5 eV.
![](https://github.com/MKastek/SimulatedLIBS/blob/master/SimulatedLIBS/animations/saved-gifs/animated_temperature.gif?raw=True)
#### Electron density animation
Changes in electron density Ne in range: 0.7-1.3 e+17 [cm^-3].
![](https://github.com/MKastek/SimulatedLIBS/blob/master/SimulatedLIBS/animations/saved-gifs/animated_density.gif?raw=True)

## References
- M. Kastek, _et al._, _Analysis of hydrogen isotopes retention in thermonuclear reactors with LIBS supported by machine learning_. Spectrochimica Acta Part B Atomic Spectroscopy 199: 106576. DOI: [10.1016/j.sab.2022.106576](https://doi.org/10.1016/j.sab.2022.106576).


## Used in Research
- Chen Z, Chen Z, Jiang W, Guo L, Zhang Y. _Line intensity calculation of laser-induced breakdown spectroscopy during plasma expansion in nonlocal thermodynamic equilibrium._ Opt Lett. 2023 Jun 15;48(12):3227-3230. DOI: [10.1364/OL.488250](https://opg.optica.org/ol/abstract.cfm?uri=ol-48-12-3227).