ROOT logo
//--------------------------------------------------------------------------
// Base macro for submitting muon QA analysis.
//
// In case it is not run with full aliroot, it needs the following libraries:
//  - libSTEERBase.so
//  - libESD.so
//  - libAOD.so
//  - libANALYSIS.so
//  - libANALYSISalice.so
//  - libCORRFW.so
//  - libPWGmuon.so
//
// The macro reads ESDs and store outputs in standard output file (AnalysisResults.root)
//
// Author: Philippe Pillot - SUBATECH Nantes
//--------------------------------------------------------------------------

enum {kLocal, kInteractif_xml, kInteractif_ESDList};

void RunMuonQA(TString inputFileName = "AliESDs.root", Bool_t isMC = kFALSE, 
	       Bool_t selectPhysics = kTRUE, Bool_t selectMatched = kTRUE, 
	       Bool_t applyAccCut = kTRUE, Bool_t selectTrigger = kFALSE,
	       UInt_t triggerMask = AliVEvent::kMUS7, Short_t selectCharge = 0)
{
  TStopwatch timer;
  timer.Start();
  
  // Check runing mode
  Int_t mode = GetMode(inputFileName);
  if(mode < 0){
    Error("RunMuonQA","Please provide either an ESD root file or a collection of ESDs.");
    return;
  }
  
  // Load common libraries
  gSystem->Load("libVMC");
  gSystem->Load("libTree.so");
  gSystem->Load("libPhysics.so");
  gSystem->Load("libMinuit.so");
  gSystem->Load("libXMLParser.so");
  gSystem->Load("libGui.so");
  gSystem->Load("libSTEERBase");
  gSystem->Load("libESD");
  gSystem->Load("libAOD");
  gSystem->Load("libANALYSIS");
  gSystem->Load("libANALYSISalice");
  gSystem->Load("libCORRFW");
  gSystem->Load("libPWGmuon");
  gSystem->Load("libPWGPPMUONlite");
  
  // Create input chain
  TChain* chain = CreateChain(inputFileName);
  if (!chain) return;
  
  // Create the analysis manager
  AliAnalysisManager *mgr = new AliAnalysisManager("MuonQAAnalysis");
  
  // ESD input handler
  AliESDInputHandler* esdH = new AliESDInputHandler();
  esdH->SetReadFriends(kFALSE);
  mgr->SetInputEventHandler(esdH);
  
  // event selection
  gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
  AliPhysicsSelectionTask* physicsSelection = AddTaskPhysicsSelection(isMC);
  if(!physicsSelection) {
    Error("RunMuonQA","AliPhysicsSelectionTask not created!");
    return;
  }
  
  // Muon QA analysis
  gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskMuonQA.C");
  AliAnalysisTaskMuonQA* muonQA = AddTaskMuonQA(selectPhysics, selectMatched, applyAccCut, selectTrigger, triggerMask, selectCharge);
  if(!muonQA) {
    Error("RunMuonQA","AliAnalysisTaskMuonQA not created!");
    return;
  }
  
  // Enable debug printouts
  //mgr->SetDebugLevel(2);
  
  // start local analysis
  if (mgr->InitAnalysis()) {
    mgr->PrintStatus();
    mgr->StartAnalysis("local", chain);
  }
  
  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* CreateChainFromFile(const char *rootfile)
{
  // Create a chain using the root file.
  TChain* 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)
{
  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 CreateChainFromFile(inputFileName.Data());
  else return NULL;
}

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