Understanding DARR with simulation#

While SLEEPY is mainly intended for predicting relaxation behavior or observing the influence of relaxation on a spin-system, it is also useful for simplifying other experiments by replacing diffusion-like behavior resulting from many spins with an artificial diffusion term in the Liouvillian. For example, some NMR experiments rely on spin-diffusion within the dense \(^1\)H network to induce broadening on heteronuclei which then drives spin-diffusion among the heteronuclei. The prime examples of this are the Proton-Driven Spin-Diffusion experiment (PDSD) and the Dipolar Assisted Rotational Resonance (DARR) experiments.

DARR is the homonuclear (\(^{13}\)C-\(^{13}\)C) transfer of longitudinal magnetization, enabled by broadening of the Rotary Resonance (R\(^2\)) condition. Broadening of the R\(^2\) condition is achieved via reintroduction of a heteronuclear dipole coupling (\(^1\)H-\(^{13}\)C) to the homonuclear spins by satisfying the Rotary Resonance Recoupling (R\(^3\)) condition.

We will achieve a DARR transfer by artificially broadening the \(^1H\) line using relaxation settings in SLEEPY. Note that it is also possible to introduce a large number of \(^1\)H spins (10) which will also give rise to the required broadening. The latter approach has been demonstrated in SpinEvolution by Veshtort and Griffin.

We will take several steps to piece together the DARR experiment.

A. Static experiments

  1. Simulate \(^{13}\)C–\(^{13}\)C transfer occuring via homonuclear dipole couplings, where the two spins have the same resonance frequency (resonant transfer).

  2. Simulate \(^{13}\)C–\(^{13}\)C transfer occuring via homonuclear dipole couplings, where the two spins have different resonance frequencies and have an intrinsic linewidth due to \(T_2\).

  3. Simulate \(^{13}\)C–\(^{13}\)C transfer occuring via homonuclear dipole couplings, where the two spins have different resonance frequencies and have an intrinsic linewidth induced by coupling to \(^1\)H. B. Experiments under MAS

  4. Simulate \(^{13}\)C–\(^{13}\)C transfer occuring via homonuclear dipole couplings, where the two spins are separated by the rotor frequency.

  5. Simulate \(^{13}\)C–\(^{13}\)C transfer occuring via homonuclear dipole couplings, where the two spins have resonance frequencies not separated by the rotor frequency, but have an intrinsic linewidth due to \(T_2\).

  6. Simulate \(^{13}\)C–\(^{13}\)C transfer occuring via homonuclear dipole couplings, where the two spins have resonance frequencies not separated by the rotor frequency, but have an intrinsic linewidth induced by coupling to \(^1\)H.

  7. Simulate \(^{13}\)C–\(^{13}\)C transfer occuring via homonuclear dipole couplings, where the two spins have resonance frequencies not separated by the rotor frequency, but have an intrinsic linewidth induced by coupling to \(^1\)H, which is broadened by satisfying the DARR condition.

References

DARR:

K. Takegoshi, S. Nakamura, T. Terao. Chem. Phys. Lett., 2001, 344, 631-637.

K. Takegoshi, S. Nakamura, T. Terao. J. Chem. Phys., 2003, 118, 2325-2341.

Simulating DARR

M. Veshtort, R.G. Griffin. J. Chem. Phys., 2011, 135, 134509.

Rotary Resonance Recoupling:

T.G. Oas, R.G. Griffin, M.H. Levitt. J. Chem. Phys. 1988, 89, 692-695.

Rotational Resonance:

D.P. Raleigh, M.H. Levitt, R.G. Griffin. Chem. Phys. Lett., 1988, 146, 71-76.

E.R. Andrew, S. Clough, L.F. Farnell, T.D. Gledhill, I. Roberts. Phys. Letters, 1966, 21, 505-506.

E.R. Andrew, A. Bradbury, R.G. Eades, V.T. Wynn. Phys. Letters, 1963, 4, 99.

Setup#

import SLEEPY as sl
import matplotlib.pyplot as plt
import numpy as np

A. Static Experiments#

1) Transfer between coupled spins with same resonance frequency#

#C-C dipole, 2.5 Angstrom distance
dCC=sl.Tools.dipole_coupling(.25,'13C','13C',)
print(f'delta(C–C) = {dCC:.1f} Hz')

# Build the spin-system (two nuclei, no MAS, dipole coupled with no chemical shift)
ex=sl.ExpSys(v0H=600,Nucs=['13C','13C'],vr=0,pwdavg=sl.PowderAvg('zcw232'))
ex.set_inter('dipole',i0=0,i1=1,delta=dCC)

# Liouvillian
L=ex.Liouvillian()

# Pulse sequence (no sequence- just a time step)
Dt=1/50000 #20 microsecond timestep (we'll use 10 kHz MAS later with 5 steps per rotor cycle)
seq=L.Sequence().add_channel('13C',t=Dt)

# Initial density matrix/detection operator for spectrum
rho_spec=sl.Rho(rho0='13Cx',detect='13Cp')

# Initial density matrix/detection operator for transverse magnetization transfer
rho_zz=sl.Rho(rho0='S0z',detect=['S0z','S1z'])
delta(C–C) = 972.6 Hz
rho_spec.clear()
_=rho_spec.DetProp(seq,n=5000)
State-space reduction: 16->4
ax=rho_spec.plot(FT=True,apodize=True)
_=ax.set_xlim([-1,1])
../_images/1f9579c8bfebe525ecbbbd3bc8ad98e3de6925de0c28ec9d48621b1550622016.png
rho_zz.clear()
rho_zz.DetProp(seq,n=600)
State-space reduction: 16->6
Density Matrix/Detection Operator
rho0: S0z
detect[0]: S0z
detect[1]: S1z
Current time is 12000.000 microseconds
600 time points have been recorded

<SLEEPY.SLEEPY.Rho.Rho object at 0x7fbb781ae7f0>
_=rho_zz.plot()
../_images/2fd7636c1b11ee3572d4dae36ab16518bed451b21447bdd9adaacda0b03c9707.png

Above, we see the spectrum, which has a characteristic Pake-pattern, resulting from the dipole coupling between the two spins. Because the two spins have identical resonance frequencies, they mix, allowing the transfer of z-magnetization from one spin (\(S_{0z}\)) to the other spin (\(S_{1z}\)).

We can investigate the Hamiltonian driving this transfer more closely by plotting it.

_=L.H[0].plot(mode='re')
../_images/b5fe42fadfebb6ddebecfd9a2634fa2243a49c0a86f28f737e5ebe2b18534bc7.png

Spin magnetization transfers because the \(|1/2,-1/2\rangle\) and \(|-1/2,1/2\rangle\) states mix. This may also be observed in the Liouvillian, made easier to see by zooming in on the correct set of states:

fig,ax=plt.subplots(1,2)
L.plot(ax=ax[0],mode='abs',colorbar=False)
L.plot(block=4,ax=ax[1],mode='abs',colorbar=False)
_=fig.tight_layout()
../_images/e0c532acb0394877c3da8bdcc9269791d0b2e0211752d3099126ef0f9419bdf2.png

We see in the reduced space that \(S_1^\alpha S_2^\beta\) is driven into the zero- and double-quantum coherences by the dipole coupling, and subsequently arrives in \(S_1^\beta S_2^\alpha\), which is a transfer of magnetization from spin 1 to spin 2.

2) Transfer between coupled spins with different resonance frequency#

In the next step, we consider what happens if the two spins are separate by a few ppm (10 ppm, resulting in a 10x150=1500 Hz separation).

# We keep working with the previous spin-system, so we just need to add the chemical shifts
ex.set_inter('CS',i=0,ppm=5)
ex.set_inter('CS',i=1,ppm=-5)

# The following components need to be rebuilt for the new edited spin-system
# Liouvillian
L=ex.Liouvillian()

# Pulse sequence (no sequence- just a time step)
Dt=1/50000 #20 microsecond timestep (we'll use 10 kHz MAS later with 5 steps per rotor cycle)
seq=L.Sequence().add_channel('13C',t=Dt)

# Initial density matrix/detection operator for spectrum
rho_spec=sl.Rho(rho0='13Cx',detect='13Cp')

# Initial density matrix/detection operator for transverse magnetization transfer
rho_zz=sl.Rho(rho0='S0z',detect=['S0z','S1z'])
rho_spec.clear()
_=rho_spec.DetProp(seq,n=5000)
State-space reduction: 16->4
ax=rho_spec.plot(FT=True,apodize=True,axis='ppm')
_=ax.set_xlim([-15,15])
../_images/406e78d7548ca8fe9b2ffa8cc9580bbc000973286ab096ecab971cc08796c9bf.png

Now, we observe to separated Pake-patterns, separated by roughly 10 ppm.

rho_zz.clear()
_=rho_zz.DetProp(seq,n=6000)
State-space reduction: 16->6
_=rho_zz.plot()
../_images/b4a6b527c917aa62e0dba16a24e3e5e2e4f34b8d7aeaeadcf95337358402c906.png

The separation in resonance frequency quenches the transfer between spins. This can be understood by observing the impact on the Hamiltonian. While the dipole coupling is not gone, it is now smaller than the difference in chemical shift, so that the states no longer mix.

_=L[50].H[0].plot(mode='re')
../_images/d67f677eaa1c2b82be9b6851c36e517f51a972303d079b5307bbd04da9d3eb6b.png

However, what would happen if some \(T_2\) broadening is introduced to the two spins, such that there is a small amount of overlap?

L.add_relax(Type='T2',i=0,T2=.002)
L.add_relax(Type='T2',i=1,T2=.002)

seq=L.Sequence().add_channel('13C',t=100*Dt) # Transfer is a lot slower, so take bigger steps

rho_zz.clear()
_=rho_zz.DetProp(seq,n=500)
State-space reduction: 16->6
_=rho_zz.plot(axis='ms')
../_images/867db86c290455478d4905beb9ab0f658c4636648fc3a3fa6fa313c684ed67e6.png

As we see, the transfer is reintroduced, although it is considerably slower, and no longer coherent.

3) Transfer between coupled spins with different resonance frequency, coupled to a flipping \(^1\)H#

We often refer to \(^{13}C\)-\(^{13}C\) transfer without a field applied to \(^1\)H as Proton-Driven Spin-Diffusion (PDSD). But what does this transfer have to do with protons? It turns out that the broadening required for the transfer may be provided indirectly by a coupling to \(^1\)H that undergoes flipping.

For this experiment, then, we need to add another spin. We’ll add a one-bond H–C dipole coupling to one of the two \(^{13}\)C. We start without flipping on the \(^1H\), but then introduce it in a subsequent step.

dHC=sl.Tools.dipole_coupling(.11,'1H','13C')

# Build the spin-system (two nuclei, no MAS, dipole coupled with no chemical shift)
ex=sl.ExpSys(v0H=600,Nucs=['13C','13C','1H'],vr=0,pwdavg=sl.PowderAvg('zcw232'))
ex.set_inter('dipole',i0=0,i1=1,delta=dCC)
ex.set_inter('dipole',i0=0,i1=2,delta=dHC,euler=[0,np.pi/4,0]) 
#Couplings usually shouldn't be colinear

# Liouvillian
L=ex.Liouvillian()

# Pulse sequence (no sequence- just a time step)
Dt=1/50000 #20 microsecond timestep (we'll use 10 kHz MAS later with 5 steps per rotor cycle)
seq=L.Sequence().add_channel('13C',t=Dt)

# Initial density matrix/detection operator for spectrum
rho_spec=sl.Rho(rho0='13Cx',detect='13Cp')

# Initial density matrix/detection operator for transverse magnetization transfer
rho_zz=sl.Rho(rho0='S0z',detect=['S0z','S1z'])
seq=L.Sequence().add_channel('13C',t=Dt) # Transfer is a lot slower, so take bigger steps

rho_spec.clear()
rho_spec.DetProp(seq,n=15000)

rho_zz.clear()
_=rho_zz.DetProp(seq,n=500*100)
State-space reduction: 64->8
State-space reduction: 64->12
rho_spec.apod_pars['LB']=1000
_=rho_spec.plot(FT=True,apodize=True)
../_images/d03f8c9a32d5f6eb8dd6b88c93ef29ecaa6dfb9a4b17bf9e9b69fb736a20fa6c.png
_=rho_zz.plot()
../_images/8eae97970648e41dc925edfd5ffaae82afeb1963252fba2fef1a3f22440cfc68.png

The \(^1\)H dipole coupling alone is insufficient to drive a transfer, but if the \(^1\)H undergoes flipping due to spin diffusion, then the transfer occurs.

L.add_relax(Type='SpinDiffusion',i=2,k=300) #Spin-diffusion on 1H

rho_spec.clear()
rho_spec.DetProp(seq,n=15000)

rho_zz.clear()
_=rho_zz.DetProp(seq,n=50000)
State-space reduction: 64->8
State-space reduction: 64->12
_=rho_spec.plot(FT=True,apodize=True)
../_images/9d1d81b5ad3293b40860de2b2e21aefec217179f84c002fbedec66e19a90c650.png
_=rho_zz.plot()
../_images/755656cda432946f10f597a460fed0d1300fe6ec374979120a57b07803c63218.png

B. Magic-Angle Spinning Experiments#

Previously, we found that two dipole-coupled spins with the same chemical shift resulted in transfer of longitudinal magnetization between them. Here, we test if the same principle applies under magic angle spinning (10 kHz).

1) Transfer when two spins are separated by the rotor frequency#

# Build the spin-system (two nuclei, no MAS, dipole coupled with no chemical shift)
ex=sl.ExpSys(v0H=600,Nucs=['13C','13C'],vr=10000)
ex.set_inter('dipole',i0=0,i1=1,delta=dCC)

# Liouvillian
L=ex.Liouvillian()

# Pulse sequence (no sequence- just a time step)
seq=L.Sequence()  #Sequence defaults to 1 rotor period when spinning

# Initial density matrix/detection operator for spectrum
rho_spec=sl.Rho(rho0='13Cx',detect='13Cp')

# Initial density matrix/detection operator for transverse magnetization transfer
rho_zz=sl.Rho(rho0='S0z',detect=['S0z','S1z'])
rho_spec.DetProp(seq,n=15000)
_=rho_zz.DetProp(seq,n=1000)
State-space reduction: 16->4
State-space reduction: 16->6
_=rho_spec.plot(FT=True,apodize=True)
../_images/f0c6a11e455ccbcf9db7c5f86e02f54cd255b435131f6d5a191c075bb670905b.png
_=rho_zz.plot()
../_images/48346dcb5777f4a4a6d7cbbf1d0b048398fa767a72c1a354df18077193a5a1f3.png

Magic angle spinning quenches the transfer by averaging the dipole coupling to zero. On the other hand, if the spins are separated by the MAS frequency (i.e. the \(R^2\) condition), the coupling is reintroduced

DelCS=10000/(600*sl.Tools.NucInfo('13C')/sl.Tools.NucInfo('1H'))
ex.set_inter('CS',i=0,ppm=DelCS/2)
ex.set_inter('CS',i=1,ppm=-DelCS/2)

# Liouvillian
L=ex.Liouvillian()

# Pulse sequence (no sequence- just a time step)
seq=L.Sequence()  #Sequence defaults to 1 rotor period when spinning

# Initial density matrix/detection operator for spectrum
rho_spec=sl.Rho(rho0='13Cx',detect='13Cp')

# Initial density matrix/detection operator for transverse magnetization transfer
rho_zz=sl.Rho(rho0='S0z',detect=['S0z','S1z'])
_=rho_spec.DetProp(seq,n=5000,n_per_seq=2)
State-space reduction: 16->4
Prop: 2 steps per every 1 rotor period
_=rho_spec.plot(FT=True,apodize=True)
../_images/48e3bb8eb72199f41067891ac2a809ba57ef341aec34fbcd92c83f8bcad71ddc.png

Matching the rotational resonance condition distorts the spectrum by reintroducing the dipole coupling.

rho_zz.clear()
_=rho_zz.DetProp(seq,n=100)
State-space reduction: 16->6
_=rho_zz.plot()
../_images/163ba66a8fc4d765dcae3c5c8ae2cab32f0f53435d6b8d28e34beed6385aa632.png

The rotational resonance condition induces a transfer, but it also distorts the spectrum, and furthermore can only be matched for one pair of spins at a time. So, we move off the rotational resonance condition.

ex.set_inter('CS',i=0,ppm=-15) #Shift away from rotational resonance
ex.set_inter('CS',i=1,ppm=15) #Shift away from rotational resonance

# Liouvillian
L=ex.Liouvillian()

# Pulse sequence (no sequence- just a time step)
seq=L.Sequence()  #Sequence defaults to 1 rotor period when spinning

# Initial density matrix/detection operator for spectrum
rho_spec=sl.Rho(rho0='13Cx',detect='13Cp')

# Initial density matrix/detection operator for transverse magnetization transfer
rho_zz=sl.Rho(rho0='S0z',detect=['S0z','S1z'])
_=rho_spec.DetProp(seq,n=5000,n_per_seq=2)
State-space reduction: 16->4
Prop: 2 steps per every 1 rotor period
_=rho_spec.plot(FT=True,apodize=True)
../_images/bbe874d751d54de87a5d6fa6ce40bce5dd0f3db3d9a4a97fdac5547c32fb4c1e.png

Away from rotational resonance, our spectrum looks nicer, but what happens to our transfer?

rho_zz.clear()
_=rho_zz.DetProp(seq,n=1500)
State-space reduction: 16->6
_=rho_zz.plot()
../_images/6d2703bd04ccfdcda1e36d904c19cefbf17d8e5aff8f070803061dbf317232b8.png

Not surprisingly, the transfer is quenched. It can be reintroduced by broadening of the \(^{13}\)C resonance

2) Transfer between spins away from rotary resonance, broadened by T\(_2\)#

L.clear_relax()
L.add_relax(Type='T2',i=0,T2=.001)
_=L.add_relax(Type='T2',i=1,T2=.001)
rho_zz.clear()
_=rho_zz.DetProp(seq,n=15000)
State-space reduction: 16->6
_=rho_zz.plot()
../_images/0e05e38527674479532bea9b4a71540eb0a60a89dfe6606e99d0a80ae7cb9437.png

Then, can we achieve the same affect by coupling to a \(^1\)H?

3) Transfer between spins away from rotary resonance, broadened by coupled \(^1\)H#

# Build the spin-system (two nuclei, no MAS, dipole coupled with no chemical shift)
ex=sl.ExpSys(v0H=600,Nucs=['13C','13C','1H'],vr=10000)
ex.set_inter('dipole',i0=0,i1=1,delta=dCC)
ex.set_inter('dipole',i0=0,i1=2,delta=dHC,euler=[0,np.pi/4,0])
ex.set_inter('CS',i=0,ppm=15)
ex.set_inter('CS',i=1,ppm=-15)

# Liouvillian
L=ex.Liouvillian()
L.add_relax('SpinDiffusion',i=2,k=300)

# Pulse sequence (no sequence- just a time step)
seq=L.Sequence()

# Initial density matrix/detection operator for transverse magnetization transfer
rho_zz=sl.Rho(rho0='S0z',detect=['S0z','S1z'])
_=rho_zz.DetProp(seq,n=15000)
State-space reduction: 64->12
_=rho_zz.plot()
../_images/9bf31b006b0274ee4e0c05fbe8fd9dd18f8b00b200ebdeffd609ae962b484c41.png

Some transfer occurs, although it is not particularly efficient. We finally want to understand what happens if we introduce a field on the \(^1\)H matching the rotary resonance recoupling (R\(^3\)) condition

Transfer between spins not on rotary resonance, broadened by irradiation of protons.#

First, we observe the \(^{13}\)C spectrum with \(^1\)H cw decoupling, first away from the rotary resonance recoupling condition, and then on the condition. Lines mark the resonance frequency of the first \(^{13}\)C and the distance to the corresponding rotational resonance condition.

rho_spec=sl.Rho(rho0='13Cx',detect='13Cp')
_=rho_spec.DetProp(seq,n=5000,n_per_seq=5)
State-space reduction: 64->8
Prop: 5 steps per every 1 rotor period
_=rho_spec.plot(FT=True,apodize=True)
../_images/118318b53d027f767e0848514cefd9d151d6c1acc2a2ada08519d2ac09912eed.png
seq.add_channel('1H',v1=10000)
rho_spec.clear()
_=rho_spec.DetProp(seq,n=25000,n_per_seq=5)
State-space reduction: 64->16
Prop: 5 steps per every 1 rotor period
rho_spec.apod_pars['LB']=200
ax=rho_spec.plot(FT=True,apodize=True)
../_images/2f127b6b888a22759594a4a26e42455751ef4c128641a1f43757219b6dca203a.png
rho_spec.apod_pars['LB']=500
ax=rho_spec.plot(FT=True,apodize=True)
ax.set_ylim([0,1])
CS=-15*ex.v0[0]/1e9
ax.plot([CS,CS],ax.get_ylim(),color='grey',linestyle=':')
_=ax.plot([CS+10,CS+10],ax.get_ylim(),color='grey',linestyle=':')
../_images/f5d8c4129fab2d40040336fedb667f3b94fd80c9b205051791b3f8b1b50c3bcd.png
rho_zz.clear()
_=rho_zz.DetProp(seq,n=15000)
State-space reduction: 64->24
_=rho_zz.plot()
../_images/830dbcabc24e0a3e7053401b3abb438bfff7b16c289cc5b166770569129bf820.png

Then, we see how broadening the C-C R\(^2\) condition via recoupling the H–C dipole coupling with R\(^3\) allows for C-C spin-diffusion to occur. This is also a convenient way to achieve the required broadening, since to recover an unbroadened spectrum, we must simply remove the field from the \(^1\)H channel (or better yet, apply heteronuclear decoupling).