ROOT logo
//--------------------------------------------------------------------------
// Base macro for submitting single muon analysis.
// 
// In case it is not run with full aliroot, it needs to have in the working directory:
//  - STEERBase.par
//  - ESD.par
//  - AOD.par
//  - ANALYSIS.par
//  - ANALYSISalice.par
//  - PWG3muon.par
//
// The inputPath is either:
//  - The directory containing the AOD file in local mode
//  - The xml file with the list AODs in the alien catalogue in grid mode
//  - The proof dataset in proof mode
// 
// The macro reads AODs and outputs file:
//  - outputDir/singleMuAnalysis.root
//--------------------------------------------------------------------------

enum analysisMode {kMlocal, kMgridInteractive, kMgridBatch, kMproof};
TString modeName[4] = {"local", "local", "grid", "proof"};

void RunSingleMuonAnalysisFromAOD(Int_t mode=kMlocal, Char_t *inputPath=".", Char_t *outputDir=".", Char_t *aodFilename = "AliAODs.root", Long64_t nRuns = -1, Long64_t offset = 0) {
  TStopwatch timer;
  timer.Start();

  // Check if user is running root or aliroot
  TString checkString = gSystem->Getenv("ALICE_ROOT");
  checkString.Append("/lib/tgt_linux/libSTEERBase.so");
  TString foundLib = gSystem->GetLibraries(checkString.Data());
  Bool_t isFullAliroot = (foundLib.Length()==0) ? kFALSE : kTRUE;

  // Load libraries
  gSystem->Load("libTree");
  gSystem->Load("libGeom");
  gSystem->Load("libVMC");

  if(mode==kMproof)
    TProof::Open("alicecaf.cern.ch");

  if(isFullAliroot){
    gSystem->Load("libANALYSIS");
    gSystem->Load("libANALYSISalice");
    gSystem->Load("libSTEERBase");
    gSystem->Load("libAOD");
    gSystem->Load("libESD");  
    gSystem->Load("${ALICE_ROOT}/lib/tgt_${ALICE_TARGET}/libPWGmuon.so");
  }
  else {
    const Int_t nNeededPar = 6;
    TString parList[nNeededPar] = {"STEERBase", "ESD", "AOD", "ANALYSIS", "ANALYSISalice", "PWG3muon"};
    if(mode==kMproof){
      gProof->UploadPackage("AF-v4-15");
      gProof->EnablePackage("AF-v4-15");
      if(!SetupPar("PWG3muon")) return;
    }
    else {
      for(Int_t ipar=0; ipar<nNeededPar; ipar++){
	if(!SetupPar(parList[ipar].Data())) return;
      }
    }
  }

  // Connect to alien
  //
  if(mode==kMgridInteractive || mode==kMgridBatch)
    TGrid::Connect("alien://"); 


  TString outFileName("singleMuAnalysis.root");
  outFileName.Prepend(Form("%s/",outputDir));  

  // Get the chain.
  TChain* chain = 0x0;
  if(mode!=kMproof) chain = CreateChain(mode, inputPath, aodFilename);

  //____________________________________________//
  // Make the analysis manager
  AliAnalysisManager *mgr = new AliAnalysisManager("TestManager");
  AliVEventHandler* aodH = new AliAODInputHandler;
  mgr->SetInputEventHandler(aodH);
  //____________________________________________//
  // Single muon task
  AliAnalysisTaskSingleMu *task1 = new AliAnalysisTaskSingleMu("SingleMu");
  mgr->AddTask(task1);
  // Create containers for input/output
  AliAnalysisDataContainer *cinput1 = mgr->GetCommonInputContainer();
  AliAnalysisDataContainer *coutput1 = mgr->CreateContainer("tree1", TTree::Class(),AliAnalysisManager::kOutputContainer,outFileName.Data());
  
  //____________________________________________//
  mgr->ConnectInput(task1,0,cinput1);
  mgr->ConnectOutput(task1,0,coutput1);
  if (!mgr->InitAnalysis()) return;
  mgr->PrintStatus();

  if(mode==kMproof)
    mgr->StartAnalysis(modeName[mode].Data(), inputPath, nRuns, offset);
  else 
    mgr->StartAnalysis(modeName[mode].Data(),chain);

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


//______________________________________________________________________________
Bool_t SetupPar(char* pararchivename)
{
  if (pararchivename) {
    FileStat_t fs;
    char pararchivenameFull[1024];
    sprintf(pararchivenameFull, "%s.par", pararchivename);
    if(gSystem->GetPathInfo(pararchivenameFull, fs)){
      Error("SetupPar", "PAR Archive %s not found!\nPlease either copy it in the current directory\nor run full aliroot", pararchivenameFull);
      return kFALSE;
    }
    char processline[1024];
    sprintf(processline,".! tar xvzf %s.par",pararchivename);
    gROOT->ProcessLine(processline);
    const char* ocwd = gSystem->WorkingDirectory();
    gSystem->ChangeDirectory(pararchivename);
    printf("Current directory = %s\n",gSystem->pwd());

    // check for BUILD.sh and execute
    if (!gSystem->AccessPathName("PROOF-INF/BUILD.sh")) {
      printf("*******************************\n");
      printf("*** Building PAR archive    ***\n");
      printf("*******************************\n");

      if (gSystem->Exec("PROOF-INF/BUILD.sh")) {
	Error("runProcess","Cannot Build the PAR Archive! - Abort!");
	return kFALSE;
      }
    }
    // check for SETUP.C and execute
    if (!gSystem->AccessPathName("PROOF-INF/SETUP.C")) {
      printf("*******************************\n");
      printf("*** Setup PAR archive       ***\n");
      printf("*******************************\n");
      gROOT->Macro("PROOF-INF/SETUP.C");
    }
	
    gSystem->ChangeDirectory("../");
    return kTRUE;
  }
  return kFALSE;
}


//______________________________________________________________________________
TChain* CreateChain(Int_t mode, Char_t* inputPath, Char_t* aodFilename = "AliAOD.root")
{
  printf("*******************************\n");
  printf("*** Getting the Chain       ***\n");
  printf("*******************************\n");
  TChain *chain = 0x0;
  if(mode==kMgridInteractive || mode==kMgridBatch){
    AliTagAnalysis *analysis = new AliTagAnalysis();
    chain = analysis->GetChainFromCollection(inputPath,"aodTree");
  }
  else{
    chain = new TChain("aodTree");
    TString inFileName(aodFilename);
    inFileName.Prepend(Form("%s/",inputPath));
    chain->Add(inFileName);
  }
  //if (chain) chain->ls();
  return chain;
}
 RunSingleMuonAnalysisFromAOD.C:1
 RunSingleMuonAnalysisFromAOD.C:2
 RunSingleMuonAnalysisFromAOD.C:3
 RunSingleMuonAnalysisFromAOD.C:4
 RunSingleMuonAnalysisFromAOD.C:5
 RunSingleMuonAnalysisFromAOD.C:6
 RunSingleMuonAnalysisFromAOD.C:7
 RunSingleMuonAnalysisFromAOD.C:8
 RunSingleMuonAnalysisFromAOD.C:9
 RunSingleMuonAnalysisFromAOD.C:10
 RunSingleMuonAnalysisFromAOD.C:11
 RunSingleMuonAnalysisFromAOD.C:12
 RunSingleMuonAnalysisFromAOD.C:13
 RunSingleMuonAnalysisFromAOD.C:14
 RunSingleMuonAnalysisFromAOD.C:15
 RunSingleMuonAnalysisFromAOD.C:16
 RunSingleMuonAnalysisFromAOD.C:17
 RunSingleMuonAnalysisFromAOD.C:18
 RunSingleMuonAnalysisFromAOD.C:19
 RunSingleMuonAnalysisFromAOD.C:20
 RunSingleMuonAnalysisFromAOD.C:21
 RunSingleMuonAnalysisFromAOD.C:22
 RunSingleMuonAnalysisFromAOD.C:23
 RunSingleMuonAnalysisFromAOD.C:24
 RunSingleMuonAnalysisFromAOD.C:25
 RunSingleMuonAnalysisFromAOD.C:26
 RunSingleMuonAnalysisFromAOD.C:27
 RunSingleMuonAnalysisFromAOD.C:28
 RunSingleMuonAnalysisFromAOD.C:29
 RunSingleMuonAnalysisFromAOD.C:30
 RunSingleMuonAnalysisFromAOD.C:31
 RunSingleMuonAnalysisFromAOD.C:32
 RunSingleMuonAnalysisFromAOD.C:33
 RunSingleMuonAnalysisFromAOD.C:34
 RunSingleMuonAnalysisFromAOD.C:35
 RunSingleMuonAnalysisFromAOD.C:36
 RunSingleMuonAnalysisFromAOD.C:37
 RunSingleMuonAnalysisFromAOD.C:38
 RunSingleMuonAnalysisFromAOD.C:39
 RunSingleMuonAnalysisFromAOD.C:40
 RunSingleMuonAnalysisFromAOD.C:41
 RunSingleMuonAnalysisFromAOD.C:42
 RunSingleMuonAnalysisFromAOD.C:43
 RunSingleMuonAnalysisFromAOD.C:44
 RunSingleMuonAnalysisFromAOD.C:45
 RunSingleMuonAnalysisFromAOD.C:46
 RunSingleMuonAnalysisFromAOD.C:47
 RunSingleMuonAnalysisFromAOD.C:48
 RunSingleMuonAnalysisFromAOD.C:49
 RunSingleMuonAnalysisFromAOD.C:50
 RunSingleMuonAnalysisFromAOD.C:51
 RunSingleMuonAnalysisFromAOD.C:52
 RunSingleMuonAnalysisFromAOD.C:53
 RunSingleMuonAnalysisFromAOD.C:54
 RunSingleMuonAnalysisFromAOD.C:55
 RunSingleMuonAnalysisFromAOD.C:56
 RunSingleMuonAnalysisFromAOD.C:57
 RunSingleMuonAnalysisFromAOD.C:58
 RunSingleMuonAnalysisFromAOD.C:59
 RunSingleMuonAnalysisFromAOD.C:60
 RunSingleMuonAnalysisFromAOD.C:61
 RunSingleMuonAnalysisFromAOD.C:62
 RunSingleMuonAnalysisFromAOD.C:63
 RunSingleMuonAnalysisFromAOD.C:64
 RunSingleMuonAnalysisFromAOD.C:65
 RunSingleMuonAnalysisFromAOD.C:66
 RunSingleMuonAnalysisFromAOD.C:67
 RunSingleMuonAnalysisFromAOD.C:68
 RunSingleMuonAnalysisFromAOD.C:69
 RunSingleMuonAnalysisFromAOD.C:70
 RunSingleMuonAnalysisFromAOD.C:71
 RunSingleMuonAnalysisFromAOD.C:72
 RunSingleMuonAnalysisFromAOD.C:73
 RunSingleMuonAnalysisFromAOD.C:74
 RunSingleMuonAnalysisFromAOD.C:75
 RunSingleMuonAnalysisFromAOD.C:76
 RunSingleMuonAnalysisFromAOD.C:77
 RunSingleMuonAnalysisFromAOD.C:78
 RunSingleMuonAnalysisFromAOD.C:79
 RunSingleMuonAnalysisFromAOD.C:80
 RunSingleMuonAnalysisFromAOD.C:81
 RunSingleMuonAnalysisFromAOD.C:82
 RunSingleMuonAnalysisFromAOD.C:83
 RunSingleMuonAnalysisFromAOD.C:84
 RunSingleMuonAnalysisFromAOD.C:85
 RunSingleMuonAnalysisFromAOD.C:86
 RunSingleMuonAnalysisFromAOD.C:87
 RunSingleMuonAnalysisFromAOD.C:88
 RunSingleMuonAnalysisFromAOD.C:89
 RunSingleMuonAnalysisFromAOD.C:90
 RunSingleMuonAnalysisFromAOD.C:91
 RunSingleMuonAnalysisFromAOD.C:92
 RunSingleMuonAnalysisFromAOD.C:93
 RunSingleMuonAnalysisFromAOD.C:94
 RunSingleMuonAnalysisFromAOD.C:95
 RunSingleMuonAnalysisFromAOD.C:96
 RunSingleMuonAnalysisFromAOD.C:97
 RunSingleMuonAnalysisFromAOD.C:98
 RunSingleMuonAnalysisFromAOD.C:99
 RunSingleMuonAnalysisFromAOD.C:100
 RunSingleMuonAnalysisFromAOD.C:101
 RunSingleMuonAnalysisFromAOD.C:102
 RunSingleMuonAnalysisFromAOD.C:103
 RunSingleMuonAnalysisFromAOD.C:104
 RunSingleMuonAnalysisFromAOD.C:105
 RunSingleMuonAnalysisFromAOD.C:106
 RunSingleMuonAnalysisFromAOD.C:107
 RunSingleMuonAnalysisFromAOD.C:108
 RunSingleMuonAnalysisFromAOD.C:109
 RunSingleMuonAnalysisFromAOD.C:110
 RunSingleMuonAnalysisFromAOD.C:111
 RunSingleMuonAnalysisFromAOD.C:112
 RunSingleMuonAnalysisFromAOD.C:113
 RunSingleMuonAnalysisFromAOD.C:114
 RunSingleMuonAnalysisFromAOD.C:115
 RunSingleMuonAnalysisFromAOD.C:116
 RunSingleMuonAnalysisFromAOD.C:117
 RunSingleMuonAnalysisFromAOD.C:118
 RunSingleMuonAnalysisFromAOD.C:119
 RunSingleMuonAnalysisFromAOD.C:120
 RunSingleMuonAnalysisFromAOD.C:121
 RunSingleMuonAnalysisFromAOD.C:122
 RunSingleMuonAnalysisFromAOD.C:123
 RunSingleMuonAnalysisFromAOD.C:124
 RunSingleMuonAnalysisFromAOD.C:125
 RunSingleMuonAnalysisFromAOD.C:126
 RunSingleMuonAnalysisFromAOD.C:127
 RunSingleMuonAnalysisFromAOD.C:128
 RunSingleMuonAnalysisFromAOD.C:129
 RunSingleMuonAnalysisFromAOD.C:130
 RunSingleMuonAnalysisFromAOD.C:131
 RunSingleMuonAnalysisFromAOD.C:132
 RunSingleMuonAnalysisFromAOD.C:133
 RunSingleMuonAnalysisFromAOD.C:134
 RunSingleMuonAnalysisFromAOD.C:135
 RunSingleMuonAnalysisFromAOD.C:136
 RunSingleMuonAnalysisFromAOD.C:137
 RunSingleMuonAnalysisFromAOD.C:138
 RunSingleMuonAnalysisFromAOD.C:139
 RunSingleMuonAnalysisFromAOD.C:140
 RunSingleMuonAnalysisFromAOD.C:141
 RunSingleMuonAnalysisFromAOD.C:142
 RunSingleMuonAnalysisFromAOD.C:143
 RunSingleMuonAnalysisFromAOD.C:144
 RunSingleMuonAnalysisFromAOD.C:145
 RunSingleMuonAnalysisFromAOD.C:146
 RunSingleMuonAnalysisFromAOD.C:147
 RunSingleMuonAnalysisFromAOD.C:148
 RunSingleMuonAnalysisFromAOD.C:149
 RunSingleMuonAnalysisFromAOD.C:150
 RunSingleMuonAnalysisFromAOD.C:151
 RunSingleMuonAnalysisFromAOD.C:152
 RunSingleMuonAnalysisFromAOD.C:153
 RunSingleMuonAnalysisFromAOD.C:154
 RunSingleMuonAnalysisFromAOD.C:155
 RunSingleMuonAnalysisFromAOD.C:156
 RunSingleMuonAnalysisFromAOD.C:157
 RunSingleMuonAnalysisFromAOD.C:158
 RunSingleMuonAnalysisFromAOD.C:159
 RunSingleMuonAnalysisFromAOD.C:160
 RunSingleMuonAnalysisFromAOD.C:161
 RunSingleMuonAnalysisFromAOD.C:162
 RunSingleMuonAnalysisFromAOD.C:163
 RunSingleMuonAnalysisFromAOD.C:164
 RunSingleMuonAnalysisFromAOD.C:165
 RunSingleMuonAnalysisFromAOD.C:166
 RunSingleMuonAnalysisFromAOD.C:167
 RunSingleMuonAnalysisFromAOD.C:168
 RunSingleMuonAnalysisFromAOD.C:169
 RunSingleMuonAnalysisFromAOD.C:170
 RunSingleMuonAnalysisFromAOD.C:171