Best way to analyze the data

Hello afni team,

I have a question about the best way to analyze my fMRI data.

Now I have 3 runs and each run includes different condition separately (e.g. 1st run: high intensity stimulation/ 2nd run: low intensity stimulation/ 3rd run: finger movement). A simple block design was used for each run ((3TRs: stimulus + 7TRs: rest) * 10).

Before processing the data, I concatenated 3 runs into one big functional data file and then used the concatenated data with mprage to do preprocessing. Everything worked fine but when I looked at the time series from ROIs, I have found that the initial time series for each run was different from each other. For example, the overall time series in the 1st run seemed lower than other two runs (2nd and 3rd. please see the attached file). Even I’ve included the normalization step (scale), it seems like all the time series did not scale to have a mean of 100. Do you have any suggestions on this?

Thank you!


I would not concatenate your data before feeding it into It’s not uncommon for different scanner runs to have slightly different values (arbitrary units). The scale step would turn each of those runs into a % signal change that would then be comparable.

Feel free to post your command for further insights!

Thanks Taylor!

Here is my command. -subj_id $subj                                                  \
        -script proc.$subj -scr_overwrite                                 \
        -blocks tshift align tlrc volreg blur mask scale regress             \
        -copy_anat $anat_dir/t1_mprage+orig                      \
        -anat_has_skull no													 \
        -tcat_remove_first_trs 0                                             \
        -dsets                                                               \
            $epi_dir/DiCo_all+orig.HEAD                   \
        -volreg_align_to third                                               \
        -volreg_align_e2a                                                    \
        -volreg_tlrc_warp                                                    \
        -blur_size 4.0                                                       \
        -regress_stim_times                                                  \
            $stim_dir/Int_High.txt                                        \
            $stim_dir/Int_Low.txt                                        \
            $stim_dir/FT.txt                                        \
        -regress_stim_labels                                                 \
            Int_High Int_Low FT    \
        -regress_basis 'BLOCK(9,1)'                                      \
        -regress_censor_motion 0.3                                           \
        -regress_opts_3dD                                                    \
        	-fout -tout -bout												 \
        -regress_make_ideal_sum sum_ideal.1D                                 \
        -regress_est_blur_epits                                              \

If you suggest me not concatenate the data before feeding it into, then I have another question…As you can see from my script, DiCo_all+orig is the dataset that I concatenated 3 functional data. If I put 3 functional data separately (e.g. DiCo_1, DiCo_2, and DiCo_3), how can I generate the stimulus time file? Each of stimulus time file need to put 3 rows of timing info but I only need to put the timing info in one row since each functional data only has one stimulus condition…For example, if I generate the stimulus time file for Int_High, it will be something like this.

12 42 72 102 132 162 192 222 252 282

But I believe I cannot generate the timing file in this way…and if I have only one single row, this script file cannot run properly. Any suggestions…?


You should feed the three runs after the -dsets flag. Your timing files are then one row per run starting at time 0 for each run. and relevant commands will figure it out from there!

You have the option to specify what we call “global” times as well, but the local method (described above) is usually more straightforward.


An example of a recent stimulus timing file I worked with (time is overly precise because it was linked to an eye tracker):

13.89 25.84 28.23 37.79 47.35 54.52 61.69 80.81 95.15 109.49
1.94 13.89 54.52 76.03 116.66 119.05 121.44 133.39 142.95

Hi Taek,

To add to Peter’s useful comments, to specify an empty
run in local timing file, use ‘* *’, e.g.

12 42 72 102 132 162 192 222 252 282
* *
* *

In this case, the double is not necessary (one ‘*’ is enough),
but it is a safe habit. There is a space between one asterisk
and the next.

  • rick

Thank you Peter and Rick!
I will try to use the timing file with ‘* *’ and see how it looks like.