#!/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=500000
jmax=10000

geometry_tarball=klong_beamline_geometry10.tar.gz
xrootdURL="root://cn440.storrs.hpc.uconn.edu"
remotepath="/Gluex/resilient/simulation/KLFbeam-8-2024"
inputURL="http://zeus.phys.uconn.edu/halld/KLFbeam-8-2024"
cvmfspath="/cvmfs/gluex.osgstorage.org/gluex/uconn1/resilient/simulation/KLFbeam-8-2024/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 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 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
    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 [ $# -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 - 1)
else
    seqNo=$(expr $1 + 1)
    seqNo3=$(echo $seqNo | awk '{printf("%03d",$1)}')
    runNo=$(expr $runNo + $seqNo - 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/control10.in control.in  || clean_exit $? "cannot fetch control10.in from web server"
fetch_input config.d/$geometry_tarball $geometry_tarball  || clean_exit $? "cannot fetch $geometry_tarball from web server"

cwd=$(pwd)
ln -s /cvmfs/oasis.opensciencegrid.org/gluex/Diracxx .
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"

klftarget_w_length=14
sed -i "s/^klftarget_w_length = .*/klftarget_w_length = $klftarget_w_length/" hdds/BeamLine_HDDS_xml.py
python3 hdds/BeamLine_HDDS_xml.py > hdds/BeamLine_HDDS.xml
grep 'klftarget_w_length =' hdds/BeamLine_HDDS_xml.py

pspipe2_inner_radius=$(echo $seqNo | awk '{print 2.0 + int(($1 - 1)/1000.) * 0.1}')
sed -i "s/^pspipe2_radius = .*,/pspipe2_radius = ($pspipe2_inner_radius,/" hdds/PairSpect_HDDS_xml.py
python3 hdds/PairSpect_HDDS_xml.py > hdds/PairSpect_HDDS.xml
grep 'pspipe2_radius =' hdds/PairSpect_HDDS_xml.py

seedseq=$seqNo
rseeds=$(head -n $seedseq randoms | tail -n1)
outfile=KLFbeam10_$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=bgprofiles10_$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
