#!/bin/bash
#
# workscript.sh - GlueX simulation samples script for generation
#                 of Moller samples using gxtwist.
#
# author: richard.t.jones at uconn.edu
# version: august 19, 2024
#
# usage: $ ./workscript.sh <seqNo> [<offset> [<nevents>]]

runNo=120000
nthreads=1
nevents=2500000
jmax=10000

geometry_tarball="klong_beamline_geometry0.tar.gz"
xrootdserver="cn440.storrs.hpc.uconn.edu"
xrootdURL="root://$xrootdserver"
remotepath="/Gluex/resilient/simulation/KLFbeam-1-2025"
inputURL="http://zeus.phys.uconn.edu/halld/KLFbeam-1-2025"
cvmfspath="/cvmfs/gluex.osgstorage.org/gluex/uconn1/resilient/simulation/KLFbeam-1-2025/xxx"
wget="wget --ca-directory=/etc/grid-security/certificates"

vtoken="$(pwd)/vt_u7896"
credkey="$(cat credkey-jlab-gluex)"
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 -f setup randoms control.in /srv/Diracxx *.tar.gz *.astate *.py run.mac
        rm -rf hdds [vb]t_u* credkey*
        echo "Successful exit from workscript."
        exit 0
    else
        echo "Error $1 in workscript, $2"
        rm -f setup randoms control.in /srv/Diracxx *.tar.gz *.astate *.py run.mac
        rm -rf hdds [vb]_u* credkey*
        echo "Failed exit from workscript."
        exit $1
    fi
}

function fetch_input() {
    cp $cvmfspath/$1 $2 || \
    $wget -O $2 $inputURL/$1 || \
    $wget --no-proxy -O $2 $inputURL/$1
    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
    if [[ "$1" != "$2" ]]; then
        mv $1 $(basename $2)
    fi
    return $retcode
}

if [ $# -lt 1 -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
    runNo=$(expr $runNo + $seqNo / 5 - 1)
else
    seqNo=$(expr $1 + 1)
    seqNo3=$(echo $seqNo | awk '{printf("%03d",$1)}')
    runNo=$(expr $runNo + $seqNo / 5 - 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 config.d/randoms.in randoms || clean_exit $? "cannot fetch randoms.in from web server"
fetch_input config.d/control0.in control.in  || clean_exit $? "cannot fetch control0.in from web server"
fetch_input config.d/$geometry_tarball $geometry_tarball  || clean_exit $? "cannot fetch $geometry_tarball from web server"

# test output at the beginning, in case node is not connected to the network
echo test > test.out
save_output test.out test_$seqNo.out || clean_exit $? "save of test.out failed"
xrdfs $xrootdserver rm $remotepath/test_$seqNo.out

cwd=$(pwd)
ln -s /cvmfs/oasis.opensciencegrid.org/gluex/Diracxx /srv/
tar zxf $geometry_tarball || clean_exit $? "cannot unpack hdds from $geometry_tarball"
rm -f $geometry_tarball
source ./setup
export JANA_CALIB_CONTEXT="variation=default"
export JANA_GEOMETRY_URL="xmlfile://$cwd/hdds/main_HDDS.xml"

seedseq=$seqNo
rseeds=$(head -n $seedseq randoms | tail -n1)
outfile=KLFbeam0_$seqNo3.hddm
[ $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 '$outfile'/" 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"
echo "starting simulation of $nevents events"
hdgeant4 || clean_exit $? "hdgeant4 crashed in photon beam simulation"

outroot=bgprofiles0_$seqNo3.root
mv bgprofiles.root $outroot || clean_exit $? "simulation output bgprofiles.root not found"
save_output $outfile $outfile #|| clean_exit $? "save of $outfile failed"
save_output $outroot $outroot #|| clean_exit $? "save of $outroot failed"
clean_exit
