Newer
Older
Moises Fernandez
committed
#!/bin/sh
# Copyright (C) 2004 University of Oxford
#
Moises Fernandez
committed
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${FSLDIR}/lib
Moises Fernandez
committed
Moises Fernandez
committed
Usage() {
echo ""
echo "Usage: bedpostx <subject directory> [options]"
echo ""
echo "expects to find bvals and bvecs in subject directory"
echo "expects to find data and nodif_brain_mask in subject directory"
echo "expects to find grad_dev in subject directory, if -g is set"
echo ""
echo "<options>:"
echo "-NJOBS (number of jobs to queue, the data is divided in NJOBS parts, usefull for a GPU cluster, default 1)"
echo "-Q (name of the GPU(s) queue, default cuda.q)"
Moises Fernandez
committed
echo "-n (number of fibres per voxel, default 2)"
echo "-w (ARD weight, more weight means less secondary fibres per voxel, default 1)"
echo "-b (burnin period, default 1000)"
echo "-j (number of jumps, default 1250)"
echo "-s (sample every, default 25)"
echo "-model (1 for monoexponential, 2 for multiexponential, default 1)"
echo "-g (consider gradient nonlinearities, default off)"
echo ""
echo ""
echo "ALTERNATIVELY: you can pass on xfibres options onto directly bedpostx"
echo " For example: bedpostx <subject directory> --noard --cnonlinear"
echo " Type 'xfibres --help' for a list of available options "
echo " Default options will be bedpostx default (see above), and not xfibres default."
echo ""
echo "Note: Use EITHER old OR new syntax."
exit 1
}
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
monitor(){
cat <<EOM > ${subjdir}.bedpostX/monitor
#!/bin/sh
nparts=0
if [ $njobs -eq 1 ]; then
#1 part (GPU) and several subparts
#voxels processed in each subpart are 12800 or more if the last one is less than 6400 (1 part less)
nparts=\$(($nvox/12800))
if [ \$nparts%12800 != 0 ];then
nparts=\$((\$nparts + 1))
fi
last_part=\$(($nvox-(((\$nparts-1))*12800)))
if [ \$last_part -lt 6400 ];then
nparts=\$((\$nparts - 1))
fi
else
nparts=$njobs
fi
echo
echo "----- Bedpostx Monitor -----"
finished=0
lastprinted=0
havedad=2
while [ \$finished -eq 0 ] ; do
nfin=0
part=0
errorFiles=\`ls ${subjdir}.bedpostX/logs/*.e* 2> /dev/null \`
for errorFile in \$errorFiles
do
if [ -s \$errorFile ]; then
echo An error ocurred. Please check file \$errorFile
kill -9 $$
exit 1
fi
done
while [ \$part -le \$nparts ];do
if [ -e ${subjdir}.bedpostX/logs/monitor/\$part ]; then
nfin=\$((\$nfin + 1))
fi
part=\$((\$part + 1))
done
newmessages=\$((\$nfin - \$lastprinted))
while [ "\$newmessages" -gt 0 ];do
lastprinted=\$((\$lastprinted + 1))
echo \$lastprinted parts processed out of \$nparts
newmessages=\$((\$newmessages - 1))
done
if [ -f ${subjdir}.bedpostX/xfms/eye.mat ] ; then
finished=1
echo "All parts processed"
exit
fi
if [ ! \$havedad -gt 0 ]; then
exit 0
fi
if [ "x$SGE_ROOT" == "x" ]; then
havedad=\`ps -e -o pid | grep "$$\\b" | wc -l\`
fi
sleep 50;
done
EOM
chmod +x ${subjdir}.bedpostX/monitor
}
Moises Fernandez
committed
make_absolute(){
dir=$1;
if [ -d ${dir} ]; then
OLDWD=`pwd`
cd ${dir}
dir_all=`pwd`
cd $OLDWD
else
dir_all=${dir}
fi
echo ${dir_all}
}
[ "$1" = "" ] && Usage
subjdir=`make_absolute $1`
subjdir=`echo $subjdir | sed 's/\/$/$/g'`
echo "---------------------------------------------"
echo "------------ BedpostX GPU Version -----------"
echo "---------------------------------------------"
Moises Fernandez
committed
echo subjectdir is $subjdir
#parse option arguments
queue="-q $FSLGECUDAQ"
njobs=1
Moises Fernandez
committed
nfibres=2
fudge=1
burnin=1000
njumps=1250
sampleevery=25
model=1
gflag=0
other=""
if [ "x$SGE_ROOT" = "x" ]; then
queue=''
fi
Moises Fernandez
committed
shift
while [ ! -z "$1" ]
do
case "$1" in
-Q) queue=-q $2;shift;;
Moises Fernandez
committed
-n) nfibres=$2;shift;;
-w) fudge=$2;shift;;
-b) burnin=$2;shift;;
-j) njumps=$2;shift;;
-s) sampleevery=$2;shift;;
-model) model=$2;shift;;
-g) gflag=1;;
*) other=$other" "$1;;
Moises Fernandez
committed
esac
shift
done
opts="--nf=$nfibres --fudge=$fudge --bi=$burnin --nj=$njumps --se=$sampleevery --model=$model"
defopts="--cnonlinear"
opts="$opts $defopts $other"
Moises Fernandez
committed
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#check that all required files exist
if [ ! -d $subjdir ]; then
echo "subject directory $1 not found"
exit 1
fi
if [ ! -e ${subjdir}/bvecs ]; then
echo "${subjdir}/bvecs not found"
exit 1
fi
if [ ! -e ${subjdir}/bvals ]; then
echo "${subjdir}/bvals not found"
exit 1
fi
if [ `${FSLDIR}/bin/imtest ${subjdir}/data` -eq 0 ]; then
echo "${subjdir}/data not found"
exit 1
fi
if [ ${gflag} -eq 1 ]; then
if [ `${FSLDIR}/bin/imtest ${subjdir}/grad_dev` -eq 0 ]; then
echo "${subjdir}/grad_dev not found"
exit 1
fi
fi
if [ `${FSLDIR}/bin/imtest ${subjdir}/nodif_brain_mask` -eq 0 ]; then
echo "${subjdir}/nodif_brain_mask not found"
exit 1
fi
if [ -e ${subjdir}.bedpostX/xfms/eye.mat ]; then
echo "${subjdir} has already been processed: ${subjdir}.bedpostX."
echo "Delete or rename ${subjdir}.bedpostX before repeating the process."
exit 1
fi
Moises Fernandez
committed
echo Making bedpostx directory structure
mkdir -p ${subjdir}.bedpostX/
mkdir -p ${subjdir}.bedpostX/diff_parts
Moises Fernandez
committed
mkdir -p ${subjdir}.bedpostX/logs
mkdir -p ${subjdir}.bedpostX/logs/logs_gpu
mkdir -p ${subjdir}.bedpostX/logs/monitor
rm -f ${subjdir}.bedpostX/logs/monitor/*
Moises Fernandez
committed
mkdir -p ${subjdir}.bedpostX/xfms
mailto=`whoami`@fmrib.ox.ac.uk
Moises Fernandez
committed
echo Copying files to bedpost directory
cp ${subjdir}/bvecs ${subjdir}/bvals ${subjdir}.bedpostX
${FSLDIR}/bin/imcp ${subjdir}/nodif_brain_mask ${subjdir}.bedpostX
if [ `${FSLDIR}/bin/imtest ${subjdir}/nodif` = 1 ] ; then
${FSLDIR}/bin/fslmaths ${subjdir}/nodif -mas ${subjdir}/nodif_brain_mask ${subjdir}.bedpostX/nodif_brain
Moises Fernandez
committed
fi
nvox=`${FSLDIR}/bin/fslstats $subjdir.bedpostX/nodif_brain_mask -V | cut -d ' ' -f1 `
echo Queuing parallel processing stage
[ -f ${subjdir}.bedpostX/commands.txt ] && rm ${subjdir}.bedpostX/commands.txt
Moises Fernandez
committed
monitor
if [ "x$SGE_ROOT" = "x" ]; then
${subjdir}.bedpostX/monitor&
Moises Fernandez
committed
fi
part=0
while [ $part -lt $njobs ]
do
partzp=`$FSLDIR/bin/zeropad $part 4`
if [ ${gflag} -eq 1 ]; then
gopts="$opts --gradnonlin=${subjdir}/grad_dev"
else
gopts=$opts
fi
echo "${FSLDIR}/bin/xfibres_gpu --data=${subjdir}/data --mask=$subjdir.bedpostX/nodif_brain_mask -b ${subjdir}.bedpostX/bvals -r ${subjdir}.bedpostX/bvecs --forcedir --logdir=$subjdir.bedpostX/diff_parts/data_part_$partzp $gopts ${subjdir} $part $njobs > $subjdir.bedpostX/logs/log$partzp && echo Done" >> ${subjdir}.bedpostX/commands.txt
part=$(($part + 1))
done
Moises Fernandez
committed
bedpostid=`${FSLDIR}/bin/fsl_sub $queue -l ${subjdir}.bedpostX/logs -M $mailto -N bedpostx_gpu -t ${subjdir}.bedpostX/commands.txt`
Moises Fernandez
committed
echo Queuing post processing stage
mergeid=`${FSLDIR}/bin/fsl_sub $queue -j $bedpostid -m ase -N bpx_postproc -l ${subjdir}.bedpostX/logs ${FSLDIR}/bin/bedpostx_postproc_gpu.sh --data=${subjdir}/data --mask=$subjdir.bedpostX/nodif_brain_mask -b ${subjdir}.bedpostX/bvals -r ${subjdir}.bedpostX/bvecs --forcedir --logdir=$subjdir.bedpostX/diff_parts $gopts $nvox $njobs ${subjdir}`
Moises Fernandez
committed
if [ "x$SGE_ROOT" != "x" ]; then
echo
echo Type ${subjdir}.bedpostX/monitor to show progress.
echo Type ${subjdir}.bedpostX/cancel to terminate all the queued tasks.
cat <<EOC > ${subjdir}.bedpostX/cancel
#!/bin/sh
qdel $mergeid $bedpostid
EOC
chmod +x ${subjdir}.bedpostX/cancel
Moises Fernandez
committed
echo
echo You will get an email at the end of the post-processing stage.
echo
else
sleep 60