Dual Energy Decomposition

xrayphysics.xrayPhysics.setDEDlookupTable(self, spectralResponse_L, spectralResponse_H, gammas, basisFunction_1, basisFunction_2, referenceEnergies=None, T_atten=0.0, N_atten=0)

Calculate a dual energy decomposition transfer function

This function calculates a look up table to perform dual energy decomposition. The decomposed data are virtual monochromatic attenuation values where the monochromatic energies are given by the referenceEnergies input argument. We describe how to get the basis coefficients instead of monochromatic attenuation values below.

This function solves the following

\[\begin{split}\begin{eqnarray*} \widehat{a}_L, \widehat{a}_H &:=& \text{argmin} \left[ p_L + \log\left( \int \widehat{s}_L(\gamma) e^{-b_L(\gamma)a_L - b_H(\gamma)a_H} \, d\gamma \right) \right]^2 \\ &+& \left[ p_H + \log\left( \int \widehat{s}_H(\gamma) e^{-b_L(\gamma)a_L - b_H(\gamma)a_H} \, d\gamma \right) \right]^2 \end{eqnarray*}\end{split}\]

where \(p_L\) and \(p_H\) are the measured low and high energy attenuation data, \(\widehat{a}_L\) and \(\widehat{a}_H\) are the low and high virtual monochromatic attenuation data, \(s_L\) and \(s_H\) are the low and high energy spectra, and \(\gamma_L\) and \(\gamma_H\) are the low and high virtual energies (keV). The basis functions are given by

\[\begin{split}\begin{eqnarray*} \begin{bmatrix} b_L(\gamma) \\ b_H(\gamma) \end{bmatrix} &:=& \begin{bmatrix} b_1(\gamma_L) & b_1(\gamma_H) \\ b_2(\gamma_L) & b_2(\gamma_H) \end{bmatrix}^{-1} \begin{bmatrix} b_1(\gamma) \\ b_2(\gamma) \end{bmatrix} \end{eqnarray*}\end{split}\]

where \(b_1\) and \(b_2\) are the given basis functions (e.g., compton/ photoelectric, LAC of two materials, PCA basis, etc.)

Note that the normalized spectra are defined by

\[\begin{split}\begin{eqnarray*} \widehat{s}_L(\gamma) &:=& \frac{s_L(\gamma)}{\int s_L(\gamma') \, d\gamma'} \\ \widehat{s}_H(\gamma) &:=& \frac{s_H(\gamma)}{\int s_H(\gamma') \, d\gamma'} \end{eqnarray*}\end{split}\]

If one wishes to get the basis coefficients then just apply the following transformation

\[\begin{split}\begin{eqnarray*} \begin{bmatrix} a_1 \\ a_2 \end{bmatrix} &:=& \begin{bmatrix} b_1(\gamma_L) & b_2(\gamma_L) \\ b_1(\gamma_H) & b_2(\gamma_H) \end{bmatrix}^{-1} \begin{bmatrix} a_L \\ a_H \end{bmatrix} \end{eqnarray*}\end{split}\]

A full description of this algorithm is provided in the following reference:

Champley, Kyle M., Stephen G. Azevedo, Isaac M. Seetho, Steven M. Glenn, Larry D. McMichael, Jerel A. Smith, Jeffrey S. Kallman, William D. Brown, and Harry E. Martz. “Method to extract system-independent material properties from dual-energy X-ray CT.” IEEE Transactions on Nuclear Science 66, no. 3 (2019): 674-686.

Parameters:
  • spectralResponse_L (numpy array) – low energy spectra model

  • spectralResponse_H (numpy array) – high energy spectra model

  • gammas (numpy array) – energies at which both the spectra models are defined

  • basisFunction_1 (numpy array) – first basis function

  • basisFunction_2 (numpy array) – second basis function

  • referenceEnergies (2-element numpy array) – the low and high energy (keV) energies of the synthesized monochromatic attenuation

  • T_atten (scalar) – the sampling rate of the polychromatic attenuation (if unspecified, uses default values)

  • N_atten (int) – the number of samples of the polychromatic attenuation (if unspecified, uses default values)

Returns:

A 2D numpy array that maps the low and high polychromatic attenuation to the low and high (at referenceEnergies) monochromatic attenuation

xrayphysics.xrayPhysics.PhotoelectricBasis(self, gammas)

Returns the photoelectric basis function

xrayphysics.xrayPhysics.ComptonBasis(self, gammas)

Returns the Compton basis function

xrayphysics.xrayPhysics.PCAbases(self, listOfMaterials, gammas)

Returns the two basis functions derived from the PCA of several material cross sections