EXSY(EXchange SpectroscpY)法

多次元NMR

EXSY法とは、化学交換(exchange)している核スピンのスペクトルを二次元NMRによって同定する測定手法である。この手法が使われるところはあまり見かけないが、多次元NMR法を理解しやすいパルスシーケンスとなっていると思う。

化学交換としては、分子運動によって立体配座が変わったり、化学的に二つの分子状態が遷移しているなどが考えられる。今回は、次のような状況を考える。

図: (左)今回考える化学交換によって分子Aと分子Bが互いに交換し合っている様子。(右)分子A由来の信号が左側のスペクトル、分子B由来の信号が右側のスペクトルとする。

ある分子が、化学交換によって二つの状態(分子Aと分子B)を取り、その状態によってある分子中の核スピンのスペクトルが別の位置に現れている様子を表している。
このような状態になる分子の例としては、ジメチルアセトアミドなどがある。(こちらを参照)

EXSYのパルスシーケンスは次のようなものが使われる。

図: EXSYのパルスシーケンス、3個の90°パルスからなる

このとき、化学交換(\(\tau\)の間に行われる)の速度は、FID信号の時間スケール(\(1/T_2^{\ast}\))よりもゆっくりで、縦磁化の緩和時間(\(1/T_1\))よりも早い必要がある。
このシーケンスで、\(\tau\)は固定時間であり、\(t_1\)を変えていった複数回の測定を行う。例えば、1回目は1\(\mu\)s、2回目は2\(\mu\)s、… N回目はN\(\mu\)s、… といったように 1\(\mu\)s毎に伸ばしたNMR測定を行う。

簡単のために、初期状態が分子Aで、時間\(\tau\)の間に完全に分子Bへと遷移する場合を考えてみる。得られるFID信号は以下のようなN個の信号が得られるだろう。

上の図から、時間間隔をあけて測定してくことで、\(t_2\)の間に得られるFID信号の強度と位相が変化しているのがわかると思う。

次に、上の核スピン状態の時間変化を具体的な数式を使って追ってみる。パルス照射前の状態として、

$$\rho(0)\sim p_A I_z+ p_B I_z $$

を考える。ここで、\(p_{A(B)}\)は状態A(B)を取っている分子の割合である。最初の90°パルス照射によってこの状態は、\( -p_A I_y- p_B I_y \)と変化する。\(t_1\)秒が経過すると、

$$\rho(0)\sim -p_A (I_y \cos(\omega_A t_1)- I_x \sin(\omega_A t_1)) – p_B (I_y \cos(\omega_B t_1) -I_x \sin(\omega_B t_1)) $$

となる。実際には\(T_2^{\ast}\)による緩和も存在するが、ここでは省略する。2度目の90°パルスが照射されると状態は、

$$\rho(t_1)\sim -p_A (I_z \cos(\omega_A t_1)- I_x \sin(\omega_A t_1)) – p_B (I_z \cos(\omega_B t_1) -I_x \sin(\omega_B t_1)) $$

この状態で、\(\tau\)秒間、時間発展する。この間に、静磁場に垂直な成分の\(T_2\)による緩和と(\(I_x, I_y\rightarrow0\))、分子の二つの状態間の交換が行われる。その結果、

$$\rho(t_1+\tau)\sim -p_{A\rightarrow B} (I_z \cos(\omega_A t_1)) – p_{A\rightarrow A} (I_z \cos(\omega_A t_1)) \\
– p_{B\rightarrow A} (I_z \cos(\omega_B t_1)) – p_{B\rightarrow B} (I_z \cos(\omega_B t_1)) $$

となる。\(p_{i\rightarrow j}\)は\(\tau\)秒間に状態が\(i\)から\(j\)へと遷移した分子の割合を表す。この後、最後の90°パルスによって\( p_{A\rightarrow A}, p_{B\rightarrow A}\)からは\(\omega_A\)で振動するFID信号が、 \( p_{A\rightarrow B}, p_{B\rightarrow B}\) からは\(\omega_B\)で振動するFID信号を取得することができる。

つまり、最終的に得られるFID信号としては、
周波数\(\omega_A\)の成分として\( p_{A\rightarrow A}\cos(\omega_A t_1) +p_{B\rightarrow A}\cos(\omega_B t_1)\)を、
周波数\(\omega_B\)の成分として\( p_{A\rightarrow B}\cos(\omega_A t_1) +p_{B\rightarrow B}\cos(\omega_B t_1)\)を、 得る。

得られたFID信号を\(t_1\)に対して図示していくと次のようになっている。

さらに、t1に対してフーリエ変換することで、2次元NMRスペクトルを取得することが可能となる。

さて、以上で大体の2次元NMRの取得方法を説明した。以下では、分子の状態A(4Hzの成分)と分子の状態B(-2Hzの成分)に対して、得られると思われる2次元NMRスペクトルをpythonを使って実際に計算してみた結果を載せる。

この図は下のpythonプログラムを使って作成された、興味があれば実行していただければより2次元NMRのイメージがわいてくると思う。

import numpy as np
import matplotlib.pyplot as plt

N = 2048  # サンプル数
dt1 = 0.001     # [s]
t1_evolve = np.arange(0, N*dt1, dt1)   # 時間 [s]
tau = 10    # [s]
dt2 = 0.001  # サンプリング周期 [s]
t2 = np.arange(0, N*dt2, dt2)   # 時間 [s]
f1, f2 = 4, -2    # 周波数シフト [Hz]
pA, pB = 0.7, 0.3 # 分子が状態AまたはBにいる確率
xi = 0.5 # 分子の状態が交換される確率

# EXSYによる時間発展
Iz0 = 1
# t1経過後のIzの実部と虚部
Izt1_re_A = pA*Iz0*np.cos(2*np.pi*t1_evolve*f1)*np.exp(-1*t1_evolve/0.4)
Izt1_im_A = pA*Iz0*np.sin(2*np.pi*t1_evolve*f1)*np.exp(-1*t1_evolve/0.4)
Izt1_re_B = pB*Iz0*np.cos(2*np.pi*t1_evolve*f2)*np.exp(-1*t1_evolve/0.4)
Izt1_im_B = pB*Iz0*np.sin(2*np.pi*t1_evolve*f2)*np.exp(-1*t1_evolve/0.4)

# 各t1に対するt2間のFID信号
Izt2_rere_AA = (1-xi)*np.array([Izt1_re_A[i]*np.cos(2*np.pi*f1*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_A))])
Izt2_reim_AA = (1-xi)*np.array([Izt1_re_A[i]*np.sin(2*np.pi*f1*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_A))])
Izt2_imre_AA = (1-xi)*np.array([Izt1_im_A[i]*np.cos(2*np.pi*f1*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_A))])
Izt2_imim_AA = (1-xi)*np.array([Izt1_im_A[i]*np.sin(2*np.pi*f1*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_A))])
Izt2_rere_AB = xi*np.array([Izt1_re_A[i]*np.cos(2*np.pi*f2*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_A))])
Izt2_reim_AB = xi*np.array([Izt1_re_A[i]*np.sin(2*np.pi*f2*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_A))])
Izt2_imre_AB = xi*np.array([Izt1_im_A[i]*np.cos(2*np.pi*f2*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_A))])
Izt2_imim_AB = xi*np.array([Izt1_im_A[i]*np.sin(2*np.pi*f2*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_A))])
Izt2_rere_BB = (1-xi)*np.array([Izt1_re_B[i]*np.cos(2*np.pi*f2*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_B))])
Izt2_reim_BB = (1-xi)*np.array([Izt1_re_B[i]*np.sin(2*np.pi*f2*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_B))])
Izt2_imre_BB = (1-xi)*np.array([Izt1_im_B[i]*np.cos(2*np.pi*f2*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_B))])
Izt2_imim_BB = (1-xi)*np.array([Izt1_im_B[i]*np.sin(2*np.pi*f2*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_B))])
Izt2_rere_BA = xi*np.array([Izt1_re_B[i]*np.cos(2*np.pi*f1*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_B))])
Izt2_reim_BA = xi*np.array([Izt1_re_B[i]*np.sin(2*np.pi*f1*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_B))])
Izt2_imre_BA = xi*np.array([Izt1_im_B[i]*np.cos(2*np.pi*f1*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_B))])
Izt2_imim_BA = xi*np.array([Izt1_im_B[i]*np.sin(2*np.pi*f1*t2)*np.exp(-1*t2/0.4) for i in range(len(Izt1_re_B))])

# フーリエ変換で得られるスペクトルの計算
freq = np.fft.fftfreq(N, d=dt2) # 周波数
# t1=iusにおけるt2のFFTスペクトルのcos成分
FFTt2real_FIDt1real_AA = np.array([np.fft.fft(Izt2_rere_AA[i]).real-np.fft.fft(Izt2_reim_AA[i]).imag for i in range(len(Izt2_rere_AA))])
FFTt2real_FIDt1imag_AA = np.array([np.fft.fft(Izt2_imre_AA[i]).real-np.fft.fft(Izt2_imim_AA[i]).imag for i in range(len(Izt2_imim_AA))])
FFTt2real_FIDt1real_AB = np.array([np.fft.fft(Izt2_rere_AB[i]).real-np.fft.fft(Izt2_reim_AB[i]).imag for i in range(len(Izt2_rere_AB))])
FFTt2real_FIDt1imag_AB = np.array([np.fft.fft(Izt2_imre_AB[i]).real-np.fft.fft(Izt2_imim_AB[i]).imag for i in range(len(Izt2_imim_AB))])
FFTt2real_FIDt1real_BB = np.array([np.fft.fft(Izt2_rere_BB[i]).real-np.fft.fft(Izt2_reim_BB[i]).imag for i in range(len(Izt2_rere_BB))])
FFTt2real_FIDt1imag_BB = np.array([np.fft.fft(Izt2_imre_BB[i]).real-np.fft.fft(Izt2_imim_BB[i]).imag for i in range(len(Izt2_imim_BB))])
FFTt2real_FIDt1real_BA = np.array([np.fft.fft(Izt2_rere_BA[i]).real-np.fft.fft(Izt2_reim_BA[i]).imag for i in range(len(Izt2_rere_BA))])
FFTt2real_FIDt1imag_BA = np.array([np.fft.fft(Izt2_imre_BA[i]).real-np.fft.fft(Izt2_imim_BA[i]).imag for i in range(len(Izt2_imim_BA))])

# 最終的に得られた二次元NMR信号のarray
FFTt2re_FFTt1re_AA = np.array([np.fft.fft((FFTt2real_FIDt1real_AA.T)[i]).real-np.fft.fft((FFTt2real_FIDt1imag_AA.T)[i]).imag for i in range(len(Izt2_rere_AA))])
FFTt2re_FFTt1re_AB = np.array([np.fft.fft((FFTt2real_FIDt1real_AB.T)[i]).real-np.fft.fft((FFTt2real_FIDt1imag_AB.T)[i]).imag for i in range(len(Izt2_rere_AB))])
FFTt2re_FFTt1re_BA = np.array([np.fft.fft((FFTt2real_FIDt1real_BA.T)[i]).real-np.fft.fft((FFTt2real_FIDt1imag_BA.T)[i]).imag for i in range(len(Izt2_rere_BA))])
FFTt2re_FFTt1re_BB = np.array([np.fft.fft((FFTt2real_FIDt1real_BB.T)[i]).real-np.fft.fft((FFTt2real_FIDt1imag_BB.T)[i]).imag for i in range(len(Izt2_rere_BB))])
FFTt2re_FFTt1re = FFTt2re_FFTt1re_AA + FFTt2re_FFTt1re_BA +FFTt2re_FFTt1re_AB +FFTt2re_FFTt1re_BB

# 二次元プロット用データを処理
list_for_2dplot = list(range(int(N/2), int(N))) + list(range(int(N/2)))
Plot_2D_FFT = (((FFTt2re_FFTt1re[:, list_for_2dplot])[list_for_2dplot,:])[int(63*N/128):int(65*N/128), int(63*N/128):int(65*N/128)])[::-1]

# 二次元プロット
plot = plt.imshow(Plot_2D_FFT, vmin=-0, vmax=50000, cmap=plt.cm.Reds, interpolation='bilinear', extent=[-500/64,500/64,-500/64,500/64])
plt.xlabel("F1 [Hz]")
plt.ylabel("F2 [Hz]")
plt.show()

コメント

タイトルとURLをコピーしました