Changed scripts for new TrainSetup
[u/mrichter/AliRoot.git] / PWGLF / FORWARD / trains / TrainSetup.C
index 4aa7d72..bb91be1 100644 (file)
@@ -23,6 +23,7 @@
 # include <TUrl.h>
 # include <TString.h>
 # include <TApplication.h>
+# include <TStopwatch.h>
 # include <AliAnalysisManager.h>
 # include <AliVEventHandler.h>
 # include <AliPhysicsSelection.h>
@@ -39,6 +40,7 @@ struct OptionList;
 class TDatime;
 class TUrl;
 class TString;
+class TStopwatch;
 class AliVEventHandler;
 class AliAnalysisManager;
 class AliInputEventHandler;
@@ -46,7 +48,7 @@ class AliInputEventHandler;
 
 //====================================================================
 /** 
- * Generic set-up of an analysis train using the grid-handler (AliEn plugin). 
+ * Generic set-up of an analysis train 
  *
  * See also @ref train_setup_doc
  *
@@ -68,7 +70,6 @@ struct TrainSetup
   {
     fOptions.Add("help", "Show help");
     fOptions.Add("date", "YYYY-MM-DD HH:MM", "Set date", "now");
-    fOptions.Add("mc", "Assume MC input");
     fOptions.Add("bare-ps", "Use bare physics selection w/o task");
     fOptions.Add("verbose", "LEVEL", "Set verbosity level", 0);
     fOptions.Add("url", "URL", "Job location & input URL");
@@ -76,6 +77,7 @@ struct TrainSetup
     fOptions.Add("events", "N", "Number of events to analyse", -1);
     fOptions.Add("type", "ESD|AOD|USER", "Input data stype");
     fOptions.Add("setup", "Only do the setup");
+    fOptions.Add("branches", "Load only requested branches");
     fEscapedName = EscapeName(fName, "");
   }
   TrainSetup(const TrainSetup& o) 
@@ -114,7 +116,6 @@ struct TrainSetup
     // --- Create the helper -----------------------------------------
     TString  url     = fOptions.Get("url");
     Int_t    verbose = fOptions.AsInt("verbose");
-    Bool_t   mc      = fOptions.AsBool("mc");
 
     fHelper = Helper::Create(url.Data(), verbose);
     if (!fHelper) { 
@@ -124,6 +125,7 @@ struct TrainSetup
 
     // --- Check the type, if possible -------------------------------
     UShort_t type    = fHelper->InputType();
+    Bool_t   mc      = fHelper->IsMC();
     if (fOptions.Has("type")) { 
       const TString& it = fOptions.Get("type");
       if      (it.EqualTo("ESD",TString::kIgnoreCase)) type = Helper::kESD;
@@ -157,6 +159,7 @@ struct TrainSetup
     // In test mode, collect system information on every event 
     // if (oper == kTest)  mgr->SetNSysInfo(1); 
     if (verbose  >  0)      mgr->SetDebugLevel(verbose);
+    mgr->SetAutoBranchLoading(!fOptions.Has("branches"));
     if (fHelper->Mode() == Helper::kLocal) 
       mgr->SetUseProgressBar(kTRUE, 100);
    
@@ -216,18 +219,38 @@ struct TrainSetup
     // --- Save setup to disk ----------------------------------------
     SaveSetup(true);
 
-    // Some information
+    // --- Some information ------------------------------------------
     mgr->PrintStatus();
-
+    if (fHelper->Mode() != Helper::kLocal) {
+      TIter next(mgr->GetTasks());
+      AliAnalysisTask* sub = 0;
+      while ((sub = static_cast<AliAnalysisTask*>(next()))) { 
+       sub->Print();
+      }
+    }
     return true;
   }
+  void PrintTimer(TStopwatch& timer, const char* where)
+  {
+    timer.Stop();
+    Double_t t = timer.RealTime();
+    Int_t    h = Int_t(t / 3600); t -= h * 3600;
+    Int_t    m = Int_t(t /   60); t -= m *   60;
+    if (t < 0) t = 0;
+    Info(where, "took %4d:%02d:%06.3f", h, m, t);
+  }
+    
   Bool_t Run()
   {
     TString cwd = gSystem->WorkingDirectory();
     Bool_t status = false;
+    TStopwatch timer;
+    timer.Start();
     try {
       if (!Init()) throw TString("Failed to intialize the train");
-
+      PrintTimer(timer, "Initialization");
+      timer.Continue();
+      
       // Check if we're asked to only do the setup 
       if (fOptions.Has("setup")) {
        status = true;
@@ -238,6 +261,8 @@ struct TrainSetup
       
       Long64_t nEvents = fOptions.AsLong("events", -1);
       Long64_t ret     = fHelper->Run(nEvents);
+      PrintTimer(timer, "Processing");
+      timer.Continue();
       
       // Make sure we go back 
       gSystem->ChangeDirectory(cwd.Data());
@@ -248,11 +273,17 @@ struct TrainSetup
       status = true;
     }
     catch (TString& e) {
-      if (status) 
-       Warning("Main", e);
-      else 
-       Error("Main", e);
+      if (status) Warning("Run", "%s", e.Data());
+      else       Error("Run", "%s", e.Data());
+    }
+    if (fOptions.Has("date")) {
+      TString escaped = EscapeName(fName, "");
+      gSystem->Exec(Form("rm -f last_%s", escaped.Data()));
+      gSystem->Exec(Form("ln -sf %s last_%s", 
+                        fEscapedName.Data(), escaped.Data()));
     }
+    PrintTimer(timer, "Finish");
+    timer.Continue();
     return status;
   }
   /** 
@@ -379,7 +410,7 @@ struct TrainSetup
       ret = train->Run();
     }
     catch (TString& e) { 
-      if (!e.IsNull()) Error("Main", e);
+      if (!e.IsNull()) Error("Main", "%s", e.Data());
     }
     if (gApplication && asProg) {
       gSystem->Sleep(3);
@@ -672,8 +703,8 @@ protected:
       << "  --name=$name";
     opts.Store(o, " \\\n  --", "", true);
     o << ")\n\n"
-      << "echo \"Running runTrain2 ${opts[@]} $@\"\n"
-      << "runTrain2 \"${opts[@]}\" $@\n\n"
+      << "echo \"Running runTrain ${opts[@]} $@\"\n"
+      << "runTrain \"${opts[@]}\" $@\n\n"
       << "# EOF" << std::endl;
     o.close();
     gSystem->Exec(Form("chmod a+x %s.sh", out.Data()));