ROOT logo

Bool_t  kPrint         = kFALSE;
Bool_t  kSimulation    = kFALSE;
Bool_t  kUseKinematics = kFALSE;
Bool_t  kOutputAOD     = kFALSE;
Bool_t  kEventSelection= kFALSE;
Bool_t  kExotic        = kTRUE;
Bool_t  kNonLinearity  = kFALSE;
Int_t   kYears         = 2011;
TString kCollisions    = "pp";
TString kTrig          = "EMC7" ;
TString kClusterArray  = "";
TString kData          = ""; // MC or deltaAOD
TString kInputDataType = "ESD";
TString kCalorimeter   = "EMCAL";
Bool_t  kTM            = kTRUE;
Bool_t  kRecalTM       = kTRUE;
Int_t   kMinCen        = -1;
Int_t   kMaxCen        = -1;
TString kName          = "";
Int_t   kDebug         = -1; 
Float_t kVzCut         = 10.;
Bool_t  kPrimaryVertex = kTRUE;
Bool_t  kUseOADB       = kTRUE;
Bool_t  kTender        = kFALSE;


AliAnalysisTaskCaloTrackCorrelation *AddTaskPi0(const TString data          = "",
                                                const TString calorimeter   = "EMCAL", 
                                                const Bool_t  simulation    = kFALSE,
                                                const Bool_t  eventsel      = kFALSE,
                                                const Float_t vzcut         = 10,
                                                const Bool_t  primver       = kTRUE,
                                                const Bool_t  oadb          = kTRUE,
                                                const Bool_t  exotic        = kTRUE,
                                                const Bool_t  nonlin        = kFALSE,
                                                TString       outputfile    = "",
                                                const Int_t   year          = 2012,
                                                const TString col           = "pp", 
                                                const TString trigger       = "MB", 
                                                const TString clustersArray = "V1",
                                                const Bool_t  recaltm       = kTRUE,
                                                const Bool_t  tm            = kTRUE,
                                                const Int_t   minCen        = -1,
                                                const Int_t   maxCen        = -1,
                                                const Bool_t  qaan          = kFALSE,
                                                const Bool_t  splitan       = kFALSE,
                                                const Bool_t  tender        = kFALSE,
                                                const Bool_t  outputAOD     = kFALSE, 
                                                const Bool_t  printSettings = kFALSE,
                                                const Double_t scaleFactor   = -1
                                                )
{
  // Creates a CaloTrackCorr task, configures it and adds it to the analysis manager.
  
  kPrint         = printSettings;
  kSimulation    = simulation;
  kYears         = year;
  kCollisions    = col;
  kExotic        = exotic;
  kNonLinearity  = nonlin;
  kTrig          = trigger;
  kClusterArray  = clustersArray;
  kData          = data;
  kCalorimeter   = calorimeter;
  kOutputAOD     = outputAOD;
  kTM            = tm;
  kRecalTM       = recaltm;
  kMinCen        = minCen;
  kMaxCen        = maxCen;
  kEventSelection= eventsel;
  kVzCut         = vzcut;
  kPrimaryVertex = primver;
  kUseOADB       = oadb;
  kTender        = tender;

  // Get the pointer to the existing analysis manager via the static access method.
  
  AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
  if (!mgr) 
  {
    ::Error("AddTask", "No analysis manager to connect to.");
    return NULL;
  }  
  
  // Check the analysis type using the event handlers connected to the analysis manager.
  
  if (!mgr->GetInputEventHandler()) 
  {
    ::Error("AddTask", "This task requires an input event handler");
    return NULL;
  }
  
  kInputDataType = "AOD";
  if(!kData.Contains("delta"))
    kInputDataType = mgr->GetInputEventHandler()->GetDataType(); // can be "ESD" or "AOD"
  
  if(kSimulation) 
  { 
    kUseKinematics = (mgr->GetMCtruthEventHandler())?kTRUE:kFALSE; 
    if (!kUseKinematics && data=="AOD" && kInputDataType != "ESD") kUseKinematics = kTRUE; //AOD primary should be available ... 
  } 
  
  cout<<"********* ACCESS KINE? "<<kUseKinematics<<endl;
  
  // Name for containers
  
  kName = Form("%s_Trig%s_Cl%s_TM%d",kCalorimeter.Data(), kTrig.Data(),kClusterArray.Data(),kTM);

  if(kCollisions=="PbPb" && kMaxCen>=0) kName+=Form("Cen%d_%d",kMinCen,kMaxCen);
    
  printf("<<<< NAME: %s >>>>>\n",kName.Data());
  
  // #### Configure analysis ####
    
  AliAnaCaloTrackCorrMaker * maker = new AliAnaCaloTrackCorrMaker();
  
  maker->SetScaleFactor(scaleFactor); // for MC, negative (not scaled) by default
  
  // General frame setting and configuration
  maker->SetReader   (ConfigureReader()   ); 
  maker->SetCaloUtils(ConfigureCaloUtils()); 
  
  // Analysis tasks setting and configuration
  Int_t n = 0;//Analysis number, order is important  
  
  maker->AddAnalysis(ConfigurePhotonAnalysis(), n++); // Photon cluster selection
  maker->AddAnalysis(ConfigurePi0Analysis(), n++); // Pi0 invariant mass accumulate 
  maker->AddAnalysis(ConfigurePi0EbEAnalysis("Pi0", AliAnaPi0EbE::kIMCalo), n++); // Pi0 event by event selection, and photon tagging from decay    

  if(qaan)                  maker->AddAnalysis(ConfigureQAAnalysis(),n++);
  if(splitan && 
     kCalorimeter=="EMCAL") maker->AddAnalysis(ConfigureInClusterIMAnalysis(0.5,3), n++); 
  
  maker->SetAnaDebug(kDebug)  ;
  maker->SwitchOnHistogramsMaker()  ;
  if(kData.Contains("delta")) maker->SwitchOffAODsMaker() ;
  else                        maker->SwitchOnAODsMaker()  ;
  
  if(kPrint) maker->Print("");
  
  printf("<< End Configuration of %d analysis for calorimeter %s >>\n",n, kCalorimeter.Data());

  // Create task
  
  AliAnalysisTaskCaloTrackCorrelation * task = new AliAnalysisTaskCaloTrackCorrelation (Form("CaloTrackCorr%s",kName.Data()));
  task->SetConfigFileName(""); //Don't configure the analysis via configuration file.
  task->SetDebugLevel(kDebug);
  task->SetBranches("ESD:AliESDRun.,AliESDHeader"); 
  task->SetAnalysisMaker(maker);
  mgr->AddTask(task);
  
  //Create containers
  
  if(outputfile.Length()==0) outputfile = AliAnalysisManager::GetCommonFileName(); 
  
  AliAnalysisDataContainer *cout_pc   = mgr->CreateContainer(kName, TList::Class(), 
                                                             AliAnalysisManager::kOutputContainer, 
                                                             Form("%s",outputfile.Data()));
	
  AliAnalysisDataContainer *cout_cuts = mgr->CreateContainer(Form("Param_%s",kName.Data()), TList::Class(), 
                                                             AliAnalysisManager::kParamContainer, 
                                                             "AnalysisParameters.root");
  
  // Create ONLY the output containers for the data produced by the task.
  // Get and connect other common input/output containers via the manager as below
  //==============================================================================
  mgr->ConnectInput  (task, 0, mgr->GetCommonInputContainer());
  // AOD output slot will be used in a different way in future
  if(!kData.Contains("delta")   && outputAOD) mgr->ConnectOutput (task, 0, mgr->GetCommonOutputContainer());
  mgr->ConnectOutput (task, 1, cout_pc);
  mgr->ConnectOutput (task, 2, cout_cuts);
  
  
  if(kTrig=="EMC7")
  {
    printf("Pi0 analysis, trigger EMC7\n");
    task->SelectCollisionCandidates(AliVEvent::kEMC7);
  }
  else if (kTrig=="INT7")
  {
    printf("Pi0 analysis, trigger INT7\n");
    task->SelectCollisionCandidates(AliVEvent::kINT7);
  }
  else if(kTrig=="EMC1")
  {
    printf("Pi0 analysis, trigger EMC1\n");
    task->SelectCollisionCandidates(AliVEvent::kEMC1);
  }
  else if(kTrig=="MB")
  {
    printf("Pi0 analysis, trigger MB\n");
    task->SelectCollisionCandidates(AliVEvent::kMB);
  }  
  else if(kTrig=="PHOS")
  {
    printf("Pi0 analysis, trigger PHOS\n");
    task->SelectCollisionCandidates(AliVEvent::kPHI7);
  }  
  else if(kTrig=="PHOSPb")
  {
    printf("Pi0 analysis, trigger PHOSPb\n");
    task->SelectCollisionCandidates(AliVEvent::kPHOSPb);
  }
  else if(kTrig=="AnyINT")
  {
    printf("Pi0 analysis, trigger AnyINT\n");
    task->SelectCollisionCandidates(AliVEvent::kAnyINT);
  }  
  else if(kTrig=="INT")
  {
    printf("Pi0 analysis, trigger AnyINT\n");
    task->SelectCollisionCandidates(AliVEvent::kAny);
  }
  else if(kTrig=="EMCEGA")
  {
    printf("Pi0 analysis, trigger EMC Gamma\n");
    task->SelectCollisionCandidates(AliVEvent::kEMCEGA);
  } 
  else if(kTrig=="EMCEJE")
  {
    printf("Pi0 analysis, trigger EMC Jet\n");
    task->SelectCollisionCandidates(AliVEvent::kEMCEJE);
  }
  else if(kTrig=="Central")
  {
    printf("Pi0 analysis, trigger Central\n");
    task->SelectCollisionCandidates(AliVEvent::kCentral);
  } 
  else if(kTrig=="SemiCentral")
  {
    printf("Pi0 analysis, trigger SemiCentral\n");
    task->SelectCollisionCandidates(AliVEvent::kSemiCentral);
  }
  else if(kTrig=="SemiOrCentral")
  {
    printf("Pi0 analysis, trigger SemiCentral Or Central\n");
    task->SelectCollisionCandidates(AliVEvent::kSemiCentral | AliVEvent::kCentral);
  }
  
  
  return task;
}

//____________________________________
AliCaloTrackReader * ConfigureReader()
{
  
  AliCaloTrackReader * reader = 0;
  if     (kInputDataType == "ESD"&& kData=="MC" ) 
    reader = new AliCaloTrackMCReader();
  else if(kInputDataType=="AOD" || kData.Contains("AOD"))   
    reader = new AliCaloTrackAODReader();
  else if(kInputDataType=="ESD")            
    reader = new AliCaloTrackESDReader();
  else 
    printf("AliCaloTrackReader::ConfigureReader() - Data combination not known kData=%s, kInputData=%s\n",kData.Data(),kInputDataType.Data());
  
  
  reader->SetDebug(kDebug);//10 for lots of messages
  
  //Delta AOD?
  //reader->SetDeltaAODFileName("");
  if(kOutputAOD) reader->SwitchOnWriteDeltaAOD()  ;
  
  // MC settings
  if(kUseKinematics){
    if(kInputDataType == "ESD"){
      reader->SwitchOnStack();          
      reader->SwitchOffAODMCParticles(); 
    }
    else if(kInputDataType == "AOD"){
      reader->SwitchOffStack();          
      reader->SwitchOnAODMCParticles(); 
    }
  }  
  
  //------------------------
  // Detector input filling
  //------------------------
  
  //Min cluster/track E
  reader->SetEMCALEMin(0.3); 
  reader->SetEMCALEMax(1000); 
  reader->SetPHOSEMin(0.3);
  reader->SetPHOSEMax(1000);
  reader->SetCTSPtMin(0.2);
  reader->SetCTSPtMax(1000);
  
  if(!kSimulation && kCalibT) reader->SetEMCALTimeCut(-30,30); 
  else                        reader->SetEMCALTimeCut(-1000,1000); // Open time cut
  
  reader->SwitchOnFiducialCut();
  reader->GetFiducialCut()->SetSimpleCTSFiducialCut(0.8, 0, 360) ;

  // Tracks
  reader->SwitchOffCTS();
  
  // Calorimeter
  
  reader->SetEMCALClusterListName(kClusterArray);
  if(kClusterArray == "" && !kTender) 
  {
    printf("**************** Standard EMCAL clusters branch analysis **************** \n");
    reader->SwitchOnClusterRecalculation();
    // Check in ConfigureCaloUtils that the recalibration and bad map are ON 
  }
  else 
  {
    printf("**************** Input for analysis is Clusterizer %s **************** \n", kClusterArray.Data());
    reader->SwitchOffClusterRecalculation();
  }  
  
  //if(kCalorimeter == "EMCAL") {
    reader->SwitchOnEMCALCells();  
    reader->SwitchOnEMCAL();
  //}
  //if(kCalorimeter == "PHOS") { 
    reader->SwitchOnPHOSCells();  
    reader->SwitchOnPHOS();
  //}
  
  // for case data="deltaAOD", no need to fill the EMCAL/PHOS cluster lists
  if(kData.Contains("delta")){
    reader->SwitchOffEMCAL();
    reader->SwitchOffPHOS();
    reader->SwitchOffEMCALCells(); 
    reader->SwitchOffPHOSCells(); 
  }
  
  //-----------------
  // Event selection
  //-----------------
  
  if(!kUseKinematics && kTrig.BeginsWith("C")) reader->SetFiredTriggerClassName(kTrig); 
  
  // vertex event selection
  reader->SetZvertexCut(kVzCut);               
  if(kPrimaryVertex)reader->SwitchOnPrimaryVertexSelection(); 
  else              reader->SwitchOffPrimaryVertexSelection(); 
  
  if(kEventSelection)
  {
    reader->SwitchOnPileUpEventRejection();   // remove pileup by default
    reader->SwitchOnV0ANDSelection() ;        // and besides v0 AND
  }
  else 
  {
    reader->SwitchOffPileUpEventRejection();  // remove pileup by default
    reader->SwitchOffV0ANDSelection() ;       // and besides v0 AND
  }
    
  if(kCollisions=="PbPb") 
  {
    // Centrality
    reader->SetCentralityClass("V0M");
    reader->SetCentralityOpt(10);  // 10 (c= 0-10, 10-20 ...), 20  (c= 0-5, 5-10 ...) or 100 (c= 1, 2, 3 ..)
    reader->SetCentralityBin(kMinCen,kMaxCen); // Accept all events, if not select range
    
    // Event plane (only used in AliAnaPi0 for the moment)
    reader->SetEventPlaneMethod("Q");
  }
    
  if(kPrint) reader->Print("");
  
  return reader;
  
}

//_______________________________________
AliCalorimeterUtils* ConfigureCaloUtils()
{
  
  AliCalorimeterUtils *cu = new AliCalorimeterUtils;
  cu->SetDebug(kDebug);
  
  // Remove clusters close to borders, at least max energy cell is 1 cell away 
  cu->SetNumberOfCellsFromEMCALBorder(1);
  cu->SetNumberOfCellsFromPHOSBorder(2);
  
  // Search of local maxima in cluster
  if(kCollisions=="pp")
  {
    cu->SetLocalMaximaCutE(0.1);
    cu->SetLocalMaximaCutEDiff(0.03);
  }
  else 
  {
    cu->SetLocalMaximaCutE(0.2);
    cu->SetLocalMaximaCutEDiff(0.03);
  }
  
  cu->SwitchOffClusterPlot();

  if(kRecalTM) cu->SwitchOnRecalculateClusterTrackMatching(); // Done in clusterization
  else         cu->SwitchOffRecalculateClusterTrackMatching();
  
  
  //EMCAL settings

  if(!kSimulation)
    cu->SwitchOnLoadOwnEMCALGeometryMatrices();
  
  AliEMCALRecoUtils * recou = cu->GetEMCALRecoUtils();
  
  Bool_t bCalibE = kTRUE;
  Bool_t bCalibT = kTRUE;
  Bool_t bBadMap = kTRUE;
  
  if(kUseOADB)
  {
    cu->SwitchOnRecalibration(); 
    cu->SwitchOnBadChannelsRemoval() ;
    cu->SwitchOnEMCALOADB();
  }
  else
  {
    cu->SwitchOffRecalibration(); 
    cu->SwitchOffBadChannelsRemoval() ;
    cu->SwitchOffEMCALOADB();
    bCalibE = kFALSE;
    bBadMap = kFALSE;
    bCalibT = kFALSE;
  }
  
  gROOT->LoadMacro("$ALICE_ROOT/PWGGA/EMCALTasks/macros/ConfigureEMCALRecoUtils.C");
  ConfigureEMCALRecoUtils(recou,
                          kSimulation,                             
                          kExotic,
                          kNonLinearity,
                          bCalibE, 
                          bBadMap,
                          bCalibT);   
  

  printf("ConfigureCaloUtils() - EMCAL Recalibration ON? %d %d\n",recou->IsRecalibrationOn(), cu->IsRecalibrationOn());
  printf("ConfigureCaloUtils() - EMCAL BadMap        ON? %d %d\n",recou->IsBadChannelsRemovalSwitchedOn(), cu->IsBadChannelsRemovalSwitchedOn());
  
 
  
  if( kNonLinearity ) 
  { 
    printf("ConfigureCaloUtils() - Apply non linearity to EMCAL\n");
    cu->SwitchOnCorrectClusterLinearity();
  }
  
  if(kCalorimeter=="PHOS")
  {
    if (kYears <  2014) cu->SetNumberOfSuperModulesUsed(3);
    else                cu->SetNumberOfSuperModulesUsed(4);
  }
  else
  {
    if      (kYears == 2010) cu->SetNumberOfSuperModulesUsed(4); //EMCAL first year
    else if (kYears <  2014) cu->SetNumberOfSuperModulesUsed(10);
    else                     cu->SetNumberOfSuperModulesUsed(20);
  }
  
  // PHOS 
  cu->SwitchOffLoadOwnPHOSGeometryMatrices();
    
  if(kPrint) cu->Print("");
  
  return cu;
  
}

//_____________________________________
AliAnaPhoton* ConfigurePhotonAnalysis()
{
  
  AliAnaPhoton *ana = new AliAnaPhoton();
  ana->SetDebug(kDebug); //10 for lots of messages
  
  // cluster selection cuts
  
  ana->SwitchOffFiducialCut();

  ana->SetCalorimeter(kCalorimeter);
  
  if(kCalorimeter == "PHOS")
  {
    ana->SetNCellCut(2);// At least 3 cells
    ana->SetMinPt(0.3);
    ana->SetMinDistanceToBadChannel(2, 4, 5);
    ana->SetTimeCut(-2000,2000); // open cut
  }
  else 
  {//EMCAL
    ana->SetNCellCut(1);// At least 2 cells
    ana->SetMinEnergy(0.3); // avoid mip peak at E = 260 MeV
    ana->SetMaxEnergy(1000); 
    ana->SetTimeCut(-1000,1000); // open cut, usual time window of [425-825] ns if time recalibration is off 
    // restrict to less than 100 ns when time calibration is on 
    ana->SetMinDistanceToBadChannel(2, 4, 6); 
  }
  
  if(kTM)
  {
    ana->SwitchOnTrackMatchRejection() ;
    ana->SwitchOffTMHistoFill() ;
  }
  else
  {
    ana->SwitchOffTrackMatchRejection() ;
    ana->SwitchOnTMHistoFill() ;
  }
  
  //PID cuts (shower shape)
  ana->SwitchOnCaloPID(); // do PID selection, unless specified in GetCaloPID, selection not based on bayesian
  AliCaloPID* caloPID = ana->GetCaloPID();
  //Not used in bayesian
  
  //EMCAL
  caloPID->SetEMCALLambda0CutMax(0.50); // Mild cut
  caloPID->SetEMCALLambda0CutMin(0.10);
  
  caloPID->SetEMCALDEtaCut(0.025);
  caloPID->SetEMCALDPhiCut(0.030);
  
  //PHOS
  caloPID->SetPHOSDispersionCut(2.5);
  caloPID->SetPHOSRCut(2.);
  if(kInputData=="AOD") caloPID->SetPHOSRCut(2000.); // Open cut since dX, dZ not stored
      
  ana->SwitchOffFillShowerShapeHistograms();  // Filled before photon shower shape selection
  
  // Input / output delta AOD settings
  
  if(!kData.Contains("delta")) 
  {
    ana->SetOutputAODName(Form("Photon%s",kName.Data()));
    ana->SetOutputAODClassName("AliAODPWG4ParticleCorrelation");
    //ana->SetOutputAODClassName("AliAODPWG4Particle"); // use if no correlation done
  }
  else ana->SetInputAODName(Form("Photon%s",kName.Data()));
  
  //Set Histograms name tag, bins and ranges
  
  ana->AddToHistogramsName(Form("AnaPhoton_TM%d_",kTM));
  SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below
  
  // Number of particle type MC histograms
  ana->FillNOriginHistograms(8);
  ana->FillNPrimaryHistograms(4);
  
  ConfigureMC(ana);
  
  if(kPrint) ana->Print("");
  
  return ana;
  
}

//__________________________________________________________________________________________
AliAnaInsideClusterInvariantMass* ConfigureInClusterIMAnalysis(Float_t l0min, Float_t l0max)
{

  AliAnaInsideClusterInvariantMass *ana = new AliAnaInsideClusterInvariantMass();
  ana->SetDebug(kDebug); //10 for lots of messages
  
  // selection cuts
  
  ana->SetMinEnergy(5); 
  ana->SetMaxEnergy(200.);   
  ana->SetMinNCells(3);
  ana->SetM02Cut(l0min,l0max);
  ana->SetCalorimeter(kCalorimeter);
  
  //ana->AddToHistogramsName(Form("AnaInClusterIM_%1.2f_%1.2f_",l0min,l0max));
  ana->AddToHistogramsName("AnaInClusterIM_");

  SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below
  
  AliCaloPID* caloPID = ana->GetCaloPID();
  caloPID->SetEMCALDEtaCut(0.025);
  caloPID->SetEMCALDPhiCut(0.030);
  caloPID->SetClusterSplittingM02Cut(0,100); // Do the selection in the analysis class and not in the PID method to fill SS histograms

  caloPID->SetPi0MassRange(0.10, 0.18);
  caloPID->SetEtaMassRange(0.40, 0.60);
  caloPID->SetPhotonMassRange(0.00, 0.08);  
  
  ConfigureMC(ana);
  
  if(kPrint) ana->Print("");
  
  return ana;
  
}

//_______________________________
AliAnaPi0* ConfigurePi0Analysis()
{
  
  AliAnaPi0 *ana = new AliAnaPi0();
  
  ana->SetDebug(kDebug);//10 for lots of messages
  
  // Input delta AOD settings
  ana->SetInputAODName(Form("Photon%s",kName.Data()));
  
  // Calorimeter settings
  ana->SetCalorimeter(kCalorimeter);
  
  //settings for pp collision mixing
  ana->SwitchOnOwnMix(); //Off when mixing done with general mixing frame
  
  // Cuts 
  if(kCalorimeter=="EMCAL") ana->SetPairTimeCut(40);
  
  ana->SetNAsymCuts(1); // no asymmetry cut, previous studies showed small effect. 
  //In EMCAL assymetry cut prevents combination of assymetric decays which is the main source of pi0 at high E.
  
  if     (kCollisions=="pp"  ) 
  {
    ana->SetNCentrBin(1);
    ana->SetNZvertBin(10);
    ana->SetNRPBin(1);
    ana->SetNMaxEvMix(100);    
    ana->SwitchOnSMCombinations();
  }
  else if(kCollisions=="PbPb") 
  {
    ana->SetNCentrBin(10);
    ana->SetNZvertBin(10);
    ana->SetNRPBin(4);
    ana->SetNMaxEvMix(10);
    ana->SwitchOffSMCombinations();
  }

  ana->SwitchOffMultipleCutAnalysis();

  //Set Histograms name tag, bins and ranges
  
  ana->AddToHistogramsName(Form("AnaPi0_TM%d_",kTM));
  SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below

  ConfigureMC(ana);
  
  if(kPrint) ana->Print("");
  
  return ana;
  
}

//_____________________________________________________
AliAnaPi0EbE* ConfigurePi0EbEAnalysis(TString particle, 
                                      Int_t analysis)
{
  
  AliAnaPi0EbE *ana = new AliAnaPi0EbE();
  ana->SetDebug(kDebug);//10 for lots of messages
  
  ana->SetAnalysisType(analysis);
  TString opt = "";
  if(analysis==AliAnaPi0EbE::kIMCaloTracks) opt = "Conv";
  if(analysis==AliAnaPi0EbE::kSSCalo)       opt = "SS";
  
  ana->SetMinPt(0.5);
  
  if(kCalorimeter=="EMCAL")ana->SetPairTimeCut(15); // More strict than in pi0 inv mass analysis
  
  ana->SetCalorimeter(kCalorimeter);
  
  // Input / output delta AOD settings
  
  ana->SetInputAODName(Form("Photon%s",kName.Data()));
  if(!kInputDataType.Contains("delta")) 
  {
    ana->SetOutputAODName(Form("%s%s%s",particle.Data(), opt.Data(), kName.Data()));
    ana->SetOutputAODClassName("AliAODPWG4ParticleCorrelation");
  }
  else  
    ana->SetInputAODName(Form("%s%s%s",particle.Data(),opt.Data(),kName.Data()));
  
  if(analysis == AliAnaPi0EbE::kIMCaloTracks) ana->SetInputAODGammaConvName("PhotonsCTS");
  
  if(analysis!=AliAnaPi0EbE::kSSCalo)
  {
    AliNeutralMesonSelection *nms = ana->GetNeutralMesonSelection();
    nms->SetParticle(particle);
    
    // Tighten a bit mass cut with respect to default window
    if(particle=="Pi0") nms->SetInvMassCutRange(0.120,0.150);
    if(particle=="Eta") nms->SetInvMassCutRange(0.520,0.580);    
    
    nms->SwitchOnAngleSelection();
    nms->KeepNeutralMesonSelectionHistos(kTRUE);
    //nms->SetAngleMaxParam(2,0.2);
    nms->SetHistoERangeAndNBins(0, 20, 80) ;
    //nms->SetHistoIMRangeAndNBins(0, 1, 400);
  }
  else
  { // cluster splitting settings
    ana->SetTimeCut(-1000,1000); // Open time cut
    AliCaloPID* caloPID = ana->GetCaloPID();
    caloPID->SetPi0MassRange(0.10, 0.18);
    caloPID->SetEtaMassRange(0.40, 0.60);
    caloPID->SetPhotonMassRange(0.00, 0.08);
    caloPID->SetClusterSplittingM02Cut(0.5,100); // Do the selection in the analysis class and not in the PID method to fill SS histograms
  }
  
  ana->SwitchOffSelectedClusterHistoFill(); 
  ana->SwitchOffFillWeightHistograms();
  
  if(!kTM) ana->SwitchOnTMHistoFill();
  else     ana->SwitchOffTMHistoFill();
  
  //Set Histograms name tag, bins and ranges
  
  ana->AddToHistogramsName(Form("Ana%s%sEbE_TM%d_",particle.Data(),opt.Data(),kTM));
  SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below
  
  ConfigureMC(ana);
  
  if(kPrint) ana->Print("");
  
  return  ana;
  
}

//________________________________________
AliAnaCalorimeterQA* ConfigureQAAnalysis()
{
  
  AliAnaCalorimeterQA *ana = new AliAnaCalorimeterQA();
  ana->SetDebug(kDebug); //10 for lots of messages
  ana->SetCalorimeter(kCalorimeter);
  
  ana->SetTimeCut(-1000,1000); // Open time cut
  
  // Study inter detector correlation (PHOS, EMCAL, Tracks, V0)
  if(kCalorimeter=="PHOS" && kTrig=="PHOS"){
    ana->SwitchOnCorrelation(); // make sure you switch in the reader PHOS and EMCAL cells and clusters if option is ON
  }
  if(kCalorimeter=="EMCAL" && kClusterArray==""){
    ana->SwitchOnCorrelation(); // make sure you switch in the reader PHOS and EMCAL cells and clusters if option is ON
  }
  else {
    ana->SwitchOffCorrelation();
  }
  
  // Study exotic clusters PHOS and EMCAL
  if(kClusterArray==""){
    ana->SwitchOnStudyBadClusters() ; 
  }
  else {
    ana->SwitchOffStudyBadClusters() ;
  }
  
  ana->SwitchOffFiducialCut();
  ana->SwitchOffFillAllTH3Histogram();
  ana->SwitchOffFillAllPositionHistogram();
  ana->SwitchOffFillAllPositionHistogram2();
  if(!kExotic)ana->SwitchOnStudyBadClusters();
  else        ana->SwitchOffStudyBadClusters();
  ana->SwitchOffStudyClustersAsymmetry();
  ana->SwitchOffStudyWeight();
  ana->SwitchOnFillAllTrackMatchingHistogram();
  
  ana->AddToHistogramsName("QA_"); //Begining of histograms name
  SetHistoRangeAndNBins(ana->GetHistogramRanges()); // see method below
  
  ConfigureMC(ana);
  
  if(kPrint) ana->Print("");	
  
  return ana;
  
}

//________________________________________________________
void ConfigureMC(AliAnaCaloTrackCorrBaseClass* ana)
{
  if(kSimulation) ana->SwitchOnDataMC() ;//Access MC stack and fill more histograms, AOD MC not implemented yet.
  else            ana->SwitchOffDataMC() ;

  //Set here generator name, default pythia
  //ana->GetMCAnalysisUtils()->SetMCGenerator("");
}  

//________________________________________________________
void SetHistoRangeAndNBins (AliHistogramRanges* histoRanges)
{
  // Set common bins for all analysis and MC histograms filling
    
  histoRanges->SetHistoPtRangeAndNBins(0, 100, 200) ; // Energy and pt histograms
  
  if(kCalorimeter=="EMCAL")
  {
    if(kYears==2010)
    {
      histoRanges->SetHistoPhiRangeAndNBins(78*TMath::DegToRad(), 122*TMath::DegToRad(), 78) ;
      histoRanges->SetHistoXRangeAndNBins(-230,90,120); // QA
      histoRanges->SetHistoYRangeAndNBins(370,450,40);  // QA
    }
    else if(kYears==2011)
    {           
      histoRanges->SetHistoPhiRangeAndNBins(78*TMath::DegToRad(), 182*TMath::DegToRad(), 108) ;
      histoRanges->SetHistoXRangeAndNBins(-600,90,200); // QA
      histoRanges->SetHistoYRangeAndNBins(100,450,100); // QA
    }
    else
    {
      histoRanges->SetHistoPhiRangeAndNBins(78*TMath::DegToRad(), 190*TMath::DegToRad(), 122) ;
      histoRanges->SetHistoXRangeAndNBins(-100,90,200); // QA
      histoRanges->SetHistoYRangeAndNBins(50,450,100);  // QA
    }

    histoRanges->SetHistoEtaRangeAndNBins(-0.72, 0.72, 144) ;
  }
  else
  {
    histoRanges->SetHistoPhiRangeAndNBins(260*TMath::DegToRad(), 320*TMath::DegToRad(), 60) ;
    histoRanges->SetHistoEtaRangeAndNBins(-0.13, 0.13, 130) ;
  }
  
  histoRanges->SetHistoShowerShapeRangeAndNBins(0, 5, 500);
  
  // Invariant mass histoRangeslysis
  histoRanges->SetHistoMassRangeAndNBins(0., 1., 200) ;
  histoRanges->SetHistoAsymmetryRangeAndNBins(0., 1. , 100) ;
  
  // check if time calibration is on
  histoRanges->SetHistoTimeRangeAndNBins(-1000.,1000,1000);
  histoRanges->SetHistoDiffTimeRangeAndNBins(-200, 200, 800);
  
  // track-cluster residuals
  histoRanges->SetHistoTrackResidualEtaRangeAndNBins(-0.15,0.15,300);
  histoRanges->SetHistoTrackResidualPhiRangeAndNBins(-0.15,0.15,300);

  // QA, electron, charged
  histoRanges->SetHistoPOverERangeAndNBins(0,10.,100);
  histoRanges->SetHistodEdxRangeAndNBins(0.,200.,200);
  
  // QA
  histoRanges->SetHistoFinePtRangeAndNBins(0, 10, 200) ; // bining for fhAmpId
  histoRanges->SetHistodRRangeAndNBins(0.,TMath::Pi(),150);
  histoRanges->SetHistoRatioRangeAndNBins(0.,2.,100);
  histoRanges->SetHistoVertexDistRangeAndNBins(0.,500.,500);
  histoRanges->SetHistoNClusterCellRangeAndNBins(0,500,500);
  histoRanges->SetHistoZRangeAndNBins(-400,400,200);
  histoRanges->SetHistoRRangeAndNBins(400,450,25);
  histoRanges->SetHistoV0SignalRangeAndNBins(0,5000,500);
  histoRanges->SetHistoV0MultiplicityRangeAndNBins(0,5000,500);
  histoRanges->SetHistoTrackMultiplicityRangeAndNBins(0,5000,500);
  
}


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