Research Article

Fast Random Permutation Tests Enable Objective Evaluation of Methods for Single-Subject fMRI Analysis

Algorithm 1

float alpha1 = alphas1[Get_3D_Index(x,y,z,DATA_W,DATA_H)];
float alpha2 = alphas2[Get_3D_Index(x,y,z,DATA_W,DATA_H)];
float alpha3 = alphas3[Get_3D_Index(x,y,z,DATA_W,DATA_H)];
float alpha4 = alphas4[Get_3D_Index(x,y,z,DATA_W,DATA_H)];
s_Y[threadIdx.y][ 0 ][threadIdx.x] =
whitened_volumes[Get_4D_Index(x,y,z,c_Permutation_Vector[ 0 ],DATA_W,DATA_H,DATA_D)];
s_Y[threadIdx.y][ 1 ][threadIdx.x] = alpha1 * s_Y[threadIdx.y][ 0 ][threadIdx.x]
+  whitened_volumes[Get_4D_Index(x,y,z,c_Permutation_Vector[ 1 ],DATA_W,DATA_H,DATA_D)];
s_Y[threadIdx.y][ 2 ][threadIdx.x] = alpha1 * s_Y[threadIdx.y][ 1 ][threadIdx.x]
+ alpha2 * s_Y[threadIdx.y][ 0 ][threadIdx.x]
+  whitened_volumes[Get_4D_Index(x,y,z,c_Permutation_Vector[ 2 ],DATA_W,DATA_H,DATA_D)];
s_Y[threadIdx.y][ 3 ][threadIdx.x] = alpha1 * s_Y[threadIdx.y][ 2 ][threadIdx.x]
+ alpha2 * s_Y[threadIdx.y][ 1 ][threadIdx.x] + alpha3 * s_Y[threadIdx.y][ 0 ][threadIdx.x]
+ whitened_volumes[Get_4D_Index(x,y,z,c_Permutation_Vector[ 3 ],DATA_W,DATA_H,DATA_D)];
permuted_volumes[Get_4D_Index(x,y,z,0,DATA_W,DATA_H,DATA_D)] = s_Y[threadIdx.y][ 0 ][threadIdx.x];
permuted_volumes[Get_4D_Index(x,y,z,1,DATA_W,DATA_H,DATA_D)] = s_Y[threadIdx.y][ 1 ][threadIdx.x];
permuted_volumes[Get_4D_Index(x,y,z,2,DATA_W,DATA_H,DATA_D)] = s_Y[threadIdx.y][ 2 ][threadIdx.x];
permuted_volumes[Get_4D_Index(x,y,z,3,DATA_W,DATA_H,DATA_D)] = s_Y[threadIdx.y][ 3 ][threadIdx.x];
// Loop over time points
for (t = 4; t < DATA_T; t++)
{
 s_Y[threadIdx.y][ 4 ][threadIdx.x] =
             alpha1 * s_Y[threadIdx.y][ 3 ][threadIdx.x]
 + alpha2 * s_Y[threadIdx.y][ 2 ][threadIdx.x]
 + alpha3 * s_Y[threadIdx.y][ 1 ][threadIdx.x]
 + alpha4 * s_Y[threadIdx.y][ 0 ][threadIdx.x]
 + whitened_volumes[Get_4D_Index(x,y,z,c_Permutation_Vector[t],DATA_W,DATA_H,DATA_D)];
 permuted_volumes[Get_4D_Index(x,y,z,t,DATA_W,DATA_H,DATA_D)] = s_Y[threadIdx.y][ 4 ][threadIdx.x];
 // Save old values
 s_Y[threadIdx.y][ 0 ][threadIdx.x] = s_Y[threadIdx.y][ 1 ][threadIdx.x];
 s_Y[threadIdx.y][ 1 ][threadIdx.x] = s_Y[threadIdx.y][ 2 ][threadIdx.x];
 s_Y[threadIdx.y][ 2 ][threadIdx.x] = s_Y[threadIdx.y][ 3 ][threadIdx.x];
 s_Y[threadIdx.y][ 3 ][threadIdx.x] = s_Y[threadIdx.y][ 4 ][threadIdx.x];
}