Sample absorption calculation#
This notebook shows how to calculate the sample absorption for making pellets for X-ray transmission and fluorescence measurements. This should help you with concepts as absorption length, self-absorption (over-absorption), signal-to-noise optimization.
The following example shows how to calculate the absorption of CuO\(_2\) diluted in Boron Nitride with the following scheme
[1]:
import numpy as np
import matplotlib.pyplot as plt
import xraydb
import math
# Sample description
sample = 'Cu2O' # Material chemical formula
energy = 8980.0 # Put just above the edge
absorbing_atom = 'Cu'
total_absorption = 2.3 # Put what you target (generally 2.3)
density = 6
## Matrix description
Matrix_name = 'BN'; Matrix_formula = 'BN'; Matrix_density = 2.1
#Matrix_name = 'cellulose'; Matrix_formula = 'H2O(C6H10O5)'; Matrix_density = 1.5
#Matrix_name = 'PVP'; Matrix_formula = 'H2(C6H9NO)'; Matrix_density = 1.2
## Pellet thickness
Matrix_thickness = 1 # in mm
## Working angle
Angle = 0 # 0 if pellet is perpendicular to the beam
#I0
I0=2000000
# Description of all elements in the beam
## Be windows
Be_formula = 'Be'
Be_density = 1.85
Be_thickness = 2*0.1 # in mm
## Air
Air_formula = '(N2)0.7808(O2)0.2095Ar9.34e-3(CO2)4.1e-4Ne1.82e-5He5.24e-6(CH4)1.8e-6Kr1.0e-6(H2)0.5e-6Xe9.e-8'
Air_density = 0.001225
Air_thickness = 100 # in mm
## Cryostat Kapton windows
Kapton_formula = 'C22H10N2O5'
Kapton_density = 1.42
Kapton_thickness = 2*0.075 # in mm
# Calculations
## Sample
area = 0.2 #for 5mm pellets
frac_type = 'molar' # Can be 'molar' or 'mass'
samp = xraydb.transmission_sample(sample={sample: 1.0}, energy=energy, absorp_total=total_absorption,area=area, density=density, frac_type=frac_type)
energy_range = np.arange(energy-200, energy+200, 10)
Sample_thickness = samp[8]
Sample_mu = xraydb.material_mu(sample, energy, density=density)
Sample_mu_array = xraydb.material_mu(sample, energy_range, density=density)
## Other elements
Be_mu_array = xraydb.material_mu(Be_formula, energy_range, density=Be_density)
Air_mu_array = xraydb.material_mu(Air_formula, energy_range, density=Air_density)
Kapton_mu_array = xraydb.material_mu(Kapton_formula, energy_range, density=Kapton_density)
Matrix_mu_array = xraydb.material_mu(Matrix_formula, energy_range, density=Matrix_density)
Be_mu = xraydb.material_mu(Be_formula, energy, density=Be_density)
Air_mu = xraydb.material_mu(Air_formula, energy, density=Air_density)
Kapton_mu = xraydb.material_mu(Kapton_formula, energy, density=Kapton_density)
Matrix_mu = xraydb.material_mu(Matrix_formula, energy, density=Matrix_density)
## Transmission
Eff_Sample_thickness = Sample_thickness/math.cos(math.radians(Angle))
Eff_Matrix_thickness = Matrix_thickness/math.cos(math.radians(Angle))
Sample_trans=np.exp(-0.1*Eff_Sample_thickness*Sample_mu)
trans_array = np.exp(-0.1*Eff_Sample_thickness*Sample_mu_array)*np.exp(-0.1*Be_thickness*Be_mu_array)*np.exp(-0.1*Air_thickness*Air_mu_array)*np.exp(-0.1*Kapton_thickness*Kapton_mu_array)*np.exp(-0.1*Eff_Matrix_thickness*Matrix_mu_array)
trans = np.exp(-0.1*Eff_Sample_thickness*Sample_mu)*np.exp(-0.1*Be_thickness*Be_mu)*np.exp(-0.1*Air_thickness*Air_mu)*np.exp(-0.1*Kapton_thickness*Kapton_mu)*np.exp(-0.1*Eff_Matrix_thickness*Matrix_mu)
# Print results
print("SAMPLE:")
print(f" Mass: {samp[5]:.2f} mg")
print(f" Absorbance step (delta_mu): {samp[3][absorbing_atom]:.2f}")
print(f" Absorbing thickness: {Sample_thickness*1000:.1f} µm")
print(f" Absorption lenght: {samp[9]:.1f} µm")
print(f" Transmission (at {Angle} degrees): {Sample_trans*100:.0f} %")
print(f"\nPELLET IN THE BEAMLINE (with {Matrix_name} at {Angle} degrees):")
print(f" Transmission: {trans*100:.1f} %")
print(f" I1 (for I0 = {I0} counts): {trans*I0:.0f} counts")
#Plot
plt.plot(energy_range, trans_array, label='transmitted')
plt.xlabel('Energy (eV)')
plt.ylabel('Tranmitted fraction')
plt.title('Total transmission')
plt.show()
SAMPLE:
Mass: 0.20 mg
Absorbance step (delta_mu): 0.67
Absorbing thickness: 6000.0 µm
Absorption lenght: 0.0 µm
Transmission (at 0 degrees): 0 %
PELLET IN THE BEAMLINE (with BN at 0 degrees):
Transmission: 0.0 %
I1 (for I0 = 2000000 counts): 0 counts
[ ]: