ROOT logo
#ifndef __CINT__
#include <TSystem.h>
#include <TROOT.h>
#include <Rtypes.h>
#include <TString.h>
#include <TNamed.h>
#include <TObjArray.h>
#include <TObjString.h>
#include <TList.h>
#include <TStopwatch.h>
#endif

Bool_t RunALICE(TString anSrc = "grid",
                TString anMode = "terminate",
                TString input="aod" /*or "esd"*/,
                TString inputMC="" /*or "mc"*/,
                Long64_t nEvents = 1e10,
                Long64_t nSkip = 0,
                TString dsName="",
                TString alirsnliteManagers ="AddAMRsn",
                Bool_t useMultiHandler=kTRUE,
                TString alirsnlitesrc ="$ALICE_ROOT",
                TString alirsnlitetasks =""
               ) {

   // some init work
   anSrc.ToLower(); anMode.ToLower(); input.ToLower(); inputMC.ToLower();

   // loads libs and setup include paths
   if (LoadLibsBase(alirsnlitesrc)) return kFALSE;

   // reset manager if already exists
   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
   if (mgr) delete mgr;
   mgr = new AliAnalysisManager("AliRsnLiteAM","AliRsnLite Analysis Manager");

   Bool_t useAODOut = kFALSE;
   CreateInputHandlers(input,inputMC,useAODOut,useMultiHandler);

   // add default grid handler
   gROOT->LoadMacro("SetupAnalysisPlugin.C");
   AliAnalysisGrid *analysisPlugin = SetupAnalysisPlugin(anMode.Data());
   if (!analysisPlugin) { Printf("Error : analysisPlugin is null !!!"); return kFALSE; }
   mgr->SetGridHandler(analysisPlugin);
   if (!dsName.IsNull()) {
      if (!anSrc.CompareTo("proof") && !anMode.CompareTo("full")) {
         analysisPlugin->SetProofDataSet(dsName.Data());
         Printf(Form("Using DataSet %s ...",dsName.Data()));
      } else {
         analysisPlugin->SetFileForTestMode(dsName.Data());
         Printf(Form("Using Test file %s ...",dsName.Data()));
      }
   }

   TList *listManagers = CreateListOfManagersFromDir(alirsnliteManagers,alirsnlitetasks);
   if (!listManagers) { Printf("Error : CreateListOfManagersFromDir failed !!!"); return kFALSE;}

   // adds all tasks
   if (!AddAllManagers(listManagers, anSrc, anMode,input,inputMC)) { Printf("Error : AddAllManagers failed !!!"); return kFALSE;}

   gSystem->ListLibraries("ls");

   TStopwatch timer;
   timer.Start();
   // runs analysis
   if (!RunAnalysisManager(anSrc, anMode.Data(), nEvents, nSkip)) { Printf("Error : RunAnalysisManager failed !!!"); return kFALSE;}

   timer.Stop();
   timer.Print();
   Printf("Working directory is %s ...", gSystem->WorkingDirectory());
   Printf("Done OK");
   return kTRUE;

}

Int_t LoadLibsBase(TString alirsnlitesrc) {
   Int_t num = 0;
   if (gSystem->Load("libTree.so") < 0) {num++; return num;}
   if (gSystem->Load("libGeom.so") < 0) {num++; return num;}
   if (gSystem->Load("libVMC.so") < 0) {num++; return num;}
   if (gSystem->Load("libMinuit.so") < 0) {num++; return num;}
   if (gSystem->Load("libPhysics.so") < 0) {num++; return num;}
   if (gSystem->Load("libSTEERBase.so") < 0) {num++; return num;}
   if (gSystem->Load("libESD.so") < 0) {num++; return num;}
   if (gSystem->Load("libAOD.so") < 0) {num++; return num;}
   if (gSystem->Load("libANALYSIS.so") < 0) {num++; return num;}
   if (gSystem->Load("libOADB.so") < 0) {num++; return num;}
   if (gSystem->Load("libANALYSISalice.so") < 0) {num++; return num;}

   gSystem->AddIncludePath(Form("-I\"%s/include\"", gSystem->ExpandPathName(alirsnlitesrc.Data())));
   gROOT->ProcessLine(Form(".include %s/include", gSystem->ExpandPathName(alirsnlitesrc.Data())));

   return 0;
}

Bool_t CreateInputHandlers(TString input,TString inputMC,Bool_t useAODOut=kFALSE,Bool_t useMultiHandler=kTRUE) {

   Bool_t useMC = !inputMC.CompareTo("mc");

   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
   if (!mgr) { Printf("Error [CreateInputHandlers] : mgr is null !!!"); return kFALSE; }

   if (useMultiHandler) {
      AliMultiInputEventHandler *inputHandler = new AliMultiInputEventHandler();
      if (!input.CompareTo("esd")) {
         inputHandler->AddInputEventHandler(new AliESDInputHandler());
         if (useMC) inputHandler->AddInputEventHandler(new AliMCEventHandler());
      } else if (!input.CompareTo("aod")) {
         inputHandler->AddInputEventHandler(new AliAODInputHandler());
      }

      mgr->SetInputEventHandler(inputHandler);
   } else {
      if (!input.CompareTo("esd")) {
         mgr->SetInputEventHandler(new AliESDInputHandler());
         if (useMC) mgr->SetMCtruthEventHandler(new AliMCEventHandler());
      } else if (!input.CompareTo("aod")) {
         mgr->SetInputEventHandler(new AliAODInputHandler());
      }
      mgr->SetInputEventHandler(inputHandler);
   }

   if (useAODOut) {
      AliAODHandler *aodHandler   = new AliAODHandler();
      aodHandler->SetOutputFileName("AliAOD.root");
      mgr->SetOutputEventHandler(aodHandler);
   }

   return kTRUE;

}

TList *CreateListOfManagersFromDir(TString listManagersNames="",TString dir="") {

   TList *listManagers = new TList;
   TString dirsStr;
   TObjArray *dirs=0;

   if (listManagersNames.IsNull()) {
      if (dir.IsNull() || gSystem->AccessPathName(gSystem->ExpandPathName(dir.Data()))) {
         Printf("Error [CreateListOfManagersFromDir] : Dir '%s' doesn't exists !!!",dir.Data());
         return 0;
      }
      dirsStr = gSystem->GetFromPipe(Form("ls %s",dir.Data()));
      dirs = dirsStr.Tokenize("\n");
   } else {
      dirsStr = listManagersNames;
      dirs = dirsStr.Tokenize(" ");
   }

   TIter next(dirs);
   Int_t counter=0;
   TObjString *str,*strtmp;
   TObjArray *mydirstrTok;
   TString mydirstr,main,prefix;
   while ((str = (TObjString *)next.Next())) {
      // TODO add direcotry
      mydirstr = str->GetString();
      if (mydirstr.IsNull()) continue;

      Printf("Adding %s .,,",mydirstr.Data());
      mydirstrTok = mydirstr.Tokenize("_");

      main = ((TObjString *)mydirstrTok->At(0))->GetString();

      strtmp = (TObjString *)mydirstrTok->At(1);
      if (strtmp) prefix = strtmp->GetString(); else prefix="";

      listManagers->Add(new TNamed(main,prefix));
   }

   return listManagers;
}

Bool_t AddAllManagers(TList *listManagers,TString anSrc, TString anMode,TString input,TString inputMC) {
   TIter next(listManagers);
   Int_t counter=0;
   TNamed *name;
   while ((name = (TNamed *)next.Next())) {
      if (!AddAnalysisManager(name->GetName(), anSrc, anMode,input,inputMC,name->GetTitle(),Form("%d",counter++))) {
         Printf("Error: Problem adding %s",name->GetName());
         return kFALSE;
      }
   }

   return kTRUE;
}

Bool_t AddAnalysisManager(TString managerMacro, TString anSrc, TString anMode,TString input,TString inputMC, TString postfix,TString idStr) {
   gROOT->LoadMacro(Form("%s.C", managerMacro.Data()));
   return gROOT->ProcessLine(Form("%s\(\"%s\",\"%s\",\"%s\"\,\"%s\",\"%s\",\"%s\"\);", managerMacro.Data(), anSrc.Data(), anMode.Data(),input.Data(),inputMC.Data(), postfix.Data(),idStr.Data()));
}

Bool_t RunAnalysisManager(TString anSrc = "proof", TString anMode = "test", Long64_t nEvents = 1e10, Long64_t nSkip = 0) {

   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();

   if (!mgr) { Printf("Error [RunAnalysisManager] : mgr is null !!!"); return kFALSE; }

   // Run analysis
   mgr->InitAnalysis();
   mgr->PrintStatus();

   if ((!anSrc.CompareTo("proof")) || (!anSrc.CompareTo("local"))) {
      mgr->StartAnalysis(anSrc.Data(), nEvents, nSkip);
   } else {
      mgr->StartAnalysis(anSrc.Data());
   }

   return kTRUE;
}
 RunALICE.C:1
 RunALICE.C:2
 RunALICE.C:3
 RunALICE.C:4
 RunALICE.C:5
 RunALICE.C:6
 RunALICE.C:7
 RunALICE.C:8
 RunALICE.C:9
 RunALICE.C:10
 RunALICE.C:11
 RunALICE.C:12
 RunALICE.C:13
 RunALICE.C:14
 RunALICE.C:15
 RunALICE.C:16
 RunALICE.C:17
 RunALICE.C:18
 RunALICE.C:19
 RunALICE.C:20
 RunALICE.C:21
 RunALICE.C:22
 RunALICE.C:23
 RunALICE.C:24
 RunALICE.C:25
 RunALICE.C:26
 RunALICE.C:27
 RunALICE.C:28
 RunALICE.C:29
 RunALICE.C:30
 RunALICE.C:31
 RunALICE.C:32
 RunALICE.C:33
 RunALICE.C:34
 RunALICE.C:35
 RunALICE.C:36
 RunALICE.C:37
 RunALICE.C:38
 RunALICE.C:39
 RunALICE.C:40
 RunALICE.C:41
 RunALICE.C:42
 RunALICE.C:43
 RunALICE.C:44
 RunALICE.C:45
 RunALICE.C:46
 RunALICE.C:47
 RunALICE.C:48
 RunALICE.C:49
 RunALICE.C:50
 RunALICE.C:51
 RunALICE.C:52
 RunALICE.C:53
 RunALICE.C:54
 RunALICE.C:55
 RunALICE.C:56
 RunALICE.C:57
 RunALICE.C:58
 RunALICE.C:59
 RunALICE.C:60
 RunALICE.C:61
 RunALICE.C:62
 RunALICE.C:63
 RunALICE.C:64
 RunALICE.C:65
 RunALICE.C:66
 RunALICE.C:67
 RunALICE.C:68
 RunALICE.C:69
 RunALICE.C:70
 RunALICE.C:71
 RunALICE.C:72
 RunALICE.C:73
 RunALICE.C:74
 RunALICE.C:75
 RunALICE.C:76
 RunALICE.C:77
 RunALICE.C:78
 RunALICE.C:79
 RunALICE.C:80
 RunALICE.C:81
 RunALICE.C:82
 RunALICE.C:83
 RunALICE.C:84
 RunALICE.C:85
 RunALICE.C:86
 RunALICE.C:87
 RunALICE.C:88
 RunALICE.C:89
 RunALICE.C:90
 RunALICE.C:91
 RunALICE.C:92
 RunALICE.C:93
 RunALICE.C:94
 RunALICE.C:95
 RunALICE.C:96
 RunALICE.C:97
 RunALICE.C:98
 RunALICE.C:99
 RunALICE.C:100
 RunALICE.C:101
 RunALICE.C:102
 RunALICE.C:103
 RunALICE.C:104
 RunALICE.C:105
 RunALICE.C:106
 RunALICE.C:107
 RunALICE.C:108
 RunALICE.C:109
 RunALICE.C:110
 RunALICE.C:111
 RunALICE.C:112
 RunALICE.C:113
 RunALICE.C:114
 RunALICE.C:115
 RunALICE.C:116
 RunALICE.C:117
 RunALICE.C:118
 RunALICE.C:119
 RunALICE.C:120
 RunALICE.C:121
 RunALICE.C:122
 RunALICE.C:123
 RunALICE.C:124
 RunALICE.C:125
 RunALICE.C:126
 RunALICE.C:127
 RunALICE.C:128
 RunALICE.C:129
 RunALICE.C:130
 RunALICE.C:131
 RunALICE.C:132
 RunALICE.C:133
 RunALICE.C:134
 RunALICE.C:135
 RunALICE.C:136
 RunALICE.C:137
 RunALICE.C:138
 RunALICE.C:139
 RunALICE.C:140
 RunALICE.C:141
 RunALICE.C:142
 RunALICE.C:143
 RunALICE.C:144
 RunALICE.C:145
 RunALICE.C:146
 RunALICE.C:147
 RunALICE.C:148
 RunALICE.C:149
 RunALICE.C:150
 RunALICE.C:151
 RunALICE.C:152
 RunALICE.C:153
 RunALICE.C:154
 RunALICE.C:155
 RunALICE.C:156
 RunALICE.C:157
 RunALICE.C:158
 RunALICE.C:159
 RunALICE.C:160
 RunALICE.C:161
 RunALICE.C:162
 RunALICE.C:163
 RunALICE.C:164
 RunALICE.C:165
 RunALICE.C:166
 RunALICE.C:167
 RunALICE.C:168
 RunALICE.C:169
 RunALICE.C:170
 RunALICE.C:171
 RunALICE.C:172
 RunALICE.C:173
 RunALICE.C:174
 RunALICE.C:175
 RunALICE.C:176
 RunALICE.C:177
 RunALICE.C:178
 RunALICE.C:179
 RunALICE.C:180
 RunALICE.C:181
 RunALICE.C:182
 RunALICE.C:183
 RunALICE.C:184
 RunALICE.C:185
 RunALICE.C:186
 RunALICE.C:187
 RunALICE.C:188
 RunALICE.C:189
 RunALICE.C:190
 RunALICE.C:191
 RunALICE.C:192
 RunALICE.C:193
 RunALICE.C:194
 RunALICE.C:195
 RunALICE.C:196
 RunALICE.C:197
 RunALICE.C:198
 RunALICE.C:199
 RunALICE.C:200
 RunALICE.C:201
 RunALICE.C:202
 RunALICE.C:203
 RunALICE.C:204
 RunALICE.C:205
 RunALICE.C:206
 RunALICE.C:207
 RunALICE.C:208
 RunALICE.C:209
 RunALICE.C:210
 RunALICE.C:211
 RunALICE.C:212