ROOT logo
// TODO:
// 1. run with Many centrality bins at once
#include <string.h>

enum { kMyRunModeLocal = 0, kMyRunModeCAF, kMyRunModeGRID};

TList * listToLoad = new TList();

TChain * GetAnalysisChain(const char * incollection);

void runProof(Char_t* data = "/alice/data/LHC10h_000138653_p2_AOD049", Long64_t nev = -1, Long64_t offset = 0, Bool_t debug = kFALSE, Int_t runMode = 1, Bool_t isMC = 0,
              const char* option = "SAVE", Int_t workers = -1)
{
   // runMode:
   //
   // 0 local
   // 1 proof
   // 2 grid

   if (nev < 0)
      nev = 1234567890;

   InitAndLoadLibs(runMode, workers, debug);

   // Create the analysis manager
   mgr = new AliAnalysisManager;

   // Add AOD handler
   AliAODInputHandler* AODH = new AliAODInputHandler;
   mgr->SetInputEventHandler(AODH);
   mgr->SetDebugLevel(10);

   // Is this needed for AOD?
   // if(isMC) {
   //   AliMCEventHandler* handler = new AliMCEventHandler;
   //   handler->SetPreReadMode(AliMCEventHandler::kLmPreRead);
   //   mgr->SetMCtruthEventHandler(handler);
   // }


   // If we are running on grid, we need the alien handler
   if (runMode == kMyRunModeGRID)
   {
      // Create and configure the alien handler plugin
      gROOT->LoadMacro("CreateAlienHandler.C");
      AliAnalysisGrid *alienHandler = CreateAlienHandler(data, listToLoad, "full", isMC);
      if (!alienHandler)
      {
         cout << "Cannot create alien handler" << endl;
         exit(1);
      }
      mgr->SetGridHandler(alienHandler);
   }

   // Parse option strings
   TString optionStr(option);

   // remove SAVE option if set
   // This  is copied from a macro by Jan. The reason I kept it is that I may want to pass textual options to the new task at some point
   Bool_t doSave = kFALSE;
   TString optionStr(option);
   if (optionStr.Contains("SAVE"))
   {
      optionStr = optionStr(0, optionStr.Index("SAVE")) + optionStr(optionStr.Index("SAVE") + 4, optionStr.Length());
      doSave = kTRUE;
   }

   //  AliLog::SetClassDebugLevel("AliESDtrackCuts", AliLog::kDebug);// FIXME

   // load my task
   gROOT->ProcessLine(".L AddTaskSpectraAOD.C");
   AliAnalysisTaskSpectraAOD * task = AddTaskSpectraAOD("SpectraAOD.root");
   task->SetIsMC(isMC);
   // Init and run the analy
   if (!mgr->InitAnalysis()) return;

   mgr->PrintStatus();

   if (runMode == kMyRunModeLocal)
   {
      // If running in local mode, create chain of ESD files
      cout << "RUNNING LOCAL, CHAIN" << endl;
      TChain * chain = GetAnalysisChain(data);
      //    chain->Print();
      mgr->StartAnalysis("local", chain, nev);
   }
   else if (runMode == kMyRunModeCAF)
   {
      mgr->StartAnalysis("proof", TString(data) + "#aodTree", nev);
   }
   else if (runMode == kMyRunModeGRID)
   {
      mgr->StartAnalysis("grid");
   }
   else
   {
      cout << "ERROR: unknown run mode" << endl;
   }

   TString pathsuffix = "";
   if (doSave) MoveOutput(data, pathsuffix.Data());

}


void MoveOutput(const char * data, const char * suffix = "")
{

   TString path("output/");
   path = path + TString(data).Tokenize("/")->Last()->GetName() + suffix;

   TString fileName = "SpectraAOD.root";
   gSystem->mkdir(path, kTRUE);
   gSystem->Rename(fileName, path + "/" + fileName);
   // for(Int_t ibin = 0; ibin < 20; ibin++){
   //   TString fileBin = fileName;
   //   fileBin.ReplaceAll(".root",Form("_%2.2d.root",ibin));
   //   gSystem->Rename(fileBin, path + "/" + fileBin);
   // }
   Printf(">>>>> Moved files to %s", path.Data());
}



TChain * GetAnalysisChain(const char * incollection)
{
   // Builds a chain of esd files
   // incollection can be
   // - a single root file
   // - an xml collection of files on alien
   // - a ASCII containing a list of local root files
   TChain* analysisChain = 0;
   // chain
   analysisChain = new TChain("aodTree");
   if (TString(incollection).Contains(".root"))
   {
      analysisChain->Add(incollection);
   }
   else if (TString(incollection).Contains("xml"))
   {
      TGrid::Connect("alien://");
      TAlienCollection * coll = TAlienCollection::Open(incollection);
      while (coll->Next())
      {
         analysisChain->Add(TString("alien://") + coll->GetLFN());
      }
   }
   else
   {
      ifstream file_collect(incollection);
      TString line;
      while (line.ReadLine(file_collect))
      {
         analysisChain->Add(line.Data());
      }
   }
   analysisChain->GetListOfFiles()->Print();

   return analysisChain;
}


void InitAndLoadLibs(Int_t runMode = kMyRunModeLocal, Int_t workers = 0, Bool_t debug = 0)
{
   // Loads libs and par files + custom task and classes

   // Custom stuff to be loaded

   listToLoad->Add(new TObjString("AliSpectraAODHistoManager.cxx+"));
   listToLoad->Add(new TObjString("AliSpectraAODEventCuts.cxx+"));
   listToLoad->Add(new TObjString("AliSpectraAODTrackCuts.cxx+"));
   listToLoad->Add(new TObjString("AliAnalysisTaskSpectraAOD.cxx+"));

   if (runMode == kMyRunModeCAF)
   {
      cout << "Init in CAF mode" << endl;

      gEnv->SetValue("XSec.GSI.DelegProxy", "2");
      TProof * p = TProof::Open("alice-caf.cern.ch", workers > 0 ? Form("workers=%d", workers) : "1x");
      //TProof * p = TProof::Open("skaf.saske.sk", workers>0 ? Form("workers=%d",workers) : "");
      p->Exec("TObject *o = gEnv->GetTable()->FindObject(\"Proof.UseMergers\"); gEnv->GetTable()->Remove(o);", kTRUE);

      gProof->EnablePackage("VO_ALICE@AliRoot::v4-21-29-AN");
      gSystem->Load("libCore.so");
      gSystem->Load("libTree.so");
      gSystem->Load("libGeom.so");
      gSystem->Load("libVMC.so");
      gSystem->Load("libPhysics.so");
      gSystem->Load("libSTEERBase");
      gSystem->Load("libESD");
      gSystem->Load("libAOD");
      gSystem->Load("libANALYSIS");
      gSystem->Load("libOADB");
      gSystem->Load("libANALYSISalice");

      // Enable the needed package
      // gProof->UploadPackage("$ALICE_ROOT/obj/STEERBase");
      // gProof->EnablePackage("$ALICE_ROOT/obj/STEERBase");
      // gProof->UploadPackage("$ALICE_ROOT/obj/ESD");
      // gProof->EnablePackage("$ALICE_ROOT/obj/ESD");
      // gProof->UploadPackage("$ALICE_ROOT/obj/AOD");
      // gProof->EnablePackage("$ALICE_ROOT/obj/AOD");
      // gProof->UploadPackage("$ALICE_ROOT/obj/ANALYSIS");
      // gProof->EnablePackage("$ALICE_ROOT/obj/ANALYSIS");
      // gProof->UploadPackage("$ALICE_ROOT/obj/OADB");
      // gProof->EnablePackage("$ALICE_ROOT/obj/OADB");
      // gProof->UploadPackage("$ALICE_ROOT/obj/ANALYSISalice");
      // gProof->EnablePackage("$ALICE_ROOT/obj/ANALYSISalice");
      // gProof->UploadPackage("$ALICE_ROOT/obj/PWG0base");
      // gProof->EnablePackage("$ALICE_ROOT/obj/PWG0base");
      // gROOT->ProcessLine(gSystem->ExpandPathName(".include $ALICE_ROOT/PWG0/multPb"));
      // gROOT->ProcessLine(gSystem->ExpandPathName(".include $ALICE_ROOT/PWGPP/background"));
   }
   else
   {
      cout << "Init in Local or Grid mode" << endl;
      gSystem->Load("libCore.so");
      gSystem->Load("libTree.so");
      gSystem->Load("libGeom.so");
      gSystem->Load("libVMC.so");
      gSystem->Load("libPhysics.so");
      gSystem->Load("libSTEERBase");
      gSystem->Load("libESD");
      gSystem->Load("libAOD");
      gSystem->Load("libANALYSIS");
      gSystem->Load("libOADB");
      gSystem->Load("libANALYSISalice");
      // Use AliRoot includes to compile our task
      gROOT->ProcessLine(".include $ALICE_ROOT/include");

      // gSystem->Load("libVMC");
      // gSystem->Load("libTree");
      // gSystem->Load("libSTEERBase");
      // gSystem->Load("libESD");
      // gSystem->Load("libAOD");
      // gSystem->Load("libANALYSIS");
      // gSystem->Load("libANALYSISalice");
      // gSystem->Load("libPWG0base");

      // gROOT->ProcessLine(gSystem->ExpandPathName(".include $ALICE_ROOT/PWG0/multPb"));
      // gROOT->ProcessLine(gSystem->ExpandPathName(".include $ALICE_ROOT/PWGPP/background"));
      //    gROOT->ProcessLine(gSystem->ExpandPathName(".include $ALICE_ROOT/PWGPP/background/"));
   }
   // Load helper classes
   TIterator * iter = listToLoad->MakeIterator();
   TObjString * name = 0;
   while (name = (TObjString *)iter->Next())
   {
      gSystem->ExpandPathName(name->String());
      cout << name->String().Data();
      if (runMode == kMyRunModeCAF)
      {
         gProof->Load(name->String() + (debug ? "+g" : ""));
      }
      else
      {
         gROOT->LoadMacro(name->String() + (debug ? "+g" : ""));
      }
   }

}
 runProof.C:1
 runProof.C:2
 runProof.C:3
 runProof.C:4
 runProof.C:5
 runProof.C:6
 runProof.C:7
 runProof.C:8
 runProof.C:9
 runProof.C:10
 runProof.C:11
 runProof.C:12
 runProof.C:13
 runProof.C:14
 runProof.C:15
 runProof.C:16
 runProof.C:17
 runProof.C:18
 runProof.C:19
 runProof.C:20
 runProof.C:21
 runProof.C:22
 runProof.C:23
 runProof.C:24
 runProof.C:25
 runProof.C:26
 runProof.C:27
 runProof.C:28
 runProof.C:29
 runProof.C:30
 runProof.C:31
 runProof.C:32
 runProof.C:33
 runProof.C:34
 runProof.C:35
 runProof.C:36
 runProof.C:37
 runProof.C:38
 runProof.C:39
 runProof.C:40
 runProof.C:41
 runProof.C:42
 runProof.C:43
 runProof.C:44
 runProof.C:45
 runProof.C:46
 runProof.C:47
 runProof.C:48
 runProof.C:49
 runProof.C:50
 runProof.C:51
 runProof.C:52
 runProof.C:53
 runProof.C:54
 runProof.C:55
 runProof.C:56
 runProof.C:57
 runProof.C:58
 runProof.C:59
 runProof.C:60
 runProof.C:61
 runProof.C:62
 runProof.C:63
 runProof.C:64
 runProof.C:65
 runProof.C:66
 runProof.C:67
 runProof.C:68
 runProof.C:69
 runProof.C:70
 runProof.C:71
 runProof.C:72
 runProof.C:73
 runProof.C:74
 runProof.C:75
 runProof.C:76
 runProof.C:77
 runProof.C:78
 runProof.C:79
 runProof.C:80
 runProof.C:81
 runProof.C:82
 runProof.C:83
 runProof.C:84
 runProof.C:85
 runProof.C:86
 runProof.C:87
 runProof.C:88
 runProof.C:89
 runProof.C:90
 runProof.C:91
 runProof.C:92
 runProof.C:93
 runProof.C:94
 runProof.C:95
 runProof.C:96
 runProof.C:97
 runProof.C:98
 runProof.C:99
 runProof.C:100
 runProof.C:101
 runProof.C:102
 runProof.C:103
 runProof.C:104
 runProof.C:105
 runProof.C:106
 runProof.C:107
 runProof.C:108
 runProof.C:109
 runProof.C:110
 runProof.C:111
 runProof.C:112
 runProof.C:113
 runProof.C:114
 runProof.C:115
 runProof.C:116
 runProof.C:117
 runProof.C:118
 runProof.C:119
 runProof.C:120
 runProof.C:121
 runProof.C:122
 runProof.C:123
 runProof.C:124
 runProof.C:125
 runProof.C:126
 runProof.C:127
 runProof.C:128
 runProof.C:129
 runProof.C:130
 runProof.C:131
 runProof.C:132
 runProof.C:133
 runProof.C:134
 runProof.C:135
 runProof.C:136
 runProof.C:137
 runProof.C:138
 runProof.C:139
 runProof.C:140
 runProof.C:141
 runProof.C:142
 runProof.C:143
 runProof.C:144
 runProof.C:145
 runProof.C:146
 runProof.C:147
 runProof.C:148
 runProof.C:149
 runProof.C:150
 runProof.C:151
 runProof.C:152
 runProof.C:153
 runProof.C:154
 runProof.C:155
 runProof.C:156
 runProof.C:157
 runProof.C:158
 runProof.C:159
 runProof.C:160
 runProof.C:161
 runProof.C:162
 runProof.C:163
 runProof.C:164
 runProof.C:165
 runProof.C:166
 runProof.C:167
 runProof.C:168
 runProof.C:169
 runProof.C:170
 runProof.C:171
 runProof.C:172
 runProof.C:173
 runProof.C:174
 runProof.C:175
 runProof.C:176
 runProof.C:177
 runProof.C:178
 runProof.C:179
 runProof.C:180
 runProof.C:181
 runProof.C:182
 runProof.C:183
 runProof.C:184
 runProof.C:185
 runProof.C:186
 runProof.C:187
 runProof.C:188
 runProof.C:189
 runProof.C:190
 runProof.C:191
 runProof.C:192
 runProof.C:193
 runProof.C:194
 runProof.C:195
 runProof.C:196
 runProof.C:197
 runProof.C:198
 runProof.C:199
 runProof.C:200
 runProof.C:201
 runProof.C:202
 runProof.C:203
 runProof.C:204
 runProof.C:205
 runProof.C:206
 runProof.C:207
 runProof.C:208
 runProof.C:209
 runProof.C:210
 runProof.C:211
 runProof.C:212
 runProof.C:213
 runProof.C:214
 runProof.C:215
 runProof.C:216
 runProof.C:217
 runProof.C:218
 runProof.C:219
 runProof.C:220
 runProof.C:221
 runProof.C:222
 runProof.C:223
 runProof.C:224
 runProof.C:225
 runProof.C:226
 runProof.C:227
 runProof.C:228
 runProof.C:229
 runProof.C:230
 runProof.C:231
 runProof.C:232
 runProof.C:233
 runProof.C:234
 runProof.C:235
 runProof.C:236
 runProof.C:237
 runProof.C:238
 runProof.C:239
 runProof.C:240
 runProof.C:241
 runProof.C:242
 runProof.C:243
 runProof.C:244
 runProof.C:245
 runProof.C:246
 runProof.C:247
 runProof.C:248
 runProof.C:249
 runProof.C:250
 runProof.C:251
 runProof.C:252
 runProof.C:253
 runProof.C:254
 runProof.C:255
 runProof.C:256
 runProof.C:257
 runProof.C:258
 runProof.C:259
 runProof.C:260
 runProof.C:261
 runProof.C:262