Skip to content
Snippets Groups Projects
replace_and_average_fmrib 7.88 KiB
Newer Older
Rita Nunes's avatar
Rita Nunes committed
#averages multiple repeats and simultaneously remove dodgy volumes
#to be used after regscript - for DTI images acquired at FMRIB 

Usage() {
echo ""
echo "replace_and_average_fmrib - Preprocessing for DTI images acquired at FMRIB "
echo "                    run after regscript to average multiple repeats"
echo ""
echo "if necessary, indicate dodgy volumes to be removed"
echo ""
echo "_________________________________________________________________________"
echo "Usage: replace_and_average_fmrib <numb_acqs> volno volno ... volno "
echo ""
echo "output file will be called data"
echo "Note that the first volume is 0 and not 1"
echo ""
echo "Example: if you want to remove vols 4 and 5 from data1"
echo "                               vols 10 and 19 from data2"
echo "                               vol 40 from data3"
echo "         having acquired 3 repeats, 60 directions"
echo ""
echo " to the volumes corresponding to data2 (10 and 19)"
echo " you should add the total number of volumes in each file,"
echo " in this case 63 (= 3 non-DW + 60 direc)"
echo " 126 (= 2*63) to the ones corresponding to data3 and so on..."
echo ""
echo "you should therefore type something like - "
echo "              replace_and_average_fmrib 3 4 5 73 82 166" 
echo "_________________________________________________________________________"

Rita Nunes's avatar
Rita Nunes committed
}

#===================================================================
rem_vols() {

#===================================================================
# Arg_1 = input_file 
# Arg_2 = num_acqs
# Arg_3 ... Arg_n dodgy_vols 

   
input_file=$1
numb_acqs=$2
shift 2

dodgy_vols=`cat dodgy_vols`
echo "removing vols $dodgy_vols"

current_dir=`pwd`

acq=1
while [ $acq -le $numb_acqs ];do
  if [ ! `imtest ${input_file}${acq}` ]; then
      echo Cant find $input_file 
Rita Nunes's avatar
Rita Nunes committed
      exit
  fi
  acq=`expr $acq + 1`;
done

if [ ! -e bvals ]; then
    echo Cant find bvals
    exit
fi

if [ ! -e bvecs ]; then
    echo Cant find bvecs
    exit
fi

nvols=`avwval ${input_file}1 dim4`;

acq=1
while [ $acq -le $numb_acqs ]; do
  echo splitting $input_file$acq
Rita Nunes's avatar
Rita Nunes committed
  volume=0;
  if [ $nvols -lt 10 ]; then
     while [ $volume -lt $nvols ]; do
        immmv vol000$volume vol000${volume}_${acq}
Rita Nunes's avatar
Rita Nunes committed
        volume=`expr $volume + 1`
     done
  else
     volume=0
     while [ $volume -lt 10 ]; do
        immv vol000${volume} vol000${volume}_${acq}
Rita Nunes's avatar
Rita Nunes committed
        volume=`expr $volume + 1`
     done
     while [ $volume -lt $nvols ]; do
        immv vol00${volume} vol000${volume}_${acq}
Rita Nunes's avatar
Rita Nunes committed
	volume=`expr $volume + 1`
     done
  fi
 acq=`expr $acq + 1`;
done

vol=0
num_dodgy_vols=`expr $#`
while [ $vol -lt $num_dodgy_vols ]; do
  v=$1
  shift
  if [ `imtest vol000${v}_1` ]; then
    rm vol000${v}_* -f
  fi 
  if [ `imtest vol00${v}_1` ]; then
    rm vol00${v}_* -f
  fi 
Rita Nunes's avatar
Rita Nunes committed

  vol=`expr $vol + 1`
done

acq=1
while [ $acq -le $numb_acqs ]; do
   rm ${input_file}${acq}* -f
   avwmerge -t data$acq `$FSLDIR/bin/imglob -oneperimage vol*_$acq`
   acq=`expr $acq + 1`; 
Rita Nunes's avatar
Rita Nunes committed
done

matlab -nodisplay -nojvm -nosplash 1> matlab.out1 2>&1 <<EOF

addpath('/usr/people/dtiuser/etc/FMRIB_bvals_bvecs/')
remove_vols('$current_dir')
EOF
rm matlab.out1 -f
rm vol0* -f
}
#===================================================================
check_vols() {

#===================================================================
# Arg_1 = n_vols
# Arg_2 = num_acqs
   
n_vols=$1
numb_acqs=$2

matlab -nodisplay -nojvm -nosplash 1> matlab.out1 2>&1 <<EOF

addpath('/usr/people/dtiuser/etc/FMRIB_bvals_bvecs/')
check_vols($n_vols,$numb_acqs)
EOF
rm matlab.out1 -f
}

#===================================================================



[ "$1" = "" ] && Usage

numb_acqs=$1

if [ $# -gt 1 ]; then
  shift 1

  if [ $numb_acqs -lt 2 ]; then
    echo "replacevols_fmrib should be used when several repeats were acquired"
    echo "use remove_vols instead if you want to remove dodgy volumes from single datasets"
  fi
 
  echo -n ""> vol_list

  for i in $@ ; do
    vol=$i
    echo -n "$vol " >> vol_list
    shift  
  done

  nvols=`avwval data1 dim4`;
  n_vols=`echo $nvols`
  dodgy_volumes=`cat vol_list`
  echo dodgy volumes: $dodgy_volumes

  check_vols $n_vols $numb_acqs
  
 if [ -e dodgy_vols ]; then
      dodgy=`cat dodgy_vols`
      rem_vols data $numb_acqs $dodgy
Rita Nunes's avatar
Rita Nunes committed
  else
      echo No volumes need to be removed
Rita Nunes's avatar
Rita Nunes committed
  fi
Rita Nunes's avatar
Rita Nunes committed
  nvols=`avwval data1 dim4`;
Rita Nunes's avatar
Rita Nunes committed
  echo output will have $nvols volumes
Rita Nunes's avatar
Rita Nunes committed
  dodgy_volumes=`cat vol_list`
  dodgy_volumes=`echo $dodgy_volumes`
Rita Nunes's avatar
Rita Nunes committed
  if [ -e dodgy_vols ]; then
      if [ "$dodgy_volumes" != "" ]; then 
	  echo dogdy volumes updated taking into account removed volumes
	  echo dodgy volumes are now: $dodgy_volumes
      fi
Rita Nunes's avatar
Rita Nunes committed
  fi
Rita Nunes's avatar
Rita Nunes committed
  if [ "$dodgy_volumes" != "" ]; then  
      acq=1
      
      echo "">file_list  
      
      while [ $acq -le $numb_acqs ];do
Rita Nunes's avatar
Rita Nunes committed
	  acq=`expr $acq + 1`;
Rita Nunes's avatar
Rita Nunes committed
      
      file_list=`cat file_list`
      avwmerge -t bigdata $file_list
      rm file_list -f
      
      echo "0 $nvols" >average_file
      acq=1
      first=0
      second=$nvols
      while [ $acq -lt $numb_acqs ];do
	  first=`expr $first + $nvols`;
	  echo "$first $second">>average_file;
	  acq=`expr $acq + 1`;
      done
Rita Nunes's avatar
Rita Nunes committed
      echo "">>average_file
Rita Nunes's avatar
Rita Nunes committed
      acq=0 
      n_vols=`echo $nvols`
      
      if [ $n_vols -lt 63 ]; then
	  b0=0;
	  while [ $acq -lt $numb_acqs ];do
	      echo -n "$b0 " >> average_file
	      acq=`expr $acq + 1`;
	      b0=`expr $b0 + $n_vols`; 
	  done;
      else
	  b0=0;b0_1=1;b0_2=2;echo ""
	  while [ $acq -lt $numb_acqs ]; do
	      echo -n "$b0 $b0_1 $b0_2 " >> average_file
	      acq=`expr $acq + 1`;
	      b0=`expr $b0 + $n_vols`;
	      b0_1=`expr $b0_1 + $n_vols`;
	      b0_2=`expr $b0_2 + $n_vols`;
	  done;  
      fi
      
      if [ $FSLOUTPUTTYPE != 'ANALYZE' ]; then
	  avwchfiletype ANALYZE bigdata
	  rm bigdata.nii.gz -f
      fi
Rita Nunes's avatar
Rita Nunes committed
      replacevols bigdata average_file $dodgy_volumes tmp_file
      
      if [ -e tmp_file.img.gz ]; then
	  gunzip tmp_file.img.gz
	  if [ -e tmp_file.hdr.gz ]; then
	      gunzip tmp_file.hdr.gz
	  fi
      fi

      if [ $FSLOUTPUTTYPE != 'ANALYZE' ]; then
	  avwchfiletype $FSLOUTPUTTYPE tmp_file
      fi

Rita Nunes's avatar
Rita Nunes committed
      nvols=`avwval tmp_file dim4`;
      n_vols=`echo $nvols` 
      volsacqs=`avwval data1 dim4`;
      vols_per_acqs=`echo $volsacqs`;
      
      rm bigdata* -f
      avwroi tmp_file data 0 ${vols_per_acqs};
      avwmaths data -mul 0 data;
      
      acq=0;
      while [ ${acq} -lt ${numb_acqs} ]; do
	  vol=0
	  while [ ${vol} -lt ${vols_per_acqs} ]; do
	      v_tmp=`expr $vol + ${vols_per_acqs} \* ${acq}`
	      if [ $vol -lt 10 ]; then
		  avwroi tmp_file vol${acq}_000${vol} $v_tmp 1;
	      else
		  avwroi tmp_file vol${acq}_00${vol} $v_tmp 1;
	      fi
	      vol=`expr $vol + 1`;
	  done
	 
	  avwmerge -t data${acq}_all `$FSLDIR/bin/imglob -oneperimage vol${acq}_*`
Rita Nunes's avatar
Rita Nunes committed
	  avwmaths data${acq}_all -div ${numb_acqs} data${acq}_all;
	  avwmaths data -add data${acq}_all data;
Rita Nunes's avatar
Rita Nunes committed
          rm data${acq}_all* vol${acq}* -f  
      	  acq=`expr $acq + 1`;
Rita Nunes's avatar
Rita Nunes committed
      rm *_all* -f
Rita Nunes's avatar
Rita Nunes committed
  else
      echo averaging the data
      volsacqs=`avwval data1 dim4`;
      vols_per_acqs=`echo $volsacqs`;
      avwroi data1 data 0 ${vols_per_acqs};
      avwmaths data -mul 0 data;
      acq=1;
      while [ ${acq} -le ${numb_acqs} ]; do
	  avwmaths data${acq} -div ${numb_acqs} data${acq};
	  avwmaths data -add data${acq} data;
Rita Nunes's avatar
Rita Nunes committed
	  acq=`expr $acq + 1`;
      done
  fi
  
  rm dodgy_vols -f
  rm vol_list -f
  rm vol*_* -f

else
    echo no dodgy volumes
    echo averaging the data
    volsacqs=`avwval data1 dim4`;
    vols_per_acqs=`echo $volsacqs`;
    avwroi data1 data 0 ${vols_per_acqs};
    avwmaths data -mul 0 data;
    acq=1;
    while [ ${acq} -le ${numb_acqs} ]; do
        avwmaths data${acq} -div ${numb_acqs} data${acq};
	avwmaths data -add data${acq} data;
Rita Nunes's avatar
Rita Nunes committed
	acq=`expr $acq + 1`;
    done
fi

echo extracting nodif image from averaged data
Rita Nunes's avatar
Rita Nunes committed
rm tmp* -f
rm vol* -f