ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__)
// ROOT includes
#include "TFile.h"
#include "TGrid.h"
#include "TString.h"
#include "TObjArray.h"
#include "TObjString.h"
#include "TSystem.h"
#include "TROOT.h"

// Aliroot includes
#include "AliAnalysisManager.h"
#include "AliAnalysisAlien.h"
#include "AliESDInputHandler.h"

#define COMPILEMACRO

#endif


//_____________________________________________________________________________
Int_t GetRunNumber(TString filePath)
{
  TObjArray* array = filePath.Tokenize("/");
  array->SetOwner();
  TString auxString = "";
  Int_t runNum = -1;
  for ( Int_t ientry=0; ientry<array->GetEntries(); ientry++ ) {
    auxString = array->At(ientry)->GetName();
    if ( auxString.Length() == 9 && auxString.IsDigit() ) {
      runNum = auxString.Atoi();
      break;
    }
  }
  delete array;

  if ( runNum < 0 ) {
    array = auxString.Tokenize("_");
    array->SetOwner();
    auxString = array->Last()->GetName();
    auxString.ReplaceAll(".root","");
    if ( auxString.IsDigit() )
      runNum = auxString.Atoi();
    delete array;
  }

  return runNum;
}

//_____________________________________________________________________________
void CopyFile(TString inFilename, TString baseOutDir=".", Bool_t makeRunDir=kTRUE, TString changeFilename="")
{
  if ( inFilename.Contains("alien://") && ! gGrid )
    TGrid::Connect("alien://");

  TObjArray* array = inFilename.Tokenize("/");
  array->SetOwner();
  TString outFilename = changeFilename.IsNull() ? array->Last()->GetName() : changeFilename.Data();
  delete array;

  if ( makeRunDir ) {
    Int_t runNumber = GetRunNumber(inFilename);
    if ( runNumber >= 0 ) {
      baseOutDir = Form("%s/%i", baseOutDir.Data(), runNumber);
      if ( gSystem->AccessPathName(baseOutDir.Data()) )
        gSystem->mkdir(baseOutDir.Data());
    }
    else printf("Warning: run number not found!\n");
  }
  //outFilename.ReplaceAll(".root", Form("_%i.root", runNumber));
  outFilename.Prepend(Form("%s/", baseOutDir.Data()));
  Bool_t showProgressBar = ! gROOT->IsBatch();
  TFile::Cp(inFilename.Data(), outFilename.Data(), showProgressBar);
  printf("outDir: %s\n", baseOutDir.Data());
  printf("outFile: %s\n", outFilename.Data());
}



//_____________________________________________________________________________
AliAnalysisAlien* CreateAlienHandler()
{
  AliAnalysisAlien *plugin = new AliAnalysisAlien();
  
  // Set the run mode
  plugin->SetRunMode("terminate");

  // Declare all libraries
  plugin->SetAdditionalLibs("libCORRFW.so libPWGHFbase.so libPWGmuon.so libPWGPPMUONlite.so");

  plugin->SetAdditionalRootLibs("libXMLParser.so libGui.so libProofPlayer.so");

  plugin->AddIncludePath("-I.");
  plugin->AddIncludePath("-I$ALICE_ROOT/PWGPP/MUON/lite");
  
  return plugin;
}


//_____________________________________________________________________________
void terminateQA(TString outfilename = "QAresults.root", Bool_t force = kFALSE, Bool_t runTrig = kFALSE )
{
  //
  // Load common libraries
  //
  gSystem->Load("libTree");
  gSystem->Load("libGeom");
  gSystem->Load("libVMC");
  gSystem->Load("libPhysics");
  gSystem->Load("libProof");

  TString libsList = "libANALYSIS.so libOADB.so libANALYSISalice.so libCORRFW.so libPWGHFbase.so libPWGmuon.so libPWGPPMUONlite.so";

  TObjArray* libsArray = libsList.Tokenize(" ");
  libsArray->SetOwner();
  TString currLib = "";
  for ( Int_t ilib=0; ilib<libsArray->GetEntries(); ilib++ ) {
    currLib = libsArray->At(ilib)->GetName();
    gSystem->Load(currLib.Data());
  }

  AliAnalysisAlien* alienHandler = CreateAlienHandler();

  AliAnalysisManager* mgr = new AliAnalysisManager("testAnalysis");
  mgr->SetCommonFileName(outfilename.Data());
  mgr->SetGridHandler(alienHandler);

  // Needed to the manager (but not used in terminate mode)
  AliESDInputHandler* esdH = new AliESDInputHandler();
  esdH->SetReadFriends(kFALSE);
  mgr->SetInputEventHandler(esdH); 

#ifndef COMPILEMACRO

  if ( runTrig ) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskMTRchamberEfficiency.C");
    AliAnalysisTaskTrigChEff* trigChEffTask = AddTaskMTRchamberEfficiency(kFALSE);
    trigChEffTask->SetTerminateOptions("PhysSelPass","ANY","-5_105","FORCEBATCH trigChEff_ANY_Apt_allTrig.root?PhysSelPass?ANY?-5_105?NoSelMatchAptFromTrg");
  }
  else {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskMuonQA.C");
    AliAnalysisTaskMuonQA* muonQATask = AddTaskMuonQA();
  }

#endif

  // Check if terminate was already performed
  if  ( ! force ) {
    TObject* paramContainer = mgr->GetParamOutputs()->At(0);
    if ( paramContainer ) {
      TFile* file = TFile::Open(outfilename);
      if ( file->FindObjectAny(paramContainer->GetName() ) ) {
        printf("\nTerminate was already executed!\n");
        printf("Nothing to be done\n");
        file->Close();
        return;
      }
      file->Close();
    }
  }


  if ( ! mgr->InitAnalysis()) {
    printf("Fatal: Cannot initialize analysis\n");
    return;
  }
  mgr->PrintStatus();
  mgr->StartAnalysis("grid terminate");
}
 terminateQA.C:1
 terminateQA.C:2
 terminateQA.C:3
 terminateQA.C:4
 terminateQA.C:5
 terminateQA.C:6
 terminateQA.C:7
 terminateQA.C:8
 terminateQA.C:9
 terminateQA.C:10
 terminateQA.C:11
 terminateQA.C:12
 terminateQA.C:13
 terminateQA.C:14
 terminateQA.C:15
 terminateQA.C:16
 terminateQA.C:17
 terminateQA.C:18
 terminateQA.C:19
 terminateQA.C:20
 terminateQA.C:21
 terminateQA.C:22
 terminateQA.C:23
 terminateQA.C:24
 terminateQA.C:25
 terminateQA.C:26
 terminateQA.C:27
 terminateQA.C:28
 terminateQA.C:29
 terminateQA.C:30
 terminateQA.C:31
 terminateQA.C:32
 terminateQA.C:33
 terminateQA.C:34
 terminateQA.C:35
 terminateQA.C:36
 terminateQA.C:37
 terminateQA.C:38
 terminateQA.C:39
 terminateQA.C:40
 terminateQA.C:41
 terminateQA.C:42
 terminateQA.C:43
 terminateQA.C:44
 terminateQA.C:45
 terminateQA.C:46
 terminateQA.C:47
 terminateQA.C:48
 terminateQA.C:49
 terminateQA.C:50
 terminateQA.C:51
 terminateQA.C:52
 terminateQA.C:53
 terminateQA.C:54
 terminateQA.C:55
 terminateQA.C:56
 terminateQA.C:57
 terminateQA.C:58
 terminateQA.C:59
 terminateQA.C:60
 terminateQA.C:61
 terminateQA.C:62
 terminateQA.C:63
 terminateQA.C:64
 terminateQA.C:65
 terminateQA.C:66
 terminateQA.C:67
 terminateQA.C:68
 terminateQA.C:69
 terminateQA.C:70
 terminateQA.C:71
 terminateQA.C:72
 terminateQA.C:73
 terminateQA.C:74
 terminateQA.C:75
 terminateQA.C:76
 terminateQA.C:77
 terminateQA.C:78
 terminateQA.C:79
 terminateQA.C:80
 terminateQA.C:81
 terminateQA.C:82
 terminateQA.C:83
 terminateQA.C:84
 terminateQA.C:85
 terminateQA.C:86
 terminateQA.C:87
 terminateQA.C:88
 terminateQA.C:89
 terminateQA.C:90
 terminateQA.C:91
 terminateQA.C:92
 terminateQA.C:93
 terminateQA.C:94
 terminateQA.C:95
 terminateQA.C:96
 terminateQA.C:97
 terminateQA.C:98
 terminateQA.C:99
 terminateQA.C:100
 terminateQA.C:101
 terminateQA.C:102
 terminateQA.C:103
 terminateQA.C:104
 terminateQA.C:105
 terminateQA.C:106
 terminateQA.C:107
 terminateQA.C:108
 terminateQA.C:109
 terminateQA.C:110
 terminateQA.C:111
 terminateQA.C:112
 terminateQA.C:113
 terminateQA.C:114
 terminateQA.C:115
 terminateQA.C:116
 terminateQA.C:117
 terminateQA.C:118
 terminateQA.C:119
 terminateQA.C:120
 terminateQA.C:121
 terminateQA.C:122
 terminateQA.C:123
 terminateQA.C:124
 terminateQA.C:125
 terminateQA.C:126
 terminateQA.C:127
 terminateQA.C:128
 terminateQA.C:129
 terminateQA.C:130
 terminateQA.C:131
 terminateQA.C:132
 terminateQA.C:133
 terminateQA.C:134
 terminateQA.C:135
 terminateQA.C:136
 terminateQA.C:137
 terminateQA.C:138
 terminateQA.C:139
 terminateQA.C:140
 terminateQA.C:141
 terminateQA.C:142
 terminateQA.C:143
 terminateQA.C:144
 terminateQA.C:145
 terminateQA.C:146
 terminateQA.C:147
 terminateQA.C:148
 terminateQA.C:149
 terminateQA.C:150
 terminateQA.C:151
 terminateQA.C:152
 terminateQA.C:153
 terminateQA.C:154
 terminateQA.C:155
 terminateQA.C:156
 terminateQA.C:157
 terminateQA.C:158
 terminateQA.C:159
 terminateQA.C:160
 terminateQA.C:161
 terminateQA.C:162
 terminateQA.C:163
 terminateQA.C:164
 terminateQA.C:165
 terminateQA.C:166
 terminateQA.C:167
 terminateQA.C:168
 terminateQA.C:169
 terminateQA.C:170