#!/bin/bash # Copyright (C) 2019 University of Oxford # # SHCOPYRIGHT # Written by Saad Jbabdi & Stam Sotiropoulos (based on Marius de Groot autoPtx code) # Protocols created by Rogier Mars et al. #Location of CUDA binaries and libraries #LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/opt/cuda-7.5/lib #export LD_LIBRARY_PATH ptxbin_gpu=$FSLDIR/bin/probtrackx2_gpu # Location of xtract data datadir=$FSLDIR/etc/xtract_data Usage() { cat << EOF Usage: xtract -bpx -out -str -p [options] xtract -bpx -out -species HUMAN [options] xtract -bpx -out -species MACAQUE [options] Compulsory arguments: -bpx Path to bedpostx folder -out Path to output folder And EITHER: -str Structures file (format: [samples=1], 1 means 1000, '#' to skip lines) -p Protocols folder (all masks in same standard space) Or: -species One of HUMAN or MACAQUE Optional arguments: -stdwarp Standard2diff and Diff2standard transforms (Default=bedpostx_dir/xfms/{standard2diff,diff2standard}) -gpu Use GPU version -native Run tractography in native (diffusion) space -res Output resolution (Default=same as in protocol folders unless '-native' used) EOF exit 1 } Splash (){ cat < $targetfile else if [ $res -gt 0 ];then # Resample at a different resolution for tfile in $targets;do t=`basename $tfile` $FSLDIR/bin/flirt -in $tfile -out $out/masks/$struct/$t -applyisoxfm $res -ref $tfile $FSLDIR/bin/fslmaths $out/masks/$struct/$t -thr 0.1 -bin $out/masks/$struct/$t -odt char done echo $out/masks/$struct/target* > $targetfile else echo $targets > $targetfile fi fi # Get generic options o=$opts # Add inclusion/exclusion masks if [ `$FSLDIR/bin/imtest $stop` -eq 1 ];then o="$o --stop=$stop" fi if [ `$FSLDIR/bin/imtest $exclude` -eq 1 ];then o="$o --avoid=$exclude" fi # Add seed/target o1="$o --nsamples=$nseed -x $seed " if [ "x${targets}" != "x" ];then #Add waypoints if there are any o1=" $o1 --waypoints=$targetfile " fi # Outputs o1=" $o1 -o density --dir=$out/tracts/$struct" # Does the protocol define a second run with inverted seed / target masks? if [ -e $maskdir/invert ]; then #Invert-mode if [ `$FSLDIR/bin/imtest $maskdir/target.nii.gz` -eq 1 ];then # Check if a target.nii.gz image exists when invert option has been selected. mkdir -p $out/tracts/$struct/tractsInv if [ `$FSLDIR/bin/imtest $out/masks/$struct/target.nii.gz` -eq 1 ]; then target=$out/masks/$struct/target else target=$maskdir/target fi o2="$o --nsamples=$nseed -x ${target} --waypoints=$seed -o density --dir=$out/tracts/$struct/tractsInv" # merge runs for forward and inverted tractography runs and then normalise (create commands but don't execute) mergecmd="$FSLDIR/bin/fslmaths $out/tracts/$struct/density -add $out/tracts/$struct/tractsInv/density $out/tracts/$struct/sum_density" #Add waypoints (create command but don't execute) addcmd="echo \"scale=5; \`cat $out/tracts/$struct/waytotal\` + \`cat $out/tracts/$struct/tractsInv/waytotal\` \"|bc > $out/tracts/$struct/sum_waytotal" # Waypoint normalisation (create command but don't execute) normcmd="$FSLDIR/bin/fslmaths $out/tracts/$struct/sum_density -div \`cat $out/tracts/$struct/sum_waytotal\` $out/tracts/$struct/densityNorm" # Append to command list echo "$ptxbin $o1; $ptxbin $o2; $mergecmd; $addcmd; $normcmd" >> $commands else echo "Invert Option selected, but more than one target defined! A 'target.nii.gz' is expected. Exiting now" exit 1 fi else #No invert-mode # Waypoint normalisation (create command but don't execute) normcmd="$FSLDIR/bin/fslmaths $out/tracts/$struct/density -div \`cat $out/tracts/$struct/waytotal\` $out/tracts/$struct/densityNorm" # Append to command list echo "$ptxbin $o1; $normcmd" >> $commands fi fi done < $str chmod +x $commands if [ "x$SGE_ROOT" != "x" ]; then # Submit all commands to run in parallel on the cluster # One job per tract for a CPU cluster, one job for all tracts for a GPU cluster. if [ $gpu -eq 0 ];then fsl_sub -q long.q -l $out/logs -N xtract -t $commands else fsl_sub -q $FSLGECUDAQ -l $out/logs -N xtract $commands #Submission call for the WashU GPU cluster #qsub -l nodes=1:ppn=1:gpus=1:K20x,walltime=04:00:00,mem=8gb -N autoPtx_GPU -e $out/logs/GPUerrofile -o $out/logs/GPUoutfile $commands fi else # If no SGE, run locally sh $commands fi #EOF