0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Google Colabで学ぶ:PythonとxraylibによるX線物理の基礎

Last updated at Posted at 2022-08-28

はじめに

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 の例です。

xraylib_cs_Bi (3).png

このグラフから、低エネルギーでは光電効果、高エネルギーではコンプトン散乱が支配的であることがわかります。

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 のエネルギーはこのようになります。

xraylib_Ka.png

結果の物理的意味:
原子番号が大きくなるほど、内殻電子がより強く束縛されるため、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()

xraylib_filt_C.png

この図では、軽元素(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は研究現場でも広く使われる信頼性の高いライブラリですが、元素分析には十分かもしれませんが、精密分光観測や計測には精度が足りないこともあるので、高精度な計測を行う場合は源泉のデーテーベースの情報を確認すると良いでしょう。

参考リンク

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時点)

関連ページ

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?