From 4615da10897d8dba0f4428cf68bf98c003caee31 Mon Sep 17 00:00:00 2001 From: Tim Behrens <behrens@fmrib.ox.ac.uk> Date: Wed, 8 Mar 2006 13:36:11 +0000 Subject: [PATCH] *** empty log message *** --- old_bedpostX | 243 ++++++++++++++++++++++++++++++++++++++++++ old_bedpostX_cleanup | 21 ++++ old_bedpostX_kill_pid | 21 ++++ old_bedpostX_proc | 40 +++++++ old_bedpost_proc | 12 +-- probtrackxOptions.h | 11 +- streamlines.cc | 9 ++ tractvolsx.h | 2 +- xfibres.cc | 8 +- 9 files changed, 353 insertions(+), 14 deletions(-) create mode 100644 old_bedpostX create mode 100644 old_bedpostX_cleanup create mode 100644 old_bedpostX_kill_pid create mode 100644 old_bedpostX_proc diff --git a/old_bedpostX b/old_bedpostX new file mode 100644 index 0000000..b6a5563 --- /dev/null +++ b/old_bedpostX @@ -0,0 +1,243 @@ +#!/bin/sh + +# SHCOPYRIGHT + +Usage() { + echo "" + echo "Usage: bedpostX <subject directory> " + echo "" + echo "expects to find bvals and bvecs in subject directory" + echo "expects to find data nodif_brain_mask nodif in subject directory" + echo "" + exit +} + +trap Clean_Exit 2 + + +Clean_Exit(){ + + if [ -d ${subjdir}.bedpostX/logs/pid_${$} ];then + i=`ls ${subjdir}.bedpostX/logs/pid_${$}` + for j in ${i};do + host=`echo $j | awk -F _fdt_ '{print $1}'` + pid=`echo $j | awk -F _fdt_ '{print $2}'` + if [ "x${FSLMACHINELIST}" != "x" ]; then +# ${FSLREMOTECALL} $host "kill -KILL $pid" #this leaves one child process per processor - what can you do? + echo "if [ -r /usr/local/etc/fslconf/fsl.sh ];then . /usr/local/etc/fslconf/fsl.sh;fi; if [ -r /etc/fslconf/fsl.sh ];then . /etc/fslconf/fsl.sh;fi; if [ -r \${HOME}/.fslconf/fsl.sh ]; then . \${HOME}/.fslconf/fsl.sh; fi; if [ x\${FSLDIR} != "x" ];then \${FSLDIR}/bin/bedpostX_kill_pid ${pid} >/dev/null 2>&1; else echo FSLDIR not set in any default location on machine `hostname`;fi" | $FSLREMOTECALL $host /bin/sh >/dev/null 2>&1 & + else + ${FSLDIR}/bin/bedpostX_kill_pid ${pid} + fi + rm ${subjdir}.bedpostX/logs/pid_${$}/${j} + done + fi + ExitUnlock; +} + +Lock(){ + if [ "x${FSLLOCKDIR}" != "x" ];then + touch ${FSLLOCKDIR}/.bedpostX.lock + fi +} + +ExitUnlock(){ + if [ -f ${FSLLOCKDIR}/.bedpostX.lock ];then + rm ${FSLLOCKDIR}/.bedpostX.lock + fi + + #clean up slices + ndat_sl=`echo ${subjdir}/data_slice_* | grep -v "slice_\*" |wc -w` + nnodif_sl=`echo ${subjdir}/nodif_brain_mask_slice_* | grep -v "slice_\*" |wc -w` + if [ $ndat_sl -ge 0 ] ;then + rm -f ${subjdir}/data_slice_* + fi + + if [ $nnodif_sl -ge 0 ] ;then + rm -f ${subjdir}/nodif_brain_mask_slice_* + fi + + exit +} + +LockTest(){ + if [ "x${FSLLOCKDIR}" = "x" ];then + echo 1; + elif [ ! -f ${FSLLOCKDIR}/.bedpostX.lock ];then + echo 1; + else + echo 0; + fi +} + +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 + +if [ `LockTest` -eq 0 ]; then + echo "bedpostX is currently being run - try again later" + exit +fi + +if [ "x${FSLMACHINELIST}" != "x" ];then + if [ "x${FSLREMOTECALL}" = "x" ];then + echo "error: you must set FSLREMOTECALL if you have set FSLMACHINELIST" + exit + fi +fi + +Lock; + +subjdir=`make_absolute $1` +subjdir=`echo $subjdir | sed 's/\/$/$/g'` + +echo subjectdir is $subjdir + +#check that all required files exist + + +if [ ! -d $subjdir ]; then + echo "subject directory $1 not found" + ExitUnlock +fi + +if [ ! -f ${subjdir}/bvecs ]; then + echo "${subjdir}/bvecs not found" + ExitUnlock +fi + +if [ ! -f ${subjdir}/bvals ]; then + echo "${subjdir}/bvals not found" + ExitUnlock +fi + +if [ `${FSLDIR}/bin/imtest ${subjdir}/data` -eq 0 ]; then + echo "${subjdir}/data not found" + ExitUnlock +fi + +if [ `${FSLDIR}/bin/imtest ${subjdir}/nodif` -eq 0 ]; then + echo "${subjdir}/nodif not found" + ExitUnlock +fi + +if [ `${FSLDIR}/bin/imtest ${subjdir}/nodif_brain_mask` -eq 0 ]; then + echo "${subjdir}/nodif_brain_mask not found" + ExitUnlock +fi + + +echo making bedpostX directory +mkdir -p ${subjdir}.bedpostX/ +mkdir -p ${subjdir}.bedpostX/diff_slices + +echo copying files to bedpostX directory +cp ${subjdir}/bvecs ${subjdir}/bvals ${subjdir}.bedpostX +${FSLDIR}/bin/imcp ${subjdir}/nodif ${subjdir}/nodif_brain_mask ${subjdir}.bedpostX +${FSLDIR}/bin/avwmaths ${subjdir}/nodif -mas ${subjdir}/nodif_brain_mask ${subjdir}.bedpostX/nodif_brain + + +mkdir -p ${subjdir}.bedpostX/logs +mkdir -p ${subjdir}.bedpostX/logs/pid_${$} + +nslices=`${FSLDIR}/bin/avwval ${subjdir}/data dim3` + +${FSLDIR}/bin/avwslice ${subjdir}/data +${FSLDIR}/bin/avwslice ${subjdir}/nodif_brain_mask + +#for parallel processing, the following need to be setup elsewhere +#FSLMACHINELIST="list of machines (can be duplicated for two processors etc.)" +#FSLREMOTECALL="ssh (or rsh or whatever you want to use)" + +if [ "x$FSLMACHINELIST" = "x" ] ; then + echo "processing data on local host" + ${FSLDIR}/bin/bedpostX_proc $subjdir $nslices ${subjdir}.bedpostX/logs/pid_${$} & +else + echo "processing data on hosts: $FSLMACHINELIST" + for machine in $FSLMACHINELIST; do + echo "if [ -r /usr/local/etc/fslconf/fsl.sh ];then . /usr/local/etc/fslconf/fsl.sh;fi; if [ -r /etc/fslconf/fsl.sh ];then . /etc/fslconf/fsl.sh;fi; if [ -r \${HOME}/.fslconf/fsl.sh ]; then . \${HOME}/.fslconf/fsl.sh; fi; if [ x\${FSLDIR} != "x" ];then \${FSLDIR}/bin/bedpostX_proc $subjdir $nslices ${subjdir}.bedpostX/logs/pid_${$}; else echo FSLDIR not set in any default location on machine `hostname`;fi"| $FSLREMOTECALL $machine /bin/sh & + done +fi + + +b=0 +finished=0; +while [ $finished -eq 0 ];do + b=`expr $b + 1 ` + sleep 60; + nfin=`echo ${subjdir}.bedpostX/logs/.*_finished | grep -v ".\*" |wc -w` + if [ $nfin -eq $nslices ];then + finished=1; + fi + if [ $b -eq 10 ]; then + echo "$nfin slices processed" + b=0 + fi +done + +#postprocessing +#postprocess $subjdir + + +numfib=`${FSLDIR}/bin/imglob -oneperimage ${subjdir}.bedpostX/diff_slices/data_slice_0000/f*samples |wc -w` + + +fib=1; +while [ $fib -le $numfib ];do + ${FSLDIR}/bin/avwmerge -z ${subjdir}.bedpostX/merged_th${fib}samples `${FSLDIR}/bin/imglob -oneperimage ${subjdir}.bedpostX/diff_slices/data_slice_*/th${fib}samples` + ${FSLDIR}/bin/avwmerge -z ${subjdir}.bedpostX/merged_ph${fib}samples `${FSLDIR}/bin/imglob -oneperimage ${subjdir}.bedpostX/diff_slices/data_slice_*/ph${fib}samples` + ${FSLDIR}/bin/avwmerge -z ${subjdir}.bedpostX/merged_f${fib}samples `${FSLDIR}/bin/imglob -oneperimage ${subjdir}.bedpostX/diff_slices/data_slice_*/f${fib}samples` + ${FSLDIR}/bin/avwmaths ${subjdir}.bedpostX/merged_th${fib}samples -Tmean ${subjdir}.bedpostX/mean_th${fib}samples + ${FSLDIR}/bin/avwmaths ${subjdir}.bedpostX/merged_ph${fib}samples -Tmean ${subjdir}.bedpostX/mean_ph${fib}samples + ${FSLDIR}/bin/avwmaths ${subjdir}.bedpostX/merged_f${fib}samples -Tmean ${subjdir}.bedpostX/mean_f${fib}samples + + ${FSLDIR}/bin/make_dyadic_vectors ${subjdir}.bedpostX/merged_th${fib}samples ${subjdir}.bedpostX/merged_ph${fib}samples ${subjdir}.bedpostX/nodif_brain_mask ${subjdir}.bedpostX/dyads${fib} + + fib=`echo "$fib +1"|bc`; +done + +echo Removing intermediate files + +if [ `imtest ${subjdir}.bedpostX/merged_th1samples` -eq 1 ];then + if [ `imtest ${subjdir}.bedpostX/merged_ph1samples` -eq 1 ];then + if [ `imtest ${subjdir}.bedpostX/merged_f1samples` -eq 1 ];then + rm -rf ${subjdir}.bedpostX/diff_slices + rm -f ${subjdir}/data_slice_* + rm -f ${subjdir}/nodif_brain_mask_slice_* + fi + fi +fi + +echo Creating identity xfm + +xfmdir=${subjdir}.bedpostX/xfms +echo 1 0 0 0 > ${xfmdir}/eye.mat +echo 0 1 0 0 >> ${xfmdir}/eye.mat +echo 0 0 1 0 >> ${xfmdir}/eye.mat +echo 0 0 0 1 >> ${xfmdir}/eye.mat + +echo Done + + + + + + +ExitUnlock() + + + + + diff --git a/old_bedpostX_cleanup b/old_bedpostX_cleanup new file mode 100644 index 0000000..908a46f --- /dev/null +++ b/old_bedpostX_cleanup @@ -0,0 +1,21 @@ +#!/bin/sh + +# Copyright (C) 2004 University of Oxford +# +# SHCOPYRIGHT + +if [ "x$FSLMACHINELIST" = "x" ] ; then + ${FSLDIR}/bin/bedpostX_kill_all +else + unique_machines=`echo $FSLMACHINELIST |tr " " \\\n |sort -u` + echo $unique_machines; + for machine in $unique_machines; do + echo "if [ -r /usr/local/etc/fslconf/fsl.sh ];then . /usr/local/etc/fslconf/fsl.sh;fi; if [ -r /etc/fslconf/fsl.sh ];then . /etc/fslconf/fsl.sh;fi; if [ -r \${HOME}/.fslconf/fsl.sh ]; then . \${HOME}/.fslconf/fsl.sh; fi; if [ x\${FSLDIR} != "x" ];then \${FSLDIR}/bin/bedpostX_kill_all; else echo FSLDIR not set in any default location on machine `hostname`;fi" | $FSLREMOTECALL $machine /bin/sh & + done +fi + +if [ "x${FSLLOCKDIR}" != "x" ];then + if [ -r ${FSLLOCKDIR}/.bedpostX.lock ];then + rm ${FSLLOCKDIR}/.bedpostX.lock + fi +fi \ No newline at end of file diff --git a/old_bedpostX_kill_pid b/old_bedpostX_kill_pid new file mode 100644 index 0000000..7adae14 --- /dev/null +++ b/old_bedpostX_kill_pid @@ -0,0 +1,21 @@ +#!/bin/sh + +# Copyright (C) 2004 University of Oxford +# +# SHCOPYRIGHT + +Usage(){ + echo "bedpostX_kill_pid <pid>" + echo "" + echo "<pid> is the pid of the bedpostX_proc" + echo "kills this process + all diff_pvm children" + echo "" + exit +} + +[ "$1" = "" ] && Usage +pid=$1 + +i=`ps -fU $USER |grep -v grep | grep xfibres |grep ${pid}| awk '{print $2}'` +kill -KILL $pid $i + diff --git a/old_bedpostX_proc b/old_bedpostX_proc new file mode 100644 index 0000000..c9868ef --- /dev/null +++ b/old_bedpostX_proc @@ -0,0 +1,40 @@ +#!/bin/sh + +# Copyright (C) 2004 University of Oxford +# +# SHCOPYRIGHT + +Usage() { + echo "" + echo "Usage: bedpostX_proc <subject_dir> <nslices> [piddir]" + echo "" + exit +} + + +[ "$2" = "" ] && Usage +[ "$3" = "" ] || touch ${3}/`hostname`_fdt_${$} + + +subjdir=$1 +nslices=$2 + + + +slice=0 +while [ $slice -lt $nslices ];do + slicezp=`${FSLDIR}/bin/zeropad $slice 4` + if [ ! -f ${subjdir}.bedpostX/logs/.$slicezp ] ; then + echo `hostname`_${$} > ${subjdir}.bedpostX/logs/.$slicezp + sleep 10 + if [ `hostname`_${$} = `cat ${subjdir}.bedpostX/logs/.$slicezp | sed -n '1p'` ] ; then + nice ${FSLDIR}/bin/xfibres --data=$subjdir/data_slice_$slicezp --mask=$subjdir/nodif_brain_mask_slice_$slicezp -b $subjdir/bvals -r $subjdir/bvecs --forcedir --logdir=$subjdir.bedpostX/diff_slices/data_slice_$slicezp --nj=1000 --bi=2000 --bn=0 --se=20 --nfibres=2 --fudge=1.5> $subjdir.bedpostX/logs/log$slicezp + + touch ${subjdir}.bedpostX/logs/.${slicezp}_finished + fi + fi + slice=`echo "$slice + 1" | bc` +done + +[ "$3" = "" ] || rm ${3}/`hostname`_fdt_${$} +sleep 10 \ No newline at end of file diff --git a/old_bedpost_proc b/old_bedpost_proc index 9c677c8..c611e04 100755 --- a/old_bedpost_proc +++ b/old_bedpost_proc @@ -6,7 +6,7 @@ Usage() { echo "" - echo "Usage: bedpost_proc <subject_dir> <nslices> [piddir]" + echo "Usage: bedpostX_proc <subject_dir> <nslices> [piddir]" echo "" exit } @@ -24,12 +24,12 @@ nslices=$2 slice=0 while [ $slice -lt $nslices ];do slicezp=`${FSLDIR}/bin/zeropad $slice 4` - if [ ! -f ${subjdir}.bedpost/logs/.$slicezp ] ; then - echo `hostname`_${$} > ${subjdir}.bedpost/logs/.$slicezp + if [ ! -f ${subjdir}.bedpostX/logs/.$slicezp ] ; then + echo `hostname`_${$} > ${subjdir}.bedpostX/logs/.$slicezp sleep 10 - if [ `hostname`_${$} = `cat ${subjdir}.bedpost/logs/.$slicezp | sed -n '1p'` ] ; then - nice ${FSLDIR}/bin/diff_pvm --data=${subjdir}/data_slice_$slicezp --mask=${subjdir}/nodif_brain_mask_slice_$slicezp -b ${subjdir}/bvals -r ${subjdir}/bvecs --logdir=${subjdir}.bedpost/diff_slices/data_slice_$slicezp --nj=1300 --bi=300 --se=20 > ${subjdir}.bedpost/logs/log$slicezp - touch ${subjdir}.bedpost/logs/.${slicezp}_finished + if [ `hostname`_${$} = `cat ${subjdir}.bedpostX/logs/.$slicezp | sed -n '1p'` ] ; then + nice ${FSLDIR}/bin/diff_pvm --data=${subjdir}/data_slice_$slicezp --mask=${subjdir}/nodif_brain_mask_slice_$slicezp -b ${subjdir}/bvals -r ${subjdir}/bvecs --logdir=${subjdir}.bedpostX/diff_slices/data_slice_$slicezp --nj=1300 --bi=300 --se=20 > ${subjdir}.bedpostX/logs/log$slicezp + touch ${subjdir}.bedpostX/logs/.${slicezp}_finished fi fi slice=`echo "$slice + 1" | bc` diff --git a/probtrackxOptions.h b/probtrackxOptions.h index 9e23fea..6025418 100644 --- a/probtrackxOptions.h +++ b/probtrackxOptions.h @@ -9,9 +9,9 @@ #if !defined(probtrackxOptions_h) #define probtrackxOptions_h -#include <string> -#include <iostream> -#include <fstream> +#include <string> +#include <iostream.h> +#include <fstream.h> #include <stdlib.h> #include <stdio.h> #include "utils/options.h" @@ -57,6 +57,7 @@ class probtrackxOptions { Option<float> steplength; Option<bool> loopcheck; Option<bool> usef; + Option<bool> randfib; Option<bool> modeuler; Option<int> rseed; void parse_command_line(int argc, char** argv,Log& logger); @@ -174,6 +175,9 @@ class probtrackxOptions { usef(string("-f,--usef"), false, string("Use anisotropy to constrain tracking"), false, no_argument), + randfib(string("--randfib"), false, + string("Select randomly from the first two fibres when seeding"), + false, no_argument), modeuler(string("--modeuler"), false, string("Use modified euler streamlining"), false, no_argument), @@ -215,6 +219,7 @@ class probtrackxOptions { options.add(steplength); options.add(loopcheck); options.add(usef); + options.add(randfib); options.add(modeuler); options.add(rseed); } diff --git a/streamlines.cc b/streamlines.cc index 765a4e8..8f3749e 100644 --- a/streamlines.cc +++ b/streamlines.cc @@ -538,6 +538,15 @@ namespace TRACT{ //onewayonly for mesh things.. cout <<x<<" "<<y<<" "<<z<<endl; int fibst=m_seeds(int(round(x)),int(round(y)),int(round(z)))-1;//fibre to start with is taken from seed volume.. + + if(opts.randfib.value()){ + float tmp=rand()/RAND_MAX; + if(tmp>0.5) + fibst=0; + else + fibst=1;// fix this for > 2 fibres + } + for(int p=0;p<opts.nparticles.value();p++){ if(opts.verbose.value()>1) logger.setLogFile("particle"+num2str(p)); diff --git a/tractvolsx.h b/tractvolsx.h index 0938b41..8ea1ed5 100644 --- a/tractvolsx.h +++ b/tractvolsx.h @@ -161,6 +161,7 @@ namespace TRACTVOLSX{ init_sample=false; } else{ + for(unsigned int fib=0;fib<thsamples.size();fib++){ if((*fsamples[fib])(int(newx),int(newy),int(newz),int(samp))>opts.fibthresh.value()){ float phtmp=(*phsamples[fib])(int(newx),int(newy),int(newz),int(samp)); @@ -176,7 +177,6 @@ namespace TRACTVOLSX{ } } - if(dotmax==0){ theta=(*thsamples[0])(int(newx),int(newy),int(newz),int(samp)); phi=(*phsamples[0])(int(newx),int(newy),int(newz),int(samp)); diff --git a/xfibres.cc b/xfibres.cc index 9974ae7..7db3a1f 100644 --- a/xfibres.cc +++ b/xfibres.cc @@ -1,7 +1,7 @@ /* Xfibres Diffusion Partial Volume Model Tim Behrens - FMRIB Image Analysis Group - + Copyright (C) 2005 University of Oxford */ /* CCOPYRIGHT */ @@ -9,7 +9,7 @@ #include <iostream> #include <fstream> #include <iomanip> -#include <sstream> +#include <strstream> #define WANT_STREAM #define WANT_MATH // #include "newmatap.h" @@ -368,8 +368,8 @@ public: sort(sfs.begin(),sfs.end()); for(int samp=1;samp<=m_dsamples.Nrows();samp++){ - for(int f=0;f<opts.nfibres.value();f++){ - thsamples_out[f](samp,vox)=m_thsamples[sfs[(sfs.size()-1)-f].second](samp,vox); + for(int f=0;f<opts.nfibres.value(); + thsamples_out[f](samp,vox)=m_thsamples[sfs[(sfs.size()-1)-f].second](samp,vox); phsamples_out[f](samp,vox)=m_phsamples[sfs[(sfs.size()-1)-f].second](samp,vox); fsamples_out[f](samp,vox)=m_fsamples[sfs[(sfs.size()-1)-f].second](samp,vox); lamsamples_out[f](samp,vox)=m_lamsamples[sfs[(sfs.size()-1)-f].second](samp,vox); -- GitLab