50 lines
1.8 KiB
Python
50 lines
1.8 KiB
Python
from __future__ import print_function,division
|
|
import numpy as np
|
|
import os
|
|
|
|
def xrayAttLenght(*args,**kw):
|
|
from periodictable import xsf
|
|
n = xsf.index_of_refraction(*args,**kw)
|
|
if not "wavelength" in kw:
|
|
wavelength = 12.398/np.asarray(kw["energy"])
|
|
else:
|
|
wavelength = np.asarray(kw["wavelength"])
|
|
attenuation_length = np.abs( (wavelength*1e-10)/ (4*np.pi*np.imag(n)) )
|
|
return attenuation_length
|
|
|
|
|
|
def xrayFluo(atom,density,energy=7.,length=30.,I0=1e10,\
|
|
det_radius=1.,det_dist=10.,det_material="Si",det_thick=300,verbose=True):
|
|
""" compound: anything periodictable would understand
|
|
density: in mM
|
|
length: sample length in um
|
|
energy: in keV, could be array
|
|
"""
|
|
import periodictable
|
|
from periodictable import xsf
|
|
wavelength = 12.398/energy
|
|
atom = periodictable.__dict__[atom]
|
|
# 1e3 -> from mM to M
|
|
# 1e3 -> from L to cm3
|
|
# so 1 mM = 1e-3M/L = 1e-6 M/cm3
|
|
density_g_cm3 = density*1e-6*atom.mass
|
|
n = xsf.index_of_refraction(atom,density=density_g_cm3,wavelength=wavelength)
|
|
attenuation_length = xrayAttLenght( atom,density=density_g_cm3,energy=energy )
|
|
# um-> m: 1e-6
|
|
fraction_absorbed = 1.-np.exp(-length*1e-6/attenuation_length)
|
|
if verbose:
|
|
print("Fraction of x-ray photons absorbed by the sample:",fraction_absorbed)
|
|
## detector ##
|
|
det_area = np.pi*det_radius**2
|
|
det_solid_angle = det_area/(4*np.pi*det_dist**2)
|
|
if verbose:
|
|
print("Detector fraction of solid angle:",det_solid_angle)
|
|
det_att_len = xrayAttLenght(det_material,wavelength=atom.K_alpha)
|
|
det_abs = 1-np.exp(-det_thick*1e-6/det_att_len)
|
|
if verbose:
|
|
print("Detector efficiency (assuming E fluo = E_K_alpha):",det_abs)
|
|
eff = fraction_absorbed*det_solid_angle*det_abs
|
|
if verbose:
|
|
print("Overall intensity (as ratio to incoming one):",eff)
|
|
return eff
|