From c2f65f9a1d05eef27ea1f2d23739372edbe78a45 Mon Sep 17 00:00:00 2001
From: Lukas Chlad <l.chlad@gsi.de>
Date: Mon, 28 Aug 2023 06:37:38 +0000
Subject: [PATCH] Improvements to PWG_common_production

---
 macro/CMakeLists.txt                          |  1 +
 macro/PWG/common/production/.rootrc           |  1 +
 macro/PWG/common/production/CMakeLists.txt    |  2 +-
 .../run_analysis_tree_maker_json_config.C     | 20 ++++-----
 macro/PWG/common/production/run_json.sh       | 24 +++++++---
 .../common/production/run_reco_json_config.C  | 14 +++---
 .../common/production/run_sim_reco_json.sh    | 45 +++++++++----------
 7 files changed, 60 insertions(+), 47 deletions(-)
 create mode 100644 macro/PWG/common/production/.rootrc

diff --git a/macro/CMakeLists.txt b/macro/CMakeLists.txt
index 174cb275fe..639ef40b7f 100644
--- a/macro/CMakeLists.txt
+++ b/macro/CMakeLists.txt
@@ -46,6 +46,7 @@ Install(FILES ${CBMROOT_SOURCE_DIR}/macro/PWG/common/production/run_json.sh
               ${CBMROOT_SOURCE_DIR}/macro/PWG/common/production/run_reco_json_config.C
               ${CBMROOT_SOURCE_DIR}/macro/PWG/common/production/run_analysis_tree_maker_json_config.C
               ${CBMROOT_SOURCE_DIR}/macro/PWG/common/production/config.json
+              ${CBMROOT_SOURCE_DIR}/macro/PWG/common/production/.rootrc
         DESTINATION share/cbmroot/macro/PWG/common/production
         )
 Install(CODE "FILE(MAKE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/share/cbmroot/macro/PWG/common/production)")
diff --git a/macro/PWG/common/production/.rootrc b/macro/PWG/common/production/.rootrc
new file mode 100644
index 0000000000..3920f7cd05
--- /dev/null
+++ b/macro/PWG/common/production/.rootrc
@@ -0,0 +1 @@
+../../../include/.rootrc
diff --git a/macro/PWG/common/production/CMakeLists.txt b/macro/PWG/common/production/CMakeLists.txt
index 2446657ceb..94a25d87e9 100644
--- a/macro/PWG/common/production/CMakeLists.txt
+++ b/macro/PWG/common/production/CMakeLists.txt
@@ -19,7 +19,7 @@ if (Python_FOUND)
                  @ONLY
                 )
 
-  File(COPY ${CBMROOT_SOURCE_DIR}/macro/include/.rootrc DESTINATION ${CBMROOT_BINARY_DIR}/macro/PWG/common/production)
+  file(COPY ${CBMROOT_SOURCE_DIR}/macro/include/.rootrc DESTINATION ${CBMROOT_BINARY_DIR}/macro/PWG/common/production)
 
   Set(testname PWG_common_production_run_json)
 
diff --git a/macro/PWG/common/production/run_analysis_tree_maker_json_config.C b/macro/PWG/common/production/run_analysis_tree_maker_json_config.C
index bb8c5ea0c3..2b4dfa2985 100644
--- a/macro/PWG/common/production/run_analysis_tree_maker_json_config.C
+++ b/macro/PWG/common/production/run_analysis_tree_maker_json_config.C
@@ -3,12 +3,11 @@
    Authors: Viktor Klochkov, Frederic Linz [committer] */
 
 // -----   Check output file name   -------------------------------------------
-bool CheckOutFileName(TString fileName, Bool_t overwrite)
+bool CheckOutFileName(TString fileName, Bool_t overwrite, const char* caller = __builtin_FUNCTION())
 {
-  string fName = "run_reco_json_config";
   // --- Protect against overwriting an existing file
   if ((!gSystem->AccessPathName(fileName.Data())) && (!overwrite)) {
-    cout << fName << ": output file " << fileName << " already exists!";
+    std::cout << caller << ": output file " << fileName << " already exists!" << std::endl;
     return false;
   }
 
@@ -17,22 +16,23 @@ bool CheckOutFileName(TString fileName, Bool_t overwrite)
   if (gSystem->AccessPathName(directory)) {
     Int_t success = gSystem->mkdir(directory, kTRUE);
     if (success == -1) {
-      cout << fName << ": output directory " << directory << " does not exist and cannot be created!";
+      std::cout << caller << ": output directory " << directory << " does not exist and cannot be created!"
+                << std::endl;
       return false;
     }
     else
-      cout << fName << ": created directory " << directory;
+      std::cout << caller << ": created directory " << directory << std::endl;
   }
   return true;
 }
 
 void run_analysis_tree_maker_json_config(TString traPath = "test", TString rawPath = "", TString recPath = "",
                                          TString unigenFile = "", TString outPath = "", bool overwrite = true,
-                                         std::string config = "", std::string tslength = "", int nEvents = 0)
+                                         std::string config = "", std::string tslength = "-1",
+                                         bool is_event_base = false, int nEvents = 0)
 {
   const std::string system = "Au+Au";  // TODO can we read it automatically?
   const float beam_mom     = 12.;
-  const bool is_event_base = false;
   const float ts_length    = std::stof(tslength);
 
   // --- Logger settings ----------------------------------------------------
@@ -91,12 +91,12 @@ void run_analysis_tree_maker_json_config(TString traPath = "test", TString rawPa
   inputSource->AddFriend(traFile);
   inputSource->AddFriend(rawFile);
   run->SetSource(inputSource);
-  run->SetOutputFile(outFile);
+  run->SetSink(std::make_unique<FairRootFileSink>(outFile));
   run->SetGenerateRunInfo(kTRUE);
   // ------------------------------------------------------------------------
 
   // ----- Mc Data Manager   ------------------------------------------------
-  auto* mcManager = new CbmMCDataManager("MCManager", is_event_base);
+  auto* mcManager = new CbmMCDataManager();
   mcManager->AddFile(traFile);
   run->AddTask(mcManager);
   // ------------------------------------------------------------------------
@@ -184,7 +184,7 @@ void run_analysis_tree_maker_json_config(TString traPath = "test", TString rawPa
   timer.Stop();
   const Double_t rtime = timer.RealTime();
   const Double_t ctime = timer.CpuTime();
-  std::cout << "Macro finished succesfully." << std::endl;
+  std::cout << "Macro finished successfully." << std::endl;
   std::cout << "Output file is " << outFile << std::endl;
   std::cout << "Parameter file is " << parFile << std::endl;
 
diff --git a/macro/PWG/common/production/run_json.sh b/macro/PWG/common/production/run_json.sh
index 168a827b61..b21d0e8c41 100755
--- a/macro/PWG/common/production/run_json.sh
+++ b/macro/PWG/common/production/run_json.sh
@@ -54,10 +54,10 @@ for step in ${steps}; do
   readStepInfo
   if [ ${run} == true ]; then
     mkdir -pv ${srcDir}
-    cp -v ${macro} ${srcDir}
-    cp -v ${config} ${srcDir}
-    cp -v ${submitScript} ${srcDir}
-    cp -v ${jobScript} ${srcDir}
+    rsync -uv ${macro} ${srcDir}
+    rsync -uv ${config} ${srcDir}
+    rsync -uv ${submitScript} ${srcDir}
+    rsync -uv ${jobScript} ${srcDir}
   fi
 done
 
@@ -83,6 +83,18 @@ if [ ${batch} == true ];then
     --exclude=${excludeNodes} -- ${jobScript}
 else
   echo "Jobscript: ${jobScript}"
-  export SLURM_ARRAY_TASK_ID=${jobRange}
-  ${jobScript} &> ${logDir}/${jobRange}.log
+  if [[ ${jobRange} =~ "-" ]]
+  then
+    # specified range > 1 for non-batch mode
+    start=$(echo ${jobRange} | cut -d '-' -f 1)
+    stop=$(echo ${jobRange} | cut -d '-' -f 2)
+    for (( ijob=${start}; ijob<=${stop}; ijob++ ))
+    do
+      nohup bash -c 'export SLURM_ARRAY_TASK_ID="$0" && "$1"' "${ijob}" "${jobScript}" > ${logDir}/${ijob}.log 2>&1 &
+    done
+  else
+    # single non-batch execution
+    export SLURM_ARRAY_TASK_ID=${jobRange}
+    ${jobScript} &> ${logDir}/${jobRange}.log
+  fi
 fi
diff --git a/macro/PWG/common/production/run_reco_json_config.C b/macro/PWG/common/production/run_reco_json_config.C
index 9d62d2fdcf..40d17232f1 100644
--- a/macro/PWG/common/production/run_reco_json_config.C
+++ b/macro/PWG/common/production/run_reco_json_config.C
@@ -50,6 +50,8 @@
 #include <FairSystemInfo.h>
 
 #include <TStopwatch.h>
+
+#include "rootalias.C"
 #endif
 
 
@@ -90,12 +92,11 @@
  **/
 
 // -----   Check output file name   -------------------------------------------
-bool CheckOutFileName(TString fileName, Bool_t overwrite)
+bool CheckOutFileName(TString fileName, Bool_t overwrite, const char* caller = __builtin_FUNCTION())
 {
-  string fName = "run_reco_json_config";
   // --- Protect against overwriting an existing file
   if ((!gSystem->AccessPathName(fileName.Data())) && (!overwrite)) {
-    cout << fName << ": output file " << fileName << " already exists!";
+    std::cout << caller << ": output file " << fileName << " already exists!" << std::endl;
     return false;
   }
 
@@ -104,11 +105,12 @@ bool CheckOutFileName(TString fileName, Bool_t overwrite)
   if (gSystem->AccessPathName(directory)) {
     Int_t success = gSystem->mkdir(directory, kTRUE);
     if (success == -1) {
-      cout << fName << ": output directory " << directory << " does not exist and cannot be created!";
+      std::cout << caller << ": output directory " << directory << " does not exist and cannot be created!"
+                << std::endl;
       return false;
     }
     else
-      cout << fName << ": created directory " << directory;
+      std::cout << caller << ": created directory " << directory << std::endl;
   }
   return true;
 }
@@ -207,7 +209,7 @@ void run_reco_json_config(TString input = "", Int_t nTimeSlices = -1, Int_t firs
   FairFileSource* inputSource = new FairFileSource(rawFile);
   if (isL1Matching) { inputSource->AddFriend(traFile); }
   run->SetSource(inputSource);
-  run->SetOutputFile(outFile);
+  run->SetSink(std::make_unique<FairRootFileSink>(outFile));
   run->SetGenerateRunInfo(kTRUE);
   FairMonitor::GetMonitor()->EnableMonitor(kTRUE, monFile);
   // ------------------------------------------------------------------------
diff --git a/macro/PWG/common/production/run_sim_reco_json.sh b/macro/PWG/common/production/run_sim_reco_json.sh
index 12709272de..3ef4184302 100755
--- a/macro/PWG/common/production/run_sim_reco_json.sh
+++ b/macro/PWG/common/production/run_sim_reco_json.sh
@@ -16,7 +16,7 @@ for step in ${steps}; do
 
     mkdir -pv ${outDir}
     cd ${outDir}
-    ln -sfv ${VMCWORKDIR}/macro/run/.rootrc ${outDir} 
+    ln -sfv ${VMCWORKDIR}/macro/include/.rootrc 
     if [ ${step} == reconstruction ]; then
       rawFile=$(getJsonVal "['reconstruction']['rawFile']")
       nTimeSlices=$(getJsonVal "['reconstruction']['nTimeSlices']")
@@ -27,9 +27,9 @@ for step in ${steps}; do
       isL1EffQA=$(getJsonVal "['reconstruction']['isL1EffQA']")
       echo "  "
       echo "Run reconstruction: ${macro}(\"${rawFile}\",${nTimeSlices},${firstTimeSlice},\"${outFile}\",\
-	${overwrite},\"${sEvBuildRaw}\",\"${config}\",\"${traFile}\",${isL1Matching},${isL1EffQA})"
+	                                         ${overwrite},\"${sEvBuildRaw}\",\"${config}\",\"${traFile}\",${isL1Matching},${isL1EffQA})"
       root -b -l -q "${macro}(\"${rawFile}\",${nTimeSlices},${firstTimeSlice},\"${outFile}\",\
-        ${overwrite},\"${sEvBuildRaw}\",\"${config}\",\"${traFile}\",${isL1Matching},${isL1EffQA})" &> ${log}
+                                ${overwrite},\"${sEvBuildRaw}\",\"${config}\",\"${traFile}\",${isL1Matching},${isL1EffQA})" &> ${log}
     elif [ ${step} == AT ]; then
       traFile=$(getJsonVal "['AT']['traFile']")
       rawFile=$(getJsonVal "['AT']['rawFile']")
@@ -42,44 +42,41 @@ for step in ${steps}; do
       fi
       echo "  "
       echo "Run AT converter: ${macro}(\"${traFile}\",\"${rawFile}\",\"${recFile}\",\
-	\"${unigenFile}\",\"${outFile}\",${overwrite},\"${config}\",\"${tslength}\")" 
+	                                     \"${unigenFile}\",\"${outFile}\",${overwrite},\"${config}\",\"${tslength}\",\"${eventMode}\")" 
       root -b -l -q "${macro}(\"${traFile}\",\"${rawFile}\",\"${recFile}\",\
-	\"${unigenFile}\",\"${outFile}\",${overwrite},\"${config}\",\"${tslength}\")" &> ${log}
+	                            \"${unigenFile}\",\"${outFile}\",${overwrite},\"${config}\",\"${tslength}\",\"${eventMode}\")" &> ${log}
     else 
       if [ ${step} == digitization ]; then
         input=$(getJsonVal "['transport']['output']['path']")
         if [ ! -e ${outFile}.par.root ] || [ ${overwrite} == true ]; then
           cp -v ${input}.par.root ${outDir}
         fi
-      echo "  "
-      echo "Run digitization: ${macro}(\"${config}\",${nEvents})"
-      fi
-      
-      if [ ${step} == transport ]; then
-	echo "  "
-	echo "Run transport: ${macro}(\"${config}\",${nEvents})"
+        echo "  "
+        echo "Run digitization: ${macro}(\"${config}\",${nEvents})"
+      elif [ ${step} == transport ]; then
+	      echo "  "
+	      echo "Run transport: ${macro}(\"${config}\",${nEvents})"
       fi
        
       root -b -l -q "${macro}(\"${config}\",${nEvents})" &> ${log}  
-    fi
+    fi # ? which step
+    
+    # clean-up 
     gzip -f ${log}
-
     rm -v .rootrc
     if [ ${step} == reconstruction ]; then
-	if [ "${isL1EffQA}" == true ]; then
+	    if [ "${isL1EffQA}" == true ]; then
     	  rm -v *{core,moni,CA}* all_*.par 
-	else
-	  rm -v *{core,moni,CA,L1,Edep}* all_*.par
+	    else
+	      rm -v *{core,moni,CA,L1,Edep}* all_*.par
     	fi
-    fi
-    if [ ${step} == digitization ]; then
-	rm -v *{moni,Fair}* all_*.par
-    fi
-    if [ ${step} == AT ]; then
-	rm -v *{core,CA,L1}*
+    elif [ ${step} == digitization ]; then
+	    rm -v *{moni,Fair}* all_*.par
+    elif [ ${step} == AT ]; then
+	    rm -v *{core,CA,L1}*
     fi
 
     cd -
     export taskId=
-  fi
+  fi # ? run this step
 done
-- 
GitLab