メインコンテンツまでスキップ

Drift Chamberのトラッキング解析

Drift chamber (DC) の各面で得られた測定座標から, 粒子の飛跡を求める方法を説明する.

トラックパラメータと測定座標

z=0z=0 におけるトラッキング結果の粒子の位置を (x,y)(x, y) , そのslopeを a= ⁣dx ⁣dza=\dv{x}{z} , b= ⁣dy ⁣dzb=\dv{y}{z} と書く. これらをまとめてパラメータベクトル θ\bm{\theta} と表す.

θ=(xyab)\bm{\theta} = \mqty( x \\ y \\ a \\ b )

ii 番目の面の zz 座標を ziz_i と表すと, ziz_i での粒子の飛跡位置 (xi,yi)(x_i, y_i) は次のように表せる.

xi=x+azi,yi=y+bzi.x_i = x + a z_i, \quad y_i = y + b z_i .

DCの各面はある軸方向しか位置が分からない. ii 番目の面の軸での測定座標を mim_i と表し, これらをまとめて m\bm{m} と表す. 各面の軸の角度を ϕi\phi_i ( xx 軸を基準に取って測る) とすると, mim_i(xi,yi)(x_i, y_i) のこの軸への射影であるから, 次のように表せる.

mi=xicosϕi+yisinϕi=(x+azi)cosϕi+(y+bzi)sinϕim_i = x_i \cos \phi_i + y_i \sin \phi_i = (x + a z_i) \cos \phi_i + (y + b z_i) \sin \phi_i

ここで ϕi\phi_i はwireの方向ではなく, その面が位置を測定する軸, すなわちwireに垂直な方向の角度である点に注意せよ. 以下の図では, +y+y を上向き, +z+z を画面奥向きに取り, 右手系を採用している. 灰色の線はsense wire, 青色の矢印はsense wireに垂直な方向の測定座標 mim_i を表す.

実際のDCでは, hitしたwireのIDとdrift timeが測定される. drift timeをdrift length did_i に変換し, hitしたwireの測定軸上の位置を wiw_i とすると, 粒子の通過位置の候補は

mi=wi+sidi,si{1,+1}m_i = w_i + s_i d_i, \qquad s_i \in \{-1,+1\}

と表せる. sis_i は粒子がwireのどちら側を通過したかを表す符号である. drift 時間だけからは sis_i を決められないため, 各面について2つの mim_i が候補となる. この曖昧さが, 後で扱うLeft-Right ambiguityである.

m\bm{m} は行列 HH を使って次のように表せる.

m=(m0m1mn1)=(cosϕ0sinϕ0z0cosϕ0z0sinϕ0cosϕ1sinϕ1z1cosϕ1z1sinϕ1cosϕn1sinϕn1zn1cosϕn1zn1sinϕn1)(xyab)=Hθ\bm{m} = \mqty( m_0 \\ m_1 \\ \vdots \\ m_{n-1} ) = \mqty( \cos \phi_0 & \sin \phi_0 & z_0 \cos \phi_0 & z_0 \sin \phi_0 \\ \cos \phi_1 & \sin \phi_1 & z_1 \cos \phi_1 & z_1 \sin \phi_1 \\ \vdots & \vdots & \vdots & \vdots\\ \cos \phi_{n-1} & \sin \phi_{n-1} & z_{n-1} \cos \phi_{n-1} & z_{n-1} \sin \phi_{n-1} \\ ) \mqty( x \\ y \\ a \\ b ) = H \bm{\theta}

最小二乗法によるトラックフィット

DCは有限な分解能を持つため, これが厳密に成り立つことはなく, 最小二乗解 θ^\hat{\bm{\theta}} を探すというのが現実の操作になる. ここでは, まず各面の測定分解能が同じであると仮定し, 等しい重みでfitする. 残差の二乗和(SSR)は

SSR=i(mipHipθp)2\mathrm{SSR} = \sum_i \qty(m_i - \sum_p H_{ip} \theta_p)^2

と表せ, 最小二乗解 θ^\hat{\bm{\theta}} は次の条件を満たす.

 ⁣SSR ⁣θqθ=θ^=2iHiq(mipHipθ^p)=0\eval{\pdv{\mathrm{SSR}}{\theta_q}}_{\bm{\theta}=\hat{\bm{\theta}}} = -2 \sum_i H_{iq}\qty( m_i - \sum_p H_{ip} \hat{\theta}_p ) = 0 iHiqmi=piHiqHipθ^p\Rightarrow \sum_i H_{iq} m_i = \sum_p \sum_i H_{iq} H_{ip} \hat{\theta}_p (HTm)q=p(HTH)qpθ^p\Rightarrow \qty(H^\mathsf{T} \bm{m})_q = \sum_p \qty(H^\mathsf{T} H)_{qp} \hat{\theta}_p

したがって, 最小二乗解を得るために解くべき方程式は

HTm=HTHθ^H^\mathsf{T} \bm{m} = H^\mathsf{T} H \hat{\bm{\theta}}

となる. 以降, N=HTHN = H^\mathsf{T} H , g=HTm\bm{g} = H^\mathsf{T} \bm{m} と表すことにする. ところで NN は次のような実対称行列となる.

N=HTH=(cosϕ0cosϕ1cosϕn1sinϕ0sinϕ1sinϕn1z0cosϕ0z1cosϕ1zn1cosϕn1z0sinϕ0z1sinϕ1zn1sinϕn1)(cosϕ0sinϕ0z0cosϕ0z0sinϕ0cosϕ1sinϕ1z1cosϕ1z1sinϕ1cosϕn1sinϕn1zn1cosϕn1zn1sinϕn1)=(i(cosϕi)2icosϕisinϕiizi(cosϕi)2izicosϕisinϕiicosϕisinϕii(sinϕi)2izicosϕisinϕiizi(sinϕi)2izi(cosϕi)2izicosϕisinϕii(zicosϕi)2izi2cosϕisinϕiizicosϕisinϕiizi(sinϕi)2izi2cosϕisinϕii(zisinϕi)2)\begin{align*} N &= H^\mathsf{T} H \\ &= \mqty( \cos \phi_0 & \cos \phi_1 & \cdots & \cos \phi_{n-1} \\ \sin \phi_0 & \sin \phi_1 & \cdots & \sin \phi_{n-1} \\ z_0 \cos \phi_0 & z_1 \cos \phi_1 & \cdots & z_{n-1} \cos \phi_{n-1} \\ z_0 \sin \phi_0 & z_1 \sin \phi_1 & \cdots & z_{n-1} \sin \phi_{n-1} ) \mqty( \cos \phi_0 & \sin \phi_0 & z_0 \cos \phi_0 & z_0 \sin \phi_0 \\ \cos \phi_1 & \sin \phi_1 & z_1 \cos \phi_1 & z_1 \sin \phi_1 \\ \vdots & \vdots & \vdots & \vdots\\ \cos \phi_{n-1} & \sin \phi_{n-1} & z_{n-1} \cos \phi_{n-1} & z_{n-1} \sin \phi_{n-1} \\ )\\ &= \mqty( \sum_i (\cos \phi_i)^2 & \sum_i \cos \phi_i \sin \phi_i & \sum_i z_i (\cos \phi_i)^2 & \sum_i z_i \cos \phi_i \sin \phi_i \\ \sum_i \cos \phi_i \sin \phi_i & \sum_i (\sin \phi_i)^2 & \sum_i z_i \cos \phi_i \sin \phi_i & \sum_i z_i (\sin \phi_i)^2 \\ \sum_i z_i (\cos \phi_i)^2 & \sum_i z_i \cos \phi_i \sin \phi_i & \sum_i (z_i \cos \phi_i)^2 & \sum_i z_i^2 \cos \phi_i \sin \phi_i \\ \sum_i z_i \cos \phi_i \sin \phi_i & \sum_i z_i (\sin \phi_i)^2 & \sum_i z_i^2 \cos \phi_i \sin \phi_i & \sum_i (z_i \sin \phi_i)^2 ) \end{align*}

さらに, rank(H)=4\mathrm{rank}(H)=4ならばNNは正定値であるから, Cholesky分解を利用して Nθ^=gN \hat{\bm{\theta}} = \bm{g}を解くことができる.

各面の分解能が異なる場合

各面の測定分散をσi2\sigma_i^2とし, W=diag(1/σi2)W=\operatorname{diag}(1/\sigma_i^2)とすると, 重み付き最小二乗法で解くべき正規方程式は

HTWHθ^=HTWmH^\mathsf{T} W H\hat{\bm{\theta}} = H^\mathsf{T}W\bm{m}

となる. すべてのσi\sigma_iが同じ場合は, 定数倍を除いてW=IW=Iとみなせるため, ここで扱う等重みの式に帰着する.

注記

n×nn \times n 実対称行列 MM が正定値であるとは, 任意の非零ベクトル xRnx \in \mathbb{R}^n に対して次が成り立つことを意味する.

xTMx>0\bm{x}^\mathsf{T} M \bm{x} > 0

また, 次が成り立つとき, MM が半正定値であるという.

xTMx0\bm{x}^\mathsf{T} M \bm{x} \geq 0

今の場合, N=HTHN = H^\mathsf{T}H なので,

xTNx=xTHTHx=(Hx)T(Hx)=Hx20\bm{x}^\mathsf{T} N \bm{x} = \bm{x}^\mathsf{T} H^\mathsf{T} H \bm{x} = (H\bm{x})^\mathsf{T} (H\bm{x}) = \| H \bm{x} \|^2 \geq 0

となり, 半正定値であることがわかる. 加えて, track parameter (x,y,a,b)(x,y,a,b)を一意に決定できる面構成では rank(H)=4\mathrm{rank}(H)=4となるから,

Hx2>0\| H\bm{x} \|^2 > 0

が成り立ち, NNは実対称正定値行列である. 一方, hit数や面構成が不十分で rank(H)<4\mathrm{rank}(H)<4となる場合, NNは特異な半正定値行列となり, 通常のCholesky分解で track parameterを一意に求めることはできない.

Cholesky分解を使った解法

Cholesky分解とは正定値エルミート行列を下三角行列 LL と その共役転置 LL^* との積に分解することであり, LU分解の特殊な場合である. 今の場合, NN は実対称行列なので共役転置はただの転置となり, 次のように分解できる.

N=LLT=(l00000l10l1100l20l21l220l30l31l32l33)(l00l10l20l300l11l21l3100l22l32000l33)N = L L^\mathsf{T} = \mqty( l_{00} & 0 & 0 & 0 \\ l_{10} & l_{11} & 0 & 0 \\ l_{20} & l_{21} & l_{22} & 0 \\ l_{30} & l_{31} & l_{32} & l_{33} ) \mqty( l_{00} & l_{10} & l_{20} & l_{30} \\ 0 & l_{11} & l_{21} & l_{31} \\ 0 & 0 & l_{22} & l_{32} \\ 0 & 0 & 0 & l_{33} )

Cholesky分解を使うことのメリットは逆行列を計算せずに, Nθ^=gN \hat{\bm{\theta}} = \bm{g} を高速に解けることにある. Cholesky分解の方法については後で取り扱うこととして, まずはCholesky分解できたとして Nθ^=gN \hat{\bm{\theta}} = \bm{g} を解く.

まず中間ベクトルとして u=LTθ^\bm{u} = L^\mathsf{T} \hat{\bm{\theta}} とおくと, 解くべき方程式は次のような形になる.

Nθ^=LLTθ^=Lu=gN \hat{\bm{\theta}} = L L^\mathsf{T} \hat{\bm{\theta}} = L \bm{u} = \bm{g} (l00000l10l1100l20l21l220l30l31l32l33)(u0u1u2u3)=(g0g1g2g3)\Rightarrow \mqty( l_{00} & 0 & 0 & 0 \\ l_{10} & l_{11} & 0 & 0 \\ l_{20} & l_{21} & l_{22} & 0 \\ l_{30} & l_{31} & l_{32} & l_{33} ) \mqty( u_0 \\ u_1 \\ u_2 \\ u_3 ) = \mqty( g_0 \\ g_1 \\ g_2 \\ g_3 )

LL の下三角行列であるという性質がここで効力を発揮して, 上から順番に解いていくことができる.

l00u0=g0u0=g0l00l_{00} u_0 = g_0 \quad \Rightarrow \quad u_0 = \frac{g_0}{l_{00}} l10u0+l11u1=g1u1=g1l10u0l11l_{10} u_{0} + l_{11} u_{1} = g_1 \quad \Rightarrow \quad u_1 = \frac{g_1 - l_{10} u_{0}}{l_{11}} l20u0+l21u1+l22u2=g2u2=g2l21u1l20u0l22l_{20} u_{0} + l_{21} u_{1} + l_{22} u_{2} = g_2 \quad \Rightarrow \quad u_2 = \frac{g_2 - l_{21} u_1 - l_{20} u_{0}}{l_{22}} l30u0+l31u1+l32u2+l33u3=g3u3=g3l32u2l31u1l30u0l33l_{30} u_{0} + l_{31} u_{1} + l_{32} u_{2} + l_{33} u_{3} = g_3 \quad \Rightarrow \quad u_3 = \frac{g_3 - l_{32} u_{2} - l_{31} u_1 - l_{30} u_{0}}{l_{33}}

一般には, 次のように書ける.

ui=gij<ilijujliiu_i = \frac{ g_i - \sum_{j<i} l_{ij} u_j }{ l_{ii} }

これを前進代入と呼ぶ.

u\bm{u} が求まったので, 今度は LTθ^=uL^{\mathsf{T}} \hat{\bm{\theta}} = \bm{u} を解いていく.

(l00l10l20l300l11l21l3100l22l32000l33)(θ^0θ^1θ^2θ^3)=(u0u1u2u3)\mqty( l_{00} & l_{10} & l_{20} & l_{30} \\ 0 & l_{11} & l_{21} & l_{31} \\ 0 & 0 & l_{22} & l_{32} \\ 0 & 0 & 0 & l_{33} ) \mqty( \hat{\theta}_0 \\ \hat{\theta}_1 \\ \hat{\theta}_2 \\ \hat{\theta}_3 ) = \mqty( u_0 \\ u_1 \\ u_2 \\ u_3 )

今度は下から順番に解いていけば良い.

l33θ^3=u3θ^3=u3l33l_{33} \hat{\theta}_3 = u_3 \quad \Rightarrow \quad \hat{\theta}_3 = \frac{u_3}{l_{33}} l22θ^2+l32θ^3=u2θ^2=u2l32θ^3l22l_{22} \hat{\theta}_2 + l_{32} \hat{\theta}_3 = u_2 \quad \Rightarrow \quad \hat{\theta}_2 = \frac{u_2 - l_{32} \hat{\theta}_3}{l_{22}} l11θ^1+l21θ^2+l31θ^3=u1θ^1=u1l21θ^2l31θ^3l11l_{11} \hat{\theta}_1 + l_{21} \hat{\theta}_2 + l_{31} \hat{\theta}_3 = u_1 \quad \Rightarrow \quad \hat{\theta}_1 = \frac{u_1 - l_{21} \hat{\theta}_2 - l_{31} \hat{\theta}_3}{l_{11}} l00θ^0+l10θ^1+l20θ^2+l30θ^3=u0θ^0=u0l10θ^1l20θ^2l30θ^3l00l_{00} \hat{\theta}_0 + l_{10} \hat{\theta}_1 + l_{20} \hat{\theta}_2 + l_{30} \hat{\theta}_3 = u_0 \quad \Rightarrow \quad \hat{\theta}_0 = \frac{u_0 - l_{10} \hat{\theta}_1 - l_{20} \hat{\theta}_2 - l_{30} \hat{\theta}_3}{l_{00}}

一般には

θ^i=uij>iljiθ^jlii.\hat{\theta}_i = \frac{ u_i - \sum_{j>i} l_{ji} \hat{\theta}_j }{ l_{ii} }.

これを後退代入と呼ぶ.

こうして最小二乗解 θ^\hat{\bm{\theta}} を得ることができる.

変換行列 GG を用いた高速化

以上の手順を毎回行っても良いが, もう少し工夫するとより計算量を減らすことができる. もともと解くべき方程式は次であった.

Nθ^=HTmN\hat{\bm{\theta}} = H^\mathsf{T} \bm{m}

これを θ^\hat{\bm{\theta}} について解くと,

θ^=N1HTm=Gm\hat{\bm{\theta}} = N^{-1} H^\mathsf{T} \bm{m} = G \bm{m}

となる. ここで, G=N1HTG = N^{-1} H^\mathsf{T} とおいた. このような GG を求めておけば, m\bm{m} が得られたときに通常の行列計算ですぐに θ^\hat{\bm{\theta}} を得ることができる. Cholesky分解で得た LL を使ってこの GG を求める.

N=LLTN = LL^\mathsf{T} であるから,

NG=LLTG=HTNG = LL^\mathsf{T} G = H^\mathsf{T} (l00000l10l1100l20l21l220l30l31l32l33)(l00l10l20l300l11l21l3100l22l32000l33)(G00G01G0n1G10G11G1n1G20G21G2n1G30G31G3n1)=(cosϕ0cosϕ1cosϕn1sinϕ0sinϕ1sinϕn1z0cosϕ0z1cosϕ1zn1cosϕn1z0sinϕ0z1sinϕ1zn1sinϕn1)\begin{align*} \Rightarrow \mqty( l_{00} & 0 & 0 & 0 \\ l_{10} & l_{11} & 0 & 0 \\ l_{20} & l_{21} & l_{22} & 0 \\ l_{30} & l_{31} & l_{32} & l_{33} ) \mqty( l_{00} & l_{10} & l_{20} & l_{30} \\ 0 & l_{11} & l_{21} & l_{31} \\ 0 & 0 & l_{22} & l_{32} \\ 0 & 0 & 0 & l_{33} ) &\mqty( G_{00} & G_{01} & \cdots & G_{0 n-1} \\ G_{10} & G_{11} & \cdots & G_{1 n-1} \\ G_{20} & G_{21} & \cdots & G_{2 n-1} \\ G_{30} & G_{31} & \cdots & G_{3 n-1} ) \\ &= \mqty( \cos \phi_0 & \cos \phi_1 & \cdots & \cos \phi_{n-1} \\ \sin \phi_0 & \sin \phi_1 & \cdots & \sin \phi_{n-1} \\ z_0 \cos \phi_0 & z_1 \cos \phi_1 & \cdots & z_{n-1} \cos \phi_{n-1} \\ z_0 \sin \phi_0 & z_1 \sin \phi_1 & \cdots & z_{n-1} \sin \phi_{n-1} ) \end{align*}

となる. この形を見ればわかるように前進代入, 後退代入を各列に対して行うことで GG を得ることができる.

次のように UU をおく.

LTG=U=(u0,u1,,un1)L^\mathsf{T} G = U = (\bm{u}_0, \bm{u}_1, \cdots, \bm{u}_{n-1})

すると LU=HTLU=H^\mathsf{T} であるから, 各列に対して前進代入を行うことで UU を得ることができる.

(l00000l10l1100l20l21l220l30l31l32l33)(u0,u1,,un1)=HT\mqty( l_{00} & 0 & 0 & 0 \\ l_{10} & l_{11} & 0 & 0 \\ l_{20} & l_{21} & l_{22} & 0 \\ l_{30} & l_{31} & l_{32} & l_{33} ) (\bm{u}_0, \bm{u}_1, \cdots, \bm{u}_{n-1}) = H^\mathsf{T} Uij={Hj0L00(i=0)Hjik=0i1LikUkjLii(i>0)U_{ij} = \begin{cases} \frac{ H_{j0} }{ L_{00} } & (i=0) \\ \frac{ H_{ji} - \sum_{k=0}^{i-1} L_{ik} U_{kj} }{ L_{ii} } & (i>0) \end{cases}

次に 後退代入で GG を求める.

LTG=UL^\mathsf{T} G = U (l00l10l20l300l11l21l3100l22l32000l33)(G00G01G0n1G10G11G1n1G20G21G2n1G30G31G3n1)=(u0,u1,,un1)\mqty( l_{00} & l_{10} & l_{20} & l_{30} \\ 0 & l_{11} & l_{21} & l_{31} \\ 0 & 0 & l_{22} & l_{32} \\ 0 & 0 & 0 & l_{33} ) \mqty( G_{00} & G_{01} & \cdots & G_{0 n-1} \\ G_{10} & G_{11} & \cdots & G_{1 n-1} \\ G_{20} & G_{21} & \cdots & G_{2 n-1} \\ G_{30} & G_{31} & \cdots & G_{3 n-1} ) = (\bm{u}_0, \bm{u}_1, \cdots, \bm{u}_{n-1}) Gij={Uijk=i+13LkiGkjLii(i<3)U3jL33(i=3)G_{ij} = \begin{cases} \frac{ U_{ij} - \sum_{k=i+1}^{3} L_{ki} G_{kj} }{ L_{ii} } & (i<3) \\ \frac{ U_{3j} }{ L_{33} } & (i=3) \end{cases}

こうして GG を求めることができる. m\bm{m} が得られれば, GG をこれに乗ずることで, θ^\hat{\bm{\theta}} を得ることができる.

θ^=Gm\hat{\bm{\theta}} = G \bm{m}

Cholesky分解のアルゴリズム

Cholesky分解のアルゴリズムについて述べる. Cholesky分解にはいくつかの方法が存在するが, ここでは Cholesky-Crout法 (列指向) と呼ばれる方法を紹介する.

N=LLT=(l00000l10l1100l20l21l220l30l31l32l33)(l00l10l20l300l11l21l3100l22l32000l33)=(l002l00l10l00l20l00l30l00l10l102+l112l10l20+l11l21l10l30+l11l31l00l20l10l20+l11l21l202+l212+l222l20l30+l21l31+l22l32l00l30l10l30+l11l31l20l30+l21l31+l22l32l302+l312+l322+l332)\begin{align*} N &= L L^\mathsf{T} \\ &= \mqty( l_{00} & 0 & 0 & 0 \\ l_{10} & l_{11} & 0 & 0 \\ l_{20} & l_{21} & l_{22} & 0 \\ l_{30} & l_{31} & l_{32} & l_{33} ) \mqty( l_{00} & l_{10} & l_{20} & l_{30} \\ 0 & l_{11} & l_{21} & l_{31} \\ 0 & 0 & l_{22} & l_{32} \\ 0 & 0 & 0 & l_{33} ) \\ &= \mqty( l_{00}^2 & l_{00}l_{10} & l_{00}l_{20} & l_{00}l_{30} \\ l_{00}l_{10} & l_{10}^2+l_{11}^2 & l_{10}l_{20}+l_{11} l_{21} & l_{10}l_{30}+l_{11}l_{31} \\ l_{00}l_{20} & l_{10}l_{20}+l_{11}l_{21} & l_{20}^2+l_{21}^2+l_{22}^2 & l_{20}l_{30}+l_{21}l_{31}+l_{22}l_{32} \\ l_{00}l_{30} & l_{10}l_{30}+l_{11}l_{31} & l_{20}l_{30}+l_{21}l_{31}+l_{22}l_{32} & l_{30}^2+l_{31}^2+l_{32}^2+l_{33}^2 ) \end{align*}

1列目から取り掛かる. まず (0,0)(0,0) 成分は

N00=l002l00=N00N_{00} = l_{00}^2 \quad \Rightarrow \quad l_{00} = \sqrt{N_{00}}

l00l_{00}が分かったので, (1,0)(1,0), (2,0)(2,0), (3,0)(3,0) 成分から l10l_{10}, l20l_{20}, l30l_{30} を得ることができる.

N10=l00l10,N20=l00l20,N30=l00l30.N_{10} = l_{00} l_{10}, \quad N_{20} = l_{00} l_{20}, \quad N_{30} = l_{00} l_{30} . l10=N10N00,l20=N20N00,l30=N30N00.\Rightarrow l_{10} = \frac{N_{10}}{\sqrt{N_{00}}}, \quad l_{20} = \frac{N_{20}}{\sqrt{N_{00}}}, \quad l_{30} = \frac{N_{30}}{\sqrt{N_{00}}}.

こうして, 1列目が解けた.

L=(N00000N10N00?00N20N00??0N30N00???)L = \mqty( \sqrt{N_{00}} & 0 & 0 & 0\\ \frac{N_{10}}{\sqrt{N_{00}}} & ? & 0 & 0\\ \frac{N_{20}}{\sqrt{N_{00}}} & ? & ? & 0\\ \frac{N_{30}}{\sqrt{N_{00}}} & ? & ? & ? )

次に, 2列目に移る. (1,1)(1,1)成分から l11l_{11} を求めることができる.

N11=l102+l112N_{11} = l_{10}^2 + l_{11}^2 l11=N11l102l_{11} = \sqrt{N_{11} - l_{10}^2}

そして, 同じように (2,1)(2,1), (3,1)(3,1) 成分から l21l_{21}, l31l_{31} を求めることができる.

N21=l10l20+l11l21,N31=l10l30+l11l31.N_{21} = l_{10}l_{20}+l_{11}l_{21}, \quad N_{31} = l_{10}l_{30}+l_{11}l_{31}. l21=N21l10l20l11,l31=N31l10l30l11l_{21} = \frac{N_{21} - l_{10}l_{20}}{l_{11}}, \quad l_{31} = \frac{N_{31} - l_{10}l_{30}}{l_{11}}

これを繰り返すことで LL を得ることができる.

一般には jj 列の対角成分を

Ljj={N00(j=0)Njjk=0j1Ljk2(j>0)L_{jj} = \begin{cases} \sqrt{ N_{00} } & (j=0) \\ \sqrt{ N_{jj} - \sum_{k=0}^{j-1}L_{jk}^2 } & (j>0) \end{cases}

で求めた後に, 対角成分より下の要素を

Lij={NijLjj(j=0)Nijk=0j1LikLjkLjj(j>0)L_{ij} = \begin{cases} \frac{ N_{ij} }{ L_{jj} } & (j = 0) \\ \frac{ N_{ij} - \sum_{k=0}^{j-1} L_{ik}L_{jk} }{ L_{jj} } & (j > 0) \end{cases}

と求めることができる.

Left-Right Ambiguity

上記の手続きは m\bm{m} がわかったものとして解説しているが, 実際にはドリフトタイムからはドリフト長しか分からず, wireの左右どちらを通ったか分からない. このLRの組み合わせを識別しやすくするために, MWDCでは半セルずらした面構成を採用している場合が多い. ここではこのLRを解く手法について解説する.

この左右を解く最もシンプルな方法は全ての面に対してLR両方のパターンを総当たりで計算し, SSRが最小となる組み合わせを採用するというものである. Artemisの既存コードではこの手法が使われている. 適当に模擬コードを書いてみると以下のような感じになる. ここでは, 各面で使用するhitは一つに決まっており, LRだけが未決定であるとする. これをみてわかるように全ての面のLRのパターンに対してSSRを 2n2^n 回計算しており, これがDCのトラッキング上のボトルネックとなっている部分である. これを工夫して高速化する手法についてはまた今度取り扱う.

// 2進数の1をn bit左shiftすると値は2^nになる.
for (unsigned int i = 0; i < (1U << n); ++i) {
for (int p = 0; p != n; ++p) {
// ここは少しテクニカルだが, これで全ての符号パターンを走査できる.
int lr = ((i >> p) & 1) ? 1 : -1;
m[p] = cell_size * (wire_id[p] - center) + drift_length[p] * lr;
}
for (int q = 0; q != 4; ++q) {
theta[q] = inner_product(G[q], m); // θ̂ = Gm
}
const double SSR = calcSSR(m, theta);
if (SSR < minSSR) {
minSSR = SSR;
for (int q = 0; q != 4; ++q) {
best_theta[q] = theta[q];
}
}
}