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

//
class AliAnalysisGrid;
class AliAnalysisTaskBF;
class AliBalance;

//Centrality stuff
Int_t binfirst = 0;  //where do we start numbering bins
Int_t binlast = 8;  //where do we stop numbering bins
const Int_t numberOfCentralityBins = 9;
Float_t centralityArray[numberOfCentralityBins+1] = {0.,5.,10.,20.,30.,40.,50.,60.,70.,80.}; // in centrality percentile
Float_t impactParameterArray[numberOfCentralityBins+1] = {0.0,3.79,5.30,7.41,9.04,10.40,11.61,12.68,13.67,14.63}; // in fm (impact parametger taken from the MC header)

//Acceptance parameterization
Bool_t kUseAcceptance = kTRUE;
const char *acceptanceFilename = "efficiencyALICE.root";
TF1 *fParameterization[numberOfCentralityBins];

//Analyze a particle
Int_t gPdgCode = -1;

//________________________________________________________________________//
void runBalanceFunctionMC(Int_t mode = mLocal, 
			  Int_t type = mMC,
			  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 = "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)||(type == mMC))  
    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(mAOD){
    gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
    AliCentralitySelectionTask *taskCentrality = AddTaskCentrality();

    // Add physics selection task (NOT needed for AODs)
    gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
    AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection(DATA);
  }

  //Setup the parameterization
  if(kUseAcceptance) {
    TFile *gParamFile = TFile::Open(acceptanceFilename);
    if((!gParamFile) || (!gParamFile->IsOpen())) {
      Printf("File %s not found!!!",acceptanceFilename);
      return;
    }

    TString gParamName;
    for(Int_t iCentrality = 0; iCentrality < numberOfCentralityBins; iCentrality++) {
      gParamName = "gParamCentrality"; gParamName += iCentrality;
      fParameterization[iCentrality] = dynamic_cast<TF1 *>(gParamFile->Get(gParamName.Data()));
    }
  }

  //Add the BF task (all centralities)
  gROOT->LoadMacro("AddTaskBalanceMCCentralityTrain.C"); 
  for (Int_t i=binfirst; i<binlast+1; i++) {
    Float_t lowCentralityBinEdge = centralityArray[i];
    Float_t highCentralityBinEdge = centralityArray[i+1];
    Printf("\nWagon for centrality bin %i: %.0f-%.0f",i,lowCentralityBinEdge,highCentralityBinEdge);
    AddTaskBalanceMCCentralityTrain(lowCentralityBinEdge,
				    highCentralityBinEdge,
				    impactParameterArray[i],
				    impactParameterArray[i+1],
				    kTRUE,
				    10.,0.3,1.5,-0.8,0.8,
				    fParameterization[i],
				    gPdgCode);
  }

  // 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) 

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