Difference between revisions of "Relax disp.spin lock offset+field figure"

From relax wiki
Jump to navigation Jump to search
(→‎See also: Fix for the category.)
 
(10 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 +
{{lowercase title}}
 +
 +
__TOC__
 +
 
== Reference to original figure ==
 
== Reference to original figure ==
Comparing to Figure 1 and 10 the reference.
+
Comparing to Figure 1 and 10 the reference:
Palmer, A.G. & Massi, F. (2006). Characterization of the dynamics of biomacromolecules using rotating-frame spin relaxation NMR spectroscopy. Chem. Rev. 106, 1700-1719 [http://dx.doi.org/10.1021/cr04042875 | DOI: ]
+
 
 +
* {{#lst:Citations|PalmerMassi06}}
 +
 
 +
[[File:Fig1 Palmer Massi 2006.png|thumb|center|upright=4|Try to reproduce Figure 1.]]
  
 
== Script to produce figure ==
 
== Script to produce figure ==
<source lang="python">
+
 
 +
{{collapsible script
 +
| type  = Python script
 +
| title  = Reproduce figure 1 of Palmer and Massi, 2006 using matplotlib.
 +
| lang   = python
 +
| script =
 
#############
 
#############
 
# Made by Troels E. Linnet
 
# Made by Troels E. Linnet
Line 110: Line 122:
 
         label = labels[i]
 
         label = labels[i]
 
         label.xy = tX[i],tY[i]
 
         label.xy = tX[i],tY[i]
 +
        label.update_positions(fig.canvas.renderer)
 +
    tX_t, tY_t, _ = proj3d.proj_transform(dataX_t, dataY_t, dataZ_t, ax.get_proj())
 +
    for i in range(len(dataX_t)):
 +
        label = labels_t[i]
 +
        label.xy = tX_t[i],tY_t[i]
 
         label.update_positions(fig.canvas.renderer)
 
         label.update_positions(fig.canvas.renderer)
 
     fig.canvas.draw()
 
     fig.canvas.draw()
Line 116: Line 133:
 
#########
 
#########
  
fig = plt.figure()
+
fig = plt.figure(figsize=(12, 12))
 
ax=fig.gca(projection='3d')
 
ax=fig.gca(projection='3d')
  
Line 129: Line 146:
 
ax.add_patch(circle)
 
ax.add_patch(circle)
 
#art3d.pathpatch_2d_to_3d(circle, z=0, zdir='y')
 
#art3d.pathpatch_2d_to_3d(circle, z=0, zdir='y')
pathpatch_2d_to_3d(circle, z=0, normal = (1, 0, 1) )
+
pathpatch_2d_to_3d(circle, z=0, normal = [1, 0, 1] )
 +
 
  
 +
#######
 
#Input 3D Data for Text
 
#Input 3D Data for Text
#                  Sx       Sy      Sx        Szp            Sxp          w1        O1            we1        O_av          w_e
+
Sx = [1,0,0]
data = np.array([[1,0,0], [0,-1,0], [0,0,1], [0.975,0,1.17], [0.75,0,-0.75], [0.7,0,0], [0,0,0.3], [0.7,0,0.3], [0.0,0,0.84], [0.7,0,0.84]])
+
Sy = [0,-1,0]
 +
Sz = [0,0,1]
 +
Szp = [1.1,0,1.1]
 +
Sxp = [0.75,0,-0.75]
 +
w1 = [0.7,0,0]
 +
O1 = [0,0,0.3]
 +
we1 = [w1[0],0,O1[2]]
 +
O_av = [0.0,0,Szp[2]/Szp[0]*w1[0]]
 +
we = [w1[0],0,Szp[2]/Szp[0]*w1[0]]
 +
 
 +
data = np.array([Sx, Sy, Sz , Szp , Sxp, w1, O1, we1, O_av, we])
 
textlab = [r"S$_x$", r"S$_y$=S$_y$'", r"S$_z$", r"S$_z$'", r"S$_x$'", r"$\omega_1$", r"$\Omega_1$", r"$\omega_{e1}$", r"$\bar{\Omega}$", r"$\omega_{e}$"]
 
textlab = [r"S$_x$", r"S$_y$=S$_y$'", r"S$_z$", r"S$_z$'", r"S$_x$'", r"$\omega_1$", r"$\Omega_1$", r"$\omega_{e1}$", r"$\bar{\Omega}$", r"$\omega_{e}$"]
  
Line 149: Line 178:
 
#Array of labels
 
#Array of labels
 
labels = []
 
labels = []
 
 
#Loop through data points to initially annotate scatter plot
 
#Loop through data points to initially annotate scatter plot
 
#and populate labels array
 
#and populate labels array
Line 157: Line 185:
 
     label = ax.annotate(text,
 
     label = ax.annotate(text,
 
             xycoords='data',
 
             xycoords='data',
             xy = (tX[i], tY[i]), xytext = (-20, 20),
+
             xy = (tX[i], tY[i]), xytext = (+20, -20),
 
             textcoords = 'offset points', ha = 'right', va = 'top', fontsize=12,
 
             textcoords = 'offset points', ha = 'right', va = 'top', fontsize=12,
 
             bbox = dict(boxstyle = 'round,pad=0.5', fc = 'grey', alpha = 0.8),
 
             bbox = dict(boxstyle = 'round,pad=0.5', fc = 'grey', alpha = 0.8),
 
             arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))
 
             arrowprops = dict(arrowstyle = '->', connectionstyle = 'arc3,rad=0'))
 
     labels.append(label)
 
     labels.append(label)
 +
#######
 +
 +
#######
 +
#Input 3D Data for Ttheta
 +
 +
t1 = [0.5*we1[0],0,0.5*we1[2]]
 +
t = [0.5*we[0],0,0.5*we[2]]
 +
 +
data_t = np.array([t1, t])
 +
textlab_t = [r"$\theta_1$", r"$\theta$"]
 +
 +
#Separate into X, Y, Z for greater clarity
 +
dataX_t = data_t[:,0]
 +
dataY_t = data_t[:,1]
 +
dataZ_t = data_t[:,2]
 +
 +
#3D scatter plot
 +
ax.scatter(dataX_t, dataY_t, dataZ_t, marker = 'o', c='k', s=1)
 +
 +
#Transform co-ordinates to get initial 2D projection
 +
tX_t, tY_t, _ = proj3d.proj_transform(dataX_t, dataY_t, dataZ_t, ax.get_proj())
 +
 +
#Array of labels
 +
labels_t = []
 +
#Loop through data points to initially annotate scatter plot
 +
#and populate labels array
 +
for i in range(len(dataX_t)):
 +
    #text='['+str(int(dataX[i]))+','+str(int(dataY[i]))+','+str(int(dataZ[i]))+']'
 +
    text=textlab_t[i]
 +
    label = ax.annotate(text,
 +
            xycoords='data',
 +
            xy = (tX[i], tY[i]), xytext = (-100, 50),
 +
            textcoords = 'offset points', ha = 'right', va = 'top', fontsize=12,
 +
            bbox = dict(boxstyle = 'round,pad=0.5', fc = 'grey', alpha = 0.8),
 +
            arrowprops = dict(arrowstyle = '->', connectionstyle = 'angle3,angleA=0,angleB=90'))
 +
    labels_t.append(label)
 +
#######
 +
 +
  
 
# Make Sx
 
# Make Sx
i = 0
+
x, y, z = Sx
Sx = Arrow3D([-1, dataX[i]],[0, dataY[i]], [0, dataZ[i]], mutation_scale=20, lw=1, arrowstyle="-|>", color="k")
+
Sx = Arrow3D([-1, x],[0, y], [0, z], mutation_scale=20, lw=1, arrowstyle="-{{!}}>", color="k")
 
ax.add_artist(Sx)
 
ax.add_artist(Sx)
  
 
# Make Sy
 
# Make Sy
i += 1
+
x, y, z = Sy
Sy = Arrow3D([0, dataX[i]],[1, dataY[i]], [0, dataZ[i]], mutation_scale=20, lw=1, arrowstyle="-|>", color="k")
+
fSy = Arrow3D([0, x],[1, y], [0, z], mutation_scale=20, lw=1, arrowstyle="-{{!}}>", color="k")
ax.add_artist(Sy)
+
ax.add_artist(fSy)
  
 
# Make Sz
 
# Make Sz
i += 1
+
x, y, z = Sz
Sz = Arrow3D([0, dataX[i]],[0, dataY[i]], [-1, dataZ[i]], mutation_scale=20, lw=1, arrowstyle="-|>", color="k")
+
fSz = Arrow3D([0, x],[0, y], [-1, z], mutation_scale=20, lw=1, arrowstyle="-{{!}}>", color="k")
ax.add_artist(Sz)
+
ax.add_artist(fSz)
  
 
# Make Szp
 
# Make Szp
i += 1
+
x, y, z = Szp
Szp = Arrow3D([0, dataX[i]],[0, dataY[i]], [0, dataZ[i]], mutation_scale=20, lw=3, arrowstyle="-|>", color="k")
+
fSzp = Arrow3D([0, x],[0, y], [0, z], mutation_scale=20, lw=3, arrowstyle="-{{!}}>", color="k")
ax.add_artist(Szp)
+
ax.add_artist(fSzp)
  
 
# Make Sxp
 
# Make Sxp
i += 1
+
x, y, z = Sxp
Sxp = Arrow3D([0, dataX[i]],[0, dataY[i]], [0, dataZ[i]], mutation_scale=20, lw=3, arrowstyle="-|>", color="k")
+
fSxp = Arrow3D([0, x],[0, y], [0, z], mutation_scale=20, lw=3, arrowstyle="-{{!}}>", color="k")
ax.add_artist(Sxp)
+
ax.add_artist(fSxp)
  
 
# Make w1
 
# Make w1
i += 1
+
x, y, z = w1
w1 = Arrow3D([0, dataX[i]],[0, dataY[i]], [0, dataZ[i]], mutation_scale=20, lw=1, arrowstyle="-", color="k")
+
fw1 = Arrow3D([0, x],[0, y], [0, z], mutation_scale=20, lw=1, arrowstyle="-", color="k")
ax.add_artist(w1)
+
ax.add_artist(fw1)
  
 
# Make O1
 
# Make O1
i += 1
+
x, y, z = O1
O1 = Arrow3D([0, dataX[i]],[0, dataY[i]], [0, dataZ[i]], mutation_scale=20, lw=1, arrowstyle="-", color="k")
+
fO1 = Arrow3D([0, x],[0, y], [0, y], mutation_scale=20, lw=1, arrowstyle="-", color="k")
ax.add_artist(O1)
+
ax.add_artist(fO1)
  
 
# Make we1
 
# Make we1
i += 1
+
x, y, z = we1
we1 = Arrow3D([0, dataX[i]],[0, dataY[i]], [0, dataZ[i]], mutation_scale=20, lw=1, arrowstyle="-|>", color="b")
+
fwe1 = Arrow3D([0, x],[0, y], [0, z], mutation_scale=20, lw=1, arrowstyle="-{{!}}>", color="b")
ax.add_artist(we1)
+
ax.add_artist(fwe1)
 +
 
 +
# Make O1 -> we1
 +
fO1_we1 = Arrow3D([O1[0], we1[0]],[O1[1], we1[1]], [O1[2], we1[2]], mutation_scale=20, lw=1, arrowstyle="-", color="b")
 +
ax.add_artist(fO1_we1)
  
 
# Make O_av
 
# Make O_av
i += 1
+
x, y, z = O_av
O_av = Arrow3D([0, dataX[i]],[0, dataY[i]], [0, dataZ[i]], mutation_scale=20, lw=1, arrowstyle="-", color="k")
+
fO_av = Arrow3D([0, x],[0, y], [0, z], mutation_scale=20, lw=1, arrowstyle="-", color="k")
ax.add_artist(O_av)
+
ax.add_artist(fO_av)
  
 
# Make we
 
# Make we
i += 1
+
x, y, z = we
we = Arrow3D([0, dataX[i]],[0, dataY[i]], [0, dataZ[i]], mutation_scale=20, lw=1, arrowstyle="-|>", color="r")
+
fwe = Arrow3D([0, x],[0, y], [0, z], mutation_scale=20, lw=1, arrowstyle="-{{!}}>", color="r")
ax.add_artist(we)
+
ax.add_artist(fwe)
 +
 
 +
# Make w1 -> we
 +
fw1_we = Arrow3D([w1[0], we[0]],[w1[1], we[1]], [w1[2], we[2]], mutation_scale=20, lw=1, arrowstyle="-", color="r")
 +
ax.add_artist(fw1_we)
 +
 
 +
# Make O_ave -> we
 +
fO_av_we = Arrow3D([O_av[0], we[0]],[O_av[1], we[1]], [O_av[2], we[2]], mutation_scale=20, lw=1, arrowstyle="-", color="r")
 +
ax.add_artist(fO_av_we)
  
  
Line 220: Line 299:
 
fig.canvas.mpl_connect('button_release_event', update_position)
 
fig.canvas.mpl_connect('button_release_event', update_position)
 
plt.show()
 
plt.show()
</source>
+
}}
 +
 
 +
== See also ==
 +
 
 +
[[Category:Relaxation dispersion analysis]]

Latest revision as of 17:35, 6 November 2015


Reference to original figure

Comparing to Figure 1 and 10 the reference:

  • Palmer, 3rd, A. G. and Massi, F. (2006). Characterization of the dynamics of biomacromolecules using rotating-frame spin relaxation NMR spectroscopy. Chem. Rev., 106(5), 1700-1719. (DOI: 10.1021/cr0404287)
Try to reproduce Figure 1.

Script to produce figure

See also