#!/bin/bash #SBATCH --job-name="run_ana" #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 "$bAnalysisMCQA" ]; then if [ -z "$9" ]; then echo 'no analysis MC QA flag specified' exit 1 else bAnalysisMCQA=$9 fi fi if [ -z "$bSimData" ]; then if [ -z "${10}" ]; then echo 'no data type specified' exit 1 else bSimData=${10} fi fi if [ -z "$iAnalysisMode" ]; then if [ -z "${11}" ]; then echo 'no analysis mode specified' exit 1 else iAnalysisMode=${11} fi fi if [ -z "$bDifferentialTISAnalysis" ]; then if [ -z "${12}" ]; then echo 'no TIS mode specified' exit 1 else bDifferentialTISAnalysis=${12} 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" ] || [ ! -f "${ListDir}/ana_list.sh" ]; then echo 'missing the unpack/calib/ana 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 AnaList unset CalibInput if [ "${iAnalysisMode}" != "0" ]; then unset Chi2SHTList unset Chi2SHTNNList unset dTimeInSpill unset iNTISBins fi source "${ListDir}/unpack_list.sh" source "${ListDir}/calib_list.sh" source "${ListDir}/ana_list.sh" source "${ListDir}/calib_input.sh" if [ -z "${UnpackList}" ] || [ -z "${CalibList}" ] || [ -z "${AnaList}" ]; then echo 'unpack/calib/ana list is empty' exit 1 fi if [ "${iAnalysisMode}" != "0" ]; then if [ -z "${Chi2SHTList}" ] || [ -z "${Chi2SHTNNList}" ] || [ -z "${dTimeInSpill}" ] || [ -z "${iNTISBins}" ]; then echo 'at least one parameter missing for extended analysis' return 1 fi fi iNUnpackRuns=${#UnpackList[@]} iNCalibRuns=${#CalibList[@]} iNAnaRuns=${#AnaList[@]} iNChi2SHTRuns=1 iNChi2SHTNNRuns=1 iNTISRuns=0 if [ "${iAnalysisMode}" == "2" ]; then iNChi2SHTRuns=${#Chi2SHTList[@]} iNChi2SHTNNRuns=1 elif [ "${iAnalysisMode}" == "3" ]; then iNChi2SHTRuns=${#Chi2SHTList[@]} iNChi2SHTNNRuns=${#Chi2SHTNNList[@]} if [ "${bDifferentialTISAnalysis}" == "1" ]; then iNTISRuns=iNTISBins fi elif [ "${iAnalysisMode}" == "4" ]; then iNChi2SHTRuns=${#Chi2SHTList[@]} iNChi2SHTNNRuns=${#Chi2SHTNNList[@]} fi UnpackParameters=${UnpackList[$(((SLURM_ARRAY_TASK_ID-1)/(iNCalibRuns*iNAnaRuns*iNChi2SHTRuns*iNChi2SHTNNRuns*(1+iNTISRuns))))]} 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 dSpillLength=`echo "${SimulationDir}" | grep -E -o '[[:digit:]]{1,}s_spill'` dSpillLength=${dSpillLength%"s_spill"} if [ $(echo "${dSpillLength} != ${dTimeInSpill}" | bc) -eq 1 ]; then echo "N.B.: simulated spill length (${dSpillLength} s) does not match analysis time in spill (${dTimeInSpill} s)" # exit 1 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 iNDigiFiles=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} CalibParameters=${CalibList[$((((SLURM_ARRAY_TASK_ID-1)/(iNAnaRuns*iNChi2SHTRuns*iNChi2SHTNNRuns*(1+iNTISRuns)))%iNCalibRuns))]} CalibParameters=($CalibParameters) if [ "${#CalibParameters[@]}" != "5" ]; then echo 'more/less than 5 calib parameters given' exit 1 fi iCalDut=${CalibParameters[0]} iCalMRef=${CalibParameters[1]} iBRef=${CalibParameters[2]} iCalSel2=${CalibParameters[3]} iDeadTime=${CalibParameters[4]} if [ "${iCalibrationMode}" == "0" ]; then CalibDir=${UnpackDir}/CalibCells_${iCalMRef}${iBRef} elif [ "${iCalibrationMode}" == "1" ]; then CalibDir=${UnpackDir}/Calib_${iCalDut}${iCalMRef}${iBRef}_${iCalSel2}_DT${iDeadTime}ns elif [ "${iCalibrationMode}" == "2" ]; then CalibDir=${UnpackDir}/CalibComb_${iCalDut}${iCalMRef}${iBRef}_${iCalSel2}_DT${iDeadTime}ns fi CalibInputFile=`calib_input_path ${CalibInput[@]}` iResult=$? if [ "${iResult}" == "0" ]; then 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]} iCalDut=${CalibInput[4]} iCalMRef=${CalibInput[5]} iBRef=${CalibInput[6]} iCalSel2=${CalibInput[7]} iDeadTime=${CalibInput[8]} CalibDir=${UnpackDir}/CalibExt_CbmTofAna_${RunID}_Unpack_EVT${iEventWindow}ns_TRG${iTriggerSet}_MUL${iMultiplicity}_${iCalDut}${iCalMRef}${iBRef}_${iCalSel2}_DT${iDeadTime}ns fi if [ "${iProdMode}" == "0" ]; then CalibDir=${UnpackDir}/CalibNone fi if [ "${iProdMode}" == "0" -a "${bUnpackHits}" == "1" ]; then CluDir=${CalibDir}/CluNone bSeparateHitFile=0 else CluDir=${CalibDir}/Clu if [ "${bIdealClustering}" == "0" ]; then CluDir=${CluDir}Real_${iCalDut}${iCalMRef}${iBRef}_${iCalSel2}_DT${iDeadTime}ns else CluDir=${CluDir}Ideal fi bSeparateHitFile=1 fi if [ ! -d "${UnpackDir}" ] || [ ! -d "${CalibDir}" ] || [ ! -d "${CluDir}" ]; then echo 'unpack/calib/clu directory does not exist' exit 1 fi AnaParameters=${AnaList[$((((SLURM_ARRAY_TASK_ID-1)/(iNChi2SHTRuns*iNChi2SHTNNRuns*(1+iNTISRuns)))%iNAnaRuns))]} AnaParameters=($AnaParameters) if [ "${#AnaParameters[@]}" != "4" ]; then echo 'more/less than 4 ana parameters given' exit 1 fi iDut=${AnaParameters[0]} iMRef=${AnaParameters[1]} iSel2=${AnaParameters[2]} dScaleFactor=${AnaParameters[3]} if [ "${iAnalysisMode}" != "0" ]; then Chi2SHTParameters=${Chi2SHTList[$((((SLURM_ARRAY_TASK_ID-1)/(iNChi2SHTNNRuns*(1+iNTISRuns)))%iNChi2SHTRuns))]} Chi2SHTParameters=($Chi2SHTParameters) if [ "${#Chi2SHTParameters[@]}" != "1" ]; then echo 'more/less than 1 chi2sht parameters given' exit 1 fi dChi2SHT=${Chi2SHTParameters[0]} Chi2SHTNNParameters=${Chi2SHTNNList[$((((SLURM_ARRAY_TASK_ID-1)/(1+iNTISRuns))%iNChi2SHTNNRuns))]} Chi2SHTNNParameters=($Chi2SHTNNParameters) if [ "${#Chi2SHTNNParameters[@]}" != "1" ]; then echo 'more/less than 1 chi2shtnn parameters given' exit 1 fi dChi2SHTNN=${Chi2SHTNNParameters[0]} iTISBin=$(((SLURM_ARRAY_TASK_ID-1)%(1+iNTISRuns))) fi AnaDir=${CluDir}/Ana_${iDut}_${iMRef}_${iSel2}_SF${dScaleFactor} if [ "${iAnalysisMode}" == "2" ]; then AnaDir=${AnaDir}/Chi2SHT_${dChi2SHT} elif [ "${iAnalysisMode}" == "3" ]; then AnaDir=${AnaDir}/Chi2SHT_${dChi2SHT}/Chi2SHTNN_${dChi2SHTNN} if [ "${iTISBin}" != "0" ]; then AnaDir=${AnaDir}/TIS_${iTISBin} fi elif [ "${iAnalysisMode}" == "4" ]; then AnaDir=${AnaDir}/Chi2SHT_${dChi2SHT}/Chi2SHTNN_${dChi2SHTNN}/Final fi mkdir -p ${AnaDir} cd ${AnaDir} if [ "${iAnalysisMode}" == "0" ]; then mkdir -p ${AnaDir}/hst cp -v ${MacroDir}/analysis.sh ${AnaDir}/ cp -v ${MacroDir}/run_ana.sh ${AnaDir}/ cp -v ${MacroDir}/iter_hits.sh ${AnaDir}/ cp -v ${MacroDir}/ana_hits.C ${AnaDir}/ ${MacroDir}/iter_hits.sh ${MacroDir} ${UnpackDir} ${CluDir} ${AnaDir} ${SimulationDir} ${iNDigiFiles} ${MCFileName} ${iNMCFiles} ${cGeometry} \ ${iDut} ${iMRef} ${iBRef} ${iSel2} ${dScaleFactor} ${bIdealCalibration} ${bHeavyIonCollisions} ${bSeparateHitFile} \ ${bIdealClustering} ${bAnalysisMCQA} ${cSetupName} ${bSimData} ${iCalibrationMode} ${dTimeInSpill} ${iNTISBins} else if [ "${iAnalysisMode}" == "1" ]; then cp -v ${MacroDir}/analysis.sh ${AnaDir}/ cp -v ${MacroDir}/run_ana.sh ${AnaDir}/ cp -v ${MacroDir}/iter_chi2.sh ${AnaDir}/ fi ${MacroDir}/iter_chi2.sh ${MacroDir} ${UnpackDir} ${CluDir} ${AnaDir} ${SimulationDir} ${iNDigiFiles} ${MCFileName} ${iNMCFiles} ${cGeometry} \ ${iDut} ${iMRef} ${iBRef} ${iSel2} ${dScaleFactor} ${bIdealCalibration} ${bHeavyIonCollisions} ${bSeparateHitFile} \ ${bIdealClustering} ${bAnalysisMCQA} ${cSetupName} ${bSimData} ${iCalibrationMode} ${iAnalysisMode} ${bDifferentialTISAnalysis} \ ${dTimeInSpill} ${iNTISBins} ${dChi2SHT} ${dChi2SHTNN} ${iTISBin} fi 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 ${AnaDir}/