Source code for xoppylib.scattering_functions.xoppy_calc_crosssec

"""
XOPPY cross-section calculator for elements and compounds.
"""
import numpy

from xoppylib.scattering_functions.cross_calc import cross_calc, cross_calc_mix, cross_calc_nist

[docs]def xoppy_calc_crosssec( descriptor = "Si", density = "?", MAT_FLAG = 2, CALCULATE = 1, GRID = 0, GRIDSTART = 100.0, GRIDEND = 10000.0, GRIDN = 200, UNIT = 0, DUMP_TO_FILE = 0, FILE_NAME = "CrossSec.dat", material_constants_library = None, ): if GRID == 0: energy = numpy.arange(0,500) elefactor = numpy.log10(10000.0 / 30.0) / 300.0 energy = 10.0 * 10**(energy * elefactor) elif GRID == 1: if GRIDN == 1: energy = numpy.array([GRIDSTART]) else: energy = numpy.linspace(GRIDSTART,GRIDEND,GRIDN) elif GRID == 2: energy = numpy.array([GRIDSTART]) else: raise ValueError("GRID must be 0, 1 or 2") if MAT_FLAG == 0: # element out = cross_calc(descriptor,energy,calculate=CALCULATE,density=density, material_constants_library=material_constants_library) elif MAT_FLAG == 1: # compound parse out = cross_calc_mix(descriptor,energy,calculate=CALCULATE,density=density, material_constants_library=material_constants_library) elif MAT_FLAG == 2: # NIST compound out = cross_calc_nist(descriptor,energy,calculate=CALCULATE, material_constants_library=material_constants_library) else: raise ValueError("MAT_FLAG must be 0, 1 or 2") calculate_items = ['Total','PhotoElectric','Rayleigh','Compton','Total minus Rayleigh'] unit_items = ['barn/atom','cm^2','cm^2/g','cm^-1'] if energy.size > 1: tmp_x = out[0,:].copy() tmp_y = out[UNIT+1,:].copy() tmp = numpy.vstack((tmp_x,tmp_y)) labels = ["Photon energy [eV]","%s cross section [%s]"%(calculate_items[CALCULATE],unit_items[UNIT])] to_return = {"application":"xoppy","name":"xcrosssec","data":tmp,"labels":labels} else: tmp = numpy.vstack((out[0,0], out[UNIT+1, 0])) labels = ["Photon energy [eV]","%s cross section [%s]"%(calculate_items[CALCULATE],unit_items[UNIT])] txt = "xoppy_calc_xcrosssec: Calculated %s cross section: %g %s"%(calculate_items[CALCULATE],out[UNIT+1,0],unit_items[UNIT]) print(txt) to_return = {"application":"xoppy","name":"xcrosssec","data":tmp,"labels":labels,"info":txt} if DUMP_TO_FILE: with open(FILE_NAME, "w") as file: try: file.write("#F %s\n"%FILE_NAME) file.write("\n#S 1 xoppy CrossSec results\n") file.write("#N 5\n") tmp = "#L Photon energy [eV]" for unit_item in unit_items: tmp += " %s [%s]"%(calculate_items[CALCULATE],unit_item) tmp += "\n" file.write(tmp) for j in range(out.shape[1]): # file.write("%19.12e "%energy[j]) file.write(("%19.12e "*out.shape[0]+"\n")%tuple(out[i,j] for i in range(out.shape[0]))) file.close() print("File written to disk: %s \n"%FILE_NAME) except: raise Exception("CrossSec: The data could not be dumped onto the specified file!\n") return to_return
if __name__ == "__main__": from dabax.dabax_xraylib import DabaxXraylib tmp = xoppy_calc_crosssec( descriptor="Water, Liquid", density=None, MAT_FLAG=2, CALCULATE=1, GRID=0, GRIDSTART=100.0, GRIDEND=10000.0, GRIDN=200, UNIT=0, DUMP_TO_FILE=0, FILE_NAME="CrossSec.dat", material_constants_library=DabaxXraylib(), )