Friday, October 17, 2008

Kinetic Experiments on Bruker Spectrometers

Students often have to monitor the progress of a chemical reaction as a function of time using NMR spectroscopy. I have written three simple programs for XWINNMR (which should work with little or no modification for TOPSPIN). Each program uses a different method to control the time allowed between collecting spectra. All are very simple and easily implemented. They should be added to the Bruker/XWINNMR/exp/stan/au/src directory. The first two programs, kinetic_ds and kinetic_t, are suitible for slow reactions where precise timing is not critical as they do not take into account the time required to initialize each acquisition. The third program, kinetic_2d avoids the problem by using a pseudo 2d approach and is suitible for faster reactions.

1. kinetic_ds
This program uses dummy scans to control the time allowed between spectra. (A dummy scan is a scan taken without turning on the receiver.) The more dummy scans, the longer the time between experiments. The user should set up the appropriate parameters and then run the program (by typing xau kinetic_ds). You will be asked for the total number of spectra to be collected, the number of scans to be collected for each spectrum and the number of dummy scans to be used in all but the first spectrum. The first spectrum will be collected in the current experiment and the others in subsequent experiments.

/* kinetic_ds */
/* written by Glenn Facey, August 24, 2005 */
/* This program will set up a kinetic run based on the use of dummy scans */
/* The user is asked for the number of spectra, the number of scans for */
/* each spectrum and the number of dummy scans for all but the first spectrum */
/* the first spectrum uses no dummy scans. */
GETCURDATA
GETINT("Enter total number of spectra",i1)
GETINT("Enter the number of scans for each spectrum",i2)
GETINT("Enter the number of dummy scans for all but the first spectrum", i3)
STOREPAR("ns",i2)
STOREPAR("ds",0)
Proc_err(0,"Kinetic Run in Progress");
RGA
ZG
TIMES(i1-1)
IEXPNO
SETCURDATA
STOREPAR("ds",i3)
STOREPAR("ns",i2)
ZG
END
QUITMSG("Data Collection Complete!")


2. kinetic_t
In this program, the user should set up the appropriate parameters and then run the program (by typing xau kinetic_t). You will be asked for the total number of spectra to be collected, the number of scans to be collected for each spectrum and the time in seconds allowed between the end of one acquisition and the beginning of the next acquisition. The first spectrum will collected in the current experiment and the others in subsequent experiments.

/* kinetic_t */
/* written by Glenn Facey, August 24, 2005 */
/* This program sets up and runs a kinetic experiment */
/* The user is asked to input the number of spectra, */
/* the number of scans for each spectrum and the time in */
/* seconds between the end of an acquisition and the */
/* beginning of the next. The program will measure the */
/* receiver gain and start the acquisitions. */
GETCURDATA
GETINT("Enter total number of spectra",i1)
GETINT("Enter the number of scans for each spectrum",i2)
GETINT("Enter the time interval (in seconds)", i3)
STOREPAR("ns",i2)
Proc_err(0,"Kinetic Run in Progress");
RGA
ZG
TIMES(i1-1)
IEXPNO
SETCURDATA
STOREPAR("ns",i2)
ssleep(i3);
ZG
END
QUITMSG("Data Collection Finished")


3. kinetic_2d
This program avoids initialization delays by collecting the data in a pseudo 2D format where each slice of the experiment is a spectrum. The program uses a pulse program called zg30kin.gf (see below) which should be put in the directory Bruker/XWINNMR/exp/stan/lists/pp (This pulse program program should be modified to suit the needs of the user). A variable delay list called kinetic must also be set up. This list contains the same number of lines as the number of spectra to be collected. Each line in the variable delay list defines the time interval (in seconds) to be allowed before each acquistion. The user must set up the appropriate parameters (including the number of scans to be collected for each spectrum) and then run the program (by typing xau kinetic_2d). You will be asked only for the total number of spectra to be collected. The program will set up a pseudo 2d acquisition. Data collection is started with the zg command. The data are processed with the xf2 command.

/* kinetic_2d */
/* written by Glenn Facey, August 24, 2005 */
/* This program sets up a pseudo 2D kinetic run */
/* using the pulse program zg30kin.gf with a Variable */
/* delay list called "kinetic". */
GETCURDATA
GETINT("How many spectra do you want to acquire?", i1)
FETCHPAR("SFO1",&d1)
FETCHPAR("DW",&f2)
FETCHPAR("SW",&d2)
FETCHPAR("SF",&d3)
XCMD("parmode 2D")
XCMD("pulprog zg30kin.gf")
XCMD("vdlist kinetic")
STOREPAR("SFO1",d1)
STOREPAR("DW",f2)
STOREPAR("SW",d2)
STOREPAR("SF",d3)
STOREPAR1("TD",i1)
STOREPAR1("SI",i1)
QUITMSG("Setup Complete!\n1. Define 'VD' List called 'kinetic'.\n2. Run the experiment with 'zg'.\n3. Process data with the 'xf2' command.")


Pulse program zg30kin.gf

;zg30kin.gf
;zg30 modified to run kinetic experiment in pseudo 2D mode
;using VD list
;avance-version (00/02/07)
;1D sequence
;using 30 degree flip angle

#include
"d11=30m"
1 vd
ze
2 d1
p1*0.33 ph1
go=2 ph31
d11 wr #0 if #0 ivd
lo to 1 times td1
exit

ph1=0 2 2 0 1 3 3 1
ph31=0 2 2 0 1 3 3 1

;pl1 : f1 channel - power level for pulse (default)
;p1 : f1 channel - 90 degree high power pulse
;d1 : relaxation delay; 1-5 * T1
;d11 : short delay for I/O

3 comments:

Anonymous said...

thanks, your pseudo 2d experiment is just what I was looking for! I thought someone out there somewhere must have implemented this in a pulse programme but I didn't want to have to write it myself.

Anonymous said...

Hi Glen,
Is there any particular reasons to use a 30 degree pulse here?

THanks,

Simon

Glenn Facey said...

Simon,

I use 30 degree pulses here rather than 90 degree pulses so I will not have to wait as long for relaxation.

Glenn