#!/bin/bash
#
# workscript.sh - GlueX simulation samples script for generation
#                 of a tagged photon beam from electrons at 4GeV.
#
# author: richard.t.jones at uconn.edu
# version: october 10, 2024
#
# usage: $ ./workscript.sh <seqNo> [<offset> [<nevents>]]

runNo=121000
nthreads=1
nevents=100
jmax=1000

xrootdURL="root://cn440.storrs.hpc.uconn.edu"
remotepath="/Gluex/resilient/simulation/tag4GeV-10-2024"
inputURL="http://zeus.phys.uconn.edu/halld/tag4GeV-10-2024"
cvmfspath="/cvmfs/gluex.osgstorage.org/gluex/uconn1/resilient/simulation/tag4GeV-10-2024"
wget="wget --ca-directory=/etc/grid-security/certificates"

vtoken="$(pwd)/vt_u7896"
credkey="$(cat credkey-jlab-gluex)"
htgettoken="$(pwd)/htgettoken/htgettoken"
export XDG_RUNTIME_DIR=$(pwd)

function usage() {
    echo "Usage: workscript.sh <seqNo> [<offset> [<nevents>]]"
    echo "  where <seqNo> = job sequence number, 1..Jmax"
    echo "        <offset> : job sequence number += <offset>"
    echo "        <nevents> = number of beam electrons to simulate"
}

function clean_exit() {
    ls -l 
    if [ "$1" = "" -o "$1" = "0" ]; then
        rm -rf setup h2root randoms sample.hddm control.in paw.metafile flukaerr.dat geant.hbook gxtwist.rz hdgeant.hddm *.map *.map.gz [vb]t_u* credkey* htgettoken*
        echo "Successful exit from workscript."
        exit 0
    else
        echo "Error $1 in workscript, $2"
        rm -rf setup h2root randoms sample.hddm control.in paw.metafile flukaerr.dat geant.hbook gxtwist.rz hdgeant.hddm *.map *.map.gz [vb]t_u* credkey* htgettoken*
        echo "Failed exit from workscript."
        exit $1
    fi
}

function fetch_input() {
    cp $cvmfspath/$1 $2 || \
    $wget -O $2 $inputURL/$1 2>/dev/null
    return $?
}

function save_output() {
    maxretry=5
    retry=0
    while [[ $retry -le $maxretry ]]; do
        echo $htgettoken --credkey=$credkey --vaulttokeninfile=$vtoken -a htvault.jlab.org -i jlab -r gluex || clean_exit $? "error fetching bearer token from htvault.jlab.org"
        $htgettoken --credkey=$credkey --vaulttokeninfile=$vtoken -a htvault.jlab.org -i jlab -r gluex || clean_exit $? "error fetching bearer token from htvault.jlab.org"
        xrdcp -f $1 $xrootdURL/$remotepath/$2 2>xrdcp.err
        retcode=$?
        if [[ $retcode != 0 ]]; then
            cat xrdcp.err
        fi
        rm xrdcp.err
        if [[ $retcode = 0 ]]; then
            rm $1
            break
        elif [[ $retry -lt $maxretry ]]; then
            retry=$(expr $retry + 1)
            echo "xrdcp returned error code $retcode, waiting $retry minutes before retrying"
            sleep $(expr $retry \* 60)
        else
            retry=$(expr $retry + 1)
            echo "xrdcp returned error code $retcode, giving up"
        fi
    done
    # fall through to allow job file transfer return results, failure not fatal
    if [[ "$1" != "$2" ]]; then
        mv $1 $(basename $2)
    fi
    return 0
}

if [ $# == 0 -o $# -gt 3 ]; then
    usage
    exit 
fi

if [[ $# -gt 2 ]]; then
    nevents=$3
fi
if [[ $# -gt 1 ]]; then
    seqNo=$(expr $1 + $2 + 1)
    seqNo3=$seqNo
else
    seqNo=$(expr $1 + 1)
    seqNo3=$(echo $seqNo | awk '{printf("%03d",$1)}')
fi
echo "job $seqNo running on" $(hostname)

fetch_input scripts.d/setup_alma9.sh setup || clean_exit $? "cannot fetch setup_alma9.sh from web server"
fetch_input scripts.d/h2root.sh h2root || clean_exit $? "cannot fetch h2root.sh from web server"
fetch_input config.d/randoms.in randoms || clean_exit $? "cannot fetch randoms.in from web server"
fetch_input config.d/control.in control.in || clean_exit $? "cannot fetch control.in from web server"
fetch_input config.d/htgettoken.tar.gz htgettoken.tar.gz || clean_exit $? "cannot fetch htgettoken pacakge from web server"
fetch_input config.d/TOSCA_tagger_dipole-5000G.map.gz TOSCA_tagger_dipole-15000G.map.gz || clean_exit $? "cannot fetch tagger magnetic field map from web server"
gunzip -k TOSCA_tagger_dipole-15000G.map.gz || clean_exit $? "cannot unzip the magnetic field map file"
tar zxf htgettoken.tar.gz

rseeds=$(head -n $seqNo randoms | tail -n1)
[ $seqNo -ge 0 -o $seqNo -ge $jmax ] || clean_exit $? "simulation seqNo $seqNo is out of range"
sed -i "s/^RNDM.*/RNDM $rseeds/" control.in || clean_exit $? "RNDM card not found in control.in"
sed -i "s/^RUN[NG].*/RUNNO $runNo/" control.in || clean_exit $? "RUN card not found in control.in"
sed -i "s/^OUTF.*/OUTFILE 'sample.hddm'/" control.in || clean_exit $? "OUTF card not found in control.in"
sed -i "s/^TRIG.*/TRIG $nevents/" control.in || clean_exit $? "TRIG card not found in control.in"

source ./setup
gxtwist || clean_exit $? "gxtwist crashed"
outroot=tag4GeV_${seqNo3}.root
chmod +x ./h2root
./h2root geant.hbook $outroot

save_output $outroot $outroot || clean_exit $? "save of $outroot failed"
clean_exit
