Two Body Relativistic Kinematics
Calculation
を考える.
メトリックは,
重心系の速度を とすると, Lorentz Boost によって, 次のように変換される.
ところで, , は
を満たすので, この変換は
として,
とも表せる. SkiSicknessの説明では, これが使われている.
重心系では, より,
Mandelstam 変数 (重心系のエネルギーに相当) はローレンツ不変で,
実験室系で入射粒子2の運動エネルギーを , 標的粒子1が静止しているとすると,
は, ローレンツ不変なので,
これを変形して,
を得る.
より,
また, より, は
と表せる.
は保存され, 重心系では より,
上と同じようにして,
を得る.
したがって, 重心系での粒子3,4のエネルギー , は
より,
重心系での 粒子3,4の4元運動量:
をローレンツ逆変換して, 実験室系に戻す.
垂 直な成分は変わらないので,
以上より, 実験室系での運動エネルギーは,
実験室系での運動量は,
実験室系での角度は,
となる.
Program
Python で計算するスクリプトを書いてみた.
relkin.py
import numpy as np
class kinema():
def __init__(self, m1, m2, m3, m4, num=1000):
self.m1 = m1
self.m2 = m2
self.m3 = m3
self.m4 = m4
self.theta_cm = np.linspace(1e-5, np.pi-1e-5, num)
self.p_cm = 0.0
self.T3_cm = 0.0
self.T4_cm = 0.0
self.theta3_lab = np.zeros(num)
self.theta4_lab = np.zeros(num)
self.T3_lab = np.zeros(num)
self.T4_lab = np.zeros(num)
self.p3_lab = np.zeros(num)
self.p4_lab = np.zeros(num)
self.beta3_lab = np.zeros(num)
self.beta4_lab = np.zeros(num)
def calc(self, T):
m1 = self.m1
m2 = self.m2
m3 = self.m3
m4 = self.m4
theta_cm = self.theta_cm
sq = lambda x : np.power(x,2)
# mandelstam variable s
s = sq(m1 + m2) + 2*m1*T
# Momentum in the CM
pcm12 = np.sqrt( (sq(s - sq(m1) - sq(m2)) - 4*sq(m1)*sq(m2)) / (4*s) )
gamma = np.sqrt(sq(m1) + sq(pcm12)) / m1 # coshX
beta_gamma = pcm12 / m1 # sinhX
# Energy of particles 3 & 4 in CM
E3_cm = ( s + (sq(m3) - sq(m4)) ) / (2 * np.sqrt(s))
E4_cm = ( s - (sq(m3) - sq(m4)) ) / (2 * np.sqrt(s))
# Kinetic energy of particles 3 & 4 in CM
self.T3_cm = E3_cm - m3
self.T4_cm = E4_cm - m4
# Momentum in the CM
self.p_cm = np.sqrt( (sq(s - sq(m3) - sq(m4)) - 4*sq(m3)*sq(m4)) / (4*s) )
p_cm = self.p_cm
# Energy of particles 3 & 4 in Lab
E3_lab = gamma * E3_cm + beta_gamma * p_cm * np.cos(theta_cm)
E4_lab = gamma * E4_cm - beta_gamma * p_cm * np.cos(theta_cm)
# Kinetic energy of particles 3 & 4 in Lab
self.T3_lab = E3_lab - m3
self.T4_lab = E4_lab - m4
# Momentum in Lab
p3cos = gamma * p_cm * np.cos(theta_cm) + E3_cm * beta_gamma
p4cos = - gamma * p_cm * np.cos(theta_cm) + E4_cm * beta_gamma
p3sin = p_cm * np.sin(theta_cm)
p4sin = p_cm * np.sin(theta_cm)
self.p3_lab = np.sqrt(sq(p3cos) + sq(p3sin))
self.p4_lab = np.sqrt(sq(p4cos) + sq(p4sin))
# Beta in Lab
gamma3_lab = E3_lab/m3
gamma4_lab = E4_lab/m4
self.beta3_lab = np.sqrt( (sq(gamma3_lab) - 1)/sq(gamma3_lab) )
self.beta4_lab = np.sqrt( (sq(gamma4_lab) - 1)/sq(gamma4_lab) )
# Theta in Lab
self.theta3_lab = np.arctan(p3sin/p3cos)
self.theta4_lab = np.arctan(p4sin/p4cos)
Example
Proton Elastic Scattering from 136Xe
p(136Xe, 136Xe)p (@ 200 & 300 MeV/u) の反跳陽子の実験室系での運動学をプロットする. ついでに 136Xe の第一励起状態の運動学もプロットする.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from relkin import kinema
u = 931.49410372
mass = (
938.27208943, # MeV
135.907214484 * u, # MeV
135.907214484 * u, # MeV
938.27208943 # MeV
)
xe200 = kinema(*mass)
xe300 = kinema(*mass)
mass_ex = (
938.27208943, # MeV
135.907214484 * u, # MeV
135.907214484 * u + 1.313, # MeV
938.27208943 # MeV
)
xe200_ex = kinema(*mass_ex)
xe300_ex = kinema(*mass_ex)
xe200.calc(200*136)
xe300.calc(300*136)
xe200_ex.calc(200*136)
xe300_ex.calc(300*136)
plt.figure(0, figsize=(8,8), dpi=600)
plt.plot(
np.rad2deg(xe200.theta4_lab),
xe200.T4_lab,
color="teal",
label="Elastic",
lw=2)
plt.plot(
np.rad2deg(xe200_ex.theta4_lab),
xe200_ex.T4_lab,
color="navy",
label="1st Excited",
lw=2)
plt.plot(
np.rad2deg(xe300.theta4_lab),
xe300.T4_lab,
color="darkorange",
label="Elastic",
lw=2)
plt.plot(
np.rad2deg(xe300_ex.theta4_lab),
xe300_ex.T4_lab,
color="maroon",
label="1st Excited",
lw=2)
plt.legend()
plt.xlim(60,90)
plt.ylim(0,120)
Cluster Knockout Reaction
(p,2p), (p,pX)の素過程, p, d, t, 3He, と p の弾性散乱の運動学をプロットする.
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from relkin import kinema
# Mass
u = 931.49410372 # MeV
# Z = 1
mp = 1.00782503223 * u
md = 2.01410177812 * u
mt = 3.01604927790 * u
# Z = 2
m3He = 3.01602932007 * u
ma = 4.001506179127 * u
m_p2p = (mp,mp,mp,mp)
m_ppd = (mp,md,md,mp)
m_ppt = (mp,mt,mt,mp)
m_pp3He = (mp,m3He,m3He,mp)
m_ppa = (mp,ma,ma,mp)
kinema_p2p = kinema(*m_p2p)
kinema_ppd = kinema(*m_ppd)
kinema_ppt = kinema(*m_ppt)
kinema_pp3He = kinema(*m_pp3He)
kinema_ppa = kinema(*m_ppa)
kinema_p2p.calc(250)
kinema_ppd.calc(250*2)
kinema_ppt.calc(250*3)
kinema_pp3He.calc(250*3)
kinema_ppa.calc(250*4)
plt.figure(0, figsize=(8,8), dpi=600)
## (p,p2p)
# p
plt.plot(
np.rad2deg(kinema_p2p.theta4_lab),
kinema_p2p.T4_lab/1,
color="teal",
label=r"(p, 2p)",
lw=2)
## (p,pd)
# d
plt.plot(
np.rad2deg(kinema_ppd.theta3_lab),
kinema_ppd.T3_lab/2,
color="royalblue",
label=r"(p, pd)",
lw=2)
# p
plt.plot(
np.rad2deg(kinema_ppd.theta4_lab),
kinema_ppd.T4_lab,
color="royalblue",
ls='-.',
lw=2)
## (p,pt)
# t
plt.plot(
np.rad2deg(kinema_ppt.theta3_lab),
kinema_ppt.T3_lab/3,
color="indigo",
label=r"(p, pt)",
lw=2)
# p
plt.plot(
np.rad2deg(kinema_ppt.theta4_lab),
kinema_ppt.T4_lab,
color="indigo",
ls='-.',
lw=2)
## (p,p3He)
# 3He
plt.plot(
np.rad2deg(kinema_pp3He.theta3_lab),
kinema_pp3He.T3_lab/3,
color="darkorange",
label=r"(p, p$^{3}$He)",
lw=2)
# p
plt.plot(
np.rad2deg(kinema_ppt.theta4_lab),
kinema_ppt.T4_lab,
color="darkorange",
ls='-.',
lw=2)
## (p,pa)
# a
plt.plot(
np.rad2deg(kinema_ppa.theta3_lab),
kinema_ppa.T3_lab/4,
color="maroon",
label=r"(p, p$\alpha$)",
lw=2)
# p
plt.plot(
np.rad2deg(kinema_ppa.theta4_lab),
kinema_ppa.T4_lab,
color="maroon",
ls='-.',
lw=2)
plt.legend()
plt.xlabel(r"$\theta_\mathrm{lab}$ (deg)")
plt.ylabel(r"$T$ (MeV/u)")
plt.xlim(0,90)
plt.ylim(0,800)