ROOT logo
// QAtrain_duo - assumes having 2 sets of input data files using 2 suffixes:
//    AliESDs_barrel.root AliESDfriends_barrel.root ...  suffix = _barrel
//    AliESDs_outer.root AliESDfriends_outer.root ...    suffix = _outer
// HOW TO RUN (for run_no=158285):
// QA job: should call:
//    ln -fs AliESDs_barrel.root AliESDs.root
//    ln -fs AliESDfriends_barrel.root AliESDfriends.root
//    ... same for all specific reco files
//    aliroot -b -q QAtrain_duo.C\(\"_barrel\"\,158285\) producing:
//      -> EventStat_temp_barrel.root QAresults_barrel.root 400_400_0_350.stat
//
//    ln -fs AliESDs_outer.root AliESDs.root
//    ln -fs AliESDfriends_outer.root AliESDfriends.root
//    ... same for all specific reco files
//    aliroot QAtrain_duo.C\(\"_outer\"\,158285\) producing:
//      -> EventStat_temp_outer.root QAresults_outer.root 400_400_0_380.stat
//
// Each merging job:
// for stages i < 5
//    aliroot -b -q QAtrain_duo.C\(\"_barrel\"\,158285\,\"wn.xml\"\,i\)
//    aliroot -b -q QAtrain_duo.C\(\"_outer\"\,158285\,\"wn.xml\"\,i\)
//      -> same output files as the QA jobs (except .stat)
// for stage 5
//    aliroot -b -q QAtrain_duo.C\(\"_barrel\"\,158285\,\"Stage_5.xml\"\,5\)
//      -> event_stat_barrel.root trending_barrel.root 145230_145230_0_120345.stat
//    aliroot -b -q QAtrain_duo.C\(\"_outer\"\,158285\,\"Stage_5.xml\"\,5\)
//      -> event_stat_outer.root trending_outer.root 145230_145230_0_132897.stat
#include "Riostream.h"
void LoadLibraries();
void AddAnalysisTasks(const char *); 
void QAmerge(const char *,const char *, Int_t);

Int_t iCollisionType = 0; // 0=pp, 1=PbPb
// Trigger mask.

UInt_t kTriggerInt = AliVEvent::kAnyINT;
UInt_t kTriggerMuonBarrel = AliVEvent::kMUU7 | AliVEvent::kMuonUnlikeLowPt8 ;
UInt_t kTriggerEMC   = AliVEvent::kEMC7 | AliVEvent::kEMCEJE | AliVEvent::kEMCEGA;
UInt_t kTriggerHM   = AliVEvent::kHighMult;
// Main trigger mask used:
UInt_t kTriggerMask = kTriggerInt;

Int_t runNumbers[5] = {158626};

Bool_t doCDBconnect   = 1;
Bool_t doEventStat    = 1;
Bool_t doCentrality   = 1;
Bool_t doQAsym        = 1;
Bool_t doVZERO        = 1;   // there is a 2nd file
Bool_t doVZEROPbPb    = 1; 
Bool_t doVertex       = 1;
Bool_t doSPD          = 1;   // needs RP   
Bool_t doTPC          = 1;
Bool_t doHLT          = 1;
Bool_t doSDD          = 1;   // needs RP
Bool_t doSSDdEdx      = 1;

Bool_t doTRD          = 1;
Bool_t doITS          = 1;
Bool_t doITSsaTracks  = 1; 
Bool_t doITSalign     = 1;  
Bool_t doCALO         = 1;
Bool_t doMUONTrig     = 1;
Bool_t doImpParRes    = 1;
Bool_t doMUON         = 1;
Bool_t doTOF          = 1;
Bool_t doHMPID        = 1;
Bool_t doT0           = 1;
Bool_t doZDC          = 1;
Bool_t doPIDResponse  = 1;
Bool_t doPIDqa        = 1; //new
Bool_t doFMD          = 1; // new
Bool_t doPHOS         = 1; // new
Bool_t doPHOSTrig     = 1; // new
Bool_t doEMCAL        = 1;
Bool_t doFBFqa        = 1; // new - not ported yet to revision

               // Debug level
Int_t       debug_level        = 1;        // Debugging
Int_t       run_number = 0;

TString ocdbStorage("raw://");

void QAtrain_duo(const char *suffix="", Int_t run = 0, 
             const char *xmlfile   = "wn.xml",
             Int_t  stage          = 0, /*0 = QA train, 1...n - merging stage*/
             const char* ocdb      = "raw://" )
{
  run_number = run;
  ocdbStorage = ocdb;

  if (ocdbStorage.EqualTo("raw://") || ocdbStorage.Contains("alien://"))
  {
    TGrid::Connect("alien://");
    if (!gGrid || !gGrid->IsConnected()) {
      ::Error("QAtrain", "No grid connection");
      return;
    }   
  }
  TString ss(suffix);
  ss.ToLower();
  Bool_t ibarrel = (ss.Contains("barrel"))?kTRUE:kFALSE;

  // Set temporary merging directory to current one
  gSystem->Setenv("TMPDIR", gSystem->pwd());
  // Set temporary compilation directory to current one
  gSystem->SetBuildDir(gSystem->pwd(), kTRUE);
  // Load libraries
  LoadLibraries();
  printf("Include path: %s\n", gSystem->GetIncludePath());
  // Create manager
  AliAnalysisManager *mgr  = new AliAnalysisManager("PilotAnalysis", "Production train");
  mgr->SetRunFromPath(run_number);
  // Input handler
  AliESDInputHandlerRP *esdHandler = new AliESDInputHandlerRP();
  if (ibarrel) {
    esdHandler->SetReadFriends(kTRUE);
    esdHandler->SetActiveBranches("ESDfriend");
  }
  mgr->SetInputEventHandler(esdHandler);
  mgr->SetDebugLevel(debug_level);
  
  // AnalysisTasks
  AddAnalysisTasks(suffix);
  if (stage>0) {
    QAmerge(suffix, xmlfile, stage);
    return;
  }   
  // Input chain
  TChain *chain = new TChain("esdTree");
  chain->Add("AliESDs.root");
  TStopwatch timer;
  timer.Start();
  if (mgr->InitAnalysis()) {                                                                                                              
    mgr->PrintStatus(); 
    mgr->SetSkipTerminate(kTRUE);
//    mgr->SetNSysInfo(1);
    mgr->StartAnalysis("local", chain);
  }
  timer.Print();
}

void LoadLibraries()
{
  gSystem->SetIncludePath("-I. -I$ROOTSYS/include -I$ALICE_ROOT/include -I$ALICE_ROOT -I$ALICE_ROOT/ITS -I$ALICE_ROOT/TRD -I$ALICE_ROOT/PWGPP -I$ALICE_ROOT/PWGPP/TRD");
  gSystem->Load("libANALYSIS");
  gSystem->Load("libANALYSISalice");
  gSystem->Load("libCORRFW");
  gSystem->Load("libTENDER");
  gSystem->Load("libPWGPP.so");
  gSystem->Load("libAliHLTTrigger.so");

  if (doEMCAL || doPHOS || doCALO) {
     gSystem->Load("libEMCALUtils");
     gSystem->Load("libPHOSUtils");
     gSystem->Load("libPWGCaloTrackCorrBase");
     gSystem->Load("libPWGGACaloTrackCorrelations");
     gSystem->Load("libPWGGACaloTasks");
     gSystem->Load("libPWGGAPHOSTasks");
     gSystem->Load("libPWGGAEMCALTasks");
  }  
  if(doMUON || doMUONTrig) {
     gSystem->Load("libPWGmuon");
     gSystem->Load("libPWGPPMUONlite");
     gSystem->Load("libPWGmuondep");
  }
  if (doFMD) {
     gSystem->Load("libPWGLFforward2");
  }      
}

void AddAnalysisTasks(const char *suffix)
{
  TString ss(suffix);
  ss.ToLower();
  Bool_t ibarrel = (ss.Contains("barrel"))?kTRUE:kFALSE;
  Bool_t iall = ss.IsNull();
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  mgr->SetCommonFileName(Form("QAresults%s.root",suffix));
  // Statistics task
  mgr->AddStatisticsTask(kTriggerMask);
  //
  // CDB connection
  //
  if (doCDBconnect) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskCDBconnect.C");
    AliTaskCDBconnect *taskCDB = AddTaskCDBconnect();
    if (!taskCDB) return;
    AliCDBManager *cdb = AliCDBManager::Instance();
    cdb->SetDefaultStorage(ocdbStorage.Data());
    taskCDB->SetRunNumber(run_number);
  }    
  
  //
  // Event Statistics (Jan Fiete)
  //
  if (doEventStat) {
      gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPhysicsSelection.C");
      AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection(kFALSE /*MC*/);
      AliAnalysisDataContainer *cstatsout = (AliAnalysisDataContainer*)mgr->GetOutputs()->FindObject("cstatsout");
      cstatsout->SetFileName(Form("EventStat_temp%s.root", suffix));
  }
  
  //
  // Centrality (A. Toia)
  //
  if (doCentrality) {
     if (!iCollisionType) {
        printf("Disabling centrality task for p-p\n");
        doCentrality = kFALSE;
     } else {           
        gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskCentrality.C");
        AliCentralitySelectionTask *taskCentrality = AddTaskCentrality();
     }   
  }   
  
  // Vertexing (A. Dainese)
  // 
  if (doVertex && (ibarrel || iall)) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskVertexESD.C");
    AliAnalysisTaskVertexESD* taskvertexesd =  AddTaskVertexESD(kFALSE, kTriggerMask);
    taskvertexesd->SelectCollisionCandidates(kTriggerMask);
  }  

  // TPC QA (E. Sicking)
  //
  if (doQAsym && (ibarrel || iall)) {
  // offline trigger in AddTask
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskQAsym.C");
    AliAnalysisTaskSE * taskqasim = AddTaskQAsym(0, kTriggerMask, kTriggerHM, kTriggerEMC, kTriggerMuonBarrel);
  }  
  //
  // VZERO QA  (C. Cheshkov)
  //
  if (doVZERO && (ibarrel || iall)) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskVZEROQA.C");
    AliAnalysisTaskSE * taskv0qa = AddTaskVZEROQA(0);
//  taskv0qa->SelectCollisionCandidates();
  }
  if (doVZEROPbPb && iCollisionType==1) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/VZERO/AddTaskVZEROPbPb.C");
    AliAnaVZEROPbPb* taskV0PbPb = (AliAnaVZEROPbPb*)AddTaskVZEROPbPb(0);
//    taskV0PbPb->SetClassesNames("CTRUE-,C0HWU-,CPBI2WU_B1-,CPBI2_B1-,CPBI1WU-,CPBI1-,CVHNWU-,CVHN-,CVLNWU-,CVLN-");
//    taskV0PbPb->SetClassesNames("CTRUE-,C0HWU-,CPBI2WU,CPBI2,CPBI1WU-,CPBI1-,CVHNWU,CVHN,CVLNWU,CVLN");
//    taskV0PbPb->SetClassesNames("CTRUE-,C0HWU-,CPBI2WU-,CPBI2-,CPBI2WU_B1-,CPBI2_B1-,CPBI1WU-,CPBI1-,CVHNWU-,CVHN-,CVHN_R2-,CVHNWU_R2-,CVLNWU-,CVLN-,CVLN_B2-,CVLNWU_B2-");
//    taskV0PbPb->SetClassesNames("CTRUE-,C0HWU-,CPBI2WU-,CPBI2-,CPBI2WU_B1-,CPBI2_B1-,CPBI1WU-,CPBI1-,CVHNWU-,CVHN-,CVHN_R2-,CVHNWU_R2-,CVLNWU-,CVLN-,CVLN_R1-,CVLN_B2-,CVLNWU_R1-,CVLNWU_B2-");
    taskV0PbPb->SetClassesNames("CTRUE-,C0HWU-,CPBI2WU-,CPBI2-,CPBI2WU_B1-,CPBI2_B1-,CPBI1WU-,CPBI1-,CVHNWU-,CVHN-,CVHN_R2-,CVHNWU_R2-,CVLNWU-,CVLN-,CVLN_R1-,CVLN_B2-,CVLNWU_R1-,CVLNWU_B2-,CSEMI_R1-,CSEMIWU_R1-,CCENT_R2-,CCENTWU_R2-");
  }
  //
  // TPC (Jacek Otwinowski & Michael Knichel)
  //
  //
  // Optionally MC information can be used by setting the 1st argument to true
  // Optionally friends information can be switched off by setting the 2st argument 
  // to false
  // Optionally highMult axis can be used by setting the 3st argument to true (for PbPb)
  if (doTPC && (ibarrel || iall)) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
    AliPerformanceTask *tpcQA = 0;
    if (iCollisionType) {
       // High multiplicity Pb-Pb
       tpcQA = AddTaskPerformanceTPCdEdxQA(kFALSE, kTRUE, kTRUE);
    } else {
      // Low multiplicity (pp)
       tpcQA = AddTaskPerformanceTPCdEdxQA(kFALSE, kTRUE, kFALSE);
    }
    tpcQA->SelectCollisionCandidates(kTriggerMask);
  }  

  // HLT (Alberica Toia)
  if (doHLT && (ibarrel || iall)) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
    AliPerformanceTask *hltQA = AddTaskPerformanceTPCdEdxQA(kFALSE, kTRUE, kFALSE,0,kTRUE);
    hltQA->SelectCollisionCandidates(kTriggerMask);
  }  
  //
  // SPD (A. Mastroserio)
  //
  if (doSPD && (ibarrel || iall)) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskSPDQA.C");
    AliAnalysisTaskSPD* taskspdqa = (AliAnalysisTaskSPD*)AddTaskSPDQA();
    // Request from Annalisa
    if (iCollisionType) taskspdqa->SetHeavyIonMode();
    taskspdqa->SelectCollisionCandidates(kTriggerMask);
    taskspdqa->SetOCDBInfo(run_number, "raw://");
  }  
  //
  // SDD (F. Prino)
  //
  if (doSDD && (ibarrel || iall)) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddSDDPoints.C");
    AliAnalysisTaskSE* tasksdd = AddSDDPoints();
    tasksdd->SelectCollisionCandidates(kTriggerMask);
  }
  //
  // SSD dEdx (Marek Chojnacki)
  //
  if (doSSDdEdx && (ibarrel || iall)) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskdEdxSSDQA.C");
    AliAnalysisTaskSE* taskssddedx = AddTaskdEdxSSDQA();
    taskssddedx->SelectCollisionCandidates(kTriggerMask);
  }

  //
  // ITS
  //
  if (doITS && (ibarrel || iall)) {
  // hardcoded non-zero trigger mask
      gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskPerformanceITS.C");
      AliAnalysisTaskITSTrackingCheck *itsQA = 0;
      AliAnalysisTaskITSTrackingCheck *itsQACent0010 = 0;
      AliAnalysisTaskITSTrackingCheck *itsQACent3050 = 0;
      AliAnalysisTaskITSTrackingCheck *itsQACent6080 = 0;
      if(iCollisionType==0) {
        itsQA = AddTaskPerformanceITS(kFALSE);
      } else {
        itsQA = AddTaskPerformanceITS(kFALSE);
        itsQACent0010 = AddTaskPerformanceITS(kFALSE,kFALSE,kFALSE,3500,10000);
        itsQACent3050 = AddTaskPerformanceITS(kFALSE,kFALSE,kFALSE,590,1570);
        itsQACent6080 = AddTaskPerformanceITS(kFALSE,kFALSE,kFALSE,70,310);
      }
  }
  //
  // ITS saTracks, align (F.Prino)
  //
  if (doITSsaTracks && (ibarrel || iall)) {
  // offline trigger in AddTask
     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskITSsaTracks.C");
     AliAnalysisTaskITSsaTracks *itssaTracks = AddTaskITSsaTracks(kFALSE,kFALSE);
     itssaTracks->SelectCollisionCandidates(kTriggerMask);
  }   
  if (doITSalign && (ibarrel || iall)) {
  // no offline trigger selection
     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskITSAlign.C");
     AliAnalysisTaskITSAlignQA *itsAlign = AddTaskITSAlign(0,2012);
  }   
  //
  // TRD (Alex Bercuci, M. Fasel) 
  //
  if(doTRD && (ibarrel || iall)) {
  // no offline trigger selection
      gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTrainPerformanceTRD.C");
      // steer individual TRD tasks
      Bool_t 
      doCheckESD(kTRUE),  // AliTRDcheckESD
      doCheckDET(kTRUE),  // AliTRDcheckDET
      doEffic(kTRUE),     // AliTRDefficiency
      doResolution(kTRUE),// AliTRDresolution
      doCheckPID(kTRUE),  // AliTRDcheckPID
      doV0Monitor(kFALSE);// AliTRDv0Monitor
      AddTrainPerformanceTRD(Translate(doCheckESD, doCheckDET, doEffic, doResolution, doCheckPID, doV0Monitor));
  }

  //
  // ZDC (Chiara Oppedisano) 
  //
  if(doZDC && (ibarrel || iall)) {
  // hardcoded kMB trigger mask
     gROOT->LoadMacro("$ALICE_ROOT/PWGPP/ZDC/AddTaskZDCQA.C");
     AliAnalysisTaskSE *taskZDC = AddTaskZDCQA();
     taskZDC->SelectCollisionCandidates(kTriggerMask);
  }   
  //
  // Calorimetry (Gustavo Conesa)
  //

  if(doCALO) {
      gROOT->LoadMacro("$ALICE_ROOT/PWGGA/CaloTrackCorrelations/macros/QA/AddTaskCalorimeterQA.C");
      AliAnalysisTaskCaloTrackCorrelation *taskCaloQA = AddTaskCalorimeterQA("ESD", 2012, kFALSE, kFALSE);
      taskCaloQA->SetDebugLevel(0);
      // offline mask set in AddTask to kMB
      taskCaloQA->SelectCollisionCandidates(kTriggerMask);
      // Add a new calo task with EMC1 trigger only
      taskCaloQA = AddTaskCalorimeterQA("ESD", 2012, kFALSE, kFALSE, "", "EMC7");
      taskCaloQA->SetDebugLevel(0);
      taskCaloQA->SelectCollisionCandidates(kTriggerEMC);
  }

  //
  // Muon Trigger
  //
  
  if(doMUONTrig) {
  // no offline trigger selection
      gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskMTRchamberEfficiency.C");
      AliAnalysisTaskTrigChEff *taskMuonTrig = AddTaskMTRchamberEfficiency();
  }

  //
  // Impact parameter resolution (xianbao.yuan@pd.infn.it, andrea.dainese@pd.infn.it)
  //
  if (doImpParRes && (ibarrel || iall)) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskImpParRes.C");
    AliAnalysisTaskSE* taskimpparres=0;
    if(iCollisionType==0) {
       taskimpparres= AddTaskImpParRes();
    } else {
       taskimpparres= AddTaskImpParRes(kFALSE,-1,kFALSE,kFALSE);
    }
    taskimpparres->SelectCollisionCandidates(kTriggerMask);
  }  
  //
  // MUON QA (Philippe Pillot)
  //
  if (doMUON) {
  // trigger analysis internal
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/PilotTrain/AddTaskMuonQA.C");
    AliAnalysisTaskSE* taskmuonqa= AddTaskMuonQA();
  }  
  //
  // TOF (Francesca Bellini)
  //
  if (doTOF && (ibarrel || iall)) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/TOF/AddTaskTOFQA.C");
    AliAnalysisTaskTOFqa *tofQA = AddTaskTOFQA();
    tofQA->SelectCollisionCandidates(kTriggerMask);
  } 
   //
  // PIDResponse(JENS)
  //
  if (doPIDResponse && (ibarrel || iall)) {
    gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPIDResponse.C"); 
    AliAnalysisTaskPIDResponse *PIDResponse = AddTaskPIDResponse();
    PIDResponse->SelectCollisionCandidates(kTriggerMask);
  }  

  //
  // PIDqa(JENS)
  //
  if (doPIDqa && (ibarrel || iall)) {
    gROOT->LoadMacro("$ALICE_ROOT/ANALYSIS/macros/AddTaskPIDqa.C");
    AliAnalysisTaskPIDqa *PIDQA = AddTaskPIDqa();
    PIDQA->SelectCollisionCandidates(kTriggerMask);
  }  
 
  //
  // HMPID QA (Giacomo Volpe)
  //
  if (doHMPID && (ibarrel || iall)) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/HMPID/AddTaskHmpidQA.C");
    AliAnalysisTaskSE* taskhmpidqa= AddTaskHmpidQA(kFALSE);
      // offline mask set in AddTask to kMB
    taskhmpidqa->SelectCollisionCandidates(kTriggerMask);
  }      
  
  
  // T0 QA (Alla Mayevskaya)
  if (doT0 && (ibarrel || iall)) {
  // no offline trigger selection
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/T0/AddTaskT0QA.C");
    AliT0AnalysisTaskQA* taskt0qa= AddTaskT0QA();
    taskt0qa->SelectCollisionCandidates(kTriggerMask);
  }      
  // FMD QA (Christian Holm Christiansen)
  if (doFMD && (ibarrel || iall)) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGLF/FORWARD/analysis2/AddTaskForwardQA.C");
    // Parameters: usemc, usecentrality
    AliAnalysisTaskSE *forwardQA = (AliAnalysisTaskSE *)AddTaskForwardQA(kFALSE, kFALSE);
    // No offline trigger config. needed (see #84077)
  }
   //     
  // PHOS QA (Boris Polishchuk)
  //
  if (doPHOS) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGGA/PHOSTasks/CaloCellQA/macros/AddTaskCaloCellsQA.C");
    AliAnalysisTaskCaloCellsQA *taskPHOSCellQA1 = AddTaskCaloCellsQA(4, 1, NULL,"PHOSCellsQA_AnyInt"); 
    taskPHOSCellQA1->SelectCollisionCandidates(kTriggerMask);
    taskPHOSCellQA1->GetCaloCellsQA()->SetClusterEnergyCuts(0.3,0.3,1.0);
    AliAnalysisTaskCaloCellsQA *taskPHOSCellQA2 = AddTaskCaloCellsQA(4, 1, NULL,"PHOSCellsQA_PHI7"); 
    taskPHOSCellQA2->SelectCollisionCandidates(AliVEvent::kPHI7);
    taskPHOSCellQA2->GetCaloCellsQA()->SetClusterEnergyCuts(0.3,0.3,1.0);
    // Pi0 QA fo PbPb
    if (iCollisionType) {
      gROOT->LoadMacro("$ALICE_ROOT/PWGGA/PHOSTasks/PHOS_PbPbQA/macros/AddTaskPHOSPbPb.C");
      AliAnalysisTaskPHOSPbPbQA* phosPbPb = AddTaskPHOSPbPbQA(0);
    }
  }    
  if (doPHOSTrig) {
     gROOT->LoadMacro("$ALICE_ROOT/PWGGA/PHOSTasks/PHOS_TriggerQA/macros/AddTaskPHOSTriggerQA.C");
     AliAnalysisTaskPHOSTriggerQA *taskPHOSTrig = AddTaskPHOSTriggerQA(NULL);
  }
  //
  // EMCAL QA (Gustavo Conesa)
  //
  if (doEMCAL) {
     gROOT->LoadMacro("$ALICE_ROOT/PWGGA/EMCALTasks/macros/AddTaskEMCALTriggerQA.C");
     AliAnalysisTaskEMCALTriggerQA *emctrig = AddTaskEMCALTriggerQA();
//     emctrig->GetRecoUtils()->SwitchOffBadChannelsRemoval();
  }   
  //     
  // FLOW and BF QA (C.Perez && A.Rodriguez)
  //
  if (doFBFqa && (ibarrel || iall)) {
    gROOT->LoadMacro("$ALICE_ROOT/PWGPP/macros/AddTaskFBFqa.C");
    AliAnalysisTaskSE *qaFBFMB = (AliAnalysisTaskSE*) AddTaskFBFqa("qaFBFmb",kFALSE);
    qaFBFMB->SelectCollisionCandidates(AliVEvent::kMB);
    AliAnalysisTaskSE *qaFBFSC = (AliAnalysisTaskSE*) AddTaskFBFqa("qaFBFsc",kFALSE);
    qaFBFSC->SelectCollisionCandidates(AliVEvent::kSemiCentral);
    AliAnalysisTaskSE *qaFBFCE = (AliAnalysisTaskSE*) AddTaskFBFqa("qaFBFce",kFALSE);
    qaFBFCE->SelectCollisionCandidates(AliVEvent::kCentral);
  }
}

void QAmerge(const char *suffix, const char *dir, Int_t stage)
{
// Merging method
  TStopwatch timer;
  timer.Start();
  TString outputDir = dir;
  TString outputFiles = Form("QAresults%s.root,EventStat_temp%s.root,RecoQAresults%s.root",suffix,suffix,suffix);
  TString mergeExcludes = "";
  TObjArray *list = outputFiles.Tokenize(",");
  TIter *iter = new TIter(list);
  TObjString *str;
  TString outputFile;
  Bool_t merged = kTRUE;
  while((str=(TObjString*)iter->Next())) {
    outputFile = str->GetString();
    // Skip already merged outputs
    if (!gSystem->AccessPathName(outputFile)) {
       printf("Output file <%s> found. Not merging again.",outputFile.Data());
       continue;
    }
    if (mergeExcludes.Contains(outputFile.Data())) continue;
    merged = AliAnalysisAlien::MergeOutput(outputFile, outputDir, 10, stage);
    if (!merged && !outputFile.Contains("RecoQAresults")) {
       printf("ERROR: Cannot merge %s\n", outputFile.Data());
       return;
    }
  }
  // read the analysis manager from file
  if (!outputDir.Contains("Stage")) {
    ofstream out;
    out.open("outputs_valid", ios::out);
    out.close();    
    return;
  }
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  mgr->SetRunFromPath(mgr->GetRunFromAlienPath(dir));
  mgr->SetSkipTerminate(kFALSE);
  if (!mgr->InitAnalysis()) return;
  mgr->PrintStatus();
  AliLog::SetGlobalLogLevel(AliLog::kError);
  TTree *tree = NULL;
  gROOT->cd();
  mgr->StartAnalysis("gridterminate", tree);
  if (strlen(suffix)) {
     if (gSystem->Exec(Form("mv trending.root trending%s.root", suffix)))
        ::Error("QAmerge", "File trending.root was not produced");
     if (gSystem->Exec(Form("mv event_stat.root event_stat%s.root", suffix)))
        ::Error("QAmerge", "File trending.root was not produced");
  }   
  ofstream out;
  out.open("outputs_valid", ios::out);
  out.close();
  timer.Print();
}
 QAtrain_duo.C:1
 QAtrain_duo.C:2
 QAtrain_duo.C:3
 QAtrain_duo.C:4
 QAtrain_duo.C:5
 QAtrain_duo.C:6
 QAtrain_duo.C:7
 QAtrain_duo.C:8
 QAtrain_duo.C:9
 QAtrain_duo.C:10
 QAtrain_duo.C:11
 QAtrain_duo.C:12
 QAtrain_duo.C:13
 QAtrain_duo.C:14
 QAtrain_duo.C:15
 QAtrain_duo.C:16
 QAtrain_duo.C:17
 QAtrain_duo.C:18
 QAtrain_duo.C:19
 QAtrain_duo.C:20
 QAtrain_duo.C:21
 QAtrain_duo.C:22
 QAtrain_duo.C:23
 QAtrain_duo.C:24
 QAtrain_duo.C:25
 QAtrain_duo.C:26
 QAtrain_duo.C:27
 QAtrain_duo.C:28
 QAtrain_duo.C:29
 QAtrain_duo.C:30
 QAtrain_duo.C:31
 QAtrain_duo.C:32
 QAtrain_duo.C:33
 QAtrain_duo.C:34
 QAtrain_duo.C:35
 QAtrain_duo.C:36
 QAtrain_duo.C:37
 QAtrain_duo.C:38
 QAtrain_duo.C:39
 QAtrain_duo.C:40
 QAtrain_duo.C:41
 QAtrain_duo.C:42
 QAtrain_duo.C:43
 QAtrain_duo.C:44
 QAtrain_duo.C:45
 QAtrain_duo.C:46
 QAtrain_duo.C:47
 QAtrain_duo.C:48
 QAtrain_duo.C:49
 QAtrain_duo.C:50
 QAtrain_duo.C:51
 QAtrain_duo.C:52
 QAtrain_duo.C:53
 QAtrain_duo.C:54
 QAtrain_duo.C:55
 QAtrain_duo.C:56
 QAtrain_duo.C:57
 QAtrain_duo.C:58
 QAtrain_duo.C:59
 QAtrain_duo.C:60
 QAtrain_duo.C:61
 QAtrain_duo.C:62
 QAtrain_duo.C:63
 QAtrain_duo.C:64
 QAtrain_duo.C:65
 QAtrain_duo.C:66
 QAtrain_duo.C:67
 QAtrain_duo.C:68
 QAtrain_duo.C:69
 QAtrain_duo.C:70
 QAtrain_duo.C:71
 QAtrain_duo.C:72
 QAtrain_duo.C:73
 QAtrain_duo.C:74
 QAtrain_duo.C:75
 QAtrain_duo.C:76
 QAtrain_duo.C:77
 QAtrain_duo.C:78
 QAtrain_duo.C:79
 QAtrain_duo.C:80
 QAtrain_duo.C:81
 QAtrain_duo.C:82
 QAtrain_duo.C:83
 QAtrain_duo.C:84
 QAtrain_duo.C:85
 QAtrain_duo.C:86
 QAtrain_duo.C:87
 QAtrain_duo.C:88
 QAtrain_duo.C:89
 QAtrain_duo.C:90
 QAtrain_duo.C:91
 QAtrain_duo.C:92
 QAtrain_duo.C:93
 QAtrain_duo.C:94
 QAtrain_duo.C:95
 QAtrain_duo.C:96
 QAtrain_duo.C:97
 QAtrain_duo.C:98
 QAtrain_duo.C:99
 QAtrain_duo.C:100
 QAtrain_duo.C:101
 QAtrain_duo.C:102
 QAtrain_duo.C:103
 QAtrain_duo.C:104
 QAtrain_duo.C:105
 QAtrain_duo.C:106
 QAtrain_duo.C:107
 QAtrain_duo.C:108
 QAtrain_duo.C:109
 QAtrain_duo.C:110
 QAtrain_duo.C:111
 QAtrain_duo.C:112
 QAtrain_duo.C:113
 QAtrain_duo.C:114
 QAtrain_duo.C:115
 QAtrain_duo.C:116
 QAtrain_duo.C:117
 QAtrain_duo.C:118
 QAtrain_duo.C:119
 QAtrain_duo.C:120
 QAtrain_duo.C:121
 QAtrain_duo.C:122
 QAtrain_duo.C:123
 QAtrain_duo.C:124
 QAtrain_duo.C:125
 QAtrain_duo.C:126
 QAtrain_duo.C:127
 QAtrain_duo.C:128
 QAtrain_duo.C:129
 QAtrain_duo.C:130
 QAtrain_duo.C:131
 QAtrain_duo.C:132
 QAtrain_duo.C:133
 QAtrain_duo.C:134
 QAtrain_duo.C:135
 QAtrain_duo.C:136
 QAtrain_duo.C:137
 QAtrain_duo.C:138
 QAtrain_duo.C:139
 QAtrain_duo.C:140
 QAtrain_duo.C:141
 QAtrain_duo.C:142
 QAtrain_duo.C:143
 QAtrain_duo.C:144
 QAtrain_duo.C:145
 QAtrain_duo.C:146
 QAtrain_duo.C:147
 QAtrain_duo.C:148
 QAtrain_duo.C:149
 QAtrain_duo.C:150
 QAtrain_duo.C:151
 QAtrain_duo.C:152
 QAtrain_duo.C:153
 QAtrain_duo.C:154
 QAtrain_duo.C:155
 QAtrain_duo.C:156
 QAtrain_duo.C:157
 QAtrain_duo.C:158
 QAtrain_duo.C:159
 QAtrain_duo.C:160
 QAtrain_duo.C:161
 QAtrain_duo.C:162
 QAtrain_duo.C:163
 QAtrain_duo.C:164
 QAtrain_duo.C:165
 QAtrain_duo.C:166
 QAtrain_duo.C:167
 QAtrain_duo.C:168
 QAtrain_duo.C:169
 QAtrain_duo.C:170
 QAtrain_duo.C:171
 QAtrain_duo.C:172
 QAtrain_duo.C:173
 QAtrain_duo.C:174
 QAtrain_duo.C:175
 QAtrain_duo.C:176
 QAtrain_duo.C:177
 QAtrain_duo.C:178
 QAtrain_duo.C:179
 QAtrain_duo.C:180
 QAtrain_duo.C:181
 QAtrain_duo.C:182
 QAtrain_duo.C:183
 QAtrain_duo.C:184
 QAtrain_duo.C:185
 QAtrain_duo.C:186
 QAtrain_duo.C:187
 QAtrain_duo.C:188
 QAtrain_duo.C:189
 QAtrain_duo.C:190
 QAtrain_duo.C:191
 QAtrain_duo.C:192
 QAtrain_duo.C:193
 QAtrain_duo.C:194
 QAtrain_duo.C:195
 QAtrain_duo.C:196
 QAtrain_duo.C:197
 QAtrain_duo.C:198
 QAtrain_duo.C:199
 QAtrain_duo.C:200
 QAtrain_duo.C:201
 QAtrain_duo.C:202
 QAtrain_duo.C:203
 QAtrain_duo.C:204
 QAtrain_duo.C:205
 QAtrain_duo.C:206
 QAtrain_duo.C:207
 QAtrain_duo.C:208
 QAtrain_duo.C:209
 QAtrain_duo.C:210
 QAtrain_duo.C:211
 QAtrain_duo.C:212
 QAtrain_duo.C:213
 QAtrain_duo.C:214
 QAtrain_duo.C:215
 QAtrain_duo.C:216
 QAtrain_duo.C:217
 QAtrain_duo.C:218
 QAtrain_duo.C:219
 QAtrain_duo.C:220
 QAtrain_duo.C:221
 QAtrain_duo.C:222
 QAtrain_duo.C:223
 QAtrain_duo.C:224
 QAtrain_duo.C:225
 QAtrain_duo.C:226
 QAtrain_duo.C:227
 QAtrain_duo.C:228
 QAtrain_duo.C:229
 QAtrain_duo.C:230
 QAtrain_duo.C:231
 QAtrain_duo.C:232
 QAtrain_duo.C:233
 QAtrain_duo.C:234
 QAtrain_duo.C:235
 QAtrain_duo.C:236
 QAtrain_duo.C:237
 QAtrain_duo.C:238
 QAtrain_duo.C:239
 QAtrain_duo.C:240
 QAtrain_duo.C:241
 QAtrain_duo.C:242
 QAtrain_duo.C:243
 QAtrain_duo.C:244
 QAtrain_duo.C:245
 QAtrain_duo.C:246
 QAtrain_duo.C:247
 QAtrain_duo.C:248
 QAtrain_duo.C:249
 QAtrain_duo.C:250
 QAtrain_duo.C:251
 QAtrain_duo.C:252
 QAtrain_duo.C:253
 QAtrain_duo.C:254
 QAtrain_duo.C:255
 QAtrain_duo.C:256
 QAtrain_duo.C:257
 QAtrain_duo.C:258
 QAtrain_duo.C:259
 QAtrain_duo.C:260
 QAtrain_duo.C:261
 QAtrain_duo.C:262
 QAtrain_duo.C:263
 QAtrain_duo.C:264
 QAtrain_duo.C:265
 QAtrain_duo.C:266
 QAtrain_duo.C:267
 QAtrain_duo.C:268
 QAtrain_duo.C:269
 QAtrain_duo.C:270
 QAtrain_duo.C:271
 QAtrain_duo.C:272
 QAtrain_duo.C:273
 QAtrain_duo.C:274
 QAtrain_duo.C:275
 QAtrain_duo.C:276
 QAtrain_duo.C:277
 QAtrain_duo.C:278
 QAtrain_duo.C:279
 QAtrain_duo.C:280
 QAtrain_duo.C:281
 QAtrain_duo.C:282
 QAtrain_duo.C:283
 QAtrain_duo.C:284
 QAtrain_duo.C:285
 QAtrain_duo.C:286
 QAtrain_duo.C:287
 QAtrain_duo.C:288
 QAtrain_duo.C:289
 QAtrain_duo.C:290
 QAtrain_duo.C:291
 QAtrain_duo.C:292
 QAtrain_duo.C:293
 QAtrain_duo.C:294
 QAtrain_duo.C:295
 QAtrain_duo.C:296
 QAtrain_duo.C:297
 QAtrain_duo.C:298
 QAtrain_duo.C:299
 QAtrain_duo.C:300
 QAtrain_duo.C:301
 QAtrain_duo.C:302
 QAtrain_duo.C:303
 QAtrain_duo.C:304
 QAtrain_duo.C:305
 QAtrain_duo.C:306
 QAtrain_duo.C:307
 QAtrain_duo.C:308
 QAtrain_duo.C:309
 QAtrain_duo.C:310
 QAtrain_duo.C:311
 QAtrain_duo.C:312
 QAtrain_duo.C:313
 QAtrain_duo.C:314
 QAtrain_duo.C:315
 QAtrain_duo.C:316
 QAtrain_duo.C:317
 QAtrain_duo.C:318
 QAtrain_duo.C:319
 QAtrain_duo.C:320
 QAtrain_duo.C:321
 QAtrain_duo.C:322
 QAtrain_duo.C:323
 QAtrain_duo.C:324
 QAtrain_duo.C:325
 QAtrain_duo.C:326
 QAtrain_duo.C:327
 QAtrain_duo.C:328
 QAtrain_duo.C:329
 QAtrain_duo.C:330
 QAtrain_duo.C:331
 QAtrain_duo.C:332
 QAtrain_duo.C:333
 QAtrain_duo.C:334
 QAtrain_duo.C:335
 QAtrain_duo.C:336
 QAtrain_duo.C:337
 QAtrain_duo.C:338
 QAtrain_duo.C:339
 QAtrain_duo.C:340
 QAtrain_duo.C:341
 QAtrain_duo.C:342
 QAtrain_duo.C:343
 QAtrain_duo.C:344
 QAtrain_duo.C:345
 QAtrain_duo.C:346
 QAtrain_duo.C:347
 QAtrain_duo.C:348
 QAtrain_duo.C:349
 QAtrain_duo.C:350
 QAtrain_duo.C:351
 QAtrain_duo.C:352
 QAtrain_duo.C:353
 QAtrain_duo.C:354
 QAtrain_duo.C:355
 QAtrain_duo.C:356
 QAtrain_duo.C:357
 QAtrain_duo.C:358
 QAtrain_duo.C:359
 QAtrain_duo.C:360
 QAtrain_duo.C:361
 QAtrain_duo.C:362
 QAtrain_duo.C:363
 QAtrain_duo.C:364
 QAtrain_duo.C:365
 QAtrain_duo.C:366
 QAtrain_duo.C:367
 QAtrain_duo.C:368
 QAtrain_duo.C:369
 QAtrain_duo.C:370
 QAtrain_duo.C:371
 QAtrain_duo.C:372
 QAtrain_duo.C:373
 QAtrain_duo.C:374
 QAtrain_duo.C:375
 QAtrain_duo.C:376
 QAtrain_duo.C:377
 QAtrain_duo.C:378
 QAtrain_duo.C:379
 QAtrain_duo.C:380
 QAtrain_duo.C:381
 QAtrain_duo.C:382
 QAtrain_duo.C:383
 QAtrain_duo.C:384
 QAtrain_duo.C:385
 QAtrain_duo.C:386
 QAtrain_duo.C:387
 QAtrain_duo.C:388
 QAtrain_duo.C:389
 QAtrain_duo.C:390
 QAtrain_duo.C:391
 QAtrain_duo.C:392
 QAtrain_duo.C:393
 QAtrain_duo.C:394
 QAtrain_duo.C:395
 QAtrain_duo.C:396
 QAtrain_duo.C:397
 QAtrain_duo.C:398
 QAtrain_duo.C:399
 QAtrain_duo.C:400
 QAtrain_duo.C:401
 QAtrain_duo.C:402
 QAtrain_duo.C:403
 QAtrain_duo.C:404
 QAtrain_duo.C:405
 QAtrain_duo.C:406
 QAtrain_duo.C:407
 QAtrain_duo.C:408
 QAtrain_duo.C:409
 QAtrain_duo.C:410
 QAtrain_duo.C:411
 QAtrain_duo.C:412
 QAtrain_duo.C:413
 QAtrain_duo.C:414
 QAtrain_duo.C:415
 QAtrain_duo.C:416
 QAtrain_duo.C:417
 QAtrain_duo.C:418
 QAtrain_duo.C:419
 QAtrain_duo.C:420
 QAtrain_duo.C:421
 QAtrain_duo.C:422
 QAtrain_duo.C:423
 QAtrain_duo.C:424
 QAtrain_duo.C:425
 QAtrain_duo.C:426
 QAtrain_duo.C:427
 QAtrain_duo.C:428
 QAtrain_duo.C:429
 QAtrain_duo.C:430
 QAtrain_duo.C:431
 QAtrain_duo.C:432
 QAtrain_duo.C:433
 QAtrain_duo.C:434
 QAtrain_duo.C:435
 QAtrain_duo.C:436
 QAtrain_duo.C:437
 QAtrain_duo.C:438
 QAtrain_duo.C:439
 QAtrain_duo.C:440
 QAtrain_duo.C:441
 QAtrain_duo.C:442
 QAtrain_duo.C:443
 QAtrain_duo.C:444
 QAtrain_duo.C:445
 QAtrain_duo.C:446
 QAtrain_duo.C:447
 QAtrain_duo.C:448
 QAtrain_duo.C:449
 QAtrain_duo.C:450
 QAtrain_duo.C:451
 QAtrain_duo.C:452
 QAtrain_duo.C:453
 QAtrain_duo.C:454
 QAtrain_duo.C:455
 QAtrain_duo.C:456
 QAtrain_duo.C:457
 QAtrain_duo.C:458
 QAtrain_duo.C:459
 QAtrain_duo.C:460
 QAtrain_duo.C:461
 QAtrain_duo.C:462
 QAtrain_duo.C:463
 QAtrain_duo.C:464
 QAtrain_duo.C:465
 QAtrain_duo.C:466
 QAtrain_duo.C:467
 QAtrain_duo.C:468
 QAtrain_duo.C:469
 QAtrain_duo.C:470
 QAtrain_duo.C:471
 QAtrain_duo.C:472
 QAtrain_duo.C:473
 QAtrain_duo.C:474
 QAtrain_duo.C:475
 QAtrain_duo.C:476
 QAtrain_duo.C:477
 QAtrain_duo.C:478
 QAtrain_duo.C:479
 QAtrain_duo.C:480
 QAtrain_duo.C:481
 QAtrain_duo.C:482
 QAtrain_duo.C:483
 QAtrain_duo.C:484
 QAtrain_duo.C:485
 QAtrain_duo.C:486
 QAtrain_duo.C:487
 QAtrain_duo.C:488
 QAtrain_duo.C:489
 QAtrain_duo.C:490
 QAtrain_duo.C:491
 QAtrain_duo.C:492
 QAtrain_duo.C:493
 QAtrain_duo.C:494
 QAtrain_duo.C:495
 QAtrain_duo.C:496
 QAtrain_duo.C:497
 QAtrain_duo.C:498
 QAtrain_duo.C:499
 QAtrain_duo.C:500
 QAtrain_duo.C:501
 QAtrain_duo.C:502
 QAtrain_duo.C:503
 QAtrain_duo.C:504
 QAtrain_duo.C:505
 QAtrain_duo.C:506
 QAtrain_duo.C:507
 QAtrain_duo.C:508
 QAtrain_duo.C:509
 QAtrain_duo.C:510
 QAtrain_duo.C:511
 QAtrain_duo.C:512
 QAtrain_duo.C:513
 QAtrain_duo.C:514
 QAtrain_duo.C:515
 QAtrain_duo.C:516
 QAtrain_duo.C:517
 QAtrain_duo.C:518
 QAtrain_duo.C:519
 QAtrain_duo.C:520
 QAtrain_duo.C:521
 QAtrain_duo.C:522
 QAtrain_duo.C:523
 QAtrain_duo.C:524
 QAtrain_duo.C:525
 QAtrain_duo.C:526
 QAtrain_duo.C:527
 QAtrain_duo.C:528
 QAtrain_duo.C:529
 QAtrain_duo.C:530
 QAtrain_duo.C:531
 QAtrain_duo.C:532
 QAtrain_duo.C:533
 QAtrain_duo.C:534
 QAtrain_duo.C:535
 QAtrain_duo.C:536
 QAtrain_duo.C:537
 QAtrain_duo.C:538
 QAtrain_duo.C:539
 QAtrain_duo.C:540
 QAtrain_duo.C:541
 QAtrain_duo.C:542
 QAtrain_duo.C:543
 QAtrain_duo.C:544
 QAtrain_duo.C:545
 QAtrain_duo.C:546
 QAtrain_duo.C:547
 QAtrain_duo.C:548
 QAtrain_duo.C:549
 QAtrain_duo.C:550
 QAtrain_duo.C:551
 QAtrain_duo.C:552
 QAtrain_duo.C:553
 QAtrain_duo.C:554
 QAtrain_duo.C:555
 QAtrain_duo.C:556
 QAtrain_duo.C:557
 QAtrain_duo.C:558