Unusual artifacts after including blur and censor

AFNI version info (afni -ver): Version AFNI_24.1.01 'Publius Septimius Geta'

I ran the first round of processing of my data without blurring and motion correction (i.e., using only blocks: volreg, mask, scale, regress), and my data looked pretty normal. However, after I included blur and censoring (and related flags) as in the script below, some of the QC metrics went completely wild (see the attached screenshots below). I'm a newbie when it comes to AFNI, so perhaps I'm missing something obvious here.

Do you have any ideas about what might be causing this and why?

I've tried the following so far and here's what I found:

  • Same script (blur and censor), but with the automask flag removed; it yields the same error.
  • Same script, but with censoring removed; blur works fine with automask. TSNR improves, but the local correlation increases significantly compared to the previous processing without blur.
  • Same script, but with censor outliers added; I get the same unusual results.
  • Same script, but only with blur (no automask or censoring); I still see strange artifacts.

It seems that the combination of options / flags I use is causing this, but I can't tell what. Any help with this would be much appreciated, thanks!

afni_proc.py -subj_id ${subj} \
	-script afni_proc_${subj}_prosody_task.tcsh \
	-out_dir afni_proc_${subj}_prosody_task.results \
	-dsets ${subj}_MB_prosody_run1.nii ${subj}_MB_prosody_run2.nii \
		${subj}_MB_prosody_run3.nii ${subj}_MB_prosody_run4.nii \
	-blocks volreg blur mask scale regress \
	-tcat_remove_first_trs 6 \
	-blur_filter -1blur_fwhm \
	-blur_size 4 \
	-blur_in_automask \
	-volreg_align_to MIN_OUTLIER \
	-regress_reml_exec \
	-regress_local_times \
	-regress_censor_motion 0.3 \
	-regress_opts_3dD \
		-num_stimts 4 \
		-stim_label 1 consistent75 \
		-stim_times_AM1 1 $tdir/240809AG_consistent75_exact.txt 'dmUBLOCK(1)' \
		-stim_label 2 consistent100 \
		-stim_times_AM1 2 $tdir/240809AG_consistent100_exact.txt 'dmUBLOCK(1)' \
		-stim_label 3 conflicting75 \
		-stim_times_AM1 3 $tdir/240809AG_conflicting75_exact.txt 'dmUBLOCK(1)' \
		-stim_label 4 conflicting100 \
		-stim_times_AM1 4 $tdir/240809AG_conflicting100_exact.txt 'dmUBLOCK(1)' \
		-gltsym 'SYM: +consistent75 + consistent100 -conflicting75 -conflicting100' \
		-glt_label 1 'ConsistentConflicting' \
	-tout \
	-execute



Howdy-

Wow, weird. The max full F-stat is only 1.5. That is super low.

Re. blur, what is the voxel size? Also, how many time points are there?

Are there any warnings in the "warns" section of the APQC HTML?

How many time points were censored, and how systematic was the censoring within the stimulus paradigms? That would be shown in the "mot" section, and also a bit checked for in the "warns" section. The "df" count might be low.

What do the TSNR maps look like?

One of the most useful things we have found for investigating QC (see here and here) as well are some of the QC buttons in the HTML; if you have the python modules "flask" and "flask-cors", you can open the QC_*/index.html file of one or more subjects with:

open_apqc.py -infiles INDEX1 [INDEX2 INDEX3 ...]

and use the InstaCorr (IC) and GraphView (GV) buttons above images. You can explore spatio-temporal patterns with the first, using seedbased correlation patterns. The latter might reveal odd structures in the acquired data, as well.

Some separate comments

I am not sure of the difference between providing the stim_label and stim_times info via -regress_opts_3dD; I am used to seeing that done through regress_* .. opts. For example, the afni_proc.py command from our NARPS processing, which used AM2 and AM1, is here.

For choice of dmUBLOCK() argument, there are some notes here. The brief takeaway is that using a negative argument, like dmUBLOCK(-1) typically makes more sense, because then the stimulus response of 1s gets scaled to unity *and longer responses can have larger amplitude response, rather than a constant one (which dmUBLOCK(1) would have).

And though you probably know this already, if you use -tcat_remove_first_trs 6, then that assumes that you have separately accounted for that 6*TR amount of time within your stimulus timing files, as well. That is, if they were initially recorded with a clock that started from 0 when the FMRI acquisition started, and the FMRI signal has a TR=2s, then you would have to subtract 12s from each event within the timing files before inputting them here.

We typically put the mask block before the blur block, but I'm not sure that will have such a large effect here.

--pt

Hello,

Just some comments and questions on top of Paul's...

Nothing seems too odd in your command. I ran one similar to yours on our demo data and the results seem fine.

That is indeed a very low full-F range for having more than 1600 time points (after censoring). But it is nice to at least see what appears to be an auditory activation.

That the WB-average covers the entire brain is really strange. Since the blur is very small AND in the brain automask, it is hard to imagine blurring leading to this.

The likely conclusion is that there is something peculiar in your data.

It might be hard to tell from, but would you show an image from:

1dplot mean.errts.1D

Some general comments about afni_proc.py that should not affect your results...

To let afni_proc.py know of the stimuli, consider applying -regress_stim_times, labels and basis, then just left the GLT in opts_3dD. As in:

-regress_stim_times     $tdir/240809AG_consistent75_exact.txt       \
                        $tdir/240809AG_consistent100_exact.txt      \
                        $tdir/240809AG_conflicting75_exact.txt      \
                        $tdir/240809AG_conflicting100_exact.txt     \
-regress_stim_labels    consistent75 consistent100 conflicting75    \
                        conflicting100                              \
-regress_basis          'dmUBLOCK(1)'                               \
-regress_opts_3dD       -gltsym                                     \
                        'SYM: +consistent75 +consistent100 -conflicting75 -conflicting100' \ 
                        -glt_label 1 'ConsistentConflicting'        

The default is to include -tout, so you might remove that option.

When using -blur_in_automask, the -blur_filter option will not be applied.

You probably would prefer to include -regress_motion_per_run.

For QC, consider including options like:

-radial_correlate_blocks  tcat volreg regress
-volreg_compute_tsnr      yes
-regress_make_ideal_sum   sum_ideal.1D
-regress_est_blur_epits   
-regress_est_blur_errts   
-regress_run_clustsim     no
-html_review_style        pythonic

-rick