ROOT logo
enum analysisModes {mLocal,mLocalPAR,mPROOF,mGrid,mGridPAR};
enum analysisTypes {mESD,mAOD,mMC,mMCESD};

//
class AliAnalysisGrid;
class AliAnalysisTaskBF;
class AliBalance;

//________________________________________________________________________//
void runBalanceFunctionInpp(Int_t mode = mLocal, 
			    Int_t type = mAOD,
			    Bool_t DATA = kFALSE) {
  // Time:
  TStopwatch timer;
  timer.Start();
  
  //Check analysis mode
  if((mode < 0) || (mode > 4)) {
    Printf("Analysis mode not recognized!");
    Printf("You can select out of 0: local, 1: local with par files, 2: proof, 3: grid, 4: grid with par files");
    return;
  }
  
  //Check analysis type
  if((type < 0) || (type > 3)) {
    Printf("Analysis type not recognized!");
    Printf("You can select out of 0: ESD, 1: AOD, 2: MC (stack), 3: MC (from the ESD)");
    return;
  }
  
  // Load needed libraries:
  LoadLibraries(mode);
  
 // Create and configure the AliEn plug-in:
  if(mode == mGrid || mode == mGridPAR) {
    gROOT->LoadMacro("CreateAlienHandler.C");
    AliAnalysisGrid *alienHandler = CreateAlienHandler(runListFileName);  
    if (!alienHandler) return;
  }
  // Chains:   
  if(mode == mLocal || mode == mLocalPAR) {
    TChain* chain = 0x0;
    if((type == mESD)||(type == mMCESD))  
      chain = new TChain("esdTree");
    else if(type == mAOD)
      chain = new TChain("aodTree");
    else if(type == mMC)
      chain = new TChain("TE");

    TString filename;
    for(Int_t i = 1; i < 20; i++) {
      filename = "/data/alice2/pchrist/pp/LHC10c/0.9TeV/Data/";
      filename += "Set"; filename += i; 
      if((type == mESD)||(type == mMCESD))  
	filename += "/AliESDs.root";
      else if(type == mAOD)
	filename += "/AliAOD.root";
      else if(type == mMC)
     	filename += "/galice.root";

      chain->Add(filename.Data());
    }
  }
  //Proof
  if(mode == mPROOF) {
    gROOT->ProcessLine(Form(".include %s/include", gSystem->ExpandPathName("$ALICE_ROOT")));
  }
  
  // analysis manager
  AliAnalysisManager* mgr = new AliAnalysisManager("balanceFunctionManager");
  if(mode == mGrid || mode == mGridPAR)
    mgr->SetGridHandler(alienHandler);
    
  // input handler (ESD or AOD)
  AliVEventHandler* inputH = NULL;
  if((type == mESD)||(type == mMCESD))  
    inputH = new AliESDInputHandler();
  else if(type == mAOD)
    inputH = new AliAODInputHandler();
  mgr->SetInputEventHandler(inputH);
    
  // mc event handler
  if((type == mMC) || (type == mMCESD)) {
    AliMCEventHandler* mchandler = new AliMCEventHandler();
    // Not reading track references
    mchandler->SetReadTR(kFALSE);
    mgr->SetMCtruthEventHandler(mchandler);
  }   

  if(type != mAOD){
    gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
    AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection();
  }

  //Add the BF task (all centralities)
  gROOT->LoadMacro("AddTaskBalanceFunctionInpp.C"); 
  AddTaskBalanceFunctionInpp();

  // enable debug printouts
  mgr->SetDebugLevel(2);
  mgr->SetUseProgressBar(1,100);
  if (!mgr->InitAnalysis()) return;
  mgr->PrintStatus();
  
  // start analysis
  if(mode == mLocal || mode == mLocalPAR) 
    mgr->StartAnalysis("local",chain);
  else if(mode == mPROOF) 
    mgr->StartAnalysis("proof",dataDir,nRuns,offset);
  else if(mode == mGrid || mode == mGridPAR) 
    mgr->StartAnalysis("grid");

  // Print real and CPU time used for analysis:  
  timer.Stop();
  timer.Print();
}

//=============================================================//
void LoadLibraries(const analysisModes mode) {  
  //--------------------------------------
  // Load the needed libraries most of them already loaded by aliroot
  //--------------------------------------
  gSystem->Load("libCore.so");        
  gSystem->Load("libGeom.so");
  gSystem->Load("libVMC.so");
  gSystem->Load("libPhysics.so");
  gSystem->Load("libTree.so");

  //----------------------------------------------------------
  // >>>>>>>>>>> Local mode <<<<<<<<<<<<<< 
  //----------------------------------------------------------
  if (mode==mLocal || mode==mGrid || mode == mGridPAR) {
    //--------------------------------------------------------
    // If you want to use already compiled libraries 
    // in the aliroot distribution
    //--------------------------------------------------------
    gSystem->Load("libSTEERBase.so");
    gSystem->Load("libESD.so");
    gSystem->Load("libAOD.so");
    gSystem->Load("libANALYSIS.so");
    gSystem->Load("libANALYSISalice.so");
    gSystem->Load("libEventMixing.so");
    gSystem->Load("libPWGCFebye.so");
    // Use AliRoot includes to compile our task
    gROOT->ProcessLine(".include $ALICE_ROOT/include");
  }
  
  else if (mode == mLocalPAR) {
    //--------------------------------------------------------
    //If you want to use root and par files from aliroot
    //--------------------------------------------------------  
    SetupPar("STEERBase");
    SetupPar("ESD");
    SetupPar("AOD");
    SetupPar("ANALYSIS");
    SetupPar("ANALYSISalice");
    SetupPar("PWGCFebye");
}
  
  //---------------------------------------------------------
  // <<<<<<<<<< PROOF mode >>>>>>>>>>>>
  //---------------------------------------------------------
  else if (mode==mPROOF) {
    // Connect to proof
    printf("*** Connect to PROOF ***\n");
    gEnv->SetValue("XSec.GSI.DelegProxy","2");
    // Put appropriate username here
    TProof::Open("alice-caf.cern.ch");
    //TProof::Open("skaf.saske.sk");
    //TProof::Open("prf000-iep-grid.saske.sk");

    gProof->EnablePackage("VO_ALICE@AliRoot::v4-21-12-AN");
  }  
  
} // end of void LoadLibraries(const anaModes mode)

//======================================================================//
void SetupPar(char* pararchivename) {
  //Load par files, create analysis libraries
  //For testing, if par file already decompressed and modified
  //classes then do not decompress.
  
  TString cdir(Form("%s", gSystem->WorkingDirectory() )) ; 
  TString parpar(Form("%s.par", pararchivename)) ; 
  if ( gSystem->AccessPathName(parpar.Data()) ) {
    gSystem->ChangeDirectory(gSystem->Getenv("ALICE_ROOT")) ;
    TString processline(Form(".! make %s", parpar.Data())) ; 
    gROOT->ProcessLine(processline.Data()) ;
    gSystem->ChangeDirectory(cdir) ; 
    processline = Form(".! mv /tmp/%s .", parpar.Data()) ;
    gROOT->ProcessLine(processline.Data()) ;
  } 
  if ( gSystem->AccessPathName(pararchivename) ) {  
    TString processline = Form(".! tar xvzf %s",parpar.Data()) ;
    gROOT->ProcessLine(processline.Data());
  }
  
  TString ocwd = gSystem->WorkingDirectory();
  gSystem->ChangeDirectory(pararchivename);
  
  // check for BUILD.sh and execute
  if (!gSystem->AccessPathName("PROOF-INF/BUILD.sh")) {
    printf("*******************************\n");
    printf("*** Building PAR archive    ***\n");
    cout<<pararchivename<<endl;
    printf("*******************************\n");
    if (gSystem->Exec("PROOF-INF/BUILD.sh")) {
      Error("runProcess","Cannot Build the PAR Archive! - Abort!");
      return -1;
    }
  }
  // check for SETUP.C and execute
  if (!gSystem->AccessPathName("PROOF-INF/SETUP.C")) {
    printf("*******************************\n");
    printf("*** Setup PAR archive       ***\n");
    cout<<pararchivename<<endl;
    printf("*******************************\n");
    gROOT->Macro("PROOF-INF/SETUP.C");
  }
  
  gSystem->ChangeDirectory(ocwd.Data());
  printf("Current dir: %s\n", ocwd.Data());

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