ROOT logo

//--------------------------------------------------------------------------
// Example macro for running locally AliAnalysisTaskNorm task
//
//
//--------------------------------------------------------------------------

enum {kLocal, kInteractif_xml, kInteractif_ESDList};
Int_t GetMode(TString inputFileName);
TChain* CreateChainFromCollection(const char *xmlfile);
TChain* CreateChainFromAODFile(const char *rootfile,Bool_t isESD);
TChain* CreateChainFromESDList(const char *esdList);
TChain* CreateChain(TString inputFileName,Bool_t isESD);

void runNorm(TString inputFileName = "AliAOD.root", Int_t nEvents = 1e6, TString beamConf = "p-Pb", Bool_t isESD = kFALSE, Bool_t isMC = kFALSE, Int_t debugLevel = 0)
{

  TStopwatch timer;
  timer.Start();
  
  // Check runing mode
  Int_t mode = GetMode(inputFileName);
  if(mode < 0){
    Error("runAnalysis","Please provide either an ESD/AOD root file or a collection of ESDs/AODs.");
    return;
  }
  
  // Load common libraries
  gSystem->Load("libTree");
  gSystem->Load("libGeom");
  gSystem->Load("libVMC");
  gSystem->Load("libPhysics");
  gSystem->Load("libSTEERBase");
  //  gSystem->Load("libSTEER");
  gSystem->Load("libESD");
  gSystem->Load("libAOD");
  gSystem->Load("libANALYSIS");
  gSystem->Load("libANALYSISalice");
  gSystem->Load("libEventMixing");
  gSystem->Load("libCORRFW");
  gSystem->Load("libPWGmuon"); 
  gSystem->Load("libPWGmuondep"); 
  
  gSystem->AddIncludePath(Form("-I\"%s/include\"", gSystem->ExpandPathName("$ALICE_ROOT")));
  gROOT->ProcessLine(Form(".include %s/include", gSystem->ExpandPathName("$ALICE_ROOT")));

  // Create input chain
  TChain* chain = CreateChain(inputFileName,isESD);
  if (!chain) return;
  
  // Create the analysis manager
  AliAnalysisManager *mgr = new AliAnalysisManager("MuonTask");
  
  if ( isESD) {
    // ESD input handler
    AliESDInputHandler* esdH = new AliESDInputHandler();
    esdH->SetReadFriends(kFALSE);
    mgr->SetInputEventHandler(esdH);
  }
  else {
    // AOD input handler
    AliAODInputHandler* aodH = new AliAODInputHandler();
    mgr->SetInputEventHandler(aodH);
  }

  TString dataType = mgr->GetInputEventHandler()->GetDataType();
  Info("runLocal",Form("Manager with %s",dataType.Data()));

 // Enable MC event handler for ESDs
  if ( isMC && isESD ){
    AliVEventHandler* handler = new AliMCEventHandler;
    mgr->SetMCtruthEventHandler(handler);
  }
  
  // event selection and centrality framework
  if ( isESD ){
    gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
    AliPhysicsSelectionTask* physicsSelection = AddTaskPhysicsSelection(isMC);
    if ( !physicsSelection ) {
      Error("runLocal","AliPhysicsSelectionTask not created!");
      return;
    }
  }
  if ( isESD ){
    // event centrality
    gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
    AliCentralitySelectionTask *taskCentrality = AddTaskCentrality();
    if ( !taskCentrality ) {
      Error("runLocal on ESD","AliCentralitySelectionTask not created!");
      return;
    }
    if ( isMC ) taskCentrality->SetMCInput();     
    //taskCentrality->SetPass(1); // remember to set the pass you are processing!!!
  }
  /*else {
    //Only on full AOD it is possible to reprocess the centrality framework
    gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
    AliCentralitySelectionTask *taskCentrality = AddTaskCentrality(kTRUE,kTRUE);
    if ( !taskCentrality ) {
      Error("runLocal on AOD","AliCentralitySelectionTask not created!");
      return;
    }
    if ( isMC ) taskCentrality->SetMCInput();    
    }*/
  
  // Example analysis
  // Create task
  gROOT->LoadMacro("$ALICE_ROOT/PWG/muon/AddTaskNorm.C");
  AliAnalysisTaskNorm* task = AddTaskNorm(isESD,isMC,beamConf);
  if (!task) {
    Error("runAnalysis","AliAnalysisTaskNorm not created!");
    return;
  }
  task->SetDebugLevel(debugLevel);
  
  // Enable debug printouts
  mgr->SetDebugLevel(debugLevel);

  // start local analysis
  if (mgr->InitAnalysis()) {
    mgr->PrintStatus();
    if(debugLevel>=2) mgr->SetNSysInfo(100);
    mgr->StartAnalysis("local", chain, nEvents);
  }

  if(debugLevel>=2){
    mgr->ProfileTask("Task");
  }

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

//______________________________________________________________________________
Int_t GetMode(TString inputFileName)
{
  if ( inputFileName.EndsWith(".xml") ) return kInteractif_xml;
  else if ( inputFileName.EndsWith(".txt") ) return kInteractif_ESDList;
  else if ( inputFileName.EndsWith(".root") ) return kLocal;
  return -1;
}

//______________________________________________________________________________
TChain* CreateChainFromCollection(const char *xmlfile)
{
  // Create a chain from the collection of tags.
  TAlienCollection* coll = TAlienCollection::Open(xmlfile);
  if (!coll) {
    ::Error("CreateChainFromTags", "Cannot create an AliEn collection from %s", xmlfile);
    return NULL;
  }
  
  TGridResult* tagResult = coll->GetGridResult("",kFALSE,kFALSE);
  AliTagAnalysis *tagAna = new AliTagAnalysis("ESD");
  tagAna->ChainGridTags(tagResult);
  
  AliRunTagCuts      *runCuts = new AliRunTagCuts();
  AliLHCTagCuts      *lhcCuts = new AliLHCTagCuts();
  AliDetectorTagCuts *detCuts = new AliDetectorTagCuts();
  AliEventTagCuts    *evCuts  = new AliEventTagCuts();
  
  // Check if the cuts configuration file was provided
  if (!gSystem->AccessPathName("ConfigureCuts.C")) {
    gROOT->LoadMacro("ConfigureCuts.C");
    ConfigureCuts(runCuts, lhcCuts, detCuts, evCuts);
  }
  
  TChain *chain = tagAna->QueryTags(runCuts, lhcCuts, detCuts, evCuts);
  if (!chain || !chain->GetNtrees()) return NULL;
  chain->ls();
  return chain;
}

//______________________________________________________________________________
TChain* CreateChainFromAODFile(const char *rootfile, Bool_t isESD)
{
  // Create a chain using the root file.
  TChain* chain = 0;
  if ( !isESD) chain = new TChain("aodTree");
  else chain = new TChain("esdTree");
  chain->Add(rootfile);
  if (!chain->GetNtrees()) return NULL;
  chain->ls();
  return chain;
}

//______________________________________________________________________________
TChain* CreateChainFromESDList(const char *esdList)
{
  // Create a chain using tags from the run list.
  TChain* chain = new TChain("esdTree");
  ifstream inFile(esdList);
  TString inFileName;
  if (inFile.is_open()) {
    while (! inFile.eof() ) {
      inFileName.ReadLine(inFile,kFALSE);
      if(!inFileName.EndsWith(".root")) continue;
      chain->Add(inFileName.Data());
    }
  }
  inFile.close();
  if (!chain->GetNtrees()) return NULL;
  chain->ls();
  return chain;
}

//______________________________________________________________________________
TChain* CreateChain(TString inputFileName, Bool_t isESD)
{
  printf("*******************************\n");
  printf("*** Getting the Chain       ***\n");
  printf("*******************************\n");
  Int_t mode = GetMode(inputFileName);
  if(mode == kInteractif_xml) return CreateChainFromCollection(inputFileName.Data());
  else if (mode == kInteractif_ESDList) return CreateChainFromESDList(inputFileName.Data());
  else if (mode == kLocal) return CreateChainFromAODFile(inputFileName.Data(),isESD);
  else return NULL;
}

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