COVID-19 Updates

Visit UC San Diego's Coronavirus portal for the latest information for the campus community.

ANTsR Notes: 11/8/2019

 General Notes: You will want to make .nii.gz files for use before running this. This underlined steps need to be modified for each task other commands are generalizable. If you copy the table below into excel you should be able to modify the second column and directly paste into R. Later I may source this file but for now I prefer being aware of all substeps listed.

 To allow for flexibility in processing we have now split scripts into

Preprocessing walkthrough:

CommentCommand
Load librarylibrary(ANTsR)
specify task tasks=c("MR290","MR")
setup study study="/data/asimmons/data/CDA/ANTs/"
pull in brain in mni space tem<-antsImageRead('/data/asimmons/data/niiTemplates/mni_icbm152_nlin_sym_09c/mni_icbm152_t1_tal_nlin_sym_09c.nii.gz')
pull in a matched mask in mni space temmask<-antsImageRead('/data/asimmons/data/niiTemplates/mni_icbm152_nlin_sym_09c/mni_icbm152_t1_tal_nlin_sym_09c_mask.nii.gz')
move to study setwd(study)
find all subjects subs<-Sys.glob("TC_???_?")
loop through all subjects in directoryfor (sub in subs){
print to command line  print(paste("Checking and processing ",sub))
if t1 doesn't exist make it  if(!(file.exists(paste(study,"/",sub,"/",sub,"_t1.nii.gz",sep="")))){
move to subject directory    setwd(paste(study,sub,sep="/"))
load T1    t1<-antsImageRead(paste(sub,".nii.gz",sep=""),3)
do Field Bias correction    t1c<-abpN4(t1)
save it    antsImageWrite(t1c,paste(sub,"_c.nii.gz",sep=""))
print to command line    print("Skull Strip")
do the skull stripping    bm<-abpBrainExtraction(t1c,tem,temmask)
move to mni space    bmbrain <- antsApplyTransforms(fixed=tem,moving=bm$brain,transformlist=bm$fwdtransforms )
save it in orig space    antsImageWrite(bm$brain,paste(sub,"_t1orig.nii.gz",sep=""))
save it in mni space    antsImageWrite(bmbrain,paste(sub,"_t1.nii.gz",sep=""))
save in transforms    file.copy(bm$fwdtransforms[1],paste(sub,"_ft.nii.gz",sep=""))
save in transforms    file.copy(bm$fwdtransforms[2],paste(sub,"_ft.mat",sep=""))
save in transforms    file.copy(bm$invtransforms[1],paste(sub,"_invt.nii.gz",sep=""))
save in transforms    file.copy(bm$invtransforms[2],paste(sub,"_invt.mat",sep=""))
move seg file to mni    bmseg <- antsApplyTransforms(fixed=tem,moving=bm$kmeansseg,transformlist=bm$fwdtransforms )
save seg file    antsImageWrite(bmseg,paste(sub,"_seg.nii.gz",sep=""))}
loop through all tasks for (task in tasks) {
save an output name    taskout<-paste(task,"Prep",sep="")
if output doesn't exist continue    if(!(file.exists(paste(study,"/",sub,"/",sub,taskout,".nii.gz",sep="")))){
if input exists continue      if(file.exists(paste(study,"/",sub,"/",sub,task,".nii.gz",sep=""))){
move to subject directory        setwd(paste(study,sub,sep="/"))
run task        print(paste("running data for ",task," in ",sub,sep=""))
if not despiked then despike        if(!(file.exists(paste(sub,task,"_ds.nii.gz",sep=""))))

         {system(paste("3dDespike -ignore 4 -prefix ",sub,task,"_ds.nii.gz ",sub,task,".nii.gz",sep=""))}
if not time shifted then time shift        if(!(file.exists(paste(sub,task,"_dst.nii.gz",sep=""))))

         {system(paste("3dTshift -ignore 2 -tzero 0 -tpattern seqplus -prefix ",sub,task,"_dst.nii.gz ",sub,task,"_ds.nii.gz",sep=""))}
read in bold        bold=antsImageRead(paste(sub,task,"_dst.nii.gz",sep=""),4)

        print("n3 of BOLD")
make average for alignment        avg <- getAverageOfTimeSeries(bold)
do Field Bias correction        avgn4 <- abpN4(avg)
make mask        mask<-getMask(avgn4,mean(avgn4),Inf,2)
do Field Bias correction        bold_n3<-timeseriesN3(bold,mask)
make vector mask for matrix conversions        avgm<-as.vector(avgn4[mask==1])
convert to matrix        boldstm<-timeseries2matrix(bold_n3,mask)
convert to PSC        boldstmp<-100*t(t(boldstm)/avgm)
do temporal whitening        boldstmw<-temporalwhiten(boldstmp, myord = 2)
convert to timeseries        boldstw<-matrix2timeseries(bold,mask,boldstmw)

        print("preprocess fMRI")
pull in t1        bmbrainorig=antsImageRead(paste(sub,"_t1orig.nii.gz",sep=""))
pull in transforms        bmfwdtransforms1=paste(sub,"_ft.nii.gz",sep="")
pull in transforms        bmfwdtransforms2=paste(sub,"_ft.mat",sep="")
Do data cleaning        boldpre<-preprocessfMRI( boldstw, mask, useMotionCorrectedImage = TRUE)

# The basic principals of this preprocessing follows: Powers et al.

# does: compcor/motion correction, nuisance regression, band-pass filtering, and spatial smoothing. As requested.

# compcor is similar to retroicor but using ica for noise determination

# spacial smoothing can be important to reduce noise you can use an anisotropic approach: related example Nam et al.
register data        boldtx<-antsRegistration(fixed=avg, moving=bmbrainorig, typeofTransform="SyNBold", spatialSmoothingType="perona-malik",spatialSmoothingParameters=c(0.25, 5))
concat transforms        fulltx<-c(bmfwdtransforms1,bmfwdtransforms2,boldtx$invtransforms[1],boldtx$invtransforms[2])
resample for mni outputs        temrs<-resampleImage(tem,c(4,4,4),interpType=4)
save output in orig space        antsImageWrite(boldpre$cleanBoldImage,paste(sub,taskout,".nii.gz",sep=""))
move to mni space        boldpreM<-antsApplyTransforms(fixed=temrs,moving=boldpre$cleanBoldImage,transformlist=fulltx,whichtoinvert=c(F,F,T,F),imagetype=3)
save output in mni space        antsImageWrite(boldpreM,paste(sub,taskout,"MNI.nii.gz",sep=""))
move mask to mni space        maskM<-antsApplyTransforms(fixed=temrs, moving=mask, transformlist=fulltx, whichtoinvert=c(F,F,T,F))
save mask        antsImageWrite(maskM,paste(sub,taskout,"mask.nii.gz",sep=""))
pretty up for pdf        boldpreMa=getAverageOfTimeSeries(boldpreM)

        boldpreMa=boldpreMa*boldpreMa
save nuisance variables        write.csv(boldpre$nuisanceVariables,paste("NV",sub,taskout,"1D",sep="."))
make pdf        pdf(paste("Prep",sub,taskout,"pdf",sep="."))
output orig space alignment        plot(t1,avgn4,window.overlay=c(mean(avgn4),Inf))
output DVARS        plot(boldpre$DVARS,type='l',ylab='DVARS',xlab='TR')
output mni space alignment         plot(bmbrain,boldpreMa,axis=3)
save pdf        dev.off()

}}
clean up for loop  try(rm(list=c("bold","boldpre","boldstm","boldstmw","boldpreM")))

  }}