#!/bin/bash

# exemple d'execució: 
#./testadorRigAfiMRSPMDARTEL /home/yago/Desktop/ImatgeMedica/3D/Registration /home/yago/Desktop/dades/dadesMRI/3DRegSalem/Lesions/101/Basal/SALEM_101_t1.nii /home/yago/Desktop/dades/dadesMRI/3DRegSalem/Lesions/101/12M/SALEM_101_12M_t1.nii PPPPP 50 3

#definim parametres:
sourceDir=$1
fixed=$2
moving=$3 
outputDir=$4
iterations=$5
mRLevels=$6
regType=$7
lesionsBasal=$8
lesions12M=$9

#iterations divided 25 25 50
iterationsSPMDARTEL=$(( iterations /2 ))
iterationsRigAfi=$(( iterations /4 ))
iterationsRigAfi=$(( iterationsRigAfi / (mRLevels) ))

currentDir=$(pwd)
matlabScript=$currentDir/SPMDARTEL.m 
segOutputDir=/home/yago/Desktop/ImatgeMedica/spm8/toolbox/Seg

#ep, si cal fer link simbolic!!!
#yago@yago-despatx-gros:/usr/local/bin$ sudo ln -s /usr/local/MATLAB/R2011a/bin/matlab matlab

# Decide wheteher this is a temporal register
if [[ $regType = ATLAS || $regType = ATLASH ]]
then
	temporalRegister=false
else
	temporalRegister=true
fi

echo "********************************************************************************************************** " 
echo "* Testador RigAfi + SPM DARTEL: Parametres de la prova:"
echo "* Imatge Fixa: $fixed"
echo "* Imatge Mobil: $moving"
echo "* Prefix directori s: $outputDir"
echo "* iteracions, repartides 25,25,50: $iterationsRigAfi $iterationsSPMDARTEL "
echo "* nivells: $mRLevels  "
echo "********************************************************************************************************** " 

echo "                        **************************************************************************************************** " 
echo "                                 Primera part, registre rigid afi "		  
echo "********************************************************************************************************** " 

$sourceDir/BrainReg 2 $fixed $moving $mRLevels $iterationsRigAfi $mRLevels $iterationsRigAfi > sRigAfiMRSPMDARTEL$outputDir.txt

#compute moved ground truth so far
#$sourceDir/transformacioRigid rigidTransform.txt $lesionsBasal $lesions12M intermediate1.nii
#$sourceDir/transformacioAfi affineTransform.txt $lesionsBasal intermediate1.nii intermediate2.nii
if ( "$temporalRegister" -eq true ) ; then
$sourceDir/transformacioAfi affineTransform.txt $lesionsBasal $lesions12M intermediate2.nii
fi

echo " " 
echo "                        **************************************************************************************************** " 
echo "                                 PROVANT Registre SPM DARTEL "		  
echo " executo:  "
echo "                        **************************************************************************************************** " 

# Copy files to make it easier to compute jacobians
cp $fixed $currentDir"/Fixa.nii"
cp outputRigAfi.nii $currentDir"/Mobil.nii"

#write matlab script

echo "spm('defaults','fmri');" > $matlabScript
echo "spm_jobman('initcfg');" >> $matlabScript

echo "ref = '$currentDir"/Fixa.nii"'" >> $matlabScript
echo "mov = '$currentDir"/Mobil.nii"'" >> $matlabScript
echo "c1Fix = '$currentDir"/c1Fixa.nii"'" >> $matlabScript
echo "c1Mov = '$currentDir"/c1Mobil.nii"'" >> $matlabScript
echo "c2Fix = '$currentDir"/c2Fixa.nii"'" >> $matlabScript
echo "c2Mov = '$currentDir"/c2Mobil.nii"'" >> $matlabScript
echo "c2Mov = '$currentDir"/c2Mobil.nii"'" >> $matlabScript
echo "uc1Fix = '$currentDir"/u_c1Fixa_Template.nii"'" >> $matlabScript
echo "uc1Mov = '$currentDir"/u_c1Mobil_Template.nii"'" >> $matlabScript

echo "lesIntermediate = '$currentDir"/intermediate2.nii"'" >> $matlabScript

echo "matlabbatch{1}.spm.tools.preproc8.channel.vols = {ref,mov};" >> $matlabScript
#echo "matlabbatch{1}.spm.tools.preproc8.channel.biasreg = 0.0001;" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.channel.biasreg = 0.01;" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.channel.biasfwhm = 60;" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.channel.write = [0 0];" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(1).tpm = {'$segOutputDir/TPM.nii,1'};" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(1).ngaus = 2;" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(1).native = [1 0];" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(1).warped = [0 0];" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(2).tpm = {'$segOutputDir/TPM.nii,2'};" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(2).ngaus = 2;" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(2).native = [1 0];" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(2).warped = [0 0];" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(3).tpm = {'$segOutputDir/TPM.nii,3'};" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(3).ngaus = 2;" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(3).native = [1 0];" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(3).warped = [0 0];" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(4).tpm = {'$segOutputDir/TPM.nii,4'};" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(4).ngaus = 3;" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(4).native = [1 0];" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(4).warped = [0 0];" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(5).tpm = {'$segOutputDir/TPM.nii,5'};" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(5).ngaus = 4;" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(5).native = [1 0];" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(5).warped = [0 0];" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(6).tpm = {'$segOutputDir/TPM.nii,6'};" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(6).ngaus = 2;" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(6).native = [1 0];" >> $matlabScript
#echo "matlabbatch{1}.spm.tools.preproc8.tissue(6).native = [0 0];" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.tissue(6).warped = [0 0];" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.warp.reg = 4;" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.warp.affreg = 'mni';" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.warp.samp = 3;" >> $matlabScript
echo "matlabbatch{1}.spm.tools.preproc8.warp.write = [0 0];" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.images = {{c1Fix,c1Mov},{c2Fix,c2Mov}}';" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.template = 'Template';" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.rform = 0;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(1).its = 10;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(1).rparam = [4 2 1e-06];" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(1).K = 0;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(1).slam = 16;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(2).its = 10;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(2).rparam = [2 1 1e-06];" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(2).K = 0;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(2).slam = 8;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(3).its = 10;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(3).rparam = [1 0.5 1e-06];" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(3).K = 1;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(3).slam = 4;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(4).its = 10;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(4).rparam = [0.5 0.25 1e-06];" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(4).K = 2;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(4).slam = 2;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(5).its = 10;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(5).rparam = [0.25 0.125 1e-06];" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(5).K = 4;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(5).slam = 1;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(6).its = 10;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(6).rparam = [0.25 0.125 1e-06];" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(6).K = 6;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.param(6).slam = 0.5;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.optim.lmreg = 0.01;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.optim.cyc = 3;" >> $matlabScript
echo "matlabbatch{2}.spm.tools.dartel.warp.settings.optim.its = 3;" >> $matlabScript
echo "matlabbatch{3}.spm.util.defs.comp{1}.dartel.flowfield = {uc1Mov};" >> $matlabScript
echo "matlabbatch{3}.spm.util.defs.comp{1}.dartel.times = [1 0];" >> $matlabScript
echo "matlabbatch{3}.spm.util.defs.comp{1}.dartel.K = 6;" >> $matlabScript
echo "matlabbatch{3}.spm.util.defs.comp{2}.dartel.flowfield = {uc1Fix};" >> $matlabScript
echo "matlabbatch{3}.spm.util.defs.comp{2}.dartel.times = [0 1];" >> $matlabScript
echo "matlabbatch{3}.spm.util.defs.comp{2}.dartel.K = 6;" >> $matlabScript
echo "matlabbatch{3}.spm.util.defs.ofname = 'campDef';" >> $matlabScript
echo "matlabbatch{3}.spm.util.defs.fnames = {mov};" >> $matlabScript
echo "matlabbatch{3}.spm.util.defs.savedir.saveusr = {'$currentDir'};" >> $matlabScript
echo "matlabbatch{3}.spm.util.defs.interp = 1;" >> $matlabScript

if ( "$temporalRegister" -eq true ) ; then
echo "matlabbatch{4}.spm.util.defs.comp{1}.dartel.flowfield = {uc1Mov};" >> $matlabScript
echo "matlabbatch{4}.spm.util.defs.comp{1}.dartel.times = [1 0];" >> $matlabScript
echo "matlabbatch{4}.spm.util.defs.comp{1}.dartel.K = 6;" >> $matlabScript
echo "matlabbatch{4}.spm.util.defs.comp{2}.dartel.flowfield = {uc1Fix};" >> $matlabScript
echo "matlabbatch{4}.spm.util.defs.comp{2}.dartel.times = [0 1];" >> $matlabScript
echo "matlabbatch{4}.spm.util.defs.comp{2}.dartel.K = 6;" >> $matlabScript
echo "matlabbatch{4}.spm.util.defs.ofname = 'campDef';" >> $matlabScript
echo "matlabbatch{4}.spm.util.defs.fnames = {lesIntermediate};" >> $matlabScript
echo "matlabbatch{4}.spm.util.defs.savedir.saveusr = {'$currentDir'};" >> $matlabScript
echo "matlabbatch{4}.spm.util.defs.interp = 1;" >> $matlabScript
fi

#cat $matlabScript

echo "addpath /home/yago/Desktop/ImatgeMedica/spm8">dummiDARTEL.m
echo "addpath $currentDir" >>dummiDARTEL.m
echo "spm_jobman('run', '$matlabScript');">>dummiDARTEL.m
#cat dummiDARTEL.m

echo " executo: 	 "
matlab -nodisplay  <dummiDARTEL.m >>sRigAfiMRSPMDARTEL$outputDir.txt

mkdir filesRigAfiMRSPMDARTEL\_$outputDir

#change the name 
mv wMobil.nii outputRigAfiMRSPMDARTEL.nii
if ( "$temporalRegister" -eq true ) ; then
mv wintermediate2.nii deformedLesions.nii
fi

# compute difference images
$sourceDir/imageDifference $fixed outputRigAfiMRSPMDARTEL.nii diffRigAfiMRSPMDARTEL"After".nii
if ( "$temporalRegister" -eq true ) ; then
$sourceDir/imageDifference $fixed $moving diffRigAfiMRSPMDARTEL"Before"r.nii
fi

#move dicom files
mv "diff"*.nii filesRigAfiMRSPMDARTEL\_$outputDir
mv outputRigAfiMRSPMDARTEL.nii filesRigAfiMRSPMDARTEL\_$outputDir
mv outputRigAfi.nii filesRigAfiMRSPMDARTEL\_$outputDir

#move lesion information
if ( "$temporalRegister" -eq true ) ; then
cp $lesionsBasal ./lesionsBasal.nii
cp $lesions12M ./lesions12M.nii

mv lesionsBasal.nii filesRigAfiMRSPMDARTEL\_$outputDir
mv lesions12M.nii filesRigAfiMRSPMDARTEL\_$outputDir
mv deformedLesions.nii filesRigAfiMRSPMDARTEL\_$outputDir
mv intermediate*.nii filesRigAfiMRSPMDARTEL\_$outputDir
fi

#move the rest
mv sRigAfiMRSPMDARTEL$outputDir.txt filesRigAfiMRSPMDARTEL\_$outputDir
mv Template*.* filesRigAfiMRSPMDARTEL\_$outputDir
mv u_c1Fixa_Template.nii filesRigAfiMRSPMDARTEL\_$outputDir
mv u_c1Mobil_Template.nii filesRigAfiMRSPMDARTEL\_$outputDir
mv c*Fixa.nii filesRigAfiMRSPMDARTEL\_$outputDir
mv c*Mobil.nii filesRigAfiMRSPMDARTEL\_$outputDir
mv y_campDef.nii filesRigAfiMRSPMDARTEL\_$outputDir
mv jy_campDef.nii filesRigAfiMRSPMDARTEL\_$outputDir
mv *.mat filesRigAfiMRSPMDARTEL\_$outputDir

mv affineTransform.txt filesRigAfiMRSPMDARTEL\_$outputDir
mv rigidTransform.txt filesRigAfiMRSPMDARTEL\_$outputDir

rm $currentDir"/Fixa.nii"
rm $currentDir"/Mobil.nii"
#rm $matlabScript
#rm dummiDARTEL.m
