ROOT logo
// $Id$
/*
 * Example macro to run an HLT analysis task for comparing the offline
 * with the HLT esd tree on the GRID.
 *
 * The output is a root file containing the histograms defined in the
 * analysis task. There is one output file per detector.
 *
 * Usage:
 * <pre>
 *   aliroot -q compare-HLT-offline-grid.C'("000115322","/alice/data/2010/LHC10b","ESDcomparison","output","full","global")'
 * </pre>
 * - run number
 * - GRID input directory, where you define in which LHC period the run number belongs to
 * - GRID working directory, where the .xml, .jdl and the task are uploaded 
 * - GRID output directory with respect to the working one, where the output files of the task are located 
 * - run in full mode, i.e. completely on the GRID with all the chunks of the run processed
 * - specify the analysis task you want to run
 * - specify the path where the task is located, by default it takes $ALICE_ROOT/HLT/QA/tasks
 * - specify the beam type
 * - specify which THnSparse objects you want to have filled
 * - specify whether you are interested only in HLT triggered events
 * - specify how many events you want to analyze
 *
 * @ingroup alihlt_qa
 * @author Hege.Erdal@student.uib.no, Kalliopi.Kanaki@ift.uib.no
 */

void compare_HLT_offline_grid( TString runNumber
                              ,TString dataDir
			      ,TString gridWorkingDir
			      ,TString gridOutputDir
			      ,const char* mode = "full"
			      ,const char* detectorTask="global"
			      ,TString taskFolder="$ALICE_ROOT/HLT/QA/tasks/"
			      ,TString beamType="p-p"
			      ,TString options="event-off event-hlt track-off track-hlt"
			      ,bool fUseHLTTrigger=kFALSE
			      ,Long64_t nEvents=1234567890
			     )
{
 
  TStopwatch timer;
  timer.Start();

  //gSystem->Load("libTree");
  gSystem->Load("libCore");
  gSystem->Load("libGeom");
  gSystem->Load("libVMC");
  gSystem->Load("libPhysics");
 
  //----------- Loading the required libraries ---------//

  gSystem->Load("libSTEERBase");
  gSystem->Load("libESD");
  gSystem->Load("libAOD");
  gSystem->Load("libANALYSIS");
  gSystem->Load("libANALYSISalice");
  gSystem->Load("libHLTbase");
  gROOT->ProcessLine(".include $ALICE_ROOT/include"); 
  gSystem->AddIncludePath("-I$ALICE_ROOT/HLT/BASE -I. -I$ALICE_ROOT/STEER -I$ALICE_ROOT/ANALYSIS");
  //gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");

  
  Bool_t bTPC=kFALSE, bPHOS=kFALSE, bEMCAL=kFALSE, bGLOBAL=kFALSE, bD0=kFALSE, bCB=kFALSE;
 
  TString allArgs = detectorTask;
  TString argument;
 
  TObjArray *pTokens = allArgs.Tokenize(" ");
  if(pTokens){
     for(int i=0; i<pTokens->GetEntries(); i++){
         argument=((TObjString*)pTokens->At(i))->GetString();
         if(argument.IsNull()) continue;

         if(argument.CompareTo("phos", TString::kIgnoreCase)==0){
  	    bPHOS = kTRUE;
	    continue;
         }
         if(argument.CompareTo("emcal", TString::kIgnoreCase)==0){
  	    bEMCAL = kTRUE;
	    continue;
         }         
	 if(argument.CompareTo("global", TString::kIgnoreCase)==0){
  	    bGLOBAL = kTRUE;
	    continue;
         }  
	 if(argument.CompareTo("D0", TString::kIgnoreCase)==0){
	   bD0 = kTRUE;
	   continue;
	 }  
	 if(argument.CompareTo("cb", TString::kIgnoreCase)==0){
	   bCB = kTRUE;
	   continue;
	 }  
         else break;
    }
  }
    
  //-------- Make the analysis manager ---------------//
 
  AliAnalysisManager *mgr  = new AliAnalysisManager("TestManager");
  AliESDInputHandler *esdH = new AliESDInputHandler;
  esdH->SetReadHLT();
  esdH->SetReadFriends(kFALSE);
  mgr->SetInputEventHandler(esdH);  
  mgr->SetNSysInfo(1000);

  //To use Physics Selection
  //AliPhysicsSelectionTask *physSelTask = AddTaskPhysicsSelection(kFALSE,kTRUE);

  // Create and configure the alien handler plugin
  gROOT->LoadMacro("$ALICE_ROOT/HLT/QA/tasks/macros/CreateAlienHandler.C");
  AliAnalysisGrid *alienHandler = CreateAlienHandler(runNumber, dataDir, gridWorkingDir, gridOutputDir, mode, detectorTask);
  if (!alienHandler) return;
  
  // Connect plugin to the analysis manager
  mgr->SetGridHandler(alienHandler);
 
  //-------------- Compile the analysis tasks ---------- //
  if(bPHOS && bEMCAL) {
    gSystem->Load("libHLTbase");
    gSystem->Load("libAliHLTUtil");
    gSystem->Load("libAliHLTGlobal");
    TString strTask1("AliAnalysisTaskHLTCalo.cxx+");
    TString strTask2("AliAnalysisTaskHLTPHOS.cxx+");    
    TString strTask3("AliAnalysisTaskHLTEMCAL.cxx+");    
    gROOT->LoadMacro(taskFolder+strTask1); 
    gROOT->LoadMacro(taskFolder+strTask2);  
    gROOT->LoadMacro(taskFolder+strTask3);      
  }
  else if(bPHOS) {
    gSystem->Load("libHLTbase");
    gSystem->Load("libAliHLTUtil");
    gSystem->Load("libAliHLTGlobal");
    TString strTask1("AliAnalysisTaskHLTCalo.cxx+");
    TString strTask2("AliAnalysisTaskHLTPHOS.cxx+");    
    gROOT->LoadMacro(taskFolder+strTask1); 
    gROOT->LoadMacro(taskFolder+strTask2);  
  }
  else if(bEMCAL) {
    gSystem->Load("libHLTbase");
    gSystem->Load("libAliHLTUtil");
    gSystem->Load("libAliHLTGlobal");
    TString strTask1("AliAnalysisTaskHLTCalo.cxx+");
    TString strTask2("AliAnalysisTaskHLTEMCAL.cxx+");    
    gROOT->LoadMacro(taskFolder+strTask1); 
    gROOT->LoadMacro(taskFolder+strTask2);  
  }
  if(bGLOBAL){
     TString strTask("AliAnalysisTaskHLT.cxx+");   
     gROOT->LoadMacro(taskFolder+strTask);
  }
  if(bD0){
    TString strTask("AliAnalysisTaskD0Trigger.cxx+");
    gROOT->LoadMacro(taskFolder+strTask);     
  }
  if(bCB){
    TString strTask("AliAnalysisTaskHLTCentralBarrel.cxx+");
    gROOT->LoadMacro(taskFolder+strTask);
  } 
 
  //-------------- define the tasks ------------//
  
  if(bPHOS){
     AliAnalysisTaskHLTPHOS *taskPHOS = new AliAnalysisTaskHLTPHOS("offhlt_comparison_PHOS");
     mgr->AddTask(taskPHOS);
     AliAnalysisDataContainer *coutputPHOS =  mgr->CreateContainer("phos_histograms",TList::Class(), AliAnalysisManager::kOutputContainer, "HLT-OFFLINE-PHOS-comparison.root");  
     mgr->ConnectInput(taskPHOS,0,mgr->GetCommonInputContainer());
     mgr->ConnectOutput(taskPHOS,1,coutputPHOS);
  }
  if(bEMCAL){
     AliAnalysisTaskHLTEMCAL *taskEMCAL = new AliAnalysisTaskHLTEMCAL("offhlt_comparison_EMCAL");
     mgr->AddTask(taskEMCAL);
     AliAnalysisDataContainer *coutputEMCAL =  mgr->CreateContainer("emcal_histograms",TList::Class(), AliAnalysisManager::kOutputContainer, "HLT-OFFLINE-EMCAL-comparison.root");  
     mgr->ConnectInput(taskEMCAL,0,mgr->GetCommonInputContainer());
     mgr->ConnectOutput(taskEMCAL,1,coutputEMCAL);
  }
  
  if(bGLOBAL){
     AliAnalysisTaskHLT *taskGLOBAL = new AliAnalysisTaskHLT("offhlt_comparison_GLOBAL");
     taskGLOBAL->SetUseHLTTriggerDecision(fUseHLTTrigger);
     if(fUseHLTTrigger==kTRUE) printf("\n\nOnly HLT triggered events will be used to fill the distributions for task %s.\n\n", taskGLOBAL->GetName());
     //taskGLOBAL->SelectCollisionCandidates();
     mgr->AddTask(taskGLOBAL);
     if(fUseHLTTrigger==kFALSE)
       AliAnalysisDataContainer *coutputGLOBAL =  mgr->CreateContainer("global_histograms",TList::Class(), AliAnalysisManager::kOutputContainer, "HLT-OFFLINE-GLOBAL-comparison.root");  
     else
       AliAnalysisDataContainer *coutputGLOBAL =  mgr->CreateContainer("global_histograms",TList::Class(), AliAnalysisManager::kOutputContainer, "HLT-OFFLINE-GLOBAL-comparison_triggered.root");  
     mgr->ConnectInput(taskGLOBAL,0,mgr->GetCommonInputContainer());
     mgr->ConnectOutput(taskGLOBAL,1,coutputGLOBAL);
  }
  if(bD0){
    float cuts[7]={0.5,0.04,0.7,0.8,0.05,-0.00025,0.7};
    AliAnalysisTaskD0Trigger *taskD0 = new AliAnalysisTaskD0Trigger("offhlt_comparison_D0_Trigger",cuts);
    mgr->AddTask(taskD0);
    AliAnalysisDataContainer *coutputD0 =  mgr->CreateContainer("D0_histograms",TList::Class(), AliAnalysisManager::kOutputContainer, "HLT-OFFLINE-D0-comparison.root");  
    mgr->ConnectInput(taskD0,0,mgr->GetCommonInputContainer());
    mgr->ConnectOutput(taskD0,1,coutputD0);
  }
  if(bCB){
     AliAnalysisTaskHLTCentralBarrel *taskCB = new AliAnalysisTaskHLTCentralBarrel("offhlt_comparison_CB");
     mgr->AddTask(taskCB);     
     taskCB->SetBeamType(beamType);
     if(beamType.Contains("Pb-Pb")){
        gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
        AliCentralitySelectionTask *taskCentrality = AddTaskCentrality();
	taskCentrality->SetPass(1); 
     }  
     taskCB->SetOptions(options); 
     AliAnalysisDataContainer *coutputCB =  mgr->CreateContainer("esd_thnsparse",TList::Class(), AliAnalysisManager::kOutputContainer, "HLT-OFFLINE-CentralBarrel-comparison.root");       
     mgr->ConnectInput(taskCB,0,mgr->GetCommonInputContainer());
     mgr->ConnectOutput(taskCB,1,coutputCB);
  }
  // Enable debug printouts
  mgr->SetDebugLevel(2);

  if (!mgr->InitAnalysis()) return;
  mgr->PrintStatus();
  mgr->StartAnalysis("grid", nEvents);

  timer.Stop();
  timer.Print();
}

void compare_HLT_offline_grid(){
  cout << " " << endl;
  cout << " Usage examples:" << endl;
  cout << "    compare-HLT-offline-grid.C'(runNumber, dataDir, gridWorkingDir, gridOutputDir, mode, taskOption, taskFolder, beamType, THnSparse_names, fUseHLTTrigger)'" << endl;
  cout << "    compare-HLT-offline-grid.C'(\"000115322\",\"/alice/data/2010/LHC10b\",\"ESDcomparison\",\"output\",\"full\",\"global\",\"./\",\"p-p\",\"event-off event-hlt track-off track-hlt\",kTRUE)'" << endl;
  cout << " " << endl;
}
 compare-HLT-offline-grid.C:1
 compare-HLT-offline-grid.C:2
 compare-HLT-offline-grid.C:3
 compare-HLT-offline-grid.C:4
 compare-HLT-offline-grid.C:5
 compare-HLT-offline-grid.C:6
 compare-HLT-offline-grid.C:7
 compare-HLT-offline-grid.C:8
 compare-HLT-offline-grid.C:9
 compare-HLT-offline-grid.C:10
 compare-HLT-offline-grid.C:11
 compare-HLT-offline-grid.C:12
 compare-HLT-offline-grid.C:13
 compare-HLT-offline-grid.C:14
 compare-HLT-offline-grid.C:15
 compare-HLT-offline-grid.C:16
 compare-HLT-offline-grid.C:17
 compare-HLT-offline-grid.C:18
 compare-HLT-offline-grid.C:19
 compare-HLT-offline-grid.C:20
 compare-HLT-offline-grid.C:21
 compare-HLT-offline-grid.C:22
 compare-HLT-offline-grid.C:23
 compare-HLT-offline-grid.C:24
 compare-HLT-offline-grid.C:25
 compare-HLT-offline-grid.C:26
 compare-HLT-offline-grid.C:27
 compare-HLT-offline-grid.C:28
 compare-HLT-offline-grid.C:29
 compare-HLT-offline-grid.C:30
 compare-HLT-offline-grid.C:31
 compare-HLT-offline-grid.C:32
 compare-HLT-offline-grid.C:33
 compare-HLT-offline-grid.C:34
 compare-HLT-offline-grid.C:35
 compare-HLT-offline-grid.C:36
 compare-HLT-offline-grid.C:37
 compare-HLT-offline-grid.C:38
 compare-HLT-offline-grid.C:39
 compare-HLT-offline-grid.C:40
 compare-HLT-offline-grid.C:41
 compare-HLT-offline-grid.C:42
 compare-HLT-offline-grid.C:43
 compare-HLT-offline-grid.C:44
 compare-HLT-offline-grid.C:45
 compare-HLT-offline-grid.C:46
 compare-HLT-offline-grid.C:47
 compare-HLT-offline-grid.C:48
 compare-HLT-offline-grid.C:49
 compare-HLT-offline-grid.C:50
 compare-HLT-offline-grid.C:51
 compare-HLT-offline-grid.C:52
 compare-HLT-offline-grid.C:53
 compare-HLT-offline-grid.C:54
 compare-HLT-offline-grid.C:55
 compare-HLT-offline-grid.C:56
 compare-HLT-offline-grid.C:57
 compare-HLT-offline-grid.C:58
 compare-HLT-offline-grid.C:59
 compare-HLT-offline-grid.C:60
 compare-HLT-offline-grid.C:61
 compare-HLT-offline-grid.C:62
 compare-HLT-offline-grid.C:63
 compare-HLT-offline-grid.C:64
 compare-HLT-offline-grid.C:65
 compare-HLT-offline-grid.C:66
 compare-HLT-offline-grid.C:67
 compare-HLT-offline-grid.C:68
 compare-HLT-offline-grid.C:69
 compare-HLT-offline-grid.C:70
 compare-HLT-offline-grid.C:71
 compare-HLT-offline-grid.C:72
 compare-HLT-offline-grid.C:73
 compare-HLT-offline-grid.C:74
 compare-HLT-offline-grid.C:75
 compare-HLT-offline-grid.C:76
 compare-HLT-offline-grid.C:77
 compare-HLT-offline-grid.C:78
 compare-HLT-offline-grid.C:79
 compare-HLT-offline-grid.C:80
 compare-HLT-offline-grid.C:81
 compare-HLT-offline-grid.C:82
 compare-HLT-offline-grid.C:83
 compare-HLT-offline-grid.C:84
 compare-HLT-offline-grid.C:85
 compare-HLT-offline-grid.C:86
 compare-HLT-offline-grid.C:87
 compare-HLT-offline-grid.C:88
 compare-HLT-offline-grid.C:89
 compare-HLT-offline-grid.C:90
 compare-HLT-offline-grid.C:91
 compare-HLT-offline-grid.C:92
 compare-HLT-offline-grid.C:93
 compare-HLT-offline-grid.C:94
 compare-HLT-offline-grid.C:95
 compare-HLT-offline-grid.C:96
 compare-HLT-offline-grid.C:97
 compare-HLT-offline-grid.C:98
 compare-HLT-offline-grid.C:99
 compare-HLT-offline-grid.C:100
 compare-HLT-offline-grid.C:101
 compare-HLT-offline-grid.C:102
 compare-HLT-offline-grid.C:103
 compare-HLT-offline-grid.C:104
 compare-HLT-offline-grid.C:105
 compare-HLT-offline-grid.C:106
 compare-HLT-offline-grid.C:107
 compare-HLT-offline-grid.C:108
 compare-HLT-offline-grid.C:109
 compare-HLT-offline-grid.C:110
 compare-HLT-offline-grid.C:111
 compare-HLT-offline-grid.C:112
 compare-HLT-offline-grid.C:113
 compare-HLT-offline-grid.C:114
 compare-HLT-offline-grid.C:115
 compare-HLT-offline-grid.C:116
 compare-HLT-offline-grid.C:117
 compare-HLT-offline-grid.C:118
 compare-HLT-offline-grid.C:119
 compare-HLT-offline-grid.C:120
 compare-HLT-offline-grid.C:121
 compare-HLT-offline-grid.C:122
 compare-HLT-offline-grid.C:123
 compare-HLT-offline-grid.C:124
 compare-HLT-offline-grid.C:125
 compare-HLT-offline-grid.C:126
 compare-HLT-offline-grid.C:127
 compare-HLT-offline-grid.C:128
 compare-HLT-offline-grid.C:129
 compare-HLT-offline-grid.C:130
 compare-HLT-offline-grid.C:131
 compare-HLT-offline-grid.C:132
 compare-HLT-offline-grid.C:133
 compare-HLT-offline-grid.C:134
 compare-HLT-offline-grid.C:135
 compare-HLT-offline-grid.C:136
 compare-HLT-offline-grid.C:137
 compare-HLT-offline-grid.C:138
 compare-HLT-offline-grid.C:139
 compare-HLT-offline-grid.C:140
 compare-HLT-offline-grid.C:141
 compare-HLT-offline-grid.C:142
 compare-HLT-offline-grid.C:143
 compare-HLT-offline-grid.C:144
 compare-HLT-offline-grid.C:145
 compare-HLT-offline-grid.C:146
 compare-HLT-offline-grid.C:147
 compare-HLT-offline-grid.C:148
 compare-HLT-offline-grid.C:149
 compare-HLT-offline-grid.C:150
 compare-HLT-offline-grid.C:151
 compare-HLT-offline-grid.C:152
 compare-HLT-offline-grid.C:153
 compare-HLT-offline-grid.C:154
 compare-HLT-offline-grid.C:155
 compare-HLT-offline-grid.C:156
 compare-HLT-offline-grid.C:157
 compare-HLT-offline-grid.C:158
 compare-HLT-offline-grid.C:159
 compare-HLT-offline-grid.C:160
 compare-HLT-offline-grid.C:161
 compare-HLT-offline-grid.C:162
 compare-HLT-offline-grid.C:163
 compare-HLT-offline-grid.C:164
 compare-HLT-offline-grid.C:165
 compare-HLT-offline-grid.C:166
 compare-HLT-offline-grid.C:167
 compare-HLT-offline-grid.C:168
 compare-HLT-offline-grid.C:169
 compare-HLT-offline-grid.C:170
 compare-HLT-offline-grid.C:171
 compare-HLT-offline-grid.C:172
 compare-HLT-offline-grid.C:173
 compare-HLT-offline-grid.C:174
 compare-HLT-offline-grid.C:175
 compare-HLT-offline-grid.C:176
 compare-HLT-offline-grid.C:177
 compare-HLT-offline-grid.C:178
 compare-HLT-offline-grid.C:179
 compare-HLT-offline-grid.C:180
 compare-HLT-offline-grid.C:181
 compare-HLT-offline-grid.C:182
 compare-HLT-offline-grid.C:183
 compare-HLT-offline-grid.C:184
 compare-HLT-offline-grid.C:185
 compare-HLT-offline-grid.C:186
 compare-HLT-offline-grid.C:187
 compare-HLT-offline-grid.C:188
 compare-HLT-offline-grid.C:189
 compare-HLT-offline-grid.C:190
 compare-HLT-offline-grid.C:191
 compare-HLT-offline-grid.C:192
 compare-HLT-offline-grid.C:193
 compare-HLT-offline-grid.C:194
 compare-HLT-offline-grid.C:195
 compare-HLT-offline-grid.C:196
 compare-HLT-offline-grid.C:197
 compare-HLT-offline-grid.C:198
 compare-HLT-offline-grid.C:199
 compare-HLT-offline-grid.C:200
 compare-HLT-offline-grid.C:201
 compare-HLT-offline-grid.C:202
 compare-HLT-offline-grid.C:203
 compare-HLT-offline-grid.C:204
 compare-HLT-offline-grid.C:205
 compare-HLT-offline-grid.C:206
 compare-HLT-offline-grid.C:207
 compare-HLT-offline-grid.C:208
 compare-HLT-offline-grid.C:209
 compare-HLT-offline-grid.C:210
 compare-HLT-offline-grid.C:211
 compare-HLT-offline-grid.C:212
 compare-HLT-offline-grid.C:213
 compare-HLT-offline-grid.C:214
 compare-HLT-offline-grid.C:215
 compare-HLT-offline-grid.C:216
 compare-HLT-offline-grid.C:217
 compare-HLT-offline-grid.C:218
 compare-HLT-offline-grid.C:219
 compare-HLT-offline-grid.C:220
 compare-HLT-offline-grid.C:221
 compare-HLT-offline-grid.C:222
 compare-HLT-offline-grid.C:223
 compare-HLT-offline-grid.C:224
 compare-HLT-offline-grid.C:225
 compare-HLT-offline-grid.C:226
 compare-HLT-offline-grid.C:227
 compare-HLT-offline-grid.C:228
 compare-HLT-offline-grid.C:229
 compare-HLT-offline-grid.C:230
 compare-HLT-offline-grid.C:231
 compare-HLT-offline-grid.C:232
 compare-HLT-offline-grid.C:233