File:X-ray attenuation spectra elements mass.svg

From WikiProjectMed
Jump to navigation Jump to search

Original file(SVG file, nominally 576 × 432 pixels, file size: 62 KB)

This file is from a shared repository and may be used by other projects. The description on its file description page there is shown below.

Summary

Description
English: X-ray mass attenuation spectra of selected elements for energies up to 250keV, linear abscissa, logarithmic ordinate.
Date
Source Own work
Author Geek3
SVG development
InfoField
 
The SVG code is valid.
 
This plot was created with Matplotlib.
Source code
InfoField

Matplotlib source code

The plot was generated with Matplotlib
# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate as itp
from math import *

def interp(x, max_gap=0.05):
    sections = [[x[0]]]
    # divide data into monotonic sections
    for i in range(1, len(x)):
        if x[i-1,0] < x[i,0] and x[i-1,1] >= x[i,1]:
            sections[-1].append(x[i])
        else:
            sections.append([x[i]])
    
    # interpolate within each section
    for si, s in enumerate(sections):
        if len(s) >= 2:
            # use third-order polynomial of logarithmized data
            spline = itp.make_interp_spline([log(d[0]) for d in s],
                [np.log(d[1:]) for d in s], bc_type="natural")
            
            for i in range(len(s) - 1, 0, -1):
                nsub = log(s[i-1][0] / s[i][0]) / log(1 - max_gap)
                if nsub > 1:
                    nsub = int(ceil(nsub))
                    xnew = s[i-1][0] * (s[i][0] / s[i-1][0]) ** (np.arange(1, nsub) / nsub)
                    s = s[:i] + [np.concatenate(([xnew[j]], d)) for j, d in enumerate(np.exp(spline(np.log(xnew))))] + s[i:]
        sections[si] = s
    
    return np.concatenate(sections)

# data from https://physics.nist.gov/PhysRefData/XrayMassCoef/tab3.html
mu_H = interp(np.fromstring("""
1.90000E-4 1.000E+3 1.00000E-3 7.217E+0 1.50000E-3 2.148E+0 2.00000E-3 1.059E+0
3.00000E-3 5.612E-1 4.00000E-3 4.546E-1 5.00000E-3 4.193E-1 6.00000E-3 4.042E-1
8.00000E-3 3.914E-1 1.00000E-2 3.854E-1 1.50000E-2 3.764E-1 2.00000E-2 3.695E-1
3.00000E-2 3.570E-1 4.00000E-2 3.458E-1 5.00000E-2 3.355E-1 6.00000E-2 3.260E-1
8.00000E-2 3.091E-1 1.00000E-1 2.944E-1 1.50000E-1 2.651E-1 2.00000E-1 2.429E-1
3.00000E-1 2.112E-1
""", sep=" ").reshape((-1, 2)))

mu_C = interp(np.fromstring("""
1.00000E-3 2.211E+3 1.50000E-3 7.002E+2 2.00000E-3 3.026E+2 3.00000E-3 9.033E+1
4.00000E-3 3.778E+1 5.00000E-3 1.912E+1 6.00000E-3 1.095E+1 8.00000E-3 4.576E+0
1.00000E-2 2.373E+0 1.50000E-2 8.071E-1 2.00000E-2 4.420E-1 3.00000E-2 2.562E-1
4.00000E-2 2.076E-1 5.00000E-2 1.871E-1 6.00000E-2 1.753E-1 8.00000E-2 1.610E-1
1.00000E-1 1.514E-1 1.50000E-1 1.347E-1 2.00000E-1 1.229E-1 3.00000E-1 1.066E-1
""", sep=" ").reshape((-1, 2)))

mu_N = interp(np.fromstring("""
1.00000E-3 3.311E+3 1.50000E-3 1.083E+3 2.00000E-3 4.769E+2 3.00000E-3 1.456E+2
4.00000E-3 6.166E+1 5.00000E-3 3.144E+1 6.00000E-3 1.809E+1 8.00000E-3 7.562E+0
1.00000E-2 3.879E+0 1.50000E-2 1.236E+0 2.00000E-2 6.178E-1 3.00000E-2 3.066E-1
4.00000E-2 2.288E-1 5.00000E-2 1.980E-1 6.00000E-2 1.817E-1 8.00000E-2 1.639E-1
1.00000E-1 1.529E-1 1.50000E-1 1.353E-1 2.00000E-1 1.233E-1 3.00000E-1 1.068E-1
""", sep=" ").reshape((-1, 2)))

mu_O = interp(np.fromstring("""
1.00000E-3 4.590E+3 1.50000E-3 1.549E+3 2.00000E-3 6.949E+2 3.00000E-3 2.171E+2
4.00000E-3 9.315E+1 5.00000E-3 4.790E+1 6.00000E-3 2.770E+1 8.00000E-3 1.163E+1
1.00000E-2 5.952E+0 1.50000E-2 1.836E+0 2.00000E-2 8.651E-1 3.00000E-2 3.779E-1
4.00000E-2 2.585E-1 5.00000E-2 2.132E-1 6.00000E-2 1.907E-1 8.00000E-2 1.678E-1
1.00000E-1 1.551E-1 1.50000E-1 1.361E-1 2.00000E-1 1.237E-1 3.00000E-1 1.070E-1
""", sep=" ").reshape((-1, 2)))

mu_Na = interp(np.fromstring("""
1.00000E-3 6.542E+2 1.03542E-3 5.960E+2 1.07210E-3 5.429E+2 1.07210E-3 6.435E+3
1.50000E-3 3.194E+3 2.00000E-3 1.521E+3 3.00000E-3 5.070E+2 4.00000E-3 2.261E+2
5.00000E-3 1.194E+2 6.00000E-3 7.030E+1 8.00000E-3 3.018E+1 1.00000E-2 1.557E+1
1.50000E-2 4.694E+0 2.00000E-2 2.057E+0 3.00000E-2 7.197E-1 4.00000E-2 3.969E-1
5.00000E-2 2.804E-1 6.00000E-2 2.268E-1 8.00000E-2 1.796E-1 1.00000E-1 1.585E-1
1.50000E-1 1.335E-1 2.00000E-1 1.199E-1 3.00000E-1 1.029E-1
""", sep=" ").reshape((-1, 2)))

mu_P = interp(np.fromstring("""
1.00000E-3 1.913E+3 1.50000E-3 6.547E+2 2.00000E-3 3.018E+2 2.14550E-3 2.494E+2
2.14550E-3 2.473E+3 3.00000E-3 1.118E+3 4.00000E-3 5.242E+2 5.00000E-3 2.860E+2
6.00000E-3 1.726E+2 8.00000E-3 7.660E+1 1.00000E-2 4.035E+1 1.50000E-2 1.239E+1
2.00000E-2 5.352E+0 3.00000E-2 1.700E+0 4.00000E-2 8.096E-1 5.00000E-2 4.916E-1
6.00000E-2 3.494E-1 8.00000E-2 2.324E-1 1.00000E-1 1.865E-1 1.50000E-1 1.432E-1
2.00000E-1 1.250E-1 3.00000E-1 1.055E-1
""", sep=" ").reshape((-1, 2)))

mu_Ca = interp(np.fromstring("""
1.00000E-3 4.867E+3 1.50000E-3 1.714E+3 2.00000E-3 7.999E+2 3.00000E-3 2.676E+2
4.00000E-3 1.218E+2 4.03810E-3 1.187E+2 4.03810E-3 1.023E+3 5.00000E-3 6.026E+2
6.00000E-3 3.731E+2 8.00000E-3 1.726E+2 1.00000E-2 9.341E+1 1.50000E-2 2.979E+1
2.00000E-2 1.306E+1 3.00000E-2 4.080E+0 4.00000E-2 1.830E+0 5.00000E-2 1.019E+0
6.00000E-2 6.578E-1 8.00000E-2 3.656E-1 1.00000E-1 2.571E-1 1.50000E-1 1.674E-1
2.00000E-1 1.376E-1 3.00000E-1 1.116E-1
""", sep=" ").reshape((-1, 2)))

mu_Fe = interp(np.fromstring("""
1.00000E-3 9.085E+3 1.50000E-3 3.399E+3 2.00000E-3 1.626E+3 3.00000E-3 5.576E+2
4.00000E-3 2.567E+2 5.00000E-3 1.398E+2 6.00000E-3 8.484E+1 7.11200E-3 5.319E+1
7.11200E-3 4.076E+2 8.00000E-3 3.056E+2 1.00000E-2 1.706E+2 1.50000E-2 5.708E+1
2.00000E-2 2.568E+1 3.00000E-2 8.176E+0 4.00000E-2 3.629E+0 5.00000E-2 1.958E+0
6.00000E-2 1.205E+0 8.00000E-2 5.952E-1 1.00000E-1 3.717E-1 1.50000E-1 1.964E-1
2.00000E-1 1.460E-1 3.00000E-1 1.099E-1
""", sep=" ").reshape((-1, 2)))

mu_Sn = interp(np.fromstring("""
1.00000E-3 8.157E+3 1.50000E-3 3.296E+3 2.00000E-3 1.665E+3 3.00000E-3 6.143E+2
3.92880E-3 3.114E+2 3.92880E-3 9.285E+2 4.00000E-3 9.393E+2 4.15610E-3 8.469E+2
4.15610E-3 1.145E+3 4.30764E-3 1.060E+3 4.46470E-3 9.712E+2 4.46470E-3 1.117E+3
5.00000E-3 8.471E+2 6.00000E-3 5.294E+2 8.00000E-3 2.500E+2 1.00000E-2 1.384E+2
1.50000E-2 4.664E+1 2.00000E-2 2.146E+1 2.92001E-2 7.760E+0 2.92001E-2 4.360E+1
3.00000E-2 4.121E+1 4.00000E-2 1.942E+1 5.00000E-2 1.070E+1 6.00000E-2 6.564E+0
8.00000E-2 3.029E+0 1.00000E-1 1.676E+0 1.50000E-1 6.091E-1 2.00000E-1 3.260E-1
3.00000E-1 1.639E-1
""", sep=" ").reshape((-1, 2)))

mu_Pb = interp(np.fromstring("""
1.00000E-3 5.210E+3 1.50000E-3 2.356E+3 2.00000E-3 1.285E+3 2.48400E-3 8.006E+2
2.48400E-3 1.397E+3 2.53429E-3 1.726E+3 2.58560E-3 1.944E+3 2.58560E-3 2.458E+3
3.00000E-3 1.965E+3 3.06640E-3 1.857E+3 3.06640E-3 2.146E+3 3.30130E-3 1.796E+3
3.55420E-3 1.496E+3 3.55420E-3 1.585E+3 3.69948E-3 1.442E+3 3.85070E-3 1.311E+3
3.85070E-3 1.368E+3 4.00000E-3 1.251E+3 5.00000E-3 7.304E+2 6.00000E-3 4.672E+2
8.00000E-3 2.287E+2 1.00000E-2 1.306E+2 1.30352E-2 6.701E+1 1.30352E-2 1.621E+2
1.50000E-2 1.116E+2 1.52000E-2 1.078E+2 1.52000E-2 1.485E+2 1.55269E-2 1.416E+2
1.58608E-2 1.344E+2 1.58608E-2 1.548E+2 2.00000E-2 8.636E+1 3.00000E-2 3.032E+1
4.00000E-2 1.436E+1 5.00000E-2 8.041E+0 6.00000E-2 5.021E+0 8.00000E-2 2.419E+0
8.80045E-2 1.910E+0 8.80045E-2 7.683E+0 1.00000E-1 5.549E+0 1.50000E-1 2.014E+0
2.00000E-1 9.985E-1 3.00000E-1 4.031E-1
""", sep=" ").reshape((-1, 2)))

plt.figure()
plt.plot(mu_Pb[:,0] * 1e3, mu_Pb[:,1], label="$_{82}$Pb", color="#77ac30")
plt.plot(mu_Sn[:,0] * 1e3, mu_Sn[:,1], label="$_{50}$Sn", color="#0088bd")
plt.plot(mu_Fe[:,0] * 1e3, mu_Fe[:,1], label="$_{26}$Fe", color="#d95319")
plt.plot(mu_Ca[:,0] * 1e3, mu_Ca[:,1], label="$_{20}$Ca", color="#edb120")
plt.plot(mu_P[:,0] * 1e3, mu_P[:,1], label="$_{15}$P", color="#7e2f8e")
plt.plot(mu_Na[:,0] * 1e3, mu_Na[:,1], label="$_{11}$Na", color="#555555")
plt.plot(mu_O[:,0] * 1e3, mu_O[:,1], label="$_8$O", color="#cc1122")
plt.plot(mu_N[:,0] * 1e3, mu_N[:,1], label="$_7$N", color="#5577ff")
plt.plot(mu_C[:,0] * 1e3, mu_C[:,1], label="$_6$C", color="#000000")
plt.plot(mu_H[:,0] * 1e3, mu_H[:,1], label="$_1$H", color="#aaaaaa")

plt.gca().set_yscale('log')
plt.xlim(0, 250)
plt.ylim(1e-1, 1e3)
plt.ylabel(r"$\mu/\rho$ [cm${}^2$/g]")
plt.xlabel("E [keV]")
plt.legend(borderaxespad=0.8, framealpha=1)
plt.grid()
plt.tight_layout()
plt.savefig("X-ray_attenuation_spectra_elements_mass.svg")

Licensing

I, the copyright holder of this work, hereby publish it under the following license:
w:en:Creative Commons
attribution share alike
This file is licensed under the Creative Commons Attribution-Share Alike 4.0 International license.
You are free:
  • to share – to copy, distribute and transmit the work
  • to remix – to adapt the work
Under the following conditions:
  • attribution – You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
  • share alike – If you remix, transform, or build upon the material, you must distribute your contributions under the same or compatible license as the original.

Captions

X-ray mass attenuation spectra of selected elements

Items portrayed in this file

depicts

16 August 2023

image/svg+xml

File history

Click on a date/time to view the file as it appeared at that time.

Date/TimeThumbnailDimensionsUserComment
current12:48, 16 August 2023Thumbnail for version as of 12:48, 16 August 2023576 × 432 (62 KB)commons>Geek3Uploaded own work with UploadWizard

There are no pages that use this file.

Metadata