r"""
The module :mod:`espm.datasets.built_in_EDXS_datasets` implements the functions that generate two built-in datasets:
- A dataset of 2 particles embedded in a matrix.
- A dataset with a linear local accumulation of Sr.
"""
import os
from pathlib import Path
import hyperspy.api as hs
from espm.conf import DATASETS_PATH
from espm.datasets.base import generate_dataset
from espm.models.EDXS_function import elts_list_from_dict_list
from espm.models.generate_EDXS_phases import generate_modular_phases
from espm.weights.generate_weights import generate_weights
particles_phases_dict = {
"elts_dicts": [
{"V": 0.04704309583693933, "Rb": 0.914954275584854, "W": 0.06834271611694454},
{"N": 0.4517936299777999, "Yb": 0.39973013314240835, "Pt": 0.08298592142537742},
{"Al": 0.43306626599937914, "Ti": 0.3985896640183708, "La": 0.8994030840372912},
],
"brstlg_pars": [
{"b0": 11.408513360414626e-06, "b1": 56.606903143185911e-04},
{"b0": 17.317975736931391e-06, "b1": 15.2126092148294355e-04},
{"b0": 2.2664567599307173e-06, "b1": 13.1627208027847766e-04},
],
"scales": [1, 1, 1],
"model_params": {
"e_offset": 0.2,
"e_size": 1980,
"e_scale": 0.01,
"width_slope": 0.01,
"width_intercept": 0.065,
"db_name": "200keV_xrays.json",
"E0": 200,
"params_dict": {
"Abs": {
"thickness": 1e-05,
"toa": 22,
"density": None,
"atomic_fraction": False,
},
"Det": "SDD_efficiency.txt",
},
},
}
particles_misc_dict = {
"N": 500,
"seed": 91,
"data_folder": "built_in_particules",
"shape_2d": [80, 80],
"model": "EDXS",
"densities": [0.6030107883539217, 0.9870613994765459, 0.8894990661032164],
}
boundary_phases_dict = {
"elts_dicts": [
{"Ca": 0.54860348, "P": 0.38286879, "Sr": 0.03166235, "Cu": 0.03686538},
{"Ca": 0.54860348, "P": 0.38286879, "Sr": 0.12166235, "Cu": 0.03686538},
],
"brstlg_pars": [
{"b0": 5.5367e-4, "b1": 0.0192181},
{"b0": 5.5367e-4, "b1": 0.0192181},
],
"scales": [0.05, 0.05],
"model_params": {
"e_offset": 1.27,
"e_size": 3746,
"e_scale": 0.005,
"width_slope": 0.01,
"width_intercept": 0.065,
"db_name": "200keV_xrays.json",
"E0": 200,
"params_dict": {
"Abs": {
"thickness": 140e-07,
"toa": 22,
"density": 3.124,
"atomic_fraction": False,
},
"Det": "SDD_efficiency.txt",
},
},
}
boundary_misc_dict = {
"N": 15,
"seed": 0,
"data_folder": "built_in_grain_boundary",
"shape_2d": [100, 400],
"model": "EDXS",
"densities": [1, 1],
}
[docs]
def generate_built_in_datasets(seeds_range=10):
r"""
Generate the two built-in datasets if they are not already present in the datasets folder.
Parameters
----------
seeds_range : int
The number of seeds to use for the generation of the built-in datasets. The built-in datasets are generated with a base_seed, and then the base_seed + 1, base_seed + 2, etc. up to base_seed + seeds_range -1.
Returns
-------
None
"""
if not (os.path.isdir(DATASETS_PATH / Path(particles_misc_dict["data_folder"]))):
print(
"Generating 2 particles + one matrix built-in dataset. This will take a minute."
)
particle_phases = generate_modular_phases(**particles_phases_dict)
particles_weights = generate_weights(
"sphere",
particles_misc_dict["shape_2d"],
n_phases=3,
seed=particles_misc_dict["seed"],
radius=20,
)
particles_elements = elts_list_from_dict_list(
particles_phases_dict["elts_dicts"]
)
generate_dataset(
base_seed=particles_misc_dict["seed"],
sample_number=seeds_range,
model_params=particles_phases_dict["model_params"],
misc_params=particles_misc_dict,
phases=particle_phases,
weights=particles_weights,
elements=particles_elements,
)
if not (os.path.isdir(DATASETS_PATH / Path(boundary_misc_dict["data_folder"]))):
print(
"Generating a grain boundary with Sr segregation. This will take a minute."
)
boundary_phases = generate_modular_phases(**boundary_phases_dict)
boundary_weights = generate_weights(
"gaussian_ripple",
boundary_misc_dict["shape_2d"],
n_phases=2,
seed=boundary_misc_dict["seed"],
width=10,
)
boundary_elements = elts_list_from_dict_list(boundary_phases_dict["elts_dicts"])
generate_dataset(
base_seed=boundary_misc_dict["seed"],
sample_number=seeds_range,
model_params=boundary_phases_dict["model_params"],
misc_params=boundary_misc_dict,
phases=boundary_phases,
weights=boundary_weights,
elements=boundary_elements,
)
[docs]
def load_particules(sample=0):
r"""
Load the built-in dataset of particles.
Parameters
----------
sample : int
The sample number to load.
Returns
-------
spim : hyperspy.signals.EDSespm
The loaded dataset.
"""
filename = DATASETS_PATH / Path(
"{}/sample_{}.hspy".format(particles_misc_dict["data_folder"], sample)
)
spim = hs.load(filename)
return spim
[docs]
def load_grain_boundary(sample=0):
r"""
Load the built-in dataset of a grain boundary.
Parameters
----------
sample : int
The sample number to load.
Returns
-------
spim : hyperspy.signals.EDSespm
The loaded dataset.
"""
filename = DATASETS_PATH / Path(
"{}/sample_{}.hspy".format(boundary_misc_dict["data_folder"], sample)
)
spim = hs.load(filename)
return spim