Skip to main content

Quantitative X-Ray Fluorescence Analysis Support Library

Project description

Main development website: https://github.com/vasole/fisx

https://travis-ci.org/vasole/fisx.svg?branch=master https://ci.appveyor.com/api/projects/status/github/vasole/fisx?branch=master&svg=true

This software library implements formulas to calculate, given an experimental setup, the expected x-ray fluorescence intensities. The library accounts for secondary and tertiary excitation, K, L and M shell emission lines and de-excitation cascade effects. The basic implementation is written in C++ and a Python binding is provided.

Account for secondary excitation is made via the reference:

D.K.G. de Boer, X-Ray Spectrometry 19 (1990) 145-154

with the correction mentioned in:

D.K.G. de Boer et al, X-Ray Spectrometry 22 (1993) 33-28

Tertiary excitation is accounted for via an appproximation.

The accuracy of the corrections has been tested against experimental data and Monte Carlo simulations.

License

This code is relased under the MIT license as detailed in the LICENSE file.

Installation

To build the library for python use, just use the python setup.py install approach. It is convenient (but not mandatory) to have cython >= 0.17 installed.

Testing

To run the tests after installation run:

python -m fisx.tests.testAll

Example

There is a web application using this library for calculating expected x-ray count rates.

This piece of Python code shows how the library can be used via its python binding.

from fisx import Elements
from fisx import Material
from fisx import Detector
from fisx import XRF

elementsInstance = Elements()
elementsInstance.initializeAsPyMca()
# After the slow initialization (to be made once), the rest is fairly fast.
xrf = XRF()
xrf.setBeam(16.0) # set incident beam as a single photon energy of 16 keV
xrf.setBeamFilters([["Al1", 2.72, 0.11, 1.0]]) # Incident beam filters
# Steel composition of Schoonjans et al, 2012 used to generate table I
steel = {"C":  0.0445,
         "N":  0.04,
         "Si": 0.5093,
         "P":  0.02,
         "S":  0.0175,
         "V":  0.05,
         "Cr":18.37,
         "Mn": 1.619,
         "Fe":64.314, # calculated by subtracting the sum of all other elements
         "Co": 0.109,
         "Ni":12.35,
         "Cu": 0.175,
         "As": 0.010670,
         "Mo": 2.26,
         "W":  0.11,
         "Pb": 0.001}
SRM_1155 = Material("SRM_1155", 1.0, 1.0)
SRM_1155.setComposition(steel)
elementsInstance.addMaterial(SRM_1155)
xrf.setSample([["SRM_1155", 1.0, 1.0]]) # Sample, density and thickness
xrf.setGeometry(45., 45.)               # Incident and fluorescent beam angles
detector = Detector("Si1", 2.33, 0.035) # Detector Material, density, thickness
detector.setActiveArea(0.50)            # Area and distance in consistent units
detector.setDistance(2.1)               # expected cm2 and cm.
xrf.setDetector(detector)
Air = Material("Air", 0.0012048, 1.0)
Air.setCompositionFromLists(["C1", "N1", "O1", "Ar1", "Kr1"],
                            [0.0012048, 0.75527, 0.23178, 0.012827, 3.2e-06])
elementsInstance.addMaterial(Air)
xrf.setAttenuators([["Air", 0.0012048, 5.0, 1.0],
                    ["Be1", 1.848, 0.002, 1.0]]) # Attenuators
fluo = xrf.getMultilayerFluorescence(["Cr K", "Fe K", "Ni K"],
                                     elementsInstance,
                                     secondary=2,
                                     useMassFractions=1)
print("Element   Peak          Energy       Rate      Secondary  Tertiary")
for key in fluo:
    for layer in fluo[key]:
        peakList = list(fluo[key][layer].keys())
        peakList.sort()
        for peak in peakList:
            # energy of the peak
            energy = fluo[key][layer][peak]["energy"]
            # expected measured rate
            rate = fluo[key][layer][peak]["rate"]
            # primary photons (no attenuation and no detector considered)
            primary = fluo[key][layer][peak]["primary"]
            # secondary photons (no attenuation and no detector considered)
            secondary = fluo[key][layer][peak]["secondary"]
            # tertiary photons (no attenuation and no detector considered)
            tertiary = fluo[key][layer][peak].get("tertiary", 0.0)
            # correction due to secondary excitation
            enhancement2 = (primary + secondary) / primary
            enhancement3 = (primary + secondary + tertiary) / primary
            print("%s   %s    %.4f     %.3g     %.5g    %.5g" % \
                               (key, peak + (13 - len(peak)) * " ", energy,
                               rate, enhancement2, enhancement3))

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

fisx-1.0.8.zip (5.8 MB view details)

Uploaded Source

fisx-1.0.8.tar.gz (5.6 MB view details)

Uploaded Source

Built Distributions

fisx-1.0.8-cp35-none-win_amd64.whl (5.9 MB view details)

Uploaded CPython 3.5 Windows x86-64

fisx-1.0.8-cp27-none-win_amd64.whl (5.9 MB view details)

Uploaded CPython 2.7 Windows x86-64

fisx-1.0.8-cp27-none-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (6.5 MB view details)

Uploaded CPython 2.7 macOS 10.10+ intel macOS 10.10+ x86-64 macOS 10.6+ intel macOS 10.9+ intel macOS 10.9+ x86-64

File details

Details for the file fisx-1.0.8.zip.

File metadata

  • Download URL: fisx-1.0.8.zip
  • Upload date:
  • Size: 5.8 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for fisx-1.0.8.zip
Algorithm Hash digest
SHA256 9698f745b3987e455c135e0277a65208194f5aa39b66ec14bff76e0dc0507b80
MD5 1a5df0fca80ba84329342ede55779d31
BLAKE2b-256 f981de31d91d159f48669544976de0fc458332cd1d6d5ee575f88581ff8bac8e

See more details on using hashes here.

File details

Details for the file fisx-1.0.8.tar.gz.

File metadata

  • Download URL: fisx-1.0.8.tar.gz
  • Upload date:
  • Size: 5.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for fisx-1.0.8.tar.gz
Algorithm Hash digest
SHA256 5a544b3ef359e2c8e0ab657a4ac6a1ed5342681f352c5dcce1aedc2fcff2949e
MD5 16c375c6ff5d8860983a506b9489f536
BLAKE2b-256 c93be5b47e4d7873f2714110946dd3935108d2b6ad35dc84f1cec1e725d202df

See more details on using hashes here.

File details

Details for the file fisx-1.0.8-cp35-none-win_amd64.whl.

File metadata

File hashes

Hashes for fisx-1.0.8-cp35-none-win_amd64.whl
Algorithm Hash digest
SHA256 3e7d3acaa04e96002eb9f56ee46a7f334245c802641ec683c1519d934b8faa12
MD5 f34a7d7bf968f870049b2433cd43957c
BLAKE2b-256 7f7a1d6b32b9cc0975f4d8258733d5e73f9791fc1eeab84e3fbce24aaa2d60cb

See more details on using hashes here.

File details

Details for the file fisx-1.0.8-cp27-none-win_amd64.whl.

File metadata

File hashes

Hashes for fisx-1.0.8-cp27-none-win_amd64.whl
Algorithm Hash digest
SHA256 962d4bc1f0052c864c2bec43864a891ee6b7d9e129d8718a004a6f7e106c43c2
MD5 105336d4e683b6c027706313459c1b4f
BLAKE2b-256 4653fab0768d02c6e7b7c37faffb26935c66a341d214222b8921e6aa97699810

See more details on using hashes here.

File details

Details for the file fisx-1.0.8-cp27-none-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl.

File metadata

File hashes

Hashes for fisx-1.0.8-cp27-none-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl
Algorithm Hash digest
SHA256 29a1d8c899a37de11655d5a6ae595f13941b308942b6b9ee01d785e806586940
MD5 48690ec886b87db7dc084f57ffcc45f9
BLAKE2b-256 40e9386a848f425c67f9bd6cef75f80a3b2a6b2603ba1ec77762c08d2e2635e6

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page