ROOT logo
/**
 * @file   QA.C
 * @author Christian Holm Christensen <cholm@nbi.dk>
 * @date   Wed Sep 24 15:04:38 2014
 * 
 * @brief  Master script for QA train 
 * 
 * @note Do not modify this script. 
 *
 *
 * This script reads in 4 other scripts 
 *
 * - GRP.C to load the global run parameters for the selected run,
 *   such as collision system, energy, etc.
 * 
 * - AODConfig.C which defines a number of functions that return
 *   either true or false.  The tasks added depends on these functions
 *
 * - BaseConfig.C which defines some base classes 
 * 
 * - DetConfig.C which defines which detectors are active and on. 
 * 
 * Users can customize QAConfig.C and DetConfig.C according to their
 * needs
 */
// Trigger mask.
UInt_t kTriggerInt        = AliVEvent::kAnyINT;
UInt_t kTriggerMuonAll    = (AliVEvent::kMUL7       | 
			     AliVEvent::kMUSH7      | 
			     AliVEvent::kMUU7       |
			     AliVEvent::kMUS7       |
			     AliVEvent::kMUSPB      |
			     AliVEvent::kMUSHPB     |
			     AliVEvent::kMuonLikePB | 
			     AliVEvent::kMuonUnlikePB);
UInt_t kTriggerMuonBarell = AliVEvent::kMUU7;
UInt_t kTriggerEMC        = (AliVEvent::kEMC7   | 
			     AliVEvent::kEMC8   | 
			     AliVEvent::kEMCEJE | 
			     AliVEvent::kEMCEGA);
UInt_t kTriggerHM         = AliVEvent::kHighMult;
UInt_t kTriggerMask       = kTriggerInt;

/**
 * Interface (pure virtual) that all configuration classes must
 * implement.
 */
struct VirtualQACfg
{
  /** @return  */
  virtual Bool_t DoCDBconnect()  const = 0;
  /** @return  */
  virtual Bool_t DoEventStat()   const = 0;
  /** @return  */
  virtual Bool_t DoCentrality()  const = 0;
  /** @return  */
  virtual Bool_t DoQAsym()       const = 0;
  /** @return  there is a 2nd file */
  virtual Bool_t DoVZERO()       const = 0;
  /** @return  */
  virtual Bool_t DoVZEROPbPb()   const = 0;
  /** @return  */
  virtual Bool_t DoVertex()      const = 0;
  /** @return  needs RP    */
  virtual Bool_t DoSPD()         const = 0;
  /** @return  */
  virtual Bool_t DoTPC()         const = 0;
  /** @return  */
  virtual Bool_t DoHLT()         const = 0;
  /** @return  needs RP */
  virtual Bool_t DoSDD()         const = 0;
  /** @return  */
  virtual Bool_t DoSSDdEdx()     const = 0;
  /** @return  */
  virtual Bool_t DoTRD()         const = 0;
  /** @return  */
  virtual Bool_t DoITS()         const = 0;
  /** @return  */
  virtual Bool_t DoITSsaTracks() const = 0;
  /** @return  */
  virtual Bool_t DoITSalign()    const = 0;
  /** @return  */
  virtual Bool_t DoCALO()        const = 0;
  /** @return  */
  virtual Bool_t DoMUONTrig()    const = 0;
  /** @return  */
  virtual Bool_t DoImpParRes()   const = 0;
  /** @return  */
  virtual Bool_t DoMUON()        const = 0;
  /** @return  */
  virtual Bool_t DoTOF()         const = 0;
  /** @return  */
  virtual Bool_t DoHMPID()       const = 0;
  /** @return  */
  virtual Bool_t DoT0()          const = 0;
  /** @return  */
  virtual Bool_t DoZDC()         const = 0;
  /** @return  */
  virtual Bool_t DoPIDResponse() const = 0;
  /** @return  */
  virtual Bool_t DoPIDqa()       const = 0;
  /** @return  */
  virtual Bool_t DoFWD()         const = 0;
  /** @return  */
  virtual Bool_t DoPHOS()        const = 0;
  /** @return  */
  virtual Bool_t DoPHOSTrig()    const = 0;
  /** @return  */
  virtual Bool_t DoEMCAL()       const = 0;
  /** @return  */
  virtual Bool_t DoFBFqa()       const = 0;
  /** @return  NEEDS geometry */
  virtual Bool_t DoMUONEff()     const = 0;
  /** @return  NEEDS MCtruth  */
  virtual Bool_t DoV0()          const = 0;
  /** @return Get Debug level */
  virtual Int_t DebugLevel() const = 0;

  virtual void PrintOne(const char* title, Bool_t use) const 
  {
    Printf("%-30s : %3s", title, use ? "yes" : "no");
  }
  virtual void Print() const 
  {
    PrintOne("CDBconnect ",  		DoCDBconnect());
    PrintOne("EventStat ",   		DoEventStat());
    PrintOne("Centrality ",  		DoCentrality());
    PrintOne("QAsym ",       		DoQAsym());
    PrintOne("VZERO",       		DoVZERO());
    PrintOne("VZEROPbPb ",   		DoVZEROPbPb());
    PrintOne("Vertex ",      		DoVertex());
    PrintOne("SPD  needs RP   ",        DoSPD());
    PrintOne("TPC ",         		DoTPC());
    PrintOne("HLT ",         		DoHLT());
    PrintOne("SDD  needs RP",         	DoSDD());
    PrintOne("SSDdEdx ",     		DoSSDdEdx());
    PrintOne("TRD ",         		DoTRD());
    PrintOne("ITS ",         		DoITS());
    PrintOne("ITSsaTracks ", 		DoITSsaTracks());
    PrintOne("ITSalign ",    		DoITSalign());
    PrintOne("CALO ",        		DoCALO());
    PrintOne("MUONTrig ",    		DoMUONTrig());
    PrintOne("ImpParRes ",   		DoImpParRes());
    PrintOne("MUON ",        		DoMUON());
    PrintOne("TOF ",         		DoTOF());
    PrintOne("HMPID ",       		DoHMPID());
    PrintOne("T0 ",          		DoT0());
    PrintOne("ZDC ",         		DoZDC());
    PrintOne("PIDResponse ", 		DoPIDResponse());
    PrintOne("PIDqa ",       		DoPIDqa());
    PrintOne("FWD ",         		DoFWD());
    PrintOne("PHOS ",        		DoPHOS());
    PrintOne("PHOSTrig ",    		DoPHOSTrig());
    PrintOne("EMCAL ",       		DoEMCAL());
    PrintOne("FBFqa ",       		DoFBFqa());
    PrintOne("MUONEff NEEDS geometry",	DoMUONEff());
    PrintOne("V0  NEEDS MCtruth ",      DoV0());
  }
};
VirtualQACfg* qaCfg = 0;

//====================================================================
/** 
 * Load the needed libraries 
 * 
 */
void LoadLibraries()
{
  Bool_t is10h = grp->period.EqualTo("LHC10h",TString::kIgnoreCase);
  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("libOADB");
  gSystem->Load("libESDfilter.so");
  gSystem->Load("libCORRFW");
  gSystem->Load("libTENDER");
  gSystem->Load("libPWGPP.so");
  gSystem->Load("libAliHLTTrigger.so");

  if ((qaCfg->DoEMCAL() && detCfg->UseEMCAL()) || 
      ((qaCfg->DoPHOS() || qaCfg->DoPHOSTrig())  && detCfg->UsePHOS()) || 
      (qaCfg->DoCALO() && !is10h)) {
    gSystem->Load("libEMCALUtils");
    gSystem->Load("libPHOSUtils");
    gSystem->Load("libPWGCaloTrackCorrBase");
    gSystem->Load("libPWGGACaloTrackCorrelations");
    gSystem->Load("libPWGGACaloTasks");
    gSystem->Load("libPWGGAPHOSTasks");
    gSystem->Load("libPWGTools");
    gSystem->Load("libPWGEMCAL");
    gSystem->Load("libPWGGAEMCALTasks");
  }  
  if((qaCfg->DoMUON() || qaCfg->DoMUONTrig()) && detCfg->UseMUON()) {
    gSystem->Load("libPWGmuon");
    gSystem->Load("libPWGPPMUONlite");
    gSystem->Load("libPWGmuondep");
  }
  if (qaCfg->DoFWD() && detCfg->UseFMD()) {
    gSystem->Load("libPWGLFforward2");
  }      
}
 
//====================================================================
/** 
 * Add the analysis tasks 
 * 
 * @param cdb_location 
 */
void AddAnalysisTasks(const char *cdb_location)
{
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  mgr->SetCommonFileName("QAresults.root");

  Bool_t is10h = grp->period.EqualTo("LHC10h",TString::kIgnoreCase);
  // --- Some short-hands --------------------------------------------
  TString ali   = "$ALICE_ROOT";
  TString ana   = ali + "/ANALYSIS";
  TString pwghf = ali + "/PWGHF";
  TString pwglf = ali + "/PWGLF";
  TString pwgje = ali + "/PWGJE";
  TString pwgdq = ali + "/PWGDQ";
  TString pwgpp = ali + "/PWGPP";
  TString pwgga = ali + "/PWGGA";
  
  // --- Statistics task ---------------------------------------------
  mgr->AddStatisticsTask(kTriggerMask);

  // --- CDB connection ----------------------------------------------
  if (qaCfg->DoCDBconnect()) {
    gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskCDBconnect.C");
    AliTaskCDBconnect *taskCDB = AddTaskCDBconnect(cdb_location, grp->run);
    if (!taskCDB) return;
  }    
  
  // --- Event Statistics (Jan Fiete) --------------------------------
  if (qaCfg->DoEventStat()) {
    gROOT->LoadMacro(ana+"/macros/AddTaskPhysicsSelection.C");
    AliPhysicsSelectionTask* physSelTask = AddTaskPhysicsSelection(kTRUE/*MC*/);
    // Hack by Alexander for LHC10h
    // gROOT->LoadMacro("LHC10hPS.C");
    // AliOADBPhysicsSelection* ops = LHC10hPS(grp->period, grp->run);
    // if (ops) 
    //   physSelTask->GetPhysicsSelection()->SetCustomOADBObjects(ops,0);
  }
  // --- PIDResponse(JENS) -------------------------------------------
  if (qaCfg->DoPIDResponse() && !is10h) {
    gROOT->LoadMacro(ana+"/macros/AddTaskPIDResponse.C"); 
    AliAnalysisTaskPIDResponse *PIDResponse = AddTaskPIDResponse(kTRUE);
    PIDResponse->SelectCollisionCandidates(kTriggerMask);
  }    
  // --- Centrality (A. Toia) ----------------------------------------
  if (qaCfg->DoCentrality()) {
    gROOT->LoadMacro(ana+"/macros/AddTaskCentrality.C");
    AliCentralitySelectionTask *taskCentrality = AddTaskCentrality();
    taskCentrality->SetMCInput();        
  }   
  
  // --- Vertexing (A. Dainese) --------------------------------------
  if (qaCfg->DoVertex()) {
    gROOT->LoadMacro(pwgpp+"/macros/AddTaskVertexESD.C");
    // Specific setting for MC
    AliAnalysisTaskVertexESD* taskvertexesd =  
      AddTaskVertexESD(kTRUE, kTriggerMask);
    taskvertexesd->SelectCollisionCandidates(kTriggerMask);
  }  

  // --- TPC QA (E. Sicking) -----------------------------------------
  if (qaCfg->DoQAsym()) {
  // offline trigger in AddTask
    gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskQAsym.C");
    AliAnalysisTaskSE * taskqasim = AddTaskQAsym(0, 
						 kTriggerMask, 
						 kTriggerHM, 
						 kTriggerEMC, 
						 kTriggerMuonBarell);
  }  
  // --- VZERO QA  (C. Cheshkov) -------------------------------------
  if (qaCfg->DoVZERO() && detCfg->UseVZERO()) {
    gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskVZEROQA.C");
    AliAnalysisTaskSE * taskv0qa = AddTaskVZEROQA(0);
  }
  if (qaCfg->DoVZEROPbPb() && detCfg->UseVZERO() && grp->IsAA()) {
    gROOT->LoadMacro(pwgpp+"/VZERO/AddTaskVZEROPbPb.C");
    AliAnaVZEROPbPb* taskV0PbPb = 
      (AliAnaVZEROPbPb*)AddTaskVZEROPbPb(Int_t(grp->run));
  }
  // --- 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 (qaCfg->DoTPC() && detCfg->UseTPC()) {
    gROOT->LoadMacro(pwgpp+"/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
    AliPerformanceTask *tpcQA = 0;
    if (grp->IsAA()) {
       // High multiplicity Pb-Pb
       tpcQA = AddTaskPerformanceTPCdEdxQA(kTRUE, kTRUE, kTRUE);
    } else {
      // Low multiplicity (pp)
       tpcQA = AddTaskPerformanceTPCdEdxQA(kTRUE, kTRUE, kFALSE);
    }
    tpcQA->SelectCollisionCandidates(kTriggerMask);
    AliPerformanceRes::SetMergeEntriesCut(5000000); 
  }  

  // --- HLT (Alberica Toia) -----------------------------------------
  if (qaCfg->DoHLT() && detCfg->UseTPC()) {
    gROOT->LoadMacro(pwgpp+"/TPC/macros/AddTaskPerformanceTPCdEdxQA.C");
    AliPerformanceTask *hltQA = AddTaskPerformanceTPCdEdxQA(kTRUE, kTRUE, 
							    kFALSE,0,kTRUE);
    hltQA->SelectCollisionCandidates(kTriggerMask);
  }  
  // --- SPD (A. Mastroserio) ----------------------------------------
  if (qaCfg->DoSPD() && detCfg->UseITS()) {
    gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskSPDQA.C");
    AliAnalysisTaskSPD* taskspdqa = (AliAnalysisTaskSPD*)AddTaskSPDQA();
    // Request from Annalisa
    if (grp->IsAA()) taskspdqa->SetHeavyIonMode();
    taskspdqa->SelectCollisionCandidates(kTriggerMask);
    taskspdqa->SetOCDBInfo(grp->run, "raw://");
  }  
  // --- SDD (F. Prino) ----------------------------------------------
  if (qaCfg->DoSDD() && detCfg->UseITS()) {
    gROOT->LoadMacro(pwgpp+"/PilotTrain/AddSDDPoints.C");
    AliAnalysisTaskSE* tasksdd = AddSDDPoints();
    tasksdd->SelectCollisionCandidates(kTriggerMask);
  }
  // --- SSD dEdx (Marek Chojnacki) ----------------------------------
  if (qaCfg->DoSSDdEdx() && detCfg->UseITS()) {
    gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskdEdxSSDQA.C");
    AliAnalysisTaskSE* taskssddedx = AddTaskdEdxSSDQA();
    taskssddedx->SelectCollisionCandidates(kTriggerMask);
  }

  // --- ITS ---------------------------------------------------------
  if (qaCfg->DoITS() && detCfg->UseITS()) {
    // hardcoded non-zero trigger mask
    gROOT->LoadMacro(pwgpp+"/macros/AddTaskPerformanceITS.C");
    AliAnalysisTaskITSTrackingCheck *itsQA = 0;
    AliAnalysisTaskITSTrackingCheck *itsQACent0010 = 0;
    AliAnalysisTaskITSTrackingCheck *itsQACent3050 = 0;
    AliAnalysisTaskITSTrackingCheck *itsQACent6080 = 0;
    if(grp->IsPP()) {
      itsQA = AddTaskPerformanceITS(kTRUE);
    } else {
      itsQA = AddTaskPerformanceITS(kTRUE);
      itsQACent0010 = AddTaskPerformanceITS(kTRUE,kFALSE,kFALSE,3500,10000);
      itsQACent3050 = AddTaskPerformanceITS(kTRUE,kFALSE,kFALSE,590,1570);
      itsQACent6080 = AddTaskPerformanceITS(kTRUE,kFALSE,kFALSE,70,310);
    }
  }
  // --- ITS saTracks, align (F.Prino) -------------------------------
  if (qaCfg->DoITSsaTracks() && detCfg->UseITS()) {
    // offline trigger in AddTask
    gROOT->LoadMacro(pwgpp+"/macros/AddTaskITSsaTracks.C");
    AliAnalysisTaskITSsaTracks *itssaTracks = AddTaskITSsaTracks(kTRUE,kFALSE);
    itssaTracks->SelectCollisionCandidates(kTriggerMask);
  }   
  if (qaCfg->DoITSalign() && detCfg->UseITS()) {
    // no offline trigger selection
     gROOT->LoadMacro(pwgpp+"/macros/AddTaskITSAlign.C");
     AliAnalysisTaskITSAlignQA *itsAlign = AddTaskITSAlign(0,2011);
  }   

  // --- TRD (Alex Bercuci, M. Fasel) --------------------------------
  if(qaCfg->DoTRD() && detCfg->UseTRD()) {
    // no offline trigger selection
    gROOT->LoadMacro(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(qaCfg->DoZDC() && detCfg->UseZDC()) {
    // hardcoded kMB trigger mask
     gROOT->LoadMacro(pwgpp+"/ZDC/AddTaskZDCQA.C");
     AliAnalysisTaskSE *taskZDC = AddTaskZDCQA();
     taskZDC->SelectCollisionCandidates(kTriggerMask);
  }   

  // --- Calorimetry (Gustavo Conesa) --------------------------------
  if(qaCfg->DoCALO() && !is10h) {
    gROOT->LoadMacro(pwgga+
		     "/CaloTrackCorrelations/macros/QA/AddTaskCalorimeterQA.C");
    AliAnalysisTaskCaloTrackCorrelation *taskCaloQA = 
      AddTaskCalorimeterQA("default");
    taskCaloQA->SetDebugLevel(0);
    // offline mask set in AddTask to kMB
    taskCaloQA->SelectCollisionCandidates(kTriggerMask);
    // Add a new calo task with EMC1 trigger only
    if (!is10h) {
      taskCaloQA = AddTaskCalorimeterQA("trigEMC");
      taskCaloQA->SetDebugLevel(0);
      taskCaloQA->SelectCollisionCandidates(kTriggerEMC);
    }
  }

  // --- Muon Trigger ------------------------------------------------
  if(qaCfg->DoMUONTrig() && detCfg->UseMUON()) {
    // no offline trigger selection
    gROOT->LoadMacro(pwgpp+"/macros/AddTaskMTRchamberEfficiency.C");
    AliAnalysisTaskTrigChEff *taskMuonTrig = AddTaskMTRchamberEfficiency();
  }

  // --- Muon Efficiency (not used) ----------------------------------
  if(qaCfg->DoMUONEff() && detCfg->UseMUON()) {
      gROOT->LoadMacro(ali+"/PWG3/muondep/AddTaskMUONTrackingEfficiency.C");
      AliAnalysisTaskMuonTrackingEff *taskMuonTrackEff = 
	AddTaskMUONTrackingEfficiency();
  }
  
  // --- V0-Decay Reconstruction (Ana Marin) (not used) --------------
  if (qaCfg->DoV0()) {
    gROOT->LoadMacro(pwgpp+"/macros/AddTaskV0QA.C");
    AliAnalysisTaskV0QA *taskv0QA = AddTaskV0QA(kTRUE);
  }
  
  // -- Impact parameter resolution ----------------------------------
  // (xianbao.yuan@pd.infn.it, andrea.dainese@pd.infn.it)
  if (qaCfg->DoImpParRes()) {
    gROOT->LoadMacro(pwgpp+"/macros/AddTaskImpParRes.C");
    AliAnalysisTaskSE* taskimpparres=0;
    // Specific setting for MC
    if(grp->IsPP()) {
      taskimpparres= AddTaskImpParRes(kTRUE);
    } else {
      taskimpparres= AddTaskImpParRes(kTRUE,-1,kTRUE,kFALSE);
    }
    taskimpparres->SelectCollisionCandidates(kTriggerMask);
  }  

  // --- MUON QA (Philippe Pillot) -----------------------------------
  if (qaCfg->DoMUON() && detCfg->UseMUON()) {
    // trigger analysis internal
    gROOT->LoadMacro(pwgpp+"/PilotTrain/AddTaskMuonQA.C");
    AliAnalysisTaskSE* taskmuonqa= AddTaskMuonQA();
  }  

  // --- TOF (Francesca Bellini) -------------------------------------
  if (qaCfg->DoTOF() && detCfg->UseTOF()) {
    gROOT->LoadMacro(pwgpp+"/TOF/AddTaskTOFQA.C");
    AliAnalysisTaskTOFqa *tofQA = AddTaskTOFQA(kFALSE);
    tofQA->SelectCollisionCandidates(kTriggerMask);
  } 

  // --- PIDqa(JENS) -------------------------------------------------
  if (qaCfg->DoPIDqa() && !is10h) {
    gROOT->LoadMacro(ana+"/macros/AddTaskPIDqa.C");
    AliAnalysisTaskPIDqa *PIDQA = AddTaskPIDqa();
    PIDQA->SelectCollisionCandidates(kTriggerMask);
  }  
 
  // --- HMPID QA (Giacomo Volpe) ------------------------------------
  //
  if (qaCfg->DoHMPID() && detCfg->UseHMPID()) {
    gROOT->LoadMacro(pwgpp+"/HMPID/AddTaskHmpidQA.C");
    AliAnalysisTaskSE* taskhmpidqa= AddTaskHmpidQA(kTRUE);
    // offline mask set in AddTask to kMB
    taskhmpidqa->SelectCollisionCandidates(kTriggerMask);
  }      

  // --- T0 QA (Alla Mayevskaya) -------------------------------------
  if (qaCfg->DoT0() && detCfg->UseT0()) {
    // no offline trigger selection
    gROOT->LoadMacro(pwgpp+"/T0/AddTaskT0QA.C");
    AliT0AnalysisTaskQA* taskt0qa= AddTaskT0QA();
    taskt0qa->SelectCollisionCandidates(kTriggerMask);
  }      

  // ---- FMD QA (Christian Holm Christiansen) -----------------------
  if (qaCfg->DoFWD() && detCfg->UseFMD()) {
    gROOT->LoadMacro(pwglf+"/FORWARD/analysis2/AddTaskForwardQA.C");
    // Parameters: usemc, usecentrality
    // AliAnalysisTaskSE *forwardQA = (AliAnalysisTaskSE *)
    AddTaskForwardQA(kTRUE, qaCfg->DoCentrality());
    // HACK: to read corrections from current directory
    const char* hack="AliForwardCorrectionManager::Instance().SetPrefix(\".\")";
    gROOT->ProcessLine(hack);
    const char* hack2="AliForwardCorrectionManager::Instance().Print(\"R\")";
    gROOT->ProcessLine(hack2);
    // No offline trigger config. needed (see #84077)
  }
  
  // --- PHOS QA (Boris Polishchuk) ----------------------------------
  if (qaCfg->DoPHOS()&& detCfg->UsePHOS()) {
    gROOT->LoadMacro(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 (grp->IsAA()) {
      gROOT->LoadMacro(pwgga+"/PHOSTasks/PHOS_PbPbQA/macros/AddTaskPHOSPbPb.C");
      AliAnalysisTaskPHOSPbPbQA* phosPbPb = AddTaskPHOSPbPbQA(0);
    }
  }
  if (qaCfg->DoPHOSTrig() && detCfg->UsePHOS()) {
    gROOT->LoadMacro(pwgga+
		     "/PHOSTasks/PHOS_TriggerQA/macros/AddTaskPHOSTriggerQA.C");
    AliAnalysisTaskPHOSTriggerQA *taskPHOSTrig = AddTaskPHOSTriggerQA(0,0);
  }   

  // --- EMCAL QA (Gustavo Conesa) -----------------------------------
  if (qaCfg->DoEMCAL() && detCfg->UseEMCAL()) {
     gROOT->LoadMacro(pwgga+"/EMCALTasks/macros/AddTaskEMCALTriggerQA.C");
     AliAnalysisTaskEMCALTriggerQA *emctrig = AddTaskEMCALTriggerQA();
  }   

  // --- FLOW and BF QA (C.Perez && A.Rodriguez) ---------------------
  if (qaCfg->DoFBFqa()) {
    gROOT->LoadMacro(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);
  }
}
/** 
 * Helper function to make @c outputs_valid file 
 * 
 */
void ValidateOutput()
{
  std::ofstream out;
  out.open("outputs_valid", ios::out);
  out.close();    
}  

//====================================================================
/** 
 * Run QA merging 
 * 
 * @param dir      directory 
 * @param stage    stage 
 */
void QAMerge(const char *dir, Int_t stage)
{
// Merging method
  TStopwatch  timer;     timer.Start();
  TString     outputDir     = dir;
  TObjArray   outputFiles;
  outputFiles.Add(new TObjString("QAresults.root"));
  outputFiles.Add(new TObjString("EventStat_temp.root"));

  TString     mergeExcludes = "";
  TIter       iter(&outputFiles);
  TObjString* str           = 0;
  Bool_t      merged        = kTRUE;
  while((str = static_cast<TObjString*>(iter()))) {
    TString& outputFile = str->GetString();
    // Skip already merged outputs
    if (!gSystem->AccessPathName(outputFile)) {
      ::Warning("Merge","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) {
      ::Error("Merge", "Cannot merge %s\n", outputFile.Data());
      continue;
    }
  }
  TString infolog = "fileinfo.log";
  AliAnalysisAlien::MergeInfo(infolog, dir); 

  if (!outputDir.Contains("Stage")) {
    ValidateOutput();
    timer.Print();
    return;
  }
  // --- Set up to run terminate -------------------------------------
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  mgr->SetSkipTerminate(kFALSE);
  if (!mgr->InitAnalysis()) return;

  mgr->PrintStatus();
  mgr->StartAnalysis("gridterminate", (TTree*)0);
  ValidateOutput();
  timer.Print();
}

//====================================================================
/** 
 * Run QA trains 
 * 
 * @param run         Run number 
 * @param xmlfile     Collection file 
 * @param stage       Stage 
 * @param cdb         CDB location 
 */
void QA(UInt_t      run, 
	const char* xmlfile   = "wn.xml",
	Int_t       stage     = 0, /*0 = QA train, 1...n - merging stage*/
	const char* cdb       = "raw://")
{
  // -----------------------------------------------------------------
  // 
  // Get GRP parameters.  Defines global "grp" as a pointer to GRPData
  //
  gROOT->Macro(Form("GRP.C(%d)", run));
  gROOT->Macro("BaseConfig.C");
  gROOT->Macro("QAConfig.C");
  gROOT->Macro("DetConfig.C");
  qaCfg->Print();
  Int_t   debug_level = qaCfg->DebugLevel();   // Debugging
  TString cdbString(cdb);
  if (cdbString.Contains("raw://")) {
    TGrid::Connect("alien://");
    if (!gGrid || !gGrid->IsConnected()) {
      ::Error("QAtrain", "No grid connection");
      return;
    }  
  }  

  // --- Some settings -----------------------------------------------
  // 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 common libraries and set include path
  LoadLibraries();
  printf("Include path: %s\n", gSystem->GetIncludePath());

  // === Make the analysis manager and connect event handlers ========
  // 
  // --- Analysis manager and load libraries -------------------------
  AliAnalysisManager *mgr  = new AliAnalysisManager("QA", "Production train");
  mgr->SetRunFromPath(grp->run);

  // --- Create ESD input handler ------------------------------------
  AliESDInputHandlerRP *esdHandler = new AliESDInputHandlerRP();
  esdHandler->SetReadFriends(kTRUE);
  esdHandler->SetActiveBranches("ESDfriend");
  mgr->SetInputEventHandler(esdHandler);
  
  // --- Monte Carlo handler -----------------------------------------
  if (true) {
    AliMCEventHandler* mcHandler = new AliMCEventHandler();
    mgr->SetMCtruthEventHandler(mcHandler);
    mcHandler->SetPreReadMode(1);
    mcHandler->SetReadTR(true);
  }

  // === Set up tasks ================================================
  //
  // --- Create tasks ------------------------------------------------
  AddAnalysisTasks(cdb);

  // --- Debugging if needed -----------------------------------------
  if (debug_level > 0) mgr->SetDebugLevel(debug_level);

  // --- If merging, do so here and exit -----------------------------
  if (stage>0) {
    QAMerge(xmlfile, stage);
    return;
  }   

  // === Run the analysis ============================================
  //
  // --- Make our chain ----------------------------------------------
  TChain *chain = new TChain("esdTree");
  chain->Add("AliESDs.root");

  // --- Run the thing -----------------------------------------------
  TStopwatch timer;
  timer.Start();
  if (!mgr->InitAnalysis()) return;

  mgr->PrintStatus(); 
  mgr->SetSkipTerminate(kTRUE);
  mgr->SetNSysInfo(1);
  mgr->StartAnalysis("local", chain);
  timer.Print();
}

// 
// EOF
// 

 QA.C:1
 QA.C:2
 QA.C:3
 QA.C:4
 QA.C:5
 QA.C:6
 QA.C:7
 QA.C:8
 QA.C:9
 QA.C:10
 QA.C:11
 QA.C:12
 QA.C:13
 QA.C:14
 QA.C:15
 QA.C:16
 QA.C:17
 QA.C:18
 QA.C:19
 QA.C:20
 QA.C:21
 QA.C:22
 QA.C:23
 QA.C:24
 QA.C:25
 QA.C:26
 QA.C:27
 QA.C:28
 QA.C:29
 QA.C:30
 QA.C:31
 QA.C:32
 QA.C:33
 QA.C:34
 QA.C:35
 QA.C:36
 QA.C:37
 QA.C:38
 QA.C:39
 QA.C:40
 QA.C:41
 QA.C:42
 QA.C:43
 QA.C:44
 QA.C:45
 QA.C:46
 QA.C:47
 QA.C:48
 QA.C:49
 QA.C:50
 QA.C:51
 QA.C:52
 QA.C:53
 QA.C:54
 QA.C:55
 QA.C:56
 QA.C:57
 QA.C:58
 QA.C:59
 QA.C:60
 QA.C:61
 QA.C:62
 QA.C:63
 QA.C:64
 QA.C:65
 QA.C:66
 QA.C:67
 QA.C:68
 QA.C:69
 QA.C:70
 QA.C:71
 QA.C:72
 QA.C:73
 QA.C:74
 QA.C:75
 QA.C:76
 QA.C:77
 QA.C:78
 QA.C:79
 QA.C:80
 QA.C:81
 QA.C:82
 QA.C:83
 QA.C:84
 QA.C:85
 QA.C:86
 QA.C:87
 QA.C:88
 QA.C:89
 QA.C:90
 QA.C:91
 QA.C:92
 QA.C:93
 QA.C:94
 QA.C:95
 QA.C:96
 QA.C:97
 QA.C:98
 QA.C:99
 QA.C:100
 QA.C:101
 QA.C:102
 QA.C:103
 QA.C:104
 QA.C:105
 QA.C:106
 QA.C:107
 QA.C:108
 QA.C:109
 QA.C:110
 QA.C:111
 QA.C:112
 QA.C:113
 QA.C:114
 QA.C:115
 QA.C:116
 QA.C:117
 QA.C:118
 QA.C:119
 QA.C:120
 QA.C:121
 QA.C:122
 QA.C:123
 QA.C:124
 QA.C:125
 QA.C:126
 QA.C:127
 QA.C:128
 QA.C:129
 QA.C:130
 QA.C:131
 QA.C:132
 QA.C:133
 QA.C:134
 QA.C:135
 QA.C:136
 QA.C:137
 QA.C:138
 QA.C:139
 QA.C:140
 QA.C:141
 QA.C:142
 QA.C:143
 QA.C:144
 QA.C:145
 QA.C:146
 QA.C:147
 QA.C:148
 QA.C:149
 QA.C:150
 QA.C:151
 QA.C:152
 QA.C:153
 QA.C:154
 QA.C:155
 QA.C:156
 QA.C:157
 QA.C:158
 QA.C:159
 QA.C:160
 QA.C:161
 QA.C:162
 QA.C:163
 QA.C:164
 QA.C:165
 QA.C:166
 QA.C:167
 QA.C:168
 QA.C:169
 QA.C:170
 QA.C:171
 QA.C:172
 QA.C:173
 QA.C:174
 QA.C:175
 QA.C:176
 QA.C:177
 QA.C:178
 QA.C:179
 QA.C:180
 QA.C:181
 QA.C:182
 QA.C:183
 QA.C:184
 QA.C:185
 QA.C:186
 QA.C:187
 QA.C:188
 QA.C:189
 QA.C:190
 QA.C:191
 QA.C:192
 QA.C:193
 QA.C:194
 QA.C:195
 QA.C:196
 QA.C:197
 QA.C:198
 QA.C:199
 QA.C:200
 QA.C:201
 QA.C:202
 QA.C:203
 QA.C:204
 QA.C:205
 QA.C:206
 QA.C:207
 QA.C:208
 QA.C:209
 QA.C:210
 QA.C:211
 QA.C:212
 QA.C:213
 QA.C:214
 QA.C:215
 QA.C:216
 QA.C:217
 QA.C:218
 QA.C:219
 QA.C:220
 QA.C:221
 QA.C:222
 QA.C:223
 QA.C:224
 QA.C:225
 QA.C:226
 QA.C:227
 QA.C:228
 QA.C:229
 QA.C:230
 QA.C:231
 QA.C:232
 QA.C:233
 QA.C:234
 QA.C:235
 QA.C:236
 QA.C:237
 QA.C:238
 QA.C:239
 QA.C:240
 QA.C:241
 QA.C:242
 QA.C:243
 QA.C:244
 QA.C:245
 QA.C:246
 QA.C:247
 QA.C:248
 QA.C:249
 QA.C:250
 QA.C:251
 QA.C:252
 QA.C:253
 QA.C:254
 QA.C:255
 QA.C:256
 QA.C:257
 QA.C:258
 QA.C:259
 QA.C:260
 QA.C:261
 QA.C:262
 QA.C:263
 QA.C:264
 QA.C:265
 QA.C:266
 QA.C:267
 QA.C:268
 QA.C:269
 QA.C:270
 QA.C:271
 QA.C:272
 QA.C:273
 QA.C:274
 QA.C:275
 QA.C:276
 QA.C:277
 QA.C:278
 QA.C:279
 QA.C:280
 QA.C:281
 QA.C:282
 QA.C:283
 QA.C:284
 QA.C:285
 QA.C:286
 QA.C:287
 QA.C:288
 QA.C:289
 QA.C:290
 QA.C:291
 QA.C:292
 QA.C:293
 QA.C:294
 QA.C:295
 QA.C:296
 QA.C:297
 QA.C:298
 QA.C:299
 QA.C:300
 QA.C:301
 QA.C:302
 QA.C:303
 QA.C:304
 QA.C:305
 QA.C:306
 QA.C:307
 QA.C:308
 QA.C:309
 QA.C:310
 QA.C:311
 QA.C:312
 QA.C:313
 QA.C:314
 QA.C:315
 QA.C:316
 QA.C:317
 QA.C:318
 QA.C:319
 QA.C:320
 QA.C:321
 QA.C:322
 QA.C:323
 QA.C:324
 QA.C:325
 QA.C:326
 QA.C:327
 QA.C:328
 QA.C:329
 QA.C:330
 QA.C:331
 QA.C:332
 QA.C:333
 QA.C:334
 QA.C:335
 QA.C:336
 QA.C:337
 QA.C:338
 QA.C:339
 QA.C:340
 QA.C:341
 QA.C:342
 QA.C:343
 QA.C:344
 QA.C:345
 QA.C:346
 QA.C:347
 QA.C:348
 QA.C:349
 QA.C:350
 QA.C:351
 QA.C:352
 QA.C:353
 QA.C:354
 QA.C:355
 QA.C:356
 QA.C:357
 QA.C:358
 QA.C:359
 QA.C:360
 QA.C:361
 QA.C:362
 QA.C:363
 QA.C:364
 QA.C:365
 QA.C:366
 QA.C:367
 QA.C:368
 QA.C:369
 QA.C:370
 QA.C:371
 QA.C:372
 QA.C:373
 QA.C:374
 QA.C:375
 QA.C:376
 QA.C:377
 QA.C:378
 QA.C:379
 QA.C:380
 QA.C:381
 QA.C:382
 QA.C:383
 QA.C:384
 QA.C:385
 QA.C:386
 QA.C:387
 QA.C:388
 QA.C:389
 QA.C:390
 QA.C:391
 QA.C:392
 QA.C:393
 QA.C:394
 QA.C:395
 QA.C:396
 QA.C:397
 QA.C:398
 QA.C:399
 QA.C:400
 QA.C:401
 QA.C:402
 QA.C:403
 QA.C:404
 QA.C:405
 QA.C:406
 QA.C:407
 QA.C:408
 QA.C:409
 QA.C:410
 QA.C:411
 QA.C:412
 QA.C:413
 QA.C:414
 QA.C:415
 QA.C:416
 QA.C:417
 QA.C:418
 QA.C:419
 QA.C:420
 QA.C:421
 QA.C:422
 QA.C:423
 QA.C:424
 QA.C:425
 QA.C:426
 QA.C:427
 QA.C:428
 QA.C:429
 QA.C:430
 QA.C:431
 QA.C:432
 QA.C:433
 QA.C:434
 QA.C:435
 QA.C:436
 QA.C:437
 QA.C:438
 QA.C:439
 QA.C:440
 QA.C:441
 QA.C:442
 QA.C:443
 QA.C:444
 QA.C:445
 QA.C:446
 QA.C:447
 QA.C:448
 QA.C:449
 QA.C:450
 QA.C:451
 QA.C:452
 QA.C:453
 QA.C:454
 QA.C:455
 QA.C:456
 QA.C:457
 QA.C:458
 QA.C:459
 QA.C:460
 QA.C:461
 QA.C:462
 QA.C:463
 QA.C:464
 QA.C:465
 QA.C:466
 QA.C:467
 QA.C:468
 QA.C:469
 QA.C:470
 QA.C:471
 QA.C:472
 QA.C:473
 QA.C:474
 QA.C:475
 QA.C:476
 QA.C:477
 QA.C:478
 QA.C:479
 QA.C:480
 QA.C:481
 QA.C:482
 QA.C:483
 QA.C:484
 QA.C:485
 QA.C:486
 QA.C:487
 QA.C:488
 QA.C:489
 QA.C:490
 QA.C:491
 QA.C:492
 QA.C:493
 QA.C:494
 QA.C:495
 QA.C:496
 QA.C:497
 QA.C:498
 QA.C:499
 QA.C:500
 QA.C:501
 QA.C:502
 QA.C:503
 QA.C:504
 QA.C:505
 QA.C:506
 QA.C:507
 QA.C:508
 QA.C:509
 QA.C:510
 QA.C:511
 QA.C:512
 QA.C:513
 QA.C:514
 QA.C:515
 QA.C:516
 QA.C:517
 QA.C:518
 QA.C:519
 QA.C:520
 QA.C:521
 QA.C:522
 QA.C:523
 QA.C:524
 QA.C:525
 QA.C:526
 QA.C:527
 QA.C:528
 QA.C:529
 QA.C:530
 QA.C:531
 QA.C:532
 QA.C:533
 QA.C:534
 QA.C:535
 QA.C:536
 QA.C:537
 QA.C:538
 QA.C:539
 QA.C:540
 QA.C:541
 QA.C:542
 QA.C:543
 QA.C:544
 QA.C:545
 QA.C:546
 QA.C:547
 QA.C:548
 QA.C:549
 QA.C:550
 QA.C:551
 QA.C:552
 QA.C:553
 QA.C:554
 QA.C:555
 QA.C:556
 QA.C:557
 QA.C:558
 QA.C:559
 QA.C:560
 QA.C:561
 QA.C:562
 QA.C:563
 QA.C:564
 QA.C:565
 QA.C:566
 QA.C:567
 QA.C:568
 QA.C:569
 QA.C:570
 QA.C:571
 QA.C:572
 QA.C:573
 QA.C:574
 QA.C:575
 QA.C:576
 QA.C:577
 QA.C:578
 QA.C:579
 QA.C:580
 QA.C:581
 QA.C:582
 QA.C:583
 QA.C:584
 QA.C:585
 QA.C:586
 QA.C:587
 QA.C:588
 QA.C:589
 QA.C:590
 QA.C:591
 QA.C:592
 QA.C:593
 QA.C:594
 QA.C:595
 QA.C:596
 QA.C:597
 QA.C:598
 QA.C:599
 QA.C:600
 QA.C:601
 QA.C:602
 QA.C:603
 QA.C:604
 QA.C:605
 QA.C:606
 QA.C:607
 QA.C:608
 QA.C:609
 QA.C:610
 QA.C:611
 QA.C:612
 QA.C:613
 QA.C:614
 QA.C:615
 QA.C:616
 QA.C:617
 QA.C:618
 QA.C:619
 QA.C:620
 QA.C:621
 QA.C:622
 QA.C:623
 QA.C:624
 QA.C:625
 QA.C:626
 QA.C:627
 QA.C:628
 QA.C:629
 QA.C:630
 QA.C:631
 QA.C:632
 QA.C:633
 QA.C:634
 QA.C:635
 QA.C:636
 QA.C:637
 QA.C:638
 QA.C:639
 QA.C:640
 QA.C:641
 QA.C:642
 QA.C:643
 QA.C:644
 QA.C:645
 QA.C:646
 QA.C:647
 QA.C:648
 QA.C:649
 QA.C:650
 QA.C:651
 QA.C:652
 QA.C:653
 QA.C:654
 QA.C:655
 QA.C:656
 QA.C:657
 QA.C:658
 QA.C:659
 QA.C:660
 QA.C:661
 QA.C:662
 QA.C:663
 QA.C:664
 QA.C:665
 QA.C:666
 QA.C:667
 QA.C:668
 QA.C:669
 QA.C:670
 QA.C:671
 QA.C:672
 QA.C:673
 QA.C:674
 QA.C:675
 QA.C:676
 QA.C:677
 QA.C:678
 QA.C:679
 QA.C:680
 QA.C:681
 QA.C:682
 QA.C:683
 QA.C:684
 QA.C:685
 QA.C:686
 QA.C:687
 QA.C:688
 QA.C:689
 QA.C:690
 QA.C:691
 QA.C:692
 QA.C:693
 QA.C:694
 QA.C:695
 QA.C:696
 QA.C:697
 QA.C:698
 QA.C:699
 QA.C:700
 QA.C:701
 QA.C:702
 QA.C:703
 QA.C:704
 QA.C:705
 QA.C:706
 QA.C:707
 QA.C:708
 QA.C:709
 QA.C:710
 QA.C:711
 QA.C:712
 QA.C:713
 QA.C:714