はじめに
X線は物質の構造解析や医用画像、天文学など、幅広い分野で活用されています。
この記事では、Pythonを使ってX線物理の基礎を理解する方法を紹介します。
xraylib は、主にX線、特に蛍光X線分光に用いられるデータベースなどをまとめたもので、
のことです。このツールの背景や使い方については、
に記事を書きましたのでご参照ください。
ここでは、xraylib を使いたいけど、ローカルの python 環境はちょっと、、という方向けに、google colab で動かす方法を紹介します。
google colab で使う方法
- google colab 上で xraylib のインストールからサンプル集は下記に記載しました。
これで、xraylib という物理定数ライブラリを使いながら、
原子の蛍光線エネルギーや吸収係数、散乱断面積などを実際に計算・可視化できます。
環境構築:Google Colabで始めよう
Google Colabは、Pythonをインストールしなくてもブラウザ上で動かせる環境です。
次の2行を最初に実行すれば、xraylibを使えるようになります。
!python -m pip install -q --upgrade pip
!python -m pip install -q xraylib
※ 以前(2024年ごろ)までは condacolab 経由でインストールする必要がありましたが、
2025年以降はpipだけでOK になりました。
Python基礎設定と可視化ライブラリ
以下のコードでは、数値計算(numpy)、表データ(pandas)、可視化(matplotlib)を読み込みます。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'serif'
parameters = {'axes.labelsize': 15, 'axes.titlesize': 15, 'xtick.labelsize': 14, 'ytick.labelsize': 14}
plt.rcParams.update(parameters)
これで、図のフォントサイズやスタイルを統一できます。
可視化は物理データを理解する上で重要な手段です。
matplotlibなどの基礎を知らない方は先にこちらを参照してください。
1. xraylibを使った基本操作
まずはライブラリが正しく動作するか確認します。
import xraylib
xraylib.XRayInit()
print("xraylib version:", xraylib.__version__)
print("Density of pure Al:", xraylib.ElementDensity(13), "g/cm3")
print("Ca K-alpha line energy:", xraylib.LineEnergy(20, xraylib.KA_LINE))
出力例:
xraylib version: 4.1.2
Density of pure Al: 2.6989 g/cm3
Ca K-alpha line energy: 3.691 keV
ここで ElementDensity(13) は原子番号13(アルミニウム)の密度を返しています。
LineEnergy(Z, LINE) は、原子番号Zの蛍光線エネルギーを求めます。
2. 原子番号とモル質量の対応表を作る
CSVに出力してpandasで扱う練習です。
amin, amax = 1, 104
outfname = "xraylib_basic.csv"
with open(outfname, 'w') as f:
f.write("Z,El,atomicMass\n")
for i in range(amin, amax):
f.write(f"{i},{xraylib.AtomicNumberToSymbol(i)},{xraylib.AtomicWeight(i)}\n")
data = pd.read_csv(outfname)
data.head()
この表は「周期表の数値版」であり、原子番号とモル質量の関係がわかります。
3. X線と物質の相互作用断面積
X線は物質中で主に3種類の相互作用を起こします:
- 光電効果 (Photoionization)
- コンプトン散乱 (Compton scattering)
- レイリー散乱 (Rayleigh scattering)
これらの断面積をエネルギーの関数として可視化します。
el_list = ["He","O","Fe","Bi"]
for el in el_list:
emin, emax, de = 0.1, 100.0, 0.05
data = []
an = xraylib.SymbolToAtomicNumber(el)
for ene in np.arange(emin, emax, de):
data.append([
ene,
xraylib.CS_Total(an, ene),
xraylib.CS_Photo(an, ene),
xraylib.CS_Rayl(an, ene),
xraylib.CS_Compt(an, ene),
])
df = pd.DataFrame(data, columns=["E","Total","Photo","Rayleigh","Compton"])
plt.figure(figsize=(6,6))
plt.title(el)
plt.plot(df["E"], df["Total"], "k-", label="Total")
plt.plot(df["E"], df["Photo"], "r--", label="Photo")
plt.plot(df["E"], df["Rayleigh"], "g--", label="Rayleigh")
plt.plot(df["E"], df["Compton"], "b--", label="Compton")
plt.xscale("log"); plt.yscale("log")
plt.xlabel("Energy (keV)")
plt.ylabel("Cross Section (cm²/g)")
plt.legend(); plt.grid(alpha=0.3, ls="dotted")
plt.show()
こちらが Bi の例です。
このグラフから、低エネルギーでは光電効果、高エネルギーではコンプトン散乱が支配的であることがわかります。
4. 蛍光X線のエネルギーと結合エネルギー
次に、各元素のK線やL線のエネルギーを調べてみます。
ka, ke = [], []
for i in range(1, 104):
try:
ke.append(xraylib.EdgeEnergy(i, xraylib.K_SHELL))
ka.append(xraylib.LineEnergy(i, xraylib.KL3_LINE))
except:
ke.append(np.nan); ka.append(np.nan)
Z = np.arange(1, 104)
plt.figure(figsize=(8,6))
plt.plot(Z, ka, "r.", label="Kα₁")
plt.plot(Z, ke, "b.", label="K edge")
plt.yscale("log")
plt.xlabel("Atomic number Z"); plt.ylabel("Energy (keV)")
plt.legend(); plt.grid(alpha=0.3, ls="dotted")
plt.show()
K と L Shell の蛍光X線のエネルギーの edge のエネルギーはこのようになります。
結果の物理的意味:
原子番号が大きくなるほど、内殻電子がより強く束縛されるため、K線エネルギーは急激に増加します。
5. X線の透過率と吸収率
X線が物質を透過するとき、強度は次式で減衰します:
I = I_0 ~ e^{-\mu \rho t}
ここで、μは質量吸収係数、ρは密度、tは厚さです。
elements = ["C", "Al"]
thicknesses = [0.0001, 0.0001] # cm
for el, t in zip(elements, thicknesses):
an = xraylib.SymbolToAtomicNumber(el)
rho = xraylib.ElementDensity(an)
ene = np.arange(0.8, 20, 0.05)
trans = np.exp(-xraylib.CS_Total(an, ene) * rho * t)
plt.plot(ene, trans, label=el)
plt.xscale("log")
plt.xlabel("Energy (keV)")
plt.ylabel("Transmission")
plt.legend(); plt.grid(alpha=0.3, ls="dotted")
plt.show()
この図では、軽元素(C)の方が高い透過率を示しています。
Alでは吸収が強いことが見て取れるでしょう。
6. コンプトン散乱:クライン=仁科の式
最後に、量子電磁気学の代表的な式「クライン=仁科の公式」を使って、
散乱角による微分断面積の変化をプロットします。
import math
for phi in [0, 90]:
plt.figure(figsize=(7,4))
for E in [30, 100, 511]:
ang = np.arange(0, 180, 1)
cs = [xraylib.DCSP_KN(E, math.radians(a), math.radians(phi)) for a in ang]
plt.plot(ang, cs, label=f"{E} keV")
plt.yscale("log")
plt.xlabel("Scattering Angle (deg)")
plt.ylabel("Differential Cross Section [cm²/g/sr]")
plt.title(f"Klein-Nishina formula (azimuth={phi}°)")
plt.legend(); plt.grid(alpha=0.3, ls="dotted")
plt.show()
散乱角が大きくなるほど断面積が小さくなり、高エネルギーになると前方散乱が支配的になります。
おわりに
本記事では「Python × 物理 × データ可視化」をテーマに、X線と物質の相互作用の簡単な計算例を紹介ました。
xraylibは研究現場でも広く使われる信頼性の高いライブラリですが、元素分析には十分かもしれませんが、精密分光観測や計測には精度が足りないこともあるので、高精度な計測を行う場合は源泉のデーテーベースの情報を確認すると良いでしょう。
参考リンク
- xraylib 公式GitHub: https://github.com/tschoonj/xraylib
- Wikipedia: 光電効果, コンプトン散乱
2024年度以前
要点は一つだけで、condacolabを使って、 conda を google colab にインストールしてから、xraylib を conda で入れることです。
https://github.com/conda-incubator/condacolab
調べると、condacolab を使わずに、miniconda のインストーラーを wget して入れている例もあるので、それらを試してみましたが、xraylib のインストールに一見成功しているようで、import xraylib で Cのモジュールが無いとかで怒られます。path問題な気がしますが、condacolab だと一発なので、深追いはしてません。
(記事にしようと思ったのは、ちょっとハマったからであります。)
google colab で使う場合の注意点
- google colab ではmatplotlibでインタラクティブな図が出せません。
- mpld3 や、plotly を使うなどで回避はできます。できますが、matplotlibよりも微妙にコードが増えたり、自由度が低い点は考慮の上がよいです。
- google colab で、conda activate で 仮想環境の切り替えはできません(私の知る限り@2022.8.6時点)
関連ページ


