Using of pulse sequences designed for arbitrary sampling of evolution time space.

The conventional programming of multidimensional pulse sequences relies on implicitly incremented evolution delays (d2, d3, d4 for Varian, and d0, d10 etc. for Bruker systems). For the i-dimension the increments of (swi)-1 are calculated automatically and added in consecutive steps of time domain sampling . Therefore, user control the experiment by specifying number of increments in each dimension (ni, ni2, etc. for Varian, and td1, td2, etc for Bruker). The maximum evolution time might be evaluated as (number of increments -1)/spectral width, while the total number of data points indirectly sampled time domains equals to the product of numbers of increments (i.e. ni*ni2*ni3 for Varian).

The new sampling scheme introduced by us enables one to choose time coordinates for each time domain point and acquire data in any order. The time domain points coordinates are listed explicitly in the text file, the numbers are normalized to be in the range between 0 and 1. Note that this approach allows one for planning any sampling pattern, from conventional with points lying on Cartesian grid spaced by (swi)-1 in each dimension, via radial used in Reduced Dimensionality and projection reconstruction techniques, spiral etc. to random distributions. Any sampling pattern stored in the file is possible without need of changing pulse sequence code. (Further explanations are given for Varian pulse sequences, however we believe that the same approach is possible also for Bruker spectrometers.) Only three for 3D or four for 4D spectrum new parameters should be created. The maximum evolution times should be set by parameters t1max, t2max and t3max. The total number of acquired points is controlled only by ni (note that ni2, and ni3 should be set to 1). The path to text file containing time domain points coordinates must be specified in the string parameter timetab_name. eg. timetab_name= ‘/home/wiktor/timetab/g32000.txt’. The same file is necessary for proper Multidimensional FT processing. The general rule is to set smallest possible nt (to accomplish basic phase cycle) and ni highest possible in given experimental time. In order to enable quadrature detection the array parameter should be left as in conventional experiment, i.e array=’phase,phase2’ or array=’phase,phase2,phase3’, for three or four dimensional experiments, respectively. Thus, four in 3D and eight for 4D fids is acquired for each time domain point. The phase variables should be set identically as in conventional experiments allowing for echo-antiecho selection or switching between N- and P-type spectra in the States method. The f2coef for 3D or f3coef for 4D spectra parameter should be present in the procpar file. It describes the way of obtaining frequency signs (quadrature) in the last indirectly detected dimension, it depends on the actual experiment for example: f2coef = ‘1 0 -1 0 0 -1 0 -1’ for echo-antiecho or f3coef = ‘1 0 0 0 0 0 -1 0’ for States method. The current version of MFT processing module so far supports only one phase modulation (echo-antiecho) – in the last indirectly detected dimension. The quadrature in other dimensions, i.e. F1 in 3D and F1 and F2 in 4D experiments, is assumed to be accomplished by States technique. We advise to acquire first 2D spectra for 0/90 deg. projection (i.e. F1F3 and F2F3 in the 3D case) using conventional sequence with the same parameters to determine phases. The actual values of rp,lp for directly detected dimension and rp1,lp1,rp2,lp2 and in 4D case rp3,lp3 should be stored in procpar file and are used in processing.

Tips for the pulse sequence programming (Varian)

The adaptation of pulse sequences for explicit sampling used stored time domain points coordinates is straightforward. Below are given examples which allow one for easy converting of any multidimensional pulse sequence.

1. Definitions:

the following definition of max_ni should be added to avoid attempt of sampling more points than is stored in the timetab file

#define MAX_NI 32000

2. Variables declaration: the following variables should be declared

FILE *pliktime;
char timetab_name[MAXSTR];
int j,
double t1max = getval("t1max"),
t2max = getval("t2max"),
time_tab[MAX_NI][2],
for 4D experiments :
t2max = getval("t2max"), and
time_tab[MAX_NI][3],


3. Initialize variables:

getstr("timetab_name",timetab_name);
if( ni>max_ni )
{ printf("ni should be below max_ni ");
psg_abort(1); }
pliktime=fopen(timetab_name,"rb");
for (j=0;j {
scanf(pliktime,"%lf %lf\n",&time_tab[j][0],&time_tab[j][1]); in 3D
or scanf(pliktime,"%lf %lf %lf\n",&time_tab[j][0],&time_tab[j][1],&time_tab[j][2]); in 4D
} fclose(pliktime);
if ( ni2 > 1)
{ printf(" ni2 should be set to 1 "); psg_abort(1);}
for 4D also:
if ( ni3 > 1)
{ printf(" ni3 should be set to 1 "); psg_abort(1);}

4. For constant time evolution the maximum evolution time should be verified as for example:

if ( 0.5*t2max > timeTN - WFG3_START_DELAY)
{ printf(" t2max is too big. " );
psg_abort(1);}
5. The d2, d3 and d4 should be subdtituted by:
time_tab[d2_index][0], time_tab[d2_index][1] and time_tab[d2_index][2], respectively.
In the BioPack sequences it might look as:
tau1=t1max*time_tab[d2_index][0];
tau1 = tau1/2.0;
tau2=t2max*time_tab[d2_index][1];
tau2 = tau2/2.0;


6. The States-TPPI calculations could be left as they are, however we do not recommend thme for random sampling, it might be commented out.

7. In the case of semi constant time evolution few additional modifications should be performed, for example in the case of BioPack ghn_co:

original code:
/* Set up CONSTANT/SEMI-CONSTANT time evolution in N15 */

halfT2 = 0.0;
CTdelay = timeTN + pwC8 + WFG_START_DELAY - SAPS_DELAY;

if(ni>1)
{
if(f1180[A] == 'y') /* Set up f1180 */
tau1 += 0.5*csa/sw1; /* if not PRexp then csa = 1.0 */
if(PRexp)
{
halfT2 = 0.5*(ni-1)/sw1; /* ni2 is not defined */
if(f1180[A] == 'y')
{ tau2 += 0.5*sna/sw1; halfT2 += 0.25*sna/sw1; }
t2b = t1_counter*((halfT2 - CTdelay)/(ni-1));
}
}
if (ni2>1)
{
halfT2 = 0.5*(ni2-1)/sw2;
if(f2180[A] == 'y') /* Set up f2180 */
{ tau2 += 0.5/sw2; halfT2 += 0.25/sw2; }
t2b = t2_counter*((halfT2 - CTdelay)/(ni2-1));
}
tau1 = tau1/2.0;
tau2 = tau2/2.0;
if(tau1 < 0.2e-6) tau1 = 0.0;
if(tau2 < 0.2e-6) tau2 = 0.0;

if(t2b < 0.0) t2b = 0.0;
t2a = CTdelay - tau2 + t2b;
if(t2a < 0.2e-6) t2a = 0.0;

should be changed to:

/* Set up CONSTANT/SEMI-CONSTANT time evolution in N15 */

halfT2 = 0.0;
CTdelay = timeTN + pwC8 + WFG_START_DELAY - SAPS_DELAY;

if(ni>1)
{
if(f1180[A] == 'y') /* Set up f1180 */
tau1 += 0.5*csa/sw1; /* if not PRexp then csa = 1.0 */

}
halfT2 = 0.5*t2max;
if(f2180[A] == 'y') /* Set up f2180 */
{ tau2 += 0.5/sw2; halfT2 += 0.25/sw2; }
t2b = tau2*((halfT2 - CTdelay)/t2max);

tau1 = tau1/2.0;
tau2 = tau2/2.0;
if(tau1 < 0.2e-6) tau1 = 0.0;
if(tau2 < 0.2e-6) tau2 = 0.0;

if(t2b < 0.0) t2b = 0.0;
t2a = CTdelay - tau2 + t2b;
if(t2a < 0.2e-6) t2a = 0.0;