1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 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 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
|
#!/bin/bash
set -e # turn on exit on error
##################################################################################################################################
########################## ########################################
########################## Trinity PBS job submission with multi part dependencies ########################################
########################## ########################################
##################################################################################################################################
### Author: Josh Bowden, Alexie Papanicolaou, CSIRO
### Version 1.0
###
###
### Script to split the Trinity workflow into multiple stages so as to efficiently request
### and use appropriate resources (walltime and number of cores) on a computer cluster / supercomputer.
### Currently creates scripts for PBS Torque or PBSpro
###
### trinity_pbs script install instructions:
### 1. Copy all trinity_pbs.* files into a directory (we will call it "TRINITY_PBS_DIR").
### 2. Add TRINITY_PBS_DIR to the PATH i.e. export or set PATH=TRINITY_PBS_DIR:$PATH (perhaps export PATH in .bashrc file)
### 3. Change the "TRINITYPBSPATH" variable found below to point to the directory also. i.e. TRINITYPBSPATH=TRINITY_PBS_DIR
### 4. Set MEMDIRIN to name of a node-local filesystem so a network drive is not needed unecesarily for Scripts 4b and 5b
### 5. Set MODTRINITY to any modules that need to be loaded so Trinity.pl can be run.
### 6. Set TRINITYPATH to the path to Trinity.pl executable
### 7. Set PBSTYPE to --pbspro or --pbs, dependent on the system present.
### That should be all that is needed from an admin perspective (besides making scripts accessible and exectable for users)
###
### Users need make a copy of TRINITY.CONFIG.template and then modify variables in it. See TRINITY.CONFIG.template for further details.
###
### The current script does the following.
### Part 1. Reads data from TRINITY.CONFIG and creates the input directory, data file names, output data directory and Trinity.pl command line
### User inputs from TRINITY.CONFIG file :
### JOBPREFIX A string of less than 11 characters long. PBS will use this as a jobname prefix.
### DATADIRECTORY Where input data exists
### OUTPUTDIR Where user wants output data to go - requires a lot of space even for small datatsets
### STANDARD_JOB_DETAILS the Trinity.pl command line
### ACCOUNT Account details of user (if required by PBS system being used)
###
### Part 2. Writes scripts to run Trinity.pl in 6 stages:
### 3 intial (Inchworm, and 2 x Chrysalis stages: Chrysalis::GraphFromFasta and Chrysalis::ReadsFromTranscripts)
### 2 parallel stages (Chrysalis::QuantifyGraph and Butterfly) which are executed in parallel.
### 1 collection of results as Trinity.Fasta.
###
### Information input from command line filename for stage 'x' :
### WALLTIME_Px Amount of time stage requires
### MEM_Px The amount of memory the stage requires
### NCPU_Px The number of CPUs the stage may use
### PBSNODETYPE _Px The PBS (for --pbspro only) queue name
### NUMPERARRAYITEM_Px The number of massively parallel jobs in each parallel satge.
###
### Part 3. Runs scripts dependant upon what stage has been detected as completed, using PBS job dependencies
###
### Command line usage:
### To start (or re-start) an analysis:
### >trinity_pbs.sh TRINITY.CONFIG.template
### To stop previously started PBS jobs on the queue:
### >trinity_kill.pl OUTPUTDIR
### Where:
### TRINITY.CONFIG.template = user specific job details
### OUTPUTDIR = is path to output data directory
###
### Output job script submission files. These are saved in the output directory (OUTPUTDIR) and can be modified/re-run if any job fails.
### *_run.sh Runs all the following scripts - with job dependencies and only the jobs that still need to be run.
### *_p1.sh Runs Inchworm stage. Does not scale well past a single socket. Only request at most the number of cores on a single CPU.
### *_p2.sh Runs Chrysalis::GrapghFromFasta clustering of Inchworm output. Should scale to number of cores on node
### *_p3.sh Runs Chrysalis::ReadsToTranscripts. I/O limited. Try to use local filesystem (not implemented)
### *_p4a.sh Creates jobs to run Chrysalis::QuantifyGraph and Butterfly parallel tasks
### *_p4b.sh QuantifyGraph job. "NUMPERARRAYITEM" tasks from the file /chrysalis/quantifyGraph_commands are run for each job
### *_p5b.sh Butterfly job. "NUMPERARRAYITEM" tasks from the file /chrysalis/butterfly_commands are run for each job
### to start off at last completed stage. At present leaves all data on temporary area of shared network drive and
### copies Trinity.fatsa to home directory (with specific job prefix in filename).
### * = $JOBPREFIX. $JOBPREFIX should not be > 10 characters long
##################################################################################################################################
####################### SET TRINITY INSTALLATION PATH (where Trinity.pl resides #################################################
##################################################################################################################################
# We need the path even if loaded using module
TRINITYPATH="/home/pap056/software/trinity_2013_08_14/"
# If you are loading using module, you can make the next variable blank
NEWPATH=
NEWPATH="export PATH=$PATH:$TRINITYPATH"
##################################################################################################################################
######## Set TRINITYPBSPATH to the directory where trinity_pbs.sh scripts are installed
##################################################################################################################################
TRINITYPBSPATH=`dirname "$0"`; # set to location of this script
##################################################################################################################################
######## Set cluster specific name for compute node local filesystem
##################################################################################################################################
MEMDIRIN="\$TMPDIR" # available on Barrine
##################################################################################################################################
######## Set system specific PATHS and load system specific modules (if available)
##################################################################################################################################
# Example for for Barrine:
PBSTYPE="--pbspro"
# Here we ensure that Java 1.6 is used and Java 1.7 is removed (Butterfly dependency)
MODTRINITY="
module load mpt/2.00 perl/5.15.8 bowtie/12.7 jellyfish/1.1.5 samtools/1.18 java/1.6.0_22-sun;
module rm java/1.7.0_02
"
## That should be all the admin modifications needed.
# Append Trinity path data to env variables loaded by every script
MODTRINITY="
$NEWPATH;
export TRINITYPATH="/home/pap056/software/trinity_2013_08_14";
$MODTRINITY
"
##################################################################################################################################
##################################################################################################################################
##################################################################################################################################
##################################################################################################################################
######### Load files that contains functions
##################################################################################################################################
# Modify function F_GETNODESTRING in file trinity_pbs.header so that a correct PBS header is returned to suit your PBS cluster
if [ -e "$TRINITYPBSPATH"/trinity_pbs.header ] ; then
source "$TRINITYPBSPATH"/trinity_pbs.header
else
echo "$1 requires file \"trinity_pbs.header\" to be present in: "
echo "$TRINITYPBSPATH"
exit 1
fi
##################################################################################################################################
######### Load input config file
##################################################################################################################################
if [ -e "$1" ] ; then
source "$1"
else
echo "Error: Input file does not exist: "$1" "
exit 1
fi
##################################################################################################################################
## Common variables to PBS and PBSpro
## and other needed variables that a user should not need to modify
##################################################################################################################################
if [ $UEMAIL ]; then PBSUSER="#PBS -M "$UEMAIL"" ; fi
HASHBANG="#!/bin/bash"
##################################################################################################################################
## PBS torque and PBSpro have some differences.
## Organise these here and also check further on (line 184) and change NODETYPE to match cluster system
## MODTRINITY will also be different on different clusters - it sets up the paths to the required executables
##################################################################################################################################
if [[ "$PBSTYPE" = "--pbspro" ]] ; then
JOBARRAY="-J"
JOBARRAY_ID="\$PBS_ARRAY_INDEX"
AFTEROKARRAY="afterok"
elif [[ "$PBSTYPE" = "--pbs" ]] ; then
## PBS torque:
JOBARRAY="-t"
JOBARRAY_ID="\$PBS_ARRAYID"
AFTEROKARRAY="afterokarray"
else # no paramaters present
F_USAGE
exit 0
fi
##############################################################################################################################################
########## Part 1: Set up file names for input directory and for output data dir and Trinity.pl command line ####################
##############################################################################################################################################
echo ""
## Ensure JOBPREFIX is not greatr than 11 characters as PBS-pro can not handle > 15 characters for total job name length
echo "submitting trinity jobs with prefix: "
echo " $JOBPREFIX"
###### Set input data directory - $DATADIR is CSIRO specific
echo "Input directory: "
echo " $DATADIRECTORY"
###### Set output data directory (OUTPUTDIR)
echo "Output directory: Scripts and output data will be written to:"
echo " $OUTPUTDIR"
mkdir -p "$OUTPUTDIR"
cd "$OUTPUTDIR"
### Modify STANDARD_JOB_DETAILS for analysis specific input to Trinity.pl
echo "The following trinity command line will be run:"
echo "$STANDARD_JOB_DETAILS"
echo ""
if [[ "$1" = "--pbs" ]] ; then
echo " Use: \"pbs_check.pl -t PBS_JOBID\" "
echo " To view stdout and stderr from each separate job while they are running"
fi
###########################################################################################################################################################
### Do some checking that files exist etc. (User should not modify)
### This sets the $DS variable
SET_DS "$FILENAMEINPUT"
###########################################################################################################################################################
################################# ###################################
################################# Part 2: Create the shell scripts to be run via the PBS batch system ###################################
################################# Users should modify WALLTIME and MEM dependent upon dataset size ###################################
################################# and NCPU to appropriate value for compute node cpu resources ###################################
################################# Check: "Trinity RNA-seq Assembler Performance Optimisation" (Henschel 2012) ###################################
################################# for current best practice. ###################################
################################# N.B. On busy clusters it may be best not to try to request ###################################
################################# a full nodes resources. i.e. If 8 cores per node are present, ###################################
################################# only request half of these. ###################################
###########################################################################################################################################################
###########################################################################################################################################################
############################## Script 1: Write script to run Inchworm ############################################
############################# MEM should equal JFMEM, which is the amount of memory requested for Jellyfish ############################################
JOBNAME1="$JOBPREFIX"_p1
NODESCPUS=$(F_GETNODESTRING "$PBSTYPE" "$MEM_P1" "$NCPU_P1" "$PBSNODETYPE_P1" "$WALLTIME_P1" "$JOBNAME1" "$ACCOUNT" "$PBSUSER" "$MODTRINITY" "$JOBPREFIX")
F_WRITESCRIPT "$0" ""$TRINITYPBSPATH"/trinity_pbs.p1"
#############################################################################################################################################################
############################## Script 2: Chrysalis::GraphFromFasta #############################################
############################## This script has a dependency on part 1 completion without error. #############################################
# It would be good to force an exit(0) before ReadsToTranscripts after checkpoint file /chrysalis/GraphFromIwormFasta.finished is
# written (i.e. add --no_run_readstotrans to Trinity and pass through to Chrysalis) as the script 3 can be started directly after.
# This may be less of an issue with the new (fast) version of Trinity::GraphFromFasta (since version 2012-06-08).
JOBNAME2="$JOBPREFIX"_p2
NODESCPUS=$(F_GETNODESTRING "$PBSTYPE" "$MEM_P2" "$NCPU_P2" "$PBSNODETYPE_P2" "$WALLTIME_P2" "$JOBNAME2" "$ACCOUNT" "$PBSUSER" "$MODTRINITY" "$JOBPREFIX")
F_WRITESCRIPT "$0" ""$TRINITYPBSPATH"/trinity_pbs.p2"
###########################################################################################################################################################
############################## Script 3: Script to run Chrysalis::ReadsToTranscripts ###################
############################## ReadsToTranscripts can be slow due to reads from disk, ###################
############################## This script has a dependency on part 2 completion with error. ###################
############################## Section script is skipped if enough time was given in Part 2. ###################
JOBNAME3="$JOBPREFIX"_p3
NODESCPUS=$(F_GETNODESTRING "$PBSTYPE" "$MEM_P3" "$NCPU_P3" "$PBSNODETYPE_P3" "$WALLTIME_P3" "$JOBNAME3" "$ACCOUNT" "$PBSUSER" "$MODTRINITY" "$JOBPREFIX")
F_WRITESCRIPT "$0" ""$TRINITYPBSPATH"/trinity_pbs.p3"
##########################################################################################################################################################
############################## Script 4a: Write script to call the Chrysalis QuantifyGraph array job ##################
############################## N.B. SLOTLIMIT="%x" indicates 'slot limit' i.e. the number of concurrent jobs to execute in an array ##################
############################## (Not available in PBSpro ) ##################
#### NB Disabling emails for arrays
#SLOTLIMIT="%64" # available for PBS Torque
JOBNAME4="$JOBPREFIX"_p4a
NODESCPUS=$(F_GETNODESTRING "$PBSTYPE" 1gb 1 "$PBSNODETYPE_P4" 00:30:00 "$JOBNAME4" "$ACCOUNT" "$PBSUSER" "$MODTRINITY" "$JOBPREFIX" )
F_WRITESCRIPT "$0" ""$TRINITYPBSPATH"/trinity_pbs.p4a"
###########################################################################################################################################################
############################## Script Array part 4b: Write script to be run as an array Job . Runs Chrysalis::QuantifyGraph ##################
############################## This scipt has a dependency on part 4a being run. If an array component fails it will email user. ##################
############################## Files named quantifyGraph_commands_X are written with subset of total commands (X is the array ID from the PBS system) ##
JOBNAME4B="$JOBPREFIX"_p4b
NODESCPUS=$(F_GETNODESTRING "$PBSTYPE" "$MEM_P4" "$NCPU_P4" "$PBSNODETYPE_P4" "$WALLTIME_P4" "$JOBNAME4B" "$ACCOUNT" " " "$MODTRINITY" "$JOBPREFIX")
F_WRITESCRIPT "$0" ""$TRINITYPBSPATH"/trinity_pbs.p4b"
###########################################################################################################################################################
############################## Script Array 5b: Write script to run Butterfly Array Job ##################
############################## This script has a dependency on part 4a 4b being run. ##################
############################## Files named butterfly_commands_X are written with subset of total commands (X is the array ID from the PBS system) ###
JOBNAME5B="$JOBPREFIX"_p5b
NODESCPUS=$(F_GETNODESTRING "$PBSTYPE" "$MEM_P5" "$NCPU_P5" "$PBSNODETYPE_P5" "$WALLTIME_P5" "$JOBNAME5B" "$ACCOUNT" " " "$MODTRINITY" "$JOBPREFIX")
F_WRITESCRIPT "$0" ""$TRINITYPBSPATH"/trinity_pbs.p5b"
############################################################################################################################################################
############### ###################
############### Part 3: Write main control script that executes scripts that were created above. ###################
############### ###################
############################################################################################################################################################
F_WRITESCRIPT "$0" ""$TRINITYPBSPATH"/trinity_pbs.cont"
############### Run the script written in Part 3
############### Checks to see what is current stage of calculation and executes scripts created in above code ###################
bash ""$JOBPREFIX"_run.sh"
exit 0
|