Validation Module¶
The validation module provides input validation, error handling, and custom exception classes.
Exception Hierarchy¶
Custom exceptions for XRayLabTool.
This module defines domain-specific exception classes that provide better error handling and more informative error messages for X-ray analysis operations.
- exception xraylabtool.exceptions.AtomicDataError(message, element=None)[source]
Bases:
XRayLabToolErrorException raised when atomic data cannot be retrieved or processed.
- exception xraylabtool.exceptions.BatchProcessingError(message, failed_items=None, total_items=None)[source]
Bases:
XRayLabToolErrorException raised during batch processing operations.
- exception xraylabtool.exceptions.CalculationError(message, formula=None, energy=None)[source]
Bases:
XRayLabToolErrorException raised when X-ray property calculations fail.
- exception xraylabtool.exceptions.ConfigurationError(message, config_key=None)[source]
Bases:
XRayLabToolErrorException raised for configuration-related errors.
- exception xraylabtool.exceptions.DataFileError(message, filename=None)[source]
Bases:
XRayLabToolErrorException raised when data files cannot be loaded or processed.
- exception xraylabtool.exceptions.EnergyError(message, energy=None, valid_range=None)[source]
Bases:
XRayLabToolErrorException raised for invalid energy values or ranges.
- exception xraylabtool.exceptions.FormulaError(message, formula=None)[source]
Bases:
XRayLabToolErrorException raised for invalid chemical formulas.
- exception xraylabtool.exceptions.UnknownElementError(element)[source]
Bases:
AtomicDataErrorException raised when an unknown element symbol is provided.
- Parameters:
element (str)
- exception xraylabtool.exceptions.ValidationError(message, parameter=None, value=None)[source]
Bases:
XRayLabToolErrorException raised when input validation fails.
- exception xraylabtool.exceptions.XRayLabToolError[source]
Bases:
ExceptionBase exception for all XRayLabTool-related errors.
Base Exception¶
- class xraylabtool.exceptions.XRayLabToolError[source]
Bases:
ExceptionBase exception for all XRayLabTool-related errors.
The base exception class for all XRayLabTool-specific errors. All custom exceptions inherit from this class, making it easy to catch any XRayLabTool-related error.
Example:
try: result = calculate_single_material_properties("InvalidFormula", 1.0, 8000) except XRayLabToolError as e: print(f"XRayLabTool error: {e}")
Specific Exceptions¶
- class xraylabtool.exceptions.ValidationError(message, parameter=None, value=None)[source]
Bases:
XRayLabToolErrorException raised when input validation fails.
Raised when input validation fails.
- class xraylabtool.exceptions.FormulaError(message, formula=None)[source]
Bases:
XRayLabToolErrorException raised for invalid chemical formulas.
Raised when chemical formula parsing or validation fails.
Common causes: - Unknown chemical elements - Invalid formula syntax - Unsupported element combinations
Example:
try: from xraylabtool.utils import parse_formula composition = parse_formula("XYZ123") # Invalid element except FormulaError as e: print(f"Formula error: {e}")
- class xraylabtool.exceptions.EnergyError(message, energy=None, valid_range=None)[source]
Bases:
XRayLabToolErrorException raised for invalid energy values or ranges.
Raised when energy values are invalid or out of supported range.
Common causes: - Negative or zero energy values - Energy outside supported range (typically 10 eV - 100 keV) - Invalid energy array or range specification
Example:
try: result = calculate_single_material_properties("Si", 2.33, -1000) # Negative energy except EnergyError as e: print(f"Energy error: {e}")
- class xraylabtool.exceptions.CalculationError(message, formula=None, energy=None)[source]
Bases:
XRayLabToolErrorException raised when X-ray property calculations fail.
Raised when X-ray property calculations fail due to numerical issues or invalid parameters.
Common causes: - Numerical instability in calculations - Invalid density values - Missing atomic data - Convergence failures
Input Validators¶
Validation functions for XRayLabTool.
This module contains functions for validating input parameters, chemical formulas, energy ranges, and other data used in calculations.
- xraylabtool.validation.validators.validate_energy_range(energies, min_energy=0.1, max_energy=100.0)[source]
Validate X-ray energy values.
- xraylabtool.validation.validators.validate_chemical_formula(formula)[source]
Validate and parse a chemical formula.
- xraylabtool.validation.validators.validate_density(density, min_density=0.001, max_density=30.0)[source]
Validate material density value.
- xraylabtool.validation.validators.validate_calculation_parameters(formula, energies, density)[source]
Validate all parameters for X-ray calculations.
Validation Functions¶
- xraylabtool.validation.validators.validate_energy_range(energies, min_energy=0.1, max_energy=100.0)[source]
Validate X-ray energy values.
- Parameters:
- Return type:
- Returns:
Validated energy array
- Raises:
EnergyError – If energies are invalid
Validate X-ray energy values.
Parameters: -
energies(float or np.ndarray): Energy value(s) in keV -min_energy(float): Minimum allowed energy in keV (default: 0.1) -max_energy(float): Maximum allowed energy in keV (default: 100.0)Returns: -
np.ndarray: Validated energy arrayRaises: -
EnergyError: If energies are invalidExample:
from xraylabtool.validation.validators import validate_energy_range import numpy as np # Valid energies energies = validate_energy_range(8.0) # Single energy energies = validate_energy_range([5.0, 8.0, 10.0]) # Multiple energies energies = validate_energy_range(np.array([1.0, 2.0, 3.0])) # Array # Invalid energies will raise EnergyError # validate_energy_range(-1.0) # Negative energy # validate_energy_range(200.0) # Above max energy
- xraylabtool.validation.validators.validate_chemical_formula(formula)[source]
Validate and parse a chemical formula.
- Parameters:
formula (
str) – Chemical formula string (e.g., “SiO2”, “Ca0.5Sr0.5TiO3”)- Return type:
- Returns:
Dictionary mapping element symbols to their quantities
- Raises:
FormulaError – If formula is invalid
Validate and parse a chemical formula.
Parameters: -
formula(str): Chemical formula string (e.g., “SiO2”, “Ca0.5Sr0.5TiO3”)Returns: -
dict: Dictionary mapping element symbols to their quantitiesRaises: -
FormulaError: If formula is invalidExample:
from xraylabtool.validation.validators import validate_chemical_formula # Valid formulas elements = validate_chemical_formula("SiO2") print(elements) # {'Si': 1.0, 'O': 2.0} elements = validate_chemical_formula("Al2O3") print(elements) # {'Al': 2.0, 'O': 3.0} # Fractional compositions elements = validate_chemical_formula("Ca0.5Sr0.5TiO3") print(elements) # {'Ca': 0.5, 'Sr': 0.5, 'Ti': 1.0, 'O': 3.0}
- xraylabtool.validation.validators.validate_density(density, min_density=0.001, max_density=30.0)[source]
Validate material density value.
- Parameters:
- Return type:
- Returns:
Validated density value
- Raises:
ValidationError – If density is invalid
Validate material density value.
Parameters: -
density(float): Density in g/cm³ -min_density(float): Minimum allowed density (default: 0.001) -max_density(float): Maximum allowed density (default: 30.0)Returns: -
float: Validated density valueRaises: -
ValidationError: If density is invalidExample:
from xraylabtool.validation.validators import validate_density # Valid densities density = validate_density(2.33) # Silicon density = validate_density(8.96) # Copper density = validate_density(0.001) # Gas-phase materials # Invalid densities will raise ValidationError # validate_density(-1.0) # Negative density # validate_density(0.0) # Zero density
- xraylabtool.validation.validators.validate_calculation_parameters(formula, energies, density)[source]
Validate all parameters for X-ray calculations.
- Parameters:
- Return type:
- Returns:
Tuple of validated (formula, energies, density)
- Raises:
ValidationError – If any parameters are invalid
Validate all parameters for X-ray calculations.
Parameters: -
formula(str): Chemical formula -energies(float or np.ndarray): Energy values in keV -density(float): Material density in g/cm³Returns: -
tuple: Validated (formula, energies, density)Raises: -
ValidationError: If any parameters are invalidExample:
from xraylabtool.validation.validators import validate_calculation_parameters # Validate all parameters at once formula, energies, density = validate_calculation_parameters( "SiO2", 8.0, 2.20 ) print(f"Formula: {formula}, Energy: {energies}, Density: {density}")
Error Context and Suggestions¶
XRayLabTool exceptions provide detailed context and suggestions for resolution:
try:
result = calculate_single_material_properties("Si123", 2.33, 8000)
except FormulaError as e:
print(f"Error: {e}")
print(f"Suggestion: {e.suggestion}")
# Output:
# Error: Invalid formula 'Si123': numbers should follow elements
# Suggestion: Use format like 'SiO2' or 'Al2O3'
Internal Validation Utilities¶
The validation module also includes internal helper functions that are used by the main validation functions but are not part of the public API:
_parse_formula(): Internal formula parsing logic_get_valid_element_symbols(): Returns a set of valid element symbols for validation
Best Practices¶
1. Always Validate Input:
from xraylabtool.validation.validators import validate_chemical_formula, validate_energy_range
def safe_calculation(formula, density, energy):
validate_chemical_formula(formula)
validate_energy_range(energy)
# Proceed with calculation...
2. Handle Specific Exceptions:
from xraylabtool.exceptions import FormulaError, EnergyError
try:
result = calculate_single_material_properties(formula, density, energy)
except FormulaError:
print("Please check your chemical formula")
except EnergyError:
print("Please provide a valid energy value")
except Exception as e:
print(f"Unexpected error: {e}")
3. Use Complete Parameter Validation:
from xraylabtool.validation.validators import validate_calculation_parameters
materials = [
{"formula": "Si", "density": 2.33},
{"formula": "InvalidElement", "density": 1.0}
]
# Validate all materials first
valid_materials = []
for material in materials:
try:
formula, energies, density = validate_calculation_parameters(
material["formula"], 8.0, material["density"]
)
valid_materials.append({
"formula": formula,
"density": density,
"energies": energies
})
except (FormulaError, ValidationError) as e:
print(f"Skipping invalid material: {e}")
# Process only valid materials
results = calculate_xray_properties(valid_materials, energy=8000)