0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonで学ぶX線マイクロカロリメータの熱応答(初学者メモ)

Last updated at Posted at 2025-10-30

はじめに

2025年10月20–24日に京都で開催された XRISM衛星の国際会議、および10月27–29日に立教大学で開かれた 宇宙精密X線分光の国際会議 では、XRISM衛星 によって拓かれた高エネルギー分解能検出器 — X線マイクロカロリメータ — の科学成果と、次世代の検出素子である Transition Edge Sensor (TES) に関する研究が大きな注目を集めました。

筆者自身これらの会議で多くの刺激を受け、この機会にX線マイクロカロリメータの基本原理を学んでみようと思いました。

そこで本記事では、X線マイクロカロリメータにおける 光子吸収後の指数関数的な温度減衰 と、エネルギー分解能を決めるよく知られた式

\Delta E_{\mathrm{FWHM}} = 2.35\xi\sqrt{k_B T^2 C}

をあわせて整理します。
数式と波形を並べて眺めることで、X線マイクロカロリメータの熱応答を直感的に理解することを目的としています。


本記事では、Pythonを用いて温度減衰のスケールを示す概念図を描いています。
実際のコードは Google Colab こちら から確認できます。

X線マイクロカロリメータの基本構成

X線マイクロカロリメータは、吸収したX線のエネルギーを熱に変換し、その温度上昇を超伝導転移領域の抵抗変化として読み取る検出器です。極低温($\sim$100 mK)で動作し、吸収体と温度計が熱的に結合した小さな熱系として振る舞います。

下図に、X線マイクロカロリメータの基本的な構成の概念図を示します。

image.png

エネルギー吸収と温度上昇

入射したX線のエネルギー $E$ が吸収されると、吸収体の温度はわずかに上昇します。熱容量を $C$ とすると、その関係は次のように表されます。

\Delta T = \frac{E}{C}

熱容量が小さいほど、同じエネルギーでも温度上昇 $\Delta T$ は大きくなります。

熱の逃げの時間応答

吸収体は、熱伝導率 $G$ をもつ熱リンクを介して、ヒートシンク(およそ 100 mK の低温浴)に接続されています。ここで、$G$ は素子とヒートシンクの間を流れる熱流 $P$ の温度依存性から $G \equiv \frac{dP}{dT}$ と定義され、温度 $T$ が上がるとどれだけ熱が逃げやすくなるかを表します。温度が変化すると、その分だけ熱流も変化し、エネルギー収支は次のように記述されます。

C \frac{d(\Delta T)}{dt} = -G \Delta T

この式を解くと、温度は指数関数的に減衰します。

\Delta T(t) = \Delta T_0 \exp\left(-\frac{t}{\tau_0}\right), \quad \tau_0 = \frac{C}{G}

ここで $\tau_0$ は時定数であり、熱がどの程度の速さで逃げていくかを表します。

熱ゆらぎ(Thermal Fluctuation)

平均的には温度が滑らかに冷却していきますが、実際には熱エネルギーの出入りにランダムな揺らぎが生じます。この 熱ゆらぎ(thermal fluctuation) によって、検出器のエネルギー分解能は原理的に制限されます。以下では、その関係式を整理します。

吸収体の中では、熱エネルギーは主にフォノンとして蓄えられています。
平均的に1個のフォノンが持つエネルギーはおよそ $k_B T$ であり、吸収体全体のエネルギーは

U = N k_B T

と書けます。ここで $N$ はフォノンの総数です。
一方で、熱容量 $C$ を用いると $U = C T$ とも書けるため、両者を比較すると

N = \frac{C}{k_B}

が得られます。

全エネルギーの微小変化は次のように書けます。

\delta U = k_B T\,\delta N + N k_B\,\delta T

吸収体の熱容量 $C$ が比較的大きい場合、マクロ的には熱平衡状態にあるとみなせるため、温度ゆらぎ $\delta T$ は極めて小さいとみなせるため、第2項は近似的に無視します。

フォノン数のゆらぎは、平均値の平方根でスケールするポアソン的な近似が成り立つと考えられるため、

\delta N \sim \sqrt{N} = \sqrt{\frac{C}{k_B}}

と書けます。
したがって、主要なエネルギーゆらぎは

\Delta U \sim k_B T\,\delta N = \sqrt{k_B T^2 C}

と表されます。

エネルギー分解能

エネルギーゆらぎをガウス分布の標準偏差($\sigma$)とみなし、観測上よく使われる半値全幅(FWHM)に換算すると、

\Delta E_{\mathrm{FWHM}} = 2\sqrt{2\ln2}\,\sqrt{k_B T^2 C}

となります。ここで $2\sqrt{2\ln2} \approx 2.35$ は、ガウス分布における $\sigma$ から FWHM への換算係数です。
ただし、実際のTESでは温度計の感度($\alpha$ パラメータ)や読み出しノイズ、電気的な時定数などが関与し、理想的な熱ゆらぎだけでは説明できません。
そこで、それらを包括的に表す補正項として、比例定数 $\xi$ を導入します。

\Delta E_{\mathrm{FWHM}} = 2\sqrt{2\ln2}\,\xi\,\sqrt{k_B T^2 C}

この式が、X線マイクロカロリメータの理論的エネルギー分解能の限界値として知られた式です。

PythonでX線マイクロカロリメータの温度応答を可視化してみる

X線マイクロカロリメータが単一光子を吸収したときの温度応答を、単純な熱モデルを用いて数値的に解き、可視化してみます。

先ほど示した式は、すでに熱が注入されたあとの温度変化を表したものでした。
ここでは、光子が吸収されてエネルギーが注入される項 $P_{\text{photon}}(t)$ を簡易的に導入し、

C \frac{dT}{dt} = -G (T - T_0) + P_{\text{photon}}(t)

と書きます。

実際には、入力パルスやエネルギー伝達には複雑な時間スケールがありますが、ここでは理解を簡単にするため、短い矩形パルスとして近似します。

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.size"] = 13

# --- パラメータ ---
C = 1.0e-12      # 熱容量 [J/K]
G = 1.0e-8       # 熱伝導率 [W/K]
T0 = 0.10        # 動作温度 [K]
E_photon = 9.6e-16  # 光子のエネルギー [J]
t_pulse = 0.0      # 光子入射タイミング [s]
pulse_width = 5e-6  # パルス幅 [s]

# --- 理論値 ---
delta_T = E_photon / C      # ΔT = E/C
tau_0 = C / G                 # τ_0 = C/G

print(f"ΔT = {delta_T*1e3:.3f} mK, τ_0 = {tau_0*1e3:.3f} ms")

# --- 時間軸 ---
t = np.linspace(-0.1e-3, 0.5e-3, 10000)
dt = t[1] - t[0]

# --- パルス電力 ---
P_pulse = np.zeros_like(t)
P_pulse[(t >= t_pulse) & (t < t_pulse + pulse_width)] = E_photon / pulse_width

# --- 温度変化を数値的に解く ---
T = np.zeros_like(t)
T[0] = T0
for i in range(1, len(t)):
    dTdt = (-G * (T[i-1] - T0) + P_pulse[i-1]) / C
    T[i] = T[i-1] + dTdt * dt

# --- Figure構成 ---
fig, axes = plt.subplots(2, 1, figsize=(12, 8), sharex=True,
                         gridspec_kw={'height_ratios': [1, 3]})

# ======================
# (1) パルス波形 (Input)
# ======================
axes[0].plot(t*1e3, P_pulse*1e9, color='tab:red', lw=2, label='Photon Power Pulse (Input)')
axes[0].set_ylabel("Power [nW]")
axes[0].grid(alpha=0.4)
axes[0].set_xlim(-0.1, 0.5)
axes[0].legend(loc='upper right')

# ======================
# (2) 温度応答 (Output)
# ======================
axes[1].plot(t*1e3, T*1e3, lw=2, color='tab:blue', label='Temperature Response (Output)')
axes[1].axvline(t_pulse*1e3, color='red', linestyle='--', lw=1.2)
axes[1].text(t_pulse*1e3 + 0.01, (T0 + delta_T)*1e3,
             "Photon absorbed", fontsize='small', color='red')

# --- ΔT注釈(縦方向) ---
x_annot = -0.005  # ΔT矢印のx位置 [ms]
y0 = T0 * 1e3
y1 = (T0 + delta_T) * 1e3
axes[1].arrow(x_annot, y0, 0, (y1 - y0),
              head_width=0.005, head_length=0.02,
              fc='gray', ec='gray', length_includes_head=True)
axes[1].arrow(x_annot, y1, 0, -(y1 - y0),
              head_width=0.005, head_length=0.02,
              fc='gray', ec='gray', length_includes_head=True)
axes[1].text(x_annot - 0.005, (y0 + y1)/2,
             rf"$\Delta T = E/C \approx {delta_T*1e3:.2f}\ \mathrm{{mK}}$",
             ha='right', va='center', fontsize='small', color='black')

# --- τ注釈(横方向) ---
t_tau_0 = t_pulse + tau_0
T_tau_0 = T0 + delta_T / np.e
axes[1].arrow(t_pulse*1e3, T_tau_0*1e3, (t_tau_0 - t_pulse)*1e3, 0,
              head_width=0.01, head_length=0.01,
              fc='gray', ec='gray', length_includes_head=True)
axes[1].arrow(t_tau_0*1e3, T_tau_0*1e3, -(t_tau_0 - t_pulse)*1e3, 0,
              head_width=0.01, head_length=0.01,
              fc='gray', ec='gray', length_includes_head=True)
axes[1].text((t_pulse*1e3 + t_tau_0*1e3)/2, T_tau_0*1e3 + 0.03,
             rf"$\tau_0 = C/G \approx {tau_0*1e3:.2f}\ \mathrm{{ms}}$",
             ha='center', va='bottom', fontsize='small', color='black')

axes[1].set_xlabel("Time [ms]")
axes[1].set_ylabel("Temperature [mK]")
axes[1].grid(alpha=0.4)
axes[1].legend(loc='upper right')

plt.tight_layout()
plt.show()

image.png

このように、光子の吸収によって温度が一瞬 $\Delta T = E/C$ だけ上昇し、その後、熱伝導によって時定数 $\tau_0 = C/G$ のスケールで元の温度に戻っていきます。

パルスの立ち上がりが速いほど、光子が入射したタイミングをより正確に決めやすくなります。
また、時定数 $\tau_0$ は熱がどのくらい早く逃げるかを表す指標です。
$\tau_0$ が大きいと温度がゆっくり下がるため、その間に複数の光子が入射すると信号が重なり、
正確な入射エネルギーの特定が難しくなります。

X線マイクロカロリメータでは、この時間応答の速さが重要な性能指標のひとつとされています。応答をより速くするために、ETF(Electrothermal Feedback) と呼ばれる仕組みが利用されます。ETFによって実効的な冷却が強まり、パルスの戻り時間を短縮できる場合があります。詳しくは、以下の記事がとてもわかりやすく整理されています。

まとめ

本記事では、X線マイクロカロリメータの熱的な応答とエネルギー分解能の関係を、シンプルなモデル式とPythonによる概念図を通して整理しました。

実際のX線マイクロカロリーメータの挙動は、電気的フィードバック(ETF)など、より複雑な要素を含みますが、その根底には「光子の吸収による温度上昇」と「熱伝導による指数関数的な冷却」という基本的な熱過程があります。

こうした基礎モデルを通して精密X線観測装置の動作を少しずつ理解していければと思います。この記事が、これから学ぶ方にとっての第一歩になれば幸いです。

参考文献

本記事を書くにあたり、以下の記事を参考にさせていただいた。

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?