ROOT logo
enum { kMyRunModeLocal = 0, kMyRunModeCAF, kMyRunModeGRID};
//#define TENDER
TChain * GetAnalysisChain(const char * incollection);

void runTriggerStudy(Char_t* data, Long64_t nev = -1, Long64_t offset = 0, Bool_t debug = kFALSE, Int_t runMode = 0, Bool_t isMC = 0, Int_t ntrackletsKine = 100, Bool_t rejectBGV0Trigger = kFALSE, const char* option = "", Int_t workers = -1)
{
  // runMode:
  //
  // 0 local 
  // 1 proof
#ifdef TENDER
  TGrid::Connect("alien://");
#endif
  if (nev < 0)
    nev = 1234567890;
  InitAndLoadLibs(runMode,workers,debug);

  // Create the analysis manager
  mgr = new AliAnalysisManager;

  // Add ESD handler
  AliESDInputHandler* esdH = new AliESDInputHandler;
  // Do I need any of this? 
  //  esdH->SetInactiveBranches("AliESDACORDE FMD ALIESDTZERO ALIESDZDC AliRawDataErrorLogs CaloClusters Cascades EMCALCells EMCALTrigger ESDfriend Kinks AliESDTZERO ALIESDACORDE MuonTracks TrdTracks");
  mgr->SetInputEventHandler(esdH);

  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("CreateAlienHandlerTrigger.C");
    AliAnalysisGrid *alienHandler = CreateAlienHandlerTrigger(data,"pass1",isMC);  
    if (!alienHandler) {
      cout << "Cannot create alien handler" << endl;    
      exit(1);
    }
    mgr->SetGridHandler(alienHandler);  
  }

  // Add tender
#ifdef TENDER
  gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/TenderSupplies/AddTaskTender.C");
  AliAnalysisTask* tender=0x0;
  if(!isMC)
    {
      tender = AddTaskTender(kTRUE);
      // tender->SetDebugLevel(10);
    }
  else
    {
      tender = AddTaskTender(kFALSE);
      // tender->SetDebugLevel(10);
    }
#endif
  
  // Add physics selection
  gROOT->ProcessLine(".L $ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
  physicsSelectionTask = AddTaskPhysicsSelection(isMC,1,!isMC);//FIXME
  physicsSelectionTask->GetPhysicsSelection()->SetSkipZDCTime(1);// Skip ZDC - applyied later



  // 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;
  }

  
  
  // load my task
  AliAnalysisTaskTriggerStudy *task = new AliAnalysisTaskTriggerStudy("TaskOfflineTrigger");
  mgr->AddTask(task);
  // Set I/O
  AliAnalysisDataContainer *cinput0 = mgr->GetCommonInputContainer();
  AliAnalysisDataContainer *coutput1 = mgr->CreateContainer("cTrigStudy",
							    AliHistoListWrapper::Class(),
							    AliAnalysisManager::kOutputContainer,
							    "Trig_Temp.root");
  mgr->ConnectInput(task, 0, mgr->GetCommonInputContainer());
  mgr->ConnectOutput(task,1,coutput1);



  task->SetIsMC(isMC);
  task->SetNTrackletsCutKine(ntrackletsKine);
  task->SetRejectBGWithV0(rejectBGV0Trigger);

  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)+"#esdTree",nev);
  } else if (runMode == kMyRunModeGRID) {
    mgr->StartAnalysis("grid");
  }else {
    cout << "ERROR: unknown run mode" << endl;        
  }

  if (doSave) MoveOutput(data, Form("_TrkCut_%d_V0BGCUT_%d",ntrackletsKine,rejectBGV0Trigger));

  
}


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

  TString path("outTrigger/");
  path = path + TString(data).Tokenize("/")->Last()->GetName() + suffix;
  
  TString fileName = "trigger_study.root";
  gSystem->mkdir(path, kTRUE);
  gSystem->Rename(fileName, path + "/" + fileName);
  gSystem->Rename("event_stat.root", path + "/" + "event_stat.root");
  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("esdTree");
  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) {

  if (runMode == kMyRunModeCAF)
  {
    cout << "Init in CAF mode" << endl;
    
    gEnv->SetValue("XSec.GSI.DelegProxy", "2");
    // cout << workers>0 ? Form("workers=%d",workers) : "workers=1x" << endl;
    // exit(1);
    TProof * p = TProof::Open("alice-caf.cern.ch", workers>0 ? Form("workers=%d",workers) : "workers=1x");
    p->Exec("TObject *o = gEnv->GetTable()->FindObject(\"Proof.UseMergers\"); gEnv->GetTable()->Remove(o);", kTRUE);
    //TProof::Open("skaf.saske.sk", workers>0 ? Form("workers=%d",workers) : "");
    
    // Enable the needed package (par fileS)
    // 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/PWG0base");
    // gProof->EnablePackage("$ALICE_ROOT/PWG0base");
    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/include "));
    gROOT->ProcessLine(gSystem->ExpandPathName(".include $ALICE_ROOT/TOF "));

    // Use a precompiled tag
    TString alirootMode="";    // STEERBase,ESD,AOD,ANALYSIS,ANALYSISalice (default aliroot mode)
    //alirootMode="ALIROOT";     // $ALICE_ROOT/macros/loadlibs.C
    //  alirootMode="REC";     // $ALICE_ROOT/macros/loadlibsrec.C
    //  alirootMode="SIM";     // $ALICE_ROOT/macros/loadlibssim.C
    //  alirootMode="TRAIN";   // $ALICE_ROOT/macros/loadlibstrain.C (not working yet)
    //  alirootMode="CUSTOM";  // nothing is loaded, but aliroot variables are set (not working yet)
 
    TString extraLibs;
    extraLibs= ""; // not needed in default aliroot mode
    extraLibs+="CDB:RAWDatabase:STEER:TENDER:TRDbase:STAT:TRDrec:VZERObase:VZEROsim:VZEROrec:RAWDatarec:TPCbase:TPCrec:TPCcalib:TENDERSupplies:RAWDatabase:RAWDatarec:RAWDatasim:TOFbase:TOFrec";
    TList *list = new TList();
    // sets $ALIROOT_MODE on each worker to let proof to know to run in special mode
    list->Add(new TNamed("ALIROOT_MODE", alirootMode.Data()));
    // sets $ALIROOT_EXTRA_LIBS on each worker to let proof to know to load extra libs
    list->Add(new TNamed("ALIROOT_EXTRA_LIBS", extraLibs.Data()));
#ifdef TENDER
    list->Add(new TNamed("ALIROOT_ENABLE_ALIEN", "1"));
#endif
    // connect to proof
    gProof->EnablePackage("VO_ALICE@AliRoot::v4-21-22-AN", list);
    //    gProof->Exec("TGrid::Connect(\"alien://\");");
  }
  else
  {
    cout << "Init in Local or Grid mode" << endl;

    gSystem->Load("libCore");  
    gSystem->Load("libGeom");
    gSystem->Load("libPhysics");
    gSystem->Load("libVMC");
    gSystem->Load("libTree");
    gSystem->Load("libProof");
    gSystem->Load("libTree");
    gSystem->Load("libSTEERBase");
    gSystem->Load("libESD");
    gSystem->Load("libAOD");
    gSystem->Load("libANALYSIS");
    gSystem->Load("libOADB");
    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
  // TODO: replace this by a list of TOBJStrings
  TString taskName("$ALICE_ROOT/PWG0/multPbPb/AliAnalysisTaskTriggerStudy.cxx+");
  TString listName("$ALICE_ROOT/PWGPP/background/AliHistoListWrapper.cxx+");

  gSystem->ExpandPathName(taskName);
  gSystem->ExpandPathName(listName);



  // Create, add task
  if (runMode == kMyRunModeCAF) {
    gProof->Load(listName+(debug?"+g":""));   
    gProof->Load(taskName+(debug?"+g":""));
  } else {
    gROOT->LoadMacro(listName+(debug?"+g":""));   
    gROOT->LoadMacro(taskName+(debug?"+g":""));    
  }


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