#!/bin/bash #SBATCH --job-name="run_calib" #SBATCH --comment="CBM TOF" #SBATCH --open-mode=truncate if [ -z "$SLURM_SUBMIT_DIR" ]; then echo 'script needs to be invoked by sbatch' exit 1 fi WorkingDir=`pwd` if [ -z "$ConfigFile" ]; then if [ -z "$1" ]; then echo 'no CbmRoot config file specified' exit 1 else ConfigFile=$1 fi fi if [ -z "$ListDir" ]; then if [ -z "$2" ]; then echo 'no analysis list directory specified' exit 1 else ListDir=$2 fi fi if [ -z "$SimulationDir" ]; then if [ -z "$3" ]; then echo 'no simulation directory specified' exit 1 else SimulationDir=$3 fi fi if [ -z "$MacroDir" ]; then if [ -z "$4" ]; then echo 'no macro directory specified' exit 1 else MacroDir=$4 fi fi if [ -z "$cGeometry" ]; then if [ -z "$5" ]; then echo 'no geometry tag specified' exit 1 else cGeometry=$5 fi fi if [ -z "$bUnpackHits" ]; then if [ -z "$6" ]; then echo 'no unpack flag specified' exit 1 else bUnpackHits=$6 fi fi if [ -z "$iCalibrationMode" ]; then if [ -z "$7" ]; then echo 'no calibration mode specified' exit 1 else iCalibrationMode=$7 fi fi if [ -z "$bIdealClustering" ]; then if [ -z "$8" ]; then echo 'no clustering flag specified' exit 1 else bIdealClustering=$8 fi fi if [ -z "$bClusteringQA" ]; then if [ -z "$9" ]; then echo 'no QA flag specified' exit 1 else bClusteringQA=$9 fi fi if [ -z "$bSimData" ]; then if [ -z "${10}" ]; then echo 'no data type specified' exit 1 else bSimData=${10} fi fi source ${ConfigFile} if [ -z "$VMCWORKDIR" ]; then echo 'no ROOT environment available' exit 1 fi if [ ! -f "${ListDir}/unpack_list.sh" ] || [ ! -f "${ListDir}/calib_list.sh" ]; then echo 'missing the unpack/calib list file' exit 1 fi if [ ! -f "${ListDir}/calib_input.sh" ]; then echo 'missing the calib input script' return 1 fi unset UnpackList unset CalibList unset CalibInput source "${ListDir}/unpack_list.sh" source "${ListDir}/calib_list.sh" source "${ListDir}/calib_input.sh" if [ -z "${UnpackList}" ] || [ -z "${CalibList}" ]; then echo 'unpack/calib list is empty' exit 1 fi iNUnpackRuns=${#UnpackList[@]} iNCalibRuns=${#CalibList[@]} UnpackParameters=${UnpackList[$(((SLURM_ARRAY_TASK_ID-1)/iNCalibRuns))]} UnpackParameters=($UnpackParameters) if [ "${#UnpackParameters[@]}" != "6" ]; then echo 'more/less than 6 unpack parameters given' exit 1 fi RunID=${UnpackParameters[0]} iEventWindow=${UnpackParameters[1]} iTriggerSet=${UnpackParameters[2]} iMultiplicity=${UnpackParameters[3]} if [ "${bSimData}" == "1" ]; then cSetupName=`basename ${SimulationDir}` SimulationDir=`find ${SimulationDir} -type d -name ${RunID}` if [ ! -d "${SimulationDir}" ]; then echo 'simulation directory does not exist' exit 1 fi cRunMode=`echo ${SimulationDir} | grep -E -o 'rm_.{0,3}' | cut -d "_" -f 2` if [ "${cRunMode}" != "haf" -a "${cRunMode}" != "hic" ]; then echo "run mode \"${cRunMode}\" of simulated data cannot be processed" exit 1 fi iProdMode=`echo ${SimulationDir} | grep -E -o 'pm_.{0,1}' | cut -d "_" -f 2` if ! [ "${iProdMode}" -ge "0" -a "${iProdMode}" -le "3" ]; then echo "production mode \"${iProdMode}\" of simulated data cannot be processed" exit 1 fi if echo "${SimulationDir}" | grep -q "average"; then bAverageSerialSpills=1 else bAverageSerialSpills=0 fi dSpillLength=`echo "${SimulationDir}" | grep -E -o '[[:digit:]]{1,}s_spill'` dSpillLength=${dSpillLength%"s_spill"} dSpillBreakLength=`echo "${SimulationDir}" | grep -E -o '[[:digit:]]{1,}s_break'` dSpillBreakLength=${dSpillBreakLength%"s_break"} iNSerialSpills=`echo "${SimulationDir}" | grep -E -o '[[:digit:]]{1,}spills_per_file'` iNSerialSpills=${iNSerialSpills%"spills_per_file"} if echo "${SimulationDir}" | grep -q "spot"; then bSpotResponse=1 else bSpotResponse=0 fi RunID=${RunID//-/} RunID=${RunID//[T]/_} RunID=${RunID//[Z]/} iNDigiFiles=`find ${SimulationDir} -maxdepth 1 -name '[0-9][0-9][0-9]' | wc -l` if [ "${cRunMode}" == "haf" ]; then iNMCFiles=1 MCFileName=`basename $(ls ${SimulationDir}/001/data/*.mc.root | grep -v FairRunInfo)` bHeavyIonCollisions=0 elif [ "${cRunMode}" == "hic" ]; then iNMCFiles=`find ${SimulationDir}/001/data/mc -maxdepth 1 -name '[0-9][0-9][0-9][0-9][0-9]' | wc -l` MCFileName=`basename $(ls ${SimulationDir}/001/data/mc/00001/data/*.mc.root | grep -v FairRunInfo)` bHeavyIonCollisions=1 fi else iProdMode=1 SimulationDir=experiment MCFileName=experiment iNMCFiles=0 bHeavyIonCollisions=0 bAverageSerialSpills=0 dSpillLength=0 dSpillBreakLength=0 iNSerialSpills=0 iNDigiFiles=0 bSpotResponse=0 cSetupName=experiment fi bIdealCalibration=0 UnpackDir=${WorkingDir}/CbmTofAna_${RunID}/Unpack if [ "${iProdMode}" == "0" ]; then if [ "${bUnpackHits}" == "1" ]; then UnpackDir=${UnpackDir}Hits else UnpackDir=${UnpackDir}Digis fi bIdealCalibration=1 elif [ "${iProdMode}" == "1" ]; then UnpackDir=${UnpackDir}Digis fi UnpackDir=${UnpackDir}_EVT${iEventWindow}ns_TRG${iTriggerSet}_MUL${iMultiplicity} if [ ! -d "${UnpackDir}" ]; then echo 'unpack directory does not exist' exit 1 fi CalibParameters=${CalibList[$(((SLURM_ARRAY_TASK_ID-1)%iNCalibRuns))]} CalibParameters=($CalibParameters) if [ "${#CalibParameters[@]}" != "5" ]; then echo 'more/less than 5 calib parameters given' exit 1 fi iDut=${CalibParameters[0]} iMRef=${CalibParameters[1]} iBRef=${CalibParameters[2]} iSel2=${CalibParameters[3]} iDeadTime=${CalibParameters[4]} if [ "${iCalibrationMode}" == "0" ]; then CalibDir=${UnpackDir}/CalibCells_${iMRef}${iBRef} elif [ "${iCalibrationMode}" == "1" ]; then CalibDir=${UnpackDir}/Calib_${iDut}${iMRef}${iBRef}_${iSel2}_DT${iDeadTime}ns elif [ "${iCalibrationMode}" == "2" ]; then CalibDir=${UnpackDir}/CalibComb_${iDut}${iMRef}${iBRef}_${iSel2}_DT${iDeadTime}ns fi CalibInputFile=`calib_input_path ${CalibInput[@]}` iResult=$? if [ "${iResult}" == "0" ]; then if [ "${iProdMode}" == "0" ]; then echo 'must not specify an external calibration file for PM0 data' exit 1 else if [ "${iCalibrationMode}" == "0" ]; then echo 'must not specify an external calibration file for calibration mode 0' exit 1 fi fi CalibInputFile=${ListDir}/hst/`basename ${CalibInputFile}` if [ -f "${CalibInputFile}" ]; then CalibInputDir=${ListDir} RunID=${CalibInput[0]} if [ "${bSimData}" == "1" ]; then RunID=${RunID//-/} RunID=${RunID//[T]/_} RunID=${RunID//[Z]/} fi iEventWindow=${CalibInput[1]} iTriggerSet=${CalibInput[2]} iMultiplicity=${CalibInput[3]} iDut=${CalibInput[4]} iMRef=${CalibInput[5]} iBRef=${CalibInput[6]} iSel2=${CalibInput[7]} iDeadTime=${CalibInput[8]} CalibDir=${UnpackDir}/CalibExt_CbmTofAna_${RunID}_Unpack_EVT${iEventWindow}ns_TRG${iTriggerSet}_MUL${iMultiplicity}_${iDut}${iMRef}${iBRef}_${iSel2}_DT${iDeadTime}ns echo "using existing calibration: ${CalibInputFile}" else echo 'calib input file does not exist' exit 1 fi elif [ "${iResult}" == "1" ]; then CalibInputDir=${CalibDir} if ! [ "${iProdMode}" == "0" ]; then echo "creating new calibrations" fi elif [ "${iResult}" == "2" ]; then echo "${CalibInputFile}" exit 1 fi if [ "${iProdMode}" == "0" ]; then CalibDir=${UnpackDir}/CalibNone CalibInputDir=${CalibDir} fi mkdir -p ${CalibDir} cd ${CalibDir} cp -v ${MacroDir}/analysis.sh ${CalibDir}/ cp -v ${MacroDir}/run_calib.sh ${CalibDir}/ if [ "${iProdMode}" != "0" -a "${iResult}" == "1" ]; then if [ "${iCalibrationMode}" == "0" ]; then mkdir -p ${CalibDir}/data mkdir -p ${CalibDir}/plots cp -v ${MacroDir}/.rootrc ${CalibDir}/ cp -v ${MacroDir}/rootlogon.C ${CalibDir}/ cp -v ${MacroDir}/calib_digis.C ${CalibDir}/ root -b -q ''${CalibDir}'/calib_digis.C+('${iMRef}','${iBRef}',"'${UnpackDir}'","'${cGeometry}'",'${bSimData}','${iCalibrationMode}')' elif [ "${iCalibrationMode}" == "1" ]; then mkdir -p ${CalibDir}/hst cp -v ${MacroDir}/init_calib.sh ${CalibDir}/ cp -v ${MacroDir}/ana_digi_ini.C ${CalibDir}/ cp -v ${MacroDir}/ana_digi_cal.C ${CalibDir}/ cp -v ${MacroDir}/iter_calib.sh ${CalibDir}/ cp -v ${MacroDir}/ana_digi.C ${CalibDir}/ ${MacroDir}/init_calib.sh ${MacroDir} ${UnpackDir} ${CalibDir} ${cGeometry} ${iDut} ${iMRef} ${iBRef} ${iDeadTime} ${bSimData} ${iCalibrationMode} ${MacroDir}/iter_calib.sh ${MacroDir} ${UnpackDir} ${CalibDir} ${cGeometry} ${iDut} ${iMRef} ${iBRef} ${iSel2} ${iDeadTime} ${bSimData} ${iCalibrationMode} elif [ "${iCalibrationMode}" == "2" ]; then mkdir -p ${CalibDir}/data mkdir -p ${CalibDir}/plots mkdir -p ${CalibDir}/hst cp -v ${MacroDir}/.rootrc ${CalibDir}/ cp -v ${MacroDir}/rootlogon.C ${CalibDir}/ cp -v ${MacroDir}/calib_digis.C ${CalibDir}/ cp -v ${MacroDir}/init_calib.sh ${CalibDir}/ cp -v ${MacroDir}/ana_digi_ini.C ${CalibDir}/ cp -v ${MacroDir}/ana_digi_cal.C ${CalibDir}/ cp -v ${MacroDir}/iter_calib.sh ${CalibDir}/ cp -v ${MacroDir}/ana_digi.C ${CalibDir}/ root -b -q ''${CalibDir}'/calib_digis.C+('${iMRef}','${iBRef}',"'${UnpackDir}'","'${cGeometry}'",'${bSimData}','${iCalibrationMode}')' ${MacroDir}/init_calib.sh ${MacroDir} ${UnpackDir} ${CalibDir} ${cGeometry} ${iDut} ${iMRef} ${iBRef} ${iDeadTime} ${bSimData} ${iCalibrationMode} ${MacroDir}/iter_calib.sh ${MacroDir} ${UnpackDir} ${CalibDir} ${cGeometry} ${iDut} ${iMRef} ${iBRef} ${iSel2} ${iDeadTime} ${bSimData} ${iCalibrationMode} fi fi if [ "${iProdMode}" == "0" -a "${bUnpackHits}" == "1" ]; then CluDir=${CalibDir}/CluNone bHitBuilding=0 else CluDir=${CalibDir}/Clu if [ "${bIdealClustering}" == "0" ]; then CluDir=${CluDir}Real_${iDut}${iMRef}${iBRef}_${iSel2}_DT${iDeadTime}ns else CluDir=${CluDir}Ideal fi bHitBuilding=1 fi mkdir -p ${CluDir} cd ${CluDir} cp -v ${MacroDir}/gen_digi.sh ${CluDir}/ cp -v ${MacroDir}/ana_digi_qa.C ${CluDir}/ ${MacroDir}/gen_digi.sh ${MacroDir} ${UnpackDir} ${CluDir} ${CalibInputDir} ${SimulationDir} ${MCFileName} ${iNMCFiles} \ ${iDut} ${iMRef} ${iBRef} ${iSel2} ${iDeadTime} \ ${bHeavyIonCollisions} ${bIdealClustering} ${bClusteringQA} \ ${bAverageSerialSpills} ${dSpillLength} ${dSpillBreakLength} ${iNSerialSpills} \ ${iNDigiFiles} ${cGeometry} ${bSpotResponse} ${bIdealCalibration} ${cSetupName} \ ${bHitBuilding} ${bSimData} ${iCalibrationMode} echo "" echo "Array job ran on ${SLURM_JOB_CPUS_PER_NODE} CPUs of node ${SLURM_JOB_NODELIST} in partition ${SLURM_JOB_PARTITION}." echo "" mv -v ${WorkingDir}/slurm-${SLURM_ARRAY_JOB_ID}_${SLURM_ARRAY_TASK_ID}.out ${CluDir}/