def test_getRegressor():
    # Set up and load in subject 1 run 1
    # This is the convolution method described, in detail on:
    # http://practical-neuroimaging.github.io/on_convolution.html
    TR = 2
    n_vols = 240
    tr_times = np.arange(0, 30, TR)
    hrf_signal = hrf(tr_times)
    behav_cond = pathtotest + 'test_behavdata.txt'
    task_cond1 = pathtotest + 'test_cond001.txt'
    task_cond2 = pathtotest + 'test_cond002.txt'
    task_cond3 = pathtotest + 'test_cond003.txt'
    task_cond4 = pathtotest + 'test_cond004.txt'
    parameters = merge_cond(behav_cond, task_cond1, task_cond2, task_cond3, task_cond4)
    # get neural_signal
    neural_signal = events2neural_extend(parameters,TR, n_vols)
    # get gain signal
    gain_signal = neural_signal[:,1]
    # get loss signal 
    loss_signal = neural_signal[:,2]
    # Len of neural signal 
    N = neural_signal.shape[0]
    # Length of hrf_signal
    M = len(hrf_signal)
    # create the convolved bold signal gain/loss 
    convolved_gain = np.zeros(N + M - 1)  # adding the tail
    convolved_loss = np.zeros(N + M - 1)  # adding the tail
    for i in range(N):
        input_value_g = gain_signal[i]
        input_value_l = loss_signal[i]
        # Adding the shifted, scaled HRF
        convolved_gain[i : i + M] += hrf_signal * input_value_g
        convolved_loss[i : i + M] += hrf_signal * input_value_l
    # Remove the extra_times
    n_to_remove = M-1
    convolved_gain = convolved_gain[:-n_to_remove]
    convolved_loss = convolved_loss[:-n_to_remove]
    lin_dr = np.linspace(-1, 1, n_vols)
    quad_dr = lin_dr ** 2
    quad_dr -= np.mean(quad_dr)
     
    #--------------------------------------------------------------------------#
    # my function 
    myconv_gain, myconv_loss, my_lin, my_quad = getRegressor(TR, n_vols, hrf_signal, neural_signal)
    myconv_gain1, myconv_loss1, my_lin1, my_quad1 = getRegressor(TR, n_vols, hrf_signal, neural_signal, standard = True)

    #--------------------------------------------------------------------------#
    # assert checks
    assert (max(abs(convolved_gain-myconv_gain) < .0001))
    assert (max(abs(convolved_loss-myconv_loss) < .0001))
    assert (max(abs(quad_dr-my_quad) < .0001))
    assert (max(abs(lin_dr-my_lin) < .0001))
    # Check standard template
    assert_allclose(myconv_gain, myconv_gain1)
    assert_allclose(myconv_loss, myconv_loss1)
    assert (my_lin1 is None)
    assert (my_quad1 is None)
def test_getRegressor():
    # Set up and load in subject 1 run 1
    # This is the convolution method described, in detail on:
    # http://practical-neuroimaging.github.io/on_convolution.html
    TR = 2
    n_vols = 240
    tr_times = np.arange(0, 30, TR)
    hrf_signal = hrf(tr_times)
    behav_cond = pathtotest + 'test_behavdata.txt'
    task_cond1 = pathtotest + 'test_cond001.txt'
    task_cond2 = pathtotest + 'test_cond002.txt'
    task_cond3 = pathtotest + 'test_cond003.txt'
    task_cond4 = pathtotest + 'test_cond004.txt'
    parameters = merge_cond(behav_cond, task_cond1, task_cond2, task_cond3, task_cond4)
    # get neural_signal
    neural_signal = events2neural_extend(parameters,TR, n_vols)
    # get gain signal
    gain_signal = neural_signal[:,1]
    # get loss signal 
    loss_signal = neural_signal[:,2]
    # Len of neural signal 
    N = neural_signal.shape[0]
    # Length of hrf_signal
    M = len(hrf_signal)
    # create the convolved bold signal gain/loss 
    convolved_gain = np.zeros(N + M - 1)  # adding the tail
    convolved_loss = np.zeros(N + M - 1)  # adding the tail
    for i in range(N):
        input_value_g = gain_signal[i]
        input_value_l = loss_signal[i]
        # Adding the shifted, scaled HRF
        convolved_gain[i : i + M] += hrf_signal * input_value_g
        convolved_loss[i : i + M] += hrf_signal * input_value_l
    # Remove the extra_times
    n_to_remove = M-1
    convolved_gain = convolved_gain[:-n_to_remove]
    convolved_loss = convolved_loss[:-n_to_remove]
    linear_dr = np.linspace(-1, 1, n_vols)
    quadratic_dr = linear_dr ** 2
    quadratic_dr -= np.mean(quadratic_dr)
     
    #--------------------------------------------------------------------------#
    # my function 
    myconv_gain, myconv_loss, my_lin, my_quad = getRegressor(TR, n_vols, hrf_signal, neural_signal)
    #--------------------------------------------------------------------------#
    # assert checks
    assert (max(abs(convolved_gain-myconv_gain) < .0001))
    assert (max(abs(convolved_loss-myconv_loss) < .0001))
    assert (max(abs(quadratic_dr-my_quad) < .0001))
    assert (max(abs(linear_dr-my_lin) < .0001))
         + str(i).zfill(2)
         + "/model/model001/onsets/task001_run00"
         + ` j `
         + "/cond003.txt"
     )
     task_cond4 = (
         pathtodata
         + "ds005/sub0"
         + str(i).zfill(2)
         + "/model/model001/onsets/task001_run00"
         + ` j `
         + "/cond004.txt"
     )
     parameters = merge_cond(behav_cond, task_cond1, task_cond2, task_cond3, task_cond4)
     neural_prediction = events2neural_extend(parameters, TR, n_vols)
     gain, loss, linear_dr, quad_dr = getRegressor(TR, n_vols, hrf_at_trs, neural_prediction)
     data, gain, loss, linear_dr, quad_dr = deleteOutliers(
         data, gain, loss, linear_dr, quad_dr, i, run, dvars_out, fd_out
     )
     data_full = np.concatenate((data_full, data), axis=3)
     gain_full = np.concatenate((gain_full, gain), axis=0)
     loss_full = np.concatenate((loss_full, loss), axis=0)
     linear_full = np.concatenate((linear_full, linear_dr), axis=0)
     quad_full = np.concatenate((quad_full, quad_dr), axis=0)
 d_shape = data_full.shape[:3]
 mea = calcMRSS(data_full, gain_full, loss_full, linear_full, quad_full)
 X, Y, beta = calcBeta(data_full, gain_full, loss_full, linear_full, quad_full)
 # ------------------------------------------------------------------------------#
 # Take the 40,000 voxel
 fitted = X.dot(beta[:, 40000])
 residuals = Y[:, 40000] - fitted
 quad_full = np.empty([0,])
 run_count = np.zeros(3)
 for j in range(1,4):
     direct='ds005/sub0'+str(i).zfill(2)+'/BOLD/task001_run00'+`j`+'/'
     boldname = pathtofolder + direct+'bold.nii.gz'
     img=nib.load(boldname)
     data=img.get_data()
     run = j
     behav_cond = pathtofolder + 'ds005/sub0'+str(i).zfill(2)+'/behav/task001_run00'+`j`+'/behavdata.txt'
     task_cond1 = pathtofolder + 'ds005/sub0'+str(i).zfill(2)+'/model/model001/onsets/task001_run00'+`j`+'/cond001.txt'
     task_cond2 = pathtofolder + 'ds005/sub0'+str(i).zfill(2)+'/model/model001/onsets/task001_run00'+`j`+'/cond002.txt'
     task_cond3 = pathtofolder + 'ds005/sub0'+str(i).zfill(2)+'/model/model001/onsets/task001_run00'+`j`+'/cond003.txt'
     task_cond4 = pathtofolder + 'ds005/sub0'+str(i).zfill(2)+'/model/model001/onsets/task001_run00'+`j`+'/cond004.txt'
     parameters = merge_cond(behav_cond, task_cond1, task_cond2, task_cond3, task_cond4)
     neural_prediction = events2neural_extend(parameters,TR, n_vols)
     gain, loss, linear_dr, quad_dr = getRegressor(TR, n_vols, hrf_at_trs, neural_prediction)
     data, gain, loss, linear_dr, quad_dr = deleteOutliers(data, gain, loss, linear_dr, quad_dr, i, run, dvars_out, fd_out)
     run_count[j-1] = data.shape[3]     ## dummy variable indicating the groups
     data_full = np.concatenate((data_full,data),axis=3)
     gain_full = np.concatenate((gain_full,gain),axis=0)
     loss_full = np.concatenate((loss_full,loss),axis=0)
     linear_full = np.concatenate((linear_full,linear_dr),axis=0)
     quad_full = np.concatenate((quad_full,quad_dr),axis=0)
     
 run_group = np.concatenate((np.repeat(1, run_count[0]), 
                             np.repeat(2, run_count[1]), np.repeat(3, run_count[2])), axis=0)
 thrshd = 400 ## set a threshold to idenfity the voxels inside the brain
 print "calculating parameters of subject "+str(i)
 beta = calcBetaLme(data_full, gain_full, loss_full, linear_full, quad_full, run_group, thrshd)
 sig_level = 0.05
 sig_gain_prop[i-1], sig_loss_prop[i-1] = calcSigProp(beta, sig_level)